Passed
Push — master ( 325e70...e137c2 )
by Dave
01:05
created

TestSerialization.test_minerserialization()   A

Complexity

Conditions 1

Size

Total Lines 28
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 26
nop 1
dl 0
loc 28
rs 9.256
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
from messaging.messages import MinerSchema, ConfigurationMessage, ConfigurationMessageSchema
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
    def test_sensors(self):
22
        msg = messaging.sensormessages.SensorValueMessage('','','')
23
        self.assertTrue(msg)
24
        msg = messaging.sensormessages.SensorMessage('','','')
25
        self.assertTrue(msg)
26
27
    def test_minercommand(self):
28
        sch = messaging.schema.MinerCommandSchema()
29
        cmd = MinerCommand()
30
        j = sch.dumps(cmd).data
31
        recommand = sch.loads(j).data
32
        self.assertTrue(isinstance(recommand, MinerCommand))
33
34
    def test_pool(self):
35
        sch = messaging.schema.PoolSchema()
36
        entity = Pool('','','','',1,'')
37
        j = sch.dumps(entity).data
38
        reentity = sch.loads(j).data
39
        self.assertTrue(isinstance(reentity, Pool))
40
41
    def test_availablepool(self):
42
        sch = messaging.schema.AvailablePoolSchema()
43
        entity = AvailablePool('type')
44
        j = sch.dumps(entity).data
45
        reentity = sch.loads(j).data
46
        self.assertTrue(isinstance(reentity, AvailablePool))
47
48
    def test_minerserialization(self):
49
        sch = MinerSchema()
50
        miner = Miner('test')
51
        miner.status = MinerStatus.Offline
52
        miner.status = MinerStatus.Online
53
        miner.minerinfo = MinerInfo('Antminer S9', '123')
54
        miner.minerpool = MinerCurrentPool(miner, 'test pool', 'test worker', allpools={})
55
        miner.minerpool.poolname = 'unittest'
56
        miner.minerstats = domain.minerstatistics.MinerStatistics(miner, datetime.datetime.utcnow(), 0, 1, 0, 99, 98, 97, 123, '', '', '')
57
        miner.minerstats.boardstatus1 = 'o'
58
        miner.minerstats.boardstatus2 = 'oo'
59
        miner.minerstats.boardstatus3 = 'ooo'
60
        miner.location = 'unittest'
61
        miner.in_service_date = datetime.datetime.today().replace(microsecond=0)
62
        jminer = sch.dumps(miner).data
63
64
        #rehydrate miner
65
        reminer = MinerSchema().loads(jminer).data
66
        self.assertTrue(isinstance(reminer.minerinfo, MinerInfo))
67
        self.assertTrue(isinstance(reminer.minerpool, MinerCurrentPool))
68
        self.assertTrue(reminer.minerpool.poolname == 'unittest')
69
        self.assertTrue(isinstance(reminer.minerstats, domain.minerstatistics.MinerStatistics))
70
        self.assertTrue(reminer.laststatuschanged)
71
        self.assertTrue(reminer.minerstats.boardstatus1 == 'o')
72
        self.assertTrue(reminer.minerstats.boardstatus2 == 'oo')
73
        self.assertTrue(reminer.minerstats.boardstatus3 == 'ooo')
74
        self.assertTrue(reminer.location == miner.location)
75
        self.assertTrue(reminer.in_service_date == miner.in_service_date)
76
77
    def test_miner_deserialize(self):
78
        miner = Miner("unittest", None, "", "unitip", "unitport", "", "")
79
        jminer = utils.serialize(miner, MinerSchema())
80
        reminer = utils.deserialize(MinerSchema(),jminer) #().loads(jminer).data
81
        self.assertTrue(isinstance(reminer, Miner),"object from MinerSchema should be a miner")
82
83
    def test_sensorvalue_serialization(self):
84
        '''on windows the deserialization seems to lose the fractions of seconds
85
        so this test is only for seconds'''
86
        sch = SensorValueSchema()
87
        sensorvalue = SensorValue('testid', '99.9', 'temperature')
88
        sensorvalue.sensor = Sensor('testid', 'temperature', 'controller')
89
        sensortime = sensorvalue.sensortime
90
        jsensor = sch.dumps(sensorvalue).data
91
92
        #rehydrate sensor
93
        resensor = SensorValueSchema().loads(jsensor).data
94
        self.assertTrue(isinstance(resensor, SensorValue))
95
        self.assertTrue(resensor.sensortime.day == sensortime.day)
96
        self.assertTrue(resensor.sensortime.hour == sensortime.hour)
97
        self.assertTrue(resensor.sensortime.minute == sensortime.minute)
98
        self.assertTrue(resensor.sensortime.second == sensortime.second)
99
        self.assertTrue(isinstance(resensor.sensor, Sensor))
100
        self.assertTrue(resensor.sensorid == resensor.sensor.sensorid)
101
102
    def test_config_serialization(self):
103
        sch = ConfigurationMessageSchema()
104
        msg = ConfigurationMessage('save', '', 'pool', {"configuration_message_id":"name"}, [{"name":"my pool"}])
105
        jconfig = sch.dumps(msg).data
106
        reconfig = sch.loads(jconfig).data
107
        self.assertTrue(isinstance(reconfig, ConfigurationMessage))
108
        self.assertTrue(isinstance(reconfig.command, str))
109
        self.assertTrue(isinstance(reconfig.parameter, str))
110
        self.assertTrue(isinstance(reconfig.configuration_message_id, dict))
111
        self.assertTrue(isinstance(reconfig.values, list))
112
113
    def test_message_inapp(self):
114
        app = ApplicationService(component='test')
115
        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}]}"}'
116
        msg = app.messagedecode_configuration(values)
117
        self.assertTrue(isinstance(msg, ConfigurationMessage))
118
        self.assertTrue(msg.entity == 'miner')
119
        miner = Miner.create(msg.values)
120
        self.assertTrue(miner.name == "S9102")
121
122
if __name__ == '__main__':
123
    unittest.main()
124