f.write(b'\0'* (PAGESIZE-3) )
f.flush()
m = mmap.mmap(f.fileno(), 2 * PAGESIZE)
+ self.addCleanup(m.close)
finally:
f.close()
# Try to seek to negative position...
self.assertRaises(ValueError, m.seek, -len(m)-1, 2)
+ @unittest.skipUnless(hasattr(mmap.mmap, 'resize'), 'requires mmap.resize')
+ def test_resize(self):
+ # Create a file to be mmap'ed.
+ with open(TESTFN, 'bw+') as f:
+ # Write 2 pages worth of data to the file
+ f.write(b'\0'* 2 * PAGESIZE)
+ f.flush()
+ m = mmap.mmap(f.fileno(), 2 * PAGESIZE)
+ self.addCleanup(m.close)
+
# Try resizing map
- try:
- m.resize(512)
- except SystemError:
- # resize() not supported
- # No messages are printed, since the output of this test suite
- # would then be different across platforms.
- 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 underlying file is truncated too
- # (bug #728515)
- f = open(TESTFN, 'rb')
- try:
- f.seek(0, 2)
- self.assertEqual(f.tell(), 512)
- finally:
- f.close()
- self.assertEqual(m.size(), 512)
+ m.resize(512)
+ self.assertEqual(len(m), 512)
+ # Check that we can no longer seek beyond the new size.
+ self.assertRaises(ValueError, m.seek, 513, 0)
- m.close()
+ # Check that the underlying file is truncated too
+ # (bug #728515)
+ with open(TESTFN, 'rb') as f:
+ f.seek(0, 2)
+ self.assertEqual(f.tell(), 512)
+ self.assertEqual(m.size(), 512)
def test_access_parameter(self):
# Test for "access" keyword parameter
else:
self.fail("Able to write to readonly memory map")
- # Ensuring that readonly mmap can't be resized
- try:
- m.resize(2*mapsize)
- except SystemError: # resize is not universally supported
- pass
- except TypeError:
- pass
- else:
- self.fail("Able to resize readonly memory map")
+ if hasattr(m, 'resize'):
+ # Ensuring that readonly mmap can't be resized
+ with self.assertRaises(TypeError):
+ m.resize(2 * mapsize)
with open(TESTFN, "rb") as fp:
self.assertEqual(fp.read(), b'a'*mapsize,
"Readonly memory map data file was modified")
with open(TESTFN, "rb") as fp:
self.assertEqual(fp.read(), b'c'*mapsize,
"Copy-on-write test data file should not be modified.")
- # Ensuring copy-on-write maps cannot be resized
- self.assertRaises(TypeError, m.resize, 2*mapsize)
+ if hasattr(m, 'resize'):
+ # Ensuring copy-on-write maps cannot be resized
+ self.assertRaises(TypeError, m.resize, 2 * mapsize)
m.close()
# Ensuring invalid access parameter raises exception
self.assertEqual(len(m), size)
with self.assertRaises(ValueError):
m.size()
- with self.assertRaises(ValueError):
- m.resize(size * 2)
- with self.assertRaises(ValueError):
- m.resize(size // 2)
+ if hasattr(m, 'resize'):
+ with self.assertRaises(ValueError):
+ m.resize(size * 2)
+ with self.assertRaises(ValueError):
+ m.resize(size // 2)
self.assertIs(m.closed, False)
# Smoke-test other API
with mmap.mmap(-1, size, trackfd=False) as m:
with self.assertRaises(ValueError):
m.size()
- with self.assertRaises(ValueError):
- m.resize(size // 2)
+ if hasattr(m, 'resize'):
+ with self.assertRaises(ValueError):
+ m.resize(size // 2)
self.assertEqual(len(m), size)
m[0] = ord('a')
assert m[0] == ord('a')
self.assertEqual(m[0:3], b'foo')
f.close()
- # Try resizing map
- try:
+ if hasattr(m, 'resize'):
+ # Try resizing map
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)
self.assertEqual(mm.write(b"yz"), 2)
self.assertEqual(mm.write(b"python"), 6)
+ @unittest.skipUnless(hasattr(mmap.mmap, 'resize'), 'requires mmap.resize')
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")
+ m.resize(4096)
self.assertEqual(m.read(14), b'')
self.assertRaises(ValueError, m.read_byte)
self.assertRaises(ValueError, m.write_byte, 42)
self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, 2), None)
self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, size), None)
+ @unittest.skipUnless(hasattr(mmap.mmap, 'resize'), 'requires mmap.resize')
def test_resize_up_anonymous_mapping(self):
"""If the mmap is backed by the pagefile ensure a resize up can happen
and that the original data is still in place
with self.assertRaises(ValueError):
m.resize(new_size)
else:
- try:
- m.resize(new_size)
- except SystemError:
- pass
- else:
- self.assertEqual(len(m), new_size)
- self.assertEqual(m[:start_size], data)
- self.assertEqual(m[start_size:], b'\0' * (new_size - start_size))
+ m.resize(new_size)
+ self.assertEqual(len(m), new_size)
+ self.assertEqual(m[:start_size], data)
+ self.assertEqual(m[start_size:], b'\0' * (new_size - start_size))
@unittest.skipUnless(os.name == 'posix', 'requires Posix')
+ @unittest.skipUnless(hasattr(mmap.mmap, 'resize'), 'requires mmap.resize')
def test_resize_up_private_anonymous_mapping(self):
start_size = PAGESIZE
new_size = 2 * start_size
with mmap.mmap(-1, start_size, flags=mmap.MAP_PRIVATE) as m:
m[:] = data
- try:
- m.resize(new_size)
- except SystemError:
- pass
- else:
- self.assertEqual(len(m), new_size)
- self.assertEqual(m[:start_size], data)
- self.assertEqual(m[start_size:], b'\0' * (new_size - start_size))
+ m.resize(new_size)
+ self.assertEqual(len(m), new_size)
+ self.assertEqual(m[:start_size], data)
+ self.assertEqual(m[start_size:], b'\0' * (new_size - start_size))
+ @unittest.skipUnless(hasattr(mmap.mmap, 'resize'), 'requires mmap.resize')
def test_resize_down_anonymous_mapping(self):
"""If the mmap is backed by the pagefile ensure a resize down up can happen
and that a truncated form of the original data is still in place
with mmap.mmap(-1, start_size) as m:
m[:] = data
- try:
- m.resize(new_size)
- except SystemError:
- pass
- else:
- self.assertEqual(len(m), new_size)
- self.assertEqual(m[:], data[:new_size])
- if sys.platform.startswith(('linux', 'android')):
- # Can't expand to its original size.
- with self.assertRaises(ValueError):
- m.resize(start_size)
+ m.resize(new_size)
+ self.assertEqual(len(m), new_size)
+ self.assertEqual(m[:], data[:new_size])
+ if sys.platform.startswith(('linux', 'android')):
+ # Can't expand to its original size.
+ with self.assertRaises(ValueError):
+ m.resize(start_size)
@unittest.skipUnless(os.name == 'nt', 'requires Windows')
def test_resize_fails_if_mapping_held_elsewhere(self):