ยปCore Development>Code coverage>Lib/test/script_helper.py

Python code coverage for Lib/test/script_helper.py

#countcontent
1n/a# Common utility functions used by various script execution tests
2n/a# e.g. test_cmd_line, test_cmd_line_script and test_runpy
3n/a
4n/aimport importlib
5n/aimport sys
6n/aimport os
7n/aimport os.path
8n/aimport tempfile
9n/aimport subprocess
10n/aimport py_compile
11n/aimport contextlib
12n/aimport shutil
13n/aimport zipfile
14n/a
15n/afrom importlib.util import source_from_cache
16n/afrom test.support import make_legacy_pyc, strip_python_stderr, temp_dir
17n/a
18n/a# Executing the interpreter in a subprocess
19n/adef _assert_python(expected_success, *args, **env_vars):
20n/a cmd_line = [sys.executable, '-X', 'faulthandler']
21n/a if not env_vars:
22n/a cmd_line.append('-E')
23n/a # Need to preserve the original environment, for in-place testing of
24n/a # shared library builds.
25n/a env = os.environ.copy()
26n/a # But a special flag that can be set to override -- in this case, the
27n/a # caller is responsible to pass the full environment.
28n/a if env_vars.pop('__cleanenv', None):
29n/a env = {}
30n/a env.update(env_vars)
31n/a cmd_line.extend(args)
32n/a p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
33n/a stdout=subprocess.PIPE, stderr=subprocess.PIPE,
34n/a env=env)
35n/a try:
36n/a out, err = p.communicate()
37n/a finally:
38n/a subprocess._cleanup()
39n/a p.stdout.close()
40n/a p.stderr.close()
41n/a rc = p.returncode
42n/a err = strip_python_stderr(err)
43n/a if (rc and expected_success) or (not rc and not expected_success):
44n/a raise AssertionError(
45n/a "Process return code is %d, "
46n/a "stderr follows:\n%s" % (rc, err.decode('ascii', 'ignore')))
47n/a return rc, out, err
48n/a
49n/adef assert_python_ok(*args, **env_vars):
50n/a """
51n/a Assert that running the interpreter with `args` and optional environment
52n/a variables `env_vars` succeeds (rc == 0) and return a (return code, stdout,
53n/a stderr) tuple.
54n/a """
55n/a return _assert_python(True, *args, **env_vars)
56n/a
57n/adef assert_python_failure(*args, **env_vars):
58n/a """
59n/a Assert that running the interpreter with `args` and optional environment
60n/a variables `env_vars` fails (rc != 0) and return a (return code, stdout,
61n/a stderr) tuple.
62n/a """
63n/a return _assert_python(False, *args, **env_vars)
64n/a
65n/adef spawn_python(*args, **kw):
66n/a """Run a Python subprocess with the given arguments.
67n/a
68n/a kw is extra keyword args to pass to subprocess.Popen. Returns a Popen
69n/a object.
70n/a """
71n/a cmd_line = [sys.executable, '-E']
72n/a cmd_line.extend(args)
73n/a return subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
74n/a stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
75n/a **kw)
76n/a
77n/adef kill_python(p):
78n/a """Run the given Popen process until completion and return stdout."""
79n/a p.stdin.close()
80n/a data = p.stdout.read()
81n/a p.stdout.close()
82n/a # try to cleanup the child so we don't appear to leak when running
83n/a # with regrtest -R.
84n/a p.wait()
85n/a subprocess._cleanup()
86n/a return data
87n/a
88n/adef make_script(script_dir, script_basename, source):
89n/a script_filename = script_basename+os.extsep+'py'
90n/a script_name = os.path.join(script_dir, script_filename)
91n/a # The script should be encoded to UTF-8, the default string encoding
92n/a script_file = open(script_name, 'w', encoding='utf-8')
93n/a script_file.write(source)
94n/a script_file.close()
95n/a importlib.invalidate_caches()
96n/a return script_name
97n/a
98n/adef make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None):
99n/a zip_filename = zip_basename+os.extsep+'zip'
100n/a zip_name = os.path.join(zip_dir, zip_filename)
101n/a zip_file = zipfile.ZipFile(zip_name, 'w')
102n/a if name_in_zip is None:
103n/a parts = script_name.split(os.sep)
104n/a if len(parts) >= 2 and parts[-2] == '__pycache__':
105n/a legacy_pyc = make_legacy_pyc(source_from_cache(script_name))
106n/a name_in_zip = os.path.basename(legacy_pyc)
107n/a script_name = legacy_pyc
108n/a else:
109n/a name_in_zip = os.path.basename(script_name)
110n/a zip_file.write(script_name, name_in_zip)
111n/a zip_file.close()
112n/a #if test.support.verbose:
113n/a # zip_file = zipfile.ZipFile(zip_name, 'r')
114n/a # print 'Contents of %r:' % zip_name
115n/a # zip_file.printdir()
116n/a # zip_file.close()
117n/a return zip_name, os.path.join(zip_name, name_in_zip)
118n/a
119n/adef make_pkg(pkg_dir, init_source=''):
120n/a os.mkdir(pkg_dir)
121n/a make_script(pkg_dir, '__init__', init_source)
122n/a
123n/adef make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
124n/a source, depth=1, compiled=False):
125n/a unlink = []
126n/a init_name = make_script(zip_dir, '__init__', '')
127n/a unlink.append(init_name)
128n/a init_basename = os.path.basename(init_name)
129n/a script_name = make_script(zip_dir, script_basename, source)
130n/a unlink.append(script_name)
131n/a if compiled:
132n/a init_name = py_compile(init_name, doraise=True)
133n/a script_name = py_compile(script_name, doraise=True)
134n/a unlink.extend((init_name, script_name))
135n/a pkg_names = [os.sep.join([pkg_name]*i) for i in range(1, depth+1)]
136n/a script_name_in_zip = os.path.join(pkg_names[-1], os.path.basename(script_name))
137n/a zip_filename = zip_basename+os.extsep+'zip'
138n/a zip_name = os.path.join(zip_dir, zip_filename)
139n/a zip_file = zipfile.ZipFile(zip_name, 'w')
140n/a for name in pkg_names:
141n/a init_name_in_zip = os.path.join(name, init_basename)
142n/a zip_file.write(init_name, init_name_in_zip)
143n/a zip_file.write(script_name, script_name_in_zip)
144n/a zip_file.close()
145n/a for name in unlink:
146n/a os.unlink(name)
147n/a #if test.support.verbose:
148n/a # zip_file = zipfile.ZipFile(zip_name, 'r')
149n/a # print 'Contents of %r:' % zip_name
150n/a # zip_file.printdir()
151n/a # zip_file.close()
152n/a return zip_name, os.path.join(zip_name, script_name_in_zip)