
    z
@h0f                     T   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	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7  G d d          Z8ddZ9dS )    N)	os_helper
MS_WINDOWSflush_std_streams   )_parse_args	Namespace)	findtestssplit_test_packages
list_cases)Logger)setup_pgo_tests)State)TestResultsEXITCODE_INTERRUPTED)RunTestsHuntRefleak)setup_processsetup_test_dir)run_single_testPROGRESS_MIN_TIME)StrPathStrJSONTestNameTestList	TestTuple
TestFilterstrip_py_suffixcountformat_duration	printlistget_temp_dirget_work_direxit_timeoutdisplay_headercleanup_temp_dirprint_warningis_cross_compiledget_host_runnerprocess_cpu_countEXIT_TIMEOUTc                   j   e Zd ZdZd'dedefdZd(dZd)d	edz  d
e	e
edz  f         fdZed	e
fd            ZdefdZdefdZdededed
efdZded
dfdZd ZdedefdZd Zd Zdeded
dfdZd Zd Zd	e
fdZde
d	edz  d
efdZde
d	edz  d
efd Zd! Z d" Z!d# Z"d$ Z#d% Z$d)d	edz  fd&Z%dS )*Regrtestaa  Execute a test suite.

    This also parses command-line options and modifies its behavior
    accordingly.

    tests -- a list of strings containing test names (optional)
    testdir -- the directory in which to look for tests (optional)

    Users other than the Python test suite will certainly want to
    specify testdir; if it's omitted, the directory containing the
    Python test suite is searched for.

    If the tests argument is omitted, the tests listed on the
    command-line will be used.  If that's empty, too, then all *.py
    files beginning with test_ will be used.

    The other default arguments (verbose, quiet, exclude,
    single, randomize, use_resources, trace, coverdir,
    print_slow, and random_seed) allow programmers calling main()
    directly to set the values that would normally be set by flags
    on the command line.
    Fns_add_python_optsc                    t          |j                  | _        |j        | _        |j        | _        |j        | _        t                      | _        d | _        t          | j        | j        | j                  | _	        |j
        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        p|j        | _        |o|j        | _        |j        | _        |j         | _         |j!        | _!        |j"        | _#        |j$        | _%        |j&        d}n|j&        dk    rd}n|j&        }|| _'        |j(        | _(        |j)        | _*        |j+        | _+        |j,        | _,        |j-        | _-        |j.        | _/        |j0        | _0        |j1        rA|j1        \  }}}td          j3        4                    |          }tk          |||          | _6        nd | _6        |j7        | _8        |j9        | _:        |j;        | _<        |j=        | _>        t          |j@                  | _@        |jA        rt          |jA                  | _B        nd | _B        |jC        | _D        |jE        | _F        |jG        | _H        |jI        | _I        dtd          jJ        v r1td          jJ        d         rd| _I        td          jJ        d         | _K        n-|jK        t          jM        d          | _K        n|jK        | _K        d | _N        |jO        | _P        t          jR                    | _S        |jT        | _U        d | _V        d | _W        d S )Nr   SOURCE_DATE_EPOCHF    )Xintverbosequietpgopgo_extendedr   resultsfirst_stater   loggerheaderwant_header
