o
    U˟i5                     @   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re  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.orgQ   )r   _close_on_teardownr   looptimerstartcloseassertRaiseserrorconnectgeventsleep)selfsockt r   ^/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/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>.failgMbP?)value)timer   r   DELAYassertTimeWithinRange	greentestExpectedExceptionr   r   r   r   expect_one_errorassert_error)r   r   delaydelay_ranger$   r   r   r#   r   
test_sleep8   s    



"z"TestExceptionInMainloop.test_sleepN)r   r   r   r0   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   r3   r   r   r   r   test_simpleY   r6   zTestSleep.test_simpleN)r   r   r   r5   r8   r   r   r   r   r2   T   s    r2   c                       s$   e Zd Z fddZdd Z  ZS )TestWaiterGetc                    s   t t|   t | _d S r"   )superr9   setUpr   waiterr7   	__class__r   r   r;   _      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   r<   switchget)r   r4   evtr   r   r   r5   c   s   $zTestWaiterGet.wait)r   r   r   r;   r5   __classcell__r   r   r=   r   r9   ]   s    r9   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.*$ANamer   z!<Waiter greenlet=<Greenlet "AName)r   assertEqualstrr@   rA   throwZeroDivisionErrorrematchr   r   spawnnamer   
assertTrue
startswithkill)r   r<   g
str_waiterr   r   r   r   k   s$   


zTestWaiter.testNr   r   r   r   r   rD   i   r   rD   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AttributeError_threadpool
threadpooljoinrQ   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)r:   rT   r;   r   configmonitor_threadgevent.monkeyr]   lockmonitor_firedsetmonitored_hubsr\   )r   r]   r=   r   r   r;      s   
z"TestPeriodicMonitoringThread.setUpc                    sL   t  }| js|jr|j  d |_| jtj_d | _|   tt	| 
  d S r"   )r   ra   periodic_monitoring_threadrQ   r   r`   rf   r\   r:   rT   tearDownrZ   r=   r   r   rh      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   )rc   rd   rf   addrZ   r   r   r   _monitor   s   
"z%TestPeriodicMonitoringThread._monitorc                 C   s   |  dtjj d S )Nr   )rG   r   r`   max_blocking_timer7   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releaserQ   )_hubcondrQ   monitorr   r   monitor_cond   s   zJTestPeriodicMonitoringThread._run_monitoring_threads.<locals>.monitor_cond{Gz?)rO   
should_runr^   rn   ro   add_monitoring_functionr5   rq   )r   ru   rQ   rn   rv   r   rs   r   _run_monitoring_threads   s   	z4TestPeriodicMonitoringThread._run_monitoring_threadsc                 C   s@   ddl m} t }|  | |  |j  | |  d S )Nr   )gettrace)greenletr{   r    start_periodic_monitoring_threadassertIsNotNonerg   rQ   assertIsNone)r   r{   r[   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 sJ |  |`n|	| j
d  | |t|j |j|u sJ |  |`w | | jd | }| d| | d| d S )Nri   r   333333?appears to be blockedPeriodicMonitoringThread)r   r   rU   r}   r~   r   rG   lenmonitoring_functionsry   rk   functionperiodr   r   r   approx_timer_resolutionr'   rz   _monitoring_functionsrQ   assertGreaterEqualrd   getvalueassertIn)r   r[   streamru   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 )Nrw   r   )r   rU   r   r   rg   ry   rk   )monr   r   r   r   task
  s
   
z>TestPeriodicMonitoringThread._prep_worker_thread.<locals>.task)r   rX   applyr   r   rg   r~   )r   r[   rX   
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   rz   rQ   rc   r   rf   rG   r   )r   r   r   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 )Nr   r   )r   rX   r   rM   r'   r   rz   rA   rQ   rc   r   rf   rG   r   )r   r[   rX   r   r   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   rM   r'   r   rY   )rR   r   r   r   r   J  r?   zYTestPeriodicMonitoringThread.test_blocking_threadpool_thread_multi_greenlet.<locals>.taskF)rQ   r   r   )
r   rX   r   rM   rz   rA   rQ   r   rf   r   )r   r[   rX   r   r   r   r   r   r   r   r   .test_blocking_threadpool_thread_multi_greenletA  s   
zKTestPeriodicMonitoringThread.test_blocking_threadpool_thread_multi_greenlet)T)r   r   r   r\   r;   rh   rk   rm   rz   r*   ignores_leakcheckr   r   r   r   r   r   rC   r   r   r=   r   rT      s$    



(

rT   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   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   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                   @   r1   )TestHandleErrorc                 C   s"   zt  `W d S  ty   Y d S w r"   )r   handle_errorrV   r7   r   r   r   rh   |  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"   )rV   )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   rM   rA   )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   rh   r   r   r   r   r   r   z  s    r   __main__)rK   r'   unittestr   testingr*   gevent.testing.timingr   r   
gevent.hubr   r   gevent._compatr   r   r(   TestCaser	   r    timingAbstractGenericWaitTestCaser2   r9   rD   skipOnCIrT   r   r   r   mainr   r   r   r   <module>   s0   	 [