B
    18™\}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ÚverboseÚ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   úZ/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/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_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   /   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)Ú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)ÚsocketÚAF_INETÚHOSTÚtempfileÚmktempr)   Úappend)r*   Úprotor1   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)Úclose_request)r*   ÚrequestÚclient_addressr   r   r   Úhandle_errori   s    
z;SocketServerTest.make_server.<locals>.MyServer.handle_errorN)r   r   r   r=   r   r   r   r   ÚMyServerh   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 )N)ÚrfileÚreadlineÚwfileÚwrite)r*   Úliner   r   r   Úhandlen   s    
z6SocketServerTest.make_server.<locals>.MyHandler.handleN)r   r   r   rD   r   r   r   r   Ú	MyHandlerm   s   rE   zcreating serverz!Cannot create server (%s, %s): %s)r   ÚprintÚPermissionErrorÚskipTestr"   Úserver_addressr2   Úgetsockname)r*   ÚaddrÚsvrclsÚhdlrbaser>   rE   Ú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)rP   r9   Úaddress_familyrI   r   rF   Ú	threadingÚThreadÚserve_foreverÚdaemonÚstartÚrangeÚshutdownÚjoinÚserver_closer"   r2   ÚfilenoÚHAVE_FORKINGÚ
isinstanceÚsocketserverÚForkingMixInÚassertFalseÚactive_children)r*   rL   rM   ZtestfuncrN   rK   Ú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   ó   
)r2   ÚSOCK_STREAMÚconnectÚsendallÚTEST_STRr   r"   Úclose)r*   r8   rK   Ú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 )Nrl   rm   )r2   Ú
SOCK_DGRAMÚHAVE_UNIX_SOCKETSr   Úbindr9   Úsendtorq   r   r"   rr   )r*   r8   rK   rs   rt   ru   r   r   r   Údgram_examineª   s    
zSocketServerTest.dgram_examinec             C   s   |   tjtj| j¡ d S )N)rk   re   Ú	TCPServerÚStreamRequestHandlerrv   )r*   r   r   r   Útest_TCPServer¶   s    zSocketServerTest.test_TCPServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚThreadingTCPServerr}   rv   )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&   rk   re   ÚForkingTCPServerr}   rv   )r*   r   r   r   Útest_ForkingTCPServerÀ   s    
z&SocketServerTest.test_ForkingTCPServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚUnixStreamServerr}   rv   )r*   r   r   r   Útest_UnixStreamServerÇ   s    z&SocketServerTest.test_UnixStreamServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚThreadingUnixStreamServerr}   rv   )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&   rk   r   re   r}   rv   )r*   r   r   r   Útest_ForkingUnixStreamServerÓ   s    
z-SocketServerTest.test_ForkingUnixStreamServerc             C   s   |   tjtj| j¡ d S )N)rk   re   Ú	UDPServerÚDatagramRequestHandlerr{   )r*   r   r   r   Útest_UDPServerÛ   s    zSocketServerTest.test_UDPServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚThreadingUDPServerr‰   r{   )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&   rk   re   ÚForkingUDPServerr‰   r{   )r*   r   r   r   Útest_ForkingUDPServerå   s    
z&SocketServerTest.test_ForkingUDPServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚUnixDatagramServerr‰   r{   )r*   r   r   r   Útest_UnixDatagramServerì   s    z(SocketServerTest.test_UnixDatagramServerc             C   s   |   tjtj| j¡ d S )N)rk   re   ÚThreadingUnixDatagramServerr‰   r{   )r*   r   r   r   Ú test_ThreadingUnixDatagramServerò   s    z1SocketServerTest.test_ThreadingUnixDatagramServerc             C   s   |   ttj| j¡ d S )N)rk   r   re   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 }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   r>     s   r>   c               @   s   e Zd ZdS )z1SocketServerTest.test_shutdown.<locals>.MyHandlerN)r   r   r   r   r   r   r   rE     s   rE   r   r   zMyServer servingrQ   g{®Gáz„?)rR   rS   rT   T)re   r|   r}   r^   r4   rY   rZ   r[   r\   r7   r]   r_   r`   ra   )r*   r>   rE   Úthreadsrj   rs   ri   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   rV   )r^   ÚassertRaisesÚOverflowErrorre   r|   r4   r}   )r*   rj   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   rV   )re   r|   r4   r}   r"   r2   rb   )r*   rN   r   r   r   Útest_context_manager#  s    


z%SocketServerTest.test_context_managerN)r   r   r   Ú__doc__r+   r/   r9   rP   r   rk   rv   r{   r~   r€   Úrequires_forkingr‚   Úrequires_unix_socketsr„   r†   r‡   rŠ   rŒ   rŽ   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__r4   Ú
BadHandlerr2   Úcreate_connectionrI   Úhandle_requestra   Ú	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¡   rB   )r*   r;   r<   r±   r   r   r   r=   _  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µ   r=   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¡   rB   rN   r³   )r*   r±   r   r   r   rD   h  s    zBadHandler.handleN)r   r   r   rD   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)rY   ÚEventrW   r´   rµ   )r*   ÚposÚkw)rº   r   r   rµ   p  s    
z!ThreadingErrorTestServer.__init__c                s   t ƒ j||Ž | j ¡  d S )N)r´   Úshutdown_requestrW   Úset)r*   r¾   r¿   )rº   r   r   rÀ   t  s    z)ThreadingErrorTestServer.shutdown_requestc             C   s   | j  ¡  d S )N)rW   Ú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)rA   rN   rb   Úwfile_filenor;   Úrequest_fileno)r*   r   r   r   rD   „  s    
z4SocketWriterTest.test_basics.<locals>.Handler.handleN)r   r   r   rD   r   r   r   r   ÚHandlerƒ  s   rÆ   r   )re   r}   r|   r4   Ú
addCleanupra   r2   rX   rn   ÚIPPROTO_TCPro   rI   r¸   ÚassertIsInstancerA   ÚioÚBufferedIOBaser"   rÄ   rÅ   )r*   rÆ   rN   rs   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
ó    )rA   rB   rN   Úsent1r?   r@   Úreceivedrž   rŸ   ÚSOCK_MAX_SIZEÚsent2)r*   Z	big_chunkr   r   r   rD   ™  s    z3SocketWriterTest.test_write.<locals>.Handler.handleN)r   r   r   rD   r   r   r   r   rÆ   ˜  s   rÆ   r   c                s   ˆ   ¡  d S )N)rÁ   )Ú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
rl   é   )r   )r2   rX   rn   rÈ   Úmakefilero   rI   r@   rp   r°   r
   ÚSIGUSR1rÂ   ÚfloatÚlen)rs   Úreader)rÕ   Úmain_threadrÍ   Ú	received2Ú	response1rN   r   r   Ú
run_client­  s    

z/SocketWriterTest.test_write.<locals>.run_client)rS   s   write data
s   client response
rl   )rž   rŸ   Úget_attributer
   re   r}   r|   r4   rÇ   ra   rY   r½   rÚ   Ú	get_identrZ   r]   r¸   r`   r"   rÏ   rÜ   rÐ   rÒ   rÑ   )r*   rÆ   rÖ   Úoriginalrá   Ú
backgroundr   )rÕ   rÞ   rÍ   rß   rà   rN   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   re   )r1   re   Ú
startswithÚgetattrr7   ÚassertCountEqualÚ__all__)r*   r²   rR   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   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_calledre   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Ø   )re   r|   r4   r}   r2   rX   rn   ro   rI   rr   r¸   r"   rï   ra   )r*   r>   rN   rs   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   Úselectr
   r2   r5   rY   Úunittestre   Ztest.supportrž   r   r   r   rŸ   Úrequiresrq   r4   r	   rx   Ú
skipUnlessrœ   rc   r›   r   r   r   rf   rƒ   r   r   r   Úcontextmanagerr&   ÚTestCaser'   r   r|   r£   ÚBaseRequestHandlerr¶   ÚThreadingMixInr©   r¬   rÃ   rç   r   Úmainr   r   r   r   Ú<module>   sT   


 b)M"
