o
    eD                  
   @   sl  d dl mZmZm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Zd dlmZ d dlmZ d dlmZ d d	lmZ d
dlmZ d
dlm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ZG dd deZ G dd deZ!G dd dej"Z#dd Z$e%fddZ&G dd de'Z(dd  Z)G d!d" d"eZ*G d#d$ d$e(d%e*ee e!efi Z
dS )&    )absolute_importprint_functiondivisionN)contextmanager)TestCasewraps)LazyOnClass)perf_counter)get_clock_info)get_hub_if_exists   )sysinfo)params)	leakcheck)errorhandler)flaky)get_switch_expectedc                   @   s`   e Zd Ze dddZejrdd Zndd Ze	dddZ
ejs(ejs(d	nd
fddZdS )TimeAssertMixinNc                 C   s8   z| j |||||d W d S  ty   t  Y d S w )N)placesmsgdelta)ZassertAlmostEqualAssertionErrorr   ZreraiseFlakyTestTimeout)selffirstsecondr   r   r    r   GD:\Projects\ConvertPro\env\Lib\site-packages\gevent/testing/testcase.pyassertTimeoutAlmostEqual+   s
   z(TimeAssertMixin.assertTimeoutAlmostEqualc                 C      d S Nr   r   Z
time_takenmin_timemax_timer   r   r   assertTimeWithinRange5      z%TimeAssertMixin.assertTimeWithinRangec                 C   s   |  || | || d S r    )ZassertLessEqualZassertGreaterEqualr!   r   r   r   r$   8      c                 c   s    |d u rt jst jr|d }n|d }|d ur|n|| }|| }t }||fV  t | }z| ||  ko;|kn  d|||||tdf  W d S  tyZ   t  Y d S w )Ng      @g       @zEExpected: %r; elapsed: %r; min: %r; max: %r; fuzzy %r; clock_info: %sr
   )	r   EXPECT_POOR_TIMER_RESOLUTIONLIBUVr
   
assertTruer   r   r   reraiseFlakyTestRaceCondition)r   expectedfuzzyr"   r#   startelapsedr   r   r   runs_in_given_time<   s(   



z"TimeAssertMixin.runs_in_given_timeg{Gz?g      ?c                 C   s   |  d|S )Ng        )r/   )r   r,   r   r   r   runs_in_no_timeR   s   zTimeAssertMixin.runs_in_no_timeNNN)NN)__name__
__module____qualname__r   Zreraises_flaky_timeoutr   r   r'   r$   r   r/   r(   r0   r   r   r   r   r   *   s    
r   c                   @   s4   e Zd ZdZdd Zdd Zdd ZeZdd	 Zd
S )GreenletAssertMixinz Assertions related to greenlets.c                 C   s.   |  |j| |  | | | || d S r    )r)   deadreadyassertFalser   gr   r   r   assert_greenlet_ready[   s   z)GreenletAssertMixin.assert_greenlet_readyc                 C   s"   |  |j| |  | | d S r    )r8   r6   r7   r9   r   r   r   assert_greenlet_not_ready`   s   z-GreenletAssertMixin.assert_greenlet_not_readyc                 C       |  |j| | |j| d S r    )r)   startedr8   r6   r9   r   r   r   assert_greenlet_spawnedd      z+GreenletAssertMixin.assert_greenlet_spawnedc                 C   r=   r    )r8   r>   r)   r6   r9   r   r   r   assert_greenlet_finishedk   r@   z,GreenletAssertMixin.assert_greenlet_finishedN)	r2   r3   r4   __doc__r;   r<   r?   Zassert_greenlet_startedrA   r   r   r   r   r5   X   s    r5   c                   @   sH   e Zd ZdZedd ZdddZdd	d
Zdd Zdd Z	dd Z
dS )StringAssertMixinz*
    Assertions dealing with strings.
    c                 C   s   dd l }|d|jS )Nr   z-?0x[0123456789abcdef]+L?)recompileI)r   rD   r   r   r   
HEX_NUM_REu   s   zStringAssertMixin.HEX_NUM_REXc                 C   s   | j ||S r    )rG   sub)r   sreplacer   r   r   normalize_addrz   s   z StringAssertMixin.normalize_addrNmodulec                 C   s   |d u r	t | j}|||S r    )typer3   rK   )r   rJ   rM   rK   r   r   r   normalize_module~   s   
z"StringAssertMixin.normalize_modulec                 C   s   |  | |S r    )rO   rL   r   rJ   r   r   r   	normalize   s   zStringAssertMixin.normalizec                 C   ,   t |}| |}| ||||f d S r    )strrQ   r)   endswithr   ovalrJ   nr   r   r   assert_nstr_endswith      
z&StringAssertMixin.assert_nstr_endswithc                 C   rR   r    )rS   rQ   r)   
startswithrU   r   r   r   assert_nstr_startswith   rZ   z(StringAssertMixin.assert_nstr_startswith)rH   )NrM   )r2   r3   r4   rB   r	   rG   rL   rO   rQ   rY   r\   r   r   r   r   rC   p   s    


