depot_autopilot: show result statistic

Print a line like "succeeded: 35 failed: 11 skipped: 2" below the list of test
results. Adds further attributes to <previous-results> to communicate also the
previous statistics.
This commit is contained in:
Martin Stein 2018-11-19 14:04:55 +01:00 committed by Christian Helmuth
parent c405ec19ce
commit 789d908cee
7 changed files with 94 additions and 18 deletions

View File

@ -323,6 +323,9 @@ proc prepare_to_run_genode { } {
global qemu_args global qemu_args
global previous_results global previous_results
global previous_time_ms global previous_time_ms
global previous_succeeded
global previous_failed
global previous_skipped
global skip_test_pkg global skip_test_pkg
global test_pkgs global test_pkgs
global single_test_build global single_test_build
@ -466,7 +469,10 @@ proc prepare_to_run_genode { } {
<service name="TRACE"> <parent/> </service> <service name="TRACE"> <parent/> </service>
</common_routes> </common_routes>
<previous-results time_sec="} [expr ($previous_time_ms + 999) / 1000] {">} $previous_results {</previous-results> <previous-results time_sec="} [expr ($previous_time_ms + 999) / 1000] {"
succeeded="} $previous_succeeded {"
skipped="} $previous_skipped {"
failed="} $previous_failed {">} $previous_results {</previous-results>
} [test_pkgs_start_nodes] { } [test_pkgs_start_nodes] {
@ -559,6 +565,9 @@ foreach test_pkg $avail_test_pkgs {
set previous_results "" set previous_results ""
set previous_time_ms 0 set previous_time_ms 0
set previous_succeeded 0
set previous_failed 0
set previous_skipped 0
prepare_to_run_genode prepare_to_run_genode
while {1} { while {1} {
@ -586,6 +595,7 @@ while {1} {
append previous_results \012 append previous_results \012
} }
append previous_results { } [format {%-31s %-6s %7s} $last_test_pkg "failed " "$timeout.000"] { reboot} append previous_results { } [format {%-31s %-6s %7s} $last_test_pkg "failed " "$timeout.000"] { reboot}
incr previous_failed
# prepare system re-boot # prepare system re-boot
prepare_to_run_genode prepare_to_run_genode
@ -609,6 +619,23 @@ while {1} {
set last_test_result "" set last_test_result ""
regexp {depot_autopilot\] ( [^\033]+)} $output ignored last_test_result regexp {depot_autopilot\] ( [^\033]+)} $output ignored last_test_result
regsub -all {<} $last_test_result {\&lt;} last_test_result regsub -all {<} $last_test_result {\&lt;} last_test_result
set failed_off [string first " failed" $last_test_result]
set skipped_off [string first " skipped" $last_test_result]
set ok_off [string first " ok" $last_test_result]
if {$failed_off > 0 && ($skipped_off < 0 || $failed_off < $skipped_off) && ($ok_off < 0 || $failed_off < $ok_off)} {
incr previous_failed
} elseif {$skipped_off > 0 && ($ok_off < 0 || $skipped_off < $ok_off)} {
incr previous_skipped
} elseif {$ok_off > 0} {
incr previous_succeeded
} else {
puts "Error: malformed test result"
puts $last_test_result
exit -1
}
if {$previous_results != ""} { if {$previous_results != ""} {
append previous_results \012 append previous_results \012
} }

View File

@ -61,7 +61,10 @@ This is an example configuration of the Depot Autopilot:
! ... ! ...
! </common_routes> ! </common_routes>
! !
! <previous-results time_sec="3"> test-rm_fault_no_nox skipped ! <previous-results time_sec="3"
! succeeded="0"
! skipped="1"
! failed="1"> test-rm_fault_no_nox skipped
! test-rm_nested failed 0.653 log "Error: "</previous-results> ! test-rm_nested failed 0.653 log "Error: "</previous-results>
! !
! <start name="test-mmio" pkg="genodelabs/pkg/test-mmio/2018-10-30"/> ! <start name="test-mmio" pkg="genodelabs/pkg/test-mmio/2018-10-30"/>
@ -114,6 +117,14 @@ This is an example configuration of the Depot Autopilot:
Contains a time in seconds that shall be added to the total time shown in Contains a time in seconds that shall be added to the total time shown in
header of the overview. header of the overview.
:<config><previous-results succeeded>:
:<config><previous-results failed>:
:<config><previous-results skipped>:
A non-negative number that denotes how many tests are already
succeeded/failed/skipped. The number is added to the number of
succeeded/failed/skipped tests in the result overview.
:<config><start>: :<config><start>:
Each <start> node stands for a test that shall be evaluated by the Autopilot. Each <start> node stands for a test that shall be evaluated by the Autopilot.

View File

@ -50,7 +50,7 @@ void Child::gen_start_node(Xml_generator &xml,
log("--- Run \"", _name, "\" (max 1 sec) ---"); log("--- Run \"", _name, "\" (max 1 sec) ---");
log(""); log("");
_state = State::SUCCEEDED; _state = State::SKIPPED;
char name_padded[32]; char name_padded[32];
for (size_t i = 0; i < sizeof(name_padded) - 1; name_padded[i++] = ' '); for (size_t i = 0; i < sizeof(name_padded) - 1; name_padded[i++] = ' ');
@ -677,17 +677,23 @@ Child::State_name Child::_padded_state_name() const
switch (_state) { switch (_state) {
case SUCCEEDED: return "ok "; case SUCCEEDED: return "ok ";
case FAILED: return "failed "; case FAILED: return "failed ";
case SKIPPED:;
case UNFINISHED: ; case UNFINISHED: ;
} }
return "?"; return "?";
} }
void Child::conclusion(int &result) void Child::conclusion(Result &result)
{ {
struct Bad_state : Exception { };
log(" ", _conclusion); log(" ", _conclusion);
if (_state != SUCCEEDED) { switch (_state) {
result = -1; } case SUCCEEDED: result.succeeded++; break;
case FAILED: result.failed++; break;
case SKIPPED: result.skipped++; break;
default: throw Bad_state();
}
} }
@ -891,3 +897,14 @@ Event::Event(Xml_node const &node,
throw Invalid(); throw Invalid();
} }
} }
/************
** Result **
************/
void Result::print(Output &output) const
{
Genode::print(output, "succeeded: ", succeeded, " failed: ", failed,
" skipped: ", skipped);
}

