o
    E¾±hSÊ  ã                   @   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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l0Z0d dl1Z1d dl2Z2d dl3Z3d dl4Z4d dl5Z5d dl6Z6d dl7m8Z8 d dl7Z7dd„ Z9G dd„ de+ƒZ:e)G dd„ de!ƒƒZ;e)G dd„ de!ƒƒZ<e)G dd„ de<ƒƒZ=G dd„ dee;ƒZ>G dd„ de e;ƒZ?G d d!„ d!e=ƒZ@G d"d#„ d#e=ƒZAG d$d%„ d%e=ƒZBG d&d'„ d'e!ƒZCG d(d)„ d)e!ƒZDG d*d+„ d+e!ƒZEe&G d,d-„ d-e<e!ƒƒZFG d.d/„ d/e7jGƒZHdS )0é    )ÚFuture)Úgen)Únetutil)ÚIOLoop)ÚIOStreamÚSSLIOStreamÚPipeIOStreamÚStreamClosedErrorÚ_StreamBuffer)ÚAsyncHTTPClientÚHTTPResponse)Ú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Úignore_deprecationÚabstract_base_test)Ú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,   ú[/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/tornado/test/iostream_test.pyÚ_server_ssl_options0   s   þr.   c                   @   s   e Zd Zdd„ ZdS )ÚHelloHandlerc                 C   s   |   d¡ d S )NÚHello)Úwrite©Úselfr,   r,   r-   Úget8   ó   zHelloHandler.getN)Ú__name__Ú
__module__Ú__qualname__r4   r,   r,   r,   r-   r/   7   s    r/   c                	   @   sš   e Zd Zdd„ Zdd„ Zdefdd„Z	dd	ed
ede	j
defdd„Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚTestIOStreamWebMixinc                 C   ó   t ƒ ‚©N©ÚNotImplementedErrorr2   r,   r,   r-   Ú_make_client_iostreamG   ó   z*TestIOStreamWebMixin._make_client_iostreamc                 C   s   t dtfgƒS )Nú/)r    r/   r2   r,   r,   r-   Úmixin_get_appJ   r5   z"TestIOStreamWebMixin.mixin_get_appÚreturnc                 C   r:   r;   r<   r2   r,   r,   r-   Úget_http_portM   r?   z"TestIOStreamWebMixin.get_http_portFr(   Úraise_errorÚkwargsc                 K   r:   r;   r<   )r3   r(   rD   rE   r,   r,   r-   ÚfetchP   s   zTestIOStreamWebMixin.fetchc                 C   sD   t  ¡ j d¡rt ¡ dkr|  d¡ | jdddid}| ¡  d S )NÚCurlAsyncHTTPClientÚDarwinz:libcurl doesn't handle closed connections cleanly on macOSr@   Ú
ConnectionÚclose)Úheaders)	r   Úconfigured_classr6   ÚendswithÚplatformÚsystemÚskipTestrF   Úrethrow)r3   Úresponser,   r,   r-   Útest_connection_closedV   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>   ÚconnectrC   r1   Úread_until_closeÚ
assertTrueÚ
startswithrM   )r3   ÚstreamÚdatar,   r,   r-   Útest_read_until_closei   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 )	NrT   rU   é	   s	   HTTP/1.1 r   ó    é   s   200)r>   r[   rW   rC   r1   Ú
read_bytesÚassertEqualrJ   )r3   r\   r,   r,   r-   Útest_read_zero_bytess   s   €
z)TestIOStreamWebMixin.test_read_zero_bytesc                 c   s     |   ¡ }| d|  ¡ f¡}| d¡}|  | ¡ ¡ t ||¡}g }| ¡ s5| ¡ V  | 	|j
¡ | ¡ r&|  |||g¡ | ¡ V }|  | d¡¡ | ¡  d S )NrT   ó%   GET / HTTP/1.0
Connection: close

