a
    äze¤$  ã                   @   s  d dl mZ d dlm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ejZdZG dd„ de	jƒZG dd„ dejƒZd	d
„ ZG dd„ dejƒZG dd„ deƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZedkrþe ¡  dS )é    )Úsupport)Úsocket_helperNs   QUIT
c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Úecho_serveré   c                 C   s<   t j | ¡ || _t tjtj¡| _t 	| j¡| _
d | _d S ©N)Ú	threadingÚThreadÚ__init__ÚeventÚsocketÚAF_INETÚSOCK_STREAMÚsockr   Z	bind_portÚportÚstart_resend_event)Úselfr
   © r   ú(/usr/lib/python3.9/test/test_asynchat.pyr	      s
    zecho_server.__init__c                 C   sÐ   | j  ¡  | j ¡  | j  ¡ \}}d| _t| jvrP| d¡}|sBqP| j| | _q(| j td¡| _| j	rp| j	 
¡  z<| jrª| | jd | j… ¡}t d¡ | j|d … | _qrW n   Y n0 | ¡  | j  ¡  d S )Nó    r   gü©ñÒMbP?)r   Úlistenr
   ÚsetÚacceptÚbufferÚSERVER_QUITÚrecvÚreplacer   ÚwaitÚsendÚ
chunk_sizeÚtimeÚsleepÚclose)r   ÚconnÚclientÚdataÚnr   r   r   Úrun"   s*    





zecho_server.runN)Ú__name__Ú
__module__Ú__qualname__r   r	   r&   r   r   r   r   r      s   	r   c                   @   s>   e Zd Zdd„ Zdd„ Zejdkr*dd„ Zdd	„ Zd
d„ Z	dS )Úecho_clientc                 C   sD   t j | ¡ g | _|  tjtj¡ |  t	|f¡ |  
|¡ d| _d S ©Nr   )ÚasynchatÚ
async_chatr	   ÚcontentsZcreate_socketr   r   r   ÚconnectÚHOSTÚset_terminatorr   )r   Ú
terminatorZserver_portr   r   r   r	   D   s    
zecho_client.__init__c                 C   s   d S r   r   ©r   r   r   r   Úhandle_connectL   s    zecho_client.handle_connectÚdarwinc                 C   s   d S r   r   r3   r   r   r   Úhandle_exptR   s    zecho_client.handle_exptc                 C   s   |  j |7  _ d S r   )r   )r   r$   r   r   r   Úcollect_incoming_dataU   s    z!echo_client.collect_incoming_datac                 C   s   | j  | j¡ d| _d S r+   )r.   Úappendr   r3   r   r   r   Úfound_terminatorX   s    zecho_client.found_terminatorN)
r'   r(   r)   r	   r4   ÚsysÚplatformr6   r7   r9   r   r   r   r   r*   B   s   
r*   c                  C   s:   t  ¡ } t| ƒ}| ¡  |  ¡  |  ¡  t d¡ || fS )Nç{®Gáz„?)r   ÚEventr   Ústartr   Úclearr   r    )r
   Úsr   r   r   Ústart_echo_server\   s    
rA   c                   @   sˆ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd S )!ÚTestAsynchatFc                 C   s   t  ¡ | _d S r   )r   Zthreading_setupÚ_threadsr3   r   r   r   ÚsetUpi   s    zTestAsynchat.setUpc                 C   s   t j| jŽ  d S r   )r   Zthreading_cleanuprC   r3   r   r   r   ÚtearDownl   s    zTestAsynchat.tearDownc                 C   s¦   t  ¡ }t|ƒ}||_| ¡  | ¡  | ¡  t d¡ t	||j
ƒ}| d¡ | d| ¡ | d| ¡ | t¡ tj| jddd t |¡ |  |jddg¡ d S )Nr<   s   hello s   worldó   I'm not dead yet!é,  ©Zuse_pollÚcountÚtimeoutó   hello world)r   r=   r   r   r>   r   r?   r   r    r*   r   Úpushr   ÚasyncoreÚloopÚusepollr   Újoin_threadÚassertEqualr.   )r   ZtermZserver_chunkr
   r@   Úcr   r   r   Úline_terminator_checko   s    



z"TestAsynchat.line_terminator_checkc                 C   s   dD ]}|   d|¡ qd S )N©r   é   é   ó   
©rS   ©r   Úlr   r   r   Útest_line_terminator1…   s    z"TestAsynchat.test_line_terminator1c                 C   s   dD ]}|   d|¡ qd S )NrT   s   
rX   rY   r   r   r   Útest_line_terminator2Š   s    z"TestAsynchat.test_line_terminator2c                 C   s   dD ]}|   d|¡ qd S )NrT   s   qqqrX   rY   r   r   r   Útest_line_terminator3   s    z"TestAsynchat.test_line_terminator3c                 C   sf   t ƒ \}}t||jƒ}d}| |¡ | t¡ tj| jddd t 	|¡ |  
|j|d |… g¡ d S ©Ns   hello world, I'm not dead yet!
rG   r<   rH   ©rA   r*   r   rL   r   rM   rN   rO   r   rP   rQ   r.   )r   Ztermlenr@   r
   rR   r$   r   r   r   Únumeric_terminator_check”   s    



