
    z%iF                         	 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Zd dlmZ d dlmZ d dlmZ e j"                  d        Z ej&                   eed      d       G d d	ej*                               Z ej&                   eed      d       G d
 de             Z ej&                   eed      d       G d de             Z ej&                   eed      d       G d de             Z ej&                   eed      d       ej&                   eed      d       G d de                    Z ej&                   eed      d       G d de             Z G d de      Zedk(  r ej<                          yy)    N)support)	os_helper)socket_helperc              #   t   K   	 | 5  	 |  	 d d d        y #  | j                           xY w# 1 sw Y   y xY wwN)kill)procs    D/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/_test_eintr.pykill_on_errorr      sB     Q	 	J 	IIK s    8,	8),58	setitimerzrequires setitimer()c                   B    e Zd Z	 dZdZdZd Zd Zed        Z	d Z
d Zy)	EINTRBaseTestg?g?c                 .    | xj                   dz  c_         y N   )signals)selfsignumframes      r
   
sighandlerzEINTRBaseTest.sighandler3   s        c                 6   d| _         t        j                  t        j                  | j                        | _        t        j
                  t        j                  | j                  | j                         t        j                  ddt        j                         y )Nr   iX  T)exitfile)r   signalSIGALRMr   orig_handlerr   ITIMER_REALsignal_delaysignal_periodfaulthandlerdump_traceback_latersys
__stderr__r   s    r
   setUpzEINTRBaseTest.setUp6   sf    "MM&..$//J++T->->++	-
 	))'/2~~	?r   c                  N    t        j                  t         j                  dd       y Nr   )r   r   r    r   r
   
stop_alarmzEINTRBaseTest.stop_alarmA   s    ++Q2r   c                     | j                          t        j                  t        j                  | j                         t	        j
                          y r   )r*   r   r   r   r!   cancel_dump_traceback_laterr%   s    r
   tearDownzEINTRBaseTest.tearDownE   s0    fnnd&7&78002r   c                 X    t         j                  df|z   }t        j                  |fi |S )Nz-c)r#   
executable
subprocessPopen)r   argskwcmd_argss       r
   r0   zEINTRBaseTest.subprocessJ   s+    NND)D0/B//r   N)__name__
__module____qualname__r   r    
sleep_timer   r&   staticmethodr*   r-   r0   r)   r   r
   r   r   '   s@    ' LM J	? 3 33
