2
"""Test script for the dbm.open function based on testdumbdbm.py"""
10
_fname = test.support.TESTFN
13
# Iterates over every database module supported by dbm currently available,
14
# setting dbm to use each in turn, and yielding that module
17
for name in dbm._names:
19
mod = __import__(name, fromlist=['open'])
22
dbm._modules[name] = mod
26
# Clean up all scratch databases we might have created during testing
29
# we don't know the precise name the underlying database uses
30
# so we use glob to locate all names
31
for f in glob.glob(_fname + "*"):
32
test.support.unlink(f)
35
class AnyDBMTestCase(unittest.TestCase):
46
f = dbm.open(_fname, 'n')
48
f[k.encode("ascii")] = self._dict[k]
51
def keys_helper(self, f):
52
keys = sorted(k.decode("ascii") for k in f.keys())
53
dkeys = sorted(self._dict.keys())
54
self.assertEqual(keys, dkeys)
58
self.assert_(issubclass(self.module.error, IOError))
60
def test_anydbm_not_existing(self):
61
self.assertRaises(dbm.error, dbm.open, _fname)
63
def test_anydbm_creation(self):
64
f = dbm.open(_fname, 'c')
65
self.assertEqual(list(f.keys()), [])
66
for key in self._dict:
67
f[key.encode("ascii")] = self._dict[key]
71
def test_anydbm_modification(self):
73
f = dbm.open(_fname, 'c')
74
self._dict['g'] = f[b'g'] = b"indented"
78
def test_anydbm_read(self):
80
f = dbm.open(_fname, 'r')
84
def test_anydbm_keys(self):
86
f = dbm.open(_fname, 'r')
87
keys = self.keys_helper(f)
90
def test_anydbm_access(self):
92
f = dbm.open(_fname, 'r')
93
key = "a".encode("ascii")
95
assert(f[key] == b"Python:")
98
def read_helper(self, f):
99
keys = self.keys_helper(f)
100
for key in self._dict:
101
self.assertEqual(self._dict[key], f[key.encode("ascii")])
107
dbm._defaultmod = self.module
111
class WhichDBTestCase(unittest.TestCase):
112
# Actual test methods are added to namespace after class definition.
113
def __init__(self, *args):
114
unittest.TestCase.__init__(self, *args)
116
def test_whichdb(self):
117
for module in dbm_iterator():
118
# Check whether whichdb correctly guesses module name
119
# for databases opened with "module" module.
120
# Try with empty files first
121
name = module.__name__
122
if name == 'dbm.dumb':
123
continue # whichdb can't support dbm.dumb
124
test.support.unlink(_fname)
125
f = module.open(_fname, 'c')
127
self.assertEqual(name, dbm.whichdb(_fname))
129
f = module.open(_fname, 'w')
131
# and test that we can find it
132
self.assertTrue(b"1" in f)
134
self.assertTrue(f[b"1"] == b"1")
136
self.assertEqual(name, dbm.whichdb(_fname))
143
self.filename = test.support.TESTFN
144
self.d = dbm.open(self.filename, 'c')
148
self.d = dbm.open(self.filename, 'c')
149
self.assertEqual(self.d.keys(), [])
150
a = [(b'a', b'b'), (b'12345678910', b'019237410982340912840198242')]
153
self.assertEqual(sorted(self.d.keys()), sorted(k for (k, v) in a))
155
self.assert_(k in self.d)
156
self.assertEqual(self.d[k], v)
157
self.assert_(b'xxx' not in self.d)
158
self.assertRaises(KeyError, lambda: self.d[b'xxx'])
163
classes = [WhichDBTestCase]
164
for mod in dbm_iterator():
165
classes.append(type("TestCase-" + mod.__name__, (AnyDBMTestCase,),
167
test.support.run_unittest(*classes)
169
if __name__ == "__main__":