Skip to content

Commit 83594ac

Browse files
Tests: improve SYNC coverage (#531)
1 parent 78f6dde commit 83594ac

File tree

1 file changed

+62
-14
lines changed

1 file changed

+62
-14
lines changed

test/test_sync.py

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,77 @@
1+
import threading
12
import unittest
3+
4+
import can
25
import canopen
36

47

8+
PERIOD = 0.01
9+
TIMEOUT = PERIOD * 10
10+
11+
512
class TestSync(unittest.TestCase):
13+
def setUp(self):
14+
self.net = canopen.Network()
15+
self.net.connect(interface="virtual")
16+
self.sync = canopen.sync.SyncProducer(self.net)
17+
self.rxbus = can.Bus(interface="virtual")
618

7-
def test_sync_producer(self):
8-
network = canopen.Network()
9-
network.connect(interface="virtual", receive_own_messages=True)
10-
producer = canopen.sync.SyncProducer(network)
11-
producer.transmit()
12-
msg = network.bus.recv(1)
13-
network.disconnect()
19+
def tearDown(self):
20+
self.net.disconnect()
21+
self.rxbus.shutdown()
22+
23+
def test_sync_producer_transmit(self):
24+
self.sync.transmit()
25+
msg = self.rxbus.recv(TIMEOUT)
26+
self.assertIsNotNone(msg)
1427
self.assertEqual(msg.arbitration_id, 0x80)
1528
self.assertEqual(msg.dlc, 0)
1629

17-
def test_sync_producer_counter(self):
18-
network = canopen.Network()
19-
network.connect(interface="virtual", receive_own_messages=True)
20-
producer = canopen.sync.SyncProducer(network)
21-
producer.transmit(2)
22-
msg = network.bus.recv(1)
23-
network.disconnect()
30+
def test_sync_producer_transmit_count(self):
31+
self.sync.transmit(2)
32+
msg = self.rxbus.recv(TIMEOUT)
33+
self.assertIsNotNone(msg)
2434
self.assertEqual(msg.arbitration_id, 0x80)
2535
self.assertEqual(msg.dlc, 1)
2636
self.assertEqual(msg.data, b"\x02")
2737

38+
def test_sync_producer_start_invalid_period(self):
39+
with self.assertRaises(ValueError):
40+
self.sync.start(0)
41+
42+
def test_sync_producer_start(self):
43+
self.sync.start(PERIOD)
44+
self.addCleanup(self.sync.stop)
45+
46+
acc = []
47+
condition = threading.Condition()
48+
49+
def hook(id_, data, ts):
50+
item = id_, data, ts
51+
acc.append(item)
52+
condition.notify()
53+
54+
def periodicity():
55+
# Check if periodicity has been established.
56+
if len(acc) > 2:
57+
delta = acc[-1][2] - acc[-2][2]
58+
return round(delta, ndigits=1) == PERIOD
59+
60+
# Sample messages.
61+
with condition:
62+
condition.wait_for(periodicity, TIMEOUT)
63+
for msg in acc:
64+
self.assertIsNotNone(msg)
65+
self.assertEqual(msg[0], 0x80)
66+
self.assertEqual(msg[1], b"")
67+
68+
self.sync.stop()
69+
# A message may have been in flight when we stopped the timer,
70+
# so allow a single failure.
71+
msg = self.rxbus.recv(TIMEOUT)
72+
if msg is not None:
73+
self.assertIsNone(self.net.bus.recv(TIMEOUT))
74+
75+
2876
if __name__ == "__main__":
2977
unittest.main()

0 commit comments

Comments
 (0)