* Re-fix issue #19284: Don't generate the no-op -R command line
parameter to "enable" the always on sys.flags.hash_randomization in _args_from_interpreter_flags() used by multiprocessing and some unittests. This simplifies the code. * assert_python_ok docstring typo fix. * Fix test_cmd_line not to fail if PYTHONHASHSEED is set to a fixed seed.
This commit is contained in:
commit
fcbdf9906b
|
@ -535,14 +535,11 @@ def _args_from_interpreter_flags():
|
|||
'verbose': 'v',
|
||||
'bytes_warning': 'b',
|
||||
'quiet': 'q',
|
||||
'hash_randomization': 'R',
|
||||
}
|
||||
args = []
|
||||
for flag, opt in flag_opt_map.items():
|
||||
v = getattr(sys.flags, flag)
|
||||
if v > 0:
|
||||
if flag == 'hash_randomization':
|
||||
v = 1 # Handle specification of an exact seed
|
||||
args.append('-' + opt * v)
|
||||
for opt in sys.warnoptions:
|
||||
args.append('-W' + opt)
|
||||
|
|
|
@ -127,7 +127,7 @@ def assert_python_ok(*args, **env_vars):
|
|||
variables `env_vars` succeeds (rc == 0) and return a (return code, stdout,
|
||||
stderr) tuple.
|
||||
|
||||
If the __cleanenv keyword is set, env_vars is used a fresh environment.
|
||||
If the __cleanenv keyword is set, env_vars is used as a fresh environment.
|
||||
|
||||
Python is started in isolated mode (command line option -I),
|
||||
except if the __isolated keyword is set to False.
|
||||
|
|
|
@ -404,12 +404,24 @@ class CmdLineTest(unittest.TestCase):
|
|||
# Verify that -R enables hash randomization:
|
||||
self.verify_valid_flag('-R')
|
||||
hashes = []
|
||||
for i in range(2):
|
||||
if os.environ.get('PYTHONHASHSEED', 'random') != 'random':
|
||||
env = dict(os.environ) # copy
|
||||
# We need to test that it is enabled by default without
|
||||
# the environment variable enabling it for us.
|
||||
del env['PYTHONHASHSEED']
|
||||
env['__cleanenv'] = '1' # consumed by assert_python_ok()
|
||||
else:
|
||||
env = {}
|
||||
for i in range(3):
|
||||
code = 'print(hash("spam"))'
|
||||
rc, out, err = assert_python_ok('-c', code)
|
||||
rc, out, err = assert_python_ok('-c', code, **env)
|
||||
self.assertEqual(rc, 0)
|
||||
hashes.append(out)
|
||||
self.assertNotEqual(hashes[0], hashes[1])
|
||||
hashes = sorted(set(hashes)) # uniq
|
||||
# Rare chance of failure due to 3 random seeds honestly being equal.
|
||||
self.assertGreater(len(hashes), 1,
|
||||
msg='3 runs produced an identical random hash '
|
||||
' for "spam": {}'.format(hashes))
|
||||
|
||||
# Verify that sys.flags contains hash_randomization
|
||||
code = 'import sys; print("random is", sys.flags.hash_randomization)'
|
||||
|
|
Loading…
Reference in New Issue