o
    ÙñhwÅ  ã                   @   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*   úN/var/www/vscode/kcb/lib/python3.10/site-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+   Úget7   ó   zHelloHandler.getN)Ú__name__Ú
__module__Ú__qualname__r3   r*   r*   r*   r+   r.   6   ó    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©ÚNotImplementedErrorr1   r*   r*   r+   Ú_make_client_iostream<   ó   z*TestIOStreamWebMixin._make_client_iostreamc                 C   s   t dtfgƒS )Nú/)r   r.   r1   r*   r*   r+   Úget_app?   r4   zTestIOStreamWebMixin.get_appr2   c                 C   s   | j dddid}| ¡  d S )Nr@   Ú
ConnectionÚclose)Úheaders)ÚfetchÚrethrow)r2   Úresponser*   r*   r+   Útest_connection_closedB   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_portr0   Úread_until_closeÚ
assertTrueÚ
startswithÚendswith)r2   Ú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 )	NrI   rJ   é	   s	   HTTP/1.1 r   ó    é   s   200)r>   rR   rL   rM   r0   Ú
read_bytesÚassertEqualrC   )r2   rS   r*   r*   r+   Útest_read_zero_bytesV   s   €
z)TestIOStreamWebMixin.test_read_zero_bytesc                 c   s     |   ¡ }| d|  ¡ f¡}| d¡}|  | ¡ ¡ t ||¡}g }| ¡ s5| ¡ V  | 	|j
¡ | ¡ r&|  |||g¡ | ¡ V }|  | d¡¡ | ¡  d S )NrI   ó%   GET / HTTP/1.0
Connection: close

rK   )r>   rL   rM   r0   ÚassertFalseÚdoner   ÚWaitIteratorÚnextÚappendÚcurrent_futurerY   rN   rO   rQ   rC   )r2   rR   Úconnect_futÚ	write_futÚitÚresolved_orderrS   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.rI   rJ   ó   
s   HTTP/1.1 200 OK
ó   

Úlatin1zContent-LengthrK   N)r>   rL   rM   ÚassertIsr0   Ú
read_untilrY   r   ÚparseÚdecodeÚintrX   rC   )r2   rR   Úconnect_resultÚ
first_lineÚheader_datarD   Ú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 )NrI   rJ   é   )r>   rL   rM   r0   ÚassertRaisesr	   rX   rC   ©r2   rR   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 )NrI   r[   rh   rK   é   )
r>   rL   rM   r0   rk   rN   rY   rv   r	   rX   )r2   rR   rs   r*   r*   r+   Útest_future_read_until_closeš   s   €
"ÿz1TestIOStreamWebMixin.test_future_read_until_closeN)r5   r6   r7   r>   rA   ÚtypingÚAnyrH   r   rT   rZ   rf   rt   rx   rz   r*   r*   r*   r+   r9   ;   s     
	r9   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 ‚r;   r<   )r2   Ú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 r;   )Útestr~   )r2   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~   Úpairr1   r*   r*   r+   Ú
__aenter__¼   s   €zHTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aenter__c                 Ó   s   | j D ]}| ¡  qd S r;   )r‚   rC   )r2   ÚtypÚvalueÚtbÚsr*   r*   r+   Ú	__aexit__À   s   €

ÿzGTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aexit__N)r5   r6   r7   r   rƒ   rˆ   r*   r*   r*   r+   ÚIOStreamPairContext·   s    r‰   r*   )r2   r~   r‰   r*   r*   r+   Úiostream_pair±   s   
z TestReadWriteMixin.iostream_pairc                 c   s0    |   ¡ V \}}| d¡V  | ¡  | ¡  d S )NrV   )r   r0   rC   )r2   ÚrsÚwsr*   r*   r+   Útest_write_zero_bytesÆ   s
   €z(TestReadWriteMixin.test_write_zero_bytesr2   c                 c   s„    |   ¡ V \}}z0| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W | ¡  | ¡  d S | ¡  | ¡  w )Nó   12ry   ó   1ó   2)r   r0   r`   rX   rC   rY   )r2   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   r0   rX   rY   rC   r   Úsleep©r2   r‹   rŒ   rS   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   1234ry   r   s   234)r   r0   rX   rC   rY   rN   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   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArg   é   é   )r   Ú
isinstancer   ÚplatformÚpython_implementationÚunittestÚSkipTestÚranger0   rk   rY   ÚlenrC   )r2   r‹   rŒ   ÚNUM_KBÚirS   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_futurerk   r•   r0   rC   ©r2   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«   rk   r0   rC   rv   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¡ z*| |¡ | d¡V }|  ||¡ | ¡  | d¡ | ¡ V  W | ¡  | ¡  d S | ¡  | ¡  w )Ns   OK
rg   )	r   r   Úset_close_callbackÚsetr0   rk   rY   rC   Úwait)r2   Ú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„}| |¡ z3| d¡ | d¡V }|  |d¡ |  ˆ d ¡ | ¡  ˆ ¡ V  |  	ˆ d ¡ W | ¡  | ¡  d S | ¡  | ¡  w )NFc                      s   dˆ d< ˆ  ¡  d S )NTr   )Únotifyr*   ©ÚclosedÚcondr*   r+   Úclose_callbackk  s   zETestReadWriteMixin.test_future_close_callback.<locals>.close_callbackó   ary   r   )
r   r   r°   r0   rX   rY   r\   rC   r²   rO   )r2   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 | ¡  | ¡  d S | ¡  | ¡  w )Né   ó   hellos   hell)r   rX   r0   Ú
memoryviewrY   rC   ©r2   r‹   rŒ   ÚfutrS   r*   r*   r+   Útest_write_memoryview|  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¿   rW   s   worldó   worr   rV   )r   rX   r0   rY   rC   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±   rk   r0   rY   r   r   ÚloggingÚINFOr²   rC   ©r2   r‹   rŒ   r¹   rÂ   rS   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±   r0   r   r   rÔ   rÕ   rv   r	   rk   r²   rC   ©r2   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±   r0   r   r   rÔ   rÕ   rk   r²   rC   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_regexr0   rY   r   r   rÔ   rÕ   r²   rC   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±   r0   r   r   rÔ   rÕ   rà   r²   rC   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   r0   r¢   rX   rY   rC   ©r2   r‹   rŒ   r¥   rS   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   r0   r¢   rk   rY   rC   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 )Nru   rÒ   ræ   s
   aaaaaaaaaar¨   rU   )r   r0   rX   r   r•   r¢   rC   )r2   ÚMBr‹   rŒ   r¥   r*   r*   r+   Útest_flow_control>  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>U  s   
 zGTestReadWriteMixin.test_read_into.<locals>.sleep_some.<locals>.<lambda>)Úio_loopÚrun_syncr*   r1   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)r   Ú	bytearrayÚ	read_intor0   r   r•   rO   Úreadingr\   rY   ÚbytesrX   rC   )r2   r‹   rŒ   ró   ÚbufrÂ   rS   r*   r1   r+   Útest_read_intoP  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÷   r0   r\   rø   rY   rù   rC   )r2   r‹   rŒ   rú   rÂ   rS   r*   r*   r+   Útest_read_into_partialz  s*   €

ÿ
z)TestReadWriteMixin.test_read_into_partialc                 c   sZ    |   ¡ V \}}ztƒ }| |¡}|  | ¡ d¡ W | ¡  | ¡  d S | ¡  | ¡  w ©Nr   )r   rö   r÷   rY   ÚresultrC   )r2   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   ry   éè  )ÚrandintÚminr%   ÚurandomÚupdater0   )Ú	remainingÚsizerS   )Ú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      à?ry   r  )Úrandomr  r  rX   r  rö   r÷   )r  r  rS   rú   Ún)Úconsume_hashr  r
  r‹   r*   r+   Úconsume¹  s    €


òz9TestReadWriteMixin.test_many_mixed_reads.<locals>.consume)	r  ÚRandomr   ÚhashlibÚsha1r   Ú	coroutineÚ	hexdigestrC   )r2   r  r  r*   )r  r  r	  r
  r‹   rŒ   r+   Útest_many_mixed_reads¢  s"   €

ÿ
z(TestReadWriteMixin.test_many_mixed_readsN) r5   r6   r7   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ÿ   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   r:   r;   r<   ©r2   Ú
connectionr~   r*   r*   r+   Ú_make_server_iostreamÖ  r?   z'TestIOStreamMixin._make_server_iostreamc                 K   r:   r;   r<   r  r*   r*   r+   r>   Ù  r?   z'TestIOStreamMixin._make_client_iostreamr2   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 r;   )Ú
set_resultr  )r  Úaddress©r~   r2   Úserver_stream_futr*   r+   Úaccept_callbacká  s   ÿz=TestIOStreamMixin.make_iostream_pair.<locals>.accept_callbackrI   )r   r   r   Úadd_accept_handlerr>   ÚsocketrL   rñ   Úremove_handlerÚfilenorC   r   ÚReturn)r2   r~   ÚlistenerÚportr  Úclient_streamrb   Ú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)ÚrequiredrI   )r   Ú
addCleanupr   r   r°   Ústopr   r   rv   r	   rL   rO   r   ÚerrorÚConnectionRefusedError)r2   Úcleanup_funcr%  rR   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ÚEIOrv   r	   rL   rO   r   r+  )r2   r‡   rR   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/  r0  )r   r   r6  ÚIOErrorÚassertRaisesRegexrN   rC   )r2   Ú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 supportedry   )r   Úcurrentr   Úselector_loopr   ÚskipTestr   r%   rC   r   r"  rv   r+  rX   )r2   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 )Nry   r¼   c                      s    t  ˆ j ¡ ¡ ˆ j ˆ ¡ d S r;   )r%   rC   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)r   r   r°   r±   rX   r0   rE  r   r   r²   rC   )r2   r>  r¹   rG  r*   rF  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 ˆ ¡  ˆ  ¡  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¢   r0   )rS   r¥   )Úmr  r=  r*   r+   r  g  s
   €ÿz4TestIOStreamMixin.test_future_write.<locals>.producec                  3   s6    d} | ˆk rˆ   ˆ¡V }| t|ƒ7 } | ˆk sd S d S rý   )rX   r£   )Únreadrµ   )r>  rJ  Ú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)r   r   r  r¢   rC   )r2   Ú
nproducersr  r*   )r>  rJ  r  r  r=  rL  r+   Útest_future_write[  s   €"ÿ
z#TestIOStreamMixin.test_future_writeN)r5   r6   r7   r  r>   r   r  r{   r|   r   r   r.  r:  r?  r   r   rC  rH  rP  r*   r*   r*   r+   r  Õ  s(     r  c                   @   r-   )ÚTestIOStreamWebHTTPc                 C   s   t t ¡ ƒS r;   )r   r   r1   r*   r*   r+   r>   |  s   z)TestIOStreamWebHTTP._make_client_iostreamN©r5   r6   r7   r>   r*   r*   r*   r+   rQ  {  r8   rQ  c                   @   r-   )ÚTestIOStreamWebHTTPSc                 C   s   t t ¡ ttjddS )N©Ú	cert_reqs©Ússl_options)r   r   r$   ÚsslÚ	CERT_NONEr1   r*   r*   r+   r>     s   z*TestIOStreamWebHTTPS._make_client_iostreamNrR  r*   r*   r*   r+   rS  €  r8   rS  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamc                 K   ó   t |fi |¤ŽS r;   ©r   r  r*   r*   r+   r  †  ó   z"TestIOStream._make_server_iostreamc                 K   r\  r;   r]  r  r*   r*   r+   r>   ‰  r^  z"TestIOStream._make_client_iostreamN©r5   r6   r7   r  r>   r*   r*   r*   r+   r[  …  s    r[  c                   @   rZ  )ÚTestIOStreamSSLc                 K   s.   t tƒ dd}|j|ddd}t|fi |¤ŽS )NT)Úserver_sideF©ra  Údo_handshake_on_connect)r   r,   Úwrap_socketr   )r2   r  r~   Ússl_ctxr*   r*   r+   r  Ž  s   ýz%TestIOStreamSSL._make_server_iostreamc                 K   s   t |fdttjdi|¤ŽS )NrW  rT  )r   r$   rX  rY  r  r*   r*   r+   r>   —  s   ÿ
ÿÿz%TestIOStreamSSL._make_client_iostreamNr_  r*   r*   r*   r+   r`    s    	r`  c                   @   rZ  )Ú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!   TFrb  )rX  Úcreate_default_contextÚPurposeÚCLIENT_AUTHÚload_cert_chainr%   r&   r'   r(   r)   r   r   ©r2   r  r~   Úcontextr*   r*   r+   r  ¡  s   þÿz,TestIOStreamSSLContext._make_server_iostreamc                 K   s0   t  t jj¡}d|_t j|_t|fd|i|¤ŽS )NFrW  )rX  rh  ri  ÚSERVER_AUTHÚcheck_hostnamerY  Úverify_moder   rl  r*   r*   r+   r>   ¬  s   z,TestIOStreamSSLContext._make_client_iostreamNr_  r*   r*   r*   r+   rf     s    rf  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®   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 )NrI   )ÚsuperÚsetUpr   r$  r%  r'  r   Úserver_acceptedr   r  Úacceptr   r   r&  rñ   Ú
add_futurerL   r*  r²   Ú	ExceptionÚprint)r2   Úe©rD  r*   r+   rs  ´  s(   
ÿÿ€þzTestIOStreamStartTLS.setUpc                    sR   | j d ur
| j  ¡  | jd ur| j ¡  | j | j ¡ ¡ | j ¡  tƒ  ¡  d S r;   )	r'  rC   r&  rñ   r!  r$  r"  rr  ÚtearDownr1   rz  r*   r+   r{  È  s   




zTestIOStreamStartTLS.tearDownc                 C   s.   | j d ur
|  d¡ t|ƒ| _ | j d ¡ d S )Nzshould only get one connection)r'  Úfailr   rt  r  )r2   r  r  r*   r*   r+   ru  Ñ  s   


zTestIOStreamStartTLS.acceptc                 c   óH    | j d usJ ‚| j  |¡ | jd usJ ‚| j d¡V }|  ||¡ d S ©Nrg   )r&  r0   r'  rk   rY   ©r2   ÚlineÚ	recv_liner*   r*   r+   Úclient_send_line×  ó   €z%TestIOStreamStartTLS.client_send_linec                 c   r}  r~  )r'  r0   r&  rk   rY   r  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)r2   rW  Ú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…  )r2   rW  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
rT  s   250 mail.example.com welcome
)r„  r‚  r‡  r$   rX  rY  rˆ  r,   r&  r'  rO   r   r   )r2   Ú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 Errorr2  ©r†  )
rˆ  r,   r   r   r‡  rv   rX  ÚSSLErrorr   r+  ©r2   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Œ  rI   r  )
rˆ  r,   r   r   r‡  rX  rh  rv   rŽ  rw  r  r*   r*   r+   Útest_check_hostname  s   €ÿþþù"ùz(TestIOStreamStartTLS.test_check_hostnamec                 c   sf    t tdƒƒ d¡}| jd usJ ‚| j |¡V  | jd usJ ‚| j |j¡V }|  t|ƒt|ƒ¡ d S )Nr3  ÚL)	rÀ   rù   Úcastr'  r0   r&  rX   r  rY   )r2   rú   Úrecvr*   r*   r+   Útest_typed_memoryview$  s   €z*TestIOStreamStartTLS.test_typed_memoryview)NNr;   )r5   r6   r7   rs  r{  ru  r   r  r‚  r„  r‡  rˆ  r   r‹  r  r‘  r•  Ú__classcell__r*   r*   rz  r+   rq  ³  s$    	







rq  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  }}zit ƒ \}}|tƒ d}| |¡ t tjj¡}d|_tj|_	t
ƒ  | jttddƒO  _tt ¡ |d}W d   ƒ n1 sEw   Y  | d|f¡V  |  |j ¡ ¡ W |d urc| ¡  |d urm| ¡  d S d S |d urw| ¡  |d ur€| ¡  w w )NrV  FÚOP_NO_TLSv1_3r   rI   )r   r,   Ú
add_socketrX  rh  ri  rn  ro  rY  rp  r   ÚoptionsÚgetattrr   r   rL   ÚassertIsNotNoneÚcipherr*  rC   )r2   Ú
server_clsr=  r>  Úsockr%  re  r*   r*   r+   Úconnect_to_server1  s2   €

þÿþ
ÿ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 r;   )ÚassertIsNoner   r  rñ   Úspawn_callbackÚhandle_connection©r2   rR   r  )r€   r*   r+   Úhandle_streamT  s   zUWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_streamc                 3   s    |  ¡ V  ˆ  d ¡ d S r;   ©Úwait_for_handshaker  rw   ©Úhandshake_futurer*   r+   r¤  X  s   €
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r5   r6   r7   r¦  r   r  r¤  r*   ©rª  r€   r*   r+   Ú
TestServerS  s    r¬  ©r   r   r   ©r2   r¬  r*   r«  r+   Útest_wait_for_handshake_futureN  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 r;   )r¨  rv   ÚRuntimeErrorr  )r2   rR   r  rÂ   r«  r*   r+   r¦  f  s
   €zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r5   r6   r7   r   r  r¦  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                 #   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 r;   r§  r¥  r©  r*   r+   r¦  v  s   €

z`WaitForHandshakeTest.test_wait_for_handshake_already_connected.<locals>.TestServer.handle_streamNr±  r*   r©  r*   r+   r¬  u  s    r¬  r­  r®  r*   r©  r+   Ú)test_wait_for_handshake_already_connectedq  s
   €