View File

@ -31,6 +31,20 @@ namespace Depot_deploy {
using namespace Depot; using namespace Depot;
struct Result
{
Genode::size_t failed { 0 };
Genode::size_t succeeded { 0 };
Genode::size_t skipped { 0 };
/*********
** log **
*********/
void print(Genode::Output &output) const;
};
class Child; class Child;
class Event; class Event;
class Timeout_event; class Timeout_event;
@ -147,7 +161,7 @@ class Depot_deploy::Child : public List_model<Child>::Element
* node until the condition is satisfied. * node until the condition is satisfied.
*/ */
enum Condition { UNCHECKED, SATISFIED, UNSATISFIED }; enum Condition { UNCHECKED, SATISFIED, UNSATISFIED };
enum State { UNFINISHED, SUCCEEDED, FAILED }; enum State { UNFINISHED, SUCCEEDED, FAILED, SKIPPED };
bool const _skip; bool const _skip;
Allocator &_alloc; Allocator &_alloc;
@ -209,7 +223,7 @@ class Depot_deploy::Child : public List_model<Child>::Element
void log_session_write(Log_event::Line const &log_line); void log_session_write(Log_event::Line const &log_line);
void conclusion(int &result); void conclusion(Result &result);
void event_occured(Event const &event, void event_occured(Event const &event,
unsigned long const time_us); unsigned long const time_us);

View File

@ -158,13 +158,11 @@ class Depot_deploy::Children
return finished; return finished;
} }
int conclusion() void conclusion(Result &result)
{ {
int result = 0;
_children.for_each([&] (Child &child) { _children.for_each([&] (Child &child) {
child.conclusion(result); child.conclusion(result);
}); });
return result;
} }
void gen_queries(Xml_generator &xml) void gen_queries(Xml_generator &xml)

View File

@ -72,6 +72,9 @@
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:string"> <xs:extension base="xs:string">
<xs:attribute name="time_sec" type="Seconds" /> <xs:attribute name="time_sec" type="Seconds" />
<xs:attribute name="succeeded" type="xs:nonNegativeInteger" />
<xs:attribute name="failed" type="xs:nonNegativeInteger" />
<xs:attribute name="skipped" type="xs:nonNegativeInteger" />
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>

View File

@ -154,9 +154,14 @@ struct Depot_deploy::Main
}); });
if (finished) { if (finished) {
Result result;
unsigned long previous_time_sec { 0UL }; unsigned long previous_time_sec { 0UL };
if (config.has_sub_node("previous-results")) { if (config.has_sub_node("previous-results")) {
previous_time_sec += config.sub_node("previous-results").attribute_value("time_sec", 0UL); Xml_node const previous_results = config.sub_node("previous-results");
previous_time_sec += previous_results.attribute_value("time_sec", 0UL);
result.succeeded += previous_results.attribute_value("succeeded", 0UL);
result.failed += previous_results.attribute_value("failed", 0UL);
result.skipped += previous_results.attribute_value("skipped", 0UL);
} }
unsigned long const time_us { _timer.curr_time().trunc_to_plain_us().value }; unsigned long const time_us { _timer.curr_time().trunc_to_plain_us().value };
unsigned long time_ms { time_us / 1000UL }; unsigned long time_ms { time_us / 1000UL };
@ -170,10 +175,11 @@ struct Depot_deploy::Main
log(Cstring(previous_results.content_base(), previous_results.content_size())); log(Cstring(previous_results.content_base(), previous_results.content_size()));
} }
} }
int result = _children.conclusion(); _children.conclusion(result);
log(""); log("");
_env.parent().exit(result); log(result);
log("");
_env.parent().exit(result.failed ? -1 : 0);
} }
/* update query for blueprints of all unconfigured start nodes */ /* update query for blueprints of all unconfigured start nodes */