B
    H/\1                 @   s  d dl mZmZmZ d dl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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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fi ZdS )    )absolute_importprint_functiondivisionN)time)contextmanager)TestCase)wraps   )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sPejsPd	nd
fddZdS )TimeAssertMixinNc             C   s:   y| j |||||d W n tk
r4   t  Y nX d S )N)placesmsgdelta)ZassertAlmostEqualAssertionErrorr   ZreraiseFlakyTestTimeout)selffirstsecondr   r   r    r   6lib/python3.7/site-packages/gevent/testing/testcase.pyassertTimeoutAlmostEqual(   s    z(TimeAssertMixin.assertTimeoutAlmostEqualc             C   s   d S )Nr   )r   
time_takenmin_timemax_timer   r   r   assertTimeWithinRange2   s    z%TimeAssertMixin.assertTimeWithinRangec             C   s   |  || | || d S )N)ZassertLessEqualZassertGreaterEqual)r   r   r   r   r   r   r   r   5   s    c             c   s   |d kr&t jst jr|d }n|d }t }d V  t | }y6| || |  ko\|| kn  d|||f  W n tk
r   t  Y nX d S )Ng      @g       @z#Expected: %r; elapsed: %r; fuzzy %r)r
   EXPECT_POOR_TIMER_RESOLUTIONLIBUVr   Z
assertTruer   r   reraiseFlakyTestRaceCondition)r   Zexpectedfuzzystartelapsedr   r   r   runs_in_given_time9   s    

z"TimeAssertMixin.runs_in_given_timeg{Gz?g      ?c             C   s   |  d|S )Ng        )r%   )r   r"   r   r   r   runs_in_no_timeK   s    zTimeAssertMixin.runs_in_no_time)NNN)N)__name__
__module____qualname__r   Zreraises_flaky_timeoutr   r
   r   r   r   r%   r    r&   r   r   r   r   r   '   s   
r   c                s&   d kr S t   fdd}|S )Nc          	      s,   t jddd  | f||S Q R X d S )Nztest timed outF)ref)geventZTimeout)r   argskwargs)methodtimeoutr   r   wrapperU   s    z_wrap_timeout.<locals>.wrapper)r   )r/   r.   r0   r   )r.   r/   r   _wrap_timeoutQ   s    r1   c             C   sb   t  }| ||}||k	r|S x$|D ]}t|||}||k	r$|S q$W |tk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 k	r:|d9 }t||dd}t||dd}t||dd}xt| D ]r\}}	|d	rrt|	rr|	| t
||	}	t|	d|}|rt|	}	|rt|	}	|rtjrt|	}	|	||< qrW t| |||S )
N__timeout__r:   r      check_totalrefcountTerror_fataluses_handle_errorZtest)r3   r4   r
   ZRUN_LEAKCHECKSr=   listitems
startswithcallablepopr1   r   Zwrap_error_fatalZwrap_restore_handle_errorr   Zwrap_refcounttype__new__)
clsZ	classnamer7   r6   r/   rA   rB   rC   keyr;   r   r   r   rJ   p   s*    





