
    4\h                        d Z ddl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dS )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             d S )N{Gz?)timesleep)nthreads    9/opt/python-3.11.14/usr/lib/python3.11/test/lock_tests.pywait_threads_blockedr      s     	Juw    c                   2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
Bunchz
    A bunch of threads.
    Fc                 j    || _         || _        g | _        g | _        g | _        | | _        d| _        dS )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__!   s?     	-- r   c                 
   t          j                    }| j                            |           	 |                                  n1# t
          $ r$}| j                            |           Y d }~nd }~ww xY w| j                            |           t          j	        t          j
                  D ]}| j        r d S d S # | j                            |           t          j	        t          j
                  D ]}| j        r 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   	IIKKKK 	( 	( 	(O""3''''''''	( M  %%%+G,ABB  > EE  M  %%%+G,ABB  > Es0   A B< 
A2A-(B< -A22B< <ADc                 t   t          j        t          j                  | _        | j                                         	 t          | j                  D ]}t          | j	        d           n#  d| _
         xY wt          j        t          j                  D ]!}t          | j                  | j        k    r n"| S )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UU##%%%	4<(( 0 0 B////0	!DN'(=>> 	 	A4<  DL00 1 s   ,A+ +
A5c                    t          j        t           j                  D ]!}t          | j                  | j        k    r n"| j                            d d d            | j        }d | _        |rt          | j
         d|          d S )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__M   s    '(=>> 	 	A4=!!T\11 2 	""4t444 _
 	- DI!I!I!I!+- - -	- 	-r   c                     d| _         d S 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      sn         ! ! ! !    "- - -    r   r   c                        e Zd Zd Zd Zd ZdS )BaseTestCasec                 6    t          j                    | _        d S r   )r   threading_setup_threadsr5   s    r   setUpzBaseTestCase.setUpa   s    (8::r   c                 R    t          j        | j          t          j                     d S r   )r   threading_cleanupr?   r   reap_childrenr5   s    r   tearDownzBaseTestCase.tearDownd   s'    *DM::r   c                 j    |                      ||dz             |                     ||dz             d S )Ng333333?g      $@)assertGreaterEqual
assertLess)r   actualexpecteds      r   assertTimeoutzBaseTestCase.assertTimeouth   s<     	3777400000r   N)r7   r8   r9   r@   rD   rJ   r(   r   r   r<   r<   `   sA        ; ; ;     1 1 1 1 1r   r<   c                   f    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dS )BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c                     t          j        t           j                  D ]}t          |          |k    r n|                     t          |          |           d S r   )r   r!   r"   r,   assertEqual)r   phaserI   r%   s       r   
wait_phasezBaseLockTests.wait_phasev   s\    '(=>> 	 	A5zzX%% &UX.....r   c                 0    |                                  }~d S r   )locktyper   locks     r   test_constructorzBaseLockTests.test_constructor|   s    }}DDr   c                 v    |                                  }|                     t          |          d           ~d S )Nz<unlocked .* object (.*)?at .*>)rR   assertRegexreprrS   s     r   	test_reprzBaseLockTests.test_repr   s3    }}d%FGGGDDr   c                     |                                  }|                                 |                     t          |          d           ~d S )Nz<locked .* object (.*)?at .*>)rR   acquirerW   rX   rS   s     r   test_locked_reprzBaseLockTests.test_locked_repr   s@    }}d%DEEEDDr   c                 X    |                                  }|                                 ~d S r   )rR   r[   rS   s     r   test_acquire_destroyz"BaseLockTests.test_acquire_destroy   s#    }}DDr   c                     |                                  }|                                 |                                 ~d S r   rR   r[   releaserS   s     r   test_acquire_releasez"BaseLockTests.test_acquire_release   s0    }}DDr   c                     |                                  }|                     |                    d                     |                                 d S NF)rR   
assertTruer[   ra   rS   s     r   test_try_acquirezBaseLockTests.test_try_acquire   s>    }}U++,,,r   c                    |                                                                   g fd}t          |d          5  	 d d d            n# 1 swxY w Y   |                     d                                                     d S )Nc                  X                                              d                     d S 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Ac                    |                                                                   fd}d}t          ||          5 }t          |           |                     t          |j                  d                                            d d d            n# 1 swxY w Y   |                     t          |j                  |           d S )Nc                  X                                                                         d S r   r[   ra   rT   s   r   rl   z/BaseLockTests.test_acquire_contended.<locals>.f   !    LLNNNLLNNNNNr      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0!444 LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	U^,,a00000s   ABB Bc                    |                                  fd}dfd	}5  	 d d d            n# 1 swxY w Y   t          |d          5  	 d d d            n# 1 swxY w Y   |                     t                    5  5  t          # 1 swxY w Y   	 d d d            n# 1 swxY w Y   t          |d          5  	 d d d            d S # 1 swxY w Y   d S )Nc                  X                                                                         d S r   rs   rt   s   r   rl   z"BaseLockTests.test_with.<locals>.f   ru   r   c                 H    5  | | 	 d d d            d S # 1 swxY w Y   d S 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   s3   }}	 	 	 	 		 	 	 	 	 	  	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 y)) 	  	                      	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s`   155AA!A?B"B

B	B"B	B""B&)B&=CCCc                     |                                  fd}t          |d          5  	 d d d            d S # 1 swxY w Y   d S )Nc                  X                                                                         d S 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   s     }}	 	 	 	 	 1b\\ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   :>>c                 P   |                                  |                     t          j        dd           |                     t          j        d           |                     t          j        d           |                     t          j        t
          dz                                  t
                                                      t          j                    }| 	                                        d                     t          j                    }| 
                    ||z
  d           g fd}t          |d          5  	 d d d            n# 1 swxY w Y   |                     d                    |                     d         d	           d S )