rC   c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )TestTimeout 	Not Givenc                 C   s   t jj| |d|f dd d S )Nz7%r: test timed out (set class __timeout__ to increase)
F)ref)geventTimeout__init__)r   timeoutmethodr   r   r   rc      s   
zTestTimeout.__init__c                 C   sj   ddl m} t j}d}t|drdd | D }| }dd|d|f | _tj	
| || d S )	Nr   )format_run_infozN/Adebugc                 S   s   g | ]}t |qS r   )rS   ).0rJ   r   r   r   
<listcomp>   s    z.TestTimeout._on_expiration.<locals>.<listcomp>zLoop Debug:
%s
Run Info:
%s
)Zgevent.utilrf   ra   get_hubloophasattrrg   join_expire_inforb   _on_expiration)r   Zprev_greenletexrf   rl   Z
debug_infoZrun_infor   r   r   rp      s   

zTestTimeout._on_expirationc                 C   s   t j| }|| j7 }|S r    )ra   rb   __str__ro   rP   r   r   r   rr      s   
zTestTimeout.__str__N)r_   )r2   r3   r4   ro   rc   rp   rr   r   r   r   r   r]      s
    
r]   c                    s&   d u r S t   fdd}|S )Nc                    sD   t    | g|R i |W  d    S 1 sw   Y  d S r    )r]   r   argskwargsre   rd   r   r   timeout_wrapper   s   $z&_wrap_timeout.<locals>.timeout_wrapperr   )rd   re   rw   r   rv   r   _wrap_timeout   s
   rx   c                 C   sb   t  }| ||}||ur|S |D ]}t|||}||ur!|  S q|tu r/td|| |f |S )NzAttribute %r not found
%s
%s
)objectgetgetattrAttributeError)	classDictbasesattrdefaultNONEvaluebaser   r   r   _get_class_attr   s   r   c                   @   s   e Zd Zdd ZdS )TestCaseMetaClassc           
      C   s   | dd}|dkrt|d dd }tjr|d ur|d9 }t||dd}t||dd}t||dd}t| D ]9\}}	|d	rqt|	rq|	| t
||	}	t|	d|}|r\t|	}	|rct|	}	|rmtjrmt|	}	|	||< q8t| |||S )
N__timeout__r   r      check_totalrefcountTerror_fataluses_handle_errortest)rz   r{   r   ZRUN_LEAKCHECKSr   listitemsr[   callablepoprx   r   Zwrap_error_fatalZwrap_restore_handle_errorr   Zwrap_refcountrN   __new__)
cls	classnamer~   r}   rd   r   r   r   keyr   r   r   r   r      s,   





zTestCaseMetaClass.__new__N)r2   r3   r4   r   r   r   r   r   r      s    r   c                   C   r   r    r   r   r   r   r   _noop   r%   r   c                       s0   e Zd Z fddZdd Z fddZ  ZS )SubscriberCleanupMixinc                    s.   t t|   ddlm} |jd d  | _d S Nr   )events)superr   setUpra   r   subscribers(_SubscriberCleanupMixin__old_subscribersr   r   	__class__r   r   r      s   zSubscriberCleanupMixin.setUpc                 C   s   ddl m} |j| d S r   )ra   r   r   append)r   rI   r   r   r   r   addSubscriber   r&   z$SubscriberCleanupMixin.addSubscriberc                    s.   ddl m} | j|jd d < tt|   d S r   )ra   r   r   r   r   r   tearDownr   r   r   r   r      s   zSubscriberCleanupMixin.tearDown)r2   r3   r4   r   r   r   __classcell__r   r   r   r   r      s    r   c                       s   e Zd Zejs
ejnejZdZ	dZ
dZdZdZ fddZ fddZ fdd	Zd
d Zdd Zedd Zedd Zedd Zedd ZdZeZdd Zdd Zdd Zdd Zd*d d!Zd+d"d#Zd$d% Z d&d' Z!d(d) Z"  Z#S ),r   r   Tr   c                    s,   | j dkrt| j| _ tt| j|i |S )Nr   )switch_expectedr   fullnamer   r   runrs   r   r   r   r     s   
zTestCase.runc                    s>   t t|   t }|r|jr|j  g | _| | j d S r    )	r   r   r   r   rl   Z
update_nowclose_on_teardownZ
addCleanup_tearDownCloseOnTearDown)r   Zhubr   r   r   r     s   

