B
    2*™\nE  ã               @   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 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.e/d$kr¶e 0¡  dS )&é    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 )NÚalarm)ÚhasattrÚsignalr   )Ún© r   úAC:\ALexclude\prg\programme\Python37\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_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 )Nr   éH   i H  )Úosr   Ú_exitÚwaitpidÚassertEqual)ZtestcaseZpidZpid2Ústatusr   r   r   Úsimple_subprocess8   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-S ).ÚSocketServerTestc             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   r5   r   r   r   r   ÚMyServerh   s   r6   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Úhdlrbaser6   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)rF   r2   Úaddress_familyr@   r   r>   Ú	threadingÚThreadÚserve_foreverÚdaemonÚstartÚrangeÚshutdownÚjoinÚserver_closer   r-   ÚfilenoÚHAVE_FORKINGÚ
isinstanceÚsocketserverÚForkingMixInZassertFalseZactive_children)r%   rB   rC   ZtestfuncrD   rA   Ú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%   r1   rA   Ú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 )Nr`   ra   )r-   Z
SOCK_DGRAMÚHAVE_UNIX_SOCKETSr   Zbindr2   Zsendtore   r   r   rf   )r%   r1   rA   rg   rh   ri   r   r   r   Údgram_examineª   s    
zSocketServerTest.dgram_examinec             C   s   |   tjtj| j¡ d S )N)r_   r[   Ú	TCPServerÚStreamRequestHandlerrj   )r%   r   r   r   Útest_TCPServer¶   s    zSocketServerTest.test_TCPServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ZThreadingTCPServerrn   rj   )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ForkingTCPServerrn   rj   )r%   r   r   r   Útest_ForkingTCPServerÀ   s    
z&SocketServerTest.test_ForkingTCPServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ÚUnixStreamServerrn   rj   )r%   r   r   r   Útest_UnixStreamServerÇ   s    z&SocketServerTest.test_UnixStreamServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ZThreadingUnixStreamServerrn   rj   )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[   rn   rj   )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ÚDatagramRequestHandlerrl   )r%   r   r   r   Útest_UDPServerÛ   s    zSocketServerTest.test_UDPServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ZThreadingUDPServerrv   rl   )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ForkingUDPServerrv   rl   )r%   r   r   r   Útest_ForkingUDPServerå   s    
z&SocketServerTest.test_ForkingUDPServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ÚUnixDatagramServerrv   rl   )r%   r   r   r   Útest_UnixDatagramServerì   s    z(SocketServerTest.test_UnixDatagramServerc             C   s   |   tjtj| j¡ d S )N)r_   r[   ZThreadingUnixDatagramServerrv   rl   )r%   r   r   r   Ú test_ThreadingUnixDatagramServerò   s    z1SocketServerTest.test_ThreadingUnixDatagramServerc             C   s   |   ttj| j¡ d S )N)r_   r   r[   rv   rl   )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   r6     s   r6   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 servingrG   g{®Gáz„?)rH   rI   rJ   T)r[   rm   rn   rT   r.   rO   rP   rQ   rR   r0   rS   rU   rV   rW   )r%   r6   r=   Zthreadsr^   rg   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   rL   )rT   ÚassertRaisesÚOverflowErrorr[   rm   r.   rn   )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   rL   )r[   rm   r.   rn   r   r-   rX   )r%   rD   r   r   r   Útest_context_manager#  s    


z%SocketServerTest.test_context_managerN)r   r   r   r&   r*   r2   rF   r   r_   rj   rl   ro   rp   Úrequires_forkingrq   Úrequires_unix_socketsrs   rt   ru   rw   rx   ry   r{   r|   r}   r~   r   r‚   r   r   r   r   r"   I   s0   #
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 )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…   *  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_connectionr@   Úhandle_requestrW   Ú	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%   r3   r4   r™   r   r   r   r5   _  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   r5   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:   rD   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)rO   ÚEventrM   rœ   r   )r%   ÚposÚkw)r¡   r   r   r   p  s    
z!ThreadingErrorTestServer.__init__c                s   t ƒ j||Ž | j ¡  d S )N)rœ   Úshutdown_requestrM   Úset)r%   r¥   r¦   )r¡   r   r   r§   t  s    z)ThreadingErrorTestServer.shutdown_requestc             C   s   | j  ¡  d S )N)rM   Ú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)r9   rD   rX   Úwfile_filenor3   Ú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[   rn   rm   r.   Ú
addCleanuprW   r-   rN   rb   ÚIPPROTO_TCPrc   r@   rŸ   ZassertIsInstancer9   ÚioÚBufferedIOBaser   r«   r¬   )r%   r­   rD   rg   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
ó    )r9   r:   rD   Úsent1r7   r8   Ú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
r`   é   )r   )r-   rN   rb   r¯   Zmakefilerc   r@   r8   rd   r˜   r	   ÚSIGUSR1r©   ÚfloatÚlen)rg   Úreader)rº   Úmain_threadr³   Ú	received2Ú	response1rD   r   r   Ú
run_client­  s    

z/SocketWriterTest.test_write.<locals>.run_client)rI   s   write data
s   client response
r`   )r†   r‡   Zget_attributer	   r[   rn   rm   r.   r®   rW   rO   r¤   r¾   Ú	get_identrP   rS   rŸ   rV   r   rµ   rÀ   r¶   r¸   r·   )r%   r­   r»   ZoriginalrÅ   Z
backgroundr   )rº   rÂ   r³   rÃ   rÄ   rD   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Úgetattrr0   ZassertCountEqualÚ__all__)r%   rš   rH   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%   r3   r4   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[   rm   r§   )r%   r3   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   r6   Þ  s   r6   r   r½   )r[   rm   r.   rn   r-   rN   rb   rc   r@   rf   rŸ   r   rÏ   rW   )r%   r6   rD   rg   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   )1Ú
contextlibr°   r   Zselectr	   r-   r/   rO   Zunittestr[   Ztest.supportr†   r   r   r   r‡   Zrequiresre   r.   r   rk   Z
skipUnlessr„   rY   rƒ   r   r   r   r\   rr   r   rz   r   Úcontextmanagerr!   ZTestCaser"   r…   rm   r‹   ZBaseRequestHandlerrž   ZThreadingMixInr‘   r”   rª   rÈ   r   Úmainr   r   r   r   Ú<module>   sR   


 b)M"
