# NixOS test for usbrelayd # # It is not stored in nixos/tests directory, because it requires the # USB relay connected to the host computer and as such, it cannot be # run automatically. # # Run this test as: # # nix-build test.nix -A driverInteractive && ./result/bin/nixos-test-driver --no-interactive # # The interactive driver is required because the default # (non-interactive) driver uses qemu without support for passing USB # devices to the guest (see # https://discourse.nixos.org/t/hardware-dependent-nixos-tests/18564 # for discussion of other alternatives). import ../../../../nixos/tests/make-test-python.nix ({ pkgs, ... }: { name = "usbrelayd"; nodes.machine = { virtualisation.qemu.options = [ "-device qemu-xhci" "-device usb-host,vendorid=0x16c0,productid=0x05df" ]; services.usbrelayd.enable = true; systemd.services.usbrelayd = { after = [ "mosquitto.service" ]; }; services.mosquitto = { enable = true; listeners = [{ acl = [ "pattern readwrite #" ]; omitPasswordAuth = true; settings.allow_anonymous = true; }]; }; environment.systemPackages = [ pkgs.usbrelay pkgs.mosquitto ]; documentation.nixos.enable = false; # building nixos manual takes long time }; testScript = '' import os if os.waitstatus_to_exitcode(os.system("lsusb -d 16c0:05df")) != 0: print("No USB relay detected, skipping test") import sys sys.exit(2) machine.start() # usbrelayd is started by udev when an relay is detected machine.wait_for_unit("usbrelayd.service") stdout = machine.succeed("usbrelay") relay_id = stdout.split(sep="_")[0] assert relay_id != "" import time time.sleep(1) machine.succeed(f"mosquitto_pub -h localhost -t cmnd/{relay_id}/1 -m ON") time.sleep(1) machine.succeed(f"mosquitto_pub -h localhost -t cmnd/{relay_id}/1 -m OFF") print("Did you see the relay switching on and off?") ''; })