NFrm   itimeoutg}Ô%ITrv   c                      t          j                    }                                         d                     t          j                    }                    || z
             d S )N      ?r   )r	   	monotonicr   r[   )t1t2rT   resultss     r   rl   z%BaseLockTests.test_timeout.<locals>.f   sY    !!BNN4<<<4455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   }}*dlE1===*dlDAAA-uEEE-{QOOO[)))^Q//000^R###	$ 	$ 	$ 	$ 	$ 	$
 1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	$$$71:s+++++s   E$$E(+E(c                     |                                  }t          j        |          }|                      |                       d S r   )rR   weakrefrefassertIsNotNoner   rT   r   s      r   test_weakref_existsz!BaseLockTests.test_weakref_exists   s>    }}k$SSUU#####r   c                     |                                  }t          j        |          }~t          j                     |                      |                       d S r   )rR   r   r   gccollectassertIsNoner   s      r   test_weakref_deletedz"BaseLockTests.test_weakref_deleted  sL    }}k$

##%%     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   q   s         / / /    
    
    
	 	 	1 1 1$  :  , , ,6$ $ $
! ! ! ! !r   rL   c                   :    e Zd ZdZd Zd Zd Zed             ZdS )	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c                 :   |                                  g fd}t          j                    5  t          |d           |                     d                                            |                     d           d d d            d S # 1 swxY w Y   d S )Nc                                                                             d                                                                   d            d S r   r[   r   )rT   rO   s   r   rl   z#LockTests.test_reacquire.<locals>.f  sG    LLNNNLLLLNNNLLr   r(   rm      )rR   r   r)   r   rP   ra   r   rl   rT   rO   s     @@r   test_reacquirezLockTests.test_reacquire  s    }}	 	 	 	 	 	 /11 	& 	&Q###OOE1%%% LLNNNOOE1%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   ABBBc                    |                                                                   fd}t          |d          5  	 d d d            n# 1 swxY w Y                                                                     d S )Nc                  0                                       d S r   )ra   rt   s   r   rl   z*LockTests.test_different_thread.<locals>.f'      LLNNNNNr   rm   )rR   r[   r   ra   r   s     @r   test_different_threadzLockTests.test_different_thread#  s    }}	 	 	 	 	1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                 p   |                                  }|                                 |                     |                    d                     |                                 |                     |                                           |                     |                    d                     d S )Nr   r   F)blocking)rR   r[   rn   ra   lockedre   rS   s     r   test_state_after_timeoutz"LockTests.test_state_after_timeout.  s     }}d33444'''e4455555r   c                     d }|                                  }|                                  ||           |                                  }|                                 |                                  ||           d S )Nc                 V    |                                   |                                  d S r   rs   rt   s    r   use_lockz/LockTests.test_at_fork_reinit.<locals>.use_lock:  s"     LLNNNLLNNNNNr   )rR   _at_fork_reinitr[   )r   r   rT   lock2s       r   test_at_fork_reinitzLockTests.test_at_fork_reinit8  s~    	 	 	 }} r   N)	r7   r8   r9   r:   r   r   r   requires_forkr   r(   r   r   r   r   
  sf         & & &(	 	 	6 6 6   ]  r   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	
