2
0
Fork 0

tests: load binaries from store tarball

Remove linux tests, not compatible with cached_fs_rom.
This commit is contained in:
Emery Hemingway 2020-05-19 16:04:55 +05:30
parent 89408c5315
commit f289a4b88f
8 changed files with 123 additions and 320 deletions

View File

@ -1,142 +0,0 @@
-- SPDX-License-Identifier: CC0-1.0
let Test = ./test.dhall ? env:DHALL_GENODE_TEST
let Genode = Test.Genode
let Prelude = Genode.Prelude
let XML = Prelude.XML
let Init = Genode.Init
let Child = Init.Child
let Resources = Init.Resources
let ServiceRoute = Init.ServiceRoute
let init =
Init::{
, verbose = True
, routes =
[ ServiceRoute.parent "Timer"
, ServiceRoute.child "Block" "block_router"
]
, children =
let blockTest =
Child.flat
Child.Attributes::{
, binary = "test-block-client"
, resources = Resources::{ ram = Genode.units.MiB 5 }
}
in toMap
{ block_device =
Child.flat
Child.Attributes::{
, binary = "ram_block"
, config = Init.Config::{
, attributes = toMap
{ file = "gpt.rom", block_size = "512" }
}
, provides = [ "Block" ]
, resources = Resources::{ ram = Genode.units.MiB 8 }
}
, part_block =
Child.flat
Child.Attributes::{
, binary = "part_block"
, config = Init.Config::{
, attributes = toMap { use_gpt = "yes" }
, content =
Prelude.List.map
Natural
XML.Type
( λ(i : Natural)
→ XML.leaf
{ name = "policy"
, attributes =
let partition =
Prelude.Natural.show (i + 1)
in toMap
{ label_suffix = " ${partition}"
, partition = partition
, writeable = "yes"
}
}
)
(Prelude.Natural.enumerate 128)
# [ XML.leaf
{ name = "report"
, attributes = toMap { partitions = "yes" }
}
]
}
, resources = Resources::{ ram = Genode.units.MiB 10 }
, provides = [ "Block" ]
, routes =
[ ServiceRoute.child "Block" "block_device"
, ServiceRoute.child "Report" "block_router"
]
}
, block_router =
Child.flat
Child.Attributes::{
, binary = "block_router"
, config = Init.Config::{
, content =
[ XML.element
{ name = "policy"
, attributes = toMap
{ label_prefix = "test-part1" }
, content =
[ XML.leaf
{ name = "partition"
, attributes = toMap
{ name = "best partition ever" }
}
, XML.leaf
{ name = "partition"
, attributes = toMap
{ name = "first-test-partition"
, timeout = "2"
}
}
]
}
, XML.element
{ name = "policy"
, attributes = toMap
{ label_prefix = "test-part2" }
, content =
[ XML.leaf
{ name = "partition"
, attributes = toMap
{ type =
"24B69406-18A1-428D-908E-D21A1437122C"
}
}
]
}
]
}
, resources = Resources::{ ram = Genode.units.MiB 10 }
, provides = [ "Block", "Report" ]
, routes =
[ ServiceRoute.parent "Timer"
, ServiceRoute.child "Block" "part_block"
]
}
, test-part1 = blockTest
, test-part2 = blockTest
}
}
in Test::{
, children = Test.initToChildren init
, rom =
Genode.BootModules.toRomPaths
[ { mapKey = "gpt.rom", mapValue = "./gpt.raw" } ]
}

View File

@ -1,20 +0,0 @@
# SPDX-License-Identifier: CC0-1.0
{ testEnv, pkgs, buildPackages, ... }:
with pkgs;
testEnv.mkTest {
name = "block_router";
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
testConfig = ./block_router.dhall;
testInputs =
map pkgs.genodeSources.depot [ "part_block" "ram_block" "test-block" ]
++ [ pkgs.block_router ];
testScript = ''
catch { exec dd if=/dev/zero of=gpt.raw bs=512 count=7168 }
exec ${buildPackages.gptfdisk}/bin/sgdisk -o -n 3:2048:4095 -c 3:first-test-partition -n 31:4096:6143 --typecode=31:24b69406-18a1-428d-908e-d21a1437122c gpt.raw
run_genode_until {Tests finished successfully.*\n.*Tests finished successfully.*\n} 120
'';
}

