summaryrefslogtreecommitdiffstats
path: root/Lib/bsddb/test/test_early_close.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/bsddb/test/test_early_close.py')
-rw-r--r--Lib/bsddb/test/test_early_close.py195
1 files changed, 0 insertions, 195 deletions
diff --git a/Lib/bsddb/test/test_early_close.py b/Lib/bsddb/test/test_early_close.py
deleted file mode 100644
index e944cc6..0000000
--- a/Lib/bsddb/test/test_early_close.py
+++ /dev/null
@@ -1,195 +0,0 @@
-"""TestCases for checking that it does not segfault when a DBEnv object
-is closed before its DB objects.
-"""
-
-import os
-import unittest
-
-from .test_all import db, test_support, verbose, get_new_environment_path, get_new_database_path
-
-# 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 = get_new_environment_path()
- self.filename = "test"
-
- def tearDown(self):
- test_support.rmtree(self.homeDir)
-
- 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,
- 0o666)
-
- d = db.DB(dbenv)
- d2 = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
-
- self.assertRaises(db.DBNoSuchFileError, d2.open,
- self.filename+"2", db.DB_BTREE, db.DB_THREAD, 0o666)
-
- d.put("test","this is a test")
- self.assertEqual(d.get("test"), "this is a test", "put!=get")
- dbenv.close() # This "close" should close the child db handle also
- self.assertRaises(db.DBError, d.get, "test")
-
- def test02_close_dbenv_before_dbcursor(self):
- dbenv = db.DBEnv()
- dbenv.open(self.homeDir,
- db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
- 0o666)
-
- d = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
-
- d.put("test","this is a test")
- d.put("test2","another test")
- d.put("test3","another one")
- self.assertEqual(d.get("test"), "this is a test", "put!=get")
- c=d.cursor()
- c.first()
- next(c)
- d.close() # This "close" should close the child db handle also
- # db.close should close the child cursor
- self.assertRaises(db.DBError,c.__next__)
-
- d = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
- c=d.cursor()
- c.first()
- next(c)
- dbenv.close()
- # The "close" should close the child db handle also, with cursors
- self.assertRaises(db.DBError, c.__next__)
-
- def test03_close_db_before_dbcursor_without_env(self):
- import os.path
- path=os.path.join(self.homeDir,self.filename)
- d = db.DB()
- d.open(path, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
-
- d.put("test","this is a test")
- d.put("test2","another test")
- d.put("test3","another one")
- self.assertEqual(d.get("test"), "this is a test", "put!=get")
- c=d.cursor()
- c.first()
- next(c)
- d.close()
- # The "close" should close the child db handle also
- self.assertRaises(db.DBError, c.__next__)
-
- def test04_close_massive(self):
- dbenv = db.DBEnv()
- dbenv.open(self.homeDir,
- db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
- 0o666)
-
- dbs=[db.DB(dbenv) for i in range(16)]
- cursors=[]
- for i in dbs :
- i.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
-
- dbs[10].put("test","this is a test")
- dbs[10].put("test2","another test")
- dbs[10].put("test3","another one")
- self.assertEqual(dbs[4].get("test"), "this is a test", "put!=get")
-
- for i in dbs :
- cursors.extend([i.cursor() for j in range(32)])
-
- for i in dbs[::3] :
- i.close()
- for i in cursors[::3] :
- i.close()
-
- # Check for missing exception in DB! (after DB close)
- self.assertRaises(db.DBError, dbs[9].get, "test")
-
- # Check for missing exception in DBCursor! (after DB close)
- self.assertRaises(db.DBError, cursors[101].first)
-
- cursors[80].first()
- next(cursors[80])
- dbenv.close() # This "close" should close the child db handle also
- # Check for missing exception! (after DBEnv close)
- self.assertRaises(db.DBError, cursors[80].__next__)
-
- def test05_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,
- 0o666)
-
- d = db.DB(dbenv)
- d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
-
- dbenv.close() # This "close" should close the child db handle also
-
- del d
- try:
- import gc
- except ImportError:
- gc = None
- if gc:
- # force d.__del__ [DB_dealloc] to be called
- gc.collect()
-
- def test06_close_txn_before_dup_cursor(self) :
- dbenv = db.DBEnv()
- dbenv.open(self.homeDir,db.DB_INIT_TXN | db.DB_INIT_MPOOL |
- db.DB_INIT_LOG | db.DB_CREATE)
- d = db.DB(dbenv)
- txn = dbenv.txn_begin()
- if db.version() < (4,1) :
- d.open(self.filename, dbtype = db.DB_HASH, flags = db.DB_CREATE)
- else :
- d.open(self.filename, dbtype = db.DB_HASH, flags = db.DB_CREATE,
- txn=txn)
- d.put("XXX", "yyy", txn=txn)
- txn.commit()
- txn = dbenv.txn_begin()
- c1 = d.cursor(txn)
- c2 = c1.dup()
- self.assertEquals(("XXX", "yyy"), c1.first())
- import warnings
- # Not interested in warnings about implicit close.
- warnings.simplefilter("ignore")
- txn.commit()
- warnings.resetwarnings()
- self.assertRaises(db.DBCursorClosedError, c2.first)
-
- if db.version() > (4,3,0) :
- def test07_close_db_before_sequence(self):
- import os.path
- path=os.path.join(self.homeDir,self.filename)
- d = db.DB()
- d.open(path, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0o666)
- dbs=db.DBSequence(d)
- d.close() # This "close" should close the child DBSequence also
- dbs.close() # If not closed, core dump (in Berkeley DB 4.6.*)
-
-#----------------------------------------------------------------------
-
-def test_suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(DBEnvClosedEarlyCrash))
- return suite
-
-
-if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')