[2.7] bpo-30366: Backport tests for test.support. (#1582) · python/cpython@eb66897 (original) (raw)
`@@ -22,6 +22,7 @@
`
22
22
`import time
`
23
23
`import struct
`
24
24
`import sysconfig
`
``
25
`+
import types
`
25
26
`try:
`
26
27
`import thread
`
27
28
`except ImportError:
`
`@@ -155,8 +156,17 @@ def get_attribute(obj, name):
`
155
156
`try:
`
156
157
`attribute = getattr(obj, name)
`
157
158
`except AttributeError:
`
158
``
`-
raise unittest.SkipTest("module %s has no attribute %s" % (
`
159
``
`-
obj.name, name))
`
``
159
`+
if isinstance(obj, types.ModuleType):
`
``
160
`+
msg = "module %r has no attribute %r" % (obj.name, name)
`
``
161
`+
elif isinstance(obj, types.ClassType):
`
``
162
`+
msg = "class %s has no attribute %r" % (obj.name, name)
`
``
163
`+
elif isinstance(obj, types.InstanceType):
`
``
164
`+
msg = "%s instance has no attribute %r" % (obj.class.name, name)
`
``
165
`+
elif isinstance(obj, type):
`
``
166
`+
msg = "type object %r has no attribute %r" % (obj.name, name)
`
``
167
`+
else:
`
``
168
`+
msg = "%r object has no attribute %r" % (type(obj).name, name)
`
``
169
`+
raise unittest.SkipTest(msg)
`
160
170
`else:
`
161
171
`return attribute
`
162
172
``
`@@ -705,6 +715,49 @@ def u(s):
`
705
715
`# Save the initial cwd
`
706
716
`SAVEDCWD = os.getcwd()
`
707
717
``
``
718
`+
@contextlib.contextmanager
`
``
719
`+
def temp_dir(path=None, quiet=False):
`
``
720
`+
"""Return a context manager that creates a temporary directory.
`
``
721
+
``
722
`+
Arguments:
`
``
723
+
``
724
`+
path: the directory to create temporarily. If omitted or None,
`
``
725
`+
defaults to creating a temporary directory using tempfile.mkdtemp.
`
``
726
+
``
727
`+
quiet: if False (the default), the context manager raises an exception
`
``
728
`+
on error. Otherwise, if the path is specified and cannot be
`
``
729
`+
created, only a warning is issued.
`
``
730
+
``
731
`+
"""
`
``
732
`+
dir_created = False
`
``
733
`+
if path is None:
`
``
734
`+
import tempfile
`
``
735
`+
path = tempfile.mkdtemp()
`
``
736
`+
dir_created = True
`
``
737
`+
path = os.path.realpath(path)
`
``
738
`+
else:
`
``
739
`+
if (have_unicode and isinstance(path, unicode) and
`
``
740
`+
not os.path.supports_unicode_filenames):
`
``
741
`+
try:
`
``
742
`+
path = path.encode(sys.getfilesystemencoding() or 'ascii')
`
``
743
`+
except UnicodeEncodeError:
`
``
744
`+
if not quiet:
`
``
745
`+
raise unittest.SkipTest('unable to encode the cwd name with '
`
``
746
`+
'the filesystem encoding.')
`
``
747
`+
try:
`
``
748
`+
os.mkdir(path)
`
``
749
`+
dir_created = True
`
``
750
`+
except OSError:
`
``
751
`+
if not quiet:
`
``
752
`+
raise
`
``
753
`+
warnings.warn('tests may fail, unable to create temp dir: ' + path,
`
``
754
`+
RuntimeWarning, stacklevel=3)
`
``
755
`+
try:
`
``
756
`+
yield path
`
``
757
`+
finally:
`
``
758
`+
if dir_created:
`
``
759
`+
rmtree(path)
`
``
760
+
708
761
`@contextlib.contextmanager
`
709
762
`def change_cwd(path, quiet=False):
`
710
763
`"""Return a context manager that changes the current working directory.
`
`@@ -735,38 +788,21 @@ def change_cwd(path, quiet=False):
`
735
788
`@contextlib.contextmanager
`
736
789
`def temp_cwd(name='tempcwd', quiet=False):
`
737
790
`"""
`
738
``
`-
Context manager that creates a temporary directory and set it as CWD.
`
``
791
`+
Context manager that temporarily creates and changes the CWD.
`
``
792
+
``
793
`+
The function temporarily changes the current working directory
`
``
794
`+
after creating a temporary directory in the current directory with
`
``
795
`+
name name. If name is None, the temporary directory is
`
``
796
`+
created using tempfile.mkdtemp.
`
``
797
+
``
798
`+
If quiet is False (default) and it is not possible to
`
``
799
`+
create or change the CWD, an error is raised. If quiet is True,
`
``
800
`+
only a warning is raised and the original CWD is used.
`
739
801
``
740
``
`-
The new CWD is created in the current directory and it's named name.
`
741
``
`-
If quiet is False (default) and it's not possible to create or change
`
742
``
`-
the CWD, an error is raised. If it's True, only a warning is raised
`
743
``
`-
and the original CWD is used.
`
744
802
` """
`
745
``
`-
if (have_unicode and isinstance(name, unicode) and
`
746
``
`-
not os.path.supports_unicode_filenames):
`
747
``
`-
try:
`
748
``
`-
name = name.encode(sys.getfilesystemencoding() or 'ascii')
`
749
``
`-
except UnicodeEncodeError:
`
750
``
`-
if not quiet:
`
751
``
`-
raise unittest.SkipTest('unable to encode the cwd name with '
`
752
``
`-
'the filesystem encoding.')
`
753
``
`-
saved_dir = os.getcwd()
`
754
``
`-
is_temporary = False
`
755
``
`-
try:
`
756
``
`-
os.mkdir(name)
`
757
``
`-
os.chdir(name)
`
758
``
`-
is_temporary = True
`
759
``
`-
except OSError:
`
760
``
`-
if not quiet:
`
761
``
`-
raise
`
762
``
`-
warnings.warn('tests may fail, unable to change the CWD to ' + name,
`
763
``
`-
RuntimeWarning, stacklevel=3)
`
764
``
`-
try:
`
765
``
`-
yield os.getcwd()
`
766
``
`-
finally:
`
767
``
`-
os.chdir(saved_dir)
`
768
``
`-
if is_temporary:
`
769
``
`-
rmtree(name)
`
``
803
`+
with temp_dir(path=name, quiet=quiet) as temp_path:
`
``
804
`+
with change_cwd(temp_path, quiet=quiet) as cwd_dir:
`
``
805
`+
yield cwd_dir
`
770
806
``
771
807
`# TEST_HOME_DIR refers to the top level directory of the "test" package
`
772
808
`# that contains Python's regression test suite
`
`@@ -810,9 +846,14 @@ def make_bad_fd():
`
810
846
`file.close()
`
811
847
`unlink(TESTFN)
`
812
848
``
813
``
`-
def check_syntax_error(testcase, statement):
`
814
``
`-
testcase.assertRaises(SyntaxError, compile, statement,
`
815
``
`-
'', 'exec')
`
``
849
`+
def check_syntax_error(testcase, statement, lineno=None, offset=None):
`
``
850
`+
with testcase.assertRaises(SyntaxError) as cm:
`
``
851
`+
compile(statement, '', 'exec')
`
``
852
`+
err = cm.exception
`
``
853
`+
if lineno is not None:
`
``
854
`+
testcase.assertEqual(err.lineno, lineno)
`
``
855
`+
if offset is not None:
`
``
856
`+
testcase.assertEqual(err.offset, offset)
`
816
857
``
817
858
`def open_urlresource(url, check=None):
`
818
859
`import urlparse, urllib2
`
`@@ -1785,3 +1826,13 @@ def disable_gc():
`
1785
1826
`finally:
`
1786
1827
`if have_gc:
`
1787
1828
`gc.enable()
`
``
1829
+
``
1830
+
``
1831
`+
def python_is_optimized():
`
``
1832
`+
"""Find if Python was built with optimizations."""
`
``
1833
`+
cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
`
``
1834
`+
final_opt = ""
`
``
1835
`+
for opt in cflags.split():
`
``
1836
`+
if opt.startswith('-O'):
`
``
1837
`+
final_opt = opt
`
``
1838
`+
return final_opt not in ('', '-O0', '-Og')
`