Skip to content

Commit 8fb570a

Browse files
committed
tests: check devices cache invalidation on device-removed event
QubesOS/qubes-issues#10764
1 parent 69b86a9 commit 8fb570a

1 file changed

Lines changed: 28 additions & 1 deletion

File tree

qubesadmin/tests/devices.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@
2020

2121
# pylint: disable=missing-docstring
2222

23+
from unittest import mock
2324

2425
import qubesadmin.tests
2526
import qubesadmin.device_protocol
2627

2728
from qubesadmin.device_protocol import (
2829
DeviceAssignment, DeviceInfo, UnknownDevice,
2930
AssignmentMode)
30-
31+
from qubesadmin.events import EventsDispatcher
3132

3233
serialized_test_device = (
3334
b"0\0dev1 port_id='dev1' devclass='test' vendor='itl' product='test-device'"
@@ -416,3 +417,29 @@ def test_085_allow_device_multiple(self):
416417
qubesadmin.device_protocol.DeviceInterface("m******"),
417418
)
418419
self.assertAllCalled()
420+
421+
def test_100_cache_invalidate(self):
422+
# this also enables caching
423+
dispatcher = EventsDispatcher(self.app)
424+
handler = mock.Mock()
425+
dispatcher.add_handler("device-added:test", handler)
426+
self.app.expected_calls[("test-vm", "admin.vm.device.test.Available", None, None)] = \
427+
serialized_test_device + b"device_id='1234:5678:0123456789:?*******'\n"
428+
vm = self.app.domains.get("test-vm")
429+
# this also populates cache
430+
dev = vm.devices["test"]["dev1"]
431+
self.assertIsInstance(dev, DeviceInfo)
432+
self.assertNotIsInstance(dev, UnknownDevice)
433+
self.assertEqual(dev.device_id, "1234:5678:0123456789:?*******")
434+
dispatcher.handle("test-vm", "device-added:test", device="test-vm:dev1:1234:5678:0123456789:?*******")
435+
handler.assert_called_once_with(vm, "device-added:test", device=dev)
436+
handler.reset_mock()
437+
dispatcher.handle("test-vm", "device-removed:test", port="test-vm:dev1")
438+
self.app.expected_calls[("test-vm", "admin.vm.device.test.Available", None, None)] = \
439+
serialized_test_device + b"device_id='8765:4321:0123456789:?*******'\n"
440+
dispatcher.handle("test-vm", "device-added:test", device="test-vm:dev1:8765:4321:0123456789:?*******")
441+
handler.assert_called_once_with(vm, "device-added:test", device=mock.ANY)
442+
self.assertIsInstance(handler.mock_calls[0].kwargs["device"], DeviceInfo)
443+
self.assertNotIsInstance(handler.mock_calls[0].kwargs["device"], UnknownDevice)
444+
self.assertEqual(handler.mock_calls[0].kwargs["device"].device_id, "8765:4321:0123456789:?*******")
445+
self.assertAllCalled()

0 commit comments

Comments
 (0)