
    -Phr                   R   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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-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ej:        rej;        d         Z<dZ=dZ>dZ?g dZ@deAd<   ejB        dk    re@C                    g d           d e@D             ZD ejE        ddF                    eD          z   dz             ZG ejE        d          ZH ejE        d           ZIdd#ZJdd$ZKd%dd%dddd&ZLdd*ZMdd-ZNdd1ZOdd2ZPdd5ZQdd8ZRdd:ZSd; ZTd<eAd=<    eJ            sejU        ZTdd@ZV G dA dBe+          ZWejX         G dC dDejY                              ZZejX         G dE dFejY                              Z[ G dG dH          Z\ G dI dJ          Z] G dK dLe]          Z^ G dM dNe]          Z_ G dO dPe^          Z` G dQ dRe^          Za G dS dTe]          Zb G dU dV          Zc G dW dXec          Zdedecje        e8jf        <    G dY dZed          Zgegecje        e8jh        <    G d[ d\ec          Zieiecje        e8jj        <    G d] d^ec          Zkekecje        e8jl        <   dd`ZmddcZnddiZoddkZpddnZqddrZrdduZs	 dddzZt G d{ d|          Zu G d} d~          Zv G d d          ZwddZxddZyddZzddZ{dS )    )annotations)Path)deque)suppress)deepcopy)fnmatchN   )build)environment)mlog)MesonVersionMismatchExceptionmajor_versions_differversion)MesonException
OrderedSetRealPathActionget_wine_shortpath	join_args
split_argssetup_vsenvdetermine_worker_count)	OptionKey)ExternalProgram)TestProtocolTestSerialisation)TAPParser.TestTAPParser.ErrorTAPParser.VersionTAPParser.PlanTAPParser.UnknownLineTAPParser.BailoutM   c      ))r      )      )      )      )      )i  i  )i  i  zT.List[T.Tuple[int, int]]UNENCODABLE_XML_UNICHRSi   ))i i )i i )i i )i i )i i )i i )i i )i i )i	 i	 )i
 i
 )i i )i i )i i )i i )i i )i i c                V    g | ]&\  }}t          |           d t          |           'S )-)chr).0lowhighs      P/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mesonbuild/mtest.py
<listcomp>r7   O   s6    ddd[c4#c((88SYY88ddd    z([ z])z!^test (?!result)(.*) \.\.\. (.*)$z^(.*?) - (.*? |)\(line (\d+)\)returnboolc                 X    t          j                                                    } | dk    S )Nwindows)platformsystemlower)platnames    r6   
is_windowsrB   V   s&      &&((Hy  r8   c                 "    t           j        dk    S )Ncygwin)sysr>    r8   r6   	is_cygwinrG   Z   s    <8##r8      )FHWNaNAsstrintc                \    d}| D ]&}t          j        |          }|t          |         z  }'|S )Nr   )unicodedataeast_asian_widthUNIWIDTH_MAPPING)rO   resultcws       r6   uniwidthrY   ^   s=    F & &(++"1%%Mr8   argT.Tuple[int, int]c                   |                      d          }t          |          dk    rt          j        d          	 t	          |d                   }n"# t
          $ r t          j        d          w xY w|dk    rt          j        d          	 t	          |d                   }n"# t
          $ r t          j        d          w xY w|dk    rt          j        d	          ||k    rt          j        d
          ||fS )N/rH   z3value does not conform to format 'SLICE/NUM_SLICES'r	   zNUM_SLICES is not an integerr   z$NUM_SLICES is not a positive integerzSLICE is not an integerzSLICE is not a positive integerzSLICE exceeds NUM_SLICES)splitlenargparseArgumentTypeErrorrQ   
ValueError)rZ   valuesnrslicessubslices       r6   
test_slicerf   e   s"   YYs^^F
6{{a()^___Ivay>> I I I()GHHHI1}}()OPPPDvay>> D D D()BCCCD1}}()JKKK(()CDDDXs   A A3B' 'Cparserargparse.ArgumentParserNonec                J   |                      ddt          d           |                      dddt          d	           |                      d
ddd           |                      ddddd           |                      dddd           |                      dddddd           |                      ddddd           |                      dd dt          d 	           |                      d!d"t          d#$           |                      d%g d&d'd(d)*           |                      d+g d,d'd(d-*           |                      d.d/d0d1d2           |                      d3ddd4           |                      d5ddd6           |                      d7d8d9:           |                      d;d<t	          d=g          t          d>           |                      d?d@dddA           |                      dBdCdddD           |                      dEdFt
          d dGH           |                      dId dJdK           |                      dLg t          dM           |                      dNdOdPt          dQ	           |                      dRd t          dSdTU           |                      dVdWdXY           d S )ZNz	--maxfailr   zbNumber of failing tests before aborting the test run. (default: 0, to disable aborting on failure))defaulttypehelpz--repeatr	   repeatz!Number of times to run the tests.)rk   destrl   rm   z--no-rebuildF
store_truez$Do not rebuild before running tests.)rk   actionrm   z--gdbgdbzRun test under gdb.)rk   ro   rq   rm   z
--gdb-pathgdb_pathz&Path to the gdb binary (default: gdb).)rk   ro   rm   z-iz--interactiveinteractivez(Run tests with interactive input/output.z--listlistzList available tests.z	--wrapperwrapperz)wrapper to run tests with (e.g. Valgrind)-Cwdz#directory to cd into before running)ro   rq   rm   z--suiteinclude_suitesappendSUITEz,Only run tests belonging to the given suite.)rk   ro   rq   metavarrm   z
--no-suiteexclude_suitesz.Do not run tests belonging to the given suite.z--no-stdsplitTr^   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.)rk   rm   z-jz--num-processesMESON_TESTTHREADSz#How many parallel processes to use.z-vz	--verbosez!Do not redirect stdout and stderrz-q--quietz$Produce less output to the terminal.z-tz--timeout-multiplierzDefine a multiplier for test timeout, for example  when running tests in particular conditions they might take more time to execute. (<= 0 to disable timeout))rl   rk   rm   z--setupsetupzWhich test setup to use.z--test-argsz7Arguments to pass to the specified test(s) or all testsz--max-linesd   	max_lineszBMaximum number of lines to show from a long test log. Since 1.5.0.z--slicezSLICE/NUM_SLICESzHSplit tests into NUM_SLICES slices and execute slice SLICE. Since 1.8.0.)rk   rl   r|   rm   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".)nargsrm   )add_argumentrQ   r   r   r   floatrf   )rg   s    r6   add_argumentsr   ~   s   
QSQ  R R R 
AH3@  B B B
lC  E E E
U<2  4 4 4
e*E  G G G
ou=+2\  ^ ^ ^
%f\4  6 6 6
T	
H  J J J
4B  D D D
	24DX_fK  M M M
b7GPXbiM  O O O
GMK  M M M
+U<D  F F F
u\?  A A A
Y6  8 8 8
/9OQdPe9f9fmpB  D D D
k5@  B B B
i|C  E E E
45$K  L L L 	4g7  9 9 9
r
V  X X X
s3a  c c c
	4jJ\g  i i i
