
    daf                        d Z ddlZddlZddlZddlmZmZ ddlZddlZddl	Z	ddl
mZ ddlmZ  ej                  ej                  d      Zd Z G d d	e      Z G d
 dej(                        Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)z/
Various tests for synchronization primitives.
    N)start_new_threadTIMEOUT_MAX)support)threading_helperz9platform doesn't support fork (no _at_fork_reinit method)c                 4    t        j                  d| z         y )N{Gz?)timesleep)nthreads    */root/Python-3.12.4/Lib/test/lock_tests.pywait_threads_blockedr      s     	JJuw    c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	Bunchz
    A bunch of threads.
    c                 h    || _         || _        g | _        g | _        g | _        | | _        d| _        y)z
        Construct a bunch of `nthread` threads running the same function `func`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        N)funcr   startedfinished
exceptions	_can_exit_wait_thread)selfr   r   wait_before_exits       r   __init__zBunch.__init__    s9     	-- r   c                 4   t        j                         }| j                  j                  |       	 | j	                          | j                  j                  |       t        j                  t        j                        D ]  }| j                  s y  y # t
        $ r%}| j                  j                  |       Y d }~{d }~ww xY w# | j                  j                  |       t        j                  t        j                        D ]  }| j                  s w  w xY wN)	threading	get_identr   appendr   BaseExceptionr   r   r   sleeping_retrySHORT_TIMEOUTr   )r   tidexc_s       r   taskz
Bunch.task.   s    !!#C 	IIK MM  %++G,A,AB >>	  	(OO""3''	( MM  %++G,A,AB >>s0   B 	CB<7C <CC ADDc                    t        j                  t        j                        | _        | j                  j                          	 t        | j                        D ]  }t        | j                  d        	 t        j                  t        j                        D ]'  }t        | j                        | j                  k\  s& | S  | S #  d| _
         xY w)N T)r   wait_threads_exitr   r"   r   	__enter__ranger   r   r&   r   r!   lenr   )r   r%   s     r   r*   zBunch.__enter__;   s    ,>>w?T?TU##%	4<<( 0 B/0 ''(=(=> 	A4<< DLL0		 	!DNs   0C 
Cc                 2   t        j                  t         j                        D ]&  }t        | j                        | j
                  k\  s& n | j                  j                  d d d        | j                  }d | _        |rt        | j                   d|      y )Nz threads raised exceptions)r   r!   r"   r,   r   r   r   __exit__r   ExceptionGroupr   )r   exc_type	exc_value	tracebackr%   r   s         r   r.   zBunch.__exit__L   s    ''(=(=> 	A4==!T\\1	
 	""4t4 __
 DII;.H!I!+- - r   c                     d| _         y NT)r   r   s    r   	do_finishzBunch.do_finish[   s	    r   N)F)	__name__
