Пример #1
0
    def test_crasher_on_windows(self):
        # Should not crash (Issue 1733986)
        m = mmap.mmap(-1, 1000, tagname="foo")
        try:
            mmap.mmap(-1, 5000,
                      tagname="foo")[:]  # same tagname, but larger size
        except:
            pass
        m.close()

        # Should not crash (Issue 5385)
        with open(TESTFN, "wb") as fp:
            fp.write(b"x" * 10)
        f = open(TESTFN, "r+b")
        m = mmap.mmap(f.fileno(), 0)
        f.close()
        try:
            m.resize(0)  # will raise OSError
        except:
            pass
        try:
            m[:]
        except:
            pass
        m.close()
Пример #2
0
    def test_offset(self):
        f = open(TESTFN, 'w+b')

        try:  # unlink TESTFN no matter what
            halfsize = mmap.ALLOCATIONGRANULARITY
            m = self.make_mmap_file(f, halfsize)
            m.close()
            f.close()

            mapsize = halfsize * 2
            # Try invalid offset
            f = open(TESTFN, "r+b")
            for offset in [-2, -1, None]:
                try:
                    m = mmap.mmap(f.fileno(), mapsize, offset=offset)
                    self.assertEqual(0, 1)
                except (ValueError, TypeError, OverflowError):
                    pass
                else:
                    self.assertEqual(0, 0)
            f.close()

            # Try valid offset, hopefully 8192 works on all OSes
            f = open(TESTFN, "r+b")
            m = mmap.mmap(f.fileno(), mapsize - halfsize, offset=halfsize)
            self.assertEqual(m[0:3], b'foo')
            f.close()

            # Try resizing map
            try:
                m.resize(512)
            except SystemError:
                pass
            else:
                # resize() is supported
                self.assertEqual(len(m), 512)
                # Check that we can no longer seek beyond the new size.
                self.assertRaises(ValueError, m.seek, 513, 0)
                # Check that the content is not changed
                self.assertEqual(m[0:3], b'foo')

                # Check that the underlying file is truncated too
                f = open(TESTFN, 'rb')
                f.seek(0, 2)
                self.assertEqual(f.tell(), halfsize + 512)
                f.close()
                self.assertEqual(m.size(), halfsize + 512)

            m.close()

        finally:
            f.close()
            try:
                os.unlink(TESTFN)
            except OSError:
                pass
Пример #3
0
 def test_large_filesize(self):
     with self._make_test_file(0x17FFFFFFF, b" ") as f:
         if sys.maxsize < 0x180000000:
             # On 32 bit platforms the file is larger than sys.maxsize so
             # mapping the whole file should fail -- Issue #16743
             with self.assertRaises(OverflowError):
                 mmap.mmap(f.fileno(), 0x180000000, access=mmap.ACCESS_READ)
             with self.assertRaises(ValueError):
                 mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
         with mmap.mmap(f.fileno(), 0x10000, access=mmap.ACCESS_READ) as m:
             self.assertEqual(m.size(), 0x180000000)
Пример #4
0
    def test_move(self):
        # make move works everywhere (64-bit format problem earlier)
        with open(TESTFN, 'wb+') as f:

            f.write(b"ABCDEabcde")  # Arbitrary character
            f.flush()

            mf = mmap.mmap(f.fileno(), 10)
            mf.move(5, 0, 5)
            self.assertEqual(mf[:], b"ABCDEABCDE",
                             "Map move should have duplicated front 5")
            mf.close()

        # more excessive test
        data = b"0123456789"
        for dest in range(len(data)):
            for src in range(len(data)):
                for count in range(len(data) - max(dest, src)):
                    expected = data[:dest] + data[src:src +
                                                  count] + data[dest + count:]
                    m = mmap.mmap(-1, len(data))
                    m[:] = data
                    m.move(dest, src, count)
                    self.assertEqual(m[:], expected)
                    m.close()

        # segfault test (Issue 5387)
        m = mmap.mmap(-1, 100)
        offsets = [-100, -1, 0, 1, 100]
        for source, dest, size in itertools.product(offsets, offsets, offsets):
            try:
                m.move(source, dest, size)
            except ValueError:
                pass

        offsets = [(-1, -1, -1), (-1, -1, 0), (-1, 0, -1), (0, -1, -1),
                   (-1, 0, 0), (0, -1, 0), (0, 0, -1)]
        for source, dest, size in offsets:
            self.assertRaises(ValueError, m.move, source, dest, size)

        m.close()

        m = mmap.mmap(-1, 1)  # single byte
        self.assertRaises(ValueError, m.move, 0, 0, 2)
        self.assertRaises(ValueError, m.move, 1, 0, 1)
        self.assertRaises(ValueError, m.move, 0, 1, 1)
        m.move(0, 0, 1)
        m.move(0, 0, 0)