cT  U U U U Ur8   c                    | d         dk    rdnd}	 t          | |           d S # t          $ r? |                     dd                              d          } t          | |           Y d S w xY w)N
r9   endasciibackslashreplaceerrors)printUnicodeEncodeErrorencodedecode)rO   r   s     r6   
print_safer      s    """4CaS   HHW%7H88??HHaSs   % AA.-A.abc                "    | s|S |s| S | dz   |z   S Nr   rF   )r   r   s     r6   
join_linesr      s*      t8a<r8   dashcolsc                z    | s||z  S d| z   dz   } t          |           }||z
  dz  }||z  | z   } | |||z
  |z
  z  z   S )N rH   )rY   )rO   r   r   widthfirsts        r6   dashesr      sa     d{a#AQKKEE\aEuqAtte|e+,,,r8   retcodec                   | dk     r8|  }	 t          j        |          j        }n# t          $ r d}Y nw xY wd| d| S | dk    rd|  S | dz
  }	 t          j        |          j        }n# t          $ r d}Y nw xY wd|  d| d| d	S )
Nr   
SIGinvalidzkilled by signal r      zexit status z(exit status z or signal ))signalSignalsnamerb   )r   signumsignames      r6   returncode_to_statusr      s     {{	#nV,,1GG 	# 	# 	#"GGG	#5655G555#~~'g'''s]F.((-   B7BBvBBBBBBs   % 44A* *A98A9c                    | S NrF   )xs    r6   <lambda>r      s    Q r8   zT.Callable[[str], str]sh_quoteenvT.Iterable[T.Tuple[str, str]]c                @    d                     d | D                       S )Nr9   c                Z    g | ](\  }}d                      |t          |                    )S )z{}={} )formatr   )r3   kvs      r6   r7   z$env_tuple_to_str.<locals>.<listcomp>   s0    DDD1HOOAx{{33DDDr8   )join)r   s    r6   env_tuple_to_strr      s#    77DDDDDEEEr8   c                      e Zd ZdS )TestExceptionN)__name__
__module____qualname__rF   r8   r6   r   r      s        Dr8   r   c                      e Zd ZdZdZdZdS )ConsoleUserr   r	   rH   N)r   r   r   LOGGERINTERACTIVESTDOUTrF   r8   r6   r   r      s#         F K FFFr8   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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dS )!
TestResultPENDINGRUNNINGOKTIMEOUT	INTERRUPTSKIPFAILEXPECTEDFAILUNEXPECTEDPASSERRORIGNOREDr:   rQ   c                     dS )Nr)   rF   rF   r8   r6   maxlenzTestResult.maxlen  s    rr8   r;   c                6    | t           j        t           j        hv S r   )r   r   r   selfs    r6   is_okzTestResult.is_ok  s    
z'>???r8   c                x    | t           j        t           j        t           j        t           j        t           j        hv S r   )r   r   r   r   r   r   r   s    r6   is_badzTestResult.is_bad  s0    
);Z=Q"1:3CE E 	Er8   c                6    | t           j        t           j        hvS r   )r   r   r   r   s    r6   is_finishedzTestResult.is_finished  s    J.
0BCCCr8   c                6    | t           j        t           j        fv S r   )r   r   r   r   s    r6   
was_killedzTestResult.was_killed  s    
*J,@AAAr8   rO   rP   mlog.AnsiDecoratorc                   |                                  rt          j        }n_| t          j        t          j        t          j        fv rt          j        }n-|                                 rt          j	        }nt          j
        } ||          S r   )r   r   redr   r   r   r   yellowr   greenblue)r   rO   	decorators      r6   colorizezTestResult.colorize   sp    ;;== 	"IIjoz'9:;RSSSII 	"
II	Iy||r8   r   c                    d                     | j        |                                           }|                     |                              |          S )Nz{res:{reslen}})resreslen)r   valuer   r   get_text)r   r   
result_strs      r6   r   zTestResult.get_text+  sD    %,,DKKMM,RR
}}Z((11(;;;r8   c                F    t          |                     d                    S )Nz>>> )rP   r   r   s    r6   get_command_markerzTestResult.get_command_marker/  s    4==(()))r8   Nr:   rQ   r:   r;   )rO   rP   r:   r   )r   r;   r:   rP   r:   rP   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   rF   r8   r6   r   r      s        GG	BGIDD!L%NEG   \@ @ @ @E E E ED D D DB B B B	 	 	 	< < < <* * * * * *r8   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ZdZ ded<   dZ!eZ"dZ#d6d+Z$d7d/Z%d8d3Z&d9d5Z'dS ):	TAPParserc                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	r    rQ   	num_testsr;   lateskippedT.Optional[str]explanationNr   r   r   __annotations__rF   r8   r6   PlanzTAPParser.Plan4  s9         


$$$$$$r8   r   c                      e Zd ZU ded<   dS )r"   rP   messageNr   rF   r8   r6   BailoutzTAPParser.Bailout:           r8   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   dd
ZdS )r   rQ   numberrP   r   r   rV   r   r   r:   c                H    | j          d| j                                         S )Nr   )r  r   stripr   s    r6   __str__zTAPParser.Test.__str__C  s&    k//DI//55777r8   Nr   )r   r   r   r   r  rF   r8   r6   TestzTAPParser.Test=  sT         			$$$$	8 	8 	8 	8 	8 	8r8   r	  c                      e Zd ZU ded<   dS )r   rP   r  Nr   rF   r8   r6   ErrorzTAPParser.ErrorF  r  r8   r  c                  $    e Zd ZU ded<   ded<   dS )r!   rP   r  rQ   linenoNr   rF   r8   r6   UnknownLinezTAPParser.UnknownLineI  s"         r8   r  c                      e Zd ZU ded<   dS )r   rQ   r   Nr   rF   r8   r6   VersionzTAPParser.VersionM  r  r8   r  r	   rH   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_linenor9   r(   okr;   numrQ   r   rP   	directiver   r   r:   ET.Generator[T.Union['TAPParser.Test', 'TAPParser.Error'], None, None]c              #    K   |                                 }|r|                                 nd }||                                }|                    d          r)|r&|                     ||t          j        |          V  d S nU|dk    r4|                     |||rt          j        nt          j        |          V  d S |                     d| d          V  |                     |||rt          j	        nt          j
        |          V  d S )Nr   TODOzinvalid directive "")r  upper
startswithr	  r   r   r   r   r  r   r   )r   r  r  r   r  r   s         r6   
parse_testzTAPParser.parse_testh  s#     zz||-8Bk'')))d !))I##F++ E ))CzLLLLLF f$$iiT+g:+D+DPZPgituuuuujj!Cy!C!C!CDDDDDiiTB#K:==JO[YYYYYYYr8   linesT.AsyncIterator[str]T.AsyncIterator[TYPE_TAPResult]c                  K   |2 3 d {V }|                      |          D ]}|W V  %6 |                      d           D ]}|W V  d S r   
parse_line)r   r  lineevents       r6   parse_asynczTAPParser.parse_asyncz  s       	 	 	 	 	 	 	$..     __T** 	 	EKKKKK	 	s   *ioT.Iterator[str]T.Iterator[TYPE_TAPResult]c              #     K   |D ]}|                      |          E d {V  |                      d           E d {V  d S r   r"  )r   r'  r$  s      r6   parsezTAPParser.parse  sf       	- 	-Dt,,,,,,,,,,??4(((((((((((r8   r$  c           	   #    K   || xj         dz  c_         |                                }| j        | j        k    rh| j        dk    rP| j                            |          }|r4| j        | _        | j         | _        |	                    d          | _
        d S | j        | _        n| j        | j        k    rp| j                            |          r| j        | _        d S |                    | j
                  rd S |                     d| j         d          V  | j        | _        | j        | j        k    sJ |r|                    d          rd S | j                            |          }|rb| j        r1| j        j        r%| j        s|                     d          V  d| _        | xj        dz  c_        |	                    d          
| j        dz   n!t+          |	                    d                    | _        t-          | j        | j                  | _        | j        r,| j        | j        j        k    r|                     d	          V  |                     |	                    d          d
k    | j        |	                    d          |	                    d          |	                    d                    E d {V  | j        | _        d S | j                            |          }|r| j        r|                     d          V  nt+          |	                    d                    }|dk    }|	                    d          rq|	                    d                                                              d          r |dk    r|                     d          V  d}n|                     d          V  |                     || j        dk    ||	                    d                    | _        | j        V  d S | j                            |          }|r3|                     |	                    d                    V  d| _        d S | j                            |          }|r| j         dk    r|                     d          V  d S t+          |	                    d                    | _        | j        dk     r|                     d          V  n|                      | j                  V  d S | !                    || j                   V  d S | j        | j        k    r |                     d| j         d          V  | j        rd S | j        r| j        | j        j        k    rr| j        | j        j        k     r.|                     d| j        j         d| j         d          V  n-|                     d| j        j         d| j         d          V  d S | j        | j        k    rb| j        | j        k     r)|                     d| j         d| j                   V  d S |                     d| j         d| j                   V  d S d S )Nr	      z+YAML block not terminated (started on line r   #zunexpected test after late planTrH   z2test number exceeds maximum specified in test planr  r%         zmore than one plan foundr   r   zinvalid SKIP directive for planzinvalid directive for plan)r   r   r   r   z(version number must be on the first linez$version number should be at least 13r   zToo few tests run (expected z, got zToo many tests run (expected z!Duplicate test numbers (expected z, got test numbered zMissing test numbers (expected )"r  rstripstate_AFTER_TESTr   _RE_YAML_STARTmatch_YAMLr  groupyaml_indent_MAIN_RE_YAML_ENDr  r  _RE_TESTr  r   found_late_testr   	last_testrQ   maxhighest_testr  _RE_PLANr  r   _RE_BAILOUTr  
bailed_out_RE_VERSIONr  r  )r   r$  mr   r   s        r6   r#  zTAPParser.parse_line  s     KK1KK;;==D zT---<2%%+11$77A %)Z
+/;(+,771::(!Z

tz))$**400 !%DJF??4#344 Fjj!btO_!b!b!bccccc!Z
:++++ 4??3// ##D))A 9 0 08L 0**%FGGGGG+/D(!#78wwqzz7I!!3!3sSTSZSZ[\S]S]$'(94>$J$J!9 [$)2E!E!E**%YZZZZZ??1771::+=t~+,771::qwwqzz1771::O O O O O O O O O!-
##D))A 9 $**%?@@@@@@ #AGGAJJI'1nGwwqzz K771::++--88@@ K(1}}&*jj1R&S&S S S S&*GG"&**-I"J"JJJJ $		IT^VWEW29qwwqzz !* !S !SDI)OOO &&t,,A ll1771::....."& &&t,,A 
;!##**%OPPPPPF"1771::<"$$**%KLLLLLL,,t|,<<<<< ""45555555 zTZ''jj!btO_!b!b!bccccc y T^ty/BBB>DI$777**%pDIDW%p%p_c_m%p%p%pqqqqqq**%qTYEX%q%q`d`n%q%q%qrrrrr DN22$t~55**  &A  &A  &Amqm~  &A  &A  B  B  B  B  B  B  B**%~t~%~%~kok|%~%~	 32r8   )r  r;   r  rQ   r   rP   r  r   r   r   r:   r  )r  r  r:   r   )r'  r(  r:   r)  )r$  r   r:   r)  )(r   r   r   T
NamedTupler   r  r	  r  r  r  r9  r3  r6  recompilerA  _RE_DIRECTIVEpatternr@  r;  rC  r4  r:  r<  rB  r  r   r  r   r=  r?  r  r8  r2  r   r  r&  r+  r#  rF   r8   r6   r   r   3  sj        % % % % %q| % % %    !,   8 8 8 8 8q| 8 8 8           al       !,    EKE"*011KBJ^__Mrz*]-BBCCHrzD}G\\]]H"*455KRZ..N2:o..LOJ!D!!!!FIIL#'K''''KEGZ Z Z Z$   ) ) ) )
g@ g@ g@ g@ g@ g@r8   r   c                  F    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S )
TestLoggerr:   ri   c                    d S r   rF   r   s    r6   flushzTestLogger.flush      r8   harness'TestHarness'c                    d S r   rF   r   rP  s     r6   startzTestLogger.start  rO  r8   test	'TestRun'c                    d S r   rF   r   rP  rU  s      r6   
start_testzTestLogger.start_test  rO  r8   rO   rP   r   r   c                    d S r   rF   )r   rP  rU  rO   r   s        r6   log_subtestzTestLogger.log_subtest  rO  r8   rV   c                    d S r   rF   )r   rP  rV   s      r6   logzTestLogger.log  rO  r8   c                
   K   d S r   rF   rS  s     r6   finishzTestLogger.finish  s      r8   c                    d S r   rF   r   s    r6   closezTestLogger.close  rO  r8   Nr:   ri   rP  rQ  r:   ri   rP  rQ  rU  rV  r:   ri   )
rP  rQ  rU  rV  rO   rP   r   r   r:   ri   rP  rQ  rV   rV  r:   ri   )
r   r   r   rN  rT  rY  r[  r]  r_  ra  rF   r8   r6   rL  rL    s                               r8   rL  c                       e Zd Zd
ddZddZd	S )TestFileLoggerreplacefilenamerP   r   r:   ri   c                D    || _         t          |dd|          | _        d S )NrX   utf-8encodingr   )ri  openfile)r   ri  r   s      r6   __init__zTestFileLogger.__init__  s%     3HHH			r8   c                X    | j         r"| j                                          d | _         d S d S r   )ro  ra  r   s    r6   ra  zTestFileLogger.close  s3    9 	IOODIII	 	r8   N)rh  )ri  rP   r   rP   r:   ri   rb  )r   r   r   rp  ra  rF   r8   r6   rg  rg    sF        I I I I I     r8   rg  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dS )(ConsoleLogger)z..z:.z.:)u   🌑u   🌒u   🌓u   🌔u   🌕u   🌖u   🌗u   🌘u   ✀ u   ―u   ▶ r   rQ   r:   ri   c                   || _         t                      | _        d | _        d | _        d| _        d| _        |  d| _        d| _        d| _	        d| _
        	 t          j        d          \  | _        }d| _        n# t          $ r d| _        d| _        Y nw xY wt!          | j        | j        | j        dz
            | _        t!          d| j        | j        dz
            | _        | j        | _        | j        | _        	 | j                            t4          j        j        pd           d S # t:          $ rS t!          d	d
| j        dz
            | _        t!          dd
| j        dz
            | _        d| _        | j        | _        Y d S w xY w)Nr   Fr9   r	   TP   rH   r   z8<r1   z| )r   r   running_testsprogress_testprogress_taskmax_left_widthstopshould_erase_line
test_countstarted_testsspinner_indexosget_terminal_sizer   is_ttyOSErrorr   SCISSORSHLINEoutput_start
output_endRTRIsubSPINNERspinnerr   rE   stdoutrm  r   ASCII_SPINNER)r   r   _s      r6   rp  zConsoleLogger.__init__  s   "4>LL489=	 	"!#	 /22LDIqDKK 	  	  	 DIDKKK	  #4=$*di!mLL TZQ??9|	.$$SZ%8%CGDDDDD! 	. 	. 	. &tS$)a- @ @D$Rdi!m<<DODH-DLLLL		.s%   #A: :BB<+D) )AFFc                R    | j         rt          | j         d           d| _         d S d S )Nr9   r   )r{  r   r   s    r6   rN  zConsoleLogger.flush;  s;    ! 	($(b1111%'D"""	( 	(r8   r$  rP   c                D    t          | j        |dd           d| _        d S )Nr9   )sepr   z[K)r   r{  )r   r$  s     r6   print_progresszConsoleLogger.print_progress@  s*    d$d====!)r8   c                8    | j                                          d S r   )updatesetr   s    r6   request_updatezConsoleLogger.request_updateD  s    r8   rP  rQ  c                   | j         |                                  d S t          | j                  dk    r| j         d| j         }n>d                    | j        t          | j                  z
  dz   | j        | j                  }d                    || j        | j                           }| j        dz   t          | j                  z  | _        d                    dt          
                                z  t          t          j                    | j         j        z
            |j                  }| j         j        r)|d                    | j         j        |j        	          z  }|d
