From bcaab91bf61327bb7c2a0259292c2a336ad6513a Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 3 May 2024 10:05:24 +0200 Subject: [PATCH] mtest: Set MESON_TEST_ITERATION to the current iteration of the test When running our integration tests in systemd we depend on each test having a unique name. This is always the case unless --repeat is used, in which case multiple tests with the same name run concurrently which causes issues when allocating resources that use the test name as the identifier. Let's set MESON_TEST_ITERATION to the current iteration of the test so we can use $TEST_NAME-$TEST_ITERATION as our test identifiers which will avoid these issues. --- docs/markdown/Unit-tests.md | 3 +++ docs/markdown/snippets/test_iteration.md | 5 +++++ mesonbuild/mtest.py | 5 +++-- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 docs/markdown/snippets/test_iteration.md diff --git a/docs/markdown/Unit-tests.md b/docs/markdown/Unit-tests.md index 73e58dc68..6fda0f5f6 100644 --- a/docs/markdown/Unit-tests.md +++ b/docs/markdown/Unit-tests.md @@ -208,6 +208,9 @@ Sometimes you need to run the tests multiple times, which is done like this: $ meson test --repeat=10 ``` +Meson will set the `MESON_TEST_ITERATION` environment variable to the +current iteration of the test *(added 1.5.0)*. + Invoking tests via a helper executable such as Valgrind can be done with the `--wrap` argument diff --git a/docs/markdown/snippets/test_iteration.md b/docs/markdown/snippets/test_iteration.md new file mode 100644 index 000000000..67daf2781 --- /dev/null +++ b/docs/markdown/snippets/test_iteration.md @@ -0,0 +1,5 @@ +## meson test now sets the `MESON_TEST_ITERATION` environment variable + +`meson test` will now set the `MESON_TEST_ITERATION` environment variable to the +current iteration of the test. This will always be `1` unless `--repeat` is used +to run the same test multiple times. diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py index 460a44c49..03d2eb254 100644 --- a/mesonbuild/mtest.py +++ b/mesonbuild/mtest.py @@ -1709,7 +1709,7 @@ class TestHarness: sys.exit('Conflict: both test setup and command line specify an exe wrapper.') return current.env.get_env(os.environ.copy()) - def get_test_runner(self, test: TestSerialisation) -> SingleTestRunner: + def get_test_runner(self, test: TestSerialisation, iteration: int) -> SingleTestRunner: name = self.get_pretty_suite(test) options = deepcopy(self.options) if self.options.setup: @@ -1721,6 +1721,7 @@ class TestHarness: if (test.is_cross_built and test.needs_exe_wrapper and test.exe_wrapper and test.exe_wrapper.found()): env['MESON_EXE_WRAPPER'] = join_args(test.exe_wrapper.get_command()) + env['MESON_TEST_ITERATION'] = str(iteration + 1) return SingleTestRunner(test, env, name, options) def process_test_result(self, result: TestRun) -> None: @@ -1822,7 +1823,7 @@ class TestHarness: os.chdir(self.options.wd) runners: T.List[SingleTestRunner] = [] for i in range(self.options.repeat): - runners.extend(self.get_test_runner(test) for test in tests) + runners.extend(self.get_test_runner(test, i) for test in tests) if i == 0: self.duration_max_len = max(len(str(int(runner.timeout or 99))) for runner in runners)