B
    u9a}C  ã               @   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 ej d¡ dZejjZeedƒZe	 ed¡ZeedƒZe	 ed	¡Zd
d„ ZejZd&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$ƒZ/e0d%kr¾e	 1¡  dS )'z
Test suite for socketserver.
é    N)Úreap_childrenÚreap_threadsÚverboseZ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.7/test_socketserver.pyÚsignal_alarm   s    
r   é   c             C   s:   t | gg g |ƒ\}}}| |kr(|  |¡S td| f ƒ‚d S )Nztimed out on %r)Ú_real_selectZrecvÚRuntimeError)Z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   /   s   r   c               @   s   e Zd ZdS )ÚForkingUnixDatagramServerN)r   r   r   r   r   r   r   r   3   s   r   c          
   c   sh   t  ¡ }|dkrt  d¡ zy
dV  W n   ‚ Y nX W dt  |d¡\}}|  ||¡ |  d|¡ X dS )zBTests that a custom child process is not waited on (Issue 1540386)r   éH   Ni H  )Úosr   Ú_exitÚwaitpidÚassertEqual)ZtestcaseÚpidZpid2Ústatusr   r   r   Úsimple_subprocess8   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.S )/Ú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   ÚsetUpL   s    zSocketServerTest.setUpc          	   C   sT   t dƒ tƒ  x2| jD ](}yt |¡ W q tk
r<   Y qX qW g | jd d …< d S )Nr   )r   r   r%   r   ÚremoveÚOSError)r&   Úfnr   r   r   ÚtearDownQ   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)ÚsocketZAF_INETÚHOSTÚtempfileZmktempr%   Úappend)r&   Úprotor-   r*   r   r   r   Úpickaddr\   s    
zSocketServerTest.pickaddrc          
   C   sŠ   G dd„ d|ƒ}G dd„ d|ƒ}t r,tdƒ y|||ƒ}W n6 tk
