U
    lufwÅ  ã                   @   sF  d dl mZ d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZmZmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(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l0Z0d dl1Z1d dl2Z2d dl3Z3d dl4m5Z5 d dl4Z4dd„ Z6G dd„ de(ƒZ7G dd„ de8ƒZ9G dd„ de8ƒZ:G dd„ de:ƒZ;G dd„ de9eƒZ<G dd„ de9eƒZ=G dd „ d e;eƒZ>G d!d"„ d"e;eƒZ?G d#d$„ d$e;eƒZ@G d%d&„ d&eƒZAG d'd(„ d(eƒZBG d)d*„ d*eƒZCe#G d+d,„ d,e:eƒƒZDG d-d.„ d.e4jEƒZFdS )/é    )ÚFuture)Úgen)Únetutil)ÚIOLoop)ÚIOStreamÚSSLIOStreamÚPipeIOStreamÚStreamClosedErrorÚ_StreamBuffer)ÚHTTPHeaders)Ú	ConditionÚEvent)Úgen_log)Ússl_options_to_contextÚssl_wrap_socket)ÚAddThreadSelectorEventLoop)Ú	TCPServer)ÚAsyncHTTPTestCaseÚAsyncHTTPSTestCaseÚAsyncTestCaseÚbind_unused_portÚ	ExpectLogÚgen_test)ÚskipIfNonUnixÚrefusing_portÚskipPypy3V58Úignore_deprecation)ÚRequestHandlerÚApplicationN)Úmockc                   C   s0   t tj tj t¡d¡tj tj t¡d¡dS )Nútest.crtútest.key)ÚcertfileÚkeyfile)ÚdictÚosÚpathÚjoinÚdirnameÚ__file__© r*   r*   ú>/tmp/pip-unpacked-wheel-bmg6zs32/tornado/test/iostream_test.pyÚ_server_ssl_options/   s    þr,   c                   @   s   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   s   |   d¡ d S )NZHello)Úwrite©Úselfr*   r*   r+   Úget7   s    zHelloHandler.getN)Ú__name__Ú
__module__Ú__qualname__r1   r*   r*   r*   r+   r-   6   s   r-   c                   @   s¤   e Zd Zdd„ Zdd„ Zejdœdd„Zeejdœdd	„ƒZ	eejdœd
d„ƒZ
eejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZdS )ÚTestIOStreamWebMixinc                 C   s
   t ƒ ‚d S ©N©ÚNotImplementedErrorr/   r*   r*   r+   Ú_make_client_iostream<   s    z*TestIOStreamWebMixin._make_client_iostreamc                 C   s   t dtfgƒS )Nú/)r   r-   r/   r*   r*   r+   Úget_app?   s    zTestIOStreamWebMixin.get_appr/   c                 C   s   | j dddid}| ¡  d S )Nr:   Ú
ConnectionÚclose)Úheaders)ÚfetchZrethrow)r0   Úresponser*   r*   r+   Útest_connection_closedB   s    z+TestIOStreamWebMixin.test_connection_closedc                 c   sT   |   ¡ }| d|  ¡ f¡V  | d¡ | ¡ V }|  | d¡¡ |  | d¡¡ d S )Nú	127.0.0.1ó   GET / HTTP/1.0

s   HTTP/1.1 200ó   Hello)r9   ÚconnectÚget_http_portr.   Úread_until_closeÚ
assertTrueÚ
startswithÚendswith)r0   ÚstreamÚdatar*   r*   r+   Útest_read_until_closeL   s    

z*TestIOStreamWebMixin.test_read_until_closec                 c   sˆ   |   ¡ | _| j d|  ¡ f¡V  | j d¡ | j d¡V }|  |d¡ | j d¡V }|  |d¡ | j d¡V }|  |d¡ | j ¡  d S )	NrB   rC   é	   s	   HTTP/1.1 r   ó    é   s   200)r9   rK   rE   rF   r.   Ú
read_bytesÚassertEqualr=   )r0   rL   r*   r*   r+   Útest_read_zero_bytesV   s    
z)TestIOStreamWebMixin.test_read_zero_bytesc                 c   s˜   |   ¡ }| d|  ¡ f¡}| d¡}|  | ¡ ¡ t ||¡}g }| ¡ sb| ¡ V  | 	|j
¡ qB|  |||g¡ | ¡ V }|  | d¡¡ | ¡  d S )NrB   ó%   GET / HTTP/1.0
Connection: close

rD   )r9   rE   rF   r.   ÚassertFalseÚdoner   ZWaitIteratorÚnextÚappendZcurrent_futurerR   rG   rH   rJ   r=   )r0   rK   Úconnect_futZ	write_futÚitZresolved_orderrL   r*   r*   r+   Útest_write_while_connectingj   s    


z0TestIOStreamWebMixin.test_write_while_connectingc                 c   s˜   |   ¡ }| d|  ¡ f¡V }|  ||¡ | d¡V  | d¡V }|  |d¡ | d¡V }t | 	d¡¡}t
|d ƒ}| |¡V }|  |d¡ | ¡  d	S )
z3Basic test of IOStream's ability to return Futures.rB   rC   ó   
s   HTTP/1.1 200 OK
ó   

