diff options
Diffstat (limited to 'lib/python2.7/bsddb/test/test_compare.py')
-rw-r--r-- | lib/python2.7/bsddb/test/test_compare.py | 447 |
1 files changed, 0 insertions, 447 deletions
diff --git a/lib/python2.7/bsddb/test/test_compare.py b/lib/python2.7/bsddb/test/test_compare.py deleted file mode 100644 index cb3b463..0000000 --- a/lib/python2.7/bsddb/test/test_compare.py +++ /dev/null @@ -1,447 +0,0 @@ -""" -TestCases for python DB duplicate and Btree key comparison function. -""" - -import sys, os, re -import test_all -from cStringIO import StringIO - -import unittest - -from test_all import db, dbshelve, test_support, \ - get_new_environment_path, get_new_database_path - - -# Needed for python 3. "cmp" vanished in 3.0.1 -def cmp(a, b) : - if a==b : return 0 - if a<b : return -1 - return 1 - -lexical_cmp = cmp - -def lowercase_cmp(left, right) : - return cmp(left.lower(), right.lower()) - -def make_reverse_comparator(cmp) : - def reverse(left, right, delegate=cmp) : - return - delegate(left, right) - return reverse - -_expected_lexical_test_data = ['', 'CCCP', 'a', 'aaa', 'b', 'c', 'cccce', 'ccccf'] -_expected_lowercase_test_data = ['', 'a', 'aaa', 'b', 'c', 'CC', 'cccce', 'ccccf', 'CCCP'] - -class ComparatorTests(unittest.TestCase) : - def comparator_test_helper(self, comparator, expected_data) : - data = expected_data[:] - - import sys - if sys.version_info < (2, 6) : - data.sort(cmp=comparator) - else : # Insertion Sort. Please, improve - data2 = [] - for i in data : - for j, k in enumerate(data2) : - r = comparator(k, i) - if r == 1 : - data2.insert(j, i) - break - else : - data2.append(i) - data = data2 - - self.assertEqual(data, expected_data, - "comparator `%s' is not right: %s vs. %s" - % (comparator, expected_data, data)) - def test_lexical_comparator(self) : - self.comparator_test_helper(lexical_cmp, _expected_lexical_test_data) - def test_reverse_lexical_comparator(self) : - rev = _expected_lexical_test_data[:] - rev.reverse() - self.comparator_test_helper(make_reverse_comparator(lexical_cmp), - rev) - def test_lowercase_comparator(self) : - self.comparator_test_helper(lowercase_cmp, - _expected_lowercase_test_data) - -class AbstractBtreeKeyCompareTestCase(unittest.TestCase) : - env = None - db = None - - if (sys.version_info < (2, 7)) or ((sys.version_info >= (3,0)) and - (sys.version_info < (3, 2))) : - def assertLess(self, a, b, msg=None) : - return self.assertTrue(a<b, msg=msg) - - def setUp(self) : - self.filename = self.__class__.__name__ + '.db' - self.homeDir = get_new_environment_path() - env = db.DBEnv() - env.open(self.homeDir, - db.DB_CREATE | db.DB_INIT_MPOOL - | db.DB_INIT_LOCK | db.DB_THREAD) - self.env = env - - def tearDown(self) : - self.closeDB() - if self.env is not None: - self.env.close() - self.env = None - test_support.rmtree(self.homeDir) - - def addDataToDB(self, data) : - i = 0 - for item in data: - self.db.put(item, str(i)) - i = i + 1 - - def createDB(self, key_comparator) : - self.db = db.DB(self.env) - self.setupDB(key_comparator) - self.db.open(self.filename, "test", db.DB_BTREE, db.DB_CREATE) - - def setupDB(self, key_comparator) : - self.db.set_bt_compare(key_comparator) - - def closeDB(self) : - if self.db is not None: - self.db.close() - self.db = None - - def startTest(self) : - pass - - def finishTest(self, expected = None) : - if expected is not None: - self.check_results(expected) - self.closeDB() - - def check_results(self, expected) : - curs = self.db.cursor() - try: - index = 0 - rec = curs.first() - while rec: - key, ignore = rec - self.assertLess(index, len(expected), - "to many values returned from cursor") - self.assertEqual(expected[index], key, - "expected value `%s' at %d but got `%s'" - % (expected[index], index, key)) - index = index + 1 - rec = curs.next() - self.assertEqual(index, len(expected), - "not enough values returned from cursor") - finally: - curs.close() - -class BtreeKeyCompareTestCase(AbstractBtreeKeyCompareTestCase) : - def runCompareTest(self, comparator, data) : - self.startTest() - self.createDB(comparator) - self.addDataToDB(data) - self.finishTest(data) - - def test_lexical_ordering(self) : - self.runCompareTest(lexical_cmp, _expected_lexical_test_data) - - def test_reverse_lexical_ordering(self) : - expected_rev_data = _expected_lexical_test_data[:] - expected_rev_data.reverse() - self.runCompareTest(make_reverse_comparator(lexical_cmp), - expected_rev_data) - - def test_compare_function_useless(self) : - self.startTest() - def socialist_comparator(l, r) : - return 0 - self.createDB(socialist_comparator) - self.addDataToDB(['b', 'a', 'd']) - # all things being equal the first key will be the only key - # in the database... (with the last key's value fwiw) - self.finishTest(['b']) - - -class BtreeExceptionsTestCase(AbstractBtreeKeyCompareTestCase) : - def test_raises_non_callable(self) : - self.startTest() - self.assertRaises(TypeError, self.createDB, 'abc') - self.assertRaises(TypeError, self.createDB, None) - self.finishTest() - - def test_set_bt_compare_with_function(self) : - self.startTest() - self.createDB(lexical_cmp) - self.finishTest() - - def check_results(self, results) : - pass - - def test_compare_function_incorrect(self) : - self.startTest() - def bad_comparator(l, r) : - return 1 - # verify that set_bt_compare checks that comparator('', '') == 0 - self.assertRaises(TypeError, self.createDB, bad_comparator) - self.finishTest() - - def verifyStderr(self, method, successRe) : - """ - Call method() while capturing sys.stderr output internally and - call self.fail() if successRe.search() does not match the stderr - output. This is used to test for uncatchable exceptions. - """ - stdErr = sys.stderr - sys.stderr = StringIO() - try: - method() - finally: - temp = sys.stderr - sys.stderr = stdErr - errorOut = temp.getvalue() - if not successRe.search(errorOut) : - self.fail("unexpected stderr output:\n"+errorOut) - if sys.version_info < (3, 0) : # XXX: How to do this in Py3k ??? - sys.exc_traceback = sys.last_traceback = None - - def _test_compare_function_exception(self) : - self.startTest() - def bad_comparator(l, r) : - if l == r: - # pass the set_bt_compare test - return 0 - raise RuntimeError, "i'm a naughty comparison function" - self.createDB(bad_comparator) - #print "\n*** test should print 2 uncatchable tracebacks ***" - self.addDataToDB(['a', 'b', 'c']) # this should raise, but... - self.finishTest() - - def test_compare_function_exception(self) : - self.verifyStderr( - self._test_compare_function_exception, - re.compile('(^RuntimeError:.* naughty.*){2}', re.M|re.S) - ) - - def _test_compare_function_bad_return(self) : - self.startTest() - def bad_comparator(l, r) : - if l == r: - # pass the set_bt_compare test - return 0 - return l - self.createDB(bad_comparator) - #print "\n*** test should print 2 errors about returning an int ***" - self.addDataToDB(['a', 'b', 'c']) # this should raise, but... - self.finishTest() - - def test_compare_function_bad_return(self) : - self.verifyStderr( - self._test_compare_function_bad_return, - re.compile('(^TypeError:.* return an int.*){2}', re.M|re.S) - ) - - - def test_cannot_assign_twice(self) : - - def my_compare(a, b) : - return 0 - - self.startTest() - self.createDB(my_compare) - self.assertRaises(RuntimeError, self.db.set_bt_compare, my_compare) - -class AbstractDuplicateCompareTestCase(unittest.TestCase) : - env = None - db = None - - if (sys.version_info < (2, 7)) or ((sys.version_info >= (3,0)) and - (sys.version_info < (3, 2))) : - def assertLess(self, a, b, msg=None) : - return self.assertTrue(a<b, msg=msg) - - def setUp(self) : - self.filename = self.__class__.__name__ + '.db' - self.homeDir = get_new_environment_path() - env = db.DBEnv() - env.open(self.homeDir, - db.DB_CREATE | db.DB_INIT_MPOOL - | db.DB_INIT_LOCK | db.DB_THREAD) - self.env = env - - def tearDown(self) : - self.closeDB() - if self.env is not None: - self.env.close() - self.env = None - test_support.rmtree(self.homeDir) - - def addDataToDB(self, data) : - for item in data: - self.db.put("key", item) - - def createDB(self, dup_comparator) : - self.db = db.DB(self.env) - self.setupDB(dup_comparator) - self.db.open(self.filename, "test", db.DB_BTREE, db.DB_CREATE) - - def setupDB(self, dup_comparator) : - self.db.set_flags(db.DB_DUPSORT) - self.db.set_dup_compare(dup_comparator) - - def closeDB(self) : - if self.db is not None: - self.db.close() - self.db = None - - def startTest(self) : - pass - - def finishTest(self, expected = None) : - if expected is not None: - self.check_results(expected) - self.closeDB() - - def check_results(self, expected) : - curs = self.db.cursor() - try: - index = 0 - rec = curs.first() - while rec: - ignore, data = rec - self.assertLess(index, len(expected), - "to many values returned from cursor") - self.assertEqual(expected[index], data, - "expected value `%s' at %d but got `%s'" - % (expected[index], index, data)) - index = index + 1 - rec = curs.next() - self.assertEqual(index, len(expected), - "not enough values returned from cursor") - finally: - curs.close() - -class DuplicateCompareTestCase(AbstractDuplicateCompareTestCase) : - def runCompareTest(self, comparator, data) : - self.startTest() - self.createDB(comparator) - self.addDataToDB(data) - self.finishTest(data) - - def test_lexical_ordering(self) : - self.runCompareTest(lexical_cmp, _expected_lexical_test_data) - - def test_reverse_lexical_ordering(self) : - expected_rev_data = _expected_lexical_test_data[:] - expected_rev_data.reverse() - self.runCompareTest(make_reverse_comparator(lexical_cmp), - expected_rev_data) - -class DuplicateExceptionsTestCase(AbstractDuplicateCompareTestCase) : - def test_raises_non_callable(self) : - self.startTest() - self.assertRaises(TypeError, self.createDB, 'abc') - self.assertRaises(TypeError, self.createDB, None) - self.finishTest() - - def test_set_dup_compare_with_function(self) : - self.startTest() - self.createDB(lexical_cmp) - self.finishTest() - - def check_results(self, results) : - pass - - def test_compare_function_incorrect(self) : - self.startTest() - def bad_comparator(l, r) : - return 1 - # verify that set_dup_compare checks that comparator('', '') == 0 - self.assertRaises(TypeError, self.createDB, bad_comparator) - self.finishTest() - - def test_compare_function_useless(self) : - self.startTest() - def socialist_comparator(l, r) : - return 0 - self.createDB(socialist_comparator) - # DUPSORT does not allow "duplicate duplicates" - self.assertRaises(db.DBKeyExistError, self.addDataToDB, ['b', 'a', 'd']) - self.finishTest() - - def verifyStderr(self, method, successRe) : - """ - Call method() while capturing sys.stderr output internally and - call self.fail() if successRe.search() does not match the stderr - output. This is used to test for uncatchable exceptions. - """ - stdErr = sys.stderr - sys.stderr = StringIO() - try: - method() - finally: - temp = sys.stderr - sys.stderr = stdErr - errorOut = temp.getvalue() - if not successRe.search(errorOut) : - self.fail("unexpected stderr output:\n"+errorOut) - if sys.version_info < (3, 0) : # XXX: How to do this in Py3k ??? - sys.exc_traceback = sys.last_traceback = None - - def _test_compare_function_exception(self) : - self.startTest() - def bad_comparator(l, r) : - if l == r: - # pass the set_dup_compare test - return 0 - raise RuntimeError, "i'm a naughty comparison function" - self.createDB(bad_comparator) - #print "\n*** test should print 2 uncatchable tracebacks ***" - self.addDataToDB(['a', 'b', 'c']) # this should raise, but... - self.finishTest() - - def test_compare_function_exception(self) : - self.verifyStderr( - self._test_compare_function_exception, - re.compile('(^RuntimeError:.* naughty.*){2}', re.M|re.S) - ) - - def _test_compare_function_bad_return(self) : - self.startTest() - def bad_comparator(l, r) : - if l == r: - # pass the set_dup_compare test - return 0 - return l - self.createDB(bad_comparator) - #print "\n*** test should print 2 errors about returning an int ***" - self.addDataToDB(['a', 'b', 'c']) # this should raise, but... - self.finishTest() - - def test_compare_function_bad_return(self) : - self.verifyStderr( - self._test_compare_function_bad_return, - re.compile('(^TypeError:.* return an int.*){2}', re.M|re.S) - ) - - - def test_cannot_assign_twice(self) : - - def my_compare(a, b) : - return 0 - - self.startTest() - self.createDB(my_compare) - self.assertRaises(RuntimeError, self.db.set_dup_compare, my_compare) - -def test_suite() : - res = unittest.TestSuite() - - res.addTest(unittest.makeSuite(ComparatorTests)) - res.addTest(unittest.makeSuite(BtreeExceptionsTestCase)) - res.addTest(unittest.makeSuite(BtreeKeyCompareTestCase)) - res.addTest(unittest.makeSuite(DuplicateExceptionsTestCase)) - res.addTest(unittest.makeSuite(DuplicateCompareTestCase)) - return res - -if __name__ == '__main__': - unittest.main(defaultTest = 'suite') |