U
    f>#                     @   s  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jdd dk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.

    )absolute_import)division)print_functionN)collect)get_objects)active_count)sleep)time)greenlet)
getcurrent)get_pending_cleanup_count)get_total_main_greenlets   )	leakcheck   )      winc                   @   s   e Zd Zdd ZdS )TestCaseMetaClassc                 C   s\   d}t | D ]:\}}|drt|r|| |rBt|}|||< qt| |||S )NTtest)	listitems
startswithcallablepopr   Zwrap_refcounttype__new__)cls	classnamebases	classDictZcheck_totalrefcountkeyvalue r#   e/home/www/findmeahotel.co.uk/times_travel/venv/lib/python3.8/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 sNt |ksN| jst	 |krt| t |kr.t
d t
d|dt  t
d|dt	  qq.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   )selfZinitial_active_threadsZinitial_main_greenletsZ
sleep_timeZ
quit_afterr#   r#   r$   wait_for_pending_cleanups>   s4    



  z"TestCase.wait_for_pending_cleanupsTc                    sH   t dD ]
}t  q|r0t fddt D S t fddt D S )Nr   c                 3   s   | ]}t | krd V  qdS r   N)r   .0xkindr#   r$   	<genexpr>f   s   z)TestCase.count_objects.<locals>.<genexpr>c                 3   s   | ]}t | rd V  qdS r2   )
isinstancer3   r6   r#   r$   r8   l   s   
)ranger   sumr   )r0   r7   Z
exact_kind_r#   r6   r$   count_objects`   s    zTestCase.count_objectsr   Fc                 C   s   |  tdS )zJ
        Find all the greenlets and subclasses tracked by the GC.
        F)r=   RawGreenletr0   r#   r#   r$   count_greenletsw   s    zTestCase.count_greenletsc                    s>   t    t  t | _t | _| | j| j |  | _	d S )N)
supersetUpr   r-   r)   r   r*   r1   r@   greenlets_before_testr?   	__class__r#   r$   rB   }   s    
zTestCase.setUpc                    s.   t | ddrd S | | j| j t   d S )NZskipTearDownF)getattrr1   r)   r*   rA   tearDownr?   rD   r#   r$   rG      s    zTestCase.tearDownc                 C   s$   dd l }ts|j |j fnd}|S )Nr   )r   l   	   l       )signalWINSIGABRTSIGSEGV)r0   rH   Zexpected_exitr#   r#   r$   ,get_expected_returncodes_for_aborted_process   s    %z5TestCase.get_expected_returncodes_for_aborted_processc              
   C   sD   zt   jW S  tk
r> } ztd|W 5 d}~X Y nX dS )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ProcessZmemory_full_infoZussAttributeErrorunittestZSkipTest)r0   er#   r#   r$   get_process_uss   s    zTestCase.get_process_ussc              
   C   s   dd l }dd l}|j|jt|}z|jtj|gd|j	dW S  |j
k
r } z6|rtd td| td t|j td  W 5 d }~X Y nX d S )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)r0   script_nameshow_outputrU   rV   scriptexr#   r#   r$   
run_script   s&    


zTestCase.run_scriptc              	   C   sX   dd l }| |j}| j|dd}|}W 5 Q R X |d krB|  }| |jj| |jS )Nr   F)rb   )rU   assertRaisesr_   re   rL   ZassertIn	exception
returncode)r0   ra   Z	exitcodesrU   excr`   Z__traceback_info__r#   r#   r$   assertScriptRaises   s    zTestCase.assertScriptRaises)NN)T)N)r%   r&   r'   r+   r,   r1   r   r=   rC   r)   r*   r.   r@   rB   rG   rL   rR   re   rj   __classcell__r#   r#   rD   r$   r(   6   s"     
"
-
r(   ZNewBase) __doc__
__future__r   r   r   r\   rP   gcr   r   	threadingr   r-   r	   r   rM   r
   r>   r   Zgreenlet._greenletr   r    r   version_infoZPY312platformr   rI   r   r   r(   r#   r#   r#   r$   <module>   s0   