a
    Ò�éi:   ã                   @   sº   d dl mZ d dlZd dlZd dlZddlmZ ddlmZ eoHeedƒdfZ	G dd	„ d	e
ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZG dd„ deƒZedkr¶e ¡  dS )é    )Úprint_functionNé   )ÚTestCase)ÚPY312Úgettotalrefcountz%Broken on debug builds of Python 3.12c                   @   s   e Zd ZdS )Ú	SomeErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úK/home/Claro/venv/lib/python3.9/site-packages/greenlet/tests/test_tracing.pyr      s   r   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚGreenletTracerNFc                 C   s   g | _ || _d S ©N)ÚactionsÚerror_on_trace)Úselfr   r   r   r   Ú__init__   s    zGreenletTracer.__init__c                 G   s   | j  |¡ | jrt‚d S r   )r   Úappendr   r   ©r   Úargsr   r   r   Ú__call__   s    zGreenletTracer.__call__c                 C   s   t  | ¡| _| jS r   )ÚgreenletÚsettraceÚoldtracer   ©r   r   r   r   Ú	__enter__   s    zGreenletTracer.__enter__c                 G   s   t  | j¡ d S r   )r   r   r   r   r   r   r   Ú__exit__"   s    zGreenletTracer.__exit__)F©r   r	   r
   r   r   r   r   r   r   r   r   r   r      s
   
r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestGreenletTracingz*
    Tests of ``greenlet.settrace()``
    c              	   C   s    t  ¡ }dd„ }dd„ }tƒ �:}t   |¡}| ¡  t   |¡}|  t|j¡ W d   ƒ n1 s^0    Y  |  |d||ffd||ffd||ffd||ffg¡ d S )Nc                   S   s   d S r   r   r   r   r   r   Údummy-   s    z:TestGreenletTracing.test_a_greenlet_tracing.<locals>.dummyc                   S   s
   t ƒ ‚d S r   )r   r   r   r   r   Údummyexc/   s    z=TestGreenletTracing.test_a_greenlet_tracing.<locals>.dummyexcÚswitchÚthrow)r   Ú
getcurrentr   r!   ÚassertRaisesr   ÚassertEqual)r   Úmainr   r    r   Úg1Úg2r   r   r   Útest_a_greenlet_tracing+   s    

,



üz+TestGreenletTracing.test_a_greenlet_tracingc                    sˆ   t  ¡ ‰ ‡ fdd„}t   |¡}| ¡  tdd��.}|  t|j¡ |  t  ¡ d ¡ W d   ƒ n1 sd0    Y  |  |dˆ |ffg¡ d S )Nc                      s   ˆ   ¡  d S r   )r!   r   ©r&   r   r   r   A   s    zDTestGreenletTracing.test_b_exception_disables_tracing.<locals>.dummyT)r   r!   )r   r#   r!   r   r$   r   r%   Úgettrace)r   r   Úgr   r   r*   r   Ú!test_b_exception_disables_tracing?   s    
.
ÿz5TestGreenletTracing.test_b_exception_disables_tracingc                 C   s8   t ƒ }|� t |¡ W d   ƒ n1 s*0    Y  d S r   )r   r   r   )r   Útracerr   r   r   Útest_set_same_tracer_twiceM   s    z.TestGreenletTracing.test_set_same_tracer_twiceN)r   r	   r
   Ú__doc__r)   r-   r/   r   r   r   r   r   &   s   r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ ZdS )
ÚPythonTracerNc                 C   s
   g | _ d S r   )r   r   r   r   r   r   Z   s    zPythonTracer.__init__c                 C   s   | j  ||jjf¡ d S r   )r   r   Úf_codeÚco_name)r   ÚframeÚeventÚargr   r   r   r   ]   s    zPythonTracer.__call__c                 C   s   t  | ¡| _| jS r   )ÚsysÚ
setprofiler   r   r   r   r   r   r   a   s    zPythonTracer.__enter__c                 G   s   t  | j¡ d S r   )r7   r8   r   r   r   r   r   r   e   s    zPythonTracer.__exit__r   r   r   r   r   r1   W   s
   r1   c                   C   s   dS ©Né*   r   r   r   r   r   Útpt_callbackh   s    r;   c                   @   sx   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZejeŽ dd„ ƒZejeŽ dd„ ƒZdS )ÚTestPythonTracingzŒ
    Tests of the interaction of ``sys.settrace()``
    with greenlet facilities.

    NOTE: Most of this is probably CPython specific.
    Nc                 C   s@   t ƒ �}tƒ  W d   ƒ n1 s"0    Y  |  |g d¢¡ d S )N)©Úreturnr   ©Úcallr;   ©r>   r;   ©r@   r   ©Úc_callr   )r1   r;   r%   )r   r   r   r   r   Útest_trace_events_trivialu   s    $	z+TestPythonTracing.test_trace_events_trivialc                 C   s2   t ƒ �}| ¡  W d   ƒ n1 s$0    Y  |S r   )r1   r!   ©r   Zgletr   r   r   r   Ú_trace_switchˆ   s    &zTestPythonTracing._trace_switchc                 C   s   |   |¡}|  |g d¢¡ d S )N)	r=   )rD   rG   )r@   Úrunr?   rA   ©r>   rH   )Zc_returnrG   rB   rC   )rG   r%   rF   r   r   r   Ú$_check_trace_events_func_already_set�   s    
