
    dafE                        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ej                  Zej"                  j<                  fdZej"                  jA                         ejB                  d               Z" G d dejF                        Z$ G d dejF                        Z% G d de	jL                        Z' G d de	jP                        Z) G d de	jT                  e'      Z+er G d de	jX                  e'      Z- G d dejF                        Z. G d dejF                        Z/e0d k(  r ejb                          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                 n    t        | gg g |      \  }}}| |v r| j                  |      S t        d|       )Nztimed out on )_real_selectrecvRuntimeError)sockntimeoutrwxs         1/root/Python-3.12.4/Lib/test/test_socketserver.pyreceiver   &   s=    D62r73GAq!qyyy|677    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#   .   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                      d| _         g | _        y Nr   )	port_seed
test_filesselfs    r   setUpzSocketServerTest.setUpA   s    r   c                     t                | j                  D ]  }	 t        j                  |        g | j                  d d  y # t        $ r Y 6w xY wN)r   r)   r   removeOSError)r+   fns     r   tearDownzSocketServerTest.tearDownE   sN    // 	B		"	
    s   A	AAc                     |t         j                  k(  rt        dfS t        j                         }| j
                  j                  |       |S r'   )socketAF_INETHOSTr   create_unix_domain_namer)   append)r+   protor1   s      r   pickaddrzSocketServerTest.pickaddrO   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                  |        r.   )close_requestr+   requestclient_addresss      r   handle_errorz;SocketServerTest.make_server.<locals>.MyServer.handle_error[   s    ""7+r   N)__name__