z>WaitForHandshakeTest.test_wait_for_handshake_already_connectedN)
r5   r6   r7   r   r  r   r   r¯  r²  r³  r*   r*   r*   r+   r—  0  s    


r—  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 rg  )rX  rh  ri  rj  rk  r%   r&   r'   r(   r)   rd  r   )r  r  re  r*   r*   r+   r  ‰  s   þýz8TestIOStreamCheckHostname.setUp.<locals>.accept_callbackr    )rr  rs  r   r$  r%  r   r  rX  rh  ri  rn  Úclient_ssl_ctxÚload_verify_locationsr%   r&   r'   r(   r)   )r2   r  rz  r*   r+   rs  …  s   
ÿzTestIOStreamCheckHostname.setUpc                    s*   | j  | j ¡ ¡ | j ¡  tƒ  ¡  d S r;   )rñ   r!  r$  r"  rC   rr  r{  r1   rz  r*   r+   r{  Ÿ  s   
z"TestIOStreamCheckHostname.tearDownc                 Ã   s:   t t ¡ | jd}|jd| jfddI d H  | ¡  d S )NrV  rI   zfoo.example.comr  )r   r   rµ  rL   r%  rC   rw   r*   r*   r+   Ú
test_match¤  s   €þz$TestIOStreamCheckHostname.test_matchc              
   Ã   sö   t t ¡ | jd}ttdtjt ¡ dkdZ |  	t
