3
from pymodbus.device import *
4
from pymodbus.exceptions import *
5
from pymodbus.events import *
7
class SimpleDataStoreTest(unittest.TestCase):
9
This is the unittest for the pymodbus.device module
14
0x00: 'Bashwork', # VendorName
15
0x01: 'PTM', # ProductCode
16
0x02: '1.0', # MajorMinorRevision
17
0x03: 'http://internets.com', # VendorUrl
18
0x04: 'pymodbus', # ProductName
19
0x05: 'bashwork', # ModelName
20
0x06: 'unittest', # UserApplicationName
23
0x10: 'private' # private data
25
self.ident = ModbusDeviceIdentification(self.info)
26
self.control = ModbusControlBlock()
27
self.access = ModbusAccessControl()
31
''' Cleans up the test environment '''
36
def testUpdateIdentity(self):
37
''' Test device identification reading '''
38
self.control.Identity.update(self.ident)
39
self.assertEqual(self.control.Identity.VendorName, 'Bashwork')
40
self.assertEqual(self.control.Identity.ProductCode, 'PTM')
41
self.assertEqual(self.control.Identity.MajorMinorRevision, '1.0')
42
self.assertEqual(self.control.Identity.VendorUrl, 'http://internets.com')
43
self.assertEqual(self.control.Identity.ProductName, 'pymodbus')
44
self.assertEqual(self.control.Identity.ModelName, 'bashwork')
45
self.assertEqual(self.control.Identity.UserApplicationName, 'unittest')
47
def testBasicCommands(self):
48
''' Test device identification reading '''
49
self.assertEqual(str(self.ident), "DeviceIdentity")
50
self.assertEqual(str(self.control), "ModbusControl")
52
def testModbusDeviceIdentificationGet(self):
53
''' Test device identification reading '''
54
self.assertEqual(self.ident[0x00], 'Bashwork')
55
self.assertEqual(self.ident[0x01], 'PTM')
56
self.assertEqual(self.ident[0x02], '1.0')
57
self.assertEqual(self.ident[0x03], 'http://internets.com')
58
self.assertEqual(self.ident[0x04], 'pymodbus')
59
self.assertEqual(self.ident[0x05], 'bashwork')
60
self.assertEqual(self.ident[0x06], 'unittest')
61
self.assertNotEqual(self.ident[0x07], 'x')
62
self.assertNotEqual(self.ident[0x08], 'x')
63
self.assertEqual(self.ident[0x10], 'private')
64
self.assertEqual(self.ident[0x54], '')
66
def testModbusDeviceIdentificationSummary(self):
67
''' Test device identification summary creation '''
68
summary = sorted(self.ident.summary().values())
69
expected = sorted(self.info.values()[:-3]) # remove private
70
self.assertEqual(summary, expected)
72
def testModbusDeviceIdentificationSet(self):
73
''' Test a device identification writing '''
74
self.ident[0x07] = 'y'
75
self.ident[0x08] = 'y'
76
self.ident[0x10] = 'public'
77
self.ident[0x54] = 'testing'
79
self.assertNotEqual('y', self.ident[0x07])
80
self.assertNotEqual('y', self.ident[0x08])
81
self.assertEqual('public', self.ident[0x10])
82
self.assertEqual('testing', self.ident[0x54])
84
def testModbusControlBlockAsciiModes(self):
85
''' Test a server control block ascii mode '''
86
self.assertEqual(id(self.control), id(ModbusControlBlock()))
87
self.control.Mode = 'RTU'
88
self.assertEqual('RTU', self.control.Mode)
89
self.control.Mode = 'FAKE'
90
self.assertNotEqual('FAKE', self.control.Mode)
92
def testModbusControlBlockCounters(self):
93
''' Tests the MCB counters methods '''
94
self.assertEqual(0x0, self.control.Counter.BusMessage)
96
self.control.Counter.BusMessage += 1
97
self.control.Counter.SlaveMessage += 1
98
self.assertEqual(10, self.control.Counter.BusMessage)
99
self.control.Counter.BusMessage = 0x00
100
self.assertEqual(0, self.control.Counter.BusMessage)
101
self.assertEqual(10, self.control.Counter.SlaveMessage)
102
self.control.Counter.reset()
103
self.assertEqual(0, self.control.Counter.SlaveMessage)
105
def testModbusControlBlockUpdate(self):
106
''' Tests the MCB counters upate methods '''
107
values = {'SlaveMessage':5, 'BusMessage':5}
108
self.control.Counter.BusMessage += 1
109
self.control.Counter.SlaveMessage += 1
110
self.control.Counter.update(values)
111
self.assertEqual(6, self.control.Counter.SlaveMessage)
112
self.assertEqual(6, self.control.Counter.BusMessage)
114
def testModbusControlBlockIterator(self):
115
''' Tests the MCB counters iterator '''
116
self.control.Counter.reset()
117
for name,count in self.control:
118
self.assertEqual(0, count)
120
def testModbusCountersHandlerIterator(self):
121
''' Tests the MCB counters iterator '''
122
self.control.Counter.reset()
123
for name,count in self.control.Counter:
124
self.assertEqual(0, count)
126
def testModbusControlBlockCounterSummary(self):
127
''' Tests retrieving the current counter summary '''
128
self.assertEqual(0x00, self.control.Counter.summary())
130
self.control.Counter.BusMessage += 1
131
self.control.Counter.SlaveMessage += 1
132
self.control.Counter.SlaveNAK += 1
133
self.control.Counter.BusCharacterOverrun += 1
134
self.assertEqual(0xa9, self.control.Counter.summary())
135
self.control.Counter.reset()
136
self.assertEqual(0x00, self.control.Counter.summary())
138
def testModbusControlBlockListen(self):
139
''' Tests the MCB listen flag methods '''
140
self.assertEqual(self.control.ListenOnly, False)
141
self.control.ListenOnly = not self.control.ListenOnly
142
self.assertEqual(self.control.ListenOnly, True)
144
def testModbusControlBlockDelimiter(self):
145
''' Tests the MCB delimiter setting methods '''
146
self.assertEqual(self.control.Delimiter, '\r')
147
self.control.Delimiter = '='
148
self.assertEqual(self.control.Delimiter, '=')
149
self.control.Delimiter = 61
150
self.assertEqual(self.control.Delimiter, '=')
152
def testModbusControlBlockDiagnostic(self):
153
''' Tests the MCB delimiter setting methods '''
154
self.assertEqual([False] * 16, self.control.getDiagnosticRegister())
156
self.control.setDiagnostic({i:True});
157
self.assertEqual(True, self.control.getDiagnostic(1))
158
self.assertEqual(False, self.control.getDiagnostic(2))
159
actual = [False, True, False, True, True, False, True] + [False] * 9
160
self.assertEqual(actual, self.control.getDiagnosticRegister())
162
self.control.setDiagnostic({i:False});
164
def testModbusControlBlockInvalidDiagnostic(self):
165
''' Tests querying invalid MCB counters methods '''
166
self.assertEqual(None, self.control.getDiagnostic(-1))
167
self.assertEqual(None, self.control.getDiagnostic(17))
168
self.assertEqual(None, self.control.getDiagnostic(None))
169
self.assertEqual(None, self.control.getDiagnostic([1,2,3]))
171
def testAddRemoveSingleClients(self):
172
''' Test adding and removing a host '''
173
self.assertFalse(self.access.check("192.168.1.1"))
174
self.access.add("192.168.1.1")
175
self.assertTrue(self.access.check("192.168.1.1"))
176
self.access.add("192.168.1.1")
177
self.access.remove("192.168.1.1")
178
self.assertFalse(self.access.check("192.168.1.1"))
180
def testAddRemoveMultipleClients(self):
181
''' Test adding and removing a host '''
182
list = ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
183
self.access.add(list)
185
self.assertTrue(self.access.check(host))
186
self.access.remove(list)
188
def testNetworkAccessListIterator(self):
189
''' Test adding and removing a host '''
190
list = ["127.0.0.1", "192.168.1.1", "192.168.1.2", "192.168.1.3"]
191
self.access.add(list)
192
for host in self.access:
193
self.assertTrue(host in list)
195
def testClearingControlEvents(self):
196
''' Test adding and clearing modbus events '''
197
self.assertEqual(self.control.Events, [])
198
event = ModbusEvent()
199
self.control.addEvent(event)
200
self.assertEqual(self.control.Events, [event])
201
self.assertEqual(self.control.Counter.Event, 1)
202
self.control.clearEvents()
203
self.assertEqual(self.control.Events, [])
204
self.assertEqual(self.control.Counter.Event, 1)
206
def testRetrievingControlEvents(self):
207
''' Test adding and removing a host '''
208
self.assertEqual(self.control.Events, [])
209
event = RemoteReceiveEvent()
210
self.control.addEvent(event)
211
self.assertEqual(self.control.Events, [event])
212
packet = self.control.getEvents()
213
self.assertEqual(packet, '\x40')
215
#---------------------------------------------------------------------------#
217
#---------------------------------------------------------------------------#
218
if __name__ == "__main__":