genode/repos/os/src/test/fs_report/main.cc

134 lines
3.4 KiB
C++

/*
* \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 <base/log.h>
#include <base/component.h>
#include <base/attached_rom_dataspace.h>
#include <os/reporter.h>
#include <timer_session/connection.h>
namespace Test {
struct Main;
using namespace Genode;
}
struct Test::Main
{
Env &_env;
Timer::Connection _timer { _env };
Constructible<Reporter> _devices_reporter;
Constructible<Reporter> _focus_reporter;
typedef String<80> Version;
void _report(Reporter &reporter, Version const &version)
{
Reporter::Xml_generator xml(reporter, [&] () {
xml.attribute("version", version); });
}
Constructible<Attached_rom_dataspace> _devices_rom;
Constructible<Attached_rom_dataspace> _focus_rom;
Signal_handler<Main> _devices_rom_update_handler {
_env.ep(), *this, &Main::_handle_devices_rom_update };
Signal_handler<Main> _focus_rom_update_handler {
_env.ep(), *this, &Main::_handle_focus_rom_update };
Constructible<Timer::One_shot_timeout<Main> > _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); }