mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			514 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			514 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import unittest | ||
|  | import os, glob | ||
|  | 
 | ||
|  | from test_all import db, test_support, get_new_environment_path, \ | ||
|  |         get_new_database_path | ||
|  | 
 | ||
|  | #---------------------------------------------------------------------- | ||
|  | 
 | ||
|  | class DBEnv(unittest.TestCase): | ||
|  |     import sys | ||
|  |     if sys.version_info < (2, 4) : | ||
|  |         def assertTrue(self, expr, msg=None): | ||
|  |             self.failUnless(expr,msg=msg) | ||
|  | 
 | ||
|  |         def assertFalse(self, expr, msg=None): | ||
|  |             self.failIf(expr,msg=msg) | ||
|  | 
 | ||
|  |     def setUp(self): | ||
|  |         self.homeDir = get_new_environment_path() | ||
|  |         self.env = db.DBEnv() | ||
|  | 
 | ||
|  |     def tearDown(self): | ||
|  |         self.env.close() | ||
|  |         del self.env | ||
|  |         test_support.rmtree(self.homeDir) | ||
|  | 
 | ||
|  | class DBEnv_general(DBEnv) : | ||
|  |     if db.version() >= (4, 7) : | ||
|  |         def test_lk_partitions(self) : | ||
|  |             for i in [10, 20, 40] : | ||
|  |                 self.env.set_lk_partitions(i) | ||
|  |                 self.assertEqual(i, self.env.get_lk_partitions()) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 6) : | ||
|  |         def test_thread(self) : | ||
|  |             for i in [16, 100, 1000] : | ||
|  |                 self.env.set_thread_count(i) | ||
|  |                 self.assertEqual(i, self.env.get_thread_count()) | ||
|  | 
 | ||
|  |         def test_cache_max(self) : | ||
|  |             for size in [64, 128] : | ||
|  |                 size = size*1024*1024  # Megabytes | ||
|  |                 self.env.set_cache_max(0, size) | ||
|  |                 size2 = self.env.get_cache_max() | ||
|  |                 self.assertEqual(0, size2[0]) | ||
|  |                 self.assertTrue(size <= size2[1]) | ||
|  |                 self.assertTrue(2*size > size2[1]) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 4) : | ||
|  |         def test_mutex_stat(self) : | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | | ||
|  |                     db.DB_INIT_LOCK) | ||
|  |             stat = self.env.mutex_stat() | ||
|  |             self.assertTrue("mutex_inuse_max" in stat) | ||
|  | 
 | ||
|  |         def test_lg_filemode(self) : | ||
|  |             for i in [0600, 0660, 0666] : | ||
|  |                 self.env.set_lg_filemode(i) | ||
|  |                 self.assertEqual(i, self.env.get_lg_filemode()) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 3) : | ||
|  |         def test_mp_max_openfd(self) : | ||
|  |             for i in [17, 31, 42] : | ||
|  |                 self.env.set_mp_max_openfd(i) | ||
|  |                 self.assertEqual(i, self.env.get_mp_max_openfd()) | ||
|  | 
 | ||
|  |         def test_mp_max_write(self) : | ||
|  |             for i in [100, 200, 300] : | ||
|  |                 for j in [1, 2, 3] : | ||
|  |                     j *= 1000000 | ||
|  |                     self.env.set_mp_max_write(i, j) | ||
|  |                     v=self.env.get_mp_max_write() | ||
|  |                     self.assertEqual((i, j), v) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 2) : | ||
|  |         def test_invalid_txn(self) : | ||
|  |             # This environment doesn't support transactions | ||
|  |             self.assertRaises(db.DBInvalidArgError, self.env.txn_begin) | ||
|  | 
 | ||
|  |         def test_mp_mmapsize(self) : | ||
|  |             for i in [16, 32, 64] : | ||
|  |                 i *= 1024*1024 | ||
|  |                 self.env.set_mp_mmapsize(i) | ||
|  |                 self.assertEqual(i, self.env.get_mp_mmapsize()) | ||
|  | 
 | ||
|  |         def test_tmp_dir(self) : | ||
|  |             for i in ["a", "bb", "ccc"] : | ||
|  |                 self.env.set_tmp_dir(i) | ||
|  |                 self.assertEqual(i, self.env.get_tmp_dir()) | ||
|  | 
 | ||
