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() 180