diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 2aef513d160e..88cfb4170193 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1091,21 +1091,25 @@ in pretalx = runTest ./web-apps/pretalx.nix; prefect = runTest ./prefect.nix; pretix = runTest ./web-apps/pretix.nix; - printing-socket = handleTest ./printing.nix { - socket = true; - listenTcp = true; + printing-socket = runTest { + imports = [ ./printing.nix ]; + _module.args.socket = true; + _module.args.listenTcp = true; }; - printing-service = handleTest ./printing.nix { - socket = false; - listenTcp = true; + printing-service = runTest { + imports = [ ./printing.nix ]; + _module.args.socket = false; + _module.args.listenTcp = true; }; - printing-socket-notcp = handleTest ./printing.nix { - socket = true; - listenTcp = false; + printing-socket-notcp = runTest { + imports = [ ./printing.nix ]; + _module.args.socket = true; + _module.args.listenTcp = false; }; - printing-service-notcp = handleTest ./printing.nix { - socket = false; - listenTcp = false; + printing-service-notcp = runTest { + imports = [ ./printing.nix ]; + _module.args.socket = false; + _module.args.listenTcp = false; }; private-gpt = handleTest ./private-gpt.nix { }; privatebin = runTest ./privatebin.nix; diff --git a/nixos/tests/printing.nix b/nixos/tests/printing.nix index 5fee5c6a4989..890bc207a326 100644 --- a/nixos/tests/printing.nix +++ b/nixos/tests/printing.nix @@ -1,141 +1,138 @@ # Test printing via CUPS. +{ + pkgs, + socket ? true, # whether to use socket activation + listenTcp ? true, # whether to open port 631 on client + ... +}: -import ./make-test-python.nix ( - { - pkgs, - socket ? true, # whether to use socket activation - listenTcp ? true, # whether to open port 631 on client - ... - }: +let + inherit (pkgs) lib; +in - let - inherit (pkgs) lib; - in +{ + name = "printing"; + meta = with lib.maintainers; { + maintainers = [ + domenkozar + matthewbauer + ]; + }; - { - name = "printing"; - meta = with lib.maintainers; { - maintainers = [ - domenkozar - matthewbauer + nodes.server = + { ... }: + { + services.printing = { + enable = true; + stateless = true; + startWhenNeeded = socket; + listenAddresses = [ "*:631" ]; + defaultShared = true; + openFirewall = true; + extraConf = '' + + Order allow,deny + Allow from all + + ''; + }; + # Add a HP Deskjet printer connected via USB to the server. + hardware.printers.ensurePrinters = [ + { + name = "DeskjetLocal"; + deviceUri = "usb://foobar/printers/foobar"; + model = "drv:///sample.drv/deskjet.ppd"; + } ]; }; - nodes.server = - { ... }: - { - services.printing = { - enable = true; - stateless = true; - startWhenNeeded = socket; - listenAddresses = [ "*:631" ]; - defaultShared = true; - openFirewall = true; - extraConf = '' - - Order allow,deny - Allow from all - - ''; - }; - # Add a HP Deskjet printer connected via USB to the server. - hardware.printers.ensurePrinters = [ - { - name = "DeskjetLocal"; - deviceUri = "usb://foobar/printers/foobar"; - model = "drv:///sample.drv/deskjet.ppd"; - } - ]; - }; + nodes.client = + { lib, ... }: + { + services.printing.enable = true; + services.printing.startWhenNeeded = socket; + services.printing.listenAddresses = lib.mkIf (!listenTcp) [ ]; + # Add printer to the client as well, via IPP. + hardware.printers.ensurePrinters = [ + { + name = "DeskjetRemote"; + deviceUri = "ipp://server/printers/DeskjetLocal"; + model = "drv:///sample.drv/deskjet.ppd"; + } + ]; + hardware.printers.ensureDefaultPrinter = "DeskjetRemote"; + }; - nodes.client = - { lib, ... }: - { - services.printing.enable = true; - services.printing.startWhenNeeded = socket; - services.printing.listenAddresses = lib.mkIf (!listenTcp) [ ]; - # Add printer to the client as well, via IPP. - hardware.printers.ensurePrinters = [ - { - name = "DeskjetRemote"; - deviceUri = "ipp://server/printers/DeskjetLocal"; - model = "drv:///sample.drv/deskjet.ppd"; - } - ]; - hardware.printers.ensureDefaultPrinter = "DeskjetRemote"; - }; + testScript = '' + import os + import re - testScript = '' - import os - import re + start_all() - start_all() + with subtest("Make sure that cups is up on both sides and printers are set up"): + server.wait_for_unit("ensure-printers.service") + client.wait_for_unit("ensure-printers.service") - with subtest("Make sure that cups is up on both sides and printers are set up"): - server.wait_for_unit("ensure-printers.service") - client.wait_for_unit("ensure-printers.service") + assert "scheduler is running" in client.succeed("lpstat -r") - assert "scheduler is running" in client.succeed("lpstat -r") + with subtest("UNIX socket is used for connections"): + assert "/var/run/cups/cups.sock" in client.succeed("lpstat -H") - with subtest("UNIX socket is used for connections"): - assert "/var/run/cups/cups.sock" in client.succeed("lpstat -H") + with subtest("HTTP server is available too"): + ${lib.optionalString listenTcp ''client.succeed("curl --fail http://localhost:631/")''} + client.succeed(f"curl --fail http://{server.name}:631/") + server.fail(f"curl --fail --connect-timeout 2 http://{client.name}:631/") - with subtest("HTTP server is available too"): - ${lib.optionalString listenTcp ''client.succeed("curl --fail http://localhost:631/")''} - client.succeed(f"curl --fail http://{server.name}:631/") - server.fail(f"curl --fail --connect-timeout 2 http://{client.name}:631/") + with subtest("LP status checks"): + assert "DeskjetRemote accepting requests" in client.succeed("lpstat -a") + assert "DeskjetLocal accepting requests" in client.succeed( + f"lpstat -h {server.name}:631 -a" + ) + client.succeed("cupsdisable DeskjetRemote") + out = client.succeed("lpq") + print(out) + assert re.search( + "DeskjetRemote is not ready.*no entries", + client.succeed("lpq"), + flags=re.DOTALL, + ) + client.succeed("cupsenable DeskjetRemote") + assert re.match( + "DeskjetRemote is ready.*no entries", client.succeed("lpq"), flags=re.DOTALL + ) - with subtest("LP status checks"): - assert "DeskjetRemote accepting requests" in client.succeed("lpstat -a") - assert "DeskjetLocal accepting requests" in client.succeed( - f"lpstat -h {server.name}:631 -a" - ) - client.succeed("cupsdisable DeskjetRemote") - out = client.succeed("lpq") - print(out) - assert re.search( - "DeskjetRemote is not ready.*no entries", - client.succeed("lpq"), - flags=re.DOTALL, - ) - client.succeed("cupsenable DeskjetRemote") - assert re.match( - "DeskjetRemote is ready.*no entries", client.succeed("lpq"), flags=re.DOTALL - ) + # Test printing various file types. + for file in [ + "${pkgs.groff.doc}/share/doc/*/examples/mom/penguin.pdf", + "${pkgs.groff.doc}/share/doc/*/meref.ps", + "${pkgs.cups.out}/share/doc/cups/images/cups.png", + "${pkgs.pcre.doc}/share/doc/pcre/pcre.txt", + ]: + file_name = os.path.basename(file) + with subtest(f"print {file_name}"): + # Print the file on the client. + print(client.succeed("lpq")) + client.succeed(f"lp {file}") + client.wait_until_succeeds( + f"lpq; lpq | grep -q -E 'active.*root.*{file_name}'" + ) - # Test printing various file types. - for file in [ - "${pkgs.groff.doc}/share/doc/*/examples/mom/penguin.pdf", - "${pkgs.groff.doc}/share/doc/*/meref.ps", - "${pkgs.cups.out}/share/doc/cups/images/cups.png", - "${pkgs.pcre.doc}/share/doc/pcre/pcre.txt", - ]: - file_name = os.path.basename(file) - with subtest(f"print {file_name}"): - # Print the file on the client. - print(client.succeed("lpq")) - client.succeed(f"lp {file}") - client.wait_until_succeeds( - f"lpq; lpq | grep -q -E 'active.*root.*{file_name}'" - ) + # Ensure that a raw PCL file appeared in the server's queue + # (showing that the right filters have been applied). Of + # course, since there is no actual USB printer attached, the + # file will stay in the queue forever. + server.wait_for_file("/var/spool/cups/d*-001") + server.wait_until_succeeds(f"lpq -a | grep -q -E '{file_name}'") - # Ensure that a raw PCL file appeared in the server's queue - # (showing that the right filters have been applied). Of - # course, since there is no actual USB printer attached, the - # file will stay in the queue forever. - server.wait_for_file("/var/spool/cups/d*-001") - server.wait_until_succeeds(f"lpq -a | grep -q -E '{file_name}'") + # Delete the job on the client. It should disappear on the + # server as well. + client.succeed("lprm") + client.wait_until_succeeds("lpq -a | grep -q -E 'no entries'") - # Delete the job on the client. It should disappear on the - # server as well. - client.succeed("lprm") - client.wait_until_succeeds("lpq -a | grep -q -E 'no entries'") + retry(lambda _: "no entries" in server.succeed("lpq -a")) - retry(lambda _: "no entries" in server.succeed("lpq -a")) - - # The queue is empty already, so this should be safe. - # Otherwise, pairs of "c*"-"d*-001" files might persist. - server.execute("rm /var/spool/cups/*") - ''; - } -) + # The queue is empty already, so this should be safe. + # Otherwise, pairs of "c*"-"d*-001" files might persist. + server.execute("rm /var/spool/cups/*") + ''; +}