o
    IXhsD                     @   sJ  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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 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oe(edZ)dedede*fddZ+de,ee-f fddZ.de-dedej/fddZ0dede-defddZ1G dd dZ2G dd deZ3e-Z4e,ed e3f e,ed  e4f B Z5G d!d" d"e6Z7G d#d$ d$ej8Z9d%e:e9 de:e9 fd&d'Z;G d(d) d)Z<d*eddfd+d,Z=G d-d. d.ej>Z?d/e@e-ef dee@e-ef B fd0d1ZAdeBeCe  fd2d3ZDdS )4    N)
NamedTupleNoReturnLiteralAny)support)	os_helper)	Namespace)Regrtest)runtest	is_failed
TestResultInterruptedTimeout
ChildErrorPROGRESS_MIN_TIME)setup_tests)format_durationprint_warningg      >@g     r@setsidkillpg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   E/opt/python-3.10.19/usr/lib/python3.10/test/libregrtest/runtest_mp.py	must_stop)   s
   
r   c                 C   s$   t | \}}tdi |}||fS )Nr   )jsonloadsr   )worker_argsns_dict	test_namer   r   r   r   parse_worker_args1   s   r"   testnamec                 C   sx   t |}|| f}t|}tjgt dddd|}i }tr'd|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namer   ZSAVEDCWD)r#   r   r    r   cmdkwr   r   r   run_test_in_subprocess7   s4   
r7   r!   c                 C   s<   t |  t| |}t  ttj|tddd td d S )N)clsTflushr   )r   r
   printr   r,   EncodeTestResultr-   exit)r   r!   r   r   r   r   run_tests_workerP   s
   
r>   c                   @   s.   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
MultiprocessIteratorc                 C   s   t  | _|| _d S N)	threadingLocklock
tests_iter)selfrD   r   r   r   __init__a   s   

zMultiprocessIterator.__init__c                 C   s   | S r@   r   rE   r   r   r   __iter__e   s   zMultiprocessIterator.__iter__c                 C   sB   | j  | jd u rtt| jW  d    S 1 sw   Y  d S r@   )rC   rD   StopIterationnextrG   r   r   r   __next__h   s
   
$zMultiprocessIterator.__next__c                 C   s2   | j  d | _W d    d S 1 sw   Y  d S r@   )rC   rD   rG   r   r   r   stopn   s   "zMultiprocessIterator.stopN)__name__
__module____qualname__rF   rH   rK   rL   r   r   r   r   r?   ]   s    r?   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )MultiprocessResultr   r&   r'   	error_msgN)rM   rN   rO   r   __annotations__strr   r   r   r   rP   s   s
   
 rP   FTc                   @   s   e Zd ZdS )
ExitThreadN)rM   rN   rO   r   r   r   r   rT   ~   s    rT   c                	       s   e Zd Zdeddddf fddZdefdd	Zd d
dZd ddZ			d!de	dedede
fddZdedeeeef fddZdede
fddZd ddZd ddZdeddfddZ  ZS )"TestWorkerProcess	worker_idrunnerMultiprocessTestRunnerr   Nc                    sZ   t    || _|j| _|j| _|j| _|j| _|j| _d | _	d | _
d | _d| _d| _d S )NF)superrF   rV   pendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)rE   rV   rW   	__class__r   r   rF      s   

zTestWorkerProcess.__init__c                 C   s   d| j  g}|  r|d n|d | j}|r#|d|  | j}|d urBt | j }|d| jj	 dt
| f dd| S )	NzTestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> )rV   is_aliveappendr_   ra   time	monotonicr`   extendpidr   join)rE   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r|  d}n|  }td| tjdd ztr5t|jt	j
 W d S |  W d S  tyE   Y d S  tya } ztd| d| W Y d }~d S d }~ww )NTz process groupzKill filer:   zFailed to kill z: )ra   rb   r/   r;   r-   r'   r3   r   rn   signalSIGKILLkillProcessLookupErrorOSErrorr   )rE   rr   Zwhatexcr   r   r   _kill   s(   "zTestWorkerProcess._killc                 C   s   d| _ |   d S )NT)rc   r}   rG   r   r   r   rL      s   zTestWorkerProcess.stop test_resultr&   r'   c                 C   s   t  | j |_t||||S r@   )rk   rl   r`   duration_secrP   )rE   r   r&   r'   err_msgr   r   r   mp_result_error   s   z!TestWorkerProcess.mp_result_errorr!   c                 C   s  t  | _|| _zt|| j}d| _|| _W n   d | _ z_zV| jr)| 	  t
