def test_filter_event(device): listener = udev.MultipathListener() mon = Monitor() listener.register(mon) listener._callback(device) assert mon.calls == []
def test_loopback_event(tmpdir): listener = udev.MultipathListener() received = threading.Event() devices = [] def callback(device): pprint.pprint({k: device[k] for k in device}) devices.append(device) received.set() listener._callback = callback with running(listener): # Create a backing file filename = str(tmpdir.join("file")) with open(filename, "wb") as f: f.truncate(1024**2 * 10) # Create and remove a loop device with loopback.Device(filename) as loop: print("Created a loop device at %r" % loop.path) if not received.wait(1): raise RuntimeError("Timeout receiving event") # We expect an event about our loop device assert devices[0].get("DEVNAME") == loop.path
def test_stop(): listener = udev.MultipathListener() listener.start() try: listener.stop() except Exception as e: pytest.fail("Unexpected Exception: %s", e)
def test_monitor_unregistered(): listener = udev.MultipathListener() mon = Monitor() listener.register(mon) listener._callback(DEVICE) assert mon.calls == [EVENT] listener.unregister(mon) listener._callback(DEVICE) assert mon.calls == [EVENT]
def test_hotunplug_monitor(): # When unregistring a monitor while the listener is running, we should stop # it, since the listener started it. listener = udev.MultipathListener() with running(listener): mon = Monitor() listener.register(mon) listener.unregister(mon) assert mon.state == Monitor.STOPPED
def test_report_events(monkeypatch, device, expected): # Avoid accessing non-existing devices monkeypatch.setattr(devicemapper, "device_name", lambda x: "sda") listener = udev.MultipathListener() mon = Monitor() listener.register(mon) listener._callback(device) assert mon.calls == [expected]
def test_hotplug_monitor(): # Registering a monitor after the listenr was started will start the # monitor after registering it. The monitor must be able to handle events # while the monitor is starting. listener = udev.MultipathListener() with running(listener): mon = Monitor() listener.register(mon) assert mon.state == Monitor.STARTED listener._callback(DEVICE) assert mon.calls == [EVENT]
def test_failing_event(): fd = FakeDevice(ACTION="change", DM_ACTION="PATH_REINSTATED", DM_UUID="mpath-fake-uuid-1", DM_PATH="sda", DM_NR_VALID_PATHS="sfsdfs") listener = udev.MultipathListener() mon = Monitor() listener.register(mon) listener._callback(fd) listener._callback(DEVICE) assert mon.calls == [EVENT]
def test_register_from_callback(): listener = udev.MultipathListener() mon2 = Monitor() class Adder(Monitor): def handle(self, event): listener.register(mon2) mon1 = Adder() listener.register(mon1) listener._callback(DEVICE) listener._callback(DEVICE) assert mon2.calls == [EVENT]
def test_unregister_from_callback(): listener = udev.MultipathListener() class Remover(Monitor): def handle(self, event): self.calls.append(event) listener.unregister(self) mon = Remover() listener.register(mon) listener._callback(DEVICE) listener._callback(DEVICE) assert mon.calls == [EVENT]
def test_hotplug_monitor_error(): listener = udev.MultipathListener() with running(listener): mon = UnstartableMonitor() # Monitor start() error should raised with pytest.raises(MonitorError): listener.register(mon) assert mon.state == Monitor.CREATED # Monitor should not be registered. listener._callback(DEVICE) assert mon.calls == []
def test_monitor_lifecycle(): listener = udev.MultipathListener() monitors = [Monitor(), Monitor()] for m in monitors: listener.register(m) # Starting the listener starts the monitors. with running(listener): for m in monitors: assert m.state == Monitor.STARTED # Stopping the listener stops the monitors. for m in monitors: assert m.state == Monitor.STOPPED
def test_start_twice(): listener = udev.MultipathListener() listener.start() with pytest.raises(AssertionError): listener.start() listener.stop()
def check(*monitors): listener = udev.MultipathListener() for m in monitors: listener.register(m) listener._callback(DEVICE)
def test_monitor_already_registered(): listener = udev.MultipathListener() listener.register(None) with pytest.raises(AssertionError): listener.register(None)
def test_monitor_not_registered(): listener = udev.MultipathListener() with pytest.raises(AssertionError): listener.unregister(None)
def check(*monitors): listener = udev.MultipathListener() for m in monitors: listener.register(m) with running(listener): pass
def check(*monitors): listener = udev.MultipathListener() for m in monitors: listener.register(m) with pytest.raises(MonitorError): listener.start()