0r   r   c                       e Zd Z	 d Zd Zd Z ej                   ee	d      d      d        Z
d Zd Z ej                   ee	d	      d
      d        Zd Zd Zy)OSEINTRTestc                 B    d| j                   z  }| j                  |      S )Nzimport time; time.sleep(%r))r8   r0   )r   codes     r
   new_sleep_processzOSEINTRTest.new_sleep_processS   s    ,t>t$$r   c                     d}t        |      D cg c]  }| j                          }}t        |      D ]	  } |         |D ]  }|j                           y c c}w )N   )ranger>   wait)r   	wait_funcnum_	processesr	   s         r
   _test_wait_multiplezOSEINTRTest._test_wait_multipleW   s_    7<SzB!T++-B	Bs 	AK	  	DIIK		 Cs   Ac                 B    | j                  t        j                         y r   )rG   osrB   r%   s    r
   	test_waitzOSEINTRTest.test_wait`   s      )r   wait3zrequires wait3()c                 (    | j                  d        y )Nc                  ,    t        j                  d      S r(   )rI   rK   r)   r   r
   <lambda>z(OSEINTRTest.test_wait3.<locals>.<lambda>e   s    ! r   )rG   r%   s    r
   
test_wait3zOSEINTRTest.test_wait3c   s      !45r   c                 h    | j                         } ||j                         |j                          y r   )r>   pidrB   )r   rC   r	   s      r
   _test_wait_singlezOSEINTRTest._test_wait_singleg   s%    %%'$((		r   c                 (    | j                  d        y )Nc                 .    t        j                  | d      S r(   )rI   waitpidrQ   s    r
   rN   z*OSEINTRTest.test_waitpid.<locals>.<lambda>n   s    2::c1+= r   rR   r%   s    r
   test_waitpidzOSEINTRTest.test_waitpidm   s    =>r   wait4zrequires wait4()c                 (    | j                  d        y )Nc                 .    t        j                  | d      S r(   )rI   rY   rV   s    r
   rN   z(OSEINTRTest.test_wait4.<locals>.<lambda>r   s    288C+; r   rW   r%   s    r
   
test_wait4zOSEINTRTest.test_wait4p   s    ;<r   c                 "   t        j                         \  }}| j                  t         j                  |       g d}dj	                  dddd|z  d| j
                  z  ddd	d
df
      }| j                  |t        |      |g      }t        |      5  t        j                  |       |D ]1  }| j                  |t        j                  |t        |                   3 | j                  |j                         d       d d d        y # 1 sw Y   y xY w)N)s   hellos   worlds   spam
zimport os, sys, time zwr = int(sys.argv[1])
datas = %rsleep_time = %rzfor data in datas:z$    # let the parent block on read()    time.sleep(sleep_time)z    os.write(wr, data)pass_fdsr   )rI   pipe
addCleanupclosejoinr8   r0   strr   assertEqualreadlenrB   )r   rdwrdatasr=   r	   datas          r
   	test_readzOSEINTRTest.test_readt   s    B"%
 .yy"#5 / 2($
  tSWt<4  	-HHRL ?  rwwr3t9'=>?TYY[!,		- 	- 	-s   A,DDc                    t        j                         \  }}| j                  t         j                  |       dt        j
                  z  }dj                  dddd| j                  z  dt        j
                  z  ddd	d
ddddddddddf      }| j                  |t        |      |g      }t        |      5  t        j                  |       d}|t        |      k  r4|t        j                  |t        |      |d        z  }|t        |      k  r4| j                  |j                         d       d d d        y # 1 sw Y   y xY w)N   xr^   zimport io, os, sys, timer_   zrd = int(sys.argv[1])ra   zdata = b"x" * %sdata_len = len(data)z!# let the parent block on write()time.sleep(sleep_time)zread_data = io.BytesIO()z+while len(read_data.getvalue()) < data_len:z%    chunk = os.read(rd, 2 * data_len)z    read_data.write(chunk)zvalue = read_data.getvalue()zif value != data:z0    raise Exception("read error: %s vs %s bytes"z-                    % (len(value), data_len))rc   r   )rI   re   rf   rg   r   PIPE_MAX_SIZErh   r8   r0   ri   r   rl   write
memoryviewrj   rB   )r   rm   rn   rp   r=   r	   writtens          r
   
test_writezOSEINTRTest.test_write   s/   B"% g+++yy&#/!6!66"/$&93(*>;'
 , tSWt<4  	-HHRLGCI%288B
4(8(BCC CI%TYY[!,	- 	- 	-s   6AD9 D99EN)r5   r6   r7   r>   rG   rJ   unittest
skipUnlesshasattrrI   rO   rR   rX   r\   rq   rz   r)   r   r
   r;   r;   O   s    *%* XW-/AB6 C6? XW-/AB= C=-:$-r   r;   c                   $   e Zd Z	  ej                   eed      d      d        Zd Z ej                   eej                  d      d      d        Z	d Z
d	 Zd
 Z ej                   eej                  d      d      d        Zd Z ej                   dd       ej                   eed      d      d               Zd Z ej(                  ej,                  dk(  d      d        Zd Z ej(                  ej,                  dk(  d      d        Zy)SocketEINTRTest
socketpairzneeds socketpair()c                 x   t        j                         \  }}| j                  |j                         g d}dj	                  ddddt        |j                        z  dt        |j                        z  d|z  d	| j                  z  dd
dddddddf      }|j                         }| j                  |t        |      |g      }t        |      5  |j                          |D ]$  }| j                  | ||t        |                   & | j                  |j                         d       d d d        y # 1 sw Y   y xY w)N)rs      y   zr^   import os, socket, sys, timer_   fd = int(sys.argv[1])family = %ssock_type = %sr`   ra   z)wr = socket.fromfd(fd, family, sock_type)os.close(fd)zwith wr:z    for data in datas:z(        # let the parent block on recv()z        time.sleep(sleep_time)z        wr.sendall(data)rc   r   )socketr   rf   rg   rh   intfamilytyper8   filenor0   ri   r   rj   rl   rB   )	r   	recv_funcrm   rn   ro   r=   fdr	   rp   s	            r
   
_test_recvzSocketEINTRTest._test_recv   s%   ""$B! #yy*#C		N*s277|+5 /7$6,&!
 & YY[tSWt<4  	-HHJ A  ySY'?@ATYY[!,		- 	- 	-s   AD00D9c                 V    | j                  t        j                  j                         y r   )r   r   recvr%   s    r
   	test_recvzSocketEINTRTest.test_recv       **+r   recvmsgzneeds recvmsg()c                 (    | j                  d        y )Nc                 *    | j                  |      d   S r(   )r   sockrp   s     r
   rN   z.SocketEINTRTest.test_recvmsg.<locals>.<lambda>   s    4<<+=a+@ r   )r   r%   s    r
   test_recvmsgzSocketEINTRTest.test_recvmsg   s    @Ar   c                    t        j                         \  }}| j                  |j                         dt        j
                  dz  z  }dj                  ddddt        |j                        z  dt        |j                        z  d	| j                  z  d