Пример #5
0
 def test_large_offset(self):
     with self._make_test_file(0x14FFFFFFF, b" ") as f:
         with mmap.mmap(f.fileno(),
                        0,
                        offset=0x140000000,
                        access=mmap.ACCESS_READ) as m:
             self.assertEqual(m[0xFFFFFFF], 32)
Пример #6
0
    def test_read_invalid_arg(self):
        m = mmap.mmap(-1, 16)
        self.addCleanup(m.close)

        self.assertRaises(TypeError, m.read, 'foo')
        self.assertRaises(TypeError, m.read, 5.5)
        self.assertRaises(TypeError, m.read, [1, 2, 3])
Пример #7
0
 def _test_around_boundary(self, boundary):
     tail = b'  DEARdear  '
     start = boundary - len(tail) // 2
     end = start + len(tail)
     with self._make_test_file(start, tail) as f:
         with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
             self.assertEqual(m[start:end], tail)
Пример #8
0
 def test_prot_readonly(self):
     mapsize = 10
     with open(TESTFN, "wb") as fp:
         fp.write(b"a" * mapsize)
     with open(TESTFN, "rb") as f:
         m = mmap.mmap(f.fileno(), mapsize, prot=mmap.PROT_READ)
         self.assertRaises(TypeError, m.write, "foo")
Пример #9
0
 def test_io_methods(self):
     data = b"0123456789"
     with open(TESTFN, "wb") as fp:
         fp.write(b"x" * len(data))
     with open(TESTFN, "r+b") as f:
         m = mmap.mmap(f.fileno(), len(data))
     # Test write_byte()
     for i in range(len(data)):
         self.assertEqual(m.tell(), i)
         m.write_byte(data[i])
         self.assertEqual(m.tell(), i + 1)
     self.assertRaises(ValueError, m.write_byte, b"x"[0])
     self.assertEqual(m[:], data)
     # Test read_byte()
     m.seek(0)
     for i in range(len(data)):
         self.assertEqual(m.tell(), i)
         self.assertEqual(m.read_byte(), data[i])
         self.assertEqual(m.tell(), i + 1)
     self.assertRaises(ValueError, m.read_byte)
     # Test read()
     m.seek(3)
     self.assertEqual(m.read(3), b"345")
     self.assertEqual(m.tell(), 6)
     # Test write()
     m.seek(3)
     m.write(b"bar")
     self.assertEqual(m.tell(), 6)
     self.assertEqual(m[:], b"012bar6789")
     m.write(bytearray(b"baz"))
     self.assertEqual(m.tell(), 9)
     self.assertEqual(m[:], b"012barbaz9")
     self.assertRaises(ValueError, m.write, b"ba")
