o
    u3b÷´  ã                   @   s.  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 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$ 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l.Z.d dl/Z/d dl0Z0d dl1Z1d dl2m3Z3 d dl2Z2dd„ Z4G dd„ de&ƒZ5G dd„ de6ƒZ7G dd„ de6ƒZ8G dd„ de8ƒZ9G dd„ de7eƒZ:G dd„ de7eƒZ;G dd „ d e9eƒZ<G d!d"„ d"e9eƒZ=G d#d$„ d$e9eƒZ>G d%d&„ d&eƒZ?G d'd(„ d(eƒZ@e"G d)d*„ d*e8eƒƒZAG d+d,„ d,e2jBƒZCdS )-é    )ÚFuture)Úgen)Únetutil)ÚIOLoop)ÚIOStreamÚSSLIOStreamÚPipeIOStreamÚStreamClosedErrorÚ_StreamBuffer)ÚHTTPHeaders)Ú	ConditionÚEvent)Úgen_log)Ússl_wrap_socket)ÚAddThreadSelectorEventLoop)Ú	TCPServer)ÚAsyncHTTPTestCaseÚAsyncHTTPSTestCaseÚAsyncTestCaseÚbind_unused_portÚ	ExpectLogÚgen_test)ÚskipIfNonUnixÚrefusing_portÚskipPypy3V58)Ú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(   ú</usr/lib/python3/dist-packages/tornado/test/iostream_test.pyÚ_server_ssl_options*   s   þr*   c                   @   ó   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   s   |   d¡ d S )NÚHello)Úwrite©Úselfr(   r(   r)   Úget2   ó   zHelloHandler.getN)Ú__name__Ú
__module__Ú__qualname__r1   r(   r(   r(   r)   r,   1   ó    r,   c                   @   s¤   e Zd Zdd„ Zdd„ Zdejfdd„Zedejfdd	„ƒZ	edejfd
d„ƒZ
edejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZdS )ÚTestIOStreamWebMixinc                 C   ó   t ƒ ‚©N©ÚNotImplementedErrorr/   r(   r(   r)   Ú_make_client_iostream7   ó   z*TestIOStreamWebMixin._make_client_iostreamc                 C   s   t dtfgƒS )Nú/)r   r,   r/   r(   r(   r)   Úget_app:   r2   zTestIOStreamWebMixin.get_appr0   c                 C   s   | j dddid�}| ¡  d S )Nr>   Ú
ConnectionÚclose)Úheaders)ÚfetchÚrethrow)r0   Úresponser(   r(   r)   Útest_connection_closed=   s   z+TestIOStreamWebMixin.test_connection_closedc                 c   sV   � |   ¡ }| d|  ¡ f¡V  | d¡ | ¡ V }|  | d¡¡ |  | d¡¡ d S )Nú	127.0.0.1ó   GET / HTTP/1.0

s   HTTP/1.1 200ó   Hello)r<   ÚconnectÚget_http_portr.   Úread_until_closeÚ
assertTrueÚ
startswithÚendswith)r0   ÚstreamÚdatar(   r(   r)   Útest_read_until_closeG   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 )	NrG   rH   é	   s	   HTTP/1.1 r   ó    é   s   200)r<   rP   rJ   rK   r.   Ú
read_bytesÚassertEqualrA   )r0   rQ   r(   r(   r)   Útest_read_zero_bytesQ   s   €
z)TestIOStreamWebMixin.test_read_zero_bytesc                 c   s    � |   ¡ }| d|  ¡ f¡}| d¡}|  | ¡ ¡ t ||¡}g }| ¡ s5| ¡ V  | 	|j
¡ | ¡ r&|  |||g¡ | ¡ V }|  | d¡¡ | ¡  d S )NrG   ó%   GET / HTTP/1.0
Connection: close

