diff --git a/lib/drmtest.c b/lib/drmtest.c index ac254ab8..f08392af 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -620,6 +620,8 @@ off_t prime_get_size(int dma_buf_fd) } /* signal interrupt helpers */ +static bool igt_only_list_subtests(void); + static pid_t signal_helper = -1; long long int sig_stat; static void __attribute__((noreturn)) signal_helper_process(pid_t pid) @@ -687,9 +689,28 @@ void igt_stop_signal_helper(void) static bool list_subtests = false; static char *run_single_subtest = NULL; static const char *in_subtest = NULL; +static bool in_fixture = false; static bool test_with_subtests = false; static bool skip_subtests_henceforth = false; +bool __igt_fixture(void) +{ + if (igt_only_list_subtests()) + return false; + + if (skip_subtests_henceforth) + return false; + + in_fixture = true; + return true; +} + +void __igt_fixture_end(void) +{ + in_fixture = false; + longjmp(igt_subtest_jmpbuf, 1); +} + void igt_subtest_init(int argc, char **argv) { int c, option_index = 0; @@ -730,6 +751,7 @@ out: bool __igt_run_subtest(const char *subtest_name) { assert(!in_subtest); + assert(!in_fixture); if (list_subtests) { printf("%s\n", subtest_name); @@ -756,7 +778,7 @@ const char *igt_subtest_name(void) return in_subtest; } -bool igt_only_list_subtests(void) +static bool igt_only_list_subtests(void) { return list_subtests; } @@ -777,12 +799,16 @@ static void exit_subtest(const char *result) void igt_skip(void) { skipped_one = true; - if (in_subtest) + + if (in_subtest) { exit_subtest("SKIP"); - else if (test_with_subtests) + } else if (test_with_subtests) { skip_subtests_henceforth = true; - else + if (in_fixture) + __igt_fixture_end(); + } else { exit(77); + } } void __igt_skip_check(const char *file, const int line, diff --git a/lib/drmtest.h b/lib/drmtest.h index 7a36a480..c4e90683 100644 --- a/lib/drmtest.h +++ b/lib/drmtest.h @@ -123,7 +123,6 @@ bool __igt_run_subtest(const char *subtest_name); (setjmp(igt_subtest_jmpbuf) == 0); \ igt_success()) const char *igt_subtest_name(void); -bool igt_only_list_subtests(void); /** * igt_skip - subtest aware test skipping * @@ -176,6 +175,8 @@ void igt_exit(void) __attribute__((noreturn)); */ #define igt_require(expr) do { if (!(expr)) __igt_skip_check(__FILE__, __LINE__, __func__, #expr ); } while (0) +bool __igt_fixture(void); +void __igt_fixture_end(void) __attribute__((noreturn)); /** * igt_fixture - annote global test fixture code * @@ -184,7 +185,9 @@ void igt_exit(void) __attribute__((noreturn)); * enumeration (e.g. when enumerating on systemes without an intel gpu) such * blocks should be annotated with igt_fixture. */ -#define igt_fixture if (!igt_only_list_subtests()) +#define igt_fixture for (; __igt_fixture() && \ + (setjmp(igt_subtest_jmpbuf) == 0); \ + __igt_fixture_end()) /* check functions which auto-skip tests by calling igt_skip() */ void gem_require_caching(int fd);