|  |         def test_flags(self) : | ||
|  |             self.env.set_flags(db.DB_AUTO_COMMIT, 1) | ||
|  |             self.assertEqual(db.DB_AUTO_COMMIT, self.env.get_flags()) | ||
|  |             self.env.set_flags(db.DB_TXN_NOSYNC, 1) | ||
|  |             self.assertEqual(db.DB_AUTO_COMMIT | db.DB_TXN_NOSYNC, | ||
|  |                     self.env.get_flags()) | ||
|  |             self.env.set_flags(db.DB_AUTO_COMMIT, 0) | ||
|  |             self.assertEqual(db.DB_TXN_NOSYNC, self.env.get_flags()) | ||
|  |             self.env.set_flags(db.DB_TXN_NOSYNC, 0) | ||
|  |             self.assertEqual(0, self.env.get_flags()) | ||
|  | 
 | ||
|  |         def test_lk_max_objects(self) : | ||
|  |             for i in [1000, 2000, 3000] : | ||
|  |                 self.env.set_lk_max_objects(i) | ||
|  |                 self.assertEqual(i, self.env.get_lk_max_objects()) | ||
|  | 
 | ||
|  |         def test_lk_max_locks(self) : | ||
|  |             for i in [1000, 2000, 3000] : | ||
|  |                 self.env.set_lk_max_locks(i) | ||
|  |                 self.assertEqual(i, self.env.get_lk_max_locks()) | ||
|  | 
 | ||
|  |         def test_lk_max_lockers(self) : | ||
|  |             for i in [1000, 2000, 3000] : | ||
|  |                 self.env.set_lk_max_lockers(i) | ||
|  |                 self.assertEqual(i, self.env.get_lk_max_lockers()) | ||
|  | 
 | ||
|  |         def test_lg_regionmax(self) : | ||
|  |             for i in [128, 256, 1024] : | ||
|  |                 i = i*1024*1024 | ||
|  |                 self.env.set_lg_regionmax(i) | ||
|  |                 j = self.env.get_lg_regionmax() | ||
|  |                 self.assertTrue(i <= j) | ||
|  |                 self.assertTrue(2*i > j) | ||
|  | 
 | ||
|  |         def test_lk_detect(self) : | ||
|  |             flags= [db.DB_LOCK_DEFAULT, db.DB_LOCK_EXPIRE, db.DB_LOCK_MAXLOCKS, | ||
|  |                     db.DB_LOCK_MINLOCKS, db.DB_LOCK_MINWRITE, | ||
|  |                     db.DB_LOCK_OLDEST, db.DB_LOCK_RANDOM, db.DB_LOCK_YOUNGEST] | ||
|  | 
 | ||
|  |             if db.version() >= (4, 3) : | ||
|  |                 flags.append(db.DB_LOCK_MAXWRITE) | ||
|  | 
 | ||
|  |             for i in flags : | ||
|  |                 self.env.set_lk_detect(i) | ||
|  |                 self.assertEqual(i, self.env.get_lk_detect()) | ||
|  | 
 | ||
|  |         def test_lg_dir(self) : | ||
|  |             for i in ["a", "bb", "ccc", "dddd"] : | ||
|  |                 self.env.set_lg_dir(i) | ||
|  |                 self.assertEqual(i, self.env.get_lg_dir()) | ||
|  | 
 | ||
|  |         def test_lg_bsize(self) : | ||
|  |             log_size = 70*1024 | ||
|  |             self.env.set_lg_bsize(log_size) | ||
|  |             self.assertTrue(self.env.get_lg_bsize() >= log_size) | ||
|  |             self.assertTrue(self.env.get_lg_bsize() < 4*log_size) | ||
|  |             self.env.set_lg_bsize(4*log_size) | ||
|  |             self.assertTrue(self.env.get_lg_bsize() >= 4*log_size) | ||
|  | 
 | ||
|  |         def test_setget_data_dirs(self) : | ||
|  |             dirs = ("a", "b", "c", "d") | ||
|  |             for i in dirs : | ||
|  |                 self.env.set_data_dir(i) | ||
|  |             self.assertEqual(dirs, self.env.get_data_dirs()) | ||
|  | 
 | ||
|  |         def test_setget_cachesize(self) : | ||
|  |             cachesize = (0, 512*1024*1024, 3) | ||
|  |             self.env.set_cachesize(*cachesize) | ||
|  |             self.assertEqual(cachesize, self.env.get_cachesize()) | ||
|  | 
 | ||
