By default this is now enabled, and it has to be explicitely enabled using "enableOCR = true". If it is set to false, any usage of getScreenText or waitForText will fail with an error suggesting to pass enableOCR. This should get rid of the rather large dependency on tesseract which we don't need for most tests. Note, that I'm using system("type -P") here to check whether tesseract is in PATH. I know it's a bashism but we already have other bashisms within the test scripts and we also run it with bash, so IMHO it's not a problem here. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
211 lines
6.2 KiB
Nix
211 lines
6.2 KiB
Nix
{ system, minimal ? false }:
|
|
|
|
with import ./build-vms.nix { inherit system minimal; };
|
|
with pkgs;
|
|
|
|
rec {
|
|
|
|
inherit pkgs;
|
|
|
|
|
|
testDriver = stdenv.mkDerivation {
|
|
name = "nixos-test-driver";
|
|
|
|
buildInputs = [ makeWrapper perl ];
|
|
|
|
unpackPhase = "true";
|
|
|
|
installPhase =
|
|
''
|
|
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
|
|
cp ${./test-driver/Logger.pm} $libDir/Logger.pm
|
|
|
|
wrapProgram $out/bin/nixos-test-driver \
|
|
--prefix PATH : "${qemu_kvm}/bin:${vde2}/bin:${netpbm}/bin:${coreutils}/bin" \
|
|
--prefix PERL5LIB : "${with perlPackages; lib.makePerlPath [ TermReadLineGnu XMLWriter IOTty FileSlurp ]}:$out/lib/perl5/site_perl"
|
|
'';
|
|
};
|
|
|
|
|
|
# Run an automated test suite in the given virtual network.
|
|
# `driver' is the script that runs the network.
|
|
runTests = driver:
|
|
stdenv.mkDerivation {
|
|
name = "vm-test-run-${driver.testName}";
|
|
|
|
requiredSystemFeatures = [ "kvm" "nixos-test" ];
|
|
|
|
buildInputs = [ libxslt ];
|
|
|
|
buildCommand =
|
|
''
|
|
mkdir -p $out/nix-support
|
|
|
|
LOGFILE=$out/log.xml tests='eval $ENV{testScript}; die $@ if $@;' ${driver}/bin/nixos-test-driver
|
|
|
|
# Generate a pretty-printed log.
|
|
xsltproc --output $out/log.html ${./test-driver/log2html.xsl} $out/log.xml
|
|
ln -s ${./test-driver/logfile.css} $out/logfile.css
|
|
ln -s ${./test-driver/treebits.js} $out/treebits.js
|
|
ln -s ${jquery}/js/jquery.min.js $out/
|
|
ln -s ${jquery-ui}/js/jquery-ui.min.js $out/
|
|
|
|
touch $out/nix-support/hydra-build-products
|
|
echo "report testlog $out log.html" >> $out/nix-support/hydra-build-products
|
|
|
|
for i in */xchg/coverage-data; do
|
|
mkdir -p $out/coverage-data
|
|
mv $i $out/coverage-data/$(dirname $(dirname $i))
|
|
done
|
|
''; # */
|
|
};
|
|
|
|
|
|
makeTest =
|
|
{ testScript
|
|
, makeCoverageReport ? false
|
|
, enableOCR ? false
|
|
, name ? "unnamed"
|
|
, ...
|
|
} @ t:
|
|
|
|
let
|
|
testDriverName = "nixos-test-driver-${name}";
|
|
|
|
nodes = buildVirtualNetwork (
|
|
t.nodes or (if t ? machine then { machine = t.machine; } else { }));
|
|
|
|
testScript' =
|
|
# Call the test script with the computed nodes.
|
|
if builtins.isFunction testScript
|
|
then testScript { inherit nodes; }
|
|
else testScript;
|
|
|
|
vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
|
|
|
|
vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
|
|
|
|
# Generate onvenience wrappers for running the test driver
|
|
# interactively with the specified network, and for starting the
|
|
# VMs from the command line.
|
|
driver = runCommand testDriverName
|
|
{ buildInputs = [ makeWrapper];
|
|
testScript = testScript';
|
|
preferLocalBuild = true;
|
|
testName = name;
|
|
}
|
|
''
|
|
mkdir -p $out/bin
|
|
echo "$testScript" > $out/test-script
|
|
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/
|
|
vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)"
|
|
wrapProgram $out/bin/nixos-test-driver \
|
|
--add-flags "$vms" \
|
|
${lib.optionalString enableOCR "--prefix PATH : '${tesseract}/bin'"} \
|
|
--run "testScript=\"\$(cat $out/test-script)\"" \
|
|
--set testScript '"$testScript"' \
|
|
--set VLANS '"${toString vlans}"'
|
|
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
|
|
wrapProgram $out/bin/nixos-run-vms \
|
|
--add-flags "$vms" \
|
|
${lib.optionalString enableOCR "--prefix PATH : '${tesseract}/bin'"} \
|
|
--set tests '"startAll; joinAll;"' \
|
|
--set VLANS '"${toString vlans}"' \
|
|
${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"}
|
|
''; # "
|
|
|
|
test = runTests driver;
|
|
|
|
report = releaseTools.gcovReport { coverageRuns = [ test ]; };
|
|
|
|
in (if makeCoverageReport then report else test) // { inherit nodes driver test; };
|
|
|
|
|
|
runInMachine =
|
|
{ drv
|
|
, machine
|
|
, preBuild ? ""
|
|
, postBuild ? ""
|
|
, ... # ???
|
|
}:
|
|
let
|
|
vm = buildVM { }
|
|
[ machine
|
|
{ key = "run-in-machine";
|
|
networking.hostName = "client";
|
|
nix.readOnlyStore = false;
|
|
}
|
|
];
|
|
|
|
buildrunner = writeText "vm-build" ''
|
|
source $1
|
|
|
|
${coreutils}/bin/mkdir -p $TMPDIR
|
|
cd $TMPDIR
|
|
|
|
$origBuilder $origArgs
|
|
|
|
exit $?
|
|
'';
|
|
|
|
testScript = ''
|
|
startAll;
|
|
$client->waitForUnit("multi-user.target");
|
|
${preBuild}
|
|
$client->succeed("env -i ${bash}/bin/bash ${buildrunner} /tmp/xchg/saved-env >&2");
|
|
${postBuild}
|
|
$client->succeed("sync"); # flush all data before pulling the plug
|
|
'';
|
|
|
|
vmRunCommand = writeText "vm-run" ''
|
|
${coreutils}/bin/mkdir $out
|
|
${coreutils}/bin/mkdir -p vm-state-client/xchg
|
|
export > vm-state-client/xchg/saved-env
|
|
export tests='${testScript}'
|
|
${testDriver}/bin/nixos-test-driver ${vm.config.system.build.vm}/bin/run-*-vm
|
|
''; # */
|
|
|
|
in
|
|
lib.overrideDerivation drv (attrs: {
|
|
requiredSystemFeatures = [ "kvm" ];
|
|
builder = "${bash}/bin/sh";
|
|
args = ["-e" vmRunCommand];
|
|
origArgs = attrs.args;
|
|
origBuilder = attrs.builder;
|
|
});
|
|
|
|
|
|
runInMachineWithX = { require ? [], ... } @ args:
|
|
let
|
|
client =
|
|
{ config, pkgs, ... }:
|
|
{
|
|
inherit require;
|
|
virtualisation.memorySize = 1024;
|
|
services.xserver.enable = true;
|
|
services.xserver.displayManager.slim.enable = false;
|
|
services.xserver.displayManager.auto.enable = true;
|
|
services.xserver.windowManager.default = "icewm";
|
|
services.xserver.windowManager.icewm.enable = true;
|
|
services.xserver.desktopManager.default = "none";
|
|
};
|
|
in
|
|
runInMachine ({
|
|
machine = client;
|
|
preBuild =
|
|
''
|
|
$client->waitForX;
|
|
'';
|
|
} // args);
|
|
|
|
|
|
simpleTest = as: (makeTest as).test;
|
|
|
|
}
|