z  }| j                                         }|r|d|z   z  }|                    | j         d| j        ||          }|                     |           d S )Nr	   r]   z{}-{}/{}z[{}] {} z{spaces} {dur:{durlen}}r   )spacesdurdurlenz/{timeout:{durlen}})timeoutr  rO      T)r   ry  leftright)rw  rN  r_   rv  r}  r|  r   r  r~  r   r   rQ   time	starttimeduration_max_lenr  get_detailsry  r  )r   rP  countr  r  detailsr$  s          r6   emit_progresszConsoleLogger.emit_progressG  s   %JJLLLFt!""a'')==DO==EE%%d&83t?Q;R;R&RUV&V&*&8$/K KE   T5G(HII"014DL8I8II)00**,,,DIKK$"4">>??+ 1 - - % 	1*11*2/ 2 1 1 1E 	$0022 	%UW_$E~~d04-1-@#'u  6 6 	D!!!!!r8   c                b    d fd}t          j                     _        j         _        t	           j        j        dz              _         j        rVj        sQdt          t           j                            z  dz    _        t          j         |                       _        d S d S d S )Nr:   ri   c                   K   t          j                    } d}                                 j        sj                                         d {V  j                                         |                                 |k    r9d _        |                                 dz   }| 	                    |j                   j        rj        j
        t          j        urd _        j        sGj        sƉj                            d          _        j                            j                                                  j                                         d S )Ng        r	   Flast)asyncioget_running_loopr  rz  r  waitclearr  rw  call_atr   r   r   rv  popaddr  rN  )loopnext_updaterP  r   s     r6   report_progressz,ConsoleLogger.start.<locals>.report_progressh  s^     +--DK!!!i ,k&&(((((((((!!### 99;;+--)-D&"&))++/KLLd.ABBB& .*.j6HHH)-D&) ?- ! )-);)?)?U)?)K)KD&&**4+=>>>""7+++- i ,. JJLLLLLr8      r%   r&   rb  )r  Eventr  r|  r>  r   ry  r  need_consoler_   rP   ensure_futurerx  )r   rP  r  s   `` r6   rT  zConsoleLogger.startg  s    	 	 	 	 	 	 	: moo!,	7#9B#>??	; 	Jw3 	J"#c#do*>*>&?&?"?!"CD!(!67H7H!I!ID	J 	J 	J 	Jr8   rU  rV  c                   |j         r|j        r|                                  t          |                    |t          j                    | j        |j        	                    t          j                                                   t          |j        
                                |j        z              |j        rt          | j        d           n|j        st          d           | xj        dz  c_        | j                            |           | j                            |d           |                                  d S )N)ry  r  TrN  r	   Fr  )verbosecmdlinerN  r   r   r   colorize_consolery  r   r   r   direct_stdoutr  needs_parsingr}  rv  r  move_to_endr  rX  s      r6   rY  zConsoleLogger.start_test  sA   < 		"DL 		"JJLLL'..t'<'>'>040C'+x'8'89N9P9P'Q'Q ! S S T T T $(--//$,>???! "d't44444' "D!!!!at$$$&&t%&888r8   rV   c                   |j         s|j        j        sdS |                    t	          j                    |j                  }|j         r|S |                                }t          |          | j	        k     r|S t          t	          j        d| j	         d                    d                    || j	         d                    z   S )Nr9   )stderr_onlyzListing only the last z lines from a long log.
r   )r  optionsprint_errorlogsget_logr   r  r  
splitlinesr_   r   rP   boldr   )r   rP  rV   r]  r  s        r6   shorten_logzConsoleLogger.shorten_log  s    ~ 	go&E 	2nnT244)/)=  ? ?> 	J  u::&&Jty!c$.!c!c!cddeehlhqhqrwy}  zH  yH  yI  yI  sJ  iK  iK  K  Kr8   c                z   |j         sb|j        }|s0t          |j                                        |j        z              d S t          |j                                        |z              |                     ||          }|r9t          | j                   t          |           t          | j	                   d S d S r   )
r  r  r   r   r   stdor  r  r   r  )r   rP  rV   r  r]  s        r6   	print_logzConsoleLogger.print_log  s    ~ 	=nG fj3355CDDD&*//11G;<<<w// 	#$#$$$sOOO$/"""""	# 	#r8   rO   r   c                ~   |j         s |j        j        r|                                r|                                  t          |                    |t          j                    | j	        | j
        ||                    t          j                                        d           |                                  d S d S d S )N)ry  prefixmiddler  Tr  )r  r  r  r   rN  r   r   r   r  ry  r  r   r  )r   rP  rU  rO   rV   s        r6   r[  zConsoleLogger.log_subtest  s    < 	"GO; 	" 	"JJLLL'..t'<'>'>tOb(,()'-t7L7N7N'O'O ! Q Q Y]^ ^ ^ ^
 !!!!!	" 	" 	" 	"r8   c                   | j                             |           |j        t          j        u rF|j        s|j        j        r3|                                  t          |j
         d|j         d           |j        j        r|j                                        sW|                                  |j        rW|j        rPt          | j                   t          |                    |t%          j                    | j                             nst          |                    |t%          j                    | j                  d           |j        s|j                                        r|                     ||           |j        r;t          d           |j        D ]}t          |d           t          d           |j        s|j                                        rt          d           |                                  d S )Nz time out (After z	 seconds))ry  Tr  )rv  remover   r   r   r  r  r  rN  r   r   r  quietr   r  r  r  r   r   r  ry  r   r  warningsr  )r   rP  rV   rX   s       r6   r]  zConsoleLogger.log  s   !!&))):++++181P ,JJLLLV[LL6>LLLMMM$ 	"FJ,<,<,>,> 	"JJLLL~ 4&"6 4do&&&gnnVT-B-D-DUYUhniijjjjgnnVT-B-D-DUYUhnii " " " "> 4VZ%6%6%8%8 4NN7F333 "D!!!! ) )A!4(((((D!!!!~ "!2!2!4!4 "D!!!!r8   c                  K   d| _         |                                  | j        r| j         d {V  |j        rv|j        j        s|j        j        r^t          d           t          |j        d          D ]9\  }}t          |	                    |t          j                                         :t          |                                           d S )NTz
Summary of Failures:
r	   )rz  r  rx  collected_failuresr  r  r  r   	enumerater   r   r  summaryr   rP  irV   s       r6   r_  zConsoleLogger.finish  s      	 	%$$$$$$$$% 	G0	G4;O4K	G,---&w'A1EE G G	6gnnVT-B-D-DEEFFFFgoo     r8   N)r   rQ   r:   ri   rb  )r$  rP   r:   ri   rc  rd  )rP  rQ  rV   rV  r:   rP   re  )
rP  rQ  rU  rV  rO   rP   rV   r   r:   ri   )r   r   r   r  r  r  r  r  rp  rN  r  r  r  rT  rY  r  r  r[  r]  r_  rF   r8   r6   rs  rs    s?       &&&MG G GG HED. . . .B( ( ( (
* * * *   " " " "@%J %J %J %JN   "K K K K# # # #" " " "   6! ! ! ! ! !r8   rs  c                  &    e Zd ZddZddZdd	Zd
S )TextLogfileBuilderrP  rQ  r:   ri   c                0   | j                             dt          j                                                                         d           t          t          j                                                  }| j                             d| d           d S )NzLog of Meson test suite run on 

zInherited environment: )	ro  writedatetimenow	isoformatr   r  environitems)r   rP  inherit_envs      r6   rT  zTextLogfileBuilder.start  s~    	c(:K:O:O:Q:Q:[:[:]:]cccddd&rz'7'7'9'9::	C+CCCDDDDDr8   rV   rV  c                .   |j          d|j         }| j                            t	          |dd          dz              | j                            d|j        z   dz              t          j        dt          j        |j	                            }| j                            d|z   dz              | j                            dd	|j
        z  z   dz              | j                            d
|                                z   dz              |j        r%| j                            d|j        z   dz              |j        r[|j        j        rdnd}| j                            t	          |dd          dz              | j                            |j                   |j        rK| j                            t	          ddd          dz              | j                            |j                   | j                            t	          ddd          dz              d S )Nr]   =N   r   ztest:         z%H:%M:%Szstart time:   zduration:     z%.2fszresult:       zcommand:      r  outputr1   stderrr9   r  )r  r|  ro  r  r   r   r  strftimegmtimer  durationget_exit_statusr  r  r  r^   stde)r   rP  rV   titlestarttime_strr   s         r6   r]  zTextLogfileBuilder.log  s   :44 244	uc2..5666	(6;6=>>>j$+f>N2O2OPP	(=84?@@@	(7V_+DDtKLLL	(6+A+A+C+CCdJKKK> 	FIOO,v~=DEEE; 	)&4B88(DIOOF4b11D8999IOOFK(((; 	)IOOF8S"55<===IOOFK(((	r3++f455555r8   c                j  K   |j         rf| j                            d           t          |j         d          D ]6\  }}| j                            |                    |d          dz              7| j                            |                                           t          d| j                    d S )Nz
Summary of Failures:

r	   Fr   zFull log written to )r  ro  r  r  r   r  r   ri  r  s       r6   r_  zTextLogfileBuilder.finish	  s      % 	FIOO8999&w'A1EE F F	6	vu = = DEEEE	))***4T]4455555r8   Nrc  re  )r   r   r   rT  r]  r_  rF   r8   r6   r  r    sT        E E E E
6 6 6 6&6 6 6 6 6 6r8   r  c                      e Zd Zd	dZdS )
JsonLogfileBuilderrP  rQ  rV   rV  r:   ri   c           	         |j         |j        |j        j        |j        |j        |j        |j        |j        d}|j	        r
|j	        |d<   | j
                            t          j        |          dz              d S )N)r   r  rV   r  r  
returncoder   commandr  r   )r   r  r   r   r  r  r  r   cmdr  ro  r  jsondumps)r   rP  rV   jresults       r6   r]  zJsonLogfileBuilder.log  s|    Kkj&) +:z	'
 	'
 ; 	, &GH	
7++d233333r8   Nre  )r   r   r   r]  rF   r8   r6   r  r    s(        4 4 4 4 4 4r8   r  c                  *    e Zd ZdZddZddZddZdS )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.
    ri  rP   r:   ri   c                \    || _         t          j        dddd          | _        i | _        d S )N
testsuites0testsr   failures)ri  etElementrootsuites)r   ri  s     r6   rp  zJunitBuilder.__init__5  s5     JC#? ? ?	/1r8   rP  rQ  rU  rV  c                :   |j         |j                             d          D ]}d                    |j        |j        |j        d                   |j        d<   |                    d          D ]
}|j        d= |                    d          D ]
}|j        d= |                    d	          D ]
}|j        d
= |                    d          D ]
}|j        d= | j                            |           dS |j        r)|j         d|j         }|| j	        vs|j
        j        dk    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          }d|_        n|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          }	d|	_        n_|j        t(          j        u rt          j        |d          }	d|	_        n/|j        t(          j        u rt          j        |d          }	d|	_        |j        r|j        t          j        |d          _        |j        r@t          j        |d          }
t?          |j                                                   |
_        |j!        rBt          j        |d          }t?          |j!                                                   |_        dS dS |j        | j	        vrBt          j        d|j        d d!d!d!t          |j                            x}| j	        |j        <   nD| j	        |j                 }t          tE          |j        d"                   dz             |j        d"<   t          j        |d|j        |j        t          |j                  #          }|j#        t(          j        u rIt          j        |d           t          tE          |j        d                   dz             |j        d<   n@|j#        t(          j        u rPt          j        |d          }d|_        t          tE          |j        d                   dz             |j        d<   n|j#        t(          j        u rIt          j        |d           t          tE          |j        d$                   dz             |j        d$<   n|j#        t(          j        u rIt          j        |d           t          tE          |j        d%                   dz             |j        d%<   n%|j#        t(          j        u rOt          j        |d          }	d|	_        t          tE          |j        d%                   dz             |j        d%<   n|j#        t(          j        u rOt          j        |d          }	d|	_        t          tE          |j        d$                   dz             |j        d$<   na|j#        t(          j        u rNt          j        |d          }	d|	_        t          tE          |j        d$                   dz             |j        d$<   |j        r@t          j        |d          }
t?          |j                                                   |
_        |j!        rBt          j        |d          }t?          |j!                                                   |_        dS dS )&zLog a single test case.Nz.//testsuitez{}.{}.{}r   z.//testcase[@result]rV   z.//testcase[@timestamp]	timestampz.//testcase[@file]ro  z.//testcase[@line]r$  .r	   zduplicate suite	testsuitec              3  X   K   | ]%}|j         t          j        t          j        hv !d V  &dS r	   N)rV   r   r   r   r3   rs     r6   	<genexpr>z#JunitBuilder.log.<locals>.<genexpr>Y  sX       I IQ!( * 4j6FG;H ;Hq ;H ;H ;H ;H I Ir8   c              3  n   K   | ]0}|j         t          j        t          j        t          j        hv ,d V  1dS r
  )rV   r   r   r   r   r  s     r6   r  z#JunitBuilder.log.<locals>.<genexpr>[  s\       !c !cqAH",/:3LjN`!a=b =b =b =b =b =b !c !cr8   c              3  X   K   | ]%}|j         t          j        t          j        hv !d V  &dS r
  rV   r   r   r   r  s     r6   r  z#JunitBuilder.log.<locals>.<genexpr>]  sW        G  Ga18!+*2D E<F <F <F <F <F <F  G  Gr8   )r   r  r   r   r   r  testcase)r   	classnamer   zTest output was not parsed.errorfailurezTest unexpectedly passed.zTest was interrupted by user.z.Test did not finish before configured timeout.z
