a
    ŠxdÏ¸  ã                   @   s6  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ƒZBe#G d)d*„ d*e:eƒƒZCG d+d,„ d,e4jDƒZEd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*   úR/var/www/html/Ranjet/env/lib/python3.9/site-packages/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   sj   |   ¡ }| d|  ¡ f¡V  | d¡V  |  t¡ | d¡V  W d   ƒ n1 sT0    Y  | ¡  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   s‚   |   ¡ }| d|  ¡ f¡V  | d¡V  | d¡V  | ¡ V }|  |d¡ |  t¡ | 	d¡ W d   ƒ n1 st0    Y  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 i | 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   s„   |   ¡ V \}}z^| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )Nó   12rk   ó   1ó   2)rq   r.   rX   rQ   r=   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 \}}zb| d¡ | d¡V }|  d|¡ | ¡  t d¡V  | d¡V }|  d|¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )Né   )Zread_chunk_sizes   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg{®Gáz„?)rq   r.   rQ   rR   r=   r   Úsleep©r0   r}   r~   rL   r*   r*   r+   Útest_close_buffered_dataß   s    


ÿz+TestReadWriteMixin.test_close_buffered_datac                 c   sz   |   ¡ V \}}zT| d¡ | d¡V }| ¡  |  |d¡ | ¡ V }|  |d¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )Ns   1234rk   r   s   234)rq   r.   rQ   r=   rR   rG   r‡   r*   r*   r+   Ú!test_read_until_close_after_closeù   s    


ÿz4TestReadWriteMixin.test_read_until_close_after_closec                 c   s¤   |   ¡ V \}}z~t|tƒr0t ¡ dkr0t d¡‚d}t|ƒD ]}| d¡ q<| d¡ | 	d¡V }|  
t|ƒ|d d ¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )NÚPyPyz$pypy gc causes problems with opensslé   s   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr\   é   é   )rq   Ú
isinstancer   ÚplatformÚpython_implementationÚunittestZSkipTestÚranger.   r_   rR   Úlenr=   )r0   r}   r~   ZNUM_KBÚirL   r*   r*   r+   Útest_large_read_until  s"    ÿ
þ


ÿz(TestReadWriteMixin.test_large_read_untilc              	   Ã   s   |   ¡ 4 I d H šf\}}t | d¡¡}t d¡I d H  | d¡I d H  | d¡ | ¡  |I d H  W d   ƒI d H  qŒ1 I d H s‚0    Y  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 d   ƒ n1 sr0    Y  W d   ƒI d H  q¦1 I d H sœ0    Y  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¡ zR| |¡ | d¡V }|  ||¡ | ¡  | d¡ | ¡ V  W | ¡  | ¡  n| ¡  | ¡  0 d S )Ns   OK
r\   )	rq   r   Úset_close_callbackÚsetr.   r_   rR   r=   Ú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„}| |¡ zd| d¡ | d¡V }|  |d¡ |  ˆ d ¡ | ¡  ˆ ¡ V  |  	ˆ d ¡ W | ¡  | ¡  n| ¡  | ¡  0 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.   rQ   rR   rU   r=   r¡   rH   )r0   r}   r~   r©   r¤   r*   r§   r+   Útest_future_close_callbackc  s"    



ÿz-TestReadWriteMixin.test_future_close_callbackc                 c   sd   |   ¡ V \}}z>| d¡}| tdƒ¡ |V }|  |d¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )Né   ó   hellos   hell)rq   rQ   r.   Ú
memoryviewrR   r=   ©r0   r}   r~   ÚfutrL   r*   r*   r+   Útest_write_memoryview|  s    

