o
    )ªZhwÅ  ã                   @   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*   úQ/var/www/html/lang_env/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 )NZHello)Úwrite©Úselfr*   r*   r+   Úget7   ó   zHelloHandler.getN)Ú__name__Ú
__module__Ú__qualname__r2   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©ÚNotImplementedErrorr0   r*   r*   r+   Ú_make_client_iostream<   ó   z*TestIOStreamWebMixin._make_client_iostreamc                 C   s   t dtfgƒS )Nú/)r   r.   r0   r*   r*   r+   Úget_app?   r3   zTestIOStreamWebMixin.get_appr1   c                 C   s   | j dddid}| ¡  d S )Nr?   Ú
ConnectionÚclose)Úheaders)ÚfetchZrethrow)r1   Ú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_portr/   Úread_until_closeÚ
assertTrueÚ
startswithÚendswith)r1   Ú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 )	NrG   rH   é	   s	   HTTP/1.1 r   ó    é   s   200)r=   rP   rJ   rK   r/   Ú
read_bytesÚassertEqualrB   )r1   rQ   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 )NrG   ó%   GET / HTTP/1.0
Connection: close

rI   )r=   rJ   rK   r/   ÚassertFalseÚdoner   ZWaitIteratorÚnextÚappendZcurrent_futurerW   rL   rM   rO   rB   )r1   rP   Úconnect_futZ	write_futÚitZresolved_orderrQ   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.rG   rH   ó   
s   HTTP/1.1 200 OK
ó   

Úlatin1zContent-LengthrI   N)r=   rJ   rK   ZassertIsr/   Ú
read_untilrW   r   ÚparseÚdecodeÚintrV   rB   )r1   rP   Zconnect_resultÚ
first_lineZheader_datarC   Ú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   rB   ©r1   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   rb   rI   é   )
r=   rJ   rK   r/   rd   rL   rW   rm   r	   rV   )r1   rP   rj   r*   r*   r+   Útest_future_read_until_closeš   s   €
"ÿz1TestIOStreamWebMixin.test_future_read_until_closeN)r4   r5   r6   r=   r@   ÚtypingÚAnyrF   r   rR   rX   r`   rk   ro   rq   r*   r*   r*   r+   r8   ;   s     
	r8   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;   )r1   Ú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:   )Útestru   )r1   rw   ru   r*   r*   r+   Ú__init__¸   s   
zFTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__init__c                 Ó   s$   | j jdi | j¤ŽI d H | _| jS )Nr*   )rw   rv   ru   Úpairr0   r*   r*   r+   Ú
__aenter__¼   s   €zHTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aenter__c                 Ó   s   | j D ]}| ¡  qd S r:   )ry   rB   )r1   ÚtypÚvalueÚtbÚsr*   r*   r+   Ú	__aexit__À   s   €

ÿzGTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aexit__N)r4   r5   r6   rx   rz   r   r*   r*   r*   r+   ÚIOStreamPairContext·   s    r€   r*   )r1   ru   r€   r*   r*   r+   Úiostream_pair±   s   
z TestReadWriteMixin.iostream_pairc                 c   s0    |   ¡ V \}}| d¡V  | ¡  | ¡  d S )NrT   )rv   r/   rB   )r1   ÚrsÚwsr*   r*   r+   Útest_write_zero_bytesÆ   s
   €z(TestReadWriteMixin.test_write_zero_bytesr1   c                 c   s„    |   ¡ V \}}z0| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W | ¡  | ¡  d S | ¡  | ¡  w )Nó   12rp   ó   1ó   2)rv   r/   r]   rV   rB   rW   )r1   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é   )Zread_chunk_sizes   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg{®Gáz„?)rv   r/   rV   rW   rB   r   Úsleep©r1   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   1234rp   r†   s   234)rv   r/   rV   rB   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   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAra   é   é   )rv   Ú
