# Test packages (dotted-name import) import sys, os, string, tempfile, traceback from os import mkdir, rmdir # Can't test if these fail del mkdir, rmdir from test_support import verbose if sys.argv[1:2] == ['-q']: verbose = 0 # Helpers to create and destroy hierarchies. def mkhier(root, descr): mkdir(root) for name, contents in descr: comps = string.split(name) fullname = root for c in comps: fullname = os.path.join(fullname, c) if contents is None: mkdir(fullname) else: if verbose: print "write", fullname f = open(fullname, "w") f.write(contents) if contents and contents[-1] != '\n': f.write('\n') f.close() def mkdir(x): if verbose: print "mkdir", x os.mkdir(x) def cleanout(root): names = os.listdir(root) for name in names: fullname = os.path.join(root, name) if os.path.isdir(fullname) and not os.path.islink(fullname): cleanout(fullname) else: os.remove(fullname) rmdir(root) def rmdir(x): if verbose: print "rmdir", x os.rmdir(x) # Helper to run a test def runtest(hier, code): root = tempfile.mktemp() mkhier(root, hier) savepath = sys.path[:] codefile = tempfile.mktemp() f = open(codefile, "w") f.write(code) f.close() try: sys.path.insert(0, root) if verbose: print "sys.path =", sys.path try: execfile(codefile, globals(), {}) except: traceback.print_exc() finally: sys.path[:] = savepath try: cleanout(root) except (os.error, IOError): pass os.remove(codefile) # Test descriptions tests = [ ("t1", [("t1", None)], "import ni"), ("t2", [ ("t2", None), ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"), ("t2 sub", None), ("t2 sub subsub", None), ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), ], """ import t2 print t2.__doc__ import t2.sub import t2.sub.subsub print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ import t2 from t2 import * print dir() from t2 import sub from t2.sub import subsub from t2.sub.subsub import spam print sub.__name__, subsub.__name__ print sub.subsub.__name__ print dir() import t2.sub import t2.sub.subsub print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ from t2 import * print dir() """), ("t3", [ ("t3", None), ("t3 __init__.py", "print __name__, 'loading'"), ("t3 sub", None), ("t3 sub subsub", None), ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), ], """ import t3.sub.subsub print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__ reload(t3) reload(t3.sub) reload(t3.sub.subsub) """), ("t4", [ ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"), ("t4", None), ("t4 __init__.py", "print __name__, 'loading'"), ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"), ("t4 sub", None), ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"), ("t4 sub subsub", None), ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"), ], """ from t4.sub.subsub import * print "t4.sub.subsub.spam =", spam """), ("t5", [ ("t5", None), ("t5 __init__.py", "import t5.foo"), ("t5 string.py", "print __name__, 'loading'; spam = 1"), ("t5 foo.py", "print __name__, 'loading'; import string; print string.spam"), ], """ from t5 import * print dir() import t5 print dir(t5) print dir(t5.foo) print dir(t5.string) """), ] nontests = [ ("x5", [], ("import a" + ".a"*400)), ("x6", [], ("import a" + ".a"*499)), ("x7", [], ("import a" + ".a"*500)), ("x8", [], ("import a" + ".a"*1100)), ("x9", [], ("import " + "a"*400)), ("x10", [], ("import " + "a"*500)), ("x11", [], ("import " + "a"*998)), ("x12", [], ("import " + "a"*999)), ("x13", [], ("import " + "a"*999)), ("x14", [], ("import " + "a"*2000)), ] """XXX Things to test import package without __init__ import package with __init__ __init__ importing submodule __init__ importing global module __init__ defining variables submodule importing other submodule submodule importing global module submodule import submodule via global name from package import submodule from package import subpackage from package import variable (defined in __init__) from package import * (defined in __init__) """ # Run the tests for name, hier, code in tests: print "running test", name runtest(hier, code)