nixos/tests: format the testing-python.nix file more consistenly

This commit is contained in:
Andreas Rammhold 2020-10-23 23:13:38 +02:00
parent 04100cd281
commit 61b09f552c
No known key found for this signature in database
GPG Key ID: E432E410B5E48C86
1 changed files with 105 additions and 97 deletions

View File

@ -3,11 +3,12 @@
# Use a minimal kernel? # Use a minimal kernel?
, minimal ? false , minimal ? false
# Ignored # Ignored
, config ? {} , config ? { }
# !!! See comment about args in lib/modules.nix # !!! See comment about args in lib/modules.nix
, specialArgs ? {} , specialArgs ? { }
# Modules to add to each VM # Modules to add to each VM
, extraConfigurations ? [] }: , extraConfigurations ? [ ]
}:
with pkgs; with pkgs;
@ -16,39 +17,41 @@ rec {
inherit pkgs; inherit pkgs;
mkTestDriver = let mkTestDriver =
testDriverScript = ./test-driver/test-driver.py; let
in qemu_pkg: stdenv.mkDerivation { testDriverScript = ./test-driver/test-driver.py;
name = "nixos-test-driver"; in
qemu_pkg: stdenv.mkDerivation {
name = "nixos-test-driver";
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];
buildInputs = [ (python3.withPackages (p: [ p.ptpython ])) ]; buildInputs = [ (python3.withPackages (p: [ p.ptpython ])) ];
checkInputs = with python3Packages; [ pylint black mypy ]; checkInputs = with python3Packages; [ pylint black mypy ];
dontUnpack = true; dontUnpack = true;
preferLocalBuild = true; preferLocalBuild = true;
doCheck = true; doCheck = true;
checkPhase = '' checkPhase = ''
mypy --disallow-untyped-defs \ mypy --disallow-untyped-defs \
--no-implicit-optional \ --no-implicit-optional \
--ignore-missing-imports ${testDriverScript} --ignore-missing-imports ${testDriverScript}
pylint --errors-only ${testDriverScript} pylint --errors-only ${testDriverScript}
black --check --diff ${testDriverScript} black --check --diff ${testDriverScript}
'';
installPhase =
''
mkdir -p $out/bin
cp ${testDriverScript} $out/bin/nixos-test-driver
chmod u+x $out/bin/nixos-test-driver
# TODO: copy user script part into this file (append)
wrapProgram $out/bin/nixos-test-driver \
--prefix PATH : "${lib.makeBinPath [ qemu_pkg vde2 netpbm coreutils ]}" \
''; '';
};
installPhase =
''
mkdir -p $out/bin
cp ${testDriverScript} $out/bin/nixos-test-driver
chmod u+x $out/bin/nixos-test-driver
# TODO: copy user script part into this file (append)
wrapProgram $out/bin/nixos-test-driver \
--prefix PATH : "${lib.makeBinPath [ qemu_pkg vde2 netpbm coreutils ]}" \
'';
};
# Run an automated test suite in the given virtual network. # Run an automated test suite in the given virtual network.
# `driver' is the script that runs the network. # `driver' is the script that runs the network.
@ -71,11 +74,10 @@ rec {
{ testScript { testScript
, enableOCR ? false , enableOCR ? false
, name ? "unnamed" , name ? "unnamed"
# Skip linting (mainly intended for faster dev cycles) # Skip linting (mainly intended for faster dev cycles)
, skipLint ? false , skipLint ? false
, ... , ...
} @ t: } @ t:
let let
# A standard store path to the vm monitor is built like this: # A standard store path to the vm monitor is built like this:
# /tmp/nix-build-vm-test-run-$name.drv-0/vm-state-machine/monitor # /tmp/nix-build-vm-test-run-$name.drv-0/vm-state-machine/monitor
@ -94,7 +96,7 @@ rec {
# interactively with the specified network, and for starting the # interactively with the specified network, and for starting the
# VMs from the command line. # VMs from the command line.
mkDriver = qemu_pkg: mkDriver = qemu_pkg:
let let
build-vms = import ./build-vms.nix { build-vms = import ./build-vms.nix {
inherit system pkgs minimal specialArgs; inherit system pkgs minimal specialArgs;
extraConfigurations = extraConfigurations ++ (pkgs.lib.optional (qemu_pkg != null) extraConfigurations = extraConfigurations ++ (pkgs.lib.optional (qemu_pkg != null)
@ -108,7 +110,8 @@ rec {
testDriver = mkTestDriver (if qemu_pkg == null then pkgs.qemu_test else qemu_pkg); testDriver = mkTestDriver (if qemu_pkg == null then pkgs.qemu_test else qemu_pkg);
nodes = build-vms.buildVirtualNetwork ( nodes = build-vms.buildVirtualNetwork (
t.nodes or (if t ? machine then { machine = t.machine; } else { })); t.nodes or (if t ? machine then { machine = t.machine; } else { })
);
vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes); vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
vms = map (m: m.config.system.build.vm) (lib.attrValues nodes); vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
@ -120,49 +123,51 @@ rec {
testDriverName = with builtins; testDriverName = with builtins;
if testNameLen > maxTestNameLen then if testNameLen > maxTestNameLen then
abort ("The name of the test '${name}' must not be longer than ${toString maxTestNameLen} " + abort
"it's currently ${toString testNameLen} characters long.") ("The name of the test '${name}' must not be longer than ${toString maxTestNameLen} " +
"it's currently ${toString testNameLen} characters long.")
else else
"nixos-test-driver-${name}"; "nixos-test-driver-${name}";
warn = if skipLint then lib.warn "Linting is disabled!" else lib.id; warn = if skipLint then lib.warn "Linting is disabled!" else lib.id;
in in
warn (runCommand testDriverName warn (runCommand testDriverName
{ buildInputs = [ makeWrapper]; {
testScript = testScript'; buildInputs = [ makeWrapper ];
preferLocalBuild = true; testScript = testScript';
testName = name; preferLocalBuild = true;
passthru = { testName = name;
inherit nodes; passthru = {
}; inherit nodes;
} };
'' }
mkdir -p $out/bin ''
mkdir -p $out/bin
echo -n "$testScript" > $out/test-script echo -n "$testScript" > $out/test-script
${lib.optionalString (!skipLint) '' ${lib.optionalString (!skipLint) ''
${python3Packages.black}/bin/black --check --diff $out/test-script ${python3Packages.black}/bin/black --check --diff $out/test-script
''} ''}
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/ ln -s ${testDriver}/bin/nixos-test-driver $out/bin/
vms=($(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)) vms=($(for i in ${toString vms}; do echo $i/bin/run-*-vm; done))
wrapProgram $out/bin/nixos-test-driver \ wrapProgram $out/bin/nixos-test-driver \
--add-flags "''${vms[*]}" \ --add-flags "''${vms[*]}" \
${lib.optionalString enableOCR ${lib.optionalString enableOCR
"--prefix PATH : '${ocrProg}/bin:${imagemagick_tiff}/bin'"} \ "--prefix PATH : '${ocrProg}/bin:${imagemagick_tiff}/bin'"} \
--run "export testScript=\"\$(${coreutils}/bin/cat $out/test-script)\"" \ --run "export testScript=\"\$(${coreutils}/bin/cat $out/test-script)\"" \
--set VLANS '${toString vlans}' --set VLANS '${toString vlans}'
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
wrapProgram $out/bin/nixos-run-vms \ wrapProgram $out/bin/nixos-run-vms \
--add-flags "''${vms[*]}" \ --add-flags "''${vms[*]}" \
${lib.optionalString enableOCR "--prefix PATH : '${ocrProg}/bin'"} \ ${lib.optionalString enableOCR "--prefix PATH : '${ocrProg}/bin'"} \
--set tests 'start_all(); join_all();' \ --set tests 'start_all(); join_all();' \
--set VLANS '${toString vlans}' \ --set VLANS '${toString vlans}' \
${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"} ${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"}
''); # " ''); # "
passMeta = drv: drv // lib.optionalAttrs (t ? meta) { passMeta = drv: drv // lib.optionalAttrs (t ? meta) {
meta = (drv.meta or {}) // t.meta; meta = (drv.meta or { }) // t.meta;
}; };
driver = mkDriver null; driver = mkDriver null;
@ -172,22 +177,23 @@ rec {
nodeNames = builtins.attrNames driver.nodes; nodeNames = builtins.attrNames driver.nodes;
invalidNodeNames = lib.filter invalidNodeNames = lib.filter
(node: builtins.match "^[A-z_]([A-z0-9_]+)?$" node == null) nodeNames; (node: builtins.match "^[A-z_]([A-z0-9_]+)?$" node == null)
nodeNames;
in in
if lib.length invalidNodeNames > 0 then if lib.length invalidNodeNames > 0 then
throw '' throw ''
Cannot create machines out of (${lib.concatStringsSep ", " invalidNodeNames})! Cannot create machines out of (${lib.concatStringsSep ", " invalidNodeNames})!
All machines are referenced as python variables in the testing framework which will break the All machines are referenced as python variables in the testing framework which will break the
script when special characters are used. script when special characters are used.
Please stick to alphanumeric chars and underscores as separation. Please stick to alphanumeric chars and underscores as separation.
'' ''
else else
test // { test // {
inherit test driver driverInteractive; inherit test driver driverInteractive;
inherit (test) nodes; inherit (test) nodes;
}; };
runInMachine = runInMachine =
{ drv { drv
@ -202,8 +208,10 @@ rec {
}; };
vm = build-vms.buildVM { } vm = build-vms.buildVM { }
[ machine [
{ key = "run-in-machine"; machine
{
key = "run-in-machine";
networking.hostName = "client"; networking.hostName = "client";
nix.readOnlyStore = false; nix.readOnlyStore = false;
virtualisation.writableStore = false; virtualisation.writableStore = false;
@ -250,16 +258,16 @@ rec {
''; # */ ''; # */
in in
lib.overrideDerivation drv (attrs: { lib.overrideDerivation drv (attrs: {
requiredSystemFeatures = [ "kvm" ]; requiredSystemFeatures = [ "kvm" ];
builder = "${bash}/bin/sh"; builder = "${bash}/bin/sh";
args = ["-e" vmRunCommand]; args = [ "-e" vmRunCommand ];
origArgs = attrs.args; origArgs = attrs.args;
origBuilder = attrs.builder; origBuilder = attrs.builder;
}); });
runInMachineWithX = { require ? [], ... } @ args: runInMachineWithX = { require ? [ ], ... } @ args:
let let
client = client =
{ ... }: { ... }:
@ -275,13 +283,13 @@ rec {
services.xserver.windowManager.icewm.enable = true; services.xserver.windowManager.icewm.enable = true;
}; };
in in
runInMachine ({ runInMachine ({
machine = client; machine = client;
preBuild = preBuild =
'' ''
client.wait_for_x() client.wait_for_x()
''; '';
} // args); } // args);
simpleTest = as: (makeTest as).test; simpleTest = as: (makeTest as).test;