rp } z|  d|||f ¡ W d d }~X Y nX |  |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_errori   s    
z;SocketServerTest.make_server.<locals>.MyServer.handle_errorN)r   r   r   r6   r   r   r   r   ÚMyServerh   s   r7   c               @   s   e Zd Zdd„ ZdS )z/SocketServerTest.make_server.<locals>.MyHandlerc             S   s   | j  ¡ }| j |¡ d S )N)ÚrfileÚreadlineÚwfileÚwrite)r&   Úliner   r   r   Úhandlen   s    
z6SocketServerTest.make_server.<locals>.MyHandler.handleN)r   r   r   r=   r   r   r   r   Ú	MyHandlerm   s   r>   zcreating serverz!Cannot create server (%s, %s): %s)r   ÚprintÚPermissionErrorZskipTestr   Úserver_addressr.   Zgetsockname)r&   ÚaddrÚsvrclsÚhdlrbaser7   r>   ÚserverÚer   r   r   Úmake_serverg   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ƒ x*td	ƒD ]}tr„td
|ƒ ||j|ƒ qrW t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_intervalg{®Gáz„?)ÚnameÚtargetÚkwargsTzserver runningé   ztest clientzwaiting for serveréÿÿÿÿÚdone)rG   r3   Úaddress_familyrA   r   r?   Ú	threadingÚThreadÚserve_foreverÚdaemonÚstartÚrangeÚshutdownÚjoinÚserver_closer   r.   ÚfilenoÚHAVE_FORKINGÚ
isinstanceÚsocketserverÚForkingMixInZassertFalseZactive_children)r&   rC   rD   ZtestfuncrE   rB   ÚtÚir   r   r   Ú
run_server|   s8    

  
  zSocketServerTest.run_serverc             C   sl   t   |t j¡}| |¡ | t¡ t|dƒ }}x"|rRd|krRt|dƒ}||7 }q2W |  |t¡ | ¡  d S )Néd   ó   
)r.   ÚSOCK_STREAMÚconnectÚsendallÚTEST_STRr   r   Úclose)r&   r2   rB   Ú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ƒ }}x"|rhd|krht|dƒ}||7 }qHW |  	|t¡ | 
¡  d S )Nra   rb   )r.   Z
SOCK_DGRAMÚHAVE_UNIX_SOCKETSr   Zbindr3   Zsendtorf   r   r   rg   )r&   r2   rB   rh   ri   rj   r   r   r   Údgram_examineª   s    
zSocketServerTest.dgram_examinec             C   s   |   tjtj| j¡ d S )N)r`   r\   Ú	TCPServerÚStreamRequestHandlerrk   )r&   r   r   r   Útest_TCPServer¶   s    zSocketServerTest.test_TCPServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ZThreadingTCPServerro   rk   )r&   r   r   r   Útest_ThreadingTCPServer»   s    z(SocketServerTest.test_ThreadingTCPServerc          	   C   s,   t | ƒ |  tjtj| j¡ W d Q R X d S )N)r"   r`   r\   ZForkingTCPServerro   rk   )r&   r   r   r   Útest_ForkingTCPServerÀ   s    
z&SocketServerTest.test_ForkingTCPServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ÚUnixStreamServerro   rk   )r&   r   r   r   Útest_UnixStreamServerÇ   s    z&SocketServerTest.test_UnixStreamServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ZThreadingUnixStreamServerro   rk   )r&   r   r   r   Útest_ThreadingUnixStreamServerÍ   s    z/SocketServerTest.test_ThreadingUnixStreamServerc          	   C   s*   t | ƒ |  ttj| j¡ W d Q R X d S )N)r"   r`   r   r\   ro   rk   )r&   r   r   r   Útest_ForkingUnixStreamServerÓ   s    
z-SocketServerTest.test_ForkingUnixStreamServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   Z	UDPServerÚDatagramRequestHandlerrm   )r&   r   r   r   Útest_UDPServerÛ   s    zSocketServerTest.test_UDPServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ZThreadingUDPServerrw   rm   )r&   r   r   r   Útest_ThreadingUDPServerà   s    z(SocketServerTest.test_ThreadingUDPServerc          	   C   s,   t | ƒ |  tjtj| j¡ W d Q R X d S )N)r"   r`   r\   ZForkingUDPServerrw   rm   )r&   r   r   r   Útest_ForkingUDPServerå   s    
z&SocketServerTest.test_ForkingUDPServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ÚUnixDatagramServerrw   rm   )r&   r   r   r   Útest_UnixDatagramServerì   s    z(SocketServerTest.test_UnixDatagramServerc             C   s   |   tjtj| j¡ d S )N)r`   r\   ZThreadingUnixDatagramServerrw   rm   )r&   r   r   r   Ú test_ThreadingUnixDatagramServerò   s    z1SocketServerTest.test_ThreadingUnixDatagramServerc             C   s   |   ttj| j¡ d S )N)r`   r   r\   rw   rm   )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 }xHtdƒD ]<}|tdf|ƒ}tjd|jdd	id
}d|_| 	||f¡ q2W x |D ]\}}| 
¡  | ¡  qxW x |D ]\}}| ¡  | ¡  qšW d S )Nc               @   s   e Zd ZdS )z0SocketServerTest.test_shutdown.<locals>.MyServerN)r   r   r   r   r   r   r   r7     s   r7   c               @   s   e Zd ZdS )z1SocketServerTest.test_shutdown.<locals>.MyHandlerN)r   r   r   r   r   r   r   r>     s   r>   r   r   zMyServer servingrH   g{®Gáz„?)rI   rJ   rK   T)r\   rn   ro   rU   r/   rP   rQ   rR   rS   r1   rT   rV   rW   rX   )r&   r7   r>   Zthreadsr_   rh   r^   r   r   r   Útest_shutdownÿ   s"    zSocketServerTest.test_shutdownc          
   C   s>   x8t dƒD ],}|  t¡ t tdftj¡ W d Q R X q
