blob: bf6294685a319a022e82ecfa42b230aed6b1b1f7 [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
Ezio Melottif79493b2013-03-01 11:23:28 +02005from test.support import verbose, TESTFN, 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']))
Benjamin Peterson577473f2010-01-19 00:09:57 +000027 self.assertIn(b'a', 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:
Benjamin Peterson577473f2010-01-19 00:09:57 +000031 self.assertIn(key, key_set)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000032 key_set.remove(key)
33 key = self.g.nextkey(key)
34 self.assertRaises(KeyError, lambda: self.g['xxx'])
Georg Brandld9e833c2010-12-04 09:14:36 +000035 # get() and setdefault() work as in the dict interface
36 self.assertEqual(self.g.get(b'xxx', b'foo'), b'foo')
37 self.assertEqual(self.g.setdefault(b'xxx', b'foo'), b'foo')
38 self.assertEqual(self.g[b'xxx'], b'foo')
Christian Heimesdd15f6c2008-03-16 00:07:10 +000039
40 def test_error_conditions(self):
41 # Try to open a non-existent database.
42 unlink(filename)
43 self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
44 # Try to access a closed database.
45 self.g = gdbm.open(filename, 'c')
46 self.g.close()
47 self.assertRaises(gdbm.error, lambda: self.g['a'])
48 # try pass an invalid open flag
49 self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
50
51 def test_flags(self):
52 # Test the flag parameter open() by trying all supported flag modes.
53 all = set(gdbm.open_flags)
54 # Test standard flags (presumably "crwn").
55 modes = all - set('fsu')
Georg Brandl16684eb2012-02-20 22:48:06 +010056 for mode in sorted(modes): # put "c" mode first
Christian Heimesdd15f6c2008-03-16 00:07:10 +000057 self.g = gdbm.open(filename, mode)
58 self.g.close()
59
60 # Test additional flags (presumably "fsu").
61 flags = all - set('crwn')
62 for mode in modes:
63 for flag in flags:
64 self.g = gdbm.open(filename, mode + flag)
65 self.g.close()
66
67 def test_reorganize(self):
68 self.g = gdbm.open(filename, 'c')
69 size0 = os.path.getsize(filename)
70
71 self.g['x'] = 'x' * 10000
72 size1 = os.path.getsize(filename)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000073 self.assertTrue(size0 < size1)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000074
75 del self.g['x']
76 # 'size' is supposed to be the same even after deleting an entry.
77 self.assertEqual(os.path.getsize(filename), size1)
78
79 self.g.reorganize()
80 size2 = os.path.getsize(filename)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000081 self.assertTrue(size1 > size2 >= size0)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000082
83
Christian Heimesdd15f6c2008-03-16 00:07:10 +000084if __name__ == '__main__':
Ezio Melottif79493b2013-03-01 11:23:28 +020085 unittest.main()