
    Yf,                        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
	 ddlZ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j8                         xs dZe xr  e       Zej>                  jA                  ej>                  jC                  e"            Z#e	jH                  jJ                  Z%ddZ& G d d      Z' G d de	jP                        Z) G d de	jT                        Z+ G d de+      Z,ddZ-d Z.d Z/d Z0e1dk(  r e0        yy# e$ r dZ
Y w xY w# e$ r dZY w xY w) 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   c                     |%|dk(  rt         j                  nt         j                  }t        rt	        | |||       y t        | |       y )Nred)boldfile)r   )sysstderrstdout
USE_COLORSr   print)msgcolorr   r   s       S/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/psutil/tests/runner.pycprintr   B   s7    |"e^szzCT5c    c                   v    e Zd ZeZdgZdej                  v rej                  g d       d Z	d Z
d Zd Zd Zy	)

TestLoaderztest_memleaks.pyWHEELHOUSE_UPLOADER_USERNAME)ztest_osx.pyztest_linux.pyztest_posix.pyc                    t        j                  | j                        D cg c]\  }|j                  d      rI|j	                  d      r8|| j
                  vr*t         j                  j                  | j                  |      ^ c}S c c}w )Ntest_.py)oslistdirtestdir
startswithendswith
skip_filespathjoin)selfxs     r   _get_testmodszTestLoader._get_testmodsR   sh     ZZ-
||G$

5!(	 GGLLq)
 	
 
s   A!Bc              #      K   | j                         D ]Y  }t        |      }t        |      D ]>  }t        ||      }t	        |t
              s t        |t        j                        s;| @ [ yw)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objs        r   _iter_testmod_classesz TestLoader._iter_testmod_classes[   sl      &&( 	D'-CC c4(c4(Z**. I	s   A	A0A0'	A0c                     t        j                         }| j                         D ]  }t        |      }|j	                  |         |S N)r4   	TestSuiter9   loadTestsFromTestCaseaddTest)r+   suiter8   tests       r   allzTestLoader.allh   sE    ""$--/ 	 C(-DMM$	  r   c                 j   t        j                         }t        j                  j	                  t
              s|S t        t
              5 }|j                         j                         }d d d        D ]2  }t         j                  j                  |      }|j                  |       4 |S # 1 sw Y   BxY wr;   )r4   r<   r#   r)   isfileFAILED_TESTS_FNAMEopenreadsplitdefaultTestLoaderloadTestsFromNamer>   )r+   r?   fnamesnr@   s         r   last_failedzTestLoader.last_failedo   s    ""$ww~~01L$% 	%FFHNN$E	% 	 A--??BDMM$	  	% 	%s   	B))B2c                     |j                  d      r?t        j                  j                  t        j                  j	                  |            d   }t
        j                  j                  |      S )Nr"   r   )r'   r#   r)   splitextbasenamer4   rH   rI   )r+   r7   s     r   	from_namezTestLoader.from_name{   sM    ==77##BGG$4$4T$:;A>D));;DAAr   N)__name__
__module____qualname__HEREr%   r(   r#   environextendr-   r9   rA   rM   rQ    r   r   r   r   K   sD    G$%J%3KL

Br   r   c                   6     e Zd Zd Zd Zd Zd Z fdZ xZS )ColouredResultc                 \    t         j                  j                  | |       t        dd       y )NOKgreen)r4   
TestResult
addSuccessr   )r+   r@   s     r   r_   zColouredResult.addSuccess   s"    &&tT2tWr   c                 b    t         j                  j                  | ||       t        ddd       y )NERRORr   Tr   )r4   r^   addErrorr   r+   r@   errs      r   rc   zColouredResult.addError   s&    $$T45wD)r   c                 ^    t         j                  j                  | ||       t        dd       y )NFAILr   )r4   r^   
addFailurer   rd   s      r   rh   zColouredResult.addFailure   s$    &&tT37vur   c                     t         j                  j                  | ||       t        d|j	                         z  d       y )Nzskipped: %sbrown)r4   r^   addSkipr   strip)r+   r@   reasons      r   rk   zColouredResult.addSkip   s/    ##D$7}v||~-w7r   c                 \    t        |d|dk(        }t               j                  ||       y )Nr   ra   rb   )r   r   printErrorList)r+   flavourerrors	__class__s      r   ro   zColouredResult.printErrorList   s(    %g.@Aw/r   )	rR   rS   rT   r_   rc   rh   rk   ro   __classcell__rr   s   @r   rZ   rZ      s!    *80 0r   rZ   c                   n     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 )	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.
    c                 X     t               j                  |i | t               | _        y r;   )r   __init__setfailed_tnames)r+   argskwargsrr   s      r   rx   zColouredTextRunner.__init__   s$    $)&) Ur   c                 V    t               j                         | _        | j                  S r;   )r   _makeResultresult)r+   rr   s    r   r~   zColouredTextRunner._makeResult   s!     g))+{{r   c                     | j                   r@t        t        d      5 }| j                   D ]  }|j                  |dz           	 d d d        y y # 1 sw Y   y xY w)Nw
)rz   rE   rD   write)r+   rJ   tnames      r   _write_last_failedz%ColouredTextRunner._write_last_failed   s\    (#. *!!// *EGGEDL)** * * *s   &AAc                     |j                         sM|j                  |j                  z   D ]0  }|d   j                         }| j                  j                  |       2 y y )Nr   )wasSuccessfulrq   failuresidrz   add)r+   r   tr   s       r   _save_resultzColouredTextRunner._save_result   sR    ##%]]V__4 .!	""&&u-. &r   c                     	 t               j                  |      }| j                  |       |S # t        t        f$ r< | j
                  j                  }|j                          t        j                  d      w xY w)Nr   )
