
    z%i}                        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                  .    t        j                  d       y )N{Gz?)timesleep     C/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/lock_tests.py_waitr      s    JJtr   c                   *    e Zd ZdZddZd Zd Zd Zy)Bunchz
    A bunch of threads.
    c                      _         | _        g  _        g  _        |  _        t        j                          _         j                  j                           fd}	 t        |      D ]  }t        |d        y#  d _         xY w)z
        Construct a bunch of `n` threads running the same function `f`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        c                  z   t        j                         } j                  j                  |        	          j                  j                  |        j
                  st                j
                  sy y # j                  j                  |        j
                  st                j
                  sw w xY wN)	threading	get_identstartedappendfinished	_can_exitr   )tidfselfs    r   taskzBunch.__init__.<locals>.task,   s    %%'CLL$$$S)..G .. $$S)..G ..s   A9 9>B:8B:r   TN)r   nr   r   r   r   wait_threads_exitwait_thread	__enter__ranger   )r   r   r   wait_before_exitr   is   ``    r   __init__zBunch.__init__   s     --+==?""$		1X + r*+	!DNs   !A> >
Bc                     t        | j                        | j                  k  r.t                t        | j                        | j                  k  r-y y r   )lenr   r   r   r   s    r   wait_for_startedzBunch.wait_for_started=   s3    $,,$&&(G $,,$&&(r   c                     t        | j                        | j                  k  r-t                t        | j                        | j                  k  r-| j                  j                  d d d        y r   )r'   r   r   r   r    __exit__r(   s    r   wait_for_finishedzBunch.wait_for_finishedA   sM    $-- 466)G $-- 466) 	!!$d3r   c                     d| _         y NT)r   r(   s    r   	do_finishzBunch.do_finishG   s	    r   N)F)__name__
__module____qualname____doc__r%   r)   r,   r/   r   r   r   r   r      s    >4r   r   c                       e Zd Zd Zd Zd Zy)BaseTestCasec                 6    t        j                         | _        y r   )r   threading_setup_threadsr(   s    r   setUpzBaseTestCase.setUpL   s    (88:r   c                 d    t        j                  | j                    t        j                          y r   )r   threading_cleanupr8   r   reap_childrenr(   s    r   tearDownzBaseTestCase.tearDownO   s     **DMM:r   c                 X    | j                  ||dz         | j                  ||dz         y )Ng333333?g      $@)assertGreaterEqual
assertLess)r   actualexpecteds      r   assertTimeoutzBaseTestCase.assertTimeoutS   s*     	3740r   N)r0   r1   r2   r9   r=   rC   r   r   r   r5   r5   K   s    ; 1r   r5   c                   ^    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y)BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c                 &    | j                         }~y r   )locktyper   locks     r   test_constructorzBaseLockTests.test_constructora   s    }}r   c                 \    | j                         }| j                  t        |      d       ~y )Nz<unlocked .* object (.*)?at .*>)rG   assertRegexreprrH   s     r   	test_reprzBaseLockTests.test_repre   s%    }}d%FGr   c                 |    | j                         }|j                          | j                  t        |      d       ~y )Nz<locked .* object (.*)?at .*>)rG   acquirerL   rM   rH   s     r   test_locked_reprzBaseLockTests.test_locked_reprj   s.    }}d%DEr   c                 F    | j                         }|j                          ~y r   )rG   rP   rH   s     r   test_acquire_destroyz"BaseLockTests.test_acquire_destroyp   s    }}r   c                 f    | j                         }|j                          |j                          ~y r   rG   rP   releaserH   s     r   test_acquire_releasez"BaseLockTests.test_acquire_releaseu   s"    }}r   c                     | j                         }| j                  |j                  d             |j                          y NF)rG   
assertTruerP   rV   rH   s     r   test_try_acquirezBaseLockTests.test_try_acquire{   s+    }}U+,r   c                     | j                         j                          g fd}t        |d      j                          | j	                  d          j                          y )Nc                  F    j                   j                  d             y rY   r   rP   rI   results   r   r   z3BaseLockTests.test_try_acquire_contended.<locals>.f   s    MM$,,u-.r      r   )rG   rP   r   r,   assertFalserV   r   r   rI   r`   s     @@r   test_try_acquire_contendedz(BaseLockTests.test_try_acquire_contended   sN    }}	/a%%'#r   c                 t   | j                         j                          d}fd}t        ||      }|j                          t	                | j                  t        |j                        d       j                          |j                          | j                  t        |j                        |       y )N   c                  F     j                           j                          y r   rP   rV   rI   s   r   r   z/BaseLockTests.test_acquire_contended.<locals>.f       LLNLLNr   r   )
rG   rP   r   r)   r   assertEqualr'   r   rV   r,   )r   Nr   brI   s       @r   test_acquire_contendedz$BaseLockTests.test_acquire_contended   s    }}	 !QK	QZZ!,	QZZ!,r   c                     | j                         fd}dfd	} |        t        |d      j                          | j                  t        |t               t        |d      j                          y )Nc                  F     j                           j                          y r   rh   ri   s   r   r   z"BaseLockTests.test_with.<locals>.f   rj   r   c                 >    5  | | 	 d d d        y # 1 sw Y   y xY wr   r   )errrI   s    r   _withz&BaseLockTests.test_with.<locals>._with   s*     ?I #  s   ra   r   )rG   r   r,   assertRaises	TypeError)r   r   rs   rI   s      @r   	test_withzBaseLockTests.test_with   sU    }}		 	a%%')UI6a%%'r   c                 d   | j                         fd}t        t        j                               }t	        |d      j                          t        t        j                               |k7  rCt        j                  d       | j                  |t        t        j                                      y y )Nc                  F     j                           j                          y r   rh   ri   s   r   r   z)BaseLockTests.test_thread_leak.<locals>.f   rj   r      g?)	rG   r'   r   	enumerater   r,   r	   r
   rk   )r   r   r   rI   s      @r   test_thread_leakzBaseLockTests.test_thread_leak   s     }}	 	##%& 	a&&(y""$%*
 JJsOQI$7$7$9 :; +r   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      j                          | j                  d          | j                  d   d	       y )
NFra   itimeoutg}Ô%ITrf   c                      t        j                         } j                  j                  d             t        j                         }j                  || z
         y )N      ?r}   )r	   	monotonicr   rP   )t1t2rI   resultss     r   r   z%BaseLockTests.test_timeout.<locals>.f   sB    !BNN4<<<45!BNN27#r   r   r   )rG   rt   
ValueErrorrP   OverflowErrorr   rV   r	   r   rZ   r@   r   r,   rb   rC   )r   r   r   r   rI   r   s       @@r   test_timeoutzBaseLockTests.test_timeout   s   }}*dllE1=*dllDA-uE-{QO[)^^Q/0^^R#	$
 	a%%'$71:s+r   c                 z    | j                         }t        j                  |      }| j                   |              y r   )rG   weakrefrefassertIsNotNoner   rI   r   s      r   test_weakref_existsz!BaseLockTests.test_weakref_exists   s+    }}kk$SU#r   c                     | j                         }t        j                  |      }~t        j                          | j                   |              y r   )rG   r   r   gccollectassertIsNoner   s      r   test_weakref_deletedz"BaseLockTests.test_weakref_deleted   s7    }}kk$


#% r   N)r0   r1   r2   r3   rJ   rN   rQ   rS   rW   r[   rd   rn   rv   r{   r   r   r   r   r   r   rE   rE   \   sH    


- ( <&,4$
!r   rE   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       t	              dk(  rt                t	              dk(  rt                | j                  t	              d       j                          t	              dk(  rt                t	              dk(  r| j                  t	              d       d d d        y # 1 sw Y   y xY w)Nc                       j                          j                  d         j                          j                  d        y r   rP   r   )rI   phases   r   r   z#LockTests.test_reacquire.<locals>.f   s-    LLNLLLLNLLr   r   r   ra      )rG   r   r   r   r'   r   rk   rV   )r   r   rI   r   s     @@r   test_reacquirezLockTests.test_reacquire   s    }}	 //1 		,Q#e*/ e*/GSZ+LLNe*/ e*/SZ+		, 		, 		,s   3C##AC#?C##C,c                     | j                         j                          fd}t        |d      }|j                          j                          j	                          y )Nc                  &     j                          y r   )rV   ri   s   r   r   z*LockTests.test_different_thread.<locals>.f      LLNr   ra   )rG   rP   r   r,   rV   r   r   rm   rI   s      @r   test_different_threadzLockTests.test_different_thread   sE    }}	!QK	r   c                 &   | j                         }|j                          | j                  |j                  d             |j                          | j                  |j	                                | j                  |j                  d             y )Nr   r}   F)blocking)rG   rP   rb   rV   lockedrZ   rH   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   rh   ri   s    r   use_lockz/LockTests.test_at_fork_reinit.<locals>.use_lock  s     LLNLLNr   )rG   _at_fork_reinitrP   )r   r   rI   lock2s       r   test_at_fork_reinitzLockTests.test_at_fork_reinit  sP    	 }} r   N)	r0   r1   r2   r3   r   r   r   requires_forkr   r   r   r   r   r      s*    ,,	6  r   r   c                   .    e 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   rU   rH   s     r   r   zRLockTests.test_reacquire,  sC    }}r   c                 d   | j                         }| j                  t        |j                         |j	                          |j	                          |j                          |j	                          |j                          |j                          | j                  t        |j                         y r   )rG   rt   RuntimeErrorrV   rP   rH   s     r   test_release_unacquiredz"RLockTests.test_release_unacquired5  sk    }},5,5r   c                 d   | j                         }| j                  t        |j                         |j	                          |j	                          |j                          |j	                          |j                          |j                          | j                  t        |j                         y r   )rG   rt   r   _release_saverP   rV   rH   s     r   test_release_save_unacquiredz'RLockTests.test_release_save_unacquiredA  so    }},(:(:;,(:(:;r   c                     | j                         fd}t        |dd      }	 | j                  t        j                         |j                          |j                          y # |j                          w xY w)Nc                  &     j                          y r   )rP   ri   s   r   r   z+RLockTests.test_different_thread.<locals>.fP  r   r   ra   T)rG   r   rt   r   rV   r/   r,   r   s      @r   r   z RLockTests.test_different_threadM  s\    }}	!Q	lDLL9KKM	 KKMs    A& &A8c                 J   | j                         | j                  j                                j                          | j	                  j                                j                          | j	                  j                                g fd}t        |d      j                          | j                  d          j                          | j	                  j                                j                          | j                  j                                y )Nc                  D    j                   j                                y r   )r   	_is_ownedr_   s   r   r   z$RLockTests.test__is_owned.<locals>.fa  s    MM$..*+r   ra   r   )rG   rb   r   rP   rZ   r   r,   rV   rc   s     @@r   test__is_ownedzRLockTests.test__is_ownedY  s    }})*()()	,a%%'#())*r   N)	r0   r1   r2   r3   r   r   r   r   r   r   r   r   r   r   (  s     
6
<
+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   )	eventtyperb   is_setsetrZ   clearr   evts     r   test_is_setzEventTests.test_is_setp  s    nn&	

%	

%		&		&r   c                 >   d}g g fd}t        ||      }|j                          t                | j                  t	              d       j                          |j                          | j                  dg|z         | j                  dg|z         y )Nrf   c                      j                   j                                j                   j                                y r   r   wait)r   results1results2s   r   r   z#EventTests._check_notify.<locals>.f  s'    OOCHHJ'OOCHHJ'r   r   T)r   r)   r   rk   r'   r   r,   )r   r   rl   r   rm   r   r   s    `   @@r   _check_notifyzEventTests._check_notify|  s    	( !QK	X*		D6A:.D6A:.r   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        ||      j                          | j                  dg|z         D ](  \  }}| j	                  |       | j                  |d       * g g j                          t        ||      j                          | j                  dg|z         D ]  \  }}| j                  |        y )Nrf   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   r   z"EventTests.test_timeout.<locals>.f  sP    OOCHHSM*!BA!BOOQRL)r   Fr   T)r   r   r,   rk   rb   rC   r   rZ   )r   rl   r   r   dtr   r   r   s        @@@r   r   zEventTests.test_timeout  s    nn	* 	a%%'E7Q;/ 	(EArQr3'	( 	a%%'D6A:. 	EArOOA	r   c                 2   | j                         g dd}fd}t        ||      }|j                          t        j                         j                          j                          |j                          | j                  dg|z         y )Ng      ?rf   c                  L    j                   j                  dz               y N   r   )r   r   r~   s   r   r   z(EventTests.test_set_and_clear.<locals>.f  s    NN388GaK01r   T)	r   r   r)   r	   r
   r   r   r,   rk   )r   rl   r   rm   r   r   r~   s       @@@r   test_set_and_clearzEventTests.test_set_and_clear  s|     nn	2!QK	

