2
0
Fork 0
genodepkgs/tests/driver-nova.nix

180 lines
5.5 KiB
Nix
Raw Normal View History

2020-01-17 01:24:34 +01:00
# SPDX-License-Identifier: CC0-1.0
2019-10-07 21:58:35 +02:00
{ addManifest, apps, buildPackages, lib, nixpkgs, testPkgs, legacyPackages }:
2019-10-07 21:58:35 +02:00
let
2020-04-05 19:54:03 +02:00
testDriver = with buildPackages;
2019-10-07 21:58:35 +02:00
stdenv.mkDerivation {
name = "nova-genode-test-driver";
2019-10-28 07:23:13 +01:00
preferLocalBuild = true;
2019-10-07 21:58:35 +02:00
buildInputs = [ makeWrapper expect ];
dontUnpack = true;
installPhase = ''
install -Dm555 ${./nova-test-driver.exp} $out/bin/genode-test-driver
wrapProgram $out/bin/genode-test-driver \
--prefix PATH : "${lib.makeBinPath [ expect coreutils ]}"
'';
};
runTests = driver:
2020-04-05 19:54:03 +02:00
buildPackages.stdenv.mkDerivation {
2019-11-10 10:19:32 +01:00
name = "nova-" + driver.testName;
2019-10-28 07:23:13 +01:00
preferLocalBuild = true;
2019-10-07 21:58:35 +02:00
buildCommand = ''
mkdir -p $out/nix-support
${driver}/bin/genode-test-driver | tee $out/log
touch $out/nix-support
echo "report testlog $out log" >> $out/nix-support/hydra-build-products
'';
};
defaultScript =
''run_genode_until {child "init" exited with exit value 0} 120'';
2020-01-25 18:14:18 +01:00
mkTest = { name ? "unamed", testScript ? defaultScript, testConfig
2020-05-29 18:34:22 +02:00
, testInputs ? [ ], testEnv ? { }, extraPaths ? [ ], qemuArgs ? [ ], ...
}@t:
let
storeTarball = buildPackages.runCommand "store" { } ''
mkdir -p $out
2020-05-29 18:34:22 +02:00
tar cf "$out/store.tar" --absolute-names ${toString testInputs} ${
toString extraPaths
}
'';
storeManifest = lib.mergeManifests (map addManifest testInputs);
manifest = lib.mergeManifests (map addManifest
([ testPkgs.base-nova testPkgs.sotest-producer storeTarball ]
++ map testPkgs.genodeSources.depot [
"init"
"rtc_drv"
"vfs"
"cached_fs_rom"
]));
testConfig' = "${
./test-wrapper.dhall
} (${testConfig}) $(stat --format '%s' ${storeTarball}/store.tar) ${storeManifest} ${manifest}";
testEnv' = {
DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall";
2020-04-13 20:26:01 +02:00
DHALL_GENODE_TEST = "${./test.dhall}";
} // testEnv;
2020-01-17 19:27:04 +01:00
image = lib.novaImage ("nova-" + name) testEnv' testConfig';
2020-04-05 10:01:11 +02:00
build = lib.compileBoot name testEnv' testConfig';
baseSetup = ''
##
# Wait for a specific output of a already running spawned proce
#
proc wait_for_output { wait_for_re timeout_value running_spawn_id } {
2019-11-10 10:19:32 +01:00
global output
if {$wait_for_re == "forever"} {
set timeout -1
interact {
\003 {
send_user "Expect: 'interact' received 'strg+c' and was cancelled\n";
exit
}
-i $running_spawn_id
}
} else {
set timeout $timeout_value
}
expect {
-i $running_spawn_id -re $wait_for_re { }
eof { puts stderr "Error: Spawned process died unexpectedly"; exit -1 }
timeout { puts stderr "Error: Test execution timed out"; exit -1 }
}
set output $expect_out(buffer)
}
proc run_genode_until {{wait_for_re forever} {timeout_value 0} {running_spawn_id -1}} {
2019-11-10 10:19:32 +01:00
#
# If a running_spawn_id is specified, wait for the expected output
#
if {$running_spawn_id != -1} {
wait_for_output $wait_for_re $timeout_value $running_spawn_id
return
}
global env
2019-11-10 10:19:32 +01:00
global spawn_id
set TEST_MIB [expr (([file size ${image}/image.elf] + $env(TEST_RAM)) >> 20) + 24]
2020-04-05 19:54:03 +02:00
spawn ${buildPackages.qemu_test}/bin/qemu-system-x86_64 \
-machine q35 -cpu phenom -smp 2 \
-serial mon:stdio -nographic \
-m size=$TEST_MIB \
-kernel "${testPkgs.bender}/bender" \
-initrd "${testPkgs.NOVA}/hypervisor-x86_64 arg=iommu novpid serial,${image}/image.elf" \
${toString qemuArgs}
2019-11-10 10:19:32 +01:00
wait_for_output $wait_for_re $timeout_value $spawn_id
}
2019-11-10 10:19:32 +01:00
# TODO: not in TCL
global env
set out $env(out)
'';
2019-10-07 21:58:35 +02:00
2020-04-05 19:54:03 +02:00
driver = with buildPackages;
buildPackages.runCommand "genode-test-driver-${name}" ({
2019-10-07 21:58:35 +02:00
buildInputs = [ makeWrapper expect ];
inherit baseSetup testScript;
2019-10-07 21:58:35 +02:00
preferLocalBuild = true;
testName = name;
} // testEnv') ''
2019-10-07 21:58:35 +02:00
mkdir -p $out/bin
echo "$testScript" > $out/test-script
echo "$baseSetup" > $out/base-setup
source ${image.build}/stats
2020-04-05 10:01:11 +02:00
2019-10-07 21:58:35 +02:00
ln -s ${testDriver}/bin/genode-test-driver $out/bin/
wrapProgram $out/bin/genode-test-driver \
--set testScript "$testScript" \
--set baseSetup "$baseSetup" \
2020-04-05 10:01:11 +02:00
--set TEST_RAM $RAM \
2019-10-07 21:58:35 +02:00
'';
passMeta = drv:
drv
// lib.optionalAttrs (t ? meta) { meta = (drv.meta or { }) // t.meta; };
test = passMeta (runTests driver);
in test // {
inherit driver image test manifest;
inherit (image) build;
2020-04-05 19:54:03 +02:00
config = buildPackages.runCommand (name + ".dhall") testEnv' ''
${apps.dhall.program} <<< "${testConfig'}" > $out
2020-01-17 19:27:04 +01:00
'';
2020-04-05 10:01:11 +02:00
compile = lib.compileBoot name testConfig';
2020-02-05 12:11:44 +01:00
2020-04-05 10:01:11 +02:00
iso = apps.nova-iso.function testEnv' "${testConfig'}";
store = storeTarball;
xml = buildPackages.runCommand (name + ".config") testEnv'
''${apps.render-init.program} <<< "(${testConfig'}).config" > $out'';
};
2019-10-07 21:58:35 +02:00
in {
callTest = path: args:
(import path ({
testEnv = {
inherit mkTest lib;
isLinux = false;
isNova = true;
};
2019-10-07 21:58:35 +02:00
pkgs = testPkgs;
inherit nixpkgs buildPackages legacyPackages;
2019-10-07 21:58:35 +02:00
} // args));
}