z|j| jd\}}|j}W n% tjyP   | jrDt
| 	  d }d }}Y n ty\   | jr[t
 w | }| }|||fW W |   d | _d | _S    | 	   |   d | _d | _w )NFr]   r~   )rk   rl   r`   r_   r7   r   rb   ra   rc   r}   rT   communicater]   
returncoder0   TimeoutExpiredr{   striprstrip_wait_completed)rE   r!   rr   r&   r'   retcoder   r   r   _run_process   sN   


zTestWorkerProcess._run_processc           	   
   C   s   |  |\}}}|d u r| t|||S d }|dkr d| }n1|d\}}}| }|s1d}n z	tj|td}W n tyP } z
d| }W Y d }~nd }~ww |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   rP   )	rE   r!   r   r&   r'   r   _r   r|   r   r   r   _runtest  s*   

zTestWorkerProcess._runtestc                 C   s   | j sRz,zt| j}W n ty   Y W d S w | |}| jd|f t|j| j	r.W d S W n t
y9   Y d S  tyL   | jdt f Y d S w | j rd S d S )NFT)rc   rJ   rZ   rI   r   r[   putr   r   r   rT   BaseException	traceback
format_exc)rE   r!   	mp_resultr   r   r   run"  s&   
zTestWorkerProcess.runc              
   C   sv   | j }|j  |j  z|t W d S  tjtfy: } zt	d|  dt
t d| W Y d }~d S d }~ww )NzFailed to wait for z completion (timeout=z): )ra   r&   closer'   waitJOIN_TIMEOUTr0   r   r{   r   r   )rE   rr   r|   r   r   r   r   5  s   


z!TestWorkerProcess._wait_completedr`   c                 C   sf   	 |  d |  sd S t | }| jd|  dt|  |tkr2td|  dt|  d S q)NTg      ?zWaiting for z thread for zFailed to join z in )	ro   ri   rk   rl   r^   logr   r   r   )rE   r`   rs   r   r   r   wait_stoppedD  s   
zTestWorkerProcess.wait_stoppedr   N)r~   r~   N)rM   rN   rO   intrF   rS   rt   r}   rL   r   rP   r   tupler   r   r   r   floatr   __classcell__r   r   rd   r   rU      s,    



;

rU   workersc                 C   sN   g }| D ] }|j }|sqt |j }|tkr$d|t|f }|| q|S )Nz%s (%s))r_   rk   rl   r`   r   r   rj   )r   rf   workerr_   rs   textr   r   r   get_running\  s   
r   c                   @   sr   e Zd ZdeddfddZdddZddd	ZdedB fd
dZde	ddfddZ
dedefddZdddZdS )rX   r^   r   Nc                 C   sj   || _ | j j| _|j| _t | _t| j j| _| jj	d ur-t
| jj	d | jj	d | _nd | _d | _d S )Ng      ?i,  )r^   r   r   queueQueuer[   r?   ZtestsrZ   r]   minr\   r   )rE   r^   r   r   r   rF   j  s   



zMultiprocessTestRunner.__init__c                    s|    fddt d jjd D  _dt j d} jjr-|dt jjt jf 7 } |  jD ]}|	  q5d S )Nc                    s   g | ]}t | qS r   )rU   ).0indexrG   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   lenr]   r   r\   r   start)rE   msgr   r   rG   r   start_workersz  s   