system-outz
system-err1r  r  )r   r  r  r   r   )$junitfindallr   projectr   attribr  rz   resultsr  r  rn   r  r  rP   r_   sumr  
SubElementrV   r   r   r   textr   r   r   r   r   r   r  replace_unencodable_xml_charsr1  r  rQ   r   )r   rP  rU  suitecase	suitenamesubtestr  skipfailouterrs               r6   r]  zJunitBuilder.log;  s   :!++N;; ( ('1'8'8tyRWR^_eRf'g'gV$ "MM*@AA . .DH--!MM*CDD 1 1DK00!MM*>?? , ,DF++!MM*>?? , ,DF++	  ''''F
 < X	M<55$)55IDK//7?3IA3M3M3MO`3M3M3M-/Z#dl++,,3 I I$, I I I I I J JS !c !cDL !c !c !c c c d dC  G  G4<  G  G  G G G H H''. . . EDK	*  < U U =
WYbccc>Z_44M(I6666^z'999=9==D =DII^z'777M(G4444^z66M(I6666^z'@@@=9==D ;DII^z';;;=7;;D ?DII^z'999=7;;D PDI& UAHATBM(L99>y MmE<8889I9I9K9KLLy MmE<8889I9I9K9KLLM M |4;..46Jdl#c #C4F4F5H 5H 5H HDL11 DL1(+CW0E,F,F,J(K(KW%}UJTY/3|#dmBTBTV V VHx:?**h	222*-c%,y2I.J.JQ.N*O*OY''Z///}Xy999	*-c%,y2I.J.JQ.N*O*OY''Z---h000),Sh1G-H-H1-L)M)MX&&Z_,,h	222+.s5<
3K/L/Lq/P+Q+QZ((Z666}Xy997	+.s5<
3K/L/Lq/P+Q+QZ((Z111}Xw77;	),Sh1G-H-H1-L)M)MX&&Z///}Xw77L	),Sh1G-H-H1-L)M)MX&y MmHl;;89I9I9K9KLLy MmHl;;89I9I9K9KLLM Mr8   c           	       K   | j                                         D ]u}| j                            |           dD ]V}t	          t          | j        j        |                   t          |j        |                   z             | j        j        |<   Wvt          j        | j                  }t          | j
        d          5 }|                    |dd           ddd           dS # 1 swxY w Y   dS )z9Calculate total test counts and write out the xml result.r  wbrk  T)rm  xml_declarationN)r  rc   r  rz   rP   rQ   r  r  ElementTreern  ri  r  )r   rP  r  attrtreefs         r6   r_  zJunitBuilder.finish  sD     ['')) 	d 	dEIU###7 d d),S1A$1G-H-H3u|\`OaKbKb-b)c)c	 &&d ~di(($-&& 	B!JJq7DJAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs    C&&C*-C*N)ri  rP   r:   ri   rd  rc  )r   r   r   __doc__rp  r]  r_  rF   r8   r6   r  r  $  si         2 2 2 2nM nM nM nM`
B 
B 
B 
B 
B 
Br8   r  c                       e Zd ZU dZi Zded<   d1 fd
Zd2dZd3dZe	d4d            Z
e	d5d            Ze	d6d            Zd7dZd7d Zd7d!Zd8d"Ze	d9d$            Zd8d%Zd8d&Zd:d;d*Ze	d6d+            Zd<d0Z xZS )=TestRunr   z'T.Dict[TestProtocol, T.Type['TestRun']]PROTOCOL_TO_CLASSrU  r   r   T.Anykwargsr:   c                p    t                                          t          j        |j                           S r   )super__new__r0  r1  protocol)clsrU  r   r3  	__class__s       r6   r6  zTestRun.__new__  s#    www8GHHHr8   test_envT.Dict[str, str]r   rP   r  r  is_parallelr;   r  rt   c                T   t           j        | _        || _        d | _        || _        || _        g | _        d | _        d | _	        d | _
        d| _        d| _        d| _        d | _        || _        |j        | _        |j        | _        d | _        || _        || _        || _        g | _        d S Nr9   )r   r   r   rU  _numr   r  r  r  r  r  r  r  additional_errorr  r   should_failproject_namer  r  r<  r  rt   r  )r   rU  r:  r   r  r<  r  rt   s           r6   rp  zTestRun.__init__  s     %	%)		/1+/,0+/		 ",0+(15
&&%'r8   r  T.List[str]ri   c                f    t           j        | _        t          j                    | _        || _        d S r   )r   r   r   r  r  r  )r   r  s     r6   rT  zTestRun.start  s$    %r8   rQ   c                j    | j         &t          xj        dz  c_        t          j        | _         | j         S Nr	   )r?  r0  TEST_NUMr   s    r6   r  zTestRun.num  s0    9!(DIyr8   r   c                f    | j         rt          j        S | j        rt          j        S t          j        S r   )rt   r   r   r  r   r   r   s    r6   console_modezTestRun.console_mode  s3     	&** 	&%%%%r8   c                0    | j         o| j         o| j         S r   )r  r<  r  r   s    r6   r  zTestRun.direct_stdout  s     |OD$4 4OT=O9OOr8   c                    | j         rOt          d | j         D                       }t          d | j         D                       }||k    r| dS | d| dS dS )Nc              3  H   K   | ]}|j                                         V  d S r   )rV   r   r3   r   s     r6   r  z&TestRun.get_results.<locals>.<genexpr>  s.      @@a))@@@@@@r8   c              3  T   K   | ]#}|j         t          j        t          j        hvV  $d S r   r  rM  s     r6   r  z&TestRun.get_results.<locals>.<genexpr>  s4      bbPQahz
8J&KKbbbbbbr8   z subtests passedr]   r9   )r  r  )r   passedrans      r6   get_resultszTestRun.get_results  s~    < 	9@@4<@@@@@FbbUYUabbbbbC}} 2222 8838888rr8   c                *    t          | j                  S r   )r   r  r   s    r6   r  zTestRun.get_exit_status  s    #DO444r8   c                    | j         t          j        u rdS | j        r|                                 S |                                 S r>  )r   r   r   r  r  rQ  r   s    r6   r  zTestRun.get_details  sE    8z)))2? 	*'')))!!!r8   c                   | j         t          j        k    rt          j        | _         | j        r$| j        t          j        u rt          j        | _         t          | j         t                    sJ | j
        rO| j         t          j        t          j        fv r0| j         t          j        u rt          j        nt          j        | _         | j        r*| j                            d          s| xj        dz  c_        | j        r*| j                            d          s| xj        dz  c_        t#          j                    | j        z
  | _        d S r   )r   r   r   r   r  rI  r   r   r   
isinstancerA  r   r   r   r  endswithr  r  r  r  r   s    r6   	_completezTestRun._complete  s   8z)))!}DH 	*$"3{7N"N"N!)DH$(J///// 	kZ]JO,L L L48H
4M4Mz00S]SjDH9 	TY//55 	IIII9 	TY//55 	IIII	dn4r8   r   c                    | j         sd S t          | j                                                  t          t          j                                                  z
  }t          |          d                    d | j         D                       z   S )Nr   c              3  4   K   | ]}t          |          V  d S r   )r   rM  s     r6   r  z"TestRun.cmdline.<locals>.<genexpr>  s(      33QXa[[333333r8   )r  r  r   r  r  r  r   r   )r   test_only_envs     r6   r  zTestRun.cmdline  sz    x 	4DHNN,,--BJ4D4D4F4F0G0GG..HH33$(333334 	4r8   c                    t          j                     | _        t          | _        t          j        | _        |                                  d S r   )r  r  GNU_SKIP_RETURNCODEr  r   r   r   rW  r   s    r6   complete_skipzTestRun.complete_skip  s5    -?r8   c                .    |                                   d S r   )rW  r   s    r6   completezTestRun.complete"  s    r8   Fr   r  c                   |rdn| j         }| j        s| j        rd}|rE|t          j        d                              |          dz   z  }||z  }|dd          dk    r|dz  }|t          j        d                              |          dz   z  }|t          | j        | j                  z  }n|}|r|dd          dk    r|dz  }|S )Nr9   zstdout:r   r   zstderr:)r  r  r@  r   cyanr   r   )r   r   r  r  r   s        r6   r  zTestRun.get_log%  s     /rrdi9 
	- 
	C  ty++44X>>EEtrss8t##4KC49Y''00::TAAC:di)>???CCC 	3rss8t##4KC
r8   c                    dS )NFrF   r   s    r6   r  zTestRun.needs_parsing6  s    ur8   rP  rQ  r  r  c                    K   |2 3 d {V }6 d S r   rF   )r   rP  r  ls       r6   r+  zTestRun.parse:  s:       	 	 	 	 	 	 	! uus   )rU  r   r   r2  r3  r2  r:   r2  )rU  r   r:  r;  r   rP   r  r  r<  r;   r  r;   rt   r;   )r  rC  r:   ri   r   r:   r   r   r   rb  r:   r   )FF)r   r;   r  r;   r:   rP   rP  rQ  r  r  r:   ri   )r   r   r   rG  r1  r   r6  rp  rT  propertyr  rI  r  rQ  r  r  rW  r  r]  r_  r  r  r+  __classcell__r9  s   @r6   r0  r0    s        HACCCCCI I I I I I( ( ( (2   
    X & & & X& P P P XP	 	 	 	5 5 5 5" " " "5 5 5 5 4 4 4 X4          "    X       r8   r0  c                        e Zd Zd fdZ xZS )TestRunExitCoder:   ri   c                ^   | j         t          j        k    rnu| j        t          k    rt          j        | _         nS| j        t          k    rt          j        | _         n1t          | j                  rt          j	        nt          j
        | _         t                                                       d S r   )r   r   r   r  r\  r   GNU_ERROR_RETURNCODEr   r;   r   r   r5  r_  r   r9  s    r6   r_  zTestRunExitCode.completeA  s    8z)))_ 333!DHH_ 444!'DHH*.t*?*?RzZ]DHr8   rb  r   r   r   r_  ri  rj  s   @r6   rl  rl  ?  s=        	 	 	 	 	 	 	 	 	 	r8   rl  c                        e Zd Zd fdZ xZS )TestRunGTestr:   ri   c                   | j         j         d}| j         j        r*t          j                            | j         j        |          }	 t          |ddd          5 }t          j        |          | _	        d d d            n# 1 swxY w Y   nA# t          $ r Y n5t          j        $ r$}t          j        d| d|           Y d }~nd }~ww xY wt                                                       d S )N.xmlr  utf8rh  rl  zUnable to parse : )rU  r   workdirr  pathr   rn  r  r+  r  FileNotFoundError
ParseErrorr   r  r5  r_  )r   ri  r-  er9  s       r6   r_  zTestRunGTest.completeP  sC   in***9 	Aw||DI$5x@@H
	=hfYGGG )1Xa[[
) ) ) ) ) ) ) ) ) ) ) ) ) ) )  	 	 	 D} 	= 	= 	=J;(;;a;;<<<<<<<<	= 	sB   B B5B BB B	B 
CC'CCrb  rp  rj  s   @r6   rr  rr  O  s=                 r8   rr  c                  @     e Zd Zedd            Zd fdZdd
Z xZS )
TestRunTAPr:   r;   c                    dS NTrF   r   s    r6   r  zTestRunTAP.needs_parsingg      tr8   ri   c                    | j         dk    rQ| j                                        s8t          j        | _        | j        pd| _        | xj        d| j          dz  c_        t                                                       d S )Nr   r9   z'
(test program exited with status code r   )r  r   r   r   r   r  r5  r_  ro  s    r6   r_  zTestRunTAP.completek  st    ?a(;(;(=(=!'DH	RDIIIVDOVVVVIIr8   rP  rQ  r  r  c           	       K   d }g }d}t                                          |          2 3 d {V }t          |t           j                  r|j        })t          |t           j                  r)t          j        }|                    | |j	        |           lt          |t           j
                  rk| j                            |           |j                                        rt          j        }|                    | |j        p	d|j         |j                   t          |t           j                  r|                    |           "t          |t           j                  r$| xj        d|j	        z   z  c_        t          j        }b6 |rt+          t-          j        d                    }t1          t+          t3          d |D                                           }|D ]1}	| j                            d|	j        | d| d|	j	                    2|dk    r| j                            d	           n<| j                            t+          t-          j        d
                    dz              t;          d | j        D                       r|t          j        k    rt          j        }|r| j        t          j         k    r|| _        d S d S d S )Nr(   zsubtest zTAP parsing error: UNKNOWNc              3  $   K   | ]}|j         V  d S r   )r  )r3   r  s     r6   r  z#TestRunTAP.parse.<locals>.<genexpr>  s$      ;;Q;;;;;;r8   zstdout: rv  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  <   K   | ]}|j         t          j        u V  d S r   rV   r   r   r3   ts     r6   r  z#TestRunTAP.parse.<locals>.<genexpr>  +      AAqqx:?*AAAAAAr8   )!r   r&  rU  r  r   r  r   r   r[  r  r	  r  rz   rV   r   r   r   r  r  r  r@  rP   r   r   r_   r>  r  r  r   allr   r   r   )
r   rP  r  r   r  r   r  unknownr   rX   s
             r6   r+  zTestRunTAP.parser  s     24 {{..u55 	' 	' 	' 	' 	' 	' 	'!!Y.// ')Ay011 ' &##D!)S9999Ay~.. 	'##A&&&8??$$ *$/C##D!&*I4Iqx4I4I18TTTTAy455 '""""Ay// '%%)>)JJ%% & 6"  
	}$+i0011GC;;(;;;;;<<==E \ \$$%Z%%Z%Z%ZG%Z%Zqy%Z%Z[[[[||$$ &k l l l l $$S'):):%;%; ?| &| } } }AADLAAAAA 	&j&&& o 	48z111DHHH	 	11s   Fr   rb  rg  )r   r   r   rh  r  r_  r+  ri  rj  s   @r6   r}  r}  f  so           X     ' ' ' ' ' ' ' 'r8   r}  c                  .    e Zd Zedd            Zdd	Zd
S )TestRunRustr:   r;   c                    dS r  rF   r   s    r6   r  zTestRunRust.needs_parsing  r  r8   rP  rQ  r  r  ri   c                Z  K   dd}d	}|2 3 d {V }t                               |          }|r|                                \  }}t                              |          }	|	r2d
                    d |	                                D                       }n|                                }|                    dd          } ||||          }
| j                            |
           |	                    | ||
j
                   |d	z  }6 d }t          d | j        D                       rt          j        }nUt          d | j        D                       rt          j        }n*t          d | j        D                       rt          j        }|r| j        t          j        k    r|| _        d S d S d S )NnrQ   r   rP   rV   r:   r   c                d   |dk    r't                               | |t          j        d           S |dk    r't                               | |t          j        d           S |dk    r't                               | |t          j        d           S t                               | |t          j        d|           S )Nr  ignoredFAILEDz#Unsupported output from rust test: )r   r	  r   r   r   r   r   )r  r   rV   s      r6   	parse_resz$TestRunRust.parse.<locals>.parse_res  s    ~~ ~~az}dCCC9$$ ~~azEEE8## ~~azEEE>>!T:+;"P"P"PR R Rr8   r	   :c              3  B   K   | ]}||                                 V  d S r   )r1  rM  s     r6   r  z$TestRunRust.parse.<locals>.<genexpr>  s/      $O$OAQ$OQXXZZ$O$O$O$O$O$Or8   z::r  c              3  <   K   | ]}|j         t          j        u V  d S r   r  r  s     r6   r  z$TestRunRust.parse.<locals>.<genexpr>  r  r8   c              3  <   K   | ]}|j         t          j        u V  d S r   )rV   r   r   r  s     r6   r  z$TestRunRust.parse.<locals>.<genexpr>  s,      DD!Z--DDDDDDr8   c              3  <   K   | ]}|j         t          j        u V  d S r   )rV   r   r   r  s     r6   r  z$TestRunRust.parse.<locals>.<genexpr>  s+      CCZ_,CCCCCCr8   )r  rQ   r   rP   rV   rP   r:   r   )RUST_TEST_REr5  groupsRUST_DOCTEST_REr   r1  rh  r  rz   r[  rV   r  r   r   anyr   r   r   r   )r   rP  r  r  r  r$  r5  r   rV   doctestr  r   s               r6   r+  zTestRunRust.parse  s     	R 	R 	R 	R  	 	 	 	 	 	 	$ &&t,,E $||~~f)//55 )88$O$O9I9I$O$O$OPPDD;;==D||D#..Iav..##A&&&##D$999Q   AADLAAAAA 	"/CCDDt|DDDDD 	""CCCCdlCCCCC 	"/C 	48z111DHHH	 	11s   DNr   rg  )r   r   r   rh  r  r+  rF   r8   r6   r  r    sF           X& & & & & &r8   r  original_strc                >    d }t                               ||           S )Nc                T    t          |                                           dd         S )Nr	   r   )reprr7  )illegal_chrs    r6   r   z/replace_unencodable_xml_chars.<locals>.<lambda>  s#    T+2C2C2E2E-F-Fqt-L r8   )UNENCODABLE_XML_CHRS_REr  )r  replacement_lambdas     r6   r  r    s%     ML"&&'9<HHHr8   streamT.Union[None, bytes]c                    | dS 	 |                      d          S # t          $ r |                      dd          cY S w xY w)Nr9   rk  z
iso-8859-1ignorer   )r   UnicodeDecodeError)r  s    r6   r   r     sZ    ~r<}}W%%% < < <}}\(};;;;;<s    !??readerasyncio.StreamReaderqueue,T.Optional['asyncio.Queue[T.Optional[str]]']rI  c                x  K   g }	 |                                  s	 |                     d           d {V }nZ# t          j        $ r}|j        }Y d }~n?d }~wt          j        $ r*}|                     |j                   d {V }Y d }~nd }~ww xY w|rut          |          	                    dd          }|
                    |           |t          j        u rt          |dd           |r|                    |           d {V  |                                  d                    |          |r|                    d            d {V  S S # t          j        $ r6 d                    |          cY |r|                    d            d {V  S S w xY w# |r|                    d            d {V  w w xY w)N   
z
r   r9   T)r   rN  )at_eof	readuntilr  IncompleteReadErrorpartialLimitOverrunErrorreadexactlyconsumedr   rh  rz   r   r   r   putr   CancelledError)r  r  rI  
stdo_lines
line_bytesr{  r$  s          r6   read_decoder    sL      J"--// 	*B#)#3#3E#:#:::::::

. ' ' 'Y





, B B B#)#5#5aj#A#AAAAAAA





B *j))11&$??!!$''';#555$Bd3333 *))D//))))))) --// 	* wwz""  	"))D//!!!!!!!!	" ! # # #wwz"""" 	"))D//!!!!!!!!	"#  	"))D//!!!!!!!!	"s\   E 8 E BAE B% B
E 
BB#E $F5F FF  F9fnamec                f    |                      d          ot                      pt                       S )Nz.exe)rV  rB   rG   )r  s    r6   run_with_monor    s)    >>&!!G:<<+F9;;&GGr8   objsT.List[TestSerialisation]c                j   t          | t                    st          dt                    | D ]}t          |t                    st          dt                    t          |d          st          dt                    t          |j        t                    rt          |j        t                    | S )Nz	<unknown>r   )rU  ru   r   coredata_versionr   hasattrr   r   )r  objs     r6   check_testdatar    s    dD!! K+K9IJJJ O O#011 	O/=MNNNsI&& 	O/=MNNN .>?? 	O/=MNNN	OKr8   q 'asyncio.Queue[T.Optional[str]]'r  c               x   K   	 |                                   d {V }|                                  |d S |W V  8r   )get	task_done)r  items     r6   
queue_iterr  	  sK      UUWW}}}}}}	<E



