tests.test_json_message   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 122
dl 0
loc 149
rs 10
c 0
b 0
f 0
wmc 12

12 Methods

Rating   Name   Duplication   Size   Complexity  
A TestSerialization.make_miner() 0 4 1
A TestSerialization.test_pool() 0 6 1
A TestSerialization.test_messages() 0 3 1
A TestSerialization.test_minercommand() 0 6 1
A TestSerialization.test_sensors() 0 5 1
A TestSerialization.test_minermessage() 0 9 1
A TestSerialization.test_availablepool() 0 6 1
A TestSerialization.test_minerserialization() 0 33 1
A TestSerialization.test_message_inapp() 0 8 1
A TestSerialization.test_sensorvalue_serialization() 0 18 1
A TestSerialization.test_miner_deserialize() 0 5 1
A TestSerialization.test_config_serialization() 0 10 1
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.minerstats.hardware_errors = 123
81
        miner.minerstats.hash_avg = 13000
82
        miner.location = 'unittest'
83
        miner.in_service_date = datetime.datetime.today().replace(microsecond=0)
84
        jminer = sch.dumps(miner).data
85
86
        #rehydrate miner
87
        reminer = messaging.messages.MinerSchema().loads(jminer).data
88
        self.assertTrue(reminer.customerid == miner.customerid)
89
        self.assertTrue(isinstance(reminer.minerinfo, MinerInfo))
90
        self.assertTrue(isinstance(reminer.minerpool, MinerCurrentPool))
91
        self.assertTrue(reminer.minerpool.poolname == 'unittest')
92
        self.assertTrue(isinstance(reminer.minerstats, domain.minerstatistics.MinerStatistics))
93
        self.assertTrue(reminer.laststatuschanged)
94
        self.assertTrue(reminer.minerstats.boardstatus1 == 'o')
95
        self.assertTrue(reminer.minerstats.boardstatus2 == 'oo')
96
        self.assertTrue(reminer.minerstats.boardstatus3 == 'ooo')
97
        self.assertTrue(reminer.minerstats.hardware_errors == 123)
98
        self.assertTrue(reminer.minerstats.hash_avg == 13000)
99
        self.assertTrue(reminer.location == miner.location)
100
        self.assertTrue(reminer.in_service_date == miner.in_service_date)
101
102
    def test_miner_deserialize(self):
103
        miner = self.make_miner()
104
        jminer = utils.serialize(miner, messaging.messages.MinerSchema())
105
        reminer = utils.deserialize(messaging.messages.MinerSchema(), jminer) #().loads(jminer).data
106
        self.assertTrue(isinstance(reminer, Miner), "object from MinerSchema should be a miner")
107
108
    def test_sensorvalue_serialization(self):
109
        '''on windows the deserialization seems to lose the fractions of seconds
110
        so this test is only for seconds'''
111
        sch = SensorValueSchema()
112
        sensorvalue = SensorValue('testid', '99.9', 'temperature')
113
        sensorvalue.sensor = Sensor('testid', 'temperature', 'controller')
114
        sensortime = sensorvalue.sensortime
115
        jsensor = sch.dumps(sensorvalue).data
116
117
        #rehydrate sensor
118
        resensor = SensorValueSchema().loads(jsensor).data
119
        self.assertTrue(isinstance(resensor, SensorValue))
120
        self.assertTrue(resensor.sensortime.day == sensortime.day)
121
        self.assertTrue(resensor.sensortime.hour == sensortime.hour)
122
        self.assertTrue(resensor.sensortime.minute == sensortime.minute)
123
        self.assertTrue(resensor.sensortime.second == sensortime.second)
124
        self.assertTrue(isinstance(resensor.sensor, Sensor))
125
        self.assertTrue(resensor.sensorid == resensor.sensor.sensorid)
126
127
    def test_config_serialization(self):
128
        sch = messaging.messages.ConfigurationMessageSchema()
129
        msg = messaging.messages.ConfigurationMessage('save', '', 'pool', {"configuration_message_id":"name"}, [{"name":"my pool"}])
130
        jconfig = sch.dumps(msg).data
131
        reconfig = sch.loads(jconfig).data
132
        self.assertTrue(isinstance(reconfig, messaging.messages.ConfigurationMessage))
133
        self.assertTrue(isinstance(reconfig.command, str))
134
        self.assertTrue(isinstance(reconfig.parameter, str))
135
        self.assertTrue(isinstance(reconfig.configuration_message_id, dict))
136
        self.assertTrue(isinstance(reconfig.values, list))
137
138
    def test_message_inapp(self):
139
        app = ApplicationService(component='test')
140
        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}]}"}'
141
        msg = app.messagedecode_configuration(values)
142
        self.assertTrue(isinstance(msg, messaging.messages.ConfigurationMessage))
143
        self.assertTrue(msg.entity == 'miner')
144
        miner = Miner.create(msg.values)
145
        self.assertTrue(miner.name == "S9102")
146
147
if __name__ == '__main__':
148
    unittest.main()
149