#! /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() |