183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Test driver for bsddb package.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehRun all test cases.
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport tempfile
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport time
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test.test_support import requires, run_unittest, import_module
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Skip test if _bsddb module was not built.
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport_module('_bsddb')
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Silence Py3k warning
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport_module('bsddb', deprecated=True)
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# When running as a script instead of within the regrtest framework, skip the
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# requires test, since it's obvious we want to run them.
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ != '__main__':
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    requires('bsddb')
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehverbose = False
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif 'verbose' in sys.argv:
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    verbose = True
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    sys.argv.remove('verbose')
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif 'silent' in sys.argv:  # take care of old flag, just in case
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    verbose = False
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    sys.argv.remove('silent')
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TimingCheck(unittest.TestCase):
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """This class is not a real test.  Its purpose is to print a message
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    periodically when the test runs slowly.  This will prevent the buildbots
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from timing out on slow machines."""
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # How much time in seconds before printing a 'Still working' message.
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Since this is run at most once between each test module, use a smaller
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # interval than other tests.
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    _PRINT_WORKING_MSG_INTERVAL = 4 * 60
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # next_time is used as a global variable that survives each instance.
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # This is necessary since a new instance will be created for each test.
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testCheckElapsedTime(self):
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Print still working message since these tests can be really slow.
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        now = time.time()
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.next_time <= now:
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TimingCheck.next_time = now + self._PRINT_WORKING_MSG_INTERVAL
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            sys.__stdout__.write('  test_bsddb3 still working, be patient...\n')
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            sys.__stdout__.flush()
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# For invocation through regrtest
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from bsddb import db
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from bsddb.test import test_all
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_all.set_test_path_prefix(os.path.join(tempfile.gettempdir(),
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 'z-test_bsddb3-%s' %
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 os.getpid()))
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Please leave this print in, having this show up in the buildbots
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # makes diagnosing problems a lot easier.
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    print >>sys.stderr, db.DB_VERSION_STRING
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    print >>sys.stderr, 'Test path prefix: ', test_all.get_test_path_prefix()
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    try:
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        run_unittest(test_all.suite(module_prefix='bsddb.test.',
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                    timing_check=TimingCheck))
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    finally:
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The only reason to remove db_home is in case if there is an old
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # one lying around.  This might be by a different user, so just
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # ignore errors.  We should always make a unique name now.
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            test_all.remove_test_path_directory()
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except:
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == '__main__':
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
82