
    e\             	         U d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
m
Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm c m!Z" dd	l#m$Z$ dd
l#m%Z% ddl#m&Z& ddl'm(Z(m)Z) ddl'm*Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ejz                  rej|                  d   Z?dZ@dZAdZBg dZCdeDd<   ej                  dk\  reCj                  g d       eCD  cg c]  \  } } eG|        d eG|        c}} ZH ej                  ddj                  eH      z   dz         ZKd^dZLd^d ZMd!dd!dddd"ZNd_d#ZOd`d$ZPdad%ZQdbd&ZRdcd'ZSddd(ZTded)ZUd* ZVd+eDd,<    eL       sej                  ZVdfd-ZX G d. d/e-      ZYej                   G d0 d1ej                               Z\ej                   G d2 d3ej                               Z] G d4 d5      Z^ G d6 d7      Z_ G d8 d9e_      Z` G d: d;e_      Za G d< d=e`      Zb G d> d?e`      Zc G d@ dAe_      Zd G dB dC      Ze G dD dEee      Zfefeej                  e;j                  <    G dF dGef      Zieieej                  e;j                  <    G dH dIee      Zkekeej                  e;j                  <    G dJ dKee      Zmemeej                  e;j                  <   dgdLZodhdMZp	 	 	 	 	 	 didNZqdjdOZrdkdPZsdldQZtdmdRZu	 dn	 	 	 dodSZv G dT dU      Zw G dV dW      Zx G dX dY      ZydpdZZzdqd[Z{drd\Z|dsd]Z}yc c}} w )t    )annotations)Path)deque)suppress)deepcopy)fnmatchN   )build)environment)mlog)MesonVersionMismatchExceptionmajor_versions_differversion)MesonException	OptionKey
OrderedSetRealPathActionget_wine_shortpath	join_args
split_argssetup_vsenv)get_infodirload_info_file)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])c                 P    t        j                         j                         } | dk(  S )Nwindows)platformsystemlower)platnames    2/usr/lib/python3/dist-packages/mesonbuild/mtest.py
is_windowsr:   _   s"     &&(Hy      c                 (    t         j                  dk(  S )Ncygwin)sysr5    r;   r9   	is_cygwinr@   c   s    <<8##r;      )FHWNaNAc                Z    d}| D ]#  }t        j                  |      }|t        |   z  }% |S )Nr   )unicodedataeast_asian_widthUNIWIDTH_MAPPING)sresultcws       r9   uniwidthrP   g   s=    F &((+"1%%& Mr;   c                     d} | t         j                  v r	 t        t         j                  |          }|S 	 t        j                         }|S # t        $ r t	        d|  d       d}Y |S w xY w# t        $ r d}Y |S w xY w)NMESON_TESTTHREADSzInvalid value in z, using 1 thread.r	   )osenvironint
ValueErrorprintmultiprocessing	cpu_count	Exception)varnamenum_workerss     r9   determine_worker_countr]   n   s    !G"**	bjj12K 	 *335K   	%gY.?@AK 	  	K	s"   A A, A)(A),A;:A;c                   | j                  ddt        d       | j                  dddt        d	       | j                  d
ddd       | j                  ddddd       | j                  dddd       | j                  ddddd       | j                  dd dt        d	       | j                  ddt        d        | j                  d!g d"d#d$d%&       | j                  d'g d(d#d$d)&       | j                  d*d+d,d-d.       | j                  d/ddd0       | j                  d1ddd2       | j                  d3d4d56       | j                  d7d8t	               t        d9       | j                  d:d;ddd<       | j                  d=d>ddd?       | j                  d@dAt
        d dBC       | j                  dDd dEdF       | j                  dGg t        dH       | j                  dIdJdKL       y )MNz	--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`   ra   z--no-rebuildF
store_truez$Do not rebuild before running tests.)r_   actionra   z--gdbgdbzRun test under gdb.)r_   rc   re   ra   z
--gdb-pathgdb_pathz&Path to the gdb binary (default: gdb).)r_   rc   ra   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)rc   re   ra   z--suiteinclude_suitesappendSUITEz,Only run tests belonging to the given suite.)r_   rc   re   metavarra   z
--no-suiteexclude_suitesz.Do not run tests belonging to the given suite.z--no-stdsplitTsplit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_   ra   z-jz--num-processesz#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_   ra   z--setupsetupzWhich test setup to use.z--test-argsz7Arguments to pass to the specified test(s) or all tests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".)nargsra   )add_argumentrU   r   r   r]   float)parsers    r9   add_argumentsr|      s   
QSQ  R 
AH3@  B
lC  E
U<2  4
e*E  G
%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
/9O9QX[B  D
k5@  B
i|C  E
45$K  L 	4g7  9
r
V  X
cT  Ur;   c                    | d   dk(  rdnd}	 t        | |       y # t        $ r2 | j                  dd      j                  d      } t        | |       Y y w xY w)N
r2   endasciibackslashreplaceerrors)rW   UnicodeEncodeErrorencodedecode)rL   r   s     r9   
print_safer      sY    ""4CaS HHW%7H8??HaSs    8AAc                "    | s|S |s| S | dz   |z   S Nr   r?   )abs     r9   
join_linesr      s     t8a<r;   c                r    | s||z  S d| z   dz   } t        |       }||z
  dz  }||z  | z   } | |||z
  |z
  z  z   S )N rA   )rP   )rL   dashcolswidthfirsts        r9   dashesr      sZ    d{a#AQKEE\aEuqAtte|e+,,,r;   c                   | dk  r+|  }	 t        j                  |      j                  }d| d| S | dk  rd|  S | dz
  }	 t        j                  |      j                  }d|  d| d| d	S # t        $ r d}Y Pw xY w# t        $ r d}Y *w xY w)
Nr   
SIGinvalidzkilled by signal r      zexit status z(exit status z or signal ))signalSignalsnamerV   )retcodesignumsignames      r9   returncode_to_statusr      s     {	#nnV,11G #6(!G955#~gY''s]F..(-- 7);vhayBB  	#"G	#  s#   A, A= ,A:9A:=B
Bc                    | S Nr?   )xs    r9   <lambda>r      s    Q r;   zT.Callable[[str], str]sh_quotec                    dj                  | D cg c]   \  }}dj                  |t        |            " c}}      S c c}}w )Nr2   z{}={} )joinformatr   )envkvs      r9   env_tuple_to_strr      s2    77D1HOOAx{3DEEDs   %>
c                      e Zd Zy)TestExceptionN)__name__
__module____qualname__r?   r;   r9   r   r      s    r;   r   c                      e Zd ZdZdZdZy)ConsoleUserr   r	   rA   N)r   r   r   LOGGERGDBSTDOUTr?   r;   r9   r   r      s     F C Fr;   r   c                  ~    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Zedd       ZddZddZddZddZddZddZddZy)
TestResultPENDINGRUNNINGOKTIMEOUT	INTERRUPTSKIPFAILEXPECTEDFAILUNEXPECTEDPASSERRORc                      y)Nr*   r?   r?   r;   r9   maxlenzTestResult.maxlen  s    r;   c                F    | t         j                  t         j                  hv S r   )r   r   r   selfs    r9   is_okzTestResult.is_ok  s    
z'>'>???r;   c                    | t         j                  t         j                  t         j                  t         j                  t         j
                  hv S r   )r   r   r   r   r   r   r   s    r9   is_badzTestResult.is_bad  s>    
););Z=Q=Q"11:3C3CE E 	Er;   c                F    | t         j                  t         j                  hvS r   )r   r   r   r   s    r9   is_finishedzTestResult.is_finished  s    J..
0B0BCCCr;   c                F    | t         j                  t         j                  fv S r   )r   r   r   r   s    r9   
was_killedzTestResult.was_killed  s    
**J,@,@AAAr;   c                   | j                         rt        j                  }nd| t        j                  t        j
                  fv rt        j                  }n1| j                         rt        j                  }nt        j                  } ||      S r   )
r   r   redr   r   r   yellowr   greenblue)r   rL   	decorators      r9   colorizezTestResult.colorize  s\    ;;=Ijooz'>'>??I

I		I|r;   c                    dj                  | j                  | j                               }| j                  |      j	                  |      S )Nz{res:{reslen}})resreslen)r   valuer   r   get_text)r   r   
result_strs      r9   r   zTestResult.get_text(  s;    %,,DKKM,R
}}Z(11(;;r;   c                6    t        | j                  d            S )Nz>>> )strr   r   s    r9   get_command_markerzTestResult.get_command_marker,  s    4==())r;   NreturnrU   r   bool)rL   r   r   zmlog.AnsiDecorator)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;   r9   r   r      so     GG	BGIDD!L%NE @EDB	<*r;   r   c                     e Zd ZU  G d dej                        Z G d dej                        Z G d dej                        Z G d dej                        Z G d	 d
ej                        Z	 G d dej                        Z
dZdZdZ ej                  d      Z ej                  d      Z ej                  dej$                  z         Z ej                  dej$                  z         Z ej                  d      Z ej                  d      Z ej                  d      ZdZdZdZded<   dZdZdZded<   dZeZ dZ!	 	 d$d Z"d%d!Z#d&d"Z$d'd#Z%y)(	TAPParserc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)	r!   rU   	num_testsr   lateskippedT.Optional[str]explanationNr   r   r   __annotations__r?   r;   r9   PlanzTAPParser.Plan1  s    
$$r;   r   c                      e Zd ZU ded<   y)r#   r   messageNr   r?   r;   r9   BailoutzTAPParser.Bailout7      r;   r   c                  >    e Zd ZU ded<   ded<   ded<   ded<   dd	Zy
)r   rU   numberr   r   r   rM   r   r   c                T    | j                    d| j                   j                         S )Nr   )r   r   stripr   s    r9   __str__zTAPParser.Test.__str__@  s$    kk]!DII;/5577r;   Nr   )r   r   r   r   r   r?   r;   r9   TestzTAPParser.Test:  s    	$$	8r;   r   c                      e Zd ZU ded<   y)r   r   r   Nr   r?   r;   r9   ErrorzTAPParser.ErrorC  r   r;   r   c                  "    e Zd ZU ded<   ded<   y)r"   r   r   rU   linenoNr   r?   r;   r9   UnknownLinezTAPParser.UnknownLineF  s    r;   r   c                      e Zd ZU ded<   y)r    rU   r   Nr   r?   r;   r9   VersionzTAPParser.VersionJ  r   r;   r   r	   rA   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_linenor2   r)   c              #    K   |j                         }|r|j                         nd }||j                         }|j                  d      r'|rx| j                  ||t        j
                  |       y |dk(  r7| j                  |||rt        j                  nt        j                  |       y | j                  d| d       | j                  |||rt        j                  nt        j                  |       y w)Nr   TODOzinvalid directive "")r   upper
startswithr   r   r   r   r   r   r   r   )r   oknumr   	directiver   s         r9   
parse_testzTAPParser.parse_testc  s     zz|-8k'')d !)I##F+))CzLLf$iiT:+D+DPZPgPgituujj#6yk!CDDiiTB:==JOO[YYs   C9C;c                  K   |2 3 d {   }| j                  |      D ]  }| 	 %7  6 | j                  d       D ]  }| 	 y wr   
parse_line)r   lineslineevents       r9   parse_asynczTAPParser.parse_asyncu  sY      	 	$. 	% __T* 	EK	s   A	,*,A	,A	c              #     K   |D ]  }| j                  |      E d {     | j                  d       E d {    y 7  7 wr   r  )r   ior  s      r9   parsezTAPParser.parse|  sB      	-Dt,,,	-??4((( -(s   A=A?AAc           	   #    K   || xj                   dz  c_         |j                         }| j                  | j                  k(  rw| j                  dk\  rV| j
                  j                  |      }|r9| j                  | _        | j                   | _        |j                  d      | _
        y | j                  | _        n| j                  | j                  k(  r{| j                  j                  |      r| j                  | _        y |j                  | j                        ry | j                  d| j                   d       | j                  | _        | j                  | j                  k(  sJ |r|j                  d      ry | j                  j                  |      }|r$| j                   r<| j                   j"                  r&| j$                  s| j                  d       d| _        | xj&                  dz  c_        |j                  d      | j&                  nt)        |j                  d            }|| j&                  k7  r| j                  d	       | j+                  |j                  d      d
k(  ||j                  d      |j                  d      |j                  d            E d {    | j                  | _        y | j,                  j                  |      }|r| j                   r| j                  d       y t)        |j                  d            }|dk(  }|j                  d      r\|j                  d      j/                         j                  d      r|dkD  r| j                  d       d}n| j                  d       | j1                  || j&                  dkD  ||j                  d            | _        | j                    y | j2                  j                  |      }|r*| j5                  |j                  d             d| _        y | j8                  j                  |      }|r| j                   dk7  r| j                  d       y t)        |j                  d            | _        | j                  dk  r| j                  d       y | j;                  | j                         y | j=                  || j                          y | j                  | j                  k(  r!| j                  d| j                   d       | j6                  s| j                   r| j&                  | j                   j&                  k7  r| j&                  | j                   j&                  k  r9| j                  d| j                   j&                   d| j&                   d       y | j                  d| j                   j&                   d| j&                   d       y y y y 7 9w)Nr	      z+YAML block not terminated (started on line r   #zunexpected test after late planTrA   zout of order test numbersr	  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 )r   rstripstate_AFTER_TESTr   _RE_YAML_STARTmatch_YAMLr  groupyaml_indent_MAIN_RE_YAML_ENDr  r   _RE_TESTr  r   found_late_testr   rU   r  _RE_PLANr  r   _RE_BAILOUTr   
bailed_out_RE_VERSIONr   r   )r   r  mr
  r   r   s         r9   r  zTAPParser.parse_line  s    KK1K;;=D zzT---<<2%++11$7A%)ZZ
+/;;(+,771:(!ZZ
tzz)$$**40!%DJ??4#3#34jj#NtO_O_N``a!bcc!ZZ
::+++4??3/##D)A998L8L**%FGG+/D(!#()
(:dnnAGGAJ$..(**%@AA??1771:+=s+,771:qwwqz1771:O O O!--
##D)A99**%?@@  !$AGGAJI'1nGwwqz771:++-88@(1}&*jj1R&S S&*G"&**-I"JJ $		IT^^VWEW29qwwqz !* !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??tyyT^^tyyGZGZ5Z>>DII$7$77**'CDIIDWDWCXX^_c_m_m^nno%pqq**'DTYYEXEXDYY_`d`n`n_oop%qrr	 6[y?eOs   J'W%)W"*L9W%)r	  r   r
  rU   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   r.  )&r   r   r   T
