Changeset 391 for python/trunk/Lib/test/test_mmap.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_mmap.py
r2 r391 1 from test.test_support import TESTFN, run_unittest2 import mmap 1 from test.test_support import (TESTFN, run_unittest, import_module, unlink, 2 requires, _2G, _4G) 3 3 import unittest 4 import os, re, itertools 4 import os, re, itertools, socket, sys 5 6 mmap = import_module('mmap') 5 7 6 8 PAGESIZE = mmap.PAGESIZE … … 239 241 f.close() 240 242 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 241 251 def test_bad_file_desc(self): 242 252 # Try opening a bad file descriptor... … … 325 335 mf.close() 326 336 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) 327 367 328 368 def test_move(self): … … 359 399 except ValueError: 360 400 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 368 407 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 369 416 370 417 def test_anonymous(self): … … 410 457 L[start:stop:step] = data 411 458 m[start:stop:step] = data 412 self.assertEqual s(m[:], "".join(L))459 self.assertEqual(m[:], "".join(L)) 413 460 414 461 def make_mmap_file (self, f, halfsize): … … 419 466 f.flush () 420 467 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) 421 477 422 478 def test_offset (self): … … 494 550 495 551 def test_error(self): 496 self.assert _(issubclass(mmap.error, EnvironmentError))497 self.assert _("mmap.error" instr(mmap.error))552 self.assertTrue(issubclass(mmap.error, EnvironmentError)) 553 self.assertIn("mmap.error", str(mmap.error)) 498 554 499 555 def test_io_methods(self): … … 505 561 # Test write_byte() 506 562 for i in xrange(len(data)): 507 self.assertEqual s(m.tell(), i)508 m.write_byte(data[i :i+1])509 self.assertEqual s(m.tell(), i+1)563 self.assertEqual(m.tell(), i) 564 m.write_byte(data[i]) 565 self.assertEqual(m.tell(), i+1) 510 566 self.assertRaises(ValueError, m.write_byte, "x") 511 self.assertEqual s(m[:], data)567 self.assertEqual(m[:], data) 512 568 # Test read_byte() 513 569 m.seek(0) 514 570 for i in xrange(len(data)): 515 self.assertEqual s(m.tell(), i)516 self.assertEqual s(m.read_byte(), data[i:i+1])517 self.assertEqual s(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) 518 574 self.assertRaises(ValueError, m.read_byte) 519 575 # Test read() 520 576 m.seek(3) 521 self.assertEqual s(m.read(3), "345")522 self.assertEqual s(m.tell(), 6)577 self.assertEqual(m.read(3), "345") 578 self.assertEqual(m.tell(), 6) 523 579 # Test write() 524 580 m.seek(3) 525 581 m.write("bar") 526 self.assertEqual s(m.tell(), 6)527 self.assertEqual s(m[:], "012bar6789")582 self.assertEqual(m.tell(), 6) 583 self.assertEqual(m[:], "012bar6789") 528 584 m.seek(8) 529 585 self.assertRaises(ValueError, m.write, "bar") … … 540 596 m2 = mmap.mmap(-1, len(data2), tagname="foo") 541 597 m2[:] = data2 542 self.assertEqual s(m1[:], data2)543 self.assertEqual s(m2[:], data2)598 self.assertEqual(m1[:], data2) 599 self.assertEqual(m2[:], data2) 544 600 m2.close() 545 601 m1.close() 546 602 547 # Test differ nt tag603 # Test different tag 548 604 m1 = mmap.mmap(-1, len(data1), tagname="foo") 549 605 m1[:] = data1 550 606 m2 = mmap.mmap(-1, len(data2), tagname="boo") 551 607 m2[:] = data2 552 self.assertEqual s(m1[:], data1)553 self.assertEqual s(m2[:], data2)608 self.assertEqual(m1[:], data1) 609 self.assertEqual(m2[:], data2) 554 610 m2.close() 555 611 m1.close() … … 579 635 m.close() 580 636 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 649 class 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 581 715 582 716 def test_main(): 583 run_unittest(MmapTests )717 run_unittest(MmapTests, LargeMmapTests) 584 718 585 719 if __name__ == '__main__':
Note:
See TracChangeset
for help on using the changeset viewer.