W d S )Ni   rM   )rU   ÚassertRaisesÚOverflowErrorr\   rn   r/   ro   )r&   r_   r   r   r   Útest_tcpserver_bind_leak  s    
z)SocketServerTest.test_tcpserver_bind_leakc          	   C   s4   t  tdft j¡}W d Q R X |  d|j ¡ ¡ d S )Nr   rM   )r\   rn   r/   ro   r   r.   rY   )r&   rE   r   r   r   Útest_context_manager#  s    


z%SocketServerTest.test_context_managerN)r   r   r   Ú__doc__r'   r+   r3   rG   r   r`   rk   rm   rp   rq   Úrequires_forkingrr   Úrequires_unix_socketsrt   ru   rv   rx   ry   rz   r|   r}   r~   r   r‚   rƒ   r   r   r   r   r#   I   s2   #
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 )ÚErrorHandlerTestzªTest 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 )N)ÚtestÚsupportÚunlinkÚTESTFN)r&   r   r   r   r+   /  s    zErrorHandlerTest.tearDownc             C   s   t tƒ | jdd d S )NT)Úhandled)ÚBaseErrorTestServerÚ
ValueErrorÚcheck_result)r&   r   r   r   Útest_sync_handled2  s    z"ErrorHandlerTest.test_sync_handledc          	   C   s.   |   t¡ ttƒ W d Q R X | jdd d S )NF)rŒ   )r€   Ú
SystemExitr   r   )r&   r   r   r   Útest_sync_not_handled6  s    z&ErrorHandlerTest.test_sync_not_handledc             C   s   t tƒ | jdd d S )NT)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 )NF)rŒ   )r“   r‘   r   )r&   r   r   r   Útest_threading_not_handled?  s    z+ErrorHandlerTest.test_threading_not_handledc             C   s   t tƒ | jdd d S )NT)rŒ   )ÚForkingErrorTestServerrŽ   r   )r&   r   r   r   Útest_forking_handledC  s    z%ErrorHandlerTest.test_forking_handledc             C   s   t tƒ | jdd d S )NF)rŒ   )r–   r‘   r   )r&   r   r   r   Útest_forking_not_handledH  s    z)ErrorHandlerTest.test_forking_not_handledc          	   C   s8   t tjjƒ"}dd|  }|  | ¡ |¡ W d Q R X d S )NzHandler called
zError handled
)Úopenrˆ   r‰   r‹   r   Úread)r&   rŒ   ÚlogÚexpectedr   r   r   r   M  s    zErrorHandlerTest.check_resultN)r   r   r   r„   r+   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          	      sT   || _ tƒ  tdft¡ t | j¡ W d Q R X z|  ¡  W d |  	¡  X |  
¡  d S )Nr   )Ú	exceptionÚsuperÚ__init__r/   Ú
BadHandlerr.   Zcreate_connectionrA   Úhandle_requestrX   Ú	wait_done)r&   r   )Ú	__class__r   r   rŸ   T  s    