list_testswant_list_testsr   want_list_caseswait	want_waitcleanupwant_cleanuprerun
want_rerunrunleakswant_run_leaksbisectwant_bisectfast_cislow_cici_moder.   want_add_python_optsmatch_testsexcludefromfilestartstarting_testargscmdline_argsuse_mpnum_workersworker_jsonfailfast	fail_fastfail_env_changed
fail_rerunforeververbose3output_on_failuretimeout
huntrleaksospathabspathr   hunt_refleaktestdirtest_dirxmlpathjunit_filenamememlimitmemory_limit	thresholdgc_thresholdtupleuse_resourcespython
python_cmdtracecoveragecoverdircoverage_dirtempdirtmp_dir	randomizeenvironrandom_seedrandomgetrandbitsfirst_runtests
print_slowprint_slowesttimeperf_counter
start_timesinglesingle_test_runnext_single_testnext_single_filename)selfr-   r.   rV   warmupsrunsfilenames          ,/usr/lib/python3.11/test/libregrtest/main.py__init__zRegrtest.__init__4   s   
OO8
"$/ %0MM'+ T\4:tx@@ "$%']%']!w"$* "$&K!# j6BJ+; ,C/1/B 	! (*~Z(*.0h&(g 9KKY!^^KK)K ++->  "{&(&9 "Z'){%'Z= 	%&(m#GT8wx00H4?x4X4XD $D(*
.0j(*(*.3B4D.E.E9 	#6;BI6F6FDOO"DO h,.K')z  "|2:--
./ . #DN +-*5H*ID^#%1"55D!~D 04 $&= +-- &(Y1548!!!     c                 :    | j                             |           d S N)r:   log)r   lines     r   r   zRegrtest.log   s    r   Ntestsreturnc                 6   | j         rt          j                            | j        d          | _        	 t          | j        d          5 }|                                                                }|g}d d d            n# 1 swxY w Y   n# t          $ r Y nw xY w| j
        rg }t          j        d          }t          t          j                            t          j        | j
                            5 }|D ]p}|                    dd          d         }|                                }|                    |          }|'|                    |                                           q	 d d d            n# 1 swxY w Y   t'          |           | j        rt+          | j        | j                   t1                      }| j        r&| j        D ]}|                    |           g | _        t7          | j        |          }	| j
        s|p| j        }
|
rt;          |
          }
n|	}
n|}
| j         rG|
d d         }
	 |	                    |
d                   }|	|dz            | _        n# t@          $ r Y nw xY w| j!        rZ	 |
d |
                    | j!                  = n;# tD          $ r. tG          d| j!                    tI          j%        d           Y nw xY wtM          j'        | j(                   | j)        rtM          j*        |
           tW          |
          |fS )	N
pynexttestrz\btest_[a-zA-Z0-9_]+\b#r   r   )re   rO   zCannot find starting test: ),r   ra   rb   joinrv   r   openreadstripOSErrorrP   recompiler   SAVEDCWDsplitsearchappendgroupr   r6   r   rT   r7   setrO   addr	   rf   r
   indexr   
IndexErrorrR   
ValueErrorprintsysexitrz   seedry   rw   shufflerm   )r   r   fp	next_testregexr   matchexclude_testsargalltestsselectedposs               r   
find_testszRegrtest.find_tests   s    	(*T\<(P(PD%$3S99 (R "		 1 1I&KE( ( ( ( ( ( ( ( ( ( ( ( ( ( (     = 	4E J899Ebgll9#5t}EEFF 4" 4 4D::c1--a0D::<<D!LL..E(U[[]]33344 4 4 4 4 4 4 4 4 4 4 4 4 4 4 	8 	BD-t/@AAA< 	#( ' '!!#&&&& "DT]%24 4 4 } 	1 1H $.x88#H 	|HnnXa[11(0q(9%%     	@hnnT-?@@@AA   HD4FHHIII 	D$%%%> 	%N8$$$h''sl   B
 *A>2B
 >BB
 BB
 

BB3A4E44E8;E89+I% %
I21I2=J 5KKc                 .    | D ]}t          |           d S r   )r   )r   names     r   r=   zRegrtest.list_tests   s(     	 	D$KKKK	 	r   runtestsc           	      P   | j         dk    rd| _         | j                                        \  }}|                     dt	          |           d           |                    |dddd|d          }| j                            |           |                     || j                    |S )Nr   r   zRe-running z- failed tests in verbose mode in subprocessesTF)r   rD   r4   r\   rY   match_tests_dictr^   )	rV   r8   prepare_rerunr   lencopyr:   	set_tests_run_tests_mp)r   r   r   r   s       r   _rerun_failed_testszRegrtest._rerun_failed_tests   s    q  
  !D"&,"<"<">"> 	Xs5zzXXXYYY==-# ! % % 	h'''8T%5666r   c                    | j         r|                     d           d S |                                 | _        t	                       |                     |          }| j        j        rNt	          t          t          | j        j                  d          d           t          | j        j                   |                     |           d S )NzJRe-running failed tests is not supported with --python host runner option.testzfailed again:)rp   r   	get_stater9   r   r   r8   badr   r   r    display_result)r   r   rerun_runtestss      r   rerun_failed_testszRegrtest.rerun_failed_tests   s    ? 	HH&   F>>++11(;;< 	(%DL,--v66HHHdl&'''N+++++r   r   progressc                    t                       d| }|r| d| d}t          |           t          dt          |          z             t                       |                                }|                    g d           |                    |                                           |                    |           t          dt          j        |          d           t                       d	d l	}|
                    ||j        
          }|j        }| d| }t          |           t          dt          |          z             t          d           |rt          d|            dS dS )NzBisect z ()r   )-uz-mztest.bisect_cmdz
