| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | TestCases for testing the locking sub-system. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | import tempfile | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from threading import Thread, currentThread | 
					
						
							|  |  |  |     have_threads = 1 | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     have_threads = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  | from test_all import verbose | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-28 17:20:44 +00:00
										 |  |  | try: | 
					
						
							| 
									
										
										
										
											2003-09-21 00:08:14 +00:00
										 |  |  |     # For Pythons w/distutils pybsddb | 
					
						
							|  |  |  |     from bsddb3 import db | 
					
						
							|  |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											2003-01-28 17:20:44 +00:00
										 |  |  |     # For Python 2.3 | 
					
						
							|  |  |  |     from bsddb import db | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LockingTestCase(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  |         self.homeDir = tempfile.mkdtemp('.test_lock') | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |         self.env = db.DBEnv() | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  |         self.env.open(self.homeDir, db.DB_THREAD | db.DB_INIT_MPOOL | | 
					
						
							|  |  |  |                                     db.DB_INIT_LOCK | db.DB_CREATE) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.env.close() | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  |         shutil.rmtree(self.homeDir) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test01_simple(self): | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print '\n', '-=' * 30 | 
					
						
							|  |  |  |             print "Running %s.test01_simple..." % self.__class__.__name__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         anID = self.env.lock_id() | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "locker ID: %s" % anID | 
					
						
							|  |  |  |         lock = self.env.lock_get(anID, "some locked thing", db.DB_LOCK_WRITE) | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "Aquired lock: %s" % lock | 
					
						
							|  |  |  |         time.sleep(1) | 
					
						
							|  |  |  |         self.env.lock_put(lock) | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "Released lock: %s" % lock | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  |         if db.version() >= (4,0): | 
					
						
							|  |  |  |             self.env.lock_id_free(anID) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test02_threaded(self): | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print '\n', '-=' * 30 | 
					
						
							|  |  |  |             print "Running %s.test02_threaded..." % self.__class__.__name__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         threads = [] | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(5, db.DB_LOCK_WRITE))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_READ))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_READ))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_WRITE))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_READ))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_READ))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_WRITE))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_WRITE))) | 
					
						
							|  |  |  |         threads.append(Thread(target = self.theThread, | 
					
						
							|  |  |  |                               args=(1, db.DB_LOCK_WRITE))) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for t in threads: | 
					
						
							|  |  |  |             t.start() | 
					
						
							|  |  |  |         for t in threads: | 
					
						
							|  |  |  |             t.join() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-27 17:23:29 +00:00
										 |  |  |     def test03_set_timeout(self): | 
					
						
							|  |  |  |         # test that the set_timeout call works | 
					
						
							|  |  |  |         if hasattr(self.env, 'set_timeout'): | 
					
						
							|  |  |  |             self.env.set_timeout(0, db.DB_SET_LOCK_TIMEOUT) | 
					
						
							|  |  |  |             self.env.set_timeout(0, db.DB_SET_TXN_TIMEOUT) | 
					
						
							|  |  |  |             self.env.set_timeout(123456, db.DB_SET_LOCK_TIMEOUT) | 
					
						
							|  |  |  |             self.env.set_timeout(7890123, db.DB_SET_TXN_TIMEOUT) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def theThread(self, sleepTime, lockType): | 
					
						
							|  |  |  |         name = currentThread().getName() | 
					
						
							|  |  |  |         if lockType ==  db.DB_LOCK_WRITE: | 
					
						
							|  |  |  |             lt = "write" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             lt = "read" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         anID = self.env.lock_id() | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "%s: locker ID: %s" % (name, anID) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         lock = self.env.lock_get(anID, "some locked thing", lockType) | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "%s: Aquired %s lock: %s" % (name, lt, lock) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         time.sleep(sleepTime) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.env.lock_put(lock) | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print "%s: Released %s lock: %s" % (name, lt, lock) | 
					
						
							| 
									
										
										
										
											2007-11-05 02:56:31 +00:00
										 |  |  |         if db.version() >= (4,0): | 
					
						
							|  |  |  |             self.env.lock_id_free(anID) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     suite = unittest.TestSuite() | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if have_threads: | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |         suite.addTest(unittest.makeSuite(LockingTestCase)) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |         suite.addTest(unittest.makeSuite(LockingTestCase, 'test01')) | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |     return suite | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2002-12-30 20:53:52 +00:00
										 |  |  |     unittest.main(defaultTest='test_suite') |