o
    PZŽh¨#  ã                   @   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rµe (¡  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   úP/var/www/auris/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ÚolZ	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%   Zc_availZ	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   r/   )NÚstderrr1   r3   r   r   r   Úrecv_errn   r	   zPopen.recv_errr(   c                 C   s   |   |¡|  |¡|  |¡fS r   )Úsendr6   r8   )r4   Úinputr5   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   )Útimer6   r8   Ú	ExceptionÚappendÚsleepÚmaxÚjoin)	r4   ÚwaitÚeÚtrr7   Ú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 )Nr>   )r   r9   r@   Ú
memoryview)r4   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)r4   Úwhichr5   r   r   r   Úget_conn_maxsize‘   s
   zPopen.get_conn_maxsizec                 C   s   t | |ƒ ¡  t| |d ƒ d S r   )rP   ÚcloseÚsetattr)r4   rQ   r   r   r   Ú_close˜   s   zPopen._closer   c                 C   s   t t| jƒdƒ dS )zkill function for Win32r   N)r*   ÚintZ_handle)r4   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   )rX   ÚmsvcrtÚget_osfhandleÚfilenor   Ú
ValueErrorrU   Ú
subprocessÚ
pywintypesÚerrorr@   r   ÚerrnoÚ	ESHUTDOWN)r4   r:   rH   ÚerrCodeÚwrittenr   r   r   r9   ¦   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   rY   ú
Ú
ú)rR   rZ   r[   r\   r)   r#   r]   rU   r^   r_   r`   r@   r   ra   rb   Úuniversal_newlinesÚreplace)	r4   rQ   r5   ÚconnrH   ÚreadZnAvailZnMessagerc   r   r   r   r2   ¶   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{®Gáz„?)
Ú	enumerater,   r-   ÚosrW   Úpidr?   rB   ÚwaitpidÚWNOHANG)r4   ÚiÚsigZ
killed_pidÚstatr   r   r   rW   Ñ   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   rX   )
rX   Úselectrn   Úwriter\   ÚOSErrorr   ra   ÚEPIPErU   )r4   r:   rd   r   r   r   r9   Û   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(   re   rf   rg   )rR   ru   rk   rU   rh   ri   )r4   rQ   r5   rj   rJ   r   r   r   r2   ë   s   

r   )r(   N)r<   r   r=   r   )Ú__name__Ú
__module__Ú__qualname__r6   r8   r;   rL   rO   rR   rU   ÚplatformÚsystemrW   r9   r2   r   r   r   r   r.   j   s    




r.   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ÚenvrX   r0   r7   rh   r<   r   )rE   rF   z"Process timed out (time_out = z secs) z and was successfully terminated"z#and termination failed (exception: z)"r(   )r.   r^   ÚPIPEÚSTDOUTr?   ÚpollrL   rW   r@   r   rD   )Ú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   Ú
executableZassertIn)r4   r‡   rˆ   r   r   r   Útest_proc_in_time_or_kill!  s
   
ÿz#AsyncTest.test_proc_in_time_or_killN)ry   rz   r{   r   r   r   r   r   r‹      s    r‹   Ú__main__r   )NN))Ú__doc__rn   r|   r^   ra   r?   r   ZunittestÚtempfiler   r   r$   r}   r   r   Zctypes.wintypesr   r   r   r*   r   r#   r)   ÚImportErrorZ	win32fileZ	win32pipeZwin32apirZ   Úsignalr+   r,   r-   ru   Úfcntlr€   r.   rŠ   ZTestCaser‹   ry   Úmainr   r   r   r   Ú<module>   sN   



	ý
 
!ÿ