isinstancer   ÚplatformÚpython_implementationÚunittestZSkipTestÚranger/   rd   rW   ÚlenrB   )r1   r‚   rƒ   Z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_futurerd   r‹   r/   rB   ©r1   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Ÿ   rd   r/   rB   rm   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
ra   )	rv   r   Úset_close_callbackÚsetr/   rd   rW   rB   Úwait)r1   Ú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*   ©ÚclosedZcondr*   r+   Úclose_callbackk  s   zETestReadWriteMixin.test_future_close_callback.<locals>.close_callbackó   arp   r   )
rv   r   r¤   r/   rV   rW   rZ   rB   r¦   rM   )r1   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)rv   rV   r/   Ú
memoryviewrW   rB   ©r1   r‚   rƒ   ÚfutrQ   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²   rU   s   worldó   worr   rT   )rv   rV   r/   rW   rB   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·   ©Z	max_bytesó   abcdefé   úUnsatisfiable read©Úlevelé   ó   123456)rv   r   r¤   r¥   rd   r/   rW   r   r   ÚloggingÚINFOr¦   rB   ©r1   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¾   )rv   r   r¤   r¥   r/   r   r   rÆ   rÇ   rm   r	   rd   r¦   rB   ©r1   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¾   )rv   r   r¤   r¥   r/   r   r   rÆ   rÇ   rd   r¦   rB   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¼   )rv   r   r¤   r¥   Úread_until_regexr/   rW   r   r   rÆ   rÇ   r¦   rB   rÈ   r*   r*   r+   Útest_read_until_regex_max_bytesá  rÊ   z2TestReadWriteMixin.test_read_until_regex_max_bytesc                 c   rÎ   rË   ©rv   r   r¤   r¥   r/   r   r   rÆ   rÇ   rÒ   r¦   rB   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‘   )rv   r/   r—   rV   rW   rB   ©r1   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¾   )rv   r/   r—   rd   rW   rB   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 )Nrl   rÄ   rØ   s
   aaaaaaaaaarœ   rS   )rv   r/   rV   r   r‹   r—   rB   )r1   Ú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_loopZrun_syncr*   r0   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)rv   Ú	bytearrayÚ	read_intor/   r   r‹   rM   ÚreadingrZ   rW   ÚbytesrV   rB   )r1   r‚   rƒ   rä   Úbufrµ   rQ   r*   r0   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)	rv   rç   rè   r/   rZ   ré   rW   rê   rB   )r1   r‚   rƒ   rë   rµ   rQ   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   )rv   rç   rè   rW   ÚresultrB   )r1   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   rp   éè  )Ú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      à?rp   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ý   ÚRandomrv   ÚhashlibÚsha1r   Ú	coroutineÚ	hexdigestrB   )r1   rü   r   r*   )rÿ   rù   rú   rû   r‚   rƒ   r+   Útest_many_mixed_reads¢  s"   €

ÿ
z(TestReadWriteMixin.test_many_mixed_readsN) r4   r5   r6   rv   r   r   r„   rr   rs   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+   rt   ª   sf    



)
rt   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   r9   r:   r;   ©r1   Ú
connectionru   r*   r*   r+   Ú_make_server_iostreamÖ  r>   z'TestIOStreamMixin._make_server_iostreamc                 K   r9   r:   r;   r  r*   r*   r+   r=   Ù  r>   z'TestIOStreamMixin._make_client_iostreamr1   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©ru   r1   Z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ÚfilenorB   r   ÚReturn)r1   ru   ÚlistenerÚportr  Úclient_streamr^   Úserver_streamr*   r  r+   rv   Ü  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   Z
addCleanupr   r  r¤   Ústopr   r   rm   r	   rJ   rM   r“   ÚerrorÚConnectionRefusedError)r1   Z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©Zside_effect)Ú	localhostéP   )r  ÚAF_INETÚSOCK_STREAMr   r¤   r  r   ÚpatchÚgaierrorÚerrnoZEIOrm   r	   rJ   rM   r“   r  )r1   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  )rv   r   r#  ÚIOErrorÚassertRaisesRegexrL   rB   )r1   Ú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 supportedrp   )r   Úcurrentr“   Zselector_loopr   ZskipTestrv   r%   rB   r  r  rm   r  rV   )r1   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 )Nrp   r¯   c                      s    t  ˆ j ¡ ¡ ˆ j ˆ ¡ d S r:   )r%   rB   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)rv   r   r¤   r¥   rV   r/   r/  r   r   r¦   rB   )r1   r*  r­   r1  r*   r0  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—   r/   )rQ   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î   )rV   r˜   )Znreadr©   )r*  r4  Ú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)rv   r   r  r—   rB   )r1   Z
nproducersr   r*   )r*  r4  rþ   rü   r)  r5  r+   Útest_future_write[  s   €"ÿ
z#TestIOStreamMixin.test_future_writeN)r4   r5   r6   r
  r=   r   r  rr   rs   rv   r   r  r&  r+  r   r   r-  r2  r8  r*   r*   r*   r+   r  Õ  s(     r  c                   @   r-   )ÚTestIOStreamWebHTTPc                 C   s   t t ¡ ƒS r:   )r   r  r0   r*   r*   r+   r=   |  s   z)TestIOStreamWebHTTP._make_client_iostreamN©r4   r5   r6   r=   r*   r*   r*   r+   r9  {  r7   r9  c                   @   r-   )ÚTestIOStreamWebHTTPSc                 C   s   t t ¡ ttjddS )N©Ú	cert_reqs©Ússl_options)r   r  r$   ÚsslÚ	CERT_NONEr0   r*   r*   r+   r=     s   z*TestIOStreamWebHTTPS._make_client_iostreamNr:  r*   r*   r*   r+   r;  €  r7   r;  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   rD  r:   rE  r  r*   r*   r+   r=   ‰  rF  z"TestIOStream._make_client_iostreamN©r4   r5   r6   r
  r=   r*   r*   r*   r+   rC  …  s    rC  c                   @   rB  )ÚTestIOStreamSSLc                 K   s.   t tƒ dd}|j|ddd}t|fi |¤ŽS )NT)Úserver_sideF©rI  Údo_handshake_on_connect)r   r,   Úwrap_socketr   )r1   r	  ru   Ússl_ctxr*   r*   r+   r
  Ž  s   ýz%TestIOStreamSSL._make_server_iostreamc                 K   s   t |fdttjdi|¤ŽS )Nr?  r<  )r   r$   r@  rA  r  r*   r*   r+   r=   —  s   ÿ