j¡- ttdtjd |jd| jfdd	I d H  W d   ƒ n1 s?w   Y  W d   ƒ n1 sNw   Y  t ¡ dkrit d
¡I d H  W d   ƒ d S W d   ƒ d S 1 stw   Y  d S )NrV  z.*alert bad certificateÚWindows)rÑ   r(  z0.*(certificate verify failed: Hostname mismatch)rÐ   rI   úbar.example.comr  r¨   )r   r   rµ  r   r   rÔ   ÚWARNINGrž   Úsystemrv   rX  ÚSSLCertVerificationErrorrL   r%  rª   r•   rw   r*   r*   r+   Útest_no_match­  s4   €
üýþû€ÿì"íz'TestIOStreamCheckHostname.test_no_matchc                 Ã   s:   d| j _tt ¡ | j d}|jd| jfddI d H  d S )NFrV  rI   r¹  r  )rµ  ro  r   r   rL   r%  rw   r*   r*   r+   Útest_check_disabledÆ  s   €þz-TestIOStreamCheckHostname.test_check_disabled)
r5   r6   r7   rs  r{  r   r·  r½  r¾  r–  r*   r*   rz  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 r;   )r%   Úpiper   )r2   r~   r
  Úwr*   r*   r+   r   Ô  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 rW   rÇ   s   ld)r   r0   rk   rY   rX   rC   rN   r–   r*   r*   r+   Útest_pipe_iostreamÚ  s   €


