Genode Packages collection
https://git.sr.ht/~ehmry/genodepkgs/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.0 KiB
145 lines
4.0 KiB
# SPDX-FileCopyrightText: Emery Hemingway |
|
# |
|
# SPDX-License-Identifier: LicenseRef-Hippocratic-1.1 |
|
|
|
{ system, testPkgs, hostPkgs, lib, depot }: |
|
|
|
let |
|
testDriver = with hostPkgs; |
|
stdenv.mkDerivation { |
|
name = "nova-genode-test-driver"; |
|
preferLocalBuild = true; |
|
|
|
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: |
|
hostPkgs.stdenv.mkDerivation { |
|
name = "nova-" + 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 |
|
''; |
|
}; |
|
|
|
mkTest = { name ? "unamed", testScript, testConfig, bootModules, qemuMem ? 32 |
|
, ... }@t: |
|
let |
|
bootModules' = (with testPkgs; |
|
{ |
|
inherit testConfig; |
|
config = ./driver-config.xml; |
|
} // bootModules); |
|
|
|
iso = lib.buildNovaIso { |
|
inherit name; |
|
rom = bootModules'; |
|
}; |
|
|
|
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 |
|
} |
|
|
|
global spawn_id |
|
spawn ${iso}/bin/boot-qemu -nographic -m size=${toString qemuMem} |
|
wait_for_output $wait_for_re $timeout_value $spawn_id |
|
} |
|
|
|
# TODO: not in TCL |
|
global env |
|
set out $env(out) |
|
|
|
set fd [open "$out/nix-support/hydra-build-products" w] |
|
puts $fd "file iso ${iso}" |
|
close $fd |
|
''; |
|
|
|
driver = with hostPkgs; |
|
buildPackages.runCommand "genode-test-driver-${name}" { |
|
buildInputs = [ makeWrapper expect ]; |
|
inherit baseSetup testConfig testScript; |
|
preferLocalBuild = true; |
|
testName = name; |
|
} '' |
|
mkdir -p $out/bin |
|
echo "$testConfig" > $out/test.config |
|
echo "$testScript" > $out/test-script |
|
echo "$baseSetup" > $out/base-setup |
|
ln -s ${testDriver}/bin/genode-test-driver $out/bin/ |
|
wrapProgram $out/bin/genode-test-driver \ |
|
--run "export testConfig=\"$testConfig\"" \ |
|
--run "export testScript=\"\$(cat $out/test-script)\"" \ |
|
--run "export baseSetup=\"\$(cat $out/base-setup)\"" \ |
|
''; |
|
|
|
passMeta = drv: |
|
drv |
|
// lib.optionalAttrs (t ? meta) { meta = (drv.meta or { }) // t.meta; }; |
|
|
|
test = passMeta (runTests driver); |
|
|
|
in test // { |
|
inherit driver iso test; |
|
config = testConfig; |
|
rom = bootModules'; |
|
}; |
|
|
|
in { |
|
callTest = path: args: |
|
(import path ({ |
|
testEnv = { |
|
inherit mkTest lib; |
|
isLinux = false; |
|
isNova = true; |
|
}; |
|
pkgs = testPkgs; |
|
inherit depot; |
|
} // args)); |
|
}
|
|
|