diff options
Diffstat (limited to 'Lib/test/libregrtest')
| -rw-r--r-- | Lib/test/libregrtest/cmdline.py | 3 | ||||
| -rw-r--r-- | Lib/test/libregrtest/main.py | 16 | ||||
| -rw-r--r-- | Lib/test/libregrtest/refleak.py | 25 |
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) |
