
    ;et                        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Zd dl	m
Z
 d dlmZ e
j        s ej        d          d Zd Z G d d          Z G d	 d
e          Z G d de          Z G d d          Z G d deej                  Z G d deej                  Z G d deej                  Z G d deej                  Z G d dej                  Zedk    r ej                     dS dS )    N)support)findfileztest module requires subprocessc                 ^    t           j                            t          | d                    S )N
dtracedata)subdir)ospathabspathr   )filenames    '/usr/lib/python3.11/test/test_dtrace.pyr
   r
      s#    7??8H\BBBCCC    c                 J   t          j        dd|           } 	 d |                                 D             }|                    d            d |D             }d                    |          S # t
          t          f$ r# t          d                    |                     w xY 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                 f    g | ].}||                     d           |                    d          /S )#	)
startswithsplit.0rows     r   
<listcomp>z*normalize_trace_output.<locals>.<listcomp>!   sN     
 
 

 >>#..
IIdOO
 
 
r   c                 ,    t          | d                   S )Nr   )int)r   s    r   <lambda>z(normalize_trace_output.<locals>.<lambda>&   s    CAKK r   )keyc                     g | ]
}|d          S )    r   s     r   r   z*normalize_trace_output.<locals>.<listcomp>'   s    +++S#a&+++r   
z%tracer produced unparsable output:
{})	resub
splitlinessortjoin
IndexError
ValueErrorAssertionErrorformat)outputresults     r   normalize_trace_outputr,      s     V&F33F

 
((**
 
 

 	//000++F+++yy   
# 
 
 
4;;FCC
 
 	

s   AA. .4B"c                   @    e Zd ZdZdZg ZddZddZddZddZ	d Z
dS )TraceBackendNc           	      h   t          |                     t          || j        z             t          |dz             |                    }t	          t          || j        z   dz                       5 }|                                                                }d d d            n# 1 swxY w Y   ||fS )Nz.py)script_filepython_fileoptimize_pythonz	.expected)r,   trace_pythonr
   	EXTENSIONopenreadrstrip)selfnamer2   actual_outputfexpected_outputs         r   run_casezTraceBackend.run_case4   s    .t/@/@t~ 566u--+ 0A 0- 0- . .
 '$/+=>>?? 	01ffhhoo//O	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0  //s   2'B%%B),B)c                 .    | j         |gz   }|r|d|gz  }|S )Nz-c)COMMAND)r8   r0   
subcommandcommands       r   generate_trace_commandz#TraceBackend.generate_trace_command?   s,    ,+. 	*j))Gr   c                     |                      ||          }t          j        |t          j        t          j        d                                          \  }}|S )NTstdoutstderruniversal_newlines)rB   
subprocessPopenPIPESTDOUTcommunicate)r8   r0   r@   rA   rE   _s         r   tracezTraceBackend.traceE   sX    --k:FF$W,6O,6,=8<> > > ?Jkmm 	 r   c                     g }|r|                     dg|z             d                    t          j        g|z   |gz             }|                     ||          S )Nz-O )extendr%   sys
executablerN   )r8   r0   r1   r2   python_flagsr@   s         r   r3   zTraceBackend.trace_pythonM   s`     	: 8999XXs~.=MNN
zz+z222r   c                 ^   	 |                      t          d| j        z                       }|                                }n3# t          t
          t          f$ r}t          |          }Y d }~nd }~ww xY w|dk    r3t          j	        d
                    | j        d         |                    d S )Nassert_usablezprobe: successz{}(1) failed: {}r   )rN   r
   r4   stripFileNotFoundErrorNotADirectoryErrorPermissionErrorstrunittestSkipTestr)   r?   )r8   r*   fnfes      r   rV   zTraceBackend.assert_usableT   s    	ZZ$.(H I IJJF\\^^FF!#5G 	 	 	YYFFFFFF	%%%#"))$,q/6BB   &%s   >A A1A,,A1N)__name__
__module____qualname__r4   r?   COMMAND_ARGSr=   rB   rN   r3   rV   r   r   r   r.   r.   /   s        IGL	0 	0 	0 	0      3 3 3 3	 	 	 	 	r   r.   c                       e Zd ZdZg dZdS )DTraceBackendz.d)dtracez-qz-sNr`   ra   rb   r4   r?   r   r   r   re   re   `   s        I$$$GGGr   re   c                       e Zd ZdZddgZdS )SystemTapBackendz.stpstapz-gNrg   r   r   r   ri   ri   e   s        ItnGGGr   ri   c                   N    e Zd ZdZdZdZed             Zd Zd Z	d Z
d Zd ZdS )	
TraceTestsNr   c                 8    | j                                          d S r_   )backendrV   r8   s    r   
setUpClasszTraceTests.setUpClassr   s    ""$$$$$r   c                 z    | j                             || j                  \  }}|                     ||           d S )N)r2   )rn   r=   r2   assertEqual)r8   r9   r:   r<   s       r   r=   zTraceTests.run_casev   sG    )-)>)>$"6 *? *8 *8&88888r   c                 0    |                      d           d S )N
call_stackr=   ro   s    r   test_function_entry_returnz%TraceTests.test_function_entry_return{   s    l#####r   c                 \    t          g d          }t          t          d                    5 }|                                ddd           n# 1 swxY w Y    fd} |d          D ]}|                    |j                                        t                      |           dS )z9Ensure our call stack test hits all function call opcodes)CALL_FUNCTIONCALL_FUNCTION_EXCALL_FUNCTION_KWzcall_stack.pyNc                     t          ddj                  }|j        D ]=}t          |t          j                  r!|j        | k    rt          j        |          c S >g S )Nz<string>exec)sourcer   modeoptimize)	compiler2   	co_consts
isinstancetypesCodeTypeco_namedisget_instructions)funcnamecodeccode_stringr8   s      r   get_function_instructionszFTraceTests.test_verify_call_opcodes.<locals>.get_function_instructions   su    +$. &$($8: : :D
 ^ 3 3a00 3QY(5J5J/22222Ir   start)setr5   r
   r6   discardopnamerr   )r8   opcodesr;   r   instructionr   s   `    @r   test_verify_call_opcodesz#TraceTests.test_verify_call_opcodes~   s    OOOPP'/**++ 	#q&&((K	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
	 
	 
	 
	 
	 
	 54W== 	0 	0KOOK.////(((((s   AAAc                 0    |                      d           d S )Ngcru   ro   s    r   test_gczTraceTests.test_gc   s    dr   c                 0    |                      d           d S )Nlineru   ro   s    r   	test_linezTraceTests.test_line   s    fr   )r`   ra   rb   maxDiffrn   r2   classmethodrp   r=   rv   r   r   r   r   r   r   rl   rl   j   s        G GO% % [%9 9 9