--max-iter25z-v+Tflushr   r_   z: exit code zBisect failed with exit code F)r   r   create_python_cmdextendbisect_cmd_argsr   shlexr   r   
subprocessrunr_   
returncode)	r   r   r   r   titlecmdr   procexitcodes	            r   _run_bisectzRegrtest._run_bisect  s    $   	,+++++EecCJJ((**

 
 
 
 	 	 	 	

8++--...

4c5:c??$////~~c8+;~<<?00h00ecCJJD 	<(<<===5tr   c                     | j                             d          \  }}t          |d          D ]I\  }}t          |          dk    r| dt          |           }nd}|                     |||          s d S Jd S )NF)clearr   /r   )r8   r   	enumerater   r   )r   r   r   _r   r   r   s          r   
run_bisectzRegrtest.run_bisect9  s    <--E-::q$UA.. 	 	KE45zzA~~#22c%jj22##HdH== 	 	r   c                     |j         rd S |                                 }t                       t          d| d           | j                            |j        | j        | j                   d S )Nz== Tests result: z ==)r6   r   r   r8   r   r   r5   r~   )r   r   states      r   r   zRegrtest.display_resultD  sz    < 	F  ,%,,,---##HN$(J0B	D 	D 	D 	D 	Dr   	test_namec                     |Jd}t          t                                }|                    |t                      |           |d         }nt	          ||          }| j                            ||           |S )Nz-result = run_single_test(test_name, runtests))globalslocalsresult)dictr   runctxr   r   r8   accumulate_result)r   r   r   tracerr   	namespacer   s          r   run_testzRegrtest.run_testP  ss     CCVXXIMM#wyyMCCCx(FF$Y99F&&vx888r   c                    | j         rdd l}|                    dd          }nd }t          t          j                  |                                }|t          |d          }nd}d| d}|j        r|d	t          |j                  z  z  }| 
                    |           d }|                                }t          |d
          D ]c\  }	}
t          j                    }|
}|r|d|}| j                            |	|           |                     |
||          }fdt          j        D             }|D ]s}t          j                            |d            |                    d          \  }}}	 t)          t          j        |         |           ]# t*          t,          f$ r Y pw xY w|                    | j        | j                  r n_t5          |          }t          j                    |z
  }|t6          k    r|dt          |          }L|j        t:          j        k    rd }e|rt?          |           |S )Nr   FT)rq   r   r   r   zRun z sequentiallyz (timeout: %s)r   z -- c                 F    g | ]}|v|                     d           |S ))ztest.test_
