diff -r c3cec0f77eff Lib/unittest/loader.py --- a/Lib/unittest/loader.py Tue Oct 20 18:22:36 2015 +0300 +++ b/Lib/unittest/loader.py Tue Oct 20 22:07:34 2015 +0200 @@ -479,6 +479,8 @@ return tests, True finally: self._loading_packages.discard(name) + else: + return None, False defaultTestLoader = TestLoader() diff -r c3cec0f77eff Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py Tue Oct 20 18:22:36 2015 +0300 +++ b/Lib/unittest/test/test_discovery.py Tue Oct 20 22:07:34 2015 +0200 @@ -90,6 +90,46 @@ ('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()