$ $ $) ) )2      r   rl   c                   &    e Zd Z e            ZdZdS )DTraceNormalTestsr   Nr`   ra   rb   re   rn   r2   r   r   r   r   r              mooGOOOr   r   c                   &    e Zd Z e            ZdZdS )DTraceOptimizedTests   Nr   r   r   r   r   r      r   r   r   c                   &    e Zd Z e            ZdZdS )SystemTapNormalTestsr   Nr`   ra   rb   ri   rn   r2   r   r   r   r   r      !          GOOOr   r   c                   &    e Zd Z e            ZdZdS )SystemTapOptimizedTestsr   Nr   r   r   r   r   r      r   r   r   c                   F    e Zd Zed             Zed             Zd Zd ZdS )CheckDtraceProbesc                     t          j        d          r<|                                 \  }}t          j        rt          d| d|            d S d S t          j        d          )NWITH_DTRACEzreadelf version: .z9CPython must be configured with the --with-dtrace option.)	sysconfigget_config_varget_readelf_versionr   verboseprintr\   r]   )clsreadelf_major_versionreadelf_minor_versions      r   rp   zCheckDtraceProbes.setUpClass   s    #M22 	a;>;R;R;T;T8!#8 [Y*?YYBWYYZZZZZ[ [ #$_```r   c            
      d   	 ddg} t          j        | t           j        t           j        d          }|5  |                                \  }}d d d            n# 1 swxY w Y   |j        r3t          dd                    |           d|j         d|d	|          n"# t          $ r t          j	        d
          w xY wt          j        d|          }|t          j	        d|           t          |                    d                    t          |                    d                    fS )Nreadelfz	--versionTrD   zCommand rP   z failed with exit code z	: stdout=z stderr=z!Couldn't find readelf on the pathz!^(?:GNU) readelf.*?\b(\d+)\.(\d+)z!Unable to parse readelf version: r   r   )rH   rI   rJ   rL   
returncode	Exceptionr%   OSErrorr\   r]   r!   searchr   group)cmdprocversionrF   matchs        r   r   z%CheckDtraceProbes.get_readelf_version   s   	Ik*C#!!#'	  D  5 5"&"2"2"4"45 5 5 5 5 5 5 5 5 5 5 5 5 5 5  <sxx}} < <&*o< <%< <17< <    	I 	I 	I#$GHHH	I
 	>HH=#$Q$Q$QRRR5;;q>>""CA$7$777s.   2B AB AB A =B B=c                     ddt           j        g}t          j        |t          j        t          j        d                                          \  }}|S )Nr   z-nTrD   )rR   rS   rH   rI   rJ   rK   rL   )r8   rA   rE   rM   s       r   get_readelf_outputz$CheckDtraceProbes.get_readelf_output   sQ    dCN3$?$#	
 
 

 +-- 	 r   c                     |                                  }g d}|D ]F}|                     |          5  |                     ||           d d d            n# 1 swxY w Y   Gd S )N)zName: import__find__load__donezName: import__find__load__startzName: auditzName: gc__startzName: gc__donezName: function__entryzName: function__returnz
Name: line)
probe_name)r   subTestassertIn)r8   readelf_outputavailable_probe_namesr   s       r   test_check_probesz#CheckDtraceProbes.test_check_probes   s    0022	!
 	!
 	!
 0 	: 	:J44 : :j.999: : : : : : : : : : : : : : :	: 	:s   AA	A	N)	r`   ra   rb   r   rp   staticmethodr   r   r   r   r   r   r   r      si        a a [a 8 8 \8:  : : : : :r   r   __main__)r   os.pathr   r!   rH   rR   r   r   r\   testr   test.supportr   has_subprocess_supportr]   r
   r,   r.   re   ri   rl   TestCaser   r   r   r   r   r`   mainr   r   r   <module>r      sw   



  				     



             ! ! ! ! ! ! % ?
(
=
>
>>D D D
 
 
2. . . . . . . .b% % % % %L % % %
    |   
1 1 1 1 1 1 1 1h    
H$5   
    :x'8   
    :x'8   
    j(*;   C: C: C: C: C:) C: C: C:L zHMOOOOO r   