blob: 8066285167926740fcc7003b0d62174c1892658b [file] [log] [blame]
Marc-André Lemburg36619082001-01-17 19:11:13 +00001from test_support import verify
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +00002import mmap
Eric S. Raymondfc170b12001-02-09 11:51:27 +00003import os, re, sys
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +00004
5PAGESIZE = mmap.PAGESIZE
6
Guido van Rossum767e7752000-03-31 01:09:14 +00007def test_both():
8 "Test mmap module on Unix systems and Windows"
Fred Drake004d5e62000-10-23 17:22:08 +00009
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000010 # Create an mmap'ed file
11 f = open('foo', 'w+')
Fred Drake004d5e62000-10-23 17:22:08 +000012
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000013 # Write 2 pages worth of data to the file
14 f.write('\0'* PAGESIZE)
15 f.write('foo')
16 f.write('\0'* (PAGESIZE-3) )
Guido van Rossum767e7752000-03-31 01:09:14 +000017
Guido van Rossum706dbd02000-03-31 01:20:33 +000018 m = mmap.mmap(f.fileno(), 2 * PAGESIZE)
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000019 f.close()
Fred Drake004d5e62000-10-23 17:22:08 +000020
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000021 # Simple sanity checks
Tim Peters2caf8df2001-01-14 05:05:51 +000022
23 print type(m) # SF bug 128713: segfaulted on Linux
Eric S. Raymondfc170b12001-02-09 11:51:27 +000024 print ' Position of foo:', m.find('foo') / float(PAGESIZE), 'pages'
25 verify(m.find('foo') == PAGESIZE)
Fred Drake004d5e62000-10-23 17:22:08 +000026
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000027 print ' Length of file:', len(m) / float(PAGESIZE), 'pages'
Marc-André Lemburg36619082001-01-17 19:11:13 +000028 verify(len(m) == 2*PAGESIZE)
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000029
30 print ' Contents of byte 0:', repr(m[0])
Marc-André Lemburg36619082001-01-17 19:11:13 +000031 verify(m[0] == '\0')
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000032 print ' Contents of first 3 bytes:', repr(m[0:3])
Marc-André Lemburg36619082001-01-17 19:11:13 +000033 verify(m[0:3] == '\0\0\0')
Fred Drake004d5e62000-10-23 17:22:08 +000034
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000035 # Modify the file's content
36 print "\n Modifying file's content..."
37 m[0] = '3'
38 m[PAGESIZE +3: PAGESIZE +3+3]='bar'
Fred Drake004d5e62000-10-23 17:22:08 +000039
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000040 # Check that the modification worked
41 print ' Contents of byte 0:', repr(m[0])
Marc-André Lemburg36619082001-01-17 19:11:13 +000042 verify(m[0] == '3')
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000043 print ' Contents of first 3 bytes:', repr(m[0:3])
Marc-André Lemburg36619082001-01-17 19:11:13 +000044 verify(m[0:3] == '3\0\0')
Tim Peters50699212000-09-04 07:34:06 +000045 print ' Contents of second page:', repr(m[PAGESIZE-1 : PAGESIZE + 7])
Marc-André Lemburg36619082001-01-17 19:11:13 +000046 verify(m[PAGESIZE-1 : PAGESIZE + 7] == '\0foobar\0')
Fred Drake004d5e62000-10-23 17:22:08 +000047
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000048 m.flush()
49
50 # Test doing a regular expression match in an mmap'ed file
51 match=re.search('[A-Za-z]+', m)
Fred Drake132dce22000-12-12 23:11:42 +000052 if match is None:
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000053 print ' ERROR: regex match on mmap failed!'
54 else:
55 start, end = match.span(0)
Fred Drake004d5e62000-10-23 17:22:08 +000056 length = end - start
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +000057
58 print ' Regex match on mmap (page start, length of match):',
59 print start / float(PAGESIZE), length
Fred Drake004d5e62000-10-23 17:22:08 +000060
Marc-André Lemburg36619082001-01-17 19:11:13 +000061 verify(start == PAGESIZE)
62 verify(end == PAGESIZE + 6)
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000063
64 # test seeking around (try to overflow the seek implementation)
65 m.seek(0,0)
66 print ' Seek to zeroth byte'
Marc-André Lemburg36619082001-01-17 19:11:13 +000067 verify(m.tell() == 0)
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000068 m.seek(42,1)
69 print ' Seek to 42nd byte'
Marc-André Lemburg36619082001-01-17 19:11:13 +000070 verify(m.tell() == 42)
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000071 m.seek(0,2)
72 print ' Seek to last byte'
Marc-André Lemburg36619082001-01-17 19:11:13 +000073 verify(m.tell() == len(m))
Peter Schneider-Kamp7a116712000-07-11 11:24:41 +000074
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000075 print ' Try to seek to negative position...'
76 try:
77 m.seek(-1)
78 except ValueError:
79 pass
80 else:
Marc-André Lemburg36619082001-01-17 19:11:13 +000081 verify(0, 'expected a ValueError but did not get it')
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000082
83 print ' Try to seek beyond end of mmap...'
84 try:
85 m.seek(1,2)
86 except ValueError:
87 pass
88 else:
Marc-André Lemburg36619082001-01-17 19:11:13 +000089 verify(0, 'expected a ValueError but did not get it')
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000090
91 print ' Try to seek to negative position...'
92 try:
93 m.seek(-len(m)-1,2)
94 except ValueError:
95 pass
96 else:
Marc-André Lemburg36619082001-01-17 19:11:13 +000097 verify(0, 'expected a ValueError but did not get it')
Andrew M. Kuchlingcf70ea62000-06-18 04:47:08 +000098
Andrew M. Kuchlingd3cf6922000-07-11 10:45:28 +000099 # Try resizing map
100 print ' Attempting resize()'
101 try:
Peter Schneider-Kamp7a116712000-07-11 11:24:41 +0000102 m.resize( 512 )
Andrew M. Kuchlingd3cf6922000-07-11 10:45:28 +0000103 except SystemError:
104 # resize() not supported
105 # No messages are printed, since the output of this test suite
106 # would then be different across platforms.
107 pass
108 else:
Peter Schneider-Kamp7a116712000-07-11 11:24:41 +0000109 # resize() is supported
Marc-André Lemburg36619082001-01-17 19:11:13 +0000110 verify(len(m) == 512,
111 "len(m) is %d, but expecting 512" % (len(m),) )
Thomas Woutersa7015972000-07-30 15:38:35 +0000112 # Check that we can no longer seek beyond the new size.
113 try:
114 m.seek(513,0)
115 except ValueError:
116 pass
117 else:
Marc-André Lemburg36619082001-01-17 19:11:13 +0000118 verify(0, 'Could seek beyond the new size')
Fred Drake004d5e62000-10-23 17:22:08 +0000119
Fred Drake605843f2000-04-05 14:17:11 +0000120 m.close()
121 os.unlink("foo")
Andrew M. Kuchlinge81b9cf2000-03-30 21:15:29 +0000122 print ' Test passed'
123
Guido van Rossum767e7752000-03-31 01:09:14 +0000124test_both()