blob: 2cede19b405e32885edccac516510f49bbdef151 [file] [log] [blame]
Thomas Woutersa9773292006-04-21 09:43:23 +00001# Test the runpy module
2import unittest
3import os
4import os.path
5import sys
Nick Coghlan16eb0fb2009-11-18 11:35:25 +00006import re
Thomas Woutersa9773292006-04-21 09:43:23 +00007import tempfile
Barry Warsaw28a691b2010-04-17 00:19:56 +00008import py_compile
Brett Cannon31f59292011-02-21 19:29:56 +00009from test.support import (
Victor Stinnerbf816222011-06-30 23:25:47 +020010 forget, make_legacy_pyc, run_unittest, unload, verbose, no_tracing,
11 create_empty_file)
Barry Warsaw28a691b2010-04-17 00:19:56 +000012from test.script_helper import (
13 make_pkg, make_script, make_zip_pkg, make_zip_script, temp_dir)
Christian Heimescbf3b5c2007-12-03 21:02:03 +000014
Nick Coghlan260bd3e2009-11-16 06:49:25 +000015
16from runpy import _run_code, _run_module_code, run_module, run_path
Christian Heimescbf3b5c2007-12-03 21:02:03 +000017# Note: This module can't safely test _run_module_as_main as it
18# runs its tests in the current process, which would mess with the
19# real __main__ module (usually test.regrtest)
20# See test_cmd_line_script for a test that executes that code path
Thomas Woutersa9773292006-04-21 09:43:23 +000021
22# Set up the test code and expected results
23
24class RunModuleCodeTest(unittest.TestCase):
Nick Coghlan260bd3e2009-11-16 06:49:25 +000025 """Unit tests for runpy._run_code and runpy._run_module_code"""
Thomas Woutersa9773292006-04-21 09:43:23 +000026
27 expected_result = ["Top level assignment", "Lower level reference"]
28 test_source = (
29 "# Check basic code execution\n"
30 "result = ['Top level assignment']\n"
31 "def f():\n"
32 " result.append('Lower level reference')\n"
33 "f()\n"
34 "# Check the sys module\n"
35 "import sys\n"
36 "run_argv0 = sys.argv[0]\n"
Guido van Rossum806c2462007-08-06 23:33:07 +000037 "run_name_in_sys_modules = __name__ in sys.modules\n"
38 "if run_name_in_sys_modules:\n"
39 " module_in_sys_modules = globals() is sys.modules[__name__].__dict__\n"
Thomas Woutersa9773292006-04-21 09:43:23 +000040 "# Check nested operation\n"
41 "import runpy\n"
Guido van Rossum806c2462007-08-06 23:33:07 +000042 "nested = runpy._run_module_code('x=1\\n', mod_name='<run>')\n"
Thomas Woutersa9773292006-04-21 09:43:23 +000043 )
44
Thomas Woutersed03b412007-08-28 21:37:11 +000045 def test_run_code(self):
46 saved_argv0 = sys.argv[0]
47 d = _run_code(self.test_source, {})
Nick Coghlan260bd3e2009-11-16 06:49:25 +000048 self.assertEqual(d["result"], self.expected_result)
49 self.assertIs(d["__name__"], None)
50 self.assertIs(d["__file__"], None)
Barry Warsaw28a691b2010-04-17 00:19:56 +000051 self.assertIs(d["__cached__"], None)
Nick Coghlan260bd3e2009-11-16 06:49:25 +000052 self.assertIs(d["__loader__"], None)
53 self.assertIs(d["__package__"], None)
54 self.assertIs(d["run_argv0"], saved_argv0)
55 self.assertNotIn("run_name", d)
56 self.assertIs(sys.argv[0], saved_argv0)
Thomas Woutersa9773292006-04-21 09:43:23 +000057
58 def test_run_module_code(self):
59 initial = object()
60 name = "<Nonsense>"
61 file = "Some other nonsense"
62 loader = "Now you're just being silly"
Christian Heimescbf3b5c2007-12-03 21:02:03 +000063 package = '' # Treat as a top level module
Thomas Woutersa9773292006-04-21 09:43:23 +000064 d1 = dict(initial=initial)
65 saved_argv0 = sys.argv[0]
Thomas Woutersed03b412007-08-28 21:37:11 +000066 d2 = _run_module_code(self.test_source,
67 d1,
68 name,
69 file,
Christian Heimescbf3b5c2007-12-03 21:02:03 +000070 loader,
71 package)
Nick Coghlan260bd3e2009-11-16 06:49:25 +000072 self.assertNotIn("result", d1)
73 self.assertIs(d2["initial"], initial)
Thomas Woutersed03b412007-08-28 21:37:11 +000074 self.assertEqual(d2["result"], self.expected_result)
75 self.assertEqual(d2["nested"]["x"], 1)
Nick Coghlan260bd3e2009-11-16 06:49:25 +000076 self.assertIs(d2["__name__"], name)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000077 self.assertTrue(d2["run_name_in_sys_modules"])
78 self.assertTrue(d2["module_in_sys_modules"])
Nick Coghlan260bd3e2009-11-16 06:49:25 +000079 self.assertIs(d2["__file__"], file)
Barry Warsaw28a691b2010-04-17 00:19:56 +000080 self.assertIs(d2["__cached__"], None)
Nick Coghlan260bd3e2009-11-16 06:49:25 +000081 self.assertIs(d2["run_argv0"], file)
82 self.assertIs(d2["__loader__"], loader)
83 self.assertIs(d2["__package__"], package)
84 self.assertIs(sys.argv[0], saved_argv0)
85 self.assertNotIn(name, sys.modules)
Thomas Woutersed03b412007-08-28 21:37:11 +000086
Thomas Woutersa9773292006-04-21 09:43:23 +000087
88class RunModuleTest(unittest.TestCase):
Nick Coghlan260bd3e2009-11-16 06:49:25 +000089 """Unit tests for runpy.run_module"""
Thomas Woutersa9773292006-04-21 09:43:23 +000090
91 def expect_import_error(self, mod_name):
92 try:
93 run_module(mod_name)
94 except ImportError:
95 pass
96 else:
97 self.fail("Expected import error for " + mod_name)
98
99 def test_invalid_names(self):
Guido van Rossum806c2462007-08-06 23:33:07 +0000100 # Builtin module
Thomas Woutersa9773292006-04-21 09:43:23 +0000101 self.expect_import_error("sys")
Guido van Rossum806c2462007-08-06 23:33:07 +0000102 # Non-existent modules
Thomas Woutersa9773292006-04-21 09:43:23 +0000103 self.expect_import_error("sys.imp.eric")
104 self.expect_import_error("os.path.half")
105 self.expect_import_error("a.bee")
106 self.expect_import_error(".howard")
107 self.expect_import_error("..eaten")
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000108 # Package without __main__.py
109 self.expect_import_error("multiprocessing")
Thomas Woutersa9773292006-04-21 09:43:23 +0000110
111 def test_library_module(self):
112 run_module("runpy")
113
Guido van Rossum806c2462007-08-06 23:33:07 +0000114 def _add_pkg_dir(self, pkg_dir):
115 os.mkdir(pkg_dir)
Skip Montanaro7a98be22007-08-16 14:35:24 +0000116 pkg_fname = os.path.join(pkg_dir, "__init__.py")
Victor Stinnerbf816222011-06-30 23:25:47 +0200117 create_empty_file(pkg_fname)
Guido van Rossum806c2462007-08-06 23:33:07 +0000118 return pkg_fname
119
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000120 def _make_pkg(self, source, depth, mod_base="runpy_test"):
Thomas Woutersa9773292006-04-21 09:43:23 +0000121 pkg_name = "__runpy_pkg__"
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000122 test_fname = mod_base+os.extsep+"py"
Thomas Woutersa9773292006-04-21 09:43:23 +0000123 pkg_dir = sub_dir = tempfile.mkdtemp()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000124 if verbose: print(" Package tree in:", sub_dir)
Thomas Woutersa9773292006-04-21 09:43:23 +0000125 sys.path.insert(0, pkg_dir)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000126 if verbose: print(" Updated sys.path:", sys.path[0])
Thomas Woutersa9773292006-04-21 09:43:23 +0000127 for i in range(depth):
128 sub_dir = os.path.join(sub_dir, pkg_name)
Guido van Rossum806c2462007-08-06 23:33:07 +0000129 pkg_fname = self._add_pkg_dir(sub_dir)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000130 if verbose: print(" Next level in:", sub_dir)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000131 if verbose: print(" Created:", pkg_fname)
Thomas Woutersa9773292006-04-21 09:43:23 +0000132 mod_fname = os.path.join(sub_dir, test_fname)
133 mod_file = open(mod_fname, "w")
134 mod_file.write(source)
135 mod_file.close()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000136 if verbose: print(" Created:", mod_fname)
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000137 mod_name = (pkg_name+".")*depth + mod_base
Thomas Woutersa9773292006-04-21 09:43:23 +0000138 return pkg_dir, mod_fname, mod_name
139
140 def _del_pkg(self, top, depth, mod_name):
Guido van Rossum806c2462007-08-06 23:33:07 +0000141 for entry in list(sys.modules):
142 if entry.startswith("__runpy_pkg__"):
Thomas Woutersa9773292006-04-21 09:43:23 +0000143 del sys.modules[entry]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000144 if verbose: print(" Removed sys.modules entries")
Thomas Woutersa9773292006-04-21 09:43:23 +0000145 del sys.path[0]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000146 if verbose: print(" Removed sys.path entry")
Thomas Woutersa9773292006-04-21 09:43:23 +0000147 for root, dirs, files in os.walk(top, topdown=False):
148 for name in files:
149 try:
150 os.remove(os.path.join(root, name))
Guido van Rossumb940e112007-01-10 16:19:56 +0000151 except OSError as ex:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000152 if verbose: print(ex) # Persist with cleaning up
Thomas Woutersa9773292006-04-21 09:43:23 +0000153 for name in dirs:
154 fullname = os.path.join(root, name)
155 try:
156 os.rmdir(fullname)
Guido van Rossumb940e112007-01-10 16:19:56 +0000157 except OSError as ex:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000158 if verbose: print(ex) # Persist with cleaning up
Thomas Woutersa9773292006-04-21 09:43:23 +0000159 try:
160 os.rmdir(top)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000161 if verbose: print(" Removed package tree")
Guido van Rossumb940e112007-01-10 16:19:56 +0000162 except OSError as ex:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000163 if verbose: print(ex) # Persist with cleaning up
Thomas Woutersa9773292006-04-21 09:43:23 +0000164
165 def _check_module(self, depth):
166 pkg_dir, mod_fname, mod_name = (
167 self._make_pkg("x=1\n", depth))
Guido van Rossum04110fb2007-08-24 16:32:05 +0000168 forget(mod_name)
Thomas Woutersa9773292006-04-21 09:43:23 +0000169 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000170 if verbose: print("Running from source:", mod_name)
Thomas Woutersa9773292006-04-21 09:43:23 +0000171 d1 = run_module(mod_name) # Read from source
Benjamin Peterson577473f2010-01-19 00:09:57 +0000172 self.assertIn("x", d1)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000173 self.assertEqual(d1["x"], 1)
Thomas Woutersa9773292006-04-21 09:43:23 +0000174 del d1 # Ensure __loader__ entry doesn't keep file open
175 __import__(mod_name)
176 os.remove(mod_fname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000177 make_legacy_pyc(mod_fname)
Brett Cannon61b14252010-07-03 21:48:25 +0000178 unload(mod_name) # In case loader caches paths
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000179 if verbose: print("Running from compiled:", mod_name)
Thomas Woutersa9773292006-04-21 09:43:23 +0000180 d2 = run_module(mod_name) # Read from bytecode
Benjamin Peterson577473f2010-01-19 00:09:57 +0000181 self.assertIn("x", d2)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000182 self.assertEqual(d2["x"], 1)
Thomas Woutersa9773292006-04-21 09:43:23 +0000183 del d2 # Ensure __loader__ entry doesn't keep file open
184 finally:
185 self._del_pkg(pkg_dir, depth, mod_name)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000186 if verbose: print("Module executed successfully")
Thomas Woutersa9773292006-04-21 09:43:23 +0000187
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000188 def _check_package(self, depth):
189 pkg_dir, mod_fname, mod_name = (
190 self._make_pkg("x=1\n", depth, "__main__"))
191 pkg_name, _, _ = mod_name.rpartition(".")
192 forget(mod_name)
193 try:
194 if verbose: print("Running from source:", pkg_name)
195 d1 = run_module(pkg_name) # Read from source
Benjamin Peterson577473f2010-01-19 00:09:57 +0000196 self.assertIn("x", d1)
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000197 self.assertTrue(d1["x"] == 1)
198 del d1 # Ensure __loader__ entry doesn't keep file open
199 __import__(mod_name)
200 os.remove(mod_fname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000201 make_legacy_pyc(mod_fname)
Brett Cannon61b14252010-07-03 21:48:25 +0000202 unload(mod_name) # In case loader caches paths
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000203 if verbose: print("Running from compiled:", pkg_name)
204 d2 = run_module(pkg_name) # Read from bytecode
Benjamin Peterson577473f2010-01-19 00:09:57 +0000205 self.assertIn("x", d2)
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000206 self.assertTrue(d2["x"] == 1)
207 del d2 # Ensure __loader__ entry doesn't keep file open
208 finally:
209 self._del_pkg(pkg_dir, depth, pkg_name)
210 if verbose: print("Package executed successfully")
211
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000212 def _add_relative_modules(self, base_dir, source, depth):
Guido van Rossum806c2462007-08-06 23:33:07 +0000213 if depth <= 1:
214 raise ValueError("Relative module test needs depth > 1")
215 pkg_name = "__runpy_pkg__"
216 module_dir = base_dir
217 for i in range(depth):
218 parent_dir = module_dir
219 module_dir = os.path.join(module_dir, pkg_name)
220 # Add sibling module
Skip Montanaro7a98be22007-08-16 14:35:24 +0000221 sibling_fname = os.path.join(module_dir, "sibling.py")
Victor Stinnerbf816222011-06-30 23:25:47 +0200222 create_empty_file(sibling_fname)
Guido van Rossum806c2462007-08-06 23:33:07 +0000223 if verbose: print(" Added sibling module:", sibling_fname)
224 # Add nephew module
225 uncle_dir = os.path.join(parent_dir, "uncle")
226 self._add_pkg_dir(uncle_dir)
227 if verbose: print(" Added uncle package:", uncle_dir)
228 cousin_dir = os.path.join(uncle_dir, "cousin")
229 self._add_pkg_dir(cousin_dir)
230 if verbose: print(" Added cousin package:", cousin_dir)
Skip Montanaro7a98be22007-08-16 14:35:24 +0000231 nephew_fname = os.path.join(cousin_dir, "nephew.py")
Victor Stinnerbf816222011-06-30 23:25:47 +0200232 create_empty_file(nephew_fname)
Guido van Rossum806c2462007-08-06 23:33:07 +0000233 if verbose: print(" Added nephew module:", nephew_fname)
234
235 def _check_relative_imports(self, depth, run_name=None):
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000236 contents = r"""\
Guido van Rossum806c2462007-08-06 23:33:07 +0000237from __future__ import absolute_import
238from . import sibling
239from ..uncle.cousin import nephew
240"""
241 pkg_dir, mod_fname, mod_name = (
242 self._make_pkg(contents, depth))
243 try:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000244 self._add_relative_modules(pkg_dir, contents, depth)
245 pkg_name = mod_name.rpartition('.')[0]
Guido van Rossum806c2462007-08-06 23:33:07 +0000246 if verbose: print("Running from source:", mod_name)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000247 d1 = run_module(mod_name, run_name=run_name) # Read from source
Benjamin Peterson577473f2010-01-19 00:09:57 +0000248 self.assertIn("__package__", d1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000249 self.assertTrue(d1["__package__"] == pkg_name)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000250 self.assertIn("sibling", d1)
251 self.assertIn("nephew", d1)
Guido van Rossum806c2462007-08-06 23:33:07 +0000252 del d1 # Ensure __loader__ entry doesn't keep file open
253 __import__(mod_name)
254 os.remove(mod_fname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000255 make_legacy_pyc(mod_fname)
Brett Cannon61b14252010-07-03 21:48:25 +0000256 unload(mod_name) # In case the loader caches paths
Guido van Rossum806c2462007-08-06 23:33:07 +0000257 if verbose: print("Running from compiled:", mod_name)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000258 d2 = run_module(mod_name, run_name=run_name) # Read from bytecode
Benjamin Peterson577473f2010-01-19 00:09:57 +0000259 self.assertIn("__package__", d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000260 self.assertTrue(d2["__package__"] == pkg_name)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000261 self.assertIn("sibling", d2)
262 self.assertIn("nephew", d2)
Guido van Rossum806c2462007-08-06 23:33:07 +0000263 del d2 # Ensure __loader__ entry doesn't keep file open
264 finally:
265 self._del_pkg(pkg_dir, depth, mod_name)
266 if verbose: print("Module executed successfully")
267
Thomas Woutersa9773292006-04-21 09:43:23 +0000268 def test_run_module(self):
269 for depth in range(4):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000270 if verbose: print("Testing package depth:", depth)
Thomas Woutersa9773292006-04-21 09:43:23 +0000271 self._check_module(depth)
272
Benjamin Petersonf6489f92009-11-25 17:46:26 +0000273 def test_run_package(self):
274 for depth in range(1, 4):
275 if verbose: print("Testing package depth:", depth)
276 self._check_package(depth)
277
Guido van Rossum806c2462007-08-06 23:33:07 +0000278 def test_explicit_relative_import(self):
279 for depth in range(2, 5):
280 if verbose: print("Testing relative imports at depth:", depth)
281 self._check_relative_imports(depth)
282
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000283 def test_main_relative_import(self):
284 for depth in range(2, 5):
285 if verbose: print("Testing main relative imports at depth:", depth)
286 self._check_relative_imports(depth, "__main__")
287
Thomas Woutersa9773292006-04-21 09:43:23 +0000288
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000289class RunPathTest(unittest.TestCase):
290 """Unit tests for runpy.run_path"""
291 # Based on corresponding tests in test_cmd_line_script
292
293 test_source = """\
294# Script may be run with optimisation enabled, so don't rely on assert
295# statements being executed
296def assertEqual(lhs, rhs):
297 if lhs != rhs:
298 raise AssertionError('%r != %r' % (lhs, rhs))
299def assertIs(lhs, rhs):
300 if lhs is not rhs:
301 raise AssertionError('%r is not %r' % (lhs, rhs))
302# Check basic code execution
303result = ['Top level assignment']
304def f():
305 result.append('Lower level reference')
306f()
307assertEqual(result, ['Top level assignment', 'Lower level reference'])
308# Check the sys module
309import sys
310assertIs(globals(), sys.modules[__name__].__dict__)
311argv0 = sys.argv[0]
312"""
313
314 def _make_test_script(self, script_dir, script_basename, source=None):
315 if source is None:
316 source = self.test_source
317 return make_script(script_dir, script_basename, source)
318
319 def _check_script(self, script_name, expected_name, expected_file,
320 expected_argv0, expected_package):
321 result = run_path(script_name)
322 self.assertEqual(result["__name__"], expected_name)
323 self.assertEqual(result["__file__"], expected_file)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000324 self.assertEqual(result["__cached__"], None)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000325 self.assertIn("argv0", result)
326 self.assertEqual(result["argv0"], expected_argv0)
327 self.assertEqual(result["__package__"], expected_package)
328
329 def _check_import_error(self, script_name, msg):
Nick Coghlan16eb0fb2009-11-18 11:35:25 +0000330 msg = re.escape(msg)
Ezio Melottied3a7d22010-12-01 02:32:32 +0000331 self.assertRaisesRegex(ImportError, msg, run_path, script_name)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000332
333 def test_basic_script(self):
334 with temp_dir() as script_dir:
335 mod_name = 'script'
336 script_name = self._make_test_script(script_dir, mod_name)
337 self._check_script(script_name, "<run_path>", script_name,
338 script_name, None)
339
340 def test_script_compiled(self):
341 with temp_dir() as script_dir:
342 mod_name = 'script'
343 script_name = self._make_test_script(script_dir, mod_name)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000344 compiled_name = py_compile.compile(script_name, doraise=True)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000345 os.remove(script_name)
346 self._check_script(compiled_name, "<run_path>", compiled_name,
347 compiled_name, None)
348
349 def test_directory(self):
350 with temp_dir() as script_dir:
351 mod_name = '__main__'
352 script_name = self._make_test_script(script_dir, mod_name)
353 self._check_script(script_dir, "<run_path>", script_name,
354 script_dir, '')
355
356 def test_directory_compiled(self):
357 with temp_dir() as script_dir:
358 mod_name = '__main__'
359 script_name = self._make_test_script(script_dir, mod_name)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000360 compiled_name = py_compile.compile(script_name, doraise=True)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000361 os.remove(script_name)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000362 legacy_pyc = make_legacy_pyc(script_name)
363 self._check_script(script_dir, "<run_path>", legacy_pyc,
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000364 script_dir, '')
365
366 def test_directory_error(self):
367 with temp_dir() as script_dir:
368 mod_name = 'not_main'
369 script_name = self._make_test_script(script_dir, mod_name)
370 msg = "can't find '__main__' module in %r" % script_dir
371 self._check_import_error(script_dir, msg)
372
373 def test_zipfile(self):
374 with temp_dir() as script_dir:
375 mod_name = '__main__'
376 script_name = self._make_test_script(script_dir, mod_name)
377 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
378 self._check_script(zip_name, "<run_path>", fname, zip_name, '')
379
380 def test_zipfile_compiled(self):
381 with temp_dir() as script_dir:
382 mod_name = '__main__'
383 script_name = self._make_test_script(script_dir, mod_name)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000384 compiled_name = py_compile.compile(script_name, doraise=True)
385 zip_name, fname = make_zip_script(script_dir, 'test_zip',
386 compiled_name)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000387 self._check_script(zip_name, "<run_path>", fname, zip_name, '')
388
389 def test_zipfile_error(self):
390 with temp_dir() as script_dir:
391 mod_name = 'not_main'
392 script_name = self._make_test_script(script_dir, mod_name)
393 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
394 msg = "can't find '__main__' module in %r" % zip_name
395 self._check_import_error(zip_name, msg)
396
Brett Cannon31f59292011-02-21 19:29:56 +0000397 @no_tracing
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000398 def test_main_recursion_error(self):
399 with temp_dir() as script_dir, temp_dir() as dummy_dir:
400 mod_name = '__main__'
401 source = ("import runpy\n"
402 "runpy.run_path(%r)\n") % dummy_dir
403 script_name = self._make_test_script(script_dir, mod_name, source)
404 zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
405 msg = "recursion depth exceeded"
Ezio Melottied3a7d22010-12-01 02:32:32 +0000406 self.assertRaisesRegex(RuntimeError, msg, run_path, zip_name)
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000407
Victor Stinner6c471022011-07-04 01:45:39 +0200408 def test_encoding(self):
409 with temp_dir() as script_dir:
410 filename = os.path.join(script_dir, 'script.py')
411 with open(filename, 'w', encoding='latin1') as f:
412 f.write("""
413#coding:latin1
414"non-ASCII: h\xe9"
415""")
416 result = run_path(filename)
417 self.assertEqual(result['__doc__'], "non-ASCII: h\xe9")
Nick Coghlan260bd3e2009-11-16 06:49:25 +0000418
419
Thomas Woutersa9773292006-04-21 09:43:23 +0000420def test_main():
Brett Cannon61b14252010-07-03 21:48:25 +0000421 run_unittest(
422 RunModuleCodeTest,
423 RunModuleTest,
424 RunPathTest
425 )
Thomas Woutersa9773292006-04-21 09:43:23 +0000426
427if __name__ == "__main__":
428 test_main()