ÿz(TestReadWriteMixin.test_write_memoryviewc                 c   sª   |   ¡ V \}}z„|jddd}| d¡ |V }|  |d¡ |jddd}| d¡ |V }|  |d¡ |jdddV }|  |d	¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )
Né2   T©Úpartialr­   rP   s   worldó   worr   rO   )rq   rQ   r.   rR   r=   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2 |jddd}| d	¡ | ¡ V  W d   ƒ n1 s¾0    Y  W | ¡  | ¡  n| ¡  | ¡  0 d S ©
Nó   defr²   ©Z	max_bytesó   abcdefé   úUnsatisfiable read©Úlevelé   ó   123456)rq   r   rŸ   r    r_   r.   rR   r   r   ÚloggingÚINFOr¡   r=   ©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¡ z’| d¡ ttdtjdJ |  	t
¡  |jdddV  W d   ƒ n1 sn0    Y  W d   ƒ n1 sŒ0    Y  | ¡ V  W | ¡  | ¡  n| ¡  | ¡  0 d S ©NrÀ   r¼   r½   r¸   r¿   r¹   )rq   r   rŸ   r    r.   r   r   rÁ   rÂ   rh   r	   r_   r¡   r=   ©r0   r}   r~   r¨   r*   r*   r+   Ú test_read_until_max_bytes_inline½  s    
L
ÿz3TestReadWriteMixin.test_read_until_max_bytes_inlinec                 c   sž   |   ¡ V \}}tƒ }| |j¡ zf| d¡ ttdtjd( |j	ddd | 
¡ V  W d   ƒ n1 sj0    Y  W | ¡  | ¡  n| ¡  | ¡  0 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2 |jddd | d	¡ | ¡ V  W d   ƒ n1 s¾0    Y  W | ¡  | ¡  n| ¡  | ¡  0 d S r·   )rq   r   rŸ   r    Úread_until_regexr.   rR   r   r   rÁ   rÂ   r¡   r=   rÃ   r*   r*   r+   Útest_read_until_regex_max_bytesá  s(    


*
ÿz2TestReadWriteMixin.test_read_until_regex_max_bytesc                 c   sž   |   ¡ V \}}tƒ }| |j¡ zf| d¡ ttdtjd( |j	ddd | 
¡ V  W d   ƒ n1 sj0    Y  W | ¡  | ¡  n| ¡  | ¡  0 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   sž   |   ¡ V \}}tƒ }| |j¡ zf| d¡ ttdtjd( |j	ddd | 
¡ V  W d   ƒ n1 sj0    Y  W | ¡  | ¡  n| ¡  | ¡  0 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   sr   | j ddV \}}zH| dd ¡ tdƒD ]}| d¡V }|  |d¡ q*W | ¡  | ¡  n| ¡  | ¡  0 d S )Né (  ©Úmax_buffer_sizes   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaéd   rŒ   )rq   r.   r’   rQ   rR   r=   ©r0   r}   r~   r”   rL   r*   r*   r+   Ú"test_small_reads_from_large_buffer   s    
ÿz5TestReadWriteMixin.test_small_reads_from_large_bufferc                 c   sv   | j ddV \}}zL| dd ¡ tdƒD ] }|jdddV }|  |d¡ q*W | ¡  | ¡  n| ¡  | ¡  0 d S )NrÏ   rÐ   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
rÒ   ó   
r‹   r¹   )rq   r.   r’   r_   rR   r=   rÓ   r*   r*   r+   Ú(test_small_read_untils_from_large_buffer/  s    
ÿz;TestReadWriteMixin.test_small_read_untils_from_large_bufferc                 c   s†   d}| j d| dV \}}zT| d| ¡ | |¡V  t d¡V  tdƒD ]}| |¡V  qJW | ¡  | ¡  n| ¡  | ¡  0 d S )Nrg   r¿   rÐ   s
   aaaaaaaaaar—   rN   )rq   r.   rQ   r   r†   r’   r=   )r0   ZMBr}   r~   r”   r*   r*   r+   Útest_flow_control>  s    
ÿz$TestReadWriteMixin.test_flow_controlc                 #   sh  ˆ   ¡ V \}}‡ fdd„}z4t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 | ¡  | ¡  n| ¡  | ¡  0 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   Ú	bytearrayÚ	read_intor.   r   r†   rH   ÚreadingrU   rR   ÚbytesrQ   r=   )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 | ¡  | ¡  n| ¡  | ¡  0 d S )NrÜ   Tr³   r­   r¿   s
   hello     s   world!1234567890s
   world!1234r»   s
   5678901234)	rq   rÞ   rß   r.   rU   rà   rR   rá   r=   )r0   r}   r~   râ   r°   rL   r*   r*   r+   Útest_read_into_partialz  s(    


ÿz)TestReadWriteMixin.test_read_into_partialc                 c   sZ   |   ¡ V \}}z4tƒ }| |¡}|  | ¡ d¡ W | ¡  | ¡  n| ¡  | ¡  0 d S ©Nr   )rq   rÞ   rß   rR   Úresultr=   )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„ƒ}z6|ƒ |ƒ gV  ˆ ¡ ˆ  ¡ ks€J ‚W ˆ ¡  ˆ ¡  nˆ ¡  ˆ ¡  0 d S )Né*   i@B c                  3   sX   ˆ } | dkrHˆ  dtd| ƒ¡}t |¡}ˆ |¡ ˆ |¡V  | |8 } q| dksTJ ‚d S )Nr   rk   éè  )ÚrandintÚminr%   ÚurandomÚupdater.   )Ú	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|J ‚ˆ  |¡ | |8 } q| dksœJ ‚d S )Nr   g      à?rk   ré   )Úrandomrê   rë   rQ   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   Ú	coroutineÚ	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i ˆ ¤Ž}| d|f¡}ˆ|gV \}}ˆj | 	¡ ¡ | 
¡  t ||f¡‚d S )Nc                    s   ˆ  ˆj| fi ˆ ¤Ž¡ 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   Ú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J |  t	¡  | 
d|f¡V  W d   ƒ n1 sl0    Y  W d   ƒ n1 sŠ0    Y  |  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    

