mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-06 01:11:46 +00:00
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:
parent
c405ec19ce
commit
789d908cee
@ -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 {\<} last_test_result
|
regsub -all {<} $last_test_result {\<} 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
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user