o
    g                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 dd Zdd ZG dd dZG d	d
 d
eZG dd deZG dd dej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edkrye  dS dS )    N)findfilerun_unittestc                 C   s   t jt| ddS )NZ
dtracedata)Zsubdir)ospathabspathr   )filename r   F/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_dtrace.pyr      s   r   c              	   C   sl   t dd| } zdd |  D }|jdd d dd |D }d	|W S  ttfy5   td
| w )aM  Normalize DTrace output for comparison.

    DTrace keeps a per-CPU buffer, and when showing the fired probes, buffers
    are concatenated. So if the operating system moves our thread around, the
    straight result can be "non-causal". So we add timestamps to the probe
    firing, sort by that field, then strip it from the outputz\[[0-9]+ refs\] c                 S   s$   g | ]}|r| d s|dqS )#	)
startswithsplit.0rowr   r   r	   
<listcomp>   s    z*normalize_trace_output.<locals>.<listcomp>c                 S   s   t | d S )Nr   )int)r   r   r   r	   <lambda>    s    z(normalize_trace_output.<locals>.<lambda>)keyc                 S   s   g | ]}|d  qS )   r   r   r   r   r	   r   !   s    
z&tracer produced unparseable output:
{}N)	resub
splitlinessortjoin
IndexError
ValueErrorAssertionErrorformat)outputresultr   r   r	   normalize_trace_output   s   	r#   c                   @   sH   e Zd ZdZdZg ZdddZdddZdddZddd	Z	d
d Z
dS )TraceBackendNc                 C   sv   t | jt|| j t|d |d}tt|| j d }|  }W d    ||fS 1 s2w   Y  ||fS )Nz.py)script_filepython_fileoptimize_pythonz	.expected)r#   trace_pythonr   	EXTENSIONopenreadrstrip)selfnamer'   actual_outputfexpected_outputr   r   r	   run_case.   s   

zTraceBackend.run_casec                 C   s    | j |g }|r|d|g7 }|S )Nz-c)COMMAND)r-   r%   
subcommandcommandr   r   r	   generate_trace_command9   s   z#TraceBackend.generate_trace_commandc                 C   s.   |  ||}tj|tjtjdd \}}|S )NT)stdoutstderruniversal_newlines)r6   
subprocessPopenPIPESTDOUTcommunicate)r-   r%   r4   r5   r7   _r   r   r	   trace?   s   zTraceBackend.tracec                 C   s<   g }|r| dg|  dtjg| |g }| ||S )Nz-O )extendr   sys
executabler@   )r-   r%   r&   r'   Zpython_flagsr4   r   r   r	   r(   G   s
   zTraceBackend.trace_pythonc              
   C   sx   z|  td| j }| }W n tttfy) } z
t|}W Y d }~nd }~ww |dkr:t	d
| jd |d S )Nassert_usablezprobe: successz{}(1) failed: {}r   )r@   r   r)   stripFileNotFoundErrorNotADirectoryErrorPermissionErrorstrunittestZSkipTestr    r3   )r-   r!   Zfnfer   r   r	   rE   N   s   zTraceBackend.assert_usableN)__name__
__module____qualname__r)   r3   ZCOMMAND_ARGSr2   r6   r@   r(   rE   r   r   r   r	   r$   )   s    



r$   c                   @   s   e Zd ZdZg dZdS )DTraceBackendz.d)Zdtracez-qz-sNrM   rN   rO   r)   r3   r   r   r   r	   rP   Z       rP   c                   @   s   e Zd ZdZddgZdS )SystemTapBackendz.stpZstapz-gNrQ   r   r   r   r	   rS   _   rR   rS   c                   @   sL   e Zd ZdZdZdZedd Zdd Zdd Z	d	d
 Z
dd Zdd ZdS )
TraceTestsNr   c                 C   s   | j   d S rL   )backendrE   r-   r   r   r	   
setUpClassl   s   zTraceTests.setUpClassc                 C   s&   | j j|| jd\}}| || d S )N)r'   )rU   r2   r'   assertEqual)r-   r.   r/   r1   r   r   r	   r2   p   s   
zTraceTests.run_casec                 C      |  d d S )NZ
call_stackr2   rV   r   r   r	   test_function_entry_returnu      z%TraceTests.test_function_entry_returnc                    sz   t g d}ttd}|  W d   n1 sw   Y   fdd}|dD ]}||j q+t  | dS )z9Ensure our call stack test hits all function call opcodes)ZCALL_FUNCTIONZCALL_FUNCTION_EXZCALL_FUNCTION_KWzcall_stack.pyNc                    sF   t  ddjd}|jD ]}t|tjr |j| kr t|  S qg S )Nz<string>exec)sourcer   modeoptimize)	compiler'   	co_consts
isinstancetypesCodeTypeco_namedisZget_instructions)funcnamecodecZcode_stringr-   r   r	   get_function_instructions   s   
zFTraceTests.test_verify_call_opcodes.<locals>.get_function_instructionsstart)setr*   r   r+   discardopnamerX   )r-   Zopcodesr0   rl   Zinstructionr   rk   r	   test_verify_call_opcodesx   s   
z#TraceTests.test_verify_call_opcodesc                 C   rY   )NgcrZ   rV   r   r   r	   test_gc   r\   zTraceTests.test_gcc                 C   rY   )NlinerZ   rV   r   r   r	   	test_line   r\   zTraceTests.test_line)rM   rN   rO   ZmaxDiffrU   r'   classmethodrW   r2   r[   rq   rs   ru   r   r   r   r	   rT   d   s    
rT   c                   @      e Zd Ze ZdZdS )DTraceNormalTestsr   NrM   rN   rO   rP   rU   r'   r   r   r   r	   rx          rx   c                   @   rw   )DTraceOptimizedTests   Nry   r   r   r   r	   r{      rz   r{   c                   @   rw   )SystemTapNormalTestsr   NrM   rN   rO   rS   rU   r'   r   r   r   r	   r}      rz   r}   c                   @   rw   )SystemTapOptimizedTestsr|   Nr~   r   r   r   r	   r      rz   r   c                   C   s   t tttt d S rL   )r   rx   r{   r}   r   r   r   r   r	   	test_main   s   r   __main__)rg   Zos.pathr   r   r:   rC   rd   rK   Ztest.supportr   r   r   r#   r$   rP   rS   ZTestCaserT   rx   r{   r}   r   r   rM   r   r   r   r	   <module>   s,    14