7				4&1*-r   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rY   )r   _condrb   rP   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   rL   rM   r   r   s     r   rN   zEventTests.test_repr  sA    nnc$@A	c$>?r   N)r0   r1   r2   r3   r   r   r   r   r   r   r   rN   r   r   r   r   r   k  s:    
'/" 2." 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rY   )condtyperP   rV   r   Lockrb   rZ   )r   condrI   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   rt   r   r   r   r   s     r   test_unacquired_waitz#ConditionTests.test_unacquired_wait  s!    }},		2r   c                 d    | j                         }| j                  t        |j                         y r   )r   rt   r   notifyr   s     r   test_unacquired_notifyz%ConditionTests.test_unacquired_notify  s!    }},4r   c                 j   d}g g g dfd}t        ||      }|j                          t              dk  rt                t              dk  rj	                          | j                  g        j                          j                  d       t                dj                          t              dk  rt                t              dk  r| j                  dgdz         | j                  g        t              dk  rt                t              dk  rj                          j                  d       t                dj                          t              t              z   dk  r%t                t              t              z   dk  r%| j                  dgdz  d	gdz  z          | j                  d	gdz         t              dk  rt                t              dk  rj                          j                          t                dj                          t              dk  rt                t              dk  r| j                  dgdz  d	gdz  z          | j                  d	gdz  d
gdz  z          |j                          y )Nrf   r   c                  V   j                          j                         j                         } j                          j                  | f       j                          j                         j                         } j                          j                  | f       y r   )rP   r   r   rV   )r`   r   	phase_numreadyr   r   s    r   r   z'ConditionTests._check_notify.<locals>.f  sw    LLNLL#YY[FLLNOOVY/0LLNLL#YY[FLLNOOVY/0r      ra   )Tra   r      )Tr   )Tr   )r   r)   r'   r   r   rk   rP   r   rV   
notify_allr,   )	r   r   rl   r   rm   r   r   r   r   s	    `   @@@@r   r   zConditionTests._check_notify  sE    	
	1 
	1 !QK	 %j1nG %j1n2&A	(maG (maI;?32&%j1nG %j1n 	A	(mc(m+a/G (mc(m+a/I;?i[1_#DEI;?3%j1nG %j1n 		(maG (maI;?hZ!^#CDI;?i[1_#DE	r   c                 h    | j                         }| j                  |       | j                  |       y r   )r   r   r   s     r   r   zConditionTests.test_notify:  s)    }}4 4 r   c                     | j                         g d}fd}t        ||      j                          | j                  t	              |       D ](  \  }}| j                  |d       | j                  |       * y )Nrf   c                      j                          t        j                         } j                  d      }t        j                         }j	                          j                  || z
  |f       y )Nr   )rP   r	   r   r   rV   r   )r   r`   r   r   r   s      r   r   z&ConditionTests.test_timeout.<locals>.fD  sO    LLN!BYYs^F!BLLNNNBGV,-r   r   )r   r   r,   rk   r'   rC   rb   )r   rl   r   r   r`   r   r   s        @@r   r   zConditionTests.test_timeout@  sx    }}	. 	a%%'Wq)! 	%JBr3' V$	%r   c                 6     j                         d fd}t        |d      }|j                          t        d      D ]7  }t	        j
                  d       5  dz  j                          d d d        9 |j                          y # 1 sw Y   Tx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 r   r   states   r   <lambda>z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>[      q r   r   )wait_forrZ   rk   )r`   r   r   r   s    r   r   z&ConditionTests.test_waitfor.<locals>.fY  sF     +'89'  *+ + +s   8AAra   r   r   )r   r   r)   r"   r	   r
   r   r,   )r   r   rm   r$   r   r   s   `   @@r   test_waitforzConditionTests.test_waitforV  s    }}	+
 !QK	q 	AJJt 
 	
 	
 s   BB	c                 t     j                         dg  fd}t        |d      }|j                          t        d      D ]7  }t	        j
                  d       5  dz  j                          d d d        9 |j                           j                  t              d       y # 1 sw Y   ox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>n  r   r   g?r}   )r	   r   r   rb   rC   r   )r   r`   r   r   r   successs     r   r   z.ConditionTests.test_waitfor_timeout.<locals>.fk  su     %^^%'8#F^^%*  (""2s+t$% % %s   A6BBra   r   r   )
