summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/crashers/dangerous_subclassing.py12
-rw-r--r--Lib/test/crashers/modify_dict_attr.py19
-rwxr-xr-xLib/test/regrtest.py5
-rw-r--r--Lib/test/string_tests.py4
-rw-r--r--Lib/test/test___all__.py2
-rw-r--r--Lib/test/test_bz2.py18
-rw-r--r--Lib/test/test_cmd_line.py13
-rw-r--r--Lib/test/test_defaultdict.py2
-rw-r--r--Lib/test/test_descr.py80
-rw-r--r--Lib/test/test_exceptions.py70
-rw-r--r--Lib/test/test_fileio.py2
-rw-r--r--Lib/test/test_format.py8
-rw-r--r--Lib/test/test_index.py9
-rw-r--r--Lib/test/test_itertools.py6
-rw-r--r--Lib/test/test_pep352.py72
-rw-r--r--Lib/test/test_popen2.py6
-rw-r--r--Lib/test/test_posixpath.py10
-rw-r--r--Lib/test/test_pty.py19
-rw-r--r--Lib/test/test_support.py2
-rw-r--r--Lib/test/test_unittest.py6
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()