__module____qualname____doc__r   r&   r*   r.   r6   r(   r   r   r   r      s     !"-r   r   c                       e Zd Zd Zd Zd Zy)BaseTestCasec                 6    t        j                         | _        y r   )r   threading_setup_threadsr5   s    r   setUpzBaseTestCase.setUp`   s    (88:r   c                 d    t        j                  | j                    t        j                          y r   )r   threading_cleanupr?   r   reap_childrenr5   s    r   tearDownzBaseTestCase.tearDownc   s     **DMM:r   c                 X    | j                  ||dz         | j                  ||dz         y )Ng333333?g      $@)assertGreaterEqual
assertLess)r   actualexpecteds      r   assertTimeoutzBaseTestCase.assertTimeoutg   s*     	3740r   N)r7   r8   r9   r@   rD   rJ   r(   r   r   r<   r<   _   s    ; 1r   r<   c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c                     t        j                  t         j                        D ]  }t        |      |k\  s n | j	                  t        |      |       y r   )r   r!   r"   r,   assertEqual)r   phaserI   r%   s       r   
wait_phasezBaseLockTests.wait_phaseu   sG    ''(=(=> 	A5zX%	 	UX.r   c                 &    | j                         }~y r   )locktyper   locks     r   test_constructorzBaseLockTests.test_constructor{   s    }}r   c                 \    | j                         }| j                  t        |      d       ~y )Nz<unlocked .* object (.*)?at .*>)rR   assertRegexreprrS   s     r   	test_reprzBaseLockTests.test_repr   s%    }}d%FGr   c                 |    | j                         }|j                          | j                  t        |      d       ~y )Nz<locked .* object (.*)?at .*>)rR   acquirerW   rX   rS   s     r   test_locked_reprzBaseLockTests.test_locked_repr   s.    }}d%DEr   c                 F    | j                         }|j                          ~y r   )rR   r[   rS   s     r   test_acquire_destroyz"BaseLockTests.test_acquire_destroy   s    }}r   c                 f    | j                         }|j                          |j                          ~y r   rR   r[   releaserS   s     r   test_acquire_releasez"BaseLockTests.test_acquire_release   s"    }}r   c                     | j                         }| j                  |j                  d             |j                          y NF)rR   
assertTruer[   ra   rS   s     r   test_try_acquirezBaseLockTests.test_try_acquire   s+    }}U+,r   c                     | j                         j                          g fd}t        |d      5  	 d d d        | j                  d          j	                          y # 1 sw Y   .xY w)Nc                  F    j                   j                  d             y rd   r   r[   rT   results   r   fz3BaseLockTests.test_try_acquire_contended.<locals>.f   s    MM$,,u-.r      r   )rR   r[   r   assertFalsera   r   rl   rT   rk   s     @@r   test_try_acquire_contendedz(BaseLockTests.test_try_acquire_contended   s]    }}	/1a[ 		#	 	s   A&&A/c                 `   | j                         j                          fd}d}t        ||      5 }t        |       | j	                  t        |j                        d       j                          d d d        | j	                  t        j                        |       y # 1 sw Y   /xY w)Nc                  F     j                           j                          y r   r[   ra   rT   s   r   rl   z/BaseLockTests.test_acquire_contended.<locals>.f       LLNLLNr      r   )rR   r[   r   r   rN   r,   r   ra   )r   rl   NbunchrT   s       @r   test_acquire_contendedz$BaseLockTests.test_acquire_contended   s    }}	 1a[ 	E #S0!4 LLN	 	U^^,a0	 	s   AB$$B-c                 v   | j                         fd}dfd	}5  	 d d d        t        |d      5  	 d d d        | j                  t              5  5  t        # 1 sw Y   >xY w# 1 sw Y   4xY w# 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wt        |d      5  	 d d d        y # 1 sw Y   y xY w)Nc                  F     j                           j                          y r   rs   rt   s   r   rl   z"BaseLockTests.test_with.<locals>.f   ru   r   c                 >    5  | | 	 d d d        y # 1 sw Y   y xY wr   r(   )errrT   s    r   	with_lockz*BaseLockTests.test_with.<locals>.with_lock   s*     ?I #  s   rm   r   )rR   r   assertRaises	TypeError)r   rl   r~   rT   s      @r   	test_withzBaseLockTests.test_with   s    }}		  		 1a[ 		 y) 	   	 		 	
     	  	  	  1a[ 		 	 	s@   AA*BA6A'*A36A?	;BB$B//B8c                 t    | j                         fd}t        |d      5  	 d d d        y # 1 sw Y   y xY w)Nc                  F     j                           j                          y r   rs   rt   s   r   rl   z)BaseLockTests.test_thread_leak.<locals>.f   ru   r      )rR   r   r   rl   rT   s     @r   test_thread_leakzBaseLockTests.test_thread_leak   s8     }}	 1b\ 		 	 	s   .7c                    | j                         | j                  t        j                  dd       | j                  t        j                  d       | j                  t        j                  d       | j                  t        j                  t
        dz          j                  t
               j                          t        j                         }| j                  j                  d             t        j                         }| j                  ||z
  d       g fd}t        |d      5  	 d d d        | j                  d          | j                  d   d	       y # 1 sw Y   3xY w)
NFrm   itimeoutg}Ô%ITrv   c                      t        j                         } j                  j                  d             t        j                         }j                  || z
         y )N      ?r   )r	   	monotonicr   r[   )t1t2rT   resultss     r   rl   z%BaseLockTests.test_timeout.<locals>.f   sB    !BNN4<<<45!BNN27#r   r   r   )rR   r   
ValueErrorr[   OverflowErrorr   ra   r	   r   re   rG   r   rn   rJ   )r   r   r   rl   rT   r   s       @@r   test_timeoutzBaseLockTests.test_timeout   s    }}*dllE1=*dllDA-uE-{QO[)^^Q/0^^R#	$
 1a[ 		$71:s+	 	s   :E..E7c                 z    | j                         }t        j                  |      }| j                   |              y r   )rR   weakrefrefassertIsNotNoner   rT   r   s      r   test_weakref_existsz!BaseLockTests.test_weakref_exists   s+    }}kk$SU#r   c                     | j                         }t        j                  |      }~t        j                          | j                   |              y r   )rR   r   r   gccollectassertIsNoner   s      r   test_weakref_deletedz"BaseLockTests.test_weakref_deleted  s7    }}kk$


#% r   N)r7   r8   r9   r:   rP   rU   rY   r\   r^   rb   rf   rp   ry   r   r   r   r   r   r(   r   r   rL   rL   p   sM    /


	1$:,6$
