o
    ÑtPf¼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   ú]/var/www/html/humari/django-venv/lib/python3.10/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   Ú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    r2   r   )ÚobjectÚgcÚcollect)r   r2   r4   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/   r0   r1   r   r%   r*   Ú	greentestÚignores_leakcheckr6   r8   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©Údestroy_loopr   )Úsetr   r   Úexc_infoÚjoinÚdestroy)Úhub©ÚacquiredrF   rB   ÚsemÚsysÚthread_acquire_kwargsÚthread_acquiredÚthread_runningr   r   Úthread_main^   s&   ÿûü
z=TestSemaphoreMultiThread._makeThreadMain.<locals>.thread_main)Úgevent._hub_localrB   rM   )r   rP   rO   rL   rK   rF   rN   rQ   r   rJ   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   rT   )r    rV   ÚassertFalseÚis_module_patchedrW   ÚEventr@   r   ÚThreadrS   ÚdaemonÚstartr7   r   ÚrangeÚIDLE_ITERATIONSÚidler   Ú
LARGE_TICKr"   ÚgetÚ
assertTrueÚis_set)r   r   Ú!require_thread_acquired_to_finishrN   rV   rW   rP   rO   rL   rF   rK   Ú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   )rk   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   rh   r   Ú	_notifier)rk   r   ÚSMALLEST_RELIABLE_DELAYr"   r   ÚgetattrÚassertIsNone)r   rL   Úacquired_in_threadÚ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   rU   rW   c                     s    ˆ   ¡ } ˆ ¡  t tj¡ | S r&   )r   r`   r    r!   r   rd   )Úack©rL   Úthreadr   r   Úgreenlet_oneÎ   s   zeTestSemaphoreMultiThread.test_acquire_in_one_wait_greenlet_wait_thread_gives_up.<locals>.greenlet_oner   rX   Té   F)r    rV   r[   r\   rW   r@   r   Úspawnr^   rS   r]   r   rd   r_   rc   r   rG   ra   r"   r
   rf   Údead)r   rV   rW   ry   rF   rK   Úgletrj   r   rw   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&   )rr   rI   )r   rL   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   rU   rA   rW   )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 )NrZ   r   éd   TrC   )r    Úget_hubra   r   r   rr   r!   r   rp   Ú	ExceptionÚ	tracebackÚ	print_excÚstrrG   rH   )ÚixÚirK   Úexr„   rI   ©	Úacquire_argsÚcountÚ
create_hubrB   Únative_sleepÚresultsÚrunr   rL   r   r   Údo_it  sL   

þ
€€ý€þÿþz<TestSemaphoreMultiThread.test_dueling_threads.<locals>.do_it)r   )rY   Úargs)r?   r?   é   F)r    rV   rR   rB   r[   r\   rW   Útimer!   r@   r   r^   r_   r`   rG   Úis_aliveÚlistr"   )	r   r‹   r   rV   rW   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   rl   )NT)r   rœ   r+   r   r   r   Útest_dueling_threads_with_hub?  rn   z6TestSemaphoreMultiThread.test_dueling_threads_with_hub)TF)r   N)r/   r0   r1   r=   r@   rS   rb   rk   rm   ru   r~   r   r9   ÚskipOnPyPyOnWindowsrš   r   rž   r   r   r   r   r;   G   s     
þ>0Jr;   c                   @   ó   e Zd Zdd„ ZdS )ÚTestBoundedSemaphoreMultiThreadc                 C   r<   r&   r   r+   r   r   r   r=   I  r>   z/TestBoundedSemaphoreMultiThread._getTargetClassN)r/   r0   r1   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   r0   r+   r   r   r   Útest_c_extensionO  s   ÿzTestCExt.test_c_extensionN)r/   r0   r1   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   Ú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  rn   zSwitchWithFixedHash.__call__c                 C   s
   t | jƒS r&   )r   r¦   r+   r   r   r   Ú__repr__h  s   
zSwitchWithFixedHash.__repr__N)r/   r0   r1   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 )ÚFirstGrZ   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/   r0   r1   r§   r,   r   r   r   r   r³   k  s    r³   c                   @   s   e Zd ZdZdS )ÚLastGé   N)r/   r0   r1   r§   r   r   r   r   rµ   u  s    rµ   c                 C   s   |   ¡  | d¡ d S )NT)r   r   )rL   Úshould_quitr   r   r   Úacquire_then_exitz  s   r¸   c                 C   s*   |rd S |   ¡  t t| |¡}| ¡  d S r&   )r   r³   r{   Úrelease_then_spawnrG   ©rL   r·   Úgr   r   r   Úacquire_then_spawn  s
   r¼   c                 C   s*   |   ¡  |rd S t t| |¡}| ¡  d S r&   )r   r³   r{   r¼   rG   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³   r{   r¼   rµ   r¸   ÚassertRaisesr    Ú
exceptionsÚLoopExitÚjoinallrf   r|   r[   r   Úkillrc   )r   rL   r·   Úkeep_going1Úkeep_going2Úexitingr   r   r   Útest_fair_or_hangs  s    ÿz$TestSemaphoreFair.test_fair_or_hangsN)r/   r0   r1   rÆ   r   r   r   r   r½     r¢   r½   Ú__main__)Ú
__future__r   r   r'   r    Úgevent.exceptionsÚgevent.lockr   r   Úgevent.testingÚtestingr9   r   ÚTestCaser	   r;   r¡   ÚskipOnPurePythonr£   r3   r¥   r´   r³   rµ   r¸   r¼   r¹   r½   r/   Úmainr   r   r   r   Ú<module>   s4   3  
ÿ