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.
pull/13195/head
Daan De Meyer 7 months ago committed by Eli Schwartz
parent 14de8ac5a9
commit bcaab91bf6
  1. 3
      docs/markdown/Unit-tests.md
  2. 5
      docs/markdown/snippets/test_iteration.md
  3. 5
      mesonbuild/mtest.py

@ -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

@ -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.

@ -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)

Loading…
Cancel
Save