r   r   r)   r"   r	   r
   r   r,   rk   r'   )r   r   rm   r$   r   r   r   s   `   @@@r   test_waitfor_timeoutz#ConditionTests.test_waitfor_timeoutg  s    }}	% !QK	q 	AJJt 
 	
 	
Wq)	 s   "B..B7	N)r0   r1   r2   r3   r   r   r   r   r   r   r   r   r   r   r   r   r     s1    2&35HT!%,"*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)rt   r   semtypesysmaxsizer(   s    r   rJ   z#BaseSemaphoreTests.test_constructor  s:    *dllB?*dllS[[LIr   c                    | j                  d      }|j                          |j                          | j                  d      }|j                          |j                          |j                          |j                          y )Nra   r   )r  rP   rV   r   sems     r   r   zBaseSemaphoreTests.test_acquire  sR    ll1oll1or   c                 F    | j                         }|j                          ~y r   )r  rP   r  s     r   rS   z'BaseSemaphoreTests.test_acquire_destroy  s    llnr   c                 @  	 | j                  d      j                          d}g 	g g d	fd}t        |d      }|j                          t	              t	              z   dk  r%t                t	              t	              z   dk  r%| j                  z   dgdz         dt        d      D ]  }j                           t	              t	              z   dk  r%t                t	              t	              z   dk  r%| j                  t        z         dgdz  dgdz  z          dt        d      D ]  }j                           t	              t	              z   d	k  r%t                t	              t	              z   d	k  r%| j                  t        z         dgdz  dgdz  z   dgdz  z          | j                  j                  d
             j                          |j                          | j                  	dgdz         y )N   
   r   c                      j                  j                                j                          j                  j                                j                          y r   r^   )r   r   r   r  sem_resultss   r   r   z4BaseSemaphoreTests.test_acquire_contended.<locals>.f  sC    s{{}-OOI&s{{}-OOI&r      ra      r      FT   )r  rP   r   r)   r'   r   rk   r"   rV   sortedrb   r,   )
