blob: 131d22b16b3effcce6151e449ceac8fa51a34839 [file] [log] [blame]
Brett Cannon4a6e8d62008-03-13 21:02:16 +00001import unittest
2import os
R. David Murray3db8a342009-03-30 23:05:48 +00003from test.test_support import (verbose, TESTFN, run_unittest, unlink,
4 import_module)
5gdbm = import_module('gdbm')
Brett Cannon4a6e8d62008-03-13 21:02:16 +00006
Roger E. Massefab8ab81996-12-20 22:36:52 +00007
Thomas Wouters110054c2007-02-25 22:12:31 +00008filename = TESTFN
Roger E. Masse62a017c1996-12-17 19:54:27 +00009
Brett Cannon4a6e8d62008-03-13 21:02:16 +000010class TestGdbm(unittest.TestCase):
Fred Drake004d5e62000-10-23 17:22:08 +000011
Brett Cannon4a6e8d62008-03-13 21:02:16 +000012 def setUp(self):
13 self.g = None
Roger E. Masse62a017c1996-12-17 19:54:27 +000014
Brett Cannon4a6e8d62008-03-13 21:02:16 +000015 def tearDown(self):
16 if self.g is not None:
17 self.g.close()
18 unlink(filename)
19
20 def test_key_methods(self):
21 self.g = gdbm.open(filename, 'c')
22 self.assertEqual(self.g.keys(), [])
23 self.g['a'] = 'b'
24 self.g['12345678910'] = '019237410982340912840198242'
25 key_set = set(self.g.keys())
26 self.assertEqual(key_set, frozenset(['a', '12345678910']))
27 self.assert_(self.g.has_key('a'))
28 key = self.g.firstkey()
29 while key:
30 self.assert_(key in key_set)
31 key_set.remove(key)
32 key = self.g.nextkey(key)
33 self.assertRaises(KeyError, lambda: self.g['xxx'])
34
35 def test_error_conditions(self):
36 # Try to open a non-existent database.
37 unlink(filename)
38 self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
Brett Cannon4a6e8d62008-03-13 21:02:16 +000039 # 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()