r8   futureasyncio.Futurec                H   K   	 |  d{V  dS # t           j        $ r Y dS w xY w)z?Wait for completion of the given future, ignoring cancellation.N)r  r  )r  s    r6   r_  r_    sE      !   s    !!futuresT.Iterable[asyncio.Future]r  T.Optional[T.Union[int, float]]c                H  K   d	d}t          j                    }|dn|                                |z   }| r`||dk    rXt          j        | |t           j                   d{V \  }}  ||           |r||                                z
  }| r|R|dk    X ||            dS )
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.r  r  r:   ri   c                    d}| D ]A}|                                 sd}|                                s|                                 B|rt          j        d S NFT)done	cancelledrV   r  TimeoutError)r  r  r-  s      r6   check_futuresz#complete_all.<locals>.check_futures   sf     	 	A6688 [[]] 


 	'&&	' 	'r8   Nr   )r  return_when)r  r  r:   ri   )r  r  r  r  FIRST_EXCEPTION)r  r  r  r  deadliner  s         r6   complete_allr    s      	' 	' 	' 	' #%%DttDIIKK',AH
 -w'A++%l7G7>7NP P P P P P P P Pgd 	-,G  -w'A++ M'r8   c                  :    e Zd Z	 ddd	ZddZddZddZddZdS )TestSubprocessNpasyncio.subprocess.Processr  r  r  postwait_fnT.Callable[[], None]c                v    || _         || _        || _        d | _        d | _        || _        g | _        d | _        d S r   )_processr  r  	stdo_task	stde_taskr  all_futuresr  )r   r  r  r  r  s        r6   rp  zTestSubprocess.__init__:  sB     9=9=&35AE


r8   r:   r  c                Z    t          j                    | _        t          | j                  S r   )r  Queuer  r  r   s    r6   stdout_lineszTestSubprocess.stdout_linesF  s    ]__
$*%%%r8   rU  rV  rI  r   CT.Tuple[T.Optional[T.Awaitable[str]], T.Optional[T.Awaitable[str]]]c                    d fd	}dd
} j         V j        O || j        j        |          }t          j        |           _          j                             j                     j        i j        t          j        j	        k    rO || j        j        |          }t          j        |           _
         j                             j
                    j          j
        fS )NrU  rV  r  r  rI  r   r:   ri   c                N   K   t          |j        |           d {V | _        d S r   )r  r  r  )rU  r  rI  r   s      r6   collect_stdoz0TestSubprocess.communicate.<locals>.collect_stdoN  s4       *&$*lKKKKKKKKDIIIr8   c                B   K   t          |d |           d {V | _        d S r   )r  r  )rU  r  rI  s      r6   collect_stdez0TestSubprocess.communicate.<locals>.collect_stdeS  s1       *&$EEEEEEEEDIIIr8   )rU  rV  r  r  rI  r   r:   ri   )r  r  r  r  r  r  rz   r  
