diff --git a/can/io/logger.py b/can/io/logger.py index a4544b87d..9a9b851d8 100644 --- a/can/io/logger.py +++ b/can/io/logger.py @@ -71,7 +71,7 @@ def __new__( ) Logger.fetched_plugins = True - suffix = pathlib.PurePath(filename).suffix + suffix = pathlib.PurePath(filename).suffix.lower() try: return Logger.message_writers[suffix](filename, *args, **kwargs) except KeyError: diff --git a/can/io/player.py b/can/io/player.py index 88d3497fa..21e716250 100644 --- a/can/io/player.py +++ b/can/io/player.py @@ -70,7 +70,7 @@ def __new__(cls, filename: "can.typechecking.StringPathLike", *args, **kwargs): ) LogReader.fetched_plugins = True - suffix = pathlib.PurePath(filename).suffix + suffix = pathlib.PurePath(filename).suffix.lower() try: return LogReader.message_readers[suffix](filename, *args, **kwargs) except KeyError: diff --git a/test/logformats_test.py b/test/logformats_test.py index 08a9e929d..fbca43306 100644 --- a/test/logformats_test.py +++ b/test/logformats_test.py @@ -36,6 +36,36 @@ logging.basicConfig(level=logging.DEBUG) +class ReaderWriterExtensionTest(unittest.TestCase): + message_writers_and_readers = {} + for suffix, writer in can.Logger.message_writers.items(): + message_writers_and_readers[suffix] = ( + writer, + can.LogReader.message_readers.get(suffix), + ) + + def test_extension_matching(self): + for suffix, (writer, reader) in self.message_writers_and_readers.items(): + suffix_variants = [ + suffix.upper(), + suffix.lower(), + "".join([c.upper() if i % 2 else c for i, c in enumerate(suffix)]), + ] + for suffix_variant in suffix_variants: + tmp_file = tempfile.NamedTemporaryFile( + suffix=suffix_variant, delete=False + ) + tmp_file.close() + try: + with can.Logger(tmp_file.name) as logger: + assert type(logger) == writer + if reader is not None: + with can.LogReader(tmp_file.name) as player: + assert type(player) == reader + finally: + os.remove(tmp_file.name) + + class ReaderWriterTest(unittest.TestCase, ComparingMessagesTestCase, metaclass=ABCMeta): """Tests a pair of writer and reader by writing all data first and then reading all data and checking if they could be reconstructed