RLockTestsz$
    Tests for recursive locks.
    c                    |                                  }|                                 |                                 |                                 |                                 |                                 |                                 d S r   r`   rS   s     r   r   zRLockTests.test_reacquireP  sa    }}r   c                    |                                  }|                     t          |j                   |                                 |                                 |                                 |                                 |                                 |                                 |                     t          |j                   d S r   )rR   r   RuntimeErrorra   r[   rS   s     r   test_release_unacquiredz"RLockTests.test_release_unacquiredY  s    }},555,55555r   c                    |                                  }|                     t          |j                   |                                 |                                 |                                 |                                 |                                 |                                 |                     t          |j                   d S r   )rR   r   r   _release_saver[   ra   rS   s     r   test_release_save_unacquiredz'RLockTests.test_release_save_unacquirede  s    }},(:;;;,(:;;;;;r   c                 `                                                           d                                                                                                 d                                                                                                                                  d                                                                                                 d                                                                                                                                  d                                           g  fd}t          j                    5  t          |d                                d                                d                                           	                    d                                 d                                d                                           d d d            d S # 1 swxY w Y   d S )Nr   rm      r   c                                                                             d                                d                                                                 d            d S )Nr   )r[   r   rP   ra   )rT   rO   r   s   r   rl   z*RLockTests.test_recursion_count.<locals>.f  s[    LLNNNLLOOE1%%%LLNNNLLr   r(   )