NamedTupler   r   r   r   r   r   r$  r  r!  recompiler)  _RE_DIRECTIVEpatternr(  r&  r+  r  r%  r'  r*  r  r   r   r   r  r#  r  r   r  r  r  r  r?   r;   r9   r   r   0  sV   %q|| %!,, 8q|| 8 all !,,  EKE"**01KBJJ^_Mrzz*]-B-BBCHrzzD}G\G\\]H"**45KRZZ.N2::o.LOJ!D
!FI#'K'KEGZQZ$)
\sr;   r   c                  D    e Zd Zd	dZd
dZddZddZddZd
dZd	dZ	y)
TestLoggerc                     y r   r?   r   s    r9   flushzTestLogger.flush      r;   c                     y r   r?   r   harnesss     r9   startzTestLogger.start  r9  r;   c                     y r   r?   r   r<  tests      r9   
start_testzTestLogger.start_test  r9  r;   c                     y r   r?   )r   r<  r@  rL   r   s        r9   log_subtestzTestLogger.log_subtest  r9  r;   c                     y r   r?   )r   r<  rM   s      r9   logzTestLogger.log  r9  r;   c                   K   y wr   r?   r;  s     r9   finishzTestLogger.finish  s	     s   c                     y r   r?   r   s    r9   closezTestLogger.close  r9  r;   Nr   Noner<  'TestHarness'r   rK  r<  rM  r@  	'TestRun'r   rK  )
r<  rM  r@  rO  rL   r   r   r   r   rK  r<  rM  rM   rO  r   rK  )
r   r   r   r8  r=  rA  rC  rE  rG  rI  r?   r;   r9   r6  r6    s%    r;   r6  c                      e Zd ZdddZddZy)TestFileLoggerc                :    || _         t        |dd|      | _        y )NrO   utf-8encodingr   )filenameopenfile)r   rW  r   s      r9   __init__zTestFileLogger.__init__  s     3H	r;   c                `    | j                   r"| j                   j                          d | _         y y r   )rY  rI  r   s    r9   rI  zTestFileLogger.close  s#    99IIOODI r;   N)replace)rW  r   r   r   r   rK  rJ  )r   r   r   rZ  rI  r?   r;   r9   rR  rR    s    Ir;   rR  c                      e Zd Zg dZg dZdZdZdZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZddZddZy)ConsoleLogger)z..z:.z.:)u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘u   ✀ u   ―u   ▶ c                P   t               | _        d | _        d | _        d| _        d| _        |  d| _        d| _        d| _        d| _	        	 t        j                  d      \  | _        }d| _        t        | j                   | j"                  | j                  dz
        | _        t        d| j"                  | j                  dz
        | _        | j(                  | _        | j,                  | _        	 | j$                  j1                  t2        j4                  j6                  xs d       y # t        $ r d| _        d| _        Y w xY w# t8        $ rY t        d	d
| j                  dz
        | _        t        dd
| j                  dz
        | _        d| _        | j:                  | _        Y y w xY w)Nr   Fr2   r	   TP   rA   r   z8<r1   z| )r   running_testsprogress_testprogress_taskmax_left_widthstopshould_erase_line
test_countstarted_testsspinner_indexrS   get_terminal_sizer   is_ttyOSErrorr   SCISSORSHLINEoutput_start
output_endRTRIsubSPINNERspinnerr   r>   stdoutrV  r   ASCII_SPINNER)r   _s     r9   rZ  zConsoleLogger.__init__
  sb   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%   $D& .7E &E ?E AF%$F%c                Z    | j                   rt        | j                   d       d| _         y y )Nr2   r   )rf  rW   r   s    r9   r8  zConsoleLogger.flush*  s(    !!$((b1%'D" "r;   c                D    t        | j                  |dd       d| _        y )Nr2   )sepr   z[K)rW   rf  )r   r  s     r9   print_progresszConsoleLogger.print_progress/  s    d$$d=!)r;   c                8    | j                   j                          y r   )updatesetr   s    r9   request_updatezConsoleLogger.request_update3  s    r;   c                   | j                   | j                          y t        | j                        dk(  r| j                   d| j
                   }nJdj                  | j                  t        | j                        z
  dz   | j                  | j
                        }dj                  || j                  | j                           }| j                  dz   t        | j                        z  | _        dj                  dt        j                         z  t        t        j                         | j                   j                  z
        |j                        }| j                   j                  r4|dj                  | j                   j                  |j                  	      z  }|d
z  }| j                   j!                         }|r|d|z   z  }|j                  | j                   d| j"                  ||      }| j%                  |       y )Nr	   /z{}-{}/{}z[{}] {} z{spaces} {dur:{durlen}}r   )spacesdurdurlenz/{timeout:{durlen}})timeoutr  rL      T)r   rd  leftright)rb  r8  lenra  rh  rg  r   rt  ri  r   r   rU   time	starttimeduration_max_lenr  get_detailsrd  r|  )r   r<  countr  r  detailsr  s          r9   emit_progresszConsoleLogger.emit_progress6  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-@-@#'u  6 	D!r;   c                ~    d fd}t        j                          _        j                   _        t	         j
                  j                  dz          _         j                  rVj                  sIdt        t         j                              z  dz    _        t        j                   |              _        y y y )Nc                   K   t        j                         } d}j                          j                  s<j                  j                          d {    j                  j                          | j                         |k\  r6d _        | j                         dz   }| j                  |j                         j                  r-j                  j                  t        j                  urd _        j                  sSj                  sj                  j                  d      _        j                  j                  j                         j!                         j                  s<j#                          y 7 0w)Ng        r	   Flast)asyncioget_running_loopr  re  r~  waitclearr  rb  call_atr   r   r   ra  popaddr  r8  )loopnext_updater<  r   s     r9   report_progressz,ConsoleLogger.start.<locals>.report_progressW  s+    ++-DK!iikk&&(((!!# 99;+-)-D&"&))+/KLLd.A.AB&&**..j6H6HH)-D&))-- )-););)?)?U)?)KD&&&**4+=+=>""7+- ii. JJL- )s   AFFDF3F   r&   r'   rJ  )r  Eventr~  rg  maxr   rd  rk  need_consoler  r   ensure_futurerc  )r   r<  r  s   `` r9   r=  zConsoleLogger.startV  s    	: mmo!,,		7#9#9B#>?	;;w33"#c#doo*>&?"?!"CD!(!6!67H!ID  4;r;   c                   |j                   r|j                  r| j                          t        |j	                  |t        j                         | j                  |j                  j                  t        j                                            t        |j                  j                         |j                  z          |j                  rt        | j                  d       n|j                  st        d       | xj                  dz  c_        | j                  j!                  |       | j                  j#                  |d       | j%                          y )N)rd  r  Tr8  r	   Fr  )verbosecmdliner8  rW   r   r   colorize_consolerd  r   r   r   direct_stdoutro  needs_parsingrh  ra  r  move_to_endr  r?  s      r9   rA  z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                h   |j                   s|j                  j                  sy|j                  t	        j
                         |j                        }|j                   r|S |j                         }t        |      dk  r|S t        t	        j                  d            dj                  |dd        z   S )Nr2   )stderr_onlyd   z1Listing only the last 100 lines from a long log.
r   i)r  optionsprint_errorlogsget_logr   r  r  
splitlinesr  r   boldr   )r   r<  rM   rE  r  s        r9   shorten_logzConsoleLogger.shorten_log  s    ~~goo&E&EnnT224)/)=)=  ?>>J u:Jtyy!UVWZ^ZcZcdijnjodpZqqqr;   c                z   |j                   se|j                  }|s1t        |j                  j	                         |j
                  z          y t        |j                  j	                         |z          | j                  ||      }|r6t        | j                         t        |       t        | j                         y y r   )
r  r  rW   r   r   stdor  ro  r   rp  )r   r<  rM   r  rE  s        r9   	print_logzConsoleLogger.print_log  s    ~~nnGfjj335CD&**//1G;<w/$##$sO$//" r;   c                ~   |j                   s&|j                  j                  r|j                         r| j	                          t        |j                  |t        j                         | j                  | j                  ||j                  t        j                                     d       | j                          y y y )N)rd  prefixmiddler  Tr  )r  r  r  r   r8  rW   r   r   r  rd  rr  r   r  )r   r<  r@  rL   rM   s        r9   rC  zConsoleLogger.log_subtest  s    <<GOO;;JJL'..t'<'<'>tObOb(,()'-t7L7L7N'O ! Q Y]^
 ! AP;r;   c                ^   | j                   j                  |       |j                  t        j                  u rW|j
                  s|j                  j                  r5| j                          t        |j                   d|j                   d       |j                  j                  r|j                  j                         s^| j                          |j                  r[|j                  rOt        | j                          t        |j#                  |t%        j&                         | j(                               nst        |j#                  |t%        j&                         | j(                        d       |j
                  s|j                  j+                         r| j-                  ||       |j.                  r6t        d       |j.                  D ]  }t        |d        t        d       |j
                  s|j                  j+                         rt        d       | j1                          y )Nz time out (After z	 seconds))rd  Tr  )ra  remover   r   r   r  r  r  r8  rW   r   r  quietr   r  r  rp  r   r   r  rd  r   r  warningsr  )r   r<  rM   rO   s       r9   rE  zConsoleLogger.log  sx   !!&)::+++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NN7F3D! )A!4()D!~~!2!2!4D!r;   c                  K   d| _         | j                          | j                  r| j                   d {    |j                  r|j                  j
                  s|j                  j                  rVt        d       t        |j                  d      D ]2  \  }}t        |j                  |t        j                                      4 t        |j                                y 7 w)NTz
Summary of Failures:
r	   )re  r  rc  collected_failuresr  r  r  rW   	enumerater   r   r  summaryr   r<  irM   s       r9   rG  zConsoleLogger.finish  s     	$$$$%%00GOO4K4K,-&w'A'A1E G	6gnnVT-B-B-DEFG 	goo  %s   3C$C"B-C$NrJ  )r  r   r   rK  rL  rN  )r<  rM  rM   rO  r   r   rP  )
r<  rM  r@  rO  rL   r   rM   r   r   rK  )r   r   r   rv  rs  rm  rn  rq  rZ  r8  r|  r  r  r=  rA  r  r  rC  rE  rG  r?   r;   r9   r^  r^    sa    &MGG HED.@(
*"@%JN"r#"6!r;   r^  c                  $    e Zd ZddZddZddZy)TextLogfileBuilderc                "   | j                   j                  dt        j                  j                         j	                          d       t        t        j                  j                               }| j                   j                  d| d       y )NzLog of Meson test suite run on 

zInherited environment: )	rY  writedatetimenow	isoformatr   rS   rT   items)r   r<  inherit_envs      r9   r=  zTextLogfileBuilder.start  sg    		9(:K:K:O:O:Q:[:[:]9^^bcd&rzz'7'7'9:		1+dCDr;   c                   |j                    d|j                   }| j                  j                  t	        |dd      dz          | j                  j                  d|j
                  z   dz          t        j                  dt        j                  |j                              }| j                  j                  d|z   dz          | j                  j                  dd	|j                  z  z   dz          | j                  j                  d
|j                         z   dz          |j                  r+| j                  j                  d|j                  z   dz          |j                  rh|j                  j                  rdnd}| j                  j                  t	        |dd      dz          | j                  j                  |j                         |j                   rN| j                  j                  t	        ddd      dz          | j                  j                  |j                          | j                  j                  t	        ddd      dz          y )Nr  =N   r   ztest:         z%H:%M:%Szstart time:   zduration:     z%.2fszresult:       zcommand:      ru  outputr1   stderrr2   r  )r
  rg  rY  r  r   r   r  strftimegmtimer  durationget_exit_statusr  r  r  rq   stde)r   r<  rM   titlestarttime_strr   s         r9   rE  z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                t  K   |j                   rg| j                  j                  d       t        |j                   d      D ]3  \  }}| j                  j                  |j	                  |d      dz          5 | j                  j                  |j                                t        d| j                          y w)Nz
Summary of Failures:

r	   Fr   zFull log written to )r  rY  r  r  r   r  rW   rW  r  s       r9   rG  zTextLogfileBuilder.finish  s     %%IIOO89&w'A'A1E F	6		vu = DEF		)*$T]]O45s   B6B8NrL  rP  )r   r   r   r=  rE  rG  r?   r;   r9   r  r    s    E
6&6r;   r  c                      e Zd ZddZy)JsonLogfileBuilderc           	     f   |j                   |j                  |j                  j                  |j                  |j
                  |j                  |j                  |j                  d}|j                  r|j                  |d<   | j                  j                  t        j                  |      dz          y )N)r   ru  rM   r  r  
returncoder   commandr  r   )r   r  r   r   r  r  r  r   cmdr  rY  r  jsondumps)r   r<  rM   jresults       r9   rE  zJsonLogfileBuilder.log  s    KKkkjj&&)) ++::zz	'
 ;; &GH		

7+d23r;   NrP  )r   r   r   rE  r?   r;   r9   r  r    s    4r;   r  c                  (    e Zd ZdZddZddZddZy)	JunitBuildera  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                \    || _         t        j                  dddd      | _        i | _        y )N
testsuites0testsr   failures)rW  etElementrootsuites)r   rW  s     r9   rZ  zJunitBuilder.__init__$  s)     JJC#?	/1r;   c                X   |j                   	|j                   j                  d      D ]  }dj                  |j                  |j                  |j
                  d         |j
                  d<   |j                  d      D ]  }|j
                  d=  |j                  d      D ]  }|j
                  d=  |j                  d	      D ]  }|j
                  d
=  |j                  d      D ]  }|j
                  d=  | j                  j                  |        y|j                  rQ|j                   d|j                   }|| j                  vs |j                  j                  dkD  sJ d       t        j                  d|t        t        |j                              t        t!        d |j                  D                    t        t!        d |j                  D                    t        t!        d |j                  D                    t        |j"                              x}| j                  |<   |j                  D ]  }t        j$                  |dt        |      |      }|j&                  t(        j*                  u rt        j$                  |d       n|j&                  t(        j,                  u rt        j$                  |d       n|j&                  t(        j.                  u rt        j$                  |d       n|j&                  t(        j0                  u rt        j$                  |d      }d|_        ns|j&                  t(        j4                  u rt        j$                  |d      }d|_        n9|j&                  t(        j6                  u rt        j$                  |d      }d|_        |j8                  s{|j8                  t        j$                  |d      _         |j:                  r>t        j$                  |d      }	t=        |j:                  j?                               |	_        |j@                  r?t        j$                  |d      }
t=        |j@                  j?                               |
_        yy|j                  | j                  vrSt        j                  d|j                  dd d d t        |j"                              x}| j                  |j                  <   nJ| j                  |j                     }t        tC        |j
                  d!         dz         |j
                  d!<   t        j$                  |d|j                  |j                  t        |j"                        "      }|jD                  t(        j*                  u rHt        j$                  |d       t        tC        |j
                  d         dz         |j
                  d<   n|jD                  t(        j,                  u rHt        j$                  |d       t        tC        |j
                  d#         dz         |j
                  d#<   nc|jD                  t(        j.                  u rGt        j$                  |d       t        tC        |j
                  d$         dz         |j
                  d$<   |j:                  r>t        j$                  |d      }	t=        |j:                  j?                               |	_        |j@                  r?t        j$                  |d      }
t=        |j@                  j?                               |
_        yy)%zLog a single test case.Nz.//testsuitez{}.{}.{}r   z.//testcase[@result]rM   z.//testcase[@timestamp]	timestampz.//testcase[@file]rY  z.//testcase[@line]r  .r	   zduplicate suite	testsuitec              3  z   K   | ]3  }|j                   t        j                  t        j                  hv s0d  5 ywr	   N)rM   r   r   r   .0rs     r9   	<genexpr>z#JunitBuilder.log.<locals>.<genexpr>H  s6      IQ!(( * 4 4j6F6FG;Hq Is   1;;c              3     K   | ]B  }|j                   t        j                  t        j                  t        j                  hv s?d  D ywr  )rM   r   r   r   r   r  s     r9   r  z#JunitBuilder.log.<locals>.<genexpr>J  s<      !cqAHH",//:3L3LjN`N`!a=b !cs   A A
A
c              3  Z   K   | ]#  }|j                   t        j                  u s d  % ywr  rM   r   r   r  s     r9   r  z#JunitBuilder.log.<locals>.<genexpr>L  s     Wa188z;VWs   !++)r   r  r   r  r   r  testcase)r   	classnamer   errorfailurezTest unexpected 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  rb   r  r  r   r  sumr  
SubElementrM   r   r   r   r   r   textr   r   r   r  replace_unencodable_xml_charsr  r  rU   r   )r   r<  r@  suitecase	suitenamesubtestr  failouterrs              r9   rE  zJunitBuilder.log*  sn   ::!++N; ('1'8'8tyyRWR^R^_eRf'gV$ "MM*@A .DH-.!MM*CD 1DK01!MM*>? ,DF+,!MM*>? ,DF+,		  '( 
 <<<<.$))5IDKK/7??3I3IA3M`O``M-/ZZ#dll+,3 I$,, I I JS !cDLL !c c dCW4<<WWX'
