1
1
from io import BytesIO
2
2
import os
3
+ import tempfile
3
4
4
5
import pytest
5
6
@@ -65,7 +66,23 @@ def make_content(sparsemap, header_size=0):
65
66
return content
66
67
67
68
68
- @pytest .mark .skipif (not has_seek_hole )
69
+ def fs_supports_sparse ():
70
+ if not has_seek_hole :
71
+ return False
72
+ with tempfile .TemporaryDirectory () as tmpdir :
73
+ fn = os .path .join (tmpdir , 'test_sparse' )
74
+ make_sparsefile (fn , [(0 , BS , False ), (BS , BS , True )])
75
+ with open (fn , 'rb' ) as f :
76
+ try :
77
+ offset_hole = f .seek (0 , os .SEEK_HOLE )
78
+ offset_data = f .seek (0 , os .SEEK_DATA )
79
+ except OSError :
80
+ # no sparse support if these seeks do not work
81
+ return False
82
+ return offset_hole == 0 and offset_data == BS
83
+
84
+
85
+ @pytest .mark .skipif (not fs_supports_sparse (), reason = 'fs does not support sparse files' )
69
86
@pytest .mark .parametrize ("fname, sparse_map" , [
70
87
('sparse1' , map_sparse1 ),
71
88
('sparse2' , map_sparse2 ),
@@ -91,7 +108,7 @@ def get_sparsemap_fd(fname):
91
108
assert get_sparsemap_fd (fn ) == sparse_map
92
109
93
110
94
- @pytest .mark .skipif (not has_seek_hole )
111
+ @pytest .mark .skipif (not fs_supports_sparse (), reason = 'fs does not support sparse files' )
95
112
@pytest .mark .parametrize ("fname, sparse_map, header_size, sparse" , [
96
113
('sparse1' , map_sparse1 , 0 , False ),
97
114
('sparse1' , map_sparse1 , 0 , True ),
0 commit comments