
    6bhF                     ,   	 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Zd dlmZ d dlmZ d dlmZ d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_helperg{Gz?c              #   t   K   	 | 5  	 |  	 d d d        y #  | j                           xY w# 1 sw Y   y xY wwN)kill)procs    :/opt/python-3.12.12/usr/lib/python3.12/test/_test_eintr.pykill_on_errorr   #   s7     Q		J 
	IIK 
s    8,	8),58	setitimerzrequires setitimer()c                   H    e Zd Z	 dZdZdZd Zd Zed        Z	d Z
d Zd Zy	)
EINTRBaseTestg?g?c                 .    | xj                   dz  c_         y N   )signals)selfsignumframes      r
   
sighandlerzEINTRBaseTest.sighandler:   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.setUp=   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_alarmH   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.tearDownL   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.subprocessQ   s+    NND)D0/B//r   c                 J    | j                  || j                  t        z
         y r   )assertGreaterEqual
sleep_time	CLOCK_RES)r   elapseds     r
   check_elapsed_timez EINTRBaseTest.check_elapsed_timeU   s    9)DEr   N)__name__
__module____qualname__r   r    r7   r   r&   staticmethodr*   r-   r0   r:   r)   r   r
   r   r   .   sF    ' LM J	? 3 33
0Fr   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))r7   r0   )r   codes     r
   new_sleep_processzOSEINTRTest.new_sleep_process]   s    ,t>t$$r   c                     d}t        |      D cg c]  }| j                          }}t        |      D ]	  } |         |D ]  }|j                           y c c}w )N   )rangerC   wait)r   	wait_funcnum_	processesr	   s         r
   _test_wait_multiplezOSEINTRTest._test_wait_multiplea   sV    7<SzBz!T++-z	BsAK  DIIK 	 Cs   Ac                 B    | j                  t        j                         y r   )rL   osrG   r%   s    r
   	test_waitzOSEINTRTest.test_waitj   s      )r   wait3zrequires wait3()c                 (    | j                  d        y )Nc                  ,    t        j                  d      S r(   )rN   rP   r)   r   r
   <lambda>z(OSEINTRTest.test_wait3.<locals>.<lambda>o   s    !r   )rL   r%   s    r
   
test_wait3zOSEINTRTest.test_wait3m   s      !45r   c                 h    | j                         } ||j                         |j                          y r   )rC   pidrG   )r   rH   r	   s      r
   _test_wait_singlezOSEINTRTest._test_wait_singleq   s%    %%'$((		r   c                 (    | j                  d        y )Nc                 .    t        j                  | d      S r(   )rN   waitpidrV   s    r
   rS   z*OSEINTRTest.test_waitpid.<locals>.<lambda>x   s    2::c1+=r   rW   r%   s    r
   test_waitpidzOSEINTRTest.test_waitpidw   s    =>r   wait4zrequires wait4()c                 (    | j                  d        y )Nc                 .    t        j                  | d      S r(   )rN   r^   r[   s    r
   rS   z(OSEINTRTest.test_wait4.<locals>.<lambda>|   s    288C+;r   r\   r%   s    r
   
test_wait4zOSEINTRTest.test_wait4z   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   )rN   pipe
addCleanupclosejoinr7   r0   strr   assertEqualreadlenrG   )r   rdwrdatasrB   r	   datas          r
   	test_readzOSEINTRTest.test_read~   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   xrc   zimport io, os, sys, timerd   zrd = int(sys.argv[1])rf   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))rh   r   )rN   rj   rk   rl   r   PIPE_MAX_SIZErm   r7   r0   rn   r   rq   write
memoryviewro   rG   )r   rr   rs   ru   rB   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)r;   r<   r=   rC   rL   rO   unittest
skipUnlesshasattrrN   rT   rW   r]   ra   rv   r   r)   r   r
   r@   r@   Y   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)rx      y   zrc   import os, socket, sys, timerd   fd = int(sys.argv[1])family = %ssock_type = %sre   rf   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)rh   r   )socketr   rk   rl   rm   intfamilytyper7   filenor0   rn   r   ro   rq   rG   )	r   	recv_funcrr   rs   rt   rB   fdr	   ru   s	            r
   
_test_recvzSocketEINTRTest._test_recv   s   ""$B! #yy*#C		N*s277|+5 /7$6,&!
 & YY[tSWt<4 HHJ  ySY'?@ 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   sockru   s     r
   rS   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   xyzrE   rc   r   rd   r   r   r   rf   zdata = b"xyz" * %sry   z)rd = socket.fromfd(fd, family, sock_type)r   zwith rd:z$    # let the parent block on send()rg   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))rh   r   )r   r   rk   rl   r   SOCK_MAX_SIZErm   r   r   r   r7   r   r0   rn   r   rq   r}   ro   rG   )
r   	send_funcrr   rs   ru   rB   r   r	   r~   sents
             r
   
_test_sendzSocketEINTRTest._test_send   sp   ""$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
   rS   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   rc   zimport socket, timerd   z	host = %rz	port = %srf   z# let parent block on accept()rz   z,with socket.create_connection((host, port)):rg   )r   create_serverr   HOSTrk   rl   getsocknamerm   r7   r0   r   acceptro   rG   )r   r   portrB   r	   client_sockrJ   s          r
   test_acceptzSocketEINTRTest.test_accept)  s    ##]%7%7$;<