ÿÿz%TestIOStreamSSL._make_client_iostreamNrG  r*   r*   r*   r+   rH    s    	rH  c                   @   rB  )Ú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!   TFrJ  )r@  Úcreate_default_contextÚPurposeÚCLIENT_AUTHÚload_cert_chainr%   r&   r'   r(   r)   r   r   ©r1   r	  ru   Úcontextr*   r*   r+   r
  ¡  s   þÿz,TestIOStreamSSLContext._make_server_iostreamc                 K   s0   t  t jj¡}d|_t j|_t|fd|i|¤ŽS )NFr?  )r@  rP  rQ  ÚSERVER_AUTHÚcheck_hostnamerA  Úverify_moder   rT  r*   r*   r+   r=   ¬  s   z,TestIOStreamSSLContext._make_client_iostreamNrG  r*   r*   r*   r+   rN     s    rN  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 )NrG   )ÚsuperÚsetUpr   r  r  r  r   Úserver_acceptedr   r  Úacceptr   r  r  rã   Z
add_futurerJ   r  r¦   Ú	ExceptionÚprint)r1   Úe©r.  r*   r+   r[  ´  s(   
ÿÿ€þzTestIOStreamStartTLS.setUpc                    sR   | j d ur
| j  ¡  | jd ur| j ¡  | j | j ¡ ¡ | j ¡  tƒ  ¡  d S r:   )	r  rB   r  rã   r  r  r  rZ  ÚtearDownr0   ra  r*   r+   rb  È  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   r\  r  )r1   r	  r  r*   r*   r+   r]  Ñ  s   


zTestIOStreamStartTLS.acceptc                 c   óH    | j d usJ ‚| j  |¡ | jd usJ ‚| j d¡V }|  ||¡ d S ©Nra   )r  r/   r  rd   rW   ©r1   ÚlineZ	recv_liner*   r*   r+   Úclient_send_line×  ó   €z%TestIOStreamStartTLS.client_send_linec                 c   rc  rd  )r  r/   r  rd   rW   re  r*   r*   r+   Úserver_send_lineß  rh  z%TestIOStreamStartTLS.server_send_lineNc                 C   s(   | j d usJ ‚| j }d | _ | d||¡S )NF)r  Ú	start_tls)r1   r?  Ú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  rj  )r1   r?  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
r<  s   250 mail.example.com welcome
)ri  rg  rl  r$   r@  rA  rm  r,   r  r  rM   r“   r   )r1   Ú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 Errorr  ©rk  )
rm  r,   r   r   rl  rm   r@  ÚSSLErrorr  r  ©r1   ro  rn  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 )Nrq  rG   rr  )
rm  r,   r   r   rl  r@  rP  rm   rs  r^  rt  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 )Nr   ÚL)	r³   rê   Úcastr  r/   r  rV   rù   rW   )r1   rë   Úrecvr*   r*   r+   Útest_typed_memoryview$  s   €z*TestIOStreamStartTLS.test_typed_memoryview)NNr:   )r4   r5   r6   r[  rb  r]  r   r  rg  ri  rl  rm  r   rp  ru  rv  rz  Ú__classcell__r*   r*   ra  r+   rY  ³  s$    	