rV   )r>   rW   rC   r1   ÚassertFalseÚdoner   ÚWaitIteratorÚnextÚappendÚcurrent_futurerb   rX   rY   rM   rJ   )r3   r[   Úconnect_futÚ	write_futÚitÚresolved_orderr\   r,   r,   r-   Útest_write_while_connecting‡   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.rT   rU   ó   
s   HTTP/1.1 200 OK
ó   

Úlatin1zContent-LengthrV   N)r>   rW   rC   ÚassertIsr1   Ú
read_untilrb   r   ÚparseÚdecodeÚintra   rJ   )r3   r[   Úconnect_resultÚ
first_lineÚheader_datarK   Ú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 )NrT   rU   é   )r>   rW   rC   r1   ÚassertRaisesr	   ra   rJ   ©r3   r[   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 )NrT   rd   rq   rV   é   )
r>   rW   rC   r1   rt   rX   rb   r   r	   ra   )r3   r[   r|   r,   r,   r-   Útest_future_read_until_close·   s   €
"ÿz1TestIOStreamWebMixin.test_future_read_until_closeN)F)r6   r7   r8   r>   rA   rw   rC   ÚstrÚboolÚtypingÚAnyr   rF   rS   r   r]   rc   ro   r}   r   rƒ   r,   r,   r,   r-   r9   <   s6    ÿÿÿÿ
þ
	



r9   c                   @   s<  e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZd5S )6ÚTestReadWriteMixinc                 K   s   t ‚r;   r<   )r3   rE   r,   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;   )ÚtestrE   )r3   rŠ   rE   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‰   rE   Úpairr2   r,   r,   r-   Ú
__aenter__Ú   s   €zHTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aenter__c                 Ó   s   | j D ]}| ¡  qd S r;   )rŒ   rJ   )r3   ÚtypÚvalueÚtbÚsr,   r,   r-   Ú	__aexit__Þ   s   €

ÿzGTestReadWriteMixin.iostream_pair.<locals>.IOStreamPairContext.__aexit__N)r6   r7   r8   r‹   r   r’   r,   r,   r,   r-   ÚIOStreamPairContextÕ   s    r“   r,   )r3   rE   r“   r,   r,   r-   Úiostream_pairÏ   s   
z TestReadWriteMixin.iostream_pairc                 c   s0    |   ¡ V \}}| d¡V  | ¡  | ¡  d S )Nr_   )r‰   r1   rJ   )r3   ÚrsÚwsr,   r,   r-   Útest_write_zero_bytesä   s
   €z(TestReadWriteMixin.test_write_zero_bytesc                 c   s„    |   ¡ V \}}z0| d¡ g }| | d¡V ¡ | ¡  | | d¡V ¡ |  |ddg¡ W | ¡  | ¡  d S | ¡  | ¡  w )Nó   12r‚   ó   1ó   2)r‰   r1   ri   ra   rJ   rb   )r3   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‰   r1   ra   rb   rJ   r   Úsleep©r3   r•   r–   r\   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   1234r‚   r™   s   234)r‰   r1   ra   rJ   rb   rX   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   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArp   é   é   )r‰   Ú
