՛7҂XddlZddlZddlZddlZddlZddlZddlZddlmZm 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|_&|jN|_'|jNs |jPd}n|jPdkrd}n |jP}||_)|jT|_*|jV|_,|jZ|_-|j\|_.|j^|_/|j`|_1|jd|_2|jfrB|jf\}}}thjjjm|}to||||_8nd|_8|jr|_:|jv|_<|jz|_>|j~|_@t|j|_B|jrt|j|_Dnd|_D|j|_F|j|_H|j|_J|j|_Kdthjvr3thjdr d|_Kthjd|_Mn8|jtjd|_Mn|j|_Md|_P|j|_Rtj|_U|j|_Wd|_Xd|_Yy)NrSOURCE_DATE_EPOCHF )Zintverbosequietpgo 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_argssingle_processuse_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/rYwarmupsrunsfilenames > "{{&(&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)rhrQzCannot find starting test: ).rrdrejoinryropenreadstripOSErrorrRrecompilerSAVEDCWDsplitsearchappendgrouprr7r rVr8r9rsetrQaddr rir indexr IndexErrorrT ValueErrorprintsysexitr}seedr|rzshufflerp) rrfp next_testregexrmatch exclude_testsargalltestsselectedposs r find_testszRegrtest.find_testss   (* T\\<(PD % $33S9R "  1I&KE: ==EJJ89Ebggll9#5#5t}}EF"D::c1-a0D::> NN8 $h''E:9  GFP   3D4F4F3GHI  s_K"K5K!>K/ !K/9!K<'L KK K,+K,/K9< LL 6MMc(|D] }t|yr)r)rnames rr?zRegrtest.list_testssD $Krruntestsc |jdk(r|jsd|_|jj\}}|j |dddd|d}|j j |dt|d}|js4|d}|j||j||j|S|j||j||S) NrrTF)rrFr5r_r\match_tests_dictraz Re-running z failed tests in verbose modez in subprocesses) rYrWr: prepare_reruncopyr< set_testslenr _run_tests_mprun_tests_sequentially)rrrrmsgs r_rerun_failed_testszRegrtest._rerun_failed_testss   q )<)< !D "&,,"<"<">==-#!% h'CJ<'DE""E)*C HHSM   x)9)9 : HHSM  ' ' 1rc|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:) rsr get_stater;rrr:badrrr!display_result)rrrerun_runtestss rrerun_failed_testszRegrtest.rerun_failed_tests s ?? 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+Tflushrrbz : exit code zBisect failed with exit code F) rrcreate_python_cmdextendbisect_cmd_argsrshlexrr subprocessrunrb returncode) rrrrtitlecmdrprocexitcodes r _run_bisectzRegrtest._run_bisect s $  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_bisectFsk<<--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_resultQsW <<    !%,- ##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_test]s^  CCVXI MM#wyM Cx(F$Y9F &&vx8 rc`|jrddl}|jdd}nd}ttj }|j }| t|d}nd}d|d}|jr|d t|jzz }|j||j}t|d D]U\} } tj} |jj!| | |j#| ||} tj D cgc]} | |vr| j%d r| }} |D]U} tj j'| d| j)d \}}} t+tj ||Wt1| }tj| z }|t2k\r|d t|}|jj!| || j5|j6|j8sU|S|Scc} w#t,t.f$rYwxYw)NrFT)rtrrrzRun z! sequentially in a single processz (timeout: %s)r)ztest.test_.z in )rurtTracerrmodulesget_jobsrrbr r iter_testsrrrr<display_progressr startswithpop rpartitiondelattrKeyErrorAttributeErrorstrr must_stopr\r])rrrtr save_modulesjobsrr tests_iter test_indexrrrmodule new_modulesparentrrtext test_times rrzRegrtest.run_tests_sequentiallyls  == [[uD[9FF3;;'   "  $'EEUG<=    #oh6F6F&GG GC  ((* %.z1%= !J **,J KK ( (Y ?]]9h?F14 G f$L8 & 1 12D E" KG& -"("3"3C"84CKK/6 &v;D))+j8I--tOI$>#?@ KK ( (T :0E0EF ;&>: +G!.1sH2HH-,H-c|jj|j}|jr|jd|}|S)Nz then )r:rr]r;)rrs rrzRegrtest.get_statesA &&t'<'<=   ''(ug6E rrYcjddlm}||||j|jj y)Nr) RunWorkers) run_workersrr<r:r)rrrYrs 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_missingsummaryrvzleaks %d)rrrwriterdunlinkr: write_resultsrwrIsystemgetpidrk write_junit)rrrr:s rfinalize_testszRegrtest.finalize_testss  $ $$$$33S9RHHT22T9::9 $334  nn&G  ! !tT+/+<+< " >    IIj299;. /    LL $ $T%8%8 9 :9s DDcNtj|jjz }t |j }t t dt|z|jj|j||j}t d|y)NzTotal duration: %szResult: ) rrr<rboolrPrr r:display_summaryrr)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_r7r8rarbr5r6rgri use_junitrmrorqrsrzr|)rr\r]rPr_r7r8rarbr5r6rgrirkrmrorqrsrzr|)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)&rgrrrstdoutrYr*r>r7r6rrVr%rqrsr|r'rr<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)rdmakedirsryr#r$rtemp_cwdr2)rrrwork_dirs r run_testszRegrtest.run_testssp DLL40 -^ ##HD9 x7 :9 ^ :99 ^^s$BA>+ B>B BBct|j}d}t}t}|rchd}tj }tj j D cic]\}} |jdr||vr|| } }} | |k7r| }d}|rm|rk|jdk(r|js|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!rsr(r)rdr{itemsrrYrWr sysconfigget_config_var) r regrtest_opts keep_environr{ cross_compile hostrunnerkeep old_environrvalue new_environ buildpythonrss r_add_cross_compile_optsz Regrtest._add_cross_compile_opts/sDOO, *+ %& D **K/1zz/?/?/A/A e'<=e /A  k)%L Z1$T-@-@$$dC[1??'66}E *|1[M: $$j*%=># &&/s#"DcZtjjs|jddtjvr|j dtj jdkr|jd|s-tj js|jdyyy)Nrdefault)z-WrQr+z-bbz-E) rr, write_throughr warnoptionsrflags bytes_warningignore_environment)r python_optsrGs 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,rstderrrrrhasattrrdrrZrPopenrBKeyboardInterruptr+TimeoutExpiredkillrrr Exceptionr')rrr{cmd_textrrexcs r_execute_pythonzRegrtest._execute_pythonss7  ::c? 2 Bxj/ .r7#JQ%"%%cw%74 ; 8)-;; IIlI;)88; IIK IIKHH%9:; ;87 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) rOrNrXlistr orig_argvrrre)rrWrFr{rGrs 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, reconfigurerkrdreisabsrfrrVr"ry)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...)rPri)rOr/rnrEr&ryrrrCinputrrirr@r?rAr rPr8)rrrrs rmainz Regrtest.mains  $ $  ! ! #    T\\ * HHQK >> 0 1t}}%//%0%    OOH %  ! ! x#'#3#3 $  /~~h6H r)F)rr)&__name__ __module__ __qualname____doc__rr!rrrrprr staticmethodr?rrrrrrrrrrrr4rrr"r'r2r8rOrXrer/rnrqrrr-r-sv,e99e9e9NF(4F(5HW[OA[;\F(P)H@,8,($H$C$3$4$L 8   D ( h 1f 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-rq)rr/kwargsr.s rrqrqs4 SXXab\ ,V ,B R"2388u8Er)NF)rsr  AA+AA 6+06"t t nFr