a
    "hF                     @   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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%Z/G d"d# d#ej%Z0e1d$kre2  dS )%    N)reap_childrenreap_threadsverbose)socket_helpernetworks   hello world
AF_UNIXzrequires Unix socketsforkzrequires forkingc                 C   s   t tdrt|  d S )Nalarm)hasattrsignalr	   )n r   >/opt/python-3.9.21/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 )Nr   H   )exitcode)osr   _exittestsupportZwait_process)Ztestcasepidr   r   r   simple_subprocess9   s    


r&   c                   @   s   e 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d/S )0SocketServerTestc                 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+   protor3   r0   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   rA   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   rG   r   r   r   r   	MyHandlerl   s   rI   zcreating serverz!Cannot create server (%s, %s): %s)r   printPermissionErrorZskipTestassertEqualserver_addressr4   getsockname)r+   addrsvrclshdlrbaserA   rI   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)rT   r;   address_familyrM   r   rJ   	threadingThreadserve_foreverdaemonstartrangeshutdownjoinserver_closerL   r4   filenoHAVE_FORKING
isinstancesocketserverForkingMixInZassertFalseactive_children)r+   rP   rQ   ZtestfuncrR   rO   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      
)r4   SOCK_STREAMconnectsendallTEST_STRr   rL   r+   r:   rO   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 rq   )
r4   
SOCK_DGRAMHAVE_UNIX_SOCKETSr   bindr;   sendtorw   r   rL   rx   r   r   r   dgram_examine   s    

zSocketServerTest.dgram_examinec                 C   s   |  tjtj| j d S r<   )rp   rk   	TCPServerStreamRequestHandlerr|   r*   r   r   r   test_TCPServer   s    zSocketServerTest.test_TCPServerc                 C   s   |  tjtj| j d S r<   )rp   rk   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&   rp   rk   ZForkingTCPServerr   r|   r*   r   r   r   test_ForkingTCPServer   s
    
z&SocketServerTest.test_ForkingTCPServerc                 C   s   |  tjtj| j d S r<   )rp   rk   UnixStreamServerr   r|   r*   r   r   r   test_UnixStreamServer   s    z&SocketServerTest.test_UnixStreamServerc                 C   s   |  tjtj| j d S r<   )rp   rk   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&   rp   r   rk   r   r|   r*   r   r   r   test_ForkingUnixStreamServer   s
    
z-SocketServerTest.test_ForkingUnixStreamServerc                 C   s   |  tjtj| j d S r<   )rp   rk   Z	UDPServerDatagramRequestHandlerr   r*   r   r   r   test_UDPServer   s    zSocketServerTest.test_UDPServerc                 C   s   |  tjtj| j d S r<   )rp   rk   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&   rp   rk   ZForkingUDPServerr   r   r*   r   r   r   test_ForkingUDPServer   s
    
z&SocketServerTest.test_ForkingUDPServerc                 C   s   |  tjtj| j d S r<   )rp   rk   UnixDatagramServerr   r   r*   r   r   r   test_UnixDatagramServer   s    z(SocketServerTest.test_UnixDatagramServerc                 C   s   |  tjtj| j d S r<   )rp   rk   ZThreadingUnixDatagramServerr   r   r*   r   r   r    test_ThreadingUnixDatagramServer   s    z1SocketServerTest.test_ThreadingUnixDatagramServerc                 C   s   |  ttj| j d S r<   )rp   r   rk   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   rA      s   rA   c                   @   s   e Zd ZdS )z1SocketServerTest.test_shutdown.<locals>.MyHandlerNr   r   r   r   r   rI     s   rI      r   zMyServer servingrU   rV   rW   T)rk   r   r   rd   r6   r_   r`   ra   rb   r9   rc   re   rf   rg   )r+   rA   rI   threadsro   ry   rn   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   rA     s   rA   r   c                   S   s   d S r<   r   r   r   r   r   <lambda>      z9SocketServerTest.test_close_immediately.<locals>.<lambda>)rk   ThreadingMixInr   r6   rg   )r+   rA   rR   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\   )rd   assertRaisesOverflowErrorrk   r   r6   r   )r+   ro   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\   )rk   r   r6   r   rL   r4   rh   )r+   rR   r   r   r   test_context_manager'  s    
z%SocketServerTest.test_context_managerN)r   r   r   r,   r1   r;   rT   r   rp   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   sF   
"








r'   c                   @   sT   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 jt jj d S r<   )r#   r$   unlinkTESTFNr*   r   r   r   r1   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   rL   read)r+   r   logexpectedr   r   r   r   Q  s    zErrorHandlerTest.check_resultN)r   r   r   r1   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__r6   
BadHandlerr4   create_connectionrM   handle_requestrg   	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   rE   )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   rE   rR   r   )r+   r   r   r   r   rG   l  s    (zBadHandler.handleNrH   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<   )rD   rR   rh   wfile_filenor>   request_filenor*   r   r   r   rG     s    
z4SocketWriterTest.test_basics.<locals>.Handler.handleNrH   r   r   r   r   Handler  s   r   r   )rk   r   r   r6   
addCleanuprg   r4   r^   rt   IPPROTO_TCPru   rM   r   ZassertIsInstancerD   ioBufferedIOBaserL   r   r   )r+   r   rR   ry   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
    )rD   rE   rR   sent1rB   rC   receivedr#   r$   SOCK_MAX_SIZEsent2)r+   Z	big_chunkr   r   r   rG     s    z3SocketWriterTest.test_write.<locals>.Handler.handleNrH   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
rr      )r   )r4   r^   rt   r   makefileru   rM   rC   rv   r   r   SIGUSR1r   floatlen)ry   readerr   main_threadr   Z	received2Z	response1rR   r   r   
run_client  s    

z/SocketWriterTest.test_write.<locals>.run_client)rY   r   r   rr   )r#   r$   Zget_attributer   rk   r   r   r6   r   rg   r_   r   r   	get_identr`   rc   r   rf   rL   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   rk   )r3   rk   
startswithgetattrr9   ZassertCountEqual__all__)r+   r   rX   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_calledrk   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   rA     s   rA   r   r   )rk   r   r6   r   r4   r^   rt   ru   rM   closer   rL   r   rg   )r+   rA   rR   ry   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 )Nc                   @   s   e Zd ZdS )z2MiscTestCase.test_threads_reaped.<locals>.MyServerNr   r   r   r   r   rA     s   rA   r   
   )rk   r   r   r6   r   rd   r4   r   rM   r   Z
assertLessr   Z_threadsrg   )r+   rA   rR   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__)3
contextlibr   r!   selectr   r4   r7   r_   Zunittestrk   Ztest.supportr#   r   r   r   r   r$   Zrequiresrw   r6   r
   r~   Z
skipUnlessr   ri   r   r   r   ZSHORT_TIMEOUTr   rl   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
