
ŝYY                 @   sQ  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z d  d l m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l j Z d  d l Z d  d l Z d  d l Z d Z d d	   Z d
 d   Z d d   Z e j   Z e j d d d d d d e d d e j d d d d d d d e j d d d d d d d d d e j d d d d d d d d d  e j d! d d d d" d e  j d d# e j d$ d d% d d& d d' e j d( d g  d d) d d* d+ d, d d- e j d. d g  d d/ d d* d+ d, d d0 e j d1 d d2 d d3 d d4 d d5 e j d6 d d d d d d7 e j d8 d d d d d d9 e j d: d d; d d< e j d= d e   d e d d> e j d? d@ d d d d d dA e j dB dC d d d d d dD e j dE dF d e  d d d dG e j dH d d d dI d dJ e j dK d g  d e  j d dL e j dM dN dO d dP GdQ dR   dR e j!  Z" GdS dT   dT  Z# dU dV   Z$ dW dX   Z% dY dZ   Z& Gd[ d\   d\  Z' d] d^   Z( d_ d`   Z) da db   Z* dc dd   Z+ d S)e    N)build)environment)ExternalProgram)mesonlib)mlogM   c              C   s(   t  j   j   }  |  d k p' d |  k S)Nwindowsmingw)platformsystemlower)platname r   L/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/mtest.py
is_windows$   s    r   c              C   s   t  j   j   }  d |  k S)Ncygwin)r
   r   r   )r   r   r   r   	is_cygwin(   s    r   c              C   s   d }  |  t  j k rX y t t  j |   } Wq t k
 rT t d |   d } Yq Xn+ y t j   } Wn t k
 r d } Yn X| S)NZMESON_TESTTHREADSz$Invalid value in %s, using 1 thread.   )osenvironint
ValueErrorprintmultiprocessing	cpu_count	Exception)varnameZnum_workersr   r   r   determine_worker_count,   s    r   z--repeatdefaultr   destrepeattypehelpz!Number of times to run the tests.z--no-rebuildFaction
store_truez$Do not rebuild before running tests.z--gdbgdbzRun test under gdb.z--listlistzList available tests.z	--wrapperwrapperz)wrapper to run tests with (e.g. Valgrind)z-C.wdz#directory to cd into before runningz--suiteinclude_suitesappendmetavarZSUITEz,Only run tests belonging to the given suite.z
--no-suiteexclude_suitesz.Do not run tests belonging to the given suite.z--no-stdsplitTsplitstore_falsez,Do not split stderr and stdout in test logs.z--print-errorlogsz%Whether to print failing tests' logs.z--benchmarkz Run benchmarks instead of tests.z	--logbaseZtestlogzBase name for log file.z--num-processesz#How many parallel processes to use.z-vz	--verbosez!Do not redirect stdout and stderrz-qz--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.z--setupsetupzWhich test setup to use.z--test-argsz7Arguments to pass to the specified test(s) or all testsargsnargs*zOptional list of tests to runc               @   s   e  Z d  Z d S)TestExceptionN)__name__
__module____qualname__r   r   r   r   r4   h   s   r4   c               @   s(   e  Z d  Z d d   Z d d   Z d S)TestRunc	       	      C   sL   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S)N)res
returncodedurationstdostdecmdenvshould_fail)	selfr9   r:   r@   r;   r<   r=   r>   r?   r   r   r   __init__m   s    							zTestRun.__init__c             C   s   d } |  j  d  k r" | d 7} n? | d d j d d   |  j j   D  d j |  j   f 7} |  j r | d 7} | |  j 7} n  |  j r | d d   d
 k r | d
 7} n  | d 7} | |  j 7} n  | d d   d
 k r | d
 7} n  | d 7} | S)Nz--- command ---
zNONE
z%s%s
 c             S   s&   g  |  ] \ } } d  | | f  q S)z%s='%s' r   ).0kvr   r   r   
