[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