o
    Šåg:   ã                   @   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o$e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 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   úW/var/www/html/flaskapp/venv/lib/python3.10/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   ó   t  | ¡| _| jS r   )ÚgreenletÚsettraceÚoldtracer   ©r   r   r   r   Ú	__enter__   ó   zGreenletTracer.__enter__c                 G   ó   t  | j¡ d S r   )r   r   r   r   r   r   r   Ú__exit__"   ó   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/w   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-   ó   z:TestGreenletTracing.test_a_greenlet_tracing.<locals>.dummyc                   S   s   t ƒ ‚r   )r   r   r   r   r   Údummyexc/   ó   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 s2w   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   r0   r   Ú!test_b_exception_disables_tracing?   s   
þ

ÿz5TestGreenletTracing.test_b_exception_disables_tracingc                 C   s:   t ƒ }|� t |¡ W d   ƒ d S 1 sw   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/   r3   r5   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   r   r   )ÚsysÚ
setprofiler   r   r   r   r   r   r   a   r   zPythonTracer.__enter__c                 G   r   r   )r=   r>   r   r   r   r   r   r   e   r    zPythonTracer.__exit__r!   r   r   r   r   r7   W   s    r7   c                   C   s   dS ©Né*   r   r   r   r   r   Útpt_callbackh   r$   rA   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w   Y  |  |g d¢¡ d S )N)©Úreturnr   ©ÚcallrA   ©rD   rA   ©rF   r   ©Úc_callr   )r7   rA   r+   )r   r   r   r   r   Útest_trace_events_trivialu   s   ÿ
z+TestPythonTracing.test_trace_events_trivialc                 C   s4   t ƒ �}| ¡  W d   ƒ |S 1 sw   Y  |S r   )r7   r'   ©r   Úgletr   r   r   r   Ú_trace_switchˆ   s   

ÿþzTestPythonTracing._trace_switchc                 C   s   |   |¡}|  |g d¢¡ d S )N)	rC   )rJ   rN   )rF   ÚrunrE   rG   ©rD   rO   )Úc_returnrN   rH   rI   )rN   r+   rL   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   ó   t ƒ S r   ©rA   r   r   r   r   rO   œ   r&   zOTestPythonTracing.test_trace_events_into_greenlet_func_already_set.<locals>.run)rR   r   ©r   rO   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   rS   r   rT   r   r   r   r   rO   £   r&   zUTestPythonTracing.test_trace_events_into_greenlet_subclass_already_set.<locals>.X.runN©r   r	   r
   rO   r   r   r   r   ÚX¢   s    rX   )r   rR   ©r   rX   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)rC   rE   rG   rP   rE   rG   rH   rI   )r'   rA   r   r+   r   )r   r2   r4   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                      ó   ˆ   ¡  tƒ S r   ©r   rA   r   ©r4   r   r   rO   ¹   ó   zQTestPythonTracing.test_trace_events_from_greenlet_func_sets_profiler.<locals>.run)r7   r[   r   rU   r   r^   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                    r\   r   r]   r   r^   r   r   rO   Ã   r_   zWTestPythonTracing.test_trace_events_from_greenlet_subclass_sets_profiler.<locals>.X.runNrW   r   r^   r   r   rX   Â   s    rX   )r7   r   r[   rY   r   r^   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 r?   )r   rA   r'   r   ©r.   r4   r   r   Úg1_runÐ   s
   zPTestPythonTracing.test_trace_events_multiple_greenlets_switching.<locals>.g1_runc                      s    t ƒ  ˆ ¡  t ƒ  ˆ  ¡  d S r   )rA   r   r'   r   ©r-   r4   r   r   Úg2_run×   s   zPTestPythonTracing.test_trace_events_multiple_greenlets_switching.<locals>.g2_runr@   )	rC   rE   rG   ©rJ   rc   )rF   re   rE   rG   rH   rI   ©r7   r   r'   r+   rA   r   ©r   rc   re   Úxr   ©r-   r.   r4   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 r?   )r   r)   Úparentr'   r   rA   r   rb   r   r   rc   ø   s   zYTestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings.<locals>.g1_runc                      s.   t  ¡ j ¡  tƒ  ˆ ¡  tƒ  ˆ  ¡  d S r   )r   r)   rl   r'   rA   r   r   rd   r   r   re      s
   zYTestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings.<locals>.g2_runr@   )rC   rE   rG   rf   rE   rG   rH   rI   rg   rh   r   rj   r   Ú7test_trace_events_multiple_greenlets_switching_siblingsï   s   

zITestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings)r   r	   r
   r6   ÚmaxDiffrK   rN   rR   rV   rZ   r[   r`   ra   ÚunittestÚskipIfÚDEBUG_BUILD_PY312rk   rm   r   r   r   r   rB   k   s    		
%rB   Ú__main__)Ú
__future__r   r=   r   ro   Ú r   r   Úhasattrrq   Ú	Exceptionr   Úobjectr   r"   r7   rA   rB   r   r,   r   r   r   r   Ú<module>   s&    þ1 8ÿ