rR   rN   _recursion_countr[   ra   r   r)   r   rP   r   r   s   ` @@r   test_recursion_countzRLockTests.test_recursion_countq  s7   }}D1133444D1133444D1133444D1133444D1133444	 	 	 	 	 	 	 /11 		9 		9Q###OOE1%%%Q 5 5 7 7888 LLOOE1%%%Q 5 5 7 7888		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9 		9s   4B"H##H'*H'c                 .   |                                  fd}t          |dd          5 }	 |                     t          j                   |                                 n# |                                 w xY w	 d d d            d S # 1 swxY w Y   d S )Nc                  0                                       d S 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  s    }}	 	 	 	 	 1a 	"%"!!,===!!!!!!!!!		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s(   B
 A#B
#A99B

BBc                    |                                  |                                                                                                 |                                                                                                 |                                                                g fd}t          |d          5  	 d d d            n# 1 swxY w Y   |                     d                                                     |                                                                                                 |                                                                d S )Nc                  V                                                                     d S 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   CC!CN)
r7   r8   r9   r:   r   r   r   r   r   r   r(   r   r   r   r   L  sy           
6 
6 
6
< 
< 
<!9 !9 !9F
" 
" 
"+ + + + +r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Ze	d             Z
d Zd	S )

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

%%%			

%%%		&&&		&&&&&r   c                 j   d}g g fd}t          ||          5  t          |           |                     t                    d                                            d d d            n# 1 swxY w Y   |                     dg|z             |                     dg|z             d S )Nrv   c                                                                                                                                                        d S r   )r   wait)r   results1results2s   r   rl   z#EventTests._check_notify.<locals>.f  s=    OOCHHJJ'''OOCHHJJ'''''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... GGIII	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	D6A:...D6A:.....s   AA44A8;A8c                     |                                  }|                     |           |                                 |                                 |                     |           d S r   )r   r   r   r   r   s     r   test_notifyzEventTests.test_notify  sY    nn3					3r   c                 *   |                                  g g d}fd}t          ||          5  	 d d d            n# 1 swxY w Y   |                     dg|z             D ]0\  }}|                     |           |                     |d           1g g                                  t          ||          5  	 d d d            n# 1 swxY w Y   |                     dg|z             D ]\  }}|                     |           d S )Nrv   c                                                              d                     t          j                    }                     d          }t          j                    }                     ||| z
  f           d S )Ng        r   )r   r   r	   r   )r   rr   r   r   r   s      r   rl   z"EventTests.test_timeout.<locals>.f  sh    OOCHHSMM***!!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#   AA
ACCCc                 8   |                                  g fd}d}t          ||          5  t          |                                                                             d d d            n# 1 swxY w Y   |                     dg|z             d S )Nc                  l                                              t          j                             d S 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  s       	= 	= 	= 	= 	= 	= 1a[[ 	 	 ### IIKKKKKMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	4&1*-----s   8A55A9<A9c                    |                                  }|j        5  |                     |j                            d                     d d d            n# 1 swxY w Y   |                                 |j        5  |                     |j                            d                     d d d            d S # 1 swxY w Y   d S rd   )r   _condrn   r[   r   r   s     r   r   zEventTests.test_at_fork_reinit  s6    nnY 	7 	7SY..u55666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7Y 	7 	7SY..u55666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s#   .AAA<.B77B;>B;c                     |                                  }|                     t          |          d           |                                 |                     t          |          d           d S )Nz<\w+\.Event at .*: unset>z<\w+\.Event at .*: set>)r   rW   rX   r   r   s     r   rY   zEventTests.test_repr  s^    nnc$@AAA			c$>?????r   N)r7   r8   r9   r:   r   r   r   r   r   r   r   rY   r(   r   r   r   r     s         
' 
' 
'/ / /(       >. . .& 7 7 ]7@ @ @ @ @r   r   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ConditionTestsz(
    Tests for condition variables.
    c                    |                                  }|                                 |                                 |                                 |                                 t          j                    }|                      |          }|                                 |                     |                    d                     |                                 |                     |                    d                     |                     |                    d                     |                                 |5  |                     |                    d                     d d d            d S # 1 swxY w Y   d S rd   )condtyper[   ra   r   Lockrn   re   )r   condrT   s      r   test_acquirezConditionTests.test_acquire(  sr   }} 	~}}T""e,,---U++,,,e,,--- 	2 	2T\\%00111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   )E99E= E=c                 n    |                                  }|                     t          |j                   d S r   )r   r   r   r   r   r   s     r   test_unacquired_waitz#ConditionTests.test_unacquired_wait;  s-    }},	22222r   c                 n    |                                  }|                     t          |j                   d S r   )r   r   r   notifyr   s     r   test_unacquired_notifyz%ConditionTests.test_unacquired_notify?  s-    }},44444r   c                   	
 g g 	g 
d	
fd}d}t          ||          5  t          j        t          j                  D ]}t	                    |k    r n                                 |                     	g            d}                                                     |           t          |           d
                                 t          j        t          j                  D ]}t	          	          |k    r n|                     	dg|z             |                     
g            t          j        t          j                  D ]}t	                    |k    r n                                                     d           t          |           d
                                 t          j        t          j                  D ]*}t	          	          t	          
          z   ||z   k    r n+||z
  }|                     	dg|z  dg|z  z              |                     
dg|z             t          j        t          j                  D ]}t	                    |k    r n                                                                  t          |           d
                                 t          j        t          j                  D ]}t	          
          |k    r n|                     	dg|z  dg|z  z              |                     
dg|z  d	g|z  z              d d d            d S # 1 swxY w Y   d S )
Nr   c                                                                                                                      }                                                      | f                                                                                                            }                                                      | f           d S r   )r[   r   r   ra   )rk   r   	phase_numreadyr   r   s    r   rl   z'ConditionTests._check_notify.<locals>.fS  s    LLNNNLL###YY[[FLLNNNOOVY/000LLNNNLL###YY[[FLLNNNOOVY/0000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_notifyC  s    		1 	1 	1 	1 	1 	1 	1 	1 	1 1a[[ @	T @	T +G,ABB  u::??E # KKMMMXr*** FLLNNNKK ((( ILLNNN+G,ABB  x==F**E + X	{V';<<<Xr*** +G,ABB  u::''E ( LLNNNKKNNN ### ILLNNN+G,ABB  x==3x==0QZ@@E A ZFX	{V';ykF>R'RSSSX	{V';<<< +G,ABB  u::??E # LLNNNOO ### ILLNNN+G,ABB  x==A%%E &X	{V';ykF>R'RSSSX	{V';ykF>R'RSSSA@	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	T @	Ts   LMMMc                     |                                  }|                     |           |                     |           d S r   )r   r   r   s     r   r   zConditionTests.test_notify  s=    }}4   4     r   c                 L   |                                  dg fd}d}t          ||          5  	 d d d            n# 1 swxY w Y   |                     t                    |           D ]0\  }}|                     |           |                     |           1d S )Nr   c                                                       t          j                    }                               }t          j                    }                                                     || z
  |f           d S r   )r[   r	   r   r   ra   r   )r   rk   r   r   r   r   s      r   rl   z&ConditionTests.test_timeout.<locals>.f  si    LLNNN!!BYYw''F!!BLLNNN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   AA
Ac                 L                                      d fd}t          |d          5  t          d          D ]I}t          j        d           5  dz                                   d d d            n# 1 swxY w Y   J	 d d d            d S # 1 swxY w Y   d S )Nr   c                      5                       fd          }                     |                                d           d d d            d S # 1 swxY w Y   d S )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  s     + +'9'9'9'9::'''  ***+ + + + + + + + + + + + + + + + + +s   AAAArm   r  r   )r   r   r+   r	   r
   r   )r   rl   ir   r  s   `  @@r   test_waitforzConditionTests.test_waitfor  sJ   }}	+ 	+ 	+ 	+ 	+ 	+ 	+ 1a[[ 	" 	"1XX " "
5!!! " "QJEKKMMM" " " " " " " " " " " " " " ""	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s5   (BA?3B?BBBBB Bc                                                       dg  fd}t          |d          5  t          d          D ]I}t          j        d           5  dz                                   d d d            n# 1 swxY w Y   J	 d d d            n# 1 swxY w Y                        t                    d           d S )Nr   c                  D   5  t          j                    }                     fdd          }t          j                    | z
  }                     |                               | d                               d            d d d            d S # 1 swxY w Y   d S )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  s     % %^%%'8'8'8'8#FF^%%*  (((""2s+++t$$$% % % % % % % % % % % % % % % % % %s   BBB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  sj   }}	% 	% 	% 	% 	% 	% 	% 	% 1a[[ 	" 	"1XX " "
