From a26e4a43f3f71e3666a75b09e342bc82dbe5dd4e Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 26 Sep 2013 21:00:30 +0200 Subject: [PATCH] Add a test for CUPS --- release-combined.nix | 1 + tests/default.nix | 1 + tests/printing.nix | 90 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 tests/printing.nix diff --git a/release-combined.nix b/release-combined.nix index 07f76547b56e..e28f774301d2 100644 --- a/release-combined.nix +++ b/release-combined.nix @@ -53,6 +53,7 @@ in rec { (all nixos.tests.login) (all nixos.tests.misc) (all nixos.tests.openssh) + (all nixos.tests.printing) (all nixos.tests.xfce) nixpkgs.tarball diff --git a/tests/default.nix b/tests/default.nix index bd1aa45fe281..3fc31cf0de95 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -22,6 +22,7 @@ with import ../lib/testing.nix { inherit system minimal; }; #nfs4 = makeTest (import ./nfs.nix { version = 4; }); openssh = makeTest (import ./openssh.nix); partition = makeTest (import ./partition.nix); + printing = makeTest (import ./printing.nix); proxy = makeTest (import ./proxy.nix); quake3 = makeTest (import ./quake3.nix); simple = makeTest (import ./simple.nix); diff --git a/tests/printing.nix b/tests/printing.nix new file mode 100644 index 000000000000..13cc3115d50e --- /dev/null +++ b/tests/printing.nix @@ -0,0 +1,90 @@ +# Test printing via CUPS. + +{ pkgs, ... }: + +{ + + nodes = { + + server = + { config, pkgs, ... }: + { services.printing.enable = true; + services.printing.cupsdConf = + '' + Listen server:631 + + Order allow,deny + Allow from all + + ''; + }; + + client = + { config, pkgs, nodes, ... }: + { services.printing.enable = true; + }; + + }; + + testScript = + '' + startAll; + + # Make sure that cups is up on both sides. + $server->waitForUnit("cupsd.service"); + $client->waitForUnit("cupsd.service"); + $client->succeed("lpstat -r") =~ /scheduler is running/ or die; + $client->succeed("lpstat -H") =~ "/var/run/cups/cups.sock" or die; + $client->succeed("curl --fail http://localhost:631/"); + $client->succeed("curl --fail http://server:631/"); + $server->fail("curl --fail http://client:631/"); + + # Add a HP Deskjet printer connected via USB to the server. + $server->succeed("lpadmin -p DeskjetLocal -v usb://HP/Deskjet%205400%20series?serial=TH93I152S123XY -m 'drv:///sample.drv/deskjet.ppd' -E"); + + # Add it to the client as well via IPP. + $client->succeed("lpadmin -p DeskjetRemote -v ipp://server/printers/DeskjetLocal -m 'drv:///sample.drv/deskjet.ppd' -E"); + $client->succeed("lpadmin -d DeskjetRemote"); + + # Do some status checks. + $client->succeed("lpstat -a") =~ /DeskjetRemote accepting requests/ or die; + $client->succeed("lpstat -h server -a") =~ /DeskjetLocal accepting requests/ or die; + $client->succeed("cupsdisable DeskjetRemote"); + $client->succeed("lpq") =~ /DeskjetRemote is not ready.*no entries/s or die; + $client->succeed("cupsenable DeskjetRemote"); + $client->succeed("lpq") =~ /DeskjetRemote is ready.*no entries/s or die; + + # Test printing various file types. + foreach my $file ("${pkgs.groff}/share/doc/*/examples/mom/typesetting.pdf", + "${pkgs.groff}/share/doc/*/meref.ps", + "${pkgs.cups}/share/doc/cups/images/cups.png", + "${pkgs.xz}/share/doc/xz/faq.txt") + { + $file =~ /([^\/]*)$/; my $fn = $1; + + subtest "print $fn", sub { + + # Print the file on the client. + $client->succeed("lp $file"); + $client->succeed("lpq") =~ /active.*root.*$fn/ or die; + + # 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->waitForFile("/var/spool/cups/d*-*"); + $server->succeed("lpq -a") =~ /remroot.*$fn/ or die; + $server->succeed("hexdump -C -n2 /var/spool/cups/d*-*") =~ /1b 45/ or die; # 1b 45 = printer reset + + # Delete the job on the client. It should disappear on the + # server as well. + $client->succeed("lprm"); + $client->succeed("lpq -a") =~ /no entries/; + Machine::retry sub { + return 1 if $server->succeed("lpq -a") =~ /no entries/; + }; + }; + } + ''; + +}