blob: bb49ffe2b200d3917e71c84c5eb8625878af56f2 [file] [log] [blame]
Roger E. Masse62a017c1996-12-17 19:54:27 +00001import gdbm
Brett Cannon4a6e8d62008-03-13 21:02:16 +00002import unittest
3import os
4from test.test_support import verbose, TESTFN, run_unittest, unlink
5
Roger E. Massefab8ab81996-12-20 22:36:52 +00006
Thomas Wouters110054c2007-02-25 22:12:31 +00007filename = TESTFN
Roger E. Masse62a017c1996-12-17 19:54:27 +00008
Brett Cannon4a6e8d62008-03-13 21:02:16 +00009class TestGdbm(unittest.TestCase):
Fred Drake004d5e62000-10-23 17:22:08 +000010
Brett Cannon4a6e8d62008-03-13 21:02:16 +000011 def setUp(self):
12 self.g = None
Roger E. Masse62a017c1996-12-17 19:54:27 +000013
Brett Cannon4a6e8d62008-03-13 21:02:16 +000014 def tearDown(self):
15 if self.g is not None:
16 self.g.close()
17 unlink(filename)
18
19 def test_key_methods(self):
20 self.g = gdbm.open(filename, 'c')
21 self.assertEqual(self.g.keys(), [])
22 self.g['a'] = 'b'
23 self.g['12345678910'] = '019237410982340912840198242'
24 key_set = set(self.g.keys())
25 self.assertEqual(key_set, frozenset(['a', '12345678910']))
26 self.assert_(self.g.has_key('a'))
27 key = self.g.firstkey()
28 while key:
29 self.assert_(key in key_set)
30 key_set.remove(key)
31 key = self.g.nextkey(key)
32 self.assertRaises(KeyError, lambda: self.g['xxx'])
33
34 def test_error_conditions(self):
35 # Try to open a non-existent database.
36 unlink(filename)
37 self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
38 self.assertRaises(gdbm.error, gdbm.open, filename, 'w')
39 # Try to access a closed database.
40 self.g = gdbm.open(filename, 'c')
41 self.g.close()
42 self.assertRaises(gdbm.error, lambda: self.g['a'])
43 # try pass an invalid open flag
44 self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
45
46 def test_flags(self):
47 # Test the flag parameter open() by trying all supported flag modes.
48 all = set(gdbm.open_flags)
49 # Test standard flags (presumably "crwn").
50 modes = all - set('fsu')
51 for mode in modes:
52 self.g = gdbm.open(filename, mode)
53 self.g.close()
54
55 # Test additional flags (presumably "fsu").
56 flags = all - set('crwn')
57 for mode in modes:
58 for flag in flags:
59 self.g = gdbm.open(filename, mode + flag)
60 self.g.close()
61
62 def test_reorganize(self):
63 self.g = gdbm.open(filename, 'c')
64 size0 = os.path.getsize(filename)
65
66 self.g['x'] = 'x' * 10000
67 size1 = os.path.getsize(filename)
68 self.assert_(size0 < size1)
69
70 del self.g['x']
71 # 'size' is supposed to be the same even after deleting an entry.
72 self.assertEqual(os.path.getsize(filename), size1)
73
74 self.g.reorganize()
75 size2 = os.path.getsize(filename)
76 self.assert_(size1 > size2 >= size0)
77
78
79def test_main():
80 run_unittest(TestGdbm)
81
82if __name__ == '__main__':
83 test_main()