
    <hr             	          % S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
J
r
  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJs  Jr   SS	K!J"r"  SS
K!J#r#  SSK!J$r$  SSK%J&r&J'r'  SSK%J(r)  SSK*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2  SSK3J4r4  SSK5J6r6  SSK7J8r8J9r9  \Rt                  (       a  \Rv                  S   r<Sr=Sr>Sr?/ SQr@S\AS'   \R                  S:  a  \@R                  / SQ5        \@ V Vs/ s H  u  p\D" U 5       S\D" U5       3PM     snn rE\R                  " SSR                  \E5      -   S-   5      rH\R                  " S5      rI\R                  " S 5      rJS`S! jrKS`S" jrLS#SS#SSSS$.rMSaS% jrNSbS& jrOScS' jrPSdS( jrQSeS) jrRSfS* jrSSgS+ jrTS, rUS-\AS.'   \K" 5       (       d  \R                  rUShS/ jrW " S0 S1\+5      rX\R                   " S2 S3\R                  5      5       r[\R                   " S4 S5\R                  5      5       r\ " S6 S75      r] " S8 S95      r^ " S: S;\^5      r_ " S< S=\^5      r` " S> S?\_5      ra " S@ SA\_5      rb " SB SC\^5      rc " SD SE5      rd " SF SG\d5      re\e\dR                  \8R                  '    " SH SI\e5      rh\h\dR                  \8R                  '    " SJ SK\d5      rj\j\dR                  \8R                  '    " SL SM\d5      rl\l\dR                  \8R                  '   SiSN jrnSjSO jro      SkSP jrpSlSQ jrqSmSR jrrSnSS jrsSoST jrt Sp   SqSU jjru " SV SW5      rv " SX SY5      rw " SZ S[5      rxSrS\ jrySsS] jrzStS^ jr{SuS_ jr|gs  snn f )v    )annotations)Path)deque)suppress)deepcopy)fnmatchN   )build)environment)mlog)MesonVersionMismatchExceptionmajor_versions_differversion)MesonException
OrderedSetRealPathActionget_wine_shortpath	join_args
split_argssetup_vsenvdetermine_worker_count)	OptionKey)ExternalProgram)TestProtocolTestSerialisation)TAPParser.TestTAPParser.ErrorTAPParser.VersionTAPParser.PlanTAPParser.UnknownLineTAPParser.BailoutM   c      ))r      )      )      )      )      )i  i  )i  i  zT.List[T.Tuple[int, int]]UNENCODABLE_XML_UNICHRSi   ))i i )i i )i i )i i )i i )i i )i i )i i )i	 i	 )i
 i
 )i i )i i )i i )i i )i i )i i -z([ z])z!^test (?!result)(.*) \.\.\. (.*)$z^(.*?) - (.*? |)\(line (\d+)\)c                 R    [         R                  " 5       R                  5       n U S:H  $ )Nwindows)platformsystemlower)platnames    q/mnt/mint/home/seanl/mnt/public/Repos/ladybird/Build/vcpkg/downloads/tools/meson-1.9.0-d1fcc2/mesonbuild/mtest.py
is_windowsr9   V   s"     &&(Hy      c                 (    [         R                  S:H  $ )Ncygwin)sysr4    r:   r8   	is_cygwinr?   Z   s    <<8##r:      )FHWNaNAc                `    SnU  H%  n[         R                  " U5      nU[        U   -  nM'     U$ )Nr   )unicodedataeast_asian_widthUNIWIDTH_MAPPING)sresultcws       r8   uniwidthrO   ^   s8    F((+"1%%  Mr:   c                   U R                  S5      n[        U5      S:w  a  [        R                  " S5      e [	        US   5      nUS::  a  [        R                  " S5      e [	        US   5      nUS::  a  [        R                  " S	5      eX2:  a  [        R                  " S
5      eX24$ ! [
         a    [        R                  " S5      ef = f! [
         a    [        R                  " S5      ef = f)N/r@   z3value does not conform to format 'SLICE/NUM_SLICES'r	   zNUM_SLICES is not an integerr   z$NUM_SLICES is not a positive integerzSLICE is not an integerzSLICE is not a positive integerzSLICE exceeds NUM_SLICES)splitlenargparseArgumentTypeErrorint
ValueError)argvaluesnrslicessubslices       r8   
test_slicer\   e   s    YYs^F
6{a(()^__Ivay> 1}(()OPPDvay> 1}(()JKK(()CDD  I(()GHHI  D(()BCCDs   B+ #C +!C!C0c           	        U R                  SS[        SS9  U R                  SSS[        SS	9  U R                  S
SSSS9  U R                  SSSSSS9  U R                  SSSSS9  U R                  SSSSSSS9  U R                  SSSSSS9  U R                  SS S[        S S	9  U R                  S!S"[        S#S$9  U R                  S%/ S&S'S(S)S*9  U R                  S+/ S,S'S(S-S*9  U R                  S.S/S0S1S2S9  U R                  S3SSS4S9  U R                  S5SSS6S9  U R                  S7S8S9S:9  U R                  S;S<[	        S=/5      [        S>S9  U R                  S?S@SSSAS9  U R                  SBSCSSSDS9  U R                  SESF[
        S SGSH9  U R                  SIS SJSKS9  U R                  SL/ [        SMS9  U R                  SNSOSP[        SQS	9  U R                  SRS [        SSSTSU9  U R                  SVSWSXSY9  g )ZNz	--maxfailr   zbNumber of failing tests before aborting the test run. (default: 0, to disable aborting on failure))defaulttypehelpz--repeatr	   repeatz!Number of times to run the tests.)r^   destr_   r`   z--no-rebuildF
store_truez$Do not rebuild before running tests.)r^   actionr`   z--gdbgdbzRun test under gdb.)r^   rb   rd   r`   z
--gdb-pathgdb_pathz&Path to the gdb binary (default: gdb).)r^   rb   r`   z-iz--interactiveinteractivez(Run tests with interactive input/output.z--listlistzList available tests.z	--wrapperwrapperz)wrapper to run tests with (e.g. Valgrind)-Cwdz#directory to cd into before running)rb   rd   r`   z--suiteinclude_suitesappendSUITEz,Only run tests belonging to the given suite.)r^   rb   rd   metavarr`   z
--no-suiteexclude_suitesz.Do not run tests belonging to the given suite.z--no-stdsplitTrR   store_falsez,Do not split stderr and stdout in test logs.z--print-errorlogsz%Whether to print failing tests' logs.z--benchmarkz Run benchmarks instead of tests.z	--logbasetestlogzBase name for log file.)r^   r`   z-jz--num-processesMESON_TESTTHREADSz#How many parallel processes to use.z-vz	--verbosez!Do not redirect stdout and stderrz-q--quietz$Produce less output to the terminal.z-tz--timeout-multiplierzDefine a multiplier for test timeout, for example  when running tests in particular conditions they might take more time to execute. (<= 0 to disable timeout))r_   r^   r`   z--setupsetupzWhich test setup to use.z--test-argsz7Arguments to pass to the specified test(s) or all testsz--max-linesd   	max_lineszBMaximum number of lines to show from a long test log. Since 1.5.0.z--slicezSLICE/NUM_SLICESzHSplit tests into NUM_SLICES slices and execute slice SLICE. Since 1.8.0.)r^   r_   ro   r`   args*zOptional list of test names to run. "testname" to run all tests with that name, "subprojname:testname" to specifically run "testname" from "subprojname", "subprojname:" to run all tests defined by "subprojname".)nargsr`   )add_argumentrV   r   r   r   floatr\   )parsers    r8   add_argumentsr~   ~   s   
QSQ  R 
AH3@  B
lC  E
U<2  4
e*E  G
ou=+2\  ^
%f\4  6
T	
H  J
4B  D
	24DX_fK  M
b7GPXbiM  O
GMK  M
+U<D  F
u\?  A
Y6  8
/9OQdPe9fmpB  D
k5@  B
i|C  E
45$K  L 	4g7  9
r
V  X
s3a  c
	4jJ\g  i
cT  Ur:   c                    U S   S:X  a  SOSn [        XS9  g ! [         a+    U R                  SSS9R                  S5      n [        XS9   g f = f)N
r1   endasciibackslashreplaceerrors)printUnicodeEncodeErrorencodedecode)rK   r   s     r8   
print_safer      sU    ""4Ca HHW%7H8??Has   	 2AAc                6    U (       d  U$ U(       d  U $ U S-   U-   $ Nr   r>   )abs     r8   
join_linesr      s     t8a<r:   c                r    U (       d  X-  $ SU -   S-   n [        U 5      nX#-
  S-  nX-  U -   n XX$-
  U-
  -  -   $ )N r@   )rO   )rK   dashcolswidthfirsts        r8   dashesr      sP    {a#AQKE\aEqAt|e+,,,r:   c                (   U S:  a,  U * n [         R                  " U5      R                  nSU SU 3$ U S::  a  SU  3$ U S-
  n [         R                  " U5      R                  nSU  SU SU S	3$ ! [         a    Sn NSf = f! [         a    Sn N,f = f)
Nr   
SIGinvalidzkilled by signal r      zexit status z(exit status z or signal ))signalSignalsnamerW   )retcodesignumsignames      r8   returncode_to_statusr      s     {	#nnV,11G #6(!G955#~gY''s]F..(-- 7);vhayBB  	#"G	#  s#    A0  B 0A?>A?BBc                    U $ Nr>   )xs    r8   <lambda>r      s    Qr:   zT.Callable[[str], str]sh_quotec                    SR                  U  VVs/ s H   u  pSR                  U[        U5      5      PM"     snn5      $ s  snnf )Nr1   z{}={} )joinformatr   )envkvs      r8   env_tuple_to_strr      s4    77DHOOAx{3DEEDs   'A 
c                      \ rS rSrSrg)TestException   r>   N)__name__
__module____qualname____firstlineno____static_attributes__r>   r:   r8   r   r      s    r:   r   c                       \ rS rSrSrSrSrSrg)ConsoleUser   r   r	   r@   r>   N)r   r   r   r   LOGGERINTERACTIVESTDOUTr   r>   r:   r8   r   r      s     F K Fr:   r   c                      \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSr\SS j5       rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)
TestResult   PENDINGRUNNINGOKTIMEOUT	INTERRUPTSKIPFAILEXPECTEDFAILUNEXPECTEDPASSERRORIGNOREDc                     g)Nr)   r>   r>   r:   r8   maxlenTestResult.maxlen  s    r:   c                H    U [         R                  [         R                  1;   $ r   )r   r   r   selfs    r8   is_okTestResult.is_ok  s    
z'>'>???r:   c                    U [         R                  [         R                  [         R                  [         R                  [         R
                  1;   $ r   )r   r   r   r   r   r   r   s    r8   is_badTestResult.is_bad  s>    
););Z=Q=Q"11:3C3CE E 	Er:   c                H    U [         R                  [         R                  1;  $ r   )r   r   r   r   s    r8   is_finishedTestResult.is_finished  s    J..
0B0BCCCr:   c                H    U [         R                  [         R                  4;   $ r   )r   r   r   r   s    r8   
was_killedTestResult.was_killed  s    
**J,@,@AAAr:   c                R   U R                  5       (       a  [        R                  nOzU [        R                  [        R
                  [        R                  4;   a  [        R                  nO6U R                  5       (       a  [        R                  nO[        R                  nU" U5      $ r   )r   r   redr   r   r   r   yellowr   greenblue)r   rK   	decorators      r8   colorizeTestResult.colorize   si    ;;==Ijooz'9'9:;R;RSSI

I		I|r:   c                    SR                  U R                  U R                  5       S9nU R                  U5      R	                  U5      $ )Nz{res:{reslen}})resreslen)r   valuer   r   get_text)r   r   
result_strs      r8   r   TestResult.get_text+  s;    %,,DKKM,R
}}Z(11(;;r:   c                6    [        U R                  S5      5      $ )Nz>>> )strr   r   s    r8   get_command_markerTestResult.get_command_marker/  s    4==())r:   r>   NreturnrV   r   bool)rK   r   r   zmlog.AnsiDecorator)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r>   r:   r8   r   r      st     GG	BGIDD!L%NEG @EDB	<*r:   r   c                     \ rS rSr%  " S S\R
                  5      r " S S\R
                  5      r " S S\R
                  5      r " S S	\R
                  5      r	 " S
 S\R
                  5      r
 " S S\R
                  5      rSrSrSr\R                   " S5      r\R                   " S5      r\R                   " S\R&                  -   5      r\R                   " S\R&                  -   5      r\R                   " S5      r\R                   " S5      r\R                   " S5      rSrSrSrS\S'   SrSrSrSr Sr!S\S'   Sr"\r#S r$  S&S! jr%S'S" jr&S(S# jr'S)S$ jr(S%r)g)*	TAPParseri3  c                  >    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S	rg
)r    i4  rV   	num_testsr   lateskippedT.Optional[str]explanationr>   Nr   r   r   r   __annotations__r   r>   r:   r8   PlanTAPParser.Plan4  s    
$$r:   r   c                       \ rS rSr% S\S'   Srg)r"   i:  r   messager>   Nr   r>   r:   r8   BailoutTAPParser.Bailout:      r:   r  c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   SS
 jrSrg)r   i=  rV   numberr   r   r   rL   r   r   c                T    U R                    SU R                   3R                  5       $ )Nr   )r  r   stripr   s    r8   __str__TAPParser.Test.__str__C  s$    kk]!DII;/5577r:   r>   Nr   )r   r   r   r   r   r  r   r>   r:   r8   TestTAPParser.Test=  s    	$$	8r:   r  c                       \ rS rSr% S\S'   Srg)r   iF  r   r  r>   Nr   r>   r:   r8   ErrorTAPParser.ErrorF  r  r:   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)r!   iI  r   r  rV   linenor>   Nr   r>   r:   r8   UnknownLineTAPParser.UnknownLineI  s    r:   r  c                       \ rS rSr% S\S'   Srg)r   iM  rV   r   r>   Nr   r>   r:   r8   VersionTAPParser.VersionM  r  r:   r  r	   r@   r%   zBail out!\s*(.*)z<(?:\s*\#\s*([Ss][Kk][Ii][Pp]\S*|[Tt][Oo][Dd][Oo])\b\s*(.*))?z1\.\.([0-9]+)z'((?:not )?ok)\s*(?:([0-9]+)\s*)?([^#]*)zTAP version ([0-9]+)z
(\s+)---.*z\s+\.\.\.\s*FNzT.Optional[Plan]planr   T.Optional[int]yaml_linenor1   r(   c              #  ,  #    UR                  5       nU(       a  UR                  5       OS nUb  UR                  5       nUR                  S5      (       a,  U(       a$  U R                  X#[        R
                  U5      v   g OXUS:X  a;  U R                  X#U(       a  [        R                  O[        R                  U5      v   g U R                  SU S35      v   U R                  X#U(       a  [        R                  O[        R                  U5      v   g 7f)Nr   TODOzinvalid directive "")r
  upper
startswithr  r   r   r   r   r  r   r   )r   oknumr   	directiver   s         r8   
parse_testTAPParser.parse_testh  s     zz|-8k'')d !)I##F++))CzLL  f$ii:+D+DPZPgPgituujj#6yk!CDDiiB:==JOO[YYs   DDc                  #    U  S h  vN nU R                  U5       H  nU7v   M
     M(   N#
 U R                  S 5       H  nU7v   M
     g 7fr   
parse_line)r   lineslineevents       r8   parse_asyncTAPParser.parse_asyncz  sH      	$. /	% __T*EK +s   A/-/ A/Ac              #     #    U H  nU R                  U5       S h  vN   M     U R                  S 5       S h  vN   g  N" N7fr   r'  )r   ior*  s      r8   parseTAPParser.parse  s;     Dt,,, ??4((( -(s   A?AAAAc           	   #  V  #    UGbv  U =R                   S-  sl         UR                  5       nU R                  U R                  :X  a}  U R                  S:  a[  U R
                  R                  U5      nU(       a9  U R                  U l        U R                   U l        UR                  S5      U l
        g U R                  U l        OU R                  U R                  :X  a  U R                  R                  U5      (       a  U R                  U l        g UR                  U R                  5      (       a  g U R                  SU R                   S35      v   U R                  U l        U R                  U R                  :X  d   eU(       a  UR                  S5      (       a  g U R                  R                  U5      nU(       Ga  U R                   (       aF  U R                   R"                  (       a+  U R$                  (       d  U R                  S5      v   SU l        U =R&                  S-  sl        UR                  S5      c  U R(                  S-   O[+        UR                  S5      5      U l        [-        U R.                  U R(                  5      U l        U R                   (       a7  U R(                  U R                   R&                  :  a  U R                  S	5      v   U R1                  UR                  S5      S
:H  U R(                  UR                  S5      UR                  S5      UR                  S5      5       S h  vN   U R                  U l        g U R2                  R                  U5      nU(       a  U R                   (       a  U R                  S5      v   g [+        UR                  S5      5      nUS:H  nUR                  S5      (       ab  UR                  S5      R5                  5       R                  S5      (       a  US:  a  U R                  S5      v   SnOU R                  S5      v   U R7                  X0R&                  S:  XBR                  S5      S9U l        U R                   v   g U R8                  R                  U5      nU(       a*  U R;                  UR                  S5      5      v   SU l        g U R>                  R                  U5      nU(       a  U R                   S:w  a  U R                  S5      v   g [+        UR                  S5      5      U l        U R                  S:  a  U R                  S5      v   g U RA                  U R                  S9v   g U RC                  XR                   5      v   g U R                  U R                  :X  a!  U R                  SU R                   S35      v   U R<                  (       a  g U R                   (       a  U R&                  U R                   R&                  :w  a  U R&                  U R                   R&                  :  a9  U R                  SU R                   R&                   SU R&                   S35      v   g U R                  SU R                   R&                   SU R&                   S35      v   g U R.                  U R&                  :w  av  U R.                  U R&                  :  a.  U R                  SU R&                   SU R.                   35      v   g U R                  SU R&                   SU R.                   35      v   g g  GN7f)Nr	      z+YAML block not terminated (started on line r   #zunexpected test after late planTr@   z2test number exceeds maximum specified in test planr!  r%         zmore than one plan foundr   r   zinvalid SKIP directive for planzinvalid directive for plan)r   r   r   r   z(version number must be on the first linez$version number should be at least 13r   zToo few tests run (expected z, got zToo many tests run (expected z!Duplicate test numbers (expected z, got test numbered zMissing test numbers (expected )"r  rstripstate_AFTER_TESTr   _RE_YAML_STARTmatch_YAMLr  groupyaml_indent_MAIN_RE_YAML_ENDr   r  _RE_TESTr  r   found_late_testr   	last_testrV   maxhighest_testr$  _RE_PLANr  r   _RE_BAILOUTr  
bailed_out_RE_VERSIONr  r  )r   r*  mr   r   s        r8   r(  TAPParser.parse_line  s    KK1K;;=D zzT---<<2%++11$7A%)ZZ
+/;;(+,771:(!ZZ
tzz)$$**400!%DJ??4#3#344jj#NtO_O_N``a!bcc!ZZ
::+++4??3//##D)A998L8L**%FGG+/D(!#78wwqz7I!!3sSTSZSZ[\S]$'(9(94>>$J!99$))2E2E!E**%YZZ??1771:+=t~~+,771:qwwqz1771:O O O!--
##D)A99**%?@@  !$AGGAJI'1nGwwqzz771:++-88@@(1}&*jj1R&S S&*G"&**-I"JJ $		I^^VWEW29wwqz !* !SDI))O  &&t,All1771:.."&  &&t,A;;!#**%OPP"1771:<<"$**%KLL  ,,t||,<< ""455 zzTZZ'jj#NtO_O_N``a!bccyyT^^tyy/B/BB>>DII$7$77**'CDIIDWDWCXX^_c_m_m^nno%pqq  **'DTYYEXEXDYY_`d`n`n_oop%qrr  DNN2$$t~~5**'HHXXlmqm~m~l  &A  B  B**'Ft~~FVVjkok|k|j}%~	 3yOs   L7\)9\&:O-\))	rH  rB  rE  rC  r  r8  r   r>  r  )r!  r   r"  rV   r   r   r#  r   r   r   r   zET.Generator[T.Union['TAPParser.Test', 'TAPParser.Error'], None, None])r)  T.AsyncIterator[str]r   zT.AsyncIterator[TYPE_TAPResult])r/  zT.Iterator[str]r   T.Iterator[TYPE_TAPResult])r*  r   r   rM  )*r   r   r   r   T
NamedTupler   r  r  r  r  r  r?  r9  r<  recompilerG  _RE_DIRECTIVEpatternrF  rA  rI  r:  r@  rB  rH  r  r   r  r   rC  rE  r  r>  r8  r   r$  r,  r0  r(  r   r>   r:   r8   r   r   3  sR   %q|| %!,, 8q|| 8 all !,,  EKE**01KJJ^_Mzz*]-B-BBCHzzD}G\G\\]H**45KZZ.N::o.LOJ!D
!FIIL#'K'KEGZQZ$)
g@r:   r   c                  Z    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
S	rg
)
TestLoggeri  c                    g r   r>   r   s    r8   flushTestLogger.flush      r:   c                    g r   r>   r   harnesss     r8   startTestLogger.start  rY  r:   c                    g r   r>   r   r\  tests      r8   
start_testTestLogger.start_test  rY  r:   c                    g r   r>   )r   r\  ra  rK   r   s        r8   log_subtestTestLogger.log_subtest  rY  r:   c                    g r   r>   )r   r\  rL   s      r8   logTestLogger.log  rY  r:   c                   #    g 7fr   r>   r[  s     r8   finishTestLogger.finish  s     s   c                    g r   r>   r   s    r8   closeTestLogger.close  rY  r:   r>   Nr   Noner\  'TestHarness'r   rq  r\  rs  ra  	'TestRun'r   rq  )
r\  rs  ra  ru  rK   r   r   r   r   rq  r\  rs  rL   ru  r   rq  )r   r   r   r   rW  r]  rb  re  rh  rk  rn  r   r>   r:   r8   rU  rU    s%    r:   rU  c                  ,    \ rS rSrSSS jjrSS jrSrg)	TestFileLoggeri  c                2    Xl         [        USSUS9U l        g )NrN   utf-8encodingr   )filenameopenfile)r   r}  r   s      r8   __init__TestFileLogger.__init__  s     3H	r:   c                j    U R                   (       a"  U R                   R                  5         S U l         g g r   )r  rn  r   s    r8   rn  TestFileLogger.close  s#    99IIOODI r:   )r  r}  N)replace)r}  r   r   r   r   rq  rp  )r   r   r   r   r  rn  r   r>   r:   r8   rx  rx    s    Ir:   rx  c                      \ rS rSr/ SQr/ SQrSrSrSrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)ConsoleLoggeri  )z..z:.z.:)u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘u   ✀ u   ―u   ▶ c                l   Xl         [        5       U l        S U l        S U l        SU l        SU l        U   SU l        SU l        SU l	        SU l
         [        R                  " S5      u  U l        nSU l        [!        U R"                  U R$                  U R                  S-
  5      U l        [!        SU R$                  U R                  S-
  5      U l        U R*                  U l        U R.                  U l         U R&                  R3                  [4        R6                  R8                  =(       d    S5        g ! [         a    SU l        SU l         Nf = f! [:         aY    [!        S	S
U R                  S-
  5      U l        [!        SS
U R                  S-
  5      U l        SU l        U R<                  U l         g f = f)Nr   Fr1   r	   TP   r@   r   z8<r0   z| )rw   r   running_testsprogress_testprogress_taskmax_left_widthstopshould_erase_line
test_countstarted_testsspinner_indexosget_terminal_sizer   is_ttyOSErrorr   SCISSORSHLINEoutput_start
output_endRTRIsubSPINNERspinnerr   r=   stdoutr|  r   ASCII_SPINNER)r   rw   _s      r8   r  ConsoleLogger.__init__  sg   "4>L489=	 	!#	 //2LDIqDK
 #4==$**dii!mL TZZQ?99||	.$$SZZ%8%8%CGD  	 DIDK	  " 	. &tS$))a- @D$Rdii!m<DODH--DL		.s%   %D2 5<E 2EEA F32F3c                ^    U R                   (       a  [        U R                   SS9  SU l         g g )Nr1   r   )r  r   r   s    r8   rW  ConsoleLogger.flush;  s(    !!$((b1%'D" "r:   c                >    [        U R                  USSS9  SU l        g )Nr1   )sepr   z[K)r   r  )r   r*  s     r8   print_progressConsoleLogger.print_progress@  s    d$$d=!)r:   c                8    U R                   R                  5         g r   )updatesetr   s    r8   request_updateConsoleLogger.request_updateD  s    r:   c                
   U R                   c  U R                  5         g [        U R                  5      S:X  a  U R                   SU R
                   3nOJSR                  U R                  [        U R                  5      -
  S-   U R                  U R
                  5      nSR                  X R                  U R                     5      nU R                  S-   [        U R                  5      -  U l        SR                  S[        R                  5       -  [        [        R                  " 5       U R                   R                  -
  5      UR                  S9nU R                   R                  (       a1  USR                  U R                   R                  UR                  S	9-  nUS
-  nU R                   R!                  5       nU(       a  USU-   -  nUR                  U R                   SU R"                  X4S9nU R%                  U5        g )Nr	   rQ   z{}-{}/{}z[{}] {} z{spaces} {dur:{durlen}}r   )spacesdurdurlenz/{timeout:{durlen}})timeoutr  rK      T)r   r  leftright)r  rW  rS   r  r  r  r   r  r  r   r   rV   time	starttimeduration_max_lenr  get_detailsr  r  )r   r\  countr  r  detailsr*  s          r8   emit_progressConsoleLogger.emit_progressG  s   %JJLt!!"a'))*!DOO+<=E%%d&8&83t?Q?Q;R&RUV&V&*&8&8$//KE   T5G5G(HI"0014DLL8II)00**,,DIIK$"4"4">">>?++ 1 - %%*11**22// 2 1 1E 	$$002UW_$E~~d004-1-@-@#'  6 	D!r:   c                  ^ ^ SUU 4S jjn[         R                  " 5       T l        TR                  T l        [	        T R
                  TR                  S-   5      T l        T R                  (       a\  TR                  (       dJ  S[        [        T R                  5      5      -  S-   T l        [         R                  " U" 5       5      T l        g g g )Nc                 H  >#    [         R                  " 5       n SnTR                  5         TR                  (       GdQ  TR                  R                  5       I S h  vN   TR                  R                  5         U R                  5       U:  a6  S Tl        U R                  5       S-   nU R                  UTR                  5        TR                  (       a.  TR                  R                  [        R                  La  S Tl        TR                  (       dV  TR                  (       d  M  TR                  R                  SS9Tl        TR                  R                  TR                  5        TR!                  T5        TR                  (       d  GMQ  TR#                  5         g  GNE7f)Ng        r	   Flast)asyncioget_running_loopr  r  r  waitclearr  r  call_atr   r   r   r  popaddr  rW  )loopnext_updater\  r   s     r8   report_progress,ConsoleLogger.start.<locals>.report_progressh  s.    ++-DK!iiikk&&(((!!# 99;+-)-D&"&))+/KLLd.A.AB&&**..j6H6HH)-D&))-- )-););)?)?U)?)KD&&&**4+=+=>""7+- iii. JJL- )s   AF"FD0F"F"   r%   r&   rp  )r  Eventr  r  rD  r   r  r  need_consolerS   r   ensure_futurer  )r   r\  r  s   `` r8   r]  ConsoleLogger.startg  s    	 	: mmo!,,		7#9#9B#>?	;;w33"#c#doo*>&?"?!"CD!(!6!67H!ID  4;r:   c                   UR                   (       a  UR                  (       a  U R                  5         [        UR	                  U[
        R                  " 5       U R                  UR                  R                  [
        R                  " 5       5      S95        [        UR                  R                  5       UR                  -   5        UR                  (       a  [        U R                  SS9  OUR                  (       d	  [        SS9  U =R                  S-  sl        U R                  R!                  U5        U R                  R#                  USS9  U R%                  5         g )N)r  r  TrW  r	   Fr  )verbosecmdlinerW  r   r   r   colorize_consoler  r   r   r   direct_stdoutr  needs_parsingr  r  r  move_to_endr  r`  s      r8   rb  ConsoleLogger.start_test  s    <<DLLJJL'..t'<'<'>040C0C'+xx'8'89N9N9P'Q ! S T $((--/$,,>?!!d''t4''D!at$&&t%&8r:   c                   UR                   (       d  UR                  R                  (       d  gUR                  [        R
                  " 5       UR                  S9nUR                   (       a  U$ UR                  5       n[        U5      U R                  :  a  U$ [        [        R                  " SU R                   S35      5      SR                  X@R                  * S  5      -   $ )Nr1   )stderr_onlyzListing only the last z lines from a long log.
r   )r  optionsprint_errorlogsget_logr   r  r  
splitlinesrS   rw   r   boldr   )r   r\  rL   rh  r)  s        r8   shorten_logConsoleLogger.shorten_log  s    ~~goo&E&EnnT224)/)=)=  ?>>J u:&Jtyy#9$..9IIb!cdehlhqhqrw  zH  zH  yH  yI  sJ  iK  K  Kr:   c                   UR                   (       dj  UR                  nU(       d1  [        UR                  R	                  5       UR
                  -   5        g [        UR                  R	                  5       U-   5        U R                  X5      nU(       a6  [        U R                  5        [        U5        [        U R                  5        g g r   )
r  r  r   r   r   stdor  r  r   r  )r   r\  rL   r  rh  s        r8   	print_logConsoleLogger.print_log  s    ~~nnGfjj335CD&**//1G;<w/$##$sO$//" r:   c                   UR                   (       d0  UR                  R                  (       a  UR                  5       (       a  U R	                  5         [        UR                  U[        R                  " 5       U R                  U R                  UUR                  [        R                  " 5       5      S9SS9  U R                  5         g g g )N)r  prefixmiddler  Tr  )r  r  r  r   rW  r   r   r   r  r  r  r   r  )r   r\  ra  rK   rL   s        r8   re  ConsoleLogger.log_subtest  s    <<GOO;;JJL'..t'<'<'>tObOb(,()'-t7L7L7N'O ! Q Y]^
 ! AP;r:   c                   U R                   R                  U5        UR                  [        R                  L aa  UR
                  (       d  UR                  R                  (       a5  U R                  5         [        UR                   SUR                   S35        UR                  R                  (       a   UR                  R                  5       (       Gdo  U R                  5         UR                  (       a^  UR                  (       aM  [        U R                   5        [        UR#                  U[$        R&                  " 5       U R(                  S95        Ow[        UR#                  U[$        R&                  " 5       U R(                  S9SS9  UR
                  (       d  UR                  R+                  5       (       a  U R-                  X5        UR.                  (       a/  [        SS9  UR.                   H  n[        USS9  M     [        SS9  UR
                  (       d  UR                  R+                  5       (       a	  [        SS9  U R1                  5         g )Nz time out (After z	 seconds))r  Tr  )r  remover   r   r   r  r  r  rW  r   r   r  quietr   r  r  r  r   r   r  r  r   r  warningsr  )r   r\  rL   rN   s       r8   rh  ConsoleLogger.log  sz   !!&)::+++181P1PJJLV[[M!26>>2B)LM$$FJJ,<,<,>,>JJL~~&"6"6doo&gnnVT-B-B-DUYUhUhnijgnnVT-B-B-DUYUhUhni ">>VZZ%6%6%8%8NN73D!A!4( )D!~~!2!2!4!4D!r:   c                  #    SU l         U R                  5         U R                  (       a  U R                  I S h  vN   UR                  (       a  UR                  R
                  (       d  UR                  R                  (       aX  [        S5        [        UR                  S5       H3  u  p#[        UR                  U[        R                  " 5       5      5        M5     [        UR                  5       5        g  N7f)NTz
Summary of Failures:
r	   )r  r  r  collected_failuresr  r  r  r   	enumerater   r   r  summaryr   r\  irL   s       r8   rk  ConsoleLogger.finish  s     	$$$$%%00GOO4K4K,-&w'A'A1E	gnnVT-B-B-DEF F 	goo  %s   8C:C8B>C:)r   r  r  rw   r  r  r  r  r  r  r  r  r  r  r  r  r  N)rw   rV   r   rq  rp  )r*  r   r   rq  rr  rt  )r\  rs  rL   ru  r   r   rv  )
r\  rs  ra  ru  rK   r   rL   r   r   rq  )r   r   r   r   r  r  r  r  r  r  rW  r  r  r  r]  rb  r  r  re  rh  rk  r   r>   r:   r8   r  r    sa    &MGG HED.B(
*"@%JN"K#"6!r:   r  c                  2    \ rS rSrSS jrSS jrSS jrSrg)	TextLogfileBuilderi  c                "   U R                   R                  S[        R                  R                  5       R	                  5        S35        [        [        R                  R                  5       5      nU R                   R                  SU S35        g )NzLog of Meson test suite run on 

zInherited environment: )	r  writedatetimenow	isoformatr   r  environitems)r   r\  inherit_envs      r8   r]  TextLogfileBuilder.start  sg    		9(:K:K:O:O:Q:[:[:]9^^bcd&rzz'7'7'9:		1+dCDr:   c                   UR                    SUR                   3nU R                  R                  [	        USS5      S-   5        U R                  R                  SUR
                  -   S-   5        [        R                  " S[        R                  " UR                  5      5      nU R                  R                  SU-   S-   5        U R                  R                  SS	UR                  -  -   S-   5        U R                  R                  S
UR                  5       -   S-   5        UR                  (       a+  U R                  R                  SUR                  -   S-   5        UR                  (       am  UR                  R                  (       a  SOSnU R                  R                  [	        USS5      S-   5        U R                  R                  UR                  5        UR                   (       aN  U R                  R                  [	        SSS5      S-   5        U R                  R                  UR                   5        U R                  R                  [	        SSS5      S-   5        g )NrQ   =N   r   ztest:         z%H:%M:%Szstart time:   zduration:     z%.2fszresult:       zcommand:      r  outputr0   stderrr1   r  )r"  r  r  r  r   r   r  strftimegmtimer  durationget_exit_statusr  r  r  rR   stde)r   r\  rL   titlestarttime_strr   s         r8   rh  TextLogfileBuilder.log  s   ::,a 2 234		uc2.56		(6;;6=>j$++f>N>N2OP		(=84?@		(7V__+DDtKL		(6+A+A+CCdJK>>IIOO,v~~=DE;;&448(DIIOOF4b1D89IIOOFKK(;;IIOOF8S"5<=IIOOFKK(		r3+f45r:   c                  #    UR                   (       ah  U R                  R                  S5        [        UR                   S5       H3  u  p#U R                  R                  UR	                  US5      S-   5        M5     U R                  R                  UR                  5       5        [        SU R                   35        g 7f)Nz
Summary of Failures:

r	   Fr   zFull log written to )r  r  r  r  r   r  r   r}  r  s       r8   rk  TextLogfileBuilder.finish	  s     %%IIOO89&w'A'A1E			vu = DE F		)*$T]]O45s   B<B>r>   Nrr  rv  )r   r   r   r   r]  rh  rk  r   r>   r:   r8   r  r    s    E
6&6r:   r  c                      \ rS rSrSS jrSrg)JsonLogfileBuilderi  c           	     r   UR                   UR                  UR                  R                  UR                  UR
                  UR                  UR                  UR                  S.nUR                  (       a  UR                  US'   U R                  R                  [        R                  " U5      S-   5        g )N)r   r  rL   r  r  
returncoder   commandr  r   )r   r  r   r   r  r  r  r   cmdr  r  r  jsondumps)r   r\  rL   jresults       r8   rh  JsonLogfileBuilder.log  s    KKkkjj&&)) ++::zz	'
 ;; &GH		

7+d23r:   r>   Nrv  )r   r   r   r   rh  r   r>   r:   r8   r  r    s    4r:   r  c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)JunitBuilderi$  a  Builder for Junit test results.

Junit is impossible to stream out, it requires attributes counting the
total number of tests, failures, skips, and errors in the root element
and in each test suite. As such, we use a builder class to track each
test case, and calculate all metadata before writing it out.

For tests with multiple results (like from a TAP test), we record the
test as a suite with the project_name.test_name. This allows us to track
each result separately. For tests with only one result (such as exit-code
tests) we record each one into a suite with the name project_name. The use
of the project_name allows us to sort subproject tests separately from
the root project.
c                V    Xl         [        R                  " SSSSS9U l        0 U l        g )N
testsuites0testsr   failures)r}  etElementrootsuites)r   r}  s     r8   r  JunitBuilder.__init__5  s'     JJC#?	/1r:   c                   UR                   Gb  UR                   R                  S5       H  nSR                  UR                  UR                  UR
                  S   5      UR
                  S'   UR                  S5       H  nUR
                  S	 M     UR                  S5       H  nUR
                  S	 M     UR                  S	5       H  nUR
                  S
	 M     UR                  S5       H  nUR
                  S	 M     U R                  R                  U5        M     gUR                  (       Ga  UR                   SUR                   3nXPR                  ;  d!  UR                  R                  S:  d   S5       e[        R                  " SU[        [        UR                  5      5      [        [!        S UR                   5       5      5      [        [!        S UR                   5       5      5      [        [!        S UR                   5       5      5      [        UR"                  5      S9=o0R                  U'   UR                   GH  n[        R$                  " US[        U5      US9nUR&                  [(        R*                  L a  [        R$                  " US5        GOZUR&                  [(        R,                  L a   [        R$                  " US5      nSUl        GOUR&                  [(        R0                  L a  [        R$                  " US5        OUR&                  [(        R2                  L a  [        R$                  " US5        OUR&                  [(        R4                  L a  [        R$                  " US5      n	SU	l        OwUR&                  [(        R6                  L a  [        R$                  " US5      n	SU	l        O;UR&                  [(        R8                  L a  [        R$                  " US5      n	SU	l        UR:                  (       d  GM  UR:                  [        R$                  " US5      l        GM     UR<                  (       a?  [        R$                  " US5      n
[?        UR<                  RA                  5       5      U
l        URB                  (       a@  [        R$                  " US5      n[?        URB                  RA                  5       5      Ul        ggUR                  U R                  ;  aP  [        R                  " SUR                  S S!S!S![        UR"                  5      S9=o0R                  UR                  '   OJU R                  UR                     n[        [E        UR
                  S"   5      S-   5      UR
                  S"'   [        R$                  " USUR                  UR                  [        UR"                  5      S#9nURF                  [(        R*                  L aJ  [        R$                  " US5        [        [E        UR
                  S   5      S-   5      UR
                  S'   GOURF                  [(        R,                  L aQ  [        R$                  " US5      nSUl        [        [E        UR
                  S   5      S-   5      UR
                  S'   GOURF                  [(        R0                  L aJ  [        R$                  " US5        [        [E        UR
                  S$   5      S-   5      UR
                  S$'   GOURF                  [(        R2                  L aJ  [        R$                  " US5        [        [E        UR
                  S%   5      S-   5      UR
                  S%'   GOFURF                  [(        R4                  L aP  [        R$                  " US5      n	SU	l        [        [E        UR
                  S%   5      S-   5      UR
                  S%'   OURF                  [(        R6                  L aP  [        R$                  " US5      n	SU	l        [        [E        UR
                  S$   5      S-   5      UR
                  S$'   OlURF                  [(        R8                  L aO  [        R$                  " US5      n	SU	l        [        [E        UR
                  S$   5      S-   5      UR
                  S$'   UR<                  (       a?  [        R$                  " US5      n
[?        UR<                  RA                  5       5      U
l        URB                  (       a@  [        R$                  " US5      n[?        URB                  RA                  5       5      Ul        gg)&zLog a single test case.Nz.//testsuitez{}.{}.{}r   z.//testcase[@result]rL   z.//testcase[@timestamp]	timestampz.//testcase[@file]r  z.//testcase[@line]r*  .r	   zduplicate suite	testsuitec              3     #    U  H6  oR                   [        R                  [        R                  1;   d  M2  S v   M8     g7fr	   N)rL   r   r   r   .0rs     r8   	<genexpr>#JunitBuilder.log.<locals>.<genexpr>Y  s3      I,Q(( * 4 4j6F6FG;Hqq,
   1A 	A c              3     #    U  HE  oR                   [        R                  [        R                  [        R                  1;   d  MA  S v   MG     g7fr/  )rL   r   r   r   r   r0  s     r8   r3  r4  [  s9      !cLqHH",//:3L3LjN`N`!a=bLs   A A	Ac              3     #    U  H6  oR                   [        R                  [        R                  1;   d  M2  S v   M8     g7fr/  rL   r   r   r   r0  s     r8   r3  r4  ]  s1       G<a88!+*2D2D E<F<r5  )r   r#  r   r$  r   r  testcase)r   	classnamer   zTest output was not parsed.errorfailurezTest unexpectedly passed.zTest was interrupted by user.z.Test did not finish before configured timeout.z
system-outz
system-err1r!  r#  )r   r:  r  r   r$  )$junitfindallr   projectr   attribr'  rm   resultsr(  r  ra   r%  r&  r   rS   sumr  
SubElementrL   r   r   r   textr   r   r   r   r   r   r  replace_unencodable_xml_charsr7  r  rV   r   )r   r\  ra  suitecase	suitenamesubtestr9  skipfailouterrs               r8   rh  JunitBuilder.log;  s   ::!++N;'1'8'8tyyRWR^R^_eRf'gV$ "MM*@ADH- B!MM*CDDK0 E!MM*>?DF+ @!MM*>?DF+ @		  ' < 
 <<<<<.$))5IKK/7??3I3IA3M`O``M-/ZZ#dll+,3 I$,, I I JS !cDLL !c c dC  G4<<  G G H'. EKK	*  << ==
WYbc>>Z__4MM(I6^^z'9'99==9=D =DI^^z'7'77MM(G4^^z6MM(I6^^z'@'@@==9=D ;DI^^z';';;==7;D ?DI^^z'9'99==7;D PDI&&&AHATATBMM(L9>/ (0 yymmE<889I9I9KLyymmE<889I9I9KL  ||4;;.46JJdll#c #C4F5H HDLL1 DLL1(+CW0E,F,J(KW%}}UJTYY/3||#dmmBTVHxx:??*h	2*-c%,,y2I.JQ.N*OY'Z///}}Xy99	*-c%,,y2I.JQ.N*OY'Z---h0),Sh1G-H1-L)MX&Z__,h	2+.s5<<
3K/Lq/P+QZ(Z666}}Xy97	+.s5<<
3K/Lq/P+QZ(Z111}}Xw7;	),Sh1G-H1-L)MX&Z///}}Xw7L	),Sh1G-H1-L)MX&yymmHl;89I9I9KLyymmHl;89I9I9KL r:   c           	       #    U R                   R                  5        H  nU R                  R                  U5        S H^  n[	        [        U R                  R                  U   5      [        UR                  U   5      -   5      U R                  R                  U'   M`     M     [        R                  " U R                  5      n[        U R                  S5       nUR                  USSS9  SSS5        g! , (       d  f       g= f7f)z9Calculate total test counts and write out the xml result.r"  wbrz  T)r|  xml_declarationN)r(  rY   r'  rm   r   rV   rA  r%  ElementTreer~  r}  r  )r   r\  rG  attrtreefs         r8   rk  JunitBuilder.finish  s     [['')EIIU#7),S1A1A$1G-H3u||\`OaKb-b)c		  & 8 * ~~dii($--&!JJq7DJA '&&s   CDC4+	D4
D>D)r}  r'  r(  N)r}  r   r   rq  rt  rr  )	r   r   r   r   __doc__r  rh  rk  r   r>   r:   r8   r  r  $  s    2nM`
Br:   r  c                     ^  \ rS rSr% Sr0 rS\S'   SU 4S jjr          SS jrSS jr	\
SS j5       r\
SS	 j5       r\
SS
 j5       rSS jrSS jrSS jrSS jr\
SS j5       rSS jrSS jrSS S jjr\
SS j5       rS!S jrSrU =r$ )"TestRuni  r   z'T.Dict[TestProtocol, T.Type['TestRun']]PROTOCOL_TO_CLASSc                X   > [         TU ]  [        R                  UR                     5      $ r   )super__new__rZ  r[  protocol)clsra  rx   kwargs	__class__s       r8   r^  TestRun.__new__  s!    ww88GHHr:   c                `   [         R                  U l        Xl        S U l        X0l        X@l        / U l        S U l        S U l	        S U l
        SU l        SU l        SU l        S U l        X l        UR                   U l        UR"                  U l        S U l        XPl        X`l        Xpl        / U l        g Nr1   )r   r   r   ra  _numr   r  rB  r  r  r  r  r  additional_errorr  r   should_failproject_namer@  r>  is_parallelr  rg   r  )r   ra  test_envr   r  rj  r  rg   s           r8   r  TestRun.__init__  s     %%	%)		/1+/,0+/		 ",0++((15
&&%'r:   c                n    [         R                  U l        [        R                  " 5       U l        Xl        g r   )r   r   r   r  r  r  )r   r  s     r8   r]  TestRun.start  s!    %%r:   c                    U R                   c.  [        =R                  S-  sl        [        R                  U l         U R                   $ Nr	   )rf  rZ  TEST_NUMr   s    r8   r"  TestRun.num  s4    99!((DIyyr:   c                    U R                   (       a  [        R                  $ U R                  (       a  [        R                  $ [        R
                  $ r   )rg   r   r   r  r   r   r   s    r8   console_modeTestRun.console_mode  s8    ***%%%%%%r:   c                z    U R                   =(       a)    U R                  (       + =(       a    U R                  (       + $ r   )r  rj  r  r   s    r8   r  TestRun.direct_stdout  s(    ||OD$4$4 4OT=O=O9OOr:   c                    U R                   (       aJ  [        S U R                    5       5      n[        S U R                    5       5      nX:X  a  U S3$ U SU S3$ g)Nc              3  T   #    U  H  oR                   R                  5       v   M      g 7fr   )rL   r   r1  r   s     r8   r3  &TestRun.get_results.<locals>.<genexpr>  s     @<a))<s   &(c              3  z   #    U  H1  oR                   [        R                  [        R                  1;  v   M3     g 7fr   r8  rz  s     r8   r3  r{    s)     bUaPQhhz
8J8J&KKUas   9;z subtests passedrQ   r1   )rB  rC  )r   passedrans      r8   get_resultsTestRun.get_results  s^    <<@4<<@@FbUYUaUabbC} !122 3%'788r:   c                ,    [        U R                  5      $ r   )r   r  r   s    r8   r  TestRun.get_exit_status  s    #DOO44r:   c                    U R                   [        R                  L a  gU R                  (       a  U R	                  5       $ U R                  5       $ re  )r   r   r   r  r  r  r   s    r8   r  TestRun.get_details  s<    88z)))??''))!!r:   c                   U R                   [        R                  :X  a  [        R                  U l         U R                  (       a2  U R
                  [        R                  L a  [        R                  U l         [        U R                   [        5      (       d   eU R                  (       ap  U R                   [        R                  [        R                  4;   aB  U R                   [        R                  L a  [        R                  O[        R                  U l         U R                  (       a5  U R                  R                  S5      (       d  U =R                  S-  sl        U R                   (       a5  U R                   R                  S5      (       d  U =R                   S-  sl        ["        R"                  " 5       U R$                  -
  U l        g r   )r   r   r   r   r  rt  r   r   r   
isinstancerh  r   r   r   r  endswithr  r  r  r  r   s    r8   	_completeTestRun._complete  s   88z)))!}}DH$"3"3{7N7N"N!))DH$((J////Z]]JOO,L L48HH
4Mz00S]SjSjDH99TYY//55III99TYY//55III		dnn4r:   c                   U R                   (       d  g [        U R                  R                  5       5      [        [        R
                  R                  5       5      -
  n[        U5      SR                  S U R                    5       5      -   $ )Nr   c              3  8   #    U  H  n[        U5      v   M     g 7fr   )r   rz  s     r8   r3  "TestRun.cmdline.<locals>.<genexpr>  s     3(QXa[[(   )r  r  r   r  r  r   r   r   )r   test_only_envs     r8   r  TestRun.cmdline  s`    xxDHHNN,-BJJ4D4D4F0GG.HH3$((334 	4r:   c                    [         R                   " 5       U l        [        U l        [        R
                  U l        U R                  5         g r   )r  r  GNU_SKIP_RETURNCODEr  r   r   r   r  r   s    r8   complete_skipTestRun.complete_skip  s+    -??r:   c                $    U R                  5         g r   )r  r   s    r8   completeTestRun.complete"  s    r:   c                   U(       a  SOU R                   nU R                  (       d  U R                  (       a  SnU(       a=  U[        R                  " S5      R                  U5      S-   -  nXC-  nUSS  S:w  a  US-  nU[        R                  " S5      R                  U5      S-   -  nU[        U R                  U R                  5      -  nOUnU(       a  USS  S:w  a  US-  nU$ )Nr1   zstdout:r   r   zstderr:)r  r  rg  r   cyanr   r   )r   r   r  r  r   s        r8   r  TestRun.get_log%  s     rdii99--Ctyy+44X>EErs8t#4KC499Y'00:TAAC:dii)>)>??CC3rs8t#4KC
r:   c                    g)NFr>   r   s    r8   r  TestRun.needs_parsing6  s    r:   c                ,   #    U  S h  vN nM   N
 g 7fr   r>   )r   r\  r)  ls       r8   r0  TestRun.parse:  s      	!	us   )rf  rg  r  r  r   rg   rj  r>  r   r@  r   rB  r  rh  r  r  r  ra  r  r  r  )ra  r   rx   T.Anyra  r  r   r  )ra  r   rk  T.Dict[str, str]r   r   r  r  rj  r   r  r   rg   r   )r  T.List[str]r   rq  r   r   r   r   r   rp  r   r   )FF)r   r   r  r   r   r   r\  rs  r)  rL  r   rq  )r   r   r   r   rq  r[  r   r^  r  r]  propertyr"  rt  r  r  r  r  r  r  r  r  r  r  r0  r   __classcell__rb  s   @r8   rZ  rZ    s    HAC>CI((%4(CG(RV("(2
   & & P P	5"5 4 4"   r:   rZ  c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )TestRunExitCodei?  c                  > U R                   [        R                  :w  a  OU R                  [        :X  a  [        R
                  U l         OiU R                  [        :X  a  [        R                  U l         O?[        U R                  5      (       a  [        R                  O[        R                  U l         [        TU ]1  5         g r   )r   r   r   r  r  r   GNU_ERROR_RETURNCODEr   r   r   r   r]  r  r   rb  s    r8   r  TestRunExitCode.completeA  st    88z)))__ 33!DH__ 44!''DH*.t*?*?zZ]]DHr:   r   rp  r   r   r   r   r  r   r  r  s   @r8   r  r  ?  s    	 	r:   r  c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )TestRunGTestiO  c                  > U R                   R                   S3nU R                   R                  (       a4  [        R                  R                  U R                   R                  U5      n [        USSSS9 n[        R                  " U5      U l	        S S S 5        [        TU ]=  5         g ! , (       d  f       N= f! [         a     N,[        R                   a'  n[        R                  " SU SU< 35         S nANaS nAff = f)N.xmlr2  utf8r  r{  zUnable to parse : )ra  r   workdirr  pathr   r~  r%  r0  r>  FileNotFoundError
ParseErrorr   r;  r]  r  )r   r}  rV  erb  s       r8   r  TestRunGTest.completeP  s    iinn%T*99ww||DII$5$5x@H
	=hfYG1XXa[
 H 	 HG  	 }} 	=JJ)(2aU;<<	=s<   +B; 7B*B; *
B84B; 8B; ;
DDC<<D)r>  rp  r  r  s   @r8   r  r  O  s     r:   r  c                  J   ^  \ rS rSr\SS j5       rSU 4S jjrSS jrSrU =r	$ )	
TestRunTAPif  c                    gNTr>   r   s    r8   r  TestRunTAP.needs_parsingg      r:   c                $  > U R                   S:w  aq  U R                  R                  5       (       dR  [        R                  U l        U R
                  =(       d    SU l        U =R
                  SU R                    S3-  sl        [        TU ]  5         g )Nr   r1   z'
(test program exited with status code r   )r  r   r   r   r   r  r]  r  r  s    r8   r  TestRunTAP.completek  sf    ??a(;(;(=(=!''DH		RDIIICDOOCTTUVVIr:   c           	     t  #    S n/ nSn[        5       R                  U5        S h  vN n[        U[         R                  5      (       a  UR                  nM6  [        U[         R
                  5      (       a.  [        R                  nUR                  XR                  U5        M  [        U[         R                  5      (       a  U R                  R                  U5        UR                  R                  5       (       a  [        R                  nUR                  XR                   =(       d    SUR"                   3UR                  5        GM+  [        U[         R$                  5      (       a  UR                  U5        GM^  [        U[         R&                  5      (       d  GM  U =R(                  SUR                  -   -  sl        [        R                  nGM   GN
 U(       a  [+        [,        R.                  " S5      5      n[1        [+        [3        S U 5       5      5      5      nU H=  n	U R4                  R                  SU	R6                  U  SU SU	R                   35        M?     US:  a  U R4                  R                  S	5        O;U R4                  R                  [+        [,        R8                  " S
5      5      S-   5        [;        S U R                   5       5      (       a$  U[        R                  :w  a  [        R<                  nU(       a&  U R>                  [        R@                  :X  a  X0l        g g g 7f)Nr(   zsubtest zTAP parsing error: UNKNOWNc              3  8   #    U  H  oR                   v   M     g 7fr   )r  )r1  r  s     r8   r3  #TestRunTAP.parse.<locals>.<genexpr>  s     ;(Q(r  zstdout: r  r3  zUnknown TAP output lines have been ignored. Please open a feature request to
implement them, or prefix them with a # if they are not TAP syntax.r   z: Unknown TAP output lines for a supported TAP version.
This is probably a bug in the test; if they are not TAP syntax, prefix them with a #c              3  X   #    U  H   oR                   [        R                  L v   M"     g 7fr   rL   r   r   r1  ts     r8   r3  r         ALqxx:??*L   (*)!r   r,  r  r  r   r  r   r   re  r  r  rB  rm   rL   r   r   r   r  r  r  rg  r   r   r   rS   rD  r  r  r   allr   r   r   )
r   r\  r)  r   r  r   r  unknownr   rN   s
             r8   r0  TestRunTAP.parser  sG    24 {..u5 	'!!Y..//))Ay0011 &&##D))S9Ay~~..##A&88??$$$//C##D&&*Ihqxxj4I188TAy4455"Ay//%%)>)JJ% &&	'5" $++i01GC;(;;<=E$$x%/AG9Bqyyk%Z[ |$$ &k l $$S'):%; ?| &| }ADLLAAAj&&& oo488z111H 23s-    L8GGGE3L8"5L8GEL8)r   r  r   rp  r  )
r   r   r   r   r  r  r  r0  r   r  r  s   @r8   r  r  f  s$     ' 'r:   r  c                  2    \ rS rSr\SS j5       rSS jrSrg)TestRunRusti  c                    gr  r>   r   s    r8   r  TestRunRust.needs_parsing  r  r:   c                v  #    S
S jnSnU  S h  vN n[         R                  U5      nU(       d  M'  UR                  5       u  px[        R                  U5      n	U	(       a'  SR	                  S U	R                  5        5       5      nOUR                  5       nUR                  SS5      nU" XGU5      n
U R                  R                  U
5        UR                  XU
R                  5        US-  nM   N
 S n[        S U R                   5       5      (       a  [        R                  nOc[        S U R                   5       5      (       a  [        R                  nO1[        S	 U R                   5       5      (       a  [        R                   nU(       a&  U R"                  [        R$                  :X  a  Xl        g g g 7f)Nc                T   US:X  a%  [         R                  X[        R                  S 5      $ US:X  a%  [         R                  X[        R                  S 5      $ US:X  a%  [         R                  X[        R
                  S 5      $ [         R                  X[        R                  SU 35      $ )Nr!  ignoredFAILEDz#Unsupported output from rust test: )r   r  r   r   r   r   r   )nr   rL   s      r8   	parse_res$TestRunRust.parse.<locals>.parse_res  s    ~ ~~az}}dCC9$ ~~azEE8# ~~azEE>>!:+;+;$Gx"PR Rr:   r	   :c              3  R   #    U  H  o(       d  M  UR                  5       v   M     g 7fr   )r7  rz  s     r8   r3  $TestRunRust.parse.<locals>.<genexpr>  s     $O9IAQZQXXZZ9Is   
''z::r,  c              3  X   #    U  H   oR                   [        R                  L v   M"     g 7fr   r  r  s     r8   r3  r    r  r  c              3  X   #    U  H   oR                   [        R                  L v   M"     g 7fr   )rL   r   r   r  s     r8   r3  r    s     D|!Z---|r  c              3  X   #    U  H   oR                   [        R                  L v   M"     g 7fr   )rL   r   r   r  s     r8   r3  r    s     ClZ__,lr  )r  rV   r   r   rL   r   r   r   )RUST_TEST_REr;  groupsRUST_DOCTEST_REr   r7  r  rB  rm   re  rL   r  r   r   anyr   r   r   r   )r   r\  r)  r  r  r*  r;  r   rL   doctestr  r   s               r8   r0  TestRunRust.parse  sL    	R  	$ &&t,Eu$||~)//588$O9I$OPD;;=D||D#.av.##A&##D9Q	% ADLLAAA//CDt||DDD""CCdllCCC//C488z111H 23s,   
F9C3C1C3F9B>F91C33CF9r  Nr   r  )r   r   r   r   r  r  r0  r   r>   r:   r8   r  r    s     &r:   r  c                2    S n[         R                  X5      $ )Nc                :    [        U R                  5       5      SS $ )Nr	   r   )reprr=  )illegal_chrs    r8   r   /replace_unencodable_xml_chars.<locals>.<lambda>  s    T+2C2C2E-Fq-Lr:   )UNENCODABLE_XML_CHRS_REr  )original_strreplacement_lambdas     r8   rF  rF    s     M"&&'9HHr:   c                n    U c  g U R                  S5      $ ! [         a    U R                  SSS9s $ f = f)Nr1   rz  z
iso-8859-1ignorer   )r   UnicodeDecodeError)streams    r8   r   r     s@    ~<}}W%% <}}\(};;<s    44c                  #    / n U R                  5       (       d   U R                  S5      I S h  vN nU(       aj  [        U5      R                  SS5      nUR                  U5        U[        R                  L a  [        USSS9  U(       a  UR                  U5      I S h  vN   U R                  5       (       d  M  SR                  U5      U(       a  UR                  S 5      I S h  vN   $ $  N! [        R                   a  nUR                  n S nANS nAf[        R
                   a/  nU R                  UR                  5      I S h  vN  n S nAGN"S nAff = f N Nx! [        R                    a6    SR                  U5      s U(       a  UR                  S 5      I S h  vN    $ $ f = f! U(       a  UR                  S 5      I S h  vN    f f = f7f)N   
z
r   r1   T)r   rW  )at_eof	readuntilr  IncompleteReadErrorpartialLimitOverrunErrorreadexactlyconsumedr   r  rm   r   r   r   putr   CancelledError)readerqueuert  
stdo_lines
line_bytesr  r*  s          r8   read_decoder    sv     J"--//B#)#3#3E#::

 j)11&$?!!$';#5#55$Bd3))D/)) --// wwz" ))D/!! ! ;.. 'YY
,, B#)#5#5ajj#AAA
B * "	 !! #wwz""))D/!! # ))D/!! s   GE# C1 C/C1 A,E# !E"E# =E# G(E!)G/C1 1EDE# E-EEEE# EE# !G#%F-F0 	G$F'%G,F--F0 0GGGGc                r    U R                  S5      =(       a     [        5       =(       d
    [        5       (       + $ )Nz.exe)r  r9   r?   )fnames    r8   run_with_monor    s"    >>&!G:<+F9;&GGr:   c                `   [        U [        5      (       d  [        S[        5      eU  H  n[        U[        5      (       d  [        S[        5      e[        US5      (       d  [        S[        5      e[        UR                  [        5      (       d  Mj  [        UR                  [        5      e   U $ )Nz	<unknown>r   )r  rh   r   coredata_versionr   hasattrr   r   )objsobjs     r8   check_testdatar    s    dD!!+K9IJJ#011/=MNNsI&&/=MNN .>??/=MNN  Kr:   c               v   #     U R                  5       I S h  vN nU R                  5         Uc  g U7v   M3   N7fr   )get	task_done)qitems     r8   
queue_iterr  	  s3     
UUW}	<
 s   97 9c                Z   #     U I Sh  vN   g N! [         R                   a     gf = f7f)z?Wait for completion of the given future, ignoring cancellation.N)r  r  )futures    r8   r  r    s(     !! s(   +  + (+(+c                h  #    SS jn[         R                  " 5       nUc  SOUR                  5       U-   nU (       ak  Ub  US:  ab  [         R                  " X[         R                  S9I Sh  vN u  pPU" U5        U(       a  XCR                  5       -
  nU (       a  Uc  MZ  US:  a  Mb  U" U 5        g ND7f)a  Wait for completion of all the given futures, ignoring cancellation.
If timeout is not None, raise an asyncio.TimeoutError after the given
time has passed.  asyncio.TimeoutError is only raised if some futures
have not completed and none have raised exceptions, even if timeout
is zero.c                    SnU  HC  nUR                  5       (       d  SnM  UR                  5       (       a  M3  UR                  5         ME     U(       a  [        R                  eg NFT)done	cancelledrL   r  TimeoutError)futuresr  rV  s      r8   check_futures#complete_all.<locals>.check_futures   sK    A6688[[]]
	 
 &&& r:   Nr   )r  return_when)r  T.Iterable[asyncio.Future]r   rq  )r  r  r  r  FIRST_EXCEPTION)r  r  r  r  deadliner  s         r8   complete_allr"    s     	' ##%DtDIIK',AH
w'A+%ll77>7N7NP Pd,G w'A+ 'Ps   A)B2+B0,1B2B2'
B2c                  b    \ rS rSr S	     S
S jjrSS jr      SS jrSS jrSS jrSr	g)TestSubprocessi9  Nc                l    Xl         X l        X0l        S U l        S U l        X@l        / U l        S U l        g r   )_processr  r  	stdo_task	stde_taskpostwait_fnall_futuresr   )r   pr  r  r)  s        r8   r  TestSubprocess.__init__:  s6     9=9=&35AE
r:   c                `    [         R                  " 5       U l        [        U R                  5      $ r   )r  Queuer   r  r   s    r8   stdout_linesTestSubprocess.stdout_linesF  s    ]]_
$**%%r:   c                |  ^        SU 4S jjn      SS jnT R                   ck  T R                  b^  U" UT R                  R                  U5      n[        R                  " U5      T l         T R
                  R                  T R                   5        T R                  b  T R                  [        R                  R                  :w  a^  U" UT R                  R                  U5      n[        R                  " U5      T l
        T R
                  R                  T R                  5        T R                   T R                  4$ )Nc                Z   >#    [        UTR                  U5      I S h  vN U l        g  N
7fr   )r  r   r  )ra  r  rt  r   s      r8   collect_stdo0TestSubprocess.communicate.<locals>.collect_stdoN  s"      *&$**lKKDIKs   +)+c                D   #    [        US U5      I S h  vN U l        g  N
7fr   )r  r  )ra  r  rt  s      r8   collect_stde0TestSubprocess.communicate.<locals>.collect_stdeS  s      *&$EEDIEs     )ra  ru  r  asyncio.StreamReaderrt  r   r   rq  )r'  r  r&  r  r  r*  rm   r  
subprocessr   r(  )r   ra  rt  r3  r6  decode_coros   `     r8   communicateTestSubprocess.communicateJ  s   	L';	L-8	L=A	L
	F';	F-8	F=A	F >>!dkk&=&tT]]-A-A<PK$22;?DN##DNN3;;"t{{g6H6H6O6O'O&tT]]-A-A<PK$22;?DN##DNN3~~t~~--r:   c           	       #    U R                   n [        5       (       a0  [        R                  " SSSS[	        UR
                  5      /5        GO[        R                  " UR
                  [        R                  5        [        [        R                  5         [        R                  " UR                  5       SS9I S h  vN   S S S 5        UR                  bY   U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         g g [        R                  " UR
                  [        R&                  5        [        [        R                  5         [        R                  " UR                  5       SS9I S h  vN   S S S 5        UR                  bY   U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         g g UR)                  5         [        [        R                  5         [        R                  " UR                  5       SS9I S h  vN   S S S 5        UR                  bY   U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         g g  U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         gg GNq! , (       d  f       GNv= f GN! , (       d  f       GN= f N! , (       d  f       N= f! [*         as    UR                  5       I S h  vN     U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         g g f = f! U R                   (       a  U R                   R#                  5         U R$                  (       a  U R$                  R#                  5         f f = f7f)	Ntaskkillz/Fz/Tz/PIDg      ?r  r	   z!Test process could not be killed.)r&  r9   r9  runr   pidr  killpgr   SIGTERMr   r  r  wait_forr  r  r'  cancelr(  SIGKILLkillProcessLookupError)r   r+  s     r8   _killTestSubprocess._kille  s     MM)	(||
D$AEE
KL 		!%%0 g223!**1668SAAA 4<<+2 ~~%%'~~%%' 3 		!%%0'../&&qvvx;;; 0||'$ ~~%%'~~%%'  FFH'../&&qvvx;;; 0||' ~~%%'~~%%'  7 ~~%%'~~%%' ; B 43 < 0/ < 0/
 " 	 &&(NN~~%%'~~%%' 	 ~~%%'~~%%' s   QBM, 'L2>L/?L2M, AQ1AM, 9'M M!M%M, ;AQ)M, <'M#M$M(M, >AQAQ/L22
M<M, M
MM, M
M)%M, ,O)	N
O)O, AQ(O))O, ,AQQc                :  #    U R                   nU R                  R                  [        R                  " UR                  5       5      5         [        U R                  UR                  S9I S h  vN   U R                   (       a  U R!                  5         UR"                  =(       d    SUl        g  N@! [        R                   aM    U=R                  U R                  5       I S h  vN  =(       d    S-  sl	        [        R                  Ul         N[        R                   aM    U=R                  U R                  5       I S h  vN  =(       d    S-  sl	        [        R                  Ul         Nf = f! U R                   (       a  U R!                  5         f f = f7f)Nr?  r1   r   )r&  r*  rm   r  r  r  r"  r  r  rg  rI  r   r   r   r  r   r)  r  )r   ra  r+  s      r8   r  TestSubprocess.wait  s    MM 5 5affh ?@	#t//FFF   ",,+! G## 	*!!4::<%7%7%=2=!!))DH%% 	,!!4::<%7%7%=2=!!++DH	,
   "  sl   A
F!B1 .B//B1 3<F/B1 13E1$C'
%*E1E4 2E1E
*E1.E4 0E11E4 4$FF)r&  r*  r)  r   r(  r  r'  r  r   )r+  zasyncio.subprocess.Processr  r  r  r  r)  zT.Callable[[], None])r   rL  )ra  ru  rt  r   r   zCT.Tuple[T.Optional[T.Awaitable[str]], T.Optional[T.Awaitable[str]]]r  )ra  ru  r   rq  )
r   r   r   r   r  r/  r;  rI  r  r   r>   r:   r8   r$  r$  9  sX     6:
F(
F2A
F2
F&.#."-.3X.6.(`,r:   r$  c                      \ rS rSr  SS jr\SS j5       rSS jrSS jr\SS j5       r	\SS j5       r
\SS j5       rSS	 jr          SS
 jrSS jrSrg)SingleTestRunneri  c           	     p   Xl         X@l        U R                  5       U l        U R                  (       Ga%  U R                   R                  (       Ga	  [
        R                  R                  U R                   R                  S/-   5      US   -   US'   / nU R                   H  nUR                  U5        [
        R                  R                  U5      R                  S5      (       d  MI  [        UU R                   R                   Vs/ s H  nSU-   PM
     snUR                  SS5      R                  S5      -   U R                   R                  5      US'     O   SU;  d
  US   (       d4  UR                   (       d#  [#        [$        R&                  " SS	5      5      US'   S
U;  d
  US
   (       d  SUS
'   SU;  d
  US   (       d  SUS'   SU;  d
  US   (       d  SUS'   SU;  d
  US   (       d.   [(        R+                  U R                  5      S   nSU;   a  SUS'   U R                  R.                  (       d1  U R                   R0                  b  U R                   R0                  S::  a  S n	OxU R                  R2                  c  U R                   R0                  n	OJU R                  R2                  S::  a  S n	O-U R                   R0                  U R                  R2                  -  n	UR4                  =(       a;    U R                  R6                  S:  =(       a    U R                  R.                  (       + n
UR8                  =(       d    U R                  R8                  =(       a    U R                  R:                  (       + n[=        XX9XU R                  R.                  5      U l        g s  snf ! [,         a     GNf = f)Nr1   PATHwinezZ:WINEPATH;MALLOC_PERTURB_r	      ASAN_OPTIONSz0halt_on_error=1:abort_on_error=1:print_summary=1UBSAN_OPTIONSzChalt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1MSAN_OPTIONSVALGRIND_OPTSr   valgrindz--error-exitcode=1) ra  r  _get_cmdr  extra_pathsr  pathsepr   rm   r  basenamer   r   r  rR   r  	benchmarkr   randomrandintTestHarnessget_wrapper
IndexErrorrg   r  timeout_multiplierrj  num_processesr  r  rZ  runobj)r   ra  r   r   r  winecmdrM   r+  wrapper_namer  rj  r  s               r8   r  SingleTestRunner.__init__  s   	==?888		---**//$))*?*?2$*FG#f+UCKGXXq!77##A&11&99&8+/99+@+@A+@a+@ACGGJXZD[DaDabeDff		))'C
O
   S(4E0FPWPaPa%(3)?%@C!" #%S-@"TC3&c/.B#hC #%S-@"gC #%S-A*66t||DQG-+?C( <<##tyy'8'8'@DIIDUDUYZDZG\\,,4ii''G\\,,1Gii''$,,*I*IIG&&j4<<+E+E+IjRVR^R^RjRjNj<<74<<#7#7SASAS=SddllNfNfgY B<  s   N"--N' '
N54N5c                .    U R                   R                  $ r   )rg  rt  r   s    r8   rt  SingleTestRunner.console_mode  s    {{'''r:   c                   U R                   R                  S   nU R                  R                  (       aO  U R                   R                  (       a4  [
        R                  R                  U5      (       d  [        SU< S35      eUR                  S5      (       a  SS/U R                   R                  -   $ U R                   R                  (       d*  [        U5      (       a  S/U R                   R                  -   $ U R                   R                  (       Ga  U R                   R                  (       Ga  U R                   R                  (       a  U R                   R                  c  g U R                   R                  (       a  U R                   R                  R                  5       (       d:  Sn[        UR!                  U R                   R                  R"                  5      5      eU R                   R                  R%                  5       U R                   R                  -   $  U R                   R                  $ U R                   R                  (       aw  U R                   R                  (       d\  ['        5       (       aM  [(        R*                  " U R                   R                  S   5      nUb  X0R                   R                  S	S  -  nU$ U R                   R                  $ )
Nr   zThe test program z7 does not exist. Cannot run tests before building them.z.jarjavaz-jarmonozmThe exe_wrapper defined in the cross file {!r} was not found. Please check the command and/or add it to PATH.r	   )ra  r  r  
no_rebuildcmd_is_builtr  r  isfiler   r  is_cross_builtr  
cmd_is_exeneeds_exe_wrapperexe_wrapperfoundr   r   get_commandr9   r   _shebang_to_cmd)r   	testentrymsgtest_cmds       r8   _get_test_cmdSingleTestRunner._get_test_cmd  s   IIOOA&	<<""tyy'='=bggnnU^F_F_"3I=@w xyyf%%F#diioo55))mI.F.F8diioo--YY!!!dii&>&>&>499C^C^yy$$, %% yy,,2244TC'

4993H3H3M3M(NOOyy,,88:TYY__LL & yy YY##DII,@,@Z\\&66tyyq7IJH#IIOOAB//Oyyr:   c                v    U R                  5       nU(       d  g [        R                  U R                  5      U-   $ r   )r}  rb  rc  r  )r   r|  s     r8   r[  SingleTestRunner._get_cmd  s0    %%'&&t||4x??r:   c                .    U R                   R                  $ r   )rg  rj  r   s    r8   rj  SingleTestRunner.is_parallel  s    {{&&&r:   c                .    U R                   R                  $ r   )rg  r   r   s    r8   visible_nameSingleTestRunner.visible_name  s    {{r:   c                .    U R                   R                  $ r   )rg  r  r   s    r8   r  SingleTestRunner.timeout  s    {{"""r:   c                  #    U R                   cH  SU l        UR                  U R                  5        U R                  R	                  5         U R                  $ U R                   U R
                  R                  -   U R                  R                  -   nU R                  R                  U5        UR                  U R                  5        U R                  X5      I S h  vN   U R                  $  N7f)Nz7Not run because cannot execute cross compiled binaries.)r  r  log_start_testrg  r  ra  cmd_argsr  	test_argsr]  _run_cmd)r   r\  r  s      r8   r@  SingleTestRunner.run  s     88QDI""4;;/KK%%' {{	 ((TYY///$,,2H2HHCKKc"""4;;/-----{{ .s   CC/C-C/c          
       ^ ^
#    T R                   R                  (       aW  [        R                  " [        R                  5      m
[        R                  " [        R                  [        R
                  5        SU 4S jjnSU
U 4S jjn[        R                  " UUUUUU[        5       (       d  UOS S.6I S h  vN n	[        XU[        5       (       d  US9$ S S9$  N"7f)Nc                    > T R                   R                  (       a4  [        R                  " [        R                  [        R                  5        g [
        R                  " 5         g r   )r  rg   r   SIGINTSIG_DFLr  setsidr   s   r8   
preexec_fn4SingleTestRunner._run_subprocess.<locals>.preexec_fn-  s3    ||'' fmmV^^<
 		r:   c                    > TR                   R                  (       a&  [        R                  " [        R                  T 5        g g r   )r  rg   r   r  )previous_sigint_handlerr   s   r8   r)  5SingleTestRunner._run_subprocess.<locals>.postwait_fn8  s(    ||''fmm-DE (r:   )stdinr  r  r   cwdr  )r  r  r)  rp  )
r  rg   r   	getsignalr  SIG_IGNr  create_subprocess_execr9   r$  )r   rx   r  r  r  r   r  r  r)  r+  r  s   `         @r8   _run_subprocess SingleTestRunner._run_subprocess$  s      <<##&,&6&6v}}&E#MM&--8			F 	F
 00$7<8>8>5858NXllJ`df f av=G\\+U 	UOSU 	Ufs   B3C7C8#Cc           	       #    U R                   [        R                  L a  S nS nS nO[        R                  R
                  n[        R                  R                  nU R                  R                  (       d5  U R                  R                  (       d  [        R                  R                  O[        R                  R                  n/ nU R                  R                  [        R                  L a  U R                  R                   nU R                  R"                  (       aH  [$        R&                  R)                  U R                  R"                  U R                  R                   5      nUR+                  SU S35        U R-                  X&-   UUUU R                  R.                  U R                  R"                  S9I S h  vN nU R                  R                  (       a]  U R                   [        R                  La@  U R                  R1                  XR3                  5       5      n	[        R4                  " U	5      n
OS n
UR7                  U R                  U R                   5      u  pUR9                  U R                  5      I S h  vN   U
(       a
  U
I S h  vN   U(       a
  UI S h  vN   U(       a
  UI S h  vN   U R                  R;                  5         g  GN NU NF N7 N(7f)Nz--gtest_output=xml:r  )r  r  r  r   r  )rt  r   r   r  r9  DEVNULLPIPEr  rR   rg  r  r   ra  r_  r   GTESTr   r  r  r  r   rm   r  r   r0  r/  r  r;  r  r  )r   r\  r  r  r  r  	extra_cmd	gtestnamer+  
parse_coro
parse_taskr'  r(  s                r8   r  SingleTestRunner._run_cmdG  s     7 77EFF&&..E'',,F||))$++2K2K ''..'',,  "$	99!3!33		Iyy  GGLL):):DIINNK	29+TBC&&s-2.4.4+/;;??+/99+<+< ' > > ;;$$):):+BYBY)Y**7NN4DEJ ..z:JJ }}T[[$:K:KL	ffT[[!!!OOOO/> 	" s[   F;K =K>CK KK KK $K%K 5K6 K K K K K )r  r  rg  r  ra  N)ra  r   r   r  r   r   r  argparse.Namespacer  )r   zT.Optional[T.List[str]]r   r   )r   r  )r\  rs  r   rZ  )rx   r  r  r  r  r  r  r  r   r  r  r   r   r$  )r\  rs  r  r  r   rq  )r   r   r   r   r  r  rt  r}  r[  rj  r  r  r@  r  r  r   r>   r:   r8   rN  rN    s    :h,:hx ( (8@ ' '     # #
!U&5!U?N!U#3!U:I!UN\!UF*r:   rN  c                     \ rS rSrS$S jrS%S jrS&S jrS&S jrS'S jrS(S jr	S)S jr
S&S	 jrS*S
 jrS+S jrS,S jrS-S jr\S.S j5       r\S.S j5       rS/S jr     S0           S1S jjrS2S jrS.S jrS.S jr\S3S j5       r\S4S j5       rS5S jrS6S jrS7S8S jjrS&S jrS&S jr\S9S j5       r S:S jr!S;S jr"S<S  jr#S=S! jr$S;S" jr%S#r&g)>rb  it  c                   Xl         / U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        / U l        [        UR                  5      U l        U R                  R!                  U R                  5        SU l        S U l        S U l        U R                   R(                  (       Ga3  U R                   R*                  (       Gd  S n[,        R.                  R1                  U R                   R2                  SU R                   R(                  5      U l        U R                   R4                  (       a<  [,        R.                  R7                  U R9                  U R                   5      S   5      nOAU R                   R:                  (       a&  U R                   R:                  R=                  SS5      nU(       a(  U =R&                  SUR=                  SS5      -   -  sl        U R?                  5         U RA                  5         [C        5       nU RD                   H'  nURF                   H  nURI                  U5        M     M)     [K        U5      U l&        g )Nr   Fz
meson-logsr  r  r0   r   )'r  r  
fail_countexpectedfail_countunexpectedpass_countsuccess_count
skip_countignored_counttimeout_countr  name_max_lenis_runloggersr  rw   console_loggerrm   r  ninjalogfile_baselogbaserg   r  r  r   rk   ri   r^  rc  ru   r  prepare_buildload_metadatar  r#  rG  r  rh   r(  )r   r  namebasessr  rK   s         r8   r  TestHarness.__init__u  s   35"#$%!+-+G,=,=>D//0!"&
-1<<(@(@(@H "T\\__lDLLL`L` aD||##77++D,<,<T\\,J1,MN##<<--55c3?!!S8+;+;C+E%EE!UAWWq	   2hr:   c                @    U R                   (       d   eU R                   $ r   )r  r   s    r8   get_console_loggerTestHarness.get_console_logger  s    """""""r:   c                    U R                   R                  (       a  g [        R                  " 5       U l        U R                  (       d"  [        S5        [        R                  " S5        g g )Nz%Can't find ninja, can't rebuild test.r+   )r  rp  r   detect_ninjar  r   r=   exitr   s    r8   r  TestHarness.prepare_build  sD    <<"" --/
zz9:
 HHSM r:   c                :   [         R                  " 5       n [         R                  " U R                  R                  5        U R                  R
                  (       d  [        R                  " U R                  SS/-   SS9R                  nSU;  a  SU;  a  U R                  R                  (       a  [        R                  O[        R                  n[        R                  " U R                  S/-   UR                  5       S9nUR                  S:w  a#  [        S	U R                  R                  < 35      e[         R"                  " [         R                  " 5       5      U l        U R                  R&                  (       d%  U R$                  R(                  U R                  l        U R                  R*                  (       a  U R-                  S
5      U l        OU R-                  S5      U l        [         R                  " U5        g ! [         R                  " U5        f = f)Nz-nzbuild.ninjaT)capture_outputs   ninja: no work to do.s   samu: nothing to do)r  r   zCould not configure zmeson_benchmark_setup.datzmeson_test_setup.dat)r  getcwdchdirr  rk   rp  r9  r@  r  r  rh   r=   r  filenor  r   r
   load
build_dataru   test_setup_default_namer_  
load_testsr#  )r   startdirteststdor  rets        r8   r  TestHarness.load_metadata  sP   99;	HHT\\__% <<**%>>$**m7L*L]abii+8;@V^f@f)-):):3::

D$..}o)Edkkm\C~~*+.B4<<??BU,VWW#jj5DO<<%%%)__%L%L"||%%!__-HI
!__-CD
HHXBHHXs   GH Hc                *   [        S5      U-  nUR                  5       (       d$  [        SU R                  R                  < S35      eUR                  S5       n[        [        R                  " U5      5      nS S S 5        U$ ! , (       d  f       W$ = f)Nzmeson-privatez
Directory z- does not seem to be a Meson build directory.rb)	r   is_filer   r  rk   r~  r  pickler  )r   	file_namedatafilerV  r
  s        r8   r  TestHarness.load_tests  sv    (94!!*T\\__,??l mnn]]4 A!&++a.1D ! ! s    B
Bc                    U $ r   r>   r   s    r8   	__enter__TestHarness.__enter__  s    r:   c                $    U R                  5         g r   )close_logfiles)r   exc_type	exc_value	tracebacks       r8   __exit__TestHarness.__exit__  s    r:   c                X    U R                    H  nUR                  5         M     S U l        g r   )r  rn  r  r   r  s     r8   r  TestHarness.close_logfiles  s!    AGGI "r:   c                n   SU R                   R                  ;   a  U R                   R                  U R                  R                  ;  a.  [        R
                  " SU R                   R                   S35        U R                  R                  U R                   R                     $ UR                  S-   U R                   R                  -   nX R                  R                  ;  a;  [        R
                  " SU R                   R                   SUR                   S35        U R                  R                  U   $ )Nr  zUnknown test setup 'z'.zTest setup 'z' not found from project ')r  ru   r  test_setupsr=   r  ri  )r   ra  	full_names      r8   get_test_setupTestHarness.get_test_setup  s    $,,$$$||!!)D)DD/0B0B/C2FG??..t||/A/ABB))C/$,,2D2DDI ; ;;<(:(:';;UVZVgVgUhhjkl??..y99r:   c                   U R                  U5      nUR                  (       d  UR                  Ul        UR                  (       a  SUl        SUl        UR                  c  UR                  Ul        UR
                  c  UR                  Ul        O'UR                  (       a  [        R                  " S5        UR                  R                  [        R                  R                  5       5      $ )NTzBConflict: both test setup and command line specify an exe wrapper.)r  re   rg   r  re  ri   rv  r=   r  r   get_envr  r   copy)r   r  ra  currents       r8   merge_setup_optionsTestHarness.merge_setup_options  s    %%d+{{!++GK;;"&G"GO%%-)0)C)CG& ??"%11GO  HHYZ{{""2::??#455r:   c                f   U R                  U5      n[        U R                  5      nU R                  R                  (       a  U R	                  XA5      nO[
        R                  R                  5       nUR                  R                  U5      nUR                  U5        UR                  (       ag  UR                  (       aV  UR                  (       aE  UR                  R                  5       (       a&  [        UR                  R!                  5       5      US'   [#        US-   5      US'   [%        XX45      $ )NMESON_EXE_WRAPPERr	   MESON_TEST_ITERATION)get_pretty_suiter   r  ru   r  r  r   r  r   r  r  rs  ru  rv  rw  r   rx  r   rN  )r   ra  	iterationr   r  r   rk  s          r8   get_test_runnerTestHarness.get_test_runner  s    $$T*4<<(<<**79C**//#C88##C(

8D$:$:  T%5%5%;%;%=%='01A1A1M1M1O'PC#$&))a-&8"#499r:   c                   UR                   [        R                  L a  U =R                  S-  sl        GOwUR                   [        R                  L a  U =R
                  S-  sl        GOCUR                   [        R                  L a  U =R                  S-  sl        GOUR                   [        R                  L a  U =R                  S-  sl	        OUR                   [        R                  [        R                  [        R                  1;   a  U =R                  S-  sl        OUR                   [        R                  L a  U =R                  S-  sl        OVUR                   [        R                   L a  U =R"                  S-  sl        O#[$        R&                  " SUR                    35        UR                   R)                  5       (       a  U R*                  R-                  U5        U R.                   H  nUR1                  X5        M     g )Nr	   z!Unknown test result encountered: )r   r   r   r  r   r  r   r  r   r  r   r   r   r  r   r  r   r  r=   r  r   r  rm   r  rh  )r   rL   r  s      r8   process_test_resultTestHarness.process_test_result  sW   ::+++!#ZZ:??*OOq OZZ:---!#ZZ:==(!#ZZJOOZ-=-=z?S?STTOOq OZZ:222##q(#ZZ:444%%*%HH8EF::##**62AEE$ r:   c                >    [        [        U R                  5      5      $ r   )rS   r   r  r   s    r8   numlenTestHarness.numlen  s    3t'((r:   c                &    SU R                   -  S-   $ )Nr@   )r  r   s    r8   r  TestHarness.max_left_width#  s    4;;""r:   c                L    SR                  U R                  UU R                  S9$ )Nz{num:{numlen}}/{testcount} )r  r"  	testcount)r   r  r  )r   r"  s     r8   get_test_num_prefixTestHarness.get_test_num_prefix'  s,    ,334;;8;>Boo 4 O 	Or:   Nc                   Uc  U R                  UR                  5      n[        X0R                  5      nUc  UR                  nX0R
                  -   S-   [        U5      -
  [        U5      -
  [        U5      -
  nUS[        SU5      -  -  nUc`  SR                  UR                  R                  U5      UR                  U R                  S-   S9nUR                  5       n	U	(       a  USU	-   -  nXE-   U-   U-   $ )Nr	   r   z{res} {dur:{durlen}.2f}sr%   )r   r  r  r  )r  r"  rD  r  r   r  rO   r   r   r   r  r  r  )
r   rL   r   r  r  r  r  r  extra_mid_widthr  s
             r8   r   TestHarness.format,  s     <++FJJ7D ^-@-@A>[[F(+<+<<q@8FCSSV^_cVddgopvgww#A///=.55JJ''1OO,,q0 6 2E ((*G(}v%--r:   c                   U R                   U R                  U R                  U R                  U R                  U R
                  U R                  S.n/ nUR                  5        H\  u  p4US:  d.  UR                  S5      (       d  UR                  S5      (       d  M9  UR                  USR                  U5      -   5        M^     SR                  SR                  U5      5      $ )N)zOk:                zExpected Fail:     zFail:              zUnexpected Pass:   zSkipped:           zIgnored:           zTimeout:           r   zOk:zFail:z{:<4}z
{}
r   )r  r  r  r  r  r  r  r  r   rm   r   r   )r   rB  r  rL   r  s        r8   r  TestHarness.summaryH  s    !%!3!3!%!8!8!%!%!:!:!%!%!3!3!%!3!3
 $]]_MFqyF--e448I8I'8R8Rvu(==> - tyy122r:   c                N    U R                   U R                  -   U R                  -   $ r   )r  r  r  r   s    r8   total_failure_countTestHarness.total_failure_countZ  s"    !:!::T=O=OOOr:   c                  ^ ^ T R                   (       a  [        S5      eST l         T R                  5       nT R                  R                  (       a  UO/ nU(       d  gT R                  R
                  (       d[  [        T R                  T R                  R                  UT R                  R                  5      (       d  [        R                  " S5        [        U 4S jU 5       5      T l        [        T R                  R                  [!        U5      T R                  R"                  -  5      T R                  l        [$        R&                  " 5       n [$        R(                  " T R                  R                  5        / n[+        T R                  R"                  5       HU  mUR-                  UU 4S jU 5       5        TS:X  d  M'  [        S U 5       5      T l        [1        S U 5       5      T l        MW     [!        U5      T l        T R7                  U5        [$        R(                  " U5        T R9                  5       $ ! [$        R(                  " U5        f = f)	Nz*Test harness object can only be used once.Tr   }   c              3  X   >#    U  H  n[        TR                  U5      5      v   M!     g 7fr   )rO   r  )r1  ra  r   s     r8   r3  #TestHarness.doit.<locals>.<genexpr>m  s&     XRW$)>)>t)D E ERWs   '*c              3  H   >#    U  H  nTR                  UT5      v   M     g 7fr   )r  )r1  ra  r  r   s     r8   r3  r  u  s!     Ot33D!<<s   "c           	   3     #    U  H5  n[        [        [        UR                  =(       d    S 5      5      5      v   M7     g7f)r$   N)rS   r   rV   r  r1  runners     r8   r3  r  w  s3      0G>EF 14CFNN<Pb8Q4R0S0S>Es   =?c              3  Z   #    U  H!  nUR                   [        R                  Lv   M#     g 7fr   )rt  r   r   r  s     r8   r3  r  z  s)      ,C:A -3,?,?{GYGY,Y:As   )+)r  RuntimeError	get_testsr  rx   rp  rebuild_depsr  rk   r_  r=   r  rD  r  minrf  rS   ra   r  r  r  rangeextendr  r  r  r  	run_testsr
  )r   r#  rebuild_only_testsr  runnersr  s   `    @r8   doitTestHarness.doit]  s   ;;KLL &*ll&7&7UR||&&|DJJYkmqmymy  nD  nD  0E  0E HHSMXRWXX%()C)C),Udll6I6I)I&K"99;	HHT\\__%02G4<<../OOO6,/ 0G>E0G -GD) ), ,C:A,C )CD% 0 "'lDONN7#HHX'')) HHXs   A.H= AH= =Ic                p    SU ;   a-  U R                  SS5      n[        U5      S:X  d   eUS   US   4$ U S4$ )Nr  r	   r@   r   r1   )rR   rS   )rG  rR   s     r8   split_suite_stringTestHarness.split_suite_string  sF    %<KKQ'Eu:?"?8U1X%%"9r:   c                    U Hp  n[         R                  U5      u  p4U R                   HF  n[         R                  U5      u  pgU(       d  Xs:X  a      gU(       a  Xc:w  a  M7  U(       a  Xt:w  a  ME      g   Mr     gNTF)rb  r!  rG  )ra  r(  rG  	prj_matchst_matchprjstprjsts           r8   test_in_suitesTestHarness.test_in_suites  sj    E$/$B$B5$I!Y'::5A	  BO !13 $ 8 r:   c                   [         R                  XR                  R                  5      (       a  gU R                  R                  (       a)  [         R                  XR                  R                  5      $ U R                  R
                  (       a6  U R                  U5      n[         R                  XR                  5      (       a  ggr  )rb  r*  r  rp   rl   ru   r  )r   ra  ru   s      r8   test_suitableTestHarness.test_suitable  s    %%dLL,G,GHH<<&& --dLL4O4OPP<<''-E))$0D0DEEr:   c              #    #    0 nU R                   R                   H5  nSU;   a#  UR                  SSS9u  pEUS:X  a  SnUS:X  a  SnOSUpTSX$U4'   M7     U H\  n[        U5       HJ  u  pE[	        UR
                  U5      (       d  M"  [	        UR                  U5      (       d  M?  SX$U4'   Uv     MZ     M^     UR                  5        H  u  u  pEnU(       a  M  U SU 3nU HW  n[	        UR
                  U5      (       d  M   [	        UR                  U5      (       d  M=  [        R                  " U S35          Ms     [        U S	35      e   g
7f)a  
Allow specifying test names like "meson test foo1 foo2", where test('foo1', ...)

Also support specifying the subproject to run tests from like
"meson test subproj:" (all tests inside subproj) or "meson test subproj:foo1"
to run foo1 inside subproj. Coincidentally also "meson test :foo1" to
run all tests with that name across all subprojects, which is
identical to "meson test foo1"
r  r	   )maxsplitr1   ry   FTz( test name is redundant and was not usedz" test name does not match any testN)r  rx   rR   rh   r   ri  r   r  r   warningr   )r   r#  patternsrX   subprojr   r  was_useds           r8   tests_from_argsTestHarness.tests_from_args  sD     57<<$$C cz #		#	 :2:Db=!G #S(-Ht_% %  A "&h1>>7338M8M04Ht_-G	 "0  *2)9%OWX8 	4&)A q~~w77GAFFD<Q<Qu,T%UV  )C50R)STT *:s$   B EE#0E%E E/Ec                   U R                   (       d  [        SUS9  / $ U R                    Vs/ s H  o R                  U5      (       d  M  UPM     nnU R                  R                  (       a  [        U R                  U5      5      nU R                  R                  (       aL  U R                  R                  u  pEU[        U5      :  a  [        SU S[        U5       S35      eX4S-
  S U2   nU(       d  [        SUS9  / $ U$ s  snf )NzNo tests defined.)r  znumber of slices (z) exceeds number of tests (r   r	   zNo suitable tests defined.)
r#  r   r-  r  rx   rh   r5  slicerS   r   )r   	errorfiler  r#  	our_slicenslicess         r8   r  TestHarness.get_tests  s    zz%I6I JJ@Jq*<*<Q*?J@<<--e45E<<!%!3!3IU#$'9'B]^abg^h]iij%klla-001E.Y?I As   D	Dc                J    U R                    H  nUR                  5         M     g r   )r  rW  r  s     r8   flush_logfilesTestHarness.flush_logfiles  s    AGGI r:   c                L   U R                   (       d  g U R                  R                  [        U R                   S-   5      5        U R                  R                  [	        U R                   S-   5      5        U R                  R                  [        U R                   S-   SS95        g )Nz
.junit.xmlz.jsonz.txtsurrogateescaper   )r  r  rm   r  r  r  r   s    r8   open_logfilesTestHarness.open_logfiles	  sy      L):):\)IJK.t/@/@7/JKL.t/@/@6/IRcder:   c                    U R                   (       a-  U R                  S/nU R                  S:  a  U/ SQ-  nUS/-  nU$ U R                  (       a  U R                  nU$ / nU$ )Nrt   r	   )-exr@  rE  quitz--args)re   rf   ra   ri   )r  wraps     r8   rc  TestHarness.get_wrapper  sh    ;;$$i0D~~!55XJD
 	 __??D  Dr:   c                <   [        U R                  5      S:  ax  UR                  (       ag  [        R	                  UR                  S   5      S   nSR                  S UR                   5       5      nU(       a  US-  nX#-   S-   UR                  -   $ UR                  $ )Nr	   r   +c              3  R   #    U  H  n[         R                  U5      S    v   M     g7fr/  )rb  r!  )r1  rK   s     r8   r3  /TestHarness.get_pretty_suite.<locals>.<genexpr>"  s      Rz!77:1=zs   %'r  z / )rS   r(  rG  rb  r!  r   r   )r   ra  rvrK   s       r8   r  TestHarness.get_pretty_suite  sy    t{{aDJJ//

1>qABRtzzRRAc	6E>DII--99r:   c                4    U R                  5         [        R                  S:X  a)  [        R                  " [        R
                  " 5       5        [        R                  " U R                  U5      5        U R                  5         g ! U R                  5         f = f)Nwin32)	rB  r=   r4   r  set_event_loop_policyWindowsProactorEventLoopPolicyr@  
_run_testsr  )r   r  s     r8   r  TestHarness.run_tests)  sf    		"  ||w&--g.T.T.VWKK01!D!s   A2B Bc                N    U R                    H  nUR                  XX#5        M     g r   )r  re  )r   ra  rK   r   r  s        r8   re  TestHarness.log_subtest5  s    AMM$a- r:   c                L    U R                    H  nUR                  X5        M     g r   )r  rb  )r   ra  r  s      r8   r  TestHarness.log_start_test9  s    ALL$ r:   c                  ^ ^	^
^^^^^^#    [         R                  " T R                  R                  5      m[	        5       m0 mSm[	        [
        S9m[         R                  " 5       mSU	UU U4S jjnSUU4S jjnSUUU 4S jjm
SU
UU4S jjm	SU	UU 4S jjnSU	U
UUUUU 4S jjnT R                   H  nUR                  T 5        M     [        R                  S	:w  a  [        R                  " S
5      [        R                  " 5       :X  a!  TR                  [        R                   U5        O TR                  [        R                   U5        TR                  [        R"                  U5         U H  nUR$                  (       d  ['        T5      I S h  vN   [         R(                  " U" U5      5      nTR+                  U5        UR,                  TU'   UR/                  U5        UR$                  (       d  [1        U5      I S h  vN   T R                  R2                  S:  d  M  T R4                  (       d  M    O   ['        T5      I S h  vN   [        R                  S	:w  a>  TR7                  [        R                   5        TR7                  [        R"                  5        T R                   H  nUR9                  T 5      I S h  vN   M     g  GN; N N N! [        R                  S	:w  a>  TR7                  [        R                   5        TR7                  [        R"                  5        T R                   H  nUR9                  T 5      I S h  vN    M     f = f7f)NF)r   c                
  >#    T IS h  vN   T(       d+  TR                   R                  S:  a#  TR                  (       a   S S S 5      IS h  vN   g U R                  T5      I S h  vN nTR	                  U5        TR                   R
                  nU(       a6  TR                  U:  a&  UR                  R                  5       (       a  T" 5         S S S 5      IS h  vN   g  N N N} N! , IS h  vN  (       d  f       g = f7frp  )r  ra   r  r@  r  maxfailr   r   )ra  r   r[  cancel_all_testsinterruptedr   	semaphores      r8   run_test(TestHarness._run_tests.<locals>.run_testE  s      y4<<#6#6#:t !yy !HHTN*((-,,..t'9cggnn>N>N$& !yy + !yyysu   DC!D4C)DC#DC)'C%(A(C)DC'D#D%C)'D)D /C20D <Dc                   > U R                  5       (       d  U R                  5         TR                  U 5         TU 	 g ! [         a     g f = fr   )r  rL   r  KeyError)rV  r  r  s    r8   	test_done)TestHarness._run_tests.<locals>.test_doneO  sB    ;;==
NN1!!$ s   = 
A
	A
c                   > TR                  5       nTR                  U5        U (       a8  TR                  5         [        R                  " SR                  TU   5      5        TU	 UR                  5         g )Nz CTRL-C detected, interrupting {})popleftrm   r>  r   r1  r   rE  )warnr  r  r  r   s     r8   cancel_one_test/TestHarness._run_tests.<locals>.cancel_one_testX  sY    __&FNN6"##%?FF}U[G\]^f%MMOr:   c                 <   > SmT(       a  T " S5        T(       a  M  g g r$  r>   )rh  r]  r  s   r8   r\  0TestHarness._run_tests.<locals>.cancel_all_testsa  s    K&  -r:   c                 p   > T(       a  g TR                  5         [        R                  " S5        T " 5         g )NzReceived SIGTERM, exiting)r>  r   r1  )r\  r]  r   s   r8   sigterm_handler/TestHarness._run_tests.<locals>.sigterm_handlerg  s(    !LL45r:   c                 d  > T(       a  g TR                  TR                  5       5        [        T5      [        :X  a=  TS   TS   -
  S:  a.  TR	                  5         [
        R                  " S5        T " 5         g T(       a	  T" S5        g TR	                  5         [
        R                  " S5        Smg )Nr   r   r	   zCTRL-C detected, exitingT)rm   r  rS   	MAX_CTRLCr>  r   r1  )r\  rh  ctrlc_timesr]  r  r  r   s   r8   sigint_handler.TestHarness._run_tests.<locals>.sigint_handlern  s     tyy{+;9,R;q>1QTU1U##%78 "%##%78"r:   rP  r   r	   )ra  rN  r   rq  )rV  asyncio.Futurer   rq  )rg  r   r   rq  rp  )r  	Semaphorer  rf  r   rp  r  r  r]  r=   r4   r  getpgidgetpidadd_signal_handlerr   r  rC  rj  r"  r  rm   r  add_done_callbackr  ra   r  remove_signal_handlerrk  )r   r  r_  rc  rm  rr  r  r  r  r\  rh  rq  r  r]  r  r  r^  s   `        @@@@@@@@r8   rS  TestHarness._run_tests=  s_    %%dll&@&@A	+0757&+9&='')	' 	'	 		 		' 	'	 		# 	#$ AGGDM  <<7"zz!}		+''~F''G##FNNOD	%!))&w/// ..x/?@v&(.(;(;f%((3))"6***<<&&*t " w'''||w&**6==9**6>>:\\hhtn$$ " 0 + ( %	 ||w&**6==9**6>>:\\hhtn$$ "s   E!M-$K KA0K KK #K 6K K	K A5MK	MK K K MA6MM

MM)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r  r#  r  r  )r  r  )r   z'ConsoleLogger'rp  )r  r   r   T.List[TestSerialisation])r   rs  )r  r  r  r  r  r  r   rq  )ra  zT.Optional[TestSerialisation]r   zbuild.TestSetup)r  r  ra  r   r   r  )ra  r   r  rV   r   rN  )rL   rZ  r   rq  r   )r"  rV   r   r   )r   r1   NNN)rL   rZ  r   r   r  rV   r  r   r  r   r  r   r  r   r   r   r   )rG  r   r   zT.Tuple[str, str])ra  r   r(  r  r   r   )ra  r   r   r   )r#  r|  r   z*T.Generator[TestSerialisation, None, None]r   )r9  zT.Optional[T.IO]r   r|  )r  r  r   r  )ra  r   r   r   )r  zT.List[SingleTestRunner]r   rq  )ra  rZ  rK   r   r   r   r   rq  )ra  rZ  r   rq  )'r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r
  r  r   r!  r*  r-  r5  r  r>  rB  rc  r  r  re  r  rS  r   r>   r:   r8   rb  rb  t  s>   'R#6#
	:6": . ) ) # #O &''+)-(,.".. %. '	.
 &.
 25.83$P$*L    > 3Uj(f  
".%_%r:   rb  c                    U R                  [        R                  S9nU H  n[        U R	                  U5      5        M     U(       + $ )N)r9  )r  r=   r  r   r  )thr#  r  s      r8   
list_testsr    s;    LL3::L.Eb!!!$% 9r:   c                  ^ SU4S jjn[        U 5      S:  d   e[        5       nU(       a  [        R                  R	                  TS5      n[        USS9 n[        R                  " U5      nS S S 5        [        5       n	0 n
W H$  nUS    Vs/ s H  nU" U5      PM     snXS   '   M&     U HA  nUR                   H.  nX;   a  M
  U	R                  U5        UR                  X   5        M0     MC     O*U(       a  UR                  S5        OUR                  S	5        U(       d  g
[        R                  " U ST/-   [        U5      -   5      R                  nUS:w  a  [        ST 35        gg
! , (       d  f       GN= fs  snf )Nc                   > [         R                  R                  U T5      n [         R                  S:w  a   U R	                  [         R                  S5      n U $ )NrQ   )r  r  relpathr  r  )r  rk   s    r8   convert_path_to_target,rebuild_deps.<locals>.convert_path_to_target  s;    wwtR(66S=<<,Dr:   r   zmeson-info/intro-targets.jsonrz  )r|  r}  idzmeson-benchmark-prereqzmeson-test-prereqTrj   zCould not rebuild F)r  r   r   r   )rS   r  r  r  r   r~  r  r  dependsr  r  r9  r@  sortedr  r   )r  rk   r#  r_  r  targetstargets_filefptargets_infor  intro_targetstargetrV  r  dr  s    `              r8   r  r    sS    u:>>%Gww||B(GH,1R99R=L 2 "e24"F  
++-+A 'q)++-M,' # AYY<q!}/0	   KK01KK+, 
..$+fWo=
>
I
IC
ax"2$'(? 21+-s   E,E>,
E;c                2   U R                   (       d  U R                  (       a  SU l        U R                  (       a  U R                  (       a  [        S5        gS nU R                  (       a&  SU l        U R                  (       a  [        S5        gSnU R                  (       a  SU l        U R                  (       a  U R                  S   nUb/  [        USS9nUR                  5       (       d  [        SU< 35        g[        R                  " U R                  5      n[        R                  " S	UR                  R                   R"                  R%                  ['        S
5      5      5      n[)        U5        U R*                  (       d^  UR                  R                   R"                  R%                  ['        S5      5      nUS:X  a  SU l        OUS:w  a  [        S5        SU l        [-        U 5       n U R.                  (       a  [1        U5      sS S S 5        $ UR3                  5       sS S S 5        $ ! [4         aN  n[        S5        [6        R8                  R;                  S5      (       a  Ue[        U5         S nAS S S 5        gS nAff = f! , (       d  f       g = f)Nr	   z3Can not be both quiet and verbose at the same time.Tz9Must not specify both a wrapper and gdb at the same time.re   r   )silentz"Could not find requested program: r   vsenvbackendnoner  zEOnly ninja backend is supported to rebuild tests before running them.z!Meson test encountered an error:
MESON_FORCE_BACKTRACE)r_  rg   rf  r  r  r   re   ri   r   rw  r
   r  rk   rN  castr   coredataoptstoreget_value_forr   r   rp  rb  rh   r  r  r   r  r   r  )r  	check_binexer   
need_vsenvr  r~  r  s           r8   r@  r@    s   G// !7==CDI{{"??MN	OOA&	i5yy{{6ymDE

7::A 6 6 ? ? M MiX_N` abJ
--((11??	)@TUf!%GYZ!%G	W	
	||!"~ 
	 779	 
	
  	67zz~~566a 
	
	 
	s6   -J/H-H--
J7<J 3J JJ
Jc                x    [         R                  " SS9n[        U5        UR                  U 5      n[	        U5      $ )Nz
meson test)prog)rT   ArgumentParserr~   
parse_argsr@  )rx   r}   r  s      r8   run_with_argsr  	  s4    $$,7F&%Gw<r:   r   )rK   r   r   rV   )rX   r   r   zT.Tuple[int, int])r}   zargparse.ArgumentParserr   rq  )rK   r   r   rq  )r   r   r   r   r   r   )rK   r   r   r   r   rV   r   r   )r   rV   r   r   )r   zT.Iterable[T.Tuple[str, str]]r   r   )r  r   r   r   )r  zT.Union[None, bytes]r   r   )r  r8  r   z,T.Optional['asyncio.Queue[T.Optional[str]]']rt  r   r   r   )r  r   r   r   )r
  r|  r   r|  )r  z 'asyncio.Queue[T.Optional[str]]'r   rL  )r  rt  r   rq  r   )r  r  r  zT.Optional[T.Union[int, float]]r   rq  )r~  rb  r   r   )
r  r  rk   r   r#  r|  r_  r   r   r   )r  r  r   rV   )rx   r  r   rV   )}
__future__r   pathlibr   collectionsr   
contextlibr   r  r   r   rT   r  r  enumr  r  r  r4   r`  rP  r   r9  shlexr=   r  typingrN  rH   xml.etree.ElementTreeetreerS  r%  r1   r
   r   r   r  r   r   r   r  mesonlibr   r   r   r   r   r   r   r   r  r   programsr   backend.backendsr   r   TYPE_CHECKINGUnionTYPE_TAPResultr  r  rp  r/   r   
maxunicoder  chrUNENCODABLE_XML_CHR_RANGESrQ  r   r  r  r  r9   r?   rJ   rO   r\   r~   r   r   r   r   r   quoter   r   uniqueEnumr   r   r   rU  rx  r  r  r  r  rZ  r  r[  EXITCODEr  r  r  TAPr  RUSTrF  r   r  r  r  r  r  r"  r$  rN  rb  r  r  r@  r  )lowhighs   00r8   <module>r     s  
 #           	    	    
    " "    J 1/ / /  % =??WW 1 2N     	66 2 6 >>W"" $2 3 MddLc[c#c(1SYK8Lcd **TBGG4N,O%ORV%VW zz>?**>?!$ !!!D 25Un-C4 $/
  .||{{HF	N 	 	$)) 	 	 /* /* /*dz@ z@x .Z \!J \!~ 6  6F4 4"QB: QBhD DNg  4C  ,// 0? ( 1=  ,,, -3 3j /9  ,** ++' +Z 0;  ,++ ,I<"I"$/"47"6H
 CG ?KOBm, m,^I IXh% h%T+Z5nsE es   M: