o
    ‡e¼5  ã                   @   s$  d dl mZ d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z d dl	mZ G dd„ dejƒZG d	d
„ d
ejƒZG dd„ deƒZe d¡G dd„ dejƒƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZdd„ Zdd„ Zdd„ ZG dd„ dejƒZedkre ¡  dS dS )é    )Úprint_function)Úabsolute_importN©Ú	Semaphore©ÚBoundedSemaphore)Útimingc                   @   s:   e Zd Zdd„ Zdd„ Zdd„ Zejdd„ ƒZd	d
„ Z	dS )ÚTestSemaphorec                 C   s.   t dd}|jdd}|du sJ t|ƒƒ‚d S )Nr   )Úvalueg{®Gáz„?©ÚtimeoutF)r   ÚacquireÚrepr)ÚselfÚsÚresult© r   úLD:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__semaphore.pyÚ(test_acquire_returns_false_after_timeout   s   
z6TestSemaphore.test_acquire_returns_false_after_timeoutc                    s`   t ƒ }g ‰ | ‡ fdd„¡ | ¡  | ‡ fdd„¡ | ¡  t d¡ |  tˆ ƒddg¡ d S )Nc                    ó
   ˆ   d¡S )NÚa©Úappend©r   ©r   r   r   Ú<lambda>   ó   
 z2TestSemaphore.test_release_twice.<locals>.<lambda>c                    r   )NÚbr   r   r   r   r   r   !   r   gü©ñÒMbP?r   r   )r   ZrawlinkÚreleaseÚgeventÚsleepÚassertEqualÚsorted©r   r   r   r   r   Útest_release_twice   s   
z TestSemaphore.test_release_twicec                 C   s"   t ƒ }t |¡}|  ||ƒ ¡ d S ©N)r   ÚweakrefÚrefr!   )r   r   Úrr   r   r   Útest_semaphore_weakref'   s   
z$TestSemaphore.test_semaphore_weakrefc                 C   s2   G dd„ dt ƒ}|ƒ  dd l}| ¡  | ¡  d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z9TestSemaphore.test_semaphore_in_class_with_del.<locals>.Xc                 S   s   t ƒ | _d S r%   )r   r   ©r   r   r   r   Ú__init__2   s   zBTestSemaphore.test_semaphore_in_class_with_del.<locals>.X.__init__c                 S   s   | j  ¡  d S r%   )r   r   r*   r   r   r   Ú__del__5   ó   zATestSemaphore.test_semaphore_in_class_with_del.<locals>.X.__del__N)Ú__name__Ú
__module__Ú__qualname__r+   r,   r   r   r   r   ÚX1   s    r1   r   )ÚobjectÚgcZcollect)r   r1   r3   r   r   r   Ú test_semaphore_in_class_with_del,   s
   z.TestSemaphore.test_semaphore_in_class_with_delc                 C   s   t ƒ }t |g¡ d S r%   )r   r   Úwaitr#   r   r   r   Ú)test_rawlink_on_unacquired_runs_notifiers>   s   z7TestSemaphore.test_rawlink_on_unacquired_runs_notifiersN)
r.   r/   r0   r   r$   r)   Ú	greentestZignores_leakcheckr4   r6   r   r   r   r   r	      s    
r	   c                   @   sz   e Zd Zdd„ Zdd„ Zdd„ ZdZ			dd
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Ze d¡ddd„ƒZdd„ Zdd„ ZdS )ÚTestSemaphoreMultiThreadc                 C   ó   t S r%   r   r*   r   r   r   Ú_getTargetClassN   ó   z(TestSemaphoreMultiThread._getTargetClassc                 C   s   |   ¡ dƒS )Né   )r:   r*   r   r   r   Ú_makeOneQ   s   z!TestSemaphoreMultiThread._makeOnec                    s2   ddl m‰ dd l‰‡ ‡‡‡‡‡‡‡fdd„}|S )Nr   ©Úget_hub_if_existsc               	      sš   ˆ  ¡  z2zˆ  ˆjdi ˆ¤Ž¡ W n   ˆ ¡ ˆd d …< ‚ W ˆƒ } | d ur1|  ¡  | jdd ˆ  ¡  d S ˆƒ } | d urH|  ¡  | jdd ˆ  ¡  w )NT©Zdestroy_loopr   )Úsetr   r   Úexc_infoÚjoinÚdestroy)Úhub©ÚacquiredrB   r?   ÚsemÚsysÚthread_acquire_kwargsÚthread_acquiredÚthread_runningr   r   Úthread_main^   s&   ÿûü
z=TestSemaphoreMultiThread._makeThreadMain.<locals>.thread_main)Úgevent._hub_localr?   rI   )r   rL   rK   rH   rG   rB   rJ   rM   r   rF   r   Ú_makeThreadMainX   s   z(TestSemaphoreMultiThread._makeThreadMainé   TFc                 K   sB  ddl m} |  | d¡¡ dd l}| ¡ }| ¡ }|  ¡ }| ¡  g }	g }
|j| j	||||
|	fi |¤Žd}d|_
| ¡  | d¡ |rd| ¡  t| jƒD ]}t  ¡  | tj¡r\ nqN|  |
dg¡ |s| d¡rt| jƒD ]}t  ¡  | tj¡r~ nqp| tjd ¡ |r|  | ¡ ¡ z|  |	g ¡ W d }	||
fS d }	w )	Nr   ©ÚmonkeyÚ	threading©ÚtargetTé
   r   rP   )r   rR   ÚassertFalseÚis_module_patchedrS   ÚEventr=   r   ÚThreadrO   ÚdaemonÚstartr5   r   ÚrangeÚIDLE_ITERATIONSÚidler   Ú
LARGE_TICKr!   ÚgetÚ
assertTrueÚis_set)r   r   Ú!require_thread_acquired_to_finishrJ   rR   rS   rL   rK   rH   rB   rG   ÚtÚ_r   r   r   Ú$_do_test_acquire_in_one_then_anotherq   sP   þ
ý
	ÿÿþz=TestSemaphoreMultiThread._do_test_acquire_in_one_then_anotherc                 C   ó   | j dd d S )NT)r   )rg   r*   r   r   r   Ú test_acquire_in_one_then_another¯   ó   z9TestSemaphoreMultiThread.test_acquire_in_one_then_anotherc                 C   sF   | j ddtjd\}}|  dg|¡ | ¡  t|dd ƒ}|  |¡ d S )NFT)r   rd   r   Z	_notifier)rg   r   ÚSMALLEST_RELIABLE_DELAYr!   r   ÚgetattrÚassertIsNone)r   rH   Zacquired_in_threadZnotifierr   r   r   Ú&test_acquire_in_one_then_another_timed²   s   
ýz?TestSemaphoreMultiThread.test_acquire_in_one_then_another_timedc              	      sú   ddl m} |  | d¡¡ dd l}|  ¡ ‰ ˆ  ¡  ‡ ‡fdd„}g }g }t  |¡}|j| j	| 
¡ | 
¡ ˆ ||tjdd‰dˆ_t  ¡  ˆ  ¡  | ¡  td	ƒD ]}t  ¡  ˆ tj¡ qQ|  |jd¡ |  g |¡ |  d
g|¡ |  |j|¡ d }d S )Nr   rQ   rS   c                     s    ˆ   ¡ } ˆ ¡  t tj¡ | S r%   )r   r\   r   r    r   r`   )Zack©rH   Úthreadr   r   Úgreenlet_oneÎ   s   zeTestSemaphoreMultiThread.test_acquire_in_one_wait_greenlet_wait_thread_gives_up.<locals>.greenlet_oner   rT   Té   F)r   rR   rW   rX   rS   r=   r   ÚspawnrZ   rO   rY   r   r`   r[   r_   r   rC   r]   r!   r
   rb   Údead)r   rR   rS   rq   rB   rG   Zgletrf   r   ro   r   Ú6test_acquire_in_one_wait_greenlet_wait_thread_gives_up¾   s6   

üzOTestSemaphoreMultiThread.test_acquire_in_one_wait_greenlet_wait_thread_gives_upc                 C   s   |   |j|¡ d S r%   )rm   rE   )r   rH   r   r   r   ÚassertOneHasNoHubî   s   z*TestSemaphoreMultiThread.assertOneHasNoHubz&Flaky there; can't reproduce elsewherer   Nc           	   	      s,  ddl m} ddlm‰ ˆ | d¡¡ dd l}ddlm‰ ˆ 	¡ ‰ˆ 
ˆ¡ d‰ddg‰d‰‡ ‡‡‡‡‡‡‡‡f	d	d
„}|j|dd}d|_|j|dd}d|_| ¡  | ¡  | d¡ | d¡ | ¡ sk| ¡ rˆtˆƒ}| d¡ | d¡ |ˆkr€d‰n| ¡ sk| ¡ skˆ ˆˆd ˆd g¡ d S )Nr   rQ   r>   rS   )r    i'  éÿÿÿÿTc              
      s8  ˆrt  ¡  z‚zItˆƒD ]B}ˆs n=ˆjˆ Ž }ˆ s|sJ ‚|r#ˆ ¡  |ˆ| < ˆs4ˆ ˆƒ ˆƒ | |f¡ ˆrC|d dkrCt  tj¡ q|d dkrNˆtjƒ qW n" t	yr } zdd l
}| ¡  t|ƒˆ| < d }W Y d }~nd }~ww W ˆƒ }|d ur‡| ¡  |jdd d S d S ˆƒ }|d ur›| ¡  |jdd w w )NrV   r   éd   Tr@   )r   Zget_hubr]   r   r   rm   r    r   rk   Ú	ExceptionÚ	tracebackÚ	print_excÚstrrC   rD   )ZixÚirG   Úexrz   rE   ©	Úacquire_argsÚcountÚ
create_hubr?   Znative_sleepÚresultsÚrunr   rH   r   r   Údo_it  sL   

þ
€€ý€þÿþz<TestSemaphoreMultiThread.test_dueling_threads.<locals>.do_it)r   )rU   Úargs)r<   r<   é   F)r   rR   rN   r?   rW   rX   rS   Útimer    r=   rv   rZ   r[   r\   rC   Úis_aliveÚlistr!   )	r   r€   r‚   rR   rS   r…   Út1Út2Úcurr   r   r   Útest_dueling_threadsñ   s8   
"



ù	z-TestSemaphoreMultiThread.test_dueling_threadsc                 C   s   |   d¡ d S )N)Té   ©rŽ   r*   r   r   r   Útest_dueling_threads_timeout<  r-   z5TestSemaphoreMultiThread.test_dueling_threads_timeoutc                 C   rh   )NT)r‚   r   r*   r   r   r   Útest_dueling_threads_with_hub?  rj   z6TestSemaphoreMultiThread.test_dueling_threads_with_hub)TF)r   N)r.   r/   r0   r:   r=   rO   r^   rg   ri   rn   ru   rv   r7   ZskipOnPyPyOnWindowsrŽ   r‘   r’   r   r   r   r   r8   G   s     
þ>0Jr8   c                   @   ó   e Zd Zdd„ ZdS )ÚTestBoundedSemaphoreMultiThreadc                 C   r9   r%   r   r*   r   r   r   r:   I  r;   z/TestBoundedSemaphoreMultiThread._getTargetClassN)r.   r/   r0   r:   r   r   r   r   r”   G  ó    r”   zNeeds C extensionc                   @   r“   )ÚTestCExtc                 C   s   |   tjd¡ d S )Nzgevent._gevent_c_semaphore)r!   r   r/   r*   r   r   r   Útest_c_extensionO  s   ÿzTestCExt.test_c_extensionN)r.   r/   r0   r—   r   r   r   r   r–   L  s    r–   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSwitchWithFixedHashc                 C   s   |j | _ || _d S r%   )ÚswitchÚhashcode)r   Zgreenletrš   r   r   r   r+   [  s   
zSwitchWithFixedHash.__init__c                 C   ó   t ‚r%   ©ÚAssertionErrorr*   r   r   r   Ú__hash___  r;   zSwitchWithFixedHash.__hash__c                 C   r›   r%   rœ   )r   Úotherr   r   r   Ú__eq__b  r;   zSwitchWithFixedHash.__eq__c                 O   s   | j |i |¤ŽS r%   )r™   ©r   r†   Úkwargsr   r   r   Ú__call__e  rj   zSwitchWithFixedHash.__call__c                 C   s
   t | jƒS r%   )r   r™   r*   r   r   r   Ú__repr__h  s   
zSwitchWithFixedHash.__repr__N)r.   r/   r0   r+   rž   r    r£   r¤   r   r   r   r   r˜   T  s    r˜   c                   @   s   e Zd ZdZdd„ ZdS )ÚFirstGrV   c                 O   s,   t jj| g|¢R i |¤Ž t| | jƒ| _d S r%   )r   ÚGreenletr+   r˜   rš   r™   r¡   r   r   r   r+   p  s   zFirstG.__init__N)r.   r/   r0   rš   r+   r   r   r   r   r¥   k  s    r¥   c                   @   s   e Zd ZdZdS )ÚLastGé   N)r.   r/   r0   rš   r   r   r   r   r§   u  s    r§   c                 C   s   |   ¡  | d¡ d S )NT)r   r   )rH   Úshould_quitr   r   r   Úacquire_then_exitz  s   rª   c                 C   s*   |rd S |   ¡  t t| |¡}| ¡  d S r%   )r   r¥   rs   Úrelease_then_spawnrC   ©rH   r©   Úgr   r   r   Úacquire_then_spawn  s
   r®   c                 C   s*   |   ¡  |rd S t t| |¡}| ¡  d S r%   )r   r¥   rs   r®   rC   r¬   r   r   r   r«   †  s
   r«   c                   @   r“   )ÚTestSemaphoreFairc                 C   sÈ   t ƒ }g }t t||¡}t t||¡}t t||¡}|  tjj	¡ t 
|||g¡ W d   ƒ n1 s4w   Y  |  |j|¡ |  |j|¡ |  |j|¡ | ¡  | ¡  | ¡  | ¡  t ¡  d S r%   )r   r¥   rs   r®   r§   rª   ÚassertRaisesr   Ú
exceptionsZLoopExitZjoinallrb   rt   rW   r   Úkillr_   )r   rH   r©   Zkeep_going1Zkeep_going2Zexitingr   r   r   Útest_fair_or_hangs  s    ÿz$TestSemaphoreFair.test_fair_or_hangsN)r.   r/   r0   r³   r   r   r   r   r¯     r•   r¯   Ú__main__)Ú
__future__r   r   r&   r   Zgevent.exceptionsZgevent.lockr   r   Zgevent.testingÚtestingr7   r   ZTestCaser	   r8   r”   ZskipOnPurePythonr–   r2   r˜   r¦   r¥   r§   rª   r®   r«   r¯   r.   Úmainr   r   r   r   Ú<module>   s4   3  
ÿ