r   runr   KeyboardInterrupt
SystemExitrunnerr   printErrorsr   exit)r+   r?   r   rr   s      r   _runzColouredTextRunner._run   sl    	W[['F f%M ":. 	[[''F ((1+	s
   / AA:c                     |r3t        ddd       t        t               t        j                  d       y t        ddd       | j                          t        j                  d       y )	NSUCCESSr]   Trb   r   FAILEDr   r   )r   r   rD   r   r   r   )r+   successs     r   _exitzColouredTextRunner._exit   sH    9gD1*+HHQK8U.##%HHQKr   c                 d    | j                  |      }| j                  |j                                y r;   )r   r   r   )r+   r?   r   s      r   r   zColouredTextRunner.run   s%    5!

6'')*r   )rR   rS   rT   __doc__r   rZ   r4   TextTestResultresultclassrx   r~   r   r   r   r   r   rs   rt   s   @r   rv   rv      s<    
 %/.H4K4KK#*.	+r   rv   c                   2    e Zd Zed        Zed        Zd Zy)ParallelRunnerc                     fd}t         j                  |t        j                   _        t        j                  t              }t        j
                  | |      S )Nc                 X     | |      }t        j                  |j                         |S r;   )atexitregisterclose)fdmodekwdsstreamorig_fdopens       r   fdopenz+ParallelRunner._parallelize.<locals>.fdopen   s$     T*FOOFLL)Mr   )r#   r   concurrencytestfork_for_testsNWORKERSConcurrentTestSuite)r?   r   forkerr   s      @r   _parallelizezParallelRunner._parallelize   sD    	 ii$*! //9225&AAr   c                    t        j                         }t        j                         }| D ]  }|j                         dk(  rt        |t         j                        r|j                  d   j
                  }n+t        |t         j                        r|}nt        d|z        t        |dd      r|j                  |       |j                  |        ||fS )Nr   zcan't recognize type %r
_serialrunF)
r4   r<   countTestCasesr1   _testsrr   r5   	TypeErrorr0   r>   )r?   serialparallelr@   
test_classs        r   _split_suitezParallelRunner._split_suite   s    ##%%%' 	'D""$)$ 2 23![[^55
D("3"34!
 9D @AAz<7t$  &	' !!r   c                    | j                  |      \  }}| j                  |      }t        dt        z  dd       t	        j                         }| j                  |      }t	        j                         |z
  }t        j                         j                         }t        j                  |d      \  }}	|	rt        d|	z  d       t                t	        j                         }| j                  |      }
t	        j                         |z
  }|j                         s#|j                         d	kD  r|j                          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         |j                         xr |
j                         }| j/                  |       y )Nz(starting parallel tests using %s workersr]   Trb   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   rq   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oks                      r   r   zParallelRunner.run   s   #007	9%%i0	 	6A	

 IIKii	"iikAo .."++-'';e'%/7O IIKii	"iikAo   "y'?'?'AA'EOO),#,,

CKK8*
&	8Y *-#,,

CKK8*
&	8Y 	OO LLLL	
2 	4s||+k)	
  8S%6%6%8

2r   N)rR   rS   rT   staticmethodr   r   r   rX   r   r   r   r      s0    B B " "&Fr   r   c                     d }| rJt         j                  r	 |d       n1t        	 |d       n"t        dk(  r	 |d       nt	        t
              S t        t
              S )Nc                 "    t        | dz   d       y )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   	VERBOSITYrv   )r   r   s     r   
get_runnerr   ;  sQ    > >>78$;<]()!I66	22r   c                     t         r
t                t               j                  |       }t	               }|j                  |       y r;   )r   r
   r   rQ   r   r   )r7   r?   r   s      r   run_from_namer   L  s/    L""4(E\F
JJur   c                  .    t        j                  d       y )NT)r   
_set_debugrX   r   r   setupr   T  s    
dr   c                  h   t                d} t        j                  | d      }|j                  dddd       |j                  d	ddd
       |j	                         \  }}|j
                  st        t               t               }|rHt        |      dkD  r%|j                          t        j                  d      S |j                  |d         }n-|j
                  r|j                         }n|j                         }t        r
t!                t#        |j$                        }|j'                  |       y )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_argsrM   r   rD   r   r   print_usager   r   rQ   rA   r   r
   r   r   r   )r   parseroptsr{   loaderr?   r   s          r   mainr   X  s   	G8E""<LMF
)	   $	   ""$JD$&' \Ft9q= 88A;$$T!W-E			""$

&F
JJur   __main__)FN)F)2r   
__future__r   r   r   r#   r   r   r   r4   ctypesImportErrorr   r   psutil._commonr   r   r   psutil._compatr   psutil.testsr   r	   r
   r   r   r   rD   	cpu_countr   r   r)   abspathdirname__file__rU   rH   r=   r   r   r   rZ   TextTestRunnerrv   r   r   r   r   r   rR   rX   r   r   <module>r      sU   &   	 
     ! & /   # . & & $ 	( 6"^6 4 6
	wwrwwx0144 
3B 3Bl0X,, 0,5+00 5+pi' iX3"%P zF {
  F
  Os"   D6 E 6E EEE