o
    ‡e 5  ã                   @   s&  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ dZG dd„ dejƒZG d	d
„ d
ejƒZG dd„ dejjjƒZG dd„ dejjjƒZG dd„ dejƒZe d¡G dd„ dejƒƒZG dd„ dejƒZG dd„ dejƒZedkr‘e ¡  dS dS )é    N)Úsocket)ÚWaiterÚget_hub)ÚNativeStrIO)Úget_this_psutil_processçš™™™™™¹?c                   @   ó   e Zd Zdd„ ZdS )ÚTestCloseSocketWhilePollingc              	   C   sˆ   t   ¡ }|  |¡ tƒ j d¡}| |j¡ |  t j¡ z| 	d¡ W | ¡  n| ¡  w W d   ƒ n1 s8w   Y  t
 d¡ d S )Nr   )z
python.orgéQ   )r   Z_close_on_teardownr   ÚloopÚtimerÚstartÚcloseÚassertRaisesÚerrorÚconnectÚgeventÚsleep)ÚselfÚsockÚt© r   úFD:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__hub.pyÚtest(   s   
üz TestCloseSocketWhilePolling.testN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	   &   ó    r	   c                   @   r   )ÚTestExceptionInMainloopc                    sØ   t   ¡ }t t¡ t   ¡ | }td }|  |t| t| ¡ t d¡‰ ‡ fdd„}tƒ j 	d¡2}| 
|¡ |  ¡  t   ¡ }t t¡ t   ¡ | }| jˆ d |  |t| t| ¡ W d   ƒ d S 1 sew   Y  d S )NgÍÌÌÌÌÌì?z'TestExceptionInMainloop.test_sleep/failc                      ó   ˆ ‚©Nr   r   ©r   r   r   ÚfailC   ó   z0TestExceptionInMainloop.test_sleep.<locals>.failgü©ñÒMbP?)Úvalue)Útimer   r   ÚDELAYZassertTimeWithinRangeÚ	greentestZExpectedExceptionr   r   r   r   Zexpect_one_errorZassert_error)r   r   ÚdelayZdelay_ranger#   r   r   r"   r   Ú
test_sleep8   s    



"öz"TestExceptionInMainloop.test_sleepN)r   r   r   r*   r   r   r   r   r   6   r   r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú	TestSleepc                 C   s   t  |¡ d S r!   ©r   r   )r   Útimeoutr   r   r   ÚwaitV   ó   zTestSleep.waitc                 C   s   t  d¡ d S )Nr   r-   ©r   r   r   r   Útest_simpleY   r0   zTestSleep.test_simpleN)r   r   r   r/   r2   r   r   r   r   r,   T   s    r,   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚTestWaiterGetc                    s   t t| ƒ ¡  tƒ | _d S r!   )Úsuperr3   ÚsetUpr   Úwaiterr1   ©Ú	__class__r   r   r5   _   ó   zTestWaiterGet.setUpc                 C   sL   t ƒ j |¡}| | jjd ¡ | j ¡ W  d   ƒ S 1 sw   Y  d S r!   )r   r   r   r   r6   ÚswitchÚget)r   r.   Zevtr   r   r   r/   c   s   $þzTestWaiterGet.wait)r   r   r   r5   r/   Ú__classcell__r   r   r7   r   r3   ]   s    r3   c                   @   r   )Ú
TestWaiterc                 C   sÂ   t ƒ }|  t|ƒd¡ | d¡ |  t|ƒd¡ |  | ¡ d¡ t ƒ }| t¡ t dt|ƒ¡s6J t|ƒƒ‚|  	t|j¡ t ƒ }t
 |j¡}d|_t
 d¡ t|ƒ}|  | d¡|¡ | ¡  d S )Nz<Waiter greenlet=None>é   z<Waiter greenlet=None value=25>z6^<Waiter greenlet=None exc_info=.*ZeroDivisionError.*$ZANamer   z!<Waiter greenlet=<Greenlet "AName)r   ÚassertEqualÚstrr:   r;   ÚthrowÚZeroDivisionErrorÚreÚmatchr   r   ÚspawnÚnamer   Ú
