blob: 0049aaac80cc504e1e364b43183b02c854cce00f [file] [log] [blame]
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001import dbm.gnu as gdbm
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002import unittest
3import os
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test.support import verbose, TESTFN, run_unittest, unlink
Christian Heimesdd15f6c2008-03-16 00:07:10 +00005
Roger E. Massefab8ab81996-12-20 22:36:52 +00006
Guido van Rossumf35ad332006-08-25 23:40:32 +00007filename = TESTFN
Roger E. Masse62a017c1996-12-17 19:54:27 +00008
Christian Heimesdd15f6c2008-03-16 00:07:10 +00009class TestGdbm(unittest.TestCase):
10 def setUp(self):
11 self.g = None
Fred Drake004d5e62000-10-23 17:22:08 +000012
Christian Heimesdd15f6c2008-03-16 00:07:10 +000013 def tearDown(self):
14 if self.g is not None:
15 self.g.close()
16 unlink(filename)
Roger E. Masse62a017c1996-12-17 19:54:27 +000017
Christian Heimesdd15f6c2008-03-16 00:07:10 +000018 def test_key_methods(self):
19 self.g = gdbm.open(filename, 'c')
20 self.assertEqual(self.g.keys(), [])
21 self.g['a'] = 'b'
22 self.g['12345678910'] = '019237410982340912840198242'
Brett Cannon7317c1e2008-11-25 19:19:17 +000023 self.g[b'bytes'] = b'data'
Christian Heimesdd15f6c2008-03-16 00:07:10 +000024 key_set = set(self.g.keys())
25 self.assertEqual(key_set, set([b'a', b'12345678910']))
26 self.assert_(b'a' in self.g)
Brett Cannon7317c1e2008-11-25 19:19:17 +000027 self.assertEqual(self.g[b'bytes'], b'data')
Christian Heimesdd15f6c2008-03-16 00:07:10 +000028 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')
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()