Úlatin1zContent-LengthrD   N)r9   rE   rF   ZassertIsr.   Ú
read_untilrR   r   ÚparseÚdecodeÚintrQ   r=   )r0   rK   Zconnect_resultÚ
first_lineZheader_datar>   Úcontent_lengthÚbodyr*   r*   r+   Útest_future_interface€   s    z*TestIOStreamWebMixin.test_future_interfacec              	   c   sV   |   ¡ }| d|  ¡ f¡V  | d¡V  |  t¡ | d¡V  W 5 Q R X | ¡  d S )NrB   rC   é   )r9   rE   rF   r.   ÚassertRaisesr	   rQ   r=   ©r0   rK   r*   r*   r+   Útest_future_close_while_reading‘   s    z4TestIOStreamWebMixin.test_future_close_while_readingc              	   c   sn   |   ¡ }| d|  ¡ f¡V  | d¡V  | d¡V  | ¡ V }|  |d¡ |  t¡ | 	d¡ W 5 Q R X d S )NrB   rT   r]   rD   é   )
r9   rE   rF   r.   r_   rG   rR   rh   r	   rQ   )r0   rK   re   r*   r*   r+   Útest_future_read_until_closeš   s    
z1TestIOStreamWebMixin.test_future_read_until_closeN)r2   r3   r4   r9   r;   ÚtypingÚAnyrA   r   rM   rS   r[   rf   rj   rl   r*   r*   r*   r+   r5   ;   s   
	r5   c                   @   sÔ  e Zd Zdd„ Zdd„ Zedd„ ƒZeejdœdd	„ƒZ	eejdœd
d„ƒZ
eejdœdd„ƒZeejdœdd„ƒZedd„ ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœdd„ƒZeejdœd d!„ƒZeejdœd"d#„ƒZeejdœd$d%„ƒZed&d'„ ƒZeejdœd(d)„ƒZeejdœd*d+„ƒZed,d-„ ƒZeejdœd.d/„ƒZeejdœd0d1„ƒZeejdœd2d3„ƒZed4d5„ ƒZd6S )7ÚTestReadWriteMixinc                 K   s   t ‚d S r6   r7   )r0   Úkwargsr*   r*   r+   Úmake_iostream_pair®   s    z%TestReadWriteMixin.make_iostream_pairc                 K   s   G dd„ dƒ}|| |ƒS )zŠLike make_iostream_pair, but called by ``async with``.

        In py37 this becomes simpler with contextlib.asynccontextmanager.
        c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z=TestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContextc                 S   s   || _ || _d S r6   )Útestrp   )r0   rr   rp   r*   r*   r+   Ú__init__¸   s    zFTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__init__c                 Ó   s   | j jf | jŽI d H | _| jS r6   )rr   rq   rp   Úpairr/   r*   r*   r+   Ú
__aenter__¼   s    zHTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aenter__c                 Ó   s   | j D ]}| ¡  qd S r6   )rt   r=   )r0   ÚtypÚvalueÚtbÚsr*   r*   r+   Ú	__aexit__À   s    
zGTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aexit__N)r2   r3   r4   rs   ru   rz   r*   r*   r*   r+   ÚIOStreamPairContext·   s   r{   r*   )r0   rp   r{   r*   r*   r+   Úiostream_pair±   s    z TestReadWriteMixin.iostream_pairc                 c   s.   |   ¡ V \}}| d¡V  | ¡  | ¡  d S )NrO   )rq   r.   r=   )r0   ÚrsÚwsr*   r*   r+   Útest_write_zero_bytesÆ   s    z(TestReadWriteMixin.test_write_zero_bytesr/   c                 c   st   |   ¡ V \}}zN| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W 5 | ¡  | ¡  X d S )Nó   12rk   ó   1ó   2)rq   r=   r.   rX   rQ   rR   )r0   r}   r~   Úchunksr*   r*   r+   Ú"test_future_delayed_close_callbackÏ   s    
z5TestReadWriteMixin.test_future_delayed_close_callbackc                 c   s|   | j ddV \}}zR| d¡ | d¡V }|  d|¡ | ¡  t d¡V  | d¡V }|  d|¡ W 5 | ¡  | ¡  X d S )Né   )Zread_chunk_sizes   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg{®Gáz„?)rq   r=   r.   rQ   rR   r   Úsleep©r0   r}   r~   rL   r*   r*   r+   Útest_close_buffered_dataß   s    

z+TestReadWriteMixin.test_close_buffered_datac                 c   sj   |   ¡ V \}}zD| d¡ | d¡V }| ¡  |  |d¡ | ¡ V }|  |d¡ W 5 | ¡  | ¡  X d S )Ns   1234rk   r   s   234)rq   r=   r.   rQ   rR   rG   r‡   r*   r*   r+   Ú!test_read_until_close_after_closeù   s    

z4TestReadWriteMixin.test_read_until_close_after_closec                 c   s”   |   ¡ V \}}znt|tƒr0t ¡ dkr0t d¡‚d}t|ƒD ]}| 	d¡ q<| 	d¡ | 
d¡V }|  t|ƒ|d d ¡ W 5 | ¡  | ¡  X d S )NÚPyPyz$pypy gc causes problems with opensslé   s   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr\   é   é   )rq   r=   Ú
isinstancer   ÚplatformÚpython_implementationÚunittestZSkipTestÚranger.   r_   rR   Úlen)r0   r}   r~   ZNUM_KBÚirL   r*   r*   r+   Útest_large_read_until  s    ÿ
þ

z(TestReadWriteMixin.test_large_read_untilc              
   Ã   sv   |   ¡ 4 I d H šV\}}t | d¡¡}t d¡I d H  | d¡I d H  | d¡ | ¡  |I d H  W 5 Q I d H R X d S )Nó   doneçš™™™™™¹?ó   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r|   ÚasyncioÚensure_futurer_   r†   r.   r=   ©r0   r}   r~   Úrfr*   r*   r+   Ú.test_read_until_with_close_after_second_packet%  s    
zATestReadWriteMixin.test_read_until_with_close_after_second_packetc              
   Ã   s|   |   ¡ 4 I d H š\\}}t | d¡¡}| d¡I d H  | d¡ | ¡  |  t¡ |I d H  W 5 Q R X W 5 Q I d H R X d S )Nr–   r˜   s   foo)r|   r™   rš   r_   r.   r=   rh   r	   r›   r*   r*   r+   Ú'test_read_until_unsatisfied_after_close=  s    
z:TestReadWriteMixin.test_read_until_unsatisfied_after_closec                 c   s~   d}|   ¡ V \}}tƒ }| |j¡ zB| |¡ | d¡V }|  ||¡ | ¡  | d¡ | ¡ V  W 5 | ¡  | ¡  X d S )Ns   OK
r\   )	rq   r   Úset_close_callbackÚsetr=   r.   r_   rR   Úwait)r0   ÚOKr}   r~   ÚeventÚresr*   r*   r+   Ú%test_close_callback_with_pending_readK  s    

z8TestReadWriteMixin.test_close_callback_with_pending_readc                 #   sž   |   ¡ V \}}dg‰ tƒ ‰‡ ‡fdd„}| |¡ zT| d¡ | d¡V }|  |d¡ |  ˆ d ¡ | ¡  ˆ ¡ V  |  	ˆ d ¡ W 5 | ¡  | ¡  X d S )NFc                      s   dˆ d< ˆ  ¡  d S )NTr   )Únotifyr*   ©ÚclosedZcondr*   r+   Úclose_callbackk  s    zETestReadWriteMixin.test_future_close_callback.<locals>.close_callbackó   ark   r   )
rq   r   rŸ   r=   r.   rQ   rR   rU   r¡   rH   )r0   r}   r~   r©   r¤   r*   r§   r+   Útest_future_close_callbackc  s    


z-TestReadWriteMixin.test_future_close_callbackc                 c   sT   |   ¡ V \}}z.| d¡}| tdƒ¡ |V }|  |d¡ W 5 | ¡  | ¡  X d S )Né   ó   hellos   hell)rq   r=   rQ   r.   Ú
memoryviewrR   ©r0   r}   r~   ÚfutrL   r*   r*   r+   Útest_write_memoryview|  s    
z(TestReadWriteMixin.test_write_memoryviewc                 c   sš   |   ¡ V \}}zt|jddd}| d¡ |V }|  |d¡ |jddd}| d¡ |V }|  |d¡ |jdddV }|  |d	¡ W 5 | ¡  | ¡  X d S )
Né2   T©Úpartialr­   rP   s   worldó   worr   rO   )rq   r=   rQ   r.   rR   r¯   r*   r*   r+   Útest_read_bytes_partialˆ  s    

z*TestReadWriteMixin.test_read_bytes_partialc              	   c   sÎ   |   ¡ V \}}tƒ }| |j¡ z–|jddd}| d¡ |V }|  |d¡ |jddd}| d¡ |V }|  |d¡ tt	dt
jd( |jddd}| d	¡ | ¡ V  W 5 Q R X W 5 | ¡  | ¡  X d S ©
Nó   defr²   ©Z	max_bytesó   abcdefé   úUnsatisfiable read©Úlevelé   ó   123456)rq   r   rŸ   r    r=   r_   r.   rR   r   r   ÚloggingÚINFOr¡   ©r0   r}   r~   r¨   r°   rL   r*   r*   r+   Útest_read_until_max_bytes¡  s$    


z,TestReadWriteMixin.test_read_until_max_bytesc              
   c   s’   |   ¡ V \}}tƒ }| |j¡ zZ| d¡ ttdtj	d, |  
t¡ |jdddV  W 5 Q R X W 5 Q R X | ¡ V  W 5 | ¡  | ¡  X d S ©NrÀ   r¼   r½   r¸   r¿   r¹   )rq   r   rŸ   r    r=   r.   r   r   rÁ   rÂ   rh   r	   r_   r¡   ©r0   r}   r~   r¨   r*   r*   r+   Ú test_read_until_max_bytes_inline½  s    
$z3TestReadWriteMixin.test_read_until_max_bytes_inlinec              	   c   sz   |   ¡ V \}}tƒ }| |j¡ zB| d¡ ttdtj	d |j
ddd | ¡ V  W 5 Q R X W 5 | ¡  | ¡  X d S ©Nrº   r¼   r½   r¸   r¿   r¹   )rq   r   rŸ   r    r=   r.   r   r   rÁ   rÂ   r_   r¡   rÆ   r*   r*   r+   Ú'test_read_until_max_bytes_ignores_extraÐ  s    
z:TestReadWriteMixin.test_read_until_max_bytes_ignores_extrac              	   c   sÎ   |   ¡ V \}}tƒ }| |j¡ z–|jddd}| d¡ |V }|  |d¡ |jddd}| d¡ |V }|  |d¡ tt	dt
jd( |jddd | d	¡ | ¡ V  W 5 Q R X W 5 | ¡  | ¡  X d S r·   )rq   r   rŸ   r    r=   Úread_until_regexr.   rR   r   r   rÁ   rÂ   r¡   rÃ   r*   r*   r+   Útest_read_until_regex_max_bytesá  s$    


z2TestReadWriteMixin.test_read_until_regex_max_bytesc              	   c   sz   |   ¡ V \}}tƒ }| |j¡ zB| d¡ ttdtj	d |j
ddd | ¡ V  W 5 Q R X W 5 | ¡  | ¡  X d S rÅ   ©rq   r   rŸ   r    r=   r.   r   r   rÁ   rÂ   rÊ   r¡   rÆ   r*   r*   r+   Ú&test_read_until_regex_max_bytes_inlineý  s    
z9TestReadWriteMixin.test_read_until_regex_max_bytes_inlinec              	   c   sz   |   ¡ V \}}tƒ }| |j¡ zB| d¡ ttdtj	d |j
ddd | ¡ V  W 5 Q R X W 5 | ¡  | ¡  X d S rÈ   rÌ   rÆ   r*   r*   r+   Ú-test_read_until_regex_max_bytes_ignores_extra  s    
z@TestReadWriteMixin.test_read_until_regex_max_bytes_ignores_extrac                 c   sb   | j ddV \}}z8| dd ¡ tdƒD ]}| d¡V }|  |d¡ q*W 5 | ¡  | ¡  X d S )Né (  ©Úmax_buffer_sizes   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaéd   rŒ   )rq   r=   r.   r’   rQ   rR   ©r0   r}   r~   r”   rL   r*   r*   r+   Ú"test_small_reads_from_large_buffer   s    z5TestReadWriteMixin.test_small_reads_from_large_bufferc                 c   sf   | j ddV \}}z<| dd ¡ tdƒD ] }|jdddV }|  |d¡ q*W 5 | ¡  | ¡  X d S )NrÏ   rÐ   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
rÒ   ó   
r‹   r¹   )rq   r=   r.   r’   r_   rR   rÓ   r*   r*   r+   Ú(test_small_read_untils_from_large_buffer/  s    z;TestReadWriteMixin.test_small_read_untils_from_large_bufferc                 c   sv   d}| j d| dV \}}zD| d| ¡ | |¡V  t d¡V  tdƒD ]}| |¡V  qJW 5 | ¡  | ¡  X d S )Nrg   r¿   rÐ   s
   aaaaaaaaaar—   rN   )rq   r=   r.   rQ   r   r†   r’   )r0   ZMBr}   r~   r”   r*   r*   r+   Útest_flow_control>  s    z$TestReadWriteMixin.test_flow_controlc                 #   sX  ˆ   ¡ V \}}‡ fdd„}z$tdƒ}| |¡}| d¡ t d¡V  ˆ  | ¡ ¡ | d¡ |V }ˆ  	| ¡ ¡ ˆ  
