
    z%iF                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Zddl
mZmZ ddl
mZ ddl
mZ ddl
mZ ej"                  j%                  d       ej"                  j'                  d	       d
Zej*                  Z eed      Z ej0                  ed      Zej"                  j4                  Z ej0                  ed      Zd Zej                  Zej"                  j>                  fdZ ej"                  jC                         ejD                  d               Z# G d dejH                        Z% G d dejH                        Z& G d de	jN                        Z( G d de	jR                        Z* G d de	jV                  e(      Z,er G d de	jZ                  e(      Z. G d dejH                        Z/ G d d ejH                        Z0e1d!k(  r ejd                          yy)"z
Test suite for socketserver.
    N)reap_childrenverbose)	os_helper)socket_helper)threading_helpernetworkT)modules   hello world
AF_UNIXzrequires Unix socketszrequires forkingc                 P    t        t        d      rt        j                  |        yy)z7Call signal.alarm when it exists (i.e. not on Windows).alarmN)hasattrsignalr   )ns    J/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_socketserver.pysignal_alarmr   #   s    vwQ      c                 n    t        | gg g |      \  }}}| |v r| j                  |      S t        d|       )Nztimed out on )_real_selectrecvRuntimeError)sockr   timeoutrwxs         r   receiver   +   s=    D62r73GAq!qyyy|677r   c              #     K   t        j                         }|dk(  rt        j                  d       	 d 	 t        j                  j                  |d       y#   xY w# t        j                  j                  |d       w xY ww)zBTests that a custom child process is not waited on (Issue 1540386)r   H   N)exitcode)osfork_exittestsupportwait_process)testcasepids     r   simple_subprocessr(   3   si      '')C
ax
4
 	!!#!3!!#!3s'   /BA "BAA #BBc                   :   e Zd ZdZd Zd Zd Zd Zej                  d        Z
d Zd Zd	 Zd
 Zed        Zed        Zed        Zeed               Zd Zd Zed        Zed        Zed        Zeed               Zej                  d        Zd Zd Zd Zy)SocketServerTestzTest all socket servers.c                 6    t        d       d| _        g | _        y )N<   r   )r   	port_seed
test_filesselfs    r   setUpzSocketServerTest.setUpF   s    Rr   c                     t        d       t                | j                  D ]  }	 t        j                  |        g | j                  d d  y # t
        $ r Y 6w xY wNr   )r   r   r.   r    removeOSError)r0   fns     r   tearDownzSocketServerTest.tearDownK   sU    Q// 	B		"	
    s   A	AAc                     |t         j                  k(  rt        dfS t        j                         }| j
                  j                  |       |S r3   )socketAF_INETHOSTr   create_unix_domain_namer.   append)r0   protor6   s      r   pickaddrzSocketServerTest.pickaddrV   s?    FNN"!9 668BOO""2&Ir   c           	      0    G d d|      } G d d|      }t         rt        d       	  |||      }| j	                  j
                  |j                  j                                |S # t        $ r$}| j                  d|d|d|       Y d }~^d }~ww xY w)	Nc                       e Zd Zd Zy).SocketServerTest.make_server.<locals>.MyServerc                 &    | j                  |        N)close_requestr0   requestclient_addresss      r   handle_errorz;SocketServerTest.make_server.<locals>.MyServer.handle_errorb   s    ""7+r   N)__name__
__module____qualname__rI    r   r   MyServerrB   a   s    r   rN   c                       e Zd Zd Zy)/SocketServerTest.make_server.<locals>.MyHandlerc                 n    | j                   j                         }| j                  j                  |       y rD   )rfilereadlinewfilewrite)r0   lines     r   handlez6SocketServerTest.make_server.<locals>.MyHandler.handleg   s&    zz**,

  &r   NrJ   rK   rL   rW   rM   r   r   	MyHandlerrP   f   s    'r   rY   zcreating serverzCannot create server (z, z): )r   printPermissionErrorskipTestassertEqualserver_addressr9   getsockname)r0   addrsvrclshdlrbaserN   rY   serveres           r   make_serverzSocketServerTest.make_server`   s    	v 	
	' 	'
 E+,	-dI.F
 	..0I0I0KL  	-MM!4, - -	-s   	A( (	B1BBc                 (   | j                  | j                  |j                        ||      }|j                  }t        rt        d|       t        d|       t        j                  d|z  |j                  ddi      }d|_	        |j                          t        rt        d       t        d	      D ]'  }t        rt        d