<listcomp>}   s   	 z#TestRun.get_log.<locals>.<listcomp> z--- stdout ---
r   
z--- stderr ---
z	-------

rJ   )r>   joinr?   itemsr<   r=   )rA   r9   r   r   r   get_logx   s     ?	
	

zTestRun.get_logN)r5   r6   r7   rB   rM   r   r   r   r   r8   l   s   r8   c             C   sM   |  d  k r d Sy |  j  d  SWn% t k
 rH |  j  d d d SYn Xd  S)NrC   zutf-8z
iso-8859-1errorsignore)decodeUnicodeDecodeError)streamr   r   r   rP      s    rP   c             C   s   i | d 6| j  d 6| j d 6| j d 6| j d 6| j d 6} t | j t  ra | j | d <n | j j t	 j
  | d <| j r | j | d <n  |  j t j |  d	  d  S)
Nnamestdoutresultr;   r:   commandr?   stderrrI   )r<   r9   r;   r:   r>   
isinstancer?   dictget_envr   r   r=   writejsondumps)jsonlogfileZ	test_namerU   Zjresultr   r   r   write_json_log   s    




	r_   c             C   s*   |  j  d  r& t   p t   r& d Sd S)Nz.exeTF)endswithr   r   )fnamer   r   r   run_with_mono   s    "rb   c               @   s  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	 e
 d 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! d"   Z d# d$   Z d% d&   Z d' d(   Z d) S)*TestHarnessc             C   s   | |  _  g  |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d  |  _ d  |  _ d  |  _	 d  |  _
 d  |  _ |  j  j r t j j | j d d  } n t j j | j d d  } t j j |  s t d | j   n  |  j |  d  S)Nr   Fzmeson-privatezmeson_benchmark_setup.datzmeson_test_setup.datz9Directory %s does not seem to be a Meson build directory.)optionscollected_logs
fail_countsuccess_count
skip_counttimeout_countis_runtestssuiteslogfilenamelogfiler^   	benchmarkr   pathrK   r)   isfiler4   load_datafile)rA   rd   datafiler   r   r   rB      s$    												zTestHarness.__init__c             C   s6   |  j  r |  j  j   n  |  j r2 |  j j   n  d  S)N)rn   closer^   )rA   r   r   r   __del__   s    		zTestHarness.__del__c             C   sW  | j  d j d  r, d d g | j  } np | j r\ t | j  d  r\ d g | j  } n@ | j r | j d  k r} d  } q | j g | j  } n	 | j  } | d  k r d } d } d } d  } t } nc| | | j |  j j } t	 j	   }	 t
 j j   }
 |
 j |  j j j |
   t | j t j  rH| j j |
  | _ n  |
 j | j  t | j  d k r|
 d	 t
 j j d
 g | j  7<n  d |
 k s|
 d rt t j d d   |
 d <n  d  } d  } d  } |  j j s0t j } |  j r|  j j rt j n t j } t    s0t
 j! } q0n  t j" | d | d | d |
 d | j# d | } d } | j$ d  k r~d  } n | j$ |  j j% } y | j& d |  \ } } Wn t j' k
 rR|  j j rt( d | j) | f  n  d } t    rt j* d d d d t | j+  g  n t
 j, t
 j- | j+  t. j/  | j&   \ } } Yn Xt	 j	   } | |	 } t0 |  } | rt0 |  } n  | rd } |  j1 d 7_1 |  j2 d 7_2 nl | j3 t k rd } |  j4 d 7_4 nE | j5 t6 | j3  k rd } |  j7 d 7_7 n d } |  j2 d 7_2 | j3 } t8 | | | j5 | | | | | j  } | S)Nr   z.jarjavaz-jarmonoSKIPg        z8Not run because can not execute cross compiled binaries.PATHrC   ZMALLOC_PERTURB_r      rT   rW   r?   cwd
