test_shelve.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import os
  2. import unittest
  3. import shelve
  4. import glob
  5. from test import test_support
  6. test_support.import_module('anydbm', deprecated=True)
  7. class TestCase(unittest.TestCase):
  8. fn = "shelftemp" + os.extsep + "db"
  9. def test_close(self):
  10. d1 = {}
  11. s = shelve.Shelf(d1, protocol=2, writeback=False)
  12. s['key1'] = [1,2,3,4]
  13. self.assertEqual(s['key1'], [1,2,3,4])
  14. self.assertEqual(len(s), 1)
  15. s.close()
  16. self.assertRaises(ValueError, len, s)
  17. try:
  18. s['key1']
  19. except ValueError:
  20. pass
  21. else:
  22. self.fail('Closed shelf should not find a key')
  23. def test_ascii_file_shelf(self):
  24. try:
  25. s = shelve.open(self.fn, protocol=0)
  26. s['key1'] = (1,2,3,4)
  27. self.assertEqual(s['key1'], (1,2,3,4))
  28. s.close()
  29. finally:
  30. for f in glob.glob(self.fn+"*"):
  31. os.unlink(f)
  32. def test_binary_file_shelf(self):
  33. try:
  34. s = shelve.open(self.fn, protocol=1)
  35. s['key1'] = (1,2,3,4)
  36. self.assertEqual(s['key1'], (1,2,3,4))
  37. s.close()
  38. finally:
  39. for f in glob.glob(self.fn+"*"):
  40. os.unlink(f)
  41. def test_proto2_file_shelf(self):
  42. try:
  43. s = shelve.open(self.fn, protocol=2)
  44. s['key1'] = (1,2,3,4)
  45. self.assertEqual(s['key1'], (1,2,3,4))
  46. s.close()
  47. finally:
  48. for f in glob.glob(self.fn+"*"):
  49. os.unlink(f)
  50. def test_in_memory_shelf(self):
  51. d1 = {}
  52. s = shelve.Shelf(d1, protocol=0)
  53. s['key1'] = (1,2,3,4)
  54. self.assertEqual(s['key1'], (1,2,3,4))
  55. s.close()
  56. d2 = {}
  57. s = shelve.Shelf(d2, protocol=1)
  58. s['key1'] = (1,2,3,4)
  59. self.assertEqual(s['key1'], (1,2,3,4))
  60. s.close()
  61. self.assertEqual(len(d1), 1)
  62. self.assertNotEqual(d1, d2)
  63. def test_mutable_entry(self):
  64. d1 = {}
  65. s = shelve.Shelf(d1, protocol=2, writeback=False)
  66. s['key1'] = [1,2,3,4]
  67. self.assertEqual(s['key1'], [1,2,3,4])
  68. s['key1'].append(5)
  69. self.assertEqual(s['key1'], [1,2,3,4])
  70. s.close()
  71. d2 = {}
  72. s = shelve.Shelf(d2, protocol=2, writeback=True)
  73. s['key1'] = [1,2,3,4]
  74. self.assertEqual(s['key1'], [1,2,3,4])
  75. s['key1'].append(5)
  76. self.assertEqual(s['key1'], [1,2,3,4,5])
  77. s.close()
  78. self.assertEqual(len(d1), 1)
  79. self.assertEqual(len(d2), 1)
  80. def test_writeback_also_writes_immediately(self):
  81. # Issue 5754
  82. d = {}
  83. s = shelve.Shelf(d, writeback=True)
  84. s['key'] = [1]
  85. p1 = d['key'] # Will give a KeyError if backing store not updated
  86. s['key'].append(2)
  87. s.close()
  88. p2 = d['key']
  89. self.assertNotEqual(p1, p2) # Write creates new object in store
  90. from test import mapping_tests
  91. class TestShelveBase(mapping_tests.BasicTestMappingProtocol):
  92. fn = "shelftemp.db"
  93. counter = 0
  94. def __init__(self, *args, **kw):
  95. self._db = []
  96. mapping_tests.BasicTestMappingProtocol.__init__(self, *args, **kw)
  97. type2test = shelve.Shelf
  98. def _reference(self):
  99. return {"key1":"value1", "key2":2, "key3":(1,2,3)}
  100. def _empty_mapping(self):
  101. if self._in_mem:
  102. x= shelve.Shelf({}, **self._args)
  103. else:
  104. self.counter+=1
  105. x= shelve.open(self.fn+str(self.counter), **self._args)
  106. self._db.append(x)
  107. return x
  108. def tearDown(self):
  109. for db in self._db:
  110. db.close()
  111. self._db = []
  112. if not self._in_mem:
  113. for f in glob.glob(self.fn+"*"):
  114. test_support.unlink(f)
  115. class TestAsciiFileShelve(TestShelveBase):
  116. _args={'protocol':0}
  117. _in_mem = False
  118. class TestBinaryFileShelve(TestShelveBase):
  119. _args={'protocol':1}
  120. _in_mem = False
  121. class TestProto2FileShelve(TestShelveBase):
  122. _args={'protocol':2}
  123. _in_mem = False
  124. class TestAsciiMemShelve(TestShelveBase):
  125. _args={'protocol':0}
  126. _in_mem = True
  127. class TestBinaryMemShelve(TestShelveBase):
  128. _args={'protocol':1}
  129. _in_mem = True
  130. class TestProto2MemShelve(TestShelveBase):
  131. _args={'protocol':2}
  132. _in_mem = True
  133. def test_main():
  134. test_support.run_unittest(
  135. TestAsciiFileShelve,
  136. TestBinaryFileShelve,
  137. TestProto2FileShelve,
  138. TestAsciiMemShelve,
  139. TestBinaryMemShelve,
  140. TestProto2MemShelve,
  141. TestCase
  142. )
  143. if __name__ == "__main__":
  144. test_main()