[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