blob: 7dec2e95e620133695b68b940d08e0c30ad7f243 [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
Eric S. Raymondfc170b12001-02-09 11:51:27 +00003import sys, os, tempfile, traceback
Guido van Rossume2ae77b2001-10-24 20:42:55 +00004from os import mkdir, rmdir, extsep # Can't test if these fail
Guido van Rossum6c612421997-09-06 18:42:57 +00005del mkdir, rmdir
Barry Warsaw04f357c2002-07-23 19:04:11 +00006from test.test_support import verify, verbose, TestFailed
Guido van Rossum6c612421997-09-06 18:42:57 +00007
8# Helpers to create and destroy hierarchies.
9
10def mkhier(root, descr):
Guido van Rossum3b0a3292002-08-09 16:38:32 +000011 if not os.path.isdir(root):
12 mkdir(root)
Guido van Rossum6c612421997-09-06 18:42:57 +000013 for name, contents in descr:
Eric S. Raymondfc170b12001-02-09 11:51:27 +000014 comps = name.split()
Guido van Rossum41360a41998-03-26 19:42:58 +000015 fullname = root
16 for c in comps:
17 fullname = os.path.join(fullname, c)
18 if contents is None:
19 mkdir(fullname)
20 else:
21 if verbose: print "write", fullname
22 f = open(fullname, "w")
23 f.write(contents)
24 if contents and contents[-1] != '\n':
25 f.write('\n')
26 f.close()
Guido van Rossum6c612421997-09-06 18:42:57 +000027
28def mkdir(x):
29 if verbose: print "mkdir", x
30 os.mkdir(x)
31
32def cleanout(root):
33 names = os.listdir(root)
34 for name in names:
Guido van Rossum41360a41998-03-26 19:42:58 +000035 fullname = os.path.join(root, name)
36 if os.path.isdir(fullname) and not os.path.islink(fullname):
37 cleanout(fullname)
38 else:
39 os.remove(fullname)
Guido van Rossum6c612421997-09-06 18:42:57 +000040 rmdir(root)
41
42def rmdir(x):
43 if verbose: print "rmdir", x
44 os.rmdir(x)
45
Barry Warsaw3a9d0612000-09-01 06:53:52 +000046def fixdir(lst):
47 try:
48 lst.remove('__builtins__')
49 except ValueError:
50 pass
51 return lst
52
Guido van Rossum6c612421997-09-06 18:42:57 +000053# Helper to run a test
54
55def runtest(hier, code):
Guido van Rossum3b0a3292002-08-09 16:38:32 +000056 root = tempfile.mkdtemp()
Guido van Rossum6c612421997-09-06 18:42:57 +000057 mkhier(root, hier)
58 savepath = sys.path[:]
Guido van Rossum3b0a3292002-08-09 16:38:32 +000059 codefile = tempfile.NamedTemporaryFile()
60 codefile.write(code)
61 codefile.flush()
Guido van Rossum6c612421997-09-06 18:42:57 +000062 try:
Guido van Rossum41360a41998-03-26 19:42:58 +000063 sys.path.insert(0, root)
64 if verbose: print "sys.path =", sys.path
65 try:
Guido van Rossum3b0a3292002-08-09 16:38:32 +000066 execfile(codefile.name, globals(), {})
Guido van Rossum41360a41998-03-26 19:42:58 +000067 except:
68 traceback.print_exc(file=sys.stdout)
Guido van Rossum6c612421997-09-06 18:42:57 +000069 finally:
Guido van Rossum41360a41998-03-26 19:42:58 +000070 sys.path[:] = savepath
71 try:
72 cleanout(root)
73 except (os.error, IOError):
74 pass
Guido van Rossum6c612421997-09-06 18:42:57 +000075
76# Test descriptions
77
78tests = [
Guido van Rossume2ae77b2001-10-24 20:42:55 +000079 ("t1", [("t1", None), ("t1 __init__"+os.extsep+"py", "")], "import t1"),
Fred Drake004d5e62000-10-23 17:22:08 +000080
Guido van Rossum6c612421997-09-06 18:42:57 +000081 ("t2", [
82 ("t2", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +000083 ("t2 __init__"+os.extsep+"py", "'doc for t2'; print __name__, 'loading'"),
Guido van Rossum6c612421997-09-06 18:42:57 +000084 ("t2 sub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +000085 ("t2 sub __init__"+os.extsep+"py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +000086 ("t2 sub subsub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +000087 ("t2 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
Guido van Rossum6c612421997-09-06 18:42:57 +000088 ],
89"""
90import t2
91print t2.__doc__
92import t2.sub
93import t2.sub.subsub
94print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
95import t2
96from t2 import *
97print dir()
98from t2 import sub
99from t2.sub import subsub
100from t2.sub.subsub import spam
101print sub.__name__, subsub.__name__
102print sub.subsub.__name__
103print dir()
104import t2.sub
105import t2.sub.subsub
106print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
107from t2 import *
108print dir()
109"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000110
Guido van Rossum6c612421997-09-06 18:42:57 +0000111 ("t3", [
112 ("t3", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000113 ("t3 __init__"+os.extsep+"py", "print __name__, 'loading'"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000114 ("t3 sub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000115 ("t3 sub __init__"+os.extsep+"py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +0000116 ("t3 sub subsub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000117 ("t3 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000118 ],
119"""
120import t3.sub.subsub
121print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
Guido van Rossum81da02e1997-09-06 19:58:53 +0000122reload(t3)
123reload(t3.sub)
124reload(t3.sub.subsub)
Guido van Rossum6c612421997-09-06 18:42:57 +0000125"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000126
Guido van Rossum6c612421997-09-06 18:42:57 +0000127 ("t4", [
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000128 ("t4"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (t4"+os.extsep+"py)'"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000129 ("t4", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000130 ("t4 __init__"+os.extsep+"py", "print __name__, 'loading'"),
131 ("t4 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000132 ("t4 sub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000133 ("t4 sub __init__"+os.extsep+"py", ""),
134 ("t4 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000135 ("t4 sub subsub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000136 ("t4 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
Guido van Rossum6c612421997-09-06 18:42:57 +0000137 ],
138"""
139from t4.sub.subsub import *
140print "t4.sub.subsub.spam =", spam
141"""),
142
143 ("t5", [
144 ("t5", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000145 ("t5 __init__"+os.extsep+"py", "import t5.foo"),
146 ("t5 string"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
147 ("t5 foo"+os.extsep+"py",
Guido van Rossum6c612421997-09-06 18:42:57 +0000148 "print __name__, 'loading'; import string; print string.spam"),
149 ],
150"""
Guido van Rossum10887a31997-09-07 06:12:11 +0000151import t5
Guido van Rossum6c612421997-09-06 18:42:57 +0000152from t5 import *
153print dir()
154import t5
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000155print fixdir(dir(t5))
156print fixdir(dir(t5.foo))
157print fixdir(dir(t5.string))
Guido van Rossum6c612421997-09-06 18:42:57 +0000158"""),
159
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000160 ("t6", [
161 ("t6", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000162 ("t6 __init__"+os.extsep+"py", "__all__ = ['spam', 'ham', 'eggs']"),
163 ("t6 spam"+os.extsep+"py", "print __name__, 'loading'"),
164 ("t6 ham"+os.extsep+"py", "print __name__, 'loading'"),
165 ("t6 eggs"+os.extsep+"py", "print __name__, 'loading'"),
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000166 ],
167"""
168import t6
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000169print fixdir(dir(t6))
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000170from t6 import *
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000171print fixdir(dir(t6))
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000172print dir()
173"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000174
Thomas Wouters52152252000-08-17 22:55:00 +0000175 ("t7", [
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000176 ("t7"+os.extsep+"py", "print 'Importing t7"+os.extsep+"py'"),
Thomas Wouters52152252000-08-17 22:55:00 +0000177 ("t7", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000178 ("t7 __init__"+os.extsep+"py", "print __name__, 'loading'"),
179 ("t7 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"),
Thomas Wouters52152252000-08-17 22:55:00 +0000180 ("t7 sub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000181 ("t7 sub __init__"+os.extsep+"py", ""),
182 ("t7 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"),
Thomas Wouters52152252000-08-17 22:55:00 +0000183 ("t7 sub subsub", None),
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000184 ("t7 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
Thomas Wouters52152252000-08-17 22:55:00 +0000185 ],
186"""
187t7, sub, subsub = None, None, None
188import t7 as tas
Tim Petersd304f442001-01-21 19:51:53 +0000189print fixdir(dir(tas))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000190verify(not t7)
Thomas Wouters52152252000-08-17 22:55:00 +0000191from t7 import sub as subpar
Tim Petersd304f442001-01-21 19:51:53 +0000192print fixdir(dir(subpar))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000193verify(not t7 and not sub)
Thomas Wouters52152252000-08-17 22:55:00 +0000194from t7.sub import subsub as subsubsub
Tim Petersd304f442001-01-21 19:51:53 +0000195print fixdir(dir(subsubsub))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000196verify(not t7 and not sub and not subsub)
Thomas Wouters52152252000-08-17 22:55:00 +0000197from t7.sub.subsub import spam as ham
198print "t7.sub.subsub.spam =", ham
Marc-André Lemburg36619082001-01-17 19:11:13 +0000199verify(not t7 and not sub and not subsub)
Thomas Wouters52152252000-08-17 22:55:00 +0000200"""),
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000201
Guido van Rossum6c612421997-09-06 18:42:57 +0000202]
203
204nontests = [
205 ("x5", [], ("import a" + ".a"*400)),
206 ("x6", [], ("import a" + ".a"*499)),
207 ("x7", [], ("import a" + ".a"*500)),
208 ("x8", [], ("import a" + ".a"*1100)),
209 ("x9", [], ("import " + "a"*400)),
210 ("x10", [], ("import " + "a"*500)),
211 ("x11", [], ("import " + "a"*998)),
212 ("x12", [], ("import " + "a"*999)),
213 ("x13", [], ("import " + "a"*999)),
214 ("x14", [], ("import " + "a"*2000)),
215]
216
217"""XXX Things to test
218
219import package without __init__
220import package with __init__
221__init__ importing submodule
222__init__ importing global module
223__init__ defining variables
224submodule importing other submodule
225submodule importing global module
226submodule import submodule via global name
227from package import submodule
228from package import subpackage
229from package import variable (defined in __init__)
230from package import * (defined in __init__)
231"""
232
233# Run the tests
234
Guido van Rossum10887a31997-09-07 06:12:11 +0000235args = []
236if __name__ == '__main__':
237 args = sys.argv[1:]
238 if args and args[0] == '-q':
Guido van Rossum41360a41998-03-26 19:42:58 +0000239 verbose = 0
240 del args[0]
Guido van Rossum10887a31997-09-07 06:12:11 +0000241
Guido van Rossum6c612421997-09-06 18:42:57 +0000242for name, hier, code in tests:
Guido van Rossum10887a31997-09-07 06:12:11 +0000243 if args and name not in args:
Guido van Rossum41360a41998-03-26 19:42:58 +0000244 print "skipping test", name
245 continue
Guido van Rossum6c612421997-09-06 18:42:57 +0000246 print "running test", name
247 runtest(hier, code)
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000248
249# Test
250import sys
251import imp
252try:
253 import sys.imp
254except ImportError:
255 # This is what we expect
256 pass
257else:
258 raise TestFailed, "No ImportError exception on 'import sys.imp'"