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