!r   rL   c                   2    e Zd ZdZd Zd Zd Zed        Zy)	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c                 
   | j                         g fd}t        j                         5  t        |d       | j	                  d       j                          | j	                  d       d d d        y # 1 sw Y   y xY w)Nc                       j                          j                  d         j                          j                  d        y r   r[   r   )rT   rO   s   r   rl   z#LockTests.test_reacquire.<locals>.f  s-    LLNLLLLNLLr   r(   rm      )rR   r   r)   r   rP   ra   r   rl   rT   rO   s     @@r   test_reacquirezLockTests.test_reacquire  sl    }}	 //1 	&Q#OOE1% LLNOOE1%	& 	& 	&s   AA99Bc                     | j                         j                          fd}t        |d      5  	 d d d        j                          j                          y # 1 sw Y   *xY w)Nc                  &     j                          y r   )ra   rt   s   r   rl   z*LockTests.test_different_thread.<locals>.f&      LLNr   rm   )rR   r[   r   ra   r   s     @r   test_different_threadzLockTests.test_different_thread"  sO    }}	1a[ 			 	s   AA'c                 &   | j                         }|j                          | j                  |j                  d             |j                          | j                  |j	                                | j                  |j                  d             y )Nr   r   F)blocking)rR   r[   rn   ra   lockedre   rS   s     r   test_state_after_timeoutz"LockTests.test_state_after_timeout-  se     }}d34'e45r   c                     d }| j                         }|j                           ||       | j                         }|j                          |j                           ||       y )Nc                 D    | j                          | j                          y r   rs   rt   s    r   use_lockz/LockTests.test_at_fork_reinit.<locals>.use_lock9  s     LLNLLNr   )rR   _at_fork_reinitr[   )r   r   rT   lock2s       r   test_at_fork_reinitzLockTests.test_at_fork_reinit7  sP    	 }} r   N)	r7   r8   r9   r:   r   r   r   requires_forkr   r(   r   r   r   r   	  s*    &(	6  r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	
RLockTestsz$
    Tests for recursive locks.
    c                     | j                         }|j                          |j                          |j                          |j                          |j                          |j                          y r   r`   rS   s     r   r   zRLockTests.test_reacquireO  sC    }}r   c                 d   | j                         }| j                  t        |j                         |j	                          |j	                          |j                          |j	                          |j                          |j                          | j                  t        |j                         y r   )rR   r   RuntimeErrorra   r[   rS   s     r   test_release_unacquiredz"RLockTests.test_release_unacquiredX  sk    }},5,5r   c                 d   | j                         }| j                  t        |j                         |j	                          |j	                          |j                          |j	                          |j                          |j                          | j                  t        |j                         y r   )rR   r   r   _release_saver[   ra   rS   s     r   test_release_save_unacquiredz'RLockTests.test_release_save_unacquiredd  so    }},(:(:;,(:(:;r   c                      j                          j                  dj                                j                           j                  dj                                j                          j                           j                  dj                                j	                           j                  dj                                j	                          j	                           j                  dj                                g  fd}t        j                         5  t        |d        j                  d        j                  dj                                j                  d         j                  d        j                  dj                                d d d        y # 1 sw Y   y xY w)Nr   rm      r   c                       j                          j                  d        j                  d        j                          j                  d        y )Nr   )r[   r   rP   ra   )rT   rO   r   s   r   rl   z*RLockTests.test_recursion_count.<locals>.f  s;    LLNLLOOE1%LLNLLr   r(   )
rR   rN   _recursion_countr[   ra   r   r)   r   rP   r   r   s   ` @@r   test_recursion_countzRLockTests.test_recursion_countp  sT   }}D1134D1134D1134D1134D1134	 //1 		9Q#OOE1%Q 5 5 78 LLOOE1%Q 5 5 78		9 		9 		9s   1BF<<Gc                    | j                         fd}t        |dd      5 }	 | j                  t        j                         |j                          	 d d d        y # |j                          w xY w# 1 sw Y   y xY w)Nc                  &     j                          y r   )r[   rt   s   r   rl   z+RLockTests.test_different_thread.<locals>.f  r   r   rm   T)rR   r   r   r   ra   r6   )r   rl   rx   rT   s      @r   r   z RLockTests.test_different_thread  sn    }}	 1a 	"%"!!,=!		" 	" !		" 	"s"   A5 A A5 A22A55A>c                 Z   | j                         | j                  j                                j                          | j	                  j                                j                          | j	                  j                                g fd}t        |d      5  	 d d d        | j                  d          j                          | j	                  j                                j                          | j                  j                                y # 1 sw Y   |xY w)Nc                  D    j                   j                                y r   )r   	_is_ownedrj   s   r   rl   z$RLockTests.test__is_owned.<locals>.f  s    MM$..*+r   rm   r   )rR   rn   r   r[   re   r   ra   ro   s     @@r   test__is_ownedzRLockTests.test__is_owned  s    }})*()()	,1a[ 		#())*	 	s   $D!!D*N)
r7   r8   r9   r:   r   r   r   r   r   r   r(   r   r   r   r   K  s&    
6
<!9F
"+r   r   c                   D    e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
d Zy	)

EventTestsz"
    Tests for Event objects.
    c                    | j                         }| j                  |j                                |j                          | j	                  |j                                |j                          | j	                  |j                                |j                          | j                  |j                                |j                          | j                  |j                                y r   )	eventtypern   is_setsetre   clearr   evts     r   test_is_setzEventTests.test_is_set  s    nn&	

%	

