
    4\hG                     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                     dS dS )    N)support)	os_helper)socket_helperg{Gz?c              #      K   	 | 5  	 | V  n#  |                                    xY w	 d d d            d S # 1 swxY w Y   d S N)kill)procs    :/opt/python-3.11.14/usr/lib/python3.11/test/_test_eintr.pykill_on_errorr   "   s      Q	  	JJJJ	IIKKK                  s   55$599	setitimerzrequires setitimer()c                   P    e Zd Z	 dZdZdZd Zd Zed             Z	d Z
d Zd Zd	S )
EINTRBaseTestg?g?c                 &    | xj         dz  c_         d S N   )signals)selfsignumframes      r
   
sighandlerzEINTRBaseTest.sighandler9   s        c                     d| _         t          j        t          j        | j                  | _        t          j        t          j        | j        | j                   t          j
        ddt          j                   d S )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<   su    "M&.$/JJ+T->+	- 	- 	-
 	)'/2~	? 	? 	? 	? 	? 	?r   c                  F    t          j        t           j        dd           d S Nr   )r   r   r    r   r
   
stop_alarmzEINTRBaseTest.stop_alarmG   s     +Q22222r   c                     |                                   t          j        t          j        | j                   t	          j                     d S r   )r*   r   r   r   r!   cancel_dump_traceback_laterr%   s    r
   tearDownzEINTRBaseTest.tearDownK   s>    fnd&7888022222r   c                 H    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.subprocessP   s,    ND)D0//B///r   c                 L    |                      || j        t          z
             d S r   )assertGreaterEqual
sleep_time	CLOCK_RES)r   elapseds     r
   check_elapsed_timez EINTRBaseTest.check_elapsed_timeT   s%    9)DEEEEEr   N)__name__
__module____qualname__r   r    r7   r   r&   staticmethodr*   r-   r0   r:   r)   r   r
   r   r   -   s        ' LM J  	? 	? 	? 3 3 \33 3 3
0 0 0F F F F 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dS )OSEINTRTestc                 @    d| j         z  }|                     |          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} fdt          |          D             }t          |          D ]} |             |D ]}|                                 d S )N   c                 8    g | ]}                                 S r)   )rC   ).0_r   s     r
   
<listcomp>z3OSEINTRTest._test_wait_multiple.<locals>.<listcomp>b   s%    BBB!T++--BBBr   )rangewait)r   	wait_funcnum	processesrH   r	   s   `     r
   _test_wait_multiplezOSEINTRTest._test_wait_multiple`   sq    BBBBuSzzBBB	s 	 	AIKKKK 	 	DIIKKKK	 	r   c                 D    |                      t          j                   d S r   )rO   osrK   r%   s    r
   	test_waitzOSEINTRTest.test_waiti   s      )))))r   wait3zrequires wait3()c                 2    |                      d            d S )Nc                  *    t          j        d          S r(   )rQ   rS   r)   r   r
   <lambda>z(OSEINTRTest.test_wait3.<locals>.<lambda>n   s    ! r   )rO   r%   s    r
   
test_wait3zOSEINTRTest.test_wait3l   s       !4!455555r   c                 v    |                                  } ||j                   |                                 d S r   )rC   pidrK   )r   rL   r	   s      r
   _test_wait_singlezOSEINTRTest._test_wait_singlep   s6    %%''	$(		r   c                 2    |                      d            d S )Nc                 ,    t          j        | d          S r(   )rQ   waitpidrY   s    r
   rV   z*OSEINTRTest.test_waitpid.<locals>.<lambda>w   s    2:c1+=+= r   rZ   r%   s    r
   test_waitpidzOSEINTRTest.test_waitpidv   s     ==>>>>>r   wait4zrequires wait4()c                 2    |                      d            d S )Nc                 ,    t          j        | d          S r(   )rQ   ra   r^   s    r
   rV   z(OSEINTRTest.test_wait4.<locals>.<lambda>{   s    28C+;+; r   r_   r%   s    r
   
test_wait4zOSEINTRTest.test_wait4y   s     ;;<<<<<r   c                 X   t          j                    \  }}|                     t           j        |           g d}d                    dddd|z  d| j        z  ddd	d
df
          }|                     |t          |          |g          }t          |          5  t          j        |           |D ]8}| 	                    |t          j
        |t          |                               9| 	                    |                                d           d d d            d S # 1 swxY w Y   d S )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   )rQ   pipe
