blob: 857aeb1acca62869308ca2428af78f8a45bdf4d1 [file] [log] [blame]
Kristján Valur Jónsson42a40c52009-04-01 11:28:47 +00001from test import support
2gdbm = support.import_module("dbm.gnu") #skip if not supported
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003import unittest
4import os
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test.support import verbose, TESTFN, run_unittest, unlink
Christian Heimesdd15f6c2008-03-16 00:07:10 +00006
Roger E. Massefab8ab81996-12-20 22:36:52 +00007
Guido van Rossumf35ad332006-08-25 23:40:32 +00008filename = TESTFN
Roger E. Masse62a017c1996-12-17 19:54:27 +00009
Christian Heimesdd15f6c2008-03-16 00:07:10 +000010class TestGdbm(unittest.TestCase):
11 def setUp(self):
12 self.g = None
Fred Drake004d5e62000-10-23 17:22:08 +000013
Christian Heimesdd15f6c2008-03-16 00:07:10 +000014 def tearDown(self):
15 if self.g is not None:
16 self.g.close()
17 unlink(filename)
Roger E. Masse62a017c1996-12-17 19:54:27 +000018
Christian Heimesdd15f6c2008-03-16 00:07:10 +000019 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'
Brett Cannon7317c1e2008-11-25 19:19:17 +000024 self.g[b'bytes'] = b'data'
Christian Heimesdd15f6c2008-03-16 00:07:10 +000025 key_set = set(self.g.keys())
Brett Cannon45dea652008-11-25 21:27:00 +000026 self.assertEqual(key_set, set([b'a', b'bytes', b'12345678910']))
Christian Heimesdd15f6c2008-03-16 00:07:10 +000027 self.assert_(b'a' in self.g)
Brett Cannon7317c1e2008-11-25 19:19:17 +000028 self.assertEqual(self.g[b'bytes'], b'data')
Christian Heimesdd15f6c2008-03-16 00:07:10 +000029 key = self.g.firstkey()
30 while key:
31 self.assert_(key in key_set)
32 key_set.remove(key)
33 key = self.g.nextkey(key)
34 self.assertRaises(KeyError, lambda: self.g['xxx'])
35
36 def test_error_conditions(self):
37 # Try to open a non-existent database.
38 unlink(filename)
39 self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
40 # Try to access a closed database.
41 self.g = gdbm.open(filename, 'c')
42 self.g.close()
43 self.assertRaises(gdbm.error, lambda: self.g['a'])
44 # try pass an invalid open flag
45 self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
46
47 def test_flags(self):
48 # Test the flag parameter open() by trying all supported flag modes.
49 all = set(gdbm.open_flags)
50 # Test standard flags (presumably "crwn").
51 modes = all - set('fsu')
52 for mode in modes:
53 self.g = gdbm.open(filename, mode)
54 self.g.close()
55
56 # Test additional flags (presumably "fsu").
57 flags = all - set('crwn')
58 for mode in modes:
59 for flag in flags:
60 self.g = gdbm.open(filename, mode + flag)
61 self.g.close()
62
63 def test_reorganize(self):
64 self.g = gdbm.open(filename, 'c')
65 size0 = os.path.getsize(filename)
66
67 self.g['x'] = 'x' * 10000
68 size1 = os.path.getsize(filename)
69 self.assert_(size0 < size1)
70
71 del self.g['x']
72 # 'size' is supposed to be the same even after deleting an entry.
73 self.assertEqual(os.path.getsize(filename), size1)
74
75 self.g.reorganize()
76 size2 = os.path.getsize(filename)
77 self.assert_(size1 > size2 >= size0)
78
79
80def test_main():
81 run_unittest(TestGdbm)
82
83if __name__ == '__main__':
84 test_main()