t        j
                  dz  z  dddddddddddddddddf      }|j                         }| j                  |t        |      |g      }t        |      5  |j                          d}|t        |      k  r6 ||t!        |      |d        }	||	t        |      n|	z  }|t        |      k  r6| j#                  |j%                         d       d d d        y # 1 sw Y   y xY w)Ns   xyzr@   r^   r   r_   r   r   r   ra   zdata = b"xyz" * %srt   z)rd = socket.fromfd(fd, family, sock_type)r   zwith rd:z$    # let the parent block on send()rb   z'    received_data = bytearray(data_len)z	    n = 0z    while n < data_len:z8        n += rd.recv_into(memoryview(received_data)[n:])zif received_data != data:z0    raise Exception("recv error: %s vs %s bytes"z5                    % (len(received_data), data_len))rc   r   )r   r   rf   rg   r   SOCK_MAX_SIZErh   r   r   r   r8   r   r0   ri   r   rl   rx   rj   rB   )
r   	send_funcrm   rn   rp   r=   r   r	   ry   sents
             r
   
_test_sendzSocketEINTRTest._test_send   sy   ""$B! ..!34yy*#C		N*s277|+/ G$9$9Q$>?"72(5%F'>C1
 6 YY[tSWt<4  	-HHJGCI% Z%5gh%?@3t9$> CI% TYY[!,	- 	- 	-s   8AE8 E88Fc                 V    | j                  t        j                  j                         y r   )r   r   sendr%   s    r
   	test_sendzSocketEINTRTest.test_send  r   r   c                 V    | j                  t        j                  j                         y r   )r   r   sendallr%   s    r
   test_sendallzSocketEINTRTest.test_sendall  s    --.r   sendmsgzneeds sendmsg()c                 (    | j                  d        y )Nc                 &    | j                  |g      S r   )r   r   s     r
   rN   z.SocketEINTRTest.test_sendmsg.<locals>.<lambda>  s    4<<+? r   )r   r%   s    r
   test_sendmsgzSocketEINTRTest.test_sendmsg  s    ?@r   c                 
   t        j                  t        j                  df      }| j	                  |j
                         |j                         d   }dj                  dddt        j                  z  d|z  d| j                  z  dd	d
ddf
      }| j                  |      }t        |      5  |j                         \  }}|j                          | j                  |j                         d       d d d        y # 1 sw Y   y xY w)Nr   r   r^   zimport socket, timer_   z	host = %rz	port = %sra   z# let parent block on accept()ru   z,with socket.create_connection((host, port)):rb   )r   create_serverr   HOSTrf   rg   getsocknamerh   r8   r0   r   acceptrj   rB   )r   r   portr=   r	   client_sockrE   s          r
   test_acceptzSocketEINTRTest.test_accept  s    ##]%7%7$;<

#!!$yy!-,,,$/,$:(
  t$4  	-![[]NKTYY[!,	- 	- 	-s   ,AC99D
   r@   mkfifozneeds mkfifo()c                    t         j                  }t        j                  |       	 t        j                  |       | j                  t         j                  |       dj                  ddd|z  d| j                  z  dddd|f	      }| j                  |      }t        |      5   ||       | j                  |j                         d	       d d d        y # t
        $ r}| j                  d|z         Y d }~d }~ww xY w# 1 sw Y   y xY w)
Nzos.mkfifo(): %sr^   import os, timer_   z	path = %ara   z# let the parent blockru   r   )r   TESTFNunlinkrI   r   PermissionErrorskipTestrf   rh   r8   r0   r   rj   rB   )r   do_open_close_readerdo_open_close_writerfilenameer=   r	   s          r
   