|d¡ ˆ  
t|ƒd¡ | |¡}t d¡V  ˆ  | ¡ ¡ | d¡ |V }ˆ  	| ¡ ¡ ˆ  
|d¡ ˆ  
t|ƒd	¡ td
ƒ}| d¡ | |¡V }ˆ  
|d
¡ ˆ  
t|ƒd¡ | d¡V }ˆ  
|d¡ W 5 | ¡  | ¡  X d S )Nc                      s   ˆ j  dd„ ¡ d S )Nc                   S   s
   t  d¡S )Nçš™™™™™©?)r   r†   r*   r*   r*   r+   Ú<lambda>U  rO   zGTestReadWriteMixin.test_read_into.<locals>.sleep_some.<locals>.<lambda>)Úio_loopZrun_syncr*   r/   r*   r+   Ú
sleep_someT  s    z5TestReadWriteMixin.test_read_into.<locals>.sleep_someé
   r­   rØ   s   world!!s
   helloworlds
   1234567890s
   !!12345678r¬   s	   abcdefghis   90abé   s   cdefghi)rq   r=   Ú	bytearrayÚ	read_intor.   r   r†   rH   ÚreadingrU   rR   ÚbytesrQ   )r0   r}   r~   rÛ   Úbufr°   rL   r*   r/   r+   Útest_read_intoP  s<    





z!TestReadWriteMixin.test_read_intoc                 c   sÜ   |   ¡ V \}}z¶tdƒ}|j|dd}| d¡ |V }|  | ¡ ¡ |  |d¡ |  t|ƒd¡ | d¡ |j|ddV }|  |d¡ |  t|ƒd¡ |j|ddV }|  |d	¡ |  t|ƒd
¡ W 5 | ¡  | ¡  X d S )NrÜ   Tr³   r­   r¿   s
   hello     s   world!1234567890s
   world!1234r»   s
   5678901234)	rq   r=   rÞ   rß   r.   rU   rà   rR   rá   )r0   r}   r~   râ   r°   rL   r*   r*   r+   Útest_read_into_partialz  s$    

z)TestReadWriteMixin.test_read_into_partialc                 c   sJ   |   ¡ V \}}z$tƒ }| |¡}|  | ¡ d¡ W 5 | ¡  | ¡  X d S ©Nr   )rq   r=   rÞ   rß   rR   Úresult)r0   r}   r~   râ   r°   r*   r*   r+   Útest_read_into_zero_bytes—  s    
z,TestReadWriteMixin.test_read_into_zero_bytesc                 #   sš   t  d¡‰d‰|  ¡ V \‰‰t ¡ ‰t ¡ ‰ tj‡‡‡‡fdd„ƒ}tj‡ ‡‡‡fdd„ƒ}z&|ƒ |ƒ gV  ˆ ¡ ˆ  ¡ ks€t	‚W 5 ˆ ¡  ˆ ¡  X d S )Né*   i@B c                  3   sX   ˆ } | dkrHˆ  dtd| ƒ¡}t |¡}ˆ |¡ ˆ |¡V  | |8 } q| dksTt‚d S )Nr   rk   éè  )ÚrandintÚminr%   ÚurandomÚupdater.   ÚAssertionError)Ú	remainingÚsizerL   )ÚnbytesÚproduce_hashÚrr~   r*   r+   Úproduce®  s    


z9TestReadWriteMixin.test_many_mixed_reads.<locals>.producec                  3   s    ˆ} | dkrˆ  ¡ dkrJˆ dtd| ƒ¡}ˆ |¡V }ˆ  |¡ | |8 } qˆ dtd| ƒ¡}t|ƒ}ˆ |¡V }||ks|t‚ˆ  |¡ | |8 } q| dksœt‚d S )Nr   g      à?rk   ré   )Úrandomrê   rë   rQ   rí   rÞ   rß   rî   )rï   rð   rL   râ   Ún)Úconsume_hashrñ   ró   r}   r*   r+   Úconsume¹  s    



z9TestReadWriteMixin.test_many_mixed_reads.<locals>.consume)
rõ   ÚRandomrq   ÚhashlibÚsha1r   Ú	coroutiner=   Ú	hexdigestrî   )r0   rô   rø   r*   )r÷   rñ   rò   ró   r}   r~   r+   Útest_many_mixed_reads¢  s    

z(TestReadWriteMixin.test_many_mixed_readsN) r2   r3   r4   rq   r|   r   r   rm   rn   r„   rˆ   r‰   r•   r   rž   r¥   r«   r±   r¶   rÄ   rÇ   rÉ   rË   rÍ   rÎ   rÔ   rÖ   r×   rã   rä   rç   rþ   r*   r*   r*   r+   ro   ª   sd   



)
ro   c                   @   s¦   e Zd Zdd„ Zdd„ Zejejdœdd„ƒZ	e
ejdœdd	„ƒZe
ejdœd
d„ƒZe
ejdœdd„ƒZeee
ejdœdd„ƒƒƒZee
dd„ ƒƒZe
dd„ ƒZdS )ÚTestIOStreamMixinc                 K   s
   t ƒ ‚d S r6   r7   ©r0   Ú
connectionrp   r*   r*   r+   Ú_make_server_iostreamÖ  s    z'TestIOStreamMixin._make_server_iostreamc                 K   s
   t ƒ ‚d S r6   r7   r   r*   r*   r+   r9   Ù  s    z'TestIOStreamMixin._make_client_iostreamr/   c                 +   s„   t ƒ \}}tƒ ‰‡ ‡‡fdd„}t ||¡ ˆjt ¡ fˆ Ž}| d|f¡}ˆ|gV \}}ˆj | 	¡ ¡ | 
