
    ɧd+                        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		 ddl
Z
n# e$ r dZ
Y nw xY w	 ddlZn# e$ r dZY nw xY 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j                    pdZe o	 e            Zej                             ej        !                    e"                    Z#e	j$        j%        Z%ddZ& G d d          Z' G d de	j(                  Z) G d de	j*                  Z+ G d de+          Z,d dZ-d Z.d Z/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                     ||dk    rt           j        nt           j        }t          rt	          | |||           d S t          | |           d S )Nred)boldfile)r   )sysstderrstdout
USE_COLORSr   print)msgcolorr   r   s       3lib/python3.11/site-packages/psutil/tests/runner.pycprintr   A   s^     <"e^;szz CT555555c    c                   v    e Zd ZeZdgZdej        v re                    g d           d Z	d Z
d Zd Zd Zd	S )

TestLoaderztest_memleaks.pyWHEELHOUSE_UPLOADER_USERNAME)ztest_osx.pyztest_linux.pyztest_posix.pyc                 N      fdt          j         j                  D             S )Nc                     g | ]Z}|                     d           |                    d          ,|j        v5t          j                            j        |          [S )test_.py)
startswithendswith
skip_filesospathjointestdir).0xselfs     r   
<listcomp>z,TestLoader._get_testmods.<locals>.<listcomp>R   sq     * * *<<((*-.ZZ->->* (*T\1-- * * *r   )r'   listdirr*   )r-   s   `r   _get_testmodszTestLoader._get_testmodsQ   s:    * * * *DL11* * * 	*r   c              #      K   |                                  D ]f}t          |          }t          |          D ]E}t          ||          }t	          |t
                    rt          |t          j                  r|V  FgdS )zgIterate over all test files in this directory and return
        all TestCase classes in them.
        N)	r0   r	   dirgetattr
isinstancetype
issubclassunittestTestCase)r-   r(   modnameobjs        r   _iter_testmod_classesz TestLoader._iter_testmod_classesW   s       &&(( 	 	D'--CC  c4((c4(( "3(9::III		 	r   c                     t          j                    }|                                 D ]&}t          |          }|                    |           '|S N)r7   	TestSuiter<   loadTestsFromTestCaseaddTest)r-   suiter;   tests       r   allzTestLoader.allc   sR    "$$--// 	  	 C(--DMM$r   c                    t          j                    }t          j                            t
                    s|S t          t
          d          5 }|                                                                }d d d            n# 1 swxY w Y   |D ]6}t           j	        
                    |          }|                    |           7|S )Nrt)r7   r?   r'   r(   isfileFAILED_TESTS_FNAMEopenreadsplitdefaultTestLoaderloadTestsFromNamerA   )r-   rB   fnamesnrC   s         r   last_failedzTestLoader.last_failedj   s    "$$w~~011 	L$d++ 	%qFFHHNN$$E	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	  	 A-??BBDMM$s   'BB	Bc                     |                     d          rBt          j                            t          j                            |                    d         }t
          j                            |          S )Nr#   r   )r%   r'   r(   splitextbasenamer7   rL   rM   )r-   r:   s     r   	from_namezTestLoader.from_namev   sW    == 	?7##BG$4$4T$:$:;;A>D);;DAAAr   N)__name__
__module____qualname__HEREr*   r&   r'   environextendr0   r<   rD   rQ   rU    r   r   r   r   J   s        G$%J%3 MKKKLLL* * *
 
 
  
 
 