5!!! " "QJEKKMMM" " " " " " " " " " " " " " ""	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	Wq)))))s5   (BB7BBB
BBB #B N)r7   r8   r9   r:   r   r   r   r   r   r   r  r  r(   r   r   r   r   #  s         2 2 2&3 3 35 5 5`T `T `TD! ! !% % %4" " " * * * * *r   r   c                   N    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S )BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c                     |                      t          | j        d           |                      t          | j        t          j                    d S )N)value)r   r   semtypesysmaxsizer5   s    r   rU   z#BaseSemaphoreTests.test_constructor  sF    *dlB???*dlS[LIIIIIr   c                 J   |                      d          }|                                 |                                 |                      d          }|                                 |                                 |                                 |                                 d S )Nrm   r   )r  r[   ra   r   sems     r   r   zBaseSemaphoreTests.test_acquire  sr    ll1ooll1oor   c                 X    |                                  }|                                 ~d S r   )r  r[   r  s     r   r^   z'BaseSemaphoreTests.test_acquire_destroy   s#    llnnCCr   c                   
 d}|                      |                                           g g g d

fd}fd}d}t          ||          5  |dz
  } ||           |                     z   dg|z             d
t	          |          D ]}                                 |} |||z              |                     t          z             dg|z  dg|z  z              d
|dz
  }t	          |          D ]}                                  |||z   |z              |                     t          z             dg|z  dg|z  z   dg|z  z              |                                         d                     d}	                                 d d d            n# 1 swxY w Y   |                     d	g||z   |z   |	z   z             d S )
