
    i#                     J   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 Z	dj                  d      Z ej                         dk(  rWd Z
d Z	 ddlZdd	lmZ ej"                  j$                  Zej"                  j$                  j&                  Zdd
ZddZd ZddlZnddlmZmZmZ ddl Z ddl!Z!ejD                  Z" G d dejF                        Z#ddZ$ G d dejJ                        Z&e'dk(  r ejP                          yy# e$ r ddlmZmZ ddlmZ ddlmZ Y w xY w)zR

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

    Nc                  0    t        j                         d   S N   )sysexc_info     k/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/pygame/tests/test_utils/async_sub.pygeterrorr      s    <<>!r	    asciiWindowsc                 $    | j                  d      S Nr   )encode)ss    r
   r   r          xx  r	   c                 $    | j                  d      S r   )decode)bs    r
   r   r      r   r	   )DWORDc                 H   t               }t        j                  j                  j	                  | t        j
                  t        |            t        |      t        j                  |      |      }t        j                  j                  j                         |j                  fS N)r   ctypeswindllkernel32	WriteFilecreate_string_bufferr   lenbyrefGetLastErrorvalue)handledataol	c_writtensuccesss        r
   r   r   )   sr    Imm,,66++F4L9D	Y'G ==))668)//IIr	   c                 f   t               }t        j                  |dz         }t        j                  j                  j                  | ||t        j                  |      |      }t        ||j                  <   t        j                  j                  j                         t        |j                        fS r   )r   r   r   r   r   ReadFiler    	null_byter"   r!   r   )r#   desired_bytesr%   c_readbufferr'   s         r
   r)   r)   4   s    WF001BCFmm,,55v||F/CRG $-F6<< ==))668&:NNNr	   c           
         t               }t               }|dkD  rt               }t        j                  |dz         }t        j                  j                  j                  | ||t        j                  |      t        j                  |      t        j                  |            }t        ||j                  <   t        |j                        |j                  |j                  fS t        j                  j                  j                  | d |d t        j                  |      t        j                  |            }d|j                  |j                  fS )Nr   r    )
r   r   r   r   r   PeekNamedPiper    r*   r"   r   )r#   r+   c_avail	c_messager,   r-   r'   s          r
   r0   r0   =   s    gGIq 44]Q5FG --00>>!LL(LL)LL+ (1v||$fll+W]]IOOKK --00>>!LL)LL+ 7==)//99r	   )r)   r   )r0   )TerminateProcess)SIGINTSIGTERMSIGKILLc                       e Zd ZddZddZddZddZd Zd Zd Z	 e
j                         d	k(  r
d
 Zd Zd Zyd Zd Zd Zy)PopenNc                 &    | j                  d|      S )Nstdout_recvselfmaxsizes     r
   recvz
Popen.recvk       zz(G,,r	   c                 &    | j                  d|      S )Nstderrr;   r=   s     r
   recv_errzPopen.recv_errn   rA   r	   c                 f    | j                  |      | j                  |      | j                  |      fS r   )sendr@   rD   )r>   inputr?   s      r
   	send_recvzPopen.send_recvq   s*    yy7!3T]]75KKKr	   c                    |dk  rd}t        j                          |z   }g }d}| j                  }|r| j                  }t        j                          |k  s|r} |       }||rt        d      nf|r|j	                  |       n7t        j
                  t        |t        j                          z
  |z  d             t        j                          |k  rz|r}dj                  |      S )Nr   r/   Other end disconnected!r   )timer@   rD   	Exceptionappendsleepmaxjoin)	r>   waitetrrC   xyrprs	            r
   
read_asynczPopen.read_asynct   s    6BIIK$YYBiikAoAy#$=>>

3DIIK25q9: iikAo wwqzr	   c                     t        |      r7| j                  |      }|t        d      t        ||      }t        |      r6y y )NrJ   )r   rF   rL   
memoryview)r>   r$   sents      r
   send_allzPopen.send_all   s<    $i99T?D| 9::dD)D	 $ir	   c                 6    |d}n|dk  rd}t        | |      |fS )Ni   r   )getattr)r>   whichr?   s      r
   get_conn_maxsizezPopen.get_conn_maxsize   s*    ?Gq[GtU#W,,r	   c                 R    t        | |      j                          t        | |d        y r   )r^   closesetattr)r>   r_   s     r
   _closezPopen._close   s!    e""$eT"r	   r   c                 B    t        t        | j                        d       y)zkill function for Win32r   N)r3   int_handle)r>   s    r
   killz
Popen.kill   s     S.2r	   c                    | j                   sy 	 t        j                  | j                   j                               }t	        ||      \  }}|S # t
        $ r | j                  d      cY S t        j                  j                  t        f$ r4 t               d   dt        j                  fv r| j                  d      cY S  w xY w)Nstdinr   m   )rj   msvcrtget_osfhandlefilenor   