. 
EDKK	*  << U ==
WYbc>>Z__4MM(I6^^z'7'77MM(G4^^z6MM(I6^^z'@'@@==9=D 9DI^^z';';;==7;D ?DI^^z'9'99==7;D PDI&&AHATATBMM(L9>)U* 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---h0),Sh1G-H1-L)MX&Z__,h	2+.s5<<
3K/Lq/P+QZ(yymmHl;89I9I9KLyymmHl;89I9I9KL r;   c           	        K   | j                   j                         D ]  }| j                  j                  |       dD ]]  }t	        t        | j                  j                  |         t        |j                  |         z         | j                  j                  |<   _  t        j                  | j                        }t        | j                  d      5 }|j                  |dd       ddd       y# 1 sw Y   yxY ww)z9Calculate total test counts and write out the xml result.r  wbrT  T)rV  xml_declarationN)r  valuesr  rm   r   rU   r  r  ElementTreerX  rW  r  )r   r<  r  attrtreefs         r9   rG  zJunitBuilder.finish  s     [['') 	dEIIU#7 d),S1A1A$1G-H3u||\`OaKb-b)c		  &d	d ~~dii($--& 	B!JJq7DJA	B 	B 	Bs   CC>C2)	C>2C;7C>N)rW  r   r   rK  rN  rL  )r   r   r   __doc__rZ  rE  rG  r?   r;   r9   r  r    s    2ZMx
Br;   r  c                       e Zd ZU dZi Zded<   d fdZ	 	 	 	 	 	 	 	 ddZddZe	dd       Z
e	dd       Zdd	Zdd
ZddZddZe	dd       ZddZddZdddZe	dd       ZddZ xZS )TestRunr   z'T.Dict[TestProtocol, T.Type['TestRun']]PROTOCOL_TO_CLASSc                X    t         |   t        j                  |j                           S r   )super__new__r  r  protocol)clsr@  rv   kwargs	__class__s       r9   r"  zTestRun.__new__  s!    ww88GHHr;   c                `   t         j                  | _        || _        d | _        || _        || _        g | _        d | _        d | _	        d | _
        d| _        d| _        d| _        d | _        || _        |j                   | _        |j"                  | _        d | _        || _        || _        g | _        y Nr2   )r   r   r   r@  _numr   r  r  r  r  r  r  r  additional_errorr  r   should_failproject_namer  r  is_parallelr  r  )r   r@  test_envr   r  r-  r  s          r9   rZ  zTestRun.__init__  s    %%	%)		/1+/,0+/		 ",0++((15
&%'r;   c                n    t         j                  | _        t        j                         | _        || _        y r   )r   r   r   r  r  r  )r   r  s     r9   r=  zTestRun.start  s#    %%r;   c                    | j                   .t        xj                  dz  c_        t        j                  | _         | j                   S Nr	   )r)  r  TEST_NUMr   s    r9   r
  zTestRun.num  s4    99!((DIyyr;   c                V    | j                   xr | j                   xr | j                   S r   )r  r-  r  r   s    r9   r  zTestRun.direct_stdout  s(    ||OD$4$4 4OT=O=O9OOr;   c                    | j                   rJt        d | j                   D              }t        d | j                   D              }||k(  r| dS | d| dS y)Nc              3  P   K   | ]  }|j                   j                            y wr   )rM   r   r  r   s     r9   r  z&TestRun.get_results.<locals>.<genexpr>  s     @a)@s   $&c              3  T   K   | ]   }|j                   t        j                  u " y wr   r  r6  s     r9   r  z&TestRun.get_results.<locals>.<genexpr>  s     L!ahhjoo5L   &(z subtests passedr  r2   )r  r	  )r   passedrans      r9   get_resultszTestRun.get_results  s]    <<@4<<@@FLt||LLC} !122 3%'788r;   c                ,    t        | j                        S r   )r   r  r   s    r9   r  zTestRun.get_exit_status  s    #DOO44r;   c                    | j                   t        j                  u ry| j                  r| j	                         S | j                         S r(  )r   r   r   r  r  r;  r   s    r9   r  zTestRun.get_details  s<    88z)))??''))!!r;   c                   | j                   t        j                  k(  rt        j                  | _         t	        | j                   t              sJ | j
                  rm| j                   t        j                  t        j                  fv rA| j                   t        j                  u rt        j                  nt        j                  | _         | j                  r0| j                  j                  d      s| xj                  dz  c_	        | j                  r0| j                  j                  d      s| xj                  dz  c_        t        j                         | j                  z
  | _        y r   )r   r   r   r   