N   r   c                                                                                                                                                                                                                        d S r   ri   )r   r   r   r  sem_resultss   r   r   z7BaseSemaphoreTests.test_acquire_contended.<locals>.func  se    s{{}}---OOI&&&s{{}}---OOI&&&&&r   c                     t          j        t           j                  D ](}t                    t                    z   | k    r d S )d S r   r   r!   r"   r,   countr%   r   r   s     r   
wait_countz=BaseSemaphoreTests.test_acquire_contended.<locals>.wait_count  R    +G,ABB  x==3x==0E99EE : 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JvX01#,??? I9%%  FJv'''VHx$788S6\QC&L8: : : I!mF6]]  Jv/000VHx$788S6\QC&L8A3<GI I I S[[//000 FKKMMM9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	< 	6F?V#;f#DE	G 	G 	G 	G 	Gs   EF11F58F5c                 *  	
 d}|                      |          

                                 g g 	d	
fd}	fd}t          |d          5  |dz
  } ||           |                     	z   dg|z             d|}
                    |            |||z              |                     t          	z             dg|z  dg|z  z              d|dz
  }
                    |            |||z   |z              |                     t          	z             dg|z  dg|z  z   dg|z  z              |                     
                    d                     
                                 d d d            d S # 1 swxY w Y   d S )	Nr  r   c                                                                                                                                                          d S r   r   )r   r   r   r  s   r   r   z2BaseSemaphoreTests.test_multirelease.<locals>.funcE  sG    KKMMMOOI&&&KKMMMOOI&&&&&r   c                     t          j        t           j                  D ](}t                    t                    z   | k    r d S )d S r   r   r!  s     r   r#  z8BaseSemaphoreTests.test_multirelease.<locals>.wait_countL  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=  sN   	ll9%%		' 	' 	' 	' 	' 	' 	' 	'	 	 	 	 	 	
 4__ 	 	]FJvX01#,??? IFKKJv'''VHx$788S6\QC&L8: : : I]FKKJv/000VHx$788S6\QC&L8A3<GI I I S[[//000 KKMMM3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   D'FFFc                    |                      d          }|                     |                    d                     |                     |                    d                     |                     |                    d                     |                                 |                     |                    d                     d S )Nr   F)r  re   r[   rn   ra   r  s     r   rf   z#BaseSemaphoreTests.test_try_acquirel  s    ll1ooE**+++E**+++U++,,,E**+++++r   c                    |                      d                                           g fd}t          |d          5  	 d d d            n# 1 swxY w Y   |                     t	                    dgdz  dgdz  z              d S )Nr  c                                                                d                                                               d                     d S rd   ri   )r   r  s   r   rl   z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.fx  sE    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_contendedt  s    ll1oo	/ 	/ 	/ 	/ 	/ 	/ 1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	5'A+!*CEEEEEs   AAAc                    |                      d          }|                     t          |j        dd           |                     |                    d                     |                     |                    d                     |                     |                    d                     |                                 |                     |                    d                     t          j                    }|                     |                    d                     t          j                    |z
  }| 	                    |d           d S )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   ll1oo*ck5#FFFE22333E22333U33444E22333NS11222^!2s#####r   c                 .   |                                                                   fd}t          |d          5 }t          d           |                     |j                                                    d d d            d S # 1 swxY w Y   d S )Nc                  X                                                                         d S r   rs   )r  s   r   rl   z0BaseSemaphoreTests.test_default_value.<locals>.f  s!    KKMMMKKMMMMMr   rm   )r  r[   r   r   rn   r   ra   )r   rl   rx   r  s      @r   test_default_valuez%BaseSemaphoreTests.test_default_value  s    llnn	 	 	 	 	 1a[[ 	E ###U^,,, KKMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   >B

