Skip to content

Commit 9c6634d

Browse files
committed
gh-110171: libregrtest always sets random.seed unless --no-use-randseed is provided
1 parent 89966a6 commit 9c6634d

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

Lib/test/libregrtest/cmdline.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@
2727
Additional option details:
2828
2929
-r randomizes test execution order. You can use --randseed=int to provide an
30-
int seed value for the randomizer; this is useful for reproducing troublesome
31-
test orders.
30+
int seed value for the randomizer. The randseed value will be used
31+
to set seeds for all random usages in tests
32+
(including randomizing the tests order if -r is set).
33+
By default we always set random seed, but do not randomize test order.
34+
Use --no-use-randseed to disable random seeding.
3235
3336
-s On the first invocation of regrtest using -s, the first test file found
3437
or the first test file given on the command line is run, and the name of
@@ -156,6 +159,7 @@ def __init__(self, **kwargs) -> None:
156159
self.list_tests = False
157160
self.single = False
158161
self.randomize = False
162+
self.use_random_seed = True
159163
self.fromfile = None
160164
self.fail_env_changed = False
161165
self.use_resources = None
@@ -229,6 +233,13 @@ def _create_parser():
229233
more_details)
230234
group.add_argument('-p', '--python', metavar='PYTHON',
231235
help='Command to run Python test subprocesses with.')
236+
group.add_argument('--randseed', metavar='SEED',
237+
dest='random_seed', type=int,
238+
help='pass a global random seed')
239+
group.add_argument('--use-randseed',
240+
dest='use_random_seed',
241+
action=argparse.BooleanOptionalAction,
242+
help='control if random should be seeded')
232243

233244
group = parser.add_argument_group('Verbosity')
234245
group.add_argument('-v', '--verbose', action='count',
@@ -249,10 +260,6 @@ def _create_parser():
249260
group = parser.add_argument_group('Selecting tests')
250261
group.add_argument('-r', '--randomize', action='store_true',
251262
help='randomize test execution order.' + more_details)
252-
group.add_argument('--randseed', metavar='SEED',
253-
dest='random_seed', type=int,
254-
help='pass a random seed to reproduce a previous '
255-
'random run')
256263
group.add_argument('-f', '--fromfile', metavar='FILE',
257264
help='read names of tests to run from a file.' +
258265
more_details)
@@ -483,6 +490,11 @@ def _parse_args(args, **kwargs):
483490
ns.use_resources.remove(r)
484491
elif r not in ns.use_resources:
485492
ns.use_resources.append(r)
493+
if not ns.use_random_seed:
494+
if ns.random_seed is not None:
495+
parser.error("--no-use-randseed and --randseed=... don't go together")
496+
if ns.randomize:
497+
parser.error("--no-use-randseed and --randomize don't go together")
486498
if ns.random_seed is not None:
487499
ns.randomize = True
488500
if ns.verbose:

Lib/test/libregrtest/main.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def __init__(self, ns: Namespace, _add_python_opts: bool = False):
107107
self.forever: bool = ns.forever
108108
self.randomize: bool = ns.randomize
109109
self.random_seed: int | None = ns.random_seed
110+
self.use_random_seed: bool = ns.use_random_seed
110111
self.output_on_failure: bool = ns.verbose3
111112
self.timeout: float | None = ns.timeout
112113
if ns.huntrleaks:
@@ -208,11 +209,12 @@ def find_tests(self, tests: TestList | None = None) -> tuple[TestTuple, TestList
208209
print(f"Cannot find starting test: {self.starting_test}")
209210
sys.exit(1)
210211

211-
if self.randomize:
212+
if self.use_random_seed:
212213
if self.random_seed is None:
213214
self.random_seed = random.randrange(100_000_000)
214215
random.seed(self.random_seed)
215-
random.shuffle(selected)
216+
if self.randomize:
217+
random.shuffle(selected)
216218

217219
return (tuple(selected), tests)
218220

@@ -433,7 +435,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int:
433435
or tests or self.cmdline_args)):
434436
display_header(self.use_resources)
435437

436-
if self.randomize:
438+
if self.use_random_seed:
437439
print("Using random seed", self.random_seed)
438440

439441
runtests = self.create_run_tests(selected)

Lib/test/test_regrtest.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,22 @@ def test_random(self):
949949
test_random2 = int(match.group(1))
950950
self.assertEqual(test_random2, test_random)
951951

952+
# check that random.seed is used by default
953+
output = self.run_tests(test, exitcode=EXITCODE_NO_TESTS_RAN)
954+
self.assertIsInstance(self.parse_random_seed(output), int)
955+
956+
# check that --no-use-randseed disables seed
957+
output = self.run_tests('--no-use-randseed', test,
958+
exitcode=EXITCODE_NO_TESTS_RAN)
959+
with self.assertRaises(AssertionError):
960+
self.parse_random_seed(output)
961+
962+
# check that --no-use-randseed and --randseed are not compatible
963+
self.run_tests('--no-use-randseed', f'--randseed={randseed}', test,
964+
exitcode=EXITCODE_BAD_TEST)
965+
self.run_tests('--no-use-randseed', '-r', test,
966+
exitcode=EXITCODE_BAD_TEST)
967+
952968
def test_fromfile(self):
953969
# test --fromfile
954970
tests = [self.create_test() for index in range(5)]
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
``libregrtest`` now always sets ``random.seed`` unless ``--no-use-randseed``
2+
is provided.

0 commit comments

Comments
 (0)