Skip to content

Commit b0d7460

Browse files
christiansandberghardbyte
authored andcommitted
Refactoring of BLF module
Implement append mode Write a temporary header in case logging is not stopped gracefully Move ZLIB compression level to constructor, default to ZLIB default Improve unit testing Various refactoring to improve readability and slight performance improvements
1 parent f342c1c commit b0d7460

10 files changed

+335
-247
lines changed

can/io/blf.py

Lines changed: 237 additions & 222 deletions
Large diffs are not rendered by default.

test/data/example_data.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ def sort_messages(messages):
108108
)
109109

110110

111+
TEST_MESSAGES_CAN_FD = sort_messages(
112+
[
113+
Message(is_fd=True, data=range(64)),
114+
Message(is_fd=True, data=range(8)),
115+
Message(is_fd=True, bitrate_switch=True),
116+
Message(is_fd=True, error_state_indicator=True),
117+
]
118+
)
119+
120+
111121
TEST_MESSAGES_REMOTE_FRAMES = sort_messages(
112122
[
113123
Message(

test/data/logfile.blf

-682 Bytes
Binary file not shown.

test/data/test_CanErrorFrameExt.blf

452 Bytes
Binary file not shown.

test/data/test_CanFdMessage.blf

564 Bytes
Binary file not shown.

test/data/test_CanFdMessage64.blf

612 Bytes
Binary file not shown.

test/data/test_CanMessage.blf

420 Bytes
Binary file not shown.

test/data/test_CanMessage2.blf

436 Bytes
Binary file not shown.

test/listener_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ def test_filetype_to_instance(extension, klass):
9090
try:
9191
if extension == ".blf":
9292
delete = False
93-
file_handler = open(join(dirname(__file__), "data/logfile.blf"))
93+
file_handler = open(
94+
join(dirname(__file__), "data", "test_CanMessage.blf")
95+
)
9496
else:
9597
delete = True
9698
file_handler = tempfile.NamedTemporaryFile(

test/logformats_test.py

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
TEST_MESSAGES_BASE,
2828
TEST_MESSAGES_REMOTE_FRAMES,
2929
TEST_MESSAGES_ERROR_FRAMES,
30+
TEST_MESSAGES_CAN_FD,
3031
TEST_COMMENTS,
3132
sort_messages,
3233
)
@@ -89,13 +90,13 @@ def _setup_instance_helper(
8990
ignored, if *preserves_channel* is True
9091
"""
9192
# get all test messages
92-
self.original_messages = TEST_MESSAGES_BASE
93+
self.original_messages = list(TEST_MESSAGES_BASE)
9394
if check_remote_frames:
9495
self.original_messages += TEST_MESSAGES_REMOTE_FRAMES
9596
if check_error_frames:
9697
self.original_messages += TEST_MESSAGES_ERROR_FRAMES
9798
if check_fd:
98-
self.original_messages += [] # TODO: add TEST_MESSAGES_CAN_FD
99+
self.original_messages += TEST_MESSAGES_CAN_FD
99100

100101
# sort them so that for example ASCWriter does not "fix" any messages with timestamp 0.0
101102
self.original_messages = sort_messages(self.original_messages)
@@ -345,41 +346,101 @@ def _setup_instance(self):
345346

346347

347348
class TestBlfFileFormat(ReaderWriterTest):
348-
"""Tests can.BLFWriter and can.BLFReader"""
349+
"""Tests can.BLFWriter and can.BLFReader.
350+
351+
Uses log files created by Toby Lorenz:
352+
https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/tests/unittests/events_from_binlog/
353+
"""
349354

350355
def _setup_instance(self):
351356
super()._setup_instance_helper(
352357
can.BLFWriter,
353358
can.BLFReader,
354359
binary_file=True,
355-
check_fd=False,
360+
check_fd=True,
356361
check_comments=False,
362+
test_append=True,
357363
allowed_timestamp_delta=1.0e-6,
358364
preserves_channel=False,
359365
adds_default_channel=0,
360366
)
361367

362-
def test_read_known_file(self):
363-
logfile = os.path.join(os.path.dirname(__file__), "data", "logfile.blf")
368+
def _read_log_file(self, filename):
369+
logfile = os.path.join(os.path.dirname(__file__), "data", filename)
364370
with can.BLFReader(logfile) as reader:
365-
messages = list(reader)
366-
367-
expected = [
368-
can.Message(
369-
timestamp=1.0,
370-
is_extended_id=False,
371-
arbitration_id=0x64,
372-
data=[0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8],
373-
),
374-
can.Message(
375-
timestamp=73.0,
376-
is_extended_id=True,
377-
arbitration_id=0x1FFFFFFF,
378-
is_error_frame=True,
379-
),
380-
]
381-
382-
self.assertMessagesEqual(messages, expected)
371+
return list(reader)
372+
373+
def test_can_message(self):
374+
expected = can.Message(
375+
timestamp=2459565876.494607,
376+
arbitration_id=0x4444444,
377+
is_extended_id=False,
378+
channel=0x1110,
379+
dlc=0x33,
380+
data=[0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC],
381+
)
382+
actual = self._read_log_file("test_CanMessage.blf")
383+
self.assertMessagesEqual(actual, [expected] * 2)
384+
self.assertEqual(actual[0].channel, expected.channel)
385+
386+
def test_can_message_2(self):
387+
expected = can.Message(
388+
timestamp=2459565876.494607,
389+
arbitration_id=0x4444444,
390+
is_extended_id=False,
391+
channel=0x1110,
392+
dlc=0x33,
393+
data=[0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC],
394+
)
395+
actual = self._read_log_file("test_CanMessage2.blf")
396+
self.assertMessagesEqual(actual, [expected] * 2)
397+
self.assertEqual(actual[0].channel, expected.channel)
398+
399+
def test_can_fd_message(self):
400+
expected = can.Message(
401+
timestamp=2459565876.494607,
402+
arbitration_id=0x4444444,
403+
is_extended_id=False,
404+
channel=0x1110,
405+
dlc=64,
406+
is_fd=True,
407+
bitrate_switch=True,
408+
error_state_indicator=True,
409+
data=range(64),
410+
)
411+
actual = self._read_log_file("test_CanFdMessage.blf")
412+
self.assertMessagesEqual(actual, [expected] * 2)
413+
self.assertEqual(actual[0].channel, expected.channel)
414+
415+
def test_can_fd_message_64(self):
416+
expected = can.Message(
417+
timestamp=2459565876.494607,
418+
arbitration_id=0x15555555,
419+
is_extended_id=False,
420+
is_remote_frame=True,
421+
channel=0x10,
422+
dlc=64,
423+
is_fd=True,
424+
bitrate_switch=True,
425+
error_state_indicator=True,
426+
)
427+
actual = self._read_log_file("test_CanFdMessage64.blf")
428+
self.assertMessagesEqual(actual, [expected] * 2)
429+
self.assertEqual(actual[0].channel, expected.channel)
430+
431+
def test_can_error_frame_ext(self):
432+
expected = can.Message(
433+
timestamp=2459565876.494607,
434+
is_error_frame=True,
435+
arbitration_id=0x19999999,
436+
is_extended_id=True,
437+
channel=0x1110,
438+
dlc=0x66,
439+
data=[0xCC, 0xDD, 0xEE, 0xFF, 0x11, 0x22, 0x33, 0x44],
440+
)
441+
actual = self._read_log_file("test_CanErrorFrameExt.blf")
442+
self.assertMessagesEqual(actual, [expected] * 2)
443+
self.assertEqual(actual[0].channel, expected.channel)
383444

384445

385446
class TestCanutilsFileFormat(ReaderWriterTest):

0 commit comments

Comments
 (0)