o
    ,wÖiÑ)  ã                   @   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G dd„ dejƒZedkr}e ¡  dS dS )é    )Úabsolute_import)Údivision)Úprint_functionN)Úutil)Úlocal)Ú
getcurrent)ÚNativeStrIOc                   @   ó   e Zd Zdd„ ZdS )ÚMyLocalc                 C   s
   || _ d S ©N)Úfoo)Úselfr   © r   úT/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/gevent/tests/test__util.pyÚ__init__   s   
zMyLocal.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r
      ó    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Ú
ÚThreadsÚ	Greenletsú
Spawned atzParent greenletúSpawn Tree Locals)r   Ú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J ‚t ¡ }|sJ ‚dt ¡ jd< tƒ }tjtj|d}| 	¡  | 
¡ S )Né*   za value)Úfile)r
   r   Úgeventr   Úspawn_tree_localsr   Úspawnr   Úprint_run_infor   Úgetvalue)ÚlÚl2ÚioÚgr   r   r   Úroot,   s   z+TestFormat.test_with_Greenlet.<locals>.rootÚPrinterr   zParent:r   zGreenlet Locals:r
   z{})	r   Ú	some_attrr%   r'   Únamer   r    r   r   )r   Úrlr.   r-   r    r   r   r   Útest_with_Greenlet)   s   
zTestFormat.test_with_GreenletN)r   r   r   r!   r3   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)Úsuperr4   ÚsetUpr%   ÚconfigÚtrack_greenlet_treeÚmaxDiff©r   ©Ú	__class__r   r   r7   K   s   

zTestTree.setUpc                    s   | j tj_ tt| ƒ ¡  d S r   )r9   r%   r8   r6   r4   ÚtearDownr;   r<   r   r   r>   Q   s   
zTestTree.tearDownc           	         sâ   t dƒD ]}t ¡  qd t ¡ _d t ¡ _g }tdƒ}|sJ ‚dd„ ‰ dd„ ‰‡ ‡fdd„‰ˆ ˆƒ}| ¡  | 	ˆ ˆƒ¡ ‡ ‡fd	d
„}ˆ |ƒ}|j
d urRd|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   Úsa   s
   


zTestTree._build_tree.<locals>.sc                   S   s   t  ¡ ‚r   )Ú	greentestÚExpectedExceptionr   r   r   r   Út1j   ó   z TestTree._build_tree.<locals>.t1c                     s,   t dƒ} | sJ ‚ˆ ˆƒ}dt|jƒ |_|S )Né   zCustomName-)r
   rA   r@   r1   )r*   r-   )rD   rG   r   r   Út2m   s
   z TestTree._build_tree.<locals>.t2c                      s   ˆ ˆƒS r   r   r   )rD   rJ   r   r   Út3z   rH   z TestTree._build_tree.<locals>.t3ÚSTLÚstlF©Úrunning_stacksÚspawning_stacks©Údetails)ÚrangeÚgcÚcollectr%   Úget_hubÚresolverÚ
threadpoolr
   r   Úappendr&   r   ÚGreenletTreeÚcurrent_treer    rA   Úformat)	r   Ú_Úgletsr*   Ús1rK   Ús3Ús4Útreer   )rD   rG   rJ   r   Ú_build_treeU   s0   


	

ÿzTestTree._build_treec                 C   s¼   dd l }| d|j¡}tt ¡ ƒ}| |d¡}| d|¡}| dd¡}| dd¡}| dd	¡}| d
¡ d|¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}|S )Nr   z0x[0123456789abcdef]+L?z<HUB>ÚXÚepollÚselectÚdefaultÚ
test__utilÚ__main__z	 fileno=.Ú zref=-1zref=0ztype.current_treezGreenletTree.current_treezgevent.tests.__main__.MyLocalz__main__.MyLocalz	(otid=X) z dead>ú>z current active started main>)ÚreÚcompileÚIÚreprr%   rV   ÚreplaceÚsub)r   r    rl   ÚhexobjÚhub_reprr   r   r   Ú_normalize_tree_formatŠ   s    zTestTree._normalize_tree_formatc                 C   st   t  ¡  ¡  |  ¡ \}}}W d   ƒ n1 sw   Y  |  |j¡ |  d|¡ |  |¡}d ¡ }|  	||¡ d S )NÚParenta(  <greenlet.greenlet object at X>
 :    Parent: None
 :    Greenlet Locals:
 :      Local <class '__main__.MyLocal'> at X
 :        {'foo': 42}
 +--- <HUB>
 :          Parent: <greenlet.greenlet object at X>
 +--- <Greenlet "Greenlet-1" at X: t2>; finished with value <Greenlet "CustomName-0" at 0x
 :          Parent: <HUB>
 |    +--- <Greenlet "CustomName-0" at X: t1>; finished with exception ExpectedException()
 :                Parent: <HUB>
 +--- <Greenlet "Greenlet-2" at X: t2>; finished with value <Greenlet "CustomName-4" at 0x
 :          Parent: <HUB>
 |    +--- <Greenlet "CustomName-4" at X: t1>; finished with exception ExpectedException()
 :                Parent: <HUB>
 +--- <Greenlet "Greenlet-3" at X: t3>; finished with value <Greenlet "Greenlet-5" at X
 :          Parent: <HUB>
 :          Spawn Tree Locals
 :          {'stl': 'STL'}
 |    +--- <Greenlet "Greenlet-5" at X: t2>; finished with value <Greenlet "CustomName-6" at 0x
 :                Parent: <HUB>
 |         +--- <Greenlet "CustomName-6" at X: t1>; finished with exception ExpectedException()
 :                      Parent: <HUB>
 +--- <Greenlet "Greenlet-7" at X: <bound method GreenletTree.current_tree of <class 'gevent.util.GreenletTree'>>>; finished with value <gevent.util.GreenletTree obje
            Parent: <HUB>
        )
