1
1
"""Test script for the dbm.open function based on testdumbdbm.py"""
2
2
3
3
import unittest
4
- import glob
4
+ import dbm
5
+ import os
5
6
from test .support import import_helper
6
7
from test .support import os_helper
7
8
8
- # Skip tests if dbm module doesn't exist.
9
- dbm = import_helper .import_module ('dbm' )
10
-
11
9
try :
12
10
from dbm import ndbm
13
11
except ImportError :
14
12
ndbm = None
15
13
16
- _fname = os_helper .TESTFN
14
+ dirname = os_helper .TESTFN
15
+ _fname = os .path .join (dirname , os_helper .TESTFN )
17
16
18
17
#
19
- # Iterates over every database module supported by dbm currently available,
20
- # setting dbm to use each in turn, and yielding that module
18
+ # Iterates over every database module supported by dbm currently available.
21
19
#
22
20
def dbm_iterator ():
23
21
for name in dbm ._names :
@@ -31,11 +29,12 @@ def dbm_iterator():
31
29
#
32
30
# Clean up all scratch databases we might have created during testing
33
31
#
34
- def delete_files ():
35
- # we don't know the precise name the underlying database uses
36
- # so we use glob to locate all names
37
- for f in glob .glob (glob .escape (_fname ) + "*" ):
38
- os_helper .unlink (f )
32
+ def cleaunup_test_dir ():
33
+ os_helper .rmtree (dirname )
34
+
35
+ def setup_test_dir ():
36
+ cleaunup_test_dir ()
37
+ os .mkdir (dirname )
39
38
40
39
41
40
class AnyDBMTestCase :
@@ -134,80 +133,67 @@ def read_helper(self, f):
134
133
for key in self ._dict :
135
134
self .assertEqual (self ._dict [key ], f [key .encode ("ascii" )])
136
135
137
- def tearDown (self ):
138
- delete_files ()
136
+ def test_keys (self ):
137
+ with dbm .open (_fname , 'c' ) as d :
138
+ self .assertEqual (d .keys (), [])
139
+ a = [(b'a' , b'b' ), (b'12345678910' , b'019237410982340912840198242' )]
140
+ for k , v in a :
141
+ d [k ] = v
142
+ self .assertEqual (sorted (d .keys ()), sorted (k for (k , v ) in a ))
143
+ for k , v in a :
144
+ self .assertIn (k , d )
145
+ self .assertEqual (d [k ], v )
146
+ self .assertNotIn (b'xxx' , d )
147
+ self .assertRaises (KeyError , lambda : d [b'xxx' ])
139
148
140
149
def setUp (self ):
150
+ self .addCleanup (setattr , dbm , '_defaultmod' , dbm ._defaultmod )
141
151
dbm ._defaultmod = self .module
142
- delete_files ()
152
+ self .addCleanup (cleaunup_test_dir )
153
+ setup_test_dir ()
143
154
144
155
145
156
class WhichDBTestCase (unittest .TestCase ):
146
157
def test_whichdb (self ):
158
+ self .addCleanup (setattr , dbm , '_defaultmod' , dbm ._defaultmod )
147
159
for module in dbm_iterator ():
148
160
# Check whether whichdb correctly guesses module name
149
161
# for databases opened with "module" module.
150
- # Try with empty files first
151
162
name = module .__name__
152
- if name == 'dbm.dumb' :
153
- continue # whichdb can't support dbm.dumb
154
- delete_files ()
155
- f = module .open (_fname , 'c' )
156
- f .close ()
163
+ setup_test_dir ()
164
+ dbm ._defaultmod = module
165
+ # Try with empty files first
166
+ with module .open (_fname , 'c' ): pass
157
167
self .assertEqual (name , self .dbm .whichdb (_fname ))
158
168
# Now add a key
159
- f = module .open (_fname , 'w' )
160
- f [b"1" ] = b"1"
161
- # and test that we can find it
162
- self .assertIn (b"1" , f )
163
- # and read it
164
- self .assertEqual (f [b"1" ], b"1" )
165
- f .close ()
169
+ with module .open (_fname , 'w' ) as f :
170
+ f [b"1" ] = b"1"
171
+ # and test that we can find it
172
+ self .assertIn (b"1" , f )
173
+ # and read it
174
+ self .assertEqual (f [b"1" ], b"1" )
166
175
self .assertEqual (name , self .dbm .whichdb (_fname ))
167
176
168
177
@unittest .skipUnless (ndbm , reason = 'Test requires ndbm' )
169
178
def test_whichdb_ndbm (self ):
170
179
# Issue 17198: check that ndbm which is referenced in whichdb is defined
171
- db_file = '{}_ndbm.db' .format (_fname )
172
- with open (db_file , 'w' ):
173
- self .addCleanup (os_helper .unlink , db_file )
174
- self .assertIsNone (self .dbm .whichdb (db_file [:- 3 ]))
175
-
176
- def tearDown (self ):
177
- delete_files ()
180
+ with open (_fname + '.db' , 'wb' ): pass
181
+ self .assertIsNone (self .dbm .whichdb (_fname ))
178
182
179
183
def setUp (self ):
180
- delete_files ()
181
- self .filename = os_helper .TESTFN
182
- self .d = dbm .open (self .filename , 'c' )
183
- self .d .close ()
184
+ self .addCleanup (cleaunup_test_dir )
185
+ setup_test_dir ()
184
186
self .dbm = import_helper .import_fresh_module ('dbm' )
185
187
186
- def test_keys (self ):
187
- self .d = dbm .open (self .filename , 'c' )
188
- self .assertEqual (self .d .keys (), [])
189
- a = [(b'a' , b'b' ), (b'12345678910' , b'019237410982340912840198242' )]
190
- for k , v in a :
191
- self .d [k ] = v
192
- self .assertEqual (sorted (self .d .keys ()), sorted (k for (k , v ) in a ))
193
- for k , v in a :
194
- self .assertIn (k , self .d )
195
- self .assertEqual (self .d [k ], v )
196
- self .assertNotIn (b'xxx' , self .d )
197
- self .assertRaises (KeyError , lambda : self .d [b'xxx' ])
198
- self .d .close ()
199
-
200
-
201
- def load_tests (loader , tests , pattern ):
202
- classes = []
203
- for mod in dbm_iterator ():
204
- classes .append (type ("TestCase-" + mod .__name__ ,
205
- (AnyDBMTestCase , unittest .TestCase ),
206
- {'module' : mod }))
207
- suites = [unittest .makeSuite (c ) for c in classes ]
208
-
209
- tests .addTests (suites )
210
- return tests
188
+
189
+ for mod in dbm_iterator ():
190
+ assert mod .__name__ .startswith ('dbm.' )
191
+ suffix = mod .__name__ [4 :]
192
+ testname = f'TestCase_{ suffix } '
193
+ globals ()[testname ] = type (testname ,
194
+ (AnyDBMTestCase , unittest .TestCase ),
195
+ {'module' : mod })
196
+
211
197
212
198
if __name__ == "__main__" :
213
199
unittest .main ()
0 commit comments