isinstancer   rN   Úpython_implementationÚunittestÚSkipTestÚranger1   rt   rb   ÚlenrJ   )r3   r•   r–   ÚNUM_KBÚir\   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_futurert   rŸ   r1   rJ   ©r3   r•   r–   Úrfr,   r,   r-   Ú.test_read_until_with_close_after_second_packetC  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´   rt   r1   rJ   r   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
rp   )	r‰   r   Úset_close_callbackÚsetr1   rt   rb   rJ   Úwait)r3   ÚOKr•   r–   ÚeventÚresr,   r,   r-   Ú%test_close_callback_with_pending_readi  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_callback‰  s   zETestReadWriteMixin.test_future_close_callback.<locals>.close_callbackó   ar‚   r   )
r‰   r   r¹   r1   ra   rb   re   rJ   r»   rY   )r3   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‰   ra   r1   Ú
memoryviewrb   rJ   ©r3   r•   r–   Úfutr\   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È   r`   s   worldó   worr   r_   )r‰   ra   r1   rb   rJ   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º   rt   r1   rb   r   r   ÚloggingÚINFOr»   rJ   ©r3   r•   r–   rÂ   rË   r\   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º   r1   r   r   rÝ   rÞ   r   r	   rt   r»   rJ   ©r3   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º   r1   r   r   rÝ   rÞ   rt   r»   rJ   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_regexr1   rb   r   r   rÝ   rÞ   r»   rJ   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º   r1   r   r   rÝ   rÞ   ré   r»   rJ   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‰   r1   r«   ra   rb   rJ   ©r3   r•   r–   r®   r\   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‰   r1   r«   rt   rb   rJ   rò   r,   r,   r-   Ú(test_small_read_untils_from_large_bufferM  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 )Nr~   rÛ   rï   s
   aaaaaaaaaar±   r^   )r‰   r1   ra   r   rŸ   r«   rJ   )r3   Ú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>s  s   
 zGTestReadWriteMixin.test_read_into.<locals>.sleep_some.<locals>.<lambda>)Úio_loopÚrun_syncr,   r2   r,   r-   Ú
sleep_somer  s   z5TestReadWriteMixin.test_read_into.<locals>.sleep_someé
   rÈ   rø   s   world!!s
   helloworlds
   1234567890s
   !!12345678rÇ   s	   abcdefghis   90abé   s   cdefghi)r‰   Ú	bytearrayÚ	read_intor1   r   rŸ   rY   Úreadingre   rb   Úbytesra   rJ   )r3   r•   r–   rü   ÚbufrË   r\   r,   r2   r-   Útest_read_inton  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   r1   re   r  rb   r  rJ   )r3   r•   r–   r  rË   r\   r,   r,   r-   Útest_read_into_partial˜  s*   €

ÿ
z)TestReadWriteMixin.test_read_into_partialc                 c   sZ    |   ¡ V \}}ztƒ }| |¡}|  | ¡ d¡ W | ¡  | ¡  d S | ¡  | ¡  w ©Nr   )r‰   rÿ   r   rb   ÚresultrJ   )r3   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   r‚   éè  )ÚrandintÚminr'   ÚurandomÚupdater1   )Ú	remainingÚsizer\   )Ú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      à?r‚   r
  )Úrandomr  r  ra   r  rÿ   r   )r  r  r\   r  Ún)Úconsume_hashr  r  r•   r,   r-   Úconsume×  s    €


òz9TestReadWriteMixin.test_many_mixed_reads.<locals>.consume)	r  ÚRandomr‰   ÚhashlibÚsha1r   Ú	coroutineÚ	hexdigestrJ   )r3   r  r  r,   )r  r  r  r  r•   r–   r-   Útest_many_mixed_readsÀ  s"   €

ÿ
z(TestReadWriteMixin.test_many_mixed_readsN)r6   r7   r8   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                   @   sv   e Zd Zdd„ Zdd„ Zejdd„ ƒZedd„ ƒZ	ed	d
„ ƒZ
edd„ ƒZeedd„ ƒƒZedd„ ƒZedd„ ƒZdS )ÚTestIOStreamMixinc                 K   r:   r;   r<   ©r3   Ú
connectionrE   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_iostreamc                 +   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©rE   r3   Úserver_stream_futr,   r-   Úaccept_callback   s   ÿz=TestIOStreamMixin.make_iostream_pair.<locals>.accept_callbackrT   )r   r   r   Úadd_accept_handlerr>   ÚsocketrW   rú   Úremove_handlerÚfilenorJ   r   ÚReturn)r3   rE   ÚlistenerÚportr'  Úclient_streamrk   Ú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)ÚrequiredrT   )r   Ú
addCleanupr   r)  r¹   Ústopr   r   r   r	   rW   rY   r§   ÚerrorÚConnectionRefusedError)r3   Úcleanup_funcr.  r[   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¹   r3  r!   ÚpatchÚgaierrorÚerrnoÚEIOr   r	   rW   rY   r§   r4  )r3   r‘   r[   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_readr8  r9  )r‰   r!   r?  ÚIOErrorÚassertRaisesRegexrX   rJ   )r3   Ú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 supportedr‚   )r   Úcurrentr§   Úselector_loopr   rP   r‰   r'   rJ   r)  r+  r   r4  ra   )r3   rú   rF  rG  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 )Nr‚   rÅ   c                      s    t  ˆ j ¡ ¡ ˆ j ˆ ¡ d S r;   )r'   rJ   r)  r+  Ú	__class__Úread_from_fdr,   ©rF  r,   r-   Úfake_read_from_fdl  s   zJTestIOStreamMixin.test_async_read_error_logging.<locals>.fake_read_from_fdzerror on read)r‰   r   r¹   rº   ra   r1   rM  r   r   r»   rJ   )r3   rG  rÂ   rO  r,   rN  r-   Útest_async_read_error_logging_  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«   r1   )r\   r®   )Úmr  rF  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  )ra   r¬   )Únreadr¾   )rG  rR  Útotal_bytesr,   r-   r  Š  s   €þz4TestIOStreamMixin.test_future_write.<locals>.consumec                    s   g | ]}ˆ ƒ ‘qS r,   r,   )Ú.0r®   )r  r,   r-   Ú
<listcomp>’  s    z7TestIOStreamMixin.test_future_write.<locals>.<listcomp>N)r‰   r   r  r«   rJ   )r3   Ú
nproducersr  r,   )rG  rR  r  r  rF  rT  r-   Útest_future_writex  s   €"ÿ
z#TestIOStreamMixin.test_future_writeN)r6   r7   r8   r"  r>   r   r  r‰   r   r7  rC  rH  r   rK  rP  rX  r,   r,   r,   r-   r  ó  s$    



 
r  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚTestIOStreamWebHTTPc                 C   s   t t ¡ ƒS r;   )r   r)  r2   r,   r,   r-   r>   ™  s   z)TestIOStreamWebHTTP._make_client_iostreamc                 C   ó   |   ¡ S r;   ©rA   r2   r,   r,   r-   Úget_appœ  ó   zTestIOStreamWebHTTP.get_appN©r6   r7   r8   r>   r]  r,   r,   r,   r-   rZ  ˜  ó    rZ  c                   @   rY  )ÚTestIOStreamWebHTTPSc                 C   s   t t ¡ ttjddS )N©Ú	cert_reqs©Ússl_options)r   r)  r&   ÚsslÚ	CERT_NONEr2   r,   r,   r-   r>   ¡  s   z*TestIOStreamWebHTTPS._make_client_iostreamc                 C   r[  r;   r\  r2   r,   r,   r-   r]  ¤  r^  zTestIOStreamWebHTTPS.get_appNr_  r,   r,   r,   r-   ra     r`  ra  c                   @   rY  )ÚTestIOStreamc                 K   ó   t |fi |¤ŽS r;   ©r   r   r,   r,   r-   r"  ©  ó   z"TestIOStream._make_server_iostreamc                 K   ri  r;   rj  r   r,   r,   r-   r>   ¬  rk  z"TestIOStream._make_client_iostreamN©r6   r7   r8   r"  r>   r,   r,   r,   r-   rh  ¨  r`  rh  c                   @   rY  )ÚTestIOStreamSSLc                 K   s.   t tƒ dd}|j|ddd}t|fi |¤ŽS )NT)Úserver_sideF©rn  Údo_handshake_on_connect)r   r.   Úwrap_socketr   )r3   r!  rE   Ússl_ctxr,   r,   r-   r"  ±  s   ýz%TestIOStreamSSL._make_server_iostreamc                 K   s   t |fdttjdi|¤ŽS )Nre  rb  )r   r&   rf  rg  r   r,   r,   r-   r>   º  s   ÿ
ÿÿz%TestIOStreamSSL._make_client_iostreamNrl  r,   r,   r,   r-   rm  °  s    	rm  c                   @   rY  )Ú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#   TFro  )rf  Úcreate_default_contextÚPurposeÚCLIENT_AUTHÚload_cert_chainr'   r(   r)   r*   r+   r   r   ©r3   r!  rE   Úcontextr,   r,   r-   r"  Ä  s   þÿz,TestIOStreamSSLContext._make_server_iostreamc                 K   s0   t  t jj¡}d|_t j|_t|fd|i|¤ŽS )NFre  )rf  ru  rv  ÚSERVER_AUTHÚcheck_hostnamerg  Úverify_moder   ry  r,   r,   r-   r>   Ï  s   z,TestIOStreamSSLContext._make_client_iostreamNrl  r,   r,   r,   r-   rs  Ã  s    rs  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 )NrT   )ÚsuperÚsetUpr   r-  r.  r0  r   Úserver_acceptedr   r(  Úacceptr   r)  r/  rú   Ú
add_futurerW   r3  r»   Ú	ExceptionÚprint)r3   Úe©rL  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;   )	r0  rJ   r/  rú   r*  r-  r+  r  ÚtearDownr2   r‡  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)r0  Úfailr   r  r#  )r3   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 ©Nrp   )r/  r1   r0  rt   rb   ©r3   ÚlineÚ	recv_liner,   r,   r-   Úclient_send_lineú  ó   €z%TestIOStreamStartTLS.client_send_linec                 c   rŠ  r‹  )r0  r1   r/  rt   rb   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)r3   re  Ú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)r0  r’  )r3   re  r0  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
rb  s   250 mail.example.com welcome
)r‘  r  r”  r&   rf  rg  r•  r.   r/  r0  rY   r§   r   )r3   Ú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;  ©r“  )
r•  r.   r   r   r”  r   rf  ÚSSLErrorr)  r4  ©r3   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™  rT   rš  )
r•  r.   r   r   r”  rf  ru  r   r›  r„  rœ  r,   r,   r-   Útest_check_hostname6  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  Úcastr0  r1   r/  ra   r  rb   )r3   r  Úrecvr,   r,   r-   Útest_typed_memoryviewE  s   €z*TestIOStreamStartTLS.test_typed_memoryview)NNr;   )r6   r7   r8   r€  rˆ  r‚  r   r  r  r‘  r”  r•  r   r˜  r  rž  r¢  Ú__classcell__r,   r,   r‡  r-   r~  Ö  s$    	







r~  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 )Nrd  FÚOP_NO_TLSv1_3r   rT   )r   r.   Ú
add_socketrf  ru  rv  r{  r|  rg  r}  r   ÚoptionsÚgetattrr   r)  rW   ÚassertIsNotNoneÚcipherr3  rJ   )r3   Ú
server_clsrF  rG  Úsockr.  rr  r,   r,   r-   Úconnect_to_serverR  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©r3   r[   r$  )rŠ   r,   r-   Úhandle_streamu  s   zUWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_streamc                 3   s    |  ¡ V  ˆ  d ¡ d S r;   ©Úwait_for_handshaker#  r€   ©Úhandshake_futurer,   r-   r±  y  s   €
zYWaitForHandshakeTest.test_wait_for_handshake_future.<locals>.TestServer.handle_connectionN)r6   r7   r8   r³  r   r  r±  r,   ©r·  rŠ   r,   r-   Ú
TestServert  s    r¹  ©r   r   r­  ©r3   r¹  r,   r¸  r-   Útest_wait_for_handshake_futureo  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µ  r   ÚRuntimeErrorr#  )r3   r[   r$  rË   r¸  r,   r-   r³  ‡  s
   €zdWaitForHandshakeTest.test_wait_for_handshake_already_waiting_error.<locals>.TestServer.handle_streamN©r6   r7   r8   r   r  r³  r,   r¸  r,   r-   r¹  †  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³  —  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_connected’  s
   €
z>WaitForHandshakeTest.test_wait_for_handshake_already_connectedN)
r6   r7   r8   r   r  r­  r   r¼  r¿  rÀ  r,   r,   r,   r-   r¤  Q  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 rt  )rf  ru  rv  rw  rx  r'   r(   r)   r*   r+   rq  r   )r!  r$  rr  r,   r,   r-   r'  ª  s   þýz8TestIOStreamCheckHostname.setUp.<locals>.accept_callbackr"   )r  r€  r   r-  r.  r   r(  rf  ru  rv  r{  Úclient_ssl_ctxÚload_verify_locationsr'   r(   r)   r*   r+   )r3   r'  r‡  r,   r-   r€  ¦  s   
ÿzTestIOStreamCheckHostname.setUpc                    s*   | j  | j ¡ ¡ | j ¡  tƒ  ¡  d S r;   )rú   r*  r-  r+  rJ   r  rˆ  r2   r‡  r,   r-   rˆ  À  s   
z"TestIOStreamCheckHostname.tearDownc                 Ã   s:   t t ¡ | jd}|jd| jfddI d H  | ¡  d S )Nrd  rT   zfoo.example.comrš  )r   r)  rÂ  rW   r.  rJ   r€   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 )Nrd  z.*alert bad certificateÚWindows)rÚ   r1  z0.*(certificate verify failed: Hostname mismatch)rÙ   rT   úbar.example.comrš  r±   )r   r)  rÂ  r   r   rÝ   ÚWARNINGrN   rO   r   rf  ÚSSLCertVerificationErrorrW   r.  r³   rŸ   r€   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 )NFrd  rT   rÆ  rš  )rÂ  r|  r   r)  rW   r.  r€   r,   r,   r-   Útest_check_disabledç  s   €þz-TestIOStreamCheckHostname.test_check_disabled)
r6   r7   r8   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 r;   )r'   Úpiper   )r3   rE   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 r`   rÐ   s   ld)r‰   r1   rt   rb   ra   rJ   rX   r    r,   r,   r-   Útest_pipe_iostreamû  s   €