rI   )r<   rJ   rK   r.   ÚassertFalseÚdoner   ÚWaitIteratorÚnextÚappendÚcurrent_futurerW   rL   rM   rO   rA   )r0   rP   Úconnect_futÚ	write_futÚitÚresolved_orderrQ   r(   r(   r)   Útest_write_while_connectinge   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.rG   rH   ó   
s   HTTP/1.1 200 OK
ó   

Úlatin1zContent-LengthrI   N)r<   rJ   rK   ÚassertIsr.   Ú
read_untilrW   r   ÚparseÚdecodeÚintrV   rA   )r0   rP   Úconnect_resultÚ
first_lineÚheader_datarB   Úcontent_lengthÚbodyr(   r(   r)   Útest_future_interface{   s   €z*TestIOStreamWebMixin.test_future_interfacec                 c   sl   � |   ¡ }| d|  ¡ f¡V  | d¡V  |  t¡� | d¡V  W d   ƒ n1 s+w   Y  | ¡  d S )NrG   rH   é   )r<   rJ   rK   r.   ÚassertRaisesr	   rV   rA   ©r0   rP   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   ƒ d S 1 s<w   Y  d S )NrG   rY   rf   rI   é   )
r<   rJ   rK   r.   ri   rL   rW   rt   r	   rV   )r0   rP   rq   r(   r(   r)   Útest_future_read_until_close•   s   €
"ÿz1TestIOStreamWebMixin.test_future_read_until_closeN)r3   r4   r5   r<   r?   ÚtypingÚAnyrF   r   rR   rX   rd   rr   rv   rx   r(   r(   r(   r)   r7   6   s     
	r7   c                   @   sÔ  e Zd Zdd„ Zdd„ Zedd„ ƒZedejfdd	„ƒZ	edejfd
d„ƒZ
edejfdd„ƒZedejfdd„ƒZedd„ ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfdd„ƒZedejfd d!„ƒZedejfd"d#„ƒZedejfd$d%„ƒZed&d'„ ƒZedejfd(d)„ƒZedejfd*d+„ƒZed,d-„ ƒZedejfd.d/„ƒZedejfd0d1„ƒZedejfd2d3„ƒZed4d5„ ƒZd6S )7ÚTestReadWriteMixinc                 K   s   t ‚r9   r:   )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 r9   )Útestr|   )r0   r~   r|   r(   r(   r)   Ú__init__³   s   
zFTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__init__c                 Ó   s$   �| j jdi | j¤ŽI d H | _| jS )Nr(   )r~   r}   r|   Úpairr/   r(   r(   r)   Ú
__aenter__·   s   €zHTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aenter__c                 Ó   s   �| j D ]}| ¡  qd S r9   )r€   rA   )r0   ÚtypÚvalueÚtbÚsr(   r(   r)   Ú	__aexit__»   s   €

ÿzGTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aexit__N)r3   r4   r5   r   r�   r†   r(   r(   r(   r)   ÚIOStreamPairContext²   s    r‡   r(   )r0   r|   r‡   r(   r(   r)   Úiostream_pair¬   s   
z TestReadWriteMixin.iostream_pairc                 c   s0   � |   ¡ V \}}| d¡V  | ¡  | ¡  d S )NrT   )r}   r.   rA   )r0   ÚrsÚwsr(   r(   r)   Útest_write_zero_bytesÁ   s
   €z(TestReadWriteMixin.test_write_zero_bytesr0   c                 c   s„   � |   ¡ V \}}z0| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W | ¡  | ¡  d S | ¡  | ¡  w )Nó   12rw   ó   1ó   2)r}   r.   r^   rV   rA   rW   )r0   r‰   rŠ   Úchunksr(   r(   r)   Ú"test_future_delayed_close_callbackÊ   s   €
ÿ
z5TestReadWriteMixin.test_future_delayed_close_callbackc                 c   sŒ   � | j dd�V \}}z2| d¡ | d¡V }|  d|¡ | ¡  t d¡V  | d¡V }|  d|¡ W | ¡  | ¡  d S | ¡  | ¡  w )Né   )Úread_chunk_sizes   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg{®Gáz„?)r}   r.   rV   rW   rA   r   Úsleep©r0   r‰   rŠ   rQ   r(   r(   r)   Útest_close_buffered_dataÚ   s   €

ÿ
z+TestReadWriteMixin.test_close_buffered_datac                 c   sz   � |   ¡ V \}}z+| d¡ | d¡V }| ¡  |  |d¡ | ¡ V }|  |d¡ W | ¡  | ¡  d S | ¡  | ¡  w )Ns   1234rw   r�   s   234)r}   r.   rV   rA   rW   rL   r”   r(   r(   r)   Ú!test_read_until_close_after_closeô   s   €

ÿ
z4TestReadWriteMixin.test_read_until_close_after_closec                 c   s¤   � |   ¡ V \}}z@t|tƒrt ¡ dkrt d¡‚d}t|ƒD ]}| d¡ q| d¡ | 	d¡V }|  
t|ƒ|d d ¡ W | ¡  | ¡  d S | ¡  | ¡  w )NÚPyPyz$pypy gc causes problems with opensslé   s   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAre   é   é   )r}   Ú
isinstancer   ÚplatformÚpython_implementationÚunittestÚSkipTestÚranger.   ri   rW   ÚlenrA   )r0   r‰   rŠ   ÚNUM_KBÚirQ   r(   r(   r)   Útest_large_read_until  s"   €ÿ

ÿ
z(TestReadWriteMixin.test_large_read_untilc              	   Ã   s”   �|   ¡ 4 I d H š4\}}t | d¡¡}t d¡I d H  | d¡I d H  | d¡ | ¡  |I d H  W d   ƒI d H  d S 1 I d H sCw   Y  d S )Nó   doneçš™™™™™¹?ó   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)rˆ   ÚasyncioÚensure_futureri   r“   r.   rA   ©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 šA\}}t | d¡¡}| d¡I d H  | d¡ | ¡  |  t¡� |I d H  W d   ƒ n1 s:w   Y  W d   ƒI d H  d S 1 I d H sPw   Y  d S )Nr¥   r§   s   foo)rˆ   r¨   r©   ri   r.   rA   rt   r	   rª   r(   r(   r)   Ú'test_read_until_unsatisfied_after_close8  s   €
ÿ.ûz:TestReadWriteMixin.test_read_until_unsatisfied_after_closec                 c   sŽ   � d}|   ¡ V \}}tƒ }| |j¡ z*| |¡ | d¡V }|  ||¡ | ¡  | d¡ | ¡ V  W | ¡  | ¡  d S | ¡  | ¡  w )Ns   OK
re   )	r}   r   Úset_close_callbackÚsetr.   ri   rW   rA   Úwait)r0   ÚOKr‰   rŠ   ÚeventÚresr(   r(   r)   Ú%test_close_callback_with_pending_readF  s    €

ÿ
z8TestReadWriteMixin.test_close_callback_with_pending_readc                 #   s®   � |   ¡ V \}}dg‰ tƒ ‰‡ ‡fdd„}| |¡ z3| d¡ | d¡V }|  |d¡ |  ˆ d ¡ | ¡  ˆ ¡ V  |  	ˆ d ¡ W | ¡  | ¡  d S | ¡  | ¡  w )NFc                      s   dˆ d< ˆ  ¡  d S )NTr   )Únotifyr(   ©ÚclosedÚcondr(   r)   Úclose_callbackf  s   zETestReadWriteMixin.test_future_close_callback.<locals>.close_callbackó   arw   r   )
r}   r   r®   r.   rV   rW   rZ   rA   r°   rM   )r0   r‰   rŠ   r¹   r³   r(   r¶   r)   Útest_future_close_callback^  s$   €


