aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_dbm.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_dbm.py')
-rw-r--r--Lib/test/test_dbm.py178
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()