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 previous_results
global previous_time_ms
global previous_succeeded
global previous_failed
global previous_skipped
global skip_test_pkg
global test_pkgs
global single_test_build
@ -466,7 +469,10 @@ proc prepare_to_run_genode { } {
<service name="TRACE"> <parent/> </service>
</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] {
@ -557,8 +563,11 @@ foreach test_pkg $avail_test_pkgs {
}
}
set previous_results ""
set previous_time_ms 0
set previous_results ""
set previous_time_ms 0
set previous_succeeded 0
set previous_failed 0
set previous_skipped 0
prepare_to_run_genode
while {1} {
@ -586,6 +595,7 @@ while {1} {
append previous_results \012
}
append previous_results { } [format {%-31s %-6s %7s} $last_test_pkg "failed " "$timeout.000"] { reboot}
incr previous_failed
# prepare system re-boot
prepare_to_run_genode
@ -609,6 +619,23 @@ while {1} {
set last_test_result ""
regexp {depot_autopilot\] ( [^\033]+)} $output ignored 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 != ""} {
append previous_results \012
}

View File

@ -61,7 +61,10 @@ This is an example configuration of the Depot Autopilot:
! ...
! </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>
!
! <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
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>:
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("");
_state = State::SUCCEEDED;
_state = State::SKIPPED;
char name_padded[32];
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) {
case SUCCEEDED: return "ok ";
case FAILED: return "failed ";
case SKIPPED:;
case UNFINISHED: ;
}
return "?";
}
void Child::conclusion(int &result)
void Child::conclusion(Result &result)
{
struct Bad_state : Exception { };
log(" ", _conclusion);
if (_state != SUCCEEDED) {
result = -1; }
switch (_state) {
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();
}
}
/************
** 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;
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 Event;
class Timeout_event;
@ -147,7 +161,7 @@ class Depot_deploy::Child : public List_model<Child>::Element
* node until the condition is satisfied.
*/
enum Condition { UNCHECKED, SATISFIED, UNSATISFIED };
enum State { UNFINISHED, SUCCEEDED, FAILED };
enum State { UNFINISHED, SUCCEEDED, FAILED, SKIPPED };
bool const _skip;
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 conclusion(int &result);
void conclusion(Result &result);
void event_occured(Event const &event,
unsigned long const time_us);

View File

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

View File

@ -71,7 +71,10 @@
<xs:complexType>
<xs:simpleContent>
<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:simpleContent>
</xs:complexType>

View File

@ -154,9 +154,14 @@ struct Depot_deploy::Main
});
if (finished) {
Result result;
unsigned long previous_time_sec { 0UL };
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 time_ms { time_us / 1000UL };
@ -170,10 +175,11 @@ struct Depot_deploy::Main
log(Cstring(previous_results.content_base(), previous_results.content_size()));
}
}
int result = _children.conclusion();
_children.conclusion(result);
log("");
_env.parent().exit(result);
log(result);
log("");
_env.parent().exit(result.failed ? -1 : 0);
}
/* update query for blueprints of all unconfigured start nodes */