Merged revisions 59005-59040 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
I've tried to fix test_cmd_line_script but I wasn't able to get all tests
right. Nick, can you please have a look?
........
r59020 | facundo.batista | 2007-11-16 19:04:14 +0100 (Fri, 16 Nov 2007) | 12 lines
Now in find, rfind, index, and rindex, you can use None as defaults,
as usual with slicing (both with str and unicode strings). This
fixes issue 1259.
For str only the stringobject.c file was modified. But for unicode,
I needed to repeat in the four functions a lot of code, so created
a new function that does part of the job for them (and placed it in
find.h, following a suggestion of Barry).
Also added tests for this behaviour.
........
r59021 | facundo.batista | 2007-11-16 19:41:24 +0100 (Fri, 16 Nov 2007) | 4 lines
Fix for stupid error (I need to remember to do a full 'make clean + make'
cycle before the tests...). Sorry.
........
r59022 | facundo.batista | 2007-11-16 20:16:15 +0100 (Fri, 16 Nov 2007) | 3 lines
Made _ParseTupleFinds only defined to unicodeobject.c
........
r59024 | raymond.hettinger | 2007-11-17 02:51:22 +0100 (Sat, 17 Nov 2007) | 1 line
Fix signature in example
........
r59033 | brett.cannon | 2007-11-17 08:07:29 +0100 (Sat, 17 Nov 2007) | 5 lines
Remove a confusing sentence about pth files and which directories are searched
for them.
Closes issue #1431. Thanks Giambattista Bloisi for the help.
........
r59039 | nick.coghlan | 2007-11-18 12:56:28 +0100 (Sun, 18 Nov 2007) | 1 line
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
........
2007-11-19 03:35:23 +08:00
|
|
|
# Tests command line execution of scripts
|
|
|
|
from __future__ import with_statement
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
import os
|
|
|
|
import os.path
|
|
|
|
import sys
|
2007-11-19 23:56:44 +08:00
|
|
|
import test.test_support
|
Merged revisions 59005-59040 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
I've tried to fix test_cmd_line_script but I wasn't able to get all tests
right. Nick, can you please have a look?
........
r59020 | facundo.batista | 2007-11-16 19:04:14 +0100 (Fri, 16 Nov 2007) | 12 lines
Now in find, rfind, index, and rindex, you can use None as defaults,
as usual with slicing (both with str and unicode strings). This
fixes issue 1259.
For str only the stringobject.c file was modified. But for unicode,
I needed to repeat in the four functions a lot of code, so created
a new function that does part of the job for them (and placed it in
find.h, following a suggestion of Barry).
Also added tests for this behaviour.
........
r59021 | facundo.batista | 2007-11-16 19:41:24 +0100 (Fri, 16 Nov 2007) | 4 lines
Fix for stupid error (I need to remember to do a full 'make clean + make'
cycle before the tests...). Sorry.
........
r59022 | facundo.batista | 2007-11-16 20:16:15 +0100 (Fri, 16 Nov 2007) | 3 lines
Made _ParseTupleFinds only defined to unicodeobject.c
........
r59024 | raymond.hettinger | 2007-11-17 02:51:22 +0100 (Sat, 17 Nov 2007) | 1 line
Fix signature in example
........
r59033 | brett.cannon | 2007-11-17 08:07:29 +0100 (Sat, 17 Nov 2007) | 5 lines
Remove a confusing sentence about pth files and which directories are searched
for them.
Closes issue #1431. Thanks Giambattista Bloisi for the help.
........
r59039 | nick.coghlan | 2007-11-18 12:56:28 +0100 (Sun, 18 Nov 2007) | 1 line
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
........
2007-11-19 03:35:23 +08:00
|
|
|
import tempfile
|
|
|
|
import subprocess
|
|
|
|
import py_compile
|
|
|
|
import contextlib
|
|
|
|
import shutil
|
|
|
|
import zipfile
|
|
|
|
|
|
|
|
verbose = test.test_support.verbose
|
|
|
|
|
|
|
|
# XXX ncoghlan: Should we consider moving these to test_support?
|
2007-11-19 23:56:44 +08:00
|
|
|
from test.test_cmd_line import _spawn_python, _kill_python
|
Merged revisions 59005-59040 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
I've tried to fix test_cmd_line_script but I wasn't able to get all tests
right. Nick, can you please have a look?
........
r59020 | facundo.batista | 2007-11-16 19:04:14 +0100 (Fri, 16 Nov 2007) | 12 lines
Now in find, rfind, index, and rindex, you can use None as defaults,
as usual with slicing (both with str and unicode strings). This
fixes issue 1259.
For str only the stringobject.c file was modified. But for unicode,
I needed to repeat in the four functions a lot of code, so created
a new function that does part of the job for them (and placed it in
find.h, following a suggestion of Barry).
Also added tests for this behaviour.
........
r59021 | facundo.batista | 2007-11-16 19:41:24 +0100 (Fri, 16 Nov 2007) | 4 lines
Fix for stupid error (I need to remember to do a full 'make clean + make'
cycle before the tests...). Sorry.
........
r59022 | facundo.batista | 2007-11-16 20:16:15 +0100 (Fri, 16 Nov 2007) | 3 lines
Made _ParseTupleFinds only defined to unicodeobject.c
........
r59024 | raymond.hettinger | 2007-11-17 02:51:22 +0100 (Sat, 17 Nov 2007) | 1 line
Fix signature in example
........
r59033 | brett.cannon | 2007-11-17 08:07:29 +0100 (Sat, 17 Nov 2007) | 5 lines
Remove a confusing sentence about pth files and which directories are searched
for them.
Closes issue #1431. Thanks Giambattista Bloisi for the help.
........
r59039 | nick.coghlan | 2007-11-18 12:56:28 +0100 (Sun, 18 Nov 2007) | 1 line
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
........
2007-11-19 03:35:23 +08:00
|
|
|
|
|
|
|
def _run_python(*args):
|
|
|
|
if __debug__:
|
|
|
|
p = _spawn_python(*args)
|
|
|
|
else:
|
|
|
|
p = _spawn_python('-O', *args)
|
|
|
|
stdout_data = _kill_python(p)
|
|
|
|
return p.wait(), stdout_data.decode()
|
|
|
|
|
|
|
|
@contextlib.contextmanager
|
|
|
|
def temp_dir():
|
|
|
|
dirname = tempfile.mkdtemp()
|
|
|
|
try:
|
|
|
|
yield dirname
|
|
|
|
finally:
|
|
|
|
shutil.rmtree(dirname)
|
|
|
|
|
|
|
|
test_source = ("""\
|
|
|
|
# Script may be run with optimisation enabled, so don't rely on assert
|
|
|
|
# statements being executed
|
|
|
|
def assertEqual(lhs, rhs):
|
|
|
|
if lhs != rhs:
|
|
|
|
raise AssertionError("%r != %r" % (lhs, rhs))
|
|
|
|
def assertIdentical(lhs, rhs):
|
|
|
|
if lhs is not rhs:
|
|
|
|
raise AssertionError("%r is not %r" % (lhs, rhs))
|
|
|
|
# Check basic code execution
|
|
|
|
result = ['Top level assignment']
|
|
|
|
def f():
|
|
|
|
result.append('Lower level reference')
|
|
|
|
f()
|
|
|
|
assertEqual(result, ['Top level assignment', 'Lower level reference'])
|
|
|
|
# Check population of magic variables
|
|
|
|
assertEqual(__name__, '__main__')
|
|
|
|
print('__file__==%r' % __file__)
|
|
|
|
# Check the sys module
|
|
|
|
import sys
|
|
|
|
assertIdentical(globals(), sys.modules[__name__].__dict__)
|
|
|
|
print('sys.argv[0]==%r' % sys.argv[0])
|
|
|
|
""")
|
|
|
|
|
|
|
|
def _make_test_script(script_dir, script_basename):
|
|
|
|
script_filename = script_basename+os.path.extsep+"py"
|
|
|
|
script_name = os.path.join(script_dir, script_filename)
|
|
|
|
script_file = open(script_name, "w")
|
|
|
|
script_file.write(test_source)
|
|
|
|
script_file.close()
|
|
|
|
return script_name
|
|
|
|
|
|
|
|
def _compile_test_script(script_name):
|
|
|
|
py_compile.compile(script_name, doraise=True)
|
|
|
|
if __debug__:
|
|
|
|
compiled_name = script_name + 'c'
|
|
|
|
else:
|
|
|
|
compiled_name = script_name + 'o'
|
|
|
|
return compiled_name
|
|
|
|
|
|
|
|
def _make_test_zip(zip_dir, zip_basename, script_name):
|
|
|
|
zip_filename = zip_basename+os.path.extsep+"zip"
|
|
|
|
zip_name = os.path.join(zip_dir, zip_filename)
|
|
|
|
zip_file = zipfile.ZipFile(zip_name, 'w')
|
|
|
|
zip_file.write(script_name, os.path.basename(script_name))
|
|
|
|
zip_file.close()
|
|
|
|
# if verbose:
|
|
|
|
# zip_file = zipfile.ZipFile(zip_name, 'r')
|
|
|
|
# print "Contents of %r:" % zip_name
|
|
|
|
# zip_file.printdir()
|
|
|
|
# zip_file.close()
|
|
|
|
return zip_name
|
|
|
|
|
|
|
|
class CmdLineTest(unittest.TestCase):
|
|
|
|
def _check_script(self, script_name, expected_file, expected_argv0):
|
|
|
|
exit_code, data = _run_python(script_name)
|
|
|
|
# if verbose:
|
|
|
|
# print "Output from test script %r:" % script_name
|
|
|
|
# print data
|
|
|
|
self.assertEqual(exit_code, 0, data)
|
|
|
|
printed_file = '__file__==%r' % expected_file
|
|
|
|
printed_argv0 = 'sys.argv[0]==%r' % expected_argv0
|
|
|
|
self.assert_(printed_file in data, (printed_file, data))
|
|
|
|
self.assert_(printed_argv0 in data, (printed_argv0, data))
|
|
|
|
|
|
|
|
def test_basic_script(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "script")
|
|
|
|
self._check_script(script_name, script_name, script_name)
|
|
|
|
|
|
|
|
def test_script_compiled(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "script")
|
|
|
|
compiled_name = _compile_test_script(script_name)
|
|
|
|
os.remove(script_name)
|
|
|
|
self._check_script(compiled_name, compiled_name, compiled_name)
|
|
|
|
|
|
|
|
def test_directory(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "__main__")
|
|
|
|
self._check_script(script_dir, script_name, script_dir)
|
|
|
|
|
|
|
|
def test_directory_compiled(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "__main__")
|
|
|
|
compiled_name = _compile_test_script(script_name)
|
|
|
|
os.remove(script_name)
|
|
|
|
self._check_script(script_dir, compiled_name, script_dir)
|
|
|
|
|
|
|
|
def test_zipfile(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "__main__")
|
|
|
|
zip_name = _make_test_zip(script_dir, "test_zip", script_name)
|
|
|
|
self._check_script(zip_name, None, zip_name)
|
|
|
|
|
|
|
|
def test_zipfile_compiled(self):
|
|
|
|
with temp_dir() as script_dir:
|
|
|
|
script_name = _make_test_script(script_dir, "__main__")
|
|
|
|
compiled_name = _compile_test_script(script_name)
|
|
|
|
zip_name = _make_test_zip(script_dir, "test_zip", compiled_name)
|
|
|
|
self._check_script(zip_name, None, zip_name)
|
|
|
|
|
|
|
|
|
|
|
|
def test_main():
|
|
|
|
test.test_support.run_unittest(CmdLineTest)
|
|
|
|
test.test_support.reap_children()
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
test_main()
|