BBc                                           d          d fd	} |                                                      d                                                                           t
          |t
                                                              d                                                      d S )Nr   c                 D   5                                           d                                                      5                                          d                     | r| 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S rd   )re   r[   ra   rn   )r}   r   r  s    r   _withz+BaseSemaphoreTests.test_with.<locals>._with  s%    " "E 2 2333 " "$$S[[%7%7888 "!	"" " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " "s5   ?B-A=1B=B	BB	BBBFr   )r  re   r[   ra   r   r   )r   r9  r  s   ` @r   r   zBaseSemaphoreTests.test_with  s    ll1oo	" 	" 	" 	" 	" 	" 	" 	E**+++)UI66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 J J    
6G 6G 6Gp- - -^, , ,F F F$ $ $       r   r  c                       e Zd ZdZd Zd ZdS )SemaphoreTestsz)
    Tests for unbounded semaphores.
    c                     |                      d          }|                                 |                                 |                                 |                                 d S Nrm   )r  ra   r[   r  s     r   r   z&SemaphoreTests.test_release_unacquired  sI    ll1oor   c                 z   |                      d          }|                     t          |          d           |                                 |                     t          |          d           |                                 |                                 |                     t          |          d           d S )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  s    ll1ooc$FGGGc$FGGGc$FGGGGGr   Nr7   r8   r9   r:   r   rY   r(   r   r   r;  r;    sA           H H H H Hr   r;  c                       e Zd ZdZd Zd ZdS )BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    c                     |                                  }|                     t          |j                   |                                 |                                 |                     t          |j                   d S r   )r  r   r   ra   r[   r  s     r   r   z-BoundedSemaphoreTests.test_release_unacquired  s_    llnn*ck222*ck22222r   c                     |                      d          }|                     t          |          d           |                                 |                     t          |          d           d S )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  s^    ll1ooc$OPPPc$OPPPPPr   Nr?  r(   r   r   rA  rA    sA         3 3 3Q Q Q Q Qr   rA  c                   v    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dS )BarrierTestsz$
    Tests for Barrier objects.
    rv   g       @c                 R    |                      | j        | j                  | _        d S )Nr   )barriertyperw   defaultTimeoutbarrierr5   s    r   r@   zBarrierTests.setUp  s%    ''8K'LLr   c                 8    | j                                          d S r   )rI  abortr5   s    r   rD   zBarrierTests.tearDown  s    r   c                 d    t          || j                  5  	 d d d            d S # 1 swxY w Y   d S r   )r   rw   r   rl   s     r   run_threadszBarrierTests.run_threads  s{    1df 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   %))c                 |   | j         j        }|                     || j                   t	          |          D ]}|d                             d           |                     t          |d                   ||z             | j                                          |d                             d           |                     t          |d                   |dz   |z             | j                                          |                     | j         j        d           | 	                    | j         j
                   d S )Nr   Trm   )rI  partiesrN   rw   r+   r   r,   r   	n_waitingrn   broken)r   r   nmr  s        r   	multipasszBarrierTests.multipass  s   L DF###q 	  	 AAJd###S__a!e444LAJd###S__q1uk:::L/333,-----r   rm   c                 L     g g g fd}                      |           dS )z;
        Test that a barrier is passed in lockstep
        c                  4                                     d S 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  sM     b'	, 	, 	, 	, 	, 	, 	,r   c                 ,    |                      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}                      |                                t                    t          t           j                                       dS )z9
        test the return value from barrier.wait
        c                  d    j                                         }                     |            d S 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  sq     	 	 	 	 	 	 	Ws5=='9'9:::::r   c                      g fd}                       j        |           fd}                     |           dS )z,
        Test the 'action' callback
        c                  2                          d           d S r4   )r   )r   s   r   actionz(BarrierTests.test_action.<locals>.action  s    NN4     r   c                  v                                                           t                    d           d S r=  )r   rN   r,   )rI  r   r   s   r   rl   z#BarrierTests.test_action.<locals>.f  s2    LLNNNS\\1-----r   N)rG  rw   rN  )r   rc  rl   rI  r   s   `  @@r   test_actionzBarrierTests.test_action  s{     	! 	! 	! 	! 	!""46622	. 	. 	. 	. 	. 	. 	. 	r   c                 &    g g  fd}                      |                                t                    d                                t                     j        dz
                                   j        j                   dS )zK
        Test that an abort will put the barrier in a broken state
        c                  b   	 j                                         } | j        dz  k    rt          j                                                              d           d S # t
          j        $ r                     d           Y d S t          $ r j                                          Y d S 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    
L%%''	>>&&!!###%%%%%/ & & &%%%%%%   ""$$$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"  s     	 	 	 	 	 	 	 	X***Xq111+,,,,,r   c                 @    g g g  fd}                      |                                t                    d                                t                     j        dz
                                  t                     j                   dS )zL
        Test that a 'reset' on a barrier frees the waiting threads
        c                     j                                         } | j        dz  k    rUt          j        t          j                  D ]}j         j        j        dz
  k    r nj                                          nZ	 j                                                              d           n*# t          j
        $ r                     d           Y nw xY wj                                                              d           d S )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>.fA  s   !!##ADFAI~~ /0EFF  A|-$&1*== >""$$$$*L%%'''OOD)))) 3 * * *OOD)))))* LOOD!!!!!s   ?.B. .$CCr   rm   N)rN  rN   r,   rw   )r   rl   r   r   rn  s   ` @@@r   
