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