2020-02-18 20:14:29 +01:00
|
|
|
# SPDX-License-Identifier: CC0-1.0
|
|
|
|
|
|
|
|
{ system, apps, testPkgs, hostPkgs, lib, depot }:
|
|
|
|
|
|
|
|
let
|
|
|
|
testDriver = with hostPkgs;
|
|
|
|
stdenv.mkDerivation {
|
|
|
|
name = "hw-genode-test-driver";
|
|
|
|
preferLocalBuild = true;
|
|
|
|
|
|
|
|
buildInputs = [ makeWrapper expect ];
|
|
|
|
|
|
|
|
dontUnpack = true;
|
|
|
|
|
|
|
|
installPhase = ''
|
|
|
|
install -Dm555 ${./hw-test-driver.exp} $out/bin/genode-test-driver
|
|
|
|
wrapProgram $out/bin/genode-test-driver \
|
|
|
|
--prefix PATH : "${lib.makeBinPath [ expect coreutils ]}"
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
runTests = driver:
|
|
|
|
hostPkgs.stdenv.mkDerivation {
|
|
|
|
name = "hw-" + driver.testName;
|
|
|
|
preferLocalBuild = true;
|
|
|
|
|
|
|
|
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
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2020-02-21 22:55:50 +01:00
|
|
|
defaultScript = ''run_genode_until {[init] child "harness" exited with exit value 0} 60'';
|
2020-02-18 20:14:29 +01:00
|
|
|
|
|
|
|
mkTest = { name ? "unamed", testScript ? defaultScript, testConfig, testInputs ? [ ]
|
2020-02-19 13:25:36 +01:00
|
|
|
, env ? { }, ... # TODO: remove ...
|
2020-02-18 20:14:29 +01:00
|
|
|
}@t:
|
|
|
|
let
|
2020-02-21 22:55:50 +01:00
|
|
|
testConfig' = "${./driver-hw-config.dhall} ${testConfig}";
|
2020-02-18 20:14:29 +01:00
|
|
|
manifest = lib.mergeManifests (with testPkgs;
|
|
|
|
[ base-hw-pc genode.os sotest-producer ]
|
|
|
|
++ testInputs);
|
|
|
|
env' = {
|
|
|
|
DHALL_PRELUDE = "${testPkgs.dhallPrelude}/package.dhall";
|
|
|
|
DHALL_GENODE = "${testPkgs.dhallGenode}/package.dhall";
|
2020-02-21 22:55:50 +01:00
|
|
|
DHALL_WRAP_HARNESS = ./sotest-wrapper.dhall;
|
2020-02-18 20:14:29 +01:00
|
|
|
MANIFEST = manifest;
|
2020-02-21 22:55:50 +01:00
|
|
|
XDG_CACHE_HOME = "/tmp";
|
2020-02-18 20:14:29 +01:00
|
|
|
} // env;
|
|
|
|
|
2020-02-19 14:11:21 +01:00
|
|
|
image = apps.hw-image.function env' testConfig';
|
2020-02-18 20:14:29 +01:00
|
|
|
|
|
|
|
baseSetup = ''
|
|
|
|
##
|
|
|
|
# Wait for a specific output of a already running spawned proce
|
|
|
|
#
|
|
|
|
proc wait_for_output { wait_for_re timeout_value running_spawn_id } {
|
|
|
|
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}} {
|
|
|
|
#
|
|
|
|
# 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
|
|
|
|
}
|
|
|
|
|
2020-02-19 13:25:36 +01:00
|
|
|
global env
|
2020-02-18 20:14:29 +01:00
|
|
|
global spawn_id
|
2020-02-21 22:55:50 +01:00
|
|
|
set TEST_MIB [expr ($env(TEST_RAM) / 1048576) + 16]
|
2020-02-18 20:14:29 +01:00
|
|
|
spawn ${hostPkgs.qemu_test}/bin/qemu-system-x86_64 \
|
|
|
|
-machine q35 -serial mon:stdio -nographic \
|
2020-02-19 14:11:21 +01:00
|
|
|
-m size=$TEST_MIB \
|
2020-02-18 20:14:29 +01:00
|
|
|
-kernel "${testPkgs.bender}" \
|
|
|
|
-initrd "${image}"
|
|
|
|
wait_for_output $wait_for_re $timeout_value $spawn_id
|
|
|
|
}
|
|
|
|
|
|
|
|
# TODO: not in TCL
|
|
|
|
global env
|
|
|
|
set out $env(out)
|
|
|
|
'';
|
|
|
|
|
|
|
|
driver = with hostPkgs;
|
|
|
|
buildPackages.runCommand "genode-test-driver-${name}" {
|
|
|
|
buildInputs = [ makeWrapper expect ];
|
2020-02-19 14:11:21 +01:00
|
|
|
inherit baseSetup testScript;
|
2020-02-18 20:14:29 +01:00
|
|
|
preferLocalBuild = true;
|
|
|
|
testName = name;
|
2020-02-19 13:25:36 +01:00
|
|
|
DHALL_GENODE = "${testPkgs.dhallGenode}/package.dhall";
|
2020-02-21 22:55:50 +01:00
|
|
|
DHALL_WRAP_HARNESS = ./sotest-wrapper.dhall;
|
2020-02-19 13:25:36 +01:00
|
|
|
MANIFEST = manifest;
|
2020-02-18 20:14:29 +01:00
|
|
|
} ''
|
|
|
|
mkdir -p $out/bin
|
|
|
|
echo "$testScript" > $out/test-script
|
|
|
|
echo "$baseSetup" > $out/base-setup
|
2020-02-19 14:11:21 +01:00
|
|
|
eval $(${apps.dhall-to-bash.program} --declare "TEST_RAM" <<< "${./boot-ram.dhall} (${testConfig'})")
|
2020-02-18 20:14:29 +01:00
|
|
|
ln -s ${testDriver}/bin/genode-test-driver $out/bin/
|
|
|
|
wrapProgram $out/bin/genode-test-driver \
|
2020-02-19 13:25:36 +01:00
|
|
|
--set testScript "$testScript" \
|
|
|
|
--set baseSetup "$baseSetup" \
|
|
|
|
--set TEST_RAM $TEST_RAM \
|
2020-02-18 20:14:29 +01: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;
|
|
|
|
|
|
|
|
config = hostPkgs.runCommand (name + ".dhall") env' ''
|
2020-02-19 14:11:21 +01:00
|
|
|
${apps.dhall.program} <<< "${testConfig'}" > $out
|
2020-02-18 20:14:29 +01:00
|
|
|
'';
|
|
|
|
|
2020-02-19 14:11:21 +01:00
|
|
|
iso = apps.hw-iso.function env' testConfig';
|
2020-02-18 20:14:29 +01:00
|
|
|
|
|
|
|
xml = hostPkgs.runCommand (name + ".config") env' ''
|
2020-02-19 14:11:21 +01:00
|
|
|
${apps.render-init.program} "(${testConfig'}).config" > $out'';
|
2020-02-18 20:14:29 +01:00
|
|
|
|
|
|
|
sotest = hostPkgs.runCommand "hw-${name}-sotest" env' ''
|
|
|
|
cp "${testPkgs.bender}" bender
|
|
|
|
cp ${image} image.elf
|
|
|
|
mkdir -p $out/nix-support
|
|
|
|
${hostPkgs.zip}/bin/zip "$out/binaries.zip" \
|
|
|
|
bender image.elf
|
|
|
|
${apps.dhall-to-yaml.program} < ${
|
|
|
|
./sotest_hw_config.dhall
|
|
|
|
} > "$out/sotest_config.yaml"
|
|
|
|
echo file zip $out/binaries.zip >> "$out/nix-support/hydra-build-products"
|
|
|
|
echo file config $out/sotest_config.yaml >> "$out/nix-support/hydra-build-products"
|
|
|
|
'';
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
in {
|
|
|
|
callTest = path: args:
|
|
|
|
(import path ({
|
|
|
|
testEnv = {
|
|
|
|
inherit mkTest lib;
|
|
|
|
isLinux = false;
|
|
|
|
isNova = true;
|
|
|
|
};
|
|
|
|
pkgs = testPkgs;
|
|
|
|
inherit depot hostPkgs;
|
|
|
|
} // args));
|
|
|
|
}
|