a
    "hD                     @  s  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mZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dl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%dZ&d
Z'e(edoe(edZ)ddddddZ*ddddZ+ddddddZ,dddddd Z-G d!d" d"Z.G d#d$ d$eZ/ere0Z1e2ed% e/f e2ed& e1f B Z3G d'd( d(e4Z5G d)d* d*e	j6Z7d+d+d,d-d.Z8G d/d0 d0Z9d1d2d3d4d5Z:G d6d7 d7ej;Z<d8d9d:d;d<Z=d=dd>d?Z>dS )@    )annotationsN)
NamedTupleNoReturnLiteralAnyTYPE_CHECKING)support)	Namespace)Regrtest)runtest	is_failed
TestResultInterruptedTimeout
ChildErrorPROGRESS_MIN_TIME)setup_tests)format_durationprint_warningg      >@g     r@setsidkillpgr   r	   bool)resultnsreturnc                 C  s&   t | trdS |jr"t| |r"dS dS )NTF)
isinstancer   Zfailfastr   )r   r    r   C/opt/python-3.9.21/usr/lib/python3.9/test/libregrtest/runtest_mp.py	must_stop)   s
    
r   ztuple[Namespace, str]r   c                 C  s$   t | \}}tf i |}||fS N)jsonloadsr	   )worker_argsns_dict	test_namer   r   r   r   parse_worker_args1   s    r&   strzsubprocess.Popen)testnamer   r   c                 C  sx   t |}|| f}t|}tjgt dddd|}i }trNd|d< tj	|ftj
tj
dtjdktjd|S )	Nz-uz-mztest.regrtestz--worker-argsTstart_new_sessionnt)stdoutstderruniversal_newlines	close_fdscwd)varsr!   dumpssys
executabler   Zargs_from_interpreter_flagsUSE_PROCESS_GROUP
subprocessPopenPIPEosnameZSAVEDCWD)r(   r   r$   r#   cmdkwr   r   r   run_test_in_subprocess7   s4    
r<   r   )r   r%   r   c                 C  s<   t |  t| |}t  ttj|tddd td d S )N)clsTflushr   )r   r   printr!   r1   EncodeTestResultr2   exit)r   r%   r   r   r   r   run_tests_workerP   s
    
rC   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    )	threadingLocklock
tests_iter)selfrH   r   r   r   __init__a   s    
zMultiprocessIterator.__init__c                 C  s   | S r    r   rI   r   r   r   __iter__e   s    zMultiprocessIterator.__iter__c                 C  sB   | j ( | jd u rtt| jW  d    S 1 s40    Y  d S r    )rG   rH   StopIterationnextrK   r   r   r   __next__h   s    
zMultiprocessIterator.__next__c                 C  s0   | j  d | _W d    n1 s"0    Y  d S r    )rG   rH   rK   r   r   r   stopn   s    zMultiprocessIterator.stopN)__name__
__module____qualname____doc__rJ   rL   rO   rP   r   r   r   r   rD   ]   s
   rD   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )MultiprocessResultr   r   r'   r+   r,   	error_msgN)rQ   rR   rS   __annotations__r   r   r   r   rU   s   s   
rU   FTc                   @  s   e Zd ZdS )
ExitThreadN)rQ   rR   rS   r   r   r   r   rX      s   rX   c                      s   e Zd Zdddd fddZddd	d
ZddddZddddZd$dddddddZdddddZdddddZ	ddddZ
ddddZd dd!d"d#Z  ZS )%TestWorkerProcessintz'MultiprocessTestRunner'None)	worker_idrunnerr   c                   sZ   t    || _|j| _|j| _|j| _|j| _|j| _d | _	d | _
d | _d| _d| _d S )NF)superrJ   r\   pendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)rI   r\   r]   	__class__r   r   rJ      s    
zTestWorkerProcess.__init__r'   r   c                 C  s   d| j  g}|  r"|d n
|d | j}|rF|d|  | j}|d urt | j }|d| jj	 dt
| f dd| S )	NzTestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> )r\   is_aliveappendrd   rf   time	monotonicre   extendpidr   join)rI   infotestpopendtr   r   r   __repr__   s    
zTestWorkerProcess.__repr__c              
   C  s   | j }|d u 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y   Y n8 ty } z td| d| W Y d }~n
