From 3ae89a7150264ae5a112975af1377ee1c04cb994 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 19 Nov 2022 21:22:55 +0200 Subject: [PATCH] Handle freezing tests. Fixes #10752. --- mesonbuild/mtest.py | 6 +++--- test cases/unit/109 freeze/freeze.c | 21 +++++++++++++++++++++ test cases/unit/109 freeze/meson.build | 4 ++++ unittests/linuxliketests.py | 8 ++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 test cases/unit/109 freeze/freeze.c create mode 100644 test cases/unit/109 freeze/meson.build diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py index 981bc106e..f13e755ac 100644 --- a/mesonbuild/mtest.py +++ b/mesonbuild/mtest.py @@ -1265,14 +1265,14 @@ class TestSubprocess: # Make sure the termination signal actually kills the process # group, otherwise retry with a SIGKILL. - with suppress(TimeoutError): + with suppress(asyncio.TimeoutError): await asyncio.wait_for(p.wait(), timeout=0.5) if p.returncode is not None: return None os.killpg(p.pid, signal.SIGKILL) - with suppress(TimeoutError): + with suppress(asyncio.TimeoutError): await asyncio.wait_for(p.wait(), timeout=1) if p.returncode is not None: return None @@ -1281,7 +1281,7 @@ class TestSubprocess: # Try to kill it one last time with a direct call. # If the process has spawned children, they will remain around. p.kill() - with suppress(TimeoutError): + with suppress(asyncio.TimeoutError): await asyncio.wait_for(p.wait(), timeout=1) if p.returncode is not None: return None diff --git a/test cases/unit/109 freeze/freeze.c b/test cases/unit/109 freeze/freeze.c new file mode 100644 index 000000000..0a45c1a70 --- /dev/null +++ b/test cases/unit/109 freeze/freeze.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include + +static void do_nothing(int signo, siginfo_t *info, void *context) { +} + +int main(int argc, char **argv) { + struct sigaction sa; + memset(&sa, 0, sizeof(struct sigaction)); + sa.sa_sigaction = do_nothing; + if (sigaction(SIGTERM, &sa, NULL) == -1) { + printf("Could not set up signal handler.\n"); + return 1; + } + printf("Freezing forever.\n"); + while(1) { + } + return 0; +} diff --git a/test cases/unit/109 freeze/meson.build b/test cases/unit/109 freeze/meson.build new file mode 100644 index 000000000..1a84f3786 --- /dev/null +++ b/test cases/unit/109 freeze/meson.build @@ -0,0 +1,4 @@ +project('freeze', 'c') + +e = executable('freeze', 'freeze.c') +test('freeze', e, timeout: 1) diff --git a/unittests/linuxliketests.py b/unittests/linuxliketests.py index a594348c4..25b392f28 100644 --- a/unittests/linuxliketests.py +++ b/unittests/linuxliketests.py @@ -1820,3 +1820,11 @@ class LinuxlikeTests(BasePlatformTests): default_symlinks.append(symlink) os.symlink(default_dirs[i], symlink) self.assertFalse(cpp.compiler_args([f'-isystem{symlink}' for symlink in default_symlinks]).to_native()) + + def test_freezing(self): + testdir = os.path.join(self.unit_test_dir, '109 freeze') + self.init(testdir) + self.build() + with self.assertRaises(subprocess.CalledProcessError) as e: + self.run_tests() + self.assertNotIn('Traceback', e.exception.output)