isinstancer+  r   r   r   r  endswithr  r  r  r  r   s    r9   	_completezTestRun._complete  s    88z)))!}}DH$((J///Z]]JOO,L L48HH
4Mz00S]SjSjDH99TYY//5III99TYY//5III		dnn4r;   c                   | j                   sy t        | j                  j                               t        t        j
                  j                               z
  }t        |      dj                  d | j                   D              z   S )Nr   c              3  2   K   | ]  }t        |        y wr   )r   r6  s     r9   r  z"TestRun.cmdline.<locals>.<genexpr>  s     3QXa[3s   )r  r  r   r  rS   rT   r   r   )r   test_only_envs     r9   r  zTestRun.cmdline  s`    xxDHHNN,-BJJ4D4D4F0GG.HH3$((334 	4r;   c                    t        j                          | _        t        | _        t        j
                  | _        | j                          y r   )r  r  GNU_SKIP_RETURNCODEr  r   r   r   rA  r   s    r9   complete_skipzTestRun.complete_skip  s+    -??r;   c                $    | j                          y r   )rA  r   s    r9   completezTestRun.complete  s    r;   c                   |rdn| j                   }| j                  s| j                  rd}|r<|t        j                  d      j                  |      dz   z  }||z  }|dd  dk7  r|dz  }|t        j                  d      j                  |      dz   z  }|t        | j                  | j                        z  }n|}|r|dd  dk7  r|dz  }|S )Nr2   zstdout:r   r~   zstderr:)r  r  r*  r   cyanr   r   )r   r   r  r  r   s        r9   r  zTestRun.get_log  s     rdii99--Ctyy+44X>EEtrs8t#4KC499Y'00:TAAC:dii)>)>??CC3rs8t#4KC
r;   c                     y)NFr?   r   s    r9   r  zTestRun.needs_parsing  s    r;   c                *   K   |2 3 d {   }
7 6 y wr   r?   )r   r<  r  ls       r9   r  zTestRun.parse  s       	 	!	us   )r@  r   rv   T.Anyr%  rO  r   rO  )r@  r   r.  T.Dict[str, str]r   r   r  r  r-  r   r  r   )r  T.List[str]r   rK  r   r   r   rJ  r   r   )FF)r   r   r  r   r   r   r<  rM  r  r-  r   rK  )r   r   r   r2  r  r   r"  rZ  r=  propertyr
  r  r;  r  r  rA  r  rG  rI  r  r  r  __classcell__r&  s   @r9   r  r    s    HAC>CI((%4(CG(RV(.
   P P	5"
5 4 4"  r;   r  c                        e Zd Zd fdZ xZS )TestRunExitCodec                v   | j                   t        j                  k7  rn| j                  t        k(  rt        j
                  | _         nc| j                  t        k(  rt        j                  | _         n:t        | j                        rt        j                  nt        j                  | _         t        | 1          y r   )r   r   r   r  rF  r   GNU_ERROR_RETURNCODEr   r   r   r   r!  rI  r   r&  s    r9   rI  zTestRunExitCode.complete  sq    88z)))__ 33!DH__ 44!''DH*.t*?zZ]]DHr;   rJ  r   r   r   rI  rU  rV  s   @r9   rX  rX    s    	 	r;   rX  c                        e Zd Zd fdZ xZS )TestRunGTestc                   | j                   j                   d}| j                   j                  r4t        j                  j                  | j                   j                  |      }	 t        |ddd      5 }t        j                  |      | _	        d d d        t        | =          y # 1 sw Y   xY w# t        $ r Y &t        j                  $ r%}t        j                  d| d|       Y d }~Xd }~ww xY w)N.xmlr  utf8r\  rU  zUnable to parse : )r@  r   workdirrS   pathr   rX  r  r  r  FileNotFoundError
ParseErrorr   r  r!  rI  )r   rW  r  er&  s       r9   rI  zTestRunGTest.complete  s    iinn%T*99ww||DII$5$5x@H
	=hfYG )1XXa[
) 	) )  	 }} 	=JJ)(2aU;<<	=s6   &B3 5B'B3 'B0,B3 3	C5>C5C00C5rJ  r\  rV  s   @r9   r^  r^    s     r;   r^  c                  :     e Zd Zedd       Zd fdZddZ xZS )
TestRunTAPc                     yNTr?   r   s    r9   r  zTestRunTAP.needs_parsing5      r;   c                   | j                   dk7  rg| j                  j                         sMt        j                  | _        | j
                  xs d| _        | xj
                  d| j                    dz  c_        t        |           y )Nr   r2   z'
(test program exited with status code r   )r  r   r   r   r   r  r!  rI  r[  s    r9   rI  zTestRunTAP.complete9  sc    ??a(;(;(=!''DH		RDIIICDOOCTTUVVIr;   c           	       K   d }g }d}t               j                  |      2 3 d {   }t        |t         j                        r|j                  }0t        |t         j
                        r.t        j                  }|j                  | |j                  |       xt        |t         j                        r| j                  j                  |       |j                  j                         rt        j                  }|j                  | |j                   xs d|j"                   |j                         t        |t         j$                        r|j                  |       >t        |t         j&                        sZ| xj(                  d|j                  z   z  c_        t        j                  }7 6 |rt+        t-        j.                  d            }t1        t+        t3        d |D                          }|D ]>  }	| j4                  j                  d|	j6                  | dd| d|	j                          @ |d	kD  r| j4                  j                  d
       n:| j4                  j                  t+        t-        j8                  d            dz          t;        d | j                  D              rt        j<                  }|r&| j>                  t        j@                  k(  r|| _        y y y w)Nr)   zsubtest zTAP parsing error: UNKNOWNc              3  4   K   | ]  }|j                     y wr   )r   )r  r  s     r9   r  z#TestRunTAP.parse.<locals>.<genexpr>X  s     ;Q;s   zstdout: r2   rb  r  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  T   K   | ]   }|j                   t        j                  u  " y wr   r  r  ts     r9   r  z#TestRunTAP.parse.<locals>.<genexpr>a       Aqqxx:??*Ar8  )!r   r  r?  r   r   r   r   r   rC  r   r   r  rm   rM   r   r   r   r   r   r   r*  r   r   r   r  r  r  r   r   allr   r   r   )
r   r<  r  r   r  r   r  unknownr   rO   s
             r9   r  zTestRunTAP.parse@  s<    24 {..u5 	' 	'!!Y../))Ay001 &&##D!))S9Ay~~.##A&88??$$//C##D!&&*Ihqxxj4I188TAy445"Ay/%%)>)JJ% &&	'5" $++i01GC;(;;<=E \$$x% /AG9Bqyyk%Z[\|$$ &k l $$S'):%; ?| &| }ADLLAA//C488z111DH 23s-    K+F3F0F3EK+<4K+0F33D8K+r   rJ  rS  )r   r   r   rT  r  rI  r  rU  rV  s   @r9   ri  ri  4  s     &r;   ri  c                  &    e Zd Zedd       ZddZy)TestRunRustc                     yrk  r?   r   s    r9   r  zTestRunRust.needs_parsingl  rl  r;   c                  K   dd}d}|2 3 d {   }|j                  d      s|j                  d      r-|j                         j                  d      \  }}}}|j                  dd      } ||||      }	| j                  j                  |	       |j                  | ||	j                         |dz  }7 6 d }
t        d | j                  D              rt        j                  }
nYt        d	 | j                  D              rt        j                  }
n,t        d
 | j                  D              rt        j                  }