startswith).0modulesave_moduless     r   
<listcomp>z3Regrtest.run_tests_sequentially.<locals>.<listcomp>  sG     G G Gf$L88 & 1 12D E E 9 "888r   .z in ) rr   rq   Tracer   r   modulesget_jobsr   r_   r   r   
iter_testsr   r   r   r:   display_progressr   pop
rpartitiondelattrKeyErrorAttributeError	must_stoprY   rZ   strr   r   r   PASSEDr   )r   r   rq   r   jobsr   msgprevious_test
tests_iter
test_indexr   r   textr   new_modulesr   parentr   r   	test_timer   s                       @r   run_tests_sequentiallyzRegrtest.run_tests_sequentially_  s   = 	LLL[[uD[99FFF3;''  ""$''EEE)U))) 	H#oh6F&G&GGGC((**
%.z1%=%=  	%  	%!J	*,,JD :%)TT==9K((T:::]]9h??FG G G G G G GK &  ---"("3"3C"8"84CK/6666 .1   D 0EFF KKM)++j8I---.;mm_Y=W=W=W X-- $ 	!-   s   7 FF,+F,c                 j    | j                             | j                  }| j        r| j         d| }|S )Nz then )r8   r   rZ   r9   )r   r   s     r   r   zRegrtest.get_state  s@    &&t'<== 	7'66u66Er   rV   c                 f    ddl m}  |||| j        | j                                                   d S )Nr   )
RunWorkers)run_workersr  r:   r8   r   )r   r   rV   r  s       r   r   zRegrtest._run_tests_mp  s@    ++++++
;$+t|DDHHJJJJJr   c                    | j         rk| j        rKt          | j         d          5 }|                    | j        dz              d d d            n# 1 swxY w Y   nt	          j        | j                    |1|                                }|                    dd| j                   | j	        r(t	          j
        dt	          j                    z             | j        r!| j                            | j                   d S d S )Nw
T)show_missingsummaryrs   zleaks %d)r   r   r   writera   unlinkr8   write_resultsrt   rG   systemgetpidrh   write_junit)r   r   r   r8   s       r   finalize_testszRegrtest.finalize_tests  sE   $ 	5$ 5$3S99 ;RHHT2T9:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 	$3444nn&&G!!tT+/+< " > > >  	0Ij29;;./// 	:L$$T%899999	: 	:s   AAAc                 T   t          j                    | j        j        z
  }t	          | j                  }t                       t          dt          |          z             | j        	                    | j
        |           |                                 }t          d|            d S )NzTotal duration: %szResult: )r   r   r:   r   boolrN   r   r   r8   display_summaryr|   r   )r   durationfilteredr   s       r   r%  zRegrtest.display_summary  s    $&&)??()) 	"_X%>%>>???$$T%8(CCC      !!!!!r   c                 X   t          |fi d| j        d| j        d| j        dd ddd| j        d| j        d	| j        d
| j        d| j        d| j	        d| j
        d| j        d| j        d| j        d ud| j        d| j        d| j        d| j        d| j        d| j        S )NrY   rZ   rN   r   rD   Fr\   r6   r7   r^   r_   r4   r5   rd   rf   	use_junitrj   rl   rn   rp   rw   ry   )r   rY   rZ   rN   r\   r6   r7   r^   r_   r4   r5   rd   rf   rh   rj   rl   rn   rp   rw   ry   )r   r   s     r   create_run_testszRegrtest.create_run_tests  sU   
 
 
nn
 "22
 ((	

 "T
 %
 LL
 
 **
 #44
 LL
 LL
 **
 **
 ]]
  *$66!
" **#
$ **%
& ,,'
( )
* nn+
, ((-
 	
r   r   c                    | j         r.| j         j        dk     rd}t          |t          j        d           | j        dk     rt                      pddz   | _        | j        s| j        s1| j	        s*| j
        s#|s!| j        st          | j        | j                   t          d| j                   |                     |          }|| _        | j                            |           t)                       |j         
| j        sd	}nt*          }|r| j                                         	 | j        r|                     || j                   d }n|                     |          }|                     |           | j        r.| j                                        r|                     |           | j        r.| j                                        r|                     |           |r| j                                          n!# |r| j                                          w w xY w| !                                 | "                    |           | j        #                    | j$        | j%                  S )
N   zhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!T)filer   r   r      zUsing random seed:F)&rd   r   r   r   stdoutrV   r)   r<   r6   r5   r   rT   r$   rn   rp   ry   r*  r|   r:   r   r   r   start_load_trackerr   r  r   rE   r8   
need_rerunr   rI   r   stop_load_trackerr%  r"  get_exitcoderZ   r[   )r   r   r   r
  r   use_load_trackerr   s          r   
