Tests: split off Linux test driver, generate with Dhall
This commit is contained in:
parent
cede594e15
commit
a1259a54e7
|
@ -2,7 +2,14 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LicenseRef-Hippocratic-1.1
|
# SPDX-License-Identifier: LicenseRef-Hippocratic-1.1
|
||||||
|
|
||||||
{ pkgs ? (import ./.. { }) }:
|
let
|
||||||
|
tests = call: {
|
||||||
|
fs_report = call ./fs_report.nix { };
|
||||||
|
libc = call ./libc.nix { };
|
||||||
|
log = call ./log.nix { };
|
||||||
|
signal = call ./signal.nix { };
|
||||||
|
};
|
||||||
|
in { pkgs ? (import ./.. { }) }:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
||||||
|
@ -10,92 +17,20 @@ let
|
||||||
|
|
||||||
renderDhallInit = path: args:
|
renderDhallInit = path: args:
|
||||||
pkgs.buildPackages.runCommand "init.xml" {
|
pkgs.buildPackages.runCommand "init.xml" {
|
||||||
buildInputs = with pkgs.buildPackages; [ dhall-text libxml2 ];
|
buildInputs = with pkgs.buildPackages; [ linux-dhall ];
|
||||||
initConfig = path;
|
initConfig = path;
|
||||||
initArgs = args;
|
initArgs = args;
|
||||||
DHALL_PRELUDE = "${pkgs.dhallPackages.prelude}/package.dhall";
|
DHALL_PRELUDE = "${pkgs.dhallPackages.prelude}/package.dhall";
|
||||||
DHALL_GENODE = "${pkgs.dhallPackages.genode}/package.dhall";
|
DHALL_GENODE = "${pkgs.dhallPackages.genode}/package.dhall";
|
||||||
} ''
|
} ''
|
||||||
echo '(env:DHALL_GENODE).Init.render (env:initConfig initArgs)' \
|
set -v
|
||||||
| dhall-to-text \
|
echo 'let Prelude = env:DHALL_GENODE in Prelude.Init.render (Prelude.Init.defaults ⫽ { children = toMap (env:initConfig env:initArgs) })' \
|
||||||
| xmllint -format - \
|
| dhall text \
|
||||||
> $out
|
> $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 {
|
in {
|
||||||
libc = callTest ./libc.nix { };
|
linux = tests (import ./driver-linux.nix { inherit pkgs lib; }).callTest;
|
||||||
log = callTest ./log.nix { };
|
|
||||||
signal = callTest ./signal.nix { };
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
# 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));
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{ pkgs, lib }:
|
||||||
|
with pkgs;
|
||||||
|
|
||||||
|
{
|
||||||
|
name = "fs_report";
|
||||||
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
||||||
|
|
||||||
|
testConfig = ./fs_report.xml;
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
file link -s fs_report ${depot.fs_report}/bin/fs_report
|
||||||
|
file link -s fs_rom ${depot.fs_rom}/bin/fs_rom
|
||||||
|
file link -s ram_fs ${depot.ram_fs}/bin/ram_fs
|
||||||
|
file link -s vfs.lib.so ${depot.vfs}/lib/vfs.lib.so
|
||||||
|
file link -s test-fs_report ${depot.test-fs_report}/bin/test-fs_report
|
||||||
|
run_genode_until {child "test-fs_report" exited with exit value 0} 15
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
<config>
|
||||||
|
<parent-provides>
|
||||||
|
<service name="CPU"/>
|
||||||
|
<service name="LOG"/>
|
||||||
|
<service name="PD"/>
|
||||||
|
<service name="ROM"/>
|
||||||
|
<service name="Timer"/>
|
||||||
|
</parent-provides>
|
||||||
|
|
||||||
|
<default-route>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</default-route>
|
||||||
|
|
||||||
|
<default caps="100"/>
|
||||||
|
|
||||||
|
<start name="ram_fs">
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<provides> <service name="File_system"/> </provides>
|
||||||
|
<config>
|
||||||
|
<content>
|
||||||
|
<dir name="test-fs_report">
|
||||||
|
<inline name="devices">
|
||||||
|
<devices version="initial"/>
|
||||||
|
</inline>
|
||||||
|
</dir>
|
||||||
|
</content>
|
||||||
|
<policy label_prefix="fs_report -> " root="/" writeable="yes"/>
|
||||||
|
<policy label_prefix="fs_rom -> " root="/test-fs_report"/>
|
||||||
|
<policy label_prefix="test-fs_report -> " root="/test-fs_report" writeable="yes"/>
|
||||||
|
</config>
|
||||||
|
</start>
|
||||||
|
<!--
|
||||||
|
All reports sent by 'test-fs_report' are prefixed with the label of the
|
||||||
|
component. Hence, they are written to the 'test-fs_report/' subdirectory.
|
||||||
|
-->
|
||||||
|
<start name="fs_report">
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<provides> <service name="Report"/> </provides>
|
||||||
|
<config> <vfs> <fs/> </vfs> </config>
|
||||||
|
</start>
|
||||||
|
<start name="fs_rom">
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<provides> <service name="ROM"/> </provides>
|
||||||
|
<config/>
|
||||||
|
</start>
|
||||||
|
<start name="test-fs_report">
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<config> <vfs> <fs/> </vfs> </config>
|
||||||
|
<route>
|
||||||
|
<service name="ROM" label="devices"> <child name="fs_rom"/> </service>
|
||||||
|
<service name="ROM" label="focus"> <child name="fs_rom"/> </service>
|
||||||
|
<service name="Report" label="devices"> <child name="fs_report"/> </service>
|
||||||
|
<service name="Report" label="focus"> <child name="fs_report"/> </service>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</route>
|
||||||
|
</start>
|
||||||
|
</config>
|
|
@ -0,0 +1,24 @@
|
||||||
|
let Genode = env:DHALL_GENODE
|
||||||
|
|
||||||
|
in λ(_ : {})
|
||||||
|
→ { test-libc =
|
||||||
|
Genode.Init.Start.defaults
|
||||||
|
⫽ { binary = "test-libc"
|
||||||
|
, resources = { caps = 200, ram = Genode.units.MiB 400 }
|
||||||
|
, routes = [ Genode.ServiceRoute.parent "Timer" ]
|
||||||
|
, config =
|
||||||
|
Genode.Prelude.XML.text
|
||||||
|
''
|
||||||
|
<config>
|
||||||
|
<vfs>
|
||||||
|
<dir name="dev">
|
||||||
|
<log/>
|
||||||
|
<inline name="rtc">2019-08-20 15:01</inline>
|
||||||
|
</dir>
|
||||||
|
</vfs>
|
||||||
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc"/>
|
||||||
|
</config>
|
||||||
|
''
|
||||||
|
}
|
||||||
|
: Genode.Init.Start.Type
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ rec {
|
||||||
name = "libc";
|
name = "libc";
|
||||||
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
||||||
|
|
||||||
testConfig = ./libc.xml;
|
testConfig = lib.renderDhallInit ./libc.dhall "{=}";
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
file link -s libc.lib.so ${depot.libc}/lib/libc.lib.so
|
file link -s libc.lib.so ${depot.libc}/lib/libc.lib.so
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
<config>
|
|
||||||
<parent-provides>
|
|
||||||
<service name="ROM"/>
|
|
||||||
<service name="PD"/>
|
|
||||||
<service name="RM"/>
|
|
||||||
<service name="CPU"/>
|
|
||||||
<service name="LOG"/>
|
|
||||||
<service name="Timer"/>
|
|
||||||
</parent-provides>
|
|
||||||
<default-route>
|
|
||||||
<any-service> <parent/> <any-child/> </any-service>
|
|
||||||
</default-route>
|
|
||||||
<default caps="200"/>
|
|
||||||
<start name="test-libc">
|
|
||||||
<resource name="RAM" quantum="400M"/>
|
|
||||||
<config>
|
|
||||||
<vfs> <dir name="dev"> <log/> <inline name="rtc">2019-08-20 15:01</inline> </dir> </vfs>
|
|
||||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc"/>
|
|
||||||
</config>
|
|
||||||
</start>
|
|
||||||
</config>
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
let Genode = env:DHALL_GENODE ? ../dhall-genode/package.dhall
|
||||||
|
|
||||||
|
in λ(_ : {})
|
||||||
|
→ { test-log =
|
||||||
|
Genode.Init.Start.defaults ⫽ { binary = "test-log" }
|
||||||
|
: Genode.Init.Start.Type
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ rec {
|
||||||
name = "log";
|
name = "log";
|
||||||
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
||||||
|
|
||||||
testConfig = ./log.xml;
|
testConfig = lib.renderDhallInit ./log.dhall "{=}";
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
file link -s test-log ${genode.base}/bin/test-log
|
file link -s test-log ${genode.base}/bin/test-log
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<config verbose="yes">
|
|
||||||
<parent-provides>
|
|
||||||
<service name="LOG"/>
|
|
||||||
<service name="ROM"/>
|
|
||||||
<service name="CPU"/>
|
|
||||||
<service name="RM"/>
|
|
||||||
<service name="PD"/>
|
|
||||||
</parent-provides>
|
|
||||||
<start name="test-log" caps="50">
|
|
||||||
<resource name="RAM" quantum="1048576"/>
|
|
||||||
<provides/>
|
|
||||||
<exit propagate="yes"/>
|
|
||||||
<binary name="test-log"/>
|
|
||||||
<config/>
|
|
||||||
<route>
|
|
||||||
<service name="PD">
|
|
||||||
<parent/>
|
|
||||||
</service>
|
|
||||||
<service name="RM">
|
|
||||||
<parent/>
|
|
||||||
</service>
|
|
||||||
<service name="CPU">
|
|
||||||
<parent/>
|
|
||||||
</service>
|
|
||||||
<service name="ROM">
|
|
||||||
<parent/>
|
|
||||||
</service>
|
|
||||||
<service name="LOG">
|
|
||||||
<parent/>
|
|
||||||
</service>
|
|
||||||
</route>
|
|
||||||
</start>
|
|
||||||
</config>
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
let Genode = env:DHALL_GENODE ? ../dhall-genode/package.dhall
|
||||||
|
|
||||||
|
in λ(_ : {})
|
||||||
|
→ { test-signal =
|
||||||
|
Genode.Init.Start.defaults
|
||||||
|
⫽ { binary = "test-signal"
|
||||||
|
, resources = { caps = 500, ram = Genode.units.MiB 10 }
|
||||||
|
, routes = [ Genode.ServiceRoute.parent "Timer" ]
|
||||||
|
}
|
||||||
|
: Genode.Init.Start.Type
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ rec {
|
||||||
name = "signal";
|
name = "signal";
|
||||||
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
|
||||||
|
|
||||||
testConfig = ./signal.xml;
|
testConfig = lib.renderDhallInit ./signal.dhall "{=}";
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
file link -s test-signal ${depot.test-signal}/bin/test-signal
|
file link -s test-signal ${depot.test-signal}/bin/test-signal
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<config>
|
|
||||||
<parent-provides>
|
|
||||||
<service name="ROM"/>
|
|
||||||
<service name="CPU"/>
|
|
||||||
<service name="RM"/>
|
|
||||||
<service name="PD"/>
|
|
||||||
<service name="LOG"/>
|
|
||||||
<service name="Timer"/>
|
|
||||||
</parent-provides>
|
|
||||||
<default-route>
|
|
||||||
<any-service>
|
|
||||||
<parent/>
|
|
||||||
<any-child/>
|
|
||||||
</any-service>
|
|
||||||
</default-route>
|
|
||||||
<default caps="100"/>
|
|
||||||
<start name="test-signal" caps="500">
|
|
||||||
<resource name="RAM" quantum="10M"/>
|
|
||||||
</start>
|
|
||||||
</config>
|
|
Loading…
Reference in New Issue