B
    ÐH/\¥'  ã               @   sè   d dl mZ d dl mZ d dl mZ d dl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mZ G d	d
„ d
ejƒZe d¡G dd„ dejƒƒZe d¡G dd„ dejƒƒZG dd„ dejƒZedkräe ¡  dS )é    )Úabsolute_import)Údivision)Úprint_functionN)Úutil)Úlocal)Ú
getcurrent)ÚNativeStrIOc               @   s   e Zd Zdd„ ZdS )ÚMyLocalc             C   s
   || _ d S )N)Úfoo)Úselfr
   © r   ú6lib/python3.7/site-packages/gevent/tests/test__util.pyÚ__init__   s    zMyLocal.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	      s   r	   z'5.10.x is *very* slow formatting stacksc               @   s   e Zd Zdd„ Zdd„ ZdS )Ú
TestFormatc             C   sR   t  ¡ }d |¡}|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )NÚ
ZThreadsZ	Greenletsz
Spawned atzParent greenletzSpawn Tree Locals)r   Zformat_run_infoÚjoinÚassertInÚassertNotIn)r   ÚlinesÚvaluer   r   r   Ú
test_basic   s    
zTestFormat.test_basicc             C   sŒ   t   ¡ }d|_dd„ }t |¡}d|_| ¡  |j}|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d	|¡ |  d|¡ |  d
|¡ d S )Né   c              S   sT   t dƒ} | st‚t ¡ }|s t‚dt ¡ jd< tƒ }tjtj	|d}| 
¡  | ¡ S )Né*   za value)Úfile)r	   ÚAssertionErrorr   Úgeventr   Úspawn_tree_localsr   Úspawnr   Zprint_run_infor   Úgetvalue)ÚlÚl2ÚioÚgr   r   r   Úroot+   s    z+TestFormat.test_with_Greenlet.<locals>.rootZPrinterz
Spawned atzParent:zSpawn Tree LocalszGreenlet Locals:r	   z{})	r   r
   r   r    Únamer   r   r   r   )r   Zrlr&   r%   r   r   r   r   Útest_with_Greenlet(   s    
zTestFormat.test_with_GreenletN)r   r   r   r   r(   r   r   r   r   r      s   r   zSee TestFormatc                   sb   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zejd	d
„ ƒZ	ejdd„ ƒZ
ejdd„ ƒZ‡  ZS )ÚTestTreec                s*   t t| ƒ ¡  tjj| _dtj_d | _d S )NT)Úsuperr)   ÚsetUpr   ÚconfigÚtrack_greenlet_treeZmaxDiff)r   )Ú	__class__r   r   r+   I   s    
zTestTree.setUpc                s   | j tj_ tt| ƒ ¡  d S )N)r-   r   r,   r*   r)   ÚtearDown)r   )r.   r   r   r/   O   s    
zTestTree.tearDownc       	         sÒ   xt dƒD ]}t ¡  q
W g }tdƒ}|s.t‚dd„ ‰ dd„ ‰‡ ‡fdd„‰ˆ ˆƒ}| ¡  | ˆ ˆƒ¡ ‡ ‡fd	d
„}ˆ |ƒ}|jd k	r”d|jd< | ¡  ˆ tj	j
ƒ}| ¡  |j}|t|ƒ|jdddœdfS )Né   r   c             S   s*   t tƒ ƒ t | ¡}t|dƒ t |ƒ |S )NÚminimal_ident)Ústrr   r   r    Úgetattr)Úfr%   r   r   r   Ús^   s
    


zTestTree._build_tree.<locals>.sc               S   s   t  ¡ ‚d S )N)Ú	greentestZExpectedExceptionr   r   r   r   Út1g   s    z TestTree._build_tree.<locals>.t1c                 s,   t dƒ} | st‚ˆ ˆƒ}dt|jƒ |_|S )Né   zCustomName-)r	   r   r2   r1   r'   )r"   r%   )r5   r7   r   r   Út2j   s
    z TestTree._build_tree.<locals>.t2c                  s   ˆ ˆƒS )Nr   r   )r5   r9   r   r   Út3w   s    z TestTree._build_tree.<locals>.t3ZSTLZstlF)Úrunning_stacksÚspawning_stacks)Údetails)ÚrangeÚgcZcollectr	   r   r   Úappendr   r   ÚGreenletTreeÚcurrent_treer   r2   Úformat)	r   Ú_Zgletsr"   Ús1r:   Zs3Zs4Útreer   )r5   r7   r9   r   Ú_build_treeS   s*    	