_test_openzSocketEINTRTest._test_open;  s     ## 	"	1IIh 		(((3yy("/$$ 

 
 t$4  	- *TYY[!,	- 	-#  	1MM+a/00	1"	- 	-s#   C ")C>	C;C66C;>Dc                 <    t        |d      }|j                          y )Nw)openrg   )r   pathfps      r
   python_openzSocketEINTRTest.python_openZ  s    $_

r   darwinz+hangs under macOS; see bpo-25234, bpo-35363c                 <    | j                  d| j                         y )Nzfp = open(path, 'r')
fp.close())r   r   r%   s    r
   	test_openzSocketEINTRTest.test_open^  s     	:((	*r   c                 v    t        j                  |t         j                        }t        j                  |       y r   )rI   r   O_WRONLYrg   )r   r   r   s      r
   os_openzSocketEINTRTest.os_opend  s!    WWT2;;'
r   c                 <    | j                  d| j                         y )Nz,fd = os.open(path, os.O_RDONLY)
os.close(fd))r   r   r%   s    r
   test_os_openzSocketEINTRTest.test_os_openh  s     	G	&r   N)r5   r6   r7   r{   r|   r}   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionrI   r   r   skipIfr#   platformr   r   r   r)   r   r
   r   r      sY   .X68LM!- N!-F, X	:<MNB OB,-\,/ X	:<MNA OA-8 &W%%b!,XX.0@A- B --: X__S\\X-BD*D* X__S\\X-BD&D&r   r   c                       e Zd Z	 d Zy)TimeEINTRTestc                     t        j                         }t        j                  | j                         | j	                          t        j                         |z
  }| j                  || j                         y r   )time	monotonicsleepr8   r*   assertGreaterEqualr   t0dts      r
   
test_sleepzTimeEINTRTest.test_sleeps  sM    ^^

4??#^^"DOO4r   N)r5   r6   r7   r   r)   r   r
   r   r   o  s
    ,5r   r   pthread_sigmaskzneed signal.pthread_sigmask()c                       e Zd Z	 d Z ej
                   eed      d      d        Z ej
                   eed      d      d        Z	y)SignalEINTRTestc                    t         j                  }t        j                         }t        j                   |d       }| j	                  t         j                   ||       dj                  ddt        j                         z  dt        |      z  d| j                  z  ddf      }t        j                  t         j                  |g      }| j	                  t         j                  t         j                  |g       | j                  |      }t        |      5   ||       d d d        | j                  |j                         d	       y # 1 sw Y   *xY w)
Nc                       y r   r)   )r2   s    r
   rN   z/SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    r   r^   r   zpid = %szsignum = %sra   ru   zos.kill(pid, signum)r   )r   SIGUSR1rI   getpidrf   rh   r   r8   r   	SIG_BLOCKSIG_UNBLOCKr0   r   rj   rB   )r   rC   r   rQ   old_handlerr=   old_maskr	   s           r
   check_sigwaitzSignalEINTRTest.check_sigwait  s   iikmmF,>?v{;yy$CK'/$"
  ))&*:*:VHE..0B0BVHMt$4  	f	 	a(	 	s   	EEsigwaitinfozneed signal.sigwaitinfo()c                 ,    d }| j                  |       y )Nc                 0    t        j                  | g       y r   )r   r   r   s    r
   rC   z3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(r   r   r   rC   s     r
   test_sigwaitinfoz SignalEINTRTest.test_sigwaitinfo  s    	) 	9%r   sigtimedwaitc                 ,    d }| j                  |       y )Nc                 2    t        j                  | gd       y )Ng      ^@)r   r   r   s    r
   rC   z4SignalEINTRTest.test_sigtimedwait.<locals>.wait_func  s    %0r   r   r   s     r
   test_sigtimedwaitz!SignalEINTRTest.test_sigtimedwait  s    	1 	9%r   N)
r5   r6   r7   r   r{   r|   r}   r   r   r   r)   r   r
   r   r   {  sf     /)2 X746&6& X846&6&r   r   c                   Z   e Zd Z	 d Z ej
                  ej                  dk(  d       ej                   e	e
d      d      d               Z ej                   e	e
d      d      d	        Z ej                   e	e
d
      d      d        Z ej                   e	e
d      d      d        Zy)SelectEINTRTestc                     t        j                         }t        j                  g g g | j                         t        j                         |z
  }| j	                          | j                  || j                         y r   )r   r   selectr8   r*   r   r   s      r
   test_selectzSelectEINTRTest.test_select  sS    ^^b"b$//2^^"DOO4r   r   z(poll may fail on macOS; see issue #28087pollzneed select.pollc                    t        j                         }t        j                         }|j                  | j                  dz         t        j                         |z
  }| j                          | j                  || j                         y Ng     @@)r   r   r   r   r8   r*   r   r   pollerr   r   s       r
   	test_pollzSelectEINTRTest.test_poll  s_     ^^DOOc)*^^"DOO4r   epollzneed select.epollc                 F   t        j                         }| j                  |j                         t	        j
                         }|j                  | j                         t	        j
                         |z
  }| j                          | j                  || j                         y r   )
