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

79 lines
2.3 KiB
Nix

# SPDX-FileCopyrightText: Emery Hemingway
#
# SPDX-License-Identifier: LicenseRef-Hippocratic-1.1
{ pkgs, lib }:
let
testDriver = with pkgs.buildPackages;
stdenv.mkDerivation {
name = "genode-test-driver";
buildInputs = [ makeWrapper expect ];
dontUnpack = true;
preferLocalBuild = true;
installPhase = ''
install -Dm555 ${./test-driver.exp} $out/bin/genode-test-driver
wrapProgram $out/bin/genode-test-driver \
--prefix PATH : "${lib.makeBinPath [ expect coreutils ]}"
'';
};
runTests = driver:
pkgs.stdenv.mkDerivation {
name = "test-run-${driver.testName}";
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
'';
};
makeTest = { testScript, testConfig, name ? "unamed", ... }@t:
let
baseSetup = with pkgs; ''
file link -s core ${depot.base-linux}/bin/core
file link -s timer ${depot.base-linux}/bin/timer
file link -s ld.lib.so ${depot.base-linux}/lib/ld.lib.so
file link -s init ${depot.init}/bin/init
file link -s config ${./driver-config.xml}
file link -s test.config $env(testConfig)
'';
driver = pkgs.buildPackages.runCommand "genode-test-driver-${name}" {
buildInputs = with pkgs.buildPackages; [ 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 test; };
in {
callTest = path: args: makeTest (import path ({ inherit pkgs lib; } // args));
}