applies the better dbm and shelve related unittests. bug 1007 from larryhastings
diff --git a/Lib/test/test_anydbm.py b/Lib/test/test_anydbm.py
index 367360f..9399d71 100644
--- a/Lib/test/test_anydbm.py
+++ b/Lib/test/test_anydbm.py
@@ -11,7 +11,33 @@
_fname = test_support.TESTFN
-def _delete_files():
+_all_modules = []
+
+for _name in anydbm._names:
+ try:
+ _module = __import__(_name)
+ except ImportError:
+ continue
+ _all_modules.append(_module)
+
+
+#
+# Iterates over every database module supported by anydbm
+# currently available, setting anydbm to use each in turn,
+# and yielding that module
+#
+def dbm_iterator():
+ old_default = anydbm._defaultmod
+ for module in _all_modules:
+ anydbm._defaultmod = module
+ yield module
+ anydbm._defaultmod = old_default
+
+#
+# Clean up all scratch databases we might have created
+# during testing
+#
+def delete_files():
# we don't know the precise name the underlying database uses
# so we use glob to locate all names
for f in glob.glob(_fname + "*"):
@@ -60,6 +86,14 @@
keys = self.keys_helper(f)
f.close()
+ def test_anydbm_access(self):
+ self.init_db()
+ f = anydbm.open(_fname, 'r')
+ key = "a".encode("ascii")
+ assert(key in f)
+ assert(f[key] == b"Python:")
+ f.close()
+
def read_helper(self, f):
keys = self.keys_helper(f)
for key in self._dict:
@@ -78,16 +112,18 @@
return keys
def tearDown(self):
- _delete_files()
+ delete_files()
def setUp(self):
- _delete_files()
+ delete_files()
+
def test_main():
try:
- test_support.run_unittest(AnyDBMTestCase)
+ for module in dbm_iterator():
+ test_support.run_unittest(AnyDBMTestCase)
finally:
- _delete_files()
+ delete_files()
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_dumbdbm.py b/Lib/test/test_dumbdbm.py
index efdee75..d5a74fb 100644
--- a/Lib/test/test_dumbdbm.py
+++ b/Lib/test/test_dumbdbm.py
@@ -89,6 +89,12 @@
keys = self.keys_helper(f)
f.close()
+ def test_write_contains(self):
+ f = dumbdbm.open(_fname)
+ f[b'1'] = b'hello'
+ assert b'1' in f
+ f.close()
+
def test_write_write_read(self):
# test for bug #482460
f = dumbdbm.open(_fname)
diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py
index 543afb1..f8fcda9 100644
--- a/Lib/test/test_shelve.py
+++ b/Lib/test/test_shelve.py
@@ -3,6 +3,7 @@
import glob
from test import test_support
from UserDict import DictMixin
+from test.test_anydbm import dbm_iterator
def L1(s):
return s.decode("latin-1")
@@ -148,15 +149,16 @@
_in_mem = True
def test_main():
- test_support.run_unittest(
- TestAsciiFileShelve,
- TestBinaryFileShelve,
- TestProto2FileShelve,
- TestAsciiMemShelve,
- TestBinaryMemShelve,
- TestProto2MemShelve,
- TestCase
- )
+ for module in dbm_iterator():
+ test_support.run_unittest(
+ TestAsciiFileShelve,
+ TestBinaryFileShelve,
+ TestProto2FileShelve,
+ TestAsciiMemShelve,
+ TestBinaryMemShelve,
+ TestProto2MemShelve,
+ TestCase
+ )
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_whichdb.py b/Lib/test/test_whichdb.py
index 675507a..d3eda84 100644
--- a/Lib/test/test_whichdb.py
+++ b/Lib/test/test_whichdb.py
@@ -10,57 +10,49 @@
import anydbm
import tempfile
import glob
+from test.test_anydbm import delete_files, dbm_iterator
_fname = test.test_support.TESTFN
-def _delete_files():
- # we don't know the precise name the underlying database uses
- # so we use glob to locate all names
- for f in glob.glob(_fname + "*"):
- try:
- os.unlink(f)
- except OSError:
- pass
-
class WhichDBTestCase(unittest.TestCase):
# Actual test methods are added to namespace
# after class definition.
def __init__(self, *args):
unittest.TestCase.__init__(self, *args)
+ def test_whichdb(self):
+ for module in dbm_iterator():
+ # Check whether whichdb correctly guesses module name
+ # for databases opened with "module" module.
+ # Try with empty files first
+ name = module.__name__
+ if name == 'dumbdbm':
+ continue # whichdb can't support dumbdbm
+ f = module.open(_fname, 'c')
+ f.close()
+ self.assertEqual(name, whichdb.whichdb(_fname))
+ # Now add a key
+ f = module.open(_fname, 'w')
+ f[b"1"] = b"1"
+ # and test that we can find it
+ assert b"1" in f
+ # and read it
+ assert f[b"1"] == b"1"
+ f.close()
+ self.assertEqual(name, whichdb.whichdb(_fname))
+
def tearDown(self):
- _delete_files()
+ delete_files()
def setUp(self):
- _delete_files()
+ delete_files()
-for name in anydbm._names:
- # we define a new test method for each
- # candidate database module.
- try:
- mod = __import__(name)
- except ImportError:
- continue
-
- def test_whichdb_name(self, name=name, mod=mod):
- # Check whether whichdb correctly guesses module name
- # for databases opened with module mod.
- # Try with empty files first
- f = mod.open(_fname, 'c')
- f.close()
- self.assertEqual(name, whichdb.whichdb(_fname))
- # Now add a key
- f = mod.open(_fname, 'w')
- f[b"1"] = b"1"
- f.close()
- self.assertEqual(name, whichdb.whichdb(_fname))
- setattr(WhichDBTestCase,"test_whichdb_%s" % name, test_whichdb_name)
def test_main():
try:
test.test_support.run_unittest(WhichDBTestCase)
finally:
- _delete_files()
+ delete_files()
if __name__ == "__main__":
test_main()