Пример #10
0
 def test_repr(self):
     open_mmap_repr_pat = re.compile(r"<f?mmap.mmap closed=False, "
                                     r"access=(?P<access>\S+), "
                                     r"length=(?P<length>\d+), "
                                     r"pos=(?P<pos>\d+), "
                                     r"offset=(?P<offset>\d+)>")
     closed_mmap_repr_pat = re.compile(r"<f?mmap.mmap closed=True>")
     mapsizes = (50, 100, 1000, 1000000, 10000000)
     offsets = tuple((mapsize // 2 // mmap.ALLOCATIONGRANULARITY) *
                     mmap.ALLOCATIONGRANULARITY for mapsize in mapsizes)
     for offset, mapsize in zip(offsets, mapsizes):
         data = b'a' * mapsize
         length = mapsize - offset
         accesses = ('ACCESS_DEFAULT', 'ACCESS_READ', 'ACCESS_COPY',
                     'ACCESS_WRITE')
         positions = (0, length // 10, length // 5, length // 4)
         with open(TESTFN, "wb+") as fp:
             fp.write(data)
             fp.flush()
             for access, pos in itertools.product(accesses, positions):
                 accint = getattr(mmap, access)
                 with mmap.mmap(fp.fileno(),
                                length,
                                access=accint,
                                offset=offset) as mm:
                     mm.seek(pos)
                     match = open_mmap_repr_pat.match(repr(mm))
                     self.assertIsNotNone(match, repr(mm))
                     self.assertEqual(match.group('access'), access)
                     self.assertEqual(match.group('length'), str(length))
                     self.assertEqual(match.group('pos'), str(pos))
                     self.assertEqual(match.group('offset'), str(offset))
                 match = closed_mmap_repr_pat.match(repr(mm))
                 self.assertIsNotNone(match)
Пример #11
0
 def make_mmap_file(self, f, halfsize):
     # Write 2 pages worth of data to the file
     f.write(b'\0' * halfsize)
     f.write(b'foo')
     f.write(b'\0' * (halfsize - 3))
     f.flush()
     return mmap.mmap(f.fileno(), 0)
Пример #12
0
 def test_non_ascii_byte(self):
     for b in (129, 200, 255):  # > 128
         m = mmap.mmap(-1, 1)
         m.write_byte(b)
         self.assertEqual(m[0], b)
         m.seek(0)
         self.assertEqual(m.read_byte(), b)
         m.close()
Пример #13
0
 def test_context_manager_exception(self):
     # Test that the OSError gets passed through
     with self.assertRaises(Exception) as exc:
         with mmap.mmap(-1, 10) as m:
             raise OSError
     self.assertIsInstance(exc.exception, OSError,
                           "wrong exception raised in context manager")
     self.assertTrue(m.closed, "context manager failed")
Пример #14
0
 def test_weakref(self):
     # Check mmap objects are weakrefable
     mm = mmap.mmap(-1, 16)
     wr = weakref.ref(mm)
     self.assertIs(wr(), mm)
     del mm
     gc_collect()
     self.assertIs(wr(), None)
Пример #15
0
    def test_double_close(self):
        # make sure a double close doesn't crash on Solaris (Bug# 665913)
        with open(TESTFN, 'wb+') as f:
            f.write(2**16 * b'a')  # Arbitrary character

        with open(TESTFN, 'rb') as f:
            mf = mmap.mmap(f.fileno(), 2**16, access=mmap.ACCESS_READ)
            mf.close()
            mf.close()
Пример #16
0
    def test_entire_file(self):
        # test mapping of entire file by passing 0 for map length
        with open(TESTFN, "wb+") as f:
            f.write(2**16 * b'm')  # Arbitrary character

        with open(TESTFN, "rb+") as f, \
             mmap.mmap(f.fileno(), 0) as mf:
            self.assertEqual(len(mf), 2**16,
                             "Map size should equal file size.")
            self.assertEqual(mf.read(2**16), 2**16 * b"m")
Пример #17
0
 def test_invalid_descriptor(self):
     # socket file descriptors are valid, but out of range
     # for _get_osfhandle, causing a crash when validating the
     # parameters to _get_osfhandle.
     s = socket.socket()
     try:
         with self.assertRaises(OSError):
             m = mmap.mmap(s.fileno(), 10)
     finally:
         s.close()
Пример #18
0
    def test_anonymous(self):
        # anonymous mmap.mmap(-1, PAGE)
        m = mmap.mmap(-1, PAGESIZE)
        for x in range(PAGESIZE):
            self.assertEqual(m[x], 0,
                             "anonymously mmap'ed contents should be zero")

        for x in range(PAGESIZE):
            b = x & 0xff
            m[x] = b
            self.assertEqual(m[x], b)
Пример #19
0
 def test_flush_return_value(self):
     # mm.flush() should return None on success, raise an
     # exception on error under all platforms.
     mm = mmap.mmap(-1, 16)
     self.addCleanup(mm.close)
     mm.write(b'python')
     result = mm.flush()
     self.assertIsNone(result)
     if sys.platform.startswith('linux'):
         # 'offset' must be a multiple of mmap.PAGESIZE on Linux.
         # See bpo-34754 for details.
         self.assertRaises(OSError, mm.flush, 1, len(b'python'))
Пример #20
0
 def test_resize_past_pos(self):
     m = mmap.mmap(-1, 8192)
     self.addCleanup(m.close)
     m.read(5000)
     try:
         m.resize(4096)
     except SystemError:
         self.skipTest("resizing not supported")
     self.assertEqual(m.read(14), b'')
     self.assertRaises(ValueError, m.read_byte)
     self.assertRaises(ValueError, m.write_byte, 42)
     self.assertRaises(ValueError, m.write, b'abc')
Пример #21
0
 def test_extended_getslice(self):
     # Test extended slicing by comparing with list slicing.
     s = bytes(reversed(range(256)))
     m = mmap.mmap(-1, len(s))
     m[:] = s
     self.assertEqual(m[:], s)
     indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300)
     for start in indices:
         for stop in indices:
             # Skip step 0 (invalid)
             for step in indices[1:]:
                 self.assertEqual(m[start:stop:step], s[start:stop:step])
Пример #22
0
    def test_length_0_offset(self):
        # Issue #10916: test mapping of remainder of file by passing 0 for
        # map length with an offset doesn't cause a segfault.
        # NOTE: allocation granularity is currently 65536 under Win64,
        # and therefore the minimum offset alignment.
        with open(TESTFN, "wb") as f:
            f.write((65536 * 2) * b'm')  # Arbitrary character

        with open(TESTFN, "rb") as f:
            with mmap.mmap(f.fileno(),
                           0,
                           offset=65536,
                           access=mmap.ACCESS_READ) as mf:
                self.assertRaises(IndexError, mf.__getitem__, 80000)
Пример #23
0
    def test_tagname(self):
        data1 = b"0123456789"
        data2 = b"abcdefghij"
        assert len(data1) == len(data2)

        # Test same tag
        m1 = mmap.mmap(-1, len(data1), tagname="foo")
        m1[:] = data1
        m2 = mmap.mmap(-1, len(data2), tagname="foo")
        m2[:] = data2
        self.assertEqual(m1[:], data2)
        self.assertEqual(m2[:], data2)
        m2.close()
        m1.close()

        # Test different tag
        m1 = mmap.mmap(-1, len(data1), tagname="foo")
        m1[:] = data1
        m2 = mmap.mmap(-1, len(data2), tagname="boo")
        m2[:] = data2
        self.assertEqual(m1[:], data1)
        self.assertEqual(m2[:], data2)
        m2.close()
        m1.close()
Пример #24
0
    def test_rfind(self):
        # test the new 'end' parameter works as expected
        with open(TESTFN, 'wb+') as f:
            data = b'one two ones'
            n = len(data)
            f.write(data)
            f.flush()
            m = mmap.mmap(f.fileno(), n)

        self.assertEqual(m.rfind(b'one'), 8)
        self.assertEqual(m.rfind(b'one '), 0)
        self.assertEqual(m.rfind(b'one', 0, -1), 8)
        self.assertEqual(m.rfind(b'one', 0, -2), 0)
        self.assertEqual(m.rfind(b'one', 1, -1), 8)
        self.assertEqual(m.rfind(b'one', 1, -2), -1)
        self.assertEqual(m.rfind(bytearray(b'one')), 8)
Пример #25
0
    def test_madvise(self):
        size = 2 * PAGESIZE
        m = mmap.mmap(-1, size)

        with self.assertRaisesRegex(ValueError, "madvise start out of bounds"):
            m.madvise(mmap.MADV_NORMAL, size)
        with self.assertRaisesRegex(ValueError, "madvise start out of bounds"):
            m.madvise(mmap.MADV_NORMAL, -1)
        with self.assertRaisesRegex(ValueError, "madvise length invalid"):
            m.madvise(mmap.MADV_NORMAL, 0, -1)
        with self.assertRaisesRegex(OverflowError, "madvise length too large"):
            m.madvise(mmap.MADV_NORMAL, PAGESIZE, sys.maxsize)
        self.assertEqual(m.madvise(mmap.MADV_NORMAL), None)
        self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE), None)
        self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE, size), None)
        self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, 2), None)
        self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, size), None)