%		&		&r   c                 *   d}g g fd}t        ||      5  t        |       | j                  t              d       j	                          d d d        | j                  dg|z         | j                  dg|z         y # 1 sw Y   6xY w)Nrv   c                      j                   j                                j                   j                                y r   )r   wait)r   results1results2s   r   rl   z#EventTests._check_notify.<locals>.f  s'    OOCHHJ'OOCHHJ'r   r   T)r   r   rN   r,   r   )r   r   rw   rl   r   r   s    `  @@r   _check_notifyzEventTests._check_notify  s    	( 1a[ 	 #S]A. GGI	 	D6A:.D6A:.	 	s   7B		Bc                     | j                         }| j                  |       |j                          |j                          | j                  |       y r   )r   r   r   r   r   s     r   test_notifyzEventTests.test_notify  s<    nn3			3r   c                    | j                         g g d}fd}t        ||      5  	 d d d        | j                  dg|z         D ](  \  }}| j                  |       | j	                  |d       * g g j                          t        ||      5  	 d d d        | j                  dg|z         D ]  \  }}| j                  |        y # 1 sw Y   xY w# 1 sw Y   GxY w)Nrv   c                      j                  j                  d             t        j                         } j                  d      }t        j                         }j                  ||| z
  f       y )Ng        r   )r   r   r	   r   )r   rr   r   r   r   s      r   rl   z"EventTests.test_timeout.<locals>.f  sP    OOCHHSM*!BA!BOOQRL)r   Fr   T)r   r   rN   rn   rJ   r   re   )r   rw   rl   r   dtr   r   r   s        @@@r   r   zEventTests.test_timeout  s    nn	* 1a[ 		 	E7Q;/ 	(EArQr3'	(
 	1a[ 		 	D6A:. 	EArOOA	!	 		 	s   CC"C"C+c                     | j                         g fd}d}t        ||      5  t        |       j                          j	                          d d d        | j                  dg|z         y # 1 sw Y    xY w)Nc                  b    j                   j                  t        j                               y r   )r   r   r   LONG_TIMEOUT)eventr   s   r   rl   z(EventTests.test_set_and_clear.<locals>.f  s    NN5::g&:&:;<r   rv   T)r   r   r   r   r   rN   )r   rl   rw   r   r   s      @@r   test_set_and_clearzEventTests.test_set_and_clear  st      	= 1a[ 	 # IIKKKM	 	4&1*-	 	s   ,A44A=c                 p   | j                         }|j                  5  | j                  |j                  j                  d             d d d        |j	                          |j                  5  | j                  |j                  j                  d             d d d        y # 1 sw Y   YxY w# 1 sw Y   y xY wrd   )r   _condrn   r[   r   r   s     r   r   zEventTests.test_at_fork_reinit  s     nnYY 	7SYY..u56	7YY 	7SYY..u56	7 	7	7 	7	7 	7s   +B ,+B, B),B5c                     | j                         }| j                  t        |      d       |j                          | j                  t        |      d       y )Nz<\w+\.Event at .*: unset>z<\w+\.Event at .*: set>)r   rW   rX   r   r   s     r   rY   zEventTests.test_repr  sA    nnc$@A	c$>?r   N)r7   r8   r9   r:   r   r   r   r   r   r   r   rY   r(   r   r   r   r     s:    
'/( >.& 7 7@r   r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)ConditionTestsz(
    Tests for condition variables.
    c                 |   | j                         }|j                          |j                          |j                          |j                          t        j                         }| j                  |      }|j                          | j                  |j                  d             |j                          | j                  |j                  d             | j                  |j                  d             |j                          |5  | j                  |j                  d             d d d        y # 1 sw Y   y xY wrd   )condtyper[   ra   r   Lockrn   re   )r   condrT   s      r   test_acquirezConditionTests.test_acquire'  s    }} 	~~}}T"e,-U+,e,- 	2T\\%01	2 	2 	2s   !D22D;c                 d    | j                         }| j                  t        |j                         y r   )r   r   r   r   r   r   s     r   test_unacquired_waitz#ConditionTests.test_unacquired_wait:  s!    }},		2r   c                 d    | j                         }| j                  t        |j                         y r   )r   r   r   notifyr   s     r   test_unacquired_notifyz%ConditionTests.test_unacquired_notify>  s!    }},4r   c                 "  	
 g g 	g 
d	
fd}d}t        ||      5  t        j                  t        j                        D ]  }t	              |k\  s n j                          | j                  	g        d}j                          j                  |       t        |       dj                          t        j                  t        j                        D ]  }t	        	      |k\  s n | j                  	dg|z         | j                  
g        t        j                  t        j                        D ]  }t	              |k\  s n j                          j                  d       t        |       dj                          t        j                  t        j                        D ]!  }t	        	      t	        
      z   ||z   k\  s! n ||z
  }| j                  	dg|z  dg|z  z          | j                  
dg|z         t        j                  t        j                        D ]  }t	              |k\  s n j                          j                          t        |       dj                          t        j                  t        j                        D ]  }t	        
      |k\  s n | j                  	dg|z  dg|z  z          | j                  
