From ecd5383891e705e24409719de9dbfda6b203a6f9 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Tue, 15 Mar 2016 13:29:17 +1300 Subject: #25320: Handle sockets in directories unittest discovery is scanning. Patch from Victor van den Elzen. --- Lib/unittest/loader.py | 2 ++ Lib/unittest/test/test_discovery.py | 40 +++++++++++++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 46 insertions(+) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index c776f16..b254c80 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -479,6 +479,8 @@ class TestLoader(object): return tests, True finally: self._loading_packages.discard(name) + else: + return None, False defaultTestLoader = TestLoader() diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py index 55921fe..bb196e6 100644 --- a/Lib/unittest/test/test_discovery.py +++ b/Lib/unittest/test/test_discovery.py @@ -90,6 +90,46 @@ class TestDiscovery(unittest.TestCase): ('test3', 'test4')]) self.assertEqual(suite, expected) + def test_find_tests_socket(self): + # A socket is neither a directory nor a regular file. + # https://bugs.python.org/issue25320 + loader = unittest.TestLoader() + + original_listdir = os.listdir + def restore_listdir(): + os.listdir = original_listdir + original_isfile = os.path.isfile + def restore_isfile(): + os.path.isfile = original_isfile + original_isdir = os.path.isdir + def restore_isdir(): + os.path.isdir = original_isdir + + path_lists = [['socket']] + os.listdir = lambda path: path_lists.pop(0) + self.addCleanup(restore_listdir) + + os.path.isdir = lambda path: False + self.addCleanup(restore_isdir) + + os.path.isfile = lambda path: False + self.addCleanup(restore_isfile) + + loader._get_module_from_name = lambda path: path + ' module' + orig_load_tests = loader.loadTestsFromModule + def loadTestsFromModule(module, pattern=None): + # This is where load_tests is called. + base = orig_load_tests(module, pattern=pattern) + return base + [module + ' tests'] + loader.loadTestsFromModule = loadTestsFromModule + loader.suiteClass = lambda thing: thing + + top_level = os.path.abspath('/foo') + loader._top_level_dir = top_level + suite = list(loader._find_tests(top_level, 'test*.py')) + + self.assertEqual(suite, []) + def test_find_tests_with_package(self): loader = unittest.TestLoader() diff --git a/Misc/ACKS b/Misc/ACKS index a478d4f..85220d1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -393,6 +393,7 @@ Lance Ellinghaus Daniel Ellis Phil Elson David Ely +Victor van den Elzen Jeff Epler Tom Epperly Gökcen Eraslan diff --git a/Misc/NEWS b/Misc/NEWS index 58ee5a4..803924a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -91,6 +91,9 @@ Core and Builtins Library ------- +- Issue #25320: Handle sockets in directories unittest discovery is scanning. + Patch from Victor van den Elzen. + - Issue #16181: cookiejar.http2time() now returns None if year is higher than datetime.MAXYEAR. -- cgit v0.12