
    daf                         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j8                          yy)    N)support)findfileztest module requires subprocessc                 V    t         j                  j                  t        | d            S )N
dtracedata)subdir)ospathabspathr   )filenames    +/root/Python-3.12.4/Lib/test/test_dtrace.pyr
   r
      s    77??8H\BCC    c                    t        j                  dd|       } 	 | j                         D cg c]&  }|r"|j                  d      s|j	                  d      ( }}|j                  d        |D cg c]  }|d   	 }}dj                  |      S c c}w c c}w # t        t        f$ r t        d	j                  |             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                     t        | d         S )Nr   )int)rows    r   <lambda>z(normalize_trace_output.<locals>.<lambda>&   s    CAK r   )key   
z%tracer produced unparsable output:
{})resub
splitlines
startswithsplitsortjoin
IndexError
ValueErrorAssertionErrorformat)outputr   results      r   normalize_trace_outputr&      s     VV&F3F
 ((*
3>>#. IIdO
 

 	/0$*+S#a&++yy  
 ,
# 
4;;FC
 	

s(   B +BB /B;B 
B *C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
y)TraceBackendNc           	      <   t        | j                  t        || j                  z         t        |dz         |            }t	        t        || j                  z   dz               5 }|j                         j                         }d d d        ||fS # 1 sw Y   |fS xY w)Nz.py)script_filepython_fileoptimize_pythonz	.expected)r&   trace_pythonr
   	EXTENSIONopenreadrstrip)selfnamer,   actual_outputfexpected_outputs         r   run_casezTraceBackend.run_case4   s    .t/@/@t~~ 56u-+ 0A 0- .
 '$/+=>? 	01ffhoo/O	0  //	0  //s   $BBc                 8    | j                   |gz   }|r|d|gz  }|S )Nz-c)COMMAND)r2   r*   
subcommandcommands       r   generate_trace_commandz#TraceBackend.generate_trace_command?   s)    ,,+.j))Gr   c                     | j                  ||      }t        j                  |t        j                  t        j                  d      j                         \  }}|S )NTstdoutstderruniversal_newlines)r<   
subprocessPopenPIPESTDOUTcommunicate)r2   r*   r:   r;   r?   _s         r   tracezTraceBackend.traceE   sQ    --k:F$$W,6OO,6,=,=8<> ?Jkm 	 r   c                     g }|r|j                  dg|z         dj                  t        j                  g|z   |gz         }| j	                  ||      S )Nz-O )extendr   sys
executablerH   )r2   r*   r+   r,   python_flagsr:   s         r   r-   zTraceBackend.trace_pythonM   sQ     89XXs~~.=MN
zz+z22r   c                 :   	 | j                  t        d| j                  z               }|j                         }|dk7  r2t        j                  dj                  | j                  d   |            y # t        t
        t        f$ r}t        |      }Y d }~\d }~ww xY w)Nassert_usablezprobe: successz{}(1) failed: {}r   )rH   r
   r.   stripFileNotFoundErrorNotADirectoryErrorPermissionErrorstrunittestSkipTestr#   r9   )r2   r$   fnfes      r   rP   zTraceBackend.assert_usableT   s    	ZZ$..(H IJF\\^F %%##"))$,,q/6B  & "#5G 	YF	s   7A1 1BBBN)__name__
__module____qualname__r.   r9   COMMAND_ARGSr7   r<   rH   r-   rP    r   r   r(   r(   /   s*    IGL	03	r   r(   c                       e Zd ZdZg dZy)DTraceBackendz.d)dtracez-qz-sNrZ   r[   r\   r.   r9   r^   r   r   r`   r`   `   s    I$Gr   r`   c                       e Zd ZdZddgZy)SystemTapBackendz.stpstapz-gNrb   r^   r   r   rd   rd   e   s    ItnGr   rd   c                   F    e Zd ZdZdZdZed        Zd Zd Z	d Z
d Zd Zy)	
TraceTestsNr   c                 8    | j                   j                          y rY   )backendrP   r2   s    r   
setUpClasszTraceTests.setUpClassr   s    ""$r   c                 |    | j                   j                  || j                        \  }}| j                  ||       y )N)r,   )ri   r7   r,   assertEqual)r2   r3   r4   r6   s       r   r7   zTraceTests.run_casev   s;    )-)>)>$"6"6 *? *8&8r   c                 &    | j                  d       y )N
call_stackr7   rj   s    r   test_function_entry_returnz%TraceTests.test_function_entry_return{   s    l#r   c                 $    t        g d      }t        t        d            5 }|j                         ddd        fd} |d      D ]  }|j	                  |j
                           j                  t               |       y# 1 sw Y   RxY w)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 ]C  }t        |t        j
                        s|j                  | k(  s.t        j                  |      c S  g S )Nz<string>exec)sourcer   modeoptimize)	compiler,   	co_consts