dg|z  d	g|z  z          d d d        y # 1 sw Y   y xY w)
Nr   c                  V   j                          j                         j                         } j                          j                  | f       j                          j                         j                         } j                          j                  | f       y r   )r[   r   r   ra   )rk   r   	phase_numreadyr   r   s    r   rl   z'ConditionTests._check_notify.<locals>.fR  sw    LLNLL#YY[FLLNOOVY/0LLNLL#YY[FLLNOOVY/0r   rv   r   rm   )Trm   r   )Tr   )Tr   )r   r   r!   r"   r,   r   rN   r[   r   r   ra   
notify_all)r   r   rl   rw   r%   count1count2r   r   r   r   s    `     @@@@r   r   zConditionTests._check_notifyB  s    		1 	1 1a[ @	T ++G,A,AB u:? KKMXr* FLLNKK ( ILLN++G,A,AB x=F* X	{V';<Xr* ++G,A,AB u:'
 LLNKKN # ILLN++G,A,AB x=3x=0QZ@ ZFX	{V';ykF>R'RSX	{V';< ++G,A,AB u:?
 LLNOO # ILLN++G,A,AB x=A% X	{V';ykF>R'RSX	{V';ykF>R'RSA@	T @	T @	Ts4   5LBL5ALBLA/L
A4L?=LLc                 h    | j                         }| j                  |       | j                  |       y r   )r   r   r   s     r   r   zConditionTests.test_notify  s)    }}4 4 r   c                    | j                         dg fd}d}t        ||      5  	 d d d        | j                  t              |       D ](  \  }}| j	                  |       | j                  |       * y # 1 sw Y   RxY w)Nr   c                      j                          t        j                         } j                        }t        j                         }j	                          j                  || z
  |f       y r   )r[   r	   r   r   ra   r   )r   rk   r   r   r   r   s      r   rl   z&ConditionTests.test_timeout.<locals>.f  sP    LLN!BYYw'F!BLLNNNBGV,-r   rv   )r   r   rN   r,   rJ   rn   )r   rl   rw   r   rk   r   r   r   s        @@@r   r   zConditionTests.test_timeout  s    }}	. 1a[ 		Wq)! 	%JBr7+ V$	%		 	s   B  B	c                 "     j                         d fd}t        |d      5  t        d      D ]7  }t        j                  d       5  dz  j                          d d d        9 	 d d d        y # 1 sw Y   MxY w# 1 sw Y   y xY w)Nr   c                      5  j                  fd      } j                  |        j                  d       d d d        y # 1 sw Y   y xY w)Nc                       dk(  S N   r(   states   r   <lambda>z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>  s    uz r   r  )wait_forre   rN   )rk   r   r   r  s    r   rl   z&ConditionTests.test_waitfor.<locals>.f  sF     +'9:'  *+ + +s   8AArm   r  r   )r   r   r+   r	   r
   r   )r   rl   ir   r  s   `  @@r   test_waitforzConditionTests.test_waitfor  s    }}	+ 1a[ 	"1X "

5! "QJEKKM" ""	" 	"" "	" 	"s#   &BA9%
B9B>BBc                 `     j                         dg  fd}t        |d      5  t        d      D ]7  }t        j                  d       5  dz  j                          d d d        9 	 d d d         j                  t              d       y # 1 sw Y   hxY w# 1 sw Y   1xY w)Nr   c                     5  t        j                         } j                  fdd      }t        j                         | z
  } j                  |       j	                  | d       j                  d        d d d        y # 1 sw Y   y xY w)Nc                       dk(  S r  r(   r  s   r   r  z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>  s    q r   皙?r   )r	   r   r  rn   rJ   r   )r   rk   r   r   r  successs     r   rl   z.ConditionTests.test_waitfor_timeout.<locals>.f  su     %^^%'8#F^^%*  (""2s+t$% % %s   A6BBrm   r   r   )r   r   r+   r	   r
   r   rN   r,   )r   rl   r  r   r  r  s   `  @@@r   test_waitfor_timeoutz#ConditionTests.test_waitfor_timeout  s    }}	% 1a[ 	"1X "

5! "QJEKKM" ""	" 	Wq)	" "		" 	"s#   &B$B)
B$B!B$$B-N)r7   r8   r9   r:   r   r   r   r   r   r   r  r  r(   r   r   r   r   "  s2    2&35`TD!%4" *r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c                     | j                  t        | j                  d       | j                  t        | j                  t        j                          y )N)value)r   r   semtypesysmaxsizer5   s    r   rU   z#BaseSemaphoreTests.test_constructor  s:    *dllB?*dllS[[LIr   c                    | j                  d      }|j                          |j                          | j                  d      }|j                          |j                          |j                          |j                          y )Nrm   r   )r  r[   ra   r   sems     r   r   zBaseSemaphoreTests.test_acquire  sR    ll1oll1or   c                 F    | j                         }|j                          ~y r   )r  r[   r  s     r   r^   z'BaseSemaphoreTests.test_acquire_destroy  s    llnr   c                 0  
 d}| j                  |      j                          g g g d

fd}fd}d}t        ||      5  |dz
  } ||       | j                  z   dg|z         d
t	        |      D ]  }j                           |} |||z          | j                  t        z         dg|z  dg|z  z          d
|dz
  }t	        |      D ]  }j                            |||z   |z          | j                  t        z         dg|z  dg|z  z   dg|z  z          | j                  j                  d             d}	j                          d d d        | j                  d	gz   z   	z   z         y # 1 sw Y   )xY w)