|
r&| j                  t        j                  k(  r|
| _        y y y w)Nc                V   |dk(  r&t         j                  | |t        j                  d       S |dk(  r&t         j                  | |t        j                  d       S |dk(  r&t         j                  | |t        j
                  d       S t         j                  | |t        j                  d|       S )Nr	  ignoredFAILEDz#Unsupported output from rust test: )r   r   r   r   r   r   r   )nr   rM   s      r9   	parse_resz$TestRunRust.parse.<locals>.parse_resq  s    ~ ~~az}}dCC9$ ~~azEE8# ~~azEE>>!T:+;+;$Gx"PR Rr;   r	   ztest ztest resultr   z::r  c              3  T   K   | ]   }|j                   t        j                  u  " y wr   r  rr  s     r9   r  z$TestRunRust.parse.<locals>.<genexpr>  rt  r8  c              3  T   K   | ]   }|j                   t        j                  u  " y wr   )rM   r   r   rr  s     r9   r  z$TestRunRust.parse.<locals>.<genexpr>  s     D!Z---Dr8  c              3  T   K   | ]   }|j                   t        j                  u  " y wr   )rM   r   r   rr  s     r9   r  z$TestRunRust.parse.<locals>.<genexpr>  s     CZ__,Cr8  )r~  rU   r   r   rM   r   r   r   )r  r  rq   r\  r  rm   rC  rM   ru  r   r   anyr   r   r   r   )r   r<  r  r  r~  r  rw  r   rM   rs  r   s              r9   r  zTestRunRust.parsep  s+    	R  	 	$w'0N%)[[]%8%8%="4F||D#.av.##A&##D$9Q	% ADLLAA//CDt||DD""CCdllCC//C488z111DH 23s1   	E*B8B6B8E*E*A>E*6B88B2E*Nr   rS  )r   r   r   rT  r  r  r?   r;   r9   rx  rx  k  s      r;   rx  c                4    d }t         j                  ||       S )Nc                :    t        | j                               dd S )Nr	   r~   )reprr"  )illegal_chrs    r9   r   z/replace_unencodable_xml_chars.<locals>.<lambda>  s    T+2C2C2E-Fq-L r;   )UNENCODABLE_XML_CHRS_RErr  )original_strreplacement_lambdas     r9   r  r    s     M"&&'9<HHr;   c                p    | y	 | j                  d      S # t        $ r | j                  dd      cY S w xY w)Nr2   rT  z
iso-8859-1ignorer   )r   UnicodeDecodeError)streams    r9   r   r     s@    ~<}}W%% <}}\(};;<s    55c                F  K   g }	 | j                         s	 | j                  d       d {   }|rWt        |      }|j                  |       |t        j                  u rt        |dd       |r|j                  |       d {    | j                         sdj                  |      |r|j                  d        d {    S S 7 # t        j                  $ r}|j                  }Y d }~d }~wt        j
                  $ r.}| j                  |j                         d {  7  }Y d }~d }~ww xY w7 7 u# t        j                  $ r1 dj                  |      cY |r|j                  d        d {  7   S S w xY w# |r|j                  d        d {  7   w w xY ww)N   
r2   T)r   r8  )at_eof	readuntilr  IncompleteReadErrorpartialLimitOverrunErrorreadexactlyconsumedr   rm   r   r   rW   putr   CancelledError)readerqueueconsole_mode
stdo_lines
line_bytesrg  r  s          r9   read_decoder    sg     J"--/B#)#3#3E#::

 j)!!$';#5#55$Bd3))D/)) --/ wwz" ))D/!! ! ;.. 'YY
,, B#)#5#5ajj#AAA
B * "	 !! #wwz""))D/!! # ))D/!! s   F!D8 C	 CC	 AD8 D4D8 D8 *F! D6F!C	 	D1C-(D8 -D1D,!D$"D,'D8 ,D11D8 6F!8$E<E? F!3E64F!;E<<E? ?FFFF!c                V    | j                  d      xr t               xs
 t                S )Nz.exe)r@  r:   r@   )fnames    r9   run_with_monor    s"    >>&!G:<+F9;&GGr;   c                4   t        | t              st        dt              | D ]r  }t        |t              st        dt              t        |d      st        dt              t        |j                  t              sZt        |j                  t               | S )Nz	<unknown>r   )r?  rh   r   coredata_versionr   hasattrr   r   )objsobjs     r9   check_testdatar    s    dD!+K9IJJ O#01/=MNNsI&/=MNN .>?/=MNNO Kr;   c               r   K   	 | j                          d {   }| j                          |y | 17 wr   )get	task_done)qitems     r9   
queue_iterr    s4     
UUW}	<
 s   757c                X   K   	 |  d{    y7 # t         j                  $ r Y yw xY ww)z?Wait for completion of the given future, ignoring cancellation.N)r  r  )futures    r9   rI  rI    s)     !! s(   *  * '*'*c                B  K   dd}t        j                         }|dn|j                         |z   }| r`||dkD  rYt        j                  | |t         j                         d{   \  }}  ||       |r||j                         z
  }| r	|S|dkD  rY ||        y7 8w)a9  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                    d}| D ]6  }|j                         sd}|j                         r'|j                          8 |rt        j                  y NFT)done	cancelledrM   r  TimeoutError)futuresr  r  s      r9   check_futuresz#complete_all.<locals>.check_futures  sL     	A668[[]
		
 &&& r;   Nr   )r  return_when)r  T.Iterable[asyncio.Future]r   rK  )r  r  r  r  FIRST_EXCEPTION)r  r  r  r  deadliner  s         r9   complete_allr    s     	' ##%DtDIIK',AH
w'A+%ll7G7>7N7NP Pgd,G w'A+ 'Ps   A"B$B%(BB
Bc                  N    e Zd Z	 d	 	 	 	 	 ddZd	dZ	 	 	 	 	 	 d
dZddZddZy)TestSubprocessNc                t    || _         || _        || _        d | _        d | _        || _        g | _        d | _        y r   )_processru  r  	stdo_task	stde_taskpostwait_fnall_futuresr  )r   pru  r  r  s        r9   rZ  zTestSubprocess.__init__  s>     9=9=&35AE
r;   c                ^    t        j                         | _        t        | j                        S r   )r  Queuer  r  r   s    r9   stdout_lineszTestSubprocess.stdout_lines  s    ]]_
$**%%r;   c                j    	 	 	 	 	 	 d fd}	 	 	 	 	 	 dd} j                   i j                  ] || j                  j                  |      }t        j                  |       _          j
                  j                   j                           j                   j                  t        j                  j                  k7  r] || j                  j                  |      }t        j                  |       _
         j
                  j                   j                          j                    j                  fS )Nc                Z   K   t        |j                  |       d {   | _        y 7 
wr   )r  r  r  )r@  r  r  r   s      r9   collect_stdoz0TestSubprocess.communicate.<locals>.collect_stdo  s#      *&$**lKKDIKs   +)+c                D   K   t        |d |       d {   | _        y 7 
wr   )r  r  )r@  r  r  s      r9   collect_stdez0TestSubprocess.communicate.<locals>.collect_stde  s      *&$EEDIEs     )r@  rO  r  asyncio.StreamReaderr  r   r   rK  )r  ru  r  r  r  r  rm   r  
subprocessr   r  )r   r@  r  r  r  decode_coros   `     r9   communicatezTestSubprocess.communicate  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           	       K   | j                   }	 t               r/t        j                  ddddt	        |j
                        g       nt        j                  |j
                  t        j                         t        t        j                        5  t        j                  |j                         d       d {    d d d        |j                  O	 | j                   r| j                   j#                          | j$                  r| j$                  j#                          y y t        j                  |j
                  t        j&                         t        t        j                        5  t        j                  |j                         d       d {    d d d        |j                  O	 | j                   r| j                   j#                          | j$                  r| j$                  j#                          y y |j)                          t        t        j                        5  t        j                  |j                         d       d {    d d d        |j                  O	 | j                   r| j                   j#                          | j$                  r| j$                  j#                          y y 	 | j                   r| j                   j#                          | j$                  r| j$                  j#                          yy7 I# 1 sw Y   IxY w7 # 1 sw Y   xY w7 # 1 sw Y   xY w# t*        $ ri |j                          d {  7   Y | j                   r| j                   j#                          | j$                  r| j$                  j#                          y y w xY w# | j                   r| j                   j#                          | j$                  r| j$                  j#                          w w xY ww)	Ntaskkillz/Fz/Tz/PIDg      ?r  r	   z!Test process could not be killed.)r  r:   r  runr   pidrS   killpgr   SIGTERMr   r  r  wait_forr  r  r  cancelr  SIGKILLkillProcessLookupError)r   r  s     r9   _killzTestSubprocess._kill,  s     MM)	(|
D$AEE
KL 		!%%0 g223 B!**1668SAAAB<<+2 ~~%%'~~%%' 3 		!%%0'../ <&&qvvx;;;<||'$ ~~%%'~~%%'  FFH'../ <&&qvvx;;;<||' ~~%%'~~%%'  7 ~~%%'~~%%' ; BB B << < << <
 " 	 &&(NN~~%%'~~%%' 	 ~~%%'~~%%' s   O7B L0 )L9L:L>L0 AO7!AL0 ()LLLL0 +AO79)L0 ")L$L"L$L0 %AO74AO7LL
L0 LLL0 "L$$L-)L0 0N"MN"N% AO7!N""N% %AO44O7c                
  K   | j                   }| j                  j                  t        j                  |j                                      	 t        | j                  |j                         d {    | j                   r| j!                          	 |j"                  xs d|_        y 7 7# t        j                  $ rH |xj                  | j                          d {  7  xs dz  c_	        t        j                  |_        Y t        j                  $ rH |xj                  | j                          d {  7  xs dz  c_	        t        j                  |_        Y w xY w# | j                   r| j!                          w w xY ww)Nr  r2   r   )r  r  rm   r  r  r  r  r  r  r*  r  r   r   r   r  r   r  r  )r   r@  r  s      r9   r  zTestSubprocess.wait\  s    MM 5 5affh ?@	#t//FFF   ",,+! G## 	*!!4::<%7%7%=2=!!))DH%% 	,!!4::<%7%7%=2=!!++DH	,
   "  sl   A	F$B* 0B(1B* 53F(B* *2EC
%EE! 1E5D8
6%EE! EE! !F  Fr   )r  zasyncio.subprocess.Processru  r  r  r  r  zT.Callable[[], None])r   r-  )r@  rO  r  r   r   zCT.Tuple[T.Optional[T.Awaitable[str]], T.Optional[T.Awaitable[str]]]rR  )r@  rO  r   rK  )r   r   r   rZ  r  r  r  r  r?   r;   r9   r  r     sX     6:
F(
F2A
F2
F&.#."-.3X.6.(`,r;   r  c                      e Zd Z	 	 ddZddZddZedd       Zedd       Zedd       Z	ddZ
	 	 	 	 	 	 	 	 	 	 ddZdd	Zy
)SingleTestRunnerc           	        || _         || _        | j                         | _        | j                  r| j                   j                  rt
        j                  j                  | j                   j                  dgz         |d   z   |d<   g }| j                  D ]  }|j                  |       t
        j                  j                  |      j                  d      sCt        || j                   j                  D cg c]  }d|z   	 c}|j                  dd      j                  d      z   | j                   j                        |d<    n d|vs|d   s.|j                   s"t#        t%        j&                  dd	            |d<   d
|vs|d
   sd|d
