| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2000-10-06 18:46:22 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  | import stat | 
					
						
							| 
									
										
										
										
											2000-10-06 18:46:22 +00:00
										 |  |  | import random | 
					
						
							| 
									
										
										
										
											2007-11-01 19:48:10 +00:00
										 |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2000-10-24 17:16:32 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2002-06-14 01:07:39 +00:00
										 |  |  | import py_compile | 
					
						
							| 
									
										
										
										
											2006-12-13 23:09:53 +00:00
										 |  |  | import warnings | 
					
						
							| 
									
										
										
										
											2009-01-06 18:10:47 +00:00
										 |  |  | import marshal | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  | import imp | 
					
						
							| 
									
										
										
										
											2009-07-09 02:06:17 +00:00
										 |  |  | from test.test_support import (unlink, TESTFN, unload, run_unittest, | 
					
						
							| 
									
										
										
										
											2009-10-18 05:38:48 +00:00
										 |  |  |     check_warnings, TestFailed, EnvironmentVarGuard) | 
					
						
							| 
									
										
										
										
											2000-10-24 17:16:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-08 15:19:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-08-02 03:58:27 +00:00
										 |  |  | def remove_files(name): | 
					
						
							|  |  |  |     for f in (name + os.extsep + "py", | 
					
						
							|  |  |  |               name + os.extsep + "pyc", | 
					
						
							|  |  |  |               name + os.extsep + "pyo", | 
					
						
							|  |  |  |               name + os.extsep + "pyw", | 
					
						
							|  |  |  |               name + "$py.class"): | 
					
						
							|  |  |  |         if os.path.exists(f): | 
					
						
							|  |  |  |             os.remove(f) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ImportTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2006-10-18 05:09:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |     def testCaseSensitivity(self): | 
					
						
							|  |  |  |         # Brief digression to test that import is case-sensitive:  if we got this | 
					
						
							|  |  |  |         # far, we know for sure that "random" exists. | 
					
						
							| 
									
										
										
										
											2001-08-04 08:12:36 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             import RAnDoM | 
					
						
							|  |  |  |         except ImportError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail("import of RAnDoM should have failed (case mismatch)") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testDoubleConst(self): | 
					
						
							|  |  |  |         # Another brief digression to test the accuracy of manifest float constants. | 
					
						
							|  |  |  |         from test import double_const  # don't blink -- that *was* the test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testImport(self): | 
					
						
							|  |  |  |         def test_with_extension(ext): | 
					
						
							|  |  |  |             # ext normally ".py"; perhaps ".pyw" | 
					
						
							|  |  |  |             source = TESTFN + ext | 
					
						
							|  |  |  |             pyo = TESTFN + os.extsep + "pyo" | 
					
						
							|  |  |  |             if sys.platform.startswith('java'): | 
					
						
							|  |  |  |                 pyc = TESTFN + "$py.class" | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 pyc = TESTFN + os.extsep + "pyc" | 
					
						
							| 
									
										
										
										
											2000-10-06 18:46:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             f = open(source, "w") | 
					
						
							|  |  |  |             print >> f, "# This tests Python's ability to import a", ext, "file." | 
					
						
							|  |  |  |             a = random.randrange(1000) | 
					
						
							|  |  |  |             b = random.randrange(1000) | 
					
						
							|  |  |  |             print >> f, "a =", a | 
					
						
							|  |  |  |             print >> f, "b =", b | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2000-10-06 18:46:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  |                 mod = __import__(TESTFN) | 
					
						
							|  |  |  |             except ImportError, err: | 
					
						
							|  |  |  |                 self.fail("import from %s failed: %s" % (ext, err)) | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |                 self.assertEquals(mod.a, a, | 
					
						
							|  |  |  |                     "module loaded (%s) but contents invalid" % mod) | 
					
						
							|  |  |  |                 self.assertEquals(mod.b, b, | 
					
						
							|  |  |  |                     "module loaded (%s) but contents invalid" % mod) | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 os.unlink(source) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  |                 imp.reload(mod) | 
					
						
							|  |  |  |             except ImportError, err: | 
					
						
							|  |  |  |                 self.fail("import from .pyc/.pyo failed: %s" % err) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             finally: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     os.unlink(pyc) | 
					
						
							|  |  |  |                 except OSError: | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     os.unlink(pyo) | 
					
						
							|  |  |  |                 except OSError: | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 del sys.modules[TESTFN] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sys.path.insert(0, os.curdir) | 
					
						
							| 
									
										
										
										
											2001-08-04 08:12:36 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             test_with_extension(os.extsep + "py") | 
					
						
							|  |  |  |             if sys.platform.startswith("win"): | 
					
						
							|  |  |  |                 for ext in ".PY", ".Py", ".pY", ".pyw", ".PYW", ".pYw": | 
					
						
							|  |  |  |                     test_with_extension(ext) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             del sys.path[0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  |     @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") | 
					
						
							|  |  |  |     def test_execute_bit_not_copied(self): | 
					
						
							|  |  |  |         # Issue 6070: under posix .pyc files got their execute bit set if | 
					
						
							|  |  |  |         # the .py file had the execute bit set, but they aren't executable. | 
					
						
							| 
									
										
										
										
											2009-07-09 13:55:44 +00:00
										 |  |  |         oldmask = os.umask(022) | 
					
						
							| 
									
										
										
										
											2009-07-09 15:35:33 +00:00
										 |  |  |         sys.path.insert(0, os.curdir) | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             fname = TESTFN + os.extsep + "py" | 
					
						
							|  |  |  |             f = open(fname, 'w').close() | 
					
						
							|  |  |  |             os.chmod(fname, (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | | 
					
						
							|  |  |  |                              stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)) | 
					
						
							|  |  |  |             __import__(TESTFN) | 
					
						
							| 
									
										
										
										
											2009-07-09 02:06:17 +00:00
										 |  |  |             fn = fname + 'c' | 
					
						
							|  |  |  |             if not os.path.exists(fn): | 
					
						
							|  |  |  |                 fn = fname + 'o' | 
					
						
							|  |  |  |                 if not os.path.exists(fn): raise TestFailed("__import__ did " | 
					
						
							|  |  |  |                     "not result in creation of either a .pyc or .pyo file") | 
					
						
							|  |  |  |             s = os.stat(fn) | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  |             self.assertEquals(stat.S_IMODE(s.st_mode), | 
					
						
							|  |  |  |                               stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) | 
					
						
							|  |  |  |         finally: | 
					
						
							| 
									
										
										
										
											2009-07-09 13:55:44 +00:00
										 |  |  |             os.umask(oldmask) | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  |             remove_files(TESTFN) | 
					
						
							| 
									
										
										
										
											2009-07-09 01:43:41 +00:00
										 |  |  |             if TESTFN in sys.modules: del sys.modules[TESTFN] | 
					
						
							| 
									
										
										
										
											2009-07-09 15:35:33 +00:00
										 |  |  |             del sys.path[0] | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |     def testImpModule(self): | 
					
						
							|  |  |  |         # Verify that the imp module can correctly load and find .py files | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-18 05:38:48 +00:00
										 |  |  |         # 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(): | 
					
						
							| 
									
										
										
										
											2009-10-17 15:57:42 +00:00
										 |  |  |             x = imp.find_module("os") | 
					
						
							| 
									
										
										
										
											2009-10-18 05:38:48 +00:00
										 |  |  |             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) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_module_with_large_stack(self, module='longlist'): | 
					
						
							|  |  |  |         # create module w/list of 65000 elements to test bug #561858 | 
					
						
							|  |  |  |         filename = module + os.extsep + 'py' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # create a file with a list of 65000 elements | 
					
						
							|  |  |  |         f = open(filename, 'w+') | 
					
						
							|  |  |  |         f.write('d = [\n') | 
					
						
							|  |  |  |         for i in range(65000): | 
					
						
							|  |  |  |             f.write('"",\n') | 
					
						
							|  |  |  |         f.write(']') | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # compile & remove .py file, we only need .pyc (or .pyo) | 
					
						
							|  |  |  |         f = open(filename, 'r') | 
					
						
							|  |  |  |         py_compile.compile(filename) | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         os.unlink(filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # need to be able to load from current dir | 
					
						
							|  |  |  |         sys.path.append('') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # this used to crash | 
					
						
							|  |  |  |         exec 'import ' + module | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # cleanup | 
					
						
							|  |  |  |         del sys.path[-1] | 
					
						
							|  |  |  |         for ext in 'pyc', 'pyo': | 
					
						
							|  |  |  |             fname = module + os.extsep + ext | 
					
						
							|  |  |  |             if os.path.exists(fname): | 
					
						
							|  |  |  |                 os.unlink(fname) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_failing_import_sticks(self): | 
					
						
							|  |  |  |         source = TESTFN + os.extsep + "py" | 
					
						
							|  |  |  |         f = open(source, "w") | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  |         print >> f, "a = 1 // 0" | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |         f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # New in 2.4, we shouldn't be able to import that no matter how often | 
					
						
							|  |  |  |         # we try. | 
					
						
							|  |  |  |         sys.path.insert(0, os.curdir) | 
					
						
							| 
									
										
										
										
											2001-08-04 08:12:36 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             for i in 1, 2, 3: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     mod = __import__(TESTFN) | 
					
						
							|  |  |  |                 except ZeroDivisionError: | 
					
						
							|  |  |  |                     if TESTFN in sys.modules: | 
					
						
							|  |  |  |                         self.fail("damaged module in sys.modules on %i. try" % i) | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     self.fail("was able to import a damaged module on %i. try" % i) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.path.pop(0) | 
					
						
							|  |  |  |             remove_files(TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_failing_reload(self): | 
					
						
							|  |  |  |         # A failing reload should leave the module object in sys.modules. | 
					
						
							|  |  |  |         source = TESTFN + os.extsep + "py" | 
					
						
							| 
									
										
										
										
											2004-08-02 03:58:27 +00:00
										 |  |  |         f = open(source, "w") | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |         print >> f, "a = 1" | 
					
						
							|  |  |  |         print >> f, "b = 2" | 
					
						
							| 
									
										
										
										
											2004-08-02 03:58:27 +00:00
										 |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         sys.path.insert(0, os.curdir) | 
					
						
							| 
									
										
										
										
											2004-08-02 03:58:27 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             mod = __import__(TESTFN) | 
					
						
							| 
									
										
										
										
											2010-01-23 23:04:36 +00:00
										 |  |  |             self.assertIn(TESTFN, sys.modules) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             self.assertEquals(mod.a, 1, "module has wrong attribute values") | 
					
						
							|  |  |  |             self.assertEquals(mod.b, 2, "module has wrong attribute values") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # On WinXP, just replacing the .py file wasn't enough to | 
					
						
							|  |  |  |             # convince reload() to reparse it.  Maybe the timestamp didn't | 
					
						
							|  |  |  |             # move enough.  We force it to get reparsed by removing the | 
					
						
							|  |  |  |             # compiled file too. | 
					
						
							|  |  |  |             remove_files(TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Now damage the module. | 
					
						
							|  |  |  |             f = open(source, "w") | 
					
						
							|  |  |  |             print >> f, "a = 10" | 
					
						
							|  |  |  |             print >> f, "b = 20//0" | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  |             self.assertRaises(ZeroDivisionError, imp.reload, mod) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # But we still expect the module to be in sys.modules. | 
					
						
							|  |  |  |             mod = sys.modules.get(TESTFN) | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |             self.assertFalse(mod is None, "expected module to still be in sys.modules") | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # We should have replaced a w/ 10, but the old b value should | 
					
						
							|  |  |  |             # stick. | 
					
						
							|  |  |  |             self.assertEquals(mod.a, 10, "module has wrong attribute values") | 
					
						
							|  |  |  |             self.assertEquals(mod.b, 2, "module has wrong attribute values") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.path.pop(0) | 
					
						
							|  |  |  |             remove_files(TESTFN) | 
					
						
							|  |  |  |             if TESTFN in sys.modules: | 
					
						
							|  |  |  |                 del sys.modules[TESTFN] | 
					
						
							| 
									
										
										
										
											2007-03-12 18:07:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 16:11:39 +00:00
										 |  |  |     def test_infinite_reload(self): | 
					
						
							|  |  |  |         # Bug #742342 reports that Python segfaults (infinite recursion in C) | 
					
						
							|  |  |  |         #  when faced with self-recursive reload()ing. | 
					
						
							| 
									
										
										
										
											2007-03-12 18:07:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 16:11:39 +00:00
										 |  |  |         sys.path.insert(0, os.path.dirname(__file__)) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             import infinite_reload | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.path.pop(0) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_import_name_binding(self): | 
					
						
							|  |  |  |         # import x.y.z binds x in the current namespace | 
					
						
							|  |  |  |         import test as x | 
					
						
							|  |  |  |         import test.test_support | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(x is test, x.__name__) | 
					
						
							|  |  |  |         self.assertTrue(hasattr(test.test_support, "__file__")) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # import x.y.z as w binds z as w | 
					
						
							|  |  |  |         import test.test_support as y | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(y is test.test_support, y.__name__) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_import_initless_directory_warning(self): | 
					
						
							| 
									
										
										
										
											2008-09-09 00:49:16 +00:00
										 |  |  |         with warnings.catch_warnings(): | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             # Just a random non-package directory we always expect to be | 
					
						
							|  |  |  |             # somewhere in sys.path... | 
					
						
							| 
									
										
										
										
											2006-12-13 23:09:53 +00:00
										 |  |  |             warnings.simplefilter('error', ImportWarning) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |             self.assertRaises(ImportWarning, __import__, "site-packages") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-09 19:56:33 +00:00
										 |  |  |     def test_importbyfilename(self): | 
					
						
							|  |  |  |         path = os.path.abspath(TESTFN) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             __import__(path) | 
					
						
							|  |  |  |         except ImportError, err: | 
					
						
							|  |  |  |             self.assertEqual("Import by filename is not supported.", | 
					
						
							|  |  |  |                               err.args[0]) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail("import by path didn't raise an exception") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 01:06:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 18:10:47 +00:00
										 |  |  | class TestPycRewriting(unittest.TestCase): | 
					
						
							|  |  |  |     # Test that the `co_filename` attribute on code objects always points | 
					
						
							|  |  |  |     # to the right file, even when various things happen (e.g. both the .py | 
					
						
							|  |  |  |     # and the .pyc file are renamed). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     module_name = "unlikely_module_name" | 
					
						
							|  |  |  |     module_source = """
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | code_filename = sys._getframe().f_code.co_filename | 
					
						
							|  |  |  | module_filename = __file__ | 
					
						
							|  |  |  | constant = 1 | 
					
						
							|  |  |  | def func(): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | func_filename = func.func_code.co_filename | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  |     dir_name = os.path.abspath(TESTFN) | 
					
						
							|  |  |  |     file_name = os.path.join(dir_name, module_name) + os.extsep + "py" | 
					
						
							|  |  |  |     compiled_name = file_name + ("c" if __debug__ else "o") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.sys_path = sys.path[:] | 
					
						
							|  |  |  |         self.orig_module = sys.modules.pop(self.module_name, None) | 
					
						
							|  |  |  |         os.mkdir(self.dir_name) | 
					
						
							|  |  |  |         with open(self.file_name, "w") as f: | 
					
						
							|  |  |  |             f.write(self.module_source) | 
					
						
							|  |  |  |         sys.path.insert(0, self.dir_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         sys.path[:] = self.sys_path | 
					
						
							|  |  |  |         if self.orig_module is not None: | 
					
						
							|  |  |  |             sys.modules[self.module_name] = self.orig_module | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             del sys.modules[self.module_name] | 
					
						
							|  |  |  |         for file_name in self.file_name, self.compiled_name: | 
					
						
							|  |  |  |             if os.path.exists(file_name): | 
					
						
							|  |  |  |                 os.remove(file_name) | 
					
						
							|  |  |  |         if os.path.exists(self.dir_name): | 
					
						
							| 
									
										
										
										
											2009-01-06 18:34:08 +00:00
										 |  |  |             shutil.rmtree(self.dir_name) | 
					
						
							| 
									
										
										
										
											2009-01-06 18:10:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def import_module(self): | 
					
						
							|  |  |  |         ns = globals() | 
					
						
							|  |  |  |         __import__(self.module_name, ns, ns) | 
					
						
							|  |  |  |         return sys.modules[self.module_name] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_basics(self): | 
					
						
							|  |  |  |         mod = self.import_module() | 
					
						
							|  |  |  |         self.assertEqual(mod.module_filename, self.file_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.code_filename, self.file_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.func_filename, self.file_name) | 
					
						
							|  |  |  |         del sys.modules[self.module_name] | 
					
						
							|  |  |  |         mod = self.import_module() | 
					
						
							|  |  |  |         self.assertEqual(mod.module_filename, self.compiled_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.code_filename, self.file_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.func_filename, self.file_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_incorrect_code_name(self): | 
					
						
							|  |  |  |         py_compile.compile(self.file_name, dfile="another_module.py") | 
					
						
							|  |  |  |         mod = self.import_module() | 
					
						
							|  |  |  |         self.assertEqual(mod.module_filename, self.compiled_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.code_filename, self.file_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.func_filename, self.file_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_module_without_source(self): | 
					
						
							|  |  |  |         target = "another_module.py" | 
					
						
							|  |  |  |         py_compile.compile(self.file_name, dfile=target) | 
					
						
							|  |  |  |         os.remove(self.file_name) | 
					
						
							|  |  |  |         mod = self.import_module() | 
					
						
							|  |  |  |         self.assertEqual(mod.module_filename, self.compiled_name) | 
					
						
							|  |  |  |         self.assertEqual(mod.code_filename, target) | 
					
						
							|  |  |  |         self.assertEqual(mod.func_filename, target) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_foreign_code(self): | 
					
						
							|  |  |  |         py_compile.compile(self.file_name) | 
					
						
							|  |  |  |         with open(self.compiled_name, "rb") as f: | 
					
						
							|  |  |  |             header = f.read(8) | 
					
						
							|  |  |  |             code = marshal.load(f) | 
					
						
							|  |  |  |         constants = list(code.co_consts) | 
					
						
							|  |  |  |         foreign_code = test_main.func_code | 
					
						
							|  |  |  |         pos = constants.index(1) | 
					
						
							|  |  |  |         constants[pos] = foreign_code | 
					
						
							|  |  |  |         code = type(code)(code.co_argcount, code.co_nlocals, code.co_stacksize, | 
					
						
							|  |  |  |                           code.co_flags, code.co_code, tuple(constants), | 
					
						
							|  |  |  |                           code.co_names, code.co_varnames, code.co_filename, | 
					
						
							|  |  |  |                           code.co_name, code.co_firstlineno, code.co_lnotab, | 
					
						
							|  |  |  |                           code.co_freevars, code.co_cellvars) | 
					
						
							|  |  |  |         with open(self.compiled_name, "wb") as f: | 
					
						
							|  |  |  |             f.write(header) | 
					
						
							|  |  |  |             marshal.dump(code, f) | 
					
						
							|  |  |  |         mod = self.import_module() | 
					
						
							|  |  |  |         self.assertEqual(mod.constant.co_filename, foreign_code.co_filename) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-01 20:11:06 +00:00
										 |  |  | class PathsTests(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2007-11-01 19:48:10 +00:00
										 |  |  |     path = TESTFN | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         os.mkdir(self.path) | 
					
						
							|  |  |  |         self.syspath = sys.path[:] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         shutil.rmtree(self.path) | 
					
						
							| 
									
										
										
										
											2009-10-17 15:57:42 +00:00
										 |  |  |         sys.path[:] = self.syspath | 
					
						
							| 
									
										
										
										
											2007-11-01 19:48:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # http://bugs.python.org/issue1293 | 
					
						
							|  |  |  |     def test_trailing_slash(self): | 
					
						
							|  |  |  |         f = open(os.path.join(self.path, 'test_trailing_slash.py'), 'w') | 
					
						
							|  |  |  |         f.write("testdata = 'test_trailing_slash'") | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         sys.path.append(self.path+'/') | 
					
						
							|  |  |  |         mod = __import__("test_trailing_slash") | 
					
						
							|  |  |  |         self.assertEqual(mod.testdata, 'test_trailing_slash') | 
					
						
							|  |  |  |         unload("test_trailing_slash") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-24 10:52:26 +00:00
										 |  |  |     # http://bugs.python.org/issue3677 | 
					
						
							|  |  |  |     def _test_UNC_path(self): | 
					
						
							|  |  |  |         f = open(os.path.join(self.path, 'test_trailing_slash.py'), 'w') | 
					
						
							|  |  |  |         f.write("testdata = 'test_trailing_slash'") | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         #create the UNC path, like \\myhost\c$\foo\bar | 
					
						
							|  |  |  |         path = os.path.abspath(self.path) | 
					
						
							|  |  |  |         import socket | 
					
						
							|  |  |  |         hn = socket.gethostname() | 
					
						
							|  |  |  |         drive = path[0] | 
					
						
							|  |  |  |         unc = "\\\\%s\\%s$"%(hn, drive) | 
					
						
							|  |  |  |         unc += path[2:] | 
					
						
							|  |  |  |         sys.path.append(path) | 
					
						
							|  |  |  |         mod = __import__("test_trailing_slash") | 
					
						
							|  |  |  |         self.assertEqual(mod.testdata, 'test_trailing_slash') | 
					
						
							|  |  |  |         unload("test_trailing_slash") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if sys.platform == "win32": | 
					
						
							|  |  |  |         test_UNC_path = _test_UNC_path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-19 04:39:13 +00:00
										 |  |  | class RelativeImport(unittest.TestCase): | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             del sys.modules["test.relimport"] | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_relimport_star(self): | 
					
						
							|  |  |  |         # This will import * from .test_import. | 
					
						
							| 
									
										
										
										
											2008-03-19 06:00:28 +00:00
										 |  |  |         from . import relimport | 
					
						
							| 
									
										
										
										
											2008-03-19 04:39:13 +00:00
										 |  |  |         self.assertTrue(hasattr(relimport, "RelativeImport")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-13 14:52:36 +00:00
										 |  |  |     def test_issue3221(self): | 
					
						
							|  |  |  |         def check_absolute(): | 
					
						
							|  |  |  |             exec "from os import path" in ns | 
					
						
							|  |  |  |         def check_relative(): | 
					
						
							|  |  |  |             exec "from . import relimport" in ns | 
					
						
							|  |  |  |         # Check both OK with __package__ and __name__ correct | 
					
						
							|  |  |  |         ns = dict(__package__='test', __name__='test.notarealmodule') | 
					
						
							|  |  |  |         check_absolute() | 
					
						
							|  |  |  |         check_relative() | 
					
						
							|  |  |  |         # Check both OK with only __name__ wrong | 
					
						
							|  |  |  |         ns = dict(__package__='test', __name__='notarealpkg.notarealmodule') | 
					
						
							|  |  |  |         check_absolute() | 
					
						
							|  |  |  |         check_relative() | 
					
						
							|  |  |  |         # Check relative fails with only __package__ wrong | 
					
						
							|  |  |  |         ns = dict(__package__='foo', __name__='test.notarealmodule') | 
					
						
							| 
									
										
										
										
											2008-09-11 12:11:06 +00:00
										 |  |  |         with check_warnings() as w: | 
					
						
							| 
									
										
										
										
											2008-07-13 14:52:36 +00:00
										 |  |  |             check_absolute() | 
					
						
							| 
									
										
										
										
											2010-01-23 23:04:36 +00:00
										 |  |  |             self.assertIn('foo', str(w.message)) | 
					
						
							| 
									
										
										
										
											2008-09-11 12:11:06 +00:00
										 |  |  |             self.assertEqual(w.category, RuntimeWarning) | 
					
						
							| 
									
										
										
										
											2008-07-13 14:52:36 +00:00
										 |  |  |         self.assertRaises(SystemError, check_relative) | 
					
						
							|  |  |  |         # Check relative fails with __package__ and __name__ wrong | 
					
						
							|  |  |  |         ns = dict(__package__='foo', __name__='notarealpkg.notarealmodule') | 
					
						
							| 
									
										
										
										
											2008-09-11 12:11:06 +00:00
										 |  |  |         with check_warnings() as w: | 
					
						
							| 
									
										
										
										
											2008-07-13 14:52:36 +00:00
										 |  |  |             check_absolute() | 
					
						
							| 
									
										
										
										
											2010-01-23 23:04:36 +00:00
										 |  |  |             self.assertIn('foo', str(w.message)) | 
					
						
							| 
									
										
										
										
											2008-09-11 12:11:06 +00:00
										 |  |  |             self.assertEqual(w.category, RuntimeWarning) | 
					
						
							| 
									
										
										
										
											2008-07-13 14:52:36 +00:00
										 |  |  |         self.assertRaises(SystemError, check_relative) | 
					
						
							|  |  |  |         # Check both fail with package set to a non-string | 
					
						
							|  |  |  |         ns = dict(__package__=object()) | 
					
						
							|  |  |  |         self.assertRaises(ValueError, check_absolute) | 
					
						
							|  |  |  |         self.assertRaises(ValueError, check_relative) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | def test_main(verbose=None): | 
					
						
							| 
									
										
										
										
											2009-01-06 18:10:47 +00:00
										 |  |  |     run_unittest(ImportTest, TestPycRewriting, PathsTests, RelativeImport) | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2008-04-25 21:43:56 +00:00
										 |  |  |     # test needs to be a package, so we can do relative import | 
					
						
							|  |  |  |     from test.test_import import test_main | 
					
						
							| 
									
										
										
										
											2006-09-30 12:16:03 +00:00
										 |  |  |     test_main() |