rY  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 )Nr>  FÚOP_NO_TLSv1_3r   rG   )r   r,   Z
add_socketr@  rP  rQ  rV  rW  rA  rX  r   ÚoptionsÚgetattrr   r  rJ   ZassertIsNotNoneÚcipherr  rB   )r1   Z
server_clsr)  r*  Úsockr  rM  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:   )ZassertIsNoner  r€  rã   Zspawn_callbackÚhandle_connection©r1   rP   r  )rw   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  rn   ©Úhandshake_futurer*   r+   r„  X  s   €
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r4   r5   r6   r†  r   r  r„  r*   ©rŠ  rw   r*   r+   Ú
TestServerS  s    rŒ  ©r   r   r‚  ©r1   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ˆ  rm   ÚRuntimeErrorr  )r1   rP   r  rµ   r‹  r*   r+   r†  f  s
   €zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r4   r5   r6   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)
r4   r5   r6   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 rO  )r@  rP  rQ  rR  rS  r%   r&   r'   r(   r)   rL  r   )r	  r  rM  r*   r*   r+   r  ‰  s   þýz8TestIOStreamCheckHostname.setUp.<locals>.accept_callbackr    )rZ  r[  r   r  r  r   r  r@  rP  rQ  rV  Úclient_ssl_ctxÚload_verify_locationsr%   r&   r'   r(   r)   )r1   r  ra  r*   r+   r[  …  s   
ÿzTestIOStreamCheckHostname.setUpc                    s*   | j  | j ¡ ¡ | j ¡  tƒ  ¡  d S r:   )rã   r  r  r  rB   rZ  rb  r0   ra  r*   r+   rb  Ÿ  s   
z"TestIOStreamCheckHostname.tearDownc                 Ã   s:   t t ¡ | jd}|jd| jfddI d H  | ¡  d S )Nr>  rG   zfoo.example.comrr  )r   r  r•  rJ   r  rB   rn   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 )Nr>  z.*alert bad certificateÚWindows)rÃ   r  z0.*(certificate verify failed: Hostname mismatch)rÂ   rG   úbar.example.comrr  rœ   )r   r  r•  r   r   rÆ   ÚWARNINGr”   Úsystemrm   r@  ÚSSLCertVerificationErrorrJ   r  rž   r‹   rn   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 )NFr>  rG   r™  rr  )r•  rW  r   r  rJ   r  rn   r*   r*   r+   Útest_check_disabledÆ  s   €þz-TestIOStreamCheckHostname.test_check_disabled)
r4   r5   r6   r[  rb  r   r—  r  rž  r{  r*   r*   ra  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   )r1   ru   rû   Úwr*   r*   r+   rv   Ô  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)rv   r/   rd   rW   rV   rB   rL   rŒ   r*   r*   r+   Útest_pipe_iostreamÚ  s   €


z#TestPipeIOStream.test_pipe_iostreamc                 c   sR    |   ¡ V \}}d}| d| ¡ | |¡V }|  |d| ¡ | ¡  | ¡  d S )Nrl   r†   )rv   r/   rV   rW   rB   )r1   r‚   rƒ   Z	NUM_BYTESrQ   r*   r*   r+   Útest_pipe_iostream_big_writeî  s   €z-TestPipeIOStream.test_pipe_iostream_big_writeN)	r4   r5   r6   r   r  rv   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  r0   r*   r*   r+   r[    rF  zTestStreamBuffer.setUpc                 C   s0   t |ttfƒrt|ƒS t |tƒr| ¡ S t|ƒ‚r:   )r“   rê   rç   r³   ÚtobytesÚ	TypeError)r1   Úbr*   r*   r+   Úto_bytes  s
   
zTestStreamBuffer.to_bytesrå   c                 C   s   t ƒ }|jsJ ‚||_|S r:   )r
   Z_large_buf_threshold)r1   Z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 )Nrp   r’   rU   )r˜   r©  ÚpeekrM   ZassertLessEqualrN   )r1   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   rp   )rW   r˜   r]   r®  rý   Ú	randrangeÚadvance)r1   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¡ 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   r3  rp   r’   é   r   ©rª  r³  rê   rç   r³   r—   r]   rW   r˜   Ú_buffersr°  ©r1   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å   rU   s   xxxxxxxxxxxó   yr±   ó   zé!   rp   r’   r   r¶  r¸  r*   r*   r+   Ú
test_largeK  s(   





zTestStreamBuffer.test_largeN)rå   )r4   r5   r6   Ú__doc__r[  r©  rª  r®  r³  r¹  r½  r*   r*   r*   r+   r¥  þ  s    
	r¥  )GZtornado.concurrentr   Ú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  r@  rr   r–   r   r,   r.   Úobjectr8   rt   r  r9  r;  rC  rH  rN  rY  r|  r”  rŸ  ZTestCaser¥  r*   r*   r*   r+   Ú<module>   s^     o    / '}PR+