diff options
| author | Neal Norwitz <nnorwitz@gmail.com> | 2008-08-24 07:08:55 (GMT) | 
|---|---|---|
| committer | Neal Norwitz <nnorwitz@gmail.com> | 2008-08-24 07:08:55 (GMT) | 
| commit | 3ce5d9207e66d61d4b0502cf47ed2d2bcdd2212f (patch) | |
| tree | c29add3a6b61f321009d73a91464f45b5d10862a /Lib/test | |
| parent | 06db799a53cba0396908d291bbe4bcc6c1c50daa (diff) | |
| download | cpython-3ce5d9207e66d61d4b0502cf47ed2d2bcdd2212f.zip cpython-3ce5d9207e66d61d4b0502cf47ed2d2bcdd2212f.tar.gz cpython-3ce5d9207e66d61d4b0502cf47ed2d2bcdd2212f.tar.bz2  | |
Closes release blocker #3627.
Merged revisions 65335 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
TESTED=./python -E -tt ./Lib/test/regrtest.py -uall (both debug and opt)
........
  r65335 | neal.norwitz | 2008-07-31 10:17:14 -0700 (Thu, 31 Jul 2008) | 1 line
  Security patches from Apple:  prevent int overflow when allocating memory
........
Diffstat (limited to 'Lib/test')
| -rw-r--r-- | Lib/test/seq_tests.py | 12 | ||||
| -rw-r--r-- | Lib/test/support.py | 25 | ||||
| -rw-r--r-- | Lib/test/test_bigmem.py | 97 | 
3 files changed, 126 insertions, 8 deletions
diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index 962cfe1..5148d4b 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -304,11 +304,13 @@ class CommonTest(unittest.TestCase):              self.assertEqual(id(s), id(s*1))      def test_bigrepeat(self): -        x = self.type2test([0]) -        x *= 2**16 -        self.assertRaises(MemoryError, x.__mul__, 2**16) -        if hasattr(x, '__imul__'): -            self.assertRaises(MemoryError, x.__imul__, 2**16) +        import sys +        if sys.maxsize <= 2147483647: +            x = self.type2test([0]) +            x *= 2**16 +            self.assertRaises(MemoryError, x.__mul__, 2**16) +            if hasattr(x, '__imul__'): +                self.assertRaises(MemoryError, x.__imul__, 2**16)      def test_subscript(self):          a = self.type2test([10, 11]) diff --git a/Lib/test/support.py b/Lib/test/support.py index d026984..24aff5e 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -68,6 +68,7 @@ verbose = 1              # Flag set to 0 by regrtest.py  use_resources = None     # Flag set to [] by regrtest.py  max_memuse = 0           # Disable bigmem tests (they will still be run with                           # small sizes, to make sure they work.) +real_max_memuse = 0  # _original_stdout is meant to hold stdout at the time regrtest began.  # This may be "the real" stdout, or IDLE's emulation of stdout, or whatever. @@ -599,12 +600,14 @@ def run_with_locale(catstr, *locales):  _1M = 1024*1024  _1G = 1024 * _1M  _2G = 2 * _1G +_4G = 4 * _1G  MAX_Py_ssize_t = sys.maxsize  def set_memlimit(limit):      import re      global max_memuse +    global real_max_memuse      sizes = {          'k': 1024,          'm': _1M, @@ -616,6 +619,7 @@ def set_memlimit(limit):      if m is None:          raise ValueError('Invalid memory limit %r' % (limit,))      memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()]) +    real_max_memuse = memlimit      if memlimit > MAX_Py_ssize_t:          memlimit = MAX_Py_ssize_t      if memlimit < _2G - 1: @@ -661,6 +665,27 @@ def bigmemtest(minsize, memuse, overhead=5*_1M):          return wrapper      return decorator +def precisionbigmemtest(size, memuse, overhead=5*_1M): +    def decorator(f): +        def wrapper(self): +            if not real_max_memuse: +                maxsize = 5147 +            else: +                maxsize = size + +                if real_max_memuse and real_max_memuse < maxsize * memuse: +                    if verbose: +                        sys.stderr.write("Skipping %s because of memory " +                                         "constraint\n" % (f.__name__,)) +                    return + +            return f(self, maxsize) +        wrapper.size = size +        wrapper.memuse = memuse +        wrapper.overhead = overhead +        return wrapper +    return decorator +  def bigaddrspacetest(f):      """Decorator for tests that fill the address space."""      def wrapper(self): diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py index 30e1bdb..5edc139 100644 --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -1,5 +1,5 @@  from test import support -from test.support import bigmemtest, _1G, _2G +from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest  import unittest  import operator @@ -53,6 +53,22 @@ class StrTest(unittest.TestCase):          self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)          self.assertEquals(s.strip(), SUBSTR.strip()) +    @precisionbigmemtest(size=_2G - 1, memuse=1) +    def test_center_unicode(self, size): +        SUBSTR = ' abc def ghi' +        try: +            s = SUBSTR.center(size) +        except OverflowError: +            pass # acceptable on 32-bit +        else: +            self.assertEquals(len(s), size) +            lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2 +            if len(s) % 2: +                lpadsize += 1 +            self.assertEquals(s[lpadsize:-rpadsize], SUBSTR) +            self.assertEquals(s.strip(), SUBSTR.strip()) +            del s +      @bigmemtest(minsize=_2G, memuse=2)      def test_count(self, size):          SUBSTR = ' abc def ghi' @@ -69,10 +85,51 @@ class StrTest(unittest.TestCase):          s = b'.' * size          self.assertEquals(len(s.decode('utf-8')), size) +    def basic_encode_test(self, size, enc, c='.', expectedsize=None): +        if expectedsize is None: +            expectedsize = size + +        s = c * size +        self.assertEquals(len(s.encode(enc)), expectedsize) +      @bigmemtest(minsize=_2G + 2, memuse=3)      def test_encode(self, size): -        s = '.' * size -        self.assertEquals(len(s.encode('utf-8')), size) +        return self.basic_encode_test(size, 'utf-8') + +    @precisionbigmemtest(size=_4G / 6 + 2, memuse=2) +    def test_encode_raw_unicode_escape(self, size): +        try: +            return self.basic_encode_test(size, 'raw_unicode_escape') +        except MemoryError: +            pass # acceptable on 32-bit + +    @precisionbigmemtest(size=_4G / 5 + 70, memuse=3) +    def test_encode_utf7(self, size): +        try: +            return self.basic_encode_test(size, 'utf7') +        except MemoryError: +            pass # acceptable on 32-bit + +    @precisionbigmemtest(size=_4G / 4 + 5, memuse=6) +    def test_encode_utf32(self, size): +        try: +            return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4) +        except MemoryError: +            pass # acceptable on 32-bit + +    @precisionbigmemtest(size=_2G-1, memuse=2) +    def test_decodeascii(self, size): +        return self.basic_encode_test(size, 'ascii', c='A') + +    @precisionbigmemtest(size=_4G / 5, memuse=6+2) +    def test_unicode_repr_oflw(self, size): +        try: +            s = "\uAAAA"*size +            r = repr(s) +        except MemoryError: +            pass # acceptable on 32-bit +        else: +            self.failUnless(s == eval(r))      @bigmemtest(minsize=_2G, memuse=2)      def test_endswith(self, size): @@ -458,6 +515,11 @@ class StrTest(unittest.TestCase):          self.assertEquals(s.count('\\'), size)          self.assertEquals(s.count('0'), size * 2) +    @bigmemtest(minsize=2**32 / 5, memuse=6+2) +    def test_unicode_repr(self, size): +        s = "\uAAAA" * size +        self.failUnless(len(repr(s)) > size) +      # This test is meaningful even with size < 2G, as long as the      # doubled string is > 2G (but it tests more if both are > 2G :)      @bigmemtest(minsize=_1G + 2, memuse=3) @@ -641,6 +703,35 @@ class TupleTest(unittest.TestCase):      def test_repeat_large(self, size):          return self.basic_test_repeat(size) +    @bigmemtest(minsize=_1G - 1, memuse=12) +    def test_repeat_large_2(self, size): +        return self.basic_test_repeat(size) + +    @precisionbigmemtest(size=_1G - 1, memuse=9) +    def test_from_2G_generator(self, size): +        try: +            t = tuple(range(size)) +        except MemoryError: +            pass # acceptable on 32-bit +        else: +            count = 0 +            for item in t: +                self.assertEquals(item, count) +                count += 1 +            self.assertEquals(count, size) + +    @precisionbigmemtest(size=_1G - 25, memuse=9) +    def test_from_almost_2G_generator(self, size): +        try: +            t = tuple(range(size)) +            count = 0 +            for item in t: +                self.assertEquals(item, count) +                count += 1 +            self.assertEquals(count, size) +        except MemoryError: +            pass # acceptable, expected on 32-bit +      # Like test_concat, split in two.      def basic_test_repr(self, size):          t = (0,) * size  | 
