|
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_close_twice(self): |
|
42 f = dumbdbm.open(_fname) |
|
43 f['a'] = 'b' |
|
44 self.assertEqual(f['a'], 'b') |
|
45 f.close() |
|
46 f.close() |
|
47 |
|
48 def test_dumbdbm_modification(self): |
|
49 self.init_db() |
|
50 f = dumbdbm.open(_fname, 'w') |
|
51 self._dict['g'] = f['g'] = "indented" |
|
52 self.read_helper(f) |
|
53 f.close() |
|
54 |
|
55 def test_dumbdbm_read(self): |
|
56 self.init_db() |
|
57 f = dumbdbm.open(_fname, 'r') |
|
58 self.read_helper(f) |
|
59 f.close() |
|
60 |
|
61 def test_dumbdbm_keys(self): |
|
62 self.init_db() |
|
63 f = dumbdbm.open(_fname) |
|
64 keys = self.keys_helper(f) |
|
65 f.close() |
|
66 |
|
67 def test_write_write_read(self): |
|
68 # test for bug #482460 |
|
69 f = dumbdbm.open(_fname) |
|
70 f['1'] = 'hello' |
|
71 f['1'] = 'hello2' |
|
72 f.close() |
|
73 f = dumbdbm.open(_fname) |
|
74 self.assertEqual(f['1'], 'hello2') |
|
75 f.close() |
|
76 |
|
77 def test_line_endings(self): |
|
78 # test for bug #1172763: dumbdbm would die if the line endings |
|
79 # weren't what was expected. |
|
80 f = dumbdbm.open(_fname) |
|
81 f['1'] = 'hello' |
|
82 f['2'] = 'hello2' |
|
83 f.close() |
|
84 |
|
85 # Mangle the file by adding \r before each newline |
|
86 data = open(_fname + '.dir').read() |
|
87 data = data.replace('\n', '\r\n') |
|
88 open(_fname + '.dir', 'wb').write(data) |
|
89 |
|
90 f = dumbdbm.open(_fname) |
|
91 self.assertEqual(f['1'], 'hello') |
|
92 self.assertEqual(f['2'], 'hello2') |
|
93 |
|
94 |
|
95 def read_helper(self, f): |
|
96 keys = self.keys_helper(f) |
|
97 for key in self._dict: |
|
98 self.assertEqual(self._dict[key], f[key]) |
|
99 |
|
100 def init_db(self): |
|
101 f = dumbdbm.open(_fname, 'w') |
|
102 for k in self._dict: |
|
103 f[k] = self._dict[k] |
|
104 f.close() |
|
105 |
|
106 def keys_helper(self, f): |
|
107 keys = f.keys() |
|
108 keys.sort() |
|
109 dkeys = self._dict.keys() |
|
110 dkeys.sort() |
|
111 self.assertEqual(keys, dkeys) |
|
112 return keys |
|
113 |
|
114 # Perform randomized operations. This doesn't make assumptions about |
|
115 # what *might* fail. |
|
116 def test_random(self): |
|
117 import random |
|
118 d = {} # mirror the database |
|
119 for dummy in range(5): |
|
120 f = dumbdbm.open(_fname) |
|
121 for dummy in range(100): |
|
122 k = random.choice('abcdefghijklm') |
|
123 if random.random() < 0.2: |
|
124 if k in d: |
|
125 del d[k] |
|
126 del f[k] |
|
127 else: |
|
128 v = random.choice('abc') * random.randrange(10000) |
|
129 d[k] = v |
|
130 f[k] = v |
|
131 self.assertEqual(f[k], v) |
|
132 f.close() |
|
133 |
|
134 f = dumbdbm.open(_fname) |
|
135 expected = d.items() |
|
136 expected.sort() |
|
137 got = f.items() |
|
138 got.sort() |
|
139 self.assertEqual(expected, got) |
|
140 f.close() |
|
141 |
|
142 def tearDown(self): |
|
143 _delete_files() |
|
144 |
|
145 def setUp(self): |
|
146 _delete_files() |
|
147 |
|
148 def test_main(): |
|
149 try: |
|
150 test_support.run_unittest(DumbDBMTestCase) |
|
151 finally: |
|
152 _delete_files() |
|
153 |
|
154 if __name__ == "__main__": |
|
155 test_main() |