mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	 a7befda8d8
			
		
	
	
		a7befda8d8
		
	
	
	
	
		
			
			* Fixed a bug in the compatibility interface set_location() method where it would not properly search to the next nearest key when used on BTree databases. [SF bug id 788421] * Fixed a bug in the compatibility interface set_location() method where it could crash when looking up keys in a hash or recno format database due to an incorrect free().
		
			
				
	
	
		
			191 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Test cases adapted from the test_bsddb.py module in Python's
 | |
| regression test suite.
 | |
| """
 | |
| 
 | |
| import sys, os, string
 | |
| import unittest
 | |
| import tempfile
 | |
| 
 | |
| from test_all import verbose
 | |
| 
 | |
| try:
 | |
|     # For Pythons w/distutils pybsddb
 | |
|     from bsddb3 import db, hashopen, btopen, rnopen
 | |
| except ImportError:
 | |
|     # For Python 2.3
 | |
|     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 = string.split("The quick brown fox jumped over the lazy dog.")
 | |
|         if verbose:
 | |
|             print "\nTesting: rnopen"
 | |
| 
 | |
|         f = rnopen(self.filename, 'c')
 | |
|         for x in range(len(data)):
 | |
|             f[x+1] = data[x]
 | |
| 
 | |
|         getTest = (f[1], f[2], f[3])
 | |
|         if verbose:
 | |
|             print '%s %s %s' % getTest
 | |
| 
 | |
|         assert getTest[1] == 'quick', 'data mismatch!'
 | |
| 
 | |
|         rv = f.set_location(3)
 | |
|         if rv != (3, 'brown'):
 | |
|             self.fail('recno database set_location failed: '+repr(rv))
 | |
| 
 | |
|         f[25] = 'twenty-five'
 | |
|         f.close()
 | |
|         del f
 | |
| 
 | |
|         f = rnopen(self.filename, 'w')
 | |
|         f[20] = 'twenty'
 | |
| 
 | |
|         def noRec(f):
 | |
|             rec = f[15]
 | |
|         self.assertRaises(KeyError, noRec, f)
 | |
| 
 | |
|         def badKey(f):
 | |
|             rec = f['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['0'] = ''
 | |
|         f['a'] = 'Guido'
 | |
|         f['b'] = 'van'
 | |
|         f['c'] = 'Rossum'
 | |
|         f['d'] = 'invented'
 | |
|         # 'e' intentionally left out
 | |
|         f['f'] = '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 != ('0', ''):
 | |
|             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('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('e')
 | |
|             if e != ('f', 'Python'):
 | |
|                 self.fail('wrong key,value returned: '+repr(e))
 | |
|         else:
 | |
|             try:
 | |
|                 e = f.set_location('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['d'] = 'discovered'
 | |
| 
 | |
|         if verbose:
 | |
|             print 'access...'
 | |
|         for key in f.keys():
 | |
|             word = f[key]
 | |
|             if verbose:
 | |
|                 print word
 | |
| 
 | |
|         def noRec(f):
 | |
|             rec = f['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')
 |