U
    g=                     @   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.8/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
    
r4   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 r   )	threadingZLocklock
tests_iter)selfr8   r   r   r   __init__^   s    
zMultiprocessIterator.__init__c                 C   s   | S r   r   r9   r   r   r   __iter__b   s    zMultiprocessIterator.__iter__c              
   C   s6   | j & | jd krtt| jW  5 Q R  S Q R X d S r   )r7   r8   StopIterationnextr;   r   r   r   __next__e   s    
zMultiprocessIterator.__next__c              	   C   s   | j  d | _W 5 Q R X d S r   )r7   r8   r;   r   r   r   stopk   s    zMultiprocessIterator.stopN)__name__
__module____qualname____doc__r:   r<   r?   r@   r   r   r   r   r5   Z   s
   r5   MultiprocessResultzresult stdout stderr error_msgc                   @   s   e Zd ZdS )
ExitThreadN)rA   rB   rC   r   r   r   r   rF   s   s   rF   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)superr:   	worker_idpendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)r9   rI   Zrunner	__class__r   r   r:   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> )rI   is_aliveappendrO   rQ   time	monotonicrP   extendpidr   join)r9   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 z"trft|jt	j
 n|  W nH tk
r   Y n6 tk
r } ztd| d| W 5 d }~X Y nX d S )NTz process groupzKill filer0   zFailed to kill z: )rQ   rR   r&   r1   r$   r    r*   r   r]   signalSIGKILLkillProcessLookupErrorOSErrorr   )r9   ra   Zwhatexcr   r   r   _kill   s$    zTestWorkerProcess._killc                 C   s   d| _ |   d S )NT)rS   rl   r;   r   r   r   r@      s    zTestWorkerProcess.stop Nc                 C   s*   t  | j }t|||d }t||||S r   )rZ   r[   rP   r   rE   )r9   r   Z
error_typer   r    err_msg	test_timer   r   r   r   mp_result_error   s    z!TestWorkerProcess.mp_result_errorc                 C   s(  t  | _|| _zt|| j}d| _|| _W n   d | _ Y nX zz| j	rX| 
  tz(|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W W S    | 
   Y nX W 5 |   d | _d | _X d S )NFrM   rm   )rZ   r[   rP   rO   r.   r   rR   rQ   _wait_completedrS   rl   rF   ZcommunicaterM   
returncodeAssertionErrorr'   TimeoutExpiredrj   striprstrip)r9   r   ra   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}nBzt|}t| }W n* tk
r } zd| }W 5 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)ry   rp   r
   
rpartitionrw   r   r   r   	Exceptionr   rE   )	r9   r   rx   r   r    rn   _r   rk   r   r   r   _runtest   s,    

  zTestWorkerProcess._runtestc                 C   s   | j szZzt| j}W n tk
r0   Y W qY nX | |}| jd|f t|j| j	r^W qW q  t
k
rx   Y qY q  tk
r   | jdt f Y qY q X q d S )NFT)rS   r>   rJ   r=   r~   rK   Zputr   r   r   rF   BaseException	traceback
format_exc)r9   r   	mp_resultr   r   r   run  s    
zTestWorkerProcess.runc              
   C   st   | j }|j  |j  z|t W nF tjtfk
rn } z"t	d|  dt
t d| W 5 d }~X Y nX d S )NzFailed to wait for z completion (timeout=z): )rQ   r   closer    waitJOIN_TIMEOUTr'   ru   rj   r   r   )r9   ra   rk   r   r   r   rr   '  s    

z!TestWorkerProcess._wait_completedc                 C   sd   |  d |  sq`t | }| jd|  dt|  |tkr td|  dt|  q`q d S )Ng      ?zWaiting for z thread for zFailed to join z in )	r^   rX   rZ   r[   rN   logr   r   r   )r9   rP   rb   r   r   r   wait_stopped6  s    
zTestWorkerProcess.wait_stopped)rm   rm   N)rA   rB   rC   r:   rc   rl   r@   rp   ry   r~   r   rr   r   __classcell__r   r   rT   r   rG   w   s     
;rG   c                 C   sN   g }| D ]@}|j }|sqt |j }|tkrd|t|f }|| q|S )Nz%s (%s))rO   rZ   r[   rP   r   r   rY   )workersrV   workerrO   rb   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,  )rN   r   r   queueZQueuerK   r5   ZtestsrJ   rM   minrL   r   )r9   rN   r   r   r   r:   \  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 } |  jD ]}|	  qjd S )Nc                    s   g | ]}t | qS r   )rG   ).0indexr;   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   lenrM   r   rL   r   start)r9   msgr   r   r;   r   start_workersl  s    



z$MultiprocessTestRunner.start_workersc                 C   s6   t  }| jD ]}|  q| jD ]}|| q"d S r   )rZ   r[   r   r@   r   )r9   rP   r   r   r   r   stop_workersx  s
    


z#MultiprocessTestRunner.stop_workersc                 C   s   t dd | jD s>z| jjddW S  tjk
r<   Y d S X | jjd k	}t}|r`t	j
tdd z| jj|dW S  tjk
r   Y nX t| j}|rN| jjsN| dd|  qNd S )	Nc                 s   s   | ]}|  V  qd S r   )rX   )r   r   r   r   r   	<genexpr>  s     z5MultiprocessTestRunner._get_result.<locals>.<genexpr>r   rq   T)r3   zrunning: %s, )anyr   rK   getr   ZEmptyr   rM   PROGRESS_UPDATEfaulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTr   pgor   r^   )r9   Zuse_faulthandlerrM   rV   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: %sr   )r   r   Z	error_msgro   r   r   r   r   r   r   r^   rN   Zdisplay_progress
test_index)r9   r   r   r   rV   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: Tr/   rd   F)r   r   rN   Zaccumulate_resultr   r   r   r1   r    r   r   r$   r   )r9   itemr   r   r   r   r   _process_result  s    
z&MultiprocessTestRunner._process_resultc                 C   s   |    d| _zPz(| 	 }|d kr$q6| 
|}|rq6qW n" tk
rZ   t  d| j_Y nX W 5 | jjd k	rtt  | j  |   X d S )Nr   T)r   r   r   rM   r   Zcancel_dump_traceback_laterrJ   r@   r   r   r   KeyboardInterruptr1   rN   Zinterrupted)r9   r   r@   r   r   r   	run_tests  s     

z MultiprocessTestRunner.run_testsN)
rA   rB   rC   r:   r   r   r   r   r   r   r   r   r   r   r   [  s   r   c                 C   s   t |   d S r   )r   r   )rN   r   r   r   run_tests_multiprocess  s    r   )0collectionsr   r   r*   r   rf   r'   r$   r6   rZ   r   r   r`   r   Ztest.libregrtest.runtestr   r   r   r   r   r   r	   r
   Ztest.libregrtest.setupr   Ztest.libregrtest.utilsr   r   r   rt   r   r   hasattrr&   r   r   r.   r4   r5   
namedtuplerE   r|   rF   ZThreadrG   r   r   r   r   r   r   r   <module>   sF   ( X|