¡  t ||f¡‚d S )Nc                    s   ˆ  ˆj| fˆ Ž¡ d S r6   )Ú
set_resultr  )r  Úaddress©rp   r0   Zserver_stream_futr*   r+   Úaccept_callbacká  s    ÿz=TestIOStreamMixin.make_iostream_pair.<locals>.accept_callbackrB   )r   r   r   Úadd_accept_handlerr9   ÚsocketrE   rÚ   Úremove_handlerÚfilenor=   r   ZReturn)r0   rp   ÚlistenerÚportr  Úclient_streamrY   Úserver_streamr*   r  r+   rq   Ü  s    
z$TestIOStreamMixin.make_iostream_pairc              
   c   s†   t ƒ \}}|  |¡ tt ¡ ƒ}| | j¡ ttddd, |  t	¡ | 
d|f¡V  W 5 Q R X W 5 Q R X |  t|jtƒ|j¡ d S )Nz.*F)ÚrequiredrB   )r   Z
addCleanupr   r  rŸ   Ústopr   r   rh   r	   rE   rH   rŽ   ÚerrorÚConnectionRefusedError)r0   Zcleanup_funcr  rK   r*   r*   r+   Útest_connection_refusedî  s    

$z)TestIOStreamMixin.test_connection_refusedc              
   c   s„   t   t jt jd¡}t|ƒ}| | j¡ tjdt  t	j
d¡d< |  t¡ | d¡V  W 5 Q R X |  t|jt jƒ¡ W 5 Q R X d S )Nr   zsocket.socket.connectÚboom©Zside_effect)Ú	localhostéP   )r  ÚAF_INETÚSOCK_STREAMr   rŸ   r  r   ÚpatchÚgaierrorÚerrnoZEIOrh   r	   rE   rH   rŽ   r  )r0   ry   rK   r*   r*   r+   Útest_gaierrorÿ  s     ÿzTestIOStreamMixin.test_gaierrorc              
   c   sh   |   ¡ V \}}zBtjdtdƒd& |  td¡ | ¡  W 5 Q R X W 5 Q R X W 5 | ¡  | ¡  X d S )Nz.tornado.iostream.BaseIOStream._try_inline_readr  r  )rq   r=   r   r  ÚIOErrorÚassertRaisesRegexrG   )r0   ÚserverÚclientr*   r*   r+   Ú test_read_until_close_with_error  s    þ z2TestIOStreamMixin.test_read_until_close_with_errorc              	   c   sz   t  ¡ }t|jtƒr|  d¡ |  ¡ V \}}z6t |j	 
¡ ¡ |  t	j¡ | d¡ W 5 Q R X W 5 | ¡  | ¡  X d S )Nz(AddThreadSelectorEventLoop not supportedrk   )r   ÚcurrentrŽ   Zselector_loopr   ZskipTestrq   r=   r%   r  r
  rh   r  rQ   )r0   rÚ   r   r!  r*   r*   r+   Útest_inline_read_error  s    þ
z(TestIOStreamMixin.test_inline_read_errorc              	   #   s‚   |   ¡ V \‰ }tƒ }ˆ  |j¡ zJˆ  d¡ | d¡ ‡ fdd„}|ˆ _tt	dƒ | 
¡ V  W 5 Q R X W 5 ˆ  ¡  | ¡  X d S )Nrk   rª   c                      s    t  ˆ j ¡ ¡ ˆ j ˆ ¡ d S r6   )r%   r=   r  r
  Ú	__class__Úread_from_fdr*   ©r   r*   r+   Úfake_read_from_fdO  s    zJTestIOStreamMixin.test_async_read_error_logging.<locals>.fake_read_from_fdzerror on read)rq   r   rŸ   r    r=   rQ   r.   r&  r   r   r¡   )r0   r!  r¨   r(  r*   r'  r+   Útest_async_read_error_loggingA  s    

z/TestIOStreamMixin.test_async_read_error_loggingc                 #   s’   d\‰‰d}ˆˆ | ‰| j ˆdV \‰‰ tj‡‡‡fdd„ƒ‰tj‡ ‡‡fdd„ƒ}z$‡fdd	„t|ƒD ƒ|ƒ g V  W 5 ˆ ¡  ˆ  ¡  X d
S )z?
        Test that write() Futures are never orphaned.
        )iˆ  ré   rÜ   rÐ   c                  3   s&   dˆ  } t ˆƒD ]}ˆ | ¡V  qd S )Nó   x)r’   r.   )rL   r”   )Úmrö   r   r*   r+   rô   g  s    z4TestIOStreamMixin.test_future_write.<locals>.producec                  3   s*   d} | ˆk r&ˆ   ˆ¡V }| t|ƒ7 } qd S rå   )rQ   r“   )Znreadr¤   )r!  r+  Útotal_bytesr*   r+   rø   m  s    z4TestIOStreamMixin.test_future_write.<locals>.consumec                    s   g | ]
}ˆ ƒ ‘qS r*   r*   )Ú.0r”   )rô   r*   r+   Ú
<listcomp>u  s     z7TestIOStreamMixin.test_future_write.<locals>.<listcomp>N)rq   r   rü   r=   r’   )r0   Z
nproducersrø   r*   )r!  r+  rö   rô   r   r,  r+   Útest_future_write[  s    $z#TestIOStreamMixin.test_future_writeN)r2   r3   r4   r  r9   r   rü   rm   rn   rq   r   r  r  r"  r   r   r$  r)  r/  r*   r*   r*   r+   rÿ   Õ  s&    rÿ   c                   @   s   e Zd Zdd„ ZdS )ÚTestIOStreamWebHTTPc                 C   s   t t ¡ ƒS r6   )r   r  r/   r*   r*   r+   r9   |  s    z)TestIOStreamWebHTTP._make_client_iostreamN©r2   r3   r4   r9   r*   r*   r*   r+   r0  {  s   r0  c                   @   s   e Zd Zdd„ ZdS )ÚTestIOStreamWebHTTPSc                 C   s   t t ¡ ttjddS )N©Ú	cert_reqs©Ússl_options)r   r  r$   ÚsslÚ	CERT_NONEr/   r*   r*   r+   r9     s    z*TestIOStreamWebHTTPS._make_client_iostreamNr1  r*   r*   r*   r+   r2  €  s   r2  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamc                 K   s   t |f|ŽS r6   ©r   r   r*   r*   r+   r  †  s    z"TestIOStream._make_server_iostreamc                 K   s   t |f|ŽS r6   r:  r   r*   r*   r+   r9   ‰  s    z"TestIOStream._make_client_iostreamN©r2   r3   r4   r  r9   r*   r*   r*   r+   r9  …  s   r9  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamSSLc                 K   s*   t tƒ dd}|j|ddd}t|f|ŽS )NT)Úserver_sideF©r=  Údo_handshake_on_connect)r   r,   Úwrap_socketr   )r0   r  rp   Ússl_ctxr*   r*   r+   r  Ž  s    ýz%TestIOStreamSSL._make_server_iostreamc                 K   s   t |fdttjdi|—ŽS )Nr6  r3  )r   r$   r7  r8  r   r*   r*   r+   r9   —  s    ÿ
ÿÿz%TestIOStreamSSL._make_client_iostreamNr;  r*   r*   r*   r+   r<    s   	r<  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamSSLContextc                 K   sZ   t  t jj¡}| tj tj t	¡d¡tj tj t	¡d¡¡ t
||ddd}t|f|ŽS ©Nr    r!   TFr>  )r7  Úcreate_default_contextÚPurposeÚCLIENT_AUTHÚload_cert_chainr%   r&   r'   r(   r)   r   r   ©r0   r  rp   Úcontextr*   r*   r+   r  ¡  s    þ   ÿz,TestIOStreamSSLContext._make_server_iostreamc                 K   s0   t  t jj¡}d|_t j|_t|fd|i|—ŽS )NFr6  )r7  rD  rE  ÚSERVER_AUTHÚcheck_hostnamer8  Úverify_moder   rH  r*   r*   r+   r9   ¬  s    z,TestIOStreamSSLContext._make_client_iostreamNr;  r*   r*   r*   r+   rB     s   rB  c                       s   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zejdd„ ƒZejd	d
„ ƒZ	ddd„Z
ddd„Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS )ÚTestIOStreamStartTLSc              
      sº   zˆt ƒ  ¡  tƒ \| _| _d | _tƒ | _t 	| j| j
