
    gZ'f>#              	       h   d Z ddlmZ ddlmZ ddlm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j0                  dd dk\  Zej4                  j7                  d      Z G d de      Z G d d edej>                  fi             Zy)z
Tests for greenlet.

    )absolute_import)division)print_functionN)collect)get_objects)active_count)sleep)time)greenlet)
getcurrent)get_pending_cleanup_count)get_total_main_greenlets   )	leakcheck   )      winc                       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          f/var/www/html/tulostaulu.pesapallolive.fi/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_cleanups>   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>f   s$      7d? s   c              3   :   K   | ]  }t        |      rd   ywr@   )
isinstancerA   s     r(   rE   z)TestCase.count_objects.<locals>.<genexpr>l   s#      
!T" 
s   )ranger   sumr   )r8   rD   
exact_kind_s    `  r(   count_objectszTestCase.count_objects`   sZ     q 	AI	 $    
 ]
 
 	
r)   r   Fc                 .    | j                  t        d      S )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)rL   RawGreenlet)r8   s    r(   count_greenletszTestCase.count_greenletsw   s     !!+u55r)   c                     t         |           t                t               | _        t               | _        | j                  | j                  | j                         | j                         | _	        y N)
supersetUpr   r5   r1   r   r2   r=   rO   greenlets_before_testr8   	__class__s    r(   rS   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=   r1   r2   rR   tearDownrU   s    r(   rZ   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)r8   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)r8   es     r(   get_process_usszTestCase.get_process_uss   sJ    	@>>#446::: 	@##$78a?	@s   +. 	AAAc                    dd l }dd l}|j                  j                  |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CalledProcessErrorr7   output)r8   script_nameshow_outputro   rp   scriptexs          r(   
run_scriptzTestCase.run_script   s    GGOOH%

	**CNNF+C4;2<2C2C + E E ,, 	g,f5gbii h	s   -A1 1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|   )ro   assertRaisesry   r   ra   assertIn	exception
returncode)r8   r{   	exitcodesro   excrz   __traceback_info__s          r(   assertScriptRaiseszTestCase.assertScriptRaises   s    z<<= 	(__[e_DF!'	( IIKIcmm..	:}}	( 	(s   BB)NN)TrQ   )r*   r+   r,   r3   r4   r=   r   rL   rT   r1   r2   r6   rO   rS   rZ   ra   rk   r   r   __classcell__)rV   s   @r(   r/   r/   6   sj    
 &+" ! :>9= D "&$ 
$ !" 6<+Z@",r)   r/   NewBase) __doc__
__future__r   r   r   rv   rh   gcr   r   	threadingr   r5   r
   r	   rc   r   rN   r   greenlet._greenletr   r    r   version_infoPY312platformr   r]   r   r   r/   r-   r)   r(   <module>r      s    '  % 
    9    ,  8 7 !'	lle$> >,w 			
 wr)   