a
    zeF                     @   s  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ZddlmZmZmZ ddlmZ ejd dZejZeedZe	edZeed	Ze	ed
Zdd ZejZejjfddZererG dd de
je
j Z!G dd de
je
j"Z#ej$dd Z%G dd de	j&Z'G dd de	j&Z(G dd de
j)Z*G dd de
j+Z,G dd de
j-e*Z.erG dd  d e
je*Z/G d!d" d"e	j&Z0G d#d$ d$e	j&Z1e2d%kre	3  dS )&z
Test suite for socketserver.
    N)reap_childrenreap_threadsverbose)socket_helperZnetworks   hello world
AF_UNIXzrequires Unix socketsforkzrequires forkingc                 C   s   t tdrt|  dS )z7Call signal.alarm when it exists (i.e. not on Windows).alarmN)hasattrsignalr   )n r   ,/usr/lib/python3.9/test/test_socketserver.pysignal_alarm    s    
r   c                 C   s:   t | gg g |\}}}| |v r(| |S td| f d S )Nztimed out on %r)_real_selectrecvRuntimeError)sockr   timeoutrwxr   r   r   receive(   s    
r   c                   @   s   e Zd ZdS )ForkingUnixStreamServerN__name__
__module____qualname__r   r   r   r   r   0   s   r   c                   @   s   e Zd ZdS )ForkingUnixDatagramServerNr   r   r   r   r   r   4   s   r   c              
   c   s`   t  }|dkrt d z.z
dV  W n    Y n0 W tjj|dd ntjj|dd 0 dS )zBTests that a custom child process is not waited on (Issue 1540386)r   H   N)exitcode)osr   _exittestsupportZwait_process)Ztestcasepidr   r   r   simple_subprocess9   s    


r%   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dd Z
dd Zdd Zdd Zedd Zedd Zedd Zeedd Zdd Zdd Zed d! Zed"d# Zed$d% Zeed&d' Zed(d) Zd*d+ Zd,d- Zd.d/ Zd0S )1SocketServerTestzTest all socket servers.c                 C   s   t d d| _g | _d S )N<   r   )r   Z	port_seed
test_filesselfr   r   r   setUpK   s    zSocketServerTest.setUpc              	   C   sN   t d t  | jD ]&}zt| W q ty8   Y q0 qg | jd d < d S Nr   )r   r   r(   r    removeOSError)r*   fnr   r   r   tearDownP   s    
zSocketServerTest.tearDownc                 C   s8   |t jkrtdfS d }tjd|d}| j| |S d S )Nr   zunix_socket.)prefixdir)socketAF_INETHOSTtempfilemktempr(   append)r*   protor2   r/   r   r   r   pickaddr[   s    
zSocketServerTest.pickaddrc              
   C   s   G dd d|}G dd d|}t r,td z|||}W n8 tyr } z | d|||f  W Y d }~n
d }~0 0 | |j|j  |S )Nc                   @   s   e Zd Zdd ZdS )z.SocketServerTest.make_server.<locals>.MyServerc                 S   s   |  |  d S N)Zclose_requestr*   requestclient_addressr   r   r   handle_errorh   s    
z;SocketServerTest.make_server.<locals>.MyServer.handle_errorN)r   r   r   r?   r   r   r   r   MyServerg   s   r@   c                   @   s   e Zd Zdd ZdS )z/SocketServerTest.make_server.<locals>.MyHandlerc                 S   s   | j  }| j| d S r;   )rfilereadlinewfilewrite)r*   liner   r   r   handlem   s    
z6SocketServerTest.make_server.<locals>.MyHandler.handleNr   r   r   rF   r   r   r   r   	MyHandlerl   s   rH   zcreating serverz!Cannot create server (%s, %s): %s)r   printPermissionErrorZskipTestassertEqualserver_addressr3   getsockname)r*   addrsvrclshdlrbaser@   rH   serverer   r   r   make_serverf   s    zSocketServerTest.make_serverc                 C   s   |  | |j||}|j}tr4td| td| tjd| |jddid}d|_	|
  trhtd td	D ]}trtd
| ||j| qptrtd |  |  |  | d|j  trt|tjr| |j trtd d S )NzADDR =zCLASS =z
%s servingpoll_interval{Gz?nametargetkwargsTzserver running   ztest clientzwaiting for serverdone)rS   r:   address_familyrL   r   rI   	threadingThreadserve_foreverdaemonstartrangeshutdownjoinserver_closerK   r3   filenoHAVE_FORKING
isinstancesocketserverForkingMixInZassertFalseactive_children)r*   rO   rP   ZtestfuncrQ   rN   tir   r   r   
run_server{   s4    

zSocketServerTest.run_serverc                 C   s   t  |t j^}|| |t t|d }}|rRd|vrRt|d}||7 }q2| |t W d    n1 sr0    Y  d S Nd      
)r3   SOCK_STREAMconnectsendallTEST_STRr   rK   r*   r9   rN   sbufdatar   r   r   stream_examine   s    



zSocketServerTest.stream_examinec                 C   s   t  |t jt}tr.|t jkr.|| | |t| t|d }}|rhd|vrht|d}||7 }qH| 	|t W d    n1 s0    Y  d S rp   )
r3   
SOCK_DGRAMHAVE_UNIX_SOCKETSr   bindr:   sendtorv   r   rK   rw   r   r   r   dgram_examine   s    

zSocketServerTest.dgram_examinec                 C   s   |  tjtj| j d S r;   )ro   rj   	TCPServerStreamRequestHandlerr{   r)   r   r   r   test_TCPServer   s    zSocketServerTest.test_TCPServerc                 C   s   |  tjtj| j d S r;   )ro   rj   ZThreadingTCPServerr   r{   r)   r   r   r   test_ThreadingTCPServer   s    z(SocketServerTest.test_ThreadingTCPServerc                 C   s@   t | $ | tjtj| j W d    n1 s20    Y  d S r;   )r%   ro   rj   ZForkingTCPServerr   r{   r)   r   r   r   test_ForkingTCPServer   s
    
z&SocketServerTest.test_ForkingTCPServerc                 C   s   |  tjtj| j d S r;   )ro   rj   UnixStreamServerr   r{   r)   r   r   r   test_UnixStreamServer   s    z&SocketServerTest.test_UnixStreamServerc                 C   s   |  tjtj| j d S r;   )ro   rj   ZThreadingUnixStreamServerr   r{   r)   r   r   r   test_ThreadingUnixStreamServer   s    z/SocketServerTest.test_ThreadingUnixStreamServerc                 C   s>   t | " | ttj| j W d    n1 s00    Y  d S r;   )r%   ro   r   rj   r   r{   r)   r   r   r   test_ForkingUnixStreamServer   s
    
z-SocketServerTest.test_ForkingUnixStreamServerc                 C   s   |  tjtj| j d S r;   )ro   rj   Z	UDPServerDatagramRequestHandlerr   r)   r   r   r   test_UDPServer   s    zSocketServerTest.test_UDPServerc                 C   s   |  tjtj| j d S r;   )ro   rj   ZThreadingUDPServerr   r   r)   r   r   r   test_ThreadingUDPServer   s    z(SocketServerTest.test_ThreadingUDPServerc                 C   s@   t | $ | tjtj| j W d    n1 s20    Y  d S r;   )r%   ro   rj   ZForkingUDPServerr   r   r)   r   r   r   test_ForkingUDPServer   s
    
z&SocketServerTest.test_ForkingUDPServerc                 C   s   |  tjtj| j d S r;   )ro   rj   UnixDatagramServerr   r   r)   r   r   r   test_UnixDatagramServer   s    z(SocketServerTest.test_UnixDatagramServerc                 C   s   |  tjtj| j d S r;   )ro   rj   ZThreadingUnixDatagramServerr   r   r)   r   r   r    test_ThreadingUnixDatagramServer   s    z1SocketServerTest.test_ThreadingUnixDatagramServerc                 C   s   |  ttj| j d S r;   )ro   r   rj   r   r   r)   r   r   r   test_ForkingUnixDatagramServer   s    z/SocketServerTest.test_ForkingUnixDatagramServerc                 C   s   G dd dt j}G dd dt j}g }tdD ]<}|tdf|}tjd|jdd	id
}d|_|	||f q0|D ]\}}|
  |  qr|D ]\}}|  |  qd S )Nc                   @   s   e Zd ZdS )z0SocketServerTest.test_shutdown.<locals>.MyServerNr   r   r   r   r   r@      s   r@   c                   @   s   e Zd ZdS )z1SocketServerTest.test_shutdown.<locals>.MyHandlerNr   r   r   r   r   rH     s   rH      r   zMyServer servingrT   rU   rV   T)rj   r   r   rc   r5   r^   r_   r`   ra   r8   rb   rd   re   rf   )r*   r@   rH   threadsrn   rx   rm   r   r   r   test_shutdown   s$    