Пример #26
0
    def test_tougher_find(self):
        # Do a tougher .find() test.  SF bug 515943 pointed out that, in 2.2,
        # searching for data with embedded \0 bytes didn't work.
        with open(TESTFN, 'wb+') as f:

            data = b'aabaac\x00deef\x00\x00aa\x00'
            n = len(data)
            f.write(data)
            f.flush()
            m = mmap.mmap(f.fileno(), n)

        for start in range(n + 1):
            for finish in range(start, n + 1):
                slice = data[start:finish]
                self.assertEqual(m.find(slice), data.find(slice))
                self.assertEqual(m.find(slice + b'x'), -1)
        m.close()
Пример #27
0
 def test_extended_set_del_slice(self):
     # Test extended slicing by comparing with list slicing.
     s = bytes(reversed(range(256)))
     m = mmap.mmap(-1, len(s))
     indices = (0, None, 1, 3, 19, 300, sys.maxsize, -1, -2, -31, -300)
     for start in indices:
         for stop in indices:
             # Skip invalid step 0
             for step in indices[1:]:
                 m[:] = s
                 self.assertEqual(m[:], s)
                 L = list(s)
                 # Make sure we have a slice of exactly the right length,
                 # but with different data.
                 data = L[start:stop:step]
                 data = bytes(reversed(data))
                 L[start:stop:step] = data
                 m[start:stop:step] = data
                 self.assertEqual(m[:], bytes(L))