Lz)TestIOStreamMixin.test_connection_refusedc              	   c   s¬   t   t jt jd¡}t|ƒ}| | j¡ tjdt  t	j
d¡dZ |  t¡ | d¡V  W d   ƒ n1 sl0    Y  |  t|jt jƒ¡ W d   ƒ n1 sž0    Y  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   s    |   ¡ V \}}zztjdtdƒdD |  td¡ | ¡  W d   ƒ n1 sN0    Y  W d   ƒ n1 sl0    Y  W | ¡  | ¡  n| ¡  | ¡  0 d S )Nz.tornado.iostream.BaseIOStream._try_inline_readr  r  )rq   r   r  ÚIOErrorÚassertRaisesRegexrG   r=   )r0   ÚserverÚclientr*   r*   r+   Ú test_read_until_close_with_error  s    þF
ÿz2TestIOStreamMixin.test_read_until_close_with_errorc                 c   sž   t  ¡ }t|jtƒr|  d¡ |  ¡ V \}}zZt |j	 
¡ ¡ |  t	j¡ | d¡ W d   ƒ n1 sj0    Y  W | ¡  | ¡  n| ¡  | ¡  0 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¡ znˆ  d¡ | d¡ ‡ fdd„}|ˆ _ttdƒ | 	¡ V  W d   ƒ n1 sr0    Y  W ˆ  
¡  | 
¡  nˆ  
¡  | 
¡  0 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    rQ   r.   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„ƒ}z4‡fdd	„t|ƒD ƒ|ƒ g V  W ˆ ¡  ˆ  ¡  nˆ ¡  ˆ  ¡  0 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  rO   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i |¤ŽS r6   ©r   rÿ   r*   r*   r+   r  †  s    z"TestIOStream._make_server_iostreamc                 K   s   t |fi |¤Ž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i |¤Ž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   s^   t  t jj¡}| tj tj t	¡d¡tj tj t	¡d¡¡ t
||ddd}t|fi |¤Ž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  rC  rD  ÚSERVER_AUTHÚcheck_hostnamer8  Úverify_moder   rG  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y¶ } zt|ƒ ‚ W Y d }~n
d }~0 0 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+   rN  ´  s$    
ÿÿzTestIOStreamStartTLS.setUpc                    sR   | j d ur| j  ¡  | jd ur(| j ¡  | j | j ¡ ¡ | j ¡  tƒ  ¡  d S r6   )	r  r=   r  rÚ   r  r  r	  rM  ÚtearDownr/   rT  r*   r+   rU  È  s    




zTestIOStreamStartTLS.tearDownc                 C   s.   | j d ur|  d¡ t|ƒ| _ | j d ¡ d S )Nzshould only get one connection)r  Zfailr   rO  r  )r0   r   r  r*   r*   r+   rP  Ñ  s    


