]> granicus.if.org Git - python/commitdiff
Issue #26325: Added test.support.check_no_resource_warning() to check that
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 11 Feb 2016 11:11:44 +0000 (13:11 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 11 Feb 2016 11:11:44 +0000 (13:11 +0200)
no ResourceWarning is emitted.

Lib/test/support/__init__.py
Lib/test/test_asyncio/test_subprocess.py
Lib/test/test_io.py
Lib/test/test_xml_etree.py
Misc/NEWS

index dfb4c25416c744ca481fa75f8044e2b306f50dfe..b82f9cb996b742a1efd3f62e3cb9bcc0a5452e0a 100644 (file)
@@ -100,7 +100,8 @@ __all__ = [
     # threads
     "threading_setup", "threading_cleanup", "reap_threads", "start_threads",
     # miscellaneous
-    "check_warnings", "EnvironmentVarGuard", "run_with_locale", "swap_item",
+    "check_warnings", "check_no_resource_warning", "EnvironmentVarGuard",
+    "run_with_locale", "swap_item",
     "swap_attr", "Matcher", "set_memlimit", "SuppressCrashReport", "sortdict",
     "run_with_tz",
     ]
@@ -1147,6 +1148,27 @@ def check_warnings(*filters, **kwargs):
     return _filterwarnings(filters, quiet)
 
 
+@contextlib.contextmanager
+def check_no_resource_warning(testcase):
+    """Context manager to check that no ResourceWarning is emitted.
+
+    Usage:
+
+        with check_no_resource_warning(self):
+            f = open(...)
+            ...
+            del f
+
+    You must remove the object which may emit ResourceWarning before
+    the end of the context manager.
+    """
+    with warnings.catch_warnings(record=True) as warns:
+        warnings.filterwarnings('always', category=ResourceWarning)
+        yield
+        gc_collect()
+    testcase.assertEqual(warns, [])
+
+
 class CleanImport(object):
     """Context manager to force import to return a new module reference.
 
index e90f17dda63a798cb56fb3c817151dc83a71a75b..c111e2fe1e585f1d304e49b3575af50abe9df9f0 100644 (file)
@@ -427,10 +427,9 @@ class SubprocessMixin:
 
             create = asyncio.create_subprocess_exec(sys.executable, '-c',
                                                     'pass', loop=self.loop)
-            with warnings.catch_warnings(record=True) as warns:
+            with support.check_no_resource_warning(self):
                 with self.assertRaises(exc):
                     self.loop.run_until_complete(create)
-                self.assertEqual(warns, [])
 
 
 if sys.platform != 'win32':
index 28f440d91ad29f569c11fb92011c65a2a38e4c13..86440c5b39b9a9d974d8d69699b1d6c3c0263824 100644 (file)
@@ -681,18 +681,14 @@ class IOTest(unittest.TestCase):
             f2.readline()
 
     def test_nonbuffered_textio(self):
-        with warnings.catch_warnings(record=True) as recorded:
+        with support.check_no_resource_warning(self):
             with self.assertRaises(ValueError):
                 self.open(support.TESTFN, 'w', buffering=0)
-            support.gc_collect()
-        self.assertEqual(recorded, [])
 
     def test_invalid_newline(self):
-        with warnings.catch_warnings(record=True) as recorded:
+        with support.check_no_resource_warning(self):
             with self.assertRaises(ValueError):
                 self.open(support.TESTFN, 'w', newline='invalid')
-            support.gc_collect()
-        self.assertEqual(recorded, [])
 
 
 class CIOTest(IOTest):
@@ -3366,10 +3362,8 @@ class MiscIOTest(unittest.TestCase):
         # When using closefd=False, there's no warning
         r, w = os.pipe()
         fds += r, w
-        with warnings.catch_warnings(record=True) as recorded:
+        with support.check_no_resource_warning(self):
             open(r, *args, closefd=False, **kwargs)
-            support.gc_collect()
-        self.assertEqual(recorded, [])
 
     def test_warn_on_dealloc_fd(self):
         self._check_warn_on_dealloc_fd("rb", buffering=0)
index 358484dad780f69ec99d9949b55bc94a6f5a4d9e..44e3142dc91f856a901fcc099335cced2bd501ed 100644 (file)
@@ -567,14 +567,11 @@ class ElementTreeTest(unittest.TestCase):
             self.assertFalse(f.closed)
         self.assertEqual(str(cm.exception), "unknown event 'bogus'")
 
-        with warnings.catch_warnings(record=True) as w:
-            warnings.filterwarnings("always", category=ResourceWarning)
+        with support.check_no_resource_warning(self):
             with self.assertRaises(ValueError) as cm:
                 iterparse(SIMPLE_XMLFILE, events)
             self.assertEqual(str(cm.exception), "unknown event 'bogus'")
             del cm
-            support.gc_collect()
-        self.assertEqual(w, [])
 
         source = io.BytesIO(
             b"<?xml version='1.0' encoding='iso-8859-1'?>\n"
@@ -601,15 +598,12 @@ class ElementTreeTest(unittest.TestCase):
         it = iterparse(TESTFN)
         action, elem = next(it)
         self.assertEqual((action, elem.tag), ('end', 'document'))
-        with warnings.catch_warnings(record=True) as w:
-            warnings.filterwarnings("always", category=ResourceWarning)
+        with support.check_no_resource_warning(self):
             with self.assertRaises(ET.ParseError) as cm:
                 next(it)
             self.assertEqual(str(cm.exception),
                     'junk after document element: line 1, column 12')
             del cm, it
-            support.gc_collect()
-        self.assertEqual(w, [])
 
     def test_writefile(self):
         elem = ET.Element("tag")
index 4c1e758ad0ea4e22df9676813a2caa5aa1bc7a78..8e7d7d425a8ed35073301495d8bf223922a54773 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -216,6 +216,9 @@ Documentation
 Tests
 -----
 
+- Issue #26325: Added test.support.check_no_resource_warning() to check that
+  no ResourceWarning is emitted.
+
 - Issue #25940: Changed test_ssl to use self-signed.pythontest.net.  This
   avoids relying on svn.python.org, which recently changed root certificate.