From 945058aa66df4560657b834a52ef194147e27cb6 Mon Sep 17 00:00:00 2001 From: Syed Raza Date: Mon, 24 Feb 2020 14:24:52 -0500 Subject: [PATCH 1/7] Adding direction to virutal bus messages --- can/interfaces/virtual.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/can/interfaces/virtual.py b/can/interfaces/virtual.py index 5e24c6e1f..e7e2e9930 100644 --- a/can/interfaces/virtual.py +++ b/can/interfaces/virtual.py @@ -88,13 +88,18 @@ def send(self, msg, timeout=None): msg_copy = deepcopy(msg) msg_copy.timestamp = time.time() msg_copy.channel = self.channel_id + msg_copy.is_rx = True # Add message to all listening on this channel all_sent = True for bus_queue in self.channel: + msg_to_send = msg_copy + if bus_queue is self.queue and self.receive_own_messages: + msg_to_send = deepcopy(msg_copy) + msg_to_send.is_rx = False if bus_queue is not self.queue or self.receive_own_messages: try: - bus_queue.put(msg_copy, block=True, timeout=timeout) + bus_queue.put(msg_to_send, block=True, timeout=timeout) except queue.Full: all_sent = False if not all_sent: From ca7dbd49ce889aaa47577fb7010f56c4e0b24cfe Mon Sep 17 00:00:00 2001 From: Syed Raza Date: Mon, 2 Mar 2020 10:26:51 -0500 Subject: [PATCH 2/7] Creaing a new msg instance for each virtual interface --- can/interfaces/virtual.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/can/interfaces/virtual.py b/can/interfaces/virtual.py index e7e2e9930..d7aa43d40 100644 --- a/can/interfaces/virtual.py +++ b/can/interfaces/virtual.py @@ -85,23 +85,22 @@ def _recv_internal(self, timeout): def send(self, msg, timeout=None): self._check_if_open() - msg_copy = deepcopy(msg) - msg_copy.timestamp = time.time() - msg_copy.channel = self.channel_id - msg_copy.is_rx = True - + timestamp = time.time() # Add message to all listening on this channel all_sent = True for bus_queue in self.channel: - msg_to_send = msg_copy - if bus_queue is self.queue and self.receive_own_messages: - msg_to_send = deepcopy(msg_copy) - msg_to_send.is_rx = False - if bus_queue is not self.queue or self.receive_own_messages: - try: - bus_queue.put(msg_to_send, block=True, timeout=timeout) - except queue.Full: - all_sent = False + if bus_queue is self.queue and not self.receive_own_messages: + continue + msg_copy = deepcopy(msg) + msg_copy.timestamp = timestamp + msg_copy.channel = self.channel_id + msg_copy.is_rx = True + if bus_queue is self.queue: + msg_copy.is_rx = False + try: + bus_queue.put(msg_copy, block=True, timeout=timeout) + except queue.Full: + all_sent = False if not all_sent: raise CanError("Could not send message to one or more recipients") From bbd076ba130140fccfea1a159454c8a16f7bdb93 Mon Sep 17 00:00:00 2001 From: Syed Date: Mon, 2 Mar 2020 11:01:58 -0500 Subject: [PATCH 3/7] Update can/interfaces/virtual.py Co-Authored-By: pierreluctg --- can/interfaces/virtual.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/can/interfaces/virtual.py b/can/interfaces/virtual.py index d7aa43d40..e84fa5853 100644 --- a/can/interfaces/virtual.py +++ b/can/interfaces/virtual.py @@ -94,9 +94,7 @@ def send(self, msg, timeout=None): msg_copy = deepcopy(msg) msg_copy.timestamp = timestamp msg_copy.channel = self.channel_id - msg_copy.is_rx = True - if bus_queue is self.queue: - msg_copy.is_rx = False + msg_copy.is_rx = bus_queue is not self.queue try: bus_queue.put(msg_copy, block=True, timeout=timeout) except queue.Full: From f648684833bdd84868a011ac3e8d8059bb8c2d7d Mon Sep 17 00:00:00 2001 From: Syed Raza Date: Tue, 3 Mar 2020 09:35:06 -0500 Subject: [PATCH 4/7] Adding some unit tests for message direction checking as well as msg.data mutation --- test/back2back_test.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test/back2back_test.py b/test/back2back_test.py index b707988ec..8ac24400a 100644 --- a/test/back2back_test.py +++ b/test/back2back_test.py @@ -125,6 +125,44 @@ def test_dlc_less_than_eight(self): msg = can.Message(is_extended_id=False, arbitration_id=0x300, data=[4, 5, 6]) self._send_and_receive(msg) + @unittest.skipUnless( + INTERFACE_1 == "virtual", + "Message direction not yet implemented for all interface types", + ) + def test_message_direction_and_instances(self): + bus3 = can.Bus( + channel=self.CHANNEL_2, + bustype=self.INTERFACE_2, + bitrate=self.BITRATE, + fd=TEST_CAN_FD, + single_handle=True, + receive_own_messages=True, + ) + try: + msg = can.Message( + is_extended_id=False, arbitration_id=0x300, data=[2, 1, 3] + ) + bus3.send(msg) + recv_msg_bus1 = self.bus1.recv(self.TIMEOUT) + recv_msg_bus2 = self.bus2.recv(self.TIMEOUT) + self_recv_msg_bus3 = bus3.recv(self.TIMEOUT) + + # Verify that own message received has is_rx set to False while + # message received on the other virtual interfaces has is_rx set to + # True + self.assertEqual(recv_msg_bus1.is_rx, True) + self.assertEqual(recv_msg_bus2.is_rx, True) + self.assertEqual(self_recv_msg_bus3.is_rx, False) + self._check_received_message(recv_msg_bus1, recv_msg_bus2) + self._check_received_message(recv_msg_bus2, self_recv_msg_bus3) + + # Verify that we have a different instances of message for each bus + recv_msg_bus1.data[0] = 4 + self.assertNotEqual(recv_msg_bus1.data, recv_msg_bus2.data) + self.assertEqual(recv_msg_bus2.data, self_recv_msg_bus3.data) + finally: + bus3.shutdown() + @unittest.skipUnless(TEST_CAN_FD, "Don't test CAN-FD") def test_fd_message(self): msg = can.Message( From d0eec966187b00f63a3e1e596db190f692b4895f Mon Sep 17 00:00:00 2001 From: Syed Raza Date: Tue, 3 Mar 2020 10:08:55 -0500 Subject: [PATCH 5/7] Changing how we were skipping test for socketcan --- test/back2back_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/back2back_test.py b/test/back2back_test.py index 8ac24400a..bb937d787 100644 --- a/test/back2back_test.py +++ b/test/back2back_test.py @@ -125,11 +125,11 @@ def test_dlc_less_than_eight(self): msg = can.Message(is_extended_id=False, arbitration_id=0x300, data=[4, 5, 6]) self._send_and_receive(msg) - @unittest.skipUnless( - INTERFACE_1 == "virtual", - "Message direction not yet implemented for all interface types", - ) def test_message_direction_and_instances(self): + if self.INTERFACE_1 != "virtual": + raise unittest.SkipTest( + "Message direction not yet implemented for socketcan" + ) bus3 = can.Bus( channel=self.CHANNEL_2, bustype=self.INTERFACE_2, From e2d874f53cac0f784725fee2651976c508e02469 Mon Sep 17 00:00:00 2001 From: Syed Raza Date: Tue, 3 Mar 2020 10:40:07 -0500 Subject: [PATCH 6/7] Splitting test case into two different test cases --- test/back2back_test.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/test/back2back_test.py b/test/back2back_test.py index bb937d787..30c72ccfb 100644 --- a/test/back2back_test.py +++ b/test/back2back_test.py @@ -125,7 +125,9 @@ def test_dlc_less_than_eight(self): msg = can.Message(is_extended_id=False, arbitration_id=0x300, data=[4, 5, 6]) self._send_and_receive(msg) - def test_message_direction_and_instances(self): + def test_message_direction(self): + # Verify that own message received has is_rx set to False while message + # received on the other virtual interfaces have is_rx set to True if self.INTERFACE_1 != "virtual": raise unittest.SkipTest( "Message direction not yet implemented for socketcan" @@ -147,16 +149,36 @@ def test_message_direction_and_instances(self): recv_msg_bus2 = self.bus2.recv(self.TIMEOUT) self_recv_msg_bus3 = bus3.recv(self.TIMEOUT) - # Verify that own message received has is_rx set to False while - # message received on the other virtual interfaces has is_rx set to - # True self.assertEqual(recv_msg_bus1.is_rx, True) self.assertEqual(recv_msg_bus2.is_rx, True) self.assertEqual(self_recv_msg_bus3.is_rx, False) + finally: + bus3.shutdown() + + def test_unique_message_instances(self): + # Verify that we have a different instances of message for each bus + if self.INTERFACE_1 != "virtual": + raise unittest.SkipTest("Not relevant for socketcan") + bus3 = can.Bus( + channel=self.CHANNEL_2, + bustype=self.INTERFACE_2, + bitrate=self.BITRATE, + fd=TEST_CAN_FD, + single_handle=True, + receive_own_messages=True, + ) + try: + msg = can.Message( + is_extended_id=False, arbitration_id=0x300, data=[2, 1, 3] + ) + bus3.send(msg) + recv_msg_bus1 = self.bus1.recv(self.TIMEOUT) + recv_msg_bus2 = self.bus2.recv(self.TIMEOUT) + self_recv_msg_bus3 = bus3.recv(self.TIMEOUT) + self._check_received_message(recv_msg_bus1, recv_msg_bus2) self._check_received_message(recv_msg_bus2, self_recv_msg_bus3) - # Verify that we have a different instances of message for each bus recv_msg_bus1.data[0] = 4 self.assertNotEqual(recv_msg_bus1.data, recv_msg_bus2.data) self.assertEqual(recv_msg_bus2.data, self_recv_msg_bus3.data) From 1bdba4f78f7323c7a612cf95d9a836801d3c3361 Mon Sep 17 00:00:00 2001 From: Syed Date: Tue, 3 Mar 2020 12:56:41 -0500 Subject: [PATCH 7/7] Update test/back2back_test.py Co-Authored-By: pierreluctg --- test/back2back_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/back2back_test.py b/test/back2back_test.py index 30c72ccfb..8c1ded6c5 100644 --- a/test/back2back_test.py +++ b/test/back2back_test.py @@ -149,9 +149,9 @@ def test_message_direction(self): recv_msg_bus2 = self.bus2.recv(self.TIMEOUT) self_recv_msg_bus3 = bus3.recv(self.TIMEOUT) - self.assertEqual(recv_msg_bus1.is_rx, True) - self.assertEqual(recv_msg_bus2.is_rx, True) - self.assertEqual(self_recv_msg_bus3.is_rx, False) + self.assertTrue(recv_msg_bus1.is_rx) + self.assertTrue(recv_msg_bus2.is_rx) + self.assertFalse(self_recv_msg_bus3.is_rx) finally: bus3.shutdown()