_run_testszRegrtest._run_tests  s    	4!2!:Q!>!>NC#CJd3333a !2 3 3 8qA=D  	@8	@#z	@-1-A	@	@#0	@ 4-t???"D$4555((22&h'''!-8H-$  * 	-K**,,,	0 ?""8T-=>>>44X>>))) 24<#:#:#<#< 2''111 *DL$;$;$=$= *))) 0--///   0--////0 	F###|(()>)-: : 	:s   %B9G: :Hc                 T   t          j        | j        d           t          | j                  }t	                      5  t          j        |d          5  |                     ||          cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )NT)exist_ok)r5   )ra   makedirsrv   r"   r#   r   temp_cwdr5  )r   r   r   work_dirs       r   	run_testszRegrtest.run_tests  sE   
DL40000-- ^^ 
	8 
	8
 #HD999 8 8
 x778 8 8 8 8 8 8
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8
8 8 8 8 8 8 8 8 8
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8 
	8s5   BB+BB	BB	BB!$B!c                   
 t          | j                  }d }t                      }t                      }|rDh d
t          j        }
fdt          j                                        D             }||k    r|}d}|r_|r]| j        dk    r|                    ddg           | j        s4t          j
        d          }| d| }	|                    d	|	g           d}||fS )
N>   
PYTHONPATH_PYTHON_PROJECT_BASE_PYTHON_HOST_PLATFORM_PYTHON_SYSCONFIGDATA_NAMEc                 N    i | ]!\  }}|                     d           r|v ||"S ))PYTHON_PYTHONr   )r   r   valuekeeps      r   
<dictcomp>z4Regrtest._add_cross_compile_opts.<locals>.<dictcomp>A  sE        +e'<==AE eAMr   Tr   z-j2BUILDPYTHON z--python)r$  rp   r'   r(   ra   rx   itemsrV   r   	sysconfigget_config_var)r   regrtest_optskeep_environrx   cross_compile
hostrunnerold_environnew_environbuildpythonrp   rE  s             @r   _add_cross_compile_optsz Regrtest._add_cross_compile_opts+  s1    DO,, *++ %&&
 	   D *K   /1z/?/?/A/A  K
 k))%L 	$Z 	$1$$ $$dC[111 ? $'6}EE *::[::
$$j*%=>>>#&&r   c                 D   t           j        j        s|                    d           dt           j        vr|                    d           t           j        j        dk     r|                    d           |s(t           j        j        s|                    d           d S d S d S )Nr   default)z-WrV  r.  z-bbz-E)	r   r/  write_throughr   warnoptionsr   flagsbytes_warningignore_environment)r   python_optsrN  s      r   _add_ci_python_optszRegrtest._add_ci_python_optsZ  s    
 z' 	%t$$$ CO++0111 9"Q&&u%%% 	)9/ )""4(((((	) 	)) )r   c                 \   t           j                                         t           j                                         t	          j        |          }	 t          d| d           t          t          d          r$t          st          j
        |d         |           d S dd l}|                    ||          5 }	 |                                 n~# t          $ rq 	 |                    t                     nQ# |j        $ rD |                                 |                                 t          j        t&                     Y nw xY wY nw xY wd d d            n# 1 swxY w Y   t          j        |j                   d S # t*          $ r }t-          d|d	|            Y d }~d S d }~ww xY w)
Nz+ Tr   execvr   )envr   z!Failed to change Python options: z

