summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Latvala <petri.latvala@intel.com>2017-03-10 16:20:33 +0200
committerPetri Latvala <petri.latvala@intel.com>2017-03-13 15:55:37 +0200
commit7ab5c97924bf971a348ff4a1768da624ba2f564c (patch)
tree0b1a994ffdb3e16b87a78f40b92cddbb72914ab2
parent5ca0da9f53023b9fcfd327a5f43bc7b0916b24b1 (diff)
Always expose IGT subtests for known kernel selftests
Even when the running kernel does not support selftests, make subtest enumeration list known kselftests. The list is generated using selftest listing headers copied from the kernel. If the running kernel gains new selftest subtests, they are listed even without copying the headers over and rebuilding IGT. v2: Use correct names for the testcases Signed-off-by: Petri Latvala <petri.latvala@intel.com>
-rw-r--r--lib/igt_kmod.c52
-rw-r--r--lib/igt_kmod.h8
-rw-r--r--tests/drm_mm.c17
-rw-r--r--tests/drv_selftest.c25
4 files changed, 84 insertions, 18 deletions
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index 4b8ea81a..86b78967 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -493,30 +493,54 @@ void igt_kselftest_fini(struct igt_kselftest *tst)
kmod_module_unref(tst->kmod);
}
+static void mocklist_mark_entry(struct igt_kselftest_mockentry *mocklist,
+ const char *name)
+{
+ struct igt_kselftest_mockentry *me;
+
+ for (me = mocklist; me->name != NULL; ++me) {
+ if (!strcmp(me->name, name)) {
+ me->do_mock = false;
+ return;
+ }
+ }
+}
+
void igt_kselftests(const char *module_name,
const char *options,
const char *result,
- const char *filter)
+ const char *filter,
+ struct igt_kselftest_mockentry *mocklist)
{
struct igt_kselftest tst;
IGT_LIST(tests);
struct igt_kselftest_list *tl, *tn;
+ struct igt_kselftest_mockentry *me;
- igt_require(igt_kselftest_init(&tst, module_name) == 0);
- igt_fixture
- igt_require(igt_kselftest_begin(&tst) == 0);
+ if (igt_kselftest_init(&tst, module_name) == 0) {
+ igt_fixture
+ igt_require(igt_kselftest_begin(&tst) == 0);
- igt_kselftest_get_tests(tst.kmod, filter, &tests);
- igt_list_for_each_safe(tl, tn, &tests, link) {
- igt_subtest_f("%s", tl->name)
- igt_kselftest_execute(&tst, tl, options, result);
- free(tl);
- }
+ igt_kselftest_get_tests(tst.kmod, filter, &tests);
+ igt_list_for_each_safe(tl, tn, &tests, link) {
+ igt_subtest_f("%s", tl->name)
+ igt_kselftest_execute(&tst, tl, options, result);
+ mocklist_mark_entry(mocklist, tl->name);
+ free(tl);
+ }
- igt_fixture {
- igt_kselftest_end(&tst);
- igt_require(!igt_list_empty(&tests));
+ igt_fixture {
+ igt_kselftest_end(&tst);
+ igt_require(!igt_list_empty(&tests));
+ }
+
+ igt_kselftest_fini(&tst);
}
- igt_kselftest_fini(&tst);
+ /* Expose subtests for anything the above didn't already generate. */
+ for (me = mocklist; me->name != NULL; ++me) {
+ if (me->do_mock)
+ igt_subtest(me->name)
+ igt_skip("Kernel selftest not present");
+ }
}
diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
index 10cd3a2d..d49e9d42 100644
--- a/lib/igt_kmod.h
+++ b/lib/igt_kmod.h
@@ -35,10 +35,16 @@ int igt_kmod_unload(const char *mod_name, unsigned int flags);
int igt_i915_driver_load(const char *opts);
int igt_i915_driver_unload(void);
+struct igt_kselftest_mockentry {
+ const char *name;
+ bool do_mock;
+};
+
void igt_kselftests(const char *module_name,
const char *module_options,
const char *result_option,
- const char *filter);
+ const char *filter,
+ struct igt_kselftest_mockentry* mocklist);
struct igt_kselftest {
struct kmod_module *kmod;
diff --git a/tests/drm_mm.c b/tests/drm_mm.c
index 2052b115..2a3212e8 100644
--- a/tests/drm_mm.c
+++ b/tests/drm_mm.c
@@ -28,5 +28,20 @@ IGT_TEST_DESCRIPTION("Basic sanity check of DRM's range manager (struct drm_mm)"
igt_main
{
- igt_kselftests("test-drm_mm", NULL, NULL, NULL);
+ /*
+ * Set of subtest names that are always exposed by IGT,
+ * regardless of the running kernel's capabilities. Selftests
+ * that the kernel has but are not on these lists are also
+ * exposed. This is a known intentional violation of the
+ * general rule that subtest enumeration must not change
+ * depending on the runtime environment.
+ */
+ struct igt_kselftest_mockentry drm_mm_testlist[] = {
+#define selftest(n, x) { .name = #n, .do_mock = true },
+#include "drm_mm_selftests.h"
+#undef selftest
+ { NULL, false }
+ };
+
+ igt_kselftests("test-drm_mm", NULL, NULL, NULL, drm_mm_testlist);
}
diff --git a/tests/drv_selftest.c b/tests/drv_selftest.c
index 96dd8bf1..d9b58d50 100644
--- a/tests/drv_selftest.c
+++ b/tests/drv_selftest.c
@@ -28,6 +28,27 @@ IGT_TEST_DESCRIPTION("Basic unit tests for i915.ko");
igt_main
{
- igt_kselftests("i915", "mock_selftests=-1", NULL, "mock");
- igt_kselftests("i915", "live_selftests=-1", "live_selftests", "live");
+ /*
+ * Set of subtest names that are always exposed by IGT,
+ * regardless of the running kernel's capabilities. Selftests
+ * that the kernel has but are not on these lists are also
+ * exposed. This is a known intentional violation of the
+ * general rule that subtest enumeration must not change
+ * depending on the runtime environment.
+ */
+ struct igt_kselftest_mockentry i915_mock_testlist[] = {
+#define selftest(n, x) { .name = "mock_" #n, .do_mock = true },
+#include "i915_mock_selftests.h"
+#undef selftest
+ { NULL, false }
+ };
+ struct igt_kselftest_mockentry i915_live_testlist[] = {
+#define selftest(n, x) { .name = "live_" #n, .do_mock = true },
+#include "i915_live_selftests.h"
+#undef selftest
+ { NULL, false }
+ };
+
+ igt_kselftests("i915", "mock_selftests=-1", NULL, "mock", i915_mock_testlist);
+ igt_kselftests("i915", "live_selftests=-1", "live_selftests", "live", i915_live_testlist);
}