Skip to content

Commit

Permalink
pythongh-110932: Fix regrtest for SOURCE_DATE_EPOCH
Browse files Browse the repository at this point in the history
If the SOURCE_DATE_EPOCH environment variable is defined, use its
value as a string as the random seed.
  • Loading branch information
vstinner committed Oct 20, 2023
1 parent 5dfa717 commit ae05792
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 12 deletions.
16 changes: 9 additions & 7 deletions Lib/test/libregrtest/main.py
Expand Up @@ -129,14 +129,16 @@ def __init__(self, ns: Namespace, _add_python_opts: bool = False):

# Randomize
self.randomize: bool = ns.randomize
self.random_seed: int | None = (
ns.random_seed
if ns.random_seed is not None
else random.getrandbits(32)
)
if 'SOURCE_DATE_EPOCH' in os.environ:
self.randomize = False
self.random_seed = None
# SOURCE_DATE_EPOCH should be an integer, but use a string to not
# fail if it's not integer. random.seed() accepts a string.
# https://reproducible-builds.org/docs/source-date-epoch/
self.random_seed: int | str = os.environ['SOURCE_DATE_EPOCH']
elif ns.random_seed is None:
self.random_seed = random.getrandbits(32)
else:
self.random_seed = ns.random_seed

# tests
self.first_runtests: RunTests | None = None
Expand Down Expand Up @@ -441,7 +443,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int:
or tests or self.cmdline_args)):
display_header(self.use_resources, self.python_cmd)

print("Using random seed", self.random_seed)
print("Using random seed:", self.random_seed)

runtests = self.create_run_tests(selected)
self.first_runtests = runtests
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/libregrtest/runtests.py
Expand Up @@ -91,7 +91,7 @@ class RunTests:
use_resources: tuple[str, ...]
python_cmd: tuple[str, ...] | None
randomize: bool
random_seed: int | None
random_seed: int | str
json_file: JsonFile | None

def copy(self, **override):
Expand Down
30 changes: 26 additions & 4 deletions Lib/test/test_regrtest.py
Expand Up @@ -149,12 +149,12 @@ def test_randomize(self):
self.assertTrue(ns.randomize)

with os_helper.EnvironmentVarGuard() as env:
env['SOURCE_DATE_EPOCH'] = '1'
env['SOURCE_DATE_EPOCH'] = '1697839080'

ns = self.parse_args(['--randomize'])
regrtest = main.Regrtest(ns)
self.assertFalse(regrtest.randomize)
self.assertIsNone(regrtest.random_seed)
self.assertEqual(regrtest.random_seed, '1697839080')

def test_randseed(self):
ns = self.parse_args(['--randseed', '12345'])
Expand Down Expand Up @@ -388,7 +388,13 @@ def check_ci_mode(self, args, use_resources, rerun=True):

# Check Regrtest attributes which are more reliable than Namespace
# which has an unclear API
regrtest = main.Regrtest(ns)
with os_helper.EnvironmentVarGuard() as env:
# Ignore SOURCE_DATE_EPOCH env var if it's set
if 'SOURCE_DATE_EPOCH' in env:
del env['SOURCE_DATE_EPOCH']

regrtest = main.Regrtest(ns)

self.assertEqual(regrtest.num_workers, -1)
self.assertEqual(regrtest.want_rerun, rerun)
self.assertTrue(regrtest.randomize)
Expand Down Expand Up @@ -662,7 +668,7 @@ def list_regex(line_format, tests):
self.check_line(output, f'Result: {state}', full=True)

def parse_random_seed(self, output):
match = self.regex_search(r'Using random seed ([0-9]+)', output)
match = self.regex_search(r'Using random seed: ([0-9]+)', output)
randseed = int(match.group(1))
self.assertTrue(0 <= randseed, randseed)
return randseed
Expand All @@ -672,10 +678,17 @@ def run_command(self, args, input=None, exitcode=0, **kw):
input = ''
if 'stderr' not in kw:
kw['stderr'] = subprocess.STDOUT

env = kw.pop('env', None)
if env is None:
env = dict(os.environ)
env.pop('SOURCE_DATE_EPOCH', None)

proc = subprocess.run(args,
text=True,
input=input,
stdout=subprocess.PIPE,
env=env,
**kw)
if proc.returncode != exitcode:
msg = ("Command %s failed with exit code %s, but exit code %s expected!\n"
Expand Down Expand Up @@ -955,6 +968,15 @@ def test_random(self):
output = self.run_tests(test, exitcode=EXITCODE_NO_TESTS_RAN)
self.assertIsInstance(self.parse_random_seed(output), int)

# check SOURCE_DATE_EPOCH
timestamp = 1697839080
env = dict(os.environ, SOURCE_DATE_EPOCH=str(timestamp))
output = self.run_tests('-r', test, exitcode=EXITCODE_NO_TESTS_RAN,
env=env)
randseed = self.parse_random_seed(output)
self.assertEqual(randseed, timestamp)
self.check_line(output, 'TESTRANDOM: 520')

def test_fromfile(self):
# test --fromfile
tests = [self.create_test() for index in range(5)]
Expand Down
@@ -0,0 +1,3 @@
Fix regrtest if the ``SOURCE_DATE_EPOCH`` environment variable is defined:
use the variable value as a string as the random seed. Patch by Victor
Stinner.

0 comments on commit ae05792

Please sign in to comment.