home *** CD-ROM | disk | FTP | other *** search
- """TestCases for checking that it does not segfault when a DBEnv object
- is closed before its DB objects.
- """
-
- import os
- import sys
- import tempfile
- import glob
- import unittest
-
- try:
- # For Python 2.3
- from bsddb import db
- except ImportError:
- # For earlier Pythons w/distutils pybsddb
- from bsddb3 import db
-
- from test_all import verbose
-
- # We're going to get warnings in this module about trying to close the db when
- # its env is already closed. Let's just ignore those.
- try:
- import warnings
- except ImportError:
- pass
- else:
- warnings.filterwarnings('ignore',
- message='DB could not be closed in',
- category=RuntimeWarning)
-
-
- #----------------------------------------------------------------------
-
- class DBEnvClosedEarlyCrash(unittest.TestCase):
- def setUp(self):
- self.homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home')
- try: os.mkdir(self.homeDir)
- except os.error: pass
- tempfile.tempdir = self.homeDir
- self.filename = os.path.split(tempfile.mktemp())[1]
- tempfile.tempdir = None
-
- def tearDown(self):
- files = glob.glob(os.path.join(self.homeDir, '*'))
- for file in files:
- os.remove(file)
-
-
- def test01_close_dbenv_before_db(self):
- dbenv = db.DBEnv()
- dbenv.open(self.homeDir,
- db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
- 0666)
-
- d = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0666)
-
- try:
- dbenv.close()
- except db.DBError:
- try:
- d.close()
- except db.DBError:
- return
- assert 0, \
- "DB close did not raise an exception about its "\
- "DBEnv being trashed"
-
- # XXX This may fail when using older versions of BerkeleyDB.
- # E.g. 3.2.9 never raised the exception.
- assert 0, "dbenv did not raise an exception about its DB being open"
-
-
- def test02_close_dbenv_delete_db_success(self):
- dbenv = db.DBEnv()
- dbenv.open(self.homeDir,
- db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
- 0666)
-
- d = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0666)
-
- try:
- dbenv.close()
- except db.DBError:
- pass # good, it should raise an exception
-
- del d
- try:
- import gc
- except ImportError:
- gc = None
- if gc:
- # force d.__del__ [DB_dealloc] to be called
- gc.collect()
-
-
- #----------------------------------------------------------------------
-
- def test_suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(DBEnvClosedEarlyCrash))
- return suite
-
-
- if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')
-