| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | """Generic thread tests.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Meant to be used by dummy_thread and thread.  To allow for different modules | 
					
						
							|  |  |  | to be used, test_main() can be called with the module to use as the thread | 
					
						
							|  |  |  | implementation as its sole argument. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2008-05-25 13:05:15 +00:00
										 |  |  | import _dummy_thread as _thread | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2008-05-11 19:59:59 +00:00
										 |  |  | import queue | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | import random | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-25 13:05:15 +00:00
										 |  |  | DELAY = 0 # Set > 0 when testing a module other than _dummy_thread, such as | 
					
						
							|  |  |  |           # the '_thread' module. | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class LockTests(unittest.TestCase): | 
					
						
							|  |  |  |     """Test lock objects.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         # Create a lock | 
					
						
							|  |  |  |         self.lock = _thread.allocate_lock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_initlock(self): | 
					
						
							|  |  |  |         #Make sure locks start locked | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(not self.lock.locked(), | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Lock object is not initialized unlocked.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_release(self): | 
					
						
							|  |  |  |         # Test self.lock.release() | 
					
						
							|  |  |  |         self.lock.acquire() | 
					
						
							|  |  |  |         self.lock.release() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(not self.lock.locked(), | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Lock object did not release properly.") | 
					
						
							| 
									
										
										
										
											2003-02-19 02:35:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |     def test_improper_release(self): | 
					
						
							| 
									
										
										
										
											2011-03-01 23:05:42 +00:00
										 |  |  |         #Make sure release of an unlocked thread raises RuntimeError | 
					
						
							|  |  |  |         self.assertRaises(RuntimeError, self.lock.release) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_cond_acquire_success(self): | 
					
						
							|  |  |  |         #Make sure the conditional acquiring of the lock works. | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(self.lock.acquire(0), | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Conditional acquiring of the lock failed.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_cond_acquire_fail(self): | 
					
						
							|  |  |  |         #Test acquiring locked lock returns False | 
					
						
							|  |  |  |         self.lock.acquire(0) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(not self.lock.acquire(0), | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Conditional acquiring of a locked lock incorrectly " | 
					
						
							|  |  |  |                          "succeeded.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_uncond_acquire_success(self): | 
					
						
							|  |  |  |         #Make sure unconditional acquiring of a lock works. | 
					
						
							|  |  |  |         self.lock.acquire() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(self.lock.locked(), | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Uncondional locking failed.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_uncond_acquire_return_val(self): | 
					
						
							|  |  |  |         #Make sure that an unconditional locking returns True. | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(self.lock.acquire(1) is True, | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Unconditional locking did not return True.") | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(self.lock.acquire() is True) | 
					
						
							| 
									
										
										
										
											2003-02-19 02:35:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |     def test_uncond_acquire_blocking(self): | 
					
						
							|  |  |  |         #Make sure that unconditional acquiring of a locked lock blocks. | 
					
						
							|  |  |  |         def delay_unlock(to_unlock, delay): | 
					
						
							|  |  |  |             """Hold on to lock for a set amount of time before unlocking.""" | 
					
						
							|  |  |  |             time.sleep(delay) | 
					
						
							|  |  |  |             to_unlock.release() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.lock.acquire() | 
					
						
							|  |  |  |         start_time = int(time.time()) | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |         _thread.start_new_thread(delay_unlock,(self.lock, DELAY)) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |         if support.verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print() | 
					
						
							|  |  |  |             print("*** Waiting for thread to release the lock "\ | 
					
						
							|  |  |  |             "(approx. %s sec.) ***" % DELAY) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |         self.lock.acquire() | 
					
						
							|  |  |  |         end_time = int(time.time()) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |         if support.verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("done") | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue((end_time - start_time) >= DELAY, | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Blocking by unconditional acquiring failed.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MiscTests(unittest.TestCase): | 
					
						
							|  |  |  |     """Miscellaneous tests.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_exit(self): | 
					
						
							|  |  |  |         #Make sure _thread.exit() raises SystemExit | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(SystemExit, _thread.exit) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_ident(self): | 
					
						
							|  |  |  |         #Test sanity of _thread.get_ident() | 
					
						
							| 
									
										
										
										
											2010-01-24 19:26:24 +00:00
										 |  |  |         self.assertIsInstance(_thread.get_ident(), int, | 
					
						
							|  |  |  |                               "_thread.get_ident() returned a non-integer") | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(_thread.get_ident() != 0, | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "_thread.get_ident() returned 0") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_LockType(self): | 
					
						
							|  |  |  |         #Make sure _thread.LockType is the same type as _thread.allocate_locke() | 
					
						
							| 
									
										
										
										
											2010-01-24 19:26:24 +00:00
										 |  |  |         self.assertIsInstance(_thread.allocate_lock(), _thread.LockType, | 
					
						
							|  |  |  |                               "_thread.LockType is not an instance of what " | 
					
						
							|  |  |  |                               "is returned by _thread.allocate_lock()") | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-13 23:44:35 +00:00
										 |  |  |     def test_interrupt_main(self): | 
					
						
							|  |  |  |         #Calling start_new_thread with a function that executes interrupt_main | 
					
						
							|  |  |  |         # should raise KeyboardInterrupt upon completion. | 
					
						
							|  |  |  |         def call_interrupt(): | 
					
						
							|  |  |  |             _thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(KeyboardInterrupt, _thread.start_new_thread, | 
					
						
							| 
									
										
										
										
											2003-06-13 23:44:35 +00:00
										 |  |  |                               call_interrupt, tuple()) | 
					
						
							| 
									
										
										
										
											2003-06-15 23:26:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-13 23:56:32 +00:00
										 |  |  |     def test_interrupt_in_main(self): | 
					
						
							|  |  |  |         # Make sure that if interrupt_main is called in main threat that | 
					
						
							|  |  |  |         # KeyboardInterrupt is raised instantly. | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(KeyboardInterrupt, _thread.interrupt_main) | 
					
						
							| 
									
										
										
										
											2003-06-13 23:44:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | class ThreadTests(unittest.TestCase): | 
					
						
							|  |  |  |     """Test thread creation.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_arg_passing(self): | 
					
						
							|  |  |  |         #Make sure that parameter passing works. | 
					
						
							|  |  |  |         def arg_tester(queue, arg1=False, arg2=False): | 
					
						
							|  |  |  |             """Use to test _thread.start_new_thread() passes args properly.""" | 
					
						
							|  |  |  |             queue.put((arg1, arg2)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-11 19:59:59 +00:00
										 |  |  |         testing_queue = queue.Queue(1) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |         _thread.start_new_thread(arg_tester, (testing_queue, True, True)) | 
					
						
							|  |  |  |         result = testing_queue.get() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(result[0] and result[1], | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Argument passing for thread creation using tuple failed") | 
					
						
							|  |  |  |         _thread.start_new_thread(arg_tester, tuple(), {'queue':testing_queue, | 
					
						
							|  |  |  |                                                        'arg1':True, 'arg2':True}) | 
					
						
							|  |  |  |         result = testing_queue.get() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(result[0] and result[1], | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Argument passing for thread creation using kwargs failed") | 
					
						
							|  |  |  |         _thread.start_new_thread(arg_tester, (testing_queue, True), {'arg2':True}) | 
					
						
							|  |  |  |         result = testing_queue.get() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(result[0] and result[1], | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |                         "Argument passing for thread creation using both tuple" | 
					
						
							|  |  |  |                         " and kwargs failed") | 
					
						
							| 
									
										
										
										
											2003-02-19 02:35:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |     def test_multi_creation(self): | 
					
						
							|  |  |  |         #Make sure multiple threads can be created. | 
					
						
							|  |  |  |         def queue_mark(queue, delay): | 
					
						
							|  |  |  |             """Wait for ``delay`` seconds and then put something into ``queue``""" | 
					
						
							|  |  |  |             time.sleep(delay) | 
					
						
							|  |  |  |             queue.put(_thread.get_ident()) | 
					
						
							| 
									
										
										
										
											2003-02-19 02:35:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |         thread_count = 5 | 
					
						
							| 
									
										
										
										
											2008-05-11 19:59:59 +00:00
										 |  |  |         testing_queue = queue.Queue(thread_count) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |         if support.verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print() | 
					
						
							|  |  |  |             print("*** Testing multiple thread creation "\ | 
					
						
							|  |  |  |             "(will take approx. %s to %s sec.) ***" % (DELAY, thread_count)) | 
					
						
							| 
									
										
										
										
											2007-05-07 22:24:25 +00:00
										 |  |  |         for count in range(thread_count): | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |             if DELAY: | 
					
						
							|  |  |  |                 local_delay = round(random.random(), 1) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 local_delay = 0 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |             _thread.start_new_thread(queue_mark, | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |                                      (testing_queue, local_delay)) | 
					
						
							|  |  |  |         time.sleep(DELAY) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |         if support.verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print('done') | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(testing_queue.qsize() == thread_count, | 
					
						
							| 
									
										
										
										
											2003-02-19 02:35:07 +00:00
										 |  |  |                         "Not all %s threads executed properly after %s sec." % | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |                         (thread_count, DELAY)) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_main(imported_module=None): | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |     global _thread, DELAY | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  |     if imported_module: | 
					
						
							|  |  |  |         _thread = imported_module | 
					
						
							| 
									
										
										
										
											2003-04-30 03:03:37 +00:00
										 |  |  |         DELAY = 2 | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |     if support.verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print() | 
					
						
							|  |  |  |         print("*** Using %s as _thread module ***" % _thread) | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |     support.run_unittest(LockTests, MiscTests, ThreadTests) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:30:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test_main() |