Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_runpy.py

    r2 r391  
    44import os.path
    55import sys
     6import re
    67import tempfile
    78from test.test_support import verbose, run_unittest, forget
    8 from runpy import _run_code, _run_module_code, run_module
    9 
     9from test.script_helper import (temp_dir, make_script, compile_script,
     10                                make_pkg, make_zip_script, make_zip_pkg)
     11
     12
     13from runpy import _run_code, _run_module_code, run_module, run_path
    1014# Note: This module can't safely test _run_module_as_main as it
    1115# runs its tests in the current process, which would mess with the
     
    1620
    1721class RunModuleCodeTest(unittest.TestCase):
     22    """Unit tests for runpy._run_code and runpy._run_module_code"""
    1823
    1924    expected_result = ["Top level assignment", "Lower level reference"]
     
    3843        saved_argv0 = sys.argv[0]
    3944        d = _run_code(self.test_source, {})
    40         self.failUnless(d["result"] == self.expected_result)
    41         self.failUnless(d["__name__"] is None)
    42         self.failUnless(d["__file__"] is None)
    43         self.failUnless(d["__loader__"] is None)
    44         self.failUnless(d["__package__"] is None)
    45         self.failUnless(d["run_argv0"] is saved_argv0)
    46         self.failUnless("run_name" not in d)
    47         self.failUnless(sys.argv[0] is saved_argv0)
     45        self.assertEqual(d["result"], self.expected_result)
     46        self.assertIs(d["__name__"], None)
     47        self.assertIs(d["__file__"], None)
     48        self.assertIs(d["__loader__"], None)
     49        self.assertIs(d["__package__"], None)
     50        self.assertIs(d["run_argv0"], saved_argv0)
     51        self.assertNotIn("run_name", d)
     52        self.assertIs(sys.argv[0], saved_argv0)
    4853
    4954    def test_run_module_code(self):
     
    6166                              loader,
    6267                              package)
    63         self.failUnless("result" not in d1)
    64         self.failUnless(d2["initial"] is initial)
    65         self.failUnless(d2["result"] == self.expected_result)
    66         self.failUnless(d2["nested"]["x"] == 1)
    67         self.failUnless(d2["__name__"] is name)
    68         self.failUnless(d2["run_name_in_sys_modules"])
    69         self.failUnless(d2["module_in_sys_modules"])
    70         self.failUnless(d2["__file__"] is file)
    71         self.failUnless(d2["run_argv0"] is file)
    72         self.failUnless(d2["__loader__"] is loader)
    73         self.failUnless(d2["__package__"] is package)
    74         self.failUnless(sys.argv[0] is saved_argv0)
    75         self.failUnless(name not in sys.modules)
     68        self.assertNotIn("result", d1)
     69        self.assertIs(d2["initial"], initial)
     70        self.assertEqual(d2["result"], self.expected_result)
     71        self.assertEqual(d2["nested"]["x"], 1)
     72        self.assertIs(d2["__name__"], name)
     73        self.assertTrue(d2["run_name_in_sys_modules"])
     74        self.assertTrue(d2["module_in_sys_modules"])
     75        self.assertIs(d2["__file__"], file)
     76        self.assertIs(d2["run_argv0"], file)
     77        self.assertIs(d2["__loader__"], loader)
     78        self.assertIs(d2["__package__"], package)
     79        self.assertIs(sys.argv[0], saved_argv0)
     80        self.assertNotIn(name, sys.modules)
    7681
    7782
    7883class RunModuleTest(unittest.TestCase):
     84    """Unit tests for runpy.run_module"""
    7985
    8086    def expect_import_error(self, mod_name):
     
    95101        self.expect_import_error(".howard")
    96102        self.expect_import_error("..eaten")
    97         # Package
    98         self.expect_import_error("logging")
     103        # Package without __main__.py
     104        self.expect_import_error("multiprocessing")
    99105
    100106    def test_library_module(self):
     
    108114        return pkg_fname
    109115
    110     def _make_pkg(self, source, depth):
     116    def _make_pkg(self, source, depth, mod_base="runpy_test"):
    111117        pkg_name = "__runpy_pkg__"
    112         test_fname = "runpy_test"+os.extsep+"py"
     118        test_fname = mod_base+os.extsep+"py"
    113119        pkg_dir = sub_dir = tempfile.mkdtemp()
    114120        if verbose: print "  Package tree in:", sub_dir
     
    125131        mod_file.close()
    126132        if verbose: print "  Created:", mod_fname
    127         mod_name = (pkg_name+".")*depth + "runpy_test"
     133        mod_name = (pkg_name+".")*depth + mod_base
    128134        return pkg_dir, mod_fname, mod_name
    129135
     
    160166            if verbose: print "Running from source:", mod_name
    161167            d1 = run_module(mod_name) # Read from source
    162             self.failUnless("x" in d1)
    163             self.failUnless(d1["x"] == 1)
     168            self.assertIn("x", d1)
     169            self.assertTrue(d1["x"] == 1)
    164170            del d1 # Ensure __loader__ entry doesn't keep file open
    165171            __import__(mod_name)
    166172            os.remove(mod_fname)
    167             if verbose: print "Running from compiled:", mod_name
    168             d2 = run_module(mod_name) # Read from bytecode
    169             self.failUnless("x" in d2)
    170             self.failUnless(d2["x"] == 1)
    171             del d2 # Ensure __loader__ entry doesn't keep file open
     173            if not sys.dont_write_bytecode:
     174                if verbose: print "Running from compiled:", mod_name
     175                d2 = run_module(mod_name) # Read from bytecode
     176                self.assertIn("x", d2)
     177                self.assertTrue(d2["x"] == 1)
     178                del d2 # Ensure __loader__ entry doesn't keep file open
    172179        finally:
    173180            self._del_pkg(pkg_dir, depth, mod_name)
    174181        if verbose: print "Module executed successfully"
     182
     183    def _check_package(self, depth):
     184        pkg_dir, mod_fname, mod_name = (
     185               self._make_pkg("x=1\n", depth, "__main__"))
     186        pkg_name, _, _ = mod_name.rpartition(".")
     187        forget(mod_name)
     188        try:
     189            if verbose: print "Running from source:", pkg_name
     190            d1 = run_module(pkg_name) # Read from source
     191            self.assertIn("x", d1)
     192            self.assertTrue(d1["x"] == 1)
     193            del d1 # Ensure __loader__ entry doesn't keep file open
     194            __import__(mod_name)
     195            os.remove(mod_fname)
     196            if not sys.dont_write_bytecode:
     197                if verbose: print "Running from compiled:", pkg_name
     198                d2 = run_module(pkg_name) # Read from bytecode
     199                self.assertIn("x", d2)
     200                self.assertTrue(d2["x"] == 1)
     201                del d2 # Ensure __loader__ entry doesn't keep file open
     202        finally:
     203            self._del_pkg(pkg_dir, depth, pkg_name)
     204        if verbose: print "Package executed successfully"
    175205
    176206    def _add_relative_modules(self, base_dir, source, depth):
     
    212242            if verbose: print "Running from source:", mod_name
    213243            d1 = run_module(mod_name, run_name=run_name) # Read from source
    214             self.failUnless("__package__" in d1)
    215             self.failUnless(d1["__package__"] == pkg_name)
    216             self.failUnless("sibling" in d1)
    217             self.failUnless("nephew" in d1)
     244            self.assertIn("__package__", d1)
     245            self.assertTrue(d1["__package__"] == pkg_name)
     246            self.assertIn("sibling", d1)
     247            self.assertIn("nephew", d1)
    218248            del d1 # Ensure __loader__ entry doesn't keep file open
    219249            __import__(mod_name)
    220250            os.remove(mod_fname)
    221             if verbose: print "Running from compiled:", mod_name
    222             d2 = run_module(mod_name, run_name=run_name) # Read from bytecode
    223             self.failUnless("__package__" in d2)
    224             self.failUnless(d2["__package__"] == pkg_name)
    225             self.failUnless("sibling" in d2)
    226             self.failUnless("nephew" in d2)
    227             del d2 # Ensure __loader__ entry doesn't keep file open
     251            if not sys.dont_write_bytecode:
     252                if verbose: print "Running from compiled:", mod_name
     253                d2 = run_module(mod_name, run_name=run_name) # Read from bytecode
     254                self.assertIn("__package__", d2)
     255                self.assertTrue(d2["__package__"] == pkg_name)
     256                self.assertIn("sibling", d2)
     257                self.assertIn("nephew", d2)
     258                del d2 # Ensure __loader__ entry doesn't keep file open
    228259        finally:
    229260            self._del_pkg(pkg_dir, depth, mod_name)
     
    235266            self._check_module(depth)
    236267
     268    def test_run_package(self):
     269        for depth in range(1, 4):
     270            if verbose: print "Testing package depth:", depth
     271            self._check_package(depth)
     272
    237273    def test_explicit_relative_import(self):
    238274        for depth in range(2, 5):
     
    246282
    247283
     284class RunPathTest(unittest.TestCase):
     285    """Unit tests for runpy.run_path"""
     286    # Based on corresponding tests in test_cmd_line_script
     287
     288    test_source = """\
     289# Script may be run with optimisation enabled, so don't rely on assert
     290# statements being executed
     291def assertEqual(lhs, rhs):
     292    if lhs != rhs:
     293        raise AssertionError('%r != %r' % (lhs, rhs))
     294def assertIs(lhs, rhs):
     295    if lhs is not rhs:
     296        raise AssertionError('%r is not %r' % (lhs, rhs))
     297# Check basic code execution
     298result = ['Top level assignment']
     299def f():
     300    result.append('Lower level reference')
     301f()
     302assertEqual(result, ['Top level assignment', 'Lower level reference'])
     303# Check the sys module
     304import sys
     305assertIs(globals(), sys.modules[__name__].__dict__)
     306argv0 = sys.argv[0]
     307"""
     308
     309    def _make_test_script(self, script_dir, script_basename, source=None):
     310        if source is None:
     311            source = self.test_source
     312        return make_script(script_dir, script_basename, source)
     313
     314    def _check_script(self, script_name, expected_name, expected_file,
     315                            expected_argv0, expected_package):
     316        result = run_path(script_name)
     317        self.assertEqual(result["__name__"], expected_name)
     318        self.assertEqual(result["__file__"], expected_file)
     319        self.assertIn("argv0", result)
     320        self.assertEqual(result["argv0"], expected_argv0)
     321        self.assertEqual(result["__package__"], expected_package)
     322
     323    def _check_import_error(self, script_name, msg):
     324        msg = re.escape(msg)
     325        self.assertRaisesRegexp(ImportError, msg, run_path, script_name)
     326
     327    def test_basic_script(self):
     328        with temp_dir() as script_dir:
     329            mod_name = 'script'
     330            script_name = self._make_test_script(script_dir, mod_name)
     331            self._check_script(script_name, "<run_path>", script_name,
     332                               script_name, None)
     333
     334    def test_script_compiled(self):
     335        with temp_dir() as script_dir:
     336            mod_name = 'script'
     337            script_name = self._make_test_script(script_dir, mod_name)
     338            compiled_name = compile_script(script_name)
     339            os.remove(script_name)
     340            self._check_script(compiled_name, "<run_path>", compiled_name,
     341                               compiled_name, None)
     342
     343    def test_directory(self):
     344        with temp_dir() as script_dir:
     345            mod_name = '__main__'
     346            script_name = self._make_test_script(script_dir, mod_name)
     347            self._check_script(script_dir, "<run_path>", script_name,
     348                               script_dir, '')
     349
     350    def test_directory_compiled(self):
     351        with temp_dir() as script_dir:
     352            mod_name = '__main__'
     353            script_name = self._make_test_script(script_dir, mod_name)
     354            compiled_name = compile_script(script_name)
     355            os.remove(script_name)
     356            self._check_script(script_dir, "<run_path>", compiled_name,
     357                               script_dir, '')
     358
     359    def test_directory_error(self):
     360        with temp_dir() as script_dir:
     361            mod_name = 'not_main'
     362            script_name = self._make_test_script(script_dir, mod_name)
     363            msg = "can't find '__main__' module in %r" % script_dir
     364            self._check_import_error(script_dir, msg)
     365
     366    def test_zipfile(self):
     367        with temp_dir() as script_dir:
     368            mod_name = '__main__'
     369            script_name = self._make_test_script(script_dir, mod_name)
     370            zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
     371            self._check_script(zip_name, "<run_path>", fname, zip_name, '')
     372
     373    def test_zipfile_compiled(self):
     374        with temp_dir() as script_dir:
     375            mod_name = '__main__'
     376            script_name = self._make_test_script(script_dir, mod_name)
     377            compiled_name = compile_script(script_name)
     378            zip_name, fname = make_zip_script(script_dir, 'test_zip', compiled_name)
     379            self._check_script(zip_name, "<run_path>", fname, zip_name, '')
     380
     381    def test_zipfile_error(self):
     382        with temp_dir() as script_dir:
     383            mod_name = 'not_main'
     384            script_name = self._make_test_script(script_dir, mod_name)
     385            zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
     386            msg = "can't find '__main__' module in %r" % zip_name
     387            self._check_import_error(zip_name, msg)
     388
     389    def test_main_recursion_error(self):
     390        with temp_dir() as script_dir, temp_dir() as dummy_dir:
     391            mod_name = '__main__'
     392            source = ("import runpy\n"
     393                      "runpy.run_path(%r)\n") % dummy_dir
     394            script_name = self._make_test_script(script_dir, mod_name, source)
     395            zip_name, fname = make_zip_script(script_dir, 'test_zip', script_name)
     396            msg = "recursion depth exceeded"
     397            self.assertRaisesRegexp(RuntimeError, msg, run_path, zip_name)
     398
     399
     400
    248401def test_main():
    249     run_unittest(RunModuleCodeTest)
    250     run_unittest(RunModuleTest)
     402    run_unittest(RunModuleCodeTest, RunModuleTest, RunPathTest)
    251403
    252404if __name__ == "__main__":
Note: See TracChangeset for help on using the changeset viewer.