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