diff --git a/borg/testsuite/repository.py b/borg/testsuite/repository.py index c50e785bb..9c5a5a466 100644 --- a/borg/testsuite/repository.py +++ b/borg/testsuite/repository.py @@ -8,8 +8,9 @@ from ..hashindex import NSIndex from ..helpers import Location, IntegrityError from ..locking import Lock, LockFailed from ..remote import RemoteRepository, InvalidRPCMethod -from ..repository import Repository, LoggedIO, TAG_COMMIT, MAX_DATA_SIZE +from ..repository import Repository, LoggedIO, TAG_DELETE, MAX_DATA_SIZE from . import BaseTestCase +from .hashindex import H UNSPECIFIED = object() # for default values where we can't use None @@ -227,6 +228,28 @@ class RepositoryCommitTestCase(RepositoryTestCaseBase): io = self.repository.io assert not io.is_committed_segment(io.get_latest_segment()) + def test_moved_deletes_are_tracked(self): + self.repository.put(H(1), b'1') + self.repository.put(H(2), b'2') + self.repository.commit() + self.repository.delete(H(1)) + self.repository.commit() + last_segment = self.repository.io.get_latest_segment() + num_deletes = 0 + for tag, key, offset, data in self.repository.io.iter_objects(last_segment, include_data=True): + if tag == TAG_DELETE: + assert key == H(1) + num_deletes += 1 + assert num_deletes == 1 + assert last_segment in self.repository.compact + self.repository.put(H(3), b'3') + self.repository.commit() + assert last_segment not in self.repository.compact + assert not self.repository.io.segment_exists(last_segment) + last_segment = self.repository.io.get_latest_segment() + for tag, key, offset in self.repository.io.iter_objects(last_segment): + assert tag != TAG_DELETE + class RepositoryAppendOnlyTestCase(RepositoryTestCaseBase): def open(self, create=False):