zTestTree._build_treec             C   st   dd l }| d|j¡}| d|¡}| dd¡}| dd¡}| dd¡}| d	¡ d
|¡}| dd¡}| dd¡}|S )Nr   z0x[0123456789abcdef]+L?ÚXZepollZselectÚdefaultZ
test__utilÚ__main__z	 fileno=.Ú zref=-1zref=0ztype.current_treezGreenletTree.current_tree)ÚreÚcompileÚIÚsubÚreplace)r   r   rL   Zhexobjr   r   r   Ú_normalize_tree_format‡   s    zTestTree._normalize_tree_formatc             C   sH   |   ¡ \}}}|  |j¡ |  d|¡ |  |¡}d ¡ }|  ||¡ d S )NZParentaD  <greenlet.greenlet object at X>
 :    Parent: None
 :    Greenlet Locals:
 :      Local <class '__main__.MyLocal'> at X
 :        {'foo': 42}
 +--- <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 :          Parent: <greenlet.greenlet object at X>
 +--- <Greenlet "Greenlet-1" at X: t2>; finished with value <Greenlet "CustomName-0" at 0x
 :          Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 |    +--- <Greenlet "CustomName-0" at X: t1>; finished with exception ExpectedException()
 :                Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 +--- <Greenlet "Greenlet-2" at X: t2>; finished with value <Greenlet "CustomName-4" at 0x
 :          Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 |    +--- <Greenlet "CustomName-4" at X: t1>; finished with exception ExpectedException()
 :                Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 +--- <Greenlet "Greenlet-3" at X: t3>; finished with value <Greenlet "Greenlet-5" at X
 :          Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 :          Spawn Tree Locals
 :          {'stl': 'STL'}
 |    +--- <Greenlet "Greenlet-5" at X: t2>; finished with value <Greenlet "CustomName-6" at 0x
 :                Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 |         +--- <Greenlet "CustomName-6" at X: t1>; finished with exception ExpectedException()
 :                      Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
 +--- <Greenlet "Greenlet-7" at X: <bound method GreenletTree.current_tree of <class 'gevent.util.GreenletTree'>>>; finished with value <gevent.util.GreenletTree obje
            Parent: <QuietHub '' at X default default pending=0 ref=0 thread_ident=X>
        )rG   Z
assertTruer&   r   rQ   ÚstripÚassertEqual)r   rF   Zstr_treeÚtree_formatr   Úexpectedr   r   r   Ú	test_tree“   s    
zTestTree.test_treec             C   s   dt j_|  ¡  d S )NF)r   r,   r-   rG   )r   r   r   r   Útest_tree_no_track¹   s    zTestTree.test_tree_no_trackc                s\   ddl m ‰  ‡ fdd„}ˆ |ƒ}| ¡ }|jdddœd}|  |¡}d ¡ }|  ||¡ d S )	Nr   )Úgreenletc                 s"   ˆ t jjƒ} d| j_d| _|  ¡ S )NT)r   rA   rB   ÚparentZgreenlet_tree_is_ignoredZgreenlet_tree_is_rootÚswitch)Úc)ÚRawGreenletr   r   Út4Ã   s    z,TestTree.test_forest_fake_parent.<locals>.t4F)r;   r<   )r=   zc<greenlet.greenlet object at X>; not running
 :    Parent: <greenlet.greenlet object at X>
        )rX   rZ   rC   rQ   rR   rS   )r   r]   r%   rF   rT   r   rU   r   )r\   r   Útest_forest_fake_parent¿   s    	
z TestTree.test_forest_fake_parent)r   r   r   r+   r/   rG   rQ   r6   Zignores_leakcheckrV   rW   r^   Ú__classcell__r   r   )r.   r   r)   F   s   4&r)   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestAssertSwitchesc          
   C   s  ddl m} |  tj¡"}t ¡  |dƒ W d Q R X W d Q R X t|jƒ}|  d|¡ |  tj¡$ t d¡ |dƒ W d Q R X W d Q R X |  tj¡(}tjddd |dƒ W d Q R X W d Q R X t|jƒ}|  d|¡ |  d	|¡ tjd
dd |dƒ W d Q R X d S )Nr   )Úsleepgü©ñÒMbP?zTo any greenlet ingš™™™™™¹?T)Úhub_onlyzTo the hub inz(max allowed 0.0010 seconds)g      ð?F)	Ztimera   ÚassertRaisesr   Ú_FailedToSwitchÚassert_switchesr2   Z	exceptionr   )r   ra   ÚexcÚmessager   r   r   Útest_time_sleepÝ   s"    


z"TestAssertSwitches.test_time_sleepc          
   C   sJ   |   tj¡ t ¡  W d Q R X W d Q R X tjddd W d Q R X d S )Nr   F)Zmax_blocking_timerb   )rc   r   rd   re   )r   r   r   r   Útest_no_switches_no_function  s
    
z/TestAssertSwitches.test_no_switches_no_functionc          
   C   s4   |   t¡  t ¡  tƒ ‚W d Q R X W d Q R X d S )N)rc   Ú	NameErrorr   re   )r   r   r   r   Útest_exception_not_supressed  s    
z/TestAssertSwitches.test_exception_not_supressedc          
   C   s¸   ddl m} t ¡ š}|  |ƒ |j¡ |  |jj¡ t ¡ X}|  |ƒ |j¡ |  |jj|j¡ | d| | f¡ |  	| |jj¡ |  	| |jj¡ W d Q R X |  |ƒ |j¡ W d Q R X d S )Nr   )ÚgettracerZ   )
rX   rl   r   re   rS   ZtracerZassertIsNotNoneZactive_greenletZprevious_trace_functionZassertIs)r   rl   ZouterÚinnerr   r   r   Útest_nested  s    

zTestAssertSwitches.test_nestedN)r   r   r   rh   ri   rk   rn   r   r   r   r   r`   Û   s   %
r`   rJ   )Z
__future__r   r   r   r?   ZunittestZgevent.testingZtestingr6   r   r   r   rX   r   Zgevent._compatr   r	   Z
skipOnPyPyZTestCaser   r)   r`   r   Úmainr   r   r   r   Ú<module>   s&   
,
 H