B
    "„OcÄ+  ã               @   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	yddl
Z
W n ek
rl   dZ
Y nX yddlZW n ek
r’   dZY nX 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 )&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   sB   |d kr|dkrt jnt j}tr2t| |||d nt| |d d S )NÚred)ÚboldÚfile)r   )ÚsysÚstderrÚstdoutÚ
USE_COLORSr   Úprint)ÚmsgZcolorr   r   © r   ú2lib/python3.7/site-packages/psutil/tests/runner.pyÚcprintA   s
    r   c               @   sX   e Zd ZeZdgZdejkr,e dddg¡ dd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ ZdS )Ú
TestLoaderztest_memleaks.pyZWHEELHOUSE_UPLOADER_USERNAMEztest_osx.pyztest_linux.pyztest_posix.pyc                s   ‡ fdd„t  ˆ j¡D ƒS )Nc                s:   g | ]2}|  d ¡r| d¡r|ˆ jkrtj ˆ j|¡‘qS )Ztest_z.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   sV   xP|   ¡ D ]D}t|ƒ}x6t|ƒD ]*}t||ƒ}t|tƒr t|tjƒr |V  q W q
W 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   s0   t  ¡ }x"|  ¡ D ]}t|ƒ}| |¡ qW |S )N)r-   Ú	TestSuiter2   ÚloadTestsFromTestCaseÚaddTest)r$   Úsuiter1   Útestr   r   r   Úallc   s
    zTestLoader.allc          	   C   sb   t  ¡ }tj t¡s|S ttdƒ}| ¡  ¡ }W d Q R X x"|D ]}t j	 
|¡}| |¡ q@W |S )NZrt)r-   r3   r   r   ÚisfileÚFAILED_TESTS_FNAMEÚopenÚreadÚsplitÚdefaultTestLoaderÚloadTestsFromNamer5   )r$   r6   ÚfÚnamesÚnr7   r   r   r   Úlast_failedj   s    
zTestLoader.last_failedc             C   s.   |  d¡r"tj tj |¡¡d }tj |¡S )Nz.pyr   )r   r   r   ÚsplitextÚbasenamer-   r>   r?   )r$   r0   r   r   r   Ú	from_namev   s    
zTestLoader.from_nameN)Ú__name__Ú
__module__Ú__qualname__ÚHEREr!   r   r   ÚenvironÚextendr'   r2   r8   rC   rF   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 )NZOKÚgreen)r-   Ú
TestResultÚ
addSuccessr   )r$   r7   r   r   r   rP   ~   s    zColouredResult.addSuccessc             C   s"   t j | ||¡ tdddd d S )NÚERRORr   T)r   )r-   rO   ÚaddErrorr   )r$   r7   Úerrr   r   r   rR   ‚   s    zColouredResult.addErrorc             C   s   t j | ||¡ tddƒ d S )NZFAILr   )r-   rO   Ú
addFailurer   )r$   r7   rS   r   r   r   rT   †   s    zColouredResult.addFailurec             C   s&   t j | ||¡ td| ¡  dƒ d S )Nzskipped: %sZbrown)r-   rO   ÚaddSkipr   Ústrip)r$   r7   Úreasonr   r   r   rU   Š   s    zColouredResult.addSkipc                s$   t |d|dkd}tƒ  ||¡ d S )Nr   rQ   )r   )r   r   ÚprintErrorList)r$   ZflavourÚerrors)Ú	__class__r   r   rX   Ž   s    zColouredResult.printErrorList)	rG   rH   rI   rP   rR   rT   rU   rX   Ú__classcell__r   r   )rZ   r   rM   |   s
   rM   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||Ž tƒ | _d S )N)r   Ú__init__ÚsetÚfailed_tnames)r$   ÚargsÚkwargs)rZ   r   r   r]   š   s    zColouredTextRunner.__init__c                s   t ƒ  ¡ | _| jS )N)r   Ú_makeResultÚresult)r$   )rZ   r   r   rb   ž   s    zColouredTextRunner._makeResultc          	   C   s>   | j r:ttdƒ$}x| j D ]}| |d ¡ qW W d Q R X d S )NZwtÚ
)r_   r;   r:   Úwrite)r$   r@   Útnamer   r   r   Ú_write_last_failed¤   s    z%ColouredTextRunner._write_last_failedc             C   s:   |  ¡ s6x,|j|j D ]}|d  ¡ }| j |¡ qW d S )Nr   )ÚwasSuccessfulrY   ÚfailuresÚidr_   Úadd)r$   rc   Útrf   r   r   r   Ú_save_resultª   s    zColouredTextRunner._save_resultc          	      sV   yt ƒ  |¡}W n2 ttfk
rB   | jj}| ¡  t d¡‚Y nX |  	|¡ |S d S )Nr   )
r   ÚrunÚKeyboardInterruptÚ
SystemExitÚrunnerrc   ÚprintErrorsr   Úexitrm   )r$   r6   rc   )rZ   r   r   Ú_run°   s    
zColouredTextRunner._runc             C   sJ   |r&t dddd ttƒ t d¡ n t dddd |  ¡  t d¡ d S )	NÚSUCCESSrN   T)r   r   ZFAILEDr   r   )r   r   r:   r   rs   rg   )r$   Zsuccessr   r   r   Ú_exit»   s    zColouredTextRunner._exitc             C   s   |   |¡}|  | ¡ ¡ d S )N)rt   rv   rh   )r$   r6   rc   r   r   r   rn   Å   s    
zColouredTextRunner.run)rG   rH   rI   Ú__doc__r   rM   r-   ÚTextTestResultZresultclassr]   rb   rg   rm   rt   rv   rn   r[   r   r   )rZ   r   r\   “   s   
r\   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 )N)ÚatexitÚregisterÚclose)ÚfdÚmodeÚkwdsÚstream)Úorig_fdopenr   r   ÚfdopenÎ   s    
z+ParallelRunner._parallelize.<locals>.fdopen)r   r‚   ÚconcurrencytestZfork_for_testsÚNWORKERSZConcurrentTestSuite)r6   r‚   Zforkerr   )r   r   Ú_parallelizeÌ   s
    