¡ tt ¡ ƒ| _| j | j d| jf¡| j¡ |  ¡  | j | j| j¡ |  ¡  W n, tk
r´ } zt|ƒ ‚ W 5 d }~X Y nX d S )NrB   )ÚsuperÚsetUpr   r  r  r  r   Úserver_acceptedr   r  Úacceptr   r  r  rÚ   Z
add_futurerE   r  r¡   Ú	ExceptionÚprint)r0   Úe©r%  r*   r+   rO  ´  s&    
ÿ ÿzTestIOStreamStartTLS.setUpc                    sR   | j d k	r| j  ¡  | jd k	r(| j ¡  | j | j ¡ ¡ | j ¡  tƒ  ¡  d S r6   )	r  r=   r  rÚ   r	  r  r
  rN  ÚtearDownr/   rU  r*   r+   rV  È  s    




zTestIOStreamStartTLS.tearDownc                 C   s.   | j d k	r|  d¡ t|ƒ| _ | j d ¡ d S )Nzshould only get one connection)r  Zfailr   rP  r  )r0   r  r  r*   r*   r+   rQ  Ñ  s    


zTestIOStreamStartTLS.acceptc                 c   sF   | j d k	st‚| j  |¡ | jd k	s(t‚| j d¡V }|  ||¡ d S ©Nr\   )r  rî   r.   r  r_   rR   ©r0   ÚlineZ	recv_liner*   r*   r+   Úclient_send_line×  s
    z%TestIOStreamStartTLS.client_send_linec                 c   sF   | j d k	st‚| j  |¡ | jd k	s(t‚| j d¡V }|  ||¡ d S rW  )r  rî   r.   r  r_   rR   rX  r*   r*   r+   Úserver_send_lineß  s
    z%TestIOStreamStartTLS.server_send_lineNc                 C   s(   | j d k	st‚| j }d | _ | d||¡S )NF)r  rî   Ú	start_tls)r0   r6  Úserver_hostnamer  r*   r*   r+   Úclient_start_tlsç  s    z%TestIOStreamStartTLS.client_start_tlsc                 C   s&   | j d k	st‚| j }d | _ | d|¡S )NT)r  rî   r\  )r0   r6  r  r*   r*   r+   Úserver_start_tlsí  s    z%TestIOStreamStartTLS.server_start_tlsc                 c   s¶   |   d¡V  |  d¡V  |   d¡V  |   d¡V  |  d¡V  |   d¡V  |  ttjd¡}|  tƒ ¡}|V | _|V | _	|  
t| jtƒ¡ |  
t| j	tƒ¡ |  d¡V  |   d¡V  d S )	Ns   220 mail.example.com ready
s   EHLO mail.example.com
s   250-mail.example.com welcome
s   250 STARTTLS
s
   STARTTLS
s   220 Go ahead
r3  s   250 mail.example.com welcome
)r[  rZ  r^  r$   r7  r8  r_  r,   r  r  rH   rŽ   r   )r0   Úclient_futureÚserver_futurer*   r*   r+   Útest_start_tls_smtpó  s    z(TestIOStreamStartTLS.test_start_tls_smtpc              
   c   st   |   tƒ ¡}ttdƒT | jdd}|  tj¡ |V  W 5 Q R X |  tjtj	f¡ |V  W 5 Q R X W 5 Q R X d S )Nú	SSL Errorr  ©r]  )