|        ||j                  |       ) t        rt        d       |j                          |j                          |j                          | j                  d|j                   j#                                t$        r5t'        |t(        j*                        r| j-                  |j.                         t        rt        d       y y )NzADDR =zCLASS =z
%s servingpoll_interval{Gz?nametargetkwargsTzserver running   ztest clientzwaiting for serverdone)re   r?   address_familyr^   r   rZ   	threadingThreadserve_foreverdaemonstartrangeshutdownjoinserver_closer]   r9   filenoHAVE_FORKING
isinstancesocketserverForkingMixInassertFalseactive_children)r0   ra   rb   testfuncrc   r`   tis           r   
run_serverzSocketServerTest.run_serveru   s?   !!$--0E0E"F"((4 $$(D!)V$&'' $D)+ 		E*+q 	2AmQ/V**D1	2 E./	V]]1134Jv|/H/HI V334E&M7r   c                 F   t        j                   |t         j                        5 }|j                  |       |j                  t               t        |d      x}}|rd|vrt        |d      }||z  }|rd|vr| j                  |t               d d d        y # 1 sw Y   y xY wNd      
)r9   SOCK_STREAMconnectsendallTEST_STRr   r]   r0   r>   r`   sbufdatas         r   stream_examinezSocketServerTest.stream_examine   s    ]]5&"4"45 	,IIdOIIh C(C$5+q#t 5+ S(+	, 	, 	,s   AB8BB c                    t        j                   |t         j                        5 }t        r3|t         j                  k(  r |j	                  | j                  |             |j                  t        |       t        |d      x}}|rd|vrt        |d      }||z  }|rd|vr| j                  |t               d d d        y # 1 sw Y   y xY wr   )
r9   
SOCK_DGRAMHAVE_UNIX_SOCKETSr
   bindr?   sendtor   r   r]   r   s         r   dgram_examinezSocketServerTest.dgram_examine   s    ]]5&"3"34 	, Ufnn%<t}}U+,HHXt$ C(C$5+q#t 5+ S(+	, 	, 	,s   A;C !C  C	c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   	TCPServerStreamRequestHandlerr   r/   s    r   test_TCPServerzSocketServerTest.test_TCPServer   s(    ..$99++	-r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   ThreadingTCPServerr   r   r/   s    r   test_ThreadingTCPServerz(SocketServerTest.test_ThreadingTCPServer   s(    77$99++	-r   c                     t        |       5  | j                  t        j                  t        j                  | j
                         d d d        y # 1 sw Y   y xY wrD   )r(   r   r}   ForkingTCPServerr   r   r/   s    r   test_ForkingTCPServerz&SocketServerTest.test_ForkingTCPServer   sE    t$ 	1OOL99(== //1	1 	1 	1   :AAc                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   UnixStreamServerr   r   r/   s    r   test_UnixStreamServerz&SocketServerTest.test_UnixStreamServer   s(    55$99++	-r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   ThreadingUnixStreamServerr   r   r/   s    r   test_ThreadingUnixStreamServerz/SocketServerTest.test_ThreadingUnixStreamServer   s(    >>$99++	-r   c                     t        |       5  | j                  t        j                  t        j                  | j
                         d d d        y # 1 sw Y   y xY wrD   )r(   r   r}   ForkingUnixStreamServerr   r   r/   s    r   test_ForkingUnixStreamServerz-SocketServerTest.test_ForkingUnixStreamServer   sG     t$ 	1OOL@@(== //1	1 	1 	1r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   	UDPServerDatagramRequestHandlerr   r/   s    r   test_UDPServerzSocketServerTest.test_UDPServer   s(    ..$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   ThreadingUDPServerr   r   r/   s    r   test_ThreadingUDPServerz(SocketServerTest.test_ThreadingUDPServer   s(    77$;;**	,r   c                     t        |       5  | j                  t        j                  t        j                  | j
                         d d d        y # 1 sw Y   y xY wrD   )r(   r   r}   ForkingUDPServerr   r   r/   s    r   test_ForkingUDPServerz&SocketServerTest.test_ForkingUDPServer   sE    t$ 	0OOL99(?? ..0	0 	0 	0r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   UnixDatagramServerr   r   r/   s    r   test_UnixDatagramServerz(SocketServerTest.test_UnixDatagramServer   s(    77$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   ThreadingUnixDatagramServerr   r   r/   s    r    test_ThreadingUnixDatagramServerz1SocketServerTest.test_ThreadingUnixDatagramServer   s(    @@$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y rD   )r   r}   ForkingUnixDatagramServerr   r   r/   s    r   test_ForkingUnixDatagramServerz/SocketServerTest.test_ForkingUnixDatagramServer   s*     	>>$;;**	,r   c                     G d dt         j                        } G d dt         j                        }g }t        d      D ]O  } |t        df|      }t        j                  d|j                  dd	i
      }d|_        |j                  ||f       Q |D ]%  \  }}|j                          |j                          ' |D ]%  \  }}|j                          |j                          ' y )Nc                       e Zd Zy)0SocketServerTest.test_shutdown.<locals>.MyServerNrJ   rK   rL   rM   r   r   rN   r          r   rN   c                       e Zd Zy)1SocketServerTest.test_shutdown.<locals>.MyHandlerNr   rM   r   r   rY   r      r   r   rY      r   zMyServer servingrg   rh   ri   T)r}   r   r   rv   r;   rq   rr   rs   rt   r=   ru   rw   rx   ry   )r0   rN   rY   threadsr   r   r   s          r   test_shutdownzSocketServerTest.test_shutdown   s    	|-- 		99 	 r 	#A$I.A  ''-/A AHNNAq6"	#  	DAqGGIJJL	  	DAqFFHNN	r   c                      G d dt         j                  t         j                        } |t        dfd       }|j	                          y )Nc                       e Zd Zy)9SocketServerTest.test_close_immediately.<locals>.MyServerNr   rM   r   r   rN   r     r   r   rN   r   c                       y rD   rM   rM   r   r   <lambda>z9SocketServerTest.test_close_immediately.<locals>.<lambda>  s    r   )r}   ThreadingMixInr   r;   ry   )r0   rN   rc   s      r   test_close_immediatelyz'SocketServerTest.test_close_immediately  s:    	|22L4J4J 	 4)\2r   c                     t        d      D ]J  }| j                  t              5  t        j                  t
        dft        j                         d d d        L y # 1 sw Y   WxY w)Ni   rn   )rv   assertRaisesOverflowErrorr}   r   r;   r   )r0   r   s     r   test_tcpserver_bind_leakz)SocketServerTest.test_tcpserver_bind_leak  sd    
 t 	JA""=1 J&&bz'3'H'HJJ J	JJ Js   +AA#	c                     t        j                  t        dft         j                        5 }	 d d d        | j	                  dj
                  j                                y # 1 sw Y   4xY w)Nr   rn   )r}   r   r;   r   r]   r9   rz   )r0   rc   s     r   test_context_managerz%SocketServerTest.test_context_manager!  sZ    ##T1I$0$E$EG 	JP	 	V]]1134	 	s   A  A)N)rJ   rK   rL   __doc__r1   r7   r?   re   r   reap_threadsr   r   r   r   r   requires_forkingr   requires_unix_socketsr   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   r   r*   r*   C   s,   "
	 * "" " # "D,	,-