B B B B Br   r   c                   6     e Zd Zd Zd Zd Zd Z fdZ xZS )ColouredResultc                 f    t           j                            | |           t          dd           d S )NOKgreen)r7   
TestResult
addSuccessr   )r-   rC   s     r   rc   zColouredResult.addSuccess~   s1    &&tT222tWr   c                 l    t           j                            | ||           t          ddd           d S )NERRORr   Tr   )r7   rb   addErrorr   r-   rC   errs      r   rg   zColouredResult.addError   s8    $$T4555wD))))))r   c                 h    t           j                            | ||           t          dd           d S )NFAILr   )r7   rb   
addFailurer   rh   s      r   rl   zColouredResult.addFailure   s3    &&tT3777vur   c                     t           j                            | ||           t          d|                                z  d           d S )Nzskipped: %sbrown)r7   rb   addSkipr   strip)r-   rC   reasons      r   ro   zColouredResult.addSkip   s@    ##D$777}v||~~-w77777r   c                 x    t          |d|dk              }t                                          ||           d S )Nr   re   rf   )r   r   printErrorList)r-   flavourerrors	__class__s      r   rs   zColouredResult.printErrorList   s<    %g.@AAAw/////r   )	rV   rW   rX   rc   rg   rl   ro   rs   __classcell__rv   s   @r   r^   r^   |   st          * * *  8 8 80 0 0 0 0 0 0 0 0r   r^   c                   d     e Zd ZdZerenej        Z fdZ	 fdZ
d Zd Z fdZd Zd Z x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                 `     t                      j        |i | t                      | _        d S r>   )r   __init__setfailed_tnames)r-   argskwargsrv   s      r   r|   zColouredTextRunner.__init__   s1    $)&))) UUr   c                 \    t                                                      | _        | j        S r>   )r   _makeResultresult)r-   rv   s    r   r   zColouredTextRunner._makeResult   s$     gg))++{r   c                     | j         rSt          t          d          5 }| j         D ]}|                    |dz              	 d d d            d S # 1 swxY w Y   d S d S )Nwt
)r~   rI   rH   write)r-   rN   tnames      r   _write_last_failedz%ColouredTextRunner._write_last_failed   s     	*($// *1!/ * *EGGEDL))))** * * * * * * * * * * * * * * * * *	* 	*s   #AAAc                     |                                 sF|j        |j        z   D ]8}|d                                         }| j                            |           7d S d S )Nr   )wasSuccessfulru   failuresidr~   add)r-   r   tr   s       r   _save_resultzColouredTextRunner._save_result   sm    ##%% 	.]V_4 . .!		"&&u----	. 	.. .r   c                    	 t                                          |          }|                     |           |S # t          t          f$ r5 | j        j        }|                                 t          j	        d          w xY w)Nr   )
r   runr   KeyboardInterrupt
SystemExitrunnerr   printErrorsr   exit)r-   rB   r   rv   s      r   _runzColouredTextRunner._run   s    	WW[[''F f%%%M ":. 	 	 	['F   (1++	s
   !; ABc                     |r<t          ddd           t          t                     t          j        d           d S t          ddd           |                                  t          j        d           d S )	NSUCCESSra   Trf   r   FAILEDr   r   )r   r   rH   r   r   r   )r-   successs     r   _exitzColouredTextRunner._exit   sw     	9gD1111*+++HQKKKKK8U....##%%%HQKKKKKr   c                 ~    |                      |          }|                     |                                           d S r>   )r   r   r   )r-   rB   r   s      r   r   zColouredTextRunner.run   s7    5!!

6''))*****r   )rV   rW   rX   __doc__r   r^   r7   TextTestResultresultclassr|   r   r   r   r   r   r   rw   rx   s   @r   rz   rz      s          %/K..H4KK# # # # #    * * *. . .	 	 	 	 	  + + + + + + +r   rz   c                   @    e Zd Zed             Zed             Zd ZdS )ParallelRunnerc                     fd}t           j        |t          j         _        t          j        t                    }t          j        | |          S )Nc                 R     | |          }t          j        |j                   |S r>   )atexitregisterclose)fdmodekwdsstreamorig_fdopens       r   fdopenz+ParallelRunner._parallelize.<locals>.fdopen   s+     [T**FOFL)))Mr   )r'   r   concurrencytestfork_for_testsNWORKERSConcurrentTestSuite)rB   r   forkerr   s      @r   _parallelizezParallelRunner._parallelize   sS    	 	 	 	 	 i$*! /9925&AAAr   c                    t          j                    }t          j                    }| D ]}|                                dk    rt          |t           j                  r|j        d         j        }n/t          |t           j                  r|}nt          d|z            t          |dd          r|	                    |           |	                    |           ||fS )Nr   zcan't recognize type %r
_serialrunF)
r7   r?   countTestCasesr4   _testsrv   r8   	TypeErrorr3   rA   )rB   serialparallelrC   
test_classs        r   _split_suitezParallelRunner._split_suite   s    #%%%'' 	' 	'D""$$) BD("455 B![^5

D("344 B!

 9D @AAAz<77 't$$$$  &&&&!!r   c                    |                      |          \  }}|                     |          }t          dt          z  dd           t	          j                    }|                     |          }t	          j                    |z
  }t          j                                                    }t          j	        |d          \  }}	|	r!t          d|	z  d           t                       t	          j                    }|                     |          }
t	          j                    |z
  }|                                s,|                                d	k    r|                                 t          t          |j        |j        |j        f          \  }}}t          t          |
j        |
j        |
j        f          \  }}}t'          t)          j        d
|j        |||||
j        ||||f
z                       t'          d|j        |
j        z   ||z   t          fz             |                                o|
                                }|                     |           d S )Nz(starting parallel tests using %s workersra   Trf   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   r   r   r   maplenr   ru   skippedr   textwrapdedenttestsRunr   )r-   rB   	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oks                      r   r   zParallelRunner.run   sf   #0077	9%%i00	 	9HDT	# 	# 	# 	#IKKii	""ikkAo .""++--';;;e 	'%/777OOO IKKii	""ikkAo   "" 	y'?'?'A'AA'E 	OO),S3<36:36;3@ *A *A&	8Y *-S3<36:36;3@ *A *A&	8Y 	ho  <Hi<HiN	N 	O 	O 		P 		P 		P 	6L3<'{)BH:N N 	O 	O 	O  8S%6%6%8%8

2r   N)rV   rW   rX   staticmethodr   r   r   r\   r   r   r   r      sZ        B B \B " " \"&. . . . .r   r   c                     d }| rWt           j        r |d           n?t           |d           n,t          dk    r |d           nt	          t
                    S t          t
                    S )Nc                 ,    t          | dz   d           d S )Nz Running serial tests instead.r   )r   )r   s    r   warnzget_runner.<locals>.warn   s    s55u=====r   z$Can't run parallel tests on Windows.z(concurrencytest module is not installed.r   zOnly 1 CPU available.)	verbosity)r   WINDOWSr   r   r   	VERBOSITYrz   )r   r   s     r   
get_runnerr     s    > > > 7> 	7D78888 	7D;<<<<] 	7D())))!I6666	2222r   c                     t           rt                       t                                          |           }t	                      }|                    |           d S r>   )r   r
   r   rU   r   r   )r:   rB   r   s      r   run_from_namer   /  sK     LL""4((E\\F
JJur   c                  .    t          j        d           d S )NT)r   
_set_debugr\   r   r   setupr   7  s    
dr   c                     t                       d} t          j        | d          }|                    dddd           |                    d	ddd
           |                                \  }}|j        st          t                     t                      }|rWt          |          dk    r(|
                                 t          j        d          S |                    |d                   }n0|j        r|                                }n|                                }t          rt!                       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_argsrQ   r   rH   r   r   print_usager   r   rU   rD   r   r
   r   r   r   )r   parseroptsr   loaderrB   r   s          r   mainr   ;  sh   	GGG8E"<LMMMF
o)57  9 9 9 l)52  4 4 4 ""$$JD$ (&''' \\F 	t99q= 	.   8A;;$$T!W--EE		 ""$$

 &&F
JJur   __main__)FN)F)2r   
__future__r   r   r   r'   r   r   r   r7   ctypesImportErrorr   r   psutil._commonr   r   r   psutil._compatr   psutil.testsr   r	   r
   r   r   r   rH   	cpu_countr   r   r(   abspathdirname__file__rY   rL   r@   r   r   r   r^   TextTestRunnerrz   r   r   r   r   r   rV   r\   r   r   <module>r     s     & % % % % %   				 



   MMMM   FFF   OOO  ! ! ! ! ! ! & & & & & & / / / / / /             # # # # # # . . . . . . & & & & & & & & & & & & $ $ $ $ $ $ 	( 6"^6 4 4 6 6
	wrwx0011 2H    /B /B /B /B /B /B /B /Bd0 0 0 0 0X, 0 0 0.4+ 4+ 4+ 4+ 4+0 4+ 4+ 4+nR R R R R' R R Rj3 3 3 3       D z DFFFFF s   + 55> AA