o
    ˆ¶¹aÄ+  ã                   @   sÄ  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	zddl
Z
W n ey5   dZ
Y nw zddlZW n eyG   dZY nw ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ dZdZe ¡ p‹dZe o‘eƒ Zej  ej !e"¡¡Z#e	j$j%Z%d$dd„Z&G dd„ dƒZ'G dd„ de	j(ƒZ)G dd„ de	j*ƒZ+G dd„ de+ƒZ,d%dd„Z-dd„ Z.dd „ Z/d!d"„ Z0e1d#kràe0ƒ  dS dS )&aA  
Unit 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_rmpathé   z.failed-tests.txté   Fc                 C   sD   |d u r|dkrt jnt j}trt| |||d� d S t| |d� d S )NÚred)ÚboldÚfile)r   )ÚsysÚstderrÚstdoutÚ
USE_COLORSr   Úprint)ÚmsgÚcolorr   r   © r   ú5/usr/lib/python3/dist-packages/psutil/tests/runner.pyÚcprintA   s
   r   c                   @   sV   e Zd ZeZdgZdejv re g d¢¡ dd„ Z	dd„ Z
dd	„ Zd
d„ Zdd„ ZdS )Ú
TestLoaderztest_memleaks.pyÚWHEELHOUSE_UPLOADER_USERNAME)ztest_osx.pyztest_linux.pyztest_posix.pyc                    s   ‡ fdd„t  ˆ j¡D ƒS )Nc                    s:   g | ]}|  d ¡r| d¡r|ˆ jvrtj ˆ j|¡‘qS )Útest_ú.py)Ú
startswithÚendswithÚ
skip_filesÚosÚpathÚjoinÚtestdir)Ú.0Úx©Úselfr   r   Ú
<listcomp>R   s    þþ
ýz,TestLoader._get_testmods.<locals>.<listcomp>)r"   Úlistdirr%   r(   r   r(   r   Ú_get_testmodsQ   s   

ÿzTestLoader._get_testmodsc                 c   sP   � |   ¡ D ] }t|ƒ}t|ƒD ]}t||ƒ}t|tƒr$t|tjƒr$|V  qqdS )zgIterate over all test files in this directory and return
        all TestCase classes in them.
        N)	r,   r   ÚdirÚgetattrÚ
isinstanceÚtypeÚ
issubclassÚunittestÚTestCase)r)   r#   ÚmodÚnameÚobjr   r   r   Ú_iter_testmod_classesW   s   €


ÿ€üþz TestLoader._iter_testmod_classesc                 C   s,   t  ¡ }|  ¡ D ]}t|ƒ}| |¡ q|S ©N)r2   Ú	TestSuiter7   ÚloadTestsFromTestCaseÚaddTest)r)   Úsuiter6   Útestr   r   r   Úallc   s
   zTestLoader.allc                 C   sr   t  ¡ }tj t¡s|S ttdƒ�}| ¡  ¡ }W d   ƒ n1 s"w   Y  |D ]}t j	 
