hashindex.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import hashlib
  2. import os
  3. import tempfile
  4. from attic.hashindex import NSIndex, ChunkIndex
  5. from attic.testsuite import AtticTestCase
  6. class HashIndexTestCase(AtticTestCase):
  7. def _generic_test(self, cls, make_value, sha):
  8. idx = cls()
  9. self.assert_equal(len(idx), 0)
  10. # Test set
  11. for x in range(100):
  12. idx[bytes('%-32d' % x, 'ascii')] = make_value(x)
  13. self.assert_equal(len(idx), 100)
  14. for x in range(100):
  15. self.assert_equal(idx[bytes('%-32d' % x, 'ascii')], make_value(x))
  16. # Test update
  17. for x in range(100):
  18. idx[bytes('%-32d' % x, 'ascii')] = make_value(x * 2)
  19. self.assert_equal(len(idx), 100)
  20. for x in range(100):
  21. self.assert_equal(idx[bytes('%-32d' % x, 'ascii')], make_value(x * 2))
  22. # Test delete
  23. for x in range(50):
  24. del idx[bytes('%-32d' % x, 'ascii')]
  25. self.assert_equal(len(idx), 50)
  26. idx_name = tempfile.NamedTemporaryFile()
  27. idx.write(idx_name.name)
  28. del idx
  29. # Verify file contents
  30. with open(idx_name.name, 'rb') as fd:
  31. self.assert_equal(hashlib.sha256(fd.read()).hexdigest(), sha)
  32. # Make sure we can open the file
  33. idx = cls.read(idx_name.name)
  34. self.assert_equal(len(idx), 50)
  35. for x in range(50, 100):
  36. self.assert_equal(idx[bytes('%-32d' % x, 'ascii')], make_value(x * 2))
  37. idx.clear()
  38. self.assert_equal(len(idx), 0)
  39. idx.write(idx_name.name)
  40. del idx
  41. self.assert_equal(len(cls.read(idx_name.name)), 0)
  42. def test_nsindex(self):
  43. self._generic_test(NSIndex, lambda x: (x, x),
  44. '861d6d60069ea45e39d36bed2bdc1d0c07981e0641955f897ac6848be429abac')
  45. def test_chunkindex(self):
  46. self._generic_test(ChunkIndex, lambda x: (x, x, x),
  47. '69464bd0ebbc5866b9f95d838bc48617d21bfe3dcf294682a5c21a2ef6b9dc0b')
  48. def test_resize(self):
  49. n = 2000 # Must be >= MIN_BUCKETS
  50. idx_name = tempfile.NamedTemporaryFile()
  51. idx = NSIndex()
  52. idx.write(idx_name.name)
  53. initial_size = os.path.getsize(idx_name.name)
  54. self.assert_equal(len(idx), 0)
  55. for x in range(n):
  56. idx[bytes('%-32d' % x, 'ascii')] = x, x
  57. idx.write(idx_name.name)
  58. self.assert_true(initial_size < os.path.getsize(idx_name.name))
  59. for x in range(n):
  60. del idx[bytes('%-32d' % x, 'ascii')]
  61. self.assert_equal(len(idx), 0)
  62. idx.write(idx_name.name)
  63. self.assert_equal(initial_size, os.path.getsize(idx_name.name))
  64. def test_iteritems(self):
  65. idx = NSIndex()
  66. for x in range(100):
  67. idx[bytes('%-0.32d' % x, 'ascii')] = x, x
  68. all = list(idx.iteritems())
  69. self.assert_equal(len(all), 100)
  70. second_half = list(idx.iteritems(marker=all[49][0]))
  71. self.assert_equal(len(second_half), 50)
  72. self.assert_equal(second_half, all[50:])