* Added a convenience derivation for running the test driver

interactively on a network specification.  For instance:

  $ nix-build tests/ -A quake3.driver
  $ ./result/bin/nixos-test-driver
  > startAll;
  client1: starting vm
  client1: QEMU running (pid 14971)
  server: starting vm
  server: QEMU running (pid 14982)
  ...
  > $client1->execute("quake3 ...");

* Use the GNU readline library in interactive mode.

svn path=/nixos/trunk/; revision=25156
This commit is contained in:
Eelco Dolstra
2010-12-16 15:54:15 +00:00
parent 8496dbf350
commit 445827ad45
3 changed files with 50 additions and 10 deletions
+5 -3
View File
@@ -251,7 +251,8 @@ sub execute {
my $out = ""; my $out = "";
while (1) { while (1) {
my $line = readline($self->{socket}) or die "connection to VM lost unexpectedly"; my $line = readline($self->{socket});
die "connection to VM lost unexpectedly" unless defined $line;
#$self->log("got line: $line"); #$self->log("got line: $line");
if ($line =~ /^(.*)\|\!\=EOF\s+(\d+)$/) { if ($line =~ /^(.*)\|\!\=EOF\s+(\d+)$/) {
$out .= $1; $out .= $1;
@@ -270,7 +271,7 @@ sub succeed {
my ($status, $out) = $self->execute($command); my ($status, $out) = $self->execute($command);
if ($status != 0) { if ($status != 0) {
$self->log("output: $out"); $self->log("output: $out");
die "command `$command' did not succeed (exit code $status)"; die "command `$command' did not succeed (exit code $status)\n";
} }
$res .= $out; $res .= $out;
} }
@@ -407,7 +408,8 @@ sub unblock {
# Take a screenshot of the X server on :0.0. # Take a screenshot of the X server on :0.0.
sub screenshot { sub screenshot {
my ($self, $filename) = @_; my ($self, $filename) = @_;
$filename = "$ENV{'out'}/${filename}.png" if $filename =~ /^\w+$/; my $dir = $ENV{'out'} || Cwd::abs_path(".");
$filename = "$dir/${filename}.png" if $filename =~ /^\w+$/;
my $tmp = "${filename}.ppm"; my $tmp = "${filename}.ppm";
$self->sendMonitorCommand("screendump $tmp"); $self->sendMonitorCommand("screendump $tmp");
system("convert $tmp ${filename}") == 0 system("convert $tmp ${filename}") == 0
+9 -1
View File
@@ -1,8 +1,13 @@
#! @perl@ -w -I@libDir@ -I@readline@
use strict; use strict;
use Machine; use Machine;
use Term::ReadLine;
$SIG{PIPE} = 'IGNORE'; # because Unix domain sockets may die unexpectedly $SIG{PIPE} = 'IGNORE'; # because Unix domain sockets may die unexpectedly
$ENV{PATH} = "@extraPath@:$ENV{PATH}";
STDERR->autoflush(1); STDERR->autoflush(1);
my %vms; my %vms;
@@ -26,10 +31,13 @@ sub runTests {
eval "$context $ENV{tests}"; eval "$context $ENV{tests}";
die $@ if $@; die $@ if $@;
} else { } else {
while (<STDIN>) { my $term = Term::ReadLine->new('nixos-vm-test');
$term->ReadHistory;
while (defined ($_ = $term->readline("> "))) {
eval "$context $_\n"; eval "$context $_\n";
warn $@ if $@; warn $@ if $@;
} }
$term->WriteHistory;
} }
# Copy the kernel coverage data for each machine, if the kernel # Copy the kernel coverage data for each machine, if the kernel
+35 -5
View File
@@ -8,6 +8,27 @@ rec {
inherit pkgs; inherit pkgs;
testDriver = stdenv.mkDerivation {
name = "nixos-test-driver";
buildCommand =
''
mkdir -p $out/bin
cp ${./test-driver/test-driver.pl} $out/bin/nixos-test-driver
chmod u+x $out/bin/nixos-test-driver
libDir=$out/lib/perl5/site_perl
mkdir -p $libDir
cp ${./test-driver/Machine.pm} $libDir/Machine.pm
substituteInPlace $out/bin/nixos-test-driver \
--subst-var-by perl "${perl}/bin/perl" \
--subst-var-by readline "${perlPackages.TermReadLineGnu}/lib/perl5/site_perl" \
--subst-var-by extraPath "${imagemagick}/bin" \
--subst-var libDir
'';
};
# Run an automated test suite in the given virtual network. # Run an automated test suite in the given virtual network.
# `network' must be the result of a call to the # `network' must be the result of a call to the
# `buildVirtualNetwork' function. `tests' is a Perl fragment # `buildVirtualNetwork' function. `tests' is a Perl fragment
@@ -20,15 +41,13 @@ rec {
inherit tests; inherit tests;
buildInputs = [ pkgs.qemu_kvm pkgs.imagemagick ]; buildInputs = [ pkgs.qemu_kvm ];
buildCommand = buildCommand =
'' ''
mkdir $out
cp ${./test-driver/Machine.pm} Machine.pm
ensureDir $out/nix-support ensureDir $out/nix-support
${perl}/bin/perl ${./test-driver/test-driver.pl} ${network}/vms/*/bin/run-*-vm ${testDriver}/bin/nixos-test-driver ${network}/vms/*/bin/run-*-vm
for i in */coverage-data; do for i in */coverage-data; do
ensureDir $out/coverage-data ensureDir $out/coverage-data
@@ -103,6 +122,17 @@ rec {
# Call the test script with the computed nodes. # Call the test script with the computed nodes.
(if builtins.isFunction t.testScript then t.testScript { inherit (vms) nodes; } else t.testScript); (if builtins.isFunction t.testScript then t.testScript { inherit (vms) nodes; } else t.testScript);
report = makeReport test; report = makeReport test;
# Generate a convenience wrapper for running the test driver
# interactively with the specified network.
driver = runCommand "nixos-test-driver" { buildInputs = [ makeWrapper]; }
''
mkdir -p $out/bin
ln -s ${vms}/bin/* $out/bin/
ln -s ${testDriver}/bin/* $out/bin/
wrapProgram $out/bin/nixos-test-driver \
--add-flags "${vms}/vms/*/bin/run-*-vm"
''; # "
}; };
runInMachine = runInMachine =
@@ -140,7 +170,7 @@ rec {
export PATH=${qemu_kvm}/bin:${coreutils}/bin export PATH=${qemu_kvm}/bin:${coreutils}/bin
cp ${./test-driver/Machine.pm} Machine.pm cp ${./test-driver/Machine.pm} Machine.pm
export tests='${testscript}' export tests='${testscript}'
${perl}/bin/perl ${./test-driver/test-driver.pl} ${vms}/vms/*/bin/run-*-vm ${testDriver}/bin/nixos-test-driver ${vms}/vms/*/bin/run-*-vm
''; # */ ''; # */
in in