zTestCase.setUpc                    sH   t | ddr| jd d = d S t | dt}|  | j| _tt|   d S )NZskipTearDownFcleanup)r{   r   r   _none_errorr   r   r   )r   r   r   r   r   r   +  s   zTestCase.tearDownc                 C   sH   | j r"| j  }t|d|}z|  W n	 ty   Y nw | j sd S d S )Nclose)r   r   r{   	Exception)r   xr   r   r   r   r   5  s   

z!TestCase._tearDownCloseOnTearDownc                 C   s   | j | |S )zU
        *resource* either has a ``close`` method, or is a
        callable.
        )r   r   )r   resourcer   r   r   _close_on_teardown>  s   zTestCase._close_on_teardownc                 C   s   t | ddp
t | dS )NZ_testMethodNamer^   Z_TestCase__testMethodName)r{   r   r   r   r   testnameF  s   zTestCase.testnamec                 C   s   | j jd | j S )N.)r   r2   r   r   r   r   r   testcasenameJ  s   zTestCase.testcasenamec                 C   s$   t jtj| jj jddd S )Nr   r   r   )	ospathbasenamesysmodulesr   r3   __file__rsplitr   r   r   r   
modulenameN     $zTestCase.modulenamec                 C   s$   t jt j| jd d | j S )Nr   r   )r   r   splitextr   r   r   r   r   r   r   r   R  r   zTestCase.fullnamer1   c                 C   s    |  | j| j | jt _d S r    )assertEqualr   r   _store_errorra   rk   handle_errorr   r   r   r   expect_one_errorZ  s   zTestCase.expect_one_errorc                 C   s4   ~| j | jkrt j|| d S |||f| _ d S r    )r   r   ra   rk   parentthrow)r   wheretr   tbr   r   r   r   ^  s   zTestCase._store_errorc                 C   s   | j S r    )r   r   r   r   r   
peek_errore  s   zTestCase.peek_errorc                 C   s   z| j W | j| _ S | j| _ w r    )r   r   r   r   r   r   	get_errorh  s   zTestCase.get_errorNc                 C   s   |d u r|   }|\}}}|d ur)| |t | |d|f  t||s)J ||d urAt|tr;| t|| n| || |d urK| || |S )NzError must not be none %r)	r   ZassertIsInstancerN   ZassertIsNotNone
issubclass
isinstancerS   r   ZassertIs)r   kindr   errorZ
where_typeZecontextZekindZevaluer   r   r   assert_errorn  s"   

zTestCase.assert_errorc              
   C   s  dd l }dd l}ddlm} ttd| |}t|d|}d}	|s(d}	t|d}|D ]}
|
|v r1q*t||
}||s>|	s>q*|||
}z5| ' z|j}W n t	y_   |
d |j}Y nw ||}||}W d    n1 srw   Y  W n ty   |	r Y q*w | |j|j|
 | |j|j|
 | |j|j|
 t|d	r|
|j|jf}z| |j|j| W q* ty   | |j| | d
|j Y q*w | |j|j|
 | |j|j|
 q*d S )Nr   )get_originalzgevent.Z
__target__TFZ__implements__ignorekeywordsru   )inspectwarningsZgevent.monkeyr   r{   
__import__
isfunctioncatch_warningsgetfullargspecr|   simplefilter
getargspec	TypeErrorr   rt   varargsdefaultsrm   r   r   ZassertIsNone
kwonlyargskwonlydefaults)r   mod_nameZ
func_namesexcluder   r   r   Zgevent_modulemodule_nameZfuncs_given	func_nameZgevent_funcfuncr   Z
gevent_sigsigr   r   r   r   !assertMonkeyPatchedFuncSignatures  s^   








z*TestCase.assertMonkeyPatchedFuncSignaturesc                 C   s0   z	|  || W d S  ty   t  Y d S w r    )r   r   r   r*   )r   abr   r   r   assertEqualFlakyRaceCondition  s
   z&TestCase.assertEqualFlakyRaceConditionc                 C   s   |  ||||f d S r    )r)   r[   )r   itZ
has_prefixr   r   r   assertStartsWith  s   zTestCase.assertStartsWithc                 C   s   ddl m} | |  d S )Nr   )monkey)ra   r   r8   Zis_anything_patched)r   r   r   r   r   assertNotMonkeyPatched  s   zTestCase.assertNotMonkeyPatched)NNNN)r   r   )$r2   r3   r4   r   ZRUNNING_ON_CIr   ZLOCAL_TIMEOUTZ
CI_TIMEOUTr   r   r   r   r   Z_TestCase__old_subscribersr   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s>    
	





Ar   ZNewBase)+
__future__r   r   r   r   Zos.pathr   
contextlibr   Zunittestr   ZBaseTestCase	functoolsr   ra   Zgevent._utilr	   Zgevent._compatr
   r   Zgevent._hub_localr   r^   r   r   r   r   r   Zpatched_tests_setupr   ry   r   r5   rC   rb   r]   rx   r|   r   rN   r   r   r   r   r   r   r   <module>   sF   .#'
