From 21a0a6c9f8a047b6eb173ee59e38ad5dc3c46f86 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Jun 2017 10:59:52 +0200 Subject: [PATCH] threading_cleanup() failure marks test as ENV_CHANGED (#2500) If threading_cleanup() fails to cleanup threads, set a a new support.environment_altered flag to true, flag uses by save_env which is used by regrtest to check if a test altered the environment. At the end, the test file fails with ENV_CHANGED instead of SUCCESS, to report that it altered the environment. --- Lib/test/libregrtest/runtest.py | 3 +++ Lib/test/libregrtest/save_env.py | 8 +++++++- Lib/test/support/__init__.py | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index fda4ca1ebca..0210409817b 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -103,6 +103,9 @@ def runtest(ns, test): faulthandler.dump_traceback_later(ns.timeout, exit=True) try: support.match_tests = ns.match_tests + # reset the environment_altered flag to detect if a test altered + # the environment + support.environment_altered = False if ns.failfast: support.failfast = True if output_on_failure: diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 8309f266bfb..3c45621390b 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -268,7 +268,13 @@ class saved_test_environment: def __exit__(self, exc_type, exc_val, exc_tb): saved_values = self.saved_values del self.saved_values - support.gc_collect() # Some resources use weak references + + # Some resources use weak references + support.gc_collect() + + # Read support.environment_altered, set by support helper functions + self.changed |= support.environment_altered + for name, get, restore in self.resource_info(): current = get() original = saved_values.pop(name) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 817ba675e2a..3cfa487ba96 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2011,6 +2011,14 @@ def modules_cleanup(oldmodules): #======================================================================= # Threading support to prevent reporting refleaks when running regrtest.py -R +# Flag used by saved_test_environment of test.libregrtest.save_env, +# to check if a test modified the environment. The flag should be set to False +# before running a new test. +# +# For example, threading_cleanup() sets the flag is the function fails +# to cleanup threads. +environment_altered = False + # NOTE: we use thread._count() rather than threading.enumerate() (or the # moral equivalent thereof) because a threading.Thread object is still alive # until its __bootstrap() method has returned, even after it has been @@ -2026,6 +2034,8 @@ def threading_setup(): return 1, () def threading_cleanup(*original_values): + global environment_altered + if not _thread: return _MAX_COUNT = 100 @@ -2037,6 +2047,8 @@ def threading_cleanup(*original_values): time.sleep(0.01) gc_collect() else: + environment_altered = True + dt = time.monotonic() - t0 print("Warning -- threading_cleanup() failed to cleanup %s threads " "after %.0f sec (count: %s, dangling: %s)"