| """ |
| Test cases adapted from the test_bsddb.py module in Python's |
| regression test suite. |
| """ |
| |
| import sys, os |
| import unittest |
| import tempfile |
| |
| from bsddb.test.test_all import verbose |
| |
| from bsddb import db, hashopen, btopen, rnopen |
| |
| |
| class CompatibilityTestCase(unittest.TestCase): |
| def setUp(self): |
| self.filename = tempfile.mktemp() |
| |
| def tearDown(self): |
| try: |
| os.remove(self.filename) |
| except os.error: |
| pass |
| |
| |
| def test01_btopen(self): |
| self.do_bthash_test(btopen, 'btopen') |
| |
| def test02_hashopen(self): |
| self.do_bthash_test(hashopen, 'hashopen') |
| |
| def test03_rnopen(self): |
| data = "The quick brown fox jumped over the lazy dog.".split() |
| if verbose: |
| print("\nTesting: rnopen") |
| |
| f = rnopen(self.filename, 'c') |
| for x in range(len(data)): |
| f[x+1] = data[x].encode("ascii") |
| |
| getTest = (f[1], f[2], f[3]) |
| if verbose: |
| print('%s %s %s' % getTest) |
| |
| assert getTest[1] == b'quick', 'data mismatch!' |
| |
| rv = f.set_location(3) |
| if rv != (3, b'brown'): |
| self.fail('recno database set_location failed: '+repr(rv)) |
| |
| f[25] = b'twenty-five' |
| f.close() |
| del f |
| |
| f = rnopen(self.filename, 'w') |
| f[20] = b'twenty' |
| |
| def noRec(f): |
| rec = f[15] |
| self.assertRaises(KeyError, noRec, f) |
| |
| def badKey(f): |
| rec = f[b'a string'] |
| self.assertRaises(TypeError, badKey, f) |
| |
| del f[3] |
| |
| rec = f.first() |
| while rec: |
| if verbose: |
| print(rec) |
| try: |
| rec = f.next() |
| except KeyError: |
| break |
| |
| f.close() |
| |
| |
| def test04_n_flag(self): |
| f = hashopen(self.filename, 'n') |
| f.close() |
| |
| |
| def do_bthash_test(self, factory, what): |
| if verbose: |
| print('\nTesting: ', what) |
| |
| f = factory(self.filename, 'c') |
| if verbose: |
| print('creation...') |
| |
| # truth test |
| if f: |
| if verbose: print("truth test: true") |
| else: |
| if verbose: print("truth test: false") |
| |
| f[b'0'] = b'' |
| f[b'a'] = b'Guido' |
| f[b'b'] = b'van' |
| f[b'c'] = b'Rossum' |
| f[b'd'] = b'invented' |
| # 'e' intentionally left out |
| f[b'f'] = b'Python' |
| if verbose: |
| print('%s %s %s' % (f['a'], f['b'], f['c'])) |
| |
| if verbose: |
| print('key ordering...') |
| start = f.set_location(f.first()[0]) |
| if start != (b'0', b''): |
| self.fail("incorrect first() result: "+repr(start)) |
| while 1: |
| try: |
| rec = f.next() |
| except KeyError: |
| assert rec == f.last(), 'Error, last != last!' |
| f.previous() |
| break |
| if verbose: |
| print(rec) |
| |
| assert f.has_key(b'f'), 'Error, missing key!' |
| |
| # test that set_location() returns the next nearest key, value |
| # on btree databases and raises KeyError on others. |
| if factory == btopen: |
| e = f.set_location(b'e') |
| if e != (b'f', b'Python'): |
| self.fail('wrong key,value returned: '+repr(e)) |
| else: |
| try: |
| e = f.set_location(b'e') |
| except KeyError: |
| pass |
| else: |
| self.fail("set_location on non-existant key did not raise KeyError") |
| |
| f.sync() |
| f.close() |
| # truth test |
| try: |
| if f: |
| if verbose: print("truth test: true") |
| else: |
| if verbose: print("truth test: false") |
| except db.DBError: |
| pass |
| else: |
| self.fail("Exception expected") |
| |
| del f |
| |
| if verbose: |
| print('modification...') |
| f = factory(self.filename, 'w') |
| f[b'd'] = b'discovered' |
| |
| if verbose: |
| print('access...') |
| for key in f.keys(): |
| word = f[key] |
| if verbose: |
| print(word) |
| |
| def noRec(f): |
| rec = f[b'no such key'] |
| self.assertRaises(KeyError, noRec, f) |
| |
| def badKey(f): |
| rec = f[15] |
| self.assertRaises(TypeError, badKey, f) |
| |
| f.close() |
| |
| |
| #---------------------------------------------------------------------- |
| |
| |
| def test_suite(): |
| return unittest.makeSuite(CompatibilityTestCase) |
| |
| |
| if __name__ == '__main__': |
| unittest.main(defaultTest='test_suite') |