test_resetzBarrierTests.test_reset:  s     	" 	" 	" 	" 	" 	" 	" 	"$ 	X***Xq111X/////r   c                 x    g g g                        j                   fd}                     |                                t	                    d                                t	                     j        dz
                                  t	                     j                   dS )zF
        Test that a barrier can be reset after being broken.
        c                  V   	 j                                         } | j        dz  k    rt          j                                                              d           nN# t
          j        $ r                     d           Y n(t          $ r j                                          Y nw xY w                                j        dz  k    rj                                                                           j                                                              d           d S 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>.fa  s"   
L%%''	>>&&!!###%%%%/ & & &%%%%%   ""$$$ }}$&!)++""$$$MMOOOLOOD!!!!!s   AA   $B+"B+*B+r   rm   N)rG  rw   rN  rN   r,   )r   rl   rr  r   r   rn  s   ` @@@@r   test_abort_and_resetz!BarrierTests.test_abort_and_resetY  s     ##DF++	" 	" 	" 	" 	" 	" 	" 	" 	"* 	X***Xq111X/////r   c                 <      fd}                      |           dS )z$
        Test wait(timeout)
        c                      j                                         } | j        dz  k    rt          j        j        dz                                 t          j        j         j        j        dz             d S )Nr   r  )	rI  r   rw   r	   r
   rH  r   r   ri  )r  r   s    r   rl   z$BarrierTests.test_timeout.<locals>.f  s}    !!##ADFaK
4.2333i:"l/1Dq1HJ J J J Jr   NrY  rM  s   ` r   r   zBarrierTests.test_timeout{  s=    	J 	J 	J 	J 	J 	r   c                     d}                      d|           fd}t          j                    }t          |d          5  	 ddd           n# 1 swxY w Y   t          j                    |z
  }                     ||           dS )z4
        Test the barrier's default timeout
        r  r   r   c                  R                         t          j         j                   d S r   )r   r   ri  r   )rI  r   s   r   rl   z,BarrierTests.test_default_timeout.<locals>.f  s/    i:%l, , , , ,r   rm   N)rG  r	   r   r   rF   )r   r   rl   
start_timer   rI  s   `    @r   test_default_timeoutz!BarrierTests.test_default_timeout  s     ""1g"66	, 	, 	, 	, 	, 	, ^%%
1a[[ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	^
*G,,,,,s   AAAc                     |                      d          }|                                 |                                 d S r=  )rG  r   )r   bs     r   test_single_threadzBarrierTests.test_single_thread  s3    Q		r   c                 r   |                      d          t          j        |                     t	                    d           fd}d}t          ||          5  t          j        t          j                  D ]}j        |k    r n|                     t	                    d           	                               d d d            n# 1 swxY w Y   |                     t	                    d           
                                 |                     t	                    d           d S )Nr   z!<\w+\.Barrier at .*: waiters=0/3>c                  2                                     d S 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MM	" 	" 	" 	" 	" 	" 1a[[ 		" 		"+G,ABB  $))E *T']]AC C C LL!!!		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 		" 	g=	? 	? 	? 	g8	: 	: 	: 	: 	:s   A'CCC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 M M    . . .   % % %
; 
; 
;  - - -00 0 0> 0  0  0D  - - -   
: : : : :r   rE  ) r:   osr   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 1 1 1 1 1 1 1             ) ) ) ) ) ) $#G$<%CD D
     @ @ @ @ @F @ @ @F1 1 1 1 18$ 1 1 1"V! V! V! V! V!L V! V! V!r? ? ? ? ? ? ? ?Dd+ d+ d+ d+ d+ d+ d+ d+Nm@ m@ m@ m@ m@ m@ m@ m@`G* G* G* G* G*\ G* G* G*TA A A A A A A AFH H H H H' H H H.Q Q Q Q Q. Q Q Q(\: \: \: \: \:< \: \: \: \: \:r   