assertTrueÚ
startswithÚkill)r   r6   ÚgZ
str_waiterr   r   r   r   k   s$   


ÿzTestWaiter.testNr   r   r   r   r   r=   i   r   r=   z
Racy on CIc                       s˜   e Zd Zdd„ Z‡ fdd„Z‡ fdd„Zdd„ Zd	d
„ Zddd„Ze	j
dd„ ƒZe	j
dd„ ƒZdd„ Ze	j
dd„ ƒZe	j
dd„ ƒZe	j
dd„ ƒZ‡  ZS )ÚTestPeriodicMonitoringThreadc                 C   sL   t ƒ }z|`W n	 ty   Y nw |jd ur$|j ¡  |j ¡  |`d S d S r!   )r   Úexception_streamÚAttributeErrorZ_threadpoolÚ
threadpoolÚjoinrI   ©r   Úhubr   r   r   Ú
_reset_hub…   s   ÿ


ýz'TestPeriodicMonitoringThread._reset_hubc                    sT   t t| ƒ ¡  tjj| _dtj_ddlm} |ddƒƒ | _d| _	t
ƒ | _|  ¡  d S )NTr   )Úget_originalÚ	threadingÚLock)r4   rK   r5   r   ÚconfigÚmonitor_threadZgevent.monkeyrS   ÚlockÚmonitor_firedÚsetÚmonitored_hubsrR   )r   rS   r7   r   r   r5   ‘   s   
z"TestPeriodicMonitoringThread.setUpc                    sL   t ƒ }| js|jr|j ¡  d |_| jtj_d | _|  ¡  tt	| ƒ 
¡  d S r!   )r   rW   Úperiodic_monitoring_threadrI   r   rV   r[   rR   r4   rK   ÚtearDownrP   r7   r   r   r]   ›   s   

z%TestPeriodicMonitoringThread.tearDownc                 C   s`   | j # |  jd7  _| jd ur| j |¡ W d   ƒ d S W d   ƒ d S 1 s)w   Y  d S )Né   )rX   rY   r[   ÚaddrP   r   r   r   Ú_monitor¦   s   
ý"þz%TestPeriodicMonitoringThread._monitorc                 C   s   |   dtjj¡ d S )Nr   )r?   r   rV   Zmax_blocking_timer1   r   r   r   Útest_config¬   s   z(TestPeriodicMonitoringThread.test_configTc                    sb   |   ˆj¡ ddlm} |ƒ ‰ ˆ  ¡  ‡ ‡‡fdd„}ˆ |d¡ ˆ  ¡  ˆ  ¡  ˆ |d ¡ d S )Nr   )Ú	Conditionc                    s,   ˆ   ¡  ˆ  ¡  ˆ  ¡  ˆrˆ ¡  d S d S r!   )ÚacquireÚ
notify_allÚreleaserI   )Z_hub©ZcondrI   Úmonitorr   r   Úmonitor_condµ   s   ýzJTestPeriodicMonitoringThread._run_monitoring_threads.<locals>.monitor_condç{®Gáz„?)rG   Z
should_runrT   rb   rc   Úadd_monitoring_functionr/   re   )r   rg   rI   rb   rh   r   rf   r   Ú_run_monitoring_threads¯   s   	z4TestPeriodicMonitoringThread._run_monitoring_threadsc                 C   s@   ddl m} tƒ }| ¡  |  |ƒ ¡ |j ¡  |  |ƒ ¡ d S )Nr   )Úgettrace)Zgreenletrl   r   Ú start_periodic_monitoring_threadÚassertIsNotNoner\   rI   ÚassertIsNone)r   rl   rQ   r   r   r   Útest_kill_removes_traceÄ   s   
z4TestPeriodicMonitoringThread.test_kill_removes_tracec                 C   s€  t ƒ }tƒ  }|_| ¡ }|  |¡ d}tƒ d ur|d7 }|  |t| ¡ ƒ¡ | 	| j
d¡ |  |d t| ¡ ƒ¡ |  | j
| ¡ d j¡ |  d| ¡ d j¡ t |jj¡ |j|u s_J ‚z)t d¡ |  |¡ W | 	| j
d ¡ |  |t|jƒ¡ |j|u s‚J ‚| ¡  |`n| 	| j
d ¡ |  |t|jƒ¡ |j|u s J ‚| ¡  |`w |  | jd¡ | ¡ }|  d|¡ |  d|¡ d S )Nr^   r   éÿÿÿÿç333333Ó?úappears to be blockedÚPeriodicMonitoringThread)r   r   rL   rm   rn   r   r?   ÚlenZmonitoring_functionsrj   r`   ÚfunctionZperiodr   r   r   Zapprox_timer_resolutionr&   rk   Z_monitoring_functionsrI   ZassertGreaterEqualrY   ÚgetvalueÚassertIn)r   rQ   Ústreamrg   Zbasic_monitor_func_countÚdatar   r   r   Útest_blocking_this_threadÍ   sN   