r%   rV   Úignoring_expected_test_errorrc   Ú
assertTruer.   r   rt   ÚstripÚassertEqual)r   rb   Ústr_treeÚtree_formatr    Úexpectedr   r   r   Ú	test_treeŸ   s   ÿ
æzTestTree.test_treec                 C   sB   dt j_t  ¡  ¡  |  ¡  W d   ƒ d S 1 sw   Y  d S )NF)r%   r8   r9   rV   rv   rc   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 r5   )r   rZ   r[   ÚparentÚgreenlet_tree_is_ignoredÚgreenlet_tree_is_rootÚswitch)Úc©ÚRawGreenletr   r   Út4Ð   s   z,TestTree.test_forest_fake_parent.<locals>.t4FrN   rQ   zc<greenlet.greenlet object at X>; not running
 :    Parent: <greenlet.greenlet object at X>
        )r   rƒ   r\   rt   rx   ry   )r   r‡   r-   rb   r{   r    r|   r   r…   r   Útest_forest_fake_parentÌ   s   	
ÿ
ýz TestTree.test_forest_fake_parent)r   r   r   r7   r>   rc   rt   rE   Úignores_leakcheckr}   r~   rˆ   Ú__classcell__r   r   r<   r   r4   H   s    5
&
r4   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   ƒ n1 s w   Y  W d   ƒ n1 s/w   Y  t|jƒ}|  d|¡ |  tj¡! t d¡ |dƒ W d   ƒ n1 sZw   Y  W d   ƒ n1 siw   Y  |  tj¡#}tjddd |dƒ W d   ƒ n1 s‹w   Y  W d   ƒ n1 sšw   Y  t|jƒ}|  d|¡ |  d	|¡ tjd
dd |dƒ W d   ƒ d S 1 sÇw   Y  d S )Nr   )Úsleepgü©ñÒMbP?zTo any greenlet ingš™™™™™¹?T)Úhub_onlyzTo the hub inz(max allowed 0.0010 seconds)g      ð?F)	ÚtimerŒ   ÚassertRaisesr   Ú_FailedToSwitchÚassert_switchesrA   Ú	exceptionr   )r   rŒ   ÚexcÚmessager   r   r   Útest_time_sleepê   s6   

ÿ€ÿ

ÿ€ÿ
ÿ€ÿ

"ÿz"TestAssertSwitches.test_time_sleepc              	   C   sˆ   |   tj¡ t ¡  W d   ƒ n1 sw   Y  W d   ƒ n1 s%w   Y  tjddd	 W d   ƒ d S 1 s=w   Y  d S )Nr"   F)Úmax_blocking_timer   )r   r   r   r‘   r;   r   r   r   Útest_no_switches_no_function  s   
ÿ€ÿ"ÿz/TestAssertSwitches.test_no_switches_no_functionc              	   C   sP   |   t¡ t ¡  tƒ ‚1 sw   Y  W d   ƒ d S 1 s!w   Y  d S r   )r   Ú	NameErrorr   r‘   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 ¡ 1}|  |ƒ |j¡ |  |jj|j¡ | d| | f¡ |  	| |jj¡ |  	| |jj¡ W d   ƒ n1 sRw   Y  |  |ƒ |j¡ W d   ƒ d S 1 sjw   Y  d S )Nr   )Úgettracerƒ   )
r   rš   r   r‘   ry   ÚtracerÚassertIsNotNoneÚactive_greenletÚprevious_trace_functionÚassertIs)r   rš   ÚouterÚinnerr   r   r   Útest_nested  s   

ù	"ózTestAssertSwitches.test_nestedN)r   r   r   r•   r—   r™   r¢   r   r   r   r   r‹   è   s
    %
r‹   c                   @   r	   )Ú	TestFuncsc                    sR   dd l ‰dd l}g ‰ ‡ ‡fdd„}|j|d}| ¡  | d¡ |  ˆ dg¡ d S )Nr   c                      s   t  ˆ ¡ ¡ ˆ  d¡ d S )Nr"   )r   Úclear_stack_framesÚcurrentframerY   r   ©Ú	completedÚinspectr   r   Údo_it7  s   z0TestFuncs.test_clear_stack_frames.<locals>.do_it)Útargeté
   r"   )r¨   Ú	threadingÚThreadÚstartr   ry   )r   r¬   r©   Útr   r¦   r   Útest_clear_stack_frames3  s   
z!TestFuncs.test_clear_stack_framesN)r   r   r   r°   r   r   r   r   r£   1  r   r£   ri   )Ú
__future__r   r   r   rT   ÚunittestÚgevent.testingÚtestingrE   r%   r   r   r   r   Úgevent._compatr   r
   Ú
skipOnPyPyÚTestCaser   r4   r‹   r£   r   Úmainr   r   r   r   Ú<module>   s,   -  Iÿ