blob: e9169a24e7ea7696ed6160dadf7bcd8573f18874 [file] [log] [blame]
Brett Cannon4a6e8d62008-03-13 21:02:16 +00001import unittest
2import os
Georg Brandla4f46e12010-02-07 17:03:15 +00003from test.test_support import TESTFN, run_unittest, unlink, import_module
R. David Murray3db8a342009-03-30 23:05:48 +00004gdbm = import_module('gdbm')
Brett Cannon4a6e8d62008-03-13 21:02:16 +00005
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']))
Benjamin Peterson5c8da862009-06-30 22:57:08 +000026 self.assertTrue(self.g.has_key('a'))
Brett Cannon4a6e8d62008-03-13 21:02:16 +000027 key = self.g.firstkey()
28 while key:
Ezio Melottiaa980582010-01-23 23:04:36 +000029 self.assertIn(key, key_set)
Brett Cannon4a6e8d62008-03-13 21:02:16 +000030 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')
Brett Cannon4a6e8d62008-03-13 21:02:16 +000038 # Try to access a closed database.
39 self.g = gdbm.open(filename, 'c')
40 self.g.close()
41 self.assertRaises(gdbm.error, lambda: self.g['a'])
42 # try pass an invalid open flag
43 self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
44
45 def test_flags(self):
46 # Test the flag parameter open() by trying all supported flag modes.
47 all = set(gdbm.open_flags)
48 # Test standard flags (presumably "crwn").
49 modes = all - set('fsu')
Benjamin Peterson5bc92e02012-02-20 21:47:54 -050050 for mode in sorted(modes):
Brett Cannon4a6e8d62008-03-13 21:02:16 +000051 self.g = gdbm.open(filename, mode)
52 self.g.close()
53
54 # Test additional flags (presumably "fsu").
55 flags = all - set('crwn')
56 for mode in modes:
57 for flag in flags:
58 self.g = gdbm.open(filename, mode + flag)
59 self.g.close()
60
61 def test_reorganize(self):
62 self.g = gdbm.open(filename, 'c')
63 size0 = os.path.getsize(filename)
64
65 self.g['x'] = 'x' * 10000
66 size1 = os.path.getsize(filename)
Benjamin Peterson5c8da862009-06-30 22:57:08 +000067 self.assertTrue(size0 < size1)
Brett Cannon4a6e8d62008-03-13 21:02:16 +000068
69 del self.g['x']
70 # 'size' is supposed to be the same even after deleting an entry.
71 self.assertEqual(os.path.getsize(filename), size1)
72
73 self.g.reorganize()
74 size2 = os.path.getsize(filename)
Benjamin Peterson5c8da862009-06-30 22:57:08 +000075 self.assertTrue(size1 > size2 >= size0)
Brett Cannon4a6e8d62008-03-13 21:02:16 +000076
77
78def test_main():
79 run_unittest(TestGdbm)
80
81if __name__ == '__main__':
82 test_main()