isinstancetypesCodeTypeco_namedisget_instructions)funcnamecodeccode_stringr2   s      r   get_function_instructionszFTraceTests.test_verify_call_opcodes.<locals>.get_function_instructions   sd    +$. &$($8$8:D
 ^^ 3a0QYY(5J//223 Ir   start)setr/   r
   r0   discardopnamerm   )r2   opcodesr5   r   instructionr   s   `    @r   test_verify_call_opcodesz#TraceTests.test_verify_call_opcodes~   s     OP'/*+ 	#q&&(K	#
	 5W= 	0KOOK../	0 	(%	# 	#s   BBc                 &    | j                  d       y )Ngcrp   rj   s    r   test_gczTraceTests.test_gc   s    dr   c                 &    | j                  d       y )Nlinerp   rj   s    r   	test_linezTraceTests.test_line   s    fr   )rZ   r[   r\   maxDiffri   r,   classmethodrk   r7   rq   r   r   r   r^   r   r   rg   rg   j   s>    G GO% %9
$)2r   rg   c                       e Zd Z e       ZdZy)DTraceNormalTestsr   NrZ   r[   r\   r`   ri   r,   r^   r   r   r   r          oGOr   r   c                       e Zd Z e       ZdZy)DTraceOptimizedTests   Nr   r^   r   r   r   r      r   r   r   c                       e Zd Z e       ZdZy)SystemTapNormalTestsr   NrZ   r[   r\   rd   ri   r,   r^   r   r   r   r           GOr   r   c                       e Zd Z e       ZdZy)SystemTapOptimizedTestsr   Nr   r^   r   r   r   r      r   r   r   c                   \    e Zd Zed        Zed        Zd Zd Ze	j                  d        Zy)CheckDtraceProbesc                     t        j                  d      r6| j                         \  }}t        j                  rt        d| d|        y y 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printrV   rW   )clsreadelf_major_versionreadelf_minor_versions      r   rk   zCheckDtraceProbes.setUpClass   s_    ##M2;>;R;R;T8!#8)*?)@BWAXYZ  ##$_``r   c            
      P   	 ddg} t        j                  | t         j                  t         j                  d      }|5  |j                         \  }}d d d        |j                  r0t        ddj                  |       d|j                   dd	      	 t        j                  d      }|t        j                  d|       t        |j                  d            t        |j                  d            fS # 1 sw Y   xY w# t        $ r t        j                  d
      w xY w)Nreadelfz	--versionTr>   zCommand rJ   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   )rB   rC   rD   rF   
returncode	Exceptionr   OSErrorrV   rW   r   searchr   group)cmdprocversionr@   matchs        r   r   z%CheckDtraceProbes.get_readelf_version   s+   	Ik*C##!!#'	D  5"&"2"2"45 sxx}/ 0&&*oo%6 7%[
<   		>H=##&Gy$QRR5;;q>"CA$777%5 5  	I##$GHH	Is#   ;D C:AD :D?D D%c                     ddt         j                  g}t        j                  |t        j                  t        j
                  d      j                         \  }}|S )Nr   z-nTr>   )rL   rM   rB   rC   rD   rE   rF   )r2   r;   r?   rG   s       r   get_readelf_outputz$CheckDtraceProbes.get_readelf_output   sO    dCNN3$$??$$#	

 +- 	 r   c                     | j                         }g d}|D ]/  }| j                  |      5  | j                  ||       d d d        1 y # 1 sw Y   <xY w)N)zName: import__find__load__donezName: import__find__load__startzName: auditzName: gc__startzName: gc__done
probe_namer   subTestassertIn)r2   readelf_outputavailable_probe_namesr   s       r   test_check_probesz#CheckDtraceProbes.test_check_probes   s_    002!
 0 	:J4 :j.9: :	:: :   A

A	c                     | j                         }g d}|D ]/  }| j                  |      5  | j                  ||       d d d        1 y # 1 sw Y   <xY w)N)zName: function__entryzName: function__returnz
Name: liner   r   )r2   r   missing_probe_namesr   s       r   test_missing_probesz%CheckDtraceProbes.test_missing_probes   s_    002
 . 	:J4 :j.9: :	:: :r   N)rZ   r[   r\   r   rk   staticmethodr   r   r   rV   expectedFailurer   r^   r   r   r   r      sN    a a 8 8:: : :r   r   __main__)r   os.pathr   r   rB   rL   r   r~   rV   testr   test.supportr   has_subprocess_supportrW   r
   r&   r(   r`   rd   rg   TestCaser   r   r   r   r   rZ   mainr^   r   r   <module>r      s    
  	  
     ! %%
(

=
>>D
2. .b%L %
| 
1 1h
H$5$5 
:x'8'8 
:x'8'8 
j(*;*; O:)) O:d zHMMO r   