a
     RîhÀ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_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.24/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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)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 ©Néd   ó   
)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 sˆ0    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 sŽ0    Y  W d   ƒ n1 s¬0    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
