/Lib/test/test_pkgimport.py

http://unladen-swallow.googlecode.com/ · Python · 82 lines · 58 code · 18 blank · 6 comment · 14 complexity · 75e033498d2284f71e6422128fc52885 MD5 · raw file

  1. import os, sys, string, random, tempfile, unittest
  2. from test.test_support import run_unittest
  3. class TestImport(unittest.TestCase):
  4. def __init__(self, *args, **kw):
  5. self.package_name = 'PACKAGE_'
  6. while sys.modules.has_key(self.package_name):
  7. self.package_name += random.choose(string.letters)
  8. self.module_name = self.package_name + '.foo'
  9. unittest.TestCase.__init__(self, *args, **kw)
  10. def remove_modules(self):
  11. for module_name in (self.package_name, self.module_name):
  12. if sys.modules.has_key(module_name):
  13. del sys.modules[module_name]
  14. def setUp(self):
  15. self.test_dir = tempfile.mkdtemp()
  16. sys.path.append(self.test_dir)
  17. self.package_dir = os.path.join(self.test_dir,
  18. self.package_name)
  19. os.mkdir(self.package_dir)
  20. open(os.path.join(self.package_dir, '__init__'+os.extsep+'py'), 'w')
  21. self.module_path = os.path.join(self.package_dir, 'foo'+os.extsep+'py')
  22. def tearDown(self):
  23. for file in os.listdir(self.package_dir):
  24. os.remove(os.path.join(self.package_dir, file))
  25. os.rmdir(self.package_dir)
  26. os.rmdir(self.test_dir)
  27. self.assertNotEqual(sys.path.count(self.test_dir), 0)
  28. sys.path.remove(self.test_dir)
  29. self.remove_modules()
  30. def rewrite_file(self, contents):
  31. for extension in "co":
  32. compiled_path = self.module_path + extension
  33. if os.path.exists(compiled_path):
  34. os.remove(compiled_path)
  35. f = open(self.module_path, 'w')
  36. f.write(contents)
  37. f.close()
  38. def test_package_import__semantics(self):
  39. # Generate a couple of broken modules to try importing.
  40. # ...try loading the module when there's a SyntaxError
  41. self.rewrite_file('for')
  42. try: __import__(self.module_name)
  43. except SyntaxError: pass
  44. else: raise RuntimeError, 'Failed to induce SyntaxError'
  45. self.assert_(not sys.modules.has_key(self.module_name) and
  46. not hasattr(sys.modules[self.package_name], 'foo'))
  47. # ...make up a variable name that isn't bound in __builtins__
  48. var = 'a'
  49. while var in dir(__builtins__):
  50. var += random.choose(string.letters)
  51. # ...make a module that just contains that
  52. self.rewrite_file(var)
  53. try: __import__(self.module_name)
  54. except NameError: pass
  55. else: raise RuntimeError, 'Failed to induce NameError.'
  56. # ...now change the module so that the NameError doesn't
  57. # happen
  58. self.rewrite_file('%s = 1' % var)
  59. module = __import__(self.module_name).foo
  60. self.assertEqual(getattr(module, var), 1)
  61. def test_main():
  62. run_unittest(TestImport)
  63. if __name__ == "__main__":
  64. test_main()