PageRenderTime 26ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test.py

https://gitlab.com/CarlosRA97/py-leveldb
Python | 300 lines | 271 code | 21 blank | 8 comment | 11 complexity | b5e1d2667667cfa72ba5697d8a9f104d MD5 | raw file
  1. #!/usr/bin/python
  2. # Copyright (c) Arni Mar Jonsson.
  3. # See LICENSE for details.
  4. import sys, string, unittest, itertools
  5. class TestLevelDB(unittest.TestCase):
  6. def setUp(self):
  7. # import local leveldb
  8. import leveldb as _leveldb
  9. self.leveldb = _leveldb
  10. dir(self.leveldb)
  11. # Python2/3 compat
  12. if hasattr(string, 'lowercase'):
  13. self.lowercase = string.lowercase
  14. self.uppercase = string.uppercase
  15. else:
  16. self.lowercase = string.ascii_lowercase
  17. self.uppercase = string.ascii_uppercase
  18. # comparator
  19. if sys.version_info[0] < 3:
  20. def my_comparison(a, b):
  21. return cmp(a, b)
  22. else:
  23. def my_comparison(a, b):
  24. if a < b:
  25. return -1
  26. elif a > b:
  27. return 1
  28. else:
  29. return 0
  30. self.comparator = 'bytewise'
  31. if True:
  32. self.comparator = ('bytewise', my_comparison)
  33. # repair/destroy previous database, if any
  34. self.name = 'db_a'
  35. #self.leveldb.RepairDB(self.name, comparator = self.comparator)
  36. self.leveldb.DestroyDB(self.name)
  37. def _open_options(self, create_if_missing = True, error_if_exists = False):
  38. v = {
  39. 'create_if_missing': True,
  40. 'error_if_exists': error_if_exists,
  41. 'paranoid_checks': False,
  42. 'block_cache_size': 8 * (2 << 20),
  43. 'write_buffer_size': 2 * (2 << 20),
  44. 'block_size': 4096,
  45. 'max_open_files': 1000,
  46. 'block_restart_interval': 16,
  47. 'comparator': self.comparator
  48. }
  49. return v
  50. def _open(self, *args, **kwargs):
  51. options = self._open_options(*args, **kwargs)
  52. db = self.leveldb.LevelDB(self.name, **options)
  53. dir(db)
  54. return db
  55. def testIteratorNone(self):
  56. options = self._open_options()
  57. db = self.leveldb.LevelDB(self.name, **options)
  58. for s in 'abcdef':
  59. db.Put(self._s(s), self._s(s))
  60. kv_ = [(self._s('a'), self._s('a')), (self._s('b'), self._s('b')), (self._s('c'), self._s('c')), (self._s('d'), self._s('d')), (self._s('e'), self._s('e')), (self._s('f'), self._s('f'))]
  61. kv = list(db.RangeIter(key_from = None, key_to = None))
  62. self.assertEqual(kv, kv_)
  63. kv = list(db.RangeIter(key_to = None))
  64. self.assertEqual(kv, kv_)
  65. kv = list(db.RangeIter(key_from = None))
  66. self.assertEqual(kv, kv_)
  67. kv = list(db.RangeIter())
  68. self.assertEqual(kv, kv_)
  69. def testIteratorCrash(self):
  70. options = self._open_options()
  71. db = self.leveldb.LevelDB(self.name, **options)
  72. db.Put(self._s('a'), self._s('b'))
  73. i = db.RangeIter(include_value = False, reverse = True)
  74. dir(i)
  75. del self.leveldb
  76. def _s(self, s):
  77. if sys.version_info[0] >= 3:
  78. return bytearray(s, encoding = 'latin1')
  79. else:
  80. return s
  81. def _join(self, i):
  82. return self._s('').join(i)
  83. # NOTE: modeled after test 'Snapshot'
  84. def testSnapshotBasic(self):
  85. db = self._open()
  86. # destroy database, if any
  87. db.Put(self._s('foo'), self._s('v1'))
  88. s1 = db.CreateSnapshot()
  89. dir(s1)
  90. db.Put(self._s('foo'), self._s('v2'))
  91. s2 = db.CreateSnapshot()
  92. db.Put(self._s('foo'), self._s('v3'))
  93. s3 = db.CreateSnapshot()
  94. db.Put(self._s('foo'), self._s('v4'))
  95. self.assertEqual(s1.Get(self._s('foo')), self._s('v1'))
  96. self.assertEqual(s2.Get(self._s('foo')), self._s('v2'))
  97. self.assertEqual(s3.Get(self._s('foo')), self._s('v3'))
  98. self.assertEqual(db.Get(self._s('foo')), self._s('v4'))
  99. # TBD: close properly
  100. del s3
  101. self.assertEqual(s1.Get(self._s('foo')), self._s('v1'))
  102. self.assertEqual(s2.Get(self._s('foo')), self._s('v2'))
  103. self.assertEqual(db.Get(self._s('foo')), self._s('v4'))
  104. # TBD: close properly
  105. del s1
  106. self.assertEqual(s2.Get(self._s('foo')), self._s('v2'))
  107. self.assertEqual(db.Get(self._s('foo')), self._s('v4'))
  108. # TBD: close properly
  109. del s2
  110. self.assertEqual(db.Get(self._s('foo')), self._s('v4'))
  111. # re-open
  112. del db
  113. db = self._open()
  114. self.assertEqual(db.Get(self._s('foo')), self._s('v4'))
  115. def ClearDB(self, db):
  116. for k in list(db.RangeIter(include_value = False, reverse = True)):
  117. db.Delete(k)
  118. def ClearDB_batch(self, db):
  119. b = self.leveldb.WriteBatch()
  120. dir(b)
  121. for k in db.RangeIter(include_value = False, reverse = True):
  122. b.Delete(k)
  123. db.Write(b)
  124. def CountDB(self, db):
  125. return sum(1 for i in db.RangeIter(reverse = True))
  126. def _insert_lowercase(self, db):
  127. b = self.leveldb.WriteBatch()
  128. for c in self.lowercase:
  129. b.Put(self._s(c), self._s('hello'))
  130. db.Write(b)
  131. def _insert_uppercase_batch(self, db):
  132. b = self.leveldb.WriteBatch()
  133. for c in self.uppercase:
  134. b.Put(self._s(c), self._s('hello'))
  135. db.Write(b)
  136. def _test_uppercase_get(self, db):
  137. for k in self.uppercase:
  138. v = db.Get(self._s(k))
  139. self.assertEqual(v, self._s('hello'))
  140. self.assertTrue(k in self.uppercase)
  141. def _test_uppercase_iter(self, db):
  142. s = self._join(k for k, v in db.RangeIter(self._s('J'), self._s('M')))
  143. self.assertEqual(s, self._s('JKLM'))
  144. s = self._join(k for k, v in db.RangeIter(self._s('S')))
  145. self.assertEqual(s, self._s('STUVWXYZ'))
  146. s = self._join(k for k, v in db.RangeIter(key_to = self._s('E')))
  147. self.assertEqual(s, self._s('ABCDE'))
  148. def _test_uppercase_iter_rev(self, db):
  149. # inside range
  150. s = self._join(k for k, v in db.RangeIter(self._s('J'), self._s('M'), reverse = True))
  151. self.assertEqual(s, self._s('MLKJ'))
  152. # partly outside range
  153. s = self._join(k for k, v in db.RangeIter(self._s('Z'), self._s(chr(ord('Z') + 1)), reverse = True))
  154. self.assertEqual(s, self._s('Z'))
  155. s = self._join(k for k, v in db.RangeIter(self._s(chr(ord('A') - 1)), self._s('A'), reverse = True))
  156. self.assertEqual(s, self._s('A'))
  157. # wholly outside range
  158. s = self._join(k for k, v in db.RangeIter(self._s(chr(ord('Z') + 1)), self._s(chr(ord('Z') + 2)), reverse = True))
  159. self.assertEqual(s, self._s(''))
  160. s = self._join(k for k, v in db.RangeIter(self._s(chr(ord('A') - 2)), self._s(chr(ord('A') - 1)), reverse = True))
  161. self.assertEqual(s, self._s(''))
  162. # lower limit
  163. s = self._join(k for k, v in db.RangeIter(self._s('S'), reverse = True))
  164. self.assertEqual(s, self._s('ZYXWVUTS'))
  165. # upper limit
  166. s = self._join(k for k, v in db.RangeIter(key_to = self._s('E'), reverse = True))
  167. self.assertEqual(s, self._s('EDCBA'))
  168. def _test_lowercase_iter(self, db):
  169. s = self._join(k for k, v in db.RangeIter(self._s('j'), self._s('m')))
  170. self.assertEqual(s, self._s('jklm'))
  171. s = self._join(k for k, v in db.RangeIter(self._s('s')))
  172. self.assertEqual(s, self._s('stuvwxyz'))
  173. s = self._join(k for k, v in db.RangeIter(key_to = self._s('e')))
  174. self.assertEqual(s, self._s('abcde'))
  175. def _test_lowercase_iter(self, db):
  176. s = self._join(k for k, v in db.RangeIter(self._s('j'), self._s('m'), reverse = True))
  177. self.assertEqual(s, self._s('mlkj'))
  178. s = self._join(k for k, v in db.RangeIter(self._s('s'), reverse = True))
  179. self.assertEqual(s, self._s('zyxwvuts'))
  180. s = self._join(k for k, v in db.RangeIter(key_to = self._s('e'), reverse = True))
  181. self.assertEqual(s, self._s('edcba'))
  182. def _test_lowercase_get(self, db):
  183. for k in self.lowercase:
  184. v = db.Get(self._s(k))
  185. self.assertEqual(v, self._s('hello'))
  186. self.assertTrue(k in self.lowercase)
  187. def testIterationBasic(self):
  188. db = self._open()
  189. self._insert_lowercase(db)
  190. self.assertEqual(self.CountDB(db), 26)
  191. self._test_lowercase_iter(db)
  192. #self._test_lowercase_iter_rev(db)
  193. self._test_lowercase_get(db)
  194. self.ClearDB_batch(db)
  195. self._insert_uppercase_batch(db)
  196. self._test_uppercase_iter(db)
  197. self._test_uppercase_iter_rev(db)
  198. self._test_uppercase_get(db)
  199. self.assertEqual(self.CountDB(db), 26)
  200. def testCompact(self):
  201. db = self._open()
  202. s = self._s('foo' * 10)
  203. for i in itertools.count():
  204. db.Put(self._s('%i' % i), s)
  205. if i > 10000:
  206. break
  207. db.CompactRange(self._s('1000'), self._s('10000'))
  208. db.CompactRange(start = self._s('1000'))
  209. db.CompactRange(end = self._s('1000'))
  210. db.CompactRange(start = self._s('1000'), end = None)
  211. db.CompactRange(start = None, end = self._s('1000'))
  212. db.CompactRange()
  213. # tried to re-produce http://code.google.com/p/leveldb/issues/detail?id=44
  214. def testMe(self):
  215. db = self._open()
  216. db.Put(self._s('key1'), self._s('val1'))
  217. del db
  218. db = self._open()
  219. db.Delete(self._s('key2'))
  220. db.Delete(self._s('key1'))
  221. del db
  222. db = self._open()
  223. db.Delete(self._s('key2'))
  224. del db
  225. db = self._open()
  226. db.Put(self._s('key3'), self._s('val1'))
  227. del db
  228. db = self._open()
  229. del db
  230. db = self._open()
  231. v = list(db.RangeIter())
  232. self.assertEqual(v, [(self._s('key3'), self._s('val1'))])
  233. if __name__ == '__main__':
  234. unittest.main()