|  |             cachesize = (0, 1*1024*1024, 5) | ||
|  |             self.env.set_cachesize(*cachesize) | ||
|  |             cachesize2 = self.env.get_cachesize() | ||
|  |             self.assertEqual(cachesize[0], cachesize2[0]) | ||
|  |             self.assertEqual(cachesize[2], cachesize2[2]) | ||
|  |             # Berkeley DB expands the cache 25% accounting overhead, | ||
|  |             # if the cache is small. | ||
|  |             self.assertEqual(125, int(100.0*cachesize2[1]/cachesize[1])) | ||
|  | 
 | ||
|  |             # You can not change configuration after opening | ||
|  |             # the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL) | ||
|  |             cachesize = (0, 2*1024*1024, 1) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                 self.env.set_cachesize, *cachesize) | ||
|  |             self.assertEqual(cachesize2, self.env.get_cachesize()) | ||
|  | 
 | ||
|  |         def test_set_cachesize_dbenv_db(self) : | ||
|  |             # You can not configure the cachesize using | ||
|  |             # the database handle, if you are using an environment. | ||
|  |             d = db.DB(self.env) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                 d.set_cachesize, 0, 1024*1024, 1) | ||
|  | 
 | ||
|  |         def test_setget_shm_key(self) : | ||
|  |             shm_key=137 | ||
|  |             self.env.set_shm_key(shm_key) | ||
|  |             self.assertEqual(shm_key, self.env.get_shm_key()) | ||
|  |             self.env.set_shm_key(shm_key+1) | ||
|  |             self.assertEqual(shm_key+1, self.env.get_shm_key()) | ||
|  | 
 | ||
|  |             # You can not change configuration after opening | ||
|  |             # the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL) | ||
|  |             # If we try to reconfigure cache after opening the | ||
|  |             # environment, core dump. | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                 self.env.set_shm_key, shm_key) | ||
|  |             self.assertEqual(shm_key+1, self.env.get_shm_key()) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 4) : | ||
|  |         def test_mutex_setget_max(self) : | ||
|  |             v = self.env.mutex_get_max() | ||
|  |             v2 = v*2+1 | ||
|  | 
 | ||
|  |             self.env.mutex_set_max(v2) | ||
|  |             self.assertEqual(v2, self.env.mutex_get_max()) | ||
|  | 
 | ||
|  |             self.env.mutex_set_max(v) | ||
|  |             self.assertEqual(v, self.env.mutex_get_max()) | ||
|  | 
 | ||
|  |             # You can not change configuration after opening | ||
|  |             # the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                     self.env.mutex_set_max, v2) | ||
|  | 
 | ||
|  |         def test_mutex_setget_increment(self) : | ||
|  |             v = self.env.mutex_get_increment() | ||
|  |             v2 = 127 | ||
|  | 
 | ||
|  |             self.env.mutex_set_increment(v2) | ||
|  |             self.assertEqual(v2, self.env.mutex_get_increment()) | ||
|  | 
 | ||
|  |             self.env.mutex_set_increment(v) | ||
|  |             self.assertEqual(v, self.env.mutex_get_increment()) | ||
|  | 
 | ||
|  |             # You can not change configuration after opening | ||
|  |             # the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                     self.env.mutex_set_increment, v2) | ||
|  | 
 | ||
|  |         def test_mutex_setget_tas_spins(self) : | ||
|  |             self.env.mutex_set_tas_spins(0)  # Default = BDB decides | ||
|  |             v = self.env.mutex_get_tas_spins() | ||
|  |             v2 = v*2+1 | ||
|  | 
 | ||
|  |             self.env.mutex_set_tas_spins(v2) | ||
|  |             self.assertEqual(v2, self.env.mutex_get_tas_spins()) | ||
|  | 
 | ||
|  |             self.env.mutex_set_tas_spins(v) | ||
|  |             self.assertEqual(v, self.env.mutex_get_tas_spins()) | ||
|  | 
 | ||
|  |             # In this case, you can change configuration | ||
|  |             # after opening the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE) | ||
|  |             self.env.mutex_set_tas_spins(v2) | ||
|  | 
 | ||
