
    h&                        d Z ddl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j4                  j7                  d      Zej:                  j=                  d      Zej:                  j=                  d      xs eZ ej:                  j=                  d      Z!e xs e!Z"ej:                  j=                  d      Z# e$ ejJ                  d            Z& G d de'      Z( G d dejR                  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_MANYLINUXPy_GIL_DISABLEDc                       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          U/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/greenlet/tests/__init__.pyr$   zTestCaseMetaClass.__new__2   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_cleanupsJ   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>r   s$      7d? s   c              3   :   K   | ]  }t        |      rd   ywrD   )
isinstancerE   s     r,   rI   z)TestCase.count_objects.<locals>.<genexpr>x   s#      
!T" 
s   )ranger   sumr   )r<   rH   
exact_kind_s    `  r,   count_objectszTestCase.count_objectsl   sZ     q 	AI	 $    
 ]
 
 	
r-   r   Fc                 .    | j                  t        d      S )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)rP   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	   r9   r5   r   r6   rA   rS   greenlets_before_testr<   	__class__s    r,   rW   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)getattrrA   r5   r6   rV   tearDownrY   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_outputrs   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   )rs   assertRaisesr}   r   re   assertIn	exception
returncode)r<   r   	exitcodesrs   excr~   __traceback_info__s          r,   assertScriptRaiseszTestCase.assertScriptRaises   s    z<<= 	(__[e_DF!'	( IIKIcmm..	:}}	( 	(s   BB)NN)TrU   )r.   r/   r0   r7   r8   rA   r   rP   rX   r5   r6   r:   rS   rW   r^   re   ro   r   r   __classcell__)rZ   s   @r,   r3   r3   E   sh    %*" ! :>9= D "&$ 
$ !" 6<+Z@"*r-   r3   )	metaclass)*__doc__rt   rz   	sysconfigrl   gcr   r   	threadingr   r9   r   r   rg   r   rR   r	   greenlet._greenletr
   r    r   version_infoPY312PY313PY314platformr   ra   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXboolget_config_varRUNNING_ON_FREETHREAD_BUILDr#   r   r3   r1   r-   r,   <module>r      s2   
 
     9    ,  8 7 !'!' 	!'	lle$JJNN+;< JJNN8,I0I jjnnZ0 !8%8zz~~&:;  ##;9#;#;<M#NO > >,sx  ,= sr-   