Skip to content

Commit 08eba81

Browse files
Tests: establish test/util.py and test/test_nmt.py (#503)
Give NMT tests their own file, and establish a util.py for the test suite for common stuff like the location of sample EDS files. Consistently use SAMPLE_EDS instead of EDS_PATH.
1 parent c413eaf commit 08eba81

File tree

8 files changed

+92
-100
lines changed

8 files changed

+92
-100
lines changed

test/__init__.py

Whitespace-only changes.

test/test_eds.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import os
22
import unittest
3+
34
import canopen
45
from canopen.objectdictionary.eds import _signed_int_from_hex
56
from canopen.utils import pretty_index
6-
7-
8-
SAMPLE_EDS = os.path.join(os.path.dirname(__file__), 'sample.eds')
9-
DATATYPES_EDS = os.path.join(os.path.dirname(__file__), 'datatypes.eds')
7+
from .util import SAMPLE_EDS, DATATYPES_EDS
108

119

1210
class TestEDS(unittest.TestCase):

test/test_local.py

Lines changed: 9 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
import os
2-
import unittest
3-
import canopen
4-
import logging
51
import time
2+
import unittest
63

7-
# logging.basicConfig(level=logging.DEBUG)
8-
9-
EDS_PATH = os.path.join(os.path.dirname(__file__), 'sample.eds')
4+
import canopen
5+
from .util import SAMPLE_EDS
106

117

128
class TestSDO(unittest.TestCase):
@@ -18,15 +14,15 @@ class TestSDO(unittest.TestCase):
1814
def setUpClass(cls):
1915
cls.network1 = canopen.Network()
2016
cls.network1.connect("test", interface="virtual")
21-
cls.remote_node = cls.network1.add_node(2, EDS_PATH)
17+
cls.remote_node = cls.network1.add_node(2, SAMPLE_EDS)
2218

2319
cls.network2 = canopen.Network()
2420
cls.network2.connect("test", interface="virtual")
25-
cls.local_node = cls.network2.create_node(2, EDS_PATH)
21+
cls.local_node = cls.network2.create_node(2, SAMPLE_EDS)
2622

27-
cls.remote_node2 = cls.network1.add_node(3, EDS_PATH)
23+
cls.remote_node2 = cls.network1.add_node(3, SAMPLE_EDS)
2824

29-
cls.local_node2 = cls.network2.create_node(3, EDS_PATH)
25+
cls.local_node2 = cls.network2.create_node(3, SAMPLE_EDS)
3026

3127
@classmethod
3228
def tearDownClass(cls):
@@ -172,68 +168,6 @@ def test_callbacks(self):
172168
self.assertEqual(self._kwargs["data"], b"\x03\x04")
173169

174170

175-
class TestNMT(unittest.TestCase):
176-
"""
177-
Test NMT slave.
178-
"""
179-
180-
@classmethod
181-
def setUpClass(cls):
182-
cls.network1 = canopen.Network()
183-
cls.network1.connect("test", interface="virtual")
184-
cls.remote_node = cls.network1.add_node(2, EDS_PATH)
185-
186-
cls.network2 = canopen.Network()
187-
cls.network2.connect("test", interface="virtual")
188-
cls.local_node = cls.network2.create_node(2, EDS_PATH)
189-
190-
cls.remote_node2 = cls.network1.add_node(3, EDS_PATH)
191-
192-
cls.local_node2 = cls.network2.create_node(3, EDS_PATH)
193-
194-
@classmethod
195-
def tearDownClass(cls):
196-
cls.network1.disconnect()
197-
cls.network2.disconnect()
198-
199-
def test_start_two_remote_nodes(self):
200-
self.remote_node.nmt.state = 'OPERATIONAL'
201-
# Line below is just so that we are sure the client have received the command
202-
# before we do the check
203-
time.sleep(0.1)
204-
slave_state = self.local_node.nmt.state
205-
self.assertEqual(slave_state, 'OPERATIONAL')
206-
207-
self.remote_node2.nmt.state = 'OPERATIONAL'
208-
# Line below is just so that we are sure the client have received the command
209-
# before we do the check
210-
time.sleep(0.1)
211-
slave_state = self.local_node2.nmt.state
212-
self.assertEqual(slave_state, 'OPERATIONAL')
213-
214-
def test_stop_two_remote_nodes_using_broadcast(self):
215-
# This is a NMT broadcast "Stop remote node"
216-
# ie. set the node in STOPPED state
217-
self.network1.send_message(0, [2, 0])
218-
219-
# Line below is just so that we are sure the slaves have received the command
220-
# before we do the check
221-
time.sleep(0.1)
222-
slave_state = self.local_node.nmt.state
223-
self.assertEqual(slave_state, 'STOPPED')
224-
slave_state = self.local_node2.nmt.state
225-
self.assertEqual(slave_state, 'STOPPED')
226-
227-
def test_heartbeat(self):
228-
# self.assertEqual(self.remote_node.nmt.state, 'INITIALISING')
229-
# self.assertEqual(self.local_node.nmt.state, 'INITIALISING')
230-
self.local_node.nmt.state = 'OPERATIONAL'
231-
self.local_node.sdo[0x1017].raw = 100
232-
time.sleep(0.2)
233-
self.assertEqual(self.remote_node.nmt.state, 'OPERATIONAL')
234-
235-
self.local_node.nmt.stop_heartbeat()
236-
237171
class TestPDO(unittest.TestCase):
238172
"""
239173
Test PDO slave.
@@ -243,11 +177,11 @@ class TestPDO(unittest.TestCase):
243177
def setUpClass(cls):
244178
cls.network1 = canopen.Network()
245179
cls.network1.connect("test", interface="virtual")
246-
cls.remote_node = cls.network1.add_node(2, EDS_PATH)
180+
cls.remote_node = cls.network1.add_node(2, SAMPLE_EDS)
247181

248182
cls.network2 = canopen.Network()
249183
cls.network2.connect("test", interface="virtual")
250-
cls.local_node = cls.network2.create_node(2, EDS_PATH)
184+
cls.local_node = cls.network2.create_node(2, SAMPLE_EDS)
251185

252186
@classmethod
253187
def tearDownClass(cls):

test/test_network.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import time
2-
import os
32
import unittest
4-
import canopen
53

4+
import canopen
65
import can
7-
8-
EDS_PATH = os.path.join(os.path.dirname(__file__), 'sample.eds')
6+
from .util import SAMPLE_EDS
97

108

119
class TestNetwork(unittest.TestCase):
1210

1311
def setUp(self):
1412
network = canopen.Network()
15-
network.add_node(2, EDS_PATH)
13+
network.add_node(2, SAMPLE_EDS)
1614
network.add_node(3, network[2].object_dictionary)
1715
self.network = network
1816

test/test_nmt.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import time
2+
import unittest
3+
4+
import canopen
5+
from .util import SAMPLE_EDS
6+
7+
8+
class TestNmtSlave(unittest.TestCase):
9+
def setUp(self):
10+
self.network1 = canopen.Network()
11+
self.network1.connect("test", interface="virtual")
12+
self.remote_node = self.network1.add_node(2, SAMPLE_EDS)
13+
14+
self.network2 = canopen.Network()
15+
self.network2.connect("test", interface="virtual")
16+
self.local_node = self.network2.create_node(2, SAMPLE_EDS)
17+
self.remote_node2 = self.network1.add_node(3, SAMPLE_EDS)
18+
self.local_node2 = self.network2.create_node(3, SAMPLE_EDS)
19+
20+
def tearDown(self):
21+
self.network1.disconnect()
22+
self.network2.disconnect()
23+
24+
def test_start_two_remote_nodes(self):
25+
self.remote_node.nmt.state = "OPERATIONAL"
26+
# Line below is just so that we are sure the client have received the command
27+
# before we do the check
28+
time.sleep(0.1)
29+
slave_state = self.local_node.nmt.state
30+
self.assertEqual(slave_state, "OPERATIONAL")
31+
32+
self.remote_node2.nmt.state = "OPERATIONAL"
33+
# Line below is just so that we are sure the client have received the command
34+
# before we do the check
35+
time.sleep(0.1)
36+
slave_state = self.local_node2.nmt.state
37+
self.assertEqual(slave_state, "OPERATIONAL")
38+
39+
def test_stop_two_remote_nodes_using_broadcast(self):
40+
# This is a NMT broadcast "Stop remote node"
41+
# ie. set the node in STOPPED state
42+
self.network1.send_message(0, [2, 0])
43+
44+
# Line below is just so that we are sure the slaves have received the command
45+
# before we do the check
46+
time.sleep(0.1)
47+
slave_state = self.local_node.nmt.state
48+
self.assertEqual(slave_state, "STOPPED")
49+
slave_state = self.local_node2.nmt.state
50+
self.assertEqual(slave_state, "STOPPED")
51+
52+
def test_heartbeat(self):
53+
self.assertEqual(self.remote_node.nmt.state, "INITIALISING")
54+
self.assertEqual(self.local_node.nmt.state, "INITIALISING")
55+
self.local_node.nmt.state = "OPERATIONAL"
56+
self.local_node.sdo[0x1017].raw = 100
57+
time.sleep(0.2)
58+
self.assertEqual(self.remote_node.nmt.state, "OPERATIONAL")
59+
60+
self.local_node.nmt.stop_heartbeat()
61+
62+
63+
if __name__ == "__main__":
64+
unittest.main()

test/test_pdo.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
import os.path
21
import unittest
3-
import canopen
42

5-
EDS_PATH = os.path.join(os.path.dirname(__file__), 'sample.eds')
3+
import canopen
4+
from .util import SAMPLE_EDS
65

76

87
class TestPDO(unittest.TestCase):
98

109
def test_bit_mapping(self):
11-
node = canopen.Node(1, EDS_PATH)
10+
node = canopen.Node(1, SAMPLE_EDS)
1211
map = node.pdo.tx[1]
1312
map.add_variable('INTEGER16 value') # 0x2001
1413
map.add_variable('UNSIGNED8 value', length=4) # 0x2002
@@ -56,7 +55,7 @@ def test_bit_mapping(self):
5655
self.assertEqual(node.pdo[0x1600][0x2002].raw, 0xf)
5756

5857
def test_save_pdo(self):
59-
node = canopen.Node(1, EDS_PATH)
58+
node = canopen.Node(1, SAMPLE_EDS)
6059
node.tpdo.save()
6160
node.rpdo.save()
6261

test/test_sdo.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import os
21
import unittest
3-
# import binascii
2+
43
import canopen
5-
from canopen.objectdictionary import ODVariable
64
import canopen.objectdictionary.datatypes as dt
5+
from canopen.objectdictionary import ODVariable
6+
from .util import SAMPLE_EDS, DATATYPES_EDS
77

8-
EDS_PATH = os.path.join(os.path.dirname(__file__), 'sample.eds')
9-
DATAEDS_PATH = os.path.join(os.path.dirname(__file__), 'datatypes.eds')
108

119
TX = 1
1210
RX = 2
@@ -26,17 +24,15 @@ def _send_message(self, can_id, data, remote=False):
2624
"""
2725
next_data = self.data.pop(0)
2826
self.assertEqual(next_data[0], TX, "No transmission was expected")
29-
# print(f"> {binascii.hexlify(data)} ({binascii.hexlify(next_data[1])})")
3027
self.assertSequenceEqual(data, next_data[1])
3128
self.assertEqual(can_id, 0x602)
3229
while self.data and self.data[0][0] == RX:
33-
# print(f"< {binascii.hexlify(self.data[0][1])}")
3430
self.network.notify(0x582, self.data.pop(0)[1], 0.0)
3531

3632
def setUp(self):
3733
network = canopen.Network()
3834
network.send_message = self._send_message
39-
node = network.add_node(2, EDS_PATH)
35+
node = network.add_node(2, SAMPLE_EDS)
4036
node.sdo.RESPONSE_TIMEOUT = 0.01
4137
self.network = network
4238

@@ -178,17 +174,15 @@ def _send_message(self, can_id, data, remote=False):
178174
"""
179175
next_data = self.data.pop(0)
180176
self.assertEqual(next_data[0], TX, "No transmission was expected")
181-
# print("> %s (%s)" % (binascii.hexlify(data), binascii.hexlify(next_data[1])))
182177
self.assertSequenceEqual(data, next_data[1])
183178
self.assertEqual(can_id, 0x602)
184179
while self.data and self.data[0][0] == RX:
185-
# print("< %s" % binascii.hexlify(self.data[0][1]))
186180
self.network.notify(0x582, self.data.pop(0)[1], 0.0)
187181

188182
def setUp(self):
189183
network = canopen.Network()
190184
network.send_message = self._send_message
191-
node = network.add_node(2, DATAEDS_PATH)
185+
node = network.add_node(2, DATATYPES_EDS)
192186
node.sdo.RESPONSE_TIMEOUT = 0.01
193187
self.node = node
194188
self.network = network

test/util.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import os
2+
3+
4+
DATATYPES_EDS = os.path.join(os.path.dirname(__file__), "datatypes.eds")
5+
SAMPLE_EDS = os.path.join(os.path.dirname(__file__), "sample.eds")

0 commit comments

Comments
 (0)