zSocketServerTest.test_shutdownc                 C   s4   G dd dt jt j}|tdfdd }|  d S )Nc                   @   s   e Zd ZdS )z9SocketServerTest.test_close_immediately.<locals>.MyServerNr   r   r   r   r   r@     s   r@   r   c                   S   s   d S r;   r   r   r   r   r   <lambda>      z9SocketServerTest.test_close_immediately.<locals>.<lambda>)rj   ThreadingMixInr   r5   rf   )r*   r@   rQ   r   r   r   test_close_immediately  s    z'SocketServerTest.test_close_immediatelyc              	   C   sN   t dD ]@}| t" ttdftj W d    q1 s>0    Y  qd S )Ni   r[   )rc   assertRaisesOverflowErrorrj   r   r5   r   )r*   rn   r   r   r   test_tcpserver_bind_leak  s
    
z)SocketServerTest.test_tcpserver_bind_leakc                 C   sH   t tdft j}W d    n1 s(0    Y  | d|j  d S )Nr   r[   )rj   r   r5   r   rK   r3   rg   )r*   rQ   r   r   r   test_context_manager'  s    
z%SocketServerTest.test_context_managerN)r   r   r   __doc__r+   r0   r:   rS   r   ro   r{   r   r   r   requires_forkingr   requires_unix_socketsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   H   sH   
"








r&   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
e	dd Zdd ZdS )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                 C   s   t jt jj d S r;   )r"   r#   unlinkTESTFNr)   r   r   r   r0   3  s    zErrorHandlerTest.tearDownc                 C   s   t t | jdd d S NThandled)BaseErrorTestServer
ValueErrorcheck_resultr)   r   r   r   test_sync_handled6  s    z"ErrorHandlerTest.test_sync_handledc                 C   sB   |  t tt W d    n1 s(0    Y  | jdd d S NFr   )r   
SystemExitr   r   r)   r   r   r   test_sync_not_handled:  s    &z&ErrorHandlerTest.test_sync_not_handledc                 C   s   t t | jdd d S r   )ThreadingErrorTestServerr   r   r)   r   r   r   test_threading_handled?  s    z'ErrorHandlerTest.test_threading_handledc                 C   s   t t | jdd d S r   )r   r   r   r)   r   r   r   test_threading_not_handledC  s    z+ErrorHandlerTest.test_threading_not_handledc                 C   s   t t | jdd d S r   )ForkingErrorTestServerr   r   r)   r   r   r   test_forking_handledG  s    z%ErrorHandlerTest.test_forking_handledc                 C   s   t t | jdd d S r   )r   r   r   r)   r   r   r   test_forking_not_handledL  s    z)ErrorHandlerTest.test_forking_not_handledc                 C   sL   t tjj,}dd|  }| | | W d    n1 s>0    Y  d S )NHandler called
Error handled
)openr"   r#   r   rK   read)r*   r   logexpectedr   r   r   r   Q  s    zErrorHandlerTest.check_resultN)r   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   .  s   

