B
    `=                 @   sf  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Z d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZ dZeekstdZeekstdZe edoe ed	Z!d
d Z"dd Z#dd Z$dd Z%G dd dZ&e 'ddZ(G dd de)Z*G dd dej+Z,dd Z-G dd dZ.dd Z/dS )     N)support)runtestINTERRUPTEDCHILD_ERRORPROGRESS_MIN_TIMEformat_test_result
TestResult	is_failedTIMEOUT)setup_tests)format_durationprint_warningg      >@g     r@setsidkillpgc             C   s&   | j tkrdS |jr"t| |r"dS dS )NTF)resultr   Zfailfastr	   )r   ns r   1/usr/lib/python3.7/test/libregrtest/runtest_mp.py	must_stop&   s
    
r   c             C   s"   t | \}}tjf |}||fS )N)jsonloadstypesSimpleNamespace)worker_argsns_dict	test_namer   r   r   r   parse_worker_args.   s    r   c             C   sp   t |}|| f}t|}tjft dddd|f}i }trFd|d< tj	|ftj
tj
dtjdktjd|S )	Nz-uz-mztest.regrtestz--worker-argsTZstart_new_sessionnt)stdoutstderrZuniversal_newlinesZ	close_fdscwd)varsr   dumpssys
executabler   Zargs_from_interpreter_flagsUSE_PROCESS_GROUP
subprocessPopenPIPEosnameZSAVEDCWD)Ztestnamer   r   r   cmdkwr   r   r   run_test_in_subprocess4   s"    

r-   c             C   s<   t |  t| |}t  ttt|dd td d S )NT)flushr   )r   r   printr   r"   listr#   exit)r   r   r   r   r   r   run_tests_workerM   s
    
r2   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.c             C   s   t  | _|| _d S )N)	threadingZLocklock
tests_iter)selfr6   r   r   r   __init__^   s    
zMultiprocessIterator.__init__c             C   s   | S )Nr   )r7   r   r   r   __iter__b   s    zMultiprocessIterator.__iter__c          	   C   s*   | j  | jd krtt| jS Q R X d S )N)r5   r6   StopIterationnext)r7   r   r   r   __next__e   s    
zMultiprocessIterator.__next__c          	   C   s   | j  d | _W d Q R X d S )N)r5   r6   )r7   r   r   r   stopk   s    zMultiprocessIterator.stopN)__name__
__module____qualname____doc__r8   r9   r<   r=   r   r   r   r   r3   Z   s
   r3   MultiprocessResultzresult stdout stderr error_msgc               @   s   e Zd ZdS )
ExitThreadN)r>   r?   r@   r   r   r   r   rC   s   s   rC   c                   sf   e Zd Z fddZdd Zdd Zdd ZdddZdd Zdd Z	dd Z
dd Zdd Z  ZS )TestWorkerProcessc                sZ   t    || _|j| _|j| _|j| _|j| _|j| _d | _	d | _
d | _d| _d| _d S )NF)superr8   	worker_idpendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)r7   rF   Zrunner)	__class__r   r   r8   x   s    
zTestWorkerProcess.__init__c             C   s   d| j  g}|  r"|d n
|d | j}|rF|d|  | j}|d k	rt | j }|d| jj	 dt
| f dd| S )	NzTestWorkerProcess #runningZstoppedztest=zpid=ztime=z<%s> )rF   is_aliveappendrL   rN   time	monotonicrM   extendpidr   join)r7   infotestpopendtr   r   r   __repr__   s    
zTestWorkerProcess.__repr__c          
   C   s   | j }|d krd S | jrd S d| _tr2|  d}n|  }td| tjdd y"trft|jt	j
 n|  W nH tk
r   Y n6 tk
r } ztd| d| W d d }~X Y nX d S )NTz process groupzKill )filer.   zFailed to kill z: )rN   rO   r%   r/   r#   r   r)   r   rY   signalSIGKILLkillProcessLookupErrorOSErrorr   )r7   r]   Zwhatexcr   r   r   _kill   s$    zTestWorkerProcess._killc             C   s   d| _ |   d S )NT)rP   rg   )r7   r   r   r   r=      s    zTestWorkerProcess.stop Nc             C   s*   t  | j }t|||d }t||||S )N)rV   rW   rM   r   rB   )r7   r   Z
error_typer   r   err_msg	test_timer   r   r   r   mp_result_error   s    z!TestWorkerProcess.mp_result_errorc             C   s"  t  | _|| _yt|| j}d| _|| _W n   d | _ Y nX zy| jrX| 	  t
y(|j| jd\}}|j}|d k	s~tW nR tjk
r   | jrt
| 	  d }d }}Y n0 tk
r   | jrt
 Y nX | }| }|||fS    | 	   Y nX W d |   d | _d | _X d S )NF)rJ   rh   )rV   rW   rM   rL   r-   r   rO   rN   rP   rg   rC   ZcommunicaterJ   
returncodeAssertionErrorr&   TimeoutExpiredre   striprstrip_wait_completed)r7   r   r]   r   r   retcoder   r   r   _run_process   sH    


zTestWorkerProcess._run_processc       	   
   C   s   |  |\}}}|d kr(| |t||S d }|dkr>d| }nd|d\}}}| }|s`d}nByt|}t| }W n* tk
r } zd| }W d d }~X Y nX |d k	r| |t	|||S t
||||S )Nr   zExit code %s
zFailed to parse worker stdoutzFailed to parse worker JSON: %s)rs   rk   r
   
rpartitionrp   r   r   r   	Exceptionr   rB   )	r7   r   rr   r   r   ri   _r   rf   r   r   r   _runtest   s&    


