o
    HXhG                     @   s  	 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 d dl
mZ d dl
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rerG 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 dS )'    N)reap_childrenverbose)	os_helper)socket_helper)threading_helpernetworks   hello world
AF_UNIXzrequires Unix socketsforkzrequires forkingc                 C   s   	 t tdrt|  d S d S )Nalarm)hasattrsignalr
   )n r   @/opt/python-3.10.19/usr/lib/python3.10/test/test_socketserver.pysignal_alarm"   s   
r   c                 C   s6   t | gg g |\}}}| |v r| |S td| f )Nztimed out on %r)_real_selectrecvRuntimeError)sockr   timeoutrwxr   r   r   receive*   s   
r   c                   @      e Zd ZdS )ForkingUnixStreamServerN__name__
__module____qualname__r   r   r   r   r   2       r   c                   @   r   )ForkingUnixDatagramServerNr   r   r   r   r   r!   6   r    r!   c              
   c   s\    	 t  }|dkrt d zzd V  W n    W tjj|dd d S tjj|dd w )Nr   H   )exitcode)osr	   _exittestsupportZwait_process)Ztestcasepidr   r   r   simple_subprocess;   s   

&r)   c                   @   s   e Zd Z	 dd Zdd Zdd Zdd Zej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jd'd( Zd)d* Zd+d, Zd-d. Zd/S )0SocketServerTestc                 C   s   t d d| _g | _d S )N<   r   )r   Z	port_seed
test_filesselfr   r   r   setUpM   s   
zSocketServerTest.setUpc              	   C   sL   t d t  | jD ]}zt| W q
 ty   Y q
w g | jd d < d S Nr   )r   r   r,   r$   removeOSError)r.   fnr   r   r   tearDownR   s   
zSocketServerTest.tearDownc                 C   s4   |t jkr	tdfS d }tjd|d}| j| |S )Nr   zunix_socket.)prefixdir)socketAF_INETHOSTtempfilemktempr,   append)r.   protor6   r3   r   r   r   pickaddr]   s   
zSocketServerTest.pickaddrc              
   C   s   G dd d|}G dd d|}t rtd z|||}W n ty9 } z| d|||f  W Y d }~nd }~ww | |j|j  |S )Nc                   @      e Zd Zdd ZdS )z.SocketServerTest.make_server.<locals>.MyServerc                 S   s   |  |  N)Zclose_requestr.   requestclient_addressr   r   r   handle_errorj   s   
z;SocketServerTest.make_server.<locals>.MyServer.handle_errorN)r   r   r   rD   r   r   r   r   MyServeri       rE   c                   @   r?   )z/SocketServerTest.make_server.<locals>.MyHandlerc                 S   s   | j  }| j| d S r@   )rfilereadlinewfilewrite)r.   liner   r   r   handleo   s   
z6SocketServerTest.make_server.<locals>.MyHandler.handleNr   r   r   rL   r   r   r   r   	MyHandlern   rF   rN   zcreating serverz!Cannot create server (%s, %s): %s)r   printPermissionErrorZskipTestassertEqualserver_addressr7   getsockname)r.   addrsvrclshdlrbaserE   rN   serverer   r   r   make_serverh   s   zSocketServerTest.make_serverc                 C   s   |  | |j||}|j}trtd| td| tjd| |jddid}d|_	|
  tr4td td	D ]}trAtd
| ||j| q8trNtd |  |  |  | d|j  trqt|tjrq| |j trytd d S d S )NzADDR =zCLASS =z
%s servingpoll_interval{Gz?nametargetkwargsTzserver running   ztest clientzwaiting for serverdone)rY   r>   address_familyrR   r   rO   	threadingThreadserve_foreverdaemonstartrangeshutdownjoinserver_closerQ   r7   filenoHAVE_FORKING
isinstancesocketserverForkingMixInZassertFalseactive_children)r.   rU   rV   ZtestfuncrW   rT   tir   r   r   
run_server}   s4   

zSocketServerTest.run_serverc                 C   s   t  |t j5}|| |t t|d }}|r.d|vr.t|d}||7 }|r.d|vs| |t W d    d S 1 s?w   Y  d S Nd      
)r7   SOCK_STREAMconnectsendallTEST_STRr   rQ   r.   r=   rT   sbufdatar   r   r   stream_examine   s   