zTestCaseMetaClass.__new__N)r'   r(   r)   rJ   r   r   r   r   r>   j   s   r>   c               C   s   d S )Nr   r   r   r   r   _noop   s    rM   c                   s(   e Zd Z fddZ fddZ  ZS )SubscriberCleanupMixinc                s.   t t|   ddlm} |jd d  | _d S )Nr   )events)superrN   setUpr+   rO   subscribers(_SubscriberCleanupMixin__old_subscribers)r   rO   )	__class__r   r   rQ      s    zSubscriberCleanupMixin.setUpc                s.   ddl m} | j|jd d < tt|   d S )Nr   )rO   )r+   rO   rS   rR   rP   rN   tearDown)r   rO   )rT   r   r   rU      s    zSubscriberCleanupMixin.tearDown)r'   r(   r)   rQ   rU   __classcell__r   r   )rT   r   rN      s   rN   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dd Z fddZ fdd	Zd
d Ze fddZe f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#e$e%d*e$e%d+Z&  Z'S ).r   r9   Tr   c             O   s(   | j dkrt| j| _ tj| f||S )Nr9   )switch_expectedr   fullnameBaseTestCaserun)r   r,   r-   r   r   r   rZ      s    
zTestCase.runc                s&   t t|   t j  g | _d S )N)rP   r   rQ   r+   get_hubZloopZ
update_nowclose_on_teardown)r   )rT   r   r   rQ      s    zTestCase.setUpc                sJ   t | ddrd S t | dt}|  | j| _|   g | _tt|   d S )NZskipTearDownFcleanup)	r4   rM   _none_error_tearDownCloseOnTearDownr\   rP   r   rU   )r   r]   )rT   r   r   rU      s    zTestCase.tearDownc          	   C   s@   x:| j D ]0}t|d|}y
|  W q tk
r6   Y qX qW d S )Nclose)r\   r4   	Exception)r   xra   r   r   r   r`      s    
z!TestCase._tearDownCloseOnTearDownc                s>   dd l }| | _| j  tjs,|d tt| 	  d S )Nr   r9   )
warningscatch_warnings_warning_cm	__enter__syswarnoptionssimplefilterrP   r   
setUpClass)rK   rd   )rT   r   r   rk      s    


zTestCase.setUpClassc                s"   | j d d d  tt|   d S )N)rf   __exit__rP   r   tearDownClass)rK   )rT   r   r   rm      s    zTestCase.tearDownClassc             C   s   | j | |S )zU
        *resource* either has a ``close`` method, or is a
        callable.
        )r\   append)r   resourcer   r   r   _close_on_teardown   s    zTestCase._close_on_teardownc             C   s   t | ddpt | dS )NZ_testMethodName Z_TestCase__testMethodName)r4   )r   r   r   r   testname   s    zTestCase.testnamec             C   s   | j jd | j S )N.)rT   r'   rr   )r   r   r   r   testcasename   s    zTestCase.testcasenamec             C   s$   t jtj| jj jddd S )Nrs   r	   r   )	ospathbasenamerh   modulesrT   r(   __file__rsplit)r   r   r   r   
modulename   s    zTestCase.modulenamec             C   s$   t jt j| jd d | j S )Nr   rs   )ru   rv   splitextrw   r{   rt   )r   r   r   r   rX      s    zTestCase.fullname)NNNc             C   s    |  | j| j | jt _d S )N)assertEqualr_   r^   _store_errorr+   r[   Zhandle_error)r   r   r   r   expect_one_error   s    zTestCase.expect_one_errorc             C   s2   ~| j | jkr"t j|| n|||f| _ d S )N)r_   r^   r+   r[   parentthrow)r   wheretr;   tbr   r   r   r~      s    zTestCase._store_errorc             C   s   | j S )N)r_   )r   r   r   r   
peek_error  s    zTestCase.peek_errorc             C   s   z| j S | j| _ X d S )N)r_   r^   )r   r   r   r   	get_error	  s    zTestCase.get_errorNc             C   s   |d kr|   }|\}}}|d k	rR| |t | |d|f  t||sRt||d k	rt|trv| t|| n| 	|| |d k	r| || |S )NzError must not be none %r)
r   ZassertIsInstancerI   ZassertIsNotNone
issubclassr   
isinstancestrr}   ZassertIs)r   Zkindr;   errorZ
where_typeZecontextZekindZevaluer   r   r   assert_error  s     

zTestCase.assert_errorc          
   C   s,  dd l }dd l}ddlm} ttd| |}t|d|}d}	|sPd}	t|d}x|D ]}
|
|krdqVt||
}||s~|	s~qV|||
}y6| $ |d |	|}|	|}W d Q R X W n t
k
r   |	rԂ wVY nX | |j|j|
 | |j|j|
 | |j|j|
 | |j|j|
 qVW d S )	Nr   )get_originalzgevent.Z
__target__TFZ__implements__ignore)inspectrd   Zgevent.monkeyr   r4   
__import__Z
isfunctionre   rj   Z
getargspec	TypeErrorr}   r,   Zvarargskeywordsdefaults)r   mod_nameZ
func_namesZexcluder   rd   r   Zgevent_moduleZmodule_nameZfuncs_givenZ	func_nameZgevent_funcfuncZ
gevent_sigZsigr   r   r   !assertMonkeyPatchedFuncSignatures"  s:    






z*TestCase.assertMonkeyPatchedFuncSignaturesc             C   s2   y|  || W n tk
r,   t  Y nX d S )N)r}   r   r   r!   )r   abr   r   r   assertEqualFlakyRaceConditionM  s    z&TestCase.assertEqualFlakyRaceConditionassertRaisesRegexZassertRaisesRegexp)NNNN)r   r   )(r'   r(   r)   r
   ZRUNNING_ON_CIr   ZLOCAL_TIMEOUTZ
CI_TIMEOUTr?   rW   rB   rC   r\   Z_TestCase__old_subscribersrZ   rQ   rU   r`   classmethodrk   rm   rp   propertyrr   rt   r{   rX   r^   r_   r   r~   r   r   r   r   r   r4   rY   r   rV   r   r   )rT   r   r      s8   		

+r   ZNewBase)!Z
__future__r   r   r   rh   r   os.pathru   
contextlibr   Zunittestr   rY   	functoolsr   r+   rq   r
   r   r   r   r   Zpatched_tests_setupr   r2   r   r1   r5   r=   rI   r>   rM   rN   r   r   r   r   <module>   s,   *'