[Intel-gfx] [PATCH i-g-t v4] lib/tests/igt_segfault Add unit test to test segfault handling
Morton, Derek J
derek.j.morton at intel.com
Fri Jun 12 03:08:43 PDT 2015
This is the same as the previously submitted patch except the text encoding should (hopefully) now be correct.
//Derek
>
>
>-----Original Message-----
>From: Morton, Derek J
>Sent: Friday, June 12, 2015 11:05 AM
>To: intel-gfx at lists.freedesktop.org
>Cc: Wood, Thomas; daniel at ffwll.ch; Morton, Derek J
>Subject: [PATCH i-g-t v4] lib/tests/igt_segfault Add unit test to test segfault handling
>
>Unit test to check a segfaulting subtest is handled correctly.
>
>v2: Added script to check subtest results
>v3: Removed script. Updated test to use fork to monitor return status.
>v4: Added igt_segfault to .gitignore
>
>Signed-off-by: Derek Morton <derek.j.morton at intel.com>
>---
> lib/tests/.gitignore | 1 +
> lib/tests/Makefile.sources | 1 +
> lib/tests/igt_segfault.c | 139 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 141 insertions(+)
> create mode 100644 lib/tests/igt_segfault.c
>
>diff --git a/lib/tests/.gitignore b/lib/tests/.gitignore index a745a23..729568b 100644
>--- a/lib/tests/.gitignore
>+++ b/lib/tests/.gitignore
>@@ -5,6 +5,7 @@ igt_list_only
> igt_no_exit
> igt_no_exit_list_only
> igt_no_subtest
>+igt_segfault
> igt_simple_test_subtests
> igt_simulation
> igt_timeout
>diff --git a/lib/tests/Makefile.sources b/lib/tests/Makefile.sources index 10e0617..5fa0b31 100644
>--- a/lib/tests/Makefile.sources
>+++ b/lib/tests/Makefile.sources
>@@ -8,6 +8,7 @@ check_PROGRAMS = \
> igt_simple_test_subtests \
> igt_timeout \
> igt_invalid_subtest_name \
>+ igt_segfault \
> $(NULL)
>
> check_SCRIPTS = \
>diff --git a/lib/tests/igt_segfault.c b/lib/tests/igt_segfault.c new file mode 100644 index 0000000..b420b1a
>--- /dev/null
>+++ b/lib/tests/igt_segfault.c
>@@ -0,0 +1,139 @@
>+/*
>+ * Copyright © 2015 Intel Corporation
>+ *
>+ * Permission is hereby granted, free of charge, to any person
>+obtaining a
>+ * copy of this software and associated documentation files (the
>+"Software"),
>+ * to deal in the Software without restriction, including without
>+limitation
>+ * the rights to use, copy, modify, merge, publish, distribute,
>+sublicense,
>+ * and/or sell copies of the Software, and to permit persons to whom
>+the
>+ * Software is furnished to do so, subject to the following conditions:
>+ *
>+ * The above copyright notice and this permission notice (including the
>+next
>+ * paragraph) shall be included in all copies or substantial portions
>+of the
>+ * Software.
>+ *
>+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>+EXPRESS OR
>+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>+MERCHANTABILITY,
>+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
>+SHALL
>+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
>+OTHER
>+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>+ARISING
>+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>+DEALINGS
>+ * IN THE SOFTWARE.
>+ *
>+ * Authors:
>+ * Derek Morton <derek.j.morton at intel.com>
>+ *
>+ */
>+
>+/*
>+ * Testcase: Test the framework catches a segfault and returns an error.
>+ *
>+ * 1. Test a crashing simple test is reported.
>+ * 2. Test a crashing subtest is reported.
>+ * 3. Test a crashing subtest following a passing subtest is reported.
>+ * 4. Test a crashing subtest preceeding a passing subtest is reported.
>+ */
>+
>+#include <stdlib.h>
>+#include <sys/wait.h>
>+#include <sys/types.h>
>+#include <assert.h>
>+#include <errno.h>
>+
>+#include "drmtest.h"
>+#include "igt_core.h"
>+
>+/*
>+ * We need to hide assert from the cocci igt test refactor spatch.
>+ *
>+ * IMPORTANT: Test infrastructure tests are the only valid places where
>+using
>+ * assert is allowed.
>+ */
>+#define internal_assert assert
>+
>+bool simple;
>+bool runa;
>+bool runc;
>+char test[] = "test";
>+char *argv_run[] = { test };
>+
>+static int do_fork(void)
>+{
>+ int pid, status;
>+ int argc;
>+ void (*crashme)(void) = NULL;
>+
>+ switch (pid = fork()) {
>+ case -1:
>+ internal_assert(0);
>+ case 0:
>+ if (simple) {
>+ argc = 1;
>+ igt_simple_init(argc, argv_run);
>+ crashme();
>+
>+ igt_exit();
>+ } else {
>+
>+ argc = 1;
>+ igt_subtest_init(argc, argv_run);
>+
>+ if(runa)
>+ igt_subtest("A")
>+ ;
>+
>+ igt_subtest("B")
>+ crashme();
>+
>+ if(runc)
>+ igt_subtest("C")
>+ ;
>+
>+ igt_exit();
>+ }
>+ default:
>+ while (waitpid(pid, &status, 0) == -1 &&
>+ errno == EINTR)
>+ ;
>+
>+ if(WIFSIGNALED(status))
>+ return WTERMSIG(status) + 128;
>+
>+ return WEXITSTATUS(status);
>+ }
>+}
>+
>+int main(int argc, char **argv)
>+{
>+ /* Test Crash in simple test is reported */
>+ simple = true;
>+ runa=false;
>+ runc=false;
>+ igt_info("Simple test.\n");
>+ fflush(stdout);
>+ internal_assert(do_fork() == SIGSEGV + 128);
>+
>+ /* Test crash in a single subtest is reported */
>+ simple = false;
>+ igt_info("Single subtest.\n");
>+ fflush(stdout);
>+ internal_assert(do_fork() == SIGSEGV + 128);
>+
>+ /* Test crash in a subtest following a pass is reported */
>+ simple = false;
>+ runa=true;
>+ igt_info("Passing then crashing subtest.\n");
>+ fflush(stdout);
>+ internal_assert(do_fork() == SIGSEGV + 128);
>+
>+ /* Test crash in a subtest preceeding a pass is reported */
>+ simple = false;
>+ runa=false;
>+ runc=true;
>+ igt_info("Crashing then passing subtest.\n");
>+ fflush(stdout);
>+ internal_assert(do_fork() == SIGSEGV + 128);
>+
>+ return 0;
>+}
>+
>--
>1.9.1
>
>
More information about the Intel-gfx
mailing list