z%TestAsynchat.numeric_terminator_checkc                 C   s   |   d¡ d S )Nr   ©r`   r3   r   r   r   Útest_numeric_terminator1    s    z%TestAsynchat.test_numeric_terminator1c                 C   s   |   d¡ d S )Né   ra   r3   r   r   r   Útest_numeric_terminator2¥   s    z%TestAsynchat.test_numeric_terminator2c                 C   sj   t ƒ \}}td |jƒ}d}| |¡ | t¡ tj| jddd t 	|¡ |  
|jg ¡ |  
|j|¡ d S r^   )rA   r*   r   rL   r   rM   rN   rO   r   rP   rQ   r.   r   ©r   r@   r
   rR   r$   r   r   r   Útest_none_terminator¨   s    



z!TestAsynchat.test_none_terminatorc                 C   sh   t ƒ \}}td|jƒ}d}tj|t dd}| |¡ tj| j	ddd t
 |¡ |  |jdd	g¡ d S )
NrW   ó   hello world
I'm not dead yet!
é   )Zbuffer_sizerG   r<   rH   rK   rF   )rA   r*   r   r,   Zsimple_producerr   Úpush_with_producerrM   rN   rO   r   rP   rQ   r.   )r   r@   r
   rR   r$   Úpr   r   r   Útest_simple_producerµ   s    


z!TestAsynchat.test_simple_producerc                 C   sZ   t ƒ \}}td|jƒ}d}| |t ¡ tj| jddd t 	|¡ |  
|jddg¡ d S )NrW   rg   rG   r<   rH   rK   rF   )rA   r*   r   ri   r   rM   rN   rO   r   rP   rQ   r.   re   r   r   r   Útest_string_producerÀ   s    

z!TestAsynchat.test_string_producerc                 C   s\   t ƒ \}}td|jƒ}| d¡ | t¡ tj| jddd t 	|¡ |  
|jg d¢¡ d S )NrW   s   hello world

I'm not dead yet!
rG   r<   rH   )rK   r   rF   r_   ©r   r@   r
   rR   r   r   r   Útest_empty_lineÊ   s    



ÿzTestAsynchat.test_empty_linec                 C   s†   t ƒ \}}t ¡ |_td|jƒ}| d¡ | t¡ | ¡  t	j
| jddd |j ¡  t |¡ |  |jg ¡ |  t|jƒd¡ d S )NrW   rg   rG   r<   rH   r   )rA   r   r=   r   r*   r   rL   r   Zclose_when_donerM   rN   rO   r   r   rP   rQ   r.   ZassertGreaterÚlenr   rm   r   r   r   Útest_close_when_doneÖ   s    





z!TestAsynchat.test_close_when_donec                 C   sœ   t ƒ \}}td|jƒ}d}| |¡ | t|ƒ¡ | t|ƒ¡ |  t|jd¡ |  t|jd¡ | t¡ t	j
| jddd t |¡ |  |jg d¢¡ d S )	NrW   s   bytes
é
   ÚunicoderG   r<   rH   )ó   bytesrs   rs   )rA   r*   r   rL   Ú	bytearrayÚ
memoryviewÚassertRaisesÚ	TypeErrorr   rM   rN   rO   r   rP   rQ   r.   re   r   r   r   Ú	test_pushì   s    



zTestAsynchat.test_pushN)r'   r(   r)   rO   rD   rE   rS   r[   r\   r]   r`   rb   rd   rf   rk   rl   rn   rp   rx   r   r   r   r   rB   f   s    
rB   c                   @   s   e Zd ZdZdS )ÚTestAsynchat_WithPollTN)r'   r(   r)   rO   r   r   r   r   ry   ý   s   ry   c                   @   s   e Zd Zdd„ ZdS )ÚTestAsynchatMockedc                 C   s~   t j ¡ }ttjƒ|j_t 	¡ }| 
|¡ |  |j¡ t jj |d¡}| ¡  W d   ƒ n1 sd0    Y  |  |j¡ d S )NZhandle_error)ÚunittestZmockZMockÚBlockingIOErrorÚerrnoÚEAGAINr   Zside_effectr,   r-   Z
set_socketZ
addCleanupZdel_channelZpatchÚobjectZhandle_readZassertFalseZcalled)r   r   Ú
dispatcherÚerrorr   r   r   Útest_blockingioerror  s    

&z'TestAsynchatMocked.test_blockingioerrorN)r'   r(   r)   r‚   r   r   r   r   rz     s   rz   c                   @   s   e Zd Zdd„ ZdS )ÚTestHelperFunctionsc                 C   s,   |   t dd¡d¡ |   t dd¡d¡ d S )Nzqwertyz
r   Z
qwertydkjfr   )rQ   r,   Zfind_prefix_at_endr3   r   r   r   Útest_find_prefix_at_end  s    z+TestHelperFunctions.test_find_prefix_at_endN)r'   r(   r)   r„   r   r   r   r   rƒ     s   rƒ   c                   @   s   e Zd Zdd„ ZdS )ÚTestNotConnectedc                 C   s   t  ¡ }|  t|jd¡ d S )Néÿÿÿÿ)r,   r-   rv   Ú
ValueErrorr1   )r   r#   r   r   r   Ú!test_disallow_negative_terminator  s    z2TestNotConnected.test_disallow_negative_terminatorN)r'   r(   r)   rˆ   r   r   r   r   r…     s   r…   Ú__main__)Útestr   Ztest.supportr   r,   rM   r}   r   r:   r   r   r{   Zunittest.mockr0   r   r   r   r-   r*   rA   ZTestCaserB   ry   rz   rƒ   r…   r'   Úmainr   r   r   r   Ú<module>   s.   .
 