addCleanupclosejoinr7   r0   strr   assertEqualreadlenrK   )r   rdwrdatasrB   r	   datas          r
   	test_readzOSEINTRTest.test_read}   sn   B"%%%
 .--yy"#5 / 2($
   tSWWt<<4   	- 	-HRLLL ? ?  rwr3t99'='=>>>>TYY[[!,,,		- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A8DD#&D#c                    t          j                    \  }}|                     t           j        |           dt          j        z  }d                    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          }|                     |t          |          |g          }t          |          5  t          j        |           d}|t          |          k     r@|t          j        |t          |          |d                    z  }|t          |          k     @|                     |                                d           d d d            d S # 1 swxY w Y   d S )N   xrf   zimport io, os, sys, timerg   zrd = int(sys.argv[1])ri   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))rk   r   )rQ   rm   rn   ro   r   PIPE_MAX_SIZErp   r7   r0   rq   r   rt   write
memoryviewrr   rK   )r   ru   rv   rx   rB   r	   writtens          r
   
test_writezOSEINTRTest.test_write   s   B"%%% g++yy&#/!66"/$&93(*>;'
  , tSWWt<<4   	- 	-HRLLLGCII%%28B
4(8(8(BCCC CII%%TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   8BEEEN)r;   r<   r=   rC   rO   rR   unittest
skipUnlesshasattrrQ   rW   rZ   r`   rd   ry   r   r)   r   r
   r@   r@   X   s        *% % %  * * * XW--/ABB6 6 CB6  ? ? ? XW--/ABB= = CB=- - -:$- $- $- $- $-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dS )SocketEINTRTest
socketpairzneeds socketpair()c                    t          j                    \  }}|                     |j                   g d}d                    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          }|	                                }| 
                    |t          |          |g          }t          |          5  |                                 |D ]/}|                     | ||t          |                               0|                     |                                d           d d d            d S # 1 swxY w Y   d S )N)r{      y   zrf   import os, socket, sys, timerg   fd = int(sys.argv[1])family = %ssock_type = %srh   ri   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)rk   r   )socketr   rn   ro   rp   intfamilytyper7   filenor0   rq   r   rr   rt   rK   )	r   	recv_funcru   rv   rw   rB   fdr	   rx   s	            r
   
_test_recvzSocketEINTRTest._test_recv   s   "$$B!!! #""yy*#C	NN*s27||+5 /7$6,&!
  & YY[[tSWWt<<4   	- 	-HHJJJ A A  yySYY'?'?@@@@TYY[[!,,,		- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A/EEEc                 N    |                      t          j        j                   d S r   )r   r   recvr%   s    r
   	test_recvzSocketEINTRTest.test_recv       *+++++r   recvmsgzneeds recvmsg()c                 2    |                      d            d S )Nc                 8    |                      |          d         S r(   )r   sockrx   s     r
   rV   z.SocketEINTRTest.test_recvmsg.<locals>.<lambda>   s    4<<+=+=a+@ r   )r   r%   s    r
   test_recvmsgzSocketEINTRTest.test_recvmsg   s    @@AAAAAr   c                 b   t          j                    \  }}|                     |j                   dt          j        dz  z  }d                    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          }|                                }|                     |t          |          |g          }t          |          5  |                                 d}|t          |          k     rJ ||t!          |          |d                    }	||	t          |          n|	z  }|t          |          k     J|                     |                                d           d d d            d S # 1 swxY w Y   d S )Ns   xyzrE   rf   r   rg   r   r   r   ri   zdata = b"xyz" * %sr|   z)rd = socket.fromfd(fd, family, sock_type)r   zwith rd:z$    # let the parent block on send()rj   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))rk   r   )r   r   rn   ro   r   SOCK_MAX_SIZErp   r   r   r   r7   r   r0   rq   r   rt   r   rr   rK   )
r   	send_funcru   rv   rx   rB   r   r	   r   sents
             r
   
_test_sendzSocketEINTRTest._test_send   s   "$$B!!! .!34yy*#C	NN*s27||+/ G$9Q$>?"72(5%F'>C1
  6 YY[[tSWWt<<4   	- 	-HHJJJGCII%% yZ%5%5ghh%?@@3t999$> CII%% TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   ;BF$$F(+F(c                 N    |                      t          j        j                   d S r   )r   r   sendr%   s    r
   	test_sendzSocketEINTRTest.test_send  r   r   c                 N    |                      t          j        j                   d S r   )r   r   sendallr%   s    r
   test_sendallzSocketEINTRTest.test_sendall!  s    -.....r   sendmsgzneeds sendmsg()c                 2    |                      d            d S )Nc                 .    |                      |g          S r   )r   r   s     r
   rV   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                   |                                d         }d                    dddt          j        z  d|z  d| j        z  dd	d
ddf
          }| 	                    |          }t          |          5  |                                \  }}|                                 |                     |                                d           d d d            d S # 1 swxY w Y   d S )Nr   r   rf   zimport socket, timerg   z	host = %rz	port = %sri   z# let parent block on accept()r}   z,with socket.create_connection((host, port)):rj   )r   create_serverr   HOSTrn   ro   getsocknamerp   r7   r0   r   acceptrr   rK   )r   r   portrB   r	   client_sockrH   s          r
   test_acceptzSocketEINTRTest.test_accept(  sT   #]%7$;<<
###!!!$yy!-,,$/,$:(
   t$$4   	- 	-![[]]NKTYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   0ADDD
   rE   mkfifozneeds mkfifo()c                 B   t           j        }t          j        |           	 t          j        |           n/# t
          $ r"}|                     d|z             Y d }~nd }~ww xY w|                     t           j        |           d                    ddd|z  d| j	        z  dddd|f	          }| 
                    |          }t          |          5   ||           |                     |                                d	           d d d            d S # 1 swxY w Y   d S )
Nzos.mkfifo(): %srf   import os, timerg   z	path = %ari   z# let the parent blockr}   r   )r   TESTFNunlinkrQ   r   PermissionErrorskipTestrn   rp   r7   r0   r   rr   rK   )r   do_open_close_readerdo_open_close_writerfilenameerB   r	   s          r
   
_test_openzSocketEINTRTest._test_openD  s    # 	"""	1Ih 	1 	1 	1MM+a/00000000	1	((333yy("/$$ 

 
 
 t$$4   	- 	-  ***TYY[[!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s'   7 
A#AA#4DDDc                 N    t          |d          }|                                 d S )Nw)openro   )r   pathfps      r
   python_openzSocketEINTRTest.python_openc  s     $__





r   darwinz+hangs under macOS; see bpo-25234, bpo-35363c                 <    |                      d| j                   d S )Nzfp = open(path, 'r')
fp.close())r   r   r%   s    r
   	test_openzSocketEINTRTest.test_openg  s-     	:(	* 	* 	* 	* 	*r   c                 l    t          j        |t           j                  }t          j        |           d S r   )rQ   r   O_WRONLYro   )r   r   r   s      r
   os_openzSocketEINTRTest.os_openm  s&    WT2;''
r   c                 <    |                      d| j                   d S )Nz,fd = os.open(path, os.O_RDONLY)
os.close(fd))r   r   r%   s    r
   test_os_openzSocketEINTRTest.test_os_openq  s,     	G	& 	& 	& 	& 	&r   N)r;   r<   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_freebsd_versionrQ   r   r   skipIfr#   platformr   r   r   r)   r   r
   r   r      s        .X668LMM!- !- NM!-F, , , X	::<MNNB B ONB,- ,- ,-\, , ,/ / / X	::<MNNA A ONA- - -8 &W%b!,,XX..0@AA- - BA -,-:   X_S\X-BD D* *D D*   X_S\X-BD D& &D D& & &r   r   c                       e Zd Z	 d ZdS )TimeEINTRTestc                     t          j                    }t          j        | j                   |                                  t          j                    |z
  }|                     |           d S r   )time	monotonicsleepr7   r*   r:   r   t0dts      r
   
test_sleepzTimeEINTRTest.test_sleep|  s]    ^
4?###^"#####r   N)r;   r<   r=   r   r)   r   r
   r   r   x  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	dS )SignalEINTRTestc                    t           j        }t          j                    }t          j         |d           }|                     t           j         ||           d                    ddt          j                    z  dt          |          z  d| j        z  ddf          }t          j        t           j	        |g          }|                     t           j        t           j
        |g           t          j                    }|                     |          }t          |          5   ||           t          j                    |z
  }	d d d            n# 1 swxY w Y   |                     |                                d	           d S )
Nc                      d S r   r)   )r2   s    r
   rV   z/SignalEINTRTest.check_sigwait.<locals>.<lambda>  s    $ r   rf   r   zpid = %szsignum = %sri   r}   zos.kill(pid, signum)r   )r   SIGUSR1rQ   getpidrn   rp   r   r7   r   	SIG_BLOCKSIG_UNBLOCKr   r   r0   r   rr   rK   )
r   rL   r   rY   old_handlerrB   old_maskr   r	   r   s
             r
   check_sigwaitzSignalEINTRTest.check_sigwait  s   ikkmF,>,>??v{;;;yy$CKK'/$"
   )&*:VHEE.0BVHMMM^t$$4   	' 	'If!!B&B	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	a(((((s   !"EEEsigwaitinfozneed signal.sigwaitinfo()c                 6    d }|                      |           d S )Nc                 0    t          j        | g           d S r   )r   r   r   s    r
   rL   z3SignalEINTRTest.test_sigwaitinfo.<locals>.wait_func  s    x(((((r   r   r   rL   s     r
   test_sigwaitinfoz SignalEINTRTest.test_sigwaitinfo  s-    	) 	) 	) 	9%%%%%r   sigtimedwaitc                 6    d }|                      |           d S )Nc                 2    t          j        | gd           d S )Ng      ^@)r   r   r   s    r
   rL   z4SignalEINTRTest.test_sigtimedwait.<locals>.wait_func  s    %00000r   r   r   s     r
   test_sigtimedwaitz!SignalEINTRTest.test_sigtimedwait  s-    	1 	1 	1 	9%%%%%r   N)
r;   r<   r=   r   r   r   r   r   r   r   r)   r   r
   r   r     s         /) ) )6 X7746 6& &6 6& X8846 6& &6 6& & &r   r   c                   v   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dS )SelectEINTRTestc                     t          j                    }t          j        g g g | j                   t          j                    |z
  }|                                  |                     |           d S r   )r   r   selectr7   r*   r:   r   s      r
   test_selectzSelectEINTRTest.test_select  sc    ^b"b$/222^"#####r   r   z(poll may fail on macOS; see issue #28087pollzneed select.pollc                 
   t          j                    }t          j                    }|                    | j        dz             t          j                    |z
  }|                                  |                     |           d S Ng     @@)r   r   r   r   r7   r*   r:   r   pollerr   r   s       r
   	test_pollzSelectEINTRTest.test_poll  sq     ^DOc)***^"#####r   epollzneed select.epollc                 8   t          j                    }|                     |j                   t	          j                    }|                    | j                   t	          j                    |z
  }|                                  | 	                    |           d S r   )
r   r  rn   ro   r   r   r   r7   r*   r:   r  s       r
   
test_epollzSelectEINTRTest.test_epoll  s~    %%%^DO$$$^"#####r   kqueuezneed select.kqueuec                 <   t          j                    }|                     |j                   t	          j                    }|                    d d| j                   t	          j                    |z
  }|                                  | 	                    |           d S r   )
r   r  rn   ro   r   r   controlr7   r*   r:   )r   r  r   r   s       r
   test_kqueuezSelectEINTRTest.test_kqueue  s    %%%^tQ000^"#####r   devpollzneed select.devpollc                 >   t          j                    }|                     |j                   t	          j                    }|                    | j        dz             t	          j                    |z
  }|                                  | 	                    |           d S r   )
r   r  rn   ro   r   r   r   r7   r*   r:   r  s       r
   test_devpollzSelectEINTRTest.test_devpoll  s    !!%%%^DOc)***^"#####r   N)r;   r<   r=   r   r   r   r#   r   r   r   r   r  r  r
  r  r)   r   r
   r   r     s5       .$ $ $ X_S\X-?A AX002DEE$ $ FEA A$ X113FGG$ $ HG$ X224HII$ $ JI$ X335JKK$ $ LK$ $ $r   r   c                   p    e Zd Zd Z ej         ej                    dk    d          d             Zd Z	dS )FNTLEINTRTestc                    |                      t          j        t          j                   d                    ddt          j        z  d|z  d| j        z  f          }t          j                    }|                     |          }t          |          5  t          t          j        d          5 }	 t          j                    |z
  }|dk    rt          d	|z            	  ||t          j        t          j        z              ||t          j                   t          j        d
           n# t"          $ r Y nw xY w ||t          j                   t          j                    |z
  }|                                  |                     |           d d d            n# 1 swxY w Y   |                                 d d d            d S # 1 swxY w Y   d S )Nrf   zimport fcntl, timezwith open('%s', 'wb') as f:z   fcntl.%s(f, fcntl.LOCK_EX)z   time.sleep(%s)wbTg      N@z failed to sync child in %.1f secg{Gz?)rn   r   r   r   rp   r7   r   r   r0   r   r   	ExceptionfcntlLOCK_EXLOCK_NBLOCK_UNr   BlockingIOErrorr*   r:   rK   )r   	lock_func	lock_namerB   
start_timer	   fr   s           r
   _lockzFNTLEINTRTest._lock  sF   	()*:;;;yy )I,<<+i7$/1	3 4 4
 ^%%
t$$4   	 	i&-- ,	))J6BDyy'(JR(OPPP!	!U]U]%BCCC!	!U]333
4((((*   	 	!U]+++^%%
2!!!''+++#, , , , , , , , , , , , , , ,$ IIKKK'	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s\   G.0FAD-,F-
D:7F9D::AFGF#	#G&F#	'GGGAIXzAIX returns PermissionErrorc                 F    |                      t          j        d           d S )Nlockf)r  r  r  r%   s    r
   
test_lockfzFNTLEINTRTest.test_lockf  s    

5;(((((r   c                 F    |                      t          j        d           d S )Nflock)r  r  r"  r%   s    r
   
test_flockzFNTLEINTRTest.test_flock  s    

5;(((((r   N)
r;   r<   r=   r  r   r   r   systemr   r#  r)   r   r
   r  r    sn          @ X__X_&&%/1NOO) ) PO)) ) ) ) )r   r  __main__) 
contextlibr!   r  rQ   r   r   r   r   r0   r#   r   r   testr   test.supportr   r   r8   contextmanagerr   r   r   TestCaser   r@   r   r   r   r   r  r;   mainr)   r   r
   <module>r,     sv            				         



         " " " " " " & & & & & &
 	    WWV[113IJJ'F 'F 'F 'F 'FH% 'F 'F KJ'FT WWV[113IJJe- e- e- e- e-- e- e- KJe-P WWV[113IJJs& s& s& s& s&m s& s& KJs&l WWV[113IJJ$ $ $ $ $M $ $ KJ$ WWV[113IJJ WWV%67746 6,& ,& ,& ,& ,&m ,& ,&6 6 KJ
,&^ WWV[113IJJ5$ 5$ 5$ 5$ 5$m 5$ 5$ KJ5$p&) &) &) &) &)M &) &) &)R zHMOOOOO r   