a
    Ò�éi>#  ã                   @   s  d Z 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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¡ZG dd„ deƒZG dd„ dedejfi ƒƒZdS )z
Tests for greenlet.

é    )Úabsolute_import)Údivision)Úprint_functionN)Úcollect)Úget_objects)Úactive_count)Úsleep)Útime)Úgreenlet)Ú
getcurrent)Úget_pending_cleanup_count)Úget_total_main_greenletsé   )Ú	leakchecké   )é   é   Úwinc                   @   s   e Zd Zdd„ ZdS )ÚTestCaseMetaClassc                 C   s\   d}t | ¡ ƒD ]:\}}| d¡rt|ƒr| |¡ |rBt |¡}|||< qt | |||¡S )NTÚtest)	ÚlistÚitemsÚ
startswithÚcallableÚpopr   Zwrap_refcountÚtypeÚ__new__)ÚclsÚ	classnameÚbasesÚ	classDictZcheck_totalrefcountÚkeyÚvalue© r#   úG/home/Claro/venv/lib/python3.9/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ƒ sNtƒ |ksN| jsŒt	ƒ |krŒt|ƒ tƒ |kr.t
dƒ t
d|dtƒ ƒ t
d|dt	ƒ ƒ qŒq.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   )ÚselfZinitial_active_threadsZinitial_main_greenletsZ
sleep_timeZ
quit_afterr#   r#   r$   Úwait_for_pending_cleanups>   s0    


ÿþýü
ÿÿz"TestCase.wait_for_pending_cleanupsTc                    sH   t dƒD ]
}tƒ  q|r0t‡ 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>f   s   þz)TestCase.count_objects.<locals>.<genexpr>c                 3   s   | ]}t |ˆ ƒrd V  qdS r2   )Ú
isinstancer3   r6   r#   r$   r8   l   s   
þ)Úranger   Úsumr   )r0   r7   Z
exact_kindÚ_r#   r6   r$   Úcount_objects`   s    þþzTestCase.count_objectsr   Fc                 C   s   |   td¡S )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)r=   ÚRawGreenlet©r0   r#   r#   r$   Úcount_greenletsw   s    zTestCase.count_greenletsc                    s>   t ƒ  ¡  tƒ  tƒ | _tƒ | _|  | j| j¡ |  ¡ | _	d S )N)
ÚsuperÚsetUpr   r-   r)   r   r*   r1   r@   Úgreenlets_before_testr?   ©Ú	__class__r#   r$   rB   }   s    
zTestCase.setUpc                    s.   t | ddƒrd S |  | j| j¡ tƒ  ¡  d S )NZskipTearDownF)Úgetattrr1   r)   r*   rA   ÚtearDownr?   rD   r#   r$   rG   ‡   s    zTestCase.tearDownc                 C   s$   dd l }ts|j |j fnd}|S )Nr   )r   l   	   l       )ÚsignalÚWINÚSIGABRTÚSIGSEGV)r0   rH   Zexpected_exitr#   r#   r$   Ú,get_expected_returncodes_for_aborted_processŽ   s    %ùúùz5TestCase.get_expected_returncodes_for_aborted_processc              
   C   sF   zt  ¡  ¡ jW S  ty@ } zt d¡|‚W Y d}~n
d}~0 0 dS )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ÚProcessZmemory_full_infoZussÚAttributeErrorÚunittestZSkipTest)r0   Úer#   r#   r$   Úget_process_uss»   s    zTestCase.get_process_ussc              
   C   sž   dd l }dd l}|j |j t¡|¡}z|jtj|gd|j	d�W S  |j
y˜ } z>|r‚tdƒ td|ƒ tdƒ t|jƒ tdƒ ‚ W Y d }~n
d }~0 0 d S )Nr   zutf-8)ÚencodingÚstderrz-----zFailed to run scriptz~~~~~z------)Ú
subprocessÚosÚpathÚjoinÚdirnameÚ__file__Úcheck_outputÚsysÚ
executableÚSTDOUTÚCalledProcessErrorr/   Úoutput)r0   Úscript_nameÚshow_outputrU   rV   Ú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<0    Y  |d u rV|  ¡ }|  |jj|¡ |jS )Nr   F)rb   )rU   ÚassertRaisesr_   re   rL   ZassertInÚ	exceptionÚ
returncode)r0   ra   Z	exitcodesrU   Úexcr`   Z__traceback_info__r#   r#   r$   ÚassertScriptRaisesâ   s    "zTestCase.assertScriptRaises)NN)T)N)r%   r&   r'   r+   r,   r1   r   r=   rC   r)   r*   r.   r@   rB   rG   rL   rR   re   rj   Ú__classcell__r#   r#   rD   r$   r(   6   s"     þ
"
-
r(   ZNewBase) Ú__doc__Ú
__future__r   r   r   r\   rP   Úgcr   r   Ú	threadingr   r-   r	   r   rM   r
   r>   r   Zgreenlet._greenletr   r   Ú r   Úversion_infoZPY312Úplatformr   rI   r   r   r(   r#   r#   r#   r$   Ú<module>   s0   ý