From 06dbdbaeae7fe93cd71b4f70626f268b54a905d0 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Wed, 13 Feb 2019 11:35:44 +0100 Subject: lib/tests: Check that igt_assert forwards correctly through igt_fork Note that without the igt_waitchildren nothing at all gets forwarded, maybe we should check for left-behind children somewhere on subtest exit. v2: Drop NIH exit status handling (Chris). Cc: Chris Wilson Reviewed-by: Chris Wilson Signed-off-by: Daniel Vetter --- lib/tests/igt_fork.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/tests/meson.build | 1 + 2 files changed, 85 insertions(+) create mode 100644 lib/tests/igt_fork.c (limited to 'lib/tests') diff --git a/lib/tests/igt_fork.c b/lib/tests/igt_fork.c new file mode 100644 index 00000000..8d3c1bd0 --- /dev/null +++ b/lib/tests/igt_fork.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2019 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#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 + +char test[] = "test"; +char *argv_run[] = { test }; + +static void igt_fork_vs_assert(void) +{ + igt_fork(i, 1) { + igt_assert(0); + } + + igt_waitchildren(); +} + +static int do_fork(void (*test_to_run)(void)) +{ + int pid, status; + int argc; + + switch (pid = fork()) { + case -1: + internal_assert(0); + case 0: + argc = 1; + igt_simple_init(argc, argv_run); + test_to_run(); + igt_exit(); + default: + while (waitpid(pid, &status, 0) == -1 && + errno == EINTR) + ; + + return status; + } +} + + +int main(int argc, char **argv) +{ + int ret; + + ret = do_fork(igt_fork_vs_assert); + internal_assert(WEXITSTATUS(ret) == IGT_EXIT_FAILURE); +} diff --git a/lib/tests/meson.build b/lib/tests/meson.build index 55ab2b3d..665ad4a0 100644 --- a/lib/tests/meson.build +++ b/lib/tests/meson.build @@ -1,5 +1,6 @@ lib_tests = [ 'igt_fork_helper', + 'igt_fork', 'igt_list_only', 'igt_simulation', 'igt_stats', -- cgit v1.2.3