Message ID | 1434103518-1734-1-git-send-email-derek.j.morton@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jun 12, 2015 at 10:08:43AM +0000, Morton, Derek J wrote: > This is the same as the previously submitted patch except the text > encoding should (hopefully) now be correct. Hm, I failed to push out my igt branch with the patch I applied before vacation, done that now. Is there any material difference? Or just the content-enconding thing? -Daniel > > //Derek > > > > > > >-----Original Message----- > >From: Morton, Derek J > >Sent: Friday, June 12, 2015 11:05 AM > >To: intel-gfx@lists.freedesktop.org > >Cc: Wood, Thomas; daniel@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@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@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 > > > >
> > >-----Original Message----- >From: Daniel Vetter [mailto:daniel.vetter@ffwll.ch] On Behalf Of Daniel Vetter >Sent: Monday, June 15, 2015 2:55 PM >To: Morton, Derek J >Cc: intel-gfx@lists.freedesktop.org; Wood, Thomas; daniel@ffwll.ch >Subject: Re: [PATCH i-g-t v4] lib/tests/igt_segfault Add unit test to test segfault handling > >On Fri, Jun 12, 2015 at 10:08:43AM +0000, Morton, Derek J wrote: >> This is the same as the previously submitted patch except the text >> encoding should (hopefully) now be correct. > >Hm, I failed to push out my igt branch with the patch I applied before vacation, done that now. Is there any material difference? Or just the content-enconding thing? >-Daniel > Hi Daniel, It was the same patch, I just reran git send-email with the correct encoding. //Derek >> >> //Derek >> >> > >> > >> >-----Original Message----- >> >From: Morton, Derek J >> >Sent: Friday, June 12, 2015 11:05 AM >> >To: intel-gfx@lists.freedesktop.org >> >Cc: Wood, Thomas; daniel@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@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 (c) 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@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 >> > >> > > >-- >Daniel Vetter >Software Engineer, Intel Corporation >http://blog.ffwll.ch >
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@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; +} +
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@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