|  |         def test_mutex_setget_align(self) : | ||
|  |             v = self.env.mutex_get_align() | ||
|  |             v2 = 64 | ||
|  |             if v == 64 : | ||
|  |                 v2 = 128 | ||
|  | 
 | ||
|  |             self.env.mutex_set_align(v2) | ||
|  |             self.assertEqual(v2, self.env.mutex_get_align()) | ||
|  | 
 | ||
|  |             # Requires a nonzero power of two | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                     self.env.mutex_set_align, 0) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                     self.env.mutex_set_align, 17) | ||
|  | 
 | ||
|  |             self.env.mutex_set_align(2*v2) | ||
|  |             self.assertEqual(2*v2, self.env.mutex_get_align()) | ||
|  | 
 | ||
|  |             # You can not change configuration after opening | ||
|  |             # the environment. | ||
|  |             self.env.open(self.homeDir, db.DB_CREATE) | ||
|  |             self.assertRaises(db.DBInvalidArgError, | ||
|  |                     self.env.mutex_set_align, v2) | ||
|  | 
 | ||
|  | 
 | ||
|  | class DBEnv_log(DBEnv) : | ||
|  |     def setUp(self): | ||
|  |         DBEnv.setUp(self) | ||
|  |         self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | db.DB_INIT_LOG) | ||
|  | 
 | ||
|  |     def test_log_file(self) : | ||
|  |         log_file = self.env.log_file((1, 1)) | ||
|  |         self.assertEqual("log.0000000001", log_file[-14:]) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 4) : | ||
|  |         # The version with transactions is checked in other test object | ||
|  |         def test_log_printf(self) : | ||
|  |             msg = "This is a test..." | ||
|  |             self.env.log_printf(msg) | ||
|  |             logc = self.env.log_cursor() | ||
|  |             self.assertTrue(msg in (logc.last()[1])) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 7) : | ||
|  |         def test_log_config(self) : | ||
|  |             self.env.log_set_config(db.DB_LOG_DSYNC | db.DB_LOG_ZERO, 1) | ||
|  |             self.assertTrue(self.env.log_get_config(db.DB_LOG_DSYNC)) | ||
|  |             self.assertTrue(self.env.log_get_config(db.DB_LOG_ZERO)) | ||
|  |             self.env.log_set_config(db.DB_LOG_ZERO, 0) | ||
|  |             self.assertTrue(self.env.log_get_config(db.DB_LOG_DSYNC)) | ||
|  |             self.assertFalse(self.env.log_get_config(db.DB_LOG_ZERO)) | ||
|  | 
 | ||
|  | 
 | ||
|  | class DBEnv_log_txn(DBEnv) : | ||
|  |     def setUp(self): | ||
|  |         DBEnv.setUp(self) | ||
|  |         self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | | ||
|  |                 db.DB_INIT_LOG | db.DB_INIT_TXN) | ||
|  | 
 | ||
|  |     if db.version() >= (4, 5) : | ||
|  |         def test_tx_max(self) : | ||
|  |             txns=[] | ||
|  |             def tx() : | ||
|  |                 for i in xrange(self.env.get_tx_max()) : | ||
|  |                     txns.append(self.env.txn_begin()) | ||
|  | 
 | ||
|  |             tx() | ||
|  |             self.assertRaises(MemoryError, tx) | ||
|  | 
 | ||
|  |             # Abort the transactions before garbage collection, | ||
|  |             # to avoid "warnings". | ||
|  |             for i in txns : | ||
|  |                 i.abort() | ||
|  | 
 | ||
|  |     if db.version() >= (4, 4) : | ||
|  |         # The version without transactions is checked in other test object | ||
|  |         def test_log_printf(self) : | ||
|  |             msg = "This is a test..." | ||
|  |             txn = self.env.txn_begin() | ||
|  |             self.env.log_printf(msg, txn=txn) | ||
|  |             txn.commit() | ||
|  |             logc = self.env.log_cursor() | ||
|  |             logc.last()  # Skip the commit | ||
|  |             self.assertTrue(msg in (logc.prev()[1])) | ||
|  | 
 | ||
|  |             msg = "This is another test..." | ||
|  |             txn = self.env.txn_begin() | ||
|  |             self.env.log_printf(msg, txn=txn) | ||
|  |             txn.abort()  # Do not store the new message | ||
|  |             logc.last()  # Skip the abort | ||
|  |             self.assertTrue(msg not in (logc.prev()[1])) | ||
|  | 
 | ||
