Commit | Line | Data |
---|---|---|
920dae64 AT |
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() |