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'   Q/var/www/html/api-tag/env/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 )TestCasegMbP?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:   