zBaseErrorTestServer.__init__c          	   C   s(   t tjjdƒ}| d¡ W d Q R X d S )NÚazError handled
)r™   rˆ   r‰   r‹   r;   )r&   r4   r5   r›   r   r   r   r6   _  s    z BaseErrorTestServer.handle_errorc             C   s   d S )Nr   )r&   r   r   r   r¢   c  s    zBaseErrorTestServer.wait_done)r   r   r   rŸ   r6   r¢   Ú__classcell__r   r   )r£   r   r   S  s   r   c               @   s   e Zd Zdd„ ZdS )r    c          	   C   s4   t tjjdƒ}| d¡ W d Q R X | j d¡‚d S )Nr¤   zHandler called
z
Test error)r™   rˆ   r‰   r‹   r;   rE   r   )r&   r›   r   r   r   r=   h  s    zBadHandler.handleN)r   r   r   r=   r   r   r   r   r    g  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||Ž d S )N)rP   ÚEventrN   rž   rŸ   )r&   ÚposÚkw)r£   r   r   rŸ   p  s    
z!ThreadingErrorTestServer.__init__c                s   t ƒ j||Ž | j ¡  d S )N)rž   Úshutdown_requestrN   Úset)r&   r§   r¨   )r£   r   r   r©   t  s    z)ThreadingErrorTestServer.shutdown_requestc             C   s   | j  ¡  d S )N)rN   Úwait)r&   r   r   r   r¢   x  s    z"ThreadingErrorTestServer.wait_done)r   r   r   rŸ   r©   r¢   r¥   r   r   )r£   r   r“   n  s   r“   c               @   s   e Zd ZdS )r–   N)r   r   r   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 Q R X | ¡  |  |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 )N)r:   rE   rY   Úwfile_filenor4   Úrequest_fileno)r&   r   r   r   r=   „  s    
z4SocketWriterTest.test_basics.<locals>.Handler.handleN)r   r   r   r=   r   r   r   r   ÚHandlerƒ  s   r¯   r   )r\   ro   rn   r/   Ú
addCleanuprX   r.   rO   rc   ÚIPPROTO_TCPrd   rA   r¡   ZassertIsInstancer:   ÚioÚBufferedIOBaser   r­   r®   )r&   r¯   rE   rh   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 )Ns   write data
ó    )r:   r;   rE   Úsent1r8   r9   Úreceivedrˆ   r‰   ÚSOCK_MAX_SIZEÚsent2)r&   Z	big_chunkr   r   r   r=   ™  s    z3SocketWriterTest.test_write.<locals>.Handler.handleN)r   r   r   r=   r   r   r   r   r¯   ˜  s   r¯   r   c                s   ˆ   ¡  d S )N)rª   )ZsignumÚframe)Úinterruptedr   r   Úsignal_handler¤  s    z3SocketWriterTest.test_write.<locals>.signal_handlerc           
      s–   t   ˆjt jt j¡} | t |  d¡^}|  ˆj¡ | ¡ ‰|  d¡ | 	d¡ x"ˆˆt
jƒ ˆ jtdƒdrPP qPW t| 	¡ ƒ‰W d Q R X W d Q R X d S )NÚrbs   client response
ra   é   )r   )r.   rO   rc   r±   Zmakefilerd   rA   r9   re   rš   r	   ÚSIGUSR1r«   ÚfloatÚlen)rh   Úreader)r¼   Úmain_threadrµ   Ú	received2Ú	response1rE   r   r   Ú
run_client­  s    

z/SocketWriterTest.test_write.<locals>.run_client)rJ   s   write data
s   client response
ra   )rˆ   r‰   Zget_attributer	   r\   ro   rn   r/   r°   rX   rP   r¦   rÀ   Ú	get_identrQ   rT   r¡   rW   r   r·   rÂ   r¸   rº   r¹   )r&   r¯   r½   ZoriginalrÇ   Z
backgroundr   )r¼   rÄ   rµ   rÅ   rÆ   rE   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S )ÚMiscTestCasec             C   sV   g }x>t tƒD ]2}| d¡stt|ƒ}t|dd ƒdkr| |¡ qW |  tj|¡ d S )NÚ_r   r\   )r-   r\   Ú
startswithÚgetattrr1   ZassertCountEqualÚ__all__)r&   rœ   rI   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&   r4   r5   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_calledr\   rn   r©   )r&   r4   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   r7   Þ  s   r7   r   r¿   )r\   rn   r/   ro   r.   rO   rc   rd   rA   rg   r¡   r   rÑ   rX   )r&   r7   rE   rh   r   r   r   Ú4test_shutdown_request_called_if_verify_request_falseÚ  s    	zAMiscTestCase.test_shutdown_request_called_if_verify_request_falseN)r   r   r   rÏ   rÒ   r   r   r   r   rÊ   Î  s   
rÊ   Ú__main__)r   )2r„   Ú
contextlibr²   r   Zselectr	   r.   r0   rP   Zunittestr\   Ztest.supportrˆ   r   r   r   r‰   Zrequiresrf   r/   r   rl   Z
skipUnlessr†   rZ   r…   r   r   r   r]   rs   r   r{   r   Úcontextmanagerr"   ZTestCaser#   r‡   rn   r   ZBaseRequestHandlerr    ZThreadingMixInr“   r–   r¬   rÊ   r   Úmainr   r   r   r   Ú<module>   sT   


 b)M"