zTestIOStreamStartTLS.acceptc                 c   sF   | j d usJ ‚| j  |¡ | jd us(J ‚| j d¡V }|  ||¡ d S ©Nr\   )r  r.   r  r_   rR   ©r0   ÚlineZ	recv_liner*   r*   r+   Úclient_send_line×  s
    z%TestIOStreamStartTLS.client_send_linec                 c   sF   | j d usJ ‚| j  |¡ | jd us(J ‚| j d¡V }|  ||¡ d S rV  )r  r.   r  r_   rR   rW  r*   r*   r+   Úserver_send_lineß  s
    z%TestIOStreamStartTLS.server_send_lineNc                 C   s(   | j d usJ ‚| j }d | _ | d||¡S )NF)r  Ú	start_tls)r0   r6  Úserver_hostnamer  r*   r*   r+   Úclient_start_tlsç  s    z%TestIOStreamStartTLS.client_start_tlsc                 C   s&   | j d usJ ‚| j }d | _ | d|¡S )NT)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
)rZ  rY  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   s°   |   tƒ ¡}ttdƒ† | jdd}|  tj¡ |V  W d   ƒ n1 sL0    Y  |  tjtj	f¡ |V  W d   ƒ n1 s„0    Y  W d   ƒ n1 s¢0    Y  d S )Nú	SSL Errorr  ©r\  )
r^  r,   r   r   r]  rh   r7  ÚSSLErrorr  r  ©r0   r`  r_  r*   r*   r+   Útest_handshake_fail  s    $z(TestIOStreamStartTLS.test_handshake_failc              	   c   s®   |   tƒ ¡}ttdƒ„ | jt ¡ dd}|  tj¡ |V  W d   ƒ n1 sR0    Y  |  t	¡ |V  W d   ƒ n1 s‚0    Y  W d   ƒ n1 s 0    Y  d S )Nrb  rB   rc  )
r^  r,   r   r   r]  r7  rC  rh   rd  rQ  re  r*   r*   r+   Útest_check_hostname  s    ÿ$z(TestIOStreamStartTLS.test_check_hostnamec                 c   sd   t tdƒƒ d¡}| jd us J ‚| j |¡V  | jd us<J ‚| j |j¡V }|  t|ƒt|ƒ¡ d S )Nr  ÚL)	r®   rá   Úcastr  r.   r  rQ   rð   rR   )r0   râ   Úrecvr*   r*   r+   Útest_typed_memoryview$  s    z*TestIOStreamStartTLS.test_typed_memoryview)NN)N)r2   r3   r4   rN  rU  rP  r   rû   rY  rZ  r]  r^  r   ra  rf  rg  rk  Ú__classcell__r*   r*   rT  r+   rL  ³  s"   	







rL  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
ƒ 6 | jttddƒO  _tt ¡ |d}W d   ƒ n1 sˆ0    Y  | d|f¡V  |  |j ¡ ¡ W |d urÄ| ¡  |d urø| ¡  n"|d uræ| ¡  |d urö| ¡  0 d S )Nr5  FÚOP_NO_TLSv1_3r   rB   )r   r,   Z
add_socketr7  rC  rD  rI  rJ  r8  rK  r   ÚoptionsÚgetattrr   r  rE   ZassertIsNotNoneÚcipherr  r=   )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  rq  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+   rt  X  s    
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r2   r3   r4   rv  r   rû   rt  r*   ©rz  rr   r*   r+   Ú
TestServerS  s   r|  ©r   r   rs  ©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   )rx  rh   ÚRuntimeErrorr  )r0   rK   r  r°   r{  r*   r+   rv  f  s    zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r2   r3   r4   r   rû   rv  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   rw  ru  ry  r*   r+   rv  v  s    

z`WaitForHandshakeTest.test_wait_for_handshake_already_connected.<locals>.TestServer.handle_streamNr  r*   ry  r*   r+   r|  u  s   r|  r}  r~  r*   ry  r+   Ú)test_wait_for_handshake_already_connectedq  s    z>WaitForHandshakeTest.test_wait_for_handshake_already_connectedN)
r2   r3   r4   r   rû   rs  r   r  r‚  rƒ  r*   r*   r*   r+   rm  0  s   


rm  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i |¤Žt|fi |¤Ž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+   rN  ±  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J ‚||_|S r6   )r
   Z_large_buf_threshold)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ô   g d¢}|   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   d¡}tdƒD ]}| d¡ q\|  t|j	ƒd¡ tdƒD ]}| d¡ q†|  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ |  t|ƒd¡ d S )	N)r€   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_smallß  s&    


zTestStreamBuffer.test_smallc                 C   s  g d¢}|   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   ¡ }|  ||t¡ |   d¡}tdƒD ]}| d¡ q\|  t|j	ƒd¡ | d¡ |  t|j	ƒd¡ | d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd	¡ | 
d
¡ |  t|j	ƒd¡ |  t|ƒd¡ d S )N)s
   1212121212s   345345s(   6767676767676767676767676767676767676767s$   89a89a89a89a89a89a89a89a89a89a89a89ar™  s   fghfghfghfghfghfghfghs   ijklmnijklmnrÜ   rP   s   xxxxxxxxxxxó   yr¬   ó   zé!   rk   r   r   r›  r  r*   r*   r+   Ú
test_largeù  s(    





zTestStreamBuffer.test_largeN)rÜ   )r2   r3   r4   Ú__doc__rN  rŽ  r  r“  r˜  rž  r¢  r*   r*   r*   r+   rŠ  ¬  s   
	rŠ  )FZ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  rL  rm  r„  ZTestCaserŠ  r*   r*   r*   r+   Ú<module>   sZ    o    / '}P+