r_  r,   r   r   r^  rh   r7  ÚSSLErrorr  r  ©r0   ra  r`  r*   r*   r+   Útest_handshake_fail  s    z(TestIOStreamStartTLS.test_handshake_failc              
   c   sr   |   tƒ ¡}ttdƒR | jt ¡ dd}|  tj¡ |V  W 5 Q R X |  t	¡ |V  W 5 Q R X W 5 Q R X d S )Nrc  rB   rd  )
r_  r,   r   r   r^  r7  rD  rh   re  rR  rf  r*   r*   r+   Útest_check_hostname  s     ÿz(TestIOStreamStartTLS.test_check_hostnamec                 c   sd   t tdƒƒ d¡}| jd k	s t‚| j |¡V  | jd k	s<t‚| j |j¡V }|  	t|ƒt|ƒ¡ d S )Nr  ÚL)
r®   rá   Úcastr  rî   r.   r  rQ   rñ   rR   )r0   râ   Úrecvr*   r*   r+   Útest_typed_memoryview$  s    z*TestIOStreamStartTLS.test_typed_memoryview)NN)N)r2   r3   r4   rO  rV  rQ  r   rü   rZ  r[  r^  r_  r   rb  rg  rh  rl  Ú__classcell__r*   r*   rU  r+   rM  ³  s"   	







rM  c                   @   s>   e Zd Zejdd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ	d	S )
ÚWaitForHandshakeTestc              	   c   sÈ   d  }}z˜tƒ \}}|tƒ d}| |¡ t tjj¡}d|_	tj
|_tƒ , | jttddƒO  _tt ¡ |d}W 5 Q R X | d|f¡V  |  |j ¡ ¡ W 5 |d k	r²|  ¡  |d k	rÂ| ¡  X d S )Nr5  FÚOP_NO_TLSv1_3r   rB   )r  r=   r   r,   Z
add_socketr7  rD  rE  rJ  rK  r8  rL  r   ÚoptionsÚgetattrr   r  rE   ZassertIsNotNoneÚcipher)r0   Z
server_clsr   r!  Úsockr  rA  r*   r*   r+   Úconnect_to_server1  s"    

z&WaitForHandshakeTest.connect_to_serverc                 #   s6   | ‰t ƒ ‰ G ‡ ‡fdd„dtƒ}|  |¡V  ˆ V  d S )Nc                       s*   e Zd Z‡fdd„Zej‡ fdd„ƒZdS )zGWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServerc                    s$   ˆ   |j ¡ ¡ ˆ j | j|¡ d S r6   )ZassertIsNoner  rr  rÚ   Zspawn_callbackÚhandle_connection©r0   rK   r  )rr   r*   r+   Úhandle_streamT  s    zUWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_streamc                 3   s   |  ¡ V  ˆ  d ¡ d S r6   ©Úwait_for_handshaker  ri   ©Úhandshake_futurer*   r+   ru  X  s    
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r2   r3   r4   rw  r   rü   ru  r*   ©r{  rr   r*   r+   Ú
TestServerS  s   r}  ©r   r   rt  ©r0   r}  r*   r|  r+   Útest_wait_for_handshake_futureN  s
    
z3WaitForHandshakeTest.test_wait_for_handshake_futurec                 #   s6   | ‰t ƒ ‰ G ‡ ‡fdd„dtƒ}|  |¡V  ˆ V  d S )Nc                       s    e Zd Zej‡ ‡fdd„ƒZdS )zVWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServerc                 3   s*   |  ¡ }ˆ t|j ¡ |V  ˆ  d ¡ d S r6   )ry  rh   ÚRuntimeErrorr  )r0   rK   r  r°   r|  r*   r+   rw  f  s    zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r2   r3   r4   r   rü   rw  r*   r|  r*   r+   r}  e  s   r}  r~  r  r*   r|  r+   Ú-test_wait_for_handshake_already_waiting_error`  s
    	zBWaitForHandshakeTest.test_wait_for_handshake_already_waiting_errorc                 #   s0   t ƒ ‰ G ‡ fdd„dtƒ}|  |¡V  ˆ V  d S )Nc                       s   e Zd Zej‡ fdd„ƒZdS )zRWaitForHandshakeTest.test_wait_for_handshake_already_connected.<locals>.TestServerc                 3   s"   |  ¡ V  |  ¡ V  ˆ  d ¡ d S r6   rx  rv  rz  r*   r+   rw  v  s    

z`WaitForHandshakeTest.test_wait_for_handshake_already_connected.<locals>.TestServer.handle_streamNr‚  r*   rz  r*   r+   r}  u  s   r}  r~  r  r*   rz  r+   Ú)test_wait_for_handshake_already_connectedq  s    z>WaitForHandshakeTest.test_wait_for_handshake_already_connectedN)
r2   r3   r4   r   rü   rt  r   r€  rƒ  r„  r*   r*   r*   r+   rn  0  s   


rn  c                       sL   e Zd Z‡ fdd„Z‡ fdd„Zedd„ ƒZedd„ ƒZed	d
„ ƒZ‡  Z	S )ÚTestIOStreamCheckHostnamec                    s`   t ƒ  ¡  tƒ \| _| _dd„ }t | j|¡ t tj	j
¡| _| j tj tj t¡d¡¡ d S )Nc                 S   sZ   t  t jj¡}| tj tj t	¡d¡tj tj t	¡d¡¡ |j
| ddd} t| ƒ d S rC  )r7  rD  rE  rF  rG  r%   r&   r'   r(   r)   r@  r   )r  r  rA  r*   r*   r+   r  ‰  s    þýz8TestIOStreamCheckHostname.setUp.<locals>.accept_callbackr    )rN  rO  r   r  r  r   r  r7  rD  rE  rJ  Úclient_ssl_ctxÚload_verify_locationsr%   r&   r'   r(   r)   )r0   r  rU  r*   r+   rO  …  s    
ÿzTestIOStreamCheckHostname.setUpc                    s*   | j  | j ¡ ¡ | j ¡  tƒ  ¡  d S r6   )rÚ   r	  r  r
  r=   rN  rV  r/   rU  r*   r+   rV  Ÿ  s    