__module____qualname__rC    r   r   MyServerr=   Z   s    r   rH   c                       e Zd Zd Zy)/SocketServerTest.make_server.<locals>.MyHandlerc                 n    | j                   j                         }| j                  j                  |       y r.   )rfilereadlinewfilewrite)r+   lines     r   handlez6SocketServerTest.make_server.<locals>.MyHandler.handle`   s&    zz**,

  &r   NrD   rE   rF   rQ   rG   r   r   	MyHandlerrJ   _   s    'r   rS   zcreating serverzCannot create server (z, z): )r   printPermissionErrorskipTestassertEqualserver_addressr4   getsockname)r+   addrsvrclshdlrbaserH   rS   serveres           r   make_serverzSocketServerTest.make_serverY   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)r_   r:   address_familyrX   r   rT   	threadingThreadserve_foreverdaemonstartrangeshutdownjoinserver_closerW   r4   filenoHAVE_FORKING
isinstancesocketserverForkingMixInassertFalseactive_children)r+   r[   r\   testfuncr]   rZ   tis           r   
run_serverzSocketServerTest.run_servern   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      
)r4   SOCK_STREAMconnectsendallTEST_STRr   rW   r+   r9   rZ   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   )
r4   
SOCK_DGRAMHAVE_UNIX_SOCKETSr
   bindr:   sendtor   r   rW   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 r.   )r~   rw   	TCPServerStreamRequestHandlerr   r*   s    r   test_TCPServerzSocketServerTest.test_TCPServer   s(    ..$99++	-r   c                 v    | j                  t        j                  t        j                  | j                         y r.   )r~   rw   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r.   )r#   r~   rw   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 r.   )r~   rw   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 r.   )r~   rw   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r.   )r#   r~   rw   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 r.   )r~   rw   	UDPServerDatagramRequestHandlerr   r*   s    r   test_UDPServerzSocketServerTest.test_UDPServer   s(    ..$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y r.   )r~   rw   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r.   )r#   r~   rw   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 r.   )r~   rw   UnixDatagramServerr   r   r*   s    r   test_UnixDatagramServerz(SocketServerTest.test_UnixDatagramServer   s(    77$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y r.   )r~   rw   ThreadingUnixDatagramServerr   r   r*   s    r    test_ThreadingUnixDatagramServerz1SocketServerTest.test_ThreadingUnixDatagramServer   s(    @@$;;**	,r   c                 v    | j                  t        j                  t        j                  | j                         y r.   )r~   rw   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rD   rE   rF   rG   r   r   rH   r          r   rH   c                       e Zd Zy)1SocketServerTest.test_shutdown.<locals>.MyHandlerNr   rG   r   r   rS   r      r   r   rS      r   zMyServer servingra   rb   rc   T)rw   r   r   rp   r6   rk   rl   rm   rn   r8   ro   rq   rr   rs   )r+   rH   rS   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   rG   r   r   rH   r   
  r   r   rH   r   c                       y r.   rG   rG   r   r   <lambda>z9SocketServerTest.test_close_immediately.<locals>.<lambda>  s    r   )rw   ThreadingMixInr   r6   rs   )r+   rH   r]   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   rh   )rp   assertRaisesOverflowErrorrw   r   r6   r   )r+   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   rh   )rw   r   r6   r   rW   r4   rt   )r+   r]   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)rD   rE   rF   __doc__r,   r2   r:   r_   r   reap_threadsr~   r   r   r   r   requires_forkingr   requires_unix_socketsr   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r%   r%   >   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 r.   )r   unlinkTESTFNr*   s    r   r2   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_handled)  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_handled-  s>    z* 	,
+	,%(	, 	,s   AA
c                 F    t        t               | j                  d       y r   )ThreadingErrorTestServerr   r   r*   s    r   test_threading_handledz'ErrorHandlerTest.test_threading_handled2  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)r+   cms     r   test_threading_not_handledz+ErrorHandlerTest.test_threading_not_handled6  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_handled=  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_handledB  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   rW   read)r+   r   logexpecteds       r   r   zErrorHandlerTest.check_resultG  sM    )""# 	3s),=,GGHSXXZ2	3 	3 	3s   )AAN)rD   rE   rF   r   r2   r   r   r   r   r   r   r   r   rG   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r'   )	exceptionsuper__init__r6   
BadHandlerr4   create_connectionrX   handle_requestrs   	wait_done)r+   r   	__class__s     r   r   zBaseErrorTestServer.__init__N  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   rO   )r+   rA   rB   r   s       r   rC   z BaseErrorTestServer.handle_errorY  s6    )""C( 	)CII'(	) 	) 	)s   6?c                      y r.   rG   r*   s    r   r  zBaseErrorTestServer.wait_done]  s    r   )rD   rE   rF   r   rC   r  __classcell__r  s   @r   r   r   M  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   rO   r]   r   )r+   r   s     r   rQ   zBadHandler.handleb  sK    )""C( 	*CII()	*kk##L11	* 	*s   AANrR   rG   r   r   r   r   a  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 r.   )rk   Eventri   r   r   r+   poskwr  s      r   r   z!ThreadingErrorTestServer.__init__j  s#    OO%	#$$r   c                 X    t        |   |i | | j                  j                          y r.   )r   shutdown_requestri   setr  s      r   r  z)ThreadingErrorTestServer.shutdown_requestn  s"     #,,		r   c                 8    | j                   j                          y r.   )ri   waitr*   s    r   r  z"ThreadingErrorTestServer.wait_doner  s    		r   )rD   rE   rF   r   r  r  r  r  s   @r   r   r   h  s    %r   r   c                       e Zd Zy)r   Nr   rG   r   r   r   r   w  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 r.   )rN   r]   rt   wfile_filenorA   request_filenor*   s    r   rQ   z4SocketWriterTest.test_basics.<locals>.Handler.handle~  sD    $(JJ!+/::+<+<+>(-1\\-@-@-B*r   NrR   rG   r   r   Handlerr  }  s    Cr   r  r   )rw   r   r   r6   
addCleanuprs   r4   rj   r   IPPROTO_TCPr   rX   r  assertIsInstancerN   ioBufferedIOBaserW   r  r  )r+   r  r]   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
    )rN   rO   r]   sent1rL   rM   receivedr   r   SOCK_MAX_SIZEsent2)r+   	big_chunks     r   rQ   z3SocketWriterTest.test_write.<locals>.Handler.handle  se    $(JJ$4$4_$E!'+zz':':'<$!DLL$>$>>	$(JJ$4$4Y$?!r   NrR   rG   r   r   r  r)    s    @r   r  r   c                 &    j                          y r.   )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   )r4   rj   r   r!  makefiler   rX   rM   r   r   signalSIGUSR1r  floatlen)r   readerr5  main_threadr'  	received2	response1r]   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)re   r+  r9  r   )r   r   get_attributer<  rw   r   r   r6   r   rs   rk   r  r=  	get_identrl   ro   r  rr   rW   r-  r?  r.  r0  r/  )r+   r  r6  originalrD  
backgroundr5  rA  r'  rB  rC  r]   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)rD   rE   rF   r%  rI  rG   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_rE   rw   )dirrw   
startswithgetattrr8   assertCountEqual__all__)r+   r   rd   
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)NFrG   r@   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_calledrw   r   r  )r+   rA   s     r   r  zdMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServer.shutdown_request  s)    $$)$&&77gFr   N)rD   rE   rF   rY  r[  r  rG   r   r   rH   rW    s      OGr   rH   r   r:  )rw   r   r6   r   r4   rj   r   r   rX   closer  rW   r[  rs   )r+   rH   r]   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   rG   r   r   rH   r`    r   r   rH   r   
   N)rw   r   r   r6   r   rp   r4   r   rX   r  
assertLessr?  _threadsrs   )r+   rH   r]   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)rD   rE   rF   rT  r]  rd  rG   r   r   rK  rK    s    >*r   rK  __main__)2r   
contextlibr#  r   selectr<  r4   rk   unittestrw   test.supportr   r   r   r   r   r   r   requiresrequires_working_socketr   r6   hasattrr   
skipUnlessr   has_fork_supportru   r   r   SHORT_TIMEOUTr   requires_forkcontextmanagerr#   TestCaser%   r   r   r   BaseRequestHandlerr   r   r   rx   r   r  rK  rD   mainrG   r   r   <module>ru     s    	 	        / " & )   i    $ $D $ 1 FI. +++,=,CE ||,,&8&&|5GH  }}!\\77 8 4  4`5x(( `5F)3x(( )3X,00 (200 2|:: !:!:<O JFx(( JFZ/8$$ /d zHMMO r   