"zSocketServerTest.stream_examinec                 C   s   t  |t j@}tr|t jkr|| | |t| t|d }}|r9d|vr9t|d}||7 }|r9d|vs*| 	|t W d    d S 1 sJw   Y  d S rv   )
r7   
SOCK_DGRAMHAVE_UNIX_SOCKETSr   bindr>   sendtor|   r   rQ   r}   r   r   r   dgram_examine   s   
"zSocketServerTest.dgram_examinec                 C      |  tjtj| j d S r@   )ru   rp   	TCPServerStreamRequestHandlerr   r-   r   r   r   test_TCPServer      zSocketServerTest.test_TCPServerc                 C   r   r@   )ru   rp   ZThreadingTCPServerr   r   r-   r   r   r   test_ThreadingTCPServer   r   z(SocketServerTest.test_ThreadingTCPServerc                 C   B   t |  | tjtj| j W d    d S 1 sw   Y  d S r@   )r)   ru   rp   ZForkingTCPServerr   r   r-   r   r   r   test_ForkingTCPServer      
"z&SocketServerTest.test_ForkingTCPServerc                 C   r   r@   )ru   rp   UnixStreamServerr   r   r-   r   r   r   test_UnixStreamServer      z&SocketServerTest.test_UnixStreamServerc                 C   r   r@   )ru   rp   ZThreadingUnixStreamServerr   r   r-   r   r   r   test_ThreadingUnixStreamServer   r   z/SocketServerTest.test_ThreadingUnixStreamServerc                 C   s@   t |  | ttj| j W d    d S 1 sw   Y  d S r@   )r)   ru   r   rp   r   r   r-   r   r   r   test_ForkingUnixStreamServer   s   
"z-SocketServerTest.test_ForkingUnixStreamServerc                 C   r   r@   )ru   rp   Z	UDPServerDatagramRequestHandlerr   r-   r   r   r   test_UDPServer   r   zSocketServerTest.test_UDPServerc                 C   r   r@   )ru   rp   ZThreadingUDPServerr   r   r-   r   r   r   test_ThreadingUDPServer   r   z(SocketServerTest.test_ThreadingUDPServerc                 C   r   r@   )r)   ru   rp   ZForkingUDPServerr   r   r-   r   r   r   test_ForkingUDPServer   r   z&SocketServerTest.test_ForkingUDPServerc                 C   r   r@   )ru   rp   UnixDatagramServerr   r   r-   r   r   r   test_UnixDatagramServer   r   z(SocketServerTest.test_UnixDatagramServerc                 C   r   r@   )ru   rp   ZThreadingUnixDatagramServerr   r   r-   r   r   r    test_ThreadingUnixDatagramServer   r   z1SocketServerTest.test_ThreadingUnixDatagramServerc                 C   s   |  ttj| j d S r@   )ru   r!   rp   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 q|D ]\}}|
  |  q9|D ]\}}|  |  qHd S )Nc                   @   r   )z0SocketServerTest.test_shutdown.<locals>.MyServerNr   r   r   r   r   rE         rE   c                   @   r   )z1SocketServerTest.test_shutdown.<locals>.MyHandlerNr   r   r   r   r   rN     r   rN      r   zMyServer servingrZ   r[   r\   T)rp   r   r   ri   r9   rd   re   rf   rg   r<   rh   rj   rk   rl   )r.   rE   rN   threadsrt   r~   rs   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                   @   r   )z9SocketServerTest.test_close_immediately.<locals>.MyServerNr   r   r   r   r   rE     r   rE   r   c                   S      d S r@   r   r   r   r   r   <lambda>  s    z9SocketServerTest.test_close_immediately.<locals>.<lambda>)rp   ThreadingMixInr   r9   rl   )r.   rE   rW   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    n1 sw   Y  qd S )Ni   ra   )ri   assertRaisesOverflowErrorrp   r   r9   r   )r.   rt   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w   Y  | d|j  d S )Nr   ra   )rp   r   r9   r   rQ   r7   rm   )r.   rW   r   r   r   test_context_manager)  s   
z%SocketServerTest.test_context_managerN)r   r   r   r/   r4   r>   rY   r   Zreap_threadsru   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*   J   sJ    
"








r*   c                   @   sV   e 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 )ErrorHandlerTestc                 C   s   t t j d S r@   )r   unlinkTESTFNr-   r   r   r   r4   5  s   zErrorHandlerTest.tearDownc                 C      t t | jdd d S NThandled)BaseErrorTestServer
ValueErrorcheck_resultr-   r   r   r   test_sync_handled8     z"ErrorHandlerTest.test_sync_handledc                 C   sB   |  t tt W d    n1 sw   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   r   r   )ThreadingErrorTestServerr   r   r-   r   r   r   test_threading_handledA  r   z'ErrorHandlerTest.test_threading_handledc                 C   sP   t  }tt | jdd | |jt W d    d S 1 s!w   Y  d S r   )r   Zcatch_threading_exceptionr   r   r   ZassertIsexc_type)r.   cmr   r   r   test_threading_not_handledE  s
   
"z+ErrorHandlerTest.test_threading_not_handledc                 C   r   r   )ForkingErrorTestServerr   r   r-   r   r   r   test_forking_handledL     z%ErrorHandlerTest.test_forking_handledc                 C   r   r   )r   r   r   r-   r   r   r   test_forking_not_handledQ  r   z)ErrorHandlerTest.test_forking_not_handledc                 C   sL   t tj}dd|  }| | | W d    d S 1 sw   Y  d S )NHandler called
Error handled
)openr   r   rQ   read)r.   r   logexpectedr   r   r   r   V  s   "zErrorHandlerTest.check_resultN)r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   0  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w   Y  z
|   W | 	  n| 	  w | 
  d S r0   )	exceptionsuper__init__r9   
