From 72d04b8453bf74b1fcd73f898c13398db4abc381 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Fri, 18 Mar 2016 21:46:54 +0100 Subject: lib: Add igt_subtest_group Useful for creating common setup code in igt_fixture which is only needed by a subset of tests. And since I'm a good citizen it comes with a library testcase/example included. v2: Make testcase nastier to ensure a subtest group SKIPS when it's parent is skipping already. I accidentally got this right, but let's make sure. Signed-off-by: Daniel Vetter --- lib/igt_core.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'lib/igt_core.h') diff --git a/lib/igt_core.h b/lib/igt_core.h index 124ae0d9..b3fa7356 100644 --- a/lib/igt_core.h +++ b/lib/igt_core.h @@ -197,6 +197,30 @@ bool __igt_run_subtest(const char *subtest_name); const char *igt_subtest_name(void); bool igt_only_list_subtests(void); +void __igt_subtest_group_save(int *); +void __igt_subtest_group_restore(int); +/** + * igt_subtest_group: + * + * Group a set of subtests together with their common setup code + * + * Testcase with subtests often need to set up a bunch of shared state as the + * common test fixture. But if there are multiple with different requirements + * the commont setup code can't be extracted, since a test condition failure in + * e.g. igt_require() would result in all subsequent tests skipping. Even those + * from a different group. + * + * This macro allows to group together a set of #igt_fixture and #igt_subtest + * clauses. If any common setup in a fixture fails, only the subtests in this + * group will fail or skip. Subtest groups can be arbitrarily nested. + */ +#define igt_subtest_group for (int igt_tokencat(__tmpint,__LINE__) = 0, \ + igt_tokencat(__save,__LINE__) = 0; \ + igt_tokencat(__tmpint,__LINE__) < 1 && \ + (__igt_subtest_group_save(& igt_tokencat(__save,__LINE__) ), true); \ + igt_tokencat(__tmpint,__LINE__) ++, \ + __igt_subtest_group_restore(igt_tokencat(__save,__LINE__) )) + /** * igt_main: * -- cgit v1.2.3