From 178fefb9b5de5aa7db33e691ce2760c54097718b Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Fri, 24 Aug 2007 21:59:45 +0000 Subject: [PATCH] applies the better dbm and shelve related unittests. bug 1007 from larryhastings --- Lib/test/test_anydbm.py | 46 +++++++++++++++++++++++++++---- Lib/test/test_dumbdbm.py | 6 +++++ Lib/test/test_shelve.py | 20 +++++++------- Lib/test/test_whichdb.py | 58 +++++++++++++++++----------------------- 4 files changed, 83 insertions(+), 47 deletions(-) diff --git a/Lib/test/test_anydbm.py b/Lib/test/test_anydbm.py index 367360f95e1..9399d711cff 100644 --- a/Lib/test/test_anydbm.py +++ b/Lib/test/test_anydbm.py @@ -11,7 +11,33 @@ from test import test_support _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 @@ class AnyDBMTestCase(unittest.TestCase): 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 @@ class AnyDBMTestCase(unittest.TestCase): 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 efdee752d1b..d5a74fbf1af 100644 --- a/Lib/test/test_dumbdbm.py +++ b/Lib/test/test_dumbdbm.py @@ -89,6 +89,12 @@ class DumbDBMTestCase(unittest.TestCase): 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 543afb1fabc..f8fcda9754d 100644 --- a/Lib/test/test_shelve.py +++ b/Lib/test/test_shelve.py @@ -3,6 +3,7 @@ import shelve 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 @@ class TestProto2MemShelve(TestShelveBase): _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 675507a3d91..d3eda84deb3 100644 --- a/Lib/test/test_whichdb.py +++ b/Lib/test/test_whichdb.py @@ -10,57 +10,49 @@ import whichdb 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()