U |f,@sdZddlmZddlZddlZddlZddlZddlZddlZddl Z z ddl Z Wne k rldZ YnXz ddl Z Wne k rdZ YnXddl Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZd ZdZe pdZe o*eZej ej!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)msgcolorrrrF/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/runner.pycprintBs rc@sXeZdZeZdgZdejkr,edddgddZ dd Z d d Z d d Z ddZ dS) TestLoaderztest_memleaks.pyZWHEELHOUSE_UPLOADER_USERNAMEz test_osx.pyz test_linux.pyz test_posix.pycsfddtjDS)Ncs:g|]2}|dr|dr|jkrtjj|qS)Ztest_.py) startswithendswith skip_filesospathjointestdir).0xselfrr Ss    z,TestLoader._get_testmods..)r listdirr#r&rr&r _get_testmodsRs  zTestLoader._get_testmodsccsN|D]@}t|}t|D]*}t||}t|trt|tjr|VqqdS)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_classescCs,t}|D]}t|}||q|SN)r0 TestSuiter5loadTestsFromTestCaseaddTest)r'suiter4testrrrallhs   zTestLoader.allc Cs\t}tjts|Stt}|}W5QRX|D]}tj |}| |q<|Sr6) r0r7r r!isfileFAILED_TESTS_FNAMEopenreadsplitdefaultTestLoaderloadTestsFromNamer9)r'r:fnamesnr;rrr last_failedos    zTestLoader.last_failedcCs.|dr"tjtj|d}tj|S)Nrr)rr r!splitextbasenamer0rBrC)r'r3rrr from_name{s zTestLoader.from_nameN)__name__ __module__ __qualname__HEREr#rr environextendr*r5r<rGrJrrrrrKs    rcs<eZdZddZddZddZddZfd d ZZS) ColouredResultcCstj||tdddS)NOKgreen)r0 TestResult addSuccessr)r'r;rrrrUszColouredResult.addSuccesscCs"tj|||tdddddS)NERRORrTr)r0rTaddErrorrr'r;errrrrrXszColouredResult.addErrorcCstj|||tdddS)NFAILr)r0rT addFailurerrYrrrr\szColouredResult.addFailurecCs&tj|||td|ddS)Nz skipped: %sZbrown)r0rTaddSkiprstrip)r'r;reasonrrrr]szColouredResult.addSkipcs$t|d|dkd}t||dS)NrrVrW)rrprintErrorList)r'flavourerrors __class__rrr`szColouredResult.printErrorList) rKrLrMrUrXr\r]r` __classcell__rrrcrrQs rQcsfeZdZdZerenejZfddZ 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|_dSr6)r__init__set failed_tnames)r'argskwargsrcrrrgszColouredTextRunner.__init__cst|_|jSr6)r _makeResultresultr&rcrrrls zColouredTextRunner._makeResultc Cs:|jr6ttd }|jD]}||dqW5QRXdS)Nw )rir?r>write)r'rDtnamerrr_write_last_faileds  z%ColouredTextRunner._write_last_failedcCs6|s2|j|jD]}|d}|j|qdS)Nr) wasSuccessfulrbfailuresidriadd)r'rmtrqrrr _save_results zColouredTextRunner._save_resultc sVzt|}Wn2ttfk rB|jj}|tdYnX| ||SdS)Nr ) rrunKeyboardInterrupt SystemExitrunnerrm printErrorsrexitrxr'r:rmrcrr_runs zColouredTextRunner._runcCsJ|r&tddddtttdn tdddd|tddS) NSUCCESSrSTrWrZFAILEDrr )rr r>rr~rr)r'successrrr_exits zColouredTextRunner._exitcCs||}||dSr6)rrrsrrrrrys zColouredTextRunner.run)rKrLrM__doc__rrQr0TextTestResultZ resultclassrgrlrrrxrrryrerrrcrrfs    rfc@s,eZdZeddZeddZddZdS)ParallelRunnercs0fdd}tj|tj_tt}t||S)Ncs||}t|j|Sr6)atexitregisterclose)fdmodekwdsstreamZ orig_fdopenrrfdopens  z+ParallelRunner._parallelize..fdopen)r rconcurrencytestZfork_for_testsNWORKERSZConcurrentTestSuite)r:rZforkerrrr _parallelizes   zParallelRunner._parallelizecCst}t}|D]l}|dkr&qt|tjr@|jdj}nt|tjrR|}n td|t|ddrv| |q| |q||fS)Nrzcan't recognize type %rZ _serialrunF) r0r7countTestCasesr-Z_testsrdr1 TypeErrorr,r9)r:serialparallelr;Z test_classrrr _split_suites       zParallelRunner._split_suitecCsX||\}}||}tdtdddt}||}t|}t}tj |dd\}} | r~td| dt t}||} t|} | s| d kr| tt|j|j|jf\} } }tt| j| j| jf\}}}ttd |j| | ||| j|||| f td |j| j|| tf| oH| }||dS) Nz(starting parallel tests using %s workersrSTrWr )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)rrrrtimerpsutilProcesschildrenZ wait_procsr rsrr}maplenrtrbZskippedrtextwrapdedentZtestsRunr)r'r:Z ser_suiteZ par_suiterwparZ par_elapsedZorphansZ_gonealiveZserZ ser_elapsedZ par_failsZpar_errsZ par_skipsZ ser_failsZser_errsZ ser_skipsokrrrrysn          zParallelRunner.runN)rKrLrM staticmethodrrryrrrrrs   rcCsTdd}|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 VERBOSITYrf)rrrrr get_runner;s    rcCs*tr tt|}t}||dSr6)rr rrJrry)r3r:r|rrr run_from_nameLs  rcCstddS)NT)rZ _set_debugrrrrsetupTsrcCstd}tj|dd}|jddddd|jd ddd d|\}}|jsVttt}|rt |d kr~| t d S| |d }n|jr|}n|}trtt|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_argsrGr r>rr print_usagerr~rJr<rr rrry)rparseroptsrjloaderr:r|rrrmainXs>     r__main__)FN)F)2r __future__rrrr rrrr0ctypes ImportErrorrrZpsutil._commonrrrZpsutil._compatrZ psutil.testsrrr r r rr> cpu_countrrr!abspathdirname__file__rNrBr8rrrrQZTextTestRunnerrfrrrrrrKrrrrsX               68l (