d }~0 0 d S )NTz process groupzKill filer?   zFailed to kill z: )rf   rg   r4   r@   r2   r,   r8   r   rs   signalSIGKILLkillProcessLookupErrorOSErrorr   )rI   rw   Zwhatexcr   r   r   _kill   s$    zTestWorkerProcess._killc                 C  s   d| _ |   d S )NT)rh   r   rK   r   r   r   rP      s    zTestWorkerProcess.stop Nr   rU   )test_resultr+   r,   r   c                 C  s   t  | j |_t||||S r    )rp   rq   re   duration_secrU   )rI   r   r+   r,   err_msgr   r   r   mp_result_error   s    z!TestWorkerProcess.mp_result_errorztuple[int, str, str])r%   r   c                 C  s>  t  | _|| _zt|| j}d| _|| _W n   d | _ Y n0 zz| jrX| 	  t
z|j| jd\}}|j}W nN tjy   | jrt
| 	  d }d }}Y n. ty   | jrt
 Y n0 | }| }|||fW W |   d | _d | _S    | 	   Y n0 W |   d | _d | _n|   d | _d | _0 d S )NFrb   r   )rp   rq   re   rd   r<   r   rg   rf   rh   r   rX   communicaterb   
returncoder5   TimeoutExpiredr   striprstrip_wait_completed)rI   r%   rw   r+   r,   retcoder   r   r   _run_process   sV    


zTestWorkerProcess._run_processc           	   
   C  s   |  |\}}}|d u r*| t|||S d }|dkr@d| }nb|d\}}}| }|sbd}n@ztj|td}W n, ty } zd| }W Y d }~n
d }~0 0 |d ur| t	||||S t
||||S )Nr   zExit code %s
zFailed to parse worker stdout)Zobject_hookzFailed to parse worker JSON: %s)r   r   r   
rpartitionr   r!   r"   decode_test_result	Exceptionr   rU   )	rI   r%   r   r+   r,   r   _r   r   r   r   r   _runtest  s&    

zTestWorkerProcess._runtestc                 C  s   | j szXzt| j}W n ty.   Y W qY n0 | |}| jd|f t|j| j	r\W qW q  t
yt   Y qY q  ty   | jdt f Y qY q 0 q d S )NFT)rh   rN   r_   rM   r   r`   putr   r   r   rX   BaseException	traceback
format_exc)rI   r%   	mp_resultr   r   r   run#  s    
zTestWorkerProcess.runc              
   C  sv   | j }|j  |j  z|t W nH tjtfyp } z*t	d|  dt
t d| W Y d }~n
d }~0 0 d S )NzFailed to wait for z completion (timeout=z): )rf   r+   closer,   waitJOIN_TIMEOUTr5   r   r   r   r   )rI   rw   r   r   r   r   r   6  s    


z!TestWorkerProcess._wait_completedfloat)re   r   c                 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 )	rt   rn   rp   rq   rc   logr   r   r   )rI   re   rx   r   r   r   wait_stoppedE  s    
zTestWorkerProcess.wait_stopped)r   r   N)rQ   rR   rS   rJ   ry   r   rP   r   r   r   r   r   r   __classcell__r   r   ri   r   rY      s      
;rY   zlist[TestWorkerProcess])workersr   c                 C  sN   g }| D ]@}|j }|sqt |j }|tkrd|t|f }|| q|S )Nz%s (%s))rd   rp   rq   re   r   r   ro   )r   rk   workerrd   rx   textr   r   r   get_running]  s    r   c                   @  st   e Zd ZdddddZddddZddd	d
ZddddZdddddZdddddZddddZ	dS )MultiprocessTestRunnerr
   r[   rc   r   c                 C  sj   || _ | j j| _|j| _t | _t| j j| _| jj	d urZt
| jj	d | jj	d | _nd | _d | _d S )Ng      ?i,  )rc   r   r   queueQueuer`   rD   Ztestsr_   rb   minra   r   )rI   rc   r   r   r   rJ   k  s    