ÿ
z-TestReadWriteMixin.test_future_close_callbackc                 c   sd   � |   ¡ V \}}z | d¡}| tdƒ¡ |V }|  |d¡ W | ¡  | ¡  d S | ¡  | ¡  w )Né   ó   hellos   hell)r}   rV   r.   Ú
memoryviewrW   rA   ©r0   r‰   rŠ   ÚfutrQ   r(   r(   r)   Útest_write_memoryvieww  s   €
ÿ
z(TestReadWriteMixin.test_write_memoryviewc                 c   sª   � |   ¡ V \}}zC|jddd�}| d¡ |V }|  |d¡ |jddd�}| d¡ |V }|  |d¡ |jddd�V }|  |d	¡ W | ¡  | ¡  d S | ¡  | ¡  w )
Né2   T©Úpartialr½   rU   s   worldó   worr   rT   )r}   rV   r.   rW   rA   r¿   r(   r(   r)   Útest_read_bytes_partialƒ  s"   €

ÿ
z*TestReadWriteMixin.test_read_bytes_partialc                 c   s  � |   ¡ V \}}tƒ }| |j¡ zi|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 d   ƒ n1 s`w   Y  W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w ©
Nó   defrÂ   ©Ú	max_bytesó   abcdefé   úUnsatisfiable read©Úlevelé   ó   123456)r}   r   r®   r¯   ri   r.   rW   r   r   ÚloggingÚINFOr°   rA   ©r0   r‰   rŠ   r·   rÀ   rQ   r(   r(   r)   Útest_read_until_max_bytesœ  ó2   €


ýúÿ
z,TestReadWriteMixin.test_read_until_max_bytesc              	   c   sÊ   � |   ¡ V \}}tƒ }| |j¡ zJ| d¡ ttdtjd��% |  	t
¡� |jddd�V  W d   ƒ n1 s8w   Y  W d   ƒ n1 sGw   Y  | ¡ V  W | ¡  | ¡  d S | ¡  | ¡  w ©NrÑ   rÍ   rÎ   rÈ   rÐ   rÉ   )r}   r   r®   r¯   r.   r   r   rÒ   rÓ   rt   r	   ri   r°   rA   ©r0   r‰   rŠ   r·   r(   r(   r)   Ú test_read_until_max_bytes_inline¸  s"   €
ÿ€ÿÿ
z3TestReadWriteMixin.test_read_until_max_bytes_inlinec                 c   ó´   � |   ¡ V \}}tƒ }| |j¡ z?| d¡ ttdtjd�� |j	ddd� | 
¡ V  W d   ƒ n1 s6w   Y  W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w ©NrË   rÍ   rÎ   rÈ   rÐ   rÉ   )r}   r   r®   r¯   r.   r   r   rÒ   rÓ   ri   r°   rA   rØ   r(   r(   r)   Ú'test_read_until_max_bytes_ignores_extraË  ó"   €
þûÿ
z:TestReadWriteMixin.test_read_until_max_bytes_ignores_extrac                 c   s  � |   ¡ V \}}tƒ }| |j¡ zi|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 d   ƒ n1 s`w   Y  W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w rÇ   )r}   r   r®   r¯   Úread_until_regexr.   rW   r   r   rÒ   rÓ   r°   rA   rÔ   r(   r(   r)   Útest_read_until_regex_max_bytesÜ  rÖ   z2TestReadWriteMixin.test_read_until_regex_max_bytesc                 c   rÚ   r×   ©r}   r   r®   r¯   r.   r   r   rÒ   rÓ   rÞ   r°   rA   rØ   r(   r(   r)   Ú&test_read_until_regex_max_bytes_inlineø  s"   €
þûÿ
z9TestReadWriteMixin.test_read_until_regex_max_bytes_inlinec                 c   rÚ   rÛ   rà   rØ   r(   r(   r)   Ú-test_read_until_regex_max_bytes_ignores_extra
  rÝ   z@TestReadWriteMixin.test_read_until_regex_max_bytes_ignores_extrac                 c   sr   � | j dd�V \}}z%| dd ¡ tdƒD ]}| d¡V }|  |d¡ qW | ¡  | ¡  d S | ¡  | ¡  w )Né (  ©Úmax_buffer_sizes   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaéd   r™   )r}   r.   r    rV   rW   rA   ©r0   r‰   rŠ   r£   rQ   r(   r(   r)   Ú"test_small_reads_from_large_buffer  s   €þÿ
z5TestReadWriteMixin.test_small_reads_from_large_bufferc                 c   sv   � | j dd�V \}}z'| dd ¡ tdƒD ]}|jddd�V }|  |d¡ qW | ¡  | ¡  d S | ¡  | ¡  w )Nrã   rä   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ræ   ó   
r˜   rÉ   )r}   r.   r    ri   rW   rA   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 \}}z+| d| ¡ | |¡V  t d¡V  tdƒD ]}| |¡V  q&W | ¡  | ¡  d S | ¡  | ¡  w )Nrs   rÐ   rä   s
   aaaaaaaaaar¦   rS   )r}   r.   rV   r   r“   r    rA   )r0   ÚMBr‰   rŠ   r£   r(   r(   r)   Útest_flow_control9  s   €ÿÿ
z$TestReadWriteMixin.test_flow_controlc                 #   sf  � ˆ   ¡ 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 | ¡  | ¡  d S | ¡  | ¡  w )Nc                      s   ˆ j  dd„ ¡ d S )Nc                   S   s
   t  d¡S )Nçš™™™™™©?)r   r“   r(   r(   r(   r)   Ú<lambda>P  s   
 zGTestReadWriteMixin.test_read_into.<locals>.sleep_some.<locals>.<lambda>)Úio_loopÚrun_syncr(   r/   r(   r)   Ú
sleep_someO  s   z5TestReadWriteMixin.test_read_into.<locals>.sleep_someé
   r½   rí   s   world!!s
   helloworlds
   1234567890s
   !!12345678r¼   s	   abcdefghis   90abé   s   cdefghi)r}   Ú	bytearrayÚ	read_intor.   r   r“   rM   ÚreadingrZ   rW   ÚbytesrV   rA   )r0   r‰   rŠ   rñ   ÚbufrÀ   rQ   r(   r/   r)   Útest_read_intoK  sB   €