N   r   c                      j                  j                                j                          j                  j                                j                          y r   ri   )r   r   r   r  sem_resultss   r   r   z7BaseSemaphoreTests.test_acquire_contended.<locals>.func  sC    s{{}-OOI&s{{}-OOI&r   c                     t        j                  t         j                        D ]  }t              t              z   | k\  s y  y r   r   r!   r"   r,   countr%   r   r   s     r   
wait_countz=BaseSemaphoreTests.test_acquire_contended.<locals>.wait_count  ;    ++G,A,AB x=3x=0E9r   
   rm   r   FT)r  r[   r   rN   r+   ra   sortedrn   )r   	sem_valuer   r#  rw   r   r  r   count3count4r   r   r   r  r  s             @@@@@r   ry   z)BaseSemaphoreTests.test_acquire_contended  s   	ll9%		' 	'	
 4^ 	]FvX01#,? I9% Fv'VHx$78S6\QC&L8: I!mF6] v/0VHx$78S6\QC&L8A3<GI S[[/0 FKKM9	< 	6F?V#;f#DE	G=	 	s   DFFc                   	
 d}| j                  |      

j                          g g 	d	
fd}	fd}t        |d      5  |dz
  } ||       | j                  	z   dg|z         d|}
j	                  |        |||z          | j                  t        	z         dg|z  dg|z  z          d|dz
  }
j	                  |        |||z   |z          | j                  t        	z         dg|z  dg|z  z   dg|z  z          | j                  
j                  d             
j	                          d d d        y # 1 sw Y   y xY w)	Nr  r   c                      j                          j                          j                          j                          y r   r   )r   r   r   r  s   r   r   z2BaseSemaphoreTests.test_multirelease.<locals>.funcD  s-    KKMOOI&KKMOOI&r   c                     t        j                  t         j                        D ]  }t              t              z   | k\  s y  y r   r   r!  s     r   r#  z8BaseSemaphoreTests.test_multirelease.<locals>.wait_countK  r$  r   r%  rm   r   F)r  r[   r   rN   ra   r&  rn   )r   r'  r   r#  r   r   r(  r   r   r   r  s          @@@@r   test_multireleasez$BaseSemaphoreTests.test_multirelease<  sa   	ll9%		'	
 4_ 	]FvX01#,? IFKKv'VHx$78S6\QC&L8: I]FKKv/0VHx$78S6\QC&L8A3<GI S[[/0 KKM3	 	 	s   C6EEc                 F   | j                  d      }| j                  |j                  d             | j                  |j                  d             | j                  |j                  d             |j	                          | j                  |j                  d             y )Nr   F)r  re   r[   rn   ra   r  s     r   rf   z#BaseSemaphoreTests.test_try_acquirek  sn    ll1oE*+E*+U+,E*+r   c                     | j                  d      j                          g fd}t        |d      5  	 d d d        | j                  t	              dgdz  dgdz  z          y # 1 sw Y   0xY w)Nr  c                       j                  j                  d              j                  j                  d             y rd   ri   )r   r  s   r   rl   z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.fw  s-    NN3;;u-.NN3;;u-.r   rv   Fr  Tr   )r  r[   r   rN   r&  )r   rl   r   r  s     @@r   rp   z-BaseSemaphoreTests.test_try_acquire_contendeds  sm    ll1o	/ 1a[ 		
 	5'A+!*CE	 	s   A))A2c                 P   | j                  d      }| j                  t        |j                  dd       | j	                  |j                  d             | j	                  |j                  d             | j                  |j                  d             |j                          | j	                  |j                  d             t        j                         }| j                  |j                  d             t        j                         |z
  }| j                  |d       y )Nr   Fg      ?r   g{Gzt?r   )