|¡}| |¡ q)|S )NÚrt)r2   r9   r"   r#   ÚisfileÚFAILED_TESTS_FNAMEÚopenÚreadÚsplitÚdefaultTestLoaderÚloadTestsFromNamer;   )r)   r<   ÚfÚnamesÚnr=   r   r   r   Úlast_failedj   s   ÿzTestLoader.last_failedc                 C   s.   |  d¡rtj tj |¡¡d }tj |¡S )Nr   r   )r    r"   r#   ÚsplitextÚbasenamer2   rE   rF   )r)   r5   r   r   r   Ú	from_namev   s   
zTestLoader.from_nameN)Ú__name__Ú
__module__Ú__qualname__ÚHEREr%   r!   r"   ÚenvironÚextendr,   r7   r>   rJ   rM   r   r   r   r   r   J   s    
r   c                       s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fd	d
„Z‡  ZS )ÚColouredResultc                 C   s   t j | |¡ tddƒ d S )NÚOKÚgreen)r2   Ú
TestResultÚ
addSuccessr   )r)   r=   r   r   r   rX   ~   s   zColouredResult.addSuccessc                 C   s"   t j | ||¡ tdddd� d S )NÚERRORr   T©r   )r2   rW   ÚaddErrorr   ©r)   r=   Úerrr   r   r   r[   ‚   s   zColouredResult.addErrorc                 C   s   t j | ||¡ tddƒ d S )NÚFAILr   )r2   rW   Ú
addFailurer   r\   r   r   r   r_   †   s   zColouredResult.addFailurec                 C   s&   t j | ||¡ td| ¡  dƒ d S )Nzskipped: %sÚbrown)r2   rW   ÚaddSkipr   Ústrip)r)   r=   Úreasonr   r   r   ra   Š   s   zColouredResult.addSkipc                    s$   t |d|dkd�}tƒ  ||¡ d S )Nr   rY   rZ   )r   r   ÚprintErrorList)r)   ÚflavourÚerrors©Ú	__class__r   r   rd   Ž   s   zColouredResult.printErrorList)	rN   rO   rP   rX   r[   r_   ra   rd   Ú__classcell__r   r   rg   r   rT   |   s    rT   c                       sf   e Zd ZdZer
enejZ‡ fdd„Z	‡ fdd„Z
dd„ Zdd	„ Z‡ fd
d„Zdd„ Zdd„ Z‡  ZS )ÚColouredTextRunnerz”
    A coloured text runner which also prints failed tests on KeyboardInterrupt
    and save failed tests in a file so that they can be re-run.
    c                    s   t ƒ j|i |¤Ž tƒ | _d S r8   )r   Ú__init__ÚsetÚfailed_tnames)r)   ÚargsÚkwargsrg   r   r   rk   š   s   zColouredTextRunner.__init__c                    s   t ƒ  ¡ | _| jS r8   )r   Ú_makeResultÚresultr(   rg   r   r   rp   ž   s   zColouredTextRunner._makeResultc                 C   sT   | j r(ttdƒ�}| j D ]	}| |d ¡ qW d   ƒ d S 1 s!w   Y  d S d S )NÚwtÚ
)rm   rB   rA   Úwrite)r)   rG   Útnamer   r   r   Ú_write_last_failed¤   s   
ÿ"ÿÿz%ColouredTextRunner._write_last_failedc                 C   s:   |  ¡ s|j|j D ]}|d  ¡ }| j |¡ q
d S d S )Nr   )ÚwasSuccessfulrf   ÚfailuresÚidrm   Úadd)r)   rq   Útru   r   r   r   Ú_save_resultª   s   ýzColouredTextRunner._save_resultc              	      sL   zt ƒ  |¡}W n ttfy   | jj}| ¡  t d¡‚w |  	|¡ |S )Nr   )
r   ÚrunÚKeyboardInterruptÚ
SystemExitÚrunnerrq   ÚprintErrorsr   Úexitr|   ©r)   r<   rq   rg   r   r   Ú_run°   s   
ý
zColouredTextRunner._runc                 C   sL   |rt dddd� ttƒ t d¡ d S t dddd� |  ¡  t d¡ d S )	NÚSUCCESSrV   TrZ   r   ÚFAILEDr   r   )r   r   rA   r   r‚   rv   )r)   Úsuccessr   r   r   Ú_exit»   s   zColouredTextRunner._exitc                 C   s   |   |¡}|  | ¡ ¡ d S r8   )r„   rˆ   rw   rƒ   r   r   r   r}   Å   s   
zColouredTextRunner.run)rN   rO   rP   Ú__doc__r   rT   r2   ÚTextTestResultÚresultclassrk   rp   rv   r|   r„   rˆ   r}   ri   r   r   rg   r   rj   “   s    
rj   c                   @   s,   e Zd Zedd„ ƒZedd„ ƒZdd„ ZdS )ÚParallelRunnerc                    s0   ‡ fdd„}t j‰ |tj _t t¡}t | |¡S )Nc                    s   ˆ | |ƒ}t  |j¡ |S r8   )ÚatexitÚregisterÚclose)ÚfdÚmodeÚkwdsÚstream©Úorig_fdopenr   r   ÚfdopenÎ   s   
z+ParallelRunner._parallelize.<locals>.fdopen)r"   r–   ÚconcurrencytestÚfork_for_testsÚNWORKERSÚConcurrentTestSuite)r<   r–   Úforkerr   r”   r   Ú_parallelizeÌ   s
   
