From 7d12d7a78f66b3d2b3d179fe461a8f5be1ba2e5d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 28 Jun 2017 14:20:48 +0200 Subject: [PATCH] fs_report.run: replace test with dedicated program The new version of the test exercises the combination of fs_report with ram_fs and fs_rom as a more flexible alternative to report_rom. It covers two corner cases that remained unaddressed by fs_rom and ram_fs so far: First, the late installation of a ROM-update signal handler at fs_rom right before the content of the file is modified. Second, the case where the requested file is not present on the file system at the creation time of the ROM session. Here, the ram_fs missed to inform listeners for the compound directory about the later created file. --- repos/os/run/fs_report.run | 86 +++++++---------- repos/os/src/test/fs_report/main.cc | 133 ++++++++++++++++++++++++++ repos/os/src/test/fs_report/target.mk | 4 + tool/autopilot.list | 1 + 4 files changed, 175 insertions(+), 49 deletions(-) create mode 100644 repos/os/src/test/fs_report/main.cc create mode 100644 repos/os/src/test/fs_report/target.mk diff --git a/repos/os/run/fs_report.run b/repos/os/run/fs_report.run index 4e5341d6c3..a7469fe927 100644 --- a/repos/os/run/fs_report.run +++ b/repos/os/run/fs_report.run @@ -2,10 +2,8 @@ # Build # set build_components { - core init - drivers/timer - server/fs_report - server/vfs + core init drivers/timer + server/fs_report server/fs_rom server/ram_fs test/fs_report } build $build_components @@ -18,67 +16,61 @@ create_boot_directory append config { - + - + - - + - + - - + - - + + + + + + + + + + - - - + - - - - - - - - - - - - - - - - - - - - + - - - - + + - - + + + + + + + + + + } @@ -87,17 +79,13 @@ install_config $config # # Boot modules # - -# generic modules set boot_modules { - core ld.lib.so init - fs_report - timer - vfs + core ld.lib.so init timer + fs_report fs_rom ram_fs test-fs_report } build_boot_image $boot_modules append qemu_args " -nographic" -run_genode_until {.*.*} 20 +run_genode_until {child "test-fs_report" exited with exit value 0.*\n} 30 diff --git a/repos/os/src/test/fs_report/main.cc b/repos/os/src/test/fs_report/main.cc new file mode 100644 index 0000000000..49c6464e6a --- /dev/null +++ b/repos/os/src/test/fs_report/main.cc @@ -0,0 +1,133 @@ +/* + * \brief Test for combining ram_fs, fs_rom, and fs_report + * \author Norman Feske + * \date 2017-06-28 + */ + +/* + * Copyright (C) 2017 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#include +#include +#include +#include +#include + + +namespace Test { + struct Main; + using namespace Genode; +} + + +struct Test::Main +{ + Env &_env; + + Timer::Connection _timer { _env }; + + Constructible _devices_reporter; + Constructible _focus_reporter; + + typedef String<80> Version; + + void _report(Reporter &reporter, Version const &version) + { + Reporter::Xml_generator xml(reporter, [&] () { + xml.attribute("version", version); }); + } + + Constructible _devices_rom; + Constructible _focus_rom; + + Signal_handler
_devices_rom_update_handler { + _env.ep(), *this, &Main::_handle_devices_rom_update }; + + Signal_handler
_focus_rom_update_handler { + _env.ep(), *this, &Main::_handle_focus_rom_update }; + + Constructible > _one_shot_timeout; + + void _handle_init() + { + log("(1) check initial content of \"devices\" ROM"); + _devices_rom.construct(_env, "devices"); + if (_devices_rom->xml().attribute_value("version", Version()) != "initial") { + error("ROM does not contain expected initial conent"); + throw Exception(); + } + + log("(2) issue new \"devices\" report before installing a ROM signal handler"); + _devices_reporter.construct(_env, "devices"); + _devices_reporter->enabled(true); + _report(*_devices_reporter, "version 2"); + + log("(3) wait a bit to let the report reach the RAM fs"); + _one_shot_timeout.construct(_timer, *this, &Main::_handle_timer_1); + _one_shot_timeout->schedule(Microseconds(500*1000)); + } + + void _handle_timer_1(Duration) + { + log("(4) install ROM signal handler, is expected to trigger immediately"); + + _devices_rom->sigh(_devices_rom_update_handler); + } + + void _handle_devices_rom_update() + { + log("(5) received ROM update as expected"); + + _devices_rom->update(); + if (_devices_rom->xml().attribute_value("version", Version()) != "version 2") { + error("unexpected content of \"devices\" ROM after update"); + throw Exception(); + } + + log("(6) request not-yet-available \"focus\" ROM"); + + _focus_rom.construct(_env, "focus"); + _focus_rom->sigh(_focus_rom_update_handler); + + log("(7) wait a bit until generating the focus report"); + _one_shot_timeout.construct(_timer, *this, &Main::_handle_timer_2); + _one_shot_timeout->schedule(Microseconds(500*1000)); + } + + void _handle_timer_2(Duration) + { + log("(8) generate \"focus\" report, is expected to trigger ROM notification"); + _focus_reporter.construct(_env, "focus"); + _focus_reporter->enabled(true); + _report(*_focus_reporter, "focus version 1"); + } + + void _handle_focus_rom_update() + { + _focus_rom->update(); + + if (_focus_rom->xml().attribute_value("version", Version()) != "focus version 1") { + error("unexpected content of \"focus\" ROM"); + throw Exception(); + } + + log("(9) received expected focus ROM content"); + + /* test completed successfully */ + _env.parent().exit(0); + } + + Main(Env &env) : _env(env) + { + log("--- test-fs_report started ---"); + + _handle_init(); + } +}; + + +void Component::construct(Genode::Env &env) { static Test::Main main(env); } diff --git a/repos/os/src/test/fs_report/target.mk b/repos/os/src/test/fs_report/target.mk new file mode 100644 index 0000000000..38a2e99079 --- /dev/null +++ b/repos/os/src/test/fs_report/target.mk @@ -0,0 +1,4 @@ +TARGET = test-fs_report +SRC_CC = main.cc +LIBS = base + diff --git a/tool/autopilot.list b/tool/autopilot.list index bfcae085dd..6a1a381cff 100644 --- a/tool/autopilot.list +++ b/tool/autopilot.list @@ -105,3 +105,4 @@ init nic_dump slab ada +fs_report