r  r   r   r[   re   rn   ra   r	   r   rJ   )r   r  tr   s       r   test_acquire_timeoutz'BaseSemaphoreTests.test_acquire_timeout  s    ll1o*ckk5#FE23E23U34E23NNS12^^!2s#r   c                     | j                         j                          fd}t        |d      5 }t        d       | j	                  |j
                         j                          d d d        y # 1 sw Y   y xY w)Nc                  F     j                           j                          y r   rs   )r  s   r   rl   z0BaseSemaphoreTests.test_default_value.<locals>.f  s    KKMKKMr   rm   )r  r[   r   r   rn   r   ra   )r   rl   rx   r  s      @r   test_default_valuez%BaseSemaphoreTests.test_default_value  sc    lln	 1a[ 	E #U^^, KKM	 	 	s   7A33A<c                 <     j                  d      d fd	} |         j                  j                  d             j                           j	                  t
        |t
                j                  j                  d             j                          y )Nr   c                    5  j                  j                  d             j                          5  j                  j                  d             | r| 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wrd   )re   r[   ra   rn   )r}   r   r  s    r   _withz+BaseSemaphoreTests.test_with.<locals>._with  sz     "E 23 "$$S[[%78!	 "" "" "" "s"   3A:%A.A:.A7	3A::BFr   )r  re   r[   ra   r   r   )r   r9  r  s   ` @r   r   zBaseSemaphoreTests.test_with  sj    ll1o	" 	E*+)UI6E*+r   N)r7   r8   r9   r:   rU   r   r^   ry   r-  rf   rp   r3  r6  r   r(   r   r   r  r    s>    J
6Gp-^,F$ r   r  c                       e Zd ZdZd Zd Zy)SemaphoreTestsz)
    Tests for unbounded semaphores.
    c                     | j                  d      }|j                          |j                          |j                          |j                          y Nrm   )r  ra   r[   r  s     r   r   z&SemaphoreTests.test_release_unacquired  s3    ll1or   c                 (   | j                  d      }| j                  t        |      d       |j                          | j                  t        |      d       |j	                          |j	                          | j                  t        |      d       y )Nr   z<\w+\.Semaphore at .*: value=3>z<\w+\.Semaphore at .*: value=2>z<\w+\.Semaphore at .*: value=4>)r  rW   rX   r[   ra   r  s     r   rY   zSemaphoreTests.test_repr  si    ll1oc$FGc$FGc$FGr   Nr7   r8   r9   r:   r   rY   r(   r   r   r;  r;    s    Hr   r;  c                       e Zd ZdZd Zd Zy)BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    c                     | j                         }| j                  t        |j                         |j	                          |j                          | j                  t        |j                         y r   )r  r   r   ra   r[   r  s     r   r   z-BoundedSemaphoreTests.test_release_unacquired  sG    lln*ckk2*ckk2r   c                     | j                  d      }| j                  t        |      d       |j                          | j                  t        |      d       y )Nr   z(<\w+\.BoundedSemaphore at .*: value=3/3>z(<\w+\.BoundedSemaphore at .*: value=2/3>)r  rW   rX   r[   r  s     r   rY   zBoundedSemaphoreTests.test_repr  sB    ll1oc$OPc$OPr   Nr?  r(   r   r   rA  rA    s    3Qr   rA  c                   t    e Zd ZdZdZdZd Zd Zd Zd Z	ddZ
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)BarrierTestsz$
    Tests for Barrier objects.
    rv   g       @c                 \    | j                  | j                  | j                        | _        y )Nr   )barriertyperw   defaultTimeoutbarrierr5   s    r   r@   zBarrierTests.setUp  s#    ''8K8K'Lr   c                 8    | j                   j                          y r   )rI  abortr5   s    r   rD   zBarrierTests.tearDown  s    r   c                 \    t        || j                        5  	 d d d        y # 1 sw Y   y xY wr   )r   rw   r   rl   s     r   run_threadszBarrierTests.run_threads  s(    1dff 		 	 	s   "+c                 `   | j                   j                  }| j                  || j                         t	        |      D ]  }|d   j                  d       | j                  t        |d         ||z         | j                   j                          |d   j                  d       | j                  t        |d         |dz   |z         | j                   j                           | j                  | j                   j                  d       | j                  | j                   j                         y )Nr   Trm   )rI  partiesrN   rw   r+   r   r,   r   	n_waitingrn   broken)r   r   nmr  s        r   	multipasszBarrierTests.multipass  s    LL  DFF#q 	 AAJd#S_a!e4LLAJd#S_q1uk:LL	  	//3,,-r   c                 B     g g g fd} j                  |       y)z;
        Test that a barrier is passed in lockstep
        c                  *    j                          y r   )rU  )passesr   r   s   r   rl   z$BarrierTests.test_barrier.<locals>.f  s    NN7F+r   NrN  )r   rX  rl   r   s   `` @r   test_barrierzBarrierTests.test_barrier  s!     b'	,r   c                 $    | j                  d      S )zC
        Test that a barrier works for 10 consecutive runs
        r%  )rZ  r5   s    r   test_barrier_10zBarrierTests.test_barrier_10  s       $$r   c                      g  fd} j                  |        j                  t              t        t         j                                     y)z9
        test the return value from barrier.wait
        c                  \    j                   j                         } j                  |        y r   )rI  r   r   )r   r   r   s    r   rl   z(BarrierTests.test_wait_return.<locals>.f  s!    !!#ANN1r   N)rN  rN   sumr+   rw   )r   rl   r   s   ` @r   test_wait_returnzBarrierTests.test_wait_return  s@     	 	Ws5='9:r   c                      g fd} j                   j                  |       fd} j                  |       y)z,
        Test the 'action' callback
        c                  (     j                  d       y r4   )r   )r   s   r   actionz(BarrierTests.test_action.<locals>.action  s    NN4 r   c                  \     j                          j                  t              d       y r=  )r   rN   r,   )rI  r   r   s   r   rl   z#BarrierTests.test_action.<locals>.f  s     LLNS\1-r   N)rG  rw   rN  )r   rc  rl   rI  r   s   `  @@r   test_actionzBarrierTests.test_action  s:     	!""46662	. 	r   c                     g g  fd} j                  |        j                  t              d        j                  t               j                  dz
          j	                   j
                  j                         y)zK
        Test that an abort will put the barrier in a broken state
        c                  ^   	 j                   j                         } | j                  dz  k(  rt        j                   j                          j	                  d       y # t
        j                  $ r j	                  d       Y y t        $ r j                   j                          Y y w xY wNr   T)rI  r   rw   r   r   r   BrokenBarrierErrorrK  )r  r   r   r   s    r   rl   z"BarrierTests.test_abort.<locals>.f'  s    
