Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_mmap.py

    r2 r391  
    1 from test.test_support import TESTFN, run_unittest
    2 import mmap
     1from test.test_support import (TESTFN, run_unittest, import_module, unlink,
     2                               requires, _2G, _4G)
    33import unittest
    4 import os, re, itertools
     4import os, re, itertools, socket, sys
     5
     6mmap = import_module('mmap')
    57
    68PAGESIZE = mmap.PAGESIZE
     
    239241            f.close()
    240242
     243            # Try writing with PROT_EXEC and without PROT_WRITE
     244            prot = mmap.PROT_READ | getattr(mmap, 'PROT_EXEC', 0)
     245            with open(TESTFN, "r+b") as f:
     246                m = mmap.mmap(f.fileno(), mapsize, prot=prot)
     247                self.assertRaises(TypeError, m.write, b"abcdef")
     248                self.assertRaises(TypeError, m.write_byte, 0)
     249                m.close()
     250
    241251    def test_bad_file_desc(self):
    242252        # Try opening a bad file descriptor...
     
    325335            mf.close()
    326336            f.close()
     337
     338    def test_length_0_offset(self):
     339        # Issue #10916: test mapping of remainder of file by passing 0 for
     340        # map length with an offset doesn't cause a segfault.
     341        if not hasattr(os, "stat"):
     342            self.skipTest("needs os.stat")
     343        # NOTE: allocation granularity is currently 65536 under Win64,
     344        # and therefore the minimum offset alignment.
     345        with open(TESTFN, "wb") as f:
     346            f.write((65536 * 2) * b'm') # Arbitrary character
     347
     348        with open(TESTFN, "rb") as f:
     349            mf = mmap.mmap(f.fileno(), 0, offset=65536, access=mmap.ACCESS_READ)
     350            try:
     351                self.assertRaises(IndexError, mf.__getitem__, 80000)
     352            finally:
     353                mf.close()
     354
     355    def test_length_0_large_offset(self):
     356        # Issue #10959: test mapping of a file by passing 0 for
     357        # map length with a large offset doesn't cause a segfault.
     358        if not hasattr(os, "stat"):
     359            self.skipTest("needs os.stat")
     360
     361        with open(TESTFN, "wb") as f:
     362            f.write(115699 * b'm') # Arbitrary character
     363
     364        with open(TESTFN, "w+b") as f:
     365            self.assertRaises(ValueError, mmap.mmap, f.fileno(), 0,
     366                              offset=2147418112)
    327367
    328368    def test_move(self):
     
    359399            except ValueError:
    360400                pass
    361         self.assertRaises(ValueError, m.move, -1, -1, -1)
    362         self.assertRaises(ValueError, m.move, -1, -1, 0)
    363         self.assertRaises(ValueError, m.move, -1, 0, -1)
    364         self.assertRaises(ValueError, m.move, 0, -1, -1)
    365         self.assertRaises(ValueError, m.move, -1, 0, 0)
    366         self.assertRaises(ValueError, m.move, 0, -1, 0)
    367         self.assertRaises(ValueError, m.move, 0, 0, -1)
     401
     402        offsets = [(-1, -1, -1), (-1, -1, 0), (-1, 0, -1), (0, -1, -1),
     403                   (-1, 0, 0), (0, -1, 0), (0, 0, -1)]
     404        for source, dest, size in offsets:
     405            self.assertRaises(ValueError, m.move, source, dest, size)
     406
    368407        m.close()
     408
     409        m = mmap.mmap(-1, 1) # single byte
     410        self.assertRaises(ValueError, m.move, 0, 0, 2)
     411        self.assertRaises(ValueError, m.move, 1, 0, 1)
     412        self.assertRaises(ValueError, m.move, 0, 1, 1)
     413        m.move(0, 0, 1)
     414        m.move(0, 0, 0)
     415
    369416
    370417    def test_anonymous(self):
     
    410457                    L[start:stop:step] = data
    411458                    m[start:stop:step] = data
    412                     self.assertEquals(m[:], "".join(L))
     459                    self.assertEqual(m[:], "".join(L))
    413460
    414461    def make_mmap_file (self, f, halfsize):
     
    419466        f.flush ()
    420467        return mmap.mmap (f.fileno(), 0)
     468
     469    def test_empty_file (self):
     470        f = open (TESTFN, 'w+b')
     471        f.close()
     472        with open(TESTFN, "rb") as f :
     473            self.assertRaisesRegexp(ValueError,
     474                                   "cannot mmap an empty file",
     475                                   mmap.mmap, f.fileno(), 0,
     476                                   access=mmap.ACCESS_READ)
    421477
    422478    def test_offset (self):
     
    494550
    495551    def test_error(self):
    496         self.assert_(issubclass(mmap.error, EnvironmentError))
    497         self.assert_("mmap.error" in str(mmap.error))
     552        self.assertTrue(issubclass(mmap.error, EnvironmentError))
     553        self.assertIn("mmap.error", str(mmap.error))
    498554
    499555    def test_io_methods(self):
     
    505561        # Test write_byte()
    506562        for i in xrange(len(data)):
    507             self.assertEquals(m.tell(), i)
    508             m.write_byte(data[i:i+1])
    509             self.assertEquals(m.tell(), i+1)
     563            self.assertEqual(m.tell(), i)
     564            m.write_byte(data[i])
     565            self.assertEqual(m.tell(), i+1)
    510566        self.assertRaises(ValueError, m.write_byte, "x")
    511         self.assertEquals(m[:], data)
     567        self.assertEqual(m[:], data)
    512568        # Test read_byte()
    513569        m.seek(0)
    514570        for i in xrange(len(data)):
    515             self.assertEquals(m.tell(), i)
    516             self.assertEquals(m.read_byte(), data[i:i+1])
    517             self.assertEquals(m.tell(), i+1)
     571            self.assertEqual(m.tell(), i)
     572            self.assertEqual(m.read_byte(), data[i])
     573            self.assertEqual(m.tell(), i+1)
    518574        self.assertRaises(ValueError, m.read_byte)
    519575        # Test read()
    520576        m.seek(3)
    521         self.assertEquals(m.read(3), "345")
    522         self.assertEquals(m.tell(), 6)
     577        self.assertEqual(m.read(3), "345")
     578        self.assertEqual(m.tell(), 6)
    523579        # Test write()
    524580        m.seek(3)
    525581        m.write("bar")
    526         self.assertEquals(m.tell(), 6)
    527         self.assertEquals(m[:], "012bar6789")
     582        self.assertEqual(m.tell(), 6)
     583        self.assertEqual(m[:], "012bar6789")
    528584        m.seek(8)
    529585        self.assertRaises(ValueError, m.write, "bar")
     
    540596            m2 = mmap.mmap(-1, len(data2), tagname="foo")
    541597            m2[:] = data2
    542             self.assertEquals(m1[:], data2)
    543             self.assertEquals(m2[:], data2)
     598            self.assertEqual(m1[:], data2)
     599            self.assertEqual(m2[:], data2)
    544600            m2.close()
    545601            m1.close()
    546602
    547             # Test differnt tag
     603            # Test different tag
    548604            m1 = mmap.mmap(-1, len(data1), tagname="foo")
    549605            m1[:] = data1
    550606            m2 = mmap.mmap(-1, len(data2), tagname="boo")
    551607            m2[:] = data2
    552             self.assertEquals(m1[:], data1)
    553             self.assertEquals(m2[:], data2)
     608            self.assertEqual(m1[:], data1)
     609            self.assertEqual(m2[:], data2)
    554610            m2.close()
    555611            m1.close()
     
    579635            m.close()
    580636
     637        def test_invalid_descriptor(self):
     638            # socket file descriptors are valid, but out of range
     639            # for _get_osfhandle, causing a crash when validating the
     640            # parameters to _get_osfhandle.
     641            s = socket.socket()
     642            try:
     643                with self.assertRaises(mmap.error):
     644                    m = mmap.mmap(s.fileno(), 10)
     645            finally:
     646                s.close()
     647
     648
     649class LargeMmapTests(unittest.TestCase):
     650
     651    def setUp(self):
     652        unlink(TESTFN)
     653
     654    def tearDown(self):
     655        unlink(TESTFN)
     656
     657    def _make_test_file(self, num_zeroes, tail):
     658        if sys.platform[:3] == 'win' or sys.platform == 'darwin':
     659            requires('largefile',
     660                'test requires %s bytes and a long time to run' % str(0x180000000))
     661        f = open(TESTFN, 'w+b')
     662        try:
     663            f.seek(num_zeroes)
     664            f.write(tail)
     665            f.flush()
     666        except (IOError, OverflowError):
     667            f.close()
     668            raise unittest.SkipTest("filesystem does not have largefile support")
     669        return f
     670
     671    def test_large_offset(self):
     672        with self._make_test_file(0x14FFFFFFF, b" ") as f:
     673            m = mmap.mmap(f.fileno(), 0, offset=0x140000000, access=mmap.ACCESS_READ)
     674            try:
     675                self.assertEqual(m[0xFFFFFFF], b" ")
     676            finally:
     677                m.close()
     678
     679    def test_large_filesize(self):
     680        with self._make_test_file(0x17FFFFFFF, b" ") as f:
     681            if sys.maxsize < 0x180000000:
     682                # On 32 bit platforms the file is larger than sys.maxsize so
     683                # mapping the whole file should fail -- Issue #16743
     684                with self.assertRaises(OverflowError):
     685                    mmap.mmap(f.fileno(), 0x180000000, access=mmap.ACCESS_READ)
     686                with self.assertRaises(ValueError):
     687                    mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
     688            m = mmap.mmap(f.fileno(), 0x10000, access=mmap.ACCESS_READ)
     689            try:
     690                self.assertEqual(m.size(), 0x180000000)
     691            finally:
     692                m.close()
     693
     694    # Issue 11277: mmap() with large (~4GB) sparse files crashes on OS X.
     695
     696    def _test_around_boundary(self, boundary):
     697        tail = b'  DEARdear  '
     698        start = boundary - len(tail) // 2
     699        end = start + len(tail)
     700        with self._make_test_file(start, tail) as f:
     701            m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
     702            try:
     703                self.assertEqual(m[start:end], tail)
     704            finally:
     705                m.close()
     706
     707    @unittest.skipUnless(sys.maxsize > _4G, "test cannot run on 32-bit systems")
     708    def test_around_2GB(self):
     709        self._test_around_boundary(_2G)
     710
     711    @unittest.skipUnless(sys.maxsize > _4G, "test cannot run on 32-bit systems")
     712    def test_around_4GB(self):
     713        self._test_around_boundary(_4G)
     714
    581715
    582716def test_main():
    583     run_unittest(MmapTests)
     717    run_unittest(MmapTests, LargeMmapTests)
    584718
    585719if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.