summaryrefslogtreecommitdiff
path: root/Lib/test/libregrtest
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/libregrtest')
-rw-r--r--Lib/test/libregrtest/cmdline.py3
-rw-r--r--Lib/test/libregrtest/main.py16
-rw-r--r--Lib/test/libregrtest/refleak.py25
3 files changed, 39 insertions, 5 deletions
diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py
index bf64062ef9..2315cd59b4 100644
--- a/Lib/test/libregrtest/cmdline.py
+++ b/Lib/test/libregrtest/cmdline.py
@@ -255,6 +255,9 @@ def _create_parser():
' , don\'t execute them')
group.add_argument('-P', '--pgo', dest='pgo', action='store_true',
help='enable Profile Guided Optimization training')
+ group.add_argument('--fail-env-changed', action='store_true',
+ help='if a test file alters the environment, mark '
+ 'the test as failed')
return parser
diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py
index 527de17779..571eb61125 100644
--- a/Lib/test/libregrtest/main.py
+++ b/Lib/test/libregrtest/main.py
@@ -256,9 +256,13 @@ class Regrtest:
if isinstance(test, unittest.TestSuite):
self._list_cases(test)
elif isinstance(test, unittest.TestCase):
- print(test.id())
+ if support._match_test(test):
+ print(test.id())
def list_cases(self):
+ support.verbose = False
+ support.match_tests = self.ns.match_tests
+
for test in self.selected:
abstest = get_abs_module(self.ns, test)
try:
@@ -474,6 +478,8 @@ class Regrtest:
result = "FAILURE"
elif self.interrupted:
result = "INTERRUPTED"
+ elif self.environment_changed and self.ns.fail_env_changed:
+ result = "ENV CHANGED"
else:
result = "SUCCESS"
print("Tests result: %s" % result)
@@ -534,7 +540,13 @@ class Regrtest:
self.rerun_failed_tests()
self.finalize()
- sys.exit(len(self.bad) > 0 or self.interrupted)
+ if self.bad:
+ sys.exit(2)
+ if self.interrupted:
+ sys.exit(130)
+ if self.ns.fail_env_changed and self.environment_changed:
+ sys.exit(3)
+ sys.exit(0)
def removepy(names):
diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py
index c69fc0f147..8e18d75b21 100644
--- a/Lib/test/libregrtest/refleak.py
+++ b/Lib/test/libregrtest/refleak.py
@@ -93,9 +93,21 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
rc_before = rc_after
fd_before = fd_after
print(file=sys.stderr)
+
# These checkers return False on success, True on failure
def check_rc_deltas(deltas):
- return any(deltas)
+ # bpo-30776: Try to ignore false positives:
+ #
+ # [3, 0, 0]
+ # [0, 1, 0]
+ # [8, -8, 1]
+ #
+ # Expected leaks:
+ #
+ # [5, 5, 6]
+ # [10, 1, 1]
+ return all(delta >= 1 for delta in deltas)
+
def check_alloc_deltas(deltas):
# At least 1/3rd of 0s
if 3 * deltas.count(0) < len(deltas):
@@ -104,14 +116,21 @@ def dash_R(the_module, test, indirect_test, huntrleaks):
if not set(deltas) <= {1,0,-1}:
return True
return False
+
+ def check_fd_deltas(deltas):
+ return any(deltas)
+
failed = False
for deltas, item_name, checker in [
(rc_deltas, 'references', check_rc_deltas),
(alloc_deltas, 'memory blocks', check_alloc_deltas),
- (fd_deltas, 'file descriptors', check_rc_deltas)]:
+ (fd_deltas, 'file descriptors', check_fd_deltas)
+ ]:
+ # ignore warmup runs
+ deltas = deltas[nwarmup:]
if checker(deltas):
msg = '%s leaked %s %s, sum=%s' % (
- test, deltas[nwarmup:], item_name, sum(deltas))
+ test, deltas, item_name, sum(deltas))
print(msg, file=sys.stderr, flush=True)
with open(fname, "a") as refrep:
print(msg, file=refrep)