r   rl   r   rm   r$   r   r   r   r  r  s
        @@@@@r   rn   z)BaseSemaphoreTests.test_acquire_contended  s   ll1o		' 	'
 !RL	(mc(m+a/G (mc(m+a/H,qcAg6	q 	AKKM	(mc(m+b0G (mc(m+b08 34qcAga6GH	q 	AKKM	(mc(m+b0G (mc(m+b08 34qcAga6G1#PQ'6QRU+,	tf&>?r   c                    | j                  d      j                          g g dfd}t        |d      }|j                          t	              t	              z   dk  r%t                t	              t	              z   dk  r%| j                  z   dgdz         dj                  d       t	              t	              z   dk  r%t                t	              t	              z   dk  r%| j                  t        z         dgdz  dgdz  z          dj                  d       t	              t	              z   d	k  r%t                t	              t	              z   d	k  r%| j                  t        z         dgdz  dgdz  z   dgdz  z          | j                  j                  d
             j                          |j                          y )Nr  r   c                      j                          j                          j                          j                          y r   r   )r   r   r   r  s   r   r   z/BaseSemaphoreTests.test_multirelease.<locals>.f  s-    KKMOOI&KKMOOI&r   r  r  ra   r  r   r  F)r  rP   r   r)   r'   r   rk   rV   r  rb   r,   )r   r   rm   r   r   r   r  s      @@@@r   test_multireleasez$BaseSemaphoreTests.test_multirelease  s   ll1o		'
 !RL	(mc(m+a/G (mc(m+a/H,qcAg6	A(mc(m+b0G (mc(m+b08 34qcAga6GH	A(mc(m+b0G (mc(m+b08 34qcAga6G1#PQ'6QRU+,	r   c                 F   | j                  d      }| j                  |j                  d             | j                  |j                  d             | j                  |j                  d             |j	                          | j                  |j                  d             y )Nr   F)r  rZ   rP   rb   rV   r  s     r   r[   z#BaseSemaphoreTests.test_try_acquire  sn    ll1oE*+E*+U+,E*+r   c                     | j                  d      j                          g fd}t        |d      j                          | j	                  t              dgdz  dgdz  z          y )Nr   c                       j                  j                  d              j                  j                  d             y rY   r^   )r   r  s   r   r   z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.f  s-    NN3;;u-.NN3;;u-.r   rf   Fr  Tr   )r  rP   r   r,   rk   r  )r   r   r   r  s     @@r   rd   z-BaseSemaphoreTests.test_try_acquire_contended  s^    ll1o	/ 	a%%' 	5'A+!*CEr   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   F      ?r}   g{Gzt?r   )
r  rt   r   rP   rZ   rb   rV   r	   r   rC   )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      }|j                          t	                | j                  |j                         j                          |j                          y )Nc                  F     j                           j                          y r   rh   )r  s   r   r   z0BaseSemaphoreTests.test_default_value.<locals>.f  s    KKMKKMr   ra   )	r  rP   r   r)   r   rb   r   rV   r,   )r   r   rm   r  s      @r   test_default_valuez%BaseSemaphoreTests.test_default_value  sa    lln	 !QK	$	r   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rY   )rZ   rP   rV   rb   )rr   r   r  s    r   rs   z+BaseSemaphoreTests.test_with.<locals>._with  sz     "E 23 "$$S[[%78!	 "" "" "" "s"   3A:%A.A:.A7	3A::BFr   )r  rZ   rP   rV   rt   ru   )r   rs   r  s   ` @r   rv   zBaseSemaphoreTests.test_with  sj    ll1o	" 	E*+)UI6E*+r   N)r0   r1   r2   r3   rJ   r   rS   rn   r  r[   rd   r  r   rv   r   r   r   r   r     s>    J
#@J@,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 Nra   )r  rV   rP   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  rL   rM   rP   rV   r  s     r   rN   zSemaphoreTests.test_repr*  si    ll1oc$FGc$FGc$FGr   Nr0   r1   r2   r3   r   rN   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  rt   r   rV   rP   r  s     r   r   z-BoundedSemaphoreTests.test_release_unacquired9  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  rL   rM   rP   r  s     r   rN   zBoundedSemaphoreTests.test_reprA  sB    ll1oc$OPc$OPr   Nr(  r   r   r   r*  r*  4  s    3Qr   r*  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.
    rf   g       @c                 \    | j                  | j                  | j                        | _        y )Nr}   )barriertyperl   defaultTimeoutbarrierr(   s    r   r9   zBarrierTests.setUpO  s#    ''8K8K'Lr   c                 8    | j                   j                          y r   )r2  abortr(   s    r   r=   zBarrierTests.tearDownQ  s    r   c                 d    t        || j                  dz
        } |        |j                          y r&  )r   rl   r,   )r   r   rm   s      r   run_threadszBarrierTests.run_threadsT  s'    !TVVAX		r   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   Tra   )r2  partiesrk   rl   r"   r   r'   r   	n_waitingrb   broken)r   r   r   mr$   s        r   	multipasszBarrierTests.multipassY  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   )r<  )passesr   r   s   r   r   z$BarrierTests.test_barrier.<locals>.fk  s    NN7F+r   Nr6  )r   r?  r   r   s   `` @r   test_barrierzBarrierTests.test_barrierf  s!     b'	,r   c                 $    | j                  d      S )zC
        Test that a barrier works for 10 consecutive runs
        r  )rA  r(   s    r   test_barrier_10zBarrierTests.test_barrier_10o  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   )r2  r   r   )r   r   r   s    r   r   z(BarrierTests.test_wait_return.<locals>.fz  s!    !!#ANN1r   N)r6  rk   sumr"   rl   )r   r   r   s   ` @r   test_wait_returnzBarrierTests.test_wait_returnu  s@     	 	Ws5='9:r   c                      g fd} j                   j                  |       fd} j                  |       y)z,
        Test the 'action' callback
        c                  (     j                  d       y r.   )r   )r   s   r   actionz(BarrierTests.test_action.<locals>.action  s    NN4 r   c                  \     j                          j                  t              d       y r&  )r   rk   r'   )r2  r   r   s   r   r   z#BarrierTests.test_action.<locals>.f  s     LLNS\1-r   Nr0  rl   r6  )r   rJ  r   r2  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)r2  r   rl   r   r   r   BrokenBarrierErrorr4  )r$   r   r   r   s    r   r   z"BarrierTests.test_abort.<locals>.f  s    
LL%%'	>&&!!#%// &% ""$s   AA! !$B,"B,+B,r   ra   N)r6  rk   r'   rl   rZ   r2  r:  )r   r   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                  Z   j                   j                         } | j                  dz  k(  r}j                   j                  j                  dz
  k  r<t	        j
                  d       j                   j                  j                  dz
  k  r<j                   j                          n,	 j                   j                          j                  d       j                   j                          j                  d       y # t        j                  $ r j                  d       Y Rw xY w)Nr   ra   gMbP?T)
r2  r   rl   r9  r	   r
   resetr   r   rQ  )r$   r   r   results3r   s    r   r   z"BarrierTests.test_reset.<locals>.f  s    !!#ADFFAI~ll,,tvvax7JJu% ll,,tvvax7""$*LL%%'OOD) LLOOD!	 !33 *OOD)*s   ,+D $D*)D*r   ra   N)r6  rk   r'   rl   )r   r   r   r   rV  s   ` @@@r   
test_resetzBarrierTests.test_reset  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rP  )	r2  r   rl   r   r   r   rQ  r4  rU  )r$   barrier2r   r   rV  r   s    r   r   z,BarrierTests.test_abort_and_reset.<locals>.f  s    
LL%%'	>&&!!#% }}$&&!)+""$MMOLLOOD! // &% ""$s   AC $D!<"D! D!r   ra   N)r0  rl   r6  rk   r'   )r   r   rZ  r   r   rV  s   ` @@@@r   test_abort_and_resetz!BarrierTests.test_abort_and_reset  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                  d       j                  t        j                  j                   j                  d       y )Nr   r  r   )r2  r   rl   r	   r
   rt   r   rQ  )r$   r   s    r   r   z$BarrierTests.test_timeout.<locals>.f  sU    !!#ADFFaK

3i::"ll//6r   Nr@  )r   r   s   ` r   r   zBarrierTests.test_timeout  s    	6 	r   c                 p      j                   j                  d       fd} j                  |       y)z4
        Test the barrier's default timeout
        g333333?r}   c                      j                         } | j                  dz  k(  rt        j                  d       j	                  t
        j                  j                          y )Nr   r  )r   rl   r	   r
   rt   r   rQ  )r$   r2  r   s    r   r   z,BarrierTests.test_default_timeout.<locals>.f  sC    ADFFaK

