o
    Šåg$  ã                   @   s8  d Z ddl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
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 ejdd… dkZejdd… dkZej d¡Zej d¡Zej d¡pseZej d¡Zep}eZ ej d¡Z!G dd„ de"ƒZ#G dd„ de#dej$fi ƒƒZ$dS )z
Tests for greenlet.

é    N)Úcollect)Úget_objects)Úactive_count)Úsleep)Útime)Úgreenlet)Ú
getcurrent)Úget_pending_cleanup_count)Úget_total_main_greenletsé   )Ú	leakchecké   )é   é   )r   é   ÚwinÚGITHUB_ACTIONSÚTRAVISÚAPPVEYORÚGREENLET_MANYLINUXc                   @   s   e Zd Zdd„ ZdS )ÚTestCaseMetaClassc                 C   s\   d}t | ¡ ƒD ]\}}| d¡r%t|ƒr%| |¡ |r!t |¡}|||< qt | |||¡S )NTÚtest)	ÚlistÚitemsÚ
startswithÚcallableÚpopr   Úwrap_refcountÚtypeÚ__new__)ÚclsÚ	classnameÚbasesÚ	classDictÚcheck_totalrefcountÚkeyÚvalue© r'   úS/var/www/html/flaskapp/venv/lib/python3.10/site-packages/greenlet/tests/__init__.pyr   '   s   

€zTestCaseMetaClass.__new__N)Ú__name__Ú
__module__Ú__qualname__r   r'   r'   r'   r(   r   $   s    r   c                       sˆ   e Zd ZdZdZ		ddd„Zedfdd„Zd	Zd	Z	d	Z
d
Zdd„ Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zddd„Zddd„Z‡  ZS )ÚTestCasegü©ñÒMbP?r   Nc                 C   s´   |p| j }|p	| j}| j}t|ƒ tƒ | j }tƒ s'tƒ |ks'| jsUt	ƒ |krUt|ƒ tƒ |krEt
dƒ t
d|dtƒ ƒ t
d|dt	ƒ ƒ ntƒ s'tƒ |ks'| jsUt	ƒ |ks'tƒ  d S )NzTime limit exceeded.zThreads: Waiting for onlyz-->zMGlets : Waiting for only)Úthreads_before_testÚmain_greenlets_before_testÚcleanup_attempt_sleep_durationr   r   Úcleanup_max_sleep_secondsr	   Úactive_thread_countÚexpect_greenlet_leakr
   Úprintr   )ÚselfÚinitial_active_threadsÚinitial_main_greenletsÚ
sleep_timeÚ
quit_afterr'   r'   r(   Úwait_for_pending_cleanupsB   s8   


ÿ
ÿ

ÿÿõÿ
ÿ

	z"TestCase.wait_for_pending_cleanupsTc                    sH   t dƒD ]}tƒ  q|rt‡ fdd„tƒ D ƒƒS t‡ fdd„tƒ D ƒƒS )Nr   c                 3   s    � | ]}t |ƒˆ u rd V  qdS ©r   N)r   ©Ú.0Úx©Úkindr'   r(   Ú	<genexpr>j   s   € þýz)TestCase.count_objects.<locals>.<genexpr>c                 3   s   � | ]
}t |ˆ ƒrd V  qdS r:   )Ú
isinstancer;   r>   r'   r(   r@   p   s   € ý
ÿ)Úranger   Úsumr   )r4   r?   Ú
exact_kindÚ_r'   r>   r(   Úcount_objectsd   s   þþzTestCase.count_objectsr   Fc                 C   s   |   td¡S )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)rF   ÚRawGreenlet©r4   r'   r'   r(   Úcount_greenlets{   s   zTestCase.count_greenletsc                    s>   t ƒ  ¡  tƒ  tƒ | _tƒ | _|  | j| j¡ |  ¡ | _	d S ©N)
ÚsuperÚsetUpr   r1   r-   r
   r.   r9   rI   Úgreenlets_before_testrH   ©Ú	__class__r'   r(   rL   �   s   
zTestCase.setUpc                    s.   t | ddƒrd S |  | j| j¡ tƒ  ¡  d S )NÚskipTearDownF)Úgetattrr9   r-   r.   rK   ÚtearDownrH   rN   r'   r(   rR   ‹   s   zTestCase.tearDownc                 C   s(   dd l }ts|j |j f}|S d}|S )Nr   )r   l   	   l       )ÚsignalÚWINÚSIGABRTÚSIGSEGV)r4   rS   Úexpected_exitr'   r'   r(   Ú,get_expected_returncodes_for_aborted_process’   s   %ùúûùz5TestCase.get_expected_returncodes_for_aborted_processc              
   C   s6   zt  ¡  ¡ jW S  ty } zt d¡|‚d}~ww )aˆ  
        Return the current process's USS in bytes.

        uss is available on Linux, macOS, Windows. Also known as
        "Unique Set Size", this is the memory which is unique to a
        process and which would be freed if the process was terminated
        right now.

        If this is not supported by ``psutil``, this raises the
        :exc:`unittest.SkipTest` exception.
        zuss not supportedN)ÚpsutilÚProcessÚmemory_full_infoÚussÚAttributeErrorÚunittestÚSkipTest)r4   Úer'   r'   r(   Úget_process_uss¿   s   €ÿzTestCase.get_process_ussc              
   C   s†   dd l }tj tj t¡|¡}z|jtj|gd|j	d�W S  |j
yB } z|r=tdƒ td|ƒ tdƒ t|jƒ tdƒ ‚ d }~ww )Nr   zutf-8)ÚencodingÚstderrz-----zFailed to run scriptz~~~~~z------)Ú
subprocessÚosÚpathÚjoinÚdirnameÚ__file__Úcheck_outputÚsysÚ
executableÚSTDOUTÚCalledProcessErrorr3   Úoutput)r4   Úscript_nameÚshow_outputrd   ÚscriptÚexr'   r'   r(   Ú
run_scriptÐ   s(   
þþ

€ùzTestCase.run_scriptc                 C   sl   dd l }|  |j¡�}| j|dd�}|}W d   ƒ n1 sw   Y  |d u r+|  ¡ }|  |jj|¡ |jS )Nr   F)rq   )rd   ÚassertRaisesrn   rt   rX   ÚassertInÚ	exceptionÚ
returncode)r4   rp   Ú	exitcodesrd   Úexcro   Ú__traceback_info__r'   r'   r(   ÚassertScriptRaiseså   s   þzTestCase.assertScriptRaises)NN)TrJ   )r)   r*   r+   r/   r0   r9   r   rF   rM   r-   r.   r2   rI   rL   rR   rX   ra   rt   r|   Ú__classcell__r'   r'   rN   r(   r,   :   s$    
þ"
-
r,   ÚNewBase)%Ú__doc__re   rk   r^   Úgcr   r   Ú	threadingr   r1   r   r   rY   r   rG   r   Úgreenlet._greenletr	   r
   Ú r   Úversion_infoÚPY312ÚPY313Úplatformr   rT   ÚenvironÚgetÚRUNNING_ON_GITHUB_ACTIONSÚRUNNING_ON_TRAVISÚRUNNING_ON_APPVEYORÚRUNNING_ON_CIÚRUNNING_ON_MANYLINUXr   r   r,   r'   r'   r'   r(   Ú<module>   s:   
ý