subprocessr   r  )r   rU  rI  r  r  decode_coros   `     r6   communicatezTestSubprocess.communicateJ  s    	L 	L 	L 	L 	L 	L
	F 	F 	F 	F >!dk&=&,tT]-A<PPK$2;??DN##DN333;"t{g6H6O'O'O&,tT]-A<PPK$2;??DN##DN333~t~--r8   r   c           	     4  K   | j         }	 t                      r,t          j        ddddt	          |j                  g           nt          j        |j        t          j	                   t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S t          j        |j        t          j                   t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S |                                 t          t          j                  5  t          j        |                                d           d {V  d d d            n# 1 swxY w Y   |j        E	 | j        r| j                                         | j        r| j                                         d S d S 	 | j        r| j                                         | j        r| j                                         dS dS # t*          $ r` |                                 d {V  Y | j        r| j                                         | j        r| j                                         d S d S w xY w# | j        r| j                                         | j        r| j                                         w w xY w)	Ntaskkillz/Fz/Tz/PIDg      ?r  r	   z!Test process could not be killed.)r  rB   r  runrP   pidr  killpgr   SIGTERMr   r  r  wait_forr  r  r  cancelr  SIGKILLkillProcessLookupError)r   r  s     r6   _killzTestSubprocess._kille  s      M)	(|| 1
D$AE

KLLLL 	!%000 g233 B B!*16688SAAAAAAAAAAB B B B B B B B B B B B B B B<+2 ~ (%%'''~ (%%'''''( (3 	!%000'.// < <&qvvxx;;;;;;;;;;< < < < < < < < < < < < < < <|'$ ~ (%%'''~ (%%'''''( ( FFHHH'.// < <&qvvxx;;;;;;;;;;< < < < < < < < < < < < < < <|' ~ (%%'''~ (%%'''''( ( 7 ~ (%%'''~ (%%'''''( ( " 	 	 	 &&((NNNNNNN~ (%%'''~ (%%'''''( (	 ~ (%%'''~ (%%''''(s   A7K' /B=1K' =CK' C
K' =K' /F K' FK' F
K' #-K' /I?K' IK' I
K' '$MM MM ANri   c                  K   | j         }| j                            t          j        |                                                     	 t          | j        |j                   d {V  n# t          j        $ r> |xj	        | 
                                 d {V pdz  c_	        t          j        |_        Y nOt          j        $ r> |xj	        | 
                                 d {V pdz  c_	        t          j        |_        Y nw xY w| j        r|                                  n!# | j        r|                                  w w xY w|j        pd|_        d S )Nr  r9   r   )r  r  rz   r  r  r  r  r  r  r@  r  r   r   r   r  r   r  r  )r   rU  r  s      r6   r  zTestSubprocess.wait  s}     M 5affhh ? ?@@@	#t/FFFFFFFFFFF# 	* 	* 	*!!4::<<%7%7%7%7%7%7%=2=!!!)DHHH% 	, 	, 	,!!4::<<%7%7%7%7%7%7%=2=!!!+DHHH	,
  #  """  #  """"# ,+!s8   	!A+ *D" +A
D5D" 7A	D D" DD" "E r   )r  r  r  r  r  r  r  r  )r:   r  )rU  rV  rI  r   r:   r  rf  )rU  rV  r:   ri   )r   r   r   rp  r  r  r  r  rF   r8   r6   r  r  9  s         6:
F 
F 
F 
F 
F& & & &. . . .6.( .( .( .(`, , , , , ,r8   r  c                      e Zd Zd&d	Ze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d%S )/SingleTestRunnerrU  r   r   r;  r   rP   r  argparse.Namespacec           	     l   || _         || _        |                                 | _        | j        r| j         j        rt
          j                            | j         j        dgz             |d         z   |d<   g }| j        D ]}|                    |           t
          j	        
                    |                              d          r^t          |d | j         j        D             |                    dd                              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<   d|vs|d         sd|d<   d|vs|d         s@	 t(                              | j                  d         }d|v rd|d<   n# t,          $ r Y nw xY w| j        j        s| j         j        | j         j        dk    rd }nE| j        j        | j         j        }n,| j        j        dk    rd }n| j         j        | j        j        z  }|j        o| j        j        dk    o| j        j         }	|j        s| j        j        o| j        j         }
t=          |||||	|
| j        j                  | _        d S )Nr9   PATHwinec                    g | ]}d |z   S )zZ:rF   )r3   r  s     r6   r7   z-SingleTestRunner.__init__.<locals>.<listcomp>  s    AAAaAAAr8   WINEPATH;MALLOC_PERTURB_r	      ASAN_OPTIONSz0halt_on_error=1:abort_on_error=1:print_summary=1UBSAN_OPTIONSzChalt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1MSAN_OPTIONSVALGRIND_OPTSr   valgrindz--error-exitcode=1) rU  r  _get_cmdr  extra_pathsr  pathsepr   rz   rx  basenamer  r   r  r^   rw  	benchmarkrP   randomrandintTestHarnessget_wrapper
IndexErrorrt   r  timeout_multiplierr<  num_processesr  r  r0  runobj)r   rU  r   r   r  winecmdrW   wrapper_namer  r<  r  s              r6   rp  zSingleTestRunner.__init__  s   	==??8 		- 	*//$)*?2$*FGG#f+UCKGX  q!!!7##A&&11&99 &8AA49+@AAACGGJXZD[D[DaDabeDfDff	)' 'C
O
 E S((4E0F(PWPa(%(3)?)?%@%@C!" #%%S-@%"TC3&&c/.B&#hC #%%S-@%"gC #%%S-A%*66t|DDQG--+?C(    <# 	Jty'8'@DIDUYZDZDZGG\,4i'GG\,11GGi'$,*IIG&j4<+E+IjRVR^RjNj<74<#7SAS=SdCwWdlNfggs   .G 
GGr:   r   c                    | j         j        S r   )r   rI  r   s    r6   rI  zSingleTestRunner.console_mode  s    {''r8   T.Optional[T.List[str]]c                   | j         j        d         }| j        j        r>| j         j        r2t
          j                            |          st          d|d          |	                    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        d S | j         j        r|| j         j                                        s3d}t          |                    | j         j        j                            | j         j                                        | j         j        z   S ne| j         j        rY| j         j        sMt'                      r?t)          j        | j         j        d                   }||| j         j        d	d          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	   )rU  r  r  
no_rebuildcmd_is_builtr  rx  isfiler   rV  is_cross_builtr  
cmd_is_exeneeds_exe_wrapperexe_wrapperfoundr   r   get_commandrB   r   _shebang_to_cmd)r   	testentrymsgtest_cmds       r6   _get_test_cmdzSingleTestRunner._get_test_cmd  s   IOA&	<" 	zty'= 	zbgnnU^F_F_ 	z xI x x xyyyf%% 	F#dio55) 	mI.F.F 	8dio--Y! 	di&> 	49C^ 	y$, t% M y,2244 PTC'

493H3M(N(NOOOy,88::TY_LLM Y# 	DI,@ 	Z\\ 	&6tyq7IJJH#DIOABB//Oyr8   c                v    |                                  }|sd S t                              | j                  |z   S r   )r5  r  r  r  )r   r4  s     r6   r  zSingleTestRunner._get_cmd  s;    %%'' 	4&&t|44x??r8   r;   c                    | j         j        S r   )r   r<  r   s    r6   r<  zSingleTestRunner.is_parallel  s    {&&r8   c                    | j         j        S r   )r   r   r   s    r6   visible_namezSingleTestRunner.visible_name  s    {r8   r  c                    | j         j        S r   )r   r  r   s    r6   r  zSingleTestRunner.timeout  s    {""r8   rP  rQ  r0  c                z  K   | j         ;d| _        |                    | j                   | j                                         nq| j         | j        j        z   | j        j        z   }| j        	                    |           |                    | j                   | 
                    ||           d {V  | j        S )Nz7Not run because cannot execute cross compiled binaries.)r  r  log_start_testr   r]  rU  cmd_argsr  	test_argsrT  _run_cmd)r   rP  r  s      r6   r  zSingleTestRunner.run  s      8QDI""4;///K%%''''(TY//$,2HHCKc"""""4;///-----------{r8   r   rC  stdinr  r  cwdr   r  c          
     h   
K    j         j        rGt          j        t          j                  
t          j        t          j        t          j                   d fd}d
 fd}t          j        ||||||t                      s|nd d d {V }	t          |	||t                      s|nd           S )Nr:   ri   c                      j         j        r+t          j        t          j        t          j                   d S t          j                     d S r   )r  rt   r   SIGINTSIG_DFLr  setsidr   s   r6   
preexec_fnz4SingleTestRunner._run_subprocess.<locals>.preexec_fn-  s?    |'  fmV^<<<<<
 	r8   c                 b    j         j        r!t          j        t          j                    d S d S r   )r  rt   r   rD  )previous_sigint_handlerr   s   r6   r  z5SingleTestRunner._run_subprocess.<locals>.postwait_fn8  s8    |' Ffm-DEEEEEF Fr8   )r@  r  r  r   rA  rG  )r  r  r  rb  )
r  rt   r   	getsignalrD  SIG_IGNr  create_subprocess_execrB   r  )r   r   r@  r  r  r   rA  rG  r  r  rI  s   `         @r6   _run_subprocessz SingleTestRunner._run_subprocess$  s      <# 	9&,&6v}&E&E#M&-888		 		 		 		 		 			F 	F 	F 	F 	F 	F 	F
 0$7<8>8>5858NXll<dJJ`df f f f f f f f f av=G\\*S++tU U U 	Ur8   r  ri   c                  K   | j         t          j        u rd }d }d }n\t          j        j        }t          j        j        }| j        j        s| j	        j
        st          j        j        nt          j        j        }g }| j        j        t          j        u re| j        j        }| j        j        r4t$          j                            | j        j        | j        j                  }|                    d| d           |                     ||z   |||| j	        j        | j        j                   d {V }| j	        j
        rU| j         t          j        urB| j	                            ||                                          }	t          j        |	          }
nd }
|                    | j	        | j                   \  }}|                    | j	                   d {V  |
r|
 d {V  |r| d {V  |r| d {V  | j	                                         d S )Nz--gtest_output=xml:rt  )r@  r  r  r   rA  )rI  r   r   r  r  DEVNULLPIPEr  r^   r   r  r   rU  r7  r   GTESTr   rw  r  rx  r   rz   rM  r   r+  r  r  r  r  r_  )r   rP  r  r@  r  r  	extra_cmd	gtestnamer  
parse_coro
parse_taskr  r  s                r6   r?  zSingleTestRunner._run_cmdG  s<      777EFFF&.E',F|)-26+2K-W'..',  "$	9!333	Iy  LGLL):DINKK	B9BBBCCC&&sY-2.4.4+/;?+/9+< ' > > > > > > > > ;$ 	):+BY)Y)Y**7ANN4D4DEEJ .z::JJJ }}T[$:KLL	9ffT[!!!!!!!!! 	 	OOOOOOO 	OOOOOOOr8   N)rU  r   r   r;  r   rP   r  r  re  )r:   r$  r   r   )r:   r  )rP  rQ  r:   r0  )r   rC  r@  r  r  r  r  r  r   r;  rA  r   r:   r  )rP  rQ  r  rC  r:   ri   )r   r   r   rp  rh  rI  r5  r  r<  r9  r  r  rM  r?  rF   r8   r6   r  r    s       :h :h :h :hx ( ( ( X(   8@ @ @ @ ' ' ' X'       X  # # # X#
 
 
 
!U !U !U !UF* * * * * *r8   r  c                  l   e Zd ZdQdZdRdZdSdZdSd	ZdTdZdUdZdVdZ	dSdZ
dWdZdXdZdYd ZdZd#Zed[d$            Zed[d%            Zd\d'Z	 	 	 	 	 d]d^d3Zd_d4Zd[d5Zd[d6Zed`d9            Zedad<            Zdbd=Zdcd@ZdddedCZdSdDZdSdEZedfdF            ZdgdGZ dhdJZ!didNZ"djdOZ#dhdPZ$d*S )kr  r  r  c                "   || _         g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        g | _        t          |j                  | _        | j                            | j                   d| _        d | _        d | _        | j         j        r| j         j        sd }t,          j                            | j         j        d| j         j                  | _        | j         j        r>t,          j                            |                     | j                   d                   }n,| j         j        r | j         j                            dd          }|r'| xj        d|                    dd          z   z  c_        |                                  |                                   tC                      }| j"        D ]!}|j#        D ]}|$                    |           "tK          |          | _&        d S )Nr   Fz
meson-logsr  r  r1   r   )'r  r  
fail_countexpectedfail_countunexpectedpass_countsuccess_count
skip_countignored_counttimeout_countr|  name_max_lenis_runloggersrs  r   console_loggerrz   r  ninjalogfile_baselogbasert   r  rx  r   rx   rv   r  r  r   rh  prepare_buildload_metadatar  r  r  r  ru   r  )r   r  namebasessr  rO   s         r6   rp  zTestHarness.__init__u  s   35"#$%!+-+G,=>>D/000!"&
-1< 
	F(@ 
	FH "T\_lDLL` a aD|# @7++D,<,<T\,J,J1,MNN# @<-55c3?? F!!S8+;+;C+E+E%EE!!UU 	 	AW  q				2hhr8   r:   'ConsoleLogger'c                "    | j         sJ | j         S r   )rb  r   s    r6   get_console_loggerzTestHarness.get_console_logger  s    """"""r8   ri   c                    | j         j        rd S t          j                    | _        | j        s%t          d           t          j        d           d S d S )Nz%Can't find ninja, can't rebuild test.r+   )r  r(  r   detect_ninjarc  r   rE   exitr   s    r6   rf  zTestHarness.prepare_build  sZ    <" 	F -//
z 	9:::
 HSMMMMM	 	r8   c                H   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        dk    rt          d	| j        j                  t!          j        t          j                              | _        | j        j        s| j        j        | j        _        | j        j        r|                     d
          | _        n|                     d          | _        t          j        |           d S # t          j        |           w xY w)Nz-nzbuild.ninjaT)capture_outputs   ninja: no work to do.s   samu: nothing to do)r  r   zCould not configure zmeson_benchmark_setup.datzmeson_test_setup.dat)r  getcwdchdirr  rx   r(  r  r  rc  r  ru   rE   r  filenor  r   r
   load
build_datar   test_setup_default_namer  
load_testsr  )r   startdirteststdor  rets        r6   rg  zTestHarness.load_metadata  sm   9;;	HT\_%%% <* X%>$*m7L*L]abbbi+8;;@V^f@f@f)-):J3::
D$.}o)Edkkmm\\\C~**+,V4<?,V,VWWW#j55DO<% M%)_%L"|% E!__-HII

!__-CDD
HXBHXs   E F F!	file_namerP   r  c                (   t          d          |z  }|                                st          d| j        j        d          |                    d          5 }t          t          j        |                    }d d d            n# 1 swxY w Y   |S )Nzmeson-privatez
Directory z- does not seem to be a Meson build directory.rb)	r   is_filer   r  rx   rn  r  pickleru  )r   r|  datafiler-  r  s        r6   rx  zTestHarness.load_tests  s    ((94!! 	o mT\_ m m mnnn]]4   	2A!&+a..11D	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   "BBBrQ  c                    | S r   rF   r   s    r6   	__enter__zTestHarness.__enter__  s    r8   exc_typer2  	exc_value	tracebackc                .    |                                   d S r   )close_logfiles)r   r  r  r  s       r6   __exit__zTestHarness.__exit__  s    r8   c                P    | j         D ]}|                                 d | _        d S r   )ra  ra  rb  r   rd  s     r6   r  zTestHarness.close_logfiles  s0     	 	AGGIIII"r8   rU  T.Optional[TestSerialisation]build.TestSetupc                   d| j         j        v rV| 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  r   rv  test_setupsrE   ro  rB  )r   rU  	full_names      r6   get_test_setupzTestHarness.get_test_setup  s    $,$$$|!)DDDF0BFFFGGG?.t|/ABB)C/$,2DDI ;;;k(:kkVZVgkkklll?.y99r8   r   r;  c                l   |                      |          }|j        s|j        |_        |j        rd|_        d|_        |j        |j        |_        |j        |j        |_        n|j        rt          j        d           |j	        
                    t          j                                                  S )NTzBConflict: both test setup and command line specify an exe wrapper.)r  rr   rt   r  r  rv   r.  rE   ro  r   get_envr  r  copy)r   r  rU  currents       r6   merge_setup_optionszTestHarness.merge_setup_options  s    %%d++{ 	&!+GK; 	#"&G"GO%-)0)CG& ?"%1GOO  	[HYZZZ{""2:??#4#4555r8   	iterationrQ   r  c                0   |                      |          }t          | j                  }| j        j        r|                     ||          }nt
          j                                        }|j        	                    |          }|
                    |           |j        rP|j        rI|j        rB|j                                        r)t          |j                                                  |d<   t#          |dz             |d<   t%          ||||          S )NMESON_EXE_WRAPPERr	   MESON_TEST_ITERATION)get_pretty_suiter   r  r   r  r  r  r  r   r  r  r+  r-  r.  r/  r   r0  rP   r  )r   rU  r  r   r  r   r:  s          r6   get_test_runnerzTestHarness.get_test_runner  s   $$T**4<((< 	$**7D99CC*//##C8##C((