ValueErrorrd   
subprocess
pywintypeserrorrL   r   errno	ESHUTDOWN)r>   rG   rT   errCodewrittens        r
   rF   z
Popen.send   s    ::(():):)<=%.q%%8"' N  ,{{7++))//; :a=S%//$::;;w//s   <A B?)AB?=B?c                    | j                  ||      \  }}|y 	 t        j                  |j                               }t	        |d      \  }}}||k  r|}|dkD  rt        ||d       \  }}| j                  r"|j!                  dd      j!                  dd      }|S # t        $ r | j                  |      cY S t        j                  j                  t        f$ r4 t               d   dt        j                  fv r| j                  |      cY S  w xY w)Nr   rk   

)r`   rl   rm   rn   r0   r)   ro   rd   rp   rq   rr   rL   r   rs   rt   universal_newlinesreplace)	r>   r_   r?   connrT   readnAvailnMessageru   s	            r
   r<   zPopen._recv   s    11%AMD'|((7+8A+>(vxV#$FA:&.q&$&?OWd && ||FD199$EK  *{{5))))//; :a=S%//$::;;u--s   AB D5AD	Dc                 F   t        t        t        gdz        D ]  \  }}|dz  dk(  r t        j                  | j
                  |       t        j                  ||dz  z  dz  dz          t        j                  | j
                  t        j                        \  }}|dk7  s y  y )N   r   g      @g{Gz?)
	enumerater5   r6   osrh   pidrK   rN   waitpidWNOHANG)r>   isig
killed_pidstats        r
   rh   z
Popen.kill   s    #Wg$6$:; 3q5A:GGDHHc*

AQK#-56#%::dhh

#C 
D?r	   c                 J   | j                   sy t        j                  g | j                   gg d      d   sy	 t        j                  | j                   j	                         |      }|S # t
        $ r3 t               d   t        j                  k(  r| j                  d      cY S  w xY w)Nr   r   rj   )
rj   selectr   writern   OSErrorr   rs   EPIPErd   )r>   rG   rv   s      r
   rF   z
Popen.send   s    ::==djj\2q9!<((4::#4#4#6> N  :a=EKK/;;w//s   .A& &8B" B"c                    | j                  ||      \  }}|y t        j                  |gg g d      d   sy|j                  |      }|s| j                  |      S | j                  r"|j                  dd      j                  dd      }|S )Nr   r/   rx   ry   rz   )r`   r   r~   rd   r{   r|   )r>   r_   r?   r}   rV   s        r
   r<   zPopen._recv   s     11%AMD'|==$R3A6		'"A{{5))&&IIfd+33D$?Hr	   r   )r/   N)皙?r      r   )__name__
__module____qualname__r@   rD   rH   rX   r\   r`   rd   platformsystemrh   rF   r<   r   r	   r
   r8   r8   j   sW    --L,*-# xI%	3	 	6		 	r	   r8   c           	         t        | ||t        j                  t        j                  t        j                  d      }d }g }t	        j                         }|^t	        j                         |z
  |k  rD|j                         }||j                  dd      gz  }|t	        j                         |z
  |k  rD|d| d}	 |j                          |dz  }|dj                  |      fS # t        $ r |d	t                d
z  }Y /w xY w)Nr   )cwdenvrj   r:   rC   r{   r   r   )rQ   rR   z"Process timed out (time_out = z secs) z and was successfully terminated"z#and termination failed (exception: z)"r/   )r8   rp   PIPESTDOUTrK   pollrX   rh   rL   r   rP   )cmdtime_outwdr   procret_coderesponsets           r
   proc_in_time_or_killr      s
   oo  D HH		A

qH <99;T__#_344 
qH < 4XJgF	MIIK::H RWWX&&&  	M=hj\LLH	Ms   >C& &DDc                       e Zd Zd Zy)	AsyncTestc                     t        t        j                  ddgd      \  }}| j                  d|       | j                  d|       y )Nz-czwhile True: passr   )r   zrocess timed outzsuccessfully terminated)r   r   
executableassertIn)r>   r   r   s      r
   test_proc_in_time_or_killz#AsyncTest.test_proc_in_time_or_kill!  sB    1^^T#56
( 	((3/:r	   N)r   r   r   r   r   r	   r
   r   r      s    ;r	   r   __main__r   )NN))__doc__r   r   rp   rs   rK   r   unittesttempfiler   r   r*   r   r   r   ctypes.wintypesr   r   r   r3   r   r)   r0   ImportError	win32file	win32pipewin32apirl   signalr4   r5   r6   r   fcntlr   r8   r   TestCaser   r   mainr   r	   r
   <module>r      s   
     
   MM'"	8??	!!!9.)==))!==11BB		J	O	:>  0/ 
OJ Oj'B;!! ; zHMMO i  .1+-.s   AD D"!D"