11
11
import locale
12
12
import os .path
13
13
import platform
14
+ import random
14
15
import re
15
16
import subprocess
16
17
import sys
@@ -504,7 +505,7 @@ def list_regex(line_format, tests):
504
505
if rerun is not None :
505
506
regex = list_regex ('%s re-run test%s' , [rerun .name ])
506
507
self .check_line (output , regex )
507
- regex = LOG_PREFIX + fr "Re-running 1 failed tests in verbose mode"
508
+ regex = LOG_PREFIX + r "Re-running 1 failed tests in verbose mode"
508
509
self .check_line (output , regex )
509
510
regex = fr"Re-running { rerun .name } in verbose mode"
510
511
if rerun .match :
@@ -1019,13 +1020,13 @@ def test_run(self):
1019
1020
forever = True )
1020
1021
1021
1022
@without_optimizer
1022
- def check_leak (self , code , what , * , multiprocessing = False ):
1023
+ def check_leak (self , code , what , * , run_workers = False ):
1023
1024
test = self .create_test ('huntrleaks' , code = code )
1024
1025
1025
1026
filename = 'reflog.txt'
1026
1027
self .addCleanup (os_helper .unlink , filename )
1027
1028
cmd = ['--huntrleaks' , '3:3:' ]
1028
- if multiprocessing :
1029
+ if run_workers :
1029
1030
cmd .append ('-j1' )
1030
1031
cmd .append (test )
1031
1032
output = self .run_tests (* cmd ,
@@ -1044,7 +1045,7 @@ def check_leak(self, code, what, *, multiprocessing=False):
1044
1045
self .assertIn (line2 , reflog )
1045
1046
1046
1047
@unittest .skipUnless (support .Py_DEBUG , 'need a debug build' )
1047
- def check_huntrleaks (self , * , multiprocessing : bool ):
1048
+ def check_huntrleaks (self , * , run_workers : bool ):
1048
1049
# test --huntrleaks
1049
1050
code = textwrap .dedent ("""
1050
1051
import unittest
@@ -1055,13 +1056,13 @@ class RefLeakTest(unittest.TestCase):
1055
1056
def test_leak(self):
1056
1057
GLOBAL_LIST.append(object())
1057
1058
""" )
1058
- self .check_leak (code , 'references' , multiprocessing = multiprocessing )
1059
+ self .check_leak (code , 'references' , run_workers = run_workers )
1059
1060
1060
1061
def test_huntrleaks (self ):
1061
- self .check_huntrleaks (multiprocessing = False )
1062
+ self .check_huntrleaks (run_workers = False )
1062
1063
1063
1064
def test_huntrleaks_mp (self ):
1064
- self .check_huntrleaks (multiprocessing = True )
1065
+ self .check_huntrleaks (run_workers = True )
1065
1066
1066
1067
@unittest .skipUnless (support .Py_DEBUG , 'need a debug build' )
1067
1068
def test_huntrleaks_fd_leak (self ):
@@ -1139,8 +1140,6 @@ def test_method3(self):
1139
1140
def test_method4(self):
1140
1141
pass
1141
1142
""" )
1142
- all_methods = ['test_method1' , 'test_method2' ,
1143
- 'test_method3' , 'test_method4' ]
1144
1143
testname = self .create_test (code = code )
1145
1144
1146
1145
# only run a subset
@@ -1762,7 +1761,7 @@ def test_mp_decode_error(self):
1762
1761
if encoding is None :
1763
1762
encoding = sys .__stdout__ .encoding
1764
1763
if encoding is None :
1765
- self .skipTest (f "cannot get regrtest worker encoding" )
1764
+ self .skipTest ("cannot get regrtest worker encoding" )
1766
1765
1767
1766
nonascii = b"byte:\xa0 \xa9 \xff \n "
1768
1767
try :
@@ -1789,7 +1788,7 @@ def test_mp_decode_error(self):
1789
1788
stats = 0 )
1790
1789
1791
1790
def test_doctest (self ):
1792
- code = textwrap .dedent (fr '''
1791
+ code = textwrap .dedent (r '''
1793
1792
import doctest
1794
1793
import sys
1795
1794
from test import support
@@ -1827,6 +1826,46 @@ def load_tests(loader, tests, pattern):
1827
1826
randomize = True ,
1828
1827
stats = TestStats (1 , 1 , 0 ))
1829
1828
1829
+ def _check_random_seed (self , run_workers : bool ):
1830
+ # gh-109276: When -r/--randomize is used, random.seed() is called
1831
+ # with the same random seed before running each test file.
1832
+ code = textwrap .dedent (r'''
1833
+ import random
1834
+ import unittest
1835
+
1836
+ class RandomSeedTest(unittest.TestCase):
1837
+ def test_randint(self):
1838
+ numbers = [random.randint(0, 1000) for _ in range(10)]
1839
+ print(f"Random numbers: {numbers}")
1840
+ ''' )
1841
+ tests = [self .create_test (name = f'test_random{ i } ' , code = code )
1842
+ for i in range (1 , 3 + 1 )]
1843
+
1844
+ random_seed = 856_656_202
1845
+ cmd = ["--randomize" , f"--randseed={ random_seed } " ]
1846
+ if run_workers :
1847
+ # run as many worker processes than the number of tests
1848
+ cmd .append (f'-j{ len (tests )} ' )
1849
+ cmd .extend (tests )
1850
+ output = self .run_tests (* cmd )
1851
+
1852
+ random .seed (random_seed )
1853
+ # Make the assumption that nothing consume entropy between libregrest
1854
+ # setup_tests() which calls random.seed() and RandomSeedTest calling
1855
+ # random.randint().
1856
+ numbers = [random .randint (0 , 1000 ) for _ in range (10 )]
1857
+ expected = f"Random numbers: { numbers } "
1858
+
1859
+ regex = r'^Random numbers: .*$'
1860
+ matches = re .findall (regex , output , flags = re .MULTILINE )
1861
+ self .assertEqual (matches , [expected ] * len (tests ))
1862
+
1863
+ def test_random_seed (self ):
1864
+ self ._check_random_seed (run_workers = False )
1865
+
1866
+ def test_random_seed_workers (self ):
1867
+ self ._check_random_seed (run_workers = True )
1868
+
1830
1869
1831
1870
class TestUtils (unittest .TestCase ):
1832
1871
def test_format_duration (self ):
0 commit comments