test_dbm_gnu.py 2.81 KB
Newer Older
1 2
from test import support
gdbm = support.import_module("dbm.gnu") #skip if not supported
Christian Heimes's avatar
Christian Heimes committed
3 4
import unittest
import os
5
from test.support import verbose, TESTFN, unlink
Christian Heimes's avatar
Christian Heimes committed
6

7

8
filename = TESTFN
9

Christian Heimes's avatar
Christian Heimes committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23
class TestGdbm(unittest.TestCase):
    def setUp(self):
        self.g = None

    def tearDown(self):
        if self.g is not None:
            self.g.close()
        unlink(filename)

    def test_key_methods(self):
        self.g = gdbm.open(filename, 'c')
        self.assertEqual(self.g.keys(), [])
        self.g['a'] = 'b'
        self.g['12345678910'] = '019237410982340912840198242'
24
        self.g[b'bytes'] = b'data'
Christian Heimes's avatar
Christian Heimes committed
25
        key_set = set(self.g.keys())
26
        self.assertEqual(key_set, set([b'a', b'bytes', b'12345678910']))
27
        self.assertIn(b'a', self.g)
28
        self.assertEqual(self.g[b'bytes'], b'data')
Christian Heimes's avatar
Christian Heimes committed
29 30
        key = self.g.firstkey()
        while key:
31
            self.assertIn(key, key_set)
Christian Heimes's avatar
Christian Heimes committed
32 33 34
            key_set.remove(key)
            key = self.g.nextkey(key)
        self.assertRaises(KeyError, lambda: self.g['xxx'])
35 36 37 38
        # get() and setdefault() work as in the dict interface
        self.assertEqual(self.g.get(b'xxx', b'foo'), b'foo')
        self.assertEqual(self.g.setdefault(b'xxx', b'foo'), b'foo')
        self.assertEqual(self.g[b'xxx'], b'foo')
Christian Heimes's avatar
Christian Heimes committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

    def test_error_conditions(self):
        # Try to open a non-existent database.
        unlink(filename)
        self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
        # Try to access a closed database.
        self.g = gdbm.open(filename, 'c')
        self.g.close()
        self.assertRaises(gdbm.error, lambda: self.g['a'])
        # try pass an invalid open flag
        self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())

    def test_flags(self):
        # Test the flag parameter open() by trying all supported flag modes.
        all = set(gdbm.open_flags)
        # Test standard flags (presumably "crwn").
        modes = all - set('fsu')
56
        for mode in sorted(modes):  # put "c" mode first
Christian Heimes's avatar
Christian Heimes committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
            self.g = gdbm.open(filename, mode)
            self.g.close()

        # Test additional flags (presumably "fsu").
        flags = all - set('crwn')
        for mode in modes:
            for flag in flags:
                self.g = gdbm.open(filename, mode + flag)
                self.g.close()

    def test_reorganize(self):
        self.g = gdbm.open(filename, 'c')
        size0 = os.path.getsize(filename)

        self.g['x'] = 'x' * 10000
        size1 = os.path.getsize(filename)
73
        self.assertTrue(size0 < size1)
Christian Heimes's avatar
Christian Heimes committed
74 75 76 77 78 79 80

        del self.g['x']
        # 'size' is supposed to be the same even after deleting an entry.
        self.assertEqual(os.path.getsize(filename), size1)

        self.g.reorganize()
        size2 = os.path.getsize(filename)
81
        self.assertTrue(size1 > size2 >= size0)
Christian Heimes's avatar
Christian Heimes committed
82 83 84


if __name__ == '__main__':
85
    unittest.main()