ÿ
z!TestReadWriteMixin.test_read_intoc                 c   sì   � |   ¡ V \}}zdt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 | ¡  | ¡  d S | ¡  | ¡  w )Nrò   TrÃ   r½   rÐ   s
   hello     s   world!1234567890s
   world!1234rÌ   s
   5678901234)	r}   rô   rõ   r.   rZ   rö   rW   r÷   rA   )r0   r‰   rŠ   rø   rÀ   rQ   r(   r(   r)   Útest_read_into_partialu  s*   €

ÿ
z)TestReadWriteMixin.test_read_into_partialc                 c   sZ   � |   ¡ V \}}ztƒ }| |¡}|  | ¡ d¡ W | ¡  | ¡  d S | ¡  | ¡  w ©Nr   )r}   rô   rõ   rW   ÚresultrA   )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sAJ ‚W ˆ ¡  ˆ ¡  d S ˆ ¡  ˆ ¡  w )Né*   i@B c                  3   s`   � ˆ } | dkr(ˆ  dtd| ƒ¡}t |¡}ˆ |¡ ˆ |¡V  | |8 } | dks| dks.J ‚d S )Nr   rw   éè  )ÚrandintÚminr#   ÚurandomÚupdater.   )Ú	remainingÚsizerQ   )ÚnbytesÚproduce_hashÚrrŠ   r(   r)   Úproduce©  s   €

ûz9TestReadWriteMixin.test_many_mixed_reads.<locals>.producec                  3   s¨   � ˆ} | dkrLˆ  ¡ dkr&ˆ dtd| ƒ¡}ˆ |¡V }ˆ  |¡ | |8 } n"ˆ dtd| ƒ¡}t|ƒ}ˆ |¡V }||ks?J ‚ˆ  |¡ | |8 } | dks| dksRJ ‚d S )Nr   g      à?rw   rÿ   )Úrandomr   r  rV   r  rô   rõ   )r  r  rQ   rø   Ún)Úconsume_hashr  r  r‰   r(   r)   Úconsume´  s    €


òz9TestReadWriteMixin.test_many_mixed_reads.<locals>.consume)	r
  ÚRandomr}   ÚhashlibÚsha1r   Ú	coroutineÚ	hexdigestrA   )r0   r	  r  r(   )r  r  r  r  r‰   rŠ   r)   Útest_many_mixed_reads�  s"   €

ÿ
z(TestReadWriteMixin.test_many_mixed_readsN) r3   r4   r5   r}   rˆ   r   r‹   ry   rz   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)   r{   ¥   sf    



)
r{   c                   @   s¦   e Zd Zdd„ Zdd„ Zejdejfdd„ƒZ	e
dejfdd	„ƒZe
dejfd
d„ƒZe
dejfdd„ƒZeee
dejfdd„ƒƒƒZee
dd„ ƒƒZe
dd„ ƒZdS )ÚTestIOStreamMixinc                 K   r8   r9   r:   ©r0   Ú
connectionr|   r(   r(   r)   Ú_make_server_iostreamÑ  r=   z'TestIOStreamMixin._make_server_iostreamc                 K   r8   r9   r:   r  r(   r(   r)   r<   Ô  r=   z'TestIOStreamMixin._make_client_iostreamr0   c                 +   s†   � t ƒ \}}tƒ ‰‡ ‡‡fdd„}t ||¡ ˆjt ¡ fi ˆ ¤Ž}| d|f¡}ˆ|gV \}}ˆj | 	¡ ¡ | 
¡  t ||f¡‚)Nc                    s   ˆ  ˆj| fi ˆ ¤Ž¡ d S r9   )Ú
set_resultr  )r  Úaddress©r|   r0   Úserver_stream_futr(   r)   Úaccept_callbackÜ  s   ÿz=TestIOStreamMixin.make_iostream_pair.<locals>.accept_callbackrG   )r   r   r   Úadd_accept_handlerr<   ÚsocketrJ   rï   Úremove_handlerÚfilenorA   r   ÚReturn)r0   r|   ÚlistenerÚportr  Úclient_streamr`   Úserver_streamr(   r  r)   r}   ×  s   €
z$TestIOStreamMixin.make_iostream_pairc              	   c   s°   � t ƒ \}}|  |¡ tt ¡ ƒ}| | j¡ ttddd��% |  t	¡� | 
d|f¡V  W d   ƒ n1 s7w   Y  W d   ƒ n1 sFw   Y  |  t|jtƒ|j¡ d S )Nz.*F)ÚrequiredrG   )r   Ú
addCleanupr   r  r®   Ústopr   r   rt   r	   rJ   rM   r›   ÚerrorÚConnectionRefusedError)r0   Úcleanup_funcr#  rP   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 d   ƒ n1 s7w   Y  |  t|jt jƒ¡ W d   ƒ d S 1 sQw   Y  d S )Nr   zsocket.socket.connectÚboom©Úside_effect)Ú	localhostéP   )r  ÚAF_INETÚSOCK_STREAMr   r®   r(  r   ÚpatchÚgaierrorÚerrnoÚEIOrt   r	   rJ   rM   r›   r)  )r0   r…   rP   r(   r(   r)   Útest_gaierrorú  s   €ÿÿ"ûzTestIOStreamMixin.test_gaierrorc              	   c   s¶   � |   ¡ V \}}zItjdtdƒd��" |  td¡� | ¡  W d   ƒ n1 s(w   Y  W d   ƒ n1 s7w   Y  W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w )Nz.tornado.iostream.BaseIOStream._try_inline_readr-  r.  )r}   r   r4  ÚIOErrorÚassertRaisesRegexrL   rA   )r0   ÚserverÚclientr(   r(   r)   Ú test_read_until_close_with_error  s&   €þ
ÿ€üøÿ
z2TestIOStreamMixin.test_read_until_close_with_errorc                 c   s´   � t  ¡ }t|jtƒr|  d¡ |  ¡ V \}}z9t |j	 
¡ ¡ |  t	j¡� | d¡ W d   ƒ n1 s6w   Y  W | ¡  | ¡  d S W | ¡  | ¡  d S | ¡  | ¡  w )Nz(AddThreadSelectorEventLoop not supportedrw   )r   Úcurrentr›   Úselector_loopr   ÚskipTestr}   r#   rA   r  r   rt   r)  rV   )r0   rï   r;  r<  r(   r(   r)   Útest_inline_read_error  s"   €
ÿüÿ
z(TestIOStreamMixin.test_inline_read_errorc                 #   s¼   � |   ¡ V \‰ }tƒ }ˆ  |j¡ zCˆ  d¡ | d¡ ‡ fdd„}|ˆ _ttdƒ� | 	¡ V  W d   ƒ n1 s:w   Y  W ˆ  
¡  | 
¡  d S W ˆ  
¡  | 
¡  d S ˆ  
¡  | 
¡  w )Nrw   rº   c                      s    t  ˆ j ¡ ¡ ˆ j ˆ ¡ d S r9   )r#   rA   r  r   Ú	__class__Úread_from_fdr(   ©r;  r(   r)   Úfake_read_from_fdG  s   zJTestIOStreamMixin.test_async_read_error_logging.<locals>.fake_read_from_fdzerror on read)r}   r   r®   r¯   rV   r.   rC  r   r   r°   rA   )r0   r<  r·   rE  r(   rD  r)   Útest_async_read_error_logging9  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 ˆ ¡  ˆ  ¡  d
S ˆ ¡  ˆ  ¡  w )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.   )rQ   r£   )Úmr  r;  r(   r)   r	  _  s
   €ÿz4TestIOStreamMixin.test_future_write.<locals>.producec                  3   s6   � d} | ˆk rˆ   ˆ¡V }| t|ƒ7 } | ˆk sd S d S rû   )rV   r¡   )Únreadr³   )r<  rH  Útotal_bytesr(   r)   r  e  s   €þz4TestIOStreamMixin.test_future_write.<locals>.consumec                    s   g | ]}ˆ ƒ ‘qS r(   r(   )Ú.0r£   )r	  r(   r)   Ú
