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 pdZe oe 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re0  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)msgZ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.pyZ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 )Z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)r/   	TestSuiter4   loadTestsFromTestCaseaddTest)r&   suiter3   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 )NZrt)r/   r6   r   r    isfileFAILED_TESTS_FNAMEopenreadsplitdefaultTestLoaderloadTestsFromNamer8   )r&   r9   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basenamer/   rA   rB   )r&   r2   r   r   r   	from_namev   s   
zTestLoader.from_nameN)__name__
__module____qualname__HEREr"   r   r   environextendr)   r4   r;   rF   rI   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&   r:   r   r   r   rS   ~   s   zColouredResult.addSuccessc                 C   s"   t j| || tdddd d S )NERRORr   Tr   )r/   rR   addErrorr   r&   r:   errr   r   r   rV      s   zColouredResult.addErrorc                 C   s   t j| || tdd d S )NZFAILr   )r/   rR   
addFailurer   rW   r   r   r   rY      s   zColouredResult.addFailurec                 C   s&   t j| || td|  d d S )Nzskipped: %sZbrown)r/   rR   addSkipr   strip)r&   r:   reasonr   r   r   rZ      s   zColouredResult.addSkipc                    s$   t |d|dkd}t || d S )Nr   rT   rU   )r   r   printErrorList)r&   Zflavourerrors	__class__r   r   r]      s   zColouredResult.printErrorList)	rJ   rK   rL   rS   rV   rY   rZ   r]   __classcell__r   r   r_   r   rP   |   s    rP   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 r5   )r   __init__setfailed_tnames)r&   argskwargsr_   r   r   rc      s   zColouredTextRunner.__init__c                    s   t   | _| jS r5   )r   _makeResultresultr%   r_   r   r   rh      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 )NZwt
)re   r>   r=   write)r&   rC   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   )wasSuccessfulr^   failuresidre   add)r&   ri   trl   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runnerri   printErrorsr   exitrs   r&   r9   ri   r_   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SUCCESSrQ   TrU   r   ZFAILEDr   r   )r   r   r=   r   ry   rm   )r&   Zsuccessr   r   r   _exit   s   zColouredTextRunner._exitc                 C   s   |  |}| |  d S r5   )r{   r}   rn   rz   r   r   r   rt      s   
zColouredTextRunner.run)rJ   rK   rL   __doc__r   rP   r/   TextTestResultZresultclassrc   rh   rm   rs   r{   r}   rt   ra   r   r   r_   r   rb      s    
rb   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 r5   )atexitregisterclose)fdmodekwdsstreamZorig_fdopenr   r   fdopen   s   
z+ParallelRunner._parallelize.<locals>.fdopen)r   r   concurrencytestZfork_for_testsNWORKERSZConcurrentTestSuite)r9   r   Z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 %rZ
_serialrunF)
r/   r6   countTestCasesr,   Z_testsr`   r0   	TypeErrorr+   r8   )r9   serialparallelr:   Z
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 workersrQ   TrU   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   timer{   psutilZProcesschildrenZ
wait_procsr
   rn   r   rx   maplenro   r^   Zskippedr   textwrapdedentZtestsRunr}   )r&   r9   Z	ser_suiteZ	par_suiterr   ZparZpar_elapsedZorphansZgoneZaliveZserZser_elapsedZ	par_failsZpar_errsZ	par_skipsZ	ser_failsZser_errsZ	ser_skipsokr   r   r   rt      sH   



zParallelRunner.runN)rJ   rK   rL   staticmethodr   r   rt   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   ZWINDOWSr   r   r   	VERBOSITYrb   )r   r   r   r   r   
get_runner  s   




r   c                 C   s*   t rt  t | }t }|| d S r5   )r   r	   r   rI   r   rt   )r2   r9   rw   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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   optparseZOptionParserZ
add_option
parse_argsrF   r   r=   r   r   print_usager   ry   rI   r;   r   r	   r   r   rt   )r   parserZoptsrf   loaderr9   rw   r   r   r   main;  s6   


r   __main__)FN)F)2r~   Z
__future__r   r   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__rM   rA   r7   r   r   r   rP   ZTextTestRunnerrb   r   r   r   r   r   rJ   r   r   r   r   <module>   s^   
	27
U"