|  |             msg = "This is a third test..." | ||
|  |             txn = self.env.txn_begin() | ||
|  |             self.env.log_printf(msg, txn=txn) | ||
|  |             txn.commit()  # Do not store the new message | ||
|  |             logc.last()  # Skip the commit | ||
|  |             self.assertTrue(msg in (logc.prev()[1])) | ||
|  | 
 | ||
|  | 
 | ||
|  | class DBEnv_memp(DBEnv): | ||
|  |     def setUp(self): | ||
|  |         DBEnv.setUp(self) | ||
|  |         self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | db.DB_INIT_LOG) | ||
|  |         self.db = db.DB(self.env) | ||
|  |         self.db.open("test", db.DB_HASH, db.DB_CREATE, 0660) | ||
|  | 
 | ||
|  |     def tearDown(self): | ||
|  |         self.db.close() | ||
|  |         del self.db | ||
|  |         DBEnv.tearDown(self) | ||
|  | 
 | ||
|  |     def test_memp_1_trickle(self) : | ||
|  |         self.db.put("hi", "bye") | ||
|  |         self.assertTrue(self.env.memp_trickle(100) > 0) | ||
|  | 
 | ||
|  | # Preserve the order, do "memp_trickle" test first | ||
|  |     def test_memp_2_sync(self) : | ||
|  |         self.db.put("hi", "bye") | ||
|  |         self.env.memp_sync()  # Full flush | ||
|  |         # Nothing to do... | ||
|  |         self.assertTrue(self.env.memp_trickle(100) == 0) | ||
|  | 
 | ||
|  |         self.db.put("hi", "bye2") | ||
|  |         self.env.memp_sync((1, 0))  # NOP, probably | ||
|  |         # Something to do... or not | ||
|  |         self.assertTrue(self.env.memp_trickle(100) >= 0) | ||
|  | 
 | ||
|  |         self.db.put("hi", "bye3") | ||
|  |         self.env.memp_sync((123, 99))  # Full flush | ||
|  |         # Nothing to do... | ||
|  |         self.assertTrue(self.env.memp_trickle(100) == 0) | ||
|  | 
 | ||
|  |     def test_memp_stat_1(self) : | ||
|  |         stats = self.env.memp_stat()  # No param | ||
|  |         self.assertTrue(len(stats)==2) | ||
|  |         self.assertTrue("cache_miss" in stats[0]) | ||
|  |         stats = self.env.memp_stat(db.DB_STAT_CLEAR)  # Positional param | ||
|  |         self.assertTrue("cache_miss" in stats[0]) | ||
|  |         stats = self.env.memp_stat(flags=0)  # Keyword param | ||
|  |         self.assertTrue("cache_miss" in stats[0]) | ||
|  | 
 | ||
|  |     def test_memp_stat_2(self) : | ||
|  |         stats=self.env.memp_stat()[1] | ||
|  |         self.assertTrue(len(stats))==1 | ||
|  |         self.assertTrue("test" in stats) | ||
|  |         self.assertTrue("page_in" in stats["test"]) | ||
|  | 
 | ||
|  | class DBEnv_logcursor(DBEnv): | ||
|  |     def setUp(self): | ||
|  |         DBEnv.setUp(self) | ||
|  |         self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | | ||
|  |                 db.DB_INIT_LOG | db.DB_INIT_TXN) | ||
|  |         txn = self.env.txn_begin() | ||
|  |         self.db = db.DB(self.env) | ||
|  |         self.db.open("test", db.DB_HASH, db.DB_CREATE, 0660, txn=txn) | ||
|  |         txn.commit() | ||
|  |         for i in ["2", "8", "20"] : | ||
|  |             txn = self.env.txn_begin() | ||
|  |             self.db.put(key = i, data = i*int(i), txn=txn) | ||
|  |             txn.commit() | ||
|  | 
 | ||
|  |     def tearDown(self): | ||
|  |         self.db.close() | ||
|  |         del self.db | ||
|  |         DBEnv.tearDown(self) | ||
|  | 
 | ||
|  |     def _check_return(self, value) : | ||
|  |         self.assertTrue(isinstance(value, tuple)) | ||
|  |         self.assertEqual(len(value), 2) | ||
|  |         self.assertTrue(isinstance(value[0], tuple)) | ||
|  |         self.assertEqual(len(value[0]), 2) | ||
|  |         self.assertTrue(isinstance(value[0][0], int)) | ||
|  |         self.assertTrue(isinstance(value[0][1], int)) | ||
|  |         self.assertTrue(isinstance(value[1], str)) | ||
|  | 
 | ||
