ʬXTddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z ddl m Z m Z ddlmZmZmZddlmZddlmZddlmZdd lmZmZdd lmZmZdd lmZmZdd l m!Z!m"Z"dd 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7GddZ8ddZ9dS)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)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_TIMEOUTcjeZdZdZd'dedefdZd(dZd)d edzd e e edzffd Z e d e fd Z d efdZd efdZd ededed efdZd ed dfdZdZded efdZdZdZd eded dfdZdZdZd e fdZde d edzd efdZde d edzd efd Zd!Z d"Z!d#Z"d$Z#d%Z$d)d edzfd&Z%dS)*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. Fns_add_python_optsct|j|_|j|_|j|_|j|_t |_d|_t|j|j|j|_ |j |_ |j |_ |j|_|j|_|j|_|j|_|j|_|j|_|jp|j|_|o|j|_|j|_|j |_ |j!|_!|j"|_#|j$|_%|j&d}n|j&dkrd}n|j&}||_'|j(|_(|j)|_*|j+|_+|j,|_,|j-|_-|j.|_/|j0|_0|j1rA|j1\}}}tdj34|}tk||||_6nd|_6|j7|_8|j9|_:|j;|_<|j=|_>t|j@|_@|jArt|jA|_Bnd|_B|jC|_D|jE|_F|jG|_H|jI|_IdtdjJvr1tdjJdrd|_ItdjJd|_Kn-|jKtjMd|_Kn |jK|_Kd|_N|jO|_PtjR|_S|jT|_Ud|_Vd|_WdS)NrSOURCE_DATE_EPOCHF )Xintverbosequietpgo pgo_extendedrresults 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.rVwarmupsrunsfilenames  "{&(&9 " Z '){%'Z = %&(m #GT8wx00H4?x4X4XD   $D (*  .0j(* (* .3B4D.E.E 9 #6;BI6F6FDOO"DO h ,.K')z  "| 2: - - ./ .#DN+-*5H*ID   ^ #%1"55D  !~D 04$&=+--&(Y1548!!!c:|j|dSN)r:log)rlines rrz Regrtest.logs rNtestsreturnc6|jrtj|jd|_ t |jd5}|}|g}dddn #1swxYwYn#t$rYnwxYw|j rg}tj d}t tjtj|j 5}|D]p}|ddd}|}||}|'||q dddn #1swxYwYt'||jrt+|j|jt1}|jr&|jD]}||g|_t7|j|} |j s|p|j} | rt;| } n| } n|} |jrG| dd} | | d} | | dz|_n#t@$rYnwxYw|j!rZ | d| |j!=n;#tD$r.tGd|j!tIj%dYnwxYwtMj'|j(|j)rtMj*| tW| |fS) N pynexttestrz\btest_[a-zA-Z0-9_]+\b#rr)rerOzCannot find starting test: ),rrarbjoinrvropenreadstripOSErrorrPrecompilerSAVEDCWDsplitsearchappendgrouprr6r rTr7setrOaddr rfr indexr IndexErrorrR ValueErrorprintsysexitrzseedryrwshufflerm) rrfp next_testregexrmatch exclude_testsargalltestsselectedposs r find_testszRegrtest.find_testss   (* T\<(P(PD % $3S99(R "  1 1I&KE(((((((((((((((     = 4EJ899Ebgll9#5t}EEFF 4"44D::c1--a0D::< % N8 $ $ $h''slB *A>2 B >BB BB BB3A4E44E8;E89+I%% I21I2=J5KKc.|D]}t|dSr)r)rnames rr=zRegrtest.list_testss(  D $KKKK  rruntestsc P|jdkrd|_|j\}}|dt |d||dddd|d}|j||||j|S)Nrrz Re-running z- failed tests in verbose mode in subprocessesTF)rrDr4r\rYmatch_tests_dictr^) rVr8 prepare_rerunrlencopyr: set_tests _run_tests_mp)rrrrs r_rerun_failed_testszRegrtest._rerun_failed_testss  q !D "&,"<"<">"> Xs5zzXXXYYY==-#!%% h''' 8T%5666rc|jr|ddS||_t ||}|jjrNt tt|jjddt|jj| |dS)NzJRe-running failed tests is not supported with --python host runner option.testz failed again:) rpr get_stater9rrr8badrrr display_result)rrrerun_runtestss rrerun_failed_testszRegrtest.rerun_failed_testss ?  HH&    F>>++ 11(;; <  ( %DL,--v66 H H H dl& ' ' ' N+++++rrprogressctd|}|r|d|d}t|tdt|zt|}|gd||||tdt j|dtd dl }| ||j }|j }|d |}t|tdt|ztd|rtd |d SdS)NzBisect z ()r)-uz-mztest.bisect_cmdz --max-iter25z-v+Tflushrr_z : exit code zBisect failed with exit code F) rrcreate_python_cmdextendbisect_cmd_argsrshlexrr subprocessrunr_ returncode) rrrrtitlecmdrprocexitcodes r _run_bisectzRegrtest._run_bisects  $    ,+++++E e  cCJJ ((**        8++--... 4 c5:c??$////~~c8+;~<<?00h00 e  cCJJ D   <(<< = = =5trc|jd\}}t|dD]I\}}t|dkr|dt|}nd}||||sdSJdS)NF)clearr/r)r8r enumeraterr)rrr_rrrs r run_bisectzRegrtest.run_bisect9s<--E-::q$UA..  KE45zzA~~#22c%jj22##HdH==     rc|jrdS|}ttd|d|j|j|j|jdS)Nz== Tests result: z ==)r6rrr8rrr5r~)rrstates rrzRegrtest.display_resultDsz <  F    ,%,,,--- ##HN$(J0B D D D D Dr test_namec|Jd}tt}||t||d}nt ||}|j|||S)Nz-result = run_single_test(test_name, runtests))globalslocalsresult)dictrrunctxrrr8accumulate_result)rrrtracerr namespacers rrun_testzRegrtest.run_testPss  CCVXXI MM#wyyM C C Cx(FF$Y99F &&vx888 rc|jrddl}|dd}nd}ttj|}|t|d}nd}d|d}|jr|d t|jzz }| |d}| }t|d D]c\} } tj} | } |r| d |} |j| | || ||} fd tjD}|D]s}tj|d|d \}}} t)tj||]#t*t,f$rYpwxYw| |j|jrn_t5| }tj| z }|t6kr|dt|}L| jt:jkrd}e|rt?||S)NrFT)rqrrrzRun z sequentiallyz (timeout: %s)rz -- cFg|]}|v|d|S))ztest.test_ startswith).0module save_moduless r z3Regrtest.run_tests_sequentially..sGGGGf$L88 & 1 12D E E9"888r.z in ) rrrqTracerrmodulesget_jobsrr_rr iter_testsrrrr:display_progressrpop rpartitiondelattrKeyErrorAttributeError must_stoprYrZstrrrrPASSEDr)rrrqrjobsrmsg previous_test tests_iter test_indexrrtextr new_modulesrparentrr test_timers @rrun_tests_sequentiallyzRegrtest.run_tests_sequentially_s =  LLL[[uD[99FFF3;''   ""  $''EEE)U)))   H #oh6F&G&GG GC   ((** %.z1%=%= % % !J *,,JD :%)TT==9 K ( (T : : :]]9h??FGGGG GGGK&   ---"("3"3C"8"84CK/6666 .1D0EFF KKM)++j8I---.;mm_Y=W=W=W X -- $  ! -  s7 FF,+F,cj|j|j}|jr |jd|}|S)Nz then )r8rrZr9)rrs rrzRegrtest.get_states@ &&t'<==   7'66u66E rrVcfddlm}||||j|jdS)Nr) RunWorkers) run_workersrr:r8r)rrrVrs rrzRegrtest._run_tests_mps@++++++ ;$+t|DDHHJJJJJrc|jrk|jrKt|jd5}||jdzdddn #1swxYwYnt j|j|1|}|dd|j|j r(t j dt j z|j r!|j |j dSdS)Nw T) show_missingsummaryrszleaks %d)rrrwriteraunlinkr8 write_resultsrtrGsystemgetpidrh write_junit)rrrr8s rfinalize_testszRegrtest.finalize_testssE  $ 5$ 5$3S99;RHHT2T9:::;;;;;;;;;;;;;;; $3444  nn&&G  ! !tT+/+< " > > >   0 Ij29;;. / / /   : L $ $T%8 9 9 9 9 9 : :sAAAcTtj|jjz }t |j}t t dt|z|j |j || }t d|dS)NzTotal duration: %szResult: ) rrr:rboolrNrrr8display_summaryr|r)rdurationfilteredrs rr%zRegrtest.display_summarys$&&)??())  "_X%>%>>??? $$T%8(CCC      !!!!!rcXt|fid|jd|jd|jddddd|jd|jd |jd |jd |jd |j d |j d|j d|j d|j dud|jd|jd|jd|jd|jd|jS)NrYrZrNrrDFr\r6r7r^r_r4r5rdrf use_junitrjrlrnrprwry)rrYrZrNr\r6r7r^r_r4r5rdrfrhrjrlrnrprwry)rrs rcreate_run_testszRegrtest.create_run_testssU    nn "22 ((  "T  %  LL  ** #44 LL LL ** ** ]] *$66! "**# $**% &,,' () *nn+ ,((-  rrc|jr.|jjdkrd}t|tjd|jdkrt pddz|_|js|js1|j s*|j s#|s!|j st|j |jtd|j||}||_|j|t)|j |jsd }nt*}|r|j |jr|||jd}n||}|||jr.|jr|||jr.|jr|||r|j n!#|r|j wwxYw|!|"||j#|j$|j%S) NzhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!T)filerrrzUsing random seed:F)&rdrrrstdoutrVr)r<r6r5rrTr$rnrpryr*r|r:rrrstart_load_trackerrrrrEr8 need_rerunrrIrstop_load_trackerr%r" get_exitcoderZr[)rrrr ruse_load_trackerrs r _run_testszRegrtest._run_testss   4!2!:Q!>!>NC #CJd 3 3 3 3  a  !2 3 3 8qA=D    @8 @#z @-1-A @ @#0 @ 4-t ? ? ? "D$4555((22& h'''  ! -8H -$   *   - K * * , , , 0 ?""8T-=>>>44X>>    ) ) ) 24<#:#:#<#< 2''111 *DL$;$;$=$= *))) 0 --///  0 --//// 0  F###|(()>)-:: :s %B9G::HcTtj|jdt|j}t 5t j|d5|||cdddcdddS#1swxYwY ddddS#1swxYwYdS)NT)exist_ok)r5)ramakedirsrvr"r#rtemp_cwdr5)rrrwork_dirs r run_testszRegrtest.run_testssE DL40000 --^^ 8 8 #HD999 8 8 x77  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 8s5BB+ BB B B BB!$B!c t|j}d}t}t}|rDhd tj} fdtjD}||kr|}d}|r_|r]|jdkr|ddg|js4tj d}|d|} |d | gd}||fS) N> PYTHONPATH_PYTHON_PROJECT_BASE_PYTHON_HOST_PLATFORM_PYTHON_SYSCONFIGDATA_NAMEcNi|]!\}}|dr|v||"S))PYTHON_PYTHONr)rrvaluekeeps r z4Regrtest._add_cross_compile_opts..AsE +e'<==AEeAMrTrz-j2 BUILDPYTHON z--python) r$rpr'r(rarxitemsrVr sysconfigget_config_var) r regrtest_opts keep_environrx cross_compile hostrunner old_environ new_environ buildpythonrprEs @r_add_cross_compile_optsz Regrtest._add_cross_compile_opts+s1DO,, *++ %&&  D *K/1z/?/?/A/AK k))%L  $Z $1$$$$dC[111? $'6}EE *::[:: $$j*%=>>># &&rcDtjjs|ddtjvr|dtjjdkr|d|s(tjjs|ddSdSdS)Nrdefault)z-WrVr.z-bbz-E) rr/ write_throughr warnoptionsrflags bytes_warningignore_environment)r python_optsrNs r_add_ci_python_optszRegrtest._add_ci_python_optsZs z' %   t $ $ $ CO + +   0 1 1 1 9 "Q & &   u % % % )9/ )""4((((( ) ) ) )rc\tjtjt j|} t d|dttdr$tstj |d|dSddl }| ||5} | n~#t$rq | tnQ#|j$rD|| tjt&YnwxYwYnwxYwdddn #1swxYwYtj|jdS#t*$r }t-d|d |Yd}~dSd}~wwxYw) Nz+ Trexecvr)envrz!Failed to change Python options: z Command: )rr/rstderrrrrhasattrrarr_rPopenr@KeyboardInterruptr*TimeoutExpiredkillrrr Exceptionr&)rrrxcmd_textrrexcs r_execute_pythonzRegrtest._execute_pythonos&  :c?? 2 /x// . . . .r7## *J *Q%%%%%"!!!%%cw%77 ;4 ; ,;;;; IIlI;;;;)8;;; IIKKK IIKKKH%9:::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;))))) 2 2 2 1c11&.11 2 2 2 2 2 2 2 2 2 2sA FF:E<CE E C87E 8A EE EE  E E  E FEF"E#F F+ F&&F+cPg}g}||\}}|jr||||s|s|dSttj}|r||dd<|r|||d|||dS)Nrz--dont-add-python-opts) rTrLr]listr orig_argvrrrj)rr\rMrxrNrs rr.zRegrtest._add_python_optss  $ < <] K K < @  $ $[, ? ? ? m '/ F3=!!  #"C!H  & JJ} % % % +,,, S'*****rcHtjd|jrMtj|js)tj|j|_t|j t|j |_ dS)Nbackslashreplace)errors) rr/ reconfigurerhrarbisabsrcrrTr!rv)rs r_initzRegrtest._inits &8999   Grw}}T5H'I'I G"$'//$2E"F"FD )***#DL11 rc |jr|||jr(t |jt jd|jrtdt|j | |\}}d}|j r||n:|jrt!||j|j n|||}t j|dS)NrzPress any key to continue...)rNrf)rMr.rsrCr%rvrrrAinputrrfrr>r=r?r rNr;)rrrrs rmainz Regrtest.mains  $ $  ! ! # # #    T\ * * * HQKKK > 2 0 1 1 1t}%%%//%00%   7 OOH % % % %  ! 7 x#'#3 $  / / / / /~~h66H r)F)rr)&__name__ __module__ __qualname____doc__rr$rrrrmrr staticmethodr=rrrrrrrrrrrr3rr"r%r*r5r;rTr]rjr.rsrvrrr,r,s,c9c99c9c9c9c9c9JC(C(4C(5HW[OA[;\C(C(C(C(J)\H2,8,,,,($H$C$3$4$$$$L 8      D D D ( h    :::x KhKSKTKKKK:::& " " " i    48:98:X_8:8:8:8:8:t8)8HtO88888"-'-'-'^)))*222D+++, 2 2 2(T/rr,Fc ttjddfi|}t|||dS)zRun the Python suite.rN)r.)r)rrargvr,rv)rr.kwargsr-s rrvrvsL SXabb\ , ,V , ,B R"233388u8EEEEEr)NF):rarzrrrrKr test.supportrrrcmdlinerrr r r r:r r6r rrr8rrrrrsetuprrrrrutilsrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r,rvr|rrrsb  AAAAAAAAAA++++++++AAAAAAAAAA 66666666++++++++0000000066666666q q q q q q q q hFFFFFFr