o
    fsD                     @   sb  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%e%eksxJ dZ&e&e%ksJ d
Z'e(edoe(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   failfastr   )r   r    r   2/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   args_from_interpreter_flagsUSE_PROCESS_GROUP
subprocessPopenPIPEosnamer   SAVEDCWD)r$   r   r!   r    cmdkwr   r   r   run_test_in_subprocess7   s4   
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   r-   EncodeTestResultr.   exit)r   r"   r   r   r   r   run_tests_workerP   s
   
rA   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)	threadingLocklock
tests_iter)selfrG   r   r   r   __init__a   s   

zMultiprocessIterator.__init__c                 C   s   | S rC   r   rH   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 rC   )rF   rG   StopIterationnextrJ   r   r   r   __next__h   s
   
$zMultiprocessIterator.__next__c                 C   s2   | j  d | _W d    d S 1 sw   Y  d S rC   )rF   rG   rJ   r   r   r   stopn   s   "zMultiprocessIterator.stopN)__name__
__module____qualname____doc__rI   rK   rN   rO   r   r   r   r   rB   ]   s    rB   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)rP   rQ   rR   r   __annotations__strr   r   r   r   rT   s   s
   
 rT   FTc                   @   s   e Zd ZdS )
ExitThreadN)rP   rQ   rR   r   r   r   r   rX   ~   s    rX   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)superrI   rZ   pendingoutputr   worker_timeouttimeoutregrtestcurrent_test_name
start_time_popen_killed_stopped)rH   rZ   r[   	__class__r   r   rI      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> )rZ   is_aliveappendrc   re   time	monotonicrd   extendpidr   join)rH   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: )re   rf   r1   r>   r.   r(   r5   r   rr   signalSIGKILLkillProcessLookupErrorOSErrorr   )rH   rv   whatexcr   r   r   _kill   s(   "zTestWorkerProcess._killc                 C   s   d| _ |   d S )NT)rg   r   rJ   r   r   r   rO      s   zTestWorkerProcess.stop test_resultr'   r(   c                 C   s   t  | j |_t||||S rC   )ro   rp   rd   duration_secrT   )rH   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 | _ zez\| jr)| 	  t
z|j| jd\}}|j}|d us<J W n% tjyV   | jrJt
| 	  d }d }}Y n tyb   | jrat
 w | }| }|||fW W |   d | _d | _S    | 	   |   d | _d | _w )NFra   r   )ro   rp   rd   rc   r:   r   rf   re   rg   r   rX   communicatera   
returncoder2   TimeoutExpiredr   striprstrip_wait_completed)rH   r"   rv   r'   r(   retcoder   r   r   _run_process   sP   

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)object_hookzFailed to parse worker JSON: %s)r   r   r   
rpartitionr   r   r   decode_test_result	Exceptionr   rT   )	rH   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)rg   rM   r^   rL   r   r_   putr   r   r   rX   BaseException	traceback
format_exc)rH   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): )re   r'   closer(   waitJOIN_TIMEOUTr2   r   r   r   r   )rH   rv   r   r   r   r   r   5  s   


z!TestWorkerProcess._wait_completedrd   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 )	rs   rm   ro   rp   rb   logr   r   r   )rH   rd   rw   r   r   r   wait_stoppedD  s   
zTestWorkerProcess.wait_stoppedr   N)r   r   N)rP   rQ   rR   intrI   rW   rx   r   rO   r   rT   r   tupler   r   r   r   floatr   __classcell__r   r   rh   r   rY      s,    



;

rY   workersc                 C   sN   g }| D ] }|j }|sqt |j }|tkr$d|t|f }|| q|S )Nz%s (%s))rc   ro   rp   rd   r   r   rn   )r   rj   workerrc   rw   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 )r\   rb   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,  )rb   r   r   queueQueuer_   rB   testsr^   ra   minr`   r   )rH   rb   r   r   r   rI   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   )rY   ).0indexrJ   r   r   
<listcomp>{  s    z8MultiprocessTestRunner.start_workers.<locals>.<listcomp>   zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s))
ranger   use_mpr   lenra   r   r`   r   start)rH   msgr   r   rJ   r   start_workersz  s   




z$MultiprocessTestRunner.start_workersc                 C   s6   t  }| jD ]}|  q| jD ]}|| qd S rC   )ro   rp   r   rO   r   )rH   rd   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 rC   )rm   )r   r   r   r   r   	<genexpr>  s    z5MultiprocessTestRunner._get_result.<locals>.<genexpr>T)r@   r   zrunning: %s, r   )r   ra   PROGRESS_UPDATEanyr   faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTr_   getr   Emptyr   pgor   rs   )rH   use_faulthandlerra   rj   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   rW   rU   r   r   r   r   r   r   r   rs   rb   display_progress
test_index)rH   r   r   r   rj   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r2t|jdd |jrB| j	j
sBt|jtjdd t|j| j	rKdS dS )z&Returns True if test runner must stop.r   r   zregrtest worker thread failed: Tr<   ry   F)r   r   rb   accumulate_resultr   r   r'   r>   r(   r   r   r.   r   )rH   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>   rb   interruptedr   ra   r   cancel_dump_traceback_laterr^   rO   r   )rH   r   rO   r   r   r   	run_tests  s2   



z MultiprocessTestRunner.run_testsr   )rP   rQ   rR   r	   rI   r   r   QueueOutputr   rT   r   boolr   r   r   r   r   r   r\   i  s    

r\   rb   c                 C   s   t |   d S rC   )r\   r   )rb   r   r   r   run_tests_multiprocess  s   r   c                       s2   e Zd ZdZdedeeef f fddZ  ZS )r?   z7Encode a TestResult (sub)class object into a JSON dict.or   c                    s.   t |trt|}|jj|d< |S t |S )N__test_result__)r   r   r,   ri   rP   r]   default)rH   r   r   rh   r   r   r     s
   
zEncodeTestResult.default)	rP   rQ   rR   rS   r   dictrW   r   r   r   r   rh   r   r?     s    &r?   dc                 C   sB   d| vr| S |  d}t D ]}|j|kr|di |   S qdS )z7Decode a TestResult (sub)class object from a JSON dict.r   Nr   )popget_all_test_result_classesrP   )r   cls_namer;   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   rq   __subclasses__update)
prev_countclassesto_addr;   r   r   r   r     s   
r   )Ecollectionsr   r   r5   r   r{   r2   r.   rD   ro   r   typingr   r   r   r   ru   r   test.supportr   test.libregrtest.cmdliner   test.libregrtest.mainr	   test.libregrtest.runtestr
   r   r   r   r   r   r   test.libregrtest.setupr   test.libregrtest.utilsr   r   r   r   r   hasattrr1   r   r   r   rW   r#   r3   r:   rA   rB   rT   ExcStrr   r   rX   ThreadrY   listr   r\   r   JSONEncoderr?   r   r   settyper   r   r   r   r   <module>   sT    $  [&