2 TestCases for checking dbShelve objects.
10 from test_all
import db
, dbshelve
, test_support
, verbose
, \
11 get_new_environment_path
, get_new_database_path
15 #----------------------------------------------------------------------
17 # We want the objects to be comparable so we can test dbshelve.values
21 self
.value
= random
.random()
23 def __repr__(self
) : # For Python 3.0 comparison
24 return "DataClass %f" %self
.value
26 def __cmp__(self
, other
): # For Python 2.x comparison
27 return cmp(self
.value
, other
)
30 class DBShelveTestCase(unittest
.TestCase
):
33 if sys
.version_info
[0] >= 3 :
34 from test_all
import do_proxy_db_py3k
35 self
._flag
_proxy
_db
_py
3k
= do_proxy_db_py3k(False)
36 self
.filename
= get_new_database_path()
41 if sys
.version_info
[0] >= 3 :
42 from test_all
import do_proxy_db_py3k
43 do_proxy_db_py3k(self
._flag
_proxy
_db
_py
3k
)
45 test_support
.unlink(self
.filename
)
48 """Turn key into an appropriate key type for this db"""
49 # override in child class for RECNO
51 if sys
.version_info
[0] < 3 :
54 return bytes(key
, "iso8859-1") # 8 bits
56 def populateDB(self
, d
):
57 for x
in string
.letters
:
58 d
[self
.mk('S' + x
)] = 10 * x
# add a string
59 d
[self
.mk('I' + x
)] = ord(x
) # add an integer
60 d
[self
.mk('L' + x
)] = [x
] * 10 # add a list
62 inst
= DataClass() # add an instance
66 d
[self
.mk('O' + x
)] = inst
69 # overridable in derived classes to affect how the shelf is created/opened
71 self
.d
= dbshelve
.open(self
.filename
)
79 def test01_basics(self
):
82 print "Running %s.test01_basics..." % self
.__class
__.__name
__
84 self
.populateDB(self
.d
)
100 self
.assertEqual(0, d
.has_key(self
.mk('bad key')))
101 self
.assertEqual(1, d
.has_key(self
.mk('IA')))
102 self
.assertEqual(1, d
.has_key(self
.mk('OA')))
104 d
.delete(self
.mk('IA'))
106 self
.assertEqual(0, d
.has_key(self
.mk('IA')))
107 self
.assertEqual(0, d
.has_key(self
.mk('OA')))
108 self
.assertEqual(len(d
), l
-2)
115 print "%s: %s" % (key
, value
)
116 self
.checkrec(key
, value
)
118 dbvalues
= d
.values()
119 self
.assertEqual(len(dbvalues
), len(d
.keys()))
121 if sys
.version_info
[0] < 3 :
124 self
.assertEqual(values
, dbvalues
)
125 else : # XXX: Convert all to strings. Please, improve
126 values
.sort(key
=lambda x
: str(x
))
127 dbvalues
.sort(key
=lambda x
: str(x
))
128 self
.assertEqual(repr(values
), repr(dbvalues
))
131 self
.assertEqual(len(items
), len(values
))
133 for key
, value
in items
:
134 self
.checkrec(key
, value
)
136 self
.assertEqual(d
.get(self
.mk('bad key')), None)
137 self
.assertEqual(d
.get(self
.mk('bad key'), None), None)
138 self
.assertEqual(d
.get(self
.mk('bad key'), 'a string'), 'a string')
139 self
.assertEqual(d
.get(self
.mk('bad key'), [1, 2, 3]), [1, 2, 3])
141 d
.set_get_returns_none(0)
142 self
.assertRaises(db
.DBNotFoundError
, d
.get
, self
.mk('bad key'))
143 d
.set_get_returns_none(1)
145 d
.put(self
.mk('new key'), 'new data')
146 self
.assertEqual(d
.get(self
.mk('new key')), 'new data')
147 self
.assertEqual(d
[self
.mk('new key')], 'new data')
151 def test02_cursors(self
):
153 print '\n', '-=' * 30
154 print "Running %s.test02_cursors..." % self
.__class
__.__name
__
156 self
.populateDB(self
.d
)
162 while rec
is not None:
167 self
.checkrec(key
, value
)
168 # Hack to avoid conversion by 2to3 tool
169 rec
= getattr(c
, "next")()
172 self
.assertEqual(count
, len(d
))
177 while rec
is not None:
182 self
.checkrec(key
, value
)
185 self
.assertEqual(count
, len(d
))
188 key
, value
= c
.current()
189 self
.checkrec(key
, value
)
193 def test03_append(self
):
194 # NOTE: this is overridden in RECNO subclass, don't change its name.
196 print '\n', '-=' * 30
197 print "Running %s.test03_append..." % self
.__class
__.__name
__
199 self
.assertRaises(dbshelve
.DBShelveError
,
200 self
.d
.append
, 'unit test was here')
203 def checkrec(self
, key
, value
):
204 # override this in a subclass if the key type is different
207 if sys
.version_info
[0] >= 3 :
208 if isinstance(key
, bytes
) :
209 key
= key
.decode("iso8859-1") # 8 bits
213 self
.assertEqual(type(value
), str)
214 self
.assertEqual(value
, 10 * x
)
217 self
.assertEqual(type(value
), int)
218 self
.assertEqual(value
, ord(x
))
221 self
.assertEqual(type(value
), list)
222 self
.assertEqual(value
, [x
] * 10)
226 if sys
.version_info
[0] < 3 :
227 from types
import InstanceType
228 self
.assertEqual(type(value
), InstanceType
)
230 self
.assertEqual(type(value
), DataClass
)
232 self
.assertEqual(value
.S
, 10 * x
)
233 self
.assertEqual(value
.I
, ord(x
))
234 self
.assertEqual(value
.L
, [x
] * 10)
237 self
.assert_(0, 'Unknown key type, fix the test')
239 #----------------------------------------------------------------------
241 class BasicShelveTestCase(DBShelveTestCase
):
243 self
.d
= dbshelve
.DBShelf()
244 self
.d
.open(self
.filename
, self
.dbtype
, self
.dbflags
)
250 class BTreeShelveTestCase(BasicShelveTestCase
):
252 dbflags
= db
.DB_CREATE
255 class HashShelveTestCase(BasicShelveTestCase
):
257 dbflags
= db
.DB_CREATE
260 class ThreadBTreeShelveTestCase(BasicShelveTestCase
):
262 dbflags
= db
.DB_CREATE | db
.DB_THREAD
265 class ThreadHashShelveTestCase(BasicShelveTestCase
):
267 dbflags
= db
.DB_CREATE | db
.DB_THREAD
270 #----------------------------------------------------------------------
272 class BasicEnvShelveTestCase(DBShelveTestCase
):
274 self
.env
= db
.DBEnv()
275 self
.env
.open(self
.homeDir
,
276 self
.envflags | db
.DB_INIT_MPOOL | db
.DB_CREATE
)
278 self
.filename
= os
.path
.split(self
.filename
)[1]
279 self
.d
= dbshelve
.DBShelf(self
.env
)
280 self
.d
.open(self
.filename
, self
.dbtype
, self
.dbflags
)
289 self
.homeDir
= get_new_environment_path()
290 DBShelveTestCase
.setUp(self
)
294 if sys
.version_info
[0] >= 3 :
295 from test_all
import do_proxy_db_py3k
296 do_proxy_db_py3k(self
._flag
_proxy
_db
_py
3k
)
298 test_support
.rmtree(self
.homeDir
)
301 class EnvBTreeShelveTestCase(BasicEnvShelveTestCase
):
304 dbflags
= db
.DB_CREATE
307 class EnvHashShelveTestCase(BasicEnvShelveTestCase
):
310 dbflags
= db
.DB_CREATE
313 class EnvThreadBTreeShelveTestCase(BasicEnvShelveTestCase
):
314 envflags
= db
.DB_THREAD
316 dbflags
= db
.DB_CREATE | db
.DB_THREAD
319 class EnvThreadHashShelveTestCase(BasicEnvShelveTestCase
):
320 envflags
= db
.DB_THREAD
322 dbflags
= db
.DB_CREATE | db
.DB_THREAD
325 #----------------------------------------------------------------------
326 # test cases for a DBShelf in a RECNO DB.
328 class RecNoShelveTestCase(BasicShelveTestCase
):
330 dbflags
= db
.DB_CREATE
333 BasicShelveTestCase
.setUp(self
)
335 # pool to assign integer key values out of
336 self
.key_pool
= list(range(1, 5000))
337 self
.key_map
= {} # map string keys to the number we gave them
338 self
.intkey_map
= {} # reverse map of above
341 if key
not in self
.key_map
:
342 self
.key_map
[key
] = self
.key_pool
.pop(0)
343 self
.intkey_map
[self
.key_map
[key
]] = key
344 return self
.key_map
[key
]
346 def checkrec(self
, intkey
, value
):
347 key
= self
.intkey_map
[intkey
]
348 BasicShelveTestCase
.checkrec(self
, key
, value
)
350 def test03_append(self
):
352 print '\n', '-=' * 30
353 print "Running %s.test03_append..." % self
.__class
__.__name
__
357 self
.assertEqual(6, self
.d
.append('spam'))
358 self
.assertEqual(7, self
.d
.append('baked beans'))
359 self
.assertEqual('spam', self
.d
.get(6))
360 self
.assertEqual('spam', self
.d
.get(1))
361 self
.assertEqual('baked beans', self
.d
.get(7))
362 self
.assertEqual('eggs', self
.d
.get(5))
365 #----------------------------------------------------------------------
368 suite
= unittest
.TestSuite()
370 suite
.addTest(unittest
.makeSuite(DBShelveTestCase
))
371 suite
.addTest(unittest
.makeSuite(BTreeShelveTestCase
))
372 suite
.addTest(unittest
.makeSuite(HashShelveTestCase
))
373 suite
.addTest(unittest
.makeSuite(ThreadBTreeShelveTestCase
))
374 suite
.addTest(unittest
.makeSuite(ThreadHashShelveTestCase
))
375 suite
.addTest(unittest
.makeSuite(EnvBTreeShelveTestCase
))
376 suite
.addTest(unittest
.makeSuite(EnvHashShelveTestCase
))
377 suite
.addTest(unittest
.makeSuite(EnvThreadBTreeShelveTestCase
))
378 suite
.addTest(unittest
.makeSuite(EnvThreadHashShelveTestCase
))
379 suite
.addTest(unittest
.makeSuite(RecNoShelveTestCase
))
384 if __name__
== '__main__':
385 unittest
.main(defaultTest
='test_suite')