~ubuntu-branches/ubuntu/quantal/pymodbus/quantal

« back to all changes in this revision

Viewing changes to test/test_device.py

  • Committer: Bazaar Package Importer
  • Author(s): W. Martin Borgert
  • Date: 2011-08-17 09:34:29 UTC
  • Revision ID: james.westby@ubuntu.com-20110817093429-cvgff034imbs899m
Tags: upstream-0.9.0
ImportĀ upstreamĀ versionĀ 0.9.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
import unittest
 
3
from pymodbus.device import *
 
4
from pymodbus.exceptions import *
 
5
from pymodbus.events import *
 
6
 
 
7
class SimpleDataStoreTest(unittest.TestCase):
 
8
    '''
 
9
    This is the unittest for the pymodbus.device module
 
10
    '''
 
11
 
 
12
    def setUp(self):
 
13
        self.info = {
 
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
 
21
            0x07: 'x',                      # reserved
 
22
            0x08: 'x',                      # reserved
 
23
            0x10: 'private'                 # private data
 
24
        }
 
25
        self.ident   = ModbusDeviceIdentification(self.info)
 
26
        self.control = ModbusControlBlock()
 
27
        self.access  = ModbusAccessControl()
 
28
        self.control.reset()
 
29
 
 
30
    def tearDown(self):
 
31
        ''' Cleans up the test environment '''
 
32
        del self.ident
 
33
        del self.control
 
34
        del self.access
 
35
 
 
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')
 
46
 
 
47
    def testBasicCommands(self):
 
48
        ''' Test device identification reading '''
 
49
        self.assertEqual(str(self.ident),   "DeviceIdentity")
 
50
        self.assertEqual(str(self.control), "ModbusControl")
 
51
 
 
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], '')
 
65
 
 
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)
 
71
 
 
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'
 
78
 
 
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])
 
83
 
 
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)
 
91
 
 
92
    def testModbusControlBlockCounters(self):
 
93
        ''' Tests the MCB counters methods '''
 
94
        self.assertEqual(0x0, self.control.Counter.BusMessage)
 
95
        for i in range(10):
 
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)
 
104
 
 
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)
 
113
 
 
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)
 
119
 
 
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)
 
125
 
 
126
    def testModbusControlBlockCounterSummary(self):
 
127
        ''' Tests retrieving the current counter summary '''
 
128
        self.assertEqual(0x00, self.control.Counter.summary())
 
129
        for i in range(10):
 
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())
 
137
 
 
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)
 
143
 
 
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, '=')
 
151
 
 
152
    def testModbusControlBlockDiagnostic(self):
 
153
        ''' Tests the MCB delimiter setting methods '''
 
154
        self.assertEqual([False] * 16, self.control.getDiagnosticRegister())
 
155
        for i in [1,3,4,6]:
 
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())
 
161
        for i in range(16):
 
162
            self.control.setDiagnostic({i:False});
 
163
 
 
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]))
 
170
 
 
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"))
 
179
 
 
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)
 
184
        for host in list:
 
185
            self.assertTrue(self.access.check(host))
 
186
        self.access.remove(list)
 
187
 
 
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)
 
194
 
 
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)
 
205
 
 
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')
 
214
 
 
215
#---------------------------------------------------------------------------#
 
216
# Main
 
217
#---------------------------------------------------------------------------#
 
218
if __name__ == "__main__":
 
219
    unittest.main()