nixos/tests/printing: fix race of lpstat and ensure-printers

There is a nasty race condition in the cups tests.
To understand what is going on, one must first note that
printers are installed in the vms with ensure-printers.service,
which is started as part of multi-user.target.
ensure-printers.service in turn triggers a start of
cups.service as it needs to connect to the local cups daemon.

This is what happens when the test runs:
1  the test waits for cups.socket or cups.service to start up
   (subtest "Make sure that cups is up on both sides...")
2  after cups.service started
   (it starts even in the "socket" case,
   triggered by ensure-printers.service),
   ensure-printers.service is started
3  the test tries to connect to the cups daemons via curl
   (subtest "HTTP server is available too")
4  the test verifies the required printers are installed
   ("lpstat -a" called by subtest "LP status checks")

Usually, 3 needs some time, so ensure-printers.service
already installed all printers that are required by 4.
But if 3 is too fast, or if ensure-printers.service is too slow,
4 fails to find the printers it is looking for.

One can provoke the problem by adding

> systemd.services.ensure-printers.serviceConfig.ExecStartPre = "/run/current-system/sw/bin/sleep 10";

to the `nodes.client` configuration.

The commit at hand fixes the problem by changing 1:
Instead of waiting for cups,
it now waits for ensure-printers.service
(which in turn waits for cups.service and cups.socket).
This is also in accordance with the
subtest description in the code that promises to
"Make sure that cups is up [...] and printers are set up".
This commit is contained in:
Yarny0 2024-08-29 15:12:49 +02:00
parent 377cbbdc30
commit 1693e1acc0

View File

@ -54,8 +54,8 @@ import ./make-test-python.nix (
start_all()
with subtest("Make sure that cups is up on both sides and printers are set up"):
server.wait_for_unit("cups.${if socket then "socket" else "service"}")
client.wait_for_unit("cups.${if socket then "socket" else "service"}")
server.wait_for_unit("ensure-printers.service")
client.wait_for_unit("ensure-printers.service")
assert "scheduler is running" in client.succeed("lpstat -r")