hashindex.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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(key_size=32)
  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, key_size=32)
  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, key_size=32)), 0)
  42. def test_nsindex(self):
  43. self._generic_test(NSIndex, lambda x: (x, x), '369a18ae6a52524eb2884a3c0fdc2824947edd017a2688c5d4d7b3510c245ab9')
  44. def test_chunkindex(self):
  45. self._generic_test(ChunkIndex, lambda x: (x, x, x), 'ed22e8a883400453c0ee79a06c54df72c994a54eeefdc6c0989efdc5ee6d07b7')
  46. def test_resize(self):
  47. n = 2000 # Must be >= MIN_BUCKETS
  48. idx_name = tempfile.NamedTemporaryFile()
  49. idx = NSIndex(key_size=32)
  50. idx.write(idx_name.name)
  51. initial_size = os.path.getsize(idx_name.name)
  52. self.assert_equal(len(idx), 0)
  53. for x in range(n):
  54. idx[bytes('%-32d' % x, 'ascii')] = x, x
  55. idx.write(idx_name.name)
  56. self.assert_true(initial_size < os.path.getsize(idx_name.name))
  57. for x in range(n):
  58. del idx[bytes('%-32d' % x, 'ascii')]
  59. self.assert_equal(len(idx), 0)
  60. idx.write(idx_name.name)
  61. self.assert_equal(initial_size, os.path.getsize(idx_name.name))
  62. def test_iteritems(self):
  63. idx = NSIndex(key_size=32)
  64. for x in range(100):
  65. idx[bytes('%-0.32d' % x, 'ascii')] = x, x
  66. all = list(idx.iteritems())
  67. self.assert_equal(len(all), 100)
  68. second_half = list(idx.iteritems(marker=all[49][0]))
  69. self.assert_equal(len(second_half), 50)
  70. self.assert_equal(second_half, all[50:])