ffXddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z ddl m Z m Z ddlmZmZmZddlmZddlmZddlmZdd lmZmZdd lmZmZdd lmZmZdd l m!Z!m"Z"dd l#m$Z$ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9GddZ:ddZ;y)N) os_helper MS_WINDOWSflush_std_streams) _parse_args Namespace) findtestssplit_test_packages list_cases)Logger)setup_pgo_tests)State) TestResultsEXITCODE_INTERRUPTED)RunTests HuntRefleak) setup_processsetup_test_dir)run_single_testPROGRESS_MIN_TIME)setup_tsan_tests)StrPathStrJSONTestNameTestList TestTuple TestFilterstrip_py_suffixcountformat_duration printlist get_temp_dir get_work_dir exit_timeoutdisplay_headercleanup_temp_dir print_warningis_cross_compiledget_host_runnerprocess_cpu_count EXIT_TIMEOUTc\eZdZdZd%dedefdZd&dZd'dedzde e edzffd Z e de fd Z d efd Zd efd Zd edededefdZd eddfdZdZded efdZdZdZd ededdfdZdZdZde fdZde dedzdefdZde dedzdefdZdZ d Z!d!Z"d"Z#d#Z$d'dedzfd$Z%y)(RegrtestaaExecute 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. ns_add_python_optsct|j|_|j|_|j|_|j|_|j |_t |_d|_t|j|j|j|_ |j|_ |j|_|j|_|j"|_|j&|_|j*|_|j.|_|j2|_|j6xs |j8|_|xr |j<|_|j@|_ |jB|_!|jD|_"|jF|_$|jJ|_&|jNd}n|jNdkrd}n |jN}||_(|jR|_)|jT|_+|jX|_,|jZ|_-|j\|_.|j^|_0|jb|_1|jdrB|jd\}}}tfjhjk|}tm||||_7nd|_7|jp|_9|jt|_;|jx|_=|j||_?t|j|_A|jrt|j|_Cnd|_C|j|_E|j|_G|j|_I|j|_Jdtfjvr3tfjdr d|_Jtfjd|_Ln8|jtjd|_Ln|j|_Ld|_O|j|_Qtj|_T|j|_Vd|_Wd|_Xy)NrSOURCE_DATE_EPOCHF )Yintverbosequietpgo pgo_extendedtsanrresults first_stater loggerheader want_header list_testswant_list_testsr want_list_caseswait want_waitcleanup want_cleanuprerun want_rerunrunleakswant_run_leaksbisect want_bisectfast_cislow_cici_moder/want_add_python_opts match_testsexcludefromfilestart starting_testargs cmdline_argsuse_mp num_workers worker_jsonfailfast fail_fastfail_env_changed fail_rerunforeververbose3output_on_failuretimeout huntrleaksospathabspathr hunt_refleaktestdirtest_dirxmlpathjunit_filenamememlimit memory_limit threshold gc_thresholdtuple use_resourcespython python_cmdtracecoveragecoverdir coverage_dirtempdirtmp_dir randomizeenviron random_seedrandom getrandbitsfirst_runtests print_slow print_slowesttime perf_counter start_timesinglesingle_test_runnext_single_testnext_single_filename)selfr.r/rXwarmupsrunsfilenames ,/usr/lib/python3.12/test/libregrtest/main.py__init__zRegrtest.__init__5s5 O 88 "$//'' %0M '+T\\4::txx@ "$%']]%']]!ww"$** "$&KK!# jj6BJJ +;,C/1/B/B !(*~~ZZ (*  .0hh&(gg 99 K YY!^K))K ++->> "{{&(&9&9 " ZZ '){{%'ZZ ==&(mm #GT8wwx0H4?x4XD  $D (*  .0jj(* (* .3B4D4D.E 996;BII6FDO"DO hh ,.KK')zz  "|| 2:: - ./"DN+-**5H*ID  ^^ #%11"5D !~~D 04$&==++-&(YY1548!c:|jj|yN)r<log)rlines rrz Regrtest.logs rNtestsreturnc|jrptjj|jd|_ t |j d5}|jj}|g}ddd|jrg}tjd}t tjjtj|j5}|D]Z}|jddd}|j}|j!|}|<|j#|j%\ dddt'||j(r t+|j,|j.|j0rt3|j,t5}|j6r)|j,D]}|j9|g|_t;|j<|} |js!|xs |j,} | r t?| } n| } n|} |jr'| dd} | jA| d} | | dz|_!|jFr | d| jA|jF=tQjR|jT|jVrtQjX| t[| |fS#1swY_xYw#t$rYnwxYw#1swYxYw#tD$rYwxYw#tH$r0tKd|jFtMjNdYwxYw) N pynexttestrz\btest_[a-zA-Z0-9_]+\b#rr)rgrQzCannot find starting test: ).rrcrdjoinrxropenreadstripOSErrorrRrecompilerSAVEDCWDsplitsearchappendgrouprr7r rVr8r9rsetrQaddr rhr indexr IndexErrorrT ValueErrorprintsysexitr|seedr{ryshufflero) rrfp next_testregexrmatch exclude_testsargalltestsselectedposs r find_testszRegrtest.find_testss   (* T\\<(PD % $33S9(R "  1I&KE( ==EJJ89Ebggll9#5#5t}}EF 4"4D::c1-a0D::> NN8 $h''E((   4 4P   3D4F4F3GHI  s_K"K5K!>K/ !K/9!K<'L KK K,+K,/K9< LL 6MMc(|D] }t|yr)r)rnames rr?zRegrtest.list_testss D $K rruntestsc F|jdk(rd|_|jj\}}|jdt |d|j |dddd|d}|j j||j||j|S)Nrrz Re-running z- failed tests in verbose mode in subprocessesTF)rrFr5r^r[match_tests_dictr`) rXr: prepare_rerunrlencopyr< set_tests _run_tests_mp)rrrrs r_rerun_failed_testszRegrtest._rerun_failed_testss   q !D "&,,"<"<"> ;s5zl*WXY==-#!% h' 8T%5%56rc|jr|jdy|j|_t |j |}|j jrRt tt|j jddt|j j|j|y)NzJRe-running failed tests is not supported with --python host runner option.testz failed again:) rrr get_stater;rrr:badrrr!display_result)rrrerun_runtestss rrerun_failed_testszRegrtest.rerun_failed_testss ?? HH&  >>+ 11(; <<   %DLL,,-v6 H dll&& ' N+rrprogresscptd|}|r|d|d}t|tdt|zt|j}|jgd|j|j |j |tdt j|dtd dl }|j||j }|j}|d |}t|tdt|ztd|rtd |y y)NzBisect z ()r)-uz-mztest.bisect_cmdz --max-iter25z-v+Tflushrraz : exit code zBisect failed with exit code F) rrcreate_python_cmdextendbisect_cmd_argsrshlexrr subprocessrunra returncode) rrrrtitlecmdrprocexitcodes r _run_bisectzRegrtest._run_bisects $  gRz+E e  cCJ ((*    8++-. 4 c5::c?$/~~c8+;+;~<??'hZ0 e  cCJ D  1(< =rc|jjd\}}t|dD];\}}t|dkDr|dt|}nd}|j |||r;yy)NF)clearr/)r:r enumeraterr)rrr_rrrs r run_bisectzRegrtest.run_bisect>sp<<--E-:q$UA. KE45zA~#WAc%j\2##HdH=  rc|jry|j}ttd|d|jj |j |j |jy)Nz== Tests result: z ==)r7rrr:rrr6r)rrstates rrzRegrtest.display_resultIsW <<    !%,- ##HNN$(JJ0B0B Dr test_namec|7d}tt}|j|t||d}n t ||}|j j |||S)Nz-result = run_single_test(test_name, runtests))globalslocalsresult)dictrrunctxrrr:accumulate_result)rrrtracerr namespacers rrun_testzRegrtest.run_testUs^  CCVXI MM#wyM Cx(F$Y9F &&vx8 rc|jrddl}|jdd}nd}ttj }|j }| t|d}nd}d|d}|jr|d t|jzz }|j|d}|j} t| d D]f\} } tj} | } |r| d |} |jj!| | |j#| ||}tj Dcgc]}||vr|j%d r|}}|D]U}tj j'|d|j)d \}}} t+tj ||W|j1|j2|j4rnat7|}tj| z }|t8k\r|dt|}F|j:t<j>k(sed}i|r tA||Scc}w#t,t.f$rYwxYw)NrFT)rsrrrzRun z sequentiallyz (timeout: %s)rz -- )ztest.test_.z in )!rtrsTracerrmodulesget_jobsrrar r iter_testsrrrr<display_progressr startswithpop rpartitiondelattrKeyErrorAttributeError must_stopr[r\strrrrPASSEDr)rrrsr save_modulesjobsrmsg previous_test tests_iter test_indexrrtextrmodule new_modulesparentrr test_times rrun_tests_sequentiallyzRegrtest.run_tests_sequentiallyds/ == [[uD[9FF3;;'   "  $'EEUG=)    #oh6F6F&GG GC   ((* %.z1%= % !J **,JD%)=9 KK ( (T :]]9h?F14 Gf$L8 & 1 12D E"GKG&  -"("3"3C"84CKK/6  0E0EFKM))+j8I--.;_Y=W X - $ A %D  -  5G!.1s$H6?H;;I Ic|jj|j}|jr|jd|}|S)Nz then )r:rr\r;)rrs rrzRegrtest.get_statesA &&t'<'<=   ''(ug6E rrXcjddlm}||||j|jj y)Nr) RunWorkers) run_workersrr<r:r)rrrXrs rrzRegrtest._run_tests_mps$+;$++t||DHHJrc6|jri|jr>t|jd5}|j|jdzdddnt j |j|.|j }|jdd|j|jr*t jdt jz|jr&|j j|jyy#1swYxYw)Nw T) show_missingsummaryruzleaks %d)rrrwritercunlinkr: write_resultsrvrIsystemgetpidrj write_junit)rrrr:s rfinalize_testszRegrtest.finalize_testss  $ $$$$33S9;RHHT22T9:;; $334  nn&G  ! !tT+/+<+< " >    IIj299;. /    LL $ $T%8%8 9 ;;s DDcNtj|jjz }t |j }t t dt|z|jj|j||j}t d|y)NzTotal duration: %szResult: ) rrr<rboolrPrr r:display_summaryr~r)rdurationfilteredrs rr#zRegrtest.display_summarys$$&)?)??(()  "_X%>>? $$T%8%8(C   !rct|fid|jd|jd|jddddd|jd|j d |j d |jd |jd |jd |jd|jd|jd|jdud|jd|jd|j d|j"d|j$d|j&S)Nr[r\rPrrFFr^r7r8r`rar5r6rfrh use_junitrlrnrprrryr{)rr[r\rPr^r7r8r`rar5r6rfrhrjrlrnrprrryr{)rrs rcreate_run_testszRegrtest.create_run_testssG  nn "22 ((  "    LL  ** #44 LL LL ** ** ]] **$6! "**# $**% &,,' () *nn+ ,((-  rrcF|jr7|jjdkrd}t|tjd|j dkrt xsddz|_|js2|jsF|js:|js.|s,|js t|j|jtd|j|j!|}||_|j$j'|t)|j|j sd }nt*}|r|j$j- |j r|j/||j d}n|j1|}|j3||j4r+|j6j9r|j;||j<r+|j6j9r|j?||r|j$jA |jC|jE||j6jG|jH|jJS#|r|j$jAwwxYw) NzhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!T)filerrrzUsing random seed:F)&rfrrrstdoutrXr*r>r7r6rrVr%rprrr{r(r~r<rrrstart_load_trackerrrrrGr: need_rerunrrKrstop_load_trackerr#r  get_exitcoder\r])rrrrruse_load_trackerrs r _run_testszRegrtest._run_testss    !2!2!:!:Q!>NC #CJJd 3   a !2 3 8qA=D    88tzzT-A-At00 4--t ? "D$4$45((2& h'  ! ! -8H8H$  *   KK * * , 0""8T-=-=>44X>    )4<<#:#:#<''1DLL$;$;$=) --/  F#||(()>)>)-: :   --/ s B;JJ c@tj|jdt|j}t 5t j |d5|j||cdddcdddS#1swYnxYw dddy#1swYyxYw)NT)exist_ok)r6)rcmakedirsrxr#r$rtemp_cwdr3)rrrwork_dirs r run_testszRegrtest.run_testss DLL40 -^ 8 ##HD9 8 x7  8 8 8 8  8 8 8 8 8 8s$BA>+ B>B BBct|j}d}t}t}|rchd}tj }tj j D cic]\}} |jdr||vr|| } }} | |k7r| }d}|ra|r_|jdk(r|jddg|js1tjd} |d| } |jd | gd}||fScc} }w) N> PYTHONPATH_PYTHON_PROJECT_BASE_PYTHON_HOST_PLATFORM_PYTHON_SYSCONFIGDATA_NAME)PYTHON_PYTHONTrz-j2 BUILDPYTHON z--python) r"rrr(r)rcrzitemsrrXr sysconfigget_config_var) r regrtest_opts keep_environrz cross_compile hostrunnerkeep old_environrvalue new_environ buildpythonrrs r_add_cross_compile_optsz Regrtest._add_cross_compile_opts0sDOO, *+ %& D **K/1zz/?/?/A +e'<=e K k)%L Z1$$$dC[1??'66}E *|1[M: $$j*%=># &&/s#"C8cZtjjs|jddtjvr|j dtj jdkr|jd|s-tj js|jdyyy)Nrdefault)z-WrRr,z-bbz-E) rr- write_throughr warnoptionsrflags bytes_warningignore_environment)r python_optsrHs r_add_ci_python_optszRegrtest._add_ci_python_opts_s zz''   t $ COO +   0 1 99 " "Q &   u %99//""4(0rctjjtjjt j |} t d|dttdr tstj|d|yddl }|j||5} |jdddtj$j(y#t$ri |jtnN#|j $r<|j#|jtj$t&YnwxYwYwxYw#1swYxYw#t*$r}t-d|d |Yd}~yd}~wwxYw) Nz+ Trexecvr)envrz!Failed to change Python options: z Command: )rr-rstderrrrrhasattrrcrr[rPopenrBKeyboardInterruptr+TimeoutExpiredkillrrr Exceptionr')rrrzcmd_textrrexcs r_execute_pythonzRegrtest._execute_pythonts>  ::c? 2 Bxj/ .r7#JQ%"%%cw%7 ;4 ;  ;)-;; IIlI;)88; IIK IIKHH%9:; ; ; ; 2 =cWE&&.Z1 2 2 2sy?E%E%*E,C$<'E%$ E.DEAE EEEEEEE"E%% F .FF c*g}g}|j|\}}|jr|j|||s|s|yttj }|r||dd|r|j ||jd|j||y)Nrz--dont-add-python-opts) rPrNrYlistr orig_argvrrrf)rrXrGrzrHrs rr/zRegrtest._add_python_optss  $ < <] K <<  $ $[, ?m'/ 3==! "C!H  JJ} % +, S'*rchtjjd|jrWtj j |js.tj j|j|_t|jt|j|_ y)Nbackslashreplace)errors) rr- reconfigurerjrcrdisabsrerrVr"rx)rs r_initzRegrtest._initsq &89   rww}}T5H5H'I"$''//$2E2E"FD ))*#DLL1 rc4|jr|j|j|jr*t |j t jd|jr tdt|j|j|\}}d}|jr|j|nA|jr#t!||j"|jn|j%||}t j|y)NrzPress any key to continue...)rPrh)rOr/rorEr&rxrrrCinputrrhrr@r?rAr rPr9)rrrrs rmainz Regrtest.mains  $ $  ! ! #    T\\ * HHQK >> 0 1t}}%//%0%    OOH %  ! ! x#'#3#3 $  /~~h6H r)F)rr)&__name__ __module__ __qualname____doc__rr"rrrrorr staticmethodr?rrrrrrrrrrrr4rr r#r(r3r9rPrYrfr/rorrrrr-r-su,d99d9d9LF(4F(5HW[OA[;\F(P)H2,8,($H$C$3$4$L 8   D ( h :x KhKSKTK:& " i 48:98:X_8:8:t8)8HtO88"-'^)*2D+, 2(T/rr-c xttjddfi|}t||j |y)zRun the Python suite.rN)r/)r)rrargvr-rr)rr/kwargsr.s rrrrrs4 SXXab\ ,V ,B R"2388u8Er)NF)rsr  AA+AA 6+06"u u pFr