| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | Test cases adapted from the test_bsddb.py module in Python's | 
					
						
							|  |  |  | regression test suite. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-23 17:40:11 +00:00
										 |  |  | import os, string | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-13 20:57:59 +00:00
										 |  |  | from test_all import verbose, get_new_database_path | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 17:20:44 +00:00
										 |  |  | try: | 
					
						
							| 
									
										
										
										
											2003-09-21 00:08:14 +00:00
										 |  |  |     # For Pythons w/distutils pybsddb | 
					
						
							|  |  |  |     from bsddb3 import db, hashopen, btopen, rnopen | 
					
						
							|  |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											2003-01-28 17:20:44 +00:00
										 |  |  |     # For Python 2.3 | 
					
						
							|  |  |  |     from bsddb import db, hashopen, btopen, rnopen | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class CompatibilityTestCase(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2008-05-13 20:57:59 +00:00
										 |  |  |         self.filename = get_new_database_path() | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-13 20:57:59 +00:00
										 |  |  |         self.assertEqual(getTest[1], 'quick', 'data mismatch!') | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-26 10:07:14 +00:00
										 |  |  |         rv = f.set_location(3) | 
					
						
							|  |  |  |         if rv != (3, 'brown'): | 
					
						
							|  |  |  |             self.fail('recno database set_location failed: '+repr(rv)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |         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' | 
					
						
							| 
									
										
										
										
											2004-02-26 10:07:14 +00:00
										 |  |  |         # 'e' intentionally left out | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |         f['f'] = 'Python' | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print '%s %s %s' % (f['a'], f['b'], f['c']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print 'key ordering...' | 
					
						
							| 
									
										
										
										
											2004-02-26 10:07:14 +00:00
										 |  |  |         start = f.set_location(f.first()[0]) | 
					
						
							|  |  |  |         if start != ('0', ''): | 
					
						
							|  |  |  |             self.fail("incorrect first() result: "+repr(start)) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |         while 1: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 rec = f.next() | 
					
						
							|  |  |  |             except KeyError: | 
					
						
							| 
									
										
										
										
											2008-05-13 20:57:59 +00:00
										 |  |  |                 self.assertEqual(rec, f.last(), 'Error, last <> last!') | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |                 f.previous() | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             if verbose: | 
					
						
							|  |  |  |                 print rec | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-13 20:57:59 +00:00
										 |  |  |         self.assert_(f.has_key('f'), 'Error, missing key!') | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-26 10:07:14 +00:00
										 |  |  |         # 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") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |         f.sync() | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         # truth test | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             if f: | 
					
						
							|  |  |  |                 if verbose: print "truth test: true" | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if verbose: print "truth test: false" | 
					
						
							| 
									
										
										
										
											2003-01-28 17:20:44 +00:00
										 |  |  |         except db.DBError: | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |             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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  | def test_suite(): | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |     return unittest.makeSuite(CompatibilityTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |     unittest.main(defaultTest='test_suite') |