test_gdbm.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import unittest
  2. import os
  3. from test.test_support import TESTFN, run_unittest, unlink, import_module
  4. gdbm = import_module('gdbm')
  5. filename = TESTFN
  6. class TestGdbm(unittest.TestCase):
  7. def setUp(self):
  8. self.g = None
  9. def tearDown(self):
  10. if self.g is not None:
  11. self.g.close()
  12. unlink(filename)
  13. def test_key_methods(self):
  14. self.g = gdbm.open(filename, 'c')
  15. self.assertEqual(self.g.keys(), [])
  16. self.g['a'] = 'b'
  17. self.g['12345678910'] = '019237410982340912840198242'
  18. key_set = set(self.g.keys())
  19. self.assertEqual(key_set, frozenset(['a', '12345678910']))
  20. self.assertTrue(self.g.has_key('a'))
  21. key = self.g.firstkey()
  22. while key:
  23. self.assertIn(key, key_set)
  24. key_set.remove(key)
  25. key = self.g.nextkey(key)
  26. self.assertRaises(KeyError, lambda: self.g['xxx'])
  27. def test_error_conditions(self):
  28. # Try to open a non-existent database.
  29. unlink(filename)
  30. self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
  31. # Try to access a closed database.
  32. self.g = gdbm.open(filename, 'c')
  33. self.g.close()
  34. self.assertRaises(gdbm.error, lambda: self.g['a'])
  35. # try pass an invalid open flag
  36. self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
  37. def test_flags(self):
  38. # Test the flag parameter open() by trying all supported flag modes.
  39. all = set(gdbm.open_flags)
  40. # Test standard flags (presumably "crwn").
  41. modes = all - set('fsu')
  42. for mode in sorted(modes):
  43. self.g = gdbm.open(filename, mode)
  44. self.g.close()
  45. # Test additional flags (presumably "fsu").
  46. flags = all - set('crwn')
  47. for mode in modes:
  48. for flag in flags:
  49. self.g = gdbm.open(filename, mode + flag)
  50. self.g.close()
  51. def test_reorganize(self):
  52. self.g = gdbm.open(filename, 'c')
  53. size0 = os.path.getsize(filename)
  54. self.g['x'] = 'x' * 10000
  55. size1 = os.path.getsize(filename)
  56. self.assertTrue(size0 < size1)
  57. del self.g['x']
  58. # 'size' is supposed to be the same even after deleting an entry.
  59. self.assertEqual(os.path.getsize(filename), size1)
  60. self.g.reorganize()
  61. size2 = os.path.getsize(filename)
  62. self.assertTrue(size1 > size2 >= size0)
  63. def test_main():
  64. run_unittest(TestGdbm)
  65. if __name__ == '__main__':
  66. test_main()