diff options
Diffstat (limited to 'Lib/test/test_dbm.py')
-rw-r--r-- | Lib/test/test_dbm.py | 178 |
1 files changed, 158 insertions, 20 deletions
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py index 41b0b5cc476..26d4c146238 100644 --- a/Lib/test/test_dbm.py +++ b/Lib/test/test_dbm.py @@ -1,42 +1,180 @@ -from test import test_support +#! /usr/bin/env python3 +"""Test script for the dbm.open function based on testdumbdbm.py""" + +import os import unittest -dbm = test_support.import_module('dbm') +import glob +import test.support + +# Skip tests if dbm module doesn't exist. +dbm = test.support.import_module('dbm') + +_fname = test.support.TESTFN + +# +# Iterates over every database module supported by dbm currently available, +# setting dbm to use each in turn, and yielding that module +# +def dbm_iterator(): + for name in dbm._names: + try: + mod = __import__(name, fromlist=['open']) + except ImportError: + continue + dbm._modules[name] = mod + yield mod + +# +# 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 + "*"): + test.support.unlink(f) + + +class AnyDBMTestCase(unittest.TestCase): + _dict = {'0': b'', + 'a': b'Python:', + 'b': b'Programming', + 'c': b'the', + 'd': b'way', + 'f': b'Guido', + 'g': b'intended', + } + + def init_db(self): + f = dbm.open(_fname, 'n') + for k in self._dict: + f[k.encode("ascii")] = self._dict[k] + f.close() + + def keys_helper(self, f): + keys = sorted(k.decode("ascii") for k in f.keys()) + dkeys = sorted(self._dict.keys()) + self.assertEqual(keys, dkeys) + return keys + + def test_error(self): + self.assertTrue(issubclass(self.module.error, IOError)) + + def test_anydbm_not_existing(self): + self.assertRaises(dbm.error, dbm.open, _fname) + + def test_anydbm_creation(self): + f = dbm.open(_fname, 'c') + self.assertEqual(list(f.keys()), []) + for key in self._dict: + f[key.encode("ascii")] = self._dict[key] + self.read_helper(f) + f.close() + + def test_anydbm_creation_n_file_exists_with_invalid_contents(self): + with open(_fname, "w") as w: + pass # create an empty file + + f = dbm.open(_fname, 'n') + self.addCleanup(f.close) + self.assertEqual(len(f), 0) + + def test_anydbm_modification(self): + self.init_db() + f = dbm.open(_fname, 'c') + self._dict['g'] = f[b'g'] = b"indented" + self.read_helper(f) + f.close() -class DbmTestCase(unittest.TestCase): + def test_anydbm_read(self): + self.init_db() + f = dbm.open(_fname, 'r') + self.read_helper(f) + f.close() + + def test_anydbm_keys(self): + self.init_db() + f = dbm.open(_fname, 'r') + keys = self.keys_helper(f) + f.close() + + def test_anydbm_access(self): + self.init_db() + f = dbm.open(_fname, 'r') + key = "a".encode("ascii") + self.assertIn(key, f) + assert(f[key] == b"Python:") + f.close() + + def read_helper(self, f): + keys = self.keys_helper(f) + for key in self._dict: + self.assertEqual(self._dict[key], f[key.encode("ascii")]) + + def tearDown(self): + delete_files() def setUp(self): - self.filename = test_support.TESTFN - self.d = dbm.open(self.filename, 'c') - self.d.close() + dbm._defaultmod = self.module + delete_files() + + +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 == 'dbm.dumb': + continue # whichdb can't support dbm.dumb + delete_files() + f = module.open(_fname, 'c') + f.close() + self.assertEqual(name, dbm.whichdb(_fname)) + # Now add a key + f = module.open(_fname, 'w') + f[b"1"] = b"1" + # and test that we can find it + self.assertIn(b"1", f) + # and read it + self.assertTrue(f[b"1"] == b"1") + f.close() + self.assertEqual(name, dbm.whichdb(_fname)) def tearDown(self): - for suffix in ['', '.pag', '.dir', '.db']: - test_support.unlink(self.filename + suffix) + delete_files() + + def setUp(self): + delete_files() + self.filename = test.support.TESTFN + self.d = dbm.open(self.filename, 'c') + self.d.close() def test_keys(self): self.d = dbm.open(self.filename, 'c') self.assertEqual(self.d.keys(), []) - a = [('a', 'b'), ('12345678910', '019237410982340912840198242')] + a = [(b'a', b'b'), (b'12345678910', b'019237410982340912840198242')] for k, v in a: self.d[k] = v self.assertEqual(sorted(self.d.keys()), sorted(k for (k, v) in a)) for k, v in a: self.assertIn(k, self.d) self.assertEqual(self.d[k], v) - self.assertNotIn('xxx', self.d) - self.assertRaises(KeyError, lambda: self.d['xxx']) + self.assertNotIn(b'xxx', self.d) + self.assertRaises(KeyError, lambda: self.d[b'xxx']) self.d.close() - def test_modes(self): - for mode in ['r', 'rw', 'w', 'n']: - try: - self.d = dbm.open(self.filename, mode) - self.d.close() - except dbm.error: - self.fail() def test_main(): - test_support.run_unittest(DbmTestCase) + classes = [WhichDBTestCase] + for mod in dbm_iterator(): + classes.append(type("TestCase-" + mod.__name__, (AnyDBMTestCase,), + {'module': mod})) + test.support.run_unittest(*classes) -if __name__ == '__main__': +if __name__ == "__main__": test_main() |