Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 6 additions & 11 deletions src/borg/testsuite/archiver/check_cmd_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ def test_spoofed_manifest(archivers, request):
cmd(archiver, "check", exit_code=0)


@pytest.mark.skip(reason="TODO: repair does not yet rewrite store-corrupted packs, refs #8572")
def test_manifest_rebuild_corrupted_chunk(archivers, request):
archiver = request.getfixturevalue(archivers)
check_cmd_setup(archiver)
Expand All @@ -287,14 +288,10 @@ def test_manifest_rebuild_corrupted_chunk(archivers, request):
manifest = repository.get_manifest()
corrupted_manifest = corrupt(manifest, 250)
repository.put_manifest(corrupted_manifest)
chunk = repository.get(archive.id)
# corrupt a byte in the middle of the object: the last byte can land on store-level
# framing rather than the authenticated payload, which made the repair flaky on Windows.
corrupted_chunk = corrupt(chunk, len(chunk) // 2)
repository.put(archive.id, corrupted_chunk)
repository.flush() # make the put durable before close()/the check below
corrupt_chunk_on_disk(repository, archive.id)
cmd(archiver, "check", exit_code=1)
output = cmd(archiver, "check", "-v", "--repair", exit_code=0)
assert "archive1" not in output
assert "archive2" in output
cmd(archiver, "check", exit_code=0)

Expand Down Expand Up @@ -408,10 +405,10 @@ def test_verify_data(archivers, request, init_args):
assert f"{src_file}: Missing file chunk detected" in output


@pytest.mark.skip(reason="TODO: test broken due to packs refactoring")
@pytest.mark.parametrize("init_args", [["--encryption=aes256-ocb"], ["--encryption", "none"]])
def test_corrupted_file_chunk(archivers, request, init_args):
## similar to test_verify_data, but here we let the low level repository-only checks discover the issue.
## like test_verify_data, but also checks a repository-only check passes after repair and a plain
## archives check reports the missing chunk.

archiver = request.getfixturevalue(archivers)
check_cmd_setup(archiver)
Expand All @@ -423,9 +420,7 @@ def test_corrupted_file_chunk(archivers, request, init_args):
for item in archive.iter_items():
if item.path.endswith(src_file):
chunk = item.chunks[-1]
data = repository.get(chunk.id)
data = corrupt(data, 123)
repository.put(chunk.id, data)
corrupt_chunk_on_disk(repository, chunk.id)
break

# --verify-data decrypts and catches the corruption.
Comment thread
mr-raj12 marked this conversation as resolved.
Expand Down
Loading