
    g$              	       \   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j0                  j3                  d      Zej6                  j9                  d      Zej6                  j9                  d      xs eZej6                  j9                  d      Zexs eZ ej6                  j9                  d      Z! G d de"      Z# G d d e#dejH                  fi             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      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          V/var/www/html/AdoubleTech/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rB   )
isinstancerC   s     r*   rG   z)TestCase.count_objects.<locals>.<genexpr>p   s#      
!T" 
s   )ranger   sumr   )r:   rF   
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)rN   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	   r7   r3   r   r4   r?   rQ   greenlets_before_testr:   	__class__s    r*   rU   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?   r3   r4   rT   tearDownrW   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CalledProcessErrorr9   output)r:   script_nameshow_outputrq   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~   )rq   assertRaisesr{   r   rc   assertIn	exception
returncode)r:   r}   	exitcodesrq   excr|   __traceback_info__s          r*   assertScriptRaiseszTestCase.assertScriptRaises   s    z<<= 	(__[e_DF!'	( IIKIcmm..	:}}	( 	(s   BB)NN)TrS   )r,   r-   r.   r5   r6   r?   r   rN   rV   r3   r4   r8   rQ   rU   r\   rc   rm   r   r   __classcell__)rX   s   @r*   r1   r1   :   sj    
 &+" ! :>9= D "&$ 
$ !" 6<+Z@"*r+   r1   NewBase)%__doc__rr   rx   rj   gcr   r   	threadingr   r7   r   r   re   r   rP   r	   greenlet._greenletr
   r    r   version_infoPY312PY313platformr   r_   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXr!   r   r1   r/   r+   r*   <module>r      s	   
 
    9    ,  8 7 !'!'	lle$JJNN+;< JJNN8,I0I jjnnZ0 !8%8zz~~&:; > >,v 			
 vr+   