LL%%'	>&&!!#%// &% ""$s   AA! !$B,"B,+B,r   rm   N)rN  rN   r,   rw   re   rI  rR  )r   rl   r   r   s   ` @@r   
test_abortzBarrierTests.test_abort!  sj     	 	X*Xq1++,r   c                     g g g  fd} j                  |        j                  t              d        j                  t               j                  dz
          j                  t               j                         y)zL
        Test that a 'reset' on a barrier frees the waiting threads
        c                  6   j                   j                         } | j                  dz  k(  rkt        j                  t        j
                        D ]*  }j                   j                  j                  dz
  k\  s* n j                   j                          n,	 j                   j                          j                  d       j                   j                          j                  d       y # t        j                  $ r j                  d       Y Rw xY w)Nr   rm   T)rI  r   rw   r   r!   r"   rQ  resetr   r   ri  )r  r%   r   r   results3r   s     r   rl   z"BarrierTests.test_reset.<locals>.f@  s    !!#ADFFAI~ //0E0EF A||--$&&1*= ""$*LL%%'OOD) LLOOD!	 !33 *OOD)*s   +C1 1$DDr   rm   N)rN  rN   r,   rw   )r   rl   r   r   rn  s   ` @@@r   
test_resetzBarrierTests.test_reset9  sq     	"$ 	X*Xq1X/r   c                 T    g g g  j                   j                         fd} j                  |        j                  t	              d        j                  t	               j                  dz
          j                  t	               j                         y)zF
        Test that a barrier can be reset after being broken.
        c                  H   	 j                   j                         } | j                  dz  k(  rt        j                   j                          j	                  d       j                         j                  dz  k(  rj                   j                          j                          j                   j                          j	                  d       y # t
        j                  $ r j	                  d       Y t        $ r j                   j                          Y w xY wrh  )	rI  r   rw   r   r   r   ri  rK  rm  )r  barrier2r   r   rn  r   s    r   rl   z,BarrierTests.test_abort_and_reset.<locals>.f`  s    
LL%%'	>&&!!#% }}$&&!)+""$MMOLLOOD! // &% ""$s   AC $D!<"D! D!r   rm   N)rG  rw   rN  rN   r,   )r   rl   rr  r   r   rn  s   ` @@@@r   test_abort_and_resetz!BarrierTests.test_abort_and_resetX  s     ##DFF+	" 	"* 	X*Xq1X/r   c                 2      fd} j                  |       y)z$
        Test wait(timeout)
        c                  &   j                   j                         } | j                  dz  k(  r"t        j                  j
                  dz         j                  t        j                  j                   j                  j
                  dz         y )Nr   r  )	rI  r   rw   r	   r
   rH  r   r   ri  )r  r   s    r   rl   z$BarrierTests.test_timeout.<locals>.f~  sm    !!#ADFFaK

4..23i::"ll//1D1Dq1HJr   NrY  rM  s   ` r   r   zBarrierTests.test_timeoutz  s    	J 	r   c                      d} j                  d|       fd}t        j                         }t        |d      5  	 ddd       t        j                         |z
  } j	                  ||       y# 1 sw Y   3xY w)z4
        Test the barrier's default timeout
        r  r   r   c                  Z    j                  t        j                   j                         y r   )r   r   ri  r   )rI  r   s   r   rl   z,BarrierTests.test_default_timeout.<locals>.f  s     i::%ll,r   rm   N)rG  r	   r   r   rF   )r   r   rl   
start_timer   rI  s   `    @r   test_default_timeoutz!BarrierTests.test_default_timeout  st     ""1g"6	, ^^%
1a[ 		^^
*G,	 	s   A22A;c                 f    | j                  d      }|j                          |j                          y r=  )rG  r   )r   bs     r   test_single_threadzBarrierTests.test_single_thread  s$    Q		r   c                 (   | j                  d      t        j                  | j                  t	              d       fd}d}t        ||      5  t        j                  t        j                        D ]  }j                  |k\  s n | j                  t	              d       j                         d d d        | j                  t	              d       j                          | j                  t	              d       y # 1 sw Y   PxY w)Nr   z!<\w+\.Barrier at .*: waiters=0/3>c                  (     j                         y r   )r   )rI  r   s   r   rl   z!BarrierTests.test_repr.<locals>.f  s    LL!r   r   z!<\w+\.Barrier at .*: waiters=2/3>z<\w+\.Barrier at .*: broken>)rG  r   r   rW   rX   r   r!   r"   rQ  r   rK  )r   rl   rw   r%   rI  r   s       @@r   rY   zBarrierTests.test_repr  s    ""1%&&g(LM	" 1a[ 		"++G,A,AB $$) T']AC LL!		" 	g=	? 	g8	:!		" 		"s   6D
/DDN)rm   )r7   r8   r9   r:   rw   rH  r@   rD   rN  rU  rZ  r\  r`  re  rj  ro  rs  r   ry  r|  rY   r(   r   r   rE  rE    s`     	
ANM.%
;-00> 0D- 
:r   rE  )r:   r   r  r	   _threadr   r   r   unittestr   testr   test.supportr   
skipUnlesshas_fork_supportr   r   objectr   TestCaser<   rL   r   r   r   r   r  r;  rA  rE  r(   r   r   <module>r     s    
 
  1     ) $##G$<$<%CD
 @F @F18$$ 1"V!L V!r? ?Dd+ d+Nm@ m@`G*\ G*TA AFH' H.Q. Q(\:< \:r   