3i::GLLIr   NrL  )r   r   r2  s   ` @r   test_default_timeoutz!BarrierTests.test_default_timeout  s4    
 ""4663"7	J 	r   c                 f    | j                  d      }|j                          |j                          y r&  )r0  r   )r   rm   s     r   test_single_threadzBarrierTests.test_single_thread  s$    Q		r   c                    | j                  d      | j                  t              d       fd}t        |d      }|j	                          t        j                  d       | j                  t              d       j                  d       |j                          | j                  t              d       j                          | j                  t              d       y )Nr   z!<\w+\.Barrier at .*: waiters=0/3>c                  (     j                  d       y )Nr   )r   )rm   s   r   r   z!BarrierTests.test_repr.<locals>.f  s    FF1Ir   r   g?z!<\w+\.Barrier at .*: waiters=2/3>z<\w+\.Barrier at .*: broken>)
r0  rL   rM   r   r)   r	   r
   r   r,   r4  )r   r   bunchrm   s      @r   rN   zBarrierTests.test_repr  s    Qa"FG	a 

3a"FG	q	!a"FG		a"ABr   N)ra   )r0   r1   r2   r3   rl   r1  r9   r=   r6  r<  rA  rC  rG  rM  rR  rW  r[  r   r`  rb  rN   r   r   r   r.  r.  H  sa     	
ANM
.%
;-00< 0D
Cr   r.  )r3   r   r  r	   _threadr   r   r   unittestr   testr   test.supportr   
skipUnlesshas_fork_supportr   r   objectr   TestCaser5   rE   r   r   r   r   r   r$  r*  r.  r   r   r   <module>rn     s    
 
  1     ) $##G$<$<%CD
.F .b18$$ 1"E!L E!PA AH@+ @+Fb@ b@Jl*\ l*^\ \|H' H.Q. Q(MC< MCr   