|
@@ -106,6 +106,14 @@ class RepositoryCheckTestCase(AtticTestCase):
|
|
self.repository.close()
|
|
self.repository.close()
|
|
shutil.rmtree(self.tmppath)
|
|
shutil.rmtree(self.tmppath)
|
|
|
|
|
|
|
|
+ def list_indices(self):
|
|
|
|
+ return [name for name in os.listdir(os.path.join(self.tmppath, 'repository')) if name.startswith('index.')]
|
|
|
|
+
|
|
|
|
+ def check(self, repair=False, status=True):
|
|
|
|
+ self.assert_equal(self.repository.check(repair=repair), status)
|
|
|
|
+ # Make sure no tmp files are left behind
|
|
|
|
+ self.assert_equal([name for name in os.listdir(os.path.join(self.tmppath, 'repository')) if 'tmp' in name], [], 'Found tmp files')
|
|
|
|
+
|
|
def get_objects(self, *ids):
|
|
def get_objects(self, *ids):
|
|
for id_ in ids:
|
|
for id_ in ids:
|
|
self.repository.get(('%032d' % id_).encode('ascii'))
|
|
self.repository.get(('%032d' % id_).encode('ascii'))
|
|
@@ -145,75 +153,98 @@ class RepositoryCheckTestCase(AtticTestCase):
|
|
def test_repair_corrupted_segment(self):
|
|
def test_repair_corrupted_segment(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=True)
|
|
self.corrupt_object(5)
|
|
self.corrupt_object(5)
|
|
self.assert_raises(IntegrityError, lambda: self.get_objects(5))
|
|
self.assert_raises(IntegrityError, lambda: self.get_objects(5))
|
|
self.repository.rollback()
|
|
self.repository.rollback()
|
|
# Make sure a regular check does not repair anything
|
|
# Make sure a regular check does not repair anything
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(status=False)
|
|
# Make sure a repair actually repairs the repo
|
|
# Make sure a repair actually repairs the repo
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
|
|
+ self.check(repair=True, status=True)
|
|
self.get_objects(4)
|
|
self.get_objects(4)
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=True)
|
|
self.assert_equal(set([1, 2, 3, 4, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 6]), self.list_objects())
|
|
|
|
|
|
def test_repair_missing_segment(self):
|
|
def test_repair_missing_segment(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=True)
|
|
self.delete_segment(1)
|
|
self.delete_segment(1)
|
|
self.repository.rollback()
|
|
self.repository.rollback()
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
|
|
+ self.check(repair=True, status=True)
|
|
self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
|
|
|
|
def test_repair_missing_commit_segment(self):
|
|
def test_repair_missing_commit_segment(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.delete_segment(1)
|
|
self.delete_segment(1)
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
|
|
+ self.check(status=False)
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
|
|
+ self.check(repair=True, status=True)
|
|
self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
|
|
self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
|
|
|
|
def test_repair_corrupted_commit_segment(self):
|
|
def test_repair_corrupted_commit_segment(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
- with open(os.path.join(self.tmppath, 'repository', 'data', '0', '1'), 'ab') as fd:
|
|
|
|
|
|
+ with open(os.path.join(self.tmppath, 'repository', 'data', '0', '1'), 'r+b') as fd:
|
|
|
|
+ fd.seek(-1, os.SEEK_END)
|
|
fd.write(b'X')
|
|
fd.write(b'X')
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
- self.get_objects(4)
|
|
|
|
- self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(repair=True, status=True)
|
|
|
|
+ self.get_objects(3)
|
|
|
|
+ self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
|
|
|
|
+ self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
|
|
+
|
|
|
|
+ def test_repair_no_commits(self):
|
|
|
|
+ self.add_objects([[1, 2, 3]])
|
|
|
|
+ with open(os.path.join(self.tmppath, 'repository', 'data', '0', '0'), 'r+b') as fd:
|
|
|
|
+ fd.seek(-1, os.SEEK_END)
|
|
|
|
+ fd.write(b'X')
|
|
|
|
+ self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.0'])
|
|
|
|
+ self.check(repair=True, status=True)
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.1'])
|
|
|
|
+ self.check(status=True)
|
|
|
|
+ self.get_objects(3)
|
|
|
|
+ self.assert_equal(set([1, 2, 3]), self.list_objects())
|
|
|
|
|
|
def test_repair_missing_index(self):
|
|
def test_repair_missing_index(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.delete_index()
|
|
self.delete_index()
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(repair=True, status=True)
|
|
|
|
+ self.check(status=True)
|
|
self.get_objects(4)
|
|
self.get_objects(4)
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
|
|
|
|
def test_repair_index_too_old(self):
|
|
def test_repair_index_too_old(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.1'])
|
|
self.rename_index('index.0')
|
|
self.rename_index('index.0')
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.0'])
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(repair=True, status=True)
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.1'])
|
|
|
|
+ self.check(status=True)
|
|
self.get_objects(4)
|
|
self.get_objects(4)
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
|
|
|
|
def test_repair_index_too_new(self):
|
|
def test_repair_index_too_new(self):
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
self.add_objects([[1, 2, 3], [4, 5, 6]])
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.1'])
|
|
self.rename_index('index.100')
|
|
self.rename_index('index.100')
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.100'])
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4))
|
|
- self.assert_equal(False, self.repository.check())
|
|
|
|
- self.assert_equal(True, self.repository.check(repair=True))
|
|
|
|
- self.assert_equal(True, self.repository.check())
|
|
|
|
|
|
+ self.check(status=False)
|
|
|
|
+ self.check(repair=True, status=True)
|
|
|
|
+ self.assert_equal(self.list_indices(), ['index.1'])
|
|
|
|
+ self.check(status=True)
|
|
self.get_objects(4)
|
|
self.get_objects(4)
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())
|
|
|
|
|