mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Merge.
This commit is contained in:
commit
69cfcabae3
62 changed files with 1609 additions and 446 deletions
|
@ -42,6 +42,9 @@ Selecting tests
|
|||
-- specify which special resource intensive tests to run
|
||||
-M/--memlimit LIMIT
|
||||
-- run very large memory-consuming tests
|
||||
--testdir DIR
|
||||
-- execute test files in the specified directory (instead
|
||||
of the Python stdlib test suite)
|
||||
|
||||
Special runs
|
||||
|
||||
|
@ -265,7 +268,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir',
|
||||
'runleaks', 'huntrleaks=', 'memlimit=', 'randseed=',
|
||||
'multiprocess=', 'coverage', 'slaveargs=', 'forever', 'debug',
|
||||
'start=', 'nowindows', 'header'])
|
||||
'start=', 'nowindows', 'header', 'testdir='])
|
||||
except getopt.error as msg:
|
||||
usage(msg)
|
||||
|
||||
|
@ -315,7 +318,9 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
elif o in ('-T', '--coverage'):
|
||||
trace = True
|
||||
elif o in ('-D', '--coverdir'):
|
||||
coverdir = os.path.join(os.getcwd(), a)
|
||||
# CWD is replaced with a temporary dir before calling main(), so we
|
||||
# need join it with the saved CWD so it goes where the user expects.
|
||||
coverdir = os.path.join(support.SAVEDCWD, a)
|
||||
elif o in ('-N', '--nocoverdir'):
|
||||
coverdir = None
|
||||
elif o in ('-R', '--huntrleaks'):
|
||||
|
@ -393,6 +398,10 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
print() # Force a newline (just in case)
|
||||
print(json.dumps(result))
|
||||
sys.exit(0)
|
||||
elif o == '--testdir':
|
||||
# CWD is replaced with a temporary dir before calling main(), so we
|
||||
# join it with the saved CWD so it ends up where the user expects.
|
||||
testdir = os.path.join(support.SAVEDCWD, a)
|
||||
else:
|
||||
print(("No handler for option {}. Please report this as a bug "
|
||||
"at http://bugs.python.org.").format(o), file=sys.stderr)
|
||||
|
@ -467,7 +476,13 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
print("== ", os.getcwd())
|
||||
print("Testing with flags:", sys.flags)
|
||||
|
||||
alltests = findtests(testdir, stdtests, nottests)
|
||||
# if testdir is set, then we are not running the python tests suite, so
|
||||
# don't add default tests to be executed or skipped (pass empty values)
|
||||
if testdir:
|
||||
alltests = findtests(testdir, list(), set())
|
||||
else:
|
||||
alltests = findtests(testdir, stdtests, nottests)
|
||||
|
||||
selected = tests or args or alltests
|
||||
if single:
|
||||
selected = selected[:1]
|
||||
|
@ -713,6 +728,8 @@ def main(tests=None, testdir=None, verbose=0, quiet=False,
|
|||
sys.exit(len(bad) > 0 or interrupted)
|
||||
|
||||
|
||||
# small set of tests to determine if we have a basically functioning interpreter
|
||||
# (i.e. if any of these fail, then anything else is likely to follow)
|
||||
STDTESTS = [
|
||||
'test_grammar',
|
||||
'test_opcodes',
|
||||
|
@ -725,10 +742,8 @@ STDTESTS = [
|
|||
'test_doctest2',
|
||||
]
|
||||
|
||||
NOTTESTS = {
|
||||
'test_future1',
|
||||
'test_future2',
|
||||
}
|
||||
# set of tests that we don't want to be executed when using regrtest
|
||||
NOTTESTS = set()
|
||||
|
||||
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
|
||||
"""Return a list of all applicable test modules."""
|
||||
|
|
|
@ -1029,6 +1029,11 @@ def bigmemtest(minsize, memuse):
|
|||
return decorator
|
||||
|
||||
def precisionbigmemtest(size, memuse):
|
||||
"""Decorator for bigmem tests that need exact sizes.
|
||||
|
||||
Like bigmemtest, but without the size scaling upward to fill available
|
||||
memory.
|
||||
"""
|
||||
def decorator(f):
|
||||
def wrapper(self):
|
||||
size = wrapper.size
|
||||
|
|
|
@ -2837,16 +2837,22 @@ class TestHelpFormattingMetaclass(type):
|
|||
parser = argparse.ArgumentParser(
|
||||
*tester.parser_signature.args,
|
||||
**tester.parser_signature.kwargs)
|
||||
for argument_sig in tester.argument_signatures:
|
||||
for argument_sig in getattr(tester, 'argument_signatures', []):
|
||||
parser.add_argument(*argument_sig.args,
|
||||
**argument_sig.kwargs)
|
||||
group_signatures = tester.argument_group_signatures
|
||||
for group_sig, argument_sigs in group_signatures:
|
||||
group_sigs = getattr(tester, 'argument_group_signatures', [])
|
||||
for group_sig, argument_sigs in group_sigs:
|
||||
group = parser.add_argument_group(*group_sig.args,
|
||||
**group_sig.kwargs)
|
||||
for argument_sig in argument_sigs:
|
||||
group.add_argument(*argument_sig.args,
|
||||
**argument_sig.kwargs)
|
||||
subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
|
||||
if subparsers_sigs:
|
||||
subparsers = parser.add_subparsers()
|
||||
for subparser_sig in subparsers_sigs:
|
||||
subparsers.add_parser(*subparser_sig.args,
|
||||
**subparser_sig.kwargs)
|
||||
return parser
|
||||
|
||||
def _test(self, tester, parser_text):
|
||||
|
@ -3940,6 +3946,108 @@ class TestHelpVersionAction(HelpTestCase):
|
|||
'''
|
||||
version = ''
|
||||
|
||||
class TestHelpSubparsersOrdering(HelpTestCase):
|
||||
"""Test ordering of subcommands in help matches the code"""
|
||||
parser_signature = Sig(prog='PROG',
|
||||
description='display some subcommands',
|
||||
version='0.1')
|
||||
|
||||
subparsers_signatures = [Sig(name=name)
|
||||
for name in ('a', 'b', 'c', 'd', 'e')]
|
||||
|
||||
usage = '''\
|
||||
usage: PROG [-h] [-v] {a,b,c,d,e} ...
|
||||
'''
|
||||
|
||||
help = usage + '''\
|
||||
|
||||
display some subcommands
|
||||
|
||||
positional arguments:
|
||||
{a,b,c,d,e}
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --version show program's version number and exit
|
||||
'''
|
||||
|
||||
version = '''\
|
||||
0.1
|
||||
'''
|
||||
|
||||
class TestHelpSubparsersWithHelpOrdering(HelpTestCase):
|
||||
"""Test ordering of subcommands in help matches the code"""
|
||||
parser_signature = Sig(prog='PROG',
|
||||
description='display some subcommands',
|
||||
version='0.1')
|
||||
|
||||
subcommand_data = (('a', 'a subcommand help'),
|
||||
('b', 'b subcommand help'),
|
||||
('c', 'c subcommand help'),
|
||||
('d', 'd subcommand help'),
|
||||
('e', 'e subcommand help'),
|
||||
)
|
||||
|
||||
subparsers_signatures = [Sig(name=name, help=help)
|
||||
for name, help in subcommand_data]
|
||||
|
||||
usage = '''\
|
||||
usage: PROG [-h] [-v] {a,b,c,d,e} ...
|
||||
'''
|
||||
|
||||
help = usage + '''\
|
||||
|
||||
display some subcommands
|
||||
|
||||
positional arguments:
|
||||
{a,b,c,d,e}
|
||||
a a subcommand help
|
||||
b b subcommand help
|
||||
c c subcommand help
|
||||
d d subcommand help
|
||||
e e subcommand help
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --version show program's version number and exit
|
||||
'''
|
||||
|
||||
version = '''\
|
||||
0.1
|
||||
'''
|
||||
|
||||
|
||||
|
||||
class TestHelpMetavarTypeFormatter(HelpTestCase):
|
||||
""""""
|
||||
|
||||
def custom_type(string):
|
||||
return string
|
||||
|
||||
parser_signature = Sig(prog='PROG', description='description',
|
||||
formatter_class=argparse.MetavarTypeHelpFormatter)
|
||||
argument_signatures = [Sig('a', type=int),
|
||||
Sig('-b', type=custom_type),
|
||||
Sig('-c', type=float, metavar='SOME FLOAT')]
|
||||
argument_group_signatures = []
|
||||
usage = '''\
|
||||
usage: PROG [-h] [-b custom_type] [-c SOME FLOAT] int
|
||||
'''
|
||||
help = usage + '''\
|
||||
|
||||
description
|
||||
|
||||
positional arguments:
|
||||
int
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-b custom_type
|
||||
-c SOME FLOAT
|
||||
'''
|
||||
version = ''
|
||||
|
||||
|
||||
# =====================================
|
||||
# Optional/Positional constructor tests
|
||||
# =====================================
|
||||
|
@ -4394,6 +4502,177 @@ class TestParseKnownArgs(TestCase):
|
|||
self.assertEqual(NS(v=3, spam=True, badger="B"), args)
|
||||
self.assertEqual(["C", "--foo", "4"], extras)
|
||||
|
||||
# ==========================
|
||||
# add_argument metavar tests
|
||||
# ==========================
|
||||
|
||||
class TestAddArgumentMetavar(TestCase):
|
||||
|
||||
EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
|
||||
|
||||
def do_test_no_exception(self, nargs, metavar):
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
|
||||
|
||||
def do_test_exception(self, nargs, metavar):
|
||||
parser = argparse.ArgumentParser()
|
||||
with self.assertRaises(ValueError) as cm:
|
||||
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
|
||||
self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
|
||||
|
||||
# Unit tests for different values of metavar when nargs=None
|
||||
|
||||
def test_nargs_None_metavar_string(self):
|
||||
self.do_test_no_exception(nargs=None, metavar="1")
|
||||
|
||||
def test_nargs_None_metavar_length0(self):
|
||||
self.do_test_exception(nargs=None, metavar=tuple())
|
||||
|
||||
def test_nargs_None_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs=None, metavar=("1"))
|
||||
|
||||
def test_nargs_None_metavar_length2(self):
|
||||
self.do_test_exception(nargs=None, metavar=("1", "2"))
|
||||
|
||||
def test_nargs_None_metavar_length3(self):
|
||||
self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=?
|
||||
|
||||
def test_nargs_optional_metavar_string(self):
|
||||
self.do_test_no_exception(nargs="?", metavar="1")
|
||||
|
||||
def test_nargs_optional_metavar_length0(self):
|
||||
self.do_test_exception(nargs="?", metavar=tuple())
|
||||
|
||||
def test_nargs_optional_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs="?", metavar=("1"))
|
||||
|
||||
def test_nargs_optional_metavar_length2(self):
|
||||
self.do_test_exception(nargs="?", metavar=("1", "2"))
|
||||
|
||||
def test_nargs_optional_metavar_length3(self):
|
||||
self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=*
|
||||
|
||||
def test_nargs_zeroormore_metavar_string(self):
|
||||
self.do_test_no_exception(nargs="*", metavar="1")
|
||||
|
||||
def test_nargs_zeroormore_metavar_length0(self):
|
||||
self.do_test_exception(nargs="*", metavar=tuple())
|
||||
|
||||
def test_nargs_zeroormore_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs="*", metavar=("1"))
|
||||
|
||||
def test_nargs_zeroormore_metavar_length2(self):
|
||||
self.do_test_no_exception(nargs="*", metavar=("1", "2"))
|
||||
|
||||
def test_nargs_zeroormore_metavar_length3(self):
|
||||
self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=+
|
||||
|
||||
def test_nargs_oneormore_metavar_string(self):
|
||||
self.do_test_no_exception(nargs="+", metavar="1")
|
||||
|
||||
def test_nargs_oneormore_metavar_length0(self):
|
||||
self.do_test_exception(nargs="+", metavar=tuple())
|
||||
|
||||
def test_nargs_oneormore_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs="+", metavar=("1"))
|
||||
|
||||
def test_nargs_oneormore_metavar_length2(self):
|
||||
self.do_test_no_exception(nargs="+", metavar=("1", "2"))
|
||||
|
||||
def test_nargs_oneormore_metavar_length3(self):
|
||||
self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=...
|
||||
|
||||
def test_nargs_remainder_metavar_string(self):
|
||||
self.do_test_no_exception(nargs="...", metavar="1")
|
||||
|
||||
def test_nargs_remainder_metavar_length0(self):
|
||||
self.do_test_no_exception(nargs="...", metavar=tuple())
|
||||
|
||||
def test_nargs_remainder_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs="...", metavar=("1"))
|
||||
|
||||
def test_nargs_remainder_metavar_length2(self):
|
||||
self.do_test_no_exception(nargs="...", metavar=("1", "2"))
|
||||
|
||||
def test_nargs_remainder_metavar_length3(self):
|
||||
self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=A...
|
||||
|
||||
def test_nargs_parser_metavar_string(self):
|
||||
self.do_test_no_exception(nargs="A...", metavar="1")
|
||||
|
||||
def test_nargs_parser_metavar_length0(self):
|
||||
self.do_test_exception(nargs="A...", metavar=tuple())
|
||||
|
||||
def test_nargs_parser_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs="A...", metavar=("1"))
|
||||
|
||||
def test_nargs_parser_metavar_length2(self):
|
||||
self.do_test_exception(nargs="A...", metavar=("1", "2"))
|
||||
|
||||
def test_nargs_parser_metavar_length3(self):
|
||||
self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=1
|
||||
|
||||
def test_nargs_1_metavar_string(self):
|
||||
self.do_test_no_exception(nargs=1, metavar="1")
|
||||
|
||||
def test_nargs_1_metavar_length0(self):
|
||||
self.do_test_exception(nargs=1, metavar=tuple())
|
||||
|
||||
def test_nargs_1_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs=1, metavar=("1"))
|
||||
|
||||
def test_nargs_1_metavar_length2(self):
|
||||
self.do_test_exception(nargs=1, metavar=("1", "2"))
|
||||
|
||||
def test_nargs_1_metavar_length3(self):
|
||||
self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=2
|
||||
|
||||
def test_nargs_2_metavar_string(self):
|
||||
self.do_test_no_exception(nargs=2, metavar="1")
|
||||
|
||||
def test_nargs_2_metavar_length0(self):
|
||||
self.do_test_exception(nargs=2, metavar=tuple())
|
||||
|
||||
def test_nargs_2_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs=2, metavar=("1"))
|
||||
|
||||
def test_nargs_2_metavar_length2(self):
|
||||
self.do_test_no_exception(nargs=2, metavar=("1", "2"))
|
||||
|
||||
def test_nargs_2_metavar_length3(self):
|
||||
self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
|
||||
|
||||
# Unit tests for different values of metavar when nargs=3
|
||||
|
||||
def test_nargs_3_metavar_string(self):
|
||||
self.do_test_no_exception(nargs=3, metavar="1")
|
||||
|
||||
def test_nargs_3_metavar_length0(self):
|
||||
self.do_test_exception(nargs=3, metavar=tuple())
|
||||
|
||||
def test_nargs_3_metavar_length1(self):
|
||||
self.do_test_no_exception(nargs=3, metavar=("1"))
|
||||
|
||||
def test_nargs_3_metavar_length2(self):
|
||||
self.do_test_exception(nargs=3, metavar=("1", "2"))
|
||||
|
||||
def test_nargs_3_metavar_length3(self):
|
||||
self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
|
||||
|
||||
# ============================
|
||||
# from argparse import * tests
|
||||
# ============================
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
"""Bigmem tests - tests for the 32-bit boundary in containers.
|
||||
|
||||
These tests try to exercise the 32-bit boundary that is sometimes, if
|
||||
rarely, exceeded in practice, but almost never tested. They are really only
|
||||
meaningful on 64-bit builds on machines with a *lot* of memory, but the
|
||||
tests are always run, usually with very low memory limits to make sure the
|
||||
tests themselves don't suffer from bitrot. To run them for real, pass a
|
||||
high memory limit to regrtest, with the -M option.
|
||||
"""
|
||||
|
||||
from test import support
|
||||
from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest
|
||||
|
||||
|
@ -6,30 +16,45 @@ import operator
|
|||
import sys
|
||||
import functools
|
||||
|
||||
# These tests all use one of the bigmemtest decorators to indicate how much
|
||||
# memory they use and how much memory they need to be even meaningful. The
|
||||
# decorators take two arguments: a 'memuse' indicator declaring
|
||||
# (approximate) bytes per size-unit the test will use (at peak usage), and a
|
||||
# 'minsize' indicator declaring a minimum *useful* size. A test that
|
||||
# allocates a bytestring to test various operations near the end will have a
|
||||
# minsize of at least 2Gb (or it wouldn't reach the 32-bit limit, so the
|
||||
# test wouldn't be very useful) and a memuse of 1 (one byte per size-unit,
|
||||
# if it allocates only one big string at a time.)
|
||||
#
|
||||
# When run with a memory limit set, both decorators skip tests that need
|
||||
# more memory than available to be meaningful. The precisionbigmemtest will
|
||||
# always pass minsize as size, even if there is much more memory available.
|
||||
# The bigmemtest decorator will scale size upward to fill available memory.
|
||||
#
|
||||
# Bigmem testing houserules:
|
||||
#
|
||||
# - Try not to allocate too many large objects. It's okay to rely on
|
||||
# refcounting semantics, but don't forget that 's = create_largestring()'
|
||||
# refcounting semantics, and don't forget that 's = create_largestring()'
|
||||
# doesn't release the old 's' (if it exists) until well after its new
|
||||
# value has been created. Use 'del s' before the create_largestring call.
|
||||
#
|
||||
# - Do *not* compare large objects using assertEqual or similar. It's a
|
||||
# lengthy operation and the errormessage will be utterly useless due to
|
||||
# its size. To make sure whether a result has the right contents, better
|
||||
# to use the strip or count methods, or compare meaningful slices.
|
||||
# - Do *not* compare large objects using assertEqual, assertIn or similar.
|
||||
# It's a lengthy operation and the errormessage will be utterly useless
|
||||
# due to its size. To make sure whether a result has the right contents,
|
||||
# better to use the strip or count methods, or compare meaningful slices.
|
||||
#
|
||||
# - Don't forget to test for large indices, offsets and results and such,
|
||||
# in addition to large sizes.
|
||||
# in addition to large sizes. Anything that probes the 32-bit boundary.
|
||||
#
|
||||
# - When repeating an object (say, a substring, or a small list) to create
|
||||
# a large object, make the subobject of a length that is not a power of
|
||||
# 2. That way, int-wrapping problems are more easily detected.
|
||||
#
|
||||
# - While the bigmemtest decorator speaks of 'minsize', all tests will
|
||||
# actually be called with a much smaller number too, in the normal
|
||||
# test run (5Kb currently.) This is so the tests themselves get frequent
|
||||
# testing. Consequently, always make all large allocations based on the
|
||||
# passed-in 'size', and don't rely on the size being very large. Also,
|
||||
# - While the bigmem decorators speak of 'minsize', all tests will actually
|
||||
# be called with a much smaller number too, in the normal test run (5Kb
|
||||
# currently.) This is so the tests themselves get frequent testing.
|
||||
# Consequently, always make all large allocations based on the passed-in
|
||||
# 'size', and don't rely on the size being very large. Also,
|
||||
# memuse-per-size should remain sane (less than a few thousand); if your
|
||||
# test uses more, adjust 'size' upward, instead.
|
||||
|
||||
|
@ -92,7 +117,7 @@ class BaseStrTest:
|
|||
_ = self.from_latin1
|
||||
s = _('-') * size
|
||||
tabsize = 8
|
||||
self.assertEqual(s.expandtabs(), s)
|
||||
self.assertTrue(s.expandtabs() == s)
|
||||
del s
|
||||
slen, remainder = divmod(size, tabsize)
|
||||
s = _(' \t') * slen
|
||||
|
@ -519,19 +544,19 @@ class BaseStrTest:
|
|||
edge = _('-') * (size // 2)
|
||||
s = _('').join([edge, SUBSTR, edge])
|
||||
del edge
|
||||
self.assertIn(SUBSTR, s)
|
||||
self.assertNotIn(SUBSTR * 2, s)
|
||||
self.assertIn(_('-'), s)
|
||||
self.assertNotIn(_('a'), s)
|
||||
self.assertTrue(SUBSTR in s)
|
||||
self.assertFalse(SUBSTR * 2 in s)
|
||||
self.assertTrue(_('-') in s)
|
||||
self.assertFalse(_('a') in s)
|
||||
s += _('a')
|
||||
self.assertIn(_('a'), s)
|
||||
self.assertTrue(_('a') in s)
|
||||
|
||||
@bigmemtest(minsize=_2G + 10, memuse=2)
|
||||
def test_compare(self, size):
|
||||
_ = self.from_latin1
|
||||
s1 = _('-') * size
|
||||
s2 = _('-') * size
|
||||
self.assertEqual(s1, s2)
|
||||
self.assertTrue(s1 == s2)
|
||||
del s2
|
||||
s2 = s1 + _('a')
|
||||
self.assertFalse(s1 == s2)
|
||||
|
@ -552,7 +577,7 @@ class BaseStrTest:
|
|||
h1 = hash(s)
|
||||
del s
|
||||
s = _('\x00') * (size + 1)
|
||||
self.assertFalse(h1 == hash(s))
|
||||
self.assertNotEqual(h1, hash(s))
|
||||
|
||||
|
||||
class StrTest(unittest.TestCase, BaseStrTest):
|
||||
|
@ -633,7 +658,7 @@ class StrTest(unittest.TestCase, BaseStrTest):
|
|||
def test_format(self, size):
|
||||
s = '-' * size
|
||||
sf = '%s' % (s,)
|
||||
self.assertEqual(s, sf)
|
||||
self.assertTrue(s == sf)
|
||||
del sf
|
||||
sf = '..%s..' % (s,)
|
||||
self.assertEqual(len(sf), len(s) + 4)
|
||||
|
@ -743,7 +768,7 @@ class TupleTest(unittest.TestCase):
|
|||
def test_compare(self, size):
|
||||
t1 = ('',) * size
|
||||
t2 = ('',) * size
|
||||
self.assertEqual(t1, t2)
|
||||
self.assertTrue(t1 == t2)
|
||||
del t2
|
||||
t2 = ('',) * (size + 1)
|
||||
self.assertFalse(t1 == t2)
|
||||
|
@ -774,9 +799,9 @@ class TupleTest(unittest.TestCase):
|
|||
def test_contains(self, size):
|
||||
t = (1, 2, 3, 4, 5) * size
|
||||
self.assertEqual(len(t), size * 5)
|
||||
self.assertIn(5, t)
|
||||
self.assertNotIn((1, 2, 3, 4, 5), t)
|
||||
self.assertNotIn(0, t)
|
||||
self.assertTrue(5 in t)
|
||||
self.assertFalse((1, 2, 3, 4, 5) in t)
|
||||
self.assertFalse(0 in t)
|
||||
|
||||
@bigmemtest(minsize=_2G + 10, memuse=8)
|
||||
def test_hash(self, size):
|
||||
|
@ -879,7 +904,7 @@ class ListTest(unittest.TestCase):
|
|||
def test_compare(self, size):
|
||||
l1 = [''] * size
|
||||
l2 = [''] * size
|
||||
self.assertEqual(l1, l2)
|
||||
self.assertTrue(l1 == l2)
|
||||
del l2
|
||||
l2 = [''] * (size + 1)
|
||||
self.assertFalse(l1 == l2)
|
||||
|
@ -925,9 +950,9 @@ class ListTest(unittest.TestCase):
|
|||
def test_contains(self, size):
|
||||
l = [1, 2, 3, 4, 5] * size
|
||||
self.assertEqual(len(l), size * 5)
|
||||
self.assertIn(5, l)
|
||||
self.assertNotIn([1, 2, 3, 4, 5], l)
|
||||
self.assertNotIn(0, l)
|
||||
self.assertTrue(5 in l)
|
||||
self.assertFalse([1, 2, 3, 4, 5] in l)
|
||||
self.assertFalse(0 in l)
|
||||
|
||||
@bigmemtest(minsize=_2G + 10, memuse=8)
|
||||
def test_hash(self, size):
|
||||
|
|
|
@ -31,12 +31,6 @@ class CmdLineTest(unittest.TestCase):
|
|||
self.verify_valid_flag('-O')
|
||||
self.verify_valid_flag('-OO')
|
||||
|
||||
def test_q(self):
|
||||
self.verify_valid_flag('-Qold')
|
||||
self.verify_valid_flag('-Qnew')
|
||||
self.verify_valid_flag('-Qwarn')
|
||||
self.verify_valid_flag('-Qwarnall')
|
||||
|
||||
def test_site_flag(self):
|
||||
self.verify_valid_flag('-S')
|
||||
|
||||
|
|
|
@ -332,37 +332,12 @@ class TestNamedTuple(unittest.TestCase):
|
|||
# verify that _source can be run through exec()
|
||||
tmp = namedtuple('NTColor', 'red green blue')
|
||||
globals().pop('NTColor', None) # remove artifacts from other tests
|
||||
self.assertNotIn('NTColor', globals())
|
||||
exec(tmp._source, globals())
|
||||
self.assertIn('NTColor', globals())
|
||||
c = NTColor(10, 20, 30)
|
||||
self.assertEqual((c.red, c.green, c.blue), (10, 20, 30))
|
||||
self.assertEqual(NTColor._fields, ('red', 'green', 'blue'))
|
||||
globals().pop('NTColor', None) # clean-up after this test
|
||||
self.assertNotIn('NTColor', globals())
|
||||
|
||||
def test_source_importable(self):
|
||||
tmp = namedtuple('Color', 'hue sat val')
|
||||
|
||||
compiled = None
|
||||
source = TESTFN + '.py'
|
||||
with open(source, 'w') as f:
|
||||
print(tmp._source, file=f)
|
||||
|
||||
if TESTFN in sys.modules:
|
||||
del sys.modules[TESTFN]
|
||||
try:
|
||||
mod = __import__(TESTFN)
|
||||
compiled = mod.__file__
|
||||
Color = mod.Color
|
||||
c = Color(10, 20, 30)
|
||||
self.assertEqual((c.hue, c.sat, c.val), (10, 20, 30))
|
||||
self.assertEqual(Color._fields, ('hue', 'sat', 'val'))
|
||||
finally:
|
||||
forget(TESTFN)
|
||||
if compiled:
|
||||
unlink(compiled)
|
||||
unlink(source)
|
||||
|
||||
|
||||
################################################################################
|
||||
|
|
3
Lib/test/test_email/__main__.py
Normal file
3
Lib/test/test_email/__main__.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from test.test_email import test_main
|
||||
|
||||
test_main()
|
|
@ -3925,6 +3925,20 @@ A very long line that must get split to something other than at the
|
|||
h.append(x, errors='replace')
|
||||
eq(str(h), e)
|
||||
|
||||
def test_escaped_8bit_header(self):
|
||||
x = b'Ynwp4dUEbay Auction Semiar- No Charge \x96 Earn Big'
|
||||
x = x.decode('ascii', 'surrogateescape')
|
||||
h = Header(x, charset=email.charset.UNKNOWN8BIT)
|
||||
self.assertEqual(str(h),
|
||||
'Ynwp4dUEbay Auction Semiar- No Charge \uFFFD Earn Big')
|
||||
self.assertEqual(email.header.decode_header(h), [(x, 'unknown-8bit')])
|
||||
|
||||
def test_modify_returned_list_does_not_change_header(self):
|
||||
h = Header('test')
|
||||
chunks = email.header.decode_header(h)
|
||||
chunks.append(('ascii', 'test2'))
|
||||
self.assertEqual(str(h), 'test')
|
||||
|
||||
def test_encoded_adjacent_nonencoded(self):
|
||||
eq = self.assertEqual
|
||||
h = Header()
|
||||
|
|
|
@ -13,14 +13,14 @@ def get_error_location(msg):
|
|||
class FutureTest(unittest.TestCase):
|
||||
|
||||
def test_future1(self):
|
||||
support.unload('test_future1')
|
||||
from test import test_future1
|
||||
self.assertEqual(test_future1.result, 6)
|
||||
support.unload('future_test1')
|
||||
from test import future_test1
|
||||
self.assertEqual(future_test1.result, 6)
|
||||
|
||||
def test_future2(self):
|
||||
support.unload('test_future2')
|
||||
from test import test_future2
|
||||
self.assertEqual(test_future2.result, 6)
|
||||
support.unload('future_test2')
|
||||
from test import future_test2
|
||||
self.assertEqual(future_test2.result, 6)
|
||||
|
||||
def test_future3(self):
|
||||
support.unload('test_future3')
|
||||
|
|
|
@ -632,6 +632,16 @@ class TestGetcallargsFunctions(unittest.TestCase):
|
|||
self.assertEqualCallArgs(f, '2, c=4, **collections.UserDict(b=3)')
|
||||
self.assertEqualCallArgs(f, 'b=2, **collections.UserDict(a=3, c=4)')
|
||||
|
||||
def test_varkw_only(self):
|
||||
# issue11256:
|
||||
f = self.makeCallable('**c')
|
||||
self.assertEqualCallArgs(f, '')
|
||||
self.assertEqualCallArgs(f, 'a=1')
|
||||
self.assertEqualCallArgs(f, 'a=1, b=2')
|
||||
self.assertEqualCallArgs(f, 'c=3, **{"a": 1, "b": 2}')
|
||||
self.assertEqualCallArgs(f, '**collections.UserDict(a=1, b=2)')
|
||||
self.assertEqualCallArgs(f, 'c=3, **collections.UserDict(a=1, b=2)')
|
||||
|
||||
def test_keyword_only(self):
|
||||
f = self.makeCallable('a=3, *, c, d=2')
|
||||
self.assertEqualCallArgs(f, 'c=3')
|
||||
|
@ -643,6 +653,11 @@ class TestGetcallargsFunctions(unittest.TestCase):
|
|||
self.assertEqualException(f, 'a=3')
|
||||
self.assertEqualException(f, 'd=4')
|
||||
|
||||
f = self.makeCallable('*, c, d=2')
|
||||
self.assertEqualCallArgs(f, 'c=3')
|
||||
self.assertEqualCallArgs(f, 'c=3, d=4')
|
||||
self.assertEqualCallArgs(f, 'd=4, c=3')
|
||||
|
||||
def test_multiple_features(self):
|
||||
f = self.makeCallable('a, b=2, *f, **g')
|
||||
self.assertEqualCallArgs(f, '2, 3, 7')
|
||||
|
@ -656,6 +671,17 @@ class TestGetcallargsFunctions(unittest.TestCase):
|
|||
'(4,[5,6])]), **collections.UserDict('
|
||||
'y=9, z=10)')
|
||||
|
||||
f = self.makeCallable('a, b=2, *f, x, y=99, **g')
|
||||
self.assertEqualCallArgs(f, '2, 3, x=8')
|
||||
self.assertEqualCallArgs(f, '2, 3, x=8, *[(4,[5,6]), 7]')
|
||||
self.assertEqualCallArgs(f, '2, x=8, *[3, (4,[5,6]), 7], y=9, z=10')
|
||||
self.assertEqualCallArgs(f, 'x=8, *[2, 3, (4,[5,6])], y=9, z=10')
|
||||
self.assertEqualCallArgs(f, 'x=8, *collections.UserList('
|
||||
'[2, 3, (4,[5,6])]), q=0, **{"y":9, "z":10}')
|
||||
self.assertEqualCallArgs(f, '2, x=8, *collections.UserList([3, '
|
||||
'(4,[5,6])]), q=0, **collections.UserDict('
|
||||
'y=9, z=10)')
|
||||
|
||||
def test_errors(self):
|
||||
f0 = self.makeCallable('')
|
||||
f1 = self.makeCallable('a, b')
|
||||
|
@ -692,6 +718,13 @@ class TestGetcallargsFunctions(unittest.TestCase):
|
|||
# - for functions and bound methods: unexpected keyword 'c'
|
||||
# - for unbound methods: multiple values for keyword 'a'
|
||||
#self.assertEqualException(f, '1, c=3, a=2')
|
||||
# issue11256:
|
||||
f3 = self.makeCallable('**c')
|
||||
self.assertEqualException(f3, '1, 2')
|
||||
self.assertEqualException(f3, '1, 2, a=1, b=2')
|
||||
f4 = self.makeCallable('*, a, b=0')
|
||||
self.assertEqualException(f3, '1, 2')
|
||||
self.assertEqualException(f3, '1, 2, a=1, b=2')
|
||||
|
||||
class TestGetcallargsMethods(TestGetcallargsFunctions):
|
||||
|
||||
|
|
|
@ -69,11 +69,21 @@ class TestBasicOps(unittest.TestCase):
|
|||
self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric
|
||||
self.assertEqual(list(accumulate([])), []) # empty iterable
|
||||
self.assertEqual(list(accumulate([7])), [7]) # iterable of length one
|
||||
self.assertRaises(TypeError, accumulate, range(10), 5) # too many args
|
||||
self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args
|
||||
self.assertRaises(TypeError, accumulate) # too few args
|
||||
self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg
|
||||
self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add
|
||||
|
||||
s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6]
|
||||
self.assertEqual(list(accumulate(s, min)),
|
||||
[2, 2, 2, 2, 2, 0, 0, 0, 0, 0])
|
||||
self.assertEqual(list(accumulate(s, max)),
|
||||
[2, 8, 9, 9, 9, 9, 9, 9, 9, 9])
|
||||
self.assertEqual(list(accumulate(s, operator.mul)),
|
||||
[2, 16, 144, 720, 5040, 0, 0, 0, 0, 0])
|
||||
with self.assertRaises(TypeError):
|
||||
list(accumulate(s, chr)) # unary-operation
|
||||
|
||||
def test_chain(self):
|
||||
|
||||
def chain2(*iterables):
|
||||
|
|
|
@ -40,7 +40,7 @@ from socketserver import ThreadingTCPServer, StreamRequestHandler
|
|||
import struct
|
||||
import sys
|
||||
import tempfile
|
||||
from test.support import captured_stdout, run_with_locale, run_unittest
|
||||
from test.support import captured_stdout, run_with_locale, run_unittest, patch
|
||||
import textwrap
|
||||
import unittest
|
||||
import warnings
|
||||
|
@ -1082,28 +1082,39 @@ class WarningsTest(BaseTest):
|
|||
def test_warnings(self):
|
||||
with warnings.catch_warnings():
|
||||
logging.captureWarnings(True)
|
||||
try:
|
||||
warnings.filterwarnings("always", category=UserWarning)
|
||||
file = io.StringIO()
|
||||
h = logging.StreamHandler(file)
|
||||
logger = logging.getLogger("py.warnings")
|
||||
logger.addHandler(h)
|
||||
warnings.warn("I'm warning you...")
|
||||
logger.removeHandler(h)
|
||||
s = file.getvalue()
|
||||
h.close()
|
||||
self.assertTrue(s.find("UserWarning: I'm warning you...\n") > 0)
|
||||
self.addCleanup(lambda: logging.captureWarnings(False))
|
||||
warnings.filterwarnings("always", category=UserWarning)
|
||||
stream = io.StringIO()
|
||||
h = logging.StreamHandler(stream)
|
||||
logger = logging.getLogger("py.warnings")
|
||||
logger.addHandler(h)
|
||||
warnings.warn("I'm warning you...")
|
||||
logger.removeHandler(h)
|
||||
s = stream.getvalue()
|
||||
h.close()
|
||||
self.assertTrue(s.find("UserWarning: I'm warning you...\n") > 0)
|
||||
|
||||
#See if an explicit file uses the original implementation
|
||||
file = io.StringIO()
|
||||
warnings.showwarning("Explicit", UserWarning, "dummy.py", 42,
|
||||
file, "Dummy line")
|
||||
s = file.getvalue()
|
||||
file.close()
|
||||
self.assertEqual(s,
|
||||
"dummy.py:42: UserWarning: Explicit\n Dummy line\n")
|
||||
finally:
|
||||
logging.captureWarnings(False)
|
||||
#See if an explicit file uses the original implementation
|
||||
a_file = io.StringIO()
|
||||
warnings.showwarning("Explicit", UserWarning, "dummy.py", 42,
|
||||
a_file, "Dummy line")
|
||||
s = a_file.getvalue()
|
||||
a_file.close()
|
||||
self.assertEqual(s,
|
||||
"dummy.py:42: UserWarning: Explicit\n Dummy line\n")
|
||||
|
||||
def test_warnings_no_handlers(self):
|
||||
with warnings.catch_warnings():
|
||||
logging.captureWarnings(True)
|
||||
self.addCleanup(lambda: logging.captureWarnings(False))
|
||||
|
||||
# confirm our assumption: no loggers are set
|
||||
logger = logging.getLogger("py.warnings")
|
||||
assert logger.handlers == []
|
||||
|
||||
warnings.showwarning("Explicit", UserWarning, "dummy.py", 42)
|
||||
self.assertTrue(len(logger.handlers) == 1)
|
||||
self.assertIsInstance(logger.handlers[0], logging.NullHandler)
|
||||
|
||||
|
||||
def formatFunc(format, datefmt=None):
|
||||
|
@ -2007,6 +2018,11 @@ class ManagerTest(BaseTest):
|
|||
|
||||
self.assertEqual(logged, ['should appear in logged'])
|
||||
|
||||
def test_set_log_record_factory(self):
|
||||
man = logging.Manager(None)
|
||||
expected = object()
|
||||
man.setLogRecordFactory(expected)
|
||||
self.assertEqual(man.logRecordFactory, expected)
|
||||
|
||||
class ChildLoggerTest(BaseTest):
|
||||
def test_child_loggers(self):
|
||||
|
@ -2198,6 +2214,479 @@ class LastResortTest(BaseTest):
|
|||
logging.raiseExceptions = old_raise_exceptions
|
||||
|
||||
|
||||
class FakeHandler:
|
||||
|
||||
def __init__(self, identifier, called):
|
||||
for method in ('acquire', 'flush', 'close', 'release'):
|
||||
setattr(self, method, self.record_call(identifier, method, called))
|
||||
|
||||
def record_call(self, identifier, method_name, called):
|
||||
def inner():
|
||||
called.append('{} - {}'.format(identifier, method_name))
|
||||
return inner
|
||||
|
||||
|
||||
class RecordingHandler(logging.NullHandler):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(RecordingHandler, self).__init__(*args, **kwargs)
|
||||
self.records = []
|
||||
|
||||
def handle(self, record):
|
||||
"""Keep track of all the emitted records."""
|
||||
self.records.append(record)
|
||||
|
||||
|
||||
class ShutdownTest(BaseTest):
|
||||
|
||||
"""Tets suite for the shutdown method."""
|
||||
|
||||
def setUp(self):
|
||||
super(ShutdownTest, self).setUp()
|
||||
self.called = []
|
||||
|
||||
raise_exceptions = logging.raiseExceptions
|
||||
self.addCleanup(lambda: setattr(logging, 'raiseExceptions', raise_exceptions))
|
||||
|
||||
def raise_error(self, error):
|
||||
def inner():
|
||||
raise error()
|
||||
return inner
|
||||
|
||||
def test_no_failure(self):
|
||||
# create some fake handlers
|
||||
handler0 = FakeHandler(0, self.called)
|
||||
handler1 = FakeHandler(1, self.called)
|
||||
handler2 = FakeHandler(2, self.called)
|
||||
|
||||
# create live weakref to those handlers
|
||||
handlers = map(logging.weakref.ref, [handler0, handler1, handler2])
|
||||
|
||||
logging.shutdown(handlerList=list(handlers))
|
||||
|
||||
expected = ['2 - acquire', '2 - flush', '2 - close', '2 - release',
|
||||
'1 - acquire', '1 - flush', '1 - close', '1 - release',
|
||||
'0 - acquire', '0 - flush', '0 - close', '0 - release']
|
||||
self.assertEqual(expected, self.called)
|
||||
|
||||
def _test_with_failure_in_method(self, method, error):
|
||||
handler = FakeHandler(0, self.called)
|
||||
setattr(handler, method, self.raise_error(error))
|
||||
handlers = [logging.weakref.ref(handler)]
|
||||
|
||||
logging.shutdown(handlerList=list(handlers))
|
||||
|
||||
self.assertEqual('0 - release', self.called[-1])
|
||||
|
||||
def test_with_ioerror_in_acquire(self):
|
||||
self._test_with_failure_in_method('acquire', IOError)
|
||||
|
||||
def test_with_ioerror_in_flush(self):
|
||||
self._test_with_failure_in_method('flush', IOError)
|
||||
|
||||
def test_with_ioerror_in_close(self):
|
||||
self._test_with_failure_in_method('close', IOError)
|
||||
|
||||
def test_with_valueerror_in_acquire(self):
|
||||
self._test_with_failure_in_method('acquire', ValueError)
|
||||
|
||||
def test_with_valueerror_in_flush(self):
|
||||
self._test_with_failure_in_method('flush', ValueError)
|
||||
|
||||
def test_with_valueerror_in_close(self):
|
||||
self._test_with_failure_in_method('close', ValueError)
|
||||
|
||||
def test_with_other_error_in_acquire_without_raise(self):
|
||||
logging.raiseExceptions = False
|
||||
self._test_with_failure_in_method('acquire', IndexError)
|
||||
|
||||
def test_with_other_error_in_flush_without_raise(self):
|
||||
logging.raiseExceptions = False
|
||||
self._test_with_failure_in_method('flush', IndexError)
|
||||
|
||||
def test_with_other_error_in_close_without_raise(self):
|
||||
logging.raiseExceptions = False
|
||||
self._test_with_failure_in_method('close', IndexError)
|
||||
|
||||
def test_with_other_error_in_acquire_with_raise(self):
|
||||
logging.raiseExceptions = True
|
||||
self.assertRaises(IndexError, self._test_with_failure_in_method,
|
||||
'acquire', IndexError)
|
||||
|
||||
def test_with_other_error_in_flush_with_raise(self):
|
||||
logging.raiseExceptions = True
|
||||
self.assertRaises(IndexError, self._test_with_failure_in_method,
|
||||
'flush', IndexError)
|
||||
|
||||
def test_with_other_error_in_close_with_raise(self):
|
||||
logging.raiseExceptions = True
|
||||
self.assertRaises(IndexError, self._test_with_failure_in_method,
|
||||
'close', IndexError)
|
||||
|
||||
|
||||
class ModuleLevelMiscTest(BaseTest):
|
||||
|
||||
"""Tets suite for some module level methods."""
|
||||
|
||||
def test_disable(self):
|
||||
old_disable = logging.root.manager.disable
|
||||
# confirm our assumptions are correct
|
||||
assert old_disable == 0
|
||||
self.addCleanup(lambda: logging.disable(old_disable))
|
||||
|
||||
logging.disable(83)
|
||||
self.assertEqual(logging.root.manager.disable, 83)
|
||||
|
||||
def _test_log(self, method, level=None):
|
||||
called = []
|
||||
patch(self, logging, 'basicConfig',
|
||||
lambda *a, **kw: called.append(a, kw))
|
||||
|
||||
recording = RecordingHandler()
|
||||
logging.root.addHandler(recording)
|
||||
|
||||
log_method = getattr(logging, method)
|
||||
if level is not None:
|
||||
log_method(level, "test me: %r", recording)
|
||||
else:
|
||||
log_method("test me: %r", recording)
|
||||
|
||||
self.assertEqual(len(recording.records), 1)
|
||||
record = recording.records[0]
|
||||
self.assertEqual(record.getMessage(), "test me: %r" % recording)
|
||||
|
||||
expected_level = level if level is not None else getattr(logging, method.upper())
|
||||
self.assertEqual(record.levelno, expected_level)
|
||||
|
||||
# basicConfig was not called!
|
||||
self.assertEqual(called, [])
|
||||
|
||||
def test_log(self):
|
||||
self._test_log('log', logging.ERROR)
|
||||
|
||||
def test_debug(self):
|
||||
self._test_log('debug')
|
||||
|
||||
def test_info(self):
|
||||
self._test_log('info')
|
||||
|
||||
def test_warning(self):
|
||||
self._test_log('warning')
|
||||
|
||||
def test_error(self):
|
||||
self._test_log('error')
|
||||
|
||||
def test_critical(self):
|
||||
self._test_log('critical')
|
||||
|
||||
def test_set_logger_class(self):
|
||||
self.assertRaises(TypeError, logging.setLoggerClass, object)
|
||||
|
||||
class MyLogger(logging.Logger):
|
||||
pass
|
||||
|
||||
logging.setLoggerClass(MyLogger)
|
||||
self.assertEqual(logging.getLoggerClass(), MyLogger)
|
||||
|
||||
logging.setLoggerClass(logging.Logger)
|
||||
self.assertEqual(logging.getLoggerClass(), logging.Logger)
|
||||
|
||||
|
||||
class BasicConfigTest(unittest.TestCase):
|
||||
|
||||
"""Tets suite for logging.basicConfig."""
|
||||
|
||||
def setUp(self):
|
||||
super(BasicConfigTest, self).setUp()
|
||||
handlers = logging.root.handlers
|
||||
self.addCleanup(lambda: setattr(logging.root, 'handlers', handlers))
|
||||
logging.root.handlers = []
|
||||
|
||||
def tearDown(self):
|
||||
logging.shutdown()
|
||||
super(BasicConfigTest, self).tearDown()
|
||||
|
||||
def test_no_kwargs(self):
|
||||
logging.basicConfig()
|
||||
|
||||
# handler defaults to a StreamHandler to sys.stderr
|
||||
self.assertEqual(len(logging.root.handlers), 1)
|
||||
handler = logging.root.handlers[0]
|
||||
self.assertIsInstance(handler, logging.StreamHandler)
|
||||
self.assertEqual(handler.stream, sys.stderr)
|
||||
|
||||
formatter = handler.formatter
|
||||
# format defaults to logging.BASIC_FORMAT
|
||||
self.assertEqual(formatter._style._fmt, logging.BASIC_FORMAT)
|
||||
# datefmt defaults to None
|
||||
self.assertIsNone(formatter.datefmt)
|
||||
# style defaults to %
|
||||
self.assertIsInstance(formatter._style, logging.PercentStyle)
|
||||
|
||||
# level is not explicitely set
|
||||
self.assertEqual(logging.root.level, logging.WARNING)
|
||||
|
||||
def test_filename(self):
|
||||
logging.basicConfig(filename='test.log')
|
||||
|
||||
self.assertEqual(len(logging.root.handlers), 1)
|
||||
handler = logging.root.handlers[0]
|
||||
self.assertIsInstance(handler, logging.FileHandler)
|
||||
|
||||
expected = logging.FileHandler('test.log', 'a')
|
||||
self.addCleanup(expected.close)
|
||||
self.assertEqual(handler.stream.mode, expected.stream.mode)
|
||||
self.assertEqual(handler.stream.name, expected.stream.name)
|
||||
|
||||
def test_filemode(self):
|
||||
logging.basicConfig(filename='test.log', filemode='wb')
|
||||
|
||||
handler = logging.root.handlers[0]
|
||||
expected = logging.FileHandler('test.log', 'wb')
|
||||
self.addCleanup(expected.close)
|
||||
self.assertEqual(handler.stream.mode, expected.stream.mode)
|
||||
|
||||
def test_stream(self):
|
||||
stream = io.StringIO()
|
||||
self.addCleanup(stream.close)
|
||||
logging.basicConfig(stream=stream)
|
||||
|
||||
self.assertEqual(len(logging.root.handlers), 1)
|
||||
handler = logging.root.handlers[0]
|
||||
self.assertIsInstance(handler, logging.StreamHandler)
|
||||
self.assertEqual(handler.stream, stream)
|
||||
|
||||
def test_format(self):
|
||||
logging.basicConfig(format='foo')
|
||||
|
||||
formatter = logging.root.handlers[0].formatter
|
||||
self.assertEqual(formatter._style._fmt, 'foo')
|
||||
|
||||
def test_datefmt(self):
|
||||
logging.basicConfig(datefmt='bar')
|
||||
|
||||
formatter = logging.root.handlers[0].formatter
|
||||
self.assertEqual(formatter.datefmt, 'bar')
|
||||
|
||||
def test_style(self):
|
||||
logging.basicConfig(style='$')
|
||||
|
||||
formatter = logging.root.handlers[0].formatter
|
||||
self.assertIsInstance(formatter._style, logging.StringTemplateStyle)
|
||||
|
||||
def test_level(self):
|
||||
old_level = logging.root.level
|
||||
self.addCleanup(lambda: logging.root.setLevel(old_level))
|
||||
|
||||
logging.basicConfig(level=57)
|
||||
self.assertEqual(logging.root.level, 57)
|
||||
|
||||
def _test_log(self, method, level=None):
|
||||
# logging.root has no handlers so basicConfig should be called
|
||||
called = []
|
||||
|
||||
old_basic_config = logging.basicConfig
|
||||
def my_basic_config(*a, **kw):
|
||||
old_basic_config()
|
||||
old_level = logging.root.level
|
||||
logging.root.setLevel(100) # avoid having messages in stderr
|
||||
self.addCleanup(lambda: logging.root.setLevel(old_level))
|
||||
called.append((a, kw))
|
||||
|
||||
patch(self, logging, 'basicConfig', my_basic_config)
|
||||
|
||||
log_method = getattr(logging, method)
|
||||
if level is not None:
|
||||
log_method(level, "test me")
|
||||
else:
|
||||
log_method("test me")
|
||||
|
||||
# basicConfig was called with no arguments
|
||||
self.assertEqual(called, [((), {})])
|
||||
|
||||
def test_log(self):
|
||||
self._test_log('log', logging.WARNING)
|
||||
|
||||
def test_debug(self):
|
||||
self._test_log('debug')
|
||||
|
||||
def test_info(self):
|
||||
self._test_log('info')
|
||||
|
||||
def test_warning(self):
|
||||
self._test_log('warning')
|
||||
|
||||
def test_error(self):
|
||||
self._test_log('error')
|
||||
|
||||
def test_critical(self):
|
||||
self._test_log('critical')
|
||||
|
||||
|
||||
class LoggerAdapterTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(LoggerAdapterTest, self).setUp()
|
||||
old_handler_list = logging._handlerList[:]
|
||||
|
||||
self.recording = RecordingHandler()
|
||||
self.logger = logging.root
|
||||
self.logger.addHandler(self.recording)
|
||||
self.addCleanup(lambda: self.logger.removeHandler(self.recording))
|
||||
self.addCleanup(self.recording.close)
|
||||
|
||||
def cleanup():
|
||||
logging._handlerList[:] = old_handler_list
|
||||
|
||||
self.addCleanup(cleanup)
|
||||
self.addCleanup(logging.shutdown)
|
||||
self.adapter = logging.LoggerAdapter(logger=self.logger, extra=None)
|
||||
|
||||
def test_exception(self):
|
||||
msg = 'testing exception: %r'
|
||||
exc = None
|
||||
try:
|
||||
assert False
|
||||
except AssertionError as e:
|
||||
exc = e
|
||||
self.adapter.exception(msg, self.recording)
|
||||
|
||||
self.assertEqual(len(self.recording.records), 1)
|
||||
record = self.recording.records[0]
|
||||
self.assertEqual(record.levelno, logging.ERROR)
|
||||
self.assertEqual(record.msg, msg)
|
||||
self.assertEqual(record.args, (self.recording,))
|
||||
self.assertEqual(record.exc_info,
|
||||
(exc.__class__, exc, exc.__traceback__))
|
||||
|
||||
def test_critical(self):
|
||||
msg = 'critical test! %r'
|
||||
self.adapter.critical(msg, self.recording)
|
||||
|
||||
self.assertEqual(len(self.recording.records), 1)
|
||||
record = self.recording.records[0]
|
||||
self.assertEqual(record.levelno, logging.CRITICAL)
|
||||
self.assertEqual(record.msg, msg)
|
||||
self.assertEqual(record.args, (self.recording,))
|
||||
|
||||
def test_is_enabled_for(self):
|
||||
old_disable = self.adapter.logger.manager.disable
|
||||
self.adapter.logger.manager.disable = 33
|
||||
self.addCleanup(lambda: setattr(self.adapter.logger.manager,
|
||||
'disable', old_disable))
|
||||
self.assertFalse(self.adapter.isEnabledFor(32))
|
||||
|
||||
def test_has_handlers(self):
|
||||
self.assertTrue(self.adapter.hasHandlers())
|
||||
|
||||
for handler in self.logger.handlers:
|
||||
self.logger.removeHandler(handler)
|
||||
assert not self.logger.hasHandlers()
|
||||
|
||||
self.assertFalse(self.adapter.hasHandlers())
|
||||
|
||||
|
||||
class LoggerTest(BaseTest):
|
||||
|
||||
def setUp(self):
|
||||
super(LoggerTest, self).setUp()
|
||||
self.recording = RecordingHandler()
|
||||
self.logger = logging.Logger(name='blah')
|
||||
self.logger.addHandler(self.recording)
|
||||
self.addCleanup(lambda: self.logger.removeHandler(self.recording))
|
||||
self.addCleanup(self.recording.close)
|
||||
self.addCleanup(logging.shutdown)
|
||||
|
||||
def test_set_invalid_level(self):
|
||||
self.assertRaises(TypeError, self.logger.setLevel, object())
|
||||
|
||||
def test_exception(self):
|
||||
msg = 'testing exception: %r'
|
||||
exc = None
|
||||
try:
|
||||
assert False
|
||||
except AssertionError as e:
|
||||
exc = e
|
||||
self.logger.exception(msg, self.recording)
|
||||
|
||||
self.assertEqual(len(self.recording.records), 1)
|
||||
record = self.recording.records[0]
|
||||
self.assertEqual(record.levelno, logging.ERROR)
|
||||
self.assertEqual(record.msg, msg)
|
||||
self.assertEqual(record.args, (self.recording,))
|
||||
self.assertEqual(record.exc_info,
|
||||
(exc.__class__, exc, exc.__traceback__))
|
||||
|
||||
def test_log_invalid_level_with_raise(self):
|
||||
old_raise = logging.raiseExceptions
|
||||
self.addCleanup(lambda: setattr(logging, 'raiseExecptions', old_raise))
|
||||
|
||||
logging.raiseExceptions = True
|
||||
self.assertRaises(TypeError, self.logger.log, '10', 'test message')
|
||||
|
||||
def test_log_invalid_level_no_raise(self):
|
||||
old_raise = logging.raiseExceptions
|
||||
self.addCleanup(lambda: setattr(logging, 'raiseExecptions', old_raise))
|
||||
|
||||
logging.raiseExceptions = False
|
||||
self.logger.log('10', 'test message') # no exception happens
|
||||
|
||||
def test_find_caller_with_stack_info(self):
|
||||
called = []
|
||||
patch(self, logging.traceback, 'print_stack',
|
||||
lambda f, file: called.append(file.getvalue()))
|
||||
|
||||
self.logger.findCaller(stack_info=True)
|
||||
|
||||
self.assertEqual(len(called), 1)
|
||||
self.assertEqual('Stack (most recent call last):\n', called[0])
|
||||
|
||||
def test_make_record_with_extra_overwrite(self):
|
||||
name = 'my record'
|
||||
level = 13
|
||||
fn = lno = msg = args = exc_info = func = sinfo = None
|
||||
rv = logging._logRecordFactory(name, level, fn, lno, msg, args,
|
||||
exc_info, func, sinfo)
|
||||
|
||||
for key in ('message', 'asctime') + tuple(rv.__dict__.keys()):
|
||||
extra = {key: 'some value'}
|
||||
self.assertRaises(KeyError, self.logger.makeRecord, name, level,
|
||||
fn, lno, msg, args, exc_info,
|
||||
extra=extra, sinfo=sinfo)
|
||||
|
||||
def test_make_record_with_extra_no_overwrite(self):
|
||||
name = 'my record'
|
||||
level = 13
|
||||
fn = lno = msg = args = exc_info = func = sinfo = None
|
||||
extra = {'valid_key': 'some value'}
|
||||
result = self.logger.makeRecord(name, level, fn, lno, msg, args,
|
||||
exc_info, extra=extra, sinfo=sinfo)
|
||||
self.assertIn('valid_key', result.__dict__)
|
||||
|
||||
def test_has_handlers(self):
|
||||
self.assertTrue(self.logger.hasHandlers())
|
||||
|
||||
for handler in self.logger.handlers:
|
||||
self.logger.removeHandler(handler)
|
||||
assert not self.logger.hasHandlers()
|
||||
|
||||
self.assertFalse(self.logger.hasHandlers())
|
||||
|
||||
def test_has_handlers_no_propagate(self):
|
||||
child_logger = logging.getLogger('blah.child')
|
||||
child_logger.propagate = False
|
||||
assert child_logger.handlers == []
|
||||
|
||||
self.assertFalse(child_logger.hasHandlers())
|
||||
|
||||
def test_is_enabled_for(self):
|
||||
old_disable = self.logger.manager.disable
|
||||
self.logger.manager.disable = 23
|
||||
self.addCleanup(lambda: setattr(self.logger.manager,
|
||||
'disable', old_disable))
|
||||
self.assertFalse(self.logger.isEnabledFor(22))
|
||||
|
||||
|
||||
class BaseFileTest(BaseTest):
|
||||
"Base class for handler tests that write log files"
|
||||
|
||||
|
@ -2319,6 +2808,8 @@ def test_main():
|
|||
EncodingTest, WarningsTest, ConfigDictTest, ManagerTest,
|
||||
FormatterTest,
|
||||
LogRecordFactoryTest, ChildLoggerTest, QueueHandlerTest,
|
||||
ShutdownTest, ModuleLevelMiscTest, BasicConfigTest,
|
||||
LoggerAdapterTest, LoggerTest,
|
||||
RotatingFileHandlerTest,
|
||||
LastResortTest,
|
||||
TimedRotatingFileHandlerTest
|
||||
|
|
|
@ -869,8 +869,6 @@ class TestMaildir(TestMailbox):
|
|||
self.assertFalse((perms & 0o111)) # Execute bits should all be off.
|
||||
|
||||
def test_reread(self):
|
||||
# Wait for 2 seconds
|
||||
time.sleep(2)
|
||||
|
||||
# Initially, the mailbox has not been read and the time is null.
|
||||
assert getattr(self._box, '_last_read', None) is None
|
||||
|
@ -879,15 +877,21 @@ class TestMaildir(TestMailbox):
|
|||
self._box._refresh()
|
||||
assert getattr(self._box, '_last_read', None) is not None
|
||||
|
||||
# Try calling _refresh() again; the modification times shouldn't have
|
||||
# changed, so the mailbox should not be re-reading. Re-reading causes
|
||||
# the ._toc attribute to be assigned a new dictionary object, so
|
||||
# we'll check that the ._toc attribute isn't a different object.
|
||||
# Put the last modified times more than one second into the past
|
||||
# (because mtime has a one second granularity, a refresh is done
|
||||
# unconditionally if called for within the same second, just in case
|
||||
# the mbox has changed).
|
||||
for subdir in ('cur', 'new'):
|
||||
os.utime(os.path.join(self._box._path, subdir),
|
||||
(time.time()-5,)*2)
|
||||
|
||||
# Re-reading causes the ._toc attribute to be assigned a new dictionary
|
||||
# object, so we'll check that the ._toc attribute isn't a different
|
||||
# object.
|
||||
orig_toc = self._box._toc
|
||||
def refreshed():
|
||||
return self._box._toc is not orig_toc
|
||||
|
||||
time.sleep(1) # Wait 1sec to ensure time.time()'s value changes
|
||||
self._box._refresh()
|
||||
assert not refreshed()
|
||||
|
||||
|
|
46
Lib/test/test_msilib.py
Normal file
46
Lib/test/test_msilib.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
""" Test suite for the code in msilib """
|
||||
import unittest
|
||||
import os
|
||||
from test.support import run_unittest, import_module
|
||||
msilib = import_module('msilib')
|
||||
|
||||
class Test_make_id(unittest.TestCase):
|
||||
#http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx
|
||||
"""The Identifier data type is a text string. Identifiers may contain the
|
||||
ASCII characters A-Z (a-z), digits, underscores (_), or periods (.).
|
||||
However, every identifier must begin with either a letter or an
|
||||
underscore.
|
||||
"""
|
||||
|
||||
def test_is_no_change_required(self):
|
||||
self.assertEqual(
|
||||
msilib.make_id("short"), "short")
|
||||
self.assertEqual(
|
||||
msilib.make_id("nochangerequired"), "nochangerequired")
|
||||
self.assertEqual(
|
||||
msilib.make_id("one.dot"), "one.dot")
|
||||
self.assertEqual(
|
||||
msilib.make_id("_"), "_")
|
||||
self.assertEqual(
|
||||
msilib.make_id("a"), "a")
|
||||
#self.assertEqual(
|
||||
# msilib.make_id(""), "")
|
||||
|
||||
def test_invalid_first_char(self):
|
||||
self.assertEqual(
|
||||
msilib.make_id("9.short"), "_9.short")
|
||||
self.assertEqual(
|
||||
msilib.make_id(".short"), "_.short")
|
||||
|
||||
def test_invalid_any_char(self):
|
||||
self.assertEqual(
|
||||
msilib.make_id(".s\x82ort"), "_.s_ort")
|
||||
self.assertEqual (
|
||||
msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
|
||||
|
||||
|
||||
def test_main():
|
||||
run_unittest(__name__)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_main()
|
|
@ -928,6 +928,21 @@ class _TestArray(BaseTestCase):
|
|||
|
||||
self.assertEqual(list(arr[:]), seq)
|
||||
|
||||
@unittest.skipIf(c_int is None, "requires _ctypes")
|
||||
def test_array_from_size(self):
|
||||
size = 10
|
||||
# Test for zeroing (see issue #11675).
|
||||
# The repetition below strengthens the test by increasing the chances
|
||||
# of previously allocated non-zero memory being used for the new array
|
||||
# on the 2nd and 3rd loops.
|
||||
for _ in range(3):
|
||||
arr = self.Array('i', size)
|
||||
self.assertEqual(len(arr), size)
|
||||
self.assertEqual(list(arr), [0] * size)
|
||||
arr[:] = range(10)
|
||||
self.assertEqual(list(arr), list(range(10)))
|
||||
del arr
|
||||
|
||||
@unittest.skipIf(c_int is None, "requires _ctypes")
|
||||
def test_rawarray(self):
|
||||
self.test_array(raw=True)
|
||||
|
|
|
@ -12,9 +12,10 @@ import unittest
|
|||
import xml.etree
|
||||
import textwrap
|
||||
from io import StringIO
|
||||
from collections import namedtuple
|
||||
from contextlib import contextmanager
|
||||
from test.support import TESTFN, forget, rmtree, EnvironmentVarGuard, \
|
||||
reap_children, captured_output
|
||||
reap_children, captured_output, captured_stdout
|
||||
|
||||
from test import pydoc_mod
|
||||
|
||||
|
@ -379,6 +380,15 @@ class PydocDocTest(unittest.TestCase):
|
|||
finally:
|
||||
pydoc.getpager = getpager_old
|
||||
|
||||
def test_namedtuple_public_underscore(self):
|
||||
NT = namedtuple('NT', ['abc', 'def'], rename=True)
|
||||
with captured_stdout() as help_io:
|
||||
help(NT)
|
||||
helptext = help_io.getvalue()
|
||||
self.assertIn('_1', helptext)
|
||||
self.assertIn('_replace', helptext)
|
||||
self.assertIn('_asdict', helptext)
|
||||
|
||||
|
||||
class TestDescriptions(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
from test.support import verbose, run_unittest
|
||||
import re
|
||||
from re import Scanner
|
||||
import sys, traceback
|
||||
import sys
|
||||
import string
|
||||
import traceback
|
||||
from weakref import proxy
|
||||
|
||||
# Misc tests from Tim Peters' re.doc
|
||||
|
@ -411,31 +413,62 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.search("\s(b)", " b").group(1), "b")
|
||||
self.assertEqual(re.search("a\s", "a ").group(0), "a ")
|
||||
|
||||
def test_re_escape(self):
|
||||
p=""
|
||||
self.assertEqual(re.escape(p), p)
|
||||
for i in range(0, 256):
|
||||
p = p + chr(i)
|
||||
self.assertEqual(re.match(re.escape(chr(i)), chr(i)) is not None,
|
||||
True)
|
||||
self.assertEqual(re.match(re.escape(chr(i)), chr(i)).span(), (0,1))
|
||||
def assertMatch(self, pattern, text, match=None, span=None,
|
||||
matcher=re.match):
|
||||
if match is None and span is None:
|
||||
# the pattern matches the whole text
|
||||
match = text
|
||||
span = (0, len(text))
|
||||
elif match is None or span is None:
|
||||
raise ValueError('If match is not None, span should be specified '
|
||||
'(and vice versa).')
|
||||
m = matcher(pattern, text)
|
||||
self.assertTrue(m)
|
||||
self.assertEqual(m.group(), match)
|
||||
self.assertEqual(m.span(), span)
|
||||
|
||||
pat=re.compile(re.escape(p))
|
||||
self.assertEqual(pat.match(p) is not None, True)
|
||||
self.assertEqual(pat.match(p).span(), (0,256))
|
||||
def test_re_escape(self):
|
||||
alnum_chars = string.ascii_letters + string.digits
|
||||
p = ''.join(chr(i) for i in range(256))
|
||||
for c in p:
|
||||
if c in alnum_chars:
|
||||
self.assertEqual(re.escape(c), c)
|
||||
elif c == '\x00':
|
||||
self.assertEqual(re.escape(c), '\\000')
|
||||
else:
|
||||
self.assertEqual(re.escape(c), '\\' + c)
|
||||
self.assertMatch(re.escape(c), c)
|
||||
self.assertMatch(re.escape(p), p)
|
||||
|
||||
def test_re_escape_byte(self):
|
||||
p=b""
|
||||
self.assertEqual(re.escape(p), p)
|
||||
for i in range(0, 256):
|
||||
alnum_chars = (string.ascii_letters + string.digits).encode('ascii')
|
||||
p = bytes(range(256))
|
||||
for i in p:
|
||||
b = bytes([i])
|
||||
p += b
|
||||
self.assertEqual(re.match(re.escape(b), b) is not None, True)
|
||||
self.assertEqual(re.match(re.escape(b), b).span(), (0,1))
|
||||
if b in alnum_chars:
|
||||
self.assertEqual(re.escape(b), b)
|
||||
elif i == 0:
|
||||
self.assertEqual(re.escape(b), b'\\000')
|
||||
else:
|
||||
self.assertEqual(re.escape(b), b'\\' + b)
|
||||
self.assertMatch(re.escape(b), b)
|
||||
self.assertMatch(re.escape(p), p)
|
||||
|
||||
pat=re.compile(re.escape(p))
|
||||
self.assertEqual(pat.match(p) is not None, True)
|
||||
self.assertEqual(pat.match(p).span(), (0,256))
|
||||
def test_re_escape_non_ascii(self):
|
||||
s = 'xxx\u2620\u2620\u2620xxx'
|
||||
s_escaped = re.escape(s)
|
||||
self.assertEqual(s_escaped, 'xxx\\\u2620\\\u2620\\\u2620xxx')
|
||||
self.assertMatch(s_escaped, s)
|
||||
self.assertMatch('.%s+.' % re.escape('\u2620'), s,
|
||||
'x\u2620\u2620\u2620x', (2, 7), re.search)
|
||||
|
||||
def test_re_escape_non_ascii_bytes(self):
|
||||
b = 'y\u2620y\u2620y'.encode('utf-8')
|
||||
b_escaped = re.escape(b)
|
||||
self.assertEqual(b_escaped, b'y\\\xe2\\\x98\\\xa0y\\\xe2\\\x98\\\xa0y')
|
||||
self.assertMatch(b_escaped, b)
|
||||
res = re.findall(re.escape('\u2620'.encode('utf-8')), b)
|
||||
self.assertEqual(len(res), 2)
|
||||
|
||||
def pickle_test(self, pickle):
|
||||
oldpat = re.compile('a(?:b|(c|e){1,2}?|d)+?(.)')
|
||||
|
|
|
@ -1325,6 +1325,7 @@ class POSIXProcessTestCase(BaseTestCase):
|
|||
stdout=subprocess.PIPE,
|
||||
bufsize=0)
|
||||
f = p.stdout
|
||||
self.addCleanup(f.close)
|
||||
try:
|
||||
self.assertEqual(f.read(4), b"appl")
|
||||
self.assertIn(f, select.select([f], [], [], 0.0)[0])
|
||||
|
|
|
@ -501,7 +501,7 @@ class SysModuleTest(unittest.TestCase):
|
|||
|
||||
def test_sys_flags(self):
|
||||
self.assertTrue(sys.flags)
|
||||
attrs = ("debug", "division_warning",
|
||||
attrs = ("debug",
|
||||
"inspect", "interactive", "optimize", "dont_write_bytecode",
|
||||
"no_user_site", "no_site", "ignore_environment", "verbose",
|
||||
"bytes_warning", "quiet")
|
||||
|
|
|
@ -12,6 +12,7 @@ import time
|
|||
|
||||
|
||||
class URLTimeoutTest(unittest.TestCase):
|
||||
# XXX this test doesn't seem to test anything useful.
|
||||
|
||||
TIMEOUT = 30.0
|
||||
|
||||
|
@ -24,7 +25,7 @@ class URLTimeoutTest(unittest.TestCase):
|
|||
def testURLread(self):
|
||||
with support.transient_internet("www.python.org"):
|
||||
f = urllib.request.urlopen("http://www.python.org/")
|
||||
x = f.read()
|
||||
x = f.read()
|
||||
|
||||
class urlopenNetworkTests(unittest.TestCase):
|
||||
"""Tests urllib.reqest.urlopen using the network.
|
||||
|
@ -43,8 +44,10 @@ class urlopenNetworkTests(unittest.TestCase):
|
|||
|
||||
def urlopen(self, *args, **kwargs):
|
||||
resource = args[0]
|
||||
with support.transient_internet(resource):
|
||||
return urllib.request.urlopen(*args, **kwargs)
|
||||
cm = support.transient_internet(resource)
|
||||
cm.__enter__()
|
||||
self.addCleanup(cm.__exit__, None, None, None)
|
||||
return urllib.request.urlopen(*args, **kwargs)
|
||||
|
||||
def test_basic(self):
|
||||
# Simple test expected to pass.
|
||||
|
@ -135,8 +138,10 @@ class urlretrieveNetworkTests(unittest.TestCase):
|
|||
|
||||
def urlretrieve(self, *args):
|
||||
resource = args[0]
|
||||
with support.transient_internet(resource):
|
||||
return urllib.request.urlretrieve(*args)
|
||||
cm = support.transient_internet(resource)
|
||||
cm.__enter__()
|
||||
self.addCleanup(cm.__exit__, None, None, None)
|
||||
return urllib.request.urlretrieve(*args)
|
||||
|
||||
def test_basic(self):
|
||||
# Test basic functionality.
|
||||
|
|
|
@ -12,6 +12,7 @@ class XDRTest(unittest.TestCase):
|
|||
a = [b'what', b'is', b'hapnin', b'doctor']
|
||||
|
||||
p.pack_int(42)
|
||||
p.pack_int(-17)
|
||||
p.pack_uint(9)
|
||||
p.pack_bool(True)
|
||||
p.pack_bool(False)
|
||||
|
@ -29,6 +30,7 @@ class XDRTest(unittest.TestCase):
|
|||
self.assertEqual(up.get_position(), 0)
|
||||
|
||||
self.assertEqual(up.unpack_int(), 42)
|
||||
self.assertEqual(up.unpack_int(), -17)
|
||||
self.assertEqual(up.unpack_uint(), 9)
|
||||
self.assertTrue(up.unpack_bool() is True)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue