a
    [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peZejdZepe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      winZGITHUB_ACTIONSZTRAVISZAPPVEYORZGREENLET_MANYLINUXc                   @   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basesZ	classDictZcheck_totalrefcountkeyvalue r    e/var/www/html/cobodadashboardai.evdpl.com/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 )TestCasegMbP?r   Nc                 C   s   |p| j }|p| j}| j}t| t | j }t sNt |ksN| jst	 |krt| t |kr.t
d t
d|dt  t
d|dt	  qq.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_cleanupsB   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>j   s   z)TestCase.count_objects.<locals>.<genexpr>c                 3   s   | ]}t | rd V  qdS r/   )
isinstancer0   r3   r    r!   r5   p   s   
)ranger   sumr   )r-   r4   Z
exact_kind_r    r3   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)r:   RawGreenletr-   r    r    r!   count_greenlets{   s    zTestCase.count_greenletsc                    s>   t    t  t | _t | _| | j| j |  | _	d S )N)
supersetUpr   r*   r&   r
   r'   r.   r=   greenlets_before_testr<   	__class__r    r!   r?      s    
zTestCase.setUpc                    s.   t | ddrd S | | j| j t   d S )NZskipTearDownF)getattrr.   r&   r'   r>   tearDownr<   rA   r    r!   rD      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)r-   rE   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)r-   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
y } z>|rzt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)r-   script_nameshow_outputrR   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)r_   )rR   assertRaisesr\   rb   rI   ZassertIn	exception
returncode)r-   r^   Z	exitcodesrR   excr]   Z__traceback_info__r    r    r!   assertScriptRaises   s    "zTestCase.assertScriptRaises)NN)T)N)r"   r#   r$   r(   r)   r.   r   r:   r@   r&   r'   r+   r=   r?   rD   rI   rO   rb   rg   __classcell__r    r    rA   r!   r%   :   s"     
"
-
r%   ZNewBase)%__doc__rS   rY   rM   gcr   r   	threadingr   r*   r   r   rJ   r   r;   r   Zgreenlet._greenletr	   r
    r   version_infoZPY312ZPY313platformr   rF   environgetZRUNNING_ON_GITHUB_ACTIONSZRUNNING_ON_TRAVISZRUNNING_ON_APPVEYORZRUNNING_ON_CIZRUNNING_ON_MANYLINUXr   r   r%   r    r    r    r!   <module>   s8   