diff options
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/crashers/dangerous_subclassing.py | 12 | ||||
-rw-r--r-- | Lib/test/crashers/modify_dict_attr.py | 19 | ||||
-rwxr-xr-x | Lib/test/regrtest.py | 5 | ||||
-rw-r--r-- | Lib/test/string_tests.py | 4 | ||||
-rw-r--r-- | Lib/test/test___all__.py | 2 | ||||
-rw-r--r-- | Lib/test/test_bz2.py | 18 | ||||
-rw-r--r-- | Lib/test/test_cmd_line.py | 13 | ||||
-rw-r--r-- | Lib/test/test_defaultdict.py | 2 | ||||
-rw-r--r-- | Lib/test/test_descr.py | 80 | ||||
-rw-r--r-- | Lib/test/test_exceptions.py | 70 | ||||
-rw-r--r-- | Lib/test/test_fileio.py | 2 | ||||
-rw-r--r-- | Lib/test/test_format.py | 8 | ||||
-rw-r--r-- | Lib/test/test_index.py | 9 | ||||
-rw-r--r-- | Lib/test/test_itertools.py | 6 | ||||
-rw-r--r-- | Lib/test/test_pep352.py | 72 | ||||
-rw-r--r-- | Lib/test/test_popen2.py | 6 | ||||
-rw-r--r-- | Lib/test/test_posixpath.py | 10 | ||||
-rw-r--r-- | Lib/test/test_pty.py | 19 | ||||
-rw-r--r-- | Lib/test/test_support.py | 2 | ||||
-rw-r--r-- | Lib/test/test_unittest.py | 6 |
20 files changed, 251 insertions, 114 deletions
diff --git a/Lib/test/crashers/dangerous_subclassing.py b/Lib/test/crashers/dangerous_subclassing.py deleted file mode 100644 index 0479952..0000000 --- a/Lib/test/crashers/dangerous_subclassing.py +++ /dev/null @@ -1,12 +0,0 @@ - -# http://python.org/sf/1174712 - -import types - -class X(types.ModuleType, str): - """Such a subclassing is incorrectly allowed -- - see the SF bug report for explanations""" - -if __name__ == '__main__': - X('name') # segfault: ModuleType.__init__() reads - # the dict at the wrong offset diff --git a/Lib/test/crashers/modify_dict_attr.py b/Lib/test/crashers/modify_dict_attr.py deleted file mode 100644 index be675c1..0000000 --- a/Lib/test/crashers/modify_dict_attr.py +++ /dev/null @@ -1,19 +0,0 @@ - -# http://python.org/sf/1303614 - -class Y(object): - pass - -class type_with_modifiable_dict(type, Y): - pass - -class MyClass(object, metaclass=type_with_modifiable_dict): - """This class has its __dict__ attribute indirectly - exposed via the __dict__ getter/setter of Y. - """ - - -if __name__ == '__main__': - dictattr = Y.__dict__['__dict__'] - dictattr.__delete__(MyClass) # if we set tp_dict to NULL, - print(MyClass) # doing anything with MyClass segfaults diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 7458b5e..3681a9d 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -689,9 +689,10 @@ def dash_R(the_module, test, indirect_test, huntrleaks): deltas.append(sys.gettotalrefcount() - rc - 2) print(file=sys.stderr) if any(deltas): - print(test, 'leaked', deltas, 'references', file=sys.stderr) + msg = '%s leaked %s references, sum=%s' % (test, deltas, sum(deltas)) + print(msg, file=sys.stderr) refrep = open(fname, "a") - print(test, 'leaked', deltas, 'references', file=refrep) + print(msg, file=refrep) refrep.close() def dash_R_cleanup(fs, ps, pic): diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index b1b64a8..f2c9579 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -2,7 +2,7 @@ Common tests shared by test_str, test_unicode, test_userstring and test_string. """ -import unittest, string, sys +import unittest, string, sys, struct from test import test_support from UserList import UserList @@ -507,7 +507,7 @@ class BaseTest(unittest.TestCase): def test_replace_overflow(self): # Check for overflow checking on 32 bit machines - if sys.maxint != 2147483647: + if sys.maxint != 2147483647 or struct.calcsize("P") > 4: return A2_16 = "A" * (2**16) self.checkraises(OverflowError, A2_16, "replace", "", A2_16) diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py index 7a39ca3..e7ed2f7 100644 --- a/Lib/test/test___all__.py +++ b/Lib/test/test___all__.py @@ -7,6 +7,8 @@ warnings.filterwarnings("ignore", "the gopherlib module is deprecated", DeprecationWarning, "<string>") +warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*", + DeprecationWarning) class AllTest(unittest.TestCase): diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 44684c3..0ddfc57 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -5,7 +5,7 @@ from test.test_support import TESTFN import unittest from cStringIO import StringIO import os -import popen2 +import subprocess import sys import bz2 @@ -21,18 +21,20 @@ class BaseTest(unittest.TestCase): if has_cmdline_bunzip2: def decompress(self, data): - pop = popen2.Popen3("bunzip2", capturestderr=1) - pop.tochild.write(data) - pop.tochild.close() - ret = pop.fromchild.read() - pop.fromchild.close() + pop = subprocess.Popen("bunzip2", shell=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + pop.stdin.write(data) + pop.stdin.close() + ret = pop.stdout.read() + pop.stdout.close() if pop.wait() != 0: ret = bz2.decompress(data) return ret else: - # popen2.Popen3 doesn't exist on Windows, and even if it did, bunzip2 - # isn't available to run. + # bunzip2 isn't available to run on Windows. def decompress(self, data): return bz2.decompress(data) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index cacae7a..d3f07c7 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -1,18 +1,19 @@ import test.test_support, unittest import sys -import popen2 import subprocess class CmdLineTest(unittest.TestCase): def start_python(self, cmd_line): - outfp, infp = popen2.popen4('"%s" %s' % (sys.executable, cmd_line)) - infp.close() - data = outfp.read() - outfp.close() + cmd = '"%s" %s' % (sys.executable, cmd_line) + p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + p.stdin.close() + data = p.stdout.read() + p.stdout.close() # try to cleanup the child so we don't appear to leak when running # with regrtest -R. This should be a no-op on Windows. - popen2._cleanup() + subprocess._cleanup() return data def exit_code(self, *args): diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py index a8dfdb1..18c1eb6 100644 --- a/Lib/test/test_defaultdict.py +++ b/Lib/test/test_defaultdict.py @@ -137,7 +137,7 @@ class TestDefaultDict(unittest.TestCase): try: d1[(1,)] except KeyError as err: - self.assertEqual(err.message, (1,)) + self.assertEqual(err.args[0], (1,)) else: self.fail("expected KeyError") diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 4b6d734..e8d94f4 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3,6 +3,7 @@ from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout from copy import deepcopy import warnings +import types warnings.filterwarnings("ignore", r'complex divmod\(\), // and % are deprecated$', @@ -814,6 +815,16 @@ def pymods(): ("getattr", "foo"), ("delattr", "foo")]) + # http://python.org/sf/1174712 + try: + class Module(types.ModuleType, str): + pass + except TypeError: + pass + else: + raise TestFailed("inheriting from ModuleType and str at the " + "same time should fail") + def multi(): if verbose: print("Testing multiple inheritance...") class C(object): @@ -2734,8 +2745,73 @@ def setdict(): cant(a, []) cant(a, 1) del a.__dict__ # Deleting __dict__ is allowed - # Classes don't allow __dict__ assignment - cant(C, {}) + + class Base(object): + pass + def verify_dict_readonly(x): + """ + x has to be an instance of a class inheriting from Base. + """ + cant(x, {}) + try: + del x.__dict__ + except (AttributeError, TypeError): + pass + else: + raise TestFailed, "shouldn't allow del %r.__dict__" % x + dict_descr = Base.__dict__["__dict__"] + try: + dict_descr.__set__(x, {}) + except (AttributeError, TypeError): + pass + else: + raise TestFailed, "dict_descr allowed access to %r's dict" % x + + # Classes don't allow __dict__ assignment and have readonly dicts + class Meta1(type, Base): + pass + class Meta2(Base, type): + pass + class D(object): + __metaclass__ = Meta1 + class E(object): + __metaclass__ = Meta2 + for cls in C, D, E: + verify_dict_readonly(cls) + class_dict = cls.__dict__ + try: + class_dict["spam"] = "eggs" + except TypeError: + pass + else: + raise TestFailed, "%r's __dict__ can be modified" % cls + + # Modules also disallow __dict__ assignment + class Module1(types.ModuleType, Base): + pass + class Module2(Base, types.ModuleType): + pass + for ModuleType in Module1, Module2: + mod = ModuleType("spam") + verify_dict_readonly(mod) + mod.__dict__["spam"] = "eggs" + + # Exception's __dict__ can be replaced, but not deleted + class Exception1(Exception, Base): + pass + class Exception2(Base, Exception): + pass + for ExceptionType in Exception, Exception1, Exception2: + e = ExceptionType() + e.__dict__ = {"a": 1} + vereq(e.a, 1) + try: + del e.__dict__ + except (TypeError, AttributeError): + pass + else: + raise TestFaied, "%r's __dict__ can be deleted" % e + def pickles(): if verbose: diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index dbaf01c..b1d6790 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -9,7 +9,9 @@ try: except ImportError: cPickle = None -from test.test_support import TESTFN, unlink, run_unittest +from test.test_support import (TESTFN, unlink, run_unittest, + guard_warnings_filter) +from test.test_pep352 import ignore_message_warning # XXX This is not really enough, each *operation* should be tested! @@ -278,38 +280,40 @@ class ExceptionTests(unittest.TestCase): except NameError: pass - for exc, args, expected in exceptionList: - try: - e = exc(*args) - except: - print("\nexc=%r, args=%r" % (exc, args)) - raise - else: - # Verify module name - self.assertEquals(type(e).__module__, '__builtin__') - # Verify no ref leaks in Exc_str() - s = str(e) - for checkArgName in expected: - value = getattr(e, checkArgName) - self.assertEquals(repr(value), - repr(expected[checkArgName]), - '%r.%s == %r, expected %r' % ( - e, checkArgName, - value, expected[checkArgName])) - - # test for pickling support - for p in pickle, cPickle: - if p is None: - continue # cPickle not found -- skip it - for protocol in range(p.HIGHEST_PROTOCOL + 1): - s = p.dumps(e, protocol) - new = p.loads(s) - for checkArgName in expected: - got = repr(getattr(new, checkArgName)) - want = repr(expected[checkArgName]) - self.assertEquals(got, want, - 'pickled "%r", attribute "%s' % - (e, checkArgName)) + with guard_warnings_filter(): + ignore_message_warning() + for exc, args, expected in exceptionList: + try: + e = exc(*args) + except: + print("\nexc=%r, args=%r" % (exc, args)) + raise + else: + # Verify module name + self.assertEquals(type(e).__module__, '__builtin__') + # Verify no ref leaks in Exc_str() + s = str(e) + for checkArgName in expected: + value = getattr(e, checkArgName) + self.assertEquals(repr(value), + repr(expected[checkArgName]), + '%r.%s == %r, expected %r' % ( + e, checkArgName, + value, expected[checkArgName])) + + # test for pickling support + for p in pickle, cPickle: + if p is None: + continue # cPickle not found -- skip it + for protocol in range(p.HIGHEST_PROTOCOL + 1): + s = p.dumps(e, protocol) + new = p.loads(s) + for checkArgName in expected: + got = repr(getattr(new, checkArgName)) + want = repr(expected[checkArgName]) + self.assertEquals(got, want, + 'pickled "%r", attribute "%s' % + (e, checkArgName)) def testKeywordArgs(self): # test that builtin exception don't take keyword args, diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index be2f781..5bad843 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -166,7 +166,7 @@ class OtherFileTests(unittest.TestCase): try: f = _fileio._FileIO(TESTFN, bad_mode) except ValueError as msg: - if msg.message != 0: + if msg.args[0] != 0: s = str(msg) if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: self.fail("bad error message for invalid mode: %s" % s) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index a006bbf..718320d 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -1,5 +1,7 @@ from test.test_support import verbose, have_unicode, TestFailed import sys +from test.test_support import MAX_Py_ssize_t +maxsize = MAX_Py_ssize_t # test string formatting operator (I am not sure if this is being tested # elsewhere but, surely, some of the given cases are *not* tested because @@ -238,11 +240,11 @@ class Foobar(int): test_exc('%o', Foobar(), TypeError, "expected string or Unicode object, int found") -if sys.maxint == 2**31-1: +if maxsize == 2**31-1: # crashes 2.2.1 and earlier: try: - "%*d"%(sys.maxint, -127) + "%*d"%(maxsize, -127) except MemoryError: pass else: - raise TestFailed, '"%*d"%(sys.maxint, -127) should fail' + raise TestFailed, '"%*d"%(maxsize, -127) should fail' diff --git a/Lib/test/test_index.py b/Lib/test/test_index.py index 8055c33..653665e 100644 --- a/Lib/test/test_index.py +++ b/Lib/test/test_index.py @@ -1,7 +1,10 @@ import unittest from test import test_support import operator +import sys from sys import maxint +maxsize = test_support.MAX_Py_ssize_t +minsize = -maxsize-1 class oldstyle: def __index__(self): @@ -177,7 +180,7 @@ class OverflowTestCase(unittest.TestCase): def _getitem_helper(self, base): class GetItem(base): def __len__(self): - return maxint + return maxint #cannot return long here def __getitem__(self, key): return key def __getslice__(self, i, j): @@ -185,8 +188,8 @@ class OverflowTestCase(unittest.TestCase): x = GetItem() self.assertEqual(x[self.pos], self.pos) self.assertEqual(x[self.neg], self.neg) - self.assertEqual(x[self.neg:self.pos], (-1, maxint)) - self.assertEqual(x[self.neg:self.pos:1].indices(maxint), (0, maxint, 1)) + self.assertEqual(x[self.neg:self.pos], (maxint+minsize, maxsize)) + self.assertEqual(x[self.neg:self.pos:1].indices(maxsize), (0, maxsize, 1)) def test_getitem(self): self._getitem_helper(object) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index c2a539c..765501d 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -5,6 +5,8 @@ from weakref import proxy import sys import operator import random +maxsize = test_support.MAX_Py_ssize_t +minsize = -maxsize-1 def lzip(*args): return list(zip(*args)) @@ -55,7 +57,7 @@ class TestBasicOps(unittest.TestCase): self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)]) self.assertRaises(TypeError, count, 2, 3) self.assertRaises(TypeError, count, 'a') - self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10)) + self.assertRaises(OverflowError, list, islice(count(maxsize-5), 10)) c = count(3) self.assertEqual(repr(c), 'count(3)') next(c) @@ -336,7 +338,7 @@ class TestBasicOps(unittest.TestCase): self.assertRaises(ValueError, islice, range(10), 1, 'a') self.assertRaises(ValueError, islice, range(10), 'a', 1, 1) self.assertRaises(ValueError, islice, range(10), 1, 'a', 1) - self.assertEqual(len(list(islice(count(), 1, 10, sys.maxint))), 1) + self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1) def test_takewhile(self): data = [1, 3, 5, 20, 2, 4, 6, 8] diff --git a/Lib/test/test_pep352.py b/Lib/test/test_pep352.py index e39a397..b372ce9 100644 --- a/Lib/test/test_pep352.py +++ b/Lib/test/test_pep352.py @@ -5,6 +5,13 @@ from test.test_support import run_unittest, guard_warnings_filter import os from platform import system as platform_system +def ignore_message_warning(): + """Ignore the DeprecationWarning for BaseException.message.""" + warnings.resetwarnings() + warnings.filterwarnings("ignore", "BaseException.message", + DeprecationWarning) + + class ExceptionClassTests(unittest.TestCase): """Tests for anything relating to exception objects themselves (e.g., @@ -14,9 +21,12 @@ class ExceptionClassTests(unittest.TestCase): self.failUnless(issubclass(Exception, object)) def verify_instance_interface(self, ins): - for attr in ("args", "message", "__str__", "__repr__"): - self.failUnless(hasattr(ins, attr), "%s missing %s attribute" % - (ins.__class__.__name__, attr)) + with guard_warnings_filter(): + ignore_message_warning() + for attr in ("args", "message", "__str__", "__repr__"): + self.failUnless(hasattr(ins, attr), + "%s missing %s attribute" % + (ins.__class__.__name__, attr)) def test_inheritance(self): # Make sure the inheritance hierarchy matches the documentation @@ -79,7 +89,7 @@ class ExceptionClassTests(unittest.TestCase): inheritance_tree.close() self.failUnlessEqual(len(exc_set), 0, "%s not accounted for" % exc_set) - interface_tests = ("length", "args", "message", "str", "unicode", "repr") + interface_tests = ("length", "args", "message", "str", "repr") def interface_test_driver(self, results): for test_name, (given, expected) in zip(self.interface_tests, results): @@ -90,29 +100,57 @@ class ExceptionClassTests(unittest.TestCase): # Make sure interface works properly when given a single argument arg = "spam" exc = Exception(arg) - results = ([len(exc.args), 1], [exc.args[0], arg], [exc.message, arg], - [str(exc), str(arg)], [str(exc), str(arg)], - [repr(exc), exc.__class__.__name__ + repr(exc.args)]) - self.interface_test_driver(results) + with guard_warnings_filter(): + ignore_message_warning() + results = ([len(exc.args), 1], [exc.args[0], arg], + [exc.message, arg], + [str(exc), str(arg)], + [repr(exc), exc.__class__.__name__ + repr(exc.args)]) + self.interface_test_driver(results) def test_interface_multi_arg(self): # Make sure interface correct when multiple arguments given arg_count = 3 args = tuple(range(arg_count)) exc = Exception(*args) - results = ([len(exc.args), arg_count], [exc.args, args], - [exc.message, ''], [str(exc), str(args)], - [str(exc), str(args)], - [repr(exc), exc.__class__.__name__ + repr(exc.args)]) - self.interface_test_driver(results) + with guard_warnings_filter(): + ignore_message_warning() + results = ([len(exc.args), arg_count], [exc.args, args], + [exc.message, ''], [str(exc), str(args)], + [repr(exc), exc.__class__.__name__ + repr(exc.args)]) + self.interface_test_driver(results) def test_interface_no_arg(self): # Make sure that with no args that interface is correct exc = Exception() - results = ([len(exc.args), 0], [exc.args, tuple()], [exc.message, ''], - [str(exc), ''], [str(exc), ''], - [repr(exc), exc.__class__.__name__ + '()']) - self.interface_test_driver(results) + with guard_warnings_filter(): + ignore_message_warning() + results = ([len(exc.args), 0], [exc.args, tuple()], + [exc.message, ''], + [str(exc), ''], + [repr(exc), exc.__class__.__name__ + '()']) + self.interface_test_driver(results) + + def test_message_deprecation(self): + # As of Python 2.6, BaseException.message is deprecated. + with guard_warnings_filter(): + warnings.resetwarnings() + warnings.filterwarnings('error') + + try: + BaseException().message + except DeprecationWarning: + pass + else: + self.fail("BaseException.message not deprecated") + + exc = BaseException() + try: + exc.message = '' + except DeprecationWarning: + pass + else: + self.fail("BaseException.message assignment not deprecated") class UsageTests(unittest.TestCase): diff --git a/Lib/test/test_popen2.py b/Lib/test/test_popen2.py index 31f22d6..023871f 100644 --- a/Lib/test/test_popen2.py +++ b/Lib/test/test_popen2.py @@ -1,6 +1,12 @@ #! /usr/bin/env python """Test script for popen2.py""" +import warnings +warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*", + DeprecationWarning) +warnings.filterwarnings("ignore", "os\.popen. is deprecated.*", + DeprecationWarning) + import os import sys import unittest diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 0abf464..88aa68c 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -130,6 +130,16 @@ class PosixPathTest(unittest.TestCase): "/home/swen/spam" ) + testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 'aXc', 'abd', 'ab', 'aX', 'abcX'] + for s1 in testlist: + for s2 in testlist: + p = posixpath.commonprefix([s1, s2]) + self.assert_(s1.startswith(p)) + self.assert_(s2.startswith(p)) + if s1 != s2: + n = len(p) + self.assertNotEqual(s1[n:n+1], s2[n:n+1]) + def test_getsize(self): f = open(test_support.TESTFN, "wb") try: diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 5ce387b..245a9e4 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -1,3 +1,5 @@ +import errno +import fcntl import pty import os import sys @@ -40,6 +42,7 @@ def normalize_output(data): # Marginal testing of pty suite. Cannot do extensive 'do or fail' testing # because pty code is not too portable. +# XXX(nnorwitz): these tests leak fds when there is an error. class PtyTest(unittest.TestCase): def setUp(self): # isatty() and close() can hang on some platforms. Set an alarm @@ -70,6 +73,22 @@ class PtyTest(unittest.TestCase): self.assertTrue(os.isatty(slave_fd), 'slave_fd is not a tty') + # Solaris requires reading the fd before anything is returned. + # My guess is that since we open and close the slave fd + # in master_open(), we need to read the EOF. + + # Ensure the fd is non-blocking in case there's nothing to read. + orig_flags = fcntl.fcntl(master_fd, fcntl.F_GETFL) + fcntl.fcntl(master_fd, fcntl.F_SETFL, orig_flags | os.O_NONBLOCK) + try: + s1 = os.read(master_fd, 1024) + self.assertEquals('', s1) + except OSError as e: + if e.errno != errno.EAGAIN: + raise + # Restore the original flags. + fcntl.fcntl(master_fd, fcntl.F_SETFL, orig_flags) + debug("Writing to slave_fd") os.write(slave_fd, TEST_STRING_1) s1 = os.read(master_fd, 1024) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 7cbee0a..5692a83 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -256,6 +256,7 @@ def check_syntax_error(testcase, statement): def open_urlresource(url): import urllib, urlparse + requires('urlfetch') filename = urlparse.urlparse(url)[2].split('/')[-1] # '/': it's URL! for path in [os.path.curdir, os.path.pardir]: @@ -263,7 +264,6 @@ def open_urlresource(url): if os.path.exists(fn): return open(fn) - requires('urlfetch') print('\tfetching %s ...' % url, file=get_original_stdout()) fn, _ = urllib.urlretrieve(url, filename) return open(fn) diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 70f12d2..327d65f 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -540,7 +540,8 @@ class Test_TestLoader(TestCase): # audioop should now be loaded, thanks to loadTestsFromName() self.failUnless(module_name in sys.modules) finally: - del sys.modules[module_name] + if module_name in sys.modules: + del sys.modules[module_name] ################################################################ ### Tests for TestLoader.loadTestsFromName() @@ -936,7 +937,8 @@ class Test_TestLoader(TestCase): # audioop should now be loaded, thanks to loadTestsFromName() self.failUnless(module_name in sys.modules) finally: - del sys.modules[module_name] + if module_name in sys.modules: + del sys.modules[module_name] ################################################################ ### /Tests for TestLoader.loadTestsFromNames() |