diff options
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_compile.py | 1 | ||||
-rw-r--r-- | Lib/test/test_deque.py | 6 | ||||
-rw-r--r-- | Lib/test/test_dumbdbm.py | 18 | ||||
-rw-r--r-- | Lib/test/test_exceptions.py | 1 | ||||
-rw-r--r-- | Lib/test/test_heapq.py | 24 | ||||
-rw-r--r-- | Lib/test/test_import.py | 11 | ||||
-rw-r--r-- | Lib/test/test_pty.py | 15 | ||||
-rw-r--r-- | Lib/test/test_random.py | 15 | ||||
-rw-r--r-- | Lib/test/test_repr.py | 1 | ||||
-rw-r--r-- | Lib/test/test_set.py | 29 | ||||
-rw-r--r-- | Lib/test/test_struct.py | 25 | ||||
-rw-r--r-- | Lib/test/test_support.py | 44 | ||||
-rw-r--r-- | Lib/test/test_tarfile.py | 60 | ||||
-rw-r--r-- | Lib/test/test_uu.py | 14 | ||||
-rw-r--r-- | Lib/test/test_weakref.py | 2 |
15 files changed, 216 insertions, 50 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 73ef2d4..b517daa 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1,5 +1,4 @@ import unittest -import warnings import sys from test import test_support diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 4c5d1ee..56031a7 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -396,6 +396,12 @@ class TestVariousIteratorArgs(unittest.TestCase): d.pop() self.assertRaises(RuntimeError, it.next) + def test_runtime_error_on_empty_deque(self): + d = deque() + it = iter(d) + d.append(10) + self.assertRaises(RuntimeError, it.next) + class Deque(deque): pass diff --git a/Lib/test/test_dumbdbm.py b/Lib/test/test_dumbdbm.py index 63b14b0..e5dfe1d 100644 --- a/Lib/test/test_dumbdbm.py +++ b/Lib/test/test_dumbdbm.py @@ -38,6 +38,24 @@ class DumbDBMTestCase(unittest.TestCase): self.read_helper(f) f.close() + def test_dumbdbm_creation_mode(self): + # On platforms without chmod, don't do anything. + if not (hasattr(os, 'chmod') and hasattr(os, 'umask')): + return + + try: + old_umask = os.umask(0002) + f = dumbdbm.open(_fname, 'c', 0637) + f.close() + finally: + os.umask(old_umask) + + import stat + st = os.stat(_fname + '.dat') + self.assertEqual(stat.S_IMODE(st.st_mode), 0635) + st = os.stat(_fname + '.dir') + self.assertEqual(stat.S_IMODE(st.st_mode), 0635) + def test_close_twice(self): f = dumbdbm.open(_fname) f['a'] = 'b' diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index abce41e..7619aae 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -3,7 +3,6 @@ import os import sys import unittest -import warnings import pickle try: import cPickle diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 1916449..b652d41 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -104,20 +104,20 @@ class TestHeap(unittest.TestCase): self.assertEqual(heap_sorted, sorted(data)) def test_nsmallest(self): - data = [random.randrange(2000) for i in range(1000)] - f = lambda x: x * 547 % 2000 - for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): - self.assertEqual(nsmallest(n, data), sorted(data)[:n]) - self.assertEqual(nsmallest(n, data, key=f), - sorted(data, key=f)[:n]) + data = [(random.randrange(2000), i) for i in range(1000)] + for f in (None, lambda x: x[0] * 547 % 2000): + for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): + self.assertEqual(nsmallest(n, data), sorted(data)[:n]) + self.assertEqual(nsmallest(n, data, key=f), + sorted(data, key=f)[:n]) def test_nlargest(self): - data = [random.randrange(2000) for i in range(1000)] - f = lambda x: x * 547 % 2000 - for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): - self.assertEqual(nlargest(n, data), sorted(data, reverse=True)[:n]) - self.assertEqual(nlargest(n, data, key=f), - sorted(data, key=f, reverse=True)[:n]) + data = [(random.randrange(2000), i) for i in range(1000)] + for f in (None, lambda x: x[0] * 547 % 2000): + for n in (0, 1, 2, 10, 100, 400, 999, 1000, 1100): + self.assertEqual(nlargest(n, data), sorted(data, reverse=True)[:n]) + self.assertEqual(nlargest(n, data, key=f), + sorted(data, key=f, reverse=True)[:n]) #============================================================================== diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index e37378f..58de944 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -1,10 +1,11 @@ -from test.test_support import TESTFN, run_unittest +from test.test_support import TESTFN, run_unittest, guard_warnings_filter import unittest import os import random import sys import py_compile +import warnings def remove_files(name): @@ -204,15 +205,11 @@ class ImportTest(unittest.TestCase): self.assert_(y is test.test_support, y.__name__) def test_import_initless_directory_warning(self): - import warnings - oldfilters = warnings.filters[:] - warnings.simplefilter('error', ImportWarning); - try: + with guard_warnings_filter(): # Just a random non-package directory we always expect to be # somewhere in sys.path... + warnings.simplefilter('error', ImportWarning) self.assertRaises(ImportWarning, __import__, "site-packages") - finally: - warnings.filters = oldfilters def test_main(verbose=None): run_unittest(ImportTest) diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 59e5162..8a83e39 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -115,6 +115,12 @@ if pid == pty.CHILD: os._exit(4) else: debug("Waiting for child (%d) to finish."%pid) + ##line = os.read(master_fd, 80) + ##lines = line.replace('\r\n', '\n').split('\n') + ##if False and lines != ['In child, calling os.setsid()', + ## 'Good: OSError was raised.', '']: + ## raise TestFailed("Unexpected output from child: %r" % line) + (pid, status) = os.waitpid(pid, 0) res = status >> 8 debug("Child (%d) exited with status %d (%d)."%(pid, res, status)) @@ -127,6 +133,15 @@ else: elif res != 4: raise TestFailed, "pty.fork() failed for unknown reasons." + ##debug("Reading from master_fd now that the child has exited") + ##try: + ## s1 = os.read(master_fd, 1024) + ##except os.error: + ## pass + ##else: + ## raise TestFailed("Read from master_fd did not raise exception") + + os.close(master_fd) # pty.fork() passed. diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index afcf113..7ec130d 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -180,10 +180,9 @@ class WichmannHill_TestBasicOps(TestBasicOps): def test_bigrand(self): # Verify warnings are raised when randrange is too large for random() - oldfilters = warnings.filters[:] - warnings.filterwarnings("error", "Underlying random") - self.assertRaises(UserWarning, self.gen.randrange, 2**60) - warnings.filters[:] = oldfilters + with test_support.guard_warnings_filter(): + warnings.filterwarnings("error", "Underlying random") + self.assertRaises(UserWarning, self.gen.randrange, 2**60) class SystemRandom_TestBasicOps(TestBasicOps): gen = random.SystemRandom() @@ -441,6 +440,14 @@ class MersenneTwister_TestBasicOps(TestBasicOps): self.assertEqual(k, numbits) # note the stronger assertion self.assert_(2**k > n > 2**(k-1)) # note the stronger assertion + def test_randrange_bug_1590891(self): + start = 1000000000000 + stop = -100000000000000000000 + step = -200 + x = self.gen.randrange(start, stop, step) + self.assert_(stop < x <= start) + self.assertEqual((x+stop)%step, 0) + _gammacoeff = (0.9999999999995183, 676.5203681218835, -1259.139216722289, 771.3234287757674, -176.6150291498386, 12.50734324009056, -0.1385710331296526, 0.9934937113930748e-05, 0.1659470187408462e-06) diff --git a/Lib/test/test_repr.py b/Lib/test/test_repr.py index 1dfa282..823298b 100644 --- a/Lib/test/test_repr.py +++ b/Lib/test/test_repr.py @@ -136,7 +136,6 @@ class ReprTests(unittest.TestCase): '<built-in method split of str object at 0x')) def test_xrange(self): - import warnings eq = self.assertEquals eq(repr(xrange(1)), 'xrange(1)') eq(repr(xrange(1, 2)), 'xrange(1, 2)') diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index a4830d4..6641ff8 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -21,6 +21,11 @@ class BadCmp: def __eq__(self, other): raise RuntimeError +class ReprWrapper: + 'Used to test self-referential repr() calls' + def __repr__(self): + return repr(self.value) + class TestJointOps(unittest.TestCase): # Tests common to both set and frozenset @@ -244,6 +249,30 @@ class TestJointOps(unittest.TestCase): self.assertRaises(RuntimeError, s.discard, BadCmp()) self.assertRaises(RuntimeError, s.remove, BadCmp()) + def test_cyclical_repr(self): + w = ReprWrapper() + s = self.thetype([w]) + w.value = s + if self.thetype == set: + self.assertEqual(repr(s), '{set(...)}') + else: + name = repr(s).partition('(')[0] # strip class name + self.assertEqual(repr(s), '%s([%s(...)])' % (name, name)) + + def test_cyclical_print(self): + w = ReprWrapper() + s = self.thetype([w]) + w.value = s + try: + fo = open(test_support.TESTFN, "wb") + print >> fo, s, + fo.close() + fo = open(test_support.TESTFN, "rb") + self.assertEqual(fo.read(), repr(s)) + finally: + fo.close() + os.remove(test_support.TESTFN) + class TestSet(TestJointOps): thetype = set diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 302698b..d4744dd 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -50,22 +50,17 @@ def any_err(func, *args): def with_warning_restore(func): def _with_warning_restore(*args, **kw): - # The `warnings` module doesn't have an advertised way to restore - # its filter list. Cheat. - save_warnings_filters = warnings.filters[:] - # Grrr, we need this function to warn every time. Without removing - # the warningregistry, running test_tarfile then test_struct would fail - # on 64-bit platforms. - globals = func.func_globals - if '__warningregistry__' in globals: - del globals['__warningregistry__'] - warnings.filterwarnings("error", r"""^struct.*""", DeprecationWarning) - warnings.filterwarnings("error", r""".*format requires.*""", - DeprecationWarning) - try: + with test.test_support.guard_warnings_filter(): + # Grrr, we need this function to warn every time. Without removing + # the warningregistry, running test_tarfile then test_struct would fail + # on 64-bit platforms. + globals = func.func_globals + if '__warningregistry__' in globals: + del globals['__warningregistry__'] + warnings.filterwarnings("error", r"""^struct.*""", DeprecationWarning) + warnings.filterwarnings("error", r""".*format requires.*""", + DeprecationWarning) return func(*args, **kw) - finally: - warnings.filters[:] = save_warnings_filters[:] return _with_warning_restore def deprecated_err(func, *args): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 2829c55..2c19698 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -3,7 +3,9 @@ if __name__ != 'test.test_support': raise ImportError, 'test_support must be imported from the test package' +from contextlib import contextmanager import sys +import warnings class Error(Exception): """Base class for regression test exceptions.""" @@ -267,6 +269,48 @@ def open_urlresource(url): print >> get_original_stdout(), '\tfetching %s ...' % url fn, _ = urllib.urlretrieve(url, filename) return open(fn) + +@contextmanager +def guard_warnings_filter(): + """Guard the warnings filter from being permanently changed.""" + original_filters = warnings.filters[:] + try: + yield + finally: + warnings.filters = original_filters + +class EnvironmentVarGuard(object): + + """Class to help protect the environment variable properly. Can be used as + a context manager.""" + + def __init__(self): + from os import environ + self._environ = environ + self._unset = set() + self._reset = dict() + + def set(self, envvar, value): + if envvar not in self._environ: + self._unset.add(envvar) + else: + self._reset[envvar] = self._environ[envvar] + self._environ[envvar] = value + + def unset(self, envvar): + if envvar in self._environ: + self._reset[envvar] = self._environ[envvar] + del self._environ[envvar] + + def __enter__(self): + return self + + def __exit__(self, *ignore_exc): + for envvar, value in self._reset.iteritems(): + self._environ[envvar] = value + for unset in self._unset: + del self._environ[unset] + #======================================================================= # Decorator for running a function in a different locale, correctly resetting diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 0cebb29..2b39715 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -110,7 +110,7 @@ class ReadTest(BaseTest): """Test seek() method of _FileObject, incl. random reading. """ if self.sep != "|": - filename = "0-REGTYPE" + filename = "0-REGTYPE-TEXT" self.tar.extract(filename, dirname()) f = open(os.path.join(dirname(), filename), "rb") data = f.read() @@ -149,6 +149,16 @@ class ReadTest(BaseTest): s2 = fobj.readlines() self.assert_(s1 == s2, "readlines() after seek failed") + fobj.seek(0) + self.assert_(len(fobj.readline()) == fobj.tell(), + "tell() after readline() failed") + fobj.seek(512) + self.assert_(len(fobj.readline()) + 512 == fobj.tell(), + "tell() after seek() and readline() failed") + fobj.seek(0) + line = fobj.readline() + self.assert_(fobj.read() == data[len(line):], + "read() after readline() failed") fobj.close() def test_old_dirtype(self): @@ -280,6 +290,20 @@ class WriteTest(BaseTest): else: self.dst.addfile(tarinfo, f) + def test_add_self(self): + dstname = os.path.abspath(self.dstname) + + self.assertEqual(self.dst.name, dstname, "archive name must be absolute") + + self.dst.add(dstname) + self.assertEqual(self.dst.getnames(), [], "added the archive to itself") + + cwd = os.getcwd() + os.chdir(dirname()) + self.dst.add(dstname) + os.chdir(cwd) + self.assertEqual(self.dst.getnames(), [], "added the archive to itself") + class Write100Test(BaseTest): # The name field in a tar header stores strings of at most 100 chars. @@ -601,6 +625,38 @@ class FileModeTest(unittest.TestCase): self.assertEqual(tarfile.filemode(0755), '-rwxr-xr-x') self.assertEqual(tarfile.filemode(07111), '---s--s--t') +class HeaderErrorTest(unittest.TestCase): + + def test_truncated_header(self): + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "") + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "filename\0") + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 511) + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 513) + + def test_empty_header(self): + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, "\0" * 512) + + def test_invalid_header(self): + buf = tarfile.TarInfo("filename").tobuf() + buf = buf[:148] + "foo\0\0\0\0\0" + buf[156:] # invalid number field. + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, buf) + + def test_bad_checksum(self): + buf = tarfile.TarInfo("filename").tobuf() + b = buf[:148] + " " + buf[156:] # clear the checksum field. + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b) + b = "a" + buf[1:] # manipulate the buffer, so checksum won't match. + self.assertRaises(tarfile.HeaderError, tarfile.TarInfo.frombuf, b) + +class OpenFileobjTest(BaseTest): + # Test for SF bug #1496501. + + def test_opener(self): + fobj = StringIO.StringIO("foo\n") + try: + tarfile.open("", "r", fileobj=fobj) + except tarfile.ReadError: + self.assertEqual(fobj.tell(), 0, "fileobj's position has moved") if bz2: # Bzip2 TestCases @@ -646,6 +702,8 @@ def test_main(): tests = [ FileModeTest, + HeaderErrorTest, + OpenFileobjTest, ReadTest, ReadStreamTest, ReadDetectTest, diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index 7786316e..16a55e4 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -114,11 +114,11 @@ class UUFileTest(unittest.TestCase): def test_encode(self): try: - fin = open(self.tmpin, 'wb') + fin = open(self.tmpin, 'w') fin.write(plaintext) fin.close() - fin = open(self.tmpin, 'rb') + fin = open(self.tmpin, 'r') fout = open(self.tmpout, 'w') uu.encode(fin, fout, self.tmpin, mode=0644) fin.close() @@ -130,7 +130,7 @@ class UUFileTest(unittest.TestCase): self.assertEqual(s, encodedtextwrapped % (0644, self.tmpin)) # in_file and out_file as filenames - uu.encode(self.tmpin, self.tmpout, mode=0644) + uu.encode(self.tmpin, self.tmpout, self.tmpin, mode=0644) fout = open(self.tmpout, 'r') s = fout.read() fout.close() @@ -142,11 +142,11 @@ class UUFileTest(unittest.TestCase): def test_decode(self): try: - f = open(self.tmpin, 'wb') + f = open(self.tmpin, 'w') f.write(encodedtextwrapped % (0644, self.tmpout)) f.close() - f = open(self.tmpin, 'rb') + f = open(self.tmpin, 'r') uu.decode(f) f.close() @@ -163,11 +163,11 @@ class UUFileTest(unittest.TestCase): try: f = cStringIO.StringIO(encodedtextwrapped % (0644, self.tmpout)) - f = open(self.tmpin, 'rb') + f = open(self.tmpin, 'r') uu.decode(f) f.close() - f = open(self.tmpin, 'rb') + f = open(self.tmpin, 'r') self.assertRaises(uu.Error, uu.decode, f) f.close() finally: diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 1165980..06f4537 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -189,7 +189,7 @@ class ReferencesTestCase(TestBase): # None as the value for the callback, where either means "no # callback". The "no callback" ref and proxy objects are supposed # to be shared so long as they exist by all callers so long as - # they are active. In Python 2.3.3 and earlier, this guaranttee + # they are active. In Python 2.3.3 and earlier, this guarantee # was not honored, and was broken in different ways for # PyWeakref_NewRef() and PyWeakref_NewProxy(). (Two tests.) |