blob: 105be44239057231eabd68b97d01d5e306040135 [file] [log] [blame]
Barry Warsaw9a0d7792002-12-30 20:53:52 +00001"""TestCases for checking that it does not segfault when a DBEnv object
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +00002is closed before its DB objects.
3"""
4
Barry Warsaw9a0d7792002-12-30 20:53:52 +00005import os
6import sys
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +00007import tempfile
8import glob
9import unittest
10
Barry Warsawf71de3e2003-01-28 17:20:44 +000011try:
12 # For Python 2.3
13 from bsddb import db
14except ImportError:
15 # For earlier Pythons w/distutils pybsddb
16 from bsddb3 import db
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000017
Barry Warsaw9a0d7792002-12-30 20:53:52 +000018from test_all import verbose
19
20# We're going to get warnings in this module about trying to close the db when
21# its env is already closed. Let's just ignore those.
22try:
23 import warnings
24except ImportError:
25 pass
26else:
27 warnings.filterwarnings('ignore',
28 message='DB could not be closed in',
29 category=RuntimeWarning)
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000030
31
32#----------------------------------------------------------------------
33
34class DBEnvClosedEarlyCrash(unittest.TestCase):
35 def setUp(self):
36 self.homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home')
37 try: os.mkdir(self.homeDir)
38 except os.error: pass
39 tempfile.tempdir = self.homeDir
40 self.filename = os.path.split(tempfile.mktemp())[1]
41 tempfile.tempdir = None
42
43 def tearDown(self):
44 files = glob.glob(os.path.join(self.homeDir, '*'))
45 for file in files:
46 os.remove(file)
47
48
49 def test01_close_dbenv_before_db(self):
50 dbenv = db.DBEnv()
Barry Warsaw9a0d7792002-12-30 20:53:52 +000051 dbenv.open(self.homeDir,
52 db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
53 0666)
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000054
55 d = db.DB(dbenv)
56 d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0666)
57
58 try:
59 dbenv.close()
60 except db.DBError:
61 try:
62 d.close()
63 except db.DBError:
64 return
Barry Warsaw9a0d7792002-12-30 20:53:52 +000065 assert 0, \
66 "DB close did not raise an exception about its "\
67 "DBEnv being trashed"
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000068
Barry Warsawbc38baf2002-12-31 18:21:43 +000069 # XXX This may fail when using older versions of BerkeleyDB.
70 # E.g. 3.2.9 never raised the exception.
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000071 assert 0, "dbenv did not raise an exception about its DB being open"
72
73
74 def test02_close_dbenv_delete_db_success(self):
75 dbenv = db.DBEnv()
Barry Warsaw9a0d7792002-12-30 20:53:52 +000076 dbenv.open(self.homeDir,
77 db.DB_INIT_CDB| db.DB_CREATE |db.DB_THREAD|db.DB_INIT_MPOOL,
78 0666)
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000079
80 d = db.DB(dbenv)
81 d.open(self.filename, db.DB_BTREE, db.DB_CREATE | db.DB_THREAD, 0666)
82
83 try:
84 dbenv.close()
85 except db.DBError:
86 pass # good, it should raise an exception
87
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +000088 del d
89 try:
90 import gc
91 except ImportError:
92 gc = None
93 if gc:
94 # force d.__del__ [DB_dealloc] to be called
95 gc.collect()
96
97
98#----------------------------------------------------------------------
99
Barry Warsaw9a0d7792002-12-30 20:53:52 +0000100def test_suite():
101 suite = unittest.TestSuite()
102 suite.addTest(unittest.makeSuite(DBEnvClosedEarlyCrash))
103 return suite
Martin v. Löwis1c6b1a22002-11-19 17:47:07 +0000104
105
106if __name__ == '__main__':
Barry Warsaw9a0d7792002-12-30 20:53:52 +0000107 unittest.main(defaultTest='test_suite')