B ÔMuÍ^.’ã@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddl m!Z!ddl"m#Z#m$Z$m%Z%m&Z&ddl'm(Z(dZ)Gdd „d ƒZ*d d d „Z+dS) éN)Ú _parse_args)Ú findtestsÚruntestÚget_abs_moduleÚSTDTESTSÚNOTTESTSÚPASSEDÚFAILEDÚ ENV_CHANGEDÚSKIPPEDÚRESOURCE_DENIEDÚ INTERRUPTEDÚ CHILD_ERRORÚTEST_DID_NOT_RUNÚTIMEOUTÚPROGRESS_MIN_TIMEÚformat_test_resultÚ is_failed)Ú setup_tests)ÚremovepyÚcountÚformat_durationÚ printlist)Úsupportg^@c@sÞeZdZdZdd„Zdd„Zd7dd„Zd8d d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd9d1d2„Zd3d4„Zd5d6„Zd0S):ÚRegrtestalExecute 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, findleaks, 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. cCs’d|_g|_g|_g|_g|_g|_g|_g|_g|_g|_ d|_ d|_ g|_ d|_ t ¡|_d|_d|_d|_d|_d|_d|_d|_d|_dS)NFÚé)ÚnsÚtestsÚselectedÚgoodÚbadÚskippedÚresource_deniedsÚenvironment_changedÚ run_no_testsÚrerunÚ first_resultÚ interruptedÚ test_timesÚtracerÚtimeÚ monotonicÚ start_timeÚ test_countÚtest_count_widthÚnext_single_testÚnext_single_filenameÚ testsuite_xmlÚwin_load_trackerÚtmp_dirÚworker_test_name)Úself©r7ú:/opt/alt/python37/lib64/python3.7/test/libregrtest/main.pyÚ__init__5s. zRegrtest.__init__cCs<t|jƒt|jƒBt|jƒBt|jƒBt|jƒBt|jƒBS)N)Úsetr r!r"r#r$r%)r6r7r7r8Ú get_executed_szRegrtest.get_executedFc CsŒ|j}|j}|ttfkr.|s.|j |j|f¡|tkrD|j |¡n´|t tfkrb|sø|j  |¡n–|t krx|j  |¡n€|t krŽ|j |¡nj|tkr°|j |¡|j |¡nH|tkrÆ|j |¡n2|tkrÖd|_n"|tkrì|j  |¡n td|ƒ‚|r|t tthkr|j  |¡|j}|rˆddlmm}xN|D]F}y|j | |¡¡Wn(|jk r€t|tj d‚YnXq>WdS)NTzinvalid test result: %rr)Úfile)!Ú test_nameÚresultrr r)ÚappendÚ test_timerr r r!r r$r r"r r#rr%r(rÚ ValueErrorÚremoveÚxml_dataÚxml.etree.ElementTreeÚetreeÚ ElementTreer2Z fromstringZ ParseErrorÚprintÚsysÚ __stderr__)r6r>r&r=ÚokrCÚETÚer7r7r8Úaccumulate_resultdsD     zRegrtest.accumulate_resultrcCst| }| ¡}|dk r(d|d›d|›}t ¡|j}tjt|ƒd}|›d|›}|rd|dd…}t|dddS)Nz load avg: z.2fú )ZsecondséÿÿÿÿT)Úflush)Ú getloadavgr+r,r-ÚdatetimeZ timedeltaÚintrG)r6ÚlineÚemptyZload_avgr@r7r7r8Úlogs z Regrtest.logcCsh|jjr dS||j››|j›}t|jƒt|jƒ}|rN|jjsN|›d|›}| d|›d|›¡dS)Nú/ú[z] ) rÚquietr/r.Úlenr!r$ÚpgorV)r6Ú test_indexÚtextrTZfailsr7r7r8Údisplay_progressŸs zRegrtest.display_progressc CsÆttjdd…f|Ž}|jr(gt_|_|j}|dk r\ddlm }||jƒ\}}||_||_ t |j ƒ|j r¦|j \}}}|dksˆ|dkr¦d} t| tjddt d¡|jr¼tj |j¡|_||_dS)Nrr)Úparse_worker_argszwInvalid values for the --huntrleaks/-R parameters. The number of warmups and repetitions must be at least 1 each (1:1).T)r<rPé)rrHÚargvÚxmlpathrZjunit_xml_listr2Ú worker_argsÚtest.libregrtest.runtest_mpr_r5rÚargsÚ huntrleaksrGÚstderrÚexitÚtempdirÚosÚpathÚ expanduserr) r6Úkwargsrrcr_r=ÚwarmupÚ repetitionsÚ_Úmsgr7r7r8Ú parse_argsªs&     zRegrtest.parse_argsc Cs”||_|jjrftj |jd¡|_y0t|jdƒ}|  ¡  ¡}|g|_WdQRXWnt k rdYnX|jj rêg|_t  d¡}ttj tj|jj ¡ƒN}xF|D]>}| dd¡d}|  ¡}| |¡}|dk rž|j | ¡¡qžWWdQRXt|jƒtdd…}t ¡}|jjrLx0|jjD]$} | |kr4| | ¡| | ¡qWg|j_|jjrlt|jjtƒt ƒƒ} nt|jj||ƒ} |jj s |jpš|jjpš| |_!n|j|_!|jjrü|j!dd…|_!y"|  "|j!d¡} | | d|_#Wnt$k rúYnX|jj%rPy|j!d|j! "|jj%¡…=Wn,t&k rNt'd|jj%t(j)dYnX|jj*r|jj+dkrvt, -d ¡|j_+t, .|jj+¡t, /|j!¡dS) NZ pynexttestÚrz\btest_[a-zA-Z0-9_]+\bú#rrz1Couldn't find starting test (%s), using all tests)r<i€–˜)0rrÚsinglerjrkÚjoinr4r1ÚopenÚreadÚstripÚOSErrorZfromfileÚreÚcompilerÚSAVEDCWDÚsplitÚsearchr?ÚgrouprrrÚcopyZexcludererBÚaddZtestdirrÚlistr:rÚindexr0Ú IndexErrorÚstartrArGrHrgÚ randomizeÚ random_seedÚrandomZ randrangeZseedZshuffle) r6rÚfpZ next_testZregexrTÚmatchZstdtestsZnottestsÚargZalltestsÚposr7r7r8Ú find_testsÈsh              zRegrtest.find_testscCsx|jD] }t|ƒqWdS)N)rrG)r6Únamer7r7r8Ú list_tests s zRegrtest.list_testscCs\xV|D]N}t|tjjƒrqt|tjƒr2| |¡qt|tjƒrt |¡rt |  ¡ƒqWdS)N) Ú isinstanceÚunittestÚloaderZ _FailedTestZ TestSuiteÚ _list_casesZTestCaserZ match_testrGÚid)r6ÚsuiteÚtestr7r7r8r”s     zRegrtest._list_casesc Cs¶dt_t |jj|jj¡xX|jD]N}t|j|ƒ}ytj   |¡}|  |¡Wq"tj k rn|j  |¡Yq"Xq"W|j r²ttjdttt|j ƒdƒdtjdt|j tjddS)NF)r<r—zskipped:)rÚverboseZset_match_testsrZ match_testsZ ignore_testsrrr’ZdefaultTestLoaderZloadTestsFromNamer”ZSkipTestr"r?rGrHrgrrZr)r6r=Zabstestr–r7r7r8Ú list_casess    zRegrtest.list_casescCsÆd|j_d|j_d|j_| ¡|_| ¡| d¡|jdd…|_xN|jD]D}| d|›d¡d|j_t |j|ƒ}|j |dd|j t krLPqLW|jrºt tt|jƒdƒdƒt|jƒ| ¡dS) NTFz'Re-running failed tests in verbose modez Re-running z in verbose mode)r&r—z failed again:)rr˜ÚfailfastZverbose3Úget_tests_resultr'rVr!r&rrMr>r rGrrZrÚdisplay_result)r6r=r>r7r7r8Úrerun_failed_tests,s$      zRegrtest.rerun_failed_testscCs|jjr dStƒtd| ¡ƒ|jr0tdƒt|jƒ| ¡}|rhtƒttt |ƒdƒdƒt |ƒ|j r¾|jj s¾tƒ|j s¨|js¨|js¨t |j ƒdkr¨tdddttt |j ƒdƒd ƒ|jjr|jjd d tƒtd ƒx.|jdd …D]\}}td|t|ƒfƒqôW|j rBtƒttt |j ƒdƒdƒt |j ƒ|jrttƒtd tt |jƒdƒ¡ƒt |jƒ|jr¬|jj s¬tƒttt |jƒdƒdƒt |jƒ|jrÜtƒtdtt |jƒdƒƒt |jƒ|jr tƒttt |jƒdƒdƒt |jƒdS)Nz== Tests result: %s ==z(Test suite interrupted by signal SIGINT.r—zomitted:rZAllrN)ÚendzOK.T)Úreversez10 slowest tests:é z- %s: %szfailed:z%{} altered the execution environment:zskipped:z%s:z re-run testz run no tests:)rr[rGr›r(r:rr;rrZrr rYr!r"Z print_slowr)Úsortrr$Úformatr&r%)r6Zomittedr@r—r7r7r8rœFs\      zRegrtest.display_resultcCs|jjr ddl}|jddd|_tj ¡}d}|jjrJ|dt|jjƒ7}|  |¡d}x"t |j dƒD]\}}t   ¡}|}|rŽd||f}| ||¡|jrÌd } ttƒƒ} |jj| tƒ| d | d } nt|j|ƒ} | | ¡| jtkrîPt| ƒ}t   ¡|} | tkrd |t| ƒf}n| jtkr.d}x4tj ¡D]&} | |kr:|  d ¡r:t | ¡q:W|jjrht| |jƒrhPqhW|rŒt|ƒdS)NrFT)ÚtracerzRun tests sequentiallyz (timeout: %s)rz%s -- %szDresult = runtest(self.ns, test_name); self.accumulate_result(result))ÚglobalsÚlocalsr>z%s in %sztest.) rr£ZTracer*rHÚmodulesÚkeysZtimeoutrrVÚ enumeraterr+r,r^Údictr¥Zrunctxr¤rrMr>r rrrÚ startswithrZunloadršrrG)r6r£Z save_modulesrqZ previous_testr\r=r-r]Úcmdrr>r@Úmoduler7r7r8Úrun_tests_sequentialsJ            zRegrtest.run_tests_sequentialccs:x4x.|D]&}|V|jrdS|jjr|jrdSqWqWdS)N)r!rÚfail_env_changedr$)r6rr=r7r7r8Ú _test_forever¸s zRegrtest._test_forevercCsvtdt ¡ftj ¡žŽtdtjdddtjƒtdt ¡ƒt  ¡}|rXtd|ƒtdt   d¡t  ¡fƒdS) Nz==T)Zaliasedz %s-endianz== cwd:z == CPU count:z== encodings: locale=%s, FS=%sF) rGÚplatformZpython_implementationrHÚversionr~Ú byteorderrjÚgetcwdÚ cpu_countÚlocaleZgetpreferredencodingÚgetfilesystemencoding)r6r´r7r7r8Údisplay_headerÁs  zRegrtest.display_headercCs–g}|jr| d¡n@|jjr0|jr0| d¡n&t|j|j|j|j|jfƒsV| d¡|jrf| d¡|st| d¡d  |¡}|j r’d|j |f}|S)NÚFAILUREz ENV CHANGEDz NO TEST RUNr ÚSUCCESSz, z %s then %s) r!r?rr®r$Úanyr r"r(rvr')r6r>r7r7r8r›Îs        zRegrtest.get_tests_resultcCsþ|jjs.|jjs6|jjs6|jjs6|js6|jjs6| ¡|jjrh|jj\}}}|dkrhd}t |t j dd|jj r~t d|jj ƒ|jjr¦| t|jƒ¡|_d|_d|_n.t|jƒ|_d t|jƒ¡|_t|jƒd|_|jjròd d lm}||ƒn| ¡dS) NézhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!T)r<rPzUsing random seedrz/{}rr)Úrun_tests_multiprocess)rÚheaderr[rYrurrer·rfrGrHÚstdoutr‡rˆZforeverr¯rƒrr.r/Úiterr¢rZZuse_mprdr¼r­)r6rnrorprqr¼r7r7r8Ú run_testsãs,   zRegrtest.run_testsc Cs¸|jrB|jr6t|jdƒ}| |jd¡WdQRXn t |j¡|jrf|j ¡}|jdd|j j dt ƒt   ¡|j}t dt|ƒƒt d| ¡ƒ|j jr´t dt ¡¡dS)NÚwÚ T)Z show_missingZsummaryÚcoverdirzTotal duration: %szTests result: %szleaks %d)r1r0rwÚwriterjÚunlinkr*ZresultsZ write_resultsrrÃrGr+r,r-rr›ZrunleaksÚsystemÚgetpid)r6rŠrsZdurationr7r7r8Úfinalizes   zRegrtest.finalizec Cs |jjs|jsdSddlmm}| d¡}ddddœ}x\|jD]R}| |¡xB|D]:}y ||t|  |d¡ƒ7<WqVt k rŽYqVXqVWqBWx$|  ¡D]\}}|  |t |ƒ¡q¢Wtj tj|jj¡}t|dƒ$}x| |¡D]} | | ¡qêWWdQRXdS)NrZ testsuites)rÚerrorsZfailuresÚwb)rrbr2rDrErFZElementr?rSÚgetrAÚitemsr:Ústrrjrkrvrr}rwZ tostringlistrÄ) r6rKÚrootZtotalsr–ÚkÚvrbÚfÚsr7r7r8Úsave_xml_results$       zRegrtest.save_xml_resultcCst|jjr|jj|_|js`t ¡rVt d¡|_|jdkrBt d¡|_tj |jd¡|_n t   ¡|_tj  |j¡|_dS)NZ abs_builddirZsrcdirZbuild) rrir4Ú sysconfigZis_python_buildZget_config_varrjrkrvÚtempfileZ gettempdirÚabspath)r6r7r7r8Ú set_temp_dir1s     zRegrtest.set_temp_dircCsLtj|jddt ¡}|jdk r.d |¡}n d |¡}tj |j|¡}|S)NT)Úexist_okztest_python_worker_{}ztest_python_{})rjÚmakedirsr4rÇr5r¢rkrv)r6ÚpidÚtest_cwdr7r7r8Úcreate_temp_dirGs   zRegrtest.create_temp_dircCsxddl}tj |jd¡}td|jƒxL| |¡D]>}tj |¡rZtd|ƒt |¡q2td|ƒt  |¡q2WdS)Nrz test_python_*zCleanup %s directoryzRemove directory: %szRemove file: %s) Úglobrjrkrvr4rGÚisdirrZrmtreerÅ)r6rÝrkrr7r7r8ÚcleanupUs    zRegrtest.cleanupNc Ks¨| |¡| ¡|jjr,| ¡t d¡| ¡}y2tj|dd||j_ |  ||¡WdQRXWn<t k r¢}zt j tddt |j¡Wdd}~XYnXdS)NrT)rY)rh)rrr×rrßrHrhrÜrZtemp_cwdriÚ_mainÚ SystemExitÚ faulthandlerZdump_traceback_laterÚ EXIT_TIMEOUTÚcode)r6rrmrÛÚexcr7r7r8Úmainbs  z Regrtest.maincCs.|jdk r|j ¡Sttdƒr*t ¡dSdS)NrQr)r3rQÚhasattrrj)r6r7r7r8rQ€s     zRegrtest.getloadavgc Cs|jdk r$ddlm}||j|jƒ|jjr4tdƒ|jjt_t |jƒ|  |¡|jj rl|  ¡t   d¡|jjr†| ¡t   d¡t jdkrä|jdkräddlm}y |ƒ|_Wn0tk râ}ztd|›ƒWdd}~XYnXz.| ¡| ¡|jjr|jr| ¡Wd|jdk r0|j ¡d|_X| ¡| ¡|jrTt   d¡|jrft   d¡|jjr‚|jr‚t   d ¡t   d¡dS) Nr)Úrun_tests_workerzPress any key to continue...Zwin32)ÚWindowsLoadTrackerz%Failed to create WindowsLoadTracker: r`é‚r») r5rdrèrÚwaitÚinputr[rZPGOrrŽrrHrhr™r°Ztest.libregrtest.win_utilsrér3ÚFileNotFoundErrorrGrÀrœZverbose2r!rÚcloserÈrÓr(r®r$)r6rrmrèréÚerrorr7r7r8rà‰sJ                zRegrtest._main)F)r)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r9r;rMrVr^rrrŽrr”r™rrœr­r¯r·r›rÀrÈrÓr×rÜrßrærQràr7r7r7r8rs4* )  E ;7     rcKstƒjfd|i|—ŽdS)zRun the Python suite.rN)rræ)rrmr7r7r8ræÃsræ)N),rRrârµrjr°r‰r{rHrÔrÕr+r’Ztest.libregrtest.cmdlinerZtest.libregrtest.runtestrrrrrrr r r r r rrrrrrZtest.libregrtest.setuprZtest.libregrtest.utilsrrrrr—rrãrrær7r7r7r8Ús0 L  *