<listcomp>m  s    z7TestIOStreamMixin.test_future_write.<locals>.<listcomp>N)r}   r   r  r    rA   )r0   Ú
nproducersr  r(   )r<  rH  r  r	  r;  rJ  r)   Útest_future_writeS  s   €"ÿ
z#TestIOStreamMixin.test_future_writeN)r3   r4   r5   r  r<   r   r  ry   rz   r}   r   r,  r8  r=  r   r   rA  rF  rN  r(   r(   r(   r)   r  Ð  s(    r  c                   @   r+   )ÚTestIOStreamWebHTTPc                 C   s   t t ¡ ƒS r9   )r   r  r/   r(   r(   r)   r<   t  s   z)TestIOStreamWebHTTP._make_client_iostreamN©r3   r4   r5   r<   r(   r(   r(   r)   rO  s  r6   rO  c                   @   r+   )Ú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)   r<   y  s   z*TestIOStreamWebHTTPS._make_client_iostreamNrP  r(   r(   r(   r)   rQ  x  r6   rQ  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamc                 K   ó   t |fi |¤ŽS r9   ©r   r  r(   r(   r)   r  ~  ó   z"TestIOStream._make_server_iostreamc                 K   rZ  r9   r[  r  r(   r(   r)   r<   �  r\  z"TestIOStream._make_client_iostreamN©r3   r4   r5   r  r<   r(   r(   r(   r)   rY  }  s    rY  c                   @   rX  )ÚTestIOStreamSSLc                 K   s*   t j|fdddœtƒ ¤Ž}t|fi |¤ŽS )NTF©Úserver_sideÚdo_handshake_on_connect)rV  Úwrap_socketr*   r   r  r(   r(   r)   r  †  s   ÿýüz%TestIOStreamSSL._make_server_iostreamc                 K   s   t |fdttjd�i|¤ŽS )NrU  rR  )r   r"   rV  rW  r  r(   r(   r)   r<   �  s   ÿ
ÿÿz%TestIOStreamSSL._make_client_iostreamNr]  r(   r(   r(   r)   r^  …  s    	r^  c                   @   rX  )ÚTestIOStreamSSLContextc                 K   s\   t  t j¡}| tj tj t¡d¡tj tj t¡d¡¡ t	||ddd�}t
|fi |¤ŽS )Nr   r   TFr_  )rV  Ú
SSLContextÚPROTOCOL_SSLv23Úload_cert_chainr#   r$   r%   r&   r'   r   r   ©r0   r  r|   Úcontextr(   r(   r)   r  ™  s   þÿz,TestIOStreamSSLContext._make_server_iostreamc                 K   s    t  t j¡}t|fd|i|¤ŽS )NrU  )rV  rd  re  r   rg  r(   r(   r)   r<   ¤  s   z,TestIOStreamSSLContext._make_client_iostreamNr]  r(   r(   r(   r)   rc  ˜  s    rc  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‡  ZS )ÚTestIOStreamStartTLSc              
      s®   zEt ƒ  ¡  tƒ \| _| _d | _tƒ | _t 	| j| j