BadHandlerr7   create_connectionrR   handle_requestrl   	wait_done)r.   r   	__class__r   r   r   ]  s   
zBaseErrorTestServer.__init__c                 C   s<   t tjd}|d W d    d S 1 sw   Y  d S )Nar   )r   r   r   rJ   )r.   rB   rC   r   r   r   r   rD   h  s   "z BaseErrorTestServer.handle_errorc                 C   r   r@   r   r-   r   r   r   r   l     zBaseErrorTestServer.wait_done)r   r   r   r   rD   r   __classcell__r   r   r   r   r   \  s    r   c                   @   r?   )r   c                 C   sB   t tjd}|d W d    n1 sw   Y  | jd)Nr   r   z
Test error)r   r   r   rJ   rW   r   )r.   r   r   r   r   rL   q  s   zBadHandler.handleNrM   r   r   r   r   r   p  rF   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@   )rd   Eventrb   r   r   r.   poskwr   r   r   r   y  s   
z!ThreadingErrorTestServer.__init__c                    s    t  j|i | | j  d S r@   )r   shutdown_requestrb   setr   r   r   r   r   }  s   z)ThreadingErrorTestServer.shutdown_requestc                 C   s   | j   d S r@   )rb   waitr-   r   r   r   r     s   z"ThreadingErrorTestServer.wait_done)r   r   r   r   r   r   r   r   r   r   r   r   w  s    r   c                   @   r   )r   Nr   r   r   r   r   r     r   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 s4w   Y  |  | |jtj | |j|j d S )Nc                   @   r?   )z-SocketWriterTest.test_basics.<locals>.Handlerc                 S   s*   | j | j_ | j  | j_| j | j_d S r@   )rI   rW   rm   wfile_filenorB   request_filenor-   r   r   r   rL     s   
z4SocketWriterTest.test_basics.<locals>.Handler.handleNrM   r   r   r   r   Handler  rF   r   r   )rp   r   r   r9   
addCleanuprl   r7   rc   ry   IPPROTO_TCPrz   rR   r   ZassertIsInstancerI   ioBufferedIOBaserQ   r   r   )r.   r   rW   r~   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                   @   r?   )z,SocketWriterTest.test_write.<locals>.Handlerc                 S   s>   | j d| j_| j | j_dtjj	 }| j || j_
d S )N   write data
    )rI   rJ   rW   sent1rG   rH   receivedr&   r'   SOCK_MAX_SIZEsent2)r.   Z	big_chunkr   r   r   rL     s   z3SocketWriterTest.test_write.<locals>.Handler.handleNrM   r   r   r   r   r     rF   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} | Q | d3}| j | | d |	d 	 t
j  jtddr7nq(t|	 W d    n1 sHw   Y  W d    d S W d    d S 1 s`w   Y  d S )Nrb   client response
rw   T   )r   )r7   rc   ry   r   makefilerz   rR   rH   r{   r   r   SIGUSR1r   floatlen)r~   readerr   main_threadr   Z	received2Z	response1rW   r   r   
run_client  s   

Pz/SocketWriterTest.test_write.<locals>.run_client)r^   r   r   rw   )r&   r'   Zget_attributer   rp   r   r   r9   r   rl   rd   r   r   	get_identre   rh   r   rk   rQ   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 ]}|dstt|}t|dd dkr|| q| tj| d S )N_r   rp   )r6   rp   
startswithgetattrr<   ZassertCountEqual__all__)r.   r   r]   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   rA   r   r   r   verify_request  r   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_calledrp   r   r   )r.   rB   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   rE     s    rE   r   r   )rp   r   r9   r   r7   rc   ry   rz   rR   closer   rQ   r  rl   )r.   rE   rW   r~   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 ]}t|j |	  W d    n1 s/w   Y  q| 
t|jd |  d S )Nc                   @   r   )z2MiscTestCase.test_threads_reaped.<locals>.MyServerNr   r   r   r   r   rE     r   rE   r   
   )rp   r   r   r9   r   ri   r7   r   rR   r   Z
assertLessr   Z_threadsrl   )r.   rE   rW   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__)4
contextlibr   r$   selectr   r7   r:   rd   Zunittestrp   Ztest.supportr&   r   r   r   r   r   r'   Zrequiresr|   r9   r   r   Z
skipUnlessr   rn   r   r   r   ZSHORT_TIMEOUTr   rq   r   r   r   r!   contextmanagerr)   ZTestCaser*   r   r   r   ZBaseRequestHandlerr   r   r   r   r   r   r   mainr   r   r   r   <module>   sh    


 g,M2