r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )r   c                    sp   || _ t tdft t| j W d    n1 s:0    Y  z|   W | 	  n
| 	  0 | 
  d S r,   )	exceptionsuper__init__r5   
BadHandlerr3   create_connectionrL   handle_requestrf   	wait_done)r*   r   	__class__r   r   r   X  s    
zBaseErrorTestServer.__init__c                 C   s<   t tjjd}|d W d    n1 s.0    Y  d S )Nar   )r   r"   r#   r   rD   )r*   r=   r>   r   r   r   r   r?   c  s    z BaseErrorTestServer.handle_errorc                 C   s   d S r;   r   r)   r   r   r   r   g  s    zBaseErrorTestServer.wait_done)r   r   r   r   r?   r   __classcell__r   r   r   r   r   W  s   r   c                   @   s   e Zd Zdd ZdS )r   c                 C   sH   t tjjd}|d W d    n1 s.0    Y  | jdd S )Nr   r   z
Test error)r   r"   r#   r   rD   rQ   r   )r*   r   r   r   r   rF   l  s    (zBadHandler.handleNrG   r   r   r   r   r   k  s   r   c                       s0   e Zd Z fddZ fddZdd Z  ZS )r   c                    s    t  | _t j|i | d S r;   )r^   Eventr\   r   r   r*   poskwr   r   r   r   t  s    
z!ThreadingErrorTestServer.__init__c                    s    t  j|i | | j  d S r;   )r   shutdown_requestr\   setr   r   r   r   r   x  s    z)ThreadingErrorTestServer.shutdown_requestc                 C   s   | j   d S r;   )r\   waitr)   r   r   r   r   |  s    z"ThreadingErrorTestServer.wait_done)r   r   r   r   r   r   r   r   r   r   r   r   r  s   r   c                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )SocketWriterTestc                 C   s   G dd dt j}t tdf|}| |j t|jtjtj	}| |
|j W d    n1 sh0    Y  |  | |jtj | |j|j d S )Nc                   @   s   e Zd Zdd ZdS )z-SocketWriterTest.test_basics.<locals>.Handlerc                 S   s*   | j | j_ | j  | j_| j | j_d S r;   )rC   rQ   rg   wfile_filenor=   request_filenor)   r   r   r   rF     s    
z4SocketWriterTest.test_basics.<locals>.Handler.handleNrG   r   r   r   r   Handler  s   r   r   )rj   r   r   r5   
addCleanuprf   r3   r]   rs   IPPROTO_TCPrt   rL   r   ZassertIsInstancerC   ioBufferedIOBaserK   r   r   )r*   r   rQ   rx   r   r   r   test_basics  s    *zSocketWriterTest.test_basicsc                    s  t jtdG dd dtj}ttdf|| j	 t
   fdd}ttj|}| tjtj| d d t
  fdd}t