<   d|vs|d   sd|d<   | j                  j(                  s/| j                   j*                  | j                   j*                  dk  rd }nv| j                  j,                  | j                   j*                  }nI| j                  j,                  dk  rd }n-| j                   j*                  | j                  j,                  z  }|j.                  xr2 | j                  j0                  dkD  xr | j                  j(                   }	|j2                  xs | j                  j2                  xr | j                  j4                   }
t7        |||||	|
      | _        | j                  j(                  rt:        j<                  | _        y | j8                  j@                  rt:        jB                  | _        y t:        jD                  | _        y c c}w )Nr2   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=1r   )#r@  r  _get_cmdr  extra_pathsrS   pathsepr   rm   rd  basenamer  r   r  rq   rc  	benchmarkr   randomrandintrf   r  timeout_multiplierr-  num_processesr  r  r  runobjr   r   r  r  r   r   )r   r@  r   r   r  winecmdrN   r  r  r-  r  s              r9   rZ  zSingleTestRunner.__init__q  s   	==?88		--**//$))*?*?2$*FG#f+UCKGXX q!77##A&11&9&8+/99+@+@AaACGGJXZD[DaDabeDff		))'C
O
  S(4E0FPWPaPa%(3)?%@C!" #%S-@"TC3&c/.B#hC <<tyy008DII<M<MQR<RG\\,,4ii''G\\,,1Gii''$,,*I*IIG&&b4<<+E+E+IbRVR^R^RbRbNb<<74<<#7#7SASAS=SdCwWM<< +D[[&& + 2 2D + 2 2DQ Bs   6Mc                   | j                   j                  d   }| j                  j                  rD| j                   j                  r.t
        j                  j                  |      st        d|d      |j                  d      rddg| j                   j                  z   S | j                   j                  s%t        |      rdg| j                   j                  z   S | j                   j                  r| j                   j                  r| j                   j                  r| j                   j                  y | j                   j                  r| j                   j                  j                         s:d}t        |j!                  | j                   j                  j"                              | j                   j                  j%                         | j                   j                  z   S | j                   j                  S )	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@  r  r  
no_rebuildcmd_is_builtrS   rd  isfiler   r@  is_cross_builtr  
cmd_is_exeneeds_exe_wrapperexe_wrapperfoundr   r   get_command)r   	testentrymsgs      r9   _get_test_cmdzSingleTestRunner._get_test_cmd  sa   IIOOA&	<<""tyy'='=bggnnU^F_"3I=@w xyyf%F#diioo55))mI.F8diioo--YY!!dii&>&>499C^C^yy$$, %% yy,,224TC'

4993H3H3M3M(NOOyy,,88:TYY__LLyyr;   c                l    | j                         }|sy t        j                  | j                        |z   S r   )r  TestHarnessget_wrapperr  )r   test_cmds     r9   r  zSingleTestRunner._get_cmd  s0    %%'&&t||4x??r;   c                .    | j                   j                  S r   )r  r-  r   s    r9   r-  zSingleTestRunner.is_parallel  s    {{&&&r;   c                .    | j                   j                  S r   )r  r   r   s    r9   visible_namezSingleTestRunner.visible_name  s    {{r;   c                .    | j                   j                  S r   )r  r  r   s    r9   r  zSingleTestRunner.timeout  s    {{"""r;   c                  K   | j                   Hd| _        |j                  | j                         | j                  j	                          | j                  S | j                   | j
                  j                  z   | j                  j                  z   }| j                  j                  |       |j                  | j                         | j                  ||       d {    | j                  S 7 w)Nz7Not run because cannot execute cross compiled binaries.)r  r  log_start_testr  rG  r@  cmd_argsr  	test_argsr=  _run_cmd)r   r<  r  s      r9   r  zSingleTestRunner.run  s     88QDI""4;;/KK%%' {{	 ((TYY///$,,2H2HHCKKc"""4;;/-----{{ .s   CC/C-C/c          	        	K    j                   j                  rUt        j                  t        j                        	t        j                  t        j                  t        j
                         d fd}d	 fd}t        j                  |||||t               s|nd d d {   }t        |||t               s|      S d       S 7 $w)Nc                      j                   j                  r3t        j                  t        j                  t        j                         y t        j                          y r   )r  rf   r   SIGINTSIG_DFLrS   setsidr   s   r9   
preexec_fnz4SingleTestRunner._run_subprocess.<locals>.preexec_fn  s3    || fmmV^^<
 		r;   c                 |    j                   j                  r%t        j                  t        j                          y y r   )r  rf   r   r  )previous_sigint_handlerr   s   r9   r  z5SingleTestRunner._run_subprocess.<locals>.postwait_fn  s(    ||fmm-DE  r;   )ru  r  r   cwdr  )ru  r  r  rJ  )
r  rf   r   	getsignalr  SIG_IGNr  create_subprocess_execr:   r  )
r   rv   ru  r  r   r  r  r  r  r  s
   `        @r9   _run_subprocessz SingleTestRunner._run_subprocess  s      <<&,&6&6v}}&E#MM&--8			F
 00$8>8>5858NXlJ`df f av=G\+U 	UOSU 	Ufs   B!C%C