zParallelRunner._parallelizec                 C   sŠ   t  ¡ }t  ¡ }| D ]6}| ¡ dkrq
t|t jƒr |jd j}nt|t jƒr)|}ntd| ƒ‚t|ddƒr;| 	|¡ q
| 	|¡ q
||fS )Nr   zcan't recognize type %rÚ
_serialrunF)
r2   r9   ÚcountTestCasesr/   Ú_testsrh   r3   Ú	TypeErrorr.   r;   )r<   ÚserialÚparallelr=   Ú
test_classr   r   r   Ú_split_suiteÚ   s   zParallelRunner._split_suitec                 C   sV  |   |¡\}}|  |¡}tdt ddd� t ¡ }|  |¡}t ¡ | }t ¡  ¡ }tj	|dd�\}}	|	r?td|	 dƒ t
ƒ  t ¡ }|  |¡}
t ¡ | }| ¡ s\| ¡ d	kr\| ¡  tt|j|j|jfƒ\}}}tt|
j|
j|
jfƒ\}}}tt d
|j|||||
j||||f
 ¡ƒ td|j|
j || tf ƒ | ¡ o£|
 ¡ }|  |¡ d S )Nz(starting parallel tests using %s workersrV   TrZ   r   )Útimeoutzalive processes %sr   r   a=  
            +----------+----------+----------+----------+----------+----------+
            |          |    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)r¤   rœ   r   r™   Útimer„   ÚpsutilÚProcessÚchildrenÚ
wait_procsr
   rw   rž   r�   ÚmapÚlenrx   rf   Úskippedr   ÚtextwrapÚdedentÚtestsRunrˆ   )r)   r<   Ú	ser_suiteÚ	par_suiter{   ÚparÚpar_elapsedÚorphansÚgoneÚaliveÚserÚser_elapsedÚ	par_failsÚpar_errsÚ	par_skipsÚ	ser_failsÚser_errsÚ	ser_skipsÚokr   r   r   r}   î   sH   
ÿ

þþÿø
ÿzParallelRunner.runN)rN   rO   rP   Ústaticmethodrœ   r¤   r}   r   r   r   r   rŒ   Ê   s    

rŒ   c                 C   sT   dd„ }| r%t jr|dƒ ntd u r|dƒ ntdkr |dƒ nttd�S ttd�S )Nc                 S   s   t | d dƒ d S )Nz Running serial tests instead.r   )r   )r   r   r   r   Úwarn   s   zget_runner.<locals>.warnz$Can't run parallel tests on Windows.z(concurrencytest module is not installed.r   zOnly 1 CPU available.)Ú	verbosity)r§   ÚWINDOWSr—   r™   rŒ   Ú	VERBOSITYrj   )r¢   rÂ   r   r   r   Ú
get_runner  s   




rÆ   c                 C   s*   t rtƒ  tƒ  | ¡}tƒ }| |¡ d S r8   )r   r	   r   rM   rÆ   r}   )r5   r<   r€   r   r   r   Úrun_from_name/  s
   rÇ   c                   C   s   t  d¡ d S )NT)r§   Ú
_set_debugr   r   r   r   Úsetup7  s   rÉ   c                  C   sÈ   t ƒ  d} tj| dd�}|jddddd� |jd	ddd
d� | ¡ \}}|js+ttƒ tƒ }|rGt	|ƒdkr?| 
¡  t d¡S | |d ¡}n|jrO| ¡ }n| ¡ }trXtƒ  t|jƒ}| |¡ d S )Nz*python3 -m psutil.tests [opts] [test-name]zrun unit tests)ÚusageÚdescriptionz--last-failedÚ
store_trueFzonly run last failed tests)ÚactionÚdefaultÚhelpz
--parallelzrun tests in parallelr   r   )rÉ   ÚoptparseÚOptionParserÚ
add_optionÚ
parse_argsrJ   r   rA   r   r¬   Úprint_usager   r‚   rM   r>   r   r	   rÆ   r¢   r}   )rÊ   ÚparserÚoptsrn   Úloaderr<   r€   r   r   r   Úmain;  s6   þþ


rØ   Ú__main__)FN)F)2r‰   Ú
__future__r   r�   rÐ   r"   r   r®   r¦   r2   ÚctypesÚImportErrorr—   r§   Úpsutil._commonr   r   r   Úpsutil._compatr   Úpsutil.testsr   r   r	   r
   r   rÅ   rA   Ú	cpu_countr™   r   r#   ÚabspathÚdirnameÚ__file__rQ   rE   r:   r   r   rŠ   rT   ÚTextTestRunnerrj   rŒ   rÆ   rÇ   rÉ   rØ   rN   r   r   r   r   Ú<module>   s^   ÿÿ
	27
U"
ÿ