-
 1 1 - -
 - -
 1  1,
,
 0 0 , ,
 , ,
 ,  ,
 "" #2J5r   r*   c                   T    e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
e	d        Zd	 Zy
)ErrorHandlerTestzTest that the servers pass normal exceptions from the handler to
    handle_error(), and that exiting exceptions like SystemExit and
    KeyboardInterrupt are not passed.c                 J    t        j                  t         j                         y rD   )r   unlinkTESTFNr/   s    r   r7   zErrorHandlerTest.tearDown-  s    ))*r   c                 F    t        t               | j                  d       y NThandled)BaseErrorTestServer
ValueErrorcheck_resultr/   s    r   test_sync_handledz"ErrorHandlerTest.test_sync_handled0  s    J'$'r   c                     | j                  t              5  t        t               d d d        | j                  d       y # 1 sw Y   xY wNFr   )r   
SystemExitr   r   r/   s    r   test_sync_not_handledz&ErrorHandlerTest.test_sync_not_handled4  s>    z* 	,
+	,%(	, 	,s   AA
c                 F    t        t               | j                  d       y r   )ThreadingErrorTestServerr   r   r/   s    r   test_threading_handledz'ErrorHandlerTest.test_threading_handled9  s     ,$'r   c                     t        j                         5 }t        t               | j	                  d       | j                  |j                  t               d d d        y # 1 sw Y   y xY wr   )r   catch_threading_exceptionr   r   r   assertIsexc_type)r0   cms     r   test_threading_not_handledz+ErrorHandlerTest.test_threading_not_handled=  sP    779 	3R$Z0e,MM"++z2		3 	3 	3s   AA  A)c                 F    t        t               | j                  d       y r   )ForkingErrorTestServerr   r   r/   s    r   test_forking_handledz%ErrorHandlerTest.test_forking_handledD  s    z*$'r   c                 F    t        t               | j                  d       y r   )r   r   r   r/   s    r   test_forking_not_handledz)ErrorHandlerTest.test_forking_not_handledI  s    z*%(r   c                     t        t        j                        5 }dd|z  z   }| j                  |j	                         |       d d d        y # 1 sw Y   y xY w)NHandler called
Error handled
)openr   r   r]   read)r0   r   logexpecteds       r   r   zErrorHandlerTest.check_resultN  sM    )""# 	3s),=,GGHSXXZ2	3 	3 	3s   )AAN)rJ   rK   rL   r   r7   r   r   r   r   r   r   r   r   rM   r   r   r   r   (  sM    )+()
(3 ( ( ) )3r   r   c                   *     e Zd Z fdZd Zd Z xZS )r   c                 >   || _         t        | 	  t        dft               t        j                  | j                        5  	 d d d        	 | j                          | j                          | j                          y # 1 sw Y   ;xY w# | j                          w xY wr3   )	exceptionsuper__init__r;   
BadHandlerr9   create_connectionr^   handle_requestry   	wait_done)r0   r  	__class__s     r   r  zBaseErrorTestServer.__init__U  s    "$J/%%d&9&9: 			 !	 	
 s   A>B
 >B
