|
5 | 5 | """
|
6 | 6 |
|
7 | 7 | import unittest
|
| 8 | +from unittest.mock import MagicMock, patch |
8 | 9 |
|
9 | 10 | from can import Bus, Message
|
10 | 11 |
|
@@ -46,6 +47,57 @@ def test_match_example_message(self):
|
46 | 47 | self.assertFalse(self.bus._matches_filters(EXAMPLE_MSG))
|
47 | 48 | self.assertTrue(self.bus._matches_filters(HIGHEST_MSG))
|
48 | 49 |
|
| 50 | + def test_empty_queue_up_to_match(self): |
| 51 | + bus2 = Bus(interface="virtual", channel="testy") |
| 52 | + self.bus.set_filters(MATCH_EXAMPLE) |
| 53 | + bus2.send(HIGHEST_MSG) |
| 54 | + bus2.send(EXAMPLE_MSG) |
| 55 | + actual = self.bus.recv(timeout=0) |
| 56 | + bus2.shutdown() |
| 57 | + self.assertTrue( |
| 58 | + EXAMPLE_MSG.equals( |
| 59 | + actual, timestamp_delta=None, check_direction=False, check_channel=False |
| 60 | + ) |
| 61 | + ) |
| 62 | + |
| 63 | + |
| 64 | +@patch("can.bus.time") |
| 65 | +class TestMessageFilterRetryTiming(unittest.TestCase): |
| 66 | + def setUp(self): |
| 67 | + self.bus = Bus(interface="virtual", channel="testy") |
| 68 | + self.bus._recv_internal = MagicMock(name="_recv_internal") |
| 69 | + |
| 70 | + def tearDown(self): |
| 71 | + self.bus.shutdown() |
| 72 | + |
| 73 | + def test_propagate_recv_internal_timeout(self, time: MagicMock) -> None: |
| 74 | + self.bus._recv_internal.side_effect = [ |
| 75 | + (None, False), |
| 76 | + ] |
| 77 | + time.side_effect = [0] |
| 78 | + self.bus.set_filters(MATCH_EXAMPLE) |
| 79 | + self.assertIsNone(self.bus.recv(timeout=3)) |
| 80 | + |
| 81 | + def test_retry_with_adjusted_timeout(self, time: MagicMock) -> None: |
| 82 | + self.bus._recv_internal.side_effect = [ |
| 83 | + (HIGHEST_MSG, False), |
| 84 | + (EXAMPLE_MSG, False), |
| 85 | + ] |
| 86 | + time.side_effect = [0, 1] |
| 87 | + self.bus.set_filters(MATCH_EXAMPLE) |
| 88 | + self.bus.recv(timeout=3) |
| 89 | + self.bus._recv_internal.assert_called_with(timeout=2) |
| 90 | + |
| 91 | + def test_keep_timeout_non_negative(self, time: MagicMock) -> None: |
| 92 | + self.bus._recv_internal.side_effect = [ |
| 93 | + (HIGHEST_MSG, False), |
| 94 | + (EXAMPLE_MSG, False), |
| 95 | + ] |
| 96 | + time.side_effect = [0, 1] |
| 97 | + self.bus.set_filters(MATCH_EXAMPLE) |
| 98 | + self.bus.recv(timeout=0.5) |
| 99 | + self.bus._recv_internal.assert_called_with(timeout=0) |
| 100 | + |
49 | 101 |
|
50 | 102 | if __name__ == "__main__":
|
51 | 103 | unittest.main()
|
0 commit comments