zParallelRunner._parallelizec             C   s   t  ¡ }t  ¡ }xv| D ]n}| ¡ dkr*qn8t|t jƒrD|jd j}nt|t jƒrV|}ntd| ƒ‚t|ddƒrz| 	|¡ q| 	|¡ qW ||fS )Nr   zcan't recognize type %rZ
_serialrunF)
r-   r3   ÚcountTestCasesr*   Z_testsrZ   r.   Ú	TypeErrorr)   r5   )r6   ÚserialÚparallelr7   Z
test_classr   r   r   Ú_split_suiteÚ   s    
zParallelRunner._split_suitec             C   sX  |   |¡\}}|  |¡}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 ƒ | ¡ oH|
 ¡ }|  |¡ d S )Nz(starting parallel tests using %s workersrN   T)r   r   )Z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„   Útimert   ÚpsutilZProcessZchildrenZ
wait_procsr
   rh   r†   rr   ÚmapÚlenri   rY   Zskippedr   ÚtextwrapÚdedentZtestsRunrv   )r$   r6   Z	ser_suiteZ	par_suiterl   ZparZpar_elapsedZorphansZgoneÚaliveZserZser_elapsedZ	par_failsZpar_errsZ	par_skipsZ	ser_failsZser_errsZ	ser_skipsÚokr   r   r   rn   î   s<    



zParallelRunner.runN)rG   rH   rI   Ústaticmethodr…   rŠ   rn   r   r   r   r   ry   Ê   s   ry   c             C   sT   dd„ }| rJt jr|dƒ n.td k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Œ   ZWINDOWSrƒ   r„   ry   Ú	VERBOSITYr\   )r‰   r”   r   r   r   Ú
get_runner  s    



r—   c             C   s*   t r
tƒ  tƒ  | ¡}tƒ }| |¡ d S )N)r   r	   r   rF   r—   rn   )r0   r6   rq   r   r   r   Úrun_from_name/  s
    r˜   c               C   s   t  d¡ d S )NT)rŒ   Z
_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sVttƒ tƒ }|rŽt	|ƒdkr~| 
¡  t d¡S | |d ¡}n|jrž| ¡ }n| ¡ }tr°tƒ  t|jƒ}| |¡ d S )Nz*python3 -m psutil.tests [opts] [test-name]zrun unit tests)ÚusageZdescriptionz--last-failedÚ
store_trueFzonly run last failed tests)ÚactionÚdefaultÚhelpz
--parallelzrun tests in parallelr   r   )r™   ÚoptparseZOptionParserZ
add_optionÚ
parse_argsrC   r   r:   r   rŽ   Zprint_usager   rs   rF   r8   r   r	   r—   r‰   rn   )rš   ÚparserZoptsr`   Úloaderr6   rq   r   r   r   Úmain;  s2    


r£   Ú__main__)FN)F)2rw   Z
__future__r   rz   rŸ   r   r   r   r‹   r-   ZctypesÚImportErrorrƒ   rŒ   Zpsutil._commonr   r   r   Zpsutil._compatr   Zpsutil.testsr   r   r	   r
   r   r–   r:   Ú	cpu_countr„   r   r   ÚabspathÚdirnameÚ__file__rJ   r>   r4   r   r   rx   rM   ZTextTestRunnerr\   ry   r—   r˜   r™   r£   rG   r   r   r   r   Ú<module>   sV   


	27U
"
