blob: c37e9362b00d0195e6def2d50418059d6ac87ac4 [file] [log] [blame]
Barry Warsaw28a691b2010-04-17 00:19:56 +00001import os
2import sys
3import shutil
4import string
5import random
6import tempfile
7import unittest
Guido van Rossum394a47b2001-08-02 14:14:20 +00008
Barry Warsaw28a691b2010-04-17 00:19:56 +00009from imp import cache_from_source
Benjamin Petersonee8712c2008-05-20 21:35:26 +000010from test.support import run_unittest
Guido van Rossum394a47b2001-08-02 14:14:20 +000011
12class TestImport(unittest.TestCase):
13
14 def __init__(self, *args, **kw):
15 self.package_name = 'PACKAGE_'
Guido van Rossume2b70bc2006-08-18 22:13:04 +000016 while self.package_name in sys.modules:
Martin v. Löwis967f1e32007-08-14 09:23:10 +000017 self.package_name += random.choose(string.ascii_letters)
Guido van Rossum394a47b2001-08-02 14:14:20 +000018 self.module_name = self.package_name + '.foo'
19 unittest.TestCase.__init__(self, *args, **kw)
20
21 def remove_modules(self):
22 for module_name in (self.package_name, self.module_name):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000023 if module_name in sys.modules:
Guido van Rossum394a47b2001-08-02 14:14:20 +000024 del sys.modules[module_name]
25
26 def setUp(self):
Guido van Rossum3b0a3292002-08-09 16:38:32 +000027 self.test_dir = tempfile.mkdtemp()
Guido van Rossum394a47b2001-08-02 14:14:20 +000028 sys.path.append(self.test_dir)
29 self.package_dir = os.path.join(self.test_dir,
30 self.package_name)
31 os.mkdir(self.package_dir)
Brian Curtin1d7878a2010-10-30 21:03:18 +000032 open(os.path.join(self.package_dir, '__init__.py'), 'w').close()
Skip Montanaro7a98be22007-08-16 14:35:24 +000033 self.module_path = os.path.join(self.package_dir, 'foo.py')
Guido van Rossum394a47b2001-08-02 14:14:20 +000034
35 def tearDown(self):
Barry Warsaw28a691b2010-04-17 00:19:56 +000036 shutil.rmtree(self.test_dir)
Guido van Rossum394a47b2001-08-02 14:14:20 +000037 self.assertNotEqual(sys.path.count(self.test_dir), 0)
38 sys.path.remove(self.test_dir)
39 self.remove_modules()
40
41 def rewrite_file(self, contents):
Barry Warsaw28a691b2010-04-17 00:19:56 +000042 compiled_path = cache_from_source(self.module_path)
43 if os.path.exists(compiled_path):
44 os.remove(compiled_path)
45 with open(self.module_path, 'w') as f:
46 f.write(contents)
Tim Petersab9ba272001-08-09 21:40:30 +000047
Guido van Rossum394a47b2001-08-02 14:14:20 +000048 def test_package_import__semantics(self):
49
50 # Generate a couple of broken modules to try importing.
51
52 # ...try loading the module when there's a SyntaxError
53 self.rewrite_file('for')
54 try: __import__(self.module_name)
55 except SyntaxError: pass
Ezio Melottib58e0bd2010-01-23 15:40:09 +000056 else: raise RuntimeError('Failed to induce SyntaxError') # self.fail()?
57 self.assertNotIn(self.module_name, sys.modules)
58 self.assertFalse(hasattr(sys.modules[self.package_name], 'foo'))
Guido van Rossum394a47b2001-08-02 14:14:20 +000059
60 # ...make up a variable name that isn't bound in __builtins__
61 var = 'a'
62 while var in dir(__builtins__):
Martin v. Löwis967f1e32007-08-14 09:23:10 +000063 var += random.choose(string.ascii_letters)
Guido van Rossum394a47b2001-08-02 14:14:20 +000064
65 # ...make a module that just contains that
66 self.rewrite_file(var)
67
68 try: __import__(self.module_name)
69 except NameError: pass
Collin Winter3add4d72007-08-29 23:37:32 +000070 else: raise RuntimeError('Failed to induce NameError.')
Guido van Rossum394a47b2001-08-02 14:14:20 +000071
72 # ...now change the module so that the NameError doesn't
73 # happen
74 self.rewrite_file('%s = 1' % var)
Tim Peters99d001e2004-08-02 03:59:57 +000075 module = __import__(self.module_name).foo
Guido van Rossum394a47b2001-08-02 14:14:20 +000076 self.assertEqual(getattr(module, var), 1)
77
Fred Drake2e2be372001-09-20 21:33:42 +000078
79def test_main():
80 run_unittest(TestImport)
81
82
83if __name__ == "__main__":
84 test_main()