z#TestPipeIOStream.test_pipe_iostreamc                 c   sR    |   ¡ V \}}d}| d| ¡ | |¡V }|  |d| ¡ | ¡  | ¡  d S )Nr~   r™   )r‰   r1   ra   rb   rJ   )r3   r•   r–   Ú	NUM_BYTESr\   r,   r,   r-   Útest_pipe_iostream_big_write  s   €z-TestPipeIOStream.test_pipe_iostream_big_writeN)	r6   r7   r8   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  r2   r,   r,   r-   r€  $  rk  zTestStreamBuffer.setUpc                 C   s0   t |ttfƒrt|ƒS t |tƒr| ¡ S t|ƒ‚r;   )r§   r  rÿ   rÉ   ÚtobytesÚ	TypeError)r3   Úbr,   r,   r-   Úto_bytes'  s
   
zTestStreamBuffer.to_bytesrý   c                 C   s   t ƒ }|jsJ ‚||_|S r;   )r
   Ú_large_buf_threshold)r3   Ú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 )Nr‚   r¦   r`   )r¬   rÖ  ÚpeekrY   ÚassertLessEqualrZ   )r3   r  Úexpectedr  Úgotr,   r,   r-   Ú
check_peek5  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   r_   r‚   )rb   r¬   ri   rÞ  r  Ú	randrangeÚadvance)r3   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ý   r^   rQ  r‚   r¦   é   r   ©rÙ  rä  r  rÿ   rÉ   r«   ri   rb   r¬   Ú_buffersrà  ©r3   rá  r  r®   r,   r,   r-   Ú
test_smallR  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ý   r`   s   xxxxxxxxxxxó   yrÇ   ó   zé!   r‚   r¦   r   rç  ré  r,   r,   r-   Ú
test_largel  s(   





zTestStreamBuffer.test_largeN)rý   )r6   r7   r8   Ú__doc__r€  rÖ  rÙ  rÞ  rä  rê  rî  r,   r,   r,   r-   rÒ    s    
	rÒ  )IÚtornado.concurrentr   Útornador   r   Útornado.ioloopr   Útornado.iostreamr   r   r   r	   r
   Útornado.httpclientr   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³   rA  r  rÝ   r'   rN   r  r)  rf  r†   r©   r!   r.   r/   r9   rˆ   r  rZ  ra  rh  rm  rs  r~  r¤  rÁ  rË  ÚTestCaserÒ  r,   r,   r,   r-   Ú<module>   sh          / %{PR+