z6TestPythonTracing._check_trace_events_func_already_setc                 C   s   dd„ }|   t |¡¡ d S )Nc                   S   s   t ƒ S r   ©r;   r   r   r   r   rH   œ   s    zOTestPythonTracing.test_trace_events_into_greenlet_func_already_set.<locals>.run)rJ   r   ©r   rH   r   r   r   Ú0test_trace_events_into_greenlet_func_already_set›   s    zBTestPythonTracing.test_trace_events_into_greenlet_func_already_setc                 C   s"   G dd„ dt j ƒ}|  |ƒ ¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zQTestPythonTracing.test_trace_events_into_greenlet_subclass_already_set.<locals>.Xc                 S   s   t ƒ S r   rK   r   r   r   r   rH   £   s    zUTestPythonTracing.test_trace_events_into_greenlet_subclass_already_set.<locals>.X.runN©r   r	   r
   rH   r   r   r   r   ÚX¢   s   rO   )r   rJ   ©r   rO   r   r   r   Ú4test_trace_events_into_greenlet_subclass_already_set¡   s    zFTestPythonTracing.test_trace_events_into_greenlet_subclass_already_setc                 C   s,   |  ¡  tƒ  | ¡  |  |jg d¢¡ d S )N)r=   r?   rA   rI   r?   rA   rB   rC   )r!   r;   r   r%   r   )r   r,   r.   r   r   r   Ú/_check_trace_events_from_greenlet_sets_profiler§   s    zATestPythonTracing._check_trace_events_from_greenlet_sets_profilerc                    s(   t ƒ ‰ ‡ fdd„}|  t |¡ˆ ¡ d S )Nc                      s   ˆ   ¡  tƒ S r   ©r   r;   r   ©r.   r   r   rH   ¹   s    zQTestPythonTracing.test_trace_events_from_greenlet_func_sets_profiler.<locals>.run)r1   rR   r   rL   r   rT   r   Ú2test_trace_events_from_greenlet_func_sets_profiler·   s
    ÿzDTestPythonTracing.test_trace_events_from_greenlet_func_sets_profilerc                    s.   t ƒ ‰ G ‡ fdd„dtjƒ}|  |ƒ ˆ ¡ d S )Nc                       s   e Zd Z‡ fdd„ZdS )zSTestPythonTracing.test_trace_events_from_greenlet_subclass_sets_profiler.<locals>.Xc                    s   ˆ   ¡  tƒ S r   rS   r   rT   r   r   rH   Ã   s    zWTestPythonTracing.test_trace_events_from_greenlet_subclass_sets_profiler.<locals>.X.runNrN   r   rT   r   r   rO   Â   s   rO   )r1   r   rR   rP   r   rT   r   Ú6test_trace_events_from_greenlet_subclass_sets_profilerÀ   s    zHTestPythonTracing.test_trace_events_from_greenlet_subclass_sets_profilerc                    sn   t ƒ ‰d ‰ d ‰‡‡fdd„}‡ ‡fdd„}t |¡‰ t |¡‰ˆ  ¡ }|  |d¡ tƒ  |  ˆjg d¢¡ d S )Nc                      s    ˆ  ¡  tƒ  ˆ  ¡  tƒ  dS r9   )r   r;   r!   r   ©r(   r.   r   r   Úg1_runÐ   s
    zPTestPythonTracing.test_trace_events_multiple_greenlets_switching.<locals>.g1_runc                      s    t ƒ  ˆ ¡  t ƒ  ˆ  ¡  d S r   )r;   r   r!   r   ©r'   r.   r   r   Úg2_run×   s    zPTestPythonTracing.test_trace_events_multiple_greenlets_switching.<locals>.g2_runr:   )	r=   r?   rA   ©rD   rX   )r@   rZ   r?   rA   rB   rC   ©r1   r   r!   r%   r;   r   ©r   rX   rZ   Úxr   ©r'   r(   r.   r   Ú.test_trace_events_multiple_greenlets_switchingÉ   s    

z@TestPythonTracing.test_trace_events_multiple_greenlets_switchingc                    s~   t ƒ ‰d ‰ d ‰‡‡fdd„}‡ ‡fdd„}t |¡‰ t |¡‰ˆ  ¡  ˆ ¡  ˆ  ¡ }|  |d¡ tƒ  |  ˆjg d¢¡ d S )Nc                      s.   t  ¡ j ¡  ˆ ¡  tƒ  ˆ  ¡  tƒ  dS r9   )r   r#   Úparentr!   r   r;   r   rW   r   r   rX   ø   s    zYTestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings.<locals>.g1_runc                      s.   t  ¡ j ¡  tƒ  ˆ ¡  tƒ  ˆ  ¡  d S r   )r   r#   ra   r!   r;   r   r   rY   r   r   rZ      s
    zYTestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings.<locals>.g2_runr:   )r=   r?   rA   r[   r?   rA   rB   rC   r\   r]   r   r_   r   Ú7test_trace_events_multiple_greenlets_switching_siblingsï   s    

zITestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings)r   r	   r
   r0   ZmaxDiffrE   rG   rJ   rM   rQ   rR   rU   rV   ÚunittestZskipIfÚDEBUG_BUILD_PY312r`   rb   r   r   r   r   r<   k   s   		
%r<   Ú__main__)Ú
__future__r   r7   r   rc   Ú r   r   Úhasattrrd   Ú	Exceptionr   Úobjectr   r   r1   r;   r<   r   r&   r   r   r   r   Ú<module>   s"   þ1 8