ÿ

ÿ
ÿûÿz6TestPeriodicMonitoringThread.test_blocking_this_threadc                    s`   t ƒ }|j}| t ¡}||usJ ‚tƒ ‰ˆ  |j¡ ‡ ‡fdd„}| |¡}ˆ  |¡ |ˆ|fS )Nc                     s,   ˆt ƒ _t d¡ t ƒ j} |  ˆ jd¡ | S )Nri   r   )r   rL   r   r   r\   rj   r`   )Úmon©r   ry   r   r   Útask
  s
   
z>TestPeriodicMonitoringThread._prep_worker_thread.<locals>.task)r   rN   Úapplyr   ro   r\   rn   )r   rQ   rN   Ú
worker_hubr~   Úworker_monitorr   r}   r   Ú_prep_worker_threadö   s   



z0TestPeriodicMonitoringThread._prep_worker_threadc                 C   sj   |   ¡ \}}}|  |¡ | ¡  | j |  || j¡ |  | ¡ d¡ W d   ƒ d S 1 s.w   Y  d S )NÚ )r‚   rk   rI   rX   rx   r[   r?   rw   )r   r€   ry   r   r   r   r   Ú*test_blocking_threadpool_thread_task_queue  s   
"þzGTestPeriodicMonitoringThread.test_blocking_threadpool_thread_task_queuec                 C   sŒ   t ƒ }|j}|  ¡ \}}}| tjd¡}|  |¡ | ¡  | ¡  | j	 |  
|| j¡ |  | ¡ d¡ W d   ƒ d S 1 s?w   Y  d S )Nrr   rƒ   )r   rN   r‚   rE   r&   r   rk   r;   rI   rX   rx   r[   r?   rw   )r   rQ   rN   r€   ry   r   r~   r   r   r   Ú,test_blocking_threadpool_thread_one_greenlet(  s   
"þzITestPeriodicMonitoringThread.test_blocking_threadpool_thread_one_greenletc                 C   s|   t ƒ }|j}|  ¡ \}}}dd„ }| |¡}| j|dd | ¡  | ¡  |  || j¡ | 	¡ }|  d|¡ |  d|¡ d S )Nc                  S   s   t  tjd¡} |  ¡  d S )Ngffffffæ?)r   rE   r&   r   rO   )rJ   r   r   r   r~   J  r9   zYTestPeriodicMonitoringThread.test_blocking_threadpool_thread_multi_greenlet.<locals>.taskF)rI   rs   rt   )
r   rN   r‚   rE   rk   r;   rI   rx   r[   rw   )r   rQ   rN   r€   ry   r   r~   rz   r   r   r   Ú.test_blocking_threadpool_thread_multi_greenletA  s   
zKTestPeriodicMonitoringThread.test_blocking_threadpool_thread_multi_greenlet)T)r   r   r   rR   r5   r]   r`   ra   rk   r(   Zignores_leakcheckrp   r{   r‚   r„   r…   r†   r<   r   r   r7   r   rK   ‚   s$    



(

rK   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestLoopInterfacec                 C   s0   ddl m} ddlm} tƒ j}| ||¡ d S )Nr   ©Úverify)ÚILoop)Úgevent.testingr‰   Úgevent._interfacesrŠ   r   r   ÚverifyObject)r   r‰   rŠ   r   r   r   r   Útest_implemensts_ILoop_  s   z(TestLoopInterface.test_implemensts_ILoopc                 C   ó>   ddl m} ddlm} tƒ j}| dd„ ¡}| ||¡ d S )Nr   rˆ   ©Ú	ICallbackc                   S   ó   d S r!   r   r   r   r   r   Ú<lambda>m  ó    zFTestLoopInterface.test_callback_implements_ICallback.<locals>.<lambda>)r‹   r‰   rŒ   r‘   r   r   Zrun_callbackr   ©r   r‰   r‘   r   Úcbr   r   r   Ú"test_callback_implements_ICallbackg  ó
   z4TestLoopInterface.test_callback_implements_ICallbackc                 C   r   )Nr   rˆ   r   c                   S   r’   r!   r   r   r   r   r   r“   v  r”   zITestLoopInterface.test_callback_ts_implements_ICallback.<locals>.<lambda>)r‹   r‰   rŒ   r‘   r   r   Zrun_callback_threadsafer   r•   r   r   r   Ú%test_callback_ts_implements_ICallbackp  r˜   z7TestLoopInterface.test_callback_ts_implements_ICallbackN)r   r   r   rŽ   r—   r™   r   r   r   r   r‡   ]  s    	r‡   c                   @   r+   )ÚTestHandleErrorc                 C   s"   zt ƒ `W d S  ty   Y d S w r!   )r   Úhandle_errorrM   r1   r   r   r   r]   |  s
   ÿzTestHandleError.tearDownc                    sj   dd„ }|t ƒ _G dd„ dtƒ‰ ‡ fdd„}|  ˆ ¡ t |¡ ¡  W d   ƒ d S 1 s.w   Y  d S )Nc                  W   s   t ‚r!   )rM   )Úargsr   r   r   Úbad_handle_error„  r$   z^TestHandleError.test_exception_in_custom_handle_error_does_not_crash.<locals>.bad_handle_errorc                   @   s   e Zd ZdS )zYTestHandleError.test_exception_in_custom_handle_error_does_not_crash.<locals>.MyExceptionN)r   r   r   r   r   r   r   ÚMyException‰  s    rž   c                      r    r!   r   r   ©rž   r   r   ÚraisesŒ  r$   zTTestHandleError.test_exception_in_custom_handle_error_does_not_crash.<locals>.raises)r   r›   Ú	Exceptionr   r   rE   r;   )r   r   r    r   rŸ   r   Ú4test_exception_in_custom_handle_error_does_not_crash‚  s   "ÿzDTestHandleError.test_exception_in_custom_handle_error_does_not_crashN)r   r   r   r]   r¢   r   r   r   r   rš   z  s    rš   Ú__main__)rC   r&   Zunittestr‹   Útestingr(   Zgevent.testing.timingr   r   Z
gevent.hubr   r   Zgevent._compatr   r   r'   ZTestCaser	   r   ZtimingZAbstractGenericWaitTestCaser,   r3   r=   ZskipOnCIrK   r‡   rš   r   Úmainr   r   r   r   Ú<module>   s0   	 [ÿ