r   r   rf   rg   r   r   r   r8   r*   r   r   s       r
   
test_epollzSelectEINTRTest.test_epoll  sh    %^^DOO$^^"DOO4r   kqueuezneed select.kqueuec                 J   t        j                         }| j                  |j                         t	        j
                         }|j                  d d| j                         t	        j
                         |z
  }| j                          | j                  || j                         y r   )
r   r   rf   rg   r   r   controlr8   r*   r   )r   r   r   r   s       r
   test_kqueuezSelectEINTRTest.test_kqueue  sl    %^^tQ0^^"DOO4r   devpollzneed select.devpollc                 L   t        j                         }| j                  |j                         t	        j
                         }|j                  | j                  dz         t	        j
                         |z
  }| j                          | j                  || j                         y r   )
r   r  rf   rg   r   r   r   r8   r*   r   r   s       r
   test_devpollzSelectEINTRTest.test_devpoll  sn    !%^^DOOc)*^^"DOO4r   N)r5   r6   r7   r   r{   r   r#   r   r|   r}   r   r   r   r  r  r)   r   r
   r   r     s    .5 X__S\\X-?AX02DE5 FA5 X13FG5 H5 X24HI5 J5 X35JK5 L5r   r   c                   n    e Zd Zd Z ej
                   ej                         dk(  d      d        Zd Z	y)FNTLEINTRTestc                    | j                  t        j                  t        j                         dj	                  ddt        j                  z  d|z  d| j
                  z  f      }t        j                         }| j                  |      }t        |      5  t        t        j                  d      5 }t        j                         }t        j                  t        j                  d      D ]B  }	  ||t        j                  t        j                   z          ||t        j"                         D t        j                         |z
  }t'        d	|z        # t$        $ r Y  nw xY w ||t        j                         t        j                         |z
  }| j)                  || j
                         | j+                          d d d        n# 1 sw Y   nxY w|j-                          d d d        y # 1 sw Y   y xY w)
Nr^   zimport fcntl, timezwith open('%s', 'wb') as f:z   fcntl.%s(f, fcntl.LOCK_EX)z   time.sleep(%s)wbF)errorz failed to sync child in %.1f sec)rf   r   r   r   rh   r8   r   r   r0   r   r   r   sleeping_retryLONG_TIMEOUTfcntlLOCK_EXLOCK_NBLOCK_UNBlockingIOError	Exceptionr   r*   rB   )	r   	lock_func	lock_namer=   
start_timer	   frE   r   s	            r
   _lockzFNTLEINTRTest._lock  s   	(()*:*:;yy )I,<,<<+i7$//1	3 4
 ^^%
t$4  	i&&- "!^^-
 //0D0DER MA!!U]]U]]%BC!!U]]3M )J6B#$F$KLL	 +  !U]]+^^%
2''DOO<!'" " "( IIK+	 	 	sI   G,0=G.?E-'G	E!	G E!	!AG>	G,G	G,,G5AIXzAIX returns PermissionErrorc                 D    | j                  t        j                  d       y )Nlockf)r  r  r  r%   s    r
   
test_lockfzFNTLEINTRTest.test_lockf	  s    

5;;(r   c                 D    | j                  t        j                  d       y )Nflock)r  r  r  r%   s    r
   
test_flockzFNTLEINTRTest.test_flock  s    

5;;(r   N)
r5   r6   r7   r  r{   r   r   systemr  r  r)   r   r
   r  r    s>    D X___X__&%/1NO) P))r   r  __main__)
contextlibr!   r  rI   r   r   r   r   r0   r#   r   r{   testr   test.supportr   r   contextmanagerr   r|   r}   TestCaser   r;   r   r   r   r   r  r5   mainr)   r   r
   <module>r(     s      	      
    " &  WV[13IJ$0H%% $0 K$0N WV[13IJe-- e- Ke-P WV[13IJs&m s& Ks&l WV[13IJ5M 5 K5 WV[13IJ WV%6746*&m *&6 K
*&Z WV[13IJ55m 55 K55p()M ()V zHMMO r   