8 	QD$: 	Q 	Q%)%5%;%;%=%=	Q'01A1M1M1O1O'P'PC#$&))a-&8&8"#c4999r8   rV   r0  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        u r| xj	        dz  c_	        n|j         t          j
        t          j        t          j        hv r| xj        dz  c_        nd|j         t          j        u r| xj        dz  c_        n@|j         t          j        u r| xj        dz  c_        nt%          j        d|j                     |j                                         r| j                            |           | j        D ]}|                    | |           d S )Nr	   z!Unknown test result encountered: )r   r   r   r^  r   r\  r   r]  r   r[  r   r   r   rX  r   rY  r   rZ  rE   ro  r   r  rz   ra  r]  )r   rV   rd  s      r6   process_test_resultzTestHarness.process_test_result  s   :+++!#Z:?**OOq OOOZ:---!#Z:=((!#ZJOZ-=z?STTTOOq OOOZ:222##q(###Z:444%%*%%%HEEEFFF: 	3#**6222 	  	 AEE$	  	 r8   c                D    t          t          | j                            S r   )r_   rP   r|  r   s    r6   numlenzTestHarness.numlen  s    3t''(((r8   c                    d| j         z  dz   S )NrH   )r  r   s    r6   ry  zTestHarness.max_left_width#  s    4;""r8   r  c                F    d                     | j        || j                  S )Nz{num:{numlen}}/{testcount} )r  r  	testcount)r   r  r|  )r   r  s     r6   get_test_num_prefixzTestHarness.get_test_num_prefix'  s.    ,334;8;>Bo 4 O O 	Or8   r   r9   Nr   r;   ry  r  r  r   r  r  c                   ||                      |j                  }t          || j                  }||j        }|| j        z   dz   t          |          z
  t          |          z
  t          |          z
  }|dt          d|          z  z  }|[d                    |j        	                    |          |j
        | j        dz             }|                                }	|	r|d|	z   z  }||z   |z   |z   S )Nr	   r   z{res} {dur:{durlen}.2f}sr%   )r   r  r  r  )r  r  r>  ry  r   r_  rY   r   r   r   r  r  r  )
r   rV   r   ry  r  r  r  r  extra_mid_widthr  s
             r6   r   zTestHarness.format,  s    <++FJ77D ^T-@AA>[F(4+<<q@8FCSCSSV^_cVdVddgopvgwgww#A////=.55J''11O,q0 6 2 2E ((**G )(}v%--r8   c                   | j         | j        | j        | j        | j        | j        | j        d}g }|                                D ]`\  }}|dk    s*|                    d          s|                    d          r+|	                    |d
                    |          z              ad
                    d                    |                    S )N)zOk:                zExpected Fail:     zFail:              zUnexpected Pass:   zSkipped:           zIgnored:           zTimeout:           r   zOk:zFail:z{:<4}z
{}
r   )r[  rY  rX  rZ  r\  r]  r^  r  r  rz   r   r   )r   r  r  rV   r  s        r6   r  zTestHarness.summaryH  s    !%!3!%!8!%!%!:!%!%!3!%!3
 
 $]]__ 	? 	?MFEqyyF--e44y8I8I'8R8Ryvu(=(==>>>tyy11222r8   c                0    | j         | j        z   | j        z   S r   )rX  rZ  r^  r   s    r6   total_failure_countzTestHarness.total_failure_countZ  s    !::T=OOOr8   c                      j         rt          d          d _                                          } j        j        r|ng }|sdS  j        j        s?t           j         j        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 ]f|                     fd|D                        dk    r<t          d |D                        _        t1          d |D                        _        gt!          |           _                             |           t%          j        |           n# t%          j        |           w xY w                                 S )	Nz*Test harness object can only be used once.Tr   }   c              3  \   K   | ]&}t                              |                    V  'd S r   )rY   r  )r3   rU  r   s     r6   r  z#TestHarness.doit.<locals>.<genexpr>m  s9      XX$)>)>t)D)D E EXXXXXXr8   c              3  D   K   | ]}                     |          V  d S r   )r  )r3   rU  r  r   s     r6   r  z#TestHarness.doit.<locals>.<genexpr>u  s3      OOt33D!<<OOOOOOr8   c              3  v   K   | ]4}t          t          t          |j        pd                               V  5dS )r$   N)r_   rP   rQ   r  r3   runners     r6   r  z#TestHarness.doit.<locals>.<genexpr>w  s]       0G 0G4: 14CFN<Pb8Q8Q4R4R0S0S 0G 0G 0G 0G 0G 0Gr8   c              3  <   K   | ]}|j         t          j        uV  d S r   )rI  r   r   r  s     r6   r  z#TestHarness.doit.<locals>.<genexpr>z  sI       ,C ,C06 -3,?{GY,Y ,C ,C ,C ,C ,C ,Cr8   )r`  RuntimeError	get_testsr  r   r(  rebuild_depsrc  rx   r  rE   ro  r>  r_  minr  r_   rn   r  rr  rs  rangeextendr  r  r  r|  	run_testsr  )r   r  rebuild_only_testsry  runnersr  s   `    @r6   doitzTestHarness.doit]  s7   ; 	MKLLL  &*l&7?UUR 	1|& 	|DJYkmqmy  nD  0E  0E 	 HSMMMXXXXRWXXXXX%()C),Udl6I)I&K &K"9;;	HT\_%%%02G4<.// C COOOOOOOOOOO66,/ 0G 0G>E0G 0G 0G -G -GD) ), ,C ,C:A,C ,C ,C )C )CD% "'llDONN7###HXBHX'')))s   C	G# #G9r  T.Tuple[str, str]c                    d| v r;|                      dd          }t          |          dk    sJ |d         |d         fS | dfS )Nr  r	   rH   r   r9   )r^   r_   )r  r^   s     r6   split_suite_stringzTestHarness.split_suite_string  sN    %<<KKQ''Eu::????8U1X%%"9r8   r  rC  c                    |D ]g}t                               |          \  }}| j        D ]@}t                               |          \  }}|s