Bc                     t        t        j                  d      5 }|j                  d       d d d        y # 1 sw Y   y xY w)Nar   )r   r   r   rU   )r0   rG   rH   r   s       r   rI   z BaseErrorTestServer.handle_error`  s6    )""C( 	)CII'(	) 	) 	)s   6?c                      y rD   rM   r/   s    r   r  zBaseErrorTestServer.wait_doned  s    r   )rJ   rK   rL   r  rI   r  __classcell__r	  s   @r   r   r   T  s    	)r   r   c                       e Zd Zd Zy)r  c                     t        t        j                  d      5 }|j                  d       d d d        | j                  j                  d      # 1 sw Y   $xY w)Nr  r   z
Test error)r   r   r   rU   rc   r  )r0   r   s     r   rW   zBadHandler.handlei  sK    )""C( 	*CII()	*kk##L11	* 	*s   AANrX   rM   r   r   r  r  h  s    2r   r  c                   .     e Zd Z fdZ fdZd Z xZS )r   c                 V    t        j                         | _        t        |   |i | y rD   )rq   Eventro   r  r  r0   poskwr	  s      r   r  z!ThreadingErrorTestServer.__init__q  s#    OO%	#$$r   c                 X    t        |   |i | | j                  j                          y rD   )r  shutdown_requestro   setr  s      r   r  z)ThreadingErrorTestServer.shutdown_requestu  s"     #,,		r   c                 8    | j                   j                          y rD   )ro   waitr/   s    r   r  z"ThreadingErrorTestServer.wait_doney  s    		r   )rJ   rK   rL   r  r  r  r  r  s   @r   r   r   o  s    %r   r   c                       e Zd Zy)r   Nr   rM   r   r   r   r   ~  s    r   r   c                       e Zd Zd Zd Zy)SocketWriterTestc                 B    G d dt         j                        }t        j                  t        df|      }| j	                  |j
                         t        j                  |j                  t        j                  t        j                        }|5  |j                  |j                         d d d        |j                          | j                  |j                  t        j                          | j#                  |j$                  |j&                         y # 1 sw Y   jxY w)Nc                       e Zd Zd Zy)-SocketWriterTest.test_basics.<locals>.Handlerc                     | j                   | j                  _         | j                   j                         | j                  _        | j                  j                         | j                  _        y rD   )rT   rc   rz   wfile_filenorG   request_filenor/   s    r   rW   z4SocketWriterTest.test_basics.<locals>.Handler.handle  sD    $(JJ!+/::+<+<+>(-1\\-@-@-B*r   NrX   rM   r   r   Handlerr!    s    Cr   r%  r   )r}   r   r   r;   