View File

@ -22,12 +22,6 @@ let
''; '';
}; };
linux =
(call: ((tests call) // { block_router = call ./block_router.nix { }; }))
(import ./driver-linux.nix {
inherit apps addManifest buildPackages lib nixpkgs testPkgs;
}).callTest;
nova = (call: nova = (call:
((tests call) // { ((tests call) // {
driver_manager = call ./driver_manager.nix { }; driver_manager = call ./driver_manager.nix { };
@ -55,7 +49,7 @@ let
}) (builtins.attrValues tests); }) (builtins.attrValues tests);
in with builtins; in with builtins;
listToAttrs ((concatLists (map (testsToList) [ linux hw nova ]))) // { listToAttrs ((concatLists (map (testsToList) [ hw nova ]))) // {
sotest = let sotest = let
hwTests = with hw; [ multi posix x86 ]; hwTests = with hw; [ multi posix x86 ];
novaTests = with nova; [ multi posix x86 vmm ]; novaTests = with nova; [ multi posix x86 vmm ];

View File

@ -40,10 +40,22 @@ let
mkTest = { name ? "unamed", testScript ? defaultScript, testConfig mkTest = { name ? "unamed", testScript ? defaultScript, testConfig
, testInputs ? [ ], testEnv ? { }, qemuArgs ? [ ], ... }@t: , testInputs ? [ ], testEnv ? { }, qemuArgs ? [ ], ... }@t:
let let
manifest = lib.mergeManifests (map addManifest (with testPkgs; storeTarball = buildPackages.runCommand "store" { } ''
[ base-hw-pc sotest-producer ] mkdir -p $out
++ map genodeSources.depot [ "init" "rtc_drv" ] ++ testInputs)); tar cf "$out/store.tar" --absolute-names ${toString testInputs}
testConfig' = "${./test-wrapper.dhall} (${testConfig}) ${manifest}"; '';
storeManifest = lib.mergeManifests (map addManifest testInputs);
manifest = lib.mergeManifests (map addManifest
([ testPkgs.base-hw-pc testPkgs.sotest-producer storeTarball ]
++ map testPkgs.genodeSources.depot [
"init"
"rtc_drv"
"vfs"
"cached_fs_rom"
]));
testConfig' = "${
./test-wrapper.dhall
} (${testConfig}) $(stat --format '%s' ${storeTarball}/store.tar) ${storeManifest} ${manifest}";
testEnv' = { testEnv' = {
DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall"; DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall";
DHALL_GENODE_TEST = "${./test.dhall}"; DHALL_GENODE_TEST = "${./test.dhall}";

View File

@ -1,127 +0,0 @@
# SPDX-License-Identifier: CC0-1.0
{ addManifest, apps, buildPackages, lib, nixpkgs, testPkgs }:
let
testDriver = with buildPackages;
stdenv.mkDerivation {
name = "genode-test-driver";
preferLocalBuild = true;
buildInputs = [ makeWrapper expect ];
dontUnpack = 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:
buildPackages.stdenv.mkDerivation {
name = "linux-" + 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
'';
};
defaultScript =
''run_genode_until {child "init" exited with exit value 0} 120'';
mkTest = { name ? "unamed", testScript ? defaultScript, testConfig
, testInputs ? [ ], env ? { }, ... }:
with testPkgs;
let
manifest = lib.mergeManifests (map addManifest
((with testPkgs; [ base-linux init sotest-producer ] ++ testInputs)));
testConfig' = "${./test-wrapper.dhall} (${testConfig}) ${manifest}";
env' = {
DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall";
DHALL_GENODE_TEST = "${./test.dhall}";
} // env;
build = lib.linuxScript name env' testConfig';
toExports = env:
with builtins;
let
keys = attrNames env;
f = key: ''set env(${key}) "${getAttr key env}"'';
exports = map f keys;
in concatStringsSep "\n" exports;
baseSetup = ''
${toExports env'}
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
exec sh ${build}/script
spawn ./core-linux
wait_for_output $wait_for_re $timeout_value $spawn_id
}
'';
driver = with buildPackages;
runCommand "genode-test-driver-${name}" {
buildInputs = [ makeWrapper expect ];
inherit baseSetup testScript;
preferLocalBuild = true;
testName = name;
} ''
mkdir -p $out/bin
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 testScript=\"\$(cat $out/test-script)\"" \
--run "export baseSetup=\"\$(cat $out/base-setup)\"" \
'';
test = runTests driver;
in test // {
inherit build driver test;
config = lib.runDhallCommand (name + ".dhall") env' ''
${apps.dhall.program} <<< "(${testConfig'}).config" > $out
'';
xml = lib.runDhallCommand (name + ".config") env' ''
${apps.render-init.program} <<< "(${testConfig'}).config" > $out
'';
image = lib.runDhallCommand (name + ".image.elf") env' ''
mkdir -p $out
pushd $out
. ${build}/script
'';
};
in {
callTest = path: args:
(import path ({
testEnv = {
inherit mkTest lib;
isLinux = true;
isNova = false;
};
pkgs = testPkgs;
inherit nixpkgs buildPackages;
} // args));
}

View File

@ -40,10 +40,22 @@ let
mkTest = { name ? "unamed", testScript ? defaultScript, testConfig mkTest = { name ? "unamed", testScript ? defaultScript, testConfig
, testInputs ? [ ], testEnv ? { }, qemuArgs ? [ ], ... }@t: , testInputs ? [ ], testEnv ? { }, qemuArgs ? [ ], ... }@t:
let let
manifest = lib.mergeManifests (map addManifest (with testPkgs; storeTarball = buildPackages.runCommand "store" { } ''
[ base-nova sotest-producer ] mkdir -p $out
++ map genodeSources.depot [ "init" "rtc_drv" ] ++ testInputs)); tar cf "$out/store.tar" --absolute-names ${toString testInputs}
testConfig' = "${./test-wrapper.dhall} (${testConfig}) ${manifest}"; '';
storeManifest = lib.mergeManifests (map addManifest testInputs);
manifest = lib.mergeManifests (map addManifest
([ testPkgs.base-nova testPkgs.sotest-producer storeTarball ]
++ map testPkgs.genodeSources.depot [
"init"
"rtc_drv"
"vfs"
"cached_fs_rom"
]));
testConfig' = "${
./test-wrapper.dhall
} (${testConfig}) $(stat --format '%s' ${storeTarball}/store.tar) ${storeManifest} ${manifest}";
testEnv' = { testEnv' = {
DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall"; DHALL_GENODE = "${testPkgs.dhallGenode}/source.dhall";
DHALL_GENODE_TEST = "${./test.dhall}"; DHALL_GENODE_TEST = "${./test.dhall}";
@ -143,6 +155,11 @@ let
compile = lib.compileBoot name testConfig'; compile = lib.compileBoot name testConfig';
iso = apps.nova-iso.function testEnv' "${testConfig'}"; iso = apps.nova-iso.function testEnv' "${testConfig'}";
store = storeTarball;
xml = buildPackages.runCommand (name + ".config") testEnv'
''${apps.render-init.program} <<< "(${testConfig'}).config" > $out'';
}; };
in { in {

View File

@ -6,7 +6,7 @@ with pkgs;
testEnv.mkTest rec { testEnv.mkTest rec {
name = "posix"; name = "posix";
testConfig = ./posix.dhall; testConfig = ./posix.dhall;
testInputs = map pkgs.genodeSources.depot [ "vfs" "libc" "posix" ] testInputs = map pkgs.genodeSources.depot [ "libc" "posix" ]
++ (with legacyPackages; [ coreutils hello ]); ++ (with legacyPackages; [ coreutils hello ]);
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ]; meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ehmry ];
} }

