diff --git a/nixos/lib/test-driver/Machine.pm b/nixos/lib/test-driver/Machine.pm index 1a243918c22f..274b16164db3 100644 --- a/nixos/lib/test-driver/Machine.pm +++ b/nixos/lib/test-driver/Machine.pm @@ -504,6 +504,31 @@ sub screenshot { }, { image => $name } ); } +# Get the text of TTY +sub getTTYText { + my ($self, $tty) = @_; + + my ($status, $out) = $self->execute("fold -w 80 /dev/vcs${tty}"); + return $out; +} + +# Wait until TTY's text matches a particular regular expression +sub waitUntilTTYMatches { + my ($self, $tty, $regexp) = @_; + + $self->nest("waiting for $regexp to appear on tty $tty", sub { + retry sub { + return 1 if $self->getTTYText($tty) =~ /$regexp/; + } + }); +} + +# Debugging: Dump the contents of the TTY +sub dumpTTYContents { + my ($self, $tty) = @_; + + $self->execute("fold -w 80 /dev/vcs${tty} | systemd-cat"); +} # Take a screenshot and return the result as text using optical character # recognition. diff --git a/nixos/tests/login.nix b/nixos/tests/login.nix index e793d89567bf..a6a460fb0a7d 100644 --- a/nixos/tests/login.nix +++ b/nixos/tests/login.nix @@ -33,10 +33,11 @@ import ./make-test.nix ({ pkgs, latestKernel ? false, ... }: # Log in as alice on a virtual console. subtest "virtual console login", sub { - $machine->sleep(2); # urgh: wait for username prompt + $machine->waitUntilTTYMatches(2, "login: "); $machine->sendChars("alice\n"); + $machine->waitUntilTTYMatches(2, "login: alice"); $machine->waitUntilSucceeds("pgrep login"); - $machine->sleep(2); # urgh: wait for `Password:' + $machine->waitUntilTTYMatches(2, "Password: "); $machine->sendChars("foobar\n"); $machine->waitUntilSucceeds("pgrep -u alice bash"); $machine->sendChars("touch done\n");