| #! /usr/bin/env python | |
| """Test script for the dumbdbm module | |
| Original by Roger E. Masse | |
| """ | |
| import os | |
| import unittest | |
| import dumbdbm | |
| from test import test_support | |
| _fname = test_support.TESTFN | |
| def _delete_files(): | |
| for ext in [".dir", ".dat", ".bak"]: | |
| try: | |
| os.unlink(_fname + ext) | |
| except OSError: | |
| pass | |
| class DumbDBMTestCase(unittest.TestCase): | |
| _dict = {'0': '', | |
| 'a': 'Python:', | |
| 'b': 'Programming', | |
| 'c': 'the', | |
| 'd': 'way', | |
| 'f': 'Guido', | |
| 'g': 'intended' | |
| } | |
| def __init__(self, *args): | |
| unittest.TestCase.__init__(self, *args) | |
| def test_dumbdbm_creation(self): | |
| f = dumbdbm.open(_fname, 'c') | |
| self.assertEqual(f.keys(), []) | |
| for key in self._dict: | |
| f[key] = self._dict[key] | |
| self.read_helper(f) | |
| f.close() | |
| def test_dumbdbm_creation_mode(self): | |
| # On platforms without chmod, don't do anything. | |
| if not (hasattr(os, 'chmod') and hasattr(os, 'umask')): | |
| return | |
| try: | |
| old_umask = os.umask(0002) | |
| f = dumbdbm.open(_fname, 'c', 0637) | |
| f.close() | |
| finally: | |
| os.umask(old_umask) | |
| expected_mode = 0635 | |
| if os.name != 'posix': | |
| # Windows only supports setting the read-only attribute. | |
| # This shouldn't fail, but doesn't work like Unix either. | |
| expected_mode = 0666 | |
| import stat | |
| st = os.stat(_fname + '.dat') | |
| self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode) | |
| st = os.stat(_fname + '.dir') | |
| self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode) | |
| def test_close_twice(self): | |
| f = dumbdbm.open(_fname) | |
| f['a'] = 'b' | |
| self.assertEqual(f['a'], 'b') | |
| f.close() | |
| f.close() | |
| def test_dumbdbm_modification(self): | |
| self.init_db() | |
| f = dumbdbm.open(_fname, 'w') | |
| self._dict['g'] = f['g'] = "indented" | |
| self.read_helper(f) | |
| f.close() | |
| def test_dumbdbm_read(self): | |
| self.init_db() | |
| f = dumbdbm.open(_fname, 'r') | |
| self.read_helper(f) | |
| f.close() | |
| def test_dumbdbm_keys(self): | |
| self.init_db() | |
| f = dumbdbm.open(_fname) | |
| keys = self.keys_helper(f) | |
| f.close() | |
| def test_write_write_read(self): | |
| # test for bug #482460 | |
| f = dumbdbm.open(_fname) | |
| f['1'] = 'hello' | |
| f['1'] = 'hello2' | |
| f.close() | |
| f = dumbdbm.open(_fname) | |
| self.assertEqual(f['1'], 'hello2') | |
| f.close() | |
| def test_line_endings(self): | |
| # test for bug #1172763: dumbdbm would die if the line endings | |
| # weren't what was expected. | |
| f = dumbdbm.open(_fname) | |
| f['1'] = 'hello' | |
| f['2'] = 'hello2' | |
| f.close() | |
| # Mangle the file by adding \r before each newline | |
| data = open(_fname + '.dir').read() | |
| data = data.replace('\n', '\r\n') | |
| open(_fname + '.dir', 'wb').write(data) | |
| f = dumbdbm.open(_fname) | |
| self.assertEqual(f['1'], 'hello') | |
| self.assertEqual(f['2'], 'hello2') | |
| def read_helper(self, f): | |
| keys = self.keys_helper(f) | |
| for key in self._dict: | |
| self.assertEqual(self._dict[key], f[key]) | |
| def init_db(self): | |
| f = dumbdbm.open(_fname, 'w') | |
| for k in self._dict: | |
| f[k] = self._dict[k] | |
| f.close() | |
| def keys_helper(self, f): | |
| keys = f.keys() | |
| keys.sort() | |
| dkeys = self._dict.keys() | |
| dkeys.sort() | |
| self.assertEqual(keys, dkeys) | |
| return keys | |
| # Perform randomized operations. This doesn't make assumptions about | |
| # what *might* fail. | |
| def test_random(self): | |
| import random | |
| d = {} # mirror the database | |
| for dummy in range(5): | |
| f = dumbdbm.open(_fname) | |
| for dummy in range(100): | |
| k = random.choice('abcdefghijklm') | |
| if random.random() < 0.2: | |
| if k in d: | |
| del d[k] | |
| del f[k] | |
| else: | |
| v = random.choice('abc') * random.randrange(10000) | |
| d[k] = v | |
| f[k] = v | |
| self.assertEqual(f[k], v) | |
| f.close() | |
| f = dumbdbm.open(_fname) | |
| expected = d.items() | |
| expected.sort() | |
| got = f.items() | |
| got.sort() | |
| self.assertEqual(expected, got) | |
| f.close() | |
| def tearDown(self): | |
| _delete_files() | |
| def setUp(self): | |
| _delete_files() | |
| def test_main(): | |
| try: | |
| test_support.run_unittest(DumbDBMTestCase) | |
| finally: | |
| _delete_files() | |
| if __name__ == "__main__": | |
| test_main() |