View File

@ -5,6 +5,8 @@ let Genode = Test.Genode
let Prelude = Genode.Prelude let Prelude = Genode.Prelude
let XML = Prelude.XML
let Init = Genode.Init let Init = Genode.Init
let Child = Init.Child let Child = Init.Child
@ -13,9 +15,32 @@ let TextMapType = Prelude.Map.Type Text
let Children = TextMapType Child.Type let Children = TextMapType Child.Type
let Manifest/Type = TextMapType (TextMapType Text)
let Manifest/toRoutes =
λ(manifest : Manifest/Type)
→ Prelude.List.map
(Prelude.Map.Entry Text Text)
Init.ServiceRoute.Type
( λ(entry : Prelude.Map.Entry Text Text)
→ { service =
{ name = "ROM"
, label = Init.LabelSelector.Type.Last entry.mapKey
}
, route =
Init.Route.Type.Child
{ name = "store_rom", label = Some entry.mapValue }
}
)
( Prelude.List.concat
(Prelude.Map.Entry Text Text)
(Prelude.Map.values Text (Prelude.Map.Type Text Text) manifest)
)
let wrapHarness let wrapHarness
: Children → Child.Type : Children → Manifest/Type → Child.Type
= λ(children : Children) = λ(children : Children)
→ λ(manifest : Manifest/Type)
→ Child.nested → Child.nested
children children
Child.Attributes::{ Child.Attributes::{
@ -23,21 +48,24 @@ let wrapHarness
, exitPropagate = True , exitPropagate = True
, resources = Init.Resources::{ ram = Genode.units.MiB 4 } , resources = Init.Resources::{ ram = Genode.units.MiB 4 }
, routes = , routes =
[ Init.ServiceRoute.parentLabel [ Init.ServiceRoute.parentLabel
"LOG" "LOG"
(Some "SOTEST") (Some "SOTEST")
(Some "unlabeled") (Some "unlabeled")
, Init.ServiceRoute.parent "IO_MEM" , Init.ServiceRoute.parent "IO_MEM"
, Init.ServiceRoute.parent "IO_PORT" , Init.ServiceRoute.parent "IO_PORT"
, Init.ServiceRoute.parent "IRQ" , Init.ServiceRoute.parent "IRQ"
, Init.ServiceRoute.parent "VM" , Init.ServiceRoute.parent "VM"
, Init.ServiceRoute.child "Timer" "timer" , Init.ServiceRoute.child "Timer" "timer"
, Init.ServiceRoute.child "Rtc" "rtc" , Init.ServiceRoute.child "Rtc" "rtc"
] ]
# Manifest/toRoutes manifest
} }
in λ(test : Test.Type) in λ(test : Test.Type)
→ λ(inputsManifest : TextMapType (TextMapType Text)) → λ(storeSize : Natural)
→ λ(storeManifest : Manifest/Type)
→ λ(bootManifest : Manifest/Type)
→ Genode.Boot::{ → Genode.Boot::{
, config = Init::{ , config = Init::{
, children = , children =
@ -58,7 +86,48 @@ in λ(test : Test.Type)
, routes = [ Init.ServiceRoute.parent "IO_PORT" ] , routes = [ Init.ServiceRoute.parent "IO_PORT" ]
} }
} }
, { mapKey = "harness", mapValue = wrapHarness test.children } , { mapKey = "store_fs"
, mapValue =
Child.flat
Child.Attributes::{
, binary = "vfs"
, config = Init.Config::{
, content =
[ XML.element
{ name = "vfs"
, attributes = XML.emptyAttributes
, content =
[ XML.leaf
{ name = "tar"
, attributes = toMap { name = "store.tar" }
}
]
}
, XML.leaf
{ name = "default-policy"
, attributes = toMap { root = "/", writeable = "no" }
}
]
}
, provides = [ "File_system" ]
}
}
, { mapKey = "store_rom"
, mapValue =
Child.flat
Child.Attributes::{
, binary = "cached_fs_rom"
, provides = [ "ROM" ]
, resources = Init.Resources::{
, ram = storeSize + Genode.units.MiB 1
}
, routes =
[ Init.ServiceRoute.child "File_system" "store_fs" ]
}
}
, { mapKey = "harness"
, mapValue = wrapHarness test.children storeManifest
}
] ]
} }
, rom = , rom =
@ -69,7 +138,7 @@ in λ(test : Test.Type)
( Prelude.Map.values ( Prelude.Map.values
Text Text
(Prelude.Map.Type Text Text) (Prelude.Map.Type Text Text)
inputsManifest bootManifest
) )
) )
} }