Passed
Push — master ( 782306...964ae0 )
by Dave
56s
created

TestSerialization.test_sensors()   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
'''# test json message format
2
# scenarios:
3
# - Miner with miner stats
4
# - Miner with command
5
# - command by itself
6
# - sensor
7
'''
8
import unittest
9
import datetime
10
import domain.minerstatistics
11
from domain.mining import Miner, MinerStatus, MinerInfo, MinerCurrentPool, MinerCommand, Pool, AvailablePool
12
from domain.sensors import SensorValue, Sensor
13
import messaging.messages
14
import messaging.sensormessages
15
import messaging.schema
16
from messaging.sensormessages import SensorValueSchema
17
from backend.fcmapp import ApplicationService
18
import backend.fcmutils as utils
19
20
class TestSerialization(unittest.TestCase):
21
22
    def make_miner(self) -> Miner:
23
        miner = Miner("unittest", None, "", "unitip", "unitport", "", "")
24
        miner.customerid = 1
25
        return miner
26
27
    def test_sensors(self):
28
        msg = messaging.sensormessages.SensorValueMessage('', '', '')
29
        self.assertTrue(msg)
30
        msg = messaging.sensormessages.SensorMessage('', '', '')
31
        self.assertTrue(msg)
32
33
    def test_messages(self):
34
        msg = messaging.messages.MinerCommandMessage()
35
        self.assertTrue(msg)
36
37
    def test_minercommand(self):
38
        sch = messaging.schema.MinerCommandSchema()
39
        cmd = MinerCommand()
40
        j = sch.dumps(cmd).data
41
        recommand = sch.loads(j).data
42
        self.assertTrue(isinstance(recommand, MinerCommand))
43
44
    def test_minermessage(self):
45
        sch = messaging.messages.MinerMessageSchema()
46
        entity = messaging.messages.MinerMessage(self.make_miner())
47
        entity.command = MinerCommand('test', 'test')
48
        entity.minerpool = MinerCurrentPool(entity.miner, 'test pool', 'test worker', allpools={})
49
        entity.minerstats = domain.minerstatistics.MinerStatistics(entity.miner, datetime.datetime.utcnow(), 0, 1, 0, 99, 98, 97, 123, '', '', '')
50
        j = sch.dumps(entity).data
51
        reentity = sch.loads(j).data
52
        self.assertTrue(isinstance(reentity, messaging.messages.MinerMessage))
53
54
    def test_pool(self):
55
        sch = messaging.schema.PoolSchema()
56
        entity = Pool('', '', '', '', 1, '')
57
        j = sch.dumps(entity).data
58
        reentity = sch.loads(j).data
59
        self.assertTrue(isinstance(reentity, Pool))
60
61
    def test_availablepool(self):
62
        sch = messaging.schema.AvailablePoolSchema()
63
        entity = AvailablePool('type')
64
        j = sch.dumps(entity).data
65
        reentity = sch.loads(j).data
66
        self.assertTrue(isinstance(reentity, AvailablePool))
67
68
    def test_minerserialization(self):
69
        sch = messaging.messages.MinerSchema()
70
        miner = self.make_miner()
71
        miner.status = MinerStatus.Offline
72
        miner.status = MinerStatus.Online
73
        miner.minerinfo = MinerInfo('Antminer S9', '123')
74
        miner.minerpool = MinerCurrentPool(miner, 'test pool', 'test worker', allpools={})
75
        miner.minerpool.poolname = 'unittest'
76
        miner.minerstats = domain.minerstatistics.MinerStatistics(miner, datetime.datetime.utcnow(), 0, 1, 0, 99, 98, 97, 123, '', '', '')
77
        miner.minerstats.boardstatus1 = 'o'
78
        miner.minerstats.boardstatus2 = 'oo'
79
        miner.minerstats.boardstatus3 = 'ooo'
80
        miner.location = 'unittest'
81
        miner.in_service_date = datetime.datetime.today().replace(microsecond=0)
82
        jminer = sch.dumps(miner).data
83
84
        #rehydrate miner
85
        reminer = messaging.messages.MinerSchema().loads(jminer).data