||k    r  dS |r||k    r4|r||k    r=  dS hdS NTF)r  r  r  )rU  r  r  	prj_matchst_matchprjstprjsts           r6   test_in_suiteszTestHarness.test_in_suites  s     	 	E$/$B$B5$I$I!Y  '::5AA	b    B)OO444  	!1!1 httt34 ur8   c                <   t                               || j        j                  rdS | j        j        r%t                               || j        j                  S | j        j        r7|                     |          }t                               ||j                  rdS dS r  )r  r  r  r}   ry   r   r  )r   rU  r   s      r6   test_suitablezTestHarness.test_suitable  s    %%dDL,GHH 	5<& 	Q --dDL4OPPP< 	''--E))$0DEE utr8   r  *T.Generator[TestSerialisation, None, None]c              #  B  K   i }| j         j        D ]<}d|v r+|                    dd          \  }}|dk    rd}|dk    rd}nd|}}d|||f<   =|D ]N}t          |          D ]<\  }}t	          |j        |          r"t	          |j        |          rd|||f<   |V   n=O|                                D ]k\  \  }}}|sa| d| }|D ]E}t	          |j        |          r.t	          |j        |          rt          j	        | d            nFt          | d	          ld
S )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	   )maxsplitr9   r   FTz( test name is redundant and was not usedz" test name does not match any testN)r  r   r^   ru   r   rB  r   r  r   warningr   )r   r  patternsrZ   subprojr   r  was_useds           r6   tests_from_argszTestHarness.tests_from_args  s      57<$ 	. 	.C czz #		#	 : :2::Db==!G #S(-Hgt_%% 	 	A "&h  1>733 8M8M 04Hgt_-GGGE)1)9)9 	U 	U%OWdX U ))4)) U UA q~w77 GAFD<Q<Q %U%U%UVVV
 )C)S)S)STTT	U 	Ur8   	errorfileT.Optional[T.IO]c                     j         st          d|           g S  fd j         D             } j        j        r"t	                               |                    } j        j        rS j        j        \  }}|t          |          k    r#t          d| dt          |           d          ||dz
  d |         }|st          d|           g S |S )	NzNo tests defined.)ro  c                >    g | ]}                     |          |S rF   )r  )r3   r  r   s     r6   r7   z)TestHarness.get_tests.<locals>.<listcomp>  s,    @@@q$*<*<Q*?*?@@@@r8   znumber of slices (z) exceeds number of tests (r   r	   zNo suitable tests defined.)	r  r   r  r   ru   r  slicer_   r   )r   r  r  	our_slicenslicess   `    r6   r  zTestHarness.get_tests  s    z 	%I6666I@@@@DJ@@@< 	6--e4455E< 	2!%!3IwU##$%k'%k%k^abg^h^h%k%k%klll)a-001E 	.Y????Ir8   c                B    | j         D ]}|                                 d S r   )ra  rN  r  s     r6   flush_logfileszTestHarness.flush_logfiles  s,     	 	AGGIIII	 	r8   c                6   | j         sd S | j                            t          | j         dz                        | j                            t	          | j         dz                        | j                            t          | j         dz   d                     d S )Nz
.junit.xmlz.jsonz.txtsurrogateescaper   )rd  ra  rz   r  r  r  r   s    r6   open_logfileszTestHarness.open_logfiles	  s      	FL):\)IJJKKK.t/@7/JKKLLL.t/@6/IRcdddeeeeer8   c                z    | j         r"| j        dg}| j        dk    r|g dz  }|dgz  }n| j        r| j        }ng }|S )Nr   r	   )-exr  r  quitz--args)rr   rs   rn   rv   )r  wraps     r6   r  zTestHarness.get_wrapper  sb    ; 		$i0D~!!5555XJDD_ 	?DDDr8   c                   t          | j                  dk    rm|j        rft                              |j        d                   d         }d                    d |j        D                       }|r|dz  }||z   dz   |j        z   S |j        S )Nr	   r   +c              3  V   K   | ]$}t                               |          d          V  %dS r
  )r  r  )r3   rO   s     r6   r  z/TestHarness.get_pretty_suite.<locals>.<genexpr>"  s5      RR!77::1=RRRRRRr8   r  z / )r_   r  r  r  r  r   r   )r   rU  rvrO   s       r6   r  zTestHarness.get_pretty_suite  s    t{aDJ//
1>>qABRRtzRRRRRA c	6E>DI--9r8   r  T.List[SingleTestRunner]c                B   	 |                                   t          j        dk    r%t          j        t          j                               t          j        |                     |                     |                                  d S # |                                  w xY w)Nwin32)	r  rE   r>   r  set_event_loop_policyWindowsProactorEventLoopPolicyr  
_run_testsr  )r   r  s     r6   r  zTestHarness.run_tests)  s    		"    |w&&-g.T.V.VWWWK00111!!!!!D!!!!s   A0B BrO   r   r   c                J    | j         D ]}|                    | |||           d S r   )ra  r[  )r   rU  rO   r   rd  s        r6   r[  zTestHarness.log_subtest5  s8     	. 	.AMM$a----	. 	.r8   c                F    | j         D ]}|                    | |           d S r   )ra  rY  )r   rU  rd  s      r6   r<  zTestHarness.log_start_test9  s4     	% 	%ALLt$$$$	% 	%r8   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 ]}|                                t          j
        dk    rt          j        d          t          j                    k    r!                    t          j        |           n                     t          j        |                               t          j        |           	 |D ]}|j        st'                     d {V  t          j         ||                    }                    |           |j        |<   |                    |           |j        st1          |           d {V   j        j        dk    r	 j        r nt'                     d {V  t          j
        dk    r>                    t          j                                       t          j                    j        D ]}|                                d {V  d S # t          j
        dk    r>                    t          j                                       t          j                    j        D ]}|                                d {V  w xY w)NF)r   rU  r  r:   ri   c                  K   4 d {V  sj         j        dk    rj        r	 d d d           d {V  d S |                                d {V }                    |           j         j        }|r.j        |k    r#|j                                        r
              d d d           d {V  d S # 1 d {V swxY w Y   d S rF  )r  rn   rX  r  r  maxfailr   r   )rU  r   r  cancel_all_testsinterruptedr   	semaphores      r6   run_testz(TestHarness._run_tests.<locals>.run_testE  s       ' ' ' ' ' ' ' ' 4<#6#:#:t#:' ' ' ' ' ' ' ' ' ' ' ' ' ' !HHTNN******((---,. 't'99cgnn>N>N9$$&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   B9A,B99
CCr-  r  c                    |                                  s|                                                      |            	 | = d S # t          $ r Y d S w xY wr   )r  rV   r  KeyError)r-  r  rv  s    r6   	test_donez)TestHarness._run_tests.<locals>.test_doneO  sg    ;;== 


NN1!!$$$   s    A 
AAwarnr;   c                                                    }                    |           | rA                                 t          j        d                    |                              |= |                                 d S )Nz CTRL-C detected, interrupting {})popleftrz   r  r   r  r   r  )r  r  r  rv  r   s     r6   cancel_one_testz/TestHarness._run_tests.<locals>.cancel_one_testX  s}    __&&FNN6""" _##%%%?FF}U[G\]]^^^f%MMOOOOOr8   c                 .    dr  d           d S d S r  rF   )r  r  rv  s   r6   r  z0TestHarness._run_tests.<locals>.cancel_all_testsa  s>    K '&&&   ' ' ' ' 'r8   c                 t    rd S                                   t          j        d                          d S )NzReceived SIGTERM, exiting)r  r   r  )r  r  r   s   r6   sigterm_handlerz/TestHarness._run_tests.<locals>.sigterm_handlerg  sH     !!!L4555r8   c                    rd S                                                                 t                    t          k    rId         d         z
  dk     r4                                 t          j        d                          d S r d           d S                                  t          j        d           dd S )Nr   r   r	   zCTRL-C detected, exitingT)rz   r  r_   	MAX_CTRLCr  r   r  )r  r  ctrlc_timesr  r  rv  r   s   r6   sigint_handlerz.TestHarness._run_tests.<locals>.sigint_handlern  s      tyy{{+++;9,,R;q>1QTU1U1U##%%%7888  """"" #%%%%%##%%%7888"r8   r  r   r	   )rU  r  r:   ri   )r-  r  r:   ri   )r  r;   r:   ri   rb  )r  	Semaphorer  r  r   r  r  ra  rT  rE   r>   r  getpgidgetpidadd_signal_handlerr   rD  r  r<  r  r  rz   r9  add_done_callbackr_  rn   rX  remove_signal_handlerr_  )r   r  r  r  r  r  rd  r  r  r  r  r   r  r  r  rv  r  s   `        @@@@@@@@r6   r  zTestHarness._run_tests=  s     %dl&@AA	+07757&+9&=&=&='))	' 	' 	' 	' 	' 	' 	' 	' 	'	 	 	 	 	 	 		 	 	 	 	 	 	 		' 	' 	' 	' 	' 	' 	' 	'	 	 	 	 	 	 	 		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#$  	 	AGGDMMMM<7""z!}}	++''~FFFF''GGG##FNODDD	%! 
 
) 0&w///////// .xx/?/?@@v&&&(.(;f%((333) +"6*********<&**t*Ew'''''''''|w&&**6=999**6>:::\ % %hhtnn$$$$$$$$% % |w&&**6=999**6>:::\ % %hhtnn$$$$$$$$%s   B<J A5K8)r  r  )r:   rj  rb  )r|  rP   r:   r  )r:   rQ  )r  r2  r  r2  r  r2  r:   ri   )rU  r  r:   r  )r  r  rU  r   r:   r;  )rU  r   r  rQ   r:   r  )rV   r0  r:   ri   r   )r  rQ   r:   rP   )r   r9   NNN)rV   r0  r   r;   ry  rQ   r  rP   r  r   r  r   r  r   r:   rP   r   )r  rP   r:   r  )rU  r   r  rC  r:   r;   )rU  r   r:   r;   )r  r  r:   r  r   )r  r  r:   r  )r  r  r:   rC  )rU  r   r:   rP   )r  r  r:   ri   )rU  r0  rO   rP   r   r   r:   ri   )rU  r0  r:   ri   )%r   r   r   rp  rl  rf  rg  rx  r  r  r  r  r  r  r  rh  r  ry  r  r   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r[  r<  r  rF   r8   r6   r  r  t  s       ' ' ' 'R# # # #      6         # # # #
	: 	: 	: 	:6 6 6 6": : : :       . ) ) ) X) # # # X#O O O O &''+)-(,. . . . .83 3 3 3$P P P P$* $* $* $*L    \    \>    3U 3U 3U 3Uj    (   f f f f    \   
" 
" 
" 
". . . .% % % %_% _% _% _% _% _%r8   r  thc                    |                      t          j                  }|D ]$}t          |                     |                     %| S )N)r  )r  rE   r  r   r  )r  r  r  s      r6   
list_testsr
    sM    LL3:L..E & &b!!!$$%%%%9r8   rc  rC  rx   r  r  c                   dfdt          |           dk    sJ t                      }|rt          j                            d          }t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t                      }i }	|D ]}
fd	|
d
         D             |	|
d         <    |D ]A}|j        D ]7}||v r|	                    |           |	                    |	|                    8Bn-|r|
                    d           n|
                    d           |sdS t          j        | dgz   t          |          z             j        }|dk    rt          d            dS dS )Nrx  rP   r:   c                    t           j                            |           } t           j        dk    r |                     t           j        d          } | S )Nr]   )r  rx  relpathr  rh  )rx  rx   s    r6   convert_path_to_targetz,rebuild_deps.<locals>.convert_path_to_target  s=    wtR((6S==<<,,Dr8   r   zmeson-info/intro-targets.jsonrk  )rm  c                &    g | ]} |          S rF   rF   )r3   r-  r  s     r6   r7   z rebuild_deps.<locals>.<listcomp>  s4     +- +- +- '&q))+- +- +-r8   ri  idzmeson-benchmark-prereqzmeson-test-prereqTrw   zCould not rebuild F)rx  rP   r:   rP   )r_   r  r  rx  r   rn  r  ru  dependsr  r  r  r  sortedr  r   )rc  rx   r  r  targetstargets_filefptargets_infor  intro_targetstargetr  dr{  r  s    `            @r6   r  r    s         u::>>>>%%G -w||B(GHH,111 	)R9R==L	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) "ee24" 	- 	-F+- +- +- +-
++- +- +-M&,''  	1 	1AY 1 1<<q!!!}Q/0000	1	1  	-KK01111KK+,,,  t
.$+fWoo=
>
>
IC
axx'2''(((u4s   B  BBr  r  c                   | j         s| j        rd| _        | j        r| j        rt          d           dS d }| j        r!d| _        | j        rt          d           dS d}| j        rd| _        | j        r| j        d         }|9t          |d          }|	                                st          d|           dS t          j        | j                  }t          j        d	|j        j        j                            t'          d
                              }t)          |           | j        s[|j        j        j                            t'          d                    }|dk    rd| _        n|dk    rt          d           d| _        t-          |           5 }	 | j        rt1          |          cd d d            S |                                cd d d            S # t4          $ rU}t          d           t6          j                            d          r|t          |           Y d }~d d d            dS d }~ww xY w# 1 swxY w Y   d S )Nr	   z3Can not be both quiet and verbose at the same time.Tz9Must not specify both a wrapper and gdb at the same time.rr   r   )silentz"Could not find requested program: r;   vsenvbackendnonerc  zEOnly ninja backend is supported to rebuild tests before running them.z!Meson test encountered an error:
MESON_FORCE_BACKTRACE)r  rt   r  r  r  r   rr   rv   r   r/  r
   ru  rx   rE  castr   coredataoptstoreget_value_forr   r   r(  r  ru   r
  r  r   r  r  r  )r  	check_binexer   
need_vsenvr  r  r{  s           r6   r  r    s    "G/ " ! 7= CDDDqI{ "? 	MNNN1	  'OA&	i555yy{{ 	DyDDEEE1
7:A 6 ? M MiX_N`N` a abbJ
 &-(1??	)@T@TUUf!%GYZZZ!%G	W		 
	| &!"~~        7799	       
  	 	 	6777z~~566 a111       
	         s<   H?G=G
H<'?H7&H?7H<<H??IIr   c                    t          j        d          }t          |           |                    |           }t	          |          S )Nz
meson test)prog)r`   ArgumentParserr   
parse_argsr  )r   rg   r  s      r6   run_with_argsr+  	  sB    $,777F&%%Gw<<r8   r   )rO   rP   r:   rQ   )rZ   rP   r:   r[   )rg   rh   r:   ri   )rO   rP   r:   ri   )r   rP   r   rP   r:   rP   )rO   rP   r   rP   r   rQ   r:   rP   )r   rQ   r:   rP   )r   r   r:   rP   )r  rP   r:   rP   )r  r  r:   rP   )r  r  r  r  rI  r   r:   rP   )r  rP   r:   r;   )r  r  r:   r  )r  r  r:   r  )r  r  r:   ri   r   )r  r  r  r  r:   ri   )r  r  r:   r;   )
rc  rC  rx   rP   r  r  r  r;   r:   r;   )r  r  r:   rQ   )r   rC  r:   rQ   )|
__future__r   pathlibr   collectionsr   
contextlibr   r  r   r   r`   r  r  enumr  r  r  r>   r  rG  r   r  shlexrE   r  typingrE  rS   xml.etree.ElementTreeetreer*  r  r9   r
   r   r   r!  r   r   r   r  mesonlibr   r   r   r   r   r   r   r   r  r   programsr   backend.backendsr   r   TYPE_CHECKINGUnionTYPE_TAPResultr\  rn  r  r/   r   
maxunicoder  UNENCODABLE_XML_CHR_RANGESrH  r   r  r  r  rB   rG   rU   rY   rf   r   r   r   r   r   r   quoter   r   uniqueEnumr   r   r   rL  rg  rs  r  r  r  r0  rl  r1  EXITCODErr  rQ  r}  TAPr  RUSTr  r   r  r  r  r  r_  r  r  r  r  r
  r  r  r+  rF   r8   r6   <module>rC     s  
 # " " " " " "                                    				    				       



          " " " " " " " " "                   J J J J J J J J 1 1 1 1 1 1/ / / / / / / / / / / / / / / / / / / /       % % % % % % = = = = = = = =? 2W 1 2N     	66 66 66  6 6 6 6 >W"" $2 $2 $2 3 3 3 edLcddd $"*TBGG4N,O,O%ORV%VWW rz>??"*>??! ! ! !$ $ $ $ !!!DD       25U 5U 5U 5Un      - - - -C C C C4 $/; . . . .z|| {HF F F F	 	 	 	 	N 	 	 	 	 	 	 	 	$) 	 	 	 /* /* /* /* /* /* /* /*dz@ z@ z@ z@ z@ z@ z@ z@x       .    Z   \! \! \! \! \!J \! \! \!~ 6  6  6  6  6  6  6  6F4 4 4 4 4 4 4 4"QB QB QB QB QB: QB QB QBhD D D D D D D DN    g    4C ,/ 0    ?   ( 1= ,, -3 3 3 3 3 3 3 3j /9 ,* ++ + + + +' + + +Z 0; ,+ ,I I I I< < < <" " " "6H H H H
 
 
 
       CG    Bm, m, m, m, m, m, m, m,^I I I I I I I IXh% h% h% h% h% h% h% h%T   + + + +Z5 5 5 5n     r8   