]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_runpy.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / test / test_runpy.py
CommitLineData
4710c53d 1# Test the runpy module\r
2import unittest\r
3import os\r
4import os.path\r
5import sys\r
6import re\r
7import tempfile\r
8from test.test_support import verbose, run_unittest, forget\r
9from test.script_helper import (temp_dir, make_script, compile_script,\r
10 make_pkg, make_zip_script, make_zip_pkg)\r
11\r
12\r
13from runpy import _run_code, _run_module_code, run_module, run_path\r
14# Note: This module can't safely test _run_module_as_main as it\r
15# runs its tests in the current process, which would mess with the\r
16# real __main__ module (usually test.regrtest)\r
17# See test_cmd_line_script for a test that executes that code path\r
18\r
19# Set up the test code and expected results\r
20\r
21class RunModuleCodeTest(unittest.TestCase):\r
22 """Unit tests for runpy._run_code and runpy._run_module_code"""\r
23\r
24 expected_result = ["Top level assignment", "Lower level reference"]\r
25 test_source = (\r
26 "# Check basic code execution\n"\r
27 "result = ['Top level assignment']\n"\r
28 "def f():\n"\r
29 " result.append('Lower level reference')\n"\r
30 "f()\n"\r
31 "# Check the sys module\n"\r
32 "import sys\n"\r
33 "run_argv0 = sys.argv[0]\n"\r
34 "run_name_in_sys_modules = __name__ in sys.modules\n"\r
35 "if run_name_in_sys_modules:\n"\r
36 " module_in_sys_modules = globals() is sys.modules[__name__].__dict__\n"\r
37 "# Check nested operation\n"\r
38 "import runpy\n"\r
39 "nested = runpy._run_module_code('x=1\\n', mod_name='<run>')\n"\r
40 )\r
41\r
42 def test_run_code(self):\r
43 saved_argv0 = sys.argv[0]\r
44 d = _run_code(self.test_source, {})\r
45 self.assertEqual(d["result"], self.expected_result)\r
46 self.assertIs(d["__name__"], None)\r
47 self.assertIs(d["__file__"], None)\r
48 self.assertIs(d["__loader__"], None)\r
49 self.assertIs(d["__package__"], None)\r
50 self.assertIs(d["run_argv0"], saved_argv0)\r
51 self.assertNotIn("run_name", d)\r
52 self.assertIs(sys.argv[0], saved_argv0)\r
53\r
54 def test_run_module_code(self):\r
55 initial = object()\r
56 name = "<Nonsense>"\r
57 file = "Some other nonsense"\r
58 loader = "Now you're just being silly"\r
59 package = '' # Treat as a top level module\r
60 d1 = dict(initial=initial)\r
61 saved_argv0 = sys.argv[0]\r
62 d2 = _run_module_code(self.test_source,\r
63 d1,\r
64 name,\r
65 file,\r
66 loader,\r
67 package)\r
68 self.assertNotIn("result", d1)\r
69 self.assertIs(d2["initial"], initial)\r
70 self.assertEqual(d2["result"], self.expected_result)\r
71 self.assertEqual(d2["nested"]["x"], 1)\r
72 self.assertIs(d2["__name__"], name)\r
73 self.assertTrue(d2["run_name_in_sys_modules"])\r
74 self.assertTrue(d2["module_in_sys_modules"])\r
75 self.assertIs(d2["__file__"], file)\r
76 self.assertIs(d2["run_argv0"], file)\r
77 self.assertIs(d2["__loader__"], loader)\r
78 self.assertIs(d2["__package__"], package)\r
79 self.assertIs(sys.argv[0], saved_argv0)\r
80 self.assertNotIn(name, sys.modules)\r
81\r
82\r
83class RunModuleTest(unittest.TestCase):\r
84 """Unit tests for runpy.run_module"""\r
85\r
86 def expect_import_error(self, mod_name):\r
87 try:\r
88 run_module(mod_name)\r
89 except ImportError:\r
90 pass\r
91 else:\r
92 self.fail("Expected import error for " + mod_name)\r
93\r
94 def test_invalid_names(self):\r
95 # Builtin module\r
96 self.expect_import_error("sys")\r
97 # Non-existent modules\r
98 self.expect_import_error("sys.imp.eric")\r
99 self.expect_import_error("os.path.half")\r
100 self.expect_import_error("a.bee")\r
101 self.expect_import_error(".howard")\r
102 self.expect_import_error("..eaten")\r
103 # Package without __main__.py\r
104 self.expect_import_error("multiprocessing")\r
105\r
106 def test_library_module(self):\r
107 run_module("runpy")\r
108\r
109 def _add_pkg_dir(self, pkg_dir):\r
110 os.mkdir(pkg_dir)\r
111 pkg_fname = os.path.join(pkg_dir, "__init__"+os.extsep+"py")\r
112 pkg_file = open(pkg_fname, "w")\r
113 pkg_file.close()\r
114 return pkg_fname\r
115\r
116 def _make_pkg(self, source, depth, mod_base="runpy_test"):\r
117 pkg_name = "__runpy_pkg__"\r
118 test_fname = mod_base+os.extsep+"py"\r
119 pkg_dir = sub_dir = tempfile.mkdtemp()\r
120 if verbose: print " Package tree in:", sub_dir\r
121 sys.path.insert(0, pkg_dir)\r
122 if verbose: print " Updated sys.path:", sys.path[0]\r
123 for i in range(depth):\r
124 sub_dir = os.path.join(sub_dir, pkg_name)\r
125 pkg_fname = self._add_pkg_dir(sub_dir)\r
126 if verbose: print " Next level in:", sub_dir\r
127 if verbose: print " Created:", pkg_fname\r
128 mod_fname = os.path.join(sub_dir, test_fname)\r
129 mod_file = open(mod_fname, "w")\r
130 mod_file.write(source)\r
131 mod_file.close()\r
132 if verbose: print " Created:", mod_fname\r
133 mod_name = (pkg_name+".")*depth + mod_base\r
134 return pkg_dir, mod_fname, mod_name\r
135\r
136 def _del_pkg(self, top, depth, mod_name):\r
137 for entry in list(sys.modules):\r
138 if entry.startswith("__runpy_pkg__"):\r
139 del sys.modules[entry]\r
140 if verbose: print " Removed sys.modules entries"\r
141 del sys.path[0]\r
142 if verbose: print " Removed sys.path entry"\r
143 for root, dirs, files in os.walk(top, topdown=False):\r
144 for name in files:\r
145 try:\r
146 os.remove(os.path.join(root, name))\r
147 except OSError, ex:\r
148 if verbose: print ex # Persist with cleaning up\r
149 for name in dirs:\r
150 fullname = os.path.join(root, name)\r
151 try:\r
152 os.rmdir(fullname)\r
153 except OSError, ex:\r
154 if verbose: print ex # Persist with cleaning up\r
155 try:\r
156 os.rmdir(top)\r
157 if verbose: print " Removed package tree"\r
158 except OSError, ex:\r
159 if verbose: print ex # Persist with cleaning up\r
160\r
161 def _check_module(self, depth):\r
162 pkg_dir, mod_fname, mod_name = (\r
163 self._make_pkg("x=1\n", depth))\r
164 forget(mod_name)\r
165 try:\r
166 if verbose: print "Running from source:", mod_name\r
167 d1 = run_module(mod_name) # Read from source\r
168 self.assertIn("x", d1)\r
169 self.assertTrue(d1["x"] == 1)\r
170 del d1 # Ensure __loader__ entry doesn't keep file open\r
171 __import__(mod_name)\r
172 os.remove(mod_fname)\r
173 if verbose: print "Running from compiled:", mod_name\r
174 d2 = run_module(mod_name) # Read from bytecode\r
175 self.assertIn("x", d2)\r
176 self.assertTrue(d2["x"] == 1)\r
177 del d2 # Ensure __loader__ entry doesn't keep file open\r
178 finally:\r
179 self._del_pkg(pkg_dir, depth, mod_name)\r
180 if verbose: print "Module executed successfully"\r
181\r
182 def _check_package(self, depth):\r
183 pkg_dir, mod_fname, mod_name = (\r
184 self._make_pkg("x=1\n", depth, "__main__"))\r
185 pkg_name, _, _ = mod_name.rpartition(".")\r
186 forget(mod_name)\r
187 try:\r
188 if verbose: print "Running from source:", pkg_name\r
189 d1 = run_module(pkg_name) # Read from source\r
190 self.assertIn("x", d1)\r
191 self.assertTrue(d1["x"] == 1)\r
192 del d1 # Ensure __loader__ entry doesn't keep file open\r
193 __import__(mod_name)\r
194 os.remove(mod_fname)\r
195 if verbose: print "Running from compiled:", pkg_name\r
196 d2 = run_module(pkg_name) # Read from bytecode\r
197 self.assertIn("x", d2)\r
198 self.assertTrue(d2["x"] == 1)\r
199 del d2 # Ensure __loader__ entry doesn't keep file open\r
200 finally:\r
201 self._del_pkg(pkg_dir, depth, pkg_name)\r
202 if verbose: print "Package executed successfully"\r
203\r
204 def _add_relative_modules(self, base_dir, source, depth):\r
205 if depth <= 1:\r
206 raise ValueError("Relative module test needs depth > 1")\r
207 pkg_name = "__runpy_pkg__"\r
208 module_dir = base_dir\r
209 for i in range(depth):\r
210 parent_dir = module_dir\r
211 module_dir = os.path.join(module_dir, pkg_name)\r
212 # Add sibling module\r
213 sibling_fname = os.path.join(module_dir, "sibling"+os.extsep+"py")\r
214 sibling_file = open(sibling_fname, "w")\r
215 sibling_file.close()\r
216 if verbose: print " Added sibling module:", sibling_fname\r
217 # Add nephew module\r
218 uncle_dir = os.path.join(parent_dir, "uncle")\r
219 self._add_pkg_dir(uncle_dir)\r
220 if verbose: print " Added uncle package:", uncle_dir\r
221 cousin_dir = os.path.join(uncle_dir, "cousin")\r
222 self._add_pkg_dir(cousin_dir)\r
223 if verbose: print " Added cousin package:", cousin_dir\r
224 nephew_fname = os.path.join(cousin_dir, "nephew"+os.extsep+"py")\r
225 nephew_file = open(nephew_fname, "w")\r
226 nephew_file.close()\r
227 if verbose: print " Added nephew module:", nephew_fname\r
228\r
229 def _check_relative_imports(self, depth, run_name=None):\r
230 contents = r"""\\r
231from __future__ import absolute_import\r
232from . import sibling\r
233from ..uncle.cousin import nephew\r
234"""\r
235 pkg_dir, mod_fname, mod_name = (\r
236 self._make_pkg(contents, depth))\r
237 try:\r
238 self._add_relative_modules(pkg_dir, contents, depth)\r
239 pkg_name = mod_name.rpartition('.')[0]\r
240 if verbose: print "Running from source:", mod_name\r
241 d1 = run_module(mod_name, run_name=run_name) # Read from source\r
242 self.assertIn("__package__", d1)\r
243 self.assertTrue(d1["__package__"] == pkg_name)\r
244 self.assertIn("sibling", d1)\r
245 self.assertIn("nephew", d1)\r
246 del d1 # Ensure __loader__ entry doesn't keep file open\r
247 __import__(mod_name)\r
248 os.remove(mod_fname)\r
249 if verbose: print "Running from compiled:", mod_name\r
250 d2 = run_module(mod_name, run_name=run_name) # Read from bytecode\r
251 self.assertIn("__package__", d2)\r
252 self.assertTrue(d2["__package__"] == pkg_name)\r
253 self.assertIn("sibling", d2)\r
254 self.assertIn("nephew", d2)\r
255 del d2 # Ensure __loader__ entry doesn't keep file open\r
256 finally:\r
257 self._del_pkg(pkg_dir, depth, mod_name)\r
258 if verbose: print "Module executed successfully"\r
259\r
260 def test_run_module(self):\r
261 for depth in range(4):\r
262 if verbose: print "Testing package depth:", depth\r
263 self._check_module(depth)\r
264\r
265 def test_run_package(self):\r
266 for depth in range(1, 4):\r
267 if verbose: print "Testing package depth:", depth\r
268 self._check_package(depth)\r
269\r
270 def test_explicit_relative_import(self):\r
271 for depth in range(2, 5):\r
272 if verbose: print "Testing relative imports at depth:", depth\r
273 self._check_relative_imports(depth)\r
274\r
275 def test_main_relative_import(self):\r
276 for depth in range(2, 5):\r
277 if verbose: print "Testing main relative imports at depth:", depth\r
278 self._check_relative_imports(depth, "__main__")\r
279\r
280\r
281class RunPathTest(unittest.TestCase):\r
282 """Unit tests for runpy.run_path"""\r
283 # Based on corresponding tests in test_cmd_line_script\r
284\r
285 test_source = """\\r
286# Script may be run with optimisation enabled, so don't rely on assert\r
287# statements being executed\r
288def assertEqual(lhs, rhs):\r
289 if lhs != rhs:\r
290 raise AssertionError('%r != %r' % (lhs, rhs))\r
291def assertIs(lhs, rhs):\r
292 if lhs is not rhs:\r
293 raise AssertionError('%r is not %r' % (lhs, rhs))\r
294# Check basic code execution\r
295result = ['Top level assignment']\r
296def f():\r
297 result.append('Lower level reference')\r
298f()\r
299assertEqual(result, ['Top level assignment', 'Lower level reference'])\r
300# Check the sys module\r
301import sys\r
302assertIs(globals(), sys.modules[__name__].__dict__)\r
303argv0 = sys.argv[0]\r
304"""\r
305\r
306 def _make_test_script(self, script_dir, script_basename, source=None):\r
307 if source is None:\r
308 source = self.test_source\r
309 return make_script(script_dir, script_basename, source)\r
310\r
311 def _check_script(self, script_name, expected_name, expected_file,\r
312 expected_argv0, expected_package):\r
313 result = run_path(script_name)\r
314 self.assertEqual(result["__name__"], expected_name)\r
315 self.assertEqual(result["__file__"], expected_file)\r
316 self.assertIn("argv0", result)\r
317 self.assertEqual(result["argv0"], expected_argv0)\r
318 self.assertEqual(result["__package__"], expected_package)\r
319\r
320 def _check_import_error(self, script_name, msg):\r
321 msg = re.escape(msg)\r
322 self.assertRaisesRegexp(ImportError, msg, run_path, script_name)\r
323\r
324 def test_basic_script(self):\r
325 with temp_dir() as script_dir:\r
326 mod_name = 'script'\r
327 script_name = self._make_test_script(script_dir, mod_name)\r
328 self._check_script(script_name, "<run_path>", script_name,\r
329 script_name, None)\r
330\r
331 def test_script_compiled(self):\r
332 with temp_dir() as script_dir:\r
333 mod_name = 'script'\r
334 script_name = self._make_test_script(script_dir, mod_name)\r
335 compiled_name = compile_script(script_name)\r
336 os.remove(script_name)\r
337 self._check_script(compiled_name, "<run_path>", compiled_name,\r
338 compiled_name, None)\r
339\r
340 def test_directory(self):\r
341 with temp_dir() as script_dir:\r
342 mod_name = '__main__'\r
343 script_name = self._make_test_script(script_dir, mod_name)\r
344 self._check_script(script_dir, "<run_path>", script_name,\r
345 script_dir, '')\r
346\r
347 def test_directory_compiled(self):\r
348 with temp_dir() as script_dir:\r
349 mod_name = '__main__'\r
350 script_name = self._make_test_script(script_dir, mod_name)\r
351 compiled_name = compile_script(script_name)\r
352 os.remove(script_name)\r
353 self._check_script(script_dir, "<run_path>", compiled_name,\r
354 script_dir, '')\r
355\r
356 def test_directory_error(self):\r
357 with temp_dir() as script_dir:\r
358 mod_name = 'not_main'\r
359 script_name = self._make_test_script(script_dir, mod_name)\r
360 msg = "can't find '__main__' module in %r" % script_dir\r
361 self._check_import_error(script_dir, msg)\r
362\r
363 def test_zipfile(self):\r
364 with temp_dir() as script_dir:\r
365 mod_name = '__main__'\r
366 script_name = self._make_test_script(script_dir, mod_name)\r
367 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)\r
368 self._check_script(zip_name, "<run_path>", fname, zip_name, '')\r
369\r
370 def test_zipfile_compiled(self):\r
371 with temp_dir() as script_dir:\r
372 mod_name = '__main__'\r
373 script_name = self._make_test_script(script_dir, mod_name)\r
374 compiled_name = compile_script(script_name)\r
375 zip_name, fname = make_zip_script(script_dir, 'test_zip', compiled_name)\r
376 self._check_script(zip_name, "<run_path>", fname, zip_name, '')\r
377\r
378 def test_zipfile_error(self):\r
379 with temp_dir() as script_dir:\r
380 mod_name = 'not_main'\r
381 script_name = self._make_test_script(script_dir, mod_name)\r
382 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)\r
383 msg = "can't find '__main__' module in %r" % zip_name\r
384 self._check_import_error(zip_name, msg)\r
385\r
386 def test_main_recursion_error(self):\r
387 with temp_dir() as script_dir, temp_dir() as dummy_dir:\r
388 mod_name = '__main__'\r
389 source = ("import runpy\n"\r
390 "runpy.run_path(%r)\n") % dummy_dir\r
391 script_name = self._make_test_script(script_dir, mod_name, source)\r
392 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)\r
393 msg = "recursion depth exceeded"\r
394 self.assertRaisesRegexp(RuntimeError, msg, run_path, zip_name)\r
395\r
396\r
397\r
398def test_main():\r
399 run_unittest(RunModuleCodeTest, RunModuleTest, RunPathTest)\r
400\r
401if __name__ == "__main__":\r
402 test_main()\r