3 ̪e,@sdZddlmZddlZddlZddlZddlZddlZddlZddl Z y ddl Z Wne k rldZ YnXy ddl Z Wne k rdZ YnXddl Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZd ZdZe jpdZe o*eZejj ejj!e"Z#e j$j%Z%d$ddZ&GdddZ'Gddde j(Z)Gddde j*Z+Gddde+Z,d%ddZ-ddZ.dd Z/d!d"Z0e1d#kre0dS)&aAUnit test runner, providing new features on top of unittest module: - colourized output - parallel run (UNIX only) - print failures/tracebacks on CTRL+C - re-run failed tests only (make test-failed). Invocation examples: - make test - make test-failed Parallel: - make test-parallel - make test-process ARGS=--parallel )print_functionN)hilite) print_color)term_supports_colors)super) CI_TESTING)import_module_by_path) print_sysinfo) reap_children) safe_rmpathz.failed-tests.txtFcCsB|dkr|dkrtjntj}tr2t||||dn t||ddS)Nred)boldfile)r)sysstderrstdout USE_COLORSrprint)msgcolorrrr?/usr/local/lib64/python3.6/site-packages/psutil/tests/runner.pycprintBs rc@sXeZdZeZdgZdejkr,ejdddgddZ dd Z d d Z d d Z ddZ dS) TestLoaderztest_memleaks.pyZWHEELHOUSE_UPLOADER_USERNAMEz test_osx.pyz test_linux.pyz test_posix.pycsfddtjjDS)Ncs:g|]2}|jdr|jdr|jkrtjjj|qS)Ztest_z.py) startswithendswith skip_filesospathjointestdir).0x)selfrr Ts  z,TestLoader._get_testmods..)rlistdirr")r%r)r%r _get_testmodsRs zTestLoader._get_testmodsccsVxP|jD]D}t|}x6t|D]*}t||}t|tr t|tjr |Vq Wq WdS)zgIterate over all test files in this directory and return all TestCase classes in them. N) r(rdirgetattr isinstancetype issubclassunittestTestCase)r%r modnameobjrrr_iter_testmod_classes[s   z TestLoader._iter_testmod_classescCs0tj}x"|jD]}t|}|j|qW|S)N)r. TestSuiter3loadTestsFromTestCaseaddTest)r%suiter2testrrrallhs zTestLoader.allc Cs`tj}tjjts|Stt}|jj}WdQRXx"|D]}tj j |}|j |q>W|S)N) r.r4rr isfileFAILED_TESTS_FNAMEopenreadsplitdefaultTestLoaderloadTestsFromNamer6)r%r7fnamesnr8rrr last_failedos    zTestLoader.last_failedcCs.|jdr"tjjtjj|d}tjj|S)Nz.pyr)rrr splitextbasenamer.r?r@)r%r1rrr from_name{s zTestLoader.from_nameN)__name__ __module__ __qualname__HEREr"rrenvironextendr(r3r9rDrGrrrrrKs    rcs<eZdZddZddZddZddZfd d ZZS) ColouredResultcCstjj||tdddS)NZOKgreen)r. TestResult addSuccessr)r%r8rrrrQszColouredResult.addSuccesscCs"tjj|||tdddddS)NERRORrT)r)r.rPaddErrorr)r%r8errrrrrSszColouredResult.addErrorcCstjj|||tdddS)NZFAILr)r.rP addFailurer)r%r8rTrrrrUszColouredResult.addFailurecCs&tjj|||td|jddS)Nz skipped: %sbrown)r.rPaddSkiprstrip)r%r8reasonrrrrWszColouredResult.addSkipcs$t|d|dkd}tj||dS)NrrR)r)rrprintErrorList)r%Zflavourerrors) __class__rrrZszColouredResult.printErrorList) rHrIrJrQrSrUrWrZ __classcell__rr)r\rrNs rNcsfeZdZdZerenejZfddZ fddZ ddZ dd Z fd d Z d d ZddZZS)ColouredTextRunnerzA coloured text runner which also prints failed tests on KeyboardInterrupt and save failed tests in a file so that they can be re-run. cstj||t|_dS)N)r__init__set failed_tnames)r%argskwargs)r\rrr_szColouredTextRunner.__init__cstj|_|jS)N)r _makeResultresult)r%)r\rrrds zColouredTextRunner._makeResultc Cs>|jr:ttd$}x|jD]}|j|dqWWdQRXdS)Nw )rar<r;write)r%rAtnamerrr_write_last_faileds  z%ColouredTextRunner._write_last_failedcCs:|js6x,|j|jD]}|dj}|jj|qWdS)Nr) wasSuccessfulr[failuresidraadd)r%retrirrr _save_results zColouredTextRunner._save_resultc sVytj|}Wn2ttfk rB|jj}|jtjdYnX|j ||SdS)Nr ) rrunKeyboardInterrupt SystemExitrunnerre printErrorsrexitrp)r%r7re)r\rr_runs zColouredTextRunner._runcCsJ|r&tddddtttjdn tdddd|jtjddS) NSUCCESSrOT)rrZFAILEDrr )rr r;rrvrj)r%successrrr_exits zColouredTextRunner._exitcCs|j|}|j|jdS)N)rwrzrk)r%r7rerrrrqs zColouredTextRunner.run)rHrIrJ__doc__rrNr.TextTestResultZ resultclassr_rdrjrprwrzrqr]rr)r\rr^s    r^c@s,eZdZeddZeddZddZdS)ParallelRunnercs0fdd}tj|tj_tjt}tj||S)Ncs||}tj|j|S)N)atexitregisterclose)fdmodekwdsstream) orig_fdopenrrfdopens  z+ParallelRunner._parallelize..fdopen)rrconcurrencytestZfork_for_testsNWORKERSZConcurrentTestSuite)r7rZforkerr)rr _parallelizes   zParallelRunner._parallelizecCstj}tj}xt|D]l}|jdkr(qt|tjrB|jdj}nt|tjrT|}n td|t|ddrx|j |q|j |qW||fS)Nrzcan't recognize type %rZ _serialrunF) r.r4countTestCasesr+Z_testsr\r/ TypeErrorr*r6)r7serialparallelr8Z test_classrrr _split_suites       zParallelRunner._split_suitec CsZ|j|\}}|j|}tdtdddtj}|j|}tj|}tjj}tj |dd\}} | r~td| dt tj}|j|} tj|} |j r|j d kr|j tt|j|j|jf\} } }tt| j| j| jf\}}}ttjd |j| | ||| j|||| f td |j| j|| tf|j oJ| j }|j|dS) Nz(starting parallel tests using %s workersrOT)rr )timeoutzalive processes %srra= +----------+----------+----------+----------+----------+----------+ | | total | failures | errors | skipped | time | +----------+----------+----------+----------+----------+----------+ | parallel | %3s | %3s | %3s | %3s | %.2fs | +----------+----------+----------+----------+----------+----------+ | serial | %3s | %3s | %3s | %3s | %.2fs | +----------+----------+----------+----------+----------+----------+ z&Ran %s tests in %.3fs using %s workers)rrrrtimerwpsutilProcesschildrenZ wait_procsr rkrrumaplenrlr[ZskippedrtextwrapdedentZtestsRunrz)r%r7Z ser_suiteZ par_suiteroparZ par_elapsedZorphansZgonealiveZserZ ser_elapsedZ par_failsZpar_errsZ par_skipsZ ser_failsZser_errsZ ser_skipsokrrrrqsV          zParallelRunner.runN)rHrIrJ staticmethodrrrqrrrrr}s  r}cCsTdd}|rJtjr|dn.tdkr.|dntdkr@|dn ttdSttdS)NcSst|dddS)Nz Running serial tests instead.r)r)rrrrwarn<szget_runner..warnz$Can't run parallel tests on Windows.z(concurrencytest module is not installed.r zOnly 1 CPU available.) verbosity)rWINDOWSrrr} VERBOSITYr^)rrrrr get_runner;s    rcCs*tr ttj|}t}|j|dS)N)rr rrGrrq)r1r7rtrrr run_from_nameLs  rcCstjddS)NT)rZ _set_debugrrrrsetupTsrcCstd}tj|dd}|jddddd|jd ddd d|j\}}|jsVttt}|rt |d kr~|j t j d S|j |d }n|jr|j}n|j}trtt|j}|j|dS) Nz*python3 -m psutil.tests [opts] [test-name]zrun unit tests)usage descriptionz --last-failed store_trueFzonly run last failed tests)actiondefaulthelpz --parallelzrun tests in parallelr r)roptparse OptionParser add_option parse_argsrDr r;rrZ print_usagerrvrGr9rr rrrq)rparseroptsrbloaderr7rtrrrmainXs:     r__main__)FN)F)2r{ __future__rr~rrrrrr.ctypes ImportErrorrrZpsutil._commonrrrZpsutil._compatrZ psutil.testsrrr r r rr; cpu_countrrr abspathdirname__file__rKr?r5rrr|rNZTextTestRunnerr^r}rrrrrHrrrrsV               68l (