o
    tVg#                     @   sn  d 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 Z	d
dZe dkrdd	 Z
d
d Zz#ddlZddlmZ ejjZejjjZdddZdddZdd ZW n eyy   ddlmZmZ ddlmZ ddlmZ Y nw ddlZnddlmZmZmZ ddl Z ddl!Z!ej"Z"G dd dej#Z#dddZ$G dd dej%Z&e'dkre(  dS dS ) zR

Modification of http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554

    Nc                   C   s   t  d S N   )sysexc_info r   r   U/home/ubuntu/.local/lib/python3.10/site-packages/pygame/tests/test_utils/async_sub.pygeterror      r    asciiWindowsc                 C   
   |  dS Nr   )encode)sr   r   r   r         
r   c                 C   r   r   )decode)br   r   r   r      r   r   )DWORDc                 C   sB   t  }tjj| tt|t|t||}tjj	 |j
fS N)r   ctypeswindllkernel32	WriteFilecreate_string_bufferr   lenbyrefGetLastErrorvalue)handledataol	c_writtensuccessr   r   r   r   )   s   r   c                 C   sP   t  }t|d }tjj| ||t||}t||j< tjj	 t
|jfS r   )r   r   r   r   r   ReadFiler   	null_byter   r   r   )r   desired_bytesr!   c_readbufferr#   r   r   r   r$   4   s   
r$   c              
   C   s   t  }t  }|dkr8t  }t|d }tjj| ||t|t|t|}t||j< t	|j|j|jfS tjj| d |d t|t|}d|j|jfS )Nr   r    )
r   r   r   r   r   PeekNamedPiper   r%   r   r   )r   r&   c_avail	c_messager'   r(   r#   r   r   r   r*   =   s0   
r*   )r$   r   )r*   )TerminateProcess)SIGINTSIGTERMSIGKILLc                   @   s   e Zd ZdddZdddZd ddZd!ddZdd Zdd Zdd Z	e
 dkr8dd Zdd Zdd ZdS dd Zdd Zdd ZdS )"PopenNc                 C      |  d|S )Nstdout_recvselfmaxsizer   r   r   recvk   r	   z
Popen.recvc                 C   r2   )Nstderrr4   r6   r   r   r   recv_errn   r	   zPopen.recv_errr)   c                 C   s   |  || || |fS r   )sendr9   r;   )r7   inputr8   r   r   r   	send_recvq   s   zPopen.send_recv皙?r      r   c           	      C   s   |dk rd}t   | }g }d}| j}|r| j}t   |k s |rL| }|d u r.|r-tdn|r6|| nt t|t    | d t   |k s |s d|S )Nr   r)   Other end disconnected!r   )timer9   r;   	Exceptionappendsleepmaxjoin)	r7   waitetrr:   xyrprr   r   r   
read_asynct   s&   
zPopen.read_asyncc                 C   s<   t |r| |}|d u rtdt||}t |sd S d S )NrA   )r   r<   rC   
memoryview)r7   r    sentr   r   r   send_all   s   

zPopen.send_allc                 C   s(   |d u rd}n|dk rd}t | ||fS )Ni   r   )getattr)r7   whichr8   r   r   r   get_conn_maxsize   s
   zPopen.get_conn_maxsizec                 C   s   t | |  t| |d  d S r   )rS   closesetattr)r7   rT   r   r   r   _close   s   zPopen._closer   c                 C   s   t t| jd dS )zkill function for Win32r   N)r-   int_handle)r7   r   r   r   kill   s   z
Popen.killc              	   C   s   | j sd S zt| j  }t||\}}W |S  ty%   | d Y S  tjj	t
fyA   t d dtjfv r@| d Y S  w )Nstdinr   m   )r\   msvcrtget_osfhandlefilenor   
ValueErrorrX   
subprocess
pywintypeserrorrC   r   errno	ESHUTDOWN)r7   r=   rK   errCodewrittenr   r   r   r<      s   z
Popen.sendc           	   	   C   s   |  ||\}}|d u rd S z#t| }t|d\}}}||k r$|}|dkr0t||d \}}W n* ty?   | | Y S  tj	j
tfy[   t d dtjfv rZ| | Y S  w | jri|dddd}|S )Nr   r]   

)rU   r^   r_   r`   r*   r$   ra   rX   rb   rc   rd   rC   r   re   rf   universal_newlinesreplace)	r7   rT   r8   connrK   readnAvailnMessagerg   r   r   r   r5      s*   zPopen._recvc                 C   st   t ttgd D ]/\}}|d dkrt| j| t||d  d d  t| jtj	\}}|dkr7 d S qd S )N   r   g      @g{Gz?)
	enumerater/   r0   osr[   pidrB   rE   waitpidWNOHANG)r7   isig
killed_pidstatr   r   r   r[      s   c                 C   sn   | j sd S tg | j gg dd sdS zt| j  |}W |S  ty6   t d tjkr5| 	d Y S  w )Nr   r   r\   )
r\   selectrt   writer`   OSErrorr   re   EPIPErX   )r7   r=   rh   r   r   r   r<      s   c                 C   sl   |  ||\}}|d u rd S t|gg g dd sdS ||}|s'| |S | jr4|dddd}|S )Nr   r)   ri   rj   rk   )rU   r|   ro   rX   rl   rm   )r7   rT   r8   rn   rM   r   r   r   r5      s   

r   )r)   N)r?   r   r@   r   )__name__
__module____qualname__r9   r;   r>   rO   rR   rU   rX   platformsystemr[   r<   r5   r   r   r   r   r1   j   s    




r1   c              	   C   s   t | ||tjtjtjdd}d }g }t }|d u r<t | |k r<| }||jdddg7 }|d u r<t | |k s"|d u rcd| d}z
|  |d7 }W n tyb   |d	t	  d
7 }Y nw |d
|fS )Nr   )cwdenvr\   r3   r:   rl   r?   r   )rH   rI   z"Process timed out (time_out = z secs) z and was successfully terminated"z#and termination failed (exception: z)"r)   )r1   rb   PIPESTDOUTrB   pollrO   r[   rC   r   rG   )cmdtime_outwdr   procret_coderesponsetr   r   r   proc_in_time_or_kill   s2   
r   c                   @   s   e Zd Zdd ZdS )	AsyncTestc                 C   s4   t tjddgdd\}}| d| | d| d S )Nz-czwhile True: passr   )r   zrocess timed outzsuccessfully terminated)r   r   
executableassertIn)r7   r   r   r   r   r   test_proc_in_time_or_kill!  s
   
z#AsyncTest.test_proc_in_time_or_killN)r   r   r   r   r   r   r   r   r      s    r   __main__r   )NN))__doc__rt   r   rb   re   rB   r   unittesttempfiler   r   r%   r   r   r   ctypes.wintypesr   r   r   r-   r   r$   r*   ImportError	win32file	win32pipewin32apir^   signalr.   r/   r0   r|   fcntlr   r1   r   TestCaser   r   mainr   r   r   r   <module>   sN   



	
 
!