¡ tt ¡ ƒ| _| j | j d| jf¡| j¡ |  ¡  | j | j| j¡ |  ¡  W d S  tyV } zt|ƒ ‚ d }~ww )NrG   )ÚsuperÚsetUpr   r"  r#  r%  r   Úserver_acceptedr   r  Úacceptr   r  r$  rï   Ú
add_futurerJ   r(  r°   Ú	ExceptionÚprint)r0   Úe©rB  r(   r)   rk  ª  s(   
ÿÿ€þzTestIOStreamStartTLS.setUpc                    sR   | j d ur
| j  ¡  | jd ur| j ¡  | j | j ¡ ¡ | j ¡  tƒ  ¡  d S r9   )	r%  rA   r$  rï   r  r"  r   rj  ÚtearDownr/   rr  r(   r)   rs  ¾  s   




zTestIOStreamStartTLS.tearDownc                 C   s.   | j d ur
|  d¡ t|ƒ| _ | j d ¡ d S )Nzshould only get one connection)r%  Úfailr   rl  r  )r0   r  r  r(   r(   r)   rm  Ç  s   


zTestIOStreamStartTLS.acceptc                 c   óH   � | j d usJ ‚| j  |¡ | jd usJ ‚| j d¡V }|  ||¡ d S ©Nre   )r$  r.   r%  ri   rW   ©r0   ÚlineÚ	recv_liner(   r(   r)   Úclient_send_lineÍ  ó   €z%TestIOStreamStartTLS.client_send_linec                 c   ru  rv  )r%  r.   r$  ri   rW   rw  r(   r(   r)   Úserver_send_lineÕ  r{  z%TestIOStreamStartTLS.server_send_lineNc                 C   s(   | j d usJ ‚| j }d | _ | d||¡S )NF)r$  Ú	start_tls)r0   rU  Ú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   rU  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
rR  s   250 mail.example.com welcome
)r|  rz  r  r"   rV  rW  r€  r*   r$  r%  rM   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ƒ�L | jdd�}|  tj¡� |V  W d   ƒ n1 s'w   Y  |  tjtj	f¡� |V  W d   ƒ n1 sCw   Y  W d   ƒ d S W d   ƒ d S 1 s[w   Y  d S )Nú	SSL Errorr0  ©r~  )
r€  r*   r   r   r  rt   rV  ÚSSLErrorr  r)  ©r0   r‚  r�  r(   r(   r)   Útest_handshake_failþ  s   €ÿÿü"üz(TestIOStreamStartTLS.test_handshake_failc              	   c   sÂ   � |   tƒ ¡}ttdƒ�K | jt ¡ dd�}|  tj¡� |V  W d   ƒ n1 s*w   Y  |  t	¡� |V  W d   ƒ n1 sBw   Y  W d   ƒ d S W d   ƒ d S 1 sZw   Y  d S )Nr„  rG   r…  )
r€  r*   r   r   r  rV  Úcreate_default_contextrt   r†  ro  r‡  r(   r(   r)   Útest_check_hostname	  s   €ÿþþù"ùz(TestIOStreamStartTLS.test_check_hostname)NNr9   )r3   r4   r5   rk  rs  rm  r   r  rz  r|  r  r€  r   rƒ  rˆ  rŠ  Ú__classcell__r(   r(   rr  r)   ri  ©  s     	






ri  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  }}zVt ƒ \}}|tƒ d�}| |¡ t tjj¡}d|_tj|_	| j
ttddƒO  _
tt ¡ |d�}| d|f¡V  |  |j ¡ ¡ W |d urP| ¡  |d urZ| ¡  d S d S |d urd| ¡  |d urm| ¡  w w )NrT  FÚOP_NO_TLSv1_3r   rG   )r   r*   Ú
add_socketrV  r‰  ÚPurposeÚSERVER_AUTHÚcheck_hostnamerW  Úverify_modeÚoptionsÚgetattrr   r  rJ   ÚassertIsNotNoneÚcipherr(  rA   )r0   Ú
server_clsr;  r<  Úsockr#  Ússl_ctxr(   r(   r)   Úconnect_to_server  s.   €

