a
    äzeÀF  ã                   @   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r”G dd„ de	je)ƒZ.G d d!„ d!ej%ƒZ/G d"d#„ d#ej%ƒZ0e1d$krÊe 2¡  dS )%é    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 )NÚalarm)Ú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 )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*   Ú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r‚td
|ƒ ||j|ƒ qptrœtdƒ | ¡  | ¡  | ¡  |  d|j ¡ ¡ trât|tjƒrâ|  |j¡ trîtdƒ d S )NzADDR =zCLASS =z
%s servingÚpoll_intervalç{®Gáz„?©Ú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 ©Néd   ó   
)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 sˆ0    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   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   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   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   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 sŽ0    Y  W d   ƒ n1 s¬0    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 )Nc                   @   s   e Zd ZdS )z2MiscTestCase.test_threads_reaped.<locals>.MyServerNr   r   r   r   r   r@   ù  s   r@   r   é
   )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__)3Ú
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