addCleanupry   r9   rp   r   IPPROTO_TCPr   r^   r  assertIsInstancerT   ioBufferedIOBaser]   r#  r$  )r0   r%  rc   r   s       r   test_basicszSocketWriterTest.test_basics  s    	Cl77 	C ''q	7;++,MM!!6#5#5v7I7IK 	-IIf++,	-fllB,=,=>,,f.C.CD		- 	-s   DDc                   	
 t         j                  j                  t        d       G d dt        j
                        }t	        j                  t        df|      | j                  j                         t        j                         fd}t        j                  t        j                  |      }| j                  t        j                  t        j                  |       d 
d 	t        j                         	
fd}t        j                  |      }|j                          j!                          |j#                          | j%                  j&                  t)        
             | j%                  
d       | j%                  j*                  d	       | j%                  j,                  t         j                  j.                         | j%                  	t         j                  j.                  d
z
         y )Npthread_killc                       e Zd Zd Zy),SocketWriterTest.test_write.<locals>.Handlerc                 8   | j                   j                  d      | j                  _        | j                  j                         | j                  _        dt        j                  j                  z  }| j                   j                  |      | j                  _
        y )N   write data
    )rT   rU   rc   sent1rR   rS   receivedr#   r$   SOCK_MAX_SIZEsent2)r0   	big_chunks     r   rW   z3SocketWriterTest.test_write.<locals>.Handler.handle  se    $(JJ$4$4_$E!'+zz':':'<$!DLL$>$>>	$(JJ$4$4Y$?!r   NrX   rM   r   r   r%  r/    s    @r   r%  r   c                 &    j                          y rD   )r  )signumframeinterrupteds     r   signal_handlerz3SocketWriterTest.test_write.<locals>.signal_handler  s    OOr   c                  0   t        j                   j                  t         j                  t         j                        } | 5  | j	                  d      5 }| j                  j                         |j                         | j                  d       |j                  d       	  t        j                         j                  t        d            rn4t        |j                               d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrb   client response
r      )r   )r9   rp   r   r'  makefiler   r^   rS   r   r   r   SIGUSR1r  floatlen)r   readerr;  main_threadr-  	received2	response1rc   s     r   
run_clientz/SocketWriterTest.test_write.<locals>.run_client  s    f33V5G5G""$A /AJJt$ /		&//0"OO-			./C   fnn="''a'9 
  .	#/ / / / / /s%   DBD /D D		DD)rk   r1  r?  r   )r#   r$   get_attributer   r}   r   r   r;   r&  ry   rq   r  rB  	get_identrr   ru   r  rx   r]   r3  rD  r4  r6  r5  )r0   r%  r<  originalrI  