zTestWorkerProcess._runtestc             C   s   x| j syTyt| j}W n tk
r.   P Y nX | |}| jd|f t|j| j	rZP W q t
k
rr   P Y q tk
r   | jdt f P Y qX qW d S )NFT)rP   r;   rG   r:   rx   rH   Zputr   r   r   rC   BaseException	traceback
format_exc)r7   r   	mp_resultr   r   r   run  s    
zTestWorkerProcess.runc          
   C   st   | j }|j  |j  y|t W nF tjtfk
rn } z"t	d|  dt
t d| W d d }~X Y nX d S )NzFailed to wait for z completion (timeout=z): )rN   r   closer   waitJOIN_TIMEOUTr&   rn   re   r   r   )r7   r]   rf   r   r   r   rq   '  s    

z!TestWorkerProcess._wait_completedc             C   sh   xb|  d |  sP t | }| jd|  dt|  |tkrtd|  dt|  P qW d S )Ng      ?zWaiting for z thread for zFailed to join z in )	rZ   rT   rV   rW   rK   logr   r   r   )r7   rM   r^   r   r   r   wait_stopped6  s    
zTestWorkerProcess.wait_stopped)rh   rh   N)r>   r?   r@   r8   r_   rg   r=   rk   rs   rx   r}   rq   r   __classcell__r   r   )rQ   r   rD   w   s    
;rD   c             C   sR   g }xH| D ]@}|j }|sq
t |j }|tkr
d|t|f }|| q
W |S )Nz%s (%s))rL   rV   rW   rM   r   r   rU   )workersrR   workerrL   r^   textr   r   r   get_runningN  s    
r   c               @   sD   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 )MultiprocessTestRunnerc             C   sj   || _ | j j| _|j| _t | _t| j j| _| jj	d k	rZt
| jj	d | jj	d | _nd | _d | _d S )Ng      ?i,  )rK   r   r   queueZQueuerH   r3   ZtestsrG   rJ   minrI   r   )r7   rK   r   r   r   r8   \  s    

zMultiprocessTestRunner.__init__c                s    fddt d jjd D  _dt j d} jjrZ|dt jjt jf 7 } | x jD ]}|	  qlW d S )Nc                s   g | ]}t | qS r   )rD   ).0index)r7   r   r   
<listcomp>m  s   z8MultiprocessTestRunner.start_workers.<locals>.<listcomp>   zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s))
ranger   Zuse_mpr   lenrJ   r   rI   r   start)r7   msgr   r   )r7   r   start_workersl  s    


z$MultiprocessTestRunner.start_workersc             C   s>   t  }x| jD ]}|  qW x| jD ]}|| q(W d S )N)rV   rW   r   r=   r   )r7   rM   r   r   r   r   stop_workersx  s
    z#MultiprocessTestRunner.stop_workersc             C   s   t dd | jD s:y| jjddS  tjk
r8   d S X | jjd k	}t}xf|r^t	j
tdd y| jj|dS  tjk
r   Y nX t| j}|rL| jjsL| dd|  qLW d S )	Nc             s   s   | ]}|  V  qd S )N)rT   )r   r   r   r   r   	<genexpr>  s    z5MultiprocessTestRunner._get_result.<locals>.<genexpr>r   )rJ   T)r1   zrunning: %sz, )anyr   rH   getr   ZEmptyr   rJ   PROGRESS_UPDATEfaulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTr   pgor   rZ   )r7   Zuse_faulthandlerrJ   rR   r   r   r   _get_result  s$    
z"MultiprocessTestRunner._get_resultc             C   s   |j }t|}|jd k	r(|d|j 7 }n$|jtkrL| jjsL|dt|j 7 }t| j	}|rt| jjst|dd
| 7 }| j| j| d S )Nz (%s)z -- running: %sz, )r   r   Z	error_msgrj   r   r   r   r   r   r   rZ   rK   Zdisplay_progress
test_index)r7   r|   r   r   rR   r   r   r   display_result  s    

z%MultiprocessTestRunner.display_resultc             C   s   |d r"|d }t d|  dS |  jd7  _|d }| j|j | | |jrdt|jdd |jr| j	j
st|jtjdd t|j| j	rdS dS )Nr   r   zregrtest worker thread failed: T)r.   )r`   r.   F)r   r   rK   Zaccumulate_resultr   r   r   r/   r   r   r   r#   r   )r7   itemr{   r|   r   r   r   _process_result  s    
z&MultiprocessTestRunner._process_resultc             C   s   |    d| _zTy,x&|  }|d kr&P | |}|rP qW W n" tk
r^   t  d| j_Y nX W d | jj	d k	rxt
  | j  |   X d S )Nr   T)r   r   r   r   KeyboardInterruptr/   rK   Zinterruptedr   rJ   r   Zcancel_dump_traceback_laterrG   r=   r   )r7   r   r=   r   r   r   	run_tests  s"    


z MultiprocessTestRunner.run_testsN)
r>   r?   r@   r8   r   r   r   r   r   r   r   r   r   r   r   [  s   r   c             C   s   t |   d S )N)r   r   )rK   r   r   r   run_tests_multiprocess  s    r   )0collectionsr   r   r)   r   ra   r&   r#   r4   rV   rz   r   r\   r   Ztest.libregrtest.runtestr   r   r   r   r   r   r	   r
   Ztest.libregrtest.setupr   Ztest.libregrtest.utilsr   r   r   rm   r   r   hasattrr%   r   r   r-   r2   r3   
namedtuplerB   rv   rC   ZThreadrD   r   r   r   r   r   r   r   <module>   sD   ( X|