
    +h$                     r   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d dk\  Zej2                  j5                  d      Zej8                  j;                  d      Zej8                  j;                  d      xs eZej8                  j;                  d      Z exs e Z!ej8                  j;                  d      Z" G d de#      Z$ G d dejJ                  e$      Z%y)z
Tests for greenlet.

    N)collect)get_objects)active_count)sleep)time)greenlet)
getcurrent)get_pending_cleanup_count)get_total_main_greenlets   )	leakcheck   )      )r      )r      winGITHUB_ACTIONSTRAVISAPPVEYORGREENLET_MANYLINUXc                       e Zd Zd Zy)TestCaseMetaClassc                    d}t        |j                               D ]P  \  }}|j                  d      st        |      s$|j	                  |       |rt        j                  |      }|||<   R t        j                  | |||      S )NTtest)	listitems
startswithcallablepopr   wrap_refcounttype__new__)cls	classnamebases	classDictcheck_totalrefcountkeyvalues          J/var/www/html/venv/lib/python3.12/site-packages/greenlet/tests/__init__.pyr#   zTestCaseMetaClass.__new__*   s|    
 #
 y01 	'JC~~f%(5/c"&%33E:E!&	#	' ||CE9==    N)__name__
__module____qualname__r#    r,   r+   r   r   '   s    >r,   r   c                   z     e Zd ZdZdZ	 	 ddZedfdZdZdZ	dZ
dZd Z fd	Z fd
Zd Zd ZddZddZ xZS )TestCasegMbP?r   c                 0   |xs | j                   }|xs | j                  }| j                  }t        |       t	               | j
                  z   }t               s&t               |kD  s| j                  st               |kD  rt        |       t	               |kD  rCt        d       t        d|dt                      t        d|dt                      	 t                y t               rft               |kD  rt| j                  st               |kD  rt                y )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_afters        r+   wait_for_pending_cleanupsz"TestCase.wait_for_pending_cleanupsB   s     "8!S4;S;S!7!Z4;Z;Z88
 	jVd<<<
 *+&(+AA11025KK*v
",-13I02413I579	 *+&(+AA11025KK 		r,   Tc                     t        d      D ]  }t                 |rt        fdt               D              S t        fdt               D              S )Nr   c              3   <   K   | ]  }t        |      u rd   ywr   N)r"   .0xkinds     r+   	<genexpr>z)TestCase.count_objects.<locals>.<genexpr>j   s$      7d? s   c              3   :   K   | ]  }t        |      rd   ywrC   )
isinstancerD   s     r+   rH   z)TestCase.count_objects.<locals>.<genexpr>p   s#      
!T" 
s   )ranger   sumr   )r;   rG   
exact_kind_s    `  r+   count_objectszTestCase.count_objectsd   sZ     q 	AI	 $    
 ]
 
 	
r,   r   Fc                 .    | j                  t        d      S )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)rO   RawGreenlet)r;   s    r+   count_greenletszTestCase.count_greenlets{   s     !!+u55r,   c                     t         |           t                t               | _        t               | _        | j                  | j                  | j                         | j                         | _	        y N)
supersetUpr	   r8   r4   r   r5   r@   rR   greenlets_before_testr;   	__class__s    r+   rV   zTestCase.setUp   sV     	#6#8 *B*D'&&t'?'?A`A`a%)%9%9%;"r,   c                     t        | dd      ry | j                  | j                  | j                         t        |           y )NskipTearDownF)getattrr@   r4   r5   rU   tearDownrX   s    r+   r]   zTestCase.tearDown   s9    4/&&t'?'?A`A`ar,   c                 V    dd l }t        s|j                   |j                   f}|S d}|S )Nr   )r   l   	   l       )signalWINSIGABRTSIGSEGV)r;   r_   expected_exits      r+   ,get_expected_returncodes_for_aborted_processz5TestCase.get_expected_returncodes_for_aborted_process   sB    J  ^^O
 ^^O
 
 	 r,   c                     	 t        j                         j                         j                  S # t        $ r}t        j                  d      |d}~ww xY 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)r;   es     r+   get_process_usszTestCase.get_process_uss   sJ    	@>>#446::: 	@##$78a?	@s   +. 	AAAc                    dd l }t        j                  j                  t        j                  j	                  t
              |      }	 |j                  t        j                  |gd|j                        S # |j                  $ rJ}|rBt        d       t        d|       t        d       t        |j                         t        d        d }~ww xY w)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exs         r+   
run_scriptzTestCase.run_script   s    GGOOH%

	**CNNF+C4;2<2C2C + E E ,, 	g,f5gbii h	s   -A5 5CAC		Cc                    dd l }| j                  |j                        5 }| j                  |d      }|}d d d        || j	                         }| j                  j                  j                  |       |j                  S # 1 sw Y   MxY w)Nr   F)r   )rr   assertRaisesr|   r   rd   assertIn	exception
returncode)r;   r~   	exitcodesrr   excr}   __traceback_info__s          r+   assertScriptRaiseszTestCase.assertScriptRaises   s    z<<= 	(__[e_DF!'	( IIKIcmm..	:}}	( 	(s   BB)NN)TrT   )r-   r.   r/   r6   r7   r@   r   rO   rW   r4   r5   r9   rR   rV   r]   rd   rn   r   r   __classcell__)rY   s   @r+   r2   r2   =   sh    %*" ! :>9= D "&$ 
$ !" 6<+Z@"*r,   r2   )	metaclass)&__doc__rs   ry   rk   gcr   r   	threadingr   r8   r   r   rf   r   rQ   r	   greenlet._greenletr
   r    r   version_infoPY312PY313PY314platformr   r`   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXr"   r   r2   r0   r,   r+   <module>r      s   
 
    9    ,  8 7 !'!' 	!'	lle$JJNN+;< JJNN8,I0I jjnnZ0 !8%8zz~~&:; > >,sx  ,= sr,   