mirror of https://github.com/python/cpython
85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
|
"""
|
||
|
TestCases for checking that it does not segfault when a DBEnv object
|
||
|
is closed before its DB objects.
|
||
|
"""
|
||
|
|
||
|
import sys, os, string
|
||
|
from pprint import pprint
|
||
|
import tempfile
|
||
|
import glob
|
||
|
import unittest
|
||
|
|
||
|
from bsddb import db
|
||
|
|
||
|
from test.test_support import verbose
|
||
|
|
||
|
|
||
|
#----------------------------------------------------------------------
|
||
|
|
||
|
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"
|
||
|
|
||
|
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
|
||
|
|
||
|
# this should not raise an exception, it should silently skip
|
||
|
# the db->close() call as it can't be done safely.
|
||
|
del d
|
||
|
try:
|
||
|
import gc
|
||
|
except ImportError:
|
||
|
gc = None
|
||
|
if gc:
|
||
|
# force d.__del__ [DB_dealloc] to be called
|
||
|
gc.collect()
|
||
|
|
||
|
|
||
|
#----------------------------------------------------------------------
|
||
|
|
||
|
def suite():
|
||
|
return unittest.makeSuite(DBEnvClosedEarlyCrash)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main( defaultTest='suite' )
|