|  |     # Preserve test order | ||
|  |     def test_1_first(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         v = logc.first() | ||
|  |         self._check_return(v) | ||
|  |         self.assertTrue((1, 1) < v[0]) | ||
|  |         self.assertTrue(len(v[1])>0) | ||
|  | 
 | ||
|  |     def test_2_last(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         lsn_first = logc.first()[0] | ||
|  |         v = logc.last() | ||
|  |         self._check_return(v) | ||
|  |         self.assertTrue(lsn_first < v[0]) | ||
|  | 
 | ||
|  |     def test_3_next(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         lsn_last = logc.last()[0] | ||
|  |         self.assertEqual(logc.next(), None) | ||
|  |         lsn_first = logc.first()[0] | ||
|  |         v = logc.next() | ||
|  |         self._check_return(v) | ||
|  |         self.assertTrue(lsn_first < v[0]) | ||
|  |         self.assertTrue(lsn_last > v[0]) | ||
|  | 
 | ||
|  |         v2 = logc.next() | ||
|  |         self.assertTrue(v2[0] > v[0]) | ||
|  |         self.assertTrue(lsn_last > v2[0]) | ||
|  | 
 | ||
|  |         v3 = logc.next() | ||
|  |         self.assertTrue(v3[0] > v2[0]) | ||
|  |         self.assertTrue(lsn_last > v3[0]) | ||
|  | 
 | ||
|  |     def test_4_prev(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         lsn_first = logc.first()[0] | ||
|  |         self.assertEqual(logc.prev(), None) | ||
|  |         lsn_last = logc.last()[0] | ||
|  |         v = logc.prev() | ||
|  |         self._check_return(v) | ||
|  |         self.assertTrue(lsn_first < v[0]) | ||
|  |         self.assertTrue(lsn_last > v[0]) | ||
|  | 
 | ||
|  |         v2 = logc.prev() | ||
|  |         self.assertTrue(v2[0] < v[0]) | ||
|  |         self.assertTrue(lsn_first < v2[0]) | ||
|  | 
 | ||
|  |         v3 = logc.prev() | ||
|  |         self.assertTrue(v3[0] < v2[0]) | ||
|  |         self.assertTrue(lsn_first < v3[0]) | ||
|  | 
 | ||
|  |     def test_5_current(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         logc.first() | ||
|  |         v = logc.next() | ||
|  |         self.assertEqual(v, logc.current()) | ||
|  | 
 | ||
|  |     def test_6_set(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         logc.first() | ||
|  |         v = logc.next() | ||
|  |         self.assertNotEqual(v, logc.next()) | ||
|  |         self.assertNotEqual(v, logc.next()) | ||
|  |         self.assertEqual(v, logc.set(v[0])) | ||
|  | 
 | ||
|  |     def test_explicit_close(self) : | ||
|  |         logc = self.env.log_cursor() | ||
|  |         logc.close() | ||
|  |         self.assertRaises(db.DBCursorClosedError, logc.next) | ||
|  | 
 | ||
|  |     def test_implicit_close(self) : | ||
|  |         logc =  [self.env.log_cursor() for i in xrange(10)] | ||
|  |         self.env.close()  # This close should close too all its tree | ||
|  |         for i in logc : | ||
|  |             self.assertRaises(db.DBCursorClosedError, i.next) | ||
|  | 
 | ||
|  | def test_suite(): | ||
|  |     suite = unittest.TestSuite() | ||
|  | 
 | ||
|  |     suite.addTest(unittest.makeSuite(DBEnv_general)) | ||
|  |     suite.addTest(unittest.makeSuite(DBEnv_memp)) | ||
|  |     suite.addTest(unittest.makeSuite(DBEnv_logcursor)) | ||
|  |     suite.addTest(unittest.makeSuite(DBEnv_log)) | ||
|  |     suite.addTest(unittest.makeSuite(DBEnv_log_txn)) | ||
|  | 
 | ||
|  |     return suite | ||
|  | 
 | ||
|  | if __name__ == '__main__': | ||
|  |     unittest.main(defaultTest='test_suite') |