blob: 8b5e3adf282a6222b7b2a6f382114de42a1ca93f [file] [log] [blame]
Guido van Rossum394a47b2001-08-02 14:14:20 +00001import os, sys, string, random, tempfile, unittest
2
Barry Warsaw04f357c2002-07-23 19:04:11 +00003from test.test_support import run_unittest
Guido van Rossum394a47b2001-08-02 14:14:20 +00004
5class TestImport(unittest.TestCase):
6
7 def __init__(self, *args, **kw):
8 self.package_name = 'PACKAGE_'
Guido van Rossume2b70bc2006-08-18 22:13:04 +00009 while self.package_name in sys.modules:
Guido van Rossum394a47b2001-08-02 14:14:20 +000010 self.package_name += random.choose(string.letters)
11 self.module_name = self.package_name + '.foo'
12 unittest.TestCase.__init__(self, *args, **kw)
13
14 def remove_modules(self):
15 for module_name in (self.package_name, self.module_name):
Guido van Rossume2b70bc2006-08-18 22:13:04 +000016 if module_name in sys.modules:
Guido van Rossum394a47b2001-08-02 14:14:20 +000017 del sys.modules[module_name]
18
19 def setUp(self):
Guido van Rossum3b0a3292002-08-09 16:38:32 +000020 self.test_dir = tempfile.mkdtemp()
Guido van Rossum394a47b2001-08-02 14:14:20 +000021 sys.path.append(self.test_dir)
22 self.package_dir = os.path.join(self.test_dir,
23 self.package_name)
24 os.mkdir(self.package_dir)
Guido van Rossume2ae77b2001-10-24 20:42:55 +000025 open(os.path.join(self.package_dir, '__init__'+os.extsep+'py'), 'w')
26 self.module_path = os.path.join(self.package_dir, 'foo'+os.extsep+'py')
Guido van Rossum394a47b2001-08-02 14:14:20 +000027
28 def tearDown(self):
29 for file in os.listdir(self.package_dir):
30 os.remove(os.path.join(self.package_dir, file))
31 os.rmdir(self.package_dir)
32 os.rmdir(self.test_dir)
33 self.assertNotEqual(sys.path.count(self.test_dir), 0)
34 sys.path.remove(self.test_dir)
35 self.remove_modules()
36
37 def rewrite_file(self, contents):
Tim Petersd342c622001-08-02 17:23:11 +000038 for extension in "co":
39 compiled_path = self.module_path + extension
40 if os.path.exists(compiled_path):
41 os.remove(compiled_path)
42 f = open(self.module_path, 'w')
43 f.write(contents)
44 f.close()
Tim Petersab9ba272001-08-09 21:40:30 +000045
Guido van Rossum394a47b2001-08-02 14:14:20 +000046 def test_package_import__semantics(self):
47
48 # Generate a couple of broken modules to try importing.
49
50 # ...try loading the module when there's a SyntaxError
51 self.rewrite_file('for')
52 try: __import__(self.module_name)
53 except SyntaxError: pass
54 else: raise RuntimeError, 'Failed to induce SyntaxError'
Guido van Rossume2b70bc2006-08-18 22:13:04 +000055 self.assert_(self.module_name not in sys.modules and
Guido van Rossum394a47b2001-08-02 14:14:20 +000056 not hasattr(sys.modules[self.package_name], 'foo'))
57
58 # ...make up a variable name that isn't bound in __builtins__
59 var = 'a'
60 while var in dir(__builtins__):
61 var += random.choose(string.letters)
62
63 # ...make a module that just contains that
64 self.rewrite_file(var)
65
66 try: __import__(self.module_name)
67 except NameError: pass
68 else: raise RuntimeError, 'Failed to induce NameError.'
Guido van Rossum394a47b2001-08-02 14:14:20 +000069
70 # ...now change the module so that the NameError doesn't
71 # happen
72 self.rewrite_file('%s = 1' % var)
Tim Peters99d001e2004-08-02 03:59:57 +000073 module = __import__(self.module_name).foo
Guido van Rossum394a47b2001-08-02 14:14:20 +000074 self.assertEqual(getattr(module, var), 1)
75
Fred Drake2e2be372001-09-20 21:33:42 +000076
77def test_main():
78 run_unittest(TestImport)
79
80
81if __name__ == "__main__":
82 test_main()