@@ -57,6 +57,7 @@ def test_basic(self):
57
57
f .write (b'\0 ' * (PAGESIZE - 3 ) )
58
58
f .flush ()
59
59
m = mmap .mmap (f .fileno (), 2 * PAGESIZE )
60
+ self .addCleanup (m .close )
60
61
finally :
61
62
f .close ()
62
63
@@ -114,31 +115,28 @@ def test_basic(self):
114
115
# Try to seek to negative position...
115
116
self .assertRaises (ValueError , m .seek , - len (m )- 1 , 2 )
116
117
118
+ @unittest .skipUnless (hasattr (mmap .mmap , 'resize' ), 'requires mmap.resize' )
119
+ def test_resize (self ):
120
+ # Create a file to be mmap'ed.
121
+ with open (TESTFN , 'bw+' ) as f :
122
+ # Write 2 pages worth of data to the file
123
+ f .write (b'\0 ' * 2 * PAGESIZE )
124
+ f .flush ()
125
+ m = mmap .mmap (f .fileno (), 2 * PAGESIZE )
126
+ self .addCleanup (m .close )
127
+
117
128
# Try resizing map
118
- try :
119
- m .resize (512 )
120
- except SystemError :
121
- # resize() not supported
122
- # No messages are printed, since the output of this test suite
123
- # would then be different across platforms.
124
- pass
125
- else :
126
- # resize() is supported
127
- self .assertEqual (len (m ), 512 )
128
- # Check that we can no longer seek beyond the new size.
129
- self .assertRaises (ValueError , m .seek , 513 , 0 )
130
-
131
- # Check that the underlying file is truncated too
132
- # (bug #728515)
133
- f = open (TESTFN , 'rb' )
134
- try :
135
- f .seek (0 , 2 )
136
- self .assertEqual (f .tell (), 512 )
137
- finally :
138
- f .close ()
139
- self .assertEqual (m .size (), 512 )
129
+ m .resize (512 )
130
+ self .assertEqual (len (m ), 512 )
131
+ # Check that we can no longer seek beyond the new size.
132
+ self .assertRaises (ValueError , m .seek , 513 , 0 )
140
133
141
- m .close ()
134
+ # Check that the underlying file is truncated too
135
+ # (bug #728515)
136
+ with open (TESTFN , 'rb' ) as f :
137
+ f .seek (0 , 2 )
138
+ self .assertEqual (f .tell (), 512 )
139
+ self .assertEqual (m .size (), 512 )
142
140
143
141
def test_access_parameter (self ):
144
142
# Test for "access" keyword parameter
@@ -183,15 +181,10 @@ def test_access_parameter(self):
183
181
else :
184
182
self .fail ("Able to write to readonly memory map" )
185
183
186
- # Ensuring that readonly mmap can't be resized
187
- try :
188
- m .resize (2 * mapsize )
189
- except SystemError : # resize is not universally supported
190
- pass
191
- except TypeError :
192
- pass
193
- else :
194
- self .fail ("Able to resize readonly memory map" )
184
+ if hasattr (m , 'resize' ):
185
+ # Ensuring that readonly mmap can't be resized
186
+ with self .assertRaises (TypeError ):
187
+ m .resize (2 * mapsize )
195
188
with open (TESTFN , "rb" ) as fp :
196
189
self .assertEqual (fp .read (), b'a' * mapsize ,
197
190
"Readonly memory map data file was modified" )
@@ -242,8 +235,9 @@ def test_access_parameter(self):
242
235
with open (TESTFN , "rb" ) as fp :
243
236
self .assertEqual (fp .read (), b'c' * mapsize ,
244
237
"Copy-on-write test data file should not be modified." )
245
- # Ensuring copy-on-write maps cannot be resized
246
- self .assertRaises (TypeError , m .resize , 2 * mapsize )
238
+ if hasattr (m , 'resize' ):
239
+ # Ensuring copy-on-write maps cannot be resized
240
+ self .assertRaises (TypeError , m .resize , 2 * mapsize )
247
241
m .close ()
248
242
249
243
# Ensuring invalid access parameter raises exception
@@ -282,10 +276,11 @@ def test_trackfd_parameter(self, close_original_fd):
282
276
self .assertEqual (len (m ), size )
283
277
with self .assertRaises (ValueError ):
284
278
m .size ()
285
- with self .assertRaises (ValueError ):
286
- m .resize (size * 2 )
287
- with self .assertRaises (ValueError ):
288
- m .resize (size // 2 )
279
+ if hasattr (m , 'resize' ):
280
+ with self .assertRaises (ValueError ):
281
+ m .resize (size * 2 )
282
+ with self .assertRaises (ValueError ):
283
+ m .resize (size // 2 )
289
284
self .assertIs (m .closed , False )
290
285
291
286
# Smoke-test other API
@@ -313,8 +308,9 @@ def test_trackfd_neg1(self):
313
308
with mmap .mmap (- 1 , size , trackfd = False ) as m :
314
309
with self .assertRaises (ValueError ):
315
310
m .size ()
316
- with self .assertRaises (ValueError ):
317
- m .resize (size // 2 )
311
+ if hasattr (m , 'resize' ):
312
+ with self .assertRaises (ValueError ):
313
+ m .resize (size // 2 )
318
314
self .assertEqual (len (m ), size )
319
315
m [0 ] = ord ('a' )
320
316
assert m [0 ] == ord ('a' )
@@ -608,13 +604,9 @@ def test_offset (self):
608
604
self .assertEqual (m [0 :3 ], b'foo' )
609
605
f .close ()
610
606
611
- # Try resizing map
612
- try :
607
+ if hasattr ( m , 'resize' ):
608
+ # Try resizing map
613
609
m .resize (512 )
614
- except SystemError :
615
- pass
616
- else :
617
- # resize() is supported
618
610
self .assertEqual (len (m ), 512 )
619
611
# Check that we can no longer seek beyond the new size.
620
612
self .assertRaises (ValueError , m .seek , 513 , 0 )
@@ -806,14 +798,12 @@ def test_write_returning_the_number_of_bytes_written(self):
806
798
self .assertEqual (mm .write (b"yz" ), 2 )
807
799
self .assertEqual (mm .write (b"python" ), 6 )
808
800
801
+ @unittest .skipUnless (hasattr (mmap .mmap , 'resize' ), 'requires mmap.resize' )
809
802
def test_resize_past_pos (self ):
810
803
m = mmap .mmap (- 1 , 8192 )
811
804
self .addCleanup (m .close )
812
805
m .read (5000 )
813
- try :
814
- m .resize (4096 )
815
- except SystemError :
816
- self .skipTest ("resizing not supported" )
806
+ m .resize (4096 )
817
807
self .assertEqual (m .read (14 ), b'' )
818
808
self .assertRaises (ValueError , m .read_byte )
819
809
self .assertRaises (ValueError , m .write_byte , 42 )
@@ -895,6 +885,7 @@ def test_madvise(self):
895
885
self .assertEqual (m .madvise (mmap .MADV_NORMAL , 0 , 2 ), None )
896
886
self .assertEqual (m .madvise (mmap .MADV_NORMAL , 0 , size ), None )
897
887
888
+ @unittest .skipUnless (hasattr (mmap .mmap , 'resize' ), 'requires mmap.resize' )
898
889
def test_resize_up_anonymous_mapping (self ):
899
890
"""If the mmap is backed by the pagefile ensure a resize up can happen
900
891
and that the original data is still in place
@@ -911,32 +902,26 @@ def test_resize_up_anonymous_mapping(self):
911
902
with self .assertRaises (ValueError ):
912
903
m .resize (new_size )
913
904
else :
914
- try :
915
- m .resize (new_size )
916
- except SystemError :
917
- pass
918
- else :
919
- self .assertEqual (len (m ), new_size )
920
- self .assertEqual (m [:start_size ], data )
921
- self .assertEqual (m [start_size :], b'\0 ' * (new_size - start_size ))
905
+ m .resize (new_size )
906
+ self .assertEqual (len (m ), new_size )
907
+ self .assertEqual (m [:start_size ], data )
908
+ self .assertEqual (m [start_size :], b'\0 ' * (new_size - start_size ))
922
909
923
910
@unittest .skipUnless (os .name == 'posix' , 'requires Posix' )
911
+ @unittest .skipUnless (hasattr (mmap .mmap , 'resize' ), 'requires mmap.resize' )
924
912
def test_resize_up_private_anonymous_mapping (self ):
925
913
start_size = PAGESIZE
926
914
new_size = 2 * start_size
927
915
data = random .randbytes (start_size )
928
916
929
917
with mmap .mmap (- 1 , start_size , flags = mmap .MAP_PRIVATE ) as m :
930
918
m [:] = data
931
- try :
932
- m .resize (new_size )
933
- except SystemError :
934
- pass
935
- else :
936
- self .assertEqual (len (m ), new_size )
937
- self .assertEqual (m [:start_size ], data )
938
- self .assertEqual (m [start_size :], b'\0 ' * (new_size - start_size ))
919
+ m .resize (new_size )
920
+ self .assertEqual (len (m ), new_size )
921
+ self .assertEqual (m [:start_size ], data )
922
+ self .assertEqual (m [start_size :], b'\0 ' * (new_size - start_size ))
939
923
924
+ @unittest .skipUnless (hasattr (mmap .mmap , 'resize' ), 'requires mmap.resize' )
940
925
def test_resize_down_anonymous_mapping (self ):
941
926
"""If the mmap is backed by the pagefile ensure a resize down up can happen
942
927
and that a truncated form of the original data is still in place
@@ -947,17 +932,13 @@ def test_resize_down_anonymous_mapping(self):
947
932
948
933
with mmap .mmap (- 1 , start_size ) as m :
949
934
m [:] = data
950
- try :
951
- m .resize (new_size )
952
- except SystemError :
953
- pass
954
- else :
955
- self .assertEqual (len (m ), new_size )
956
- self .assertEqual (m [:], data [:new_size ])
957
- if sys .platform .startswith (('linux' , 'android' )):
958
- # Can't expand to its original size.
959
- with self .assertRaises (ValueError ):
960
- m .resize (start_size )
935
+ m .resize (new_size )
936
+ self .assertEqual (len (m ), new_size )
937
+ self .assertEqual (m [:], data [:new_size ])
938
+ if sys .platform .startswith (('linux' , 'android' )):
939
+ # Can't expand to its original size.
940
+ with self .assertRaises (ValueError ):
941
+ m .resize (start_size )
961
942
962
943
@unittest .skipUnless (os .name == 'nt' , 'requires Windows' )
963
944
def test_resize_fails_if_mapping_held_elsewhere (self ):
0 commit comments