z#TestPipeIOStream.test_pipe_iostreamc                 c   sR    |   ¡ V \}}d}| d| ¡ | |¡V }|  |d| ¡ | ¡  | ¡  d S )Nru   r   )r   r0   rX   rY   rC   )r2   r‹   rŒ   Ú	NUM_BYTESrS   r*   r*   r+   Útest_pipe_iostream_big_writeî  s   €z-TestPipeIOStream.test_pipe_iostream_big_writeN)	r5   r6   r7   r   r  r   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  r1   r*   r*   r+   rs    r^  zTestStreamBuffer.setUpc                 C   s0   t |ttfƒrt|ƒS t |tƒr| ¡ S t|ƒ‚r;   )r   rù   rö   rÀ   ÚtobytesÚ	TypeError)r2   Úbr*   r*   r+   Úto_bytes  s
   
zTestStreamBuffer.to_bytesrô   c                 C   s   t ƒ }|jsJ ‚||_|S r;   )r
   Ú_large_buf_threshold)r2   Ú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 )Nry   rœ   rW   )r£   rÊ  ÚpeekrO   ÚassertLessEqualrP   )r2   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   rV   ry   )rY   r£   r`   rÒ  r  Ú	randrangeÚadvance)r2   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ô   rU   rI  ry   rœ   é   r   ©rÍ  rØ  rù   rö   rÀ   r¢   r`   rY   r£   Ú_buffersrÔ  ©r2   rÕ  rú   r¥   r*   r*   r+   Ú
test_small1  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ô   rW   s   xxxxxxxxxxxó   yr¾   ó   zé!   ry   rœ   r   rÛ  rÝ  r*   r*   r+   Ú
test_largeK  s(   





zTestStreamBuffer.test_largeN)rô   )r5   r6   r7   Ú__doc__rs  rÊ  rÍ  rÒ  rØ  rÞ  râ  r*   r*   r*   r+   rÆ  þ  s    
	rÆ  )GÚtornado.concurrentr   Útornador   r   Útornado.ioloopr   Útornado.iostreamr   r   r   r	   r
   Útornado.httputilr   Útornado.locksr   r   Útornado.logr   Útornado.netutilr   r   Útornado.platform.asyncior   Útornado.tcpserverr   Útornado.testingr   r   r   r   r   r   Útornado.test.utilr   r   r   r   Útornado.webr   r   rª   r8  r  rÔ   r%   rž   r  r   rX  r{   r    r   r,   r.   Úobjectr9   r}   r  rQ  rS  r[  r`  rf  rq  r—  r´  r¿  ÚTestCaserÆ  r*   r*   r*   r+   Ú<module>   s^     o    / '}PR+