1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#! /usr/bin/env python
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""Test script for the dumbdbm module
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh   Original by Roger E. Masse
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport dumbdbm
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh_fname = test_support.TESTFN
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _delete_files():
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    for ext in [".dir", ".dat", ".bak"]:
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            os.unlink(_fname + ext)
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except OSError:
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass DumbDBMTestCase(unittest.TestCase):
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    _dict = {'0': '',
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'a': 'Python:',
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'b': 'Programming',
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'c': 'the',
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'd': 'way',
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'f': 'Guido',
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             'g': 'intended'
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             }
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, *args):
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        unittest.TestCase.__init__(self, *args)
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dumbdbm_creation(self):
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname, 'c')
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(f.keys(), [])
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for key in self._dict:
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f[key] = self._dict[key]
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.read_helper(f)
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dumbdbm_creation_mode(self):
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # On platforms without chmod, don't do anything.
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not (hasattr(os, 'chmod') and hasattr(os, 'umask')):
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            old_umask = os.umask(0002)
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f = dumbdbm.open(_fname, 'c', 0637)
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f.close()
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        finally:
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            os.umask(old_umask)
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected_mode = 0635
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if os.name != 'posix':
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # Windows only supports setting the read-only attribute.
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # This shouldn't fail, but doesn't work like Unix either.
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected_mode = 0666
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import stat
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        st = os.stat(_fname + '.dat')
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        st = os.stat(_fname + '.dir')
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_close_twice(self):
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f['a'] = 'b'
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(f['a'], 'b')
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dumbdbm_modification(self):
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.init_db()
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname, 'w')
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._dict['g'] = f['g'] = "indented"
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.read_helper(f)
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dumbdbm_read(self):
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.init_db()
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname, 'r')
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.read_helper(f)
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dumbdbm_keys(self):
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.init_db()
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        keys = self.keys_helper(f)
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_write_write_read(self):
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test for bug #482460
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f['1'] = 'hello'
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f['1'] = 'hello2'
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(f['1'], 'hello2')
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_line_endings(self):
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # test for bug #1172763: dumbdbm would die if the line endings
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # weren't what was expected.
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f['1'] = 'hello'
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f['2'] = 'hello2'
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Mangle the file by adding \r before each newline
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        data = open(_fname + '.dir').read()
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        data = data.replace('\n', '\r\n')
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        open(_fname + '.dir', 'wb').write(data)
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname)
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(f['1'], 'hello')
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(f['2'], 'hello2')
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def read_helper(self, f):
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        keys = self.keys_helper(f)
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for key in self._dict:
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(self._dict[key], f[key])
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def init_db(self):
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f = dumbdbm.open(_fname, 'w')
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for k in self._dict:
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f[k] = self._dict[k]
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        f.close()
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def keys_helper(self, f):
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        keys = f.keys()
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        keys.sort()
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        dkeys = self._dict.keys()
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        dkeys.sort()
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(keys, dkeys)
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return keys
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Perform randomized operations.  This doesn't make assumptions about
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # what *might* fail.
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_random(self):
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import random
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = {}  # mirror the database
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for dummy in range(5):
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f = dumbdbm.open(_fname)
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for dummy in range(100):
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                k = random.choice('abcdefghijklm')
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if random.random() < 0.2:
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if k in d:
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        del d[k]
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        del f[k]
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                else:
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    v = random.choice('abc') * random.randrange(10000)
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    d[k] = v
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    f[k] = v
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.assertEqual(f[k], v)
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f.close()
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f = dumbdbm.open(_fname)
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = d.items()
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected.sort()
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            got = f.items()
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            got.sort()
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(expected, got)
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f.close()
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def tearDown(self):
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        _delete_files()
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        _delete_files()
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    try:
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        test_support.run_unittest(DumbDBMTestCase)
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    finally:
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        _delete_files()
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__":
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
180