14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import TESTFN, run_unittest, unlink, import_module
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaogdbm = import_module('gdbm')
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofilename = TESTFN
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestGdbm(unittest.TestCase):
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g = None
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.g is not None:
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.g.close()
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unlink(filename)
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_key_methods(self):
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g = gdbm.open(filename, 'c')
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.g.keys(), [])
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g['a'] = 'b'
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g['12345678910'] = '019237410982340912840198242'
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key_set = set(self.g.keys())
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(key_set, frozenset(['a', '12345678910']))
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(self.g.has_key('a'))
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key = self.g.firstkey()
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while key:
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(key, key_set)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key_set.remove(key)
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key = self.g.nextkey(key)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, lambda: self.g['xxx'])
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_error_conditions(self):
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Try to open a non-existent database.
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unlink(filename)
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Try to access a closed database.
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g = gdbm.open(filename, 'c')
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g.close()
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(gdbm.error, lambda: self.g['a'])
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # try pass an invalid open flag
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_flags(self):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test the flag parameter open() by trying all supported flag modes.
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        all = set(gdbm.open_flags)
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test standard flags (presumably "crwn").
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        modes = all - set('fsu')
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for mode in sorted(modes):
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.g = gdbm.open(filename, mode)
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.g.close()
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test additional flags (presumably "fsu").
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags = all - set('crwn')
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for mode in modes:
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for flag in flags:
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.g = gdbm.open(filename, mode + flag)
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.g.close()
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_reorganize(self):
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g = gdbm.open(filename, 'c')
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        size0 = os.path.getsize(filename)
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g['x'] = 'x' * 10000
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        size1 = os.path.getsize(filename)
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(size0 < size1)
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self.g['x']
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 'size' is supposed to be the same even after deleting an entry.
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(os.path.getsize(filename), size1)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.g.reorganize()
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        size2 = os.path.getsize(filename)
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(size1 > size2 >= size0)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(TestGdbm)
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
83