|
1 # Test packages (dotted-name import) |
|
2 |
|
3 import sys, os, tempfile, traceback |
|
4 from os import mkdir, rmdir, extsep # Can't test if these fail |
|
5 del mkdir, rmdir |
|
6 from test.test_support import verify, verbose, TestFailed |
|
7 |
|
8 # Helpers to create and destroy hierarchies. |
|
9 |
|
10 def mkhier(root, descr): |
|
11 if not os.path.isdir(root): |
|
12 mkdir(root) |
|
13 for name, contents in descr: |
|
14 comps = name.split() |
|
15 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() |
|
27 |
|
28 def mkdir(x): |
|
29 if verbose: print "mkdir", x |
|
30 os.mkdir(x) |
|
31 |
|
32 def cleanout(root): |
|
33 names = os.listdir(root) |
|
34 for name in names: |
|
35 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) |
|
40 rmdir(root) |
|
41 |
|
42 def rmdir(x): |
|
43 if verbose: print "rmdir", x |
|
44 os.rmdir(x) |
|
45 |
|
46 def fixdir(lst): |
|
47 try: |
|
48 lst.remove('__builtins__') |
|
49 except ValueError: |
|
50 pass |
|
51 return lst |
|
52 |
|
53 # Helper to run a test |
|
54 |
|
55 def runtest(hier, code): |
|
56 root = tempfile.mkdtemp() |
|
57 mkhier(root, hier) |
|
58 savepath = sys.path[:] |
|
59 fd, fname = tempfile.mkstemp(text=True) |
|
60 os.write(fd, code) |
|
61 os.close(fd) |
|
62 try: |
|
63 sys.path.insert(0, root) |
|
64 if verbose: print "sys.path =", sys.path |
|
65 try: |
|
66 execfile(fname, globals(), {}) |
|
67 except: |
|
68 traceback.print_exc(file=sys.stdout) |
|
69 finally: |
|
70 sys.path[:] = savepath |
|
71 os.unlink(fname) |
|
72 try: |
|
73 cleanout(root) |
|
74 except (os.error, IOError): |
|
75 pass |
|
76 |
|
77 # Test descriptions |
|
78 |
|
79 tests = [ |
|
80 ("t1", [("t1", None), ("t1 __init__"+os.extsep+"py", "")], "import t1"), |
|
81 |
|
82 ("t2", [ |
|
83 ("t2", None), |
|
84 ("t2 __init__"+os.extsep+"py", "'doc for t2'; print __name__, 'loading'"), |
|
85 ("t2 sub", None), |
|
86 ("t2 sub __init__"+os.extsep+"py", ""), |
|
87 ("t2 sub subsub", None), |
|
88 ("t2 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), |
|
89 ], |
|
90 """ |
|
91 import t2 |
|
92 print t2.__doc__ |
|
93 import t2.sub |
|
94 import t2.sub.subsub |
|
95 print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ |
|
96 import t2 |
|
97 from t2 import * |
|
98 print dir() |
|
99 from t2 import sub |
|
100 from t2.sub import subsub |
|
101 from t2.sub.subsub import spam |
|
102 print sub.__name__, subsub.__name__ |
|
103 print sub.subsub.__name__ |
|
104 print dir() |
|
105 import t2.sub |
|
106 import t2.sub.subsub |
|
107 print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__ |
|
108 from t2 import * |
|
109 print dir() |
|
110 """), |
|
111 |
|
112 ("t3", [ |
|
113 ("t3", None), |
|
114 ("t3 __init__"+os.extsep+"py", "print __name__, 'loading'"), |
|
115 ("t3 sub", None), |
|
116 ("t3 sub __init__"+os.extsep+"py", ""), |
|
117 ("t3 sub subsub", None), |
|
118 ("t3 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), |
|
119 ], |
|
120 """ |
|
121 import t3.sub.subsub |
|
122 print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__ |
|
123 reload(t3) |
|
124 reload(t3.sub) |
|
125 reload(t3.sub.subsub) |
|
126 """), |
|
127 |
|
128 ("t4", [ |
|
129 ("t4"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (t4"+os.extsep+"py)'"), |
|
130 ("t4", None), |
|
131 ("t4 __init__"+os.extsep+"py", "print __name__, 'loading'"), |
|
132 ("t4 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), |
|
133 ("t4 sub", None), |
|
134 ("t4 sub __init__"+os.extsep+"py", ""), |
|
135 ("t4 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), |
|
136 ("t4 sub subsub", None), |
|
137 ("t4 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), |
|
138 ], |
|
139 """ |
|
140 from t4.sub.subsub import * |
|
141 print "t4.sub.subsub.spam =", spam |
|
142 """), |
|
143 |
|
144 ("t5", [ |
|
145 ("t5", None), |
|
146 ("t5 __init__"+os.extsep+"py", "import t5.foo"), |
|
147 ("t5 string"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), |
|
148 ("t5 foo"+os.extsep+"py", |
|
149 "print __name__, 'loading'; import string; print string.spam"), |
|
150 ], |
|
151 """ |
|
152 import t5 |
|
153 from t5 import * |
|
154 print dir() |
|
155 import t5 |
|
156 print fixdir(dir(t5)) |
|
157 print fixdir(dir(t5.foo)) |
|
158 print fixdir(dir(t5.string)) |
|
159 """), |
|
160 |
|
161 ("t6", [ |
|
162 ("t6", None), |
|
163 ("t6 __init__"+os.extsep+"py", "__all__ = ['spam', 'ham', 'eggs']"), |
|
164 ("t6 spam"+os.extsep+"py", "print __name__, 'loading'"), |
|
165 ("t6 ham"+os.extsep+"py", "print __name__, 'loading'"), |
|
166 ("t6 eggs"+os.extsep+"py", "print __name__, 'loading'"), |
|
167 ], |
|
168 """ |
|
169 import t6 |
|
170 print fixdir(dir(t6)) |
|
171 from t6 import * |
|
172 print fixdir(dir(t6)) |
|
173 print dir() |
|
174 """), |
|
175 |
|
176 ("t7", [ |
|
177 ("t7"+os.extsep+"py", "print 'Importing t7"+os.extsep+"py'"), |
|
178 ("t7", None), |
|
179 ("t7 __init__"+os.extsep+"py", "print __name__, 'loading'"), |
|
180 ("t7 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"), |
|
181 ("t7 sub", None), |
|
182 ("t7 sub __init__"+os.extsep+"py", ""), |
|
183 ("t7 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"), |
|
184 ("t7 sub subsub", None), |
|
185 ("t7 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"), |
|
186 ], |
|
187 """ |
|
188 t7, sub, subsub = None, None, None |
|
189 import t7 as tas |
|
190 print fixdir(dir(tas)) |
|
191 verify(not t7) |
|
192 from t7 import sub as subpar |
|
193 print fixdir(dir(subpar)) |
|
194 verify(not t7 and not sub) |
|
195 from t7.sub import subsub as subsubsub |
|
196 print fixdir(dir(subsubsub)) |
|
197 verify(not t7 and not sub and not subsub) |
|
198 from t7.sub.subsub import spam as ham |
|
199 print "t7.sub.subsub.spam =", ham |
|
200 verify(not t7 and not sub and not subsub) |
|
201 """), |
|
202 |
|
203 ] |
|
204 |
|
205 nontests = [ |
|
206 ("x5", [], ("import a" + ".a"*400)), |
|
207 ("x6", [], ("import a" + ".a"*499)), |
|
208 ("x7", [], ("import a" + ".a"*500)), |
|
209 ("x8", [], ("import a" + ".a"*1100)), |
|
210 ("x9", [], ("import " + "a"*400)), |
|
211 ("x10", [], ("import " + "a"*500)), |
|
212 ("x11", [], ("import " + "a"*998)), |
|
213 ("x12", [], ("import " + "a"*999)), |
|
214 ("x13", [], ("import " + "a"*999)), |
|
215 ("x14", [], ("import " + "a"*2000)), |
|
216 ] |
|
217 |
|
218 """XXX Things to test |
|
219 |
|
220 import package without __init__ |
|
221 import package with __init__ |
|
222 __init__ importing submodule |
|
223 __init__ importing global module |
|
224 __init__ defining variables |
|
225 submodule importing other submodule |
|
226 submodule importing global module |
|
227 submodule import submodule via global name |
|
228 from package import submodule |
|
229 from package import subpackage |
|
230 from package import variable (defined in __init__) |
|
231 from package import * (defined in __init__) |
|
232 """ |
|
233 |
|
234 # Run the tests |
|
235 |
|
236 args = [] |
|
237 if __name__ == '__main__': |
|
238 args = sys.argv[1:] |
|
239 if args and args[0] == '-q': |
|
240 verbose = 0 |
|
241 del args[0] |
|
242 |
|
243 for name, hier, code in tests: |
|
244 if args and name not in args: |
|
245 print "skipping test", name |
|
246 continue |
|
247 print "running test", name |
|
248 runtest(hier, code) |
|
249 |
|
250 # Test |
|
251 import sys |
|
252 import imp |
|
253 try: |
|
254 import sys.imp |
|
255 except ImportError: |
|
256 # This is what we expect |
|
257 pass |
|
258 else: |
|
259 raise TestFailed, "No ImportError exception on 'import sys.imp'" |