z"TestIOStreamCheckHostname.tearDownc                 Ã   s8   t t ¡ | jd}|jd| jfddI d H  | ¡  d S )Nr5  rB   zfoo.example.comrd  )r   r  r†  rE   r  r=   ri   r*   r*   r+   Ú
test_match¤  s    þz$TestIOStreamCheckHostname.test_matchc                 Ã   s¦   t t ¡ | jd}ttdtjt ¡ dkdp |  	t
j¡< ttdtjd  |jd| jfdd	I d H  W 5 Q R X W 5 Q R X t ¡ dkr˜t d
¡I d H  W 5 Q R X d S )Nr5  z.*alert bad certificateÚWindows)r¾   r  z0.*(certificate verify failed: Hostname mismatch)r½   rB   úbar.example.comrd  r—   )r   r  r†  r   r   rÁ   ÚWARNINGr   Úsystemrh   r7  ÚSSLCertVerificationErrorrE   r  r™   r†   ri   r*   r*   r+   Útest_no_match­  s&    
üýþ z'TestIOStreamCheckHostname.test_no_matchc                 Ã   s8   d| j _tt ¡ | j d}|jd| jfddI d H  d S )NFr5  rB   rŠ  rd  )r†  rK  r   r  rE   r  ri   r*   r*   r+   Útest_check_disabledÆ  s    þz-TestIOStreamCheckHostname.test_check_disabled)
r2   r3   r4   rO  rV  r   rˆ  rŽ  r  rm  r*   r*   rU  r+   r…  €  s   

r…  c                   @   s2   e Zd Zejdd„ ƒZedd„ ƒZedd„ ƒZdS )ÚTestPipeIOStreamc                 K   s$   t  ¡ \}}t|f|Žt|f|ŽfS r6   )r%   Úpiper   )r0   rp   ró   Úwr*   r*   r+   rq   Ô  s    z#TestPipeIOStream.make_iostream_pairc                 c   s|   |   ¡ V \}}| d¡ | d¡ | d¡V }|  |d¡ | d¡V }|  |d¡ | ¡  | ¡ V }|  |d¡ | ¡  d S )Ns   hels   lo worldó    s   hello rP   rµ   s   ld)rq   r.   r_   rR   rQ   r=   rG   r‡   r*   r*   r+   Útest_pipe_iostreamÚ  s    


z#TestPipeIOStream.test_pipe_iostreamc                 c   sP   |   ¡ V \}}d}| d| ¡ | |¡V }|  |d| ¡ | ¡  | ¡  d S )Nrg   r   )rq   r.   rQ   rR   r=   )r0   r}   r~   Z	NUM_BYTESrL   r*   r*   r+   Útest_pipe_iostream_big_writeî  s    z-TestPipeIOStream.test_pipe_iostream_big_writeN)	r2   r3   r4   r   rü   rq   r   r”  r•  r*   r*   r*   r+   r  Ò  s   

r  c                   @   sJ   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestStreamBufferz9
    Unit tests for the private _StreamBuffer class.
    c                 C   s   t  d¡| _ d S )Nrè   )rõ   rù   r/   r*   r*   r+   rO    s    zTestStreamBuffer.setUpc                 C   s4   t |ttfƒrt|ƒS t |tƒr(| ¡ S t|ƒ‚d S r6   )rŽ   rá   rÞ   r®   ÚtobytesÚ	TypeError)r0   Úbr*   r*   r+   Úto_bytes  s
    
zTestStreamBuffer.to_bytesrÜ   c                 C   s   t ƒ }|jst‚||_|S r6   )r
   Z_large_buf_thresholdrî   )r0   Zlarge_buf_thresholdrâ   r*   r*   r+   Úmake_streambuffer  s    
z"TestStreamBuffer.make_streambufferc                 C   sj   d}|dt |ƒ k rf|  | |¡¡}|  |¡ |  t |ƒ|¡ |  | |¡||f¡ |d d d }qd S )Nrk   r   rP   )r“   rš  ÚpeekrH   ZassertLessEqualrI   )r0   râ   Úexpectedrð   Úgotr*   r*   r+   Ú
check_peek  s    
zTestStreamBuffer.check_peekc                 C   sº   |   t|ƒd¡ d}|D ]:}||7 }| ||ƒ¡ |   t|ƒt|ƒ¡ |  ||¡ q|r¦| j dt|ƒd ¡}||d … }| |¡ |   t|ƒt|ƒ¡ |  ||¡ qT|   t|ƒd¡ d S )Nr   rO   rk   )rR   r“   rX   rŸ  rõ   Ú	randrangeÚadvance)r0   râ   ÚobjsZ
input_typer  Úorö   r*   r*   r+   Úcheck_append_all_then_skip_all  s    
z/TestStreamBuffer.check_append_all_then_skip_allc                 C   sþ   dddddddg}|   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   d¡}td	ƒD ]}| d
¡ qf|  t|j	ƒd¡ td	ƒD ]}| d
¡ q|  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ |  t|ƒd¡ d S )Nr€   s   345s   67s   89aó   bcdes   fghs   ijklmnrÜ   rN   r*  rk   r   é   r   ©r›  r¤  rá   rÞ   r®   r’   rX   rR   r“   Ú_buffersr¡  ©r0   r¢  râ   r”   r*   r*   r+   Ú
test_small1  s&    


zTestStreamBuffer.test_smallc                 C   s  dddddddg}|   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   d¡}td	ƒD ]}| d
¡ qf|  t|j	ƒd	¡ | d¡ |  t|j	ƒd¡ | d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ |  t|ƒd¡ d S )Ns
   1212121212s   345345s(   6767676767676767676767676767676767676767s$   89a89a89a89a89a89a89a89a89a89a89a89ar¥  s   fghfghfghfghfghfghfghs   ijklmnijklmnrÜ   rP   s   xxxxxxxxxxxó   yr¬   ó   zé!   rk   r   r   r§  r©  r*   r*   r+   Ú
test_largeK  s6    ù





zTestStreamBuffer.test_largeN)rÜ   )r2   r3   r4   Ú__doc__rO  rš  r›  rŸ  r¤  rª  r®  r*   r*   r*   r+   r–  þ  s   
	r–  )GZtornado.concurrentr   Ztornador   r   Ztornado.ioloopr   Ztornado.iostreamr   r   r   r	   r
   Ztornado.httputilr   Ztornado.locksr   r   Ztornado.logr   Ztornado.netutilr   r   Ztornado.platform.asyncior   Ztornado.tcpserverr   Ztornado.testingr   r   r   r   r   r   Ztornado.test.utilr   r   r   r   Ztornado.webr   r   r™   r  rú   rÁ   r%   r   rõ   r  r7  rm   r‘   r   r,   r-   Úobjectr5   ro   rÿ   r0  r2  r9  r<  rB  rM  rn  r…  r  ZTestCaser–  r*   r*   r*   r+   Ú<module>   s\    o    / '}PR+