backgroundr;  rF  r-  rG  rH  rc   s         @@@@@@r   
test_writezSocketWriterTest.test_write  sh    ||11&.I	@l77 	@ ''q	7;++,oo'	 ==@v~~x@		))+	/ 	/, %%Z8
s9~6O4*>?t||'A'ABDLL$>$>$DEr   N)rJ   rK   rL   r+  rN  rM   r   r   r  r    s    E"8Fr   r  c                       e Zd Zd Zd Zd Zy)MiscTestCasec                     g }t        t              D ]F  }|j                  d      rt        t        |      }t        |dd       dk(  s6|j	                  |       H | j                  t        j                  |       y )N_rK   r}   )dirr}   
startswithgetattrr=   assertCountEqual__all__)r0   r   rj   
mod_objects       r   test_allzMiscTestCase.test_all  sh    % 	*D??3'$\48
:|T:nLOOD)		*
 	l22H=r   c                     G d dt         j                        } |t        dft         j                        }t	        j                  |j
                  t        j                        }|j                  |j                         |j                          |j                          | j                  |j                  d       |j                          y )Nc                       e Zd Zd ZdZd Zy)SMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServerc                      y)NFrM   rF   s      r   verify_requestzbMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServer.verify_request  s    r   r   c                 n    | xj                   dz  c_         t        j                  j                  | |       y )Nr@  )shutdown_calledr}   r   r  )r0   rG   s     r   r  zdMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServer.shutdown_request  s)    $$)$&&77gFr   N)rJ   rK   rL   r^  r`  r  rM   r   r   rN   r\    s      OGr   rN   r   r@  )r}   r   r;   r   r9   rp   r   r   r^   closer  r]   r`  ry   )r0   rN   rc   r   s       r   4test_shutdown_request_called_if_verify_request_falsezAMiscTestCase.test_shutdown_request_called_if_verify_request_false  s    	G|-- 	G 4)\%F%FGMM&//1C1CD			&''(		//3r   c                     G d dt         j                  t         j                        } |t        dft         j                        }t        d      D ]:  }t        j                  |j                        5  |j                          ddd       < | j                  t        |j                        d       |j                          y# 1 sw Y   |xY w)z
        In #37193, users reported a memory leak
        due to the saving of every request thread. Ensure that
        not all threads are kept forever.
        c                       e Zd Zy)2MiscTestCase.test_threads_reaped.<locals>.MyServerNr   rM   r   r   rN   re    r   r   rN   r   
   N)r}   r   r   r;   r   rv   r9   r  r^   r  
assertLessrD  _threadsry   )r0   rN   rc   r   s       r   test_threads_reapedz MiscTestCase.test_threads_reaped  s    	|22L4J4J 	 4)\%F%FGr 	(A))&*?*?@ (%%'( (	( 	FOO,b1( (s   3CC	N)rJ   rK   rL   rY  rb  ri  rM   r   r   rP  rP    s    >*r   rP  __main__)3r   
contextlibr)  r    selectr   r9   rq   unittestr}   test.supportr#   r   r   r   r   r   r$   requiresrequires_working_socketr   r;   r   r   
skipUnlessr   has_fork_supportr{   r   r   r   SHORT_TIMEOUTr   requires_forkcontextmanagerr(   TestCaser*   r   r   r   BaseRequestHandlerr  r   r   r~   r   r  rP  rJ   mainrM   r   r   <module>ry     s    	 	        / " & )   i    $ $D $ 1 FI. +++,=,CE ||,,&8&&|5GH  }}!\\77 8 4  4b5x(( b5J)3x(( )3X,00 (200 2|:: !:!:<O JFx(( JFZ/8$$ /d zHMMO r   