&%Cc                  K   | j                   t        j                  u rd }d }nzt        j                  j
                  }| j                  j                  s0| j                  j                  st        j                  j                  nt        j                  j
                  }g }| j                  j                  t        j                  u r| j                  j                  }| j                  j                   rHt"        j$                  j'                  | j                  j                   | j                  j                        }|j)                  d| d       | j+                  ||z   ||| j                  j,                  | j                  j                          d {   }| j                  j                  r@| j                  j/                  ||j1                               }t        j2                  |      }	nd }	|j5                  | j                  | j                         \  }
}|j7                  | j                         d {    |	r
|	 d {    |
r
|
 d {    |r
| d {    | j                  j9                          y 7 7 E7 ;7 17 'w)Nz--gtest_output=xml:r`  )ru  r  r   r  )r  r   r   r  r  PIPEr  rq   r  r  r   r@  r#  r   GTESTr   rc  rS   rd  r   rm   r  r   r  r  r  r  r  rI  )r   r<  r  ru  r  	extra_cmd	gtestnamer  
parse_coro
parse_taskr  r  s               r9   r  zSingleTestRunner._run_cmd   s    /FF'',,F||))$++2K2K ''..'',,  "$	99!3!33		Iyy  GGLL):):DIINNK	29+TBC&&sY.4.4+/;;??+/99+<+<	 ' > > ;;$$**7ANN4DEJ ..z:JJ }}T[[$:K:KL	9ffT[[!!!OOOO-> 	" s[   FJI;B#J7I=8JI?JJJJ J=J?JJJN)r@  r   r   rP  r   r   r  argparse.Namespace)r   zT.Optional[T.List[str]]r   r   )r   r  )r<  rM  r   r  )rv   rQ  ru  r  r  r  r   rP  r  r   r   r  )r<  rM  r  rQ  r   rK  )r   r   r   rZ  r  r  rT  r-  r  r  r  r  r  r?   r;   r9   r  r  o  s    63,63p.@ ' '     # #
 U&5 U?N U#3 U:I UN\ UD'r;   r  c                  b   e Zd Zd"dZd#dZd$dZd$dZd%dZd&dZd'dZ	d$dZ
d(d	Zd)d
Zd*dZd+dZed,d       Zed,d       Zd-dZ	 	 	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d/dZd0dZd,dZd,dZed1d       Zed2d       Zd3dZd4dZd5d6dZd$dZd$dZed7d       Zd8dZ d9dZ!d:dZ"d;d Z#d9d!Z$y)<r  c                   || _         g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        g | _        t               | _        | j                  j                  | j                         d| _        d | _        d | _        | j                   j$                  r| j                   j&                  sd }t(        j*                  j-                  | j                   j.                  d| j                   j$                        | _        | j                   j0                  r<t(        j*                  j3                  | j5                  | j                         d         }n<| j                   j6                  r&| j                   j6                  j9                  dd      }|r(| xj"                  d|j9                  dd      z   z  c_        | j;                          | j=                          t?               }| j@                  D ]$  }|jB                  D ]  }|jE                  |        & tG        |      | _$        y )Nr   Fz
meson-logs:rw  r1   r   )%r  r  
fail_countexpectedfail_countunexpectedpass_countsuccess_count
skip_counttimeout_countrg  name_max_lenis_runloggersr^  console_loggerrm   r  ninjalogfile_baselogbaserf   rS   rd  r   rk   ri   r  r  ru   r\  prepare_buildload_metadatar  r  r  r  rh   r  )r   r  namebasessrs  rL   s         r9   rZ  zTestHarness.__init__+  s   35"#$%!+-+oD//0!"&
-1<<(8(8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                6    | j                   sJ | j                   S r   )r4  r   s    r9   get_console_loggerzTestHarness.get_console_loggerS  s    """""""r;   c                    | j                   j                  ry t        j                         | _        | j                  s!t        d       t        j                  d       y y )Nz%Can't find ninja, can't rebuild test.r,   )r  r  r   detect_ninjar5  rW   r>   exitr   s    r9   r8  zTestHarness.prepare_buildW  sD    <<"" --/
zz9:
 HHSM r;   c                   t        j                         }	 t        j                  | j                  j                         | j                  j
                  st        j                  | j                  ddgz   d      j                  }d|vrd|vr| j                  j                  rt        j                  nt        j                  }t        j                  | j                  dgz   |j                               }|j                  dk7  r"t        d	| j                  j                        t!        j"                  t        j                               | _        | j                  j&                  s%| j$                  j(                  | j                  _        | j                  j*                  r| j-                  d
      | _        n| j-                  d      | _        t        j                  |       y # t        j                  |       w xY w)Nz-nzbuild.ninjaT)capture_outputs   ninja: no work to do.s   samu: nothing to do)ru  r   zCould not configure zmeson_benchmark_setup.datzmeson_test_setup.dat)rS   getcwdchdirr  rk   r  r  r  r5  ru  rh   r>   r  filenor  r   r
   load
build_dataru   test_setup_default_namer  
load_testsr  )r   startdirteststdor  rets        r9   r9  zTestHarness.load_metadatad  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   F;G' 'G>c                   t        d      |z  }|j                         s#t        d| j                  j                  d      |j                  d      5 }t        t        j                  |            }d d d        |S # 1 sw Y   S xY w)Nzmeson-privatez
Directory z- does not seem to be a Meson build directory.rb)	r   is_filer   r  rk   rX  r  picklerF  )r   	file_namedatafiler  r  s        r9   rI  zTestHarness.load_tests  su    (94!*T\\__,??l mnn]]4  	2A!&++a.1D	2	2s   A<<Bc                    | S r   r?   r   s    r9   	__enter__zTestHarness.__enter__  s    r;   c                $    | j                          y r   )close_logfiles)r   exc_type	exc_value	tracebacks       r9   __exit__zTestHarness.__exit__  s    r;   c                T    | j                   D ]  }|j                           d | _        y r   )r3  rI  r4  r   rN  s     r9   rV  zTestHarness.close_logfiles  s&     	AGGI	"r;   c                `   d| j                   j                  v r| j                   j                  | j                  j                  vr-t	        j
                  d| j                   j                   d       | j                  j                  | j                   j                     S |j                  dz   | j                   j                  z   }|| j                  j                  vr:t	        j
                  d| j                   j                   d|j                   d       | j                  j                  |   S )Nr*  zUnknown test setup 'z'.zTest setup 'z' not found from project ')r  ru   rG  test_setupsr>   r@  r,  )r   r@  	full_names      r9   get_test_setupz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                   | j                  |      }|j                  s|j                  |_        |j                  rd|_        |j                  |j                  |_        |j                  |j
                  |_        n!|j
                  rt        j                  d       |j                  j                  t        j                  j                               S )NTzBConflict: both test setup and command line specify an exe wrapper.)r`  rf   r  r  ri   r   r>   r@  r   get_envrS   rT   copy)r   r  r@  currents       r9   merge_setup_optionszTestHarness.merge_setup_options  s    %%d+{{!++GK;;"GO%%-)0)C)CG& ??"%11GO  HHYZ{{""2::??#455r;   c                   | j                  |      }t        | j                        }| j                  j                  r| j	                  ||      }nt
        j                  j                         }|j                  j                  |      }|j                  |       |j                  rX|j                  rL|j                  r@|j                  j                         r&t        |j                  j!                               |d<   t#        ||||      S )NMESON_EXE_WRAPPER)get_pretty_suiter   r  ru   re  rS   rT   rc  r   rb  r~  r  r  r   r  r   r  r  )r   r@  r   r  r   r.  s         r9   get_test_runnerzTestHarness.get_test_runner  s    $$T*4<<(<<**7D9C**//#C88##C(

8D$:$:  T%5%5%;%;%='01A1A1M1M1O'PC#$c499r;   c                   |j                   t        j                  u r| xj                  dz  c_        n<|j                   t        j                  u r| xj
                  dz  c_        n	|j                   t        j                  u r| xj                  dz  c_        n|j                   t        j                  t        j                  t        j                  hv r| xj                  dz  c_        n|j                   t        j                  u r| xj                  dz  c_        nT|j                   t        j                  u r| xj                  dz  c_        n"t!        j"                  d|j                           |j                   j%                         r| j&                  j)                  |       | j*                  D ]  }|j-                  | |        y )Nr	   z!Unknown test result encountered: )r   r   r   r0  r   r/  r   r.  r   r   r   r+  r   r,  r   r-  r>   r@  r   r  rm   r3  rE  )r   rM   rN  s      r9   process_test_resultzTestHarness.process_test_result  s8   ::+++!#ZZ:??*OOq O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                >    t        t        | j                              S r   )r  r   rg  r   s    r9   numlenzTestHarness.numlen  s    3t'((r;   c                &    d| j                   z  dz   S )NrA   )rm  r   s    r9   rd  zTestHarness.max_left_width  s    4;;""r;   c                R    dj                  | j                  || j                        S )Nz{num:{numlen}}/{testcount} )rm  r
  	testcount)r   rm  rg  )r   r
  s     r9   get_test_num_prefixzTestHarness.get_test_num_prefix  s,    ,334;;8;>Boo 4 O 	Or;   Nc                   || j                  |j                        }t        || j                        }||j                  }|| j
                  z   dz   t        |      z
  t        |      z
  t        |      z
  }|dt        d|      z  z  }|^dj                  |j                  j                  |      |j                  | j                  dz         }|j                         }	|	r|d|	z   z  }||z   |z   |z   S )Nr	   r   z{res} {dur:{durlen}.2f}sr&   )r   r  r  r  )rq  r
  r  rd  r   r1  rP   r   r   r   r  r  r  )
r   rM   r   rd  r  r  r  r  extra_mid_widthr  s
             r9   r   zTestHarness.format  s    <++FJJ7D ^T-@-@A>[[F(4+<+<<q@8FCSSV^_cVddgopvgww#A///=.55JJ''1OO,,q0 6 2E ((*G(}v%--r;   c                    t        j                  d      j                  | j                  | j                  | j
                  | j                  | j                  | j                        S )Nz
            Ok:                 {:<4}
            Expected Fail:      {:<4}
            Fail:               {:<4}
            Unexpected Pass:    {:<4}
            Skipped:            {:<4}
            Timeout:            {:<4}
            )	textwrapdedentr   r.  r,  r+  r-  r/  r0  r   s    r9   r  zTestHarness.summary  sS        **D,C,CT__114??DDVDVX	Xr;   c                N    | j                   | j                  z   | j                  z   S r   )r+  r-  r0  r   s    r9   total_failure_countzTestHarness.total_failure_count  s"    !:!::T=O=OOOr;   c                     j                   rt        d      d _          j                         }|sy j                  j                  s@t         j                   j                  j                  |      st        j                  d       t         fd|D               _        t         j                  j                  t        |       j                  j                  z         j                  _        t!        j"                         }	 t!        j$                   j                  j                         g }t'         j                  j                        D ]P  }|j)                   fd|D               |dk(  s#t        d |D               _        t-        d |D               _        R t        |       _         j3                  |       t!        j$                  |        j5                         S # t!        j$                  |       w xY w)	Nz*Test harness object can only be used once.Tr   }   c              3  R   K   | ]  }t        j                  |               y wr   )rP   rh  r  r@  r   s     r9   r  z#TestHarness.doit.<locals>.<genexpr>  s!     X$)>)>t)D EXs   $'c              3  @   K   | ]  }j                  |        y wr   )ri  r|  s     r9   r  z#TestHarness.doit.<locals>.<genexpr>  s     Ldt33D9Ls   c           	   3  r   K   | ]/  }t        t        t        |j                  xs d                    1 yw)r%   N)r  r   rU   r  r  runners     r9   r  z#TestHarness.doit.<locals>.<genexpr>   s2      0G4: 14CFNN<Pb8Q4R0S 0Gs   57c              3  T   K   | ]   }|j                   t        j                  u " y wr   )r  r   r   r  s     r9   r  z#TestHarness.doit.<locals>.<genexpr>#  s+      ,C06 -3,?,?{GYGY,Y ,Cr8  )r2  RuntimeError	get_testsr  r  rebuild_depsr5  rk   r>   r@  r  r1  minr  r  rb   rS   rC  rD  rangeextendr  r  r  rg  	run_testsrx  )r   r  rJ  runnersr  s   `    r9   doitzTestHarness.doit  s   ;;KLL ||&&|DJJY^/_ HHSMXRWXX%()C)C),Udll6I6I)I&K"99;	HHT\\__%02G4<<../ CLeLL6,/ 0G>E0G -GD) ), ,C:A,C )CD%C "'lDONN7#HHX'')) HHXs   A,G) 3AG) )H c                j    d| v r,| j                  dd      }t        |      dk(  sJ |d   |d   fS | dfS )Nr*  r	   rA   r   r2   )rq   r  )r  rq   s     r9   split_suite_stringzTestHarness.split_suite_string,  sF    %<KKQ'Eu:?"?8U1X%%"9r;   c                    |D ]_  }t         j                  |      \  }}| j                  D ]6  }t         j                  |      \  }}|s||k(  r  y|r||k7  r-|r||k7  r5  y a yNTF)r  r  r  )r@  r  r  	prj_matchst_matchprjstprjsts           r9   test_in_suiteszTestHarness.test_in_suites5  s~     	E$/$B$B5$I!Y '::5A	b  B)O 	!1h3	8 r;   c                j   t         j                  || j                  j                        ry| j                  j                  r*t         j                  || j                  j                        S | j                  j
                  r2| j                  |      }t         j                  ||j                        ryyr  )r  r  r  rp   rl   ru   r`  )r   r@  ru   s      r9   test_suitablezTestHarness.test_suitableU  s    %%dDLL,G,GH<<&& --dDLL4O4OPP<<''-E))$0D0DEr;   c              #  V  K   i }| j                   j                  D ]6  }d|v r%|j                  dd      \  }}|dk(  rd}|dk(  rd}nd|}}d|||f<   8 |D ]O  }t        |      D ]?  \  }}t	        |j
                  |      st	        |j                  |      s4d|||f<   |  O Q |j                         D ]m  \  \  }}}|r| d| }|D ]I  }t	        |j
                  |      st	        |j                  |      s1t        j                  | d        ` t        | d	       y
w)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	   )maxsplitr2   rw   FTz( test name is redundant and was not usedz" test name does not match any testN)r  rv   rq   rh   r   r,  r   r  r   warningr   )r   r  patternsargsubprojr   rs  was_useds           r9   tests_from_argszTestHarness.tests_from_argse  s_     57<<$$ 	.C cz #		#	 :2:Db=!G #S(-Hgt_%	.   	A "&h 1>>738M04Hgt_-G		 *2)9 	U%OWdX 	4&) UA q~~w7GAFFD<Qu,T%UVU )C50R)STT	Us$   A>D)D)+D)"D)'D)>+D)c                   | j                   st        d|       g S | j                   D cg c]  }| j                  |      s| }}| j                  j                  rt        | j                  |            }|st        d|       g S |S c c}w )NzNo tests defined.)rY  zNo suitable tests defined.)r  rW   r  r  rv   rh   r  )r   	errorfilers  r  s       r9   r  zTestHarness.get_tests  s}    zz%I6I JJ@q$*<*<Q*?@@<<--e45E.Y?I As   B
B
c                F    | j                   D ]  }|j                           y r   )r3  r8  r\  s     r9   flush_logfileszTestHarness.flush_logfiles  s     	AGGI	r;   c                H   | j                   sy | j                  j                  t        | j                   dz                | j                  j                  t	        | j                   dz                | j                  j                  t        | j                   dz   d             y )Nz
.junit.xmlz.jsonz.txtsurrogateescaper   )r6  r3  rm   r  r  r  r   s    r9   open_logfileszTestHarness.open_logfiles  sy      L):):\)IJK.t/@/@7/JKL.t/@/@6/IRcder;   c                    g }| j                   r*| j                  dg}| j                  dkD  r|g dz  }|dgz  }| j                  r|| j                  z  }|S )Nrt   r	   )-exr  r  quitz--args)rf   rg   rb   ri   )r  wraps     r9   r  zTestHarness.get_wrapper  s[    ;;$$i0D~~!55XJD??GOO#Dr;   c                (   t        | j                        dkD  ro|j                  rct        j	                  |j                  d         d   }dj                  d |j                  D              }|r|dz  }||z   dz   |j                  z   S |j                  S )Nr	   r   +c              3  L   K   | ]  }t         j                  |      d      ywr  )r  r  )r  rL   s     r9   r  z/TestHarness.get_pretty_suite.<locals>.<genexpr>  s      R!77:1=Rs   "$r*  z / )r  r  r  r  r  r   r   )r   r@  rvrL   s       r9   rh  zTestHarness.get_pretty_suite  s{    t{{aDJJ//

1>qABRtzzRRAc	6E>DII--99r;   c                ,   	 | j                          t        j                  dk(  r't        j                  t        j
                                t        j                  | j                  |             | j                          y # | j                          w xY w)Nwin32)	r  r>   r5   r  set_event_loop_policyWindowsProactorEventLoopPolicyr  
_run_testsrV  )r   r  s     r9   r  zTestHarness.run_tests  sf    		"  ||w&--g.T.T.VWKK01!D!s   A.B Bc                N    | j                   D ]  }|j                  | |||        y r   )r3  rC  )r   r@  rL   r   rN  s        r9   rC  zTestHarness.log_subtest  s'     	.AMM$a-	.r;   c                J    | j                   D ]  }|j                  | |        y r   )r3  rA  )r   r@  rN  s      r9   r  zTestHarness.log_start_test  s#     	%ALLt$	%r;   c                `   	
K   t        j                   j                  j                        t	               i dt	        t
              t        j                         d	 fd}dfd}d fd