preexec_fnFtimeoutz%s time out (After %d seconds)TZtaskkillz/Fz/Tz/PIDTIMEOUTOKFAIL)9ra   r`   is_crossrb   Z
exe_runnerGNU_SKIP_RETURNCODEcmd_argsrd   Z	test_argstimer   r   copyupdate
global_envrZ   rX   r?   r   EnvironmentVariableslenZextra_pathspathseprK   strrandomrandintverbose
subprocessPIPEr.   STDOUTr   setsidPopenworkdirr}   timeout_multipliercommunicateTimeoutExpiredr   rS   callpidkillpggetpgidsignalSIGKILLrP   ri   rf   r:   rh   r@   boolrg   r8   )rA   wraptestr>   r9   r;   r<   r=   r:   Z	starttime	child_envr   rT   rW   pZ	timed_outr}   endtimerU   r   r   r   run_single_test   s    				'	'					(
	'zTestHarness.run_single_testc             C   s  d | t  d | d  } d | | d t  |  f } d d t  |  } d d t  | j  }	 d | | | | j |	 | j f }
 |  j j s | j d k r5| j d k r(t j r(| j d	 k s | j d
 k r t j } n( | j d k r t j } n t	 j
 d  t | |
  j d   q5t |
  n  |
 d | j   7}
 | j t k r| j d k | j k r|  j j r|  j j |
  qn  |  j r|  j j |
  n  |  j rt |  j | |  n  d  S)NrH   z%dr   z%s%d/%d&      z%s %s  %s%s%s%5.2f sr   r   r~   rx   z*Unreachable code was ... well ... reached.Tz

r   )r   r9   r;   rd   quietr   colorize_consoleredyellowsysexitr   get_textrM   r:   r   r@   Zprint_errorlogsre   r+   rn   r[   r^   r_   )rA   numlenrk   rS   rU   iZstartpadnumZpadding1Zpadding2Z
result_strZ	decoratorr   r   r   print_stats'  s0    		zTestHarness.print_statsc             C   sL   d |  j  |  j |  j |  j f } t |  |  j rH |  j j |  n  d  S)Nz5
OK:      %4d
FAIL:    %4d
SKIP:    %4d
TIMEOUT: %4d
)rg   rf   rh   ri   r   rn   r[   )rA   msgr   r   r   print_summaryC  s    "
	zTestHarness.print_summaryc             C   s   t  |  j  d k r t  |  j  d k r7 t d  n
 t d  x |  j d  d  D]y } | j   } t  |  d k r t d j | d d    t d  | d
 d   } n  x | D] } t |  q WqU Wn  d  S)Nr   
   z(
The output from 10 first failed tests:
z#
The output from the failed tests:
h   rI      z8--- Listing only the last 100 lines from a long log. ---d   i)r   re   r   
splitlinesrK   )rA   loglinesliner   r   r   print_collected_logsN  s    

z TestHarness.print_collected_logsc             C   sn   |  j  r t d   n  t j j |  j  s; t d  d Sd |  _  |  j   } | sZ d S|  j |  |  j	 S)Nz*Test harness object can only be used once.zUTest data file. Probably this means that you did not run this in the build directory.r   Tr   )
rj   RuntimeErrorr   rp   rq   rs   r   	get_tests	run_testsrf   )rA   rk   r   r   r   doit]  s    	
	zTestHarness.doitc             C   s*   d |  k r |  j  d d  S|  d f Sd  S)N:r   rC   )r.   )suiter   r   r   split_suite_stringj  s    zTestHarness.split_suite_stringc             C   s   x} | D]u } t  j |  \ } } xW |  j D]L } t  j |  \ } } | r_ | | k r_ q, n  | rw | | k rw q, n  d SWq Wd S)NTF)rc   r   r   )r   rl   r   Z	prj_matchZst_matchZprjstZprjstr   r   r   test_in_suitesq  s    	zTestHarness.test_in_suitesc             C   s<   |  j  j s% t j | |  j  j  o; t j | |  j  j  S)N)rd   r*   rc   r   r-   )rA   r   r   r   r   test_suitable~  s    %zTestHarness.test_suitablec             C   sQ   t    } x2 |  j D]' } x | j D] } | j |  q# Wq Wt |  |  _ d  S)N)setrk   r   addr&   rl   )rA   sstsr   r   r   load_suites  s
    	zTestHarness.load_suitesc          	   C   s1   t  |  j d   } t j |  |  _ Wd  QXd  S)Nrb)openrs   pickleloadrk   )rA   fr   r   r   
load_tests  s    zTestHarness.load_testsc             C   s!   | |  _  |  j   |  j   d  S)N)rs   r   r   )rA   rs   r   r   r   rr     s    	
zTestHarness.load_datafilec                s     j  s t d  g  St   j j  s; t   j j  rw g  } x<   j  D]% }   j |  rK | j |  qK qK Wn	   j  }   j j r   f d d   | D } n  | s t d  g  Sx | D] } d | _	 q W| S)NzNo tests defined.c                s+   g  |  ]! } | j    j j k r |  q Sr   )rS   rd   r1   )rD   r   )rA   r   r   rG     s   	 z)TestHarness.get_tests.<locals>.<listcomp>zNo suitable tests defined.F)
rk   r   r   rd   r*   r-   r   r+   r1   Zrebuilt)rA   rk   Ztstr   r   )rA   r   r     s"    	
$	
zTestHarness.get_testsc             C   s  |  j  j s |  j  j r d Sd  } t j j |  j  j d |  j  j  } |  j  j rv t j j |  j	   d  d } n |  j  j
 r |  j  j
 } n  | r | d | j d d  7} n  | d |  _ | d |  _ t |  j d	  |  _ t |  j d	  |  _ |  j j d
 t j j   j    d  S)Nz
meson-logsr   r   -rH   _z.txtz.jsonwz#Log of Meson test suite run on %s

)NNNN)rd   Zlogbaser   r   rp   rK   r)   r'   r.   get_wrapperr0   replacerm   Zjsonlogfilenamer   r^   rn   r[   datetimenow	isoformat)rA   ZnamebaseZlogfile_baser   r   r   open_log_files  s     $#zTestHarness.open_log_filesc             C   s   g  } |  j  j r\ d d d g } |  j  j d k rL | d d d d g 7} n  | d g 7} n  |  j  j r{ | |  j  j 7} n  t | t  s t  | S)	Nr%   z--quietz--nhr   z-exrunquitz--args)rd   r%   r    r'   rX   r&   AssertionError)rA   r   r   r   r   r     s    zTestHarness.get_wrapperc             C   s   t  |  j  d k rz t j | j d  d } d j d d   | j D  } t  |  rg | d 7} n  | | d | j S| j Sd  S)Nr   r   +c             s   s"   |  ] } t  j |  d  Vq d S)r   N)rc   r   )rD   r   r   r   r   	<genexpr>  s    z/TestHarness.get_pretty_suite.<locals>.<genexpr>r   z / )r   rl   rc   r   r   rK   rS   )rA   r   rvr   r   r   r   get_pretty_suite  s    zTestHarness.get_pretty_suitec             C   s  d  } g  } t  d t  |   } |  j   |  j   } xHt |  j j  D]4} xt |  D] \ } } |  j |  }	 |  j j r d  | _	 n  | j
 s |  j j r |  j |  g  } |  j | |  }
 |  j | | |	 |
 |  nU | s	t j d |  j j  } n  | j |  j | |  } | j | | | |	 | f  |  j j d k r^ |  j r^ Pq^ q^ W|  j j d k rK |  j rK PqK qK W|  j |  |  j   |  j   |  j rt d |  j  n  d  S)Nz%dZmax_workersr   zFull log written to %s)r   r   r   rangerd   r    	enumerater   r%   r}   is_paralleldrain_futuresr   r   concZThreadPoolExecutornum_processesZsubmitr+   rf   r   r   rm   r   )rA   rk   Zexecutorfuturesr   r   r   r   r   Zvisible_namer9   r   r   r   r   r     s8    


	zTestHarness.run_testsc             C   s   x | D]{ } | \ } } } } } |  j  j d k rJ |  j rJ | j   n  |  j  j rc | j   n  |  j | | | | j   |  q Wd  S)Nr   )rd   r    rf   cancelr   rU   r   )rA   r   r   rU   r   rk   rS   r   r   r   r     s    zTestHarness.drain_futuresc             C   sB   |  j  r t d   n  |  j   } | s. d S|  j |  |  j S)zETests run by the user, usually something like "under gdb 1000 times".z)Can not use run_special after a full run.r   )rj   r   r   r   rf   )rA   rk   r   r   r   run_special  s    	zTestHarness.run_specialN)r5   r6   r7   rB   ru   r   r   r   r   r   staticmethodr   r   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   rc      s(   d
$	rc   c             C   s4   |  j    } x! | D] } t |  j |   q Wd  S)N)r   r   r   )thrk   r   r   r   r   
list_tests  s    r   c          	   C   s  t  j j |  j d  } t | d   } t j |  } Wd  QX| j } |  j | k rn t	 j
 d |  j  n  | |  j } |  j s | j |  _ n  |  j d  k r | j |  _ n  |  j d  k	 r | j d  k	 r t	 j
 d  n  |  j d  k r | j |  _ n  | j S)Nzmeson-private/build.datr   zUnknown test setup: %szBConflict: both test setup and command line specify an exe wrapper.)r   rp   rK   r)   r   r   r   test_setupsr0   r   r   r%   r   r'   exe_wrapperr?   )rd   	buildfiler   r   Zsetupscurrentr   r   r   merge_suite_options  s     		r   c             C   s   t  j j t  j j |  d   s/ t d  d St j   } | sO t d  d St j | d |  g  } | j	   | j
 d k r t d  d Sd S)	Nzbuild.ninjazEOnly ninja backend is supported to rebuild tests before running them.Tz%Can't find ninja, can't rebuild test.Fz-Cr   zCould not rebuild)r   rp   rq   rK   r   r   detect_ninjar   r   r   r:   )r)   ninjar   r   r   r   rebuild_all*  s    !



r   c             C   s  t  j |   } | j r$ d | _ n  | j d  k	 rB t |  } n' t j   } | j d  k ri d | _ n  t	 | d |  | j
 r | j r t d  d Sd  } | j r d | _
 | j r t d  d Sd } n  | j r | j d } n  | d  k	 r+t | d d } | j   s+t j d	 |  q+n  t j j | j  | _ | j ry| j ryt | j  syt j d  qyn  yD t |  } | j rt |  d S| j s| j   S| j   SWn= t k
 r} z t d
  t |  d SWYd  d  } ~ Xn Xd  S)Nr   r   z3Can not be both quiet and verbose at the same time.Tz9Must not specify both a wrapper and gdb at the same time.r%   r   silentz$Could not find requested program: %sz Mesontest encountered an error:
rJ   ) parser
parse_argsro   r   r0   r   r   r   r   setattrr   r   r   r%   r'   r   foundr   r   r   rp   abspathr)   r&   Z
no_rebuildr   rc   r   r1   r   r   r4   )r1   rd   r   Z	check_binexer   er   r   r   r   =  sR    	
			
			
	


r   ),shlexr   r   r   argparser   
mesonbuildr   r   Zmesonbuild.dependenciesr   r   r   r   r   r   r\   Zconcurrent.futuresr   r   r
   r   r   r   r   r   r   ArgumentParserr   add_argumentr   r.   floatMesonExceptionr4   r8   rP   r_   rb   rc   r   r   r   r   r   r   r   r   <module>   s   00!$$ k