zMultiprocessTestRunner.__init__r   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   )rY   ).0indexrK   r   r   
<listcomp>|  s   z8MultiprocessTestRunner.start_workers.<locals>.<listcomp>   zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s))
ranger   Zuse_mpr   lenrb   r   ra   r   start)rI   msgr   r   rK   r   start_workers{  s    



z$MultiprocessTestRunner.start_workersc                 C  s6   t  }| jD ]}|  q| jD ]}|| q"d S r    )rp   rq   r   rP   r   )rI   re   r   r   r   r   stop_workers  s
    


z#MultiprocessTestRunner.stop_workerszQueueOutput | Nonec                 C  s   | j jd u}t}tdd | jD r|r6tjtdd z| jj	|dW S  t
jyZ   Y n0 t| j}|r| j js| dd|  qz| jj	ddW S  t
jy   Y d S 0 d S )	Nc                 s  s   | ]}|  V  qd S r    )rn   )r   r   r   r   r   	<genexpr>      z5MultiprocessTestRunner._get_result.<locals>.<genexpr>T)rB   r   zrunning: %s, r   )r   rb   PROGRESS_UPDATEanyr   faulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTr`   getr   Emptyr   pgor   rt   )rI   Zuse_faulthandlerrb   rk   r   r   r   _get_result  s$    
z"MultiprocessTestRunner._get_resultrU   )r   r   c                 C  s   |j }t|}|jd u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'   rV   r   r   r   r   r   r   r   rt   rc   Zdisplay_progress
test_index)rI   r   r   r   rk   r   r   r   display_result  s    

z%MultiprocessTestRunner.display_resultQueueOutputr   )itemr   c                 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 )z&Returns True if test runner must stop.r   r   zregrtest worker thread failed: Tr>   rz   F)r   r   rc   Zaccumulate_resultr   r   r+   r@   r,   r   r   r2   r   )rI   r   r   r   r   r   r   _process_result  s    
z&MultiprocessTestRunner._process_resultc                 C  s   |    d| _ztz(|  }|d u r$q6| |}|rq6qW n  tyX   t  d| j_Y n0 W | jj	d urpt
  | j  |   n(| jj	d urt
  | j  |   0 d S )Nr   T)r   r   r   r   KeyboardInterruptr@   rc   Zinterruptedr   rb   r   Zcancel_dump_traceback_laterr_   rP   r   )rI   r   rP   r   r   r   	run_tests  s(    



z MultiprocessTestRunner.run_testsN)
rQ   rR   rS   rJ   r   r   r   r   r   r   r   r   r   r   r   j  s   r   r
   r[   r   c                 C  s   t |   d S r    )r   r   )rc   r   r   r   run_tests_multiprocess  s    r   c                      s(   e Zd ZdZddd fddZ  ZS )rA   z7Encode a TestResult (sub)class object into a JSON dict.r   dict[str, Any])or   c                   s.   t |tr"t|}|jj|d< |S t |S )N__test_result__)r   r   r0   rj   rQ   r^   default)rI   r   r   ri   r   r   r     s
    
zEncodeTestResult.default)rQ   rR   rS   rT   r   r   r   r   ri   r   rA     s   rA   r   zTestResult | dict[str, Any])dr   c                 C  sB   d| vr| S |  d}t D ] }|j|kr|f i |   S qdS )z7Decode a TestResult (sub)class object from a JSON dict.r   N)popget_all_test_result_classesrQ   )r   cls_namer=   r   r   r   r     s    


r   zset[type[TestResult]]c                  C  sJ   d} t h}t|| krFt|} g }|D ]}||  q&|| q
|S )Nr   )r   r   rr   __subclasses__update)Z
prev_countclassesZto_addr=   r   r   r   r     s    r   )?Z
__future__r   r   r!   r8   r   r|   r5   r2   rE   rp   r   typingr   r   r   r   r   rv   r   Ztest.libregrtest.cmdliner	   Ztest.libregrtest.mainr
   Ztest.libregrtest.runtestr   r   r   r   r   r   r   Ztest.libregrtest.setupr   Ztest.libregrtest.utilsr   r   r   r   r   hasattrr4   r   r&   r<   rC   rD   rU   r'   ZExcStrtupler   r   rX   ThreadrY   r   r   r   ZJSONEncoderrA   r   r   r   r   r   r   <module>   sN   $  [