d
fd	d	 fd}d	
 fd} j                  D ]  }|j                           t        j                  d	k7  rt        j                  d
      t        j                         k(  r!j                  t        j                   |       n j                  t        j                   |       j                  t        j"                  |       	 |D ]  }|j$                  st'               d {    t        j(                   ||            }j+                  |       |j,                  |<   |j/                  |       |j$                  st1        |       d {     j                  j2                  dkD  s j4                  s n t'               d {    t        j                  d	k7  r>j7                  t        j                          j7                  t        j"                          j                  D ]  }|j9                          d {     y 7 )7 7 7 # t        j                  d	k7  r>j7                  t        j                          j7                  t        j"                          j                  D ]  }|j9                          d {  7    w xY ww)NF)r   c                  K   4 d {    s%j                   j                  dkD  rj                  r	 d d d       d {    y | j                         d {   }j	                  |       j                   j
                  }|r0j                  |k\  r!|j                  j                         r         d d d       d {    y 7 7 7 r7 # 1 d {  7  sw Y   y xY wwr1  )r  rb   r+  r  rk  maxfailr   r   )r@  r   r  cancel_all_testsinterruptedr   	semaphores      r9   run_testz(TestHarness._run_tests.<locals>.run_test  s       ' '4<<#6#6#:t' ' ' !HHTN*((-,,..t'9cggnn>N$&' ' ' ' +' ' ' 'st   C(CC()CC(CC(CCAC:C(CC(C(CC(C%CC%!C(c                    | j                         s| j                          j                  |        	 | = y # t        $ r Y y w xY wr   )r  rM   r  KeyError)r  r  ra  s    r9   	test_donez)TestHarness._run_tests.<locals>.test_done  s@    ;;=
NN1!!$ s   8 	AAc                    j                         }j                  |       | r7j                          t        j                  dj                  |                |= |j                          y )Nz CTRL-C detected, interrupting {})popleftrm   r  r   r  r   r  )warnr  r  ra  r   s     r9   cancel_one_testz/TestHarness._run_tests.<locals>.cancel_one_test  sY    __&FNN6"##%?FF}U[G\]^f%MMOr;   c                 &    dr  d       ry y r  r?   )r  r  ra  s   r9   r  z0TestHarness._run_tests.<locals>.cancel_all_tests  s    K&  r;   c                 d    ry j                          t        j                  d                 y )NzReceived SIGTERM, exiting)r  r   r  )r  r  r   s   r9   sigterm_handlerz/TestHarness._run_tests.<locals>.sigterm_handler
  s(    !LL45r;   c                 H   ry j                  j                                t              t        k(  r;d   d   z
  dk  r-j	                          t        j                  d                 y r	 d       y j	                          t        j                  d       dy )Nr~   r   r	   zCTRL-C detected, exitingT)rm   r  r  	MAX_CTRLCr  r   r  )r  r  ctrlc_timesr  r  ra  r   s   r9   sigint_handlerz.TestHarness._run_tests.<locals>.sigint_handler  s     tyy{+;9,R;q>1QTU1U##%78 "%##%78"r;   r  r   r	   )r@  r  r   rK  )r  asyncio.Futurer   rK  )r  r   r   rK  rJ  )r  	Semaphorer  r  r   r  r  r3  r=  r>   r5   rS   getpgidgetpidadd_signal_handlerr   r  r  r-  r  r  rm   r  add_done_callbackrI  rb   r+  remove_signal_handlerrG  )r   r  r  r  r  r  rN  r  r  r  r  r  r  r  r  ra  r  s   `        @@@@@@@@r9   r  zTestHarness._run_tests  sa    %%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L.J- ;J$<A*J- &J''J- J- J- #J)$J- (A4L.J+L.$J- 'J- )J- +L.-A5L+"L%
#L++L.)r  r'  )r   z'ConsoleLogger'rJ  )rQ  r   r   T.List[TestSerialisation])r   rM  )rW  rO  rX  rO  rY  rO  r   rK  )r@  zT.Optional[TestSerialisation]r   zbuild.TestSetup)r  r'  r@  r   r   rP  )r@  r   r   r  )rM   r  r   rK  r   )r
  rU   r   r   )r   r2   NNN)rM   r  r   r   rd  rU   r  r   r  r   r  r   r  r   r   r   r   )r  r   r   zT.Tuple[str, str])r@  r   r  rQ  r   r   )r@  r   r   r   )r  r  r   z*T.Generator[TestSerialisation, None, None]r   )r  zT.Optional[T.IO]r   r  )r  r'  r   rQ  )r@  r   r   r   )r  zT.List[SingleTestRunner]r   rK  )r@  r  rL   r   r   r   r   rK  )r@  r  r   rK  )%r   r   r   rZ  r=  r8  r9  rI  rT  rZ  rV  r`  re  ri  rk  rT  rm  rd  rq  r   r  rx  r  r   r  r  r  r  r  r  r  r  rh  r  rC  r  r  r?   r;   r9   r  r  *  s?   &P#6#
	:6 : * ) ) # #O &''+)-(,.".. %. '	.
 &.
 25.8	XP#*J    > 3Ujf 
 

".%_%r;   r  c                    | j                  t        j                        }|D ]  }t        | j	                  |              | S )N)r  )r  r>   r  rW   rh  )thr  rs  s      r9   
list_testsr  A  s@    LL3::L.E &b!!!$%&9r;   c                   dfd}t        |       dkD  sJ t               }t               }i }t        t              d      D ]!  }|d   D cg c]
  } ||       c}||d   <   # |D ]=  }	|	j                  D ],  }
|
|v r|j                  |
       |j                  ||
          . ? t        j                  | dgz   t        |      z         j                  }|dk7  rt        d        y	y
c c}w )Nc                    t         j                  j                  |       } t         j                  dk7  r | j	                  t         j                  d      } | S )Nr  )rS   rd  relpathr{  r\  )rd  rk   s    r9   convert_path_to_targetz,rebuild_deps.<locals>.convert_path_to_targetH  s;    wwtR(66S=<<,Dr;   r   targets)kindrW  idrj   zCould not rebuild FT)rd  r   r   r   )r  r  r   r   dependsr~  r  r  sortedr  rW   )r5  rk   r  r  r  r  intro_targetstargetr  rs  drL  s    `          r9   r  r  G  s	    u:>>%G%G.0M RyA ) J'') #1%')fTl#)  - 	-AG|NN1NN=+,		-- ..$+fWo=
>
I
IC
ax"2$'(')s   C/c                B   | j                   rd| _        | j                  r| j                  rt	        d       yd }| j
                  r!d| _        | j                  rt	        d       yd}| j                  r| j                  d   }|,t        |d      }|j                         st	        d|       yt        j                  | j                        }t        j                  d	|j                  j                  j!                  t#        d
                  }t%        |       | j&                  sR|j                  j                  j!                  t#        d            }|dk(  rd| _        n|dk7  rt	        d       d| _        t)        |       5 }	 | j*                  rt-        |      cd d d        S |j/                         cd d d        S # t0        $ rI}t	        d       t2        j4                  j7                  d      r|t	        |       Y d }~d d d        yd }~ww xY w# 1 sw Y   y xY w)Nr	   z3Can not be both quiet and verbose at the same time.Tz9Must not specify both a wrapper and gdb at the same time.rf   r   )silentz"Could not find requested program: r   vsenvbackendnoner5  zEOnly ninja backend is supported to rebuild tests before running them.z!Meson test encountered an error:
MESON_FORCE_BACKTRACE)r  r  r  r  rW   rf   ri   r   r  r
   rF  rk   r/  castr   coredata
get_optionr   r   r  r  rh   r  r  r   rS   rT   r  )r  	check_binexer   
need_vsenvr  r  rg  s           r9   r  r  e  s    !7==CDI{{??MN	OOA&	i5yy{6ymDE

7::A 6 6 A A)GBT UVJ
--((33Ii4HIf!%GYZ!%G	W	 
	||!"~  779	 
  	67zz~~56a 
	 s6   HG 'G  	H	7H HHHHc                |    t        j                  d      }t        |       |j                  |       }t	        |      S )Nz
meson test)prog)argparseArgumentParserr|   
parse_argsr  )rv   r{   r  s      r9   run_with_argsr    s4    $$,7F&%Gw<r;   r   )rL   r   r   rU   r   )r{   zargparse.ArgumentParserr   rK  )rL   r   r   rK  )r   r   r   r   r   r   )rL   r   r   r   r   rU   r   r   )r   rU   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  r  r  z,T.Optional['asyncio.Queue[T.Optional[str]]']r  r   r   r   )r  r   r   r   )r  r  r   r  )r  z 'asyncio.Queue[T.Optional[str]]'r   r-  )r  r  r   rK  r   )r  r  r  zT.Optional[T.Union[int, float]]r   rK  )r  r  r   r   )r5  rQ  rk   r   r  r  r   r   )r  r'  r   rU   )rv   rQ  r   rU   )~
__future__r   pathlibr   collectionsr   
contextlibr   rc  r   r   r  r  r  enumr  rX   rS   rP  r5   r  r1  r   r  shlexr>   ru  r  typingr/  rI   xml.etree.ElementTreeetreer  r  r2   r
   r   r   r  r   r   r   r  mesonlibr   r   r   r   r   r   r   r   mintror   r   programsr   backend.backendsr   r   TYPE_CHECKINGUnionTYPE_TAPResultrF  rZ  r  r0   r   
maxunicoder  chrUNENCODABLE_XML_CHR_RANGESr2  r   r  r:   r@   rK   rP   r]   r|   r   r   r   r   r   quoter   r   uniqueEnumr   r   r   r6  rR  r^  r  r  r  r  rX  r  EXITCODEr^  r"  ri  TAPrx  RUSTr  r   r  r  r  r  rI  r  r  r  r  r  r  r  r  )lowhighs   00r9   <module>r     s    #            	    	    
     " "    J 1O O O / % =??WW 1 2N     	66 2 6 >>W"" $2 3 Mdd[c4#c(1SYK8d $"**TBGG4N,O%ORV%VW !$ !!!D &/Ud-C4 $/
  .|{{HF	N 	 	$)) 	 	 .* .* .*bms ms^ .Z [!J [!| 6  6F4 4"}B: }B@w wtg  4C  ,// 0? ( 1=  ,,, -2 2h /9  ,** +%' %N 0;  ,++ ,I<"I"$/"47"6H
 CG ?KOBm, m,^x xvU% U%n<2h}A es   L<