From 9039b83c534251d8a28a16ac25fac20c17382945 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 18 Oct 2009 05:38:48 +0000 Subject: [PATCH] Using CleanImport to revert a reload of the os module doesn't work due to function registrations in copy_reg. The perils of reloading modules even for tests... --- Lib/test/test_imp.py | 9 ++++++++- Lib/test/test_import.py | 20 ++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 1e629409398..77e44bec923 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -43,7 +43,14 @@ class ReloadTests(unittest.TestCase): reload().""" def test_source(self): - with test_support.CleanImport('os'): + # XXX (ncoghlan): It would be nice to use test_support.CleanImport + # here, but that breaks because the os module registers some + # handlers in copy_reg on import. Since CleanImport doesn't + # revert that registration, the module is left in a broken + # state after reversion. Reinitialising the module contents + # and just reverting os.environ to its previous state is an OK + # workaround + with test_support.EnvironmentVarGuard(): import os imp.reload(os) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index 4e0a6860fcf..31375dc6eee 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -8,7 +8,7 @@ import py_compile import warnings import marshal from test.test_support import (unlink, TESTFN, unload, run_unittest, - check_warnings, TestFailed, CleanImport) + check_warnings, TestFailed, EnvironmentVarGuard) def remove_files(name): @@ -121,10 +121,22 @@ class ImportTest(unittest.TestCase): def testImpModule(self): # Verify that the imp module can correctly load and find .py files - import imp - with CleanImport("os"): + import imp, os + # XXX (ncoghlan): It would be nice to use test_support.CleanImport + # here, but that breaks because the os module registers some + # handlers in copy_reg on import. Since CleanImport doesn't + # revert that registration, the module is left in a broken + # state after reversion. Reinitialising the module contents + # and just reverting os.environ to its previous state is an OK + # workaround + orig_path = os.path + orig_getenv = os.getenv + with EnvironmentVarGuard(): x = imp.find_module("os") - os = imp.load_module("os", *x) + new_os = imp.load_module("os", *x) + self.assertIs(os, new_os) + self.assertIs(orig_path, new_os.path) + self.assertIsNot(orig_getenv, new_os.getenv) def test_module_with_large_stack(self, module='longlist'): # create module w/list of 65000 elements to test bug #561858