Пример #28
0
    def test_read_all(self):
        m = mmap.mmap(-1, 16)
        self.addCleanup(m.close)

        # With no parameters, or None or a negative argument, reads all
        m.write(bytes(range(16)))
        m.seek(0)
        self.assertEqual(m.read(), bytes(range(16)))
        m.seek(8)
        self.assertEqual(m.read(), bytes(range(8, 16)))
        m.seek(16)
        self.assertEqual(m.read(), b'')
        m.seek(3)
        self.assertEqual(m.read(None), bytes(range(3, 16)))
        m.seek(4)
        self.assertEqual(m.read(-1), bytes(range(4, 16)))
        m.seek(5)
        self.assertEqual(m.read(-2), bytes(range(5, 16)))
        m.seek(9)
        self.assertEqual(m.read(-42), bytes(range(9, 16)))
Пример #29
0
def test_off_by_one():
    with mmap.mmap(-1, 10) as m:
        m.write(b"jj________")
        m.seek(0)
        assert m.find(b"jj") == 0
        assert m.rfind(b"jj") == 0
Пример #30
0
def test_needle_too_big():
    with mmap.mmap(-1, 10) as m:
        m.write(b"jj________")
        m.seek(0)
        assert m.find(b"abc", 9) == -1
        assert m.rfind(b"abc", 9) == -1