ÿþ
ÿz&WaitForHandshakeTest.connect_to_serverc                 #   ó8   � | ‰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 r9   )ÚassertIsNoner  r–  rï   Úspawn_callbackÚhandle_connection©r0   rP   r  )r~   r(   r)   Úhandle_stream<  s   zUWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_streamc                 3   s   � |  ¡ V  ˆ  d ¡ d S r9   ©Úwait_for_handshaker  ru   ©Úhandshake_futurer(   r)   rž  @  s   €
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r3   r4   r5   r   r   r  rž  r(   ©r¤  r~   r(   r)   Ú
TestServer;  s    r¦  ©r   r   rš  ©r0   r¦  r(   r¥  r)   Útest_wait_for_handshake_future6  s   €

z3WaitForHandshakeTest.test_wait_for_handshake_futurec                 #   r›  )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 r9   )r¢  rt   ÚRuntimeErrorr  )r0   rP   r  rÀ   r¥  r(   r)   r   N  s
   €zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r3   r4   r5   r   r  r   r(   r¥  r(   r)   r¦  M  s    r¦  r§  r¨  r(   r¥  r)   Ú-test_wait_for_handshake_already_waiting_errorH  s   €	
zBWaitForHandshakeTest.test_wait_for_handshake_already_waiting_errorc                 #   s2   � 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 r9   r¡  rŸ  r£  r(   r)   r   ^  s   €

z`WaitForHandshakeTest.test_wait_for_handshake_already_connected.<locals>.TestServer.handle_streamNr«  r(   r£  r(   r)   r¦  ]  s    r¦  r§  r¨  r(   r£  r)   Ú)test_wait_for_handshake_already_connectedY  s
   €
z>WaitForHandshakeTest.test_wait_for_handshake_already_connectedN)
r3   r4   r5   r   r  rš  r   r©  r¬  r­  r(   r(   r(   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i |¤Žt|fi |¤ŽfS r9   )r#   Úpiper   )r0   r|   r  Úwr(   r(   r)   r}   j  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 rU   rÅ   s   ld)r}   r.   ri   rW   rV   rA   rL   r”   r(   r(   r)   Útest_pipe_iostreamp  s   €


z#TestPipeIOStream.test_pipe_iostreamc                 c   sR   � |   ¡ V \}}d}| d| ¡ | |¡V }|  |d| ¡ | ¡  | ¡  d S )Nrs   r�   )r}   r.   rV   rW   rA   )r0   r‰   rŠ   Ú	NUM_BYTESrQ   r(   r(   r)   Útest_pipe_iostream_big_write„  s   €z-TestPipeIOStream.test_pipe_iostream_big_writeN)	r3   r4   r5   r   r  r}   r   r²  r´  r(   r(   r(   r)   r®  h  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)   rk  ™  r\  zTestStreamBuffer.setUpc                 C   s0   t |ttfƒrt|ƒS t |tƒr| ¡ S t|ƒ‚r9   )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 r9   )r
   Ú_large_buf_threshold)r0   Úlarge_buf_thresholdrø   r(   r(   r)   Úmake_streambuffer¤  s   
z"TestStreamBuffer.make_streambufferc                 C   s|   d}|dt |ƒ k r<|  | |¡¡}|  |¡ |  t |ƒ|¡ |  | |¡||f¡ |d d d }|dt |ƒ k s
d S d S )Nrw   rš   rU   )r¡   r¹  ÚpeekrM   ÚassertLessEqualrN   )r0   rø   Úexpectedr  Úgotr(   r(   r)   Ú
check_peekª  s   
ûzTestStreamBuffer.check_peekc                 C   s¼   |   t|ƒd¡ d}|D ]}||7 }| ||ƒ¡ |   t|ƒt|ƒ¡ |  ||¡ q|rT| j dt|ƒd ¡}||d … }| |¡ |   t|ƒt|ƒ¡ |  ||¡ |s,|   t|ƒd¡ d S )Nr   rT   rw   )rW   r¡   r^   rÁ  r
  Ú	randrangeÚadvance)r0   rø   ÚobjsÚ
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¡ qC|  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ | 
d¡ |  t|j	ƒd¡ |  t|ƒd¡ d S )	N)rŒ   s   345s   67s   89aó   bcdes   fghs   ijklmnrò   rS   rG  rw   rš   é   r   ©r¼  rÇ  r÷   rô   r¾   r    r^   rW   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ò   rU   s   xxxxxxxxxxxó   yr¼   ó   zé!   rw   rš   r   rÊ  rÌ  r(   r(   r)   Ú
test_largeá  s(   





zTestStreamBuffer.test_largeN)rò   )r3   r4   r5   Ú__doc__rk  r¹  r¼  rÁ  rÇ  rÍ  rÑ  r(   r(   r(   r)   rµ  ”  s    
	rµ  )DÚtornado.concurrentr   Útornador   r   Útornado.ioloopr   Útornado.iostreamr   r   r   r	   r
   Útornado.httputilr   Útornado.locksr   r   Útornado.logr   Útornado.netutilr   Útornado.platform.asyncior   Útornado.tcpserverr   Útornado.testingr   r   r   r   r   r   Útornado.test.utilr   r   r   Útornado.webr   r   r¨   r6  r  rÒ   r#   rœ   r
  r  rV  ry   rž   r   r*   r,   Úobjectr7   r{   r  rO  rQ  rY  r^  rc  ri  rŒ  r®  ÚTestCaserµ  r(   r(   r(   r)   Ú<module>   s\     o    / $rM+