z$MultiprocessTestRunner.start_workersc                 C   s6   t  }| jD ]}|  q| jD ]}|| qd S r@   )rk   rl   r   rL   r   )rE   r`   r   r   r   r   stop_workers  s   


z#MultiprocessTestRunner.stop_workersc                 C   s   | j jd u}t}tdd | jD rM|rtjtdd z| jj	|dW S  t
jy-   Y nw t| j}|rC| j jsC| dd|  tdd | jD sz| jj	ddW S  t
jy`   Y d S w )	Nc                 s   s    | ]}|  V  qd S r@   )ri   )r   r   r   r   r   	<genexpr>  s    z5MultiprocessTestRunner._get_result.<locals>.<genexpr>T)r=   r   zrunning: %s, r   )r   r]   PROGRESS_UPDATEanyr   faulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTr[   getr   Emptyr   pgor   ro   )rE   Zuse_faulthandlerr]   rf   r   r   r   _get_result  s*   
z"MultiprocessTestRunner._get_resultr   c                 C   s   |j }t|}|jd ur|d|j 7 }n|jtkr&| jjs&|dt|j 7 }t| j	}|r:| jjs:|dd
| 7 }| j| j| d S )Nz (%s)z -- running: %sr   )r   rS   rQ   r   r   r   r   r   r   r   ro   r^   Zdisplay_progress
test_index)rE   r   r   r   rf   r   r   r   display_result  s   

z%MultiprocessTestRunner.display_resultitemc                 C   s   	 |d r|d }t d|  dS |  jd7  _|d }| j|j | | |jr3t|jdd |jrC| j	j
sCt|jtjdd t|j| j	rLdS dS )Nr   r   zregrtest worker thread failed: Tr9   ru   F)r   r   r^   Zaccumulate_resultr   r   r&   r;   r'   r   r   r-   r   )rE   r   r   r   r   r   r   _process_result  s    
z&MultiprocessTestRunner._process_resultc                 C   s   |    d| _z<z	 |  }|d u rn	| |}|rnq
W n ty-   t  d| j_Y nw W | jj	d ur9t
  | j  |   d S | jj	d urNt
  | j  |   w )Nr   T)r   r   r   r   KeyboardInterruptr;   r^   Zinterruptedr   r]   r   Zcancel_dump_traceback_laterrZ   rL   r   )rE   r   rL   r   r   r   	run_tests  s2   



z MultiprocessTestRunner.run_testsr   )rM   rN   rO   r	   rF   r   r   QueueOutputr   rP   r   boolr   r   r   r   r   r   rX   i  s    

rX   r^   c                 C   s   t |   d S r@   )rX   r   )r^   r   r   r   run_tests_multiprocess  s   r   c                       s0   e Zd Z	 dedeeef f fddZ  ZS )r<   or   c                    s.   t |trt|}|jj|d< |S t |S )N__test_result__)r   r   r+   re   rM   rY   default)rE   r   r   rd   r   r   r     s
   
zEncodeTestResult.default)rM   rN   rO   r   dictrS   r   r   r   r   rd   r   r<     s    &r<   dc                 C   sD   	 d| vr| S |  d}t D ]}|j|kr|di |   S qd S )Nr   r   )popget_all_test_result_classesrM   )r   cls_namer8   r   r   r   r     s   


r   c                  C   sT   d} t h}t|| kr(t|} g }|D ]	}||  q|| t|| ks|S )Nr   )r   r   rm   __subclasses__update)Z
prev_countZclassesZto_addr8   r   r   r   r     s   
r   )Ecollectionsr   r   r3   r   rw   r0   r-   rA   rk   r   typingr   r   r   r   rq   r   Ztest.supportr   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   hasattrr/   r   r   r   rS   r"   r1   r7   r>   r?   rP   ZExcStrr   r   rT   ThreadrU   listr   rX   r   ZJSONEncoderr<   r   r   settyper   r   r   r   r   <module>   sP    $  [&