[igt-dev] [PATCH i-g-t 1/2] lib: Defer application of igt_fixture results
Chris Wilson
chris at chris-wilson.co.uk
Wed Nov 28 22:52:30 UTC 2018
If an igt_fixture causes an independent subgroup to fail/skip and that
subgroup is not part of the execution set (--run-subtest) as no subtests
themselves failed or skipped, it should not count towards the overall
test exitcode.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108891
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
lib/igt_core.c | 57 ++++++++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/lib/igt_core.c b/lib/igt_core.c
index 64883d640..1d47e171f 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -291,6 +291,10 @@ enum {
static int igt_exitcode = IGT_EXIT_SUCCESS;
static const char *command_str;
+static bool skipped_one = false;
+static bool succeeded_one = false;
+static bool failed_one = false;
+
static char* igt_log_domain_filter;
static struct {
char *entries[256];
@@ -919,15 +923,28 @@ bool __igt_run_subtest(const char *subtest_name)
}
if (skip_subtests_henceforth) {
+ const char *result;
+
+ if (skip_subtests_henceforth == FAIL) {
+ if (!failed_one) {
+ igt_exitcode = FAIL;
+ failed_one = true;
+ }
+ result = "FAIL";
+ } else {
+ skipped_one = true;
+ result = "SKIP";
+ }
+
printf("%sSubtest %s: %s%s\n",
- (!__igt_plain_output) ? "\x1b[1m" : "", subtest_name,
- skip_subtests_henceforth == SKIP ?
- "SKIP" : "FAIL", (!__igt_plain_output) ? "\x1b[0m" : "");
+ !__igt_plain_output ? "\x1b[1m" : "",
+ subtest_name, result,
+ !__igt_plain_output ? "\x1b[0m" : "");
fflush(stdout);
if (stderr_needs_sentinel)
- fprintf(stderr, "Subtest %s: %s\n", subtest_name,
- skip_subtests_henceforth == SKIP ?
- "SKIP" : "FAIL");
+ fprintf(stderr, "Subtest %s: %s\n",
+ subtest_name, result);
+
return false;
}
@@ -976,10 +993,6 @@ void __igt_subtest_group_restore(int save)
skip_subtests_henceforth = save;
}
-static bool skipped_one = false;
-static bool succeeded_one = false;
-static bool failed_one = false;
-
static void exit_subtest(const char *) __attribute__((noreturn));
static void exit_subtest(const char *result)
{
@@ -1018,7 +1031,6 @@ static void exit_subtest(const char *result)
void igt_skip(const char *f, ...)
{
va_list args;
- skipped_one = true;
assert(!test_child);
@@ -1029,6 +1041,7 @@ void igt_skip(const char *f, ...)
}
if (in_subtest) {
+ skipped_one = true;
exit_subtest("SKIP");
} else if (test_with_subtests) {
skip_subtests_henceforth = SKIP;
@@ -1116,11 +1129,6 @@ void igt_fail(int exitcode)
if (in_atexit_handler)
_exit(IGT_EXIT_FAILURE);
- if (!failed_one)
- igt_exitcode = exitcode;
-
- failed_one = true;
-
/* Silent exit, parent will do the yelling. */
if (test_child)
exit(exitcode);
@@ -1128,18 +1136,21 @@ void igt_fail(int exitcode)
_igt_log_buffer_dump();
if (in_subtest) {
+ if (!failed_one) {
+ igt_exitcode = exitcode;
+ failed_one = true;
+ }
+
if (exitcode == IGT_EXIT_TIMEOUT)
exit_subtest("TIMEOUT");
else
exit_subtest("FAIL");
+ } else if (test_with_subtests) {
+ skip_subtests_henceforth = FAIL;
+ assert(in_fixture);
+ __igt_fixture_end();
} else {
- assert(igt_can_fail());
-
- if (in_fixture) {
- skip_subtests_henceforth = FAIL;
- __igt_fixture_end();
- }
-
+ igt_exitcode = exitcode;
igt_exit();
}
}
--
2.20.0.rc1
More information about the igt-dev
mailing list