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

/edk2/AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_bsddb.py

https://gitlab.com/envieidoc/Clover
Python | 357 lines | 303 code | 30 blank | 24 comment | 25 complexity | a9daef666768a96b4ebb4f0eeea164e8 MD5 | raw file
  1. #! /usr/bin/env python
  2. """Test script for the bsddb C module by Roger E. Masse
  3. Adapted to unittest format and expanded scope by Raymond Hettinger
  4. """
  5. import os, sys
  6. import unittest
  7. from test import test_support
  8. # Skip test if _bsddb wasn't built.
  9. test_support.import_module('_bsddb')
  10. bsddb = test_support.import_module('bsddb', deprecated=True)
  11. # Just so we know it's imported:
  12. test_support.import_module('dbhash', deprecated=True)
  13. class TestBSDDB(unittest.TestCase):
  14. openflag = 'c'
  15. def setUp(self):
  16. self.f = self.openmethod[0](self.fname, self.openflag, cachesize=32768)
  17. self.d = dict(q='Guido', w='van', e='Rossum', r='invented', t='Python', y='')
  18. for k, v in self.d.iteritems():
  19. self.f[k] = v
  20. def tearDown(self):
  21. self.f.sync()
  22. self.f.close()
  23. if self.fname is None:
  24. return
  25. try:
  26. os.remove(self.fname)
  27. except os.error:
  28. pass
  29. def test_getitem(self):
  30. for k, v in self.d.iteritems():
  31. self.assertEqual(self.f[k], v)
  32. def test_len(self):
  33. self.assertEqual(len(self.f), len(self.d))
  34. def test_change(self):
  35. self.f['r'] = 'discovered'
  36. self.assertEqual(self.f['r'], 'discovered')
  37. self.assertIn('r', self.f.keys())
  38. self.assertIn('discovered', self.f.values())
  39. def test_close_and_reopen(self):
  40. if self.fname is None:
  41. # if we're using an in-memory only db, we can't reopen it
  42. # so finish here.
  43. return
  44. self.f.close()
  45. self.f = self.openmethod[0](self.fname, 'w')
  46. for k, v in self.d.iteritems():
  47. self.assertEqual(self.f[k], v)
  48. def assertSetEquals(self, seqn1, seqn2):
  49. self.assertEqual(set(seqn1), set(seqn2))
  50. def test_mapping_iteration_methods(self):
  51. f = self.f
  52. d = self.d
  53. self.assertSetEquals(d, f)
  54. self.assertSetEquals(d.keys(), f.keys())
  55. self.assertSetEquals(d.values(), f.values())
  56. self.assertSetEquals(d.items(), f.items())
  57. self.assertSetEquals(d.iterkeys(), f.iterkeys())
  58. self.assertSetEquals(d.itervalues(), f.itervalues())
  59. self.assertSetEquals(d.iteritems(), f.iteritems())
  60. def test_iter_while_modifying_values(self):
  61. di = iter(self.d)
  62. while 1:
  63. try:
  64. key = di.next()
  65. self.d[key] = 'modified '+key
  66. except StopIteration:
  67. break
  68. # it should behave the same as a dict. modifying values
  69. # of existing keys should not break iteration. (adding
  70. # or removing keys should)
  71. loops_left = len(self.f)
  72. fi = iter(self.f)
  73. while 1:
  74. try:
  75. key = fi.next()
  76. self.f[key] = 'modified '+key
  77. loops_left -= 1
  78. except StopIteration:
  79. break
  80. self.assertEqual(loops_left, 0)
  81. self.test_mapping_iteration_methods()
  82. def test_iter_abort_on_changed_size(self):
  83. def DictIterAbort():
  84. di = iter(self.d)
  85. while 1:
  86. try:
  87. di.next()
  88. self.d['newkey'] = 'SPAM'
  89. except StopIteration:
  90. break
  91. self.assertRaises(RuntimeError, DictIterAbort)
  92. def DbIterAbort():
  93. fi = iter(self.f)
  94. while 1:
  95. try:
  96. fi.next()
  97. self.f['newkey'] = 'SPAM'
  98. except StopIteration:
  99. break
  100. self.assertRaises(RuntimeError, DbIterAbort)
  101. def test_iteritems_abort_on_changed_size(self):
  102. def DictIteritemsAbort():
  103. di = self.d.iteritems()
  104. while 1:
  105. try:
  106. di.next()
  107. self.d['newkey'] = 'SPAM'
  108. except StopIteration:
  109. break
  110. self.assertRaises(RuntimeError, DictIteritemsAbort)
  111. def DbIteritemsAbort():
  112. fi = self.f.iteritems()
  113. while 1:
  114. try:
  115. key, value = fi.next()
  116. del self.f[key]
  117. except StopIteration:
  118. break
  119. self.assertRaises(RuntimeError, DbIteritemsAbort)
  120. def test_iteritems_while_modifying_values(self):
  121. di = self.d.iteritems()
  122. while 1:
  123. try:
  124. k, v = di.next()
  125. self.d[k] = 'modified '+v
  126. except StopIteration:
  127. break
  128. # it should behave the same as a dict. modifying values
  129. # of existing keys should not break iteration. (adding
  130. # or removing keys should)
  131. loops_left = len(self.f)
  132. fi = self.f.iteritems()
  133. while 1:
  134. try:
  135. k, v = fi.next()
  136. self.f[k] = 'modified '+v
  137. loops_left -= 1
  138. except StopIteration:
  139. break
  140. self.assertEqual(loops_left, 0)
  141. self.test_mapping_iteration_methods()
  142. def test_first_next_looping(self):
  143. items = [self.f.first()]
  144. for i in xrange(1, len(self.f)):
  145. items.append(self.f.next())
  146. self.assertSetEquals(items, self.d.items())
  147. def test_previous_last_looping(self):
  148. items = [self.f.last()]
  149. for i in xrange(1, len(self.f)):
  150. items.append(self.f.previous())
  151. self.assertSetEquals(items, self.d.items())
  152. def test_first_while_deleting(self):
  153. # Test for bug 1725856
  154. self.assertTrue(len(self.d) >= 2, "test requires >=2 items")
  155. for _ in self.d:
  156. key = self.f.first()[0]
  157. del self.f[key]
  158. self.assertEqual([], self.f.items(), "expected empty db after test")
  159. def test_last_while_deleting(self):
  160. # Test for bug 1725856's evil twin
  161. self.assertTrue(len(self.d) >= 2, "test requires >=2 items")
  162. for _ in self.d:
  163. key = self.f.last()[0]
  164. del self.f[key]
  165. self.assertEqual([], self.f.items(), "expected empty db after test")
  166. def test_set_location(self):
  167. self.assertEqual(self.f.set_location('e'), ('e', self.d['e']))
  168. def test_contains(self):
  169. for k in self.d:
  170. self.assertIn(k, self.f)
  171. self.assertNotIn('not here', self.f)
  172. def test_has_key(self):
  173. for k in self.d:
  174. self.assertTrue(self.f.has_key(k))
  175. self.assertTrue(not self.f.has_key('not here'))
  176. def test_clear(self):
  177. self.f.clear()
  178. self.assertEqual(len(self.f), 0)
  179. def test__no_deadlock_first(self, debug=0):
  180. # do this so that testers can see what function we're in in
  181. # verbose mode when we deadlock.
  182. sys.stdout.flush()
  183. # in pybsddb's _DBWithCursor this causes an internal DBCursor
  184. # object is created. Other test_ methods in this class could
  185. # inadvertently cause the deadlock but an explicit test is needed.
  186. if debug: print "A"
  187. k,v = self.f.first()
  188. if debug: print "B", k
  189. self.f[k] = "deadlock. do not pass go. do not collect $200."
  190. if debug: print "C"
  191. # if the bsddb implementation leaves the DBCursor open during
  192. # the database write and locking+threading support is enabled
  193. # the cursor's read lock will deadlock the write lock request..
  194. # test the iterator interface
  195. if True:
  196. if debug: print "D"
  197. i = self.f.iteritems()
  198. k,v = i.next()
  199. if debug: print "E"
  200. self.f[k] = "please don't deadlock"
  201. if debug: print "F"
  202. while 1:
  203. try:
  204. k,v = i.next()
  205. except StopIteration:
  206. break
  207. if debug: print "F2"
  208. i = iter(self.f)
  209. if debug: print "G"
  210. while i:
  211. try:
  212. if debug: print "H"
  213. k = i.next()
  214. if debug: print "I"
  215. self.f[k] = "deadlocks-r-us"
  216. if debug: print "J"
  217. except StopIteration:
  218. i = None
  219. if debug: print "K"
  220. # test the legacy cursor interface mixed with writes
  221. self.assertIn(self.f.first()[0], self.d)
  222. k = self.f.next()[0]
  223. self.assertIn(k, self.d)
  224. self.f[k] = "be gone with ye deadlocks"
  225. self.assertTrue(self.f[k], "be gone with ye deadlocks")
  226. def test_for_cursor_memleak(self):
  227. # do the bsddb._DBWithCursor iterator internals leak cursors?
  228. nc1 = len(self.f._cursor_refs)
  229. # create iterator
  230. i = self.f.iteritems()
  231. nc2 = len(self.f._cursor_refs)
  232. # use the iterator (should run to the first yield, creating the cursor)
  233. k, v = i.next()
  234. nc3 = len(self.f._cursor_refs)
  235. # destroy the iterator; this should cause the weakref callback
  236. # to remove the cursor object from self.f._cursor_refs
  237. del i
  238. nc4 = len(self.f._cursor_refs)
  239. self.assertEqual(nc1, nc2)
  240. self.assertEqual(nc1, nc4)
  241. self.assertTrue(nc3 == nc1+1)
  242. def test_popitem(self):
  243. k, v = self.f.popitem()
  244. self.assertIn(k, self.d)
  245. self.assertIn(v, self.d.values())
  246. self.assertNotIn(k, self.f)
  247. self.assertEqual(len(self.d)-1, len(self.f))
  248. def test_pop(self):
  249. k = 'w'
  250. v = self.f.pop(k)
  251. self.assertEqual(v, self.d[k])
  252. self.assertNotIn(k, self.f)
  253. self.assertNotIn(v, self.f.values())
  254. self.assertEqual(len(self.d)-1, len(self.f))
  255. def test_get(self):
  256. self.assertEqual(self.f.get('NotHere'), None)
  257. self.assertEqual(self.f.get('NotHere', 'Default'), 'Default')
  258. self.assertEqual(self.f.get('q', 'Default'), self.d['q'])
  259. def test_setdefault(self):
  260. self.assertEqual(self.f.setdefault('new', 'dog'), 'dog')
  261. self.assertEqual(self.f.setdefault('r', 'cat'), self.d['r'])
  262. def test_update(self):
  263. new = dict(y='life', u='of', i='brian')
  264. self.f.update(new)
  265. self.d.update(new)
  266. for k, v in self.d.iteritems():
  267. self.assertEqual(self.f[k], v)
  268. def test_keyordering(self):
  269. if self.openmethod[0] is not bsddb.btopen:
  270. return
  271. keys = self.d.keys()
  272. keys.sort()
  273. self.assertEqual(self.f.first()[0], keys[0])
  274. self.assertEqual(self.f.next()[0], keys[1])
  275. self.assertEqual(self.f.last()[0], keys[-1])
  276. self.assertEqual(self.f.previous()[0], keys[-2])
  277. self.assertEqual(list(self.f), keys)
  278. class TestBTree(TestBSDDB):
  279. fname = test_support.TESTFN
  280. openmethod = [bsddb.btopen]
  281. class TestBTree_InMemory(TestBSDDB):
  282. fname = None
  283. openmethod = [bsddb.btopen]
  284. class TestBTree_InMemory_Truncate(TestBSDDB):
  285. fname = None
  286. openflag = 'n'
  287. openmethod = [bsddb.btopen]
  288. class TestHashTable(TestBSDDB):
  289. fname = test_support.TESTFN
  290. openmethod = [bsddb.hashopen]
  291. class TestHashTable_InMemory(TestBSDDB):
  292. fname = None
  293. openmethod = [bsddb.hashopen]
  294. ## # (bsddb.rnopen,'Record Numbers'), 'put' for RECNO for bsddb 1.85
  295. ## # appears broken... at least on
  296. ## # Solaris Intel - rmasse 1/97
  297. def test_main(verbose=None):
  298. test_support.run_unittest(
  299. TestBTree,
  300. TestHashTable,
  301. TestBTree_InMemory,
  302. TestHashTable_InMemory,
  303. TestBTree_InMemory_Truncate,
  304. )
  305. if __name__ == "__main__":
  306. test_main(verbose=True)