j|d	}|    |  | jt | d
 | jd | jt jj | t jjd  d S )Npthread_killc                   @   s   e Zd Zdd ZdS )z,SocketWriterTest.test_write.<locals>.Handlerc                 S   s>   | j d| j_| j | j_dtjj	 }| j || j_
d S )N   write data
    )rC   rD   rQ   sent1rA   rB   receivedr"   r#   SOCK_MAX_SIZEsent2)r*   Z	big_chunkr   r   r   rF     s    z3SocketWriterTest.test_write.<locals>.Handler.handleNrG   r   r   r   r   r     s   r   r   c                    s       d S r;   )r   )signumframe)interruptedr   r   signal_handler  s    z3SocketWriterTest.test_write.<locals>.signal_handlerc               	      s   t  jt jt j} |  | dd}| j | | d |	d t
j  jtddrNqnqNt|	 W d    n1 s0    Y  W d    n1 s0    Y  d S )Nrb   client response
rq      )r   )r3   r]   rs   r   makefilert   rL   rB   ru   r   r
   SIGUSR1r   floatlen)rx   readerr   main_threadr   Z	received2Z	response1rQ   r   r   
run_client  s    

z/SocketWriterTest.test_write.<locals>.run_client)rX   r   r   rq   )r"   r#   Zget_attributer
   rj   r   r   r5   r   rf   r^   r   r   	get_identr_   rb   r   re   rK   r   r   r   r   r   )r*   r   r   Zoriginalr   Z
backgroundr   r   r   
test_write  s*    zSocketWriterTest.test_writeN)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MiscTestCasec                 C   sR   g }t tD ]2}|dstt|}t|dd dkr|| q| tj| d S )N_r   rj   )r2   rj   
startswithgetattrr8   ZassertCountEqual__all__)r*   r   rW   Z
mod_objectr   r   r   test_all  s    

zMiscTestCase.test_allc                 C   sh   G dd dt j}|tdft j}t|jtj}||j |	  |
  | |jd |  d S )Nc                   @   s    e Zd Zdd ZdZdd ZdS )zSMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServerc                 S   s   dS )NFr   r<   r   r   r   verify_request  s    zbMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServer.verify_requestr   c                 S   s    |  j d7  _ tj| | d S )Nr   )shutdown_calledrj   r   r   )r*   r=   r   r   r   r     s    zdMiscTestCase.test_shutdown_request_called_if_verify_request_false.<locals>.MyServer.shutdown_requestN)r   r   r   r   r   r   r   r   r   r   r@     s   r@   r   r   )rj   r   r5   r   r3   r]   rs   rt   rL   closer   rK   r   rf   )r*   r@   rQ   rx   r   r   r   4test_shutdown_request_called_if_verify_request_false  s    	zAMiscTestCase.test_shutdown_request_called_if_verify_request_falsec              	   C   s   G dd dt jt j}|tdft j}tdD ]8}t|j |	  W d   q.1 s\0    Y  q.| 
t|jd |  dS )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                   @   s   e Zd ZdS )z2MiscTestCase.test_threads_reaped.<locals>.MyServerNr   r   r   r   r   r@     s   r@   r   
   N)rj   r   r   r5   r   rc   r3   r   rL   r   Z
assertLessr   Z_threadsrf   )r*   r@   rQ   r   r   r   r   test_threads_reaped  s    (z MiscTestCase.test_threads_reapedN)r   r   r   r   r   r   r   r   r   r   r     s   
r   __main__)4r   
contextlibr   r    selectr
   r3   r6   r^   Zunittestrj   Ztest.supportr"   r   r   r   r   r#   Zrequiresrv   r5   r	   r}   Z
skipUnlessr   rh   r   r   r   ZSHORT_TIMEOUTr   rk   r   r   r   r   contextmanagerr%   ZTestCaser&   r   r   r   ZBaseRequestHandlerr   r   r   r   r   r   r   mainr   r   r   r   <module>   s`   


 g)M2
