From 707f228b1eb8d2829797524e0aa93922a238ff66 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 15 Jul 2011 22:29:44 +0200 Subject: Try harder to reap dangling threads in test.support.reap_threads(). --- Lib/test/support.py | 19 +++++++++++++------ Misc/NEWS | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py index e2d7ae0..2827e8b 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -24,9 +24,15 @@ import sysconfig import logging.handlers try: - import _thread + import _thread, threading except ImportError: _thread = None + threading = None +try: + import multiprocessing.process +except ImportError: + multiprocessing = None + __all__ = [ "Error", "TestFailed", "ResourceDenied", "import_module", @@ -1275,19 +1281,20 @@ def modules_cleanup(oldmodules): def threading_setup(): if _thread: - return _thread._count(), + return _thread._count(), threading._dangling.copy() else: - return 1, + return 1, () -def threading_cleanup(nb_threads): +def threading_cleanup(*original_values): if not _thread: return _MAX_COUNT = 10 for count in range(_MAX_COUNT): - n = _thread._count() - if n == nb_threads: + values = _thread._count(), threading._dangling + if values == original_values: break time.sleep(0.1) + gc_collect() # XXX print a warning in case of failure? def reap_threads(func): diff --git a/Misc/NEWS b/Misc/NEWS index 00bce49..02b59dc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -67,6 +67,8 @@ C-API Tests ----- +- Try harder to reap dangling threads in test.support.reap_threads(). + - Issue #12573: Add resource checks for dangling Thread and Process objects. - Issue #12549: Correct test_platform to not fail when OS X returns 'x86_64' -- cgit v0.12 From a6e81a23b36e61f4803cca059d55943f52b17b7f Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 15 Jul 2011 22:32:25 +0200 Subject: test_pydoc needs to cleanup after itself --- Lib/test/test_pydoc.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index a8f9fbfc..aaa6912 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -15,8 +15,10 @@ import textwrap from io import StringIO from collections import namedtuple from contextlib import contextmanager -from test.support import TESTFN, forget, rmtree, EnvironmentVarGuard, \ - reap_children, captured_output, captured_stdout, unlink +from test.support import ( + TESTFN, forget, rmtree, EnvironmentVarGuard, + reap_children, reap_threads, captured_output, captured_stdout, unlink +) from test import pydoc_mod @@ -205,11 +207,8 @@ def run_pydoc(module_name, *args): output of pydoc. """ cmd = [sys.executable, pydoc.__file__, " ".join(args), module_name] - try: - output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] - return output.strip() - finally: - reap_children() + output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] + return output.strip() def get_pydoc_html(module): "Returns pydoc generated output as html" @@ -488,13 +487,17 @@ class TestHelper(unittest.TestCase): self.assertEqual(sorted(pydoc.Helper.keywords), sorted(keyword.kwlist)) +@reap_threads def test_main(): - test.support.run_unittest(PydocDocTest, - TestDescriptions, - PydocServerTest, - PydocUrlHandlerTest, - TestHelper, - ) + try: + test.support.run_unittest(PydocDocTest, + TestDescriptions, + PydocServerTest, + PydocUrlHandlerTest, + TestHelper, + ) + finally: + reap_children() if __name__ == "__main__": test_main() -- cgit v0.12 From f7f54759b5f81cc011e987746ed3edd7fcc96d21 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 15 Jul 2011 22:42:12 +0200 Subject: Use test.script_helper in test_pydoc --- Lib/test/test_pydoc.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index aaa6912..2a21a7e 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -15,11 +15,12 @@ import textwrap from io import StringIO from collections import namedtuple from contextlib import contextmanager + +from test.script_helper import assert_python_ok from test.support import ( TESTFN, forget, rmtree, EnvironmentVarGuard, reap_children, reap_threads, captured_output, captured_stdout, unlink ) - from test import pydoc_mod try: @@ -201,14 +202,14 @@ missing_pattern = "no Python documentation found for '%s'" # output pattern for module with bad imports badimport_pattern = "problem in %s - ImportError: No module named %s" -def run_pydoc(module_name, *args): +def run_pydoc(module_name, *args, **env): """ Runs pydoc on the specified module. Returns the stripped output of pydoc. """ - cmd = [sys.executable, pydoc.__file__, " ".join(args), module_name] - output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] - return output.strip() + args = args + (module_name,) + rc, out, err = assert_python_ok(pydoc.__file__, *args, **env) + return out.strip() def get_pydoc_html(module): "Returns pydoc generated output as html" @@ -307,19 +308,20 @@ class PydocDocTest(unittest.TestCase): def newdirinpath(dir): os.mkdir(dir) sys.path.insert(0, dir) - yield - sys.path.pop(0) - rmtree(dir) + try: + yield + finally: + sys.path.pop(0) + rmtree(dir) - with newdirinpath(TESTFN), EnvironmentVarGuard() as env: - env['PYTHONPATH'] = TESTFN + with newdirinpath(TESTFN): fullmodname = os.path.join(TESTFN, modname) sourcefn = fullmodname + os.extsep + "py" for importstring, expectedinmsg in testpairs: with open(sourcefn, 'w') as f: f.write("import {}\n".format(importstring)) try: - result = run_pydoc(modname).decode("ascii") + result = run_pydoc(modname, PYTHONPATH=TESTFN).decode("ascii") finally: forget(modname) expected = badimport_pattern % (modname, expectedinmsg) -- cgit v0.12