10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" 20a8c90248264a8b26970b4473770bcc3df8515fJosh GaoTest cases adapted from the test_bsddb.py module in Python's 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoregression test suite. 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os, string 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test_all import db, hashopen, btopen, rnopen, verbose, \ 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao get_new_database_path 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass CompatibilityTestCase(unittest.TestCase): 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def setUp(self): 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.filename = get_new_database_path() 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def tearDown(self): 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao os.remove(self.filename) 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except os.error: 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test01_btopen(self): 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.do_bthash_test(btopen, 'btopen') 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test02_hashopen(self): 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.do_bthash_test(hashopen, 'hashopen') 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test03_rnopen(self): 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao data = "The quick brown fox jumped over the lazy dog.".split() 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print "\nTesting: rnopen" 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = rnopen(self.filename, 'c') 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for x in range(len(data)): 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f[x+1] = data[x] 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao getTest = (f[1], f[2], f[3]) 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print '%s %s %s' % getTest 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(getTest[1], 'quick', 'data mismatch!') 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rv = f.set_location(3) 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if rv != (3, 'brown'): 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail('recno database set_location failed: '+repr(rv)) 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f[25] = 'twenty-five' 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del f 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = rnopen(self.filename, 'w') 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f[20] = 'twenty' 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def noRec(f): 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f[15] 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, noRec, f) 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def badKey(f): 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f['a string'] 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, badKey, f) 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del f[3] 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f.first() 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while rec: 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print rec 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f.next() 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except KeyError: 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao break 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test04_n_flag(self): 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = hashopen(self.filename, 'n') 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def do_bthash_test(self, factory, what): 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print '\nTesting: ', what 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = factory(self.filename, 'c') 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print 'creation...' 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # truth test 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if f: 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: print "truth test: true" 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: print "truth test: false" 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['0'] = '' 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['a'] = 'Guido' 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['b'] = 'van' 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['c'] = 'Rossum' 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['d'] = 'invented' 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # 'e' intentionally left out 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['f'] = 'Python' 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print '%s %s %s' % (f['a'], f['b'], f['c']) 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print 'key ordering...' 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao start = f.set_location(f.first()[0]) 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if start != ('0', ''): 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail("incorrect first() result: "+repr(start)) 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while 1: 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f.next() 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except KeyError: 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(rec, f.last(), 'Error, last <> last!') 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.previous() 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao break 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print rec 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(f.has_key('f'), 'Error, missing key!') 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # test that set_location() returns the next nearest key, value 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # on btree databases and raises KeyError on others. 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if factory == btopen: 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao e = f.set_location('e') 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if e != ('f', 'Python'): 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail('wrong key,value returned: '+repr(e)) 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao e = f.set_location('e') 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except KeyError: 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail("set_location on non-existent key did not raise KeyError") 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.sync() 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # truth test 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if f: 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: print "truth test: true" 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: print "truth test: false" 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except db.DBError: 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail("Exception expected") 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del f 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print 'modification...' 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = factory(self.filename, 'w') 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f['d'] = 'discovered' 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print 'access...' 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for key in f.keys(): 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao word = f[key] 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if verbose: 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print word 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def noRec(f): 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f['no such key'] 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, noRec, f) 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def badKey(f): 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rec = f[15] 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, badKey, f) 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao#---------------------------------------------------------------------- 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_suite(): 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return unittest.makeSuite(CompatibilityTestCase) 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == '__main__': 1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unittest.main(defaultTest='test_suite') 185