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@xxxxxxxxxxxxxxxxxxxxx >Cc: Wood, Thomas; daniel@xxxxxxxx; 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@xxxxxxxxx> >--- > 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@xxxxxxxxx> >+ * >+ */ >+ >+/* >+ * 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 > > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx