From 37a7436ff96b92f721eb3ce109f8a5ca5cb6d2cb Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 25 Dec 2020 23:03:07 +0100 Subject: [PATCH] detect sparse support by fs --- src/borg/testsuite/chunker_pytest.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/borg/testsuite/chunker_pytest.py b/src/borg/testsuite/chunker_pytest.py index 7f1d25e50..daa46bb38 100644 --- a/src/borg/testsuite/chunker_pytest.py +++ b/src/borg/testsuite/chunker_pytest.py @@ -1,5 +1,6 @@ from io import BytesIO import os +import tempfile import pytest @@ -65,7 +66,23 @@ def make_content(sparsemap, header_size=0): return content -@pytest.mark.skipif(not has_seek_hole) +def fs_supports_sparse(): + if not has_seek_hole: + return False + with tempfile.TemporaryDirectory() as tmpdir: + fn = os.path.join(tmpdir, 'test_sparse') + make_sparsefile(fn, [(0, BS, False), (BS, BS, True)]) + with open(fn, 'rb') as f: + try: + offset_hole = f.seek(0, os.SEEK_HOLE) + offset_data = f.seek(0, os.SEEK_DATA) + except OSError: + # no sparse support if these seeks do not work + return False + return offset_hole == 0 and offset_data == BS + + +@pytest.mark.skipif(not fs_supports_sparse(), reason='fs does not support sparse files') @pytest.mark.parametrize("fname, sparse_map", [ ('sparse1', map_sparse1), ('sparse2', map_sparse2), @@ -91,7 +108,7 @@ def test_sparsemap(tmpdir, fname, sparse_map): assert get_sparsemap_fd(fn) == sparse_map -@pytest.mark.skipif(not has_seek_hole) +@pytest.mark.skipif(not fs_supports_sparse(), reason='fs does not support sparse files') @pytest.mark.parametrize("fname, sparse_map, header_size, sparse", [ ('sparse1', map_sparse1, 0, False), ('sparse1', map_sparse1, 0, True),