blob: ee82dd2fa90ecdd48f5896ec0e056b6043167c60 [file] [log] [blame]
Georg Brandl7f986ac2008-05-26 10:30:20 +00001#! /usr/bin/env python
2"""Test script for the dbm.open function based on testdumbdbm.py"""
3
4import os
5import unittest
6import dbm
7import glob
8import test.support
9
10_fname = test.support.TESTFN
11
12#
13# Iterates over every database module supported by dbm currently available,
14# setting dbm to use each in turn, and yielding that module
15#
16def dbm_iterator():
Georg Brandlb17acad2008-05-28 08:43:17 +000017 for name in dbm._names:
18 try:
19 mod = __import__(name, fromlist=['open'])
20 except ImportError:
21 continue
22 dbm._modules[name] = mod
23 yield mod
Georg Brandl7f986ac2008-05-26 10:30:20 +000024
25#
26# Clean up all scratch databases we might have created during testing
27#
28def delete_files():
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)
33
34
35class AnyDBMTestCase(unittest.TestCase):
36 _dict = {'0': b'',
37 'a': b'Python:',
38 'b': b'Programming',
39 'c': b'the',
40 'd': b'way',
41 'f': b'Guido',
42 'g': b'intended',
43 }
44
Georg Brandlb17acad2008-05-28 08:43:17 +000045 def init_db(self):
46 f = dbm.open(_fname, 'n')
47 for k in self._dict:
48 f[k.encode("ascii")] = self._dict[k]
49 f.close()
50
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)
55 return keys
56
57 def test_error(self):
58 self.assert_(issubclass(self.module.error, IOError))
Georg Brandl7f986ac2008-05-26 10:30:20 +000059
Amaury Forgeot d'Arcb5cf3012008-09-25 22:27:43 +000060 def test_anydbm_not_existing(self):
61 self.assertRaises(dbm.error, dbm.open, _fname)
62
Georg Brandl7f986ac2008-05-26 10:30:20 +000063 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]
68 self.read_helper(f)
69 f.close()
70
71 def test_anydbm_modification(self):
72 self.init_db()
73 f = dbm.open(_fname, 'c')
74 self._dict['g'] = f[b'g'] = b"indented"
75 self.read_helper(f)
76 f.close()
77
78 def test_anydbm_read(self):
79 self.init_db()
80 f = dbm.open(_fname, 'r')
81 self.read_helper(f)
82 f.close()
83
84 def test_anydbm_keys(self):
85 self.init_db()
86 f = dbm.open(_fname, 'r')
87 keys = self.keys_helper(f)
88 f.close()
89
90 def test_anydbm_access(self):
91 self.init_db()
92 f = dbm.open(_fname, 'r')
93 key = "a".encode("ascii")
94 assert(key in f)
95 assert(f[key] == b"Python:")
96 f.close()
97
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")])
102
Georg Brandl7f986ac2008-05-26 10:30:20 +0000103 def tearDown(self):
104 delete_files()
105
106 def setUp(self):
Georg Brandlb17acad2008-05-28 08:43:17 +0000107 dbm._defaultmod = self.module
Georg Brandl7f986ac2008-05-26 10:30:20 +0000108 delete_files()
109
110
111class 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)
115
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')
126 f.close()
127 self.assertEqual(name, dbm.whichdb(_fname))
128 # Now add a key
129 f = module.open(_fname, 'w')
130 f[b"1"] = b"1"
131 # and test that we can find it
132 self.assertTrue(b"1" in f)
133 # and read it
134 self.assertTrue(f[b"1"] == b"1")
135 f.close()
136 self.assertEqual(name, dbm.whichdb(_fname))
137
138 def tearDown(self):
139 delete_files()
140
141 def setUp(self):
142 delete_files()
143
144
145def test_main():
Georg Brandlb17acad2008-05-28 08:43:17 +0000146 classes = [WhichDBTestCase]
147 for mod in dbm_iterator():
148 classes.append(type("TestCase-" + mod.__name__, (AnyDBMTestCase,),
149 {'module': mod}))
150 test.support.run_unittest(*classes)
Georg Brandl7f986ac2008-05-26 10:30:20 +0000151
152if __name__ == "__main__":
153 test_main()