From 4d51c1671f310ee9b87935b8ad8484a89dca204c Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 3 Oct 2019 19:50:34 +0200 Subject: [PATCH] Add tests --- release.nix | 8 ++-- tests/default.nix | 101 ++++++++++++++++++++++++++++++++++++++++ tests/driver-config.xml | 38 +++++++++++++++ tests/libc.nix | 18 +++++++ tests/libc.xml | 21 +++++++++ tests/log.nix | 14 ++++++ tests/log.xml | 34 ++++++++++++++ tests/signal.nix | 14 ++++++ tests/signal.xml | 21 +++++++++ tests/test-driver.exp | 49 +++++++++++++++++++ 10 files changed, 315 insertions(+), 3 deletions(-) create mode 100644 tests/default.nix create mode 100644 tests/driver-config.xml create mode 100644 tests/libc.nix create mode 100644 tests/libc.xml create mode 100644 tests/log.nix create mode 100644 tests/log.xml create mode 100644 tests/signal.nix create mode 100644 tests/signal.xml create mode 100644 tests/test-driver.exp diff --git a/release.nix b/release.nix index 95e4402..061e4d9 100644 --- a/release.nix +++ b/release.nix @@ -4,7 +4,9 @@ { genodepkgs ? builtins.fetchGit ./., nixpkgs ? }: -{ - build.x86_64 = let pkgs = import ./default.nix { inherit nixpkgs; }; - in { inherit (pkgs) genode nova stdenv; }; +let pkgs = import ./default.nix { inherit nixpkgs; }; +in { + build.x86_64 = { inherit (pkgs) genode nova stdenv; }; + + tests.x86_64 = import ./tests { inherit pkgs; }; } diff --git a/tests/default.nix b/tests/default.nix new file mode 100644 index 0000000..59fc60a --- /dev/null +++ b/tests/default.nix @@ -0,0 +1,101 @@ +# SPDX-FileCopyrightText: Emery Hemingway +# +# SPDX-License-Identifier: LicenseRef-Hippocratic-1.1 + +{ pkgs ? (import ./.. { }) }: + +let + + lib = pkgs.buildPackages.pkgs.lib // { + + renderDhallInit = path: args: + pkgs.buildPackages.runCommand "init.xml" { + buildInputs = with pkgs.buildPackages; [ dhall-text libxml2 ]; + initConfig = path; + initArgs = args; + DHALL_PRELUDE = "${pkgs.dhallPackages.prelude}/package.dhall"; + DHALL_GENODE = "${pkgs.dhallPackages.genode}/package.dhall"; + } '' + echo '(env:DHALL_GENODE).Init.render (env:initConfig initArgs)' \ + | dhall-to-text \ + | xmllint -format - \ + > $out + ''; + + }; + + 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; }; + + callTest = path: args: makeTest (import path ({ inherit pkgs lib; } // args)); + +in { + libc = callTest ./libc.nix { }; + log = callTest ./log.nix { }; + signal = callTest ./signal.nix { }; +} diff --git a/tests/driver-config.xml b/tests/driver-config.xml new file mode 100644 index 0000000..373fbed --- /dev/null +++ b/tests/driver-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/libc.nix b/tests/libc.nix new file mode 100644 index 0000000..5763217 --- /dev/null +++ b/tests/libc.nix @@ -0,0 +1,18 @@ +{ pkgs, lib }: +with pkgs; + +rec { + name = "libc"; + meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ]; + + testConfig = ./libc.xml; + + testScript = '' + file link -s libc.lib.so ${depot.libc}/lib/libc.lib.so + file link -s libm.lib.so ${depot.libc}/lib/libm.lib.so + file link -s posix.lib.so ${depot.posix}/lib/posix.lib.so + file link -s vfs.lib.so ${depot.vfs}/lib/vfs.lib.so + file link -s test-libc ${depot.test-libc}/bin/test-libc + run_genode_until "child .* exited with exit value 0.*\n" 30 + ''; +} diff --git a/tests/libc.xml b/tests/libc.xml new file mode 100644 index 0000000..8ca6f32 --- /dev/null +++ b/tests/libc.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + 2019-08-20 15:01 + + + + diff --git a/tests/log.nix b/tests/log.nix new file mode 100644 index 0000000..8c04d14 --- /dev/null +++ b/tests/log.nix @@ -0,0 +1,14 @@ +{ pkgs, lib }: +with pkgs; + +rec { + name = "log"; + meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ]; + + testConfig = ./log.xml; + + testScript = '' + file link -s test-log ${genode.base}/bin/test-log/test-log + run_genode_until {Test done.} 10 + ''; +} diff --git a/tests/log.xml b/tests/log.xml new file mode 100644 index 0000000..2abb6f8 --- /dev/null +++ b/tests/log.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/signal.nix b/tests/signal.nix new file mode 100644 index 0000000..d7ccf9a --- /dev/null +++ b/tests/signal.nix @@ -0,0 +1,14 @@ +{ pkgs, lib }: +with pkgs; + +rec { + name = "signal"; + meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ]; + + testConfig = ./signal.xml; + + testScript = '' + file link -s test-signal ${depot.test-signal}/bin/test-signal + run_genode_until {--- Signalling test finished ---} 60 + ''; +} diff --git a/tests/signal.xml b/tests/signal.xml new file mode 100644 index 0000000..9870f87 --- /dev/null +++ b/tests/signal.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test-driver.exp b/tests/test-driver.exp new file mode 100644 index 0000000..9bac3a9 --- /dev/null +++ b/tests/test-driver.exp @@ -0,0 +1,49 @@ +#! /usr/bin/env expect + +## +# Wait for a specific output of a already running spawned process +# +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 image_dir spawn_id + + spawn ./core + wait_for_output $wait_for_re $timeout_value $spawn_id +} + + +eval $env(baseSetup) + +eval $env(testScript)