Skip to content

Commit 72fb39c

Browse files
authored
gh-109276: regrtest re-runs "env changed" tests (#109831)
When a test fails with "env changed" and --rerun option is used, the test is now re-run in verbose mode in a fresh process.
1 parent 64ab9f7 commit 72fb39c

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

Lib/test/libregrtest/results.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def __init__(self):
2525
self.env_changed: TestList = []
2626
self.run_no_tests: TestList = []
2727
self.rerun: TestList = []
28-
self.bad_results: list[TestResult] = []
28+
self.rerun_results: list[TestResult] = []
2929

3030
self.interrupted: bool = False
3131
self.test_times: list[tuple[float, TestName]] = []
@@ -87,6 +87,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests):
8787
self.good.append(test_name)
8888
case State.ENV_CHANGED:
8989
self.env_changed.append(test_name)
90+
self.rerun_results.append(result)
9091
case State.SKIPPED:
9192
self.skipped.append(test_name)
9293
case State.RESOURCE_DENIED:
@@ -98,7 +99,7 @@ def accumulate_result(self, result: TestResult, runtests: RunTests):
9899
case _:
99100
if result.is_failed(fail_env_changed):
100101
self.bad.append(test_name)
101-
self.bad_results.append(result)
102+
self.rerun_results.append(result)
102103
else:
103104
raise ValueError(f"invalid test state: {result.state!r}")
104105

@@ -114,12 +115,12 @@ def accumulate_result(self, result: TestResult, runtests: RunTests):
114115
self.add_junit(xml_data)
115116

116117
def need_rerun(self):
117-
return bool(self.bad_results)
118+
return bool(self.rerun_results)
118119

119120
def prepare_rerun(self) -> tuple[TestTuple, FilterDict]:
120121
tests: TestList = []
121122
match_tests_dict = {}
122-
for result in self.bad_results:
123+
for result in self.rerun_results:
123124
tests.append(result.test_name)
124125

125126
match_tests = result.get_rerun_match_tests()
@@ -130,7 +131,8 @@ def prepare_rerun(self) -> tuple[TestTuple, FilterDict]:
130131
# Clear previously failed tests
131132
self.rerun_bad.extend(self.bad)
132133
self.bad.clear()
133-
self.bad_results.clear()
134+
self.env_changed.clear()
135+
self.rerun_results.clear()
134136

135137
return (tuple(tests), match_tests_dict)
136138

Lib/test/test_regrtest.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ def check_executed_tests(self, output, tests, *, stats,
463463
randomize = True
464464

465465
rerun_failed = []
466-
if rerun is not None:
466+
if rerun is not None and not env_changed:
467467
failed = [rerun.name]
468468
if not rerun.success:
469469
rerun_failed.append(rerun.name)
@@ -591,7 +591,7 @@ def list_regex(line_format, tests):
591591
state = ', '.join(state)
592592
if rerun is not None:
593593
new_state = 'SUCCESS' if rerun.success else 'FAILURE'
594-
state = 'FAILURE then ' + new_state
594+
state = f'{state} then {new_state}'
595595
self.check_line(output, f'Result: {state}', full=True)
596596

597597
def parse_random_seed(self, output):
@@ -1229,6 +1229,15 @@ def test_env_changed(self):
12291229
self.check_executed_tests(output, [testname], env_changed=testname,
12301230
fail_env_changed=True, stats=1)
12311231

1232+
# rerun
1233+
output = self.run_tests("--rerun", testname)
1234+
self.check_executed_tests(output, [testname],
1235+
env_changed=testname,
1236+
rerun=Rerun(testname,
1237+
match=None,
1238+
success=True),
1239+
stats=2)
1240+
12321241
def test_rerun_fail(self):
12331242
# FAILURE then FAILURE
12341243
code = textwrap.dedent("""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
regrtest: When a test fails with "env changed" and the --rerun option is
2+
used, the test is now re-run in verbose mode in a fresh process. Patch by
3+
Victor Stinner.

0 commit comments

Comments
 (0)