Skip to content

Commit 37a7436

Browse files
detect sparse support by fs
1 parent c0c0da9 commit 37a7436

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

src/borg/testsuite/chunker_pytest.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from io import BytesIO
22
import os
3+
import tempfile
34

45
import pytest
56

@@ -65,7 +66,23 @@ def make_content(sparsemap, header_size=0):
6566
return content
6667

6768

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')
6986
@pytest.mark.parametrize("fname, sparse_map", [
7087
('sparse1', map_sparse1),
7188
('sparse2', map_sparse2),
@@ -91,7 +108,7 @@ def get_sparsemap_fd(fname):
91108
assert get_sparsemap_fd(fn) == sparse_map
92109

93110

94-
@pytest.mark.skipif(not has_seek_hole)
111+
@pytest.mark.skipif(not fs_supports_sparse(), reason='fs does not support sparse files')
95112
@pytest.mark.parametrize("fname, sparse_map, header_size, sparse", [
96113
('sparse1', map_sparse1, 0, False),
97114
('sparse1', map_sparse1, 0, True),

0 commit comments

Comments
 (0)