repository.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import os
  2. import shutil
  3. import tempfile
  4. from attic.hashindex import NSIndex
  5. from attic.helpers import Location
  6. from attic.remote import RemoteRepository
  7. from attic.repository import Repository
  8. from attic.testsuite import AtticTestCase
  9. class RepositoryTestCase(AtticTestCase):
  10. def open(self, create=False):
  11. return Repository(os.path.join(self.tmppath, 'repository'), create=create)
  12. def setUp(self):
  13. self.tmppath = tempfile.mkdtemp()
  14. self.repository = self.open(create=True)
  15. def tearDown(self):
  16. self.repository.close()
  17. shutil.rmtree(self.tmppath)
  18. def test1(self):
  19. for x in range(100):
  20. self.repository.put(('%-32d' % x).encode('ascii'), b'SOMEDATA')
  21. key50 = ('%-32d' % 50).encode('ascii')
  22. self.assert_equal(self.repository.get(key50), b'SOMEDATA')
  23. self.repository.delete(key50)
  24. self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(key50))
  25. self.repository.commit()
  26. self.repository.close()
  27. repository2 = self.open()
  28. self.assert_raises(Repository.DoesNotExist, lambda: repository2.get(key50))
  29. for x in range(100):
  30. if x == 50:
  31. continue
  32. self.assert_equal(repository2.get(('%-32d' % x).encode('ascii')), b'SOMEDATA')
  33. repository2.close()
  34. def test2(self):
  35. """Test multiple sequential transactions
  36. """
  37. self.repository.put(b'00000000000000000000000000000000', b'foo')
  38. self.repository.put(b'00000000000000000000000000000001', b'foo')
  39. self.repository.commit()
  40. self.repository.delete(b'00000000000000000000000000000000')
  41. self.repository.put(b'00000000000000000000000000000001', b'bar')
  42. self.repository.commit()
  43. self.assert_equal(self.repository.get(b'00000000000000000000000000000001'), b'bar')
  44. def test_index_rebuild(self):
  45. """Verify that repository index rebuild works properly
  46. """
  47. def extract_and_unlink_index():
  48. index_name = [n for n in os.listdir(os.path.join(self.tmppath, 'repository')) if n.startswith('index')][0]
  49. idx = NSIndex(os.path.join(self.tmppath, 'repository', index_name))
  50. os.unlink(os.path.join(self.tmppath, 'repository', index_name))
  51. return list(idx.iteritems())
  52. self.test2()
  53. self.repository.close()
  54. before = extract_and_unlink_index()
  55. self.open()
  56. self.assert_equal(before, extract_and_unlink_index())
  57. def test_consistency(self):
  58. """Test cache consistency
  59. """
  60. self.repository.put(b'00000000000000000000000000000000', b'foo')
  61. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'foo')
  62. self.repository.put(b'00000000000000000000000000000000', b'foo2')
  63. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'foo2')
  64. self.repository.put(b'00000000000000000000000000000000', b'bar')
  65. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'bar')
  66. self.repository.delete(b'00000000000000000000000000000000')
  67. self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(b'00000000000000000000000000000000'))
  68. def test_consistency2(self):
  69. """Test cache consistency2
  70. """
  71. self.repository.put(b'00000000000000000000000000000000', b'foo')
  72. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'foo')
  73. self.repository.commit()
  74. self.repository.put(b'00000000000000000000000000000000', b'foo2')
  75. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'foo2')
  76. self.repository.rollback()
  77. self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'foo')
  78. def test_single_kind_transactions(self):
  79. # put
  80. self.repository.put(b'00000000000000000000000000000000', b'foo')
  81. self.repository.commit()
  82. self.repository.close()
  83. # replace
  84. self.repository = self.open()
  85. self.repository.put(b'00000000000000000000000000000000', b'bar')
  86. self.repository.commit()
  87. self.repository.close()
  88. # delete
  89. self.repository = self.open()
  90. self.repository.delete(b'00000000000000000000000000000000')
  91. self.repository.commit()
  92. class RemoteRepositoryTestCase(RepositoryTestCase):
  93. def open(self, create=False):
  94. return RemoteRepository(Location('__testsuite__:' + os.path.join(self.tmppath, 'repository')), create=create)