Skip to content

Commit b105289

Browse files
felixdivohardbyte
authored andcommitted
Test refactoring
* Moved the test messages to a separate module, * added many more and separated them by types, * unified the can.io.* tests further * added many more comments and minor formatting changes * restructured test cases * make tests more reproducible and small fixes
1 parent b5c01f1 commit b105289

4 files changed

Lines changed: 305 additions & 215 deletions

File tree

test/data/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import example_data

test/data/example_data.py

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
This module contains some example data, like messages fo different
5+
types and example comments with different challenges.
6+
"""
7+
8+
import random
9+
10+
from can import Message
11+
12+
13+
# make tests more reproducible
14+
# some number that was generated by smashing hands on the keyboard
15+
random.seed(13339115)
16+
17+
18+
TEST_TIME = 1483389946.197 # some random number
19+
20+
# List of messages of different types that can be used in tests
21+
TEST_MESSAGES_BASE = [
22+
Message(
23+
# empty
24+
),
25+
Message(
26+
# only data
27+
data=[0x00, 0x42]
28+
),
29+
Message(
30+
# no data
31+
arbitration_id=0xAB, extended_id=False
32+
),
33+
Message(
34+
# no data
35+
arbitration_id=0x42, extended_id=True
36+
),
37+
Message(
38+
# no data
39+
arbitration_id=0xABCDEF,
40+
),
41+
Message(
42+
# empty data
43+
data=[]
44+
),
45+
Message(
46+
# empty data
47+
data=[0xFF, 0xFE, 0xFD],
48+
),
49+
Message(
50+
arbitration_id=0xABCDEF, extended_id=True,
51+
timestamp=TEST_TIME,
52+
data=[1, 2, 3, 4, 5, 6, 7, 8]
53+
),
54+
Message(
55+
arbitration_id=0x123, extended_id=False,
56+
timestamp=TEST_TIME + 42.42,
57+
data=[0xff, 0xff]
58+
),
59+
Message(
60+
arbitration_id=0xDADADA, extended_id=True,
61+
timestamp=TEST_TIME + .165,
62+
data=[1, 2, 3, 4, 5, 6, 7, 8]
63+
),
64+
Message(
65+
arbitration_id=0x123, extended_id=False,
66+
timestamp=TEST_TIME + .365,
67+
data=[254, 255]
68+
),
69+
Message(
70+
arbitration_id=0x768, extended_id=False,
71+
timestamp=TEST_TIME + 3.165
72+
),
73+
]
74+
75+
TEST_MESSAGES_REMOTE_FRAMES = [
76+
Message(
77+
arbitration_id=0xDADADA, extended_id=True, is_remote_frame=False,
78+
timestamp=TEST_TIME + .165,
79+
data=[1, 2, 3, 4, 5, 6, 7, 8]
80+
),
81+
Message(
82+
arbitration_id=0x123, extended_id=False, is_remote_frame=False,
83+
timestamp=TEST_TIME + .365,
84+
data=[254, 255]
85+
),
86+
Message(
87+
arbitration_id=0x768, extended_id=False, is_remote_frame=True,
88+
timestamp=TEST_TIME + 3.165
89+
),
90+
Message(
91+
arbitration_id=0xABCDEF, extended_id=True, is_remote_frame=True,
92+
timestamp=TEST_TIME + 7858.67
93+
),
94+
]
95+
96+
TEST_MESSAGES_ERROR_FRAMES = [
97+
Message(
98+
is_error_frame=True
99+
),
100+
Message(
101+
is_error_frame=True,
102+
timestamp=TEST_TIME + 0.170
103+
),
104+
Message(
105+
is_error_frame=True,
106+
timestamp=TEST_TIME + 17.157
107+
)
108+
]
109+
110+
TEST_COMMENTS = [
111+
"This is the first comment",
112+
"", # empty comment
113+
"This third comment contains some strange characters: 'ä\"§$%&/()=?__::_Öüßêè and ends here.",
114+
(
115+
"This fourth comment is quite long! " \
116+
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. " \
117+
"Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. " \
118+
"Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi." \
119+
),
120+
]
121+
122+
def generate_message(arbitration_id):
123+
"""
124+
Generates a new message with the given ID, some random data
125+
and a non-extended ID.
126+
"""
127+
data = [random.randrange(0, 2 ** 8 - 1) for _ in range(8)]
128+
msg = Message(arbitration_id=arbitration_id, data=data, extended_id=False)
129+
return msg

test/listener_test.py

Lines changed: 14 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -8,45 +8,27 @@
88

99
import can
1010

11+
from data.example_data import generate_message
12+
1113
channel = 'vcan0'
1214
can.rc['interface'] = 'virtual'
1315

14-
logging.getLogger("").setLevel(logging.DEBUG)
15-
16-
17-
# List of messages of different types that can be used in tests
18-
TEST_MESSAGES = [
19-
can.Message(
20-
arbitration_id=0xDADADA, extended_id=True, is_remote_frame=False,
21-
timestamp=1483389464.165,
22-
data=[1, 2, 3, 4, 5, 6, 7, 8]),
23-
can.Message(
24-
arbitration_id=0x123, extended_id=False, is_remote_frame=False,
25-
timestamp=1483389464.365,
26-
data=[254, 255]),
27-
can.Message(
28-
arbitration_id=0x768, extended_id=False, is_remote_frame=True,
29-
timestamp=1483389466.165),
30-
can.Message(is_error_frame=True, timestamp=1483389466.170),
31-
]
32-
33-
34-
def generate_message(arbitration_id):
35-
data = [random.randrange(0, 2 ** 8 - 1) for _ in range(8)]
36-
m = can.Message(arbitration_id=arbitration_id, data=data, extended_id=False)
37-
return m
16+
logging.getLogger('').setLevel(logging.DEBUG)
3817

18+
# make tests more reproducible
19+
# some number that was generated by smashing hands on the keyboard
20+
random.seed(13339115)
3921

4022
class ListenerImportTest(unittest.TestCase):
4123

4224
def testClassesImportable(self):
43-
assert hasattr(can, 'Listener')
44-
assert hasattr(can, 'BufferedReader')
45-
assert hasattr(can, 'Notifier')
46-
assert hasattr(can, 'ASCWriter')
47-
assert hasattr(can, 'CanutilsLogWriter')
48-
assert hasattr(can, 'SqlReader')
49-
25+
self.assertTrue(hasattr(can, 'Listener'))
26+
self.assertTrue(hasattr(can, 'BufferedReader'))
27+
self.assertTrue(hasattr(can, 'Notifier'))
28+
self.assertTrue(hasattr(can, 'ASCWriter'))
29+
self.assertTrue(hasattr(can, 'CanutilsLogWriter'))
30+
self.assertTrue(hasattr(can, 'SqlReader'))
31+
# TODO add more?
5032

5133
class BusTest(unittest.TestCase):
5234

@@ -75,7 +57,7 @@ def test_filetype_to_instance(extension, klass):
7557
test_filetype_to_instance('log', can.CanutilsLogWriter)
7658
test_filetype_to_instance("blf", can.BLFWriter)
7759
test_filetype_to_instance("csv", can.CSVWriter)
78-
test_filetype_to_instance("db", can.SqliteWriter)
60+
test_filetype_to_instance("db", can.SqliteWriter)
7961
test_filetype_to_instance("txt", can.Printer)
8062

8163
def testBufferedListenerReceives(self):
@@ -84,114 +66,6 @@ def testBufferedListenerReceives(self):
8466
m = a_listener.get_message(0.2)
8567
self.assertIsNotNone(m)
8668

87-
def testSQLWriterReceives(self):
88-
f = tempfile.NamedTemporaryFile('w', delete=False)
89-
f.close()
90-
a_listener = can.SqliteWriter(f.name)
91-
a_listener(generate_message(0xDADADA))
92-
# Small delay so we don't stop before we actually block trying to read
93-
sleep(0.5)
94-
a_listener.stop()
95-
96-
con = sqlite3.connect(f.name)
97-
c = con.cursor()
98-
c.execute("select * from messages")
99-
msg = c.fetchone()
100-
con.close()
101-
self.assertEqual(msg[1], 0xDADADA)
102-
103-
def testSQLWriterWritesToSameFile(self):
104-
f = tempfile.NamedTemporaryFile('w', delete=False)
105-
f.close()
106-
107-
first_listener = can.SqliteWriter(f.name)
108-
first_listener(generate_message(0x01))
109-
110-
sleep(first_listener.MAX_TIME_BETWEEN_WRITES)
111-
first_listener.stop()
112-
113-
second_listener = can.SqliteWriter(f.name)
114-
second_listener(generate_message(0x02))
115-
116-
sleep(second_listener.MAX_TIME_BETWEEN_WRITES)
117-
118-
second_listener.stop()
119-
120-
con = sqlite3.connect(f.name)
121-
122-
with con:
123-
c = con.cursor()
124-
125-
c.execute("select COUNT() from messages")
126-
self.assertEqual(2, c.fetchone()[0])
127-
128-
c.execute("select * from messages")
129-
msg1 = c.fetchone()
130-
msg2 = c.fetchone()
131-
132-
assert msg1[1] == 0x01
133-
assert msg2[1] == 0x02
134-
135-
136-
def testAscListener(self):
137-
a_listener = can.ASCWriter("test.asc", channel=2)
138-
a_listener.log_event("This is some comment")
139-
msg = can.Message(extended_id=True,
140-
timestamp=a_listener.started + 0.5,
141-
arbitration_id=0xabcdef,
142-
data=[1, 2, 3, 4, 5, 6, 7, 8])
143-
a_listener(msg)
144-
msg = can.Message(extended_id=False,
145-
timestamp=a_listener.started + 1,
146-
arbitration_id=0x123,
147-
data=[0xff, 0xff])
148-
a_listener(msg)
149-
msg = can.Message(extended_id=True,
150-
timestamp=a_listener.started + 1.5,
151-
is_remote_frame=True,
152-
dlc=8,
153-
arbitration_id=0xabcdef)
154-
a_listener(msg)
155-
msg = can.Message(is_error_frame=True,
156-
timestamp=a_listener.started + 1.6,
157-
arbitration_id=0xabcdef)
158-
a_listener(msg)
159-
a_listener.stop()
160-
with open("test.asc", "r") as f:
161-
output_contents = f.read()
162-
163-
self.assertTrue('This is some comment' in output_contents)
164-
165-
166-
class BLFTest(unittest.TestCase):
167-
168-
def test_reader(self):
169-
logfile = os.path.join(os.path.dirname(__file__), "data", "logfile.blf")
170-
messages = list(can.BLFReader(logfile))
171-
self.assertEqual(len(messages), 1)
172-
self.assertEqual(messages[0],
173-
can.Message(
174-
extended_id=False,
175-
arbitration_id=0x64,
176-
data=[0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]))
177-
178-
def test_reader_writer(self):
179-
f = tempfile.NamedTemporaryFile('w', delete=False)
180-
f.close()
181-
filename = f.name
182-
183-
writer = can.BLFWriter(filename)
184-
for msg in TEST_MESSAGES:
185-
writer(msg)
186-
writer.log_event("One comment which should be attached to last message")
187-
writer.log_event("Another comment", TEST_MESSAGES[-1].timestamp + 2)
188-
writer.stop()
189-
190-
messages = list(can.BLFReader(filename))
191-
self.assertEqual(len(messages), len(TEST_MESSAGES))
192-
for msg1, msg2 in zip(messages, TEST_MESSAGES):
193-
self.assertEqual(msg1, msg2)
194-
self.assertAlmostEqual(msg1.timestamp, msg2.timestamp)
19569

19670
if __name__ == '__main__':
19771
unittest.main()

0 commit comments

Comments
 (0)