#!!$yy!-,,,$/,$:(
  t$4 ![[]NKTYY[!, !  s   ,AC99D
   rE   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(): %src   import os, timerd   z	path = %arf   z# let the parent blockrz   r   )r   TESTFNunlinkrN   r   PermissionErrorskipTestrk   rm   r7   r0   r   ro   rG   )r   do_open_close_readerdo_open_close_writerfilenameerB   r	   s          r
   
_test_openzSocketEINTRTest._test_openE  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)openrl   )r   pathfps      r
   python_openzSocketEINTRTest.python_opend  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_openh  s     	:((	*r   c                 v    t        j                  |t         j                        }t        j                  |       y r   )rN   r   O_WRONLYrl   )r   r   r   s      r
   os_openzSocketEINTRTest.os_openn  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_openr  s     	G	&r   N)r;   r<   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionrN   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                  |       y r   )time	monotonicsleepr7   r*   r:   r   t0dts      r
   
test_sleepzTimeEINTRTest.test_sleep}  sG    ^^

4??#^^"#r   N)r;   r<   r=   r   r)   r   r
   r   r   y  s
    ,$r   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
   rS   z/SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    $r   rc   r   zpid = %szsignum = %srf   rz   zos.kill(pid, signum)r   )r   SIGUSR1rN   getpidrk   rm   r   r7   r   	SIG_BLOCKSIG_UNBLOCKr0   r   ro   rG   )r   rH   r   rV   old_handlerrB   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
   rH   z3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(r   r   r   rH   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
   rH   z4SignalEINTRTest.test_sigtimedwait.<locals>.wait_func  s    %0r   r   r   s     r
   test_sigtimedwaitz!SignalEINTRTest.test_sigtimedwait  s    	1 	9%r   N)
r;   r<   r=   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                  |       y r   )r   r   selectr7   r*   r:   r   s      r
   test_selectzSelectEINTRTest.test_select  sM    ^^b"b$//2^^"#r   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                  |       y Ng     @@)r   r   r   r   r7   r*   r:   r   pollerr   r   s       r
   	test_pollzSelectEINTRTest.test_poll  sY     ^^DOOc)*^^"#r   epollzneed select.epollc                 0   t        j                         }| j                  |j                         t	        j
                         }|j                  | j                         t	        j
                         |z
  }| j                          | j                  |       y r   )
r   r  rk   rl   r   r   r   r7   r*   r:   r   s       r
   
test_epollzSelectEINTRTest.test_epoll  sb    %^^DOO$^^"#r   kqueuezneed select.kqueuec                 4   t        j                         }| j                  |j                         t	        j
                         }|j                  d d| j                         t	        j
                         |z
  }| j                          | j                  |       y r   )
r   r  rk   rl   r   r   controlr7   r*   r:   )r   r  r   r   s       r
   test_kqueuezSelectEINTRTest.test_kqueue  sf    %^^tQ0^^"#r   devpollzneed select.devpollc                 6   t        j                         }| j                  |j                         t	        j
                         }|j                  | j                  dz         t	        j
                         |z
  }| j                          | j                  |       y r   )
r   r  rk   rl   r   r   r   r7   r*   r:   r   s       r
   test_devpollzSelectEINTRTest.test_devpoll  sh    !%^^DOOc)*^^"#r   N)r;   r<   r=   r   r   r   r#   r   r   r   r   r   r  r  r
  r)   r   r
   r   r     s    .$ X__S\\X-?AX02DE$ FA$ X13FG$ H$ X24HI$ J$ X35JK$ L$r   r   c                   n    e Zd Zd Z ej
                   ej                         dk(  d      d        Zd Z	y)FCNTLEINTRTestc                    | j                  t        j                  t        j                         t	        j
                         \  }}t	        j
                         \  }}||||fD ]"  }| j                  t        j                  |       $ t        j                  dt        j                   d| d| d| d| j                   d      }| j                  |||g      }	t        |	      5  t        t        j                  d      5 }
t	        j                  |d	      }| j                  |d
       t        j                          }t	        j"                  |d        ||
t$        j&                         t        j                          |z
  }| j)                          | j+                  |       d d d        |	j-                          d d d        y # 1 sw Y   "xY w# 1 sw Y   y xY w)Nz;
            import fcntl, os, time
            with open('z%', 'wb') as f:
                fcntl.z,(f, fcntl.LOCK_EX)
                os.write(z%, b"ok")
                _ = os.read(z;, 2)  # wait for parent process
                time.sleep(z
)
        rh   wb   s   oks   go)rk   r   r   r   rN   rj   rl   textwrapdedentr7   r0   r   r   rp   ro   r   r   r|   fcntlLOCK_EXr*   r:   rG   )r   	lock_func	lock_namerd1wr1rd2wr2r   rB   r	   fok
start_timer   s                 r
   _lockzFCNTLEINTRTest._lock  s   	(()*:*:;779S779SS#&BOOBHHb) ' $!(() * k "  E " OO, -	   tsCj94 i&&-WWS!_  U+ "^^-
e$
 !U]]+^^%
2!''+ .  IIK# ! -- ! s%   %G B"G"GG	GGAIXzAIX returns PermissionErrorc                 D    | j                  t        j                  d       y )Nlockf)r  r  r   r%   s    r
   
test_lockfzFCNTLEINTRTest.test_lockf  s    

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

5;;(r   N)
r;   r<   r=   r  r   r   r   systemr!  r$  r)   r   r
   r  r    s>     H X___X__&%/1NO) P))r   r  __main__)!
contextlibr!   r  rN   r   r   r   r   r0   r#   r  r   r   testr   test.supportr   r   r8   contextmanagerr   r   r   TestCaser   r@   r   r   r   r   r  r;   mainr)   r   r
   <module>r-     s      	      
     " &
 	   WV[13IJ'FH%% 'F K'FT WV[13IJe-- e- Ke-P WV[13IJs&m s& Ks&l WV[13IJ$M $ K$ WV[13IJ WV%6746*&m *&6 K
*&Z WV[13IJ5$m 5$ K5$p*)] *)Z zHMMO r   