summary refs log tree commit diff
path: root/lib/test-driver/test-driver.pl
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2011-01-12 18:47:23 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2011-01-12 18:47:23 +0000
commitb3dbcbe249480f59fde6c118fa161eb6af53664d (patch)
tree0de3c6951da62182f7ebc4e50cc05b569bddf16b /lib/test-driver/test-driver.pl
parentfd4885528445b94aea7dd15a09bee85c2bc1defe (diff)
downloadnixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar.gz
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar.bz2
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar.lz
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar.xz
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.tar.zst
nixpkgs-b3dbcbe249480f59fde6c118fa161eb6af53664d.zip
* Use vde_switch instead of QEMU's multicast feature to tie QEMU VMs
  together into virtual networks.  This has several advantages:

  - It's more secure because the QEMU instances use Unix domain
    sockets to talk to the switch.

  - It doesn't depend on the host's network interfaces.  (Local
    multicast fails if there is no default gateway, so for instance it
    fails if a laptop is not connected to any network.)

  - VDE devices can be connected together to form arbitrary network
    topologies.

  - VDE has a "wirefilter" tool to emulate delays and packet loss,
    which are useful for network testing.

svn path=/nixos/trunk/; revision=25526
Diffstat (limited to 'lib/test-driver/test-driver.pl')
-rw-r--r--lib/test-driver/test-driver.pl55
1 files changed, 37 insertions, 18 deletions
diff --git a/lib/test-driver/test-driver.pl b/lib/test-driver/test-driver.pl
index 9f5054f7721..841017ea0a3 100644
--- a/lib/test-driver/test-driver.pl
+++ b/lib/test-driver/test-driver.pl
@@ -5,6 +5,7 @@ use Machine;
 use Term::ReadLine;
 use IO::File;
 use Logger;
+use Cwd;
 
 $SIG{PIPE} = 'IGNORE'; # because Unix domain sockets may die unexpectedly
 
@@ -13,6 +14,19 @@ STDERR->autoflush(1);
 my $log = new Logger;
 
 
+# Start vde_switch for each network required by the test.
+my %vlans;
+foreach my $vlan (split / /, $ENV{VLANS} || "") {
+    next if defined $vlans{$vlan};
+    $log->log("starting VDE switch for network $vlan");
+    my $socket = Cwd::abs_path "./vde$vlan.ctl";
+    system("vde_switch -d -s $socket") == 0
+        or die "cannot start vde_switch";
+    $ENV{"QEMU_VDE_SOCKET_$vlan"} = $socket;
+    $vlans{$vlan} = 1;
+}
+
+
 my %vms;
 my $context = "";
 
@@ -83,23 +97,26 @@ sub runTests {
 
     # Copy the kernel coverage data for each machine, if the kernel
     # has been compiled with coverage instrumentation.
-    foreach my $vm (values %vms) {
-        my $gcovDir = "/sys/kernel/debug/gcov";
+    $log->nest("collecting coverage data", sub {
+        foreach my $vm (values %vms) {
+            my $gcovDir = "/sys/kernel/debug/gcov";
 
-        next unless $vm->isUp();
+            next unless $vm->isUp();
 
-        my ($status, $out) = $vm->execute("test -e $gcovDir");
-        next if $status != 0;
+            my ($status, $out) = $vm->execute("test -e $gcovDir");
+            next if $status != 0;
 
-        # Figure out where to put the *.gcda files so that the report
-        # generator can find the corresponding kernel sources.
-        my $kernelDir = $vm->mustSucceed("echo \$(dirname \$(readlink -f /var/run/current-system/kernel))/.build/linux-*");
-        chomp $kernelDir;
-        my $coverageDir = "/hostfs" . $vm->stateDir() . "/coverage-data/$kernelDir";
+            # Figure out where to put the *.gcda files so that the
+            # report generator can find the corresponding kernel
+            # sources.
+            my $kernelDir = $vm->mustSucceed("echo \$(dirname \$(readlink -f /var/run/current-system/kernel))/.build/linux-*");
+            chomp $kernelDir;
+            my $coverageDir = "/hostfs" . $vm->stateDir() . "/coverage-data/$kernelDir";
 
-        # Copy all the *.gcda files.
-        $vm->execute("for d in $gcovDir/nix/store/*/.build/linux-*; do for i in \$(cd \$d && find -name '*.gcda'); do echo \$i; mkdir -p $coverageDir/\$(dirname \$i); cp -v \$d/\$i $coverageDir/\$i; done; done");
-    }
+            # Copy all the *.gcda files.
+            $vm->execute("for d in $gcovDir/nix/store/*/.build/linux-*; do for i in \$(cd \$d && find -name '*.gcda'); do echo \$i; mkdir -p $coverageDir/\$(dirname \$i); cp -v \$d/\$i $coverageDir/\$i; done; done");
+        }
+    });
 
     if ($nrTests != 0) {
         $log->log("$nrSucceeded out of $nrTests tests succeeded",
@@ -118,12 +135,14 @@ sub createDisk {
 
 
 END {
-    foreach my $vm (values %vms) {
-        if ($vm->{pid}) {
-            $log->log("killing " . $vm->{name} . " (pid " . $vm->{pid} . ")");
-            kill 9, $vm->{pid};
+    $log->nest("cleaning up", sub {
+        foreach my $vm (values %vms) {
+            if ($vm->{pid}) {
+                $log->log("killing " . $vm->{name} . " (pid " . $vm->{pid} . ")");
+                kill 9, $vm->{pid};
+            }
         }
-    }
+    });
     $log->close();
 }