Command: )r   r/  r   stderrr   r   r   hasattrra   r   r_  r   Popenr@   KeyboardInterruptr*   TimeoutExpiredkillr   r   r   	Exceptionr&   )r   r   rx   cmd_textr   r   excs          r   _execute_pythonzRegrtest._execute_pythono  s&   

:c??	2/x//....r7## *J *Q%%%%% "!!!%%cw%77 ;4
;		, ; ; ;; IIlI;;;;)8 ; ; ; IIKKK IIKKKH%9:::::;;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ))))) 	2 	2 	2 1c 1 1&.1 1 2 2 2 2 2 2 2 2 2	2s   AF F :E<CE
EC87E8AEEEE	EEEF EF "E#F 
F+F&&F+c                 P   g }g }|                      |          \  }}| j        r|                     ||           |s|s|d S t          t          j                  }|r||dd<   |r|                    |           |                    d           |                     ||           d S )Nr   z--dont-add-python-opts)	rT  rL   r]  listr   	orig_argvr   r   rj  )r   r\  rM  rx   rN  r   s         r   r.   zRegrtest._add_python_opts  s     $ < <] K K< 	@$$[,??? 	m 	'/F 3=!! 	#"C!H 	&JJ}%%%

+,,,S'*****r   c                 H   t           j                            d           | j        rMt          j                            | j                  s)t          j                            | j                  | _        t          | j	                   t          | j                  | _        d S )Nbackslashreplace)errors)r   r/  reconfigurerh   ra   rb   isabsrc   r   rT   r!   rv   )r   s    r   _initzRegrtest._init  s     	
&8999 	Grw}}T5H'I'I 	G"$'//$2E"F"FD)***#DL11r   c                     | j         r|                                  |                                  | j        r(t	          | j                   t          j        d           | j        rt          d           t          | j                   |                     |          \  }}d}| j        r|                     |           n:| j        rt!          || j        | j                   n|                     ||          }t          j        |           d S )Nr   zPress any key to continue...)rN   rf   )rM   r.   rs  rC   r%   rv   r   r   rA   inputr   rf   r   r>   r=   r?   r   rN   r;  )r   r   r   r   s       r   mainzRegrtest.main  s   $ 	$!!###

 	T\***HQKKK> 	20111t}%%%//%00% 	7OOH%%%%! 	7x#'#3 $/ / / / / ~~h66Hr   )F)r   r   )&__name__
__module____qualname____doc__r   r$  r   r   r   rm   r   r   staticmethodr=   r   r   r   r  r   r   r   r   r   r  r   r3   r   r"  r%  r*  r5  r;  rT  r]  rj  r.   rs  rv   r   r   r,   r,      s        ,c9 c99 c9 c9 c9 c9 c9J   C( C(4 C(5HW[OA[;\ C( C( C( C(J )    \H    2,8 , , , ,($H $C $3 $4 $ $ $ $L	8 	 	 	 	 	
D 
D 
D( h    : : :x  Kh KS KT K K K K: : :&" " "
i 
 
 
 
48:9 8:X_ 8: 8: 8: 8: 8:t8) 8HtO 8 8 8 8 8"-' -' -'^) ) )*2 2 2D+ + +,2 2 2 (T/      r   r,   Fc                     t          t          j        dd         fi |}t          ||                              |            dS )zRun the Python suite.r   N)r.   )r   )r   r   argvr,   rv  )r   r.   kwargsr-   s       r   rv  rv    sL    	SXabb\	,	,V	,	,BR"233388u8EEEEEr   )NF):ra   rz   r   r   r   rK  r   test.supportr   r   r   cmdliner   r   r	   r
   r   r:   r   r6   r   r   r   r8   r   r   r   r   r   setupr   r   r   r   r   utilsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r,   rv  r|  r   r   <module>r     sb   				  				  



      A A A A A A A A A A + + + + + + + + A A A A A A A A A A                         6 6 6 6 6 6 6 6 + + + + + + + + 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 6                                           q
 q
 q
 q
 q
 q
 q
 q
hF F F F F Fr   