86
        self.assertTrue(reminer.customerid == miner.customerid)
87
        self.assertTrue(isinstance(reminer.minerinfo, MinerInfo))
88
        self.assertTrue(isinstance(reminer.minerpool, MinerCurrentPool))
89
        self.assertTrue(reminer.minerpool.poolname == 'unittest')
90
        self.assertTrue(isinstance(reminer.minerstats, domain.minerstatistics.MinerStatistics))
91
        self.assertTrue(reminer.laststatuschanged)
92
        self.assertTrue(reminer.minerstats.boardstatus1 == 'o')
93
        self.assertTrue(reminer.minerstats.boardstatus2 == 'oo')
94
        self.assertTrue(reminer.minerstats.boardstatus3 == 'ooo')
95
        self.assertTrue(reminer.location == miner.location)
96
        self.assertTrue(reminer.in_service_date == miner.in_service_date)
97
98
    def test_miner_deserialize(self):
99
        miner = self.make_miner()
100
        jminer = utils.serialize(miner, messaging.messages.MinerSchema())
101
        reminer = utils.deserialize(messaging.messages.MinerSchema(), jminer) #().loads(jminer).data
102
        self.assertTrue(isinstance(reminer, Miner), "object from MinerSchema should be a miner")
103
104
    def test_sensorvalue_serialization(self):
105
        '''on windows the deserialization seems to lose the fractions of seconds
106
        so this test is only for seconds'''
107
        sch = SensorValueSchema()
108
        sensorvalue = SensorValue('testid', '99.9', 'temperature')
109
        sensorvalue.sensor = Sensor('testid', 'temperature', 'controller')
110
        sensortime = sensorvalue.sensortime
111
        jsensor = sch.dumps(sensorvalue).data
112
113
        #rehydrate sensor
114
        resensor = SensorValueSchema().loads(jsensor).data
115
        self.assertTrue(isinstance(resensor, SensorValue))
116
        self.assertTrue(resensor.sensortime.day == sensortime.day)
117
        self.assertTrue(resensor.sensortime.hour == sensortime.hour)
118
        self.assertTrue(resensor.sensortime.minute == sensortime.minute)
119
        self.assertTrue(resensor.sensortime.second == sensortime.second)
120
        self.assertTrue(isinstance(resensor.sensor, Sensor))
121
        self.assertTrue(resensor.sensorid == resensor.sensor.sensorid)
122
123
    def test_config_serialization(self):
124
        sch = messaging.messages.ConfigurationMessageSchema()
125
        msg = messaging.messages.ConfigurationMessage('save', '', 'pool', {"configuration_message_id":"name"}, [{"name":"my pool"}])
126
        jconfig = sch.dumps(msg).data
127
        reconfig = sch.loads(jconfig).data
128
        self.assertTrue(isinstance(reconfig, messaging.messages.ConfigurationMessage))
129
        self.assertTrue(isinstance(reconfig.command, str))
130
        self.assertTrue(isinstance(reconfig.parameter, str))
131
        self.assertTrue(isinstance(reconfig.configuration_message_id, dict))
132
        self.assertTrue(isinstance(reconfig.values, list))
133
134
    def test_message_inapp(self):
135
        app = ApplicationService(component='test')
136
        values = '{"version":"1.1","sender":"fullcyclereact","type":"configuration","timestamp":"2018-09-16T07:18:34.431Z","body":"{\\"command\\":\\"save\\",\\"parameter\\":\\"\\",\\"id\\":\\"unknown\\",\\"entity\\":\\"miner\\",\\"values\\":[{\\"name\\":\\"S9102\\"},{\\"ipaddress\\":\\"test.com\\"},{\\"port\\":\\"4102\\"},{\\"location\\":\\"222\\"},{\\"in_service_date\\":null}]}"}'
137
        msg = app.messagedecode_configuration(values)
138
        self.assertTrue(isinstance(msg, messaging.messages.ConfigurationMessage))
139
        self.assertTrue(msg.entity == 'miner')
140
        miner = Miner.create(msg.values)
141
        self.assertTrue(miner.name == "S9102")
142
143
if __name__ == '__main__':
144
    unittest.main()
145