o
    Ehy                    @   s  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 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 d d
lmZ d dlmZ d dl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&m'Z'm(Z(m)Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 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lAmBZB d dlCZCd dlDZDd dlEZEd dlFZFd dlGZGd dlHZHd dlIZId dlJZKdd ZLG dd deZMG dd deMZNG dd de'ZOG dd de'ZPG dd deIjQZRG dd deIjQZSG d d! d!eMZTG d"d# d#eMZUG d$d% d%e'ZVG d&d' d'eMZWG d(d) d)e'ZXG d*d+ d+eMZYG d,d- d-e'ZZG d.d/ d/eMZ[G d0d1 d1e'Z\G d2d3 d3e'Z]G d4d5 d5e'Z^G d6d7 d7e'Z_G d8d9 d9e'Z`G d:d; d;e'ZaG d<d= d=e'Z)G d>d? d?e'ZbG d@dA dAe'ZcG dBdC dCe'ZdG dDdE dEe'ZeG dFdG dGe'ZfG dHdI dIeMZgG dJdK dKeMZhG dLdM dMeMZiG dNdO dOeMZjG dPdQ dQeMZkG dRdS dSeMZlG dTdU dUeMZmG dVdW dWeMZnG dXdY dYeMZoG dZd[ d[eMZpG d\d] d]eMZqG d^d_ d_eNZrG d`da daeNZsG dbdc dceNZtG ddde deeNZuG dfdg dgeNZvG dhdi dieNZwG djdk dkeMZxG dldm dmeNZyG dndo doeMZzG dpdq dqeNZ{G drds dse|Z}G dtdu dueNZ~G dvdw dweNZG dxdy dyeNZG dzd{ d{eNZG d|d} d}eNZG d~d deMZG dd deNZG dd deNZG dd deNZG dd deNZG dd deNZG dd deMZG dd deMZG dd deMZG dd deMZG dd deMZe6G dd de'ZG dd dZG dd deeMZG dd deeMZG dd deNZG dd deNZG dd deIjQZG dd deNZG dd deNZG dd deNZG dd deNZG dd deMZG dd deMZG dd deNZG dd deIjQZG dd deZG dd deIjQZG dd deMZG dd deMZdS )    )Future)gen)json_decodeutf8
to_unicoderecursive_unicode
native_strto_basestring)HTTPClientError)format_timestamp)IOStream)locale)Event)app_loggen_logSimpleAsyncHTTPClient
DictLoader)AsyncHTTPTestCaseAsyncTestCase	ExpectLoggen_test)ignore_deprecation)
ObjectDictunicode_type)ApplicationRequestHandlerStaticFileHandlerRedirectHandler	HTTPErrorMissingArgumentErrorErrorHandlerauthenticatedurl_create_signature_v1create_signed_valuedecode_signed_valueget_signature_key_versionUIModuleFinishstream_request_bodyremoveslashaddslashGZipContentEncodingN)BytesIOc                  G   s   t jjt jtg| R  S N)ospathjoindirname__file__)a r7   V/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/tornado/test/web_test.pyrelpath=      r9   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	WebTestCasezBase class for web tests that also supports WSGI mode.

    Override get_handlers and get_app_kwargs instead of get_app.
    This class is deprecated since WSGI mode is no longer supported.
    c                 C   s    t |  fi |  | _| jS r0   )r   get_handlersget_app_kwargsappselfr7   r7   r8   get_appH   s   zWebTestCase.get_appc                 C      t  r0   NotImplementedErrorr?   r7   r7   r8   r<   L      zWebTestCase.get_handlersc                 C   s   i S r0   r7   r?   r7   r7   r8   r=   O      zWebTestCase.get_app_kwargsN)__name__
__module____qualname____doc__rA   r<   r=   r7   r7   r7   r8   r;   A   s
    r;   c                   @   s   e Zd ZdZdZdd ZdS )SimpleHandlerTestCasezSimplified base class for tests that work with a single handler class.

    To use, define a nested class named ``Handler``.
    Nc                 C   s   d| j fgS )N/Handlerr?   r7   r7   r8   r<   [      z"SimpleHandlerTestCase.get_handlers)rG   rH   rI   rJ   rN   r<   r7   r7   r7   r8   rK   S   s    rK   c                   @      e Zd Zdd ZdS )HelloHandlerc                 C      |  d d S Nhellowriter?   r7   r7   r8   get`      zHelloHandler.getNrG   rH   rI   rW   r7   r7   r7   r8   rQ   _       rQ   c                   @   s(   e Zd Zd	ddZdd Zd
ddZdS )CookieTestRequestHandler
0123456789Nc                 C   s<   i | _ |d u rtt|dd| _d S tt||dd| _d S )N)cookie_secret)settingsr]   key_version)_cookiesr   dictapplication)r@   r]   r`   r7   r7   r8   __init__f   s   
z!CookieTestRequestHandler.__init__c                 C   s   | j |S r0   )ra   rW   )r@   namer7   r7   r8   
get_cookier   rO   z#CookieTestRequestHandler.get_cookiec                 C   s   || j |< d S r0   )ra   )r@   re   valueexpires_daysr7   r7   r8   
set_cookieu   rX   z#CookieTestRequestHandler.set_cookie)r\   Nr0   )rG   rH   rI   rd   rf   ri   r7   r7   r7   r8   r[   d   s    
r[   c                   @   $   e Zd Zdd Zdd Zdd ZdS )SecureCookieV1Testc                 C   0   t  }|jdddd | |jdddd d S )Nfoo   bar   versionmin_versionr[   set_signed_cookieassertEqualget_signed_cookier@   handlerr7   r7   r8   test_round_trip{      z"SecureCookieV1Test.test_round_tripc                 C   s  t  }|jdtddd |jd }td|}| | |d us$J |d}|d}| 	t
|jjd dd|| | 	t
|jjd dd	d
| | tdt| dt| |jd< ttd | |jddd W d    d S 1 szw   Y  d S )Nrm   s   d76df8e7aefcro   rp   s   12345678\|([0-9]+)\|([0-9a-f]+)   r]   123456781234s   5678z	1234|5678|zCookie timestamp in futurerr   )r[   ru   binasciia2b_hexra   rematchassertIsNotNonegrouprv   r%   rc   r^   r   r	   r   r   assertIsNonerw   )r@   ry   cookier   	timestampsigr7   r7   r8   &test_cookie_tampering_future_timestamp   s@   







"z9SecureCookieV1Test.test_cookie_tampering_future_timestampc                 C   rl   )Nrm      ro   rp   rr   rt   rx   r7   r7   r8   test_arbitrary_bytes   s   z'SecureCookieV1Test.test_arbitrary_bytesN)rG   rH   rI   rz   r   r   r7   r7   r7   r8   rk   z   s    'rk   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )SecureCookieV2Testajklasdf0ojaisdfaslkjasaolwkjsdf)r   ro   c                 C   rl   )Nrm   rn   r|   rp   rr   rt   rx   r7   r7   r8   rz      r{   z"SecureCookieV2Test.test_round_tripc                 C   0   t | jdd}|dd | |dd d S )Nr   r_   rm   rn   r[   KEY_VERSIONSru   rv   rw   rx   r7   r7   r8   test_key_version_roundtrip   
   z-SecureCookieV2Test.test_key_version_roundtripc                 C   r   )Nro   r_   rm   rn   r   rx   r7   r7   r8   ,test_key_version_roundtrip_differing_version   r   z?SecureCookieV2Test.test_key_version_roundtrip_differing_versionc                 C   sF   t | jdd}|dd t | jdd}|j|_| |dd d S Nr   r_   rm   rn   ro   )r[   r   ru   ra   rv   rw   )r@   ry   new_handlerr7   r7   r8   "test_key_version_increment_version   s   z5SecureCookieV2Test.test_key_version_increment_versionc                 C   sX   t | jdd}|dd | j }|d t |dd}|j|_| |dd  d S r   )r[   r   ru   copypopra   rv   rw   )r@   ry   new_key_versionsr   r7   r7   r8   #test_key_version_invalidate_version   s   

z6SecureCookieV2Test.test_key_version_invalidate_versionN)	rG   rH   rI   r   rz   r   r   r   r   r7   r7   r7   r8   r      s    
r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 ZdS )
FinalReturnTestNc                    s<   |  G  fdddt }G  fdddt }d|fd|fgS )Nc                       s0   e Zd Zej fddZej fddZdS )z3FinalReturnTest.get_handlers.<locals>.FinishHandlerc                 3   s    |    _ jV  d S r0   )finishfinal_returnr?   testr7   r8   rW      s   
z7FinalReturnTest.get_handlers.<locals>.FinishHandler.getc                 3   s.    |  d |  V  | d _ jV  d S )Nzhello,world)rV   flushr   r   r?   r   r7   r8   post   s
   

z8FinalReturnTest.get_handlers.<locals>.FinishHandler.postN)rG   rH   rI   r   	coroutinerW   r   r7   r   r7   r8   FinishHandler   s
    r   c                       s&   e Zd Zdd Zej fddZdS )z3FinalReturnTest.get_handlers.<locals>.RenderHandlerc                 S   s   t ddiS )Nfoo.htmlhir   r@   r2   r7   r7   r8   create_template_loader   rO   zJFinalReturnTest.get_handlers.<locals>.RenderHandler.create_template_loaderc                    s   |  d _d S Nr   )renderr   r?   r   r7   r8   rW      s   z7FinalReturnTest.get_handlers.<locals>.RenderHandler.getN)rG   rH   rI   r   r   r   rW   r7   r   r7   r8   RenderHandler   s    r   /finish/renderr   )r@   r   r   r7   r   r8   r<      s   zFinalReturnTest.get_handlersc                 C   
   t ddS )Nr   )template_pathrb   r?   r7   r7   r8   r=         
zFinalReturnTest.get_app_kwargsc                 C   s   |  | d}| |jd | | jt | | j  | j | dddd}| |jd | | jt | | j  d S )Nr      POST    methodbody)	fetchget_urlrv   codeassertIsInstancer   r   
assertTruedoner@   responser7   r7   r8    test_finish_method_return_future   s   z0FinalReturnTest.test_finish_method_return_futurec                 C   s0   |  | d}| |jd | | jt d S )Nr   r   )r   r   rv   r   r   r   r   r   r7   r7   r8    test_render_method_return_future
  s   z0FinalReturnTest.test_render_method_return_future)rG   rH   rI   r   r<   r=   r   r   r7   r7   r7   r8   r      s    r   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )
CookieTestc           
   
   C   s   G dd dt }G dd dt }G dd dt }G dd dt }G d	d
 d
t }G dd dt }G dd dt }G dd dt }G dd dt }	d|fd|fd|fd|fd|fd|fd|fd|fd|	fg	S )Nc                   @   rP   )z1CookieTest.get_handlers.<locals>.SetCookieHandlerc                 S   (   |  dd |  dd |  dd d S )Nstrasdfunicodeqwerbytess   zxcvri   r?   r7   r7   r8   rW     s   z5CookieTest.get_handlers.<locals>.SetCookieHandler.getNrY   r7   r7   r7   r8   SetCookieHandler  rZ   r   c                   @   rP   )z1CookieTest.get_handlers.<locals>.GetCookieHandlerc                 S   s&   |  dd}|d usJ | | d S )Nrm   default)rf   rV   )r@   r   r7   r7   r8   rW     s   z5CookieTest.get_handlers.<locals>.GetCookieHandler.getNrY   r7   r7   r7   r8   GetCookieHandler  rZ   r   c                   @   rP   )z7CookieTest.get_handlers.<locals>.SetCookieDomainHandlerc                 S      | j ddddd d S )Nunicode_argsblahzfoo.com/foo)domainr2   r   r?   r7   r7   r8   rW   !  s   z;CookieTest.get_handlers.<locals>.SetCookieDomainHandler.getNrY   r7   r7   r7   r8   SetCookieDomainHandler   rZ   r   c                   @   rP   )z<CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandlerc                 S   r   )Nequalsa=b	semicolona;bquotea"br   r?   r7   r7   r8   rW   '  s   z@CookieTest.get_handlers.<locals>.SetCookieSpecialCharHandler.getNrY   r7   r7   r7   r8   SetCookieSpecialCharHandler&  rZ   r   c                   @   rP   )z:CookieTest.get_handlers.<locals>.SetCookieOverwriteHandlerc                 S   s0   | j dddd | j dddd |  dd d S )Nr6   bzexample.com)r   cder   r?   r7   r7   r8   rW   -  s   z>CookieTest.get_handlers.<locals>.SetCookieOverwriteHandler.getNrY   r7   r7   r7   r8   SetCookieOverwriteHandler,  rZ   r   c                   @   rP   )z7CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandlerc                 S      | j dddd d S )Nrm   bar
   )max_ager   r?   r7   r7   r8   rW   5     z;CookieTest.get_handlers.<locals>.SetCookieMaxAgeHandler.getNrY   r7   r7   r7   r8   SetCookieMaxAgeHandler4  rZ   r   c                   @   rP   )z<CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandlerc                 S   r   )Nrm   r   r   )rh   r   r?   r7   r7   r8   rW   9  r   z@CookieTest.get_handlers.<locals>.SetCookieExpiresDaysHandler.getNrY   r7   r7   r7   r8   SetCookieExpiresDaysHandler8  rZ   r   c                   @   rP   )z4CookieTest.get_handlers.<locals>.SetCookieFalsyFlagsc                 S   sD   | j dddd | j dddd | j dddd | j d	ddd d S )
Nr6   1T)securer   Fr   )httponlyr   r   r?   r7   r7   r8   rW   =  s   z8CookieTest.get_handlers.<locals>.SetCookieFalsyFlags.getNrY   r7   r7   r7   r8   SetCookieFalsyFlags<  rZ   r   c                   @   rP   )z8CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgsc                 S   r   )Nr6   r   Tr   )HttpOnlypATHr   r?   r7   r7   r8   rW   D  s   z<CookieTest.get_handlers.<locals>.SetCookieDeprecatedArgs.getNrY   r7   r7   r7   r8   SetCookieDeprecatedArgsC  rZ   r   /set/get/set_domain/special_char/set_overwrite/set_max_age/set_expires_days/set_falsy_flags/set_deprecatedr   )
r@   r   r   r   r   r   r   r   r   r   r7   r7   r8   r<     s&   zCookieTest.get_handlersc                 C   s*   |  d}| t|jdg d d S )Nr   
Set-Cookie)zbytes=zxcv; Path=/zstr=asdf; Path=/zunicode=qwer; Path=/)r   rv   sortedheadersget_listr   r7   r7   r8   test_set_cookieT  s
   
zCookieTest.test_set_cookiec                 C   sd   | j dddid}| |jd | j dddid}| |jd | j dddid}| |jd d S )	Nr   Cookiefoo=barr   rn   z	foo="bar"z/=exception;   defaultr   rv   r   r   r7   r7   r8   test_get_cookie[  s   zCookieTest.test_get_cookiec                 C   s$   |  d}| |jddg d S )Nr   r   z,unicode_args=blah; Domain=foo.com; Path=/foor   rv   r   r   r   r7   r7   r8   test_set_cookie_domaine  s
   

z!CookieTest.test_set_cookie_domainc                 C   s   |  d}t|jd}| t|d | |d d | |d d | |d d	|d  g d
}|D ]\}}td| | j dd|id}| |j	t
| q6d S )Nr   r      r   zequals="a=b"; Path=/ro   zquote="a\"b"; Path=/r|   )zsemicolon="a;b"; Path=/zsemicolon="a\073b"; Path=/))zfoo=a=br   )z	foo="a=b"r   )z	foo="a;b"z"a)z
foo=a\073bza\073b)zfoo="a\073b"r   )z
foo="a\"b"r   z	trying %rr   r   r   )r   r   r   r   rv   lenassertInloggingdebugr   r   )r@   r   r   dataheaderexpectedr7   r7   r8   test_cookie_special_charl  s    
z#CookieTest.test_cookie_special_charc                 C   s.   |  d}|jd}| t|ddg d S )Nr   r   za=e; Path=/zc=d; Domain=example.com; Path=/r   r   r   rv   r   r@   r   r   r7   r7   r8   test_set_cookie_overwrite  s
   
z$CookieTest.test_set_cookie_overwritec                 C   s,   |  d}|jd}| t|dg d S )Nr   r   zfoo=bar; Max-Age=10; Path=/r  r  r7   r7   r8   test_set_cookie_max_age  s   
z"CookieTest.test_set_cookie_max_agec                 C   s   |  d}|jd}| | |d usJ td|}| | |d us'J tjtjj	tj
dd }tj| d }| t||  d d S )Nr   r   z(foo=bar; expires=(?P<expires>.+); Path=/r   daysexpires)r   r   rW   r   r   r   datetimenowtimezoneutc	timedeltaemailutilsparsedate_to_datetime	groupdict
assertLessabstotal_secondsr@   r   r  r   r  header_expiresr7   r7   r8   test_set_cookie_expires_days  s   


z'CookieTest.test_set_cookie_expires_daysc                 C   s^   |  d}t|jd}| |d d | |d d | |d d | |d	 d
 d S )Nr   r   r   za=1; Path=/; Securero   zb=1; Path=/r|   zc=1; HttpOnly; Path=/r  zd=1; Path=/)r   r   r   r   rv   r  r7   r7   r8   test_set_cookie_false_flags  s   
z&CookieTest.test_set_cookie_false_flagsc                 C   sL   t   | d}W d    n1 sw   Y  |jd}| |d d S )Nr   r   za=b; HttpOnly; Path=/foo)r   r   r   rW   rv   )r@   r   r  r7   r7   r8   test_set_cookie_deprecated  s
   z%CookieTest.test_set_cookie_deprecatedN)rG   rH   rI   r<   r   r  r  r  r  r  r$  r%  r&  r7   r7   r7   r8   r     s    C
r   c                   @   s(   e Zd Zdd Zdd Zedd ZdS )AuthRedirectRequestHandlerc                 C   
   || _ d S r0   	login_url)r@   r*  r7   r7   r8   
initialize  r   z%AuthRedirectRequestHandler.initializec                 C      | j S r0   r)  r?   r7   r7   r8   get_login_url  rE   z(AuthRedirectRequestHandler.get_login_urlc                 C   rR   )N  )
send_errorr?   r7   r7   r8   rW        zAuthRedirectRequestHandler.getN)rG   rH   rI   r+  r-  r#   rW   r7   r7   r7   r8   r'    s
    r'  c                   @   rj   )AuthRedirectTestc                 C   s    dt tddfdt tddfgS )N	/relativez/loginr)  	/absolutezhttp://example.com/login)r'  rb   r?   r7   r7   r8   r<     s   zAuthRedirectTest.get_handlersc                 C   s8   | j | ddd}| |jd | |jd d d S )Nr2  Ffollow_redirects.  Locationz/login?next=%2Frelative)r   r   rv   r   r   r   r7   r7   r8   test_relative_auth_redirect  s   z,AuthRedirectTest.test_relative_auth_redirectc                 C   sF   | j | ddd}| |jd | td|jd |jd  d S )Nr3  Fr4  r6  zIhttp://example.com/login\?next=http%3A%2F%2F127.0.0.1%3A[0-9]+%2Fabsoluter7  )r   r   rv   r   r   r   r   r   r   r7   r7   r8   test_absolute_auth_redirect  s   z,AuthRedirectTest.test_absolute_auth_redirectN)rG   rH   rI   r<   r8  r9  r7   r7   r7   r8   r1    s    
r1  c                   @   s*   e Zd Zdd Zejdd Zdd ZdS )ConnectionCloseHandlerc                 C   r(  r0   r   r@   r   r7   r7   r8   r+    r   z!ConnectionCloseHandler.initializec                 c   s    | j   | j j V  d S r0   )r   on_handler_waitingcleanup_eventwaitr?   r7   r7   r8   rW     s   
zConnectionCloseHandler.getc                 C   s   | j   d S r0   )r   on_connection_closer?   r7   r7   r8   r?    rX   z*ConnectionCloseHandler.on_connection_closeN)rG   rH   rI   r+  r   r   rW   r?  r7   r7   r7   r8   r:    s
    
r:  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ConnectionCloseTestc                 C   s   t  | _dtt| dfgS )NrL   r   )r   r=  r:  rb   r?   r7   r7   r8   r<     s   z ConnectionCloseTest.get_handlersc                 C   s`   t  t jt jd}|d|  f t|| _| jd |   | j	
  | jdd  d S )Nr   	127.0.0.1s   GET / HTTP/1.0

c                   S   s
   t dS Nr   )r   sleepr7   r7   r7   r8   <lambda>  s   
 z;ConnectionCloseTest.test_connection_close.<locals>.<lambda>)socketAF_INETSOCK_STREAMconnectget_http_portr   streamrV   r>  r=  setio_looprun_sync)r@   sr7   r7   r8   test_connection_close  s   

z)ConnectionCloseTest.test_connection_closec                 C   s   t d | j  d S )Nzhandler waiting)r	  r
  rK  closer?   r7   r7   r8   r<       
z&ConnectionCloseTest.on_handler_waitingc                 C   s   t d |   d S )Nzconnection closed)r	  r
  stopr?   r7   r7   r8   r?       
z'ConnectionCloseTest.on_connection_closeN)rG   rH   rI   r<   rP  r<  r?  r7   r7   r7   r8   rA    s
    
rA  c                   @   rP   )EchoHandlerc                 G   s   | j jD ]=}t|turtdt| | j j| D ]}t|tur*tdt| q| |D ]}t|tur@tdt| q0q|D ]}t|turTtdt| qD| t	| j j
|t| j jd d S )Nzincorrect type for key: %rzincorrect type for value: %rzincorrect type for path arg: %rr2   	path_argsargs)request	argumentstyper   	Exceptionr   get_argumentsr   rV   rb   r2   r   )r@   rW  keybvaluesvalueargr7   r7   r8   rW     s.   
zEchoHandler.getNrY   r7   r7   r7   r8   rU    rZ   rU  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )RequestEncodingTestc                 C   s   dt fdt fgS )Nz/group/(.*)z/slashes/([^/]*)/([^/]*))rU  r?   r7   r7   r8   r<        z RequestEncodingTest.get_handlersc                 C   s   t | |jS r0   )r   r   r   r   r7   r7   r8   
fetch_json  rc  zRequestEncodingTest.fetch_jsonc                 C   sF   |  | dtddgi d |  | dtddgddgid d S )Nz
/group/%3F?rV  z/group/%3F?%3F=%3Frv   rd  rb   r?   r7   r7   r8   test_group_question_mark   s   z,RequestEncodingTest.test_group_question_markc                 C   s&   |  | dddgddgid d S )Nz/group/%C3%A9?arg=%C3%A9z/group/%C3%A9   éra  rV  rv   rd  r?   r7   r7   r8   test_group_encoding+  s   z'RequestEncodingTest.test_group_encodingc                 C   sD   |  | dtdddgi d |  | dtdddgi d d S )Nz/slashes/foo/barrm   r   rV  z/slashes/a%2Fb/c%2Fdza/bzc/drf  r?   r7   r7   r8   test_slashes6  s   z RequestEncodingTest.test_slashesc                 C   :   t td | d W d    d S 1 sw   Y  d S )Nz.*Invalid unicodez/group/?arg=%25%e9)r   r   r   r?   r7   r7   r8   
test_errorB     "zRequestEncodingTest.test_errorN)	rG   rH   rI   r<   rd  rg  rj  rk  rm  r7   r7   r7   r8   rb    s    rb  c                   @   r@  )
TypeCheckHandlerc                 C   s  i | _ | d|  t | d| dt | dt| j d t	 | dt| j
 d jt	 t| j dgkrFtd| j  | d	| dt | d
| dt	 | d| jt | d|  t	 | d| ddt	 | d|  t	 d S )Nstatusargumentrm   
cookie_keyr   cookie_valuer   z%unexpected values for cookie keys: %rrw   rf   
xsrf_tokenxsrf_form_htmlreverse_url	typecheckrequest_summary)errors
check_type
get_statusintget_argumentr   listcookieskeysr   valuesrg   r\  rw   r   rf   rt  ru  rv  _request_summaryr?   r7   r7   r8   prepareJ  s   zTypeCheckHandler.preparec                 C      |  d|t | | j d S Npath_componentrz  r   rV   ry  r@   r  r7   r7   r8   rW   e  s   zTypeCheckHandler.getc                 C   r  r  r  r  r7   r7   r8   r   k  s   zTypeCheckHandler.postc                 C   s.   t |}||krd| d| | j|< d S d S )Nz	expected z, got )r[  ry  )r@   re   objexpected_typeactual_typer7   r7   r8   rz  o  s   zTypeCheckHandler.check_typeN)rG   rH   rI   r  rW   r   rz  r7   r7   r7   r8   ro  I  s
    ro  c                   @   s   e Zd ZdddZdd ZdS )DecodeArgHandlerNc                 C   sF   t |turtdt | d| jjv r!|t| jjd d S |S )Nzunexpected type for value: %rencodingr   )r[  r   r\  rY  rZ  decoder   )r@   rg   re   r7   r7   r8   decode_argumentv  s
   z DecodeArgHandler.decode_argumentc                 C   s*   dd }|  |||| dd d S )Nc                 S   s:   t | tu rdtt| gS t | tu rd| gS td)Nr   r   zunknown type)r[  r   r   r   b2a_hexr   r\  )rO  r7   r7   r8   describe  s
   z&DecodeArgHandler.get.<locals>.describerm   r2   query)rV   r}  )r@   ra  r  r7   r7   r8   rW     s   "zDecodeArgHandler.getr0   )rG   rH   rI   r  rW   r7   r7   r7   r8   r  u  s    
	r  c                   @   rP   )LinkifyHandlerc                 C   s   | j ddd d S )Nlinkify.htmlzhttp://example.com)messager   r?   r7   r7   r8   rW        zLinkifyHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )UIModuleResourceHandlerc                 C   s   | j dddgd d S )N	page.htmlro   r|   )entriesr  r?   r7   r7   r8   rW        zUIModuleResourceHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )OptionalPathHandlerc                 C   s   |  d|i d S )Nr2   rU   r   r7   r7   r8   rW     r  zOptionalPathHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )MultiHeaderHandlerc                 C   s4   |  dd |  dd | dd | dd d S )	Nx-overwriter   zX-Overwriter|   x-multir  zX-Multi4)
set_header
add_headerr?   r7   r7   r8   rW     s   zMultiHeaderHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )r   c                 C   sd   |  dd d ur| jdtt|  dd d S |  dd d ur.| jdt|  dd d S td)N	permanentrL   )r  rp  )rp  z(didn't get permanent or status arguments)r}  redirectboolr|  r\  r?   r7   r7   r8   rW     s
    zRedirectHandler.getNrY   r7   r7   r7   r8   r     rZ   r   c                   @      e Zd Zejdd ZdS )EmptyFlushCallbackHandlerc                 c   sB    |   V  |   V  | d |   V  |   V  | d d S )Nok)r   rV   r   r?   r7   r7   r8   rW     s   




zEmptyFlushCallbackHandler.getN)rG   rH   rI   r   r   rW   r7   r7   r7   r8   r        r  c                   @   rP   )HeaderInjectionHandlerc              
   C   sV   z
|  dd td ty* } zdt|v r| d n W Y d }~d S d }~ww )NX-Foozfoo
X-Bar: bazDidn't get expected exceptionUnsafe header value   ok)r  r\  
ValueErrorr   r   r@   r   r7   r7   r8   rW     s   zHeaderInjectionHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )SetHeaderHandlerc                 C   s   dd t ddD }|td |d |D ])}z| dd| d	  td
 tyA } zdt|vr7 W Y d }~qd }~ww | dd | d d S )Nc                 S   s   g | ]}t |qS r7   )chr).0r  r7   r7   r8   
<listcomp>      z(SetHeaderHandler.get.<locals>.<listcomp>r          	r  rm   r   r  r   r  )	rangeappendr  remover  r\  r  r   r   )r@   illegal_charscharr   r7   r7   r8   rW     s   
zSetHeaderHandler.getNrY   r7   r7   r7   r8   r    rZ   r  c                   @   rP   )GetArgumentHandlerc                 C   sJ   |  dd dkr| j}n|  dd dkr| j}n| j }| |dd d S )Nsourcer  r   rm   r   )r}  get_query_argumentget_body_argumentr   r@   r   r7   r7   r8   r    s   zGetArgumentHandler.prepareNrG   rH   rI   r  r7   r7   r7   r8   r    rZ   r  c                   @   rP   )GetArgumentsHandlerc                 C   s*   |  t| d| d| dd d S )Nrm   r   r  r   )r   rb   r]  get_query_argumentsget_body_argumentsr?   r7   r7   r8   r    s   zGetArgumentsHandler.prepareNr  r7   r7   r7   r8   r    rZ   r  c                       s   e Zd ZdZdd Z fddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z  ZS ).WSGISafeWebTestzWebTest.COOKIE_SECRETc                 C   s    t dddd}t|d| jdS )Nz{% module linkify(message) %}zv<html><head></head><body>
{% for e in entries %}
{% module Template("entry.html", entry=e) %}
{% end %}
</body></html>aY  {{ set_resources(embedded_css=".entry { margin-bottom: 1em; }",
                 embedded_javascript="js_embed()",
                 css_files=["/base.css", "/foo.css"],
                 javascript_files="/common.js",
                 html_head="<meta>",
                 html_body='<script src="/analytics.js"/>') }}
<div class="entry">...</div>)r  r  z
entry.htmlxhtml_escape)template_loader
autoescaper]   )r   rb   COOKIE_SECRET)r@   loaderr7   r7   r8   r=     s   zWSGISafeWebTest.get_app_kwargsc                       t    tj  d S r0   supertearDownr   _template_loadersclearr?   	__class__r7   r8   r    rR  zWSGISafeWebTest.tearDownc                 C   s   t dtddt dtddt dtt dtt dtt d	tt d
tt dtt dtddit dtdddt dtddit dt	t dt
t dtt dtg}|S )Nz/typecheck/(.*)rw  )re   z/decode_arg/(.*)
decode_argz/decode_arg_kw/(?P<arg>.*)/linkify/uimodule_resourcesz/optional_path/(.+)?/multi_headerz	/redirect/web_redirect_permanentr$   /web_redirect_newpath/web_redirectF)r$   r  //web_redirect_double_slash/header_injection/get_argumentz/get_arguments/set_header)r$   ro  r  r  r  r  r  r   WebRedirectHandlerr  r  r  r  )r@   urlsr7   r7   r8   r<     s:   zWSGISafeWebTest.get_handlersc                 O   s"   | j |i |}|  t|jS r0   )r   rethrowr   r   )r@   rX  kwargsr   r7   r7   r8   rd  1  s   
zWSGISafeWebTest.fetch_jsonc                 C   s\   t t| jdd}| jddd| id}t|j}| |i  | jdddd| idd	}d S )
Nr   r   z/typecheck/asdf?foo=barr   zasdf=r   r   r   r   r   r   )r   r&   r  r   r   r   rv   )r@   rs  r   r  r7   r7   r8   
test_types6  s   


zWSGISafeWebTest.test_typesc                 C   s   g d}|D ]}|  |}|  t|j}| |ddgddgd q|  d}|  t|j}| |ddgddgd d S )N)z,/decode_arg/%C3%A9?foo=%C3%A9&encoding=utf-8z'/decode_arg/%E9?foo=%E9&encoding=latin1z*/decode_arg_kw/%E9?foo=%E9&encoding=latin1r   rh  r  z/decode_arg/%C3%A9?foo=%C3%A9r   c3a9r   r  r   r   rv   r@   r  req_urlr   r  r7   r7   r8   test_decode_argumentG  s   



z$WSGISafeWebTest.test_decode_argumentc                 C   s`   t td! | d}| |jd | d}| |jd W d    d S 1 s)w   Y  d S )Nz.*Invalid unicode.*z/typecheck/invalid%FFi  z/typecheck/invalid?foo=%FFr   r   r   rv   r   r   r7   r7   r8   $test_decode_argument_invalid_unicode\  s   

"z4WSGISafeWebTest.test_decode_argument_invalid_unicodec                 C   sL   ddg}|D ]}|  |}|  t|j}| |ddgddgd qd S )Nz6/decode_arg/1%20%2B%201?foo=1%20%2B%201&encoding=utf-8z0/decode_arg/1%20+%201?foo=1+%2B+1&encoding=utf-8r   1 + 1r  r  r  r7   r7   r8   test_decode_argument_plusd  s   

z)WSGISafeWebTest.test_decode_argument_plusc                 C   sr   |  | jddd |  | jddd |  | jddd |  | jddd	 |  | jdd
d d S )Nr  rm   z/decode_arg/foo*   z/decode_arg/42r   z/decode_arg/%E9rh  z/decode_arg/%C3%A9r  z/decode_arg/1%20%2B%201)rv   r>   rv  r?   r7   r7   r8   test_reverse_urls  s   z WSGISafeWebTest.test_reverse_urlc                 C      |  d}| |jd d S )Nr  s3   <a href="http://example.com">http://example.com</a>r  r   r7   r7   r8   test_uimodule_unescaped~  s   
z'WSGISafeWebTest.test_uimodule_unescapedc                 C   r  )Nr  s  <html><head><link href="/base.css" type="text/css" rel="stylesheet"/><link href="/foo.css" type="text/css" rel="stylesheet"/>
<style type="text/css">
.entry { margin-bottom: 1em; }
</style>
<meta>
</head><body>


<div class="entry">...</div>


<div class="entry">...</div>

<script src="/common.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
js_embed()
//]]>
</script>
<script src="/analytics.js"/>
</body></html>r  r   r7   r7   r8   test_uimodule_resources  
   
z'WSGISafeWebTest.test_uimodule_resourcesc                 C   s0   |  | dddi |  | ddd i d S )Nz/optional_path/foor2   rm   z/optional_path/ri  r?   r7   r7   r8   test_optional_path     z"WSGISafeWebTest.test_optional_pathc                 C   s8   |  d}| |jd d | |jdddg d S )Nr  r  2r  3r  r  r   r7   r7   r8   test_multi_header  s   
z!WSGISafeWebTest.test_multi_headerc                 C   sX   | j ddd}| |jd | j ddd}| |jd | j ddd}| |jd d S )	Nz/redirect?permanent=1Fr4  -  z/redirect?permanent=0r6  z/redirect?status=307i3  r   rv   r   r   r7   r7   r8   test_redirect  s   zWSGISafeWebTest.test_redirectc                 C   s`   | j ddd}| |jd | |jd d | j ddd}| |jd | |jd d d S )	Nr  Fr4  r  r7  r  r  r6  r   rv   r   r   r   r7   r7   r8   test_web_redirect  s   z!WSGISafeWebTest.test_web_redirectc                 C   2   | j ddd}| |jd | |jd d d S )Nr  Fr4  r  r7  r  r  r   r7   r7   r8   test_web_redirect_double_slash     z.WSGISafeWebTest.test_web_redirect_double_slashc                 C   r  )Nr  r  r  r   r7   r7   r8   test_header_injection     
z%WSGISafeWebTest.test_header_injectionc                 C   r  )Nr  r  r  r   r7   r7   r8   test_set_header  r  zWSGISafeWebTest.test_set_headerc                 C   s   |  d}| |jd |  d}| |jd |  d}| |jd tjtdd}| j dd	|d
}| |jd | j dd	|d
}| t|jtddgdgdgd d S )Nz/get_argument?foo=barrn   z/get_argument?foo=r   r  r  rT   rm   r   r      helloz/get_arguments?foo=barr   r  )r   rv   r   urllibparse	urlencoderb   r   )r@   r   r   r7   r7   r8   test_get_argument  s   


z!WSGISafeWebTest.test_get_argumentc                 C   sp   t jtdd}| jdd|d}| |jd | jdd|d}| |jd | jd	d|d}| |jd
 d S )NrT   r	  z"/get_argument?source=query&foo=barr   r   rn   z/get_argument?source=query&foo=r   z/get_argument?source=queryr  r  r  r  rb   r   rv   r   r@   r   r   r7   r7   r8   test_get_query_arguments  s   z(WSGISafeWebTest.test_get_query_argumentsc                 C   s   t jtdd}| jdd|d}| |jd t jtdd}| jdd|d}| |jd t jt }| jdd|d}| |jd	 d S )
Nr   r	  z#/get_argument?source=body&foo=hellor   r   rn   r  r   r  r  r  r7   r7   r8   test_get_body_arguments  s   z'WSGISafeWebTest.test_get_body_argumentsc                 C   s:   |  d}| d|jdd | d|jdd d S )Nr  Accept-EncodingVaryr  gzipContent-Encoding)r   assertNotInr   rW   r   r7   r7   r8   test_no_gzip  s   
zWSGISafeWebTest.test_no_gzip)rG   rH   rI   r  r=   r  r<   rd  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  __classcell__r7   r7   r  r8   r    s0     r  c                   @      e Zd Zdd Zdd ZdS )NonWSGIWebTestsc                 C   
   dt fgS )N/empty_flush)r  r?   r7   r7   r8   r<     r   zNonWSGIWebTests.get_handlersc                 C   r  )Nr  r  r  r   r7   r7   r8   test_empty_flush  r  z NonWSGIWebTests.test_empty_flushN)rG   rH   rI   r<   r  r7   r7   r7   r8   r        r  c                   @   r@  )
ErrorResponseTestc                 C   sL   G dd dt }G dd dt }G dd dt }td|td|td	|gS )
Nc                   @   rP   )z6ErrorResponseTest.get_handlers.<locals>.DefaultHandlerc                 S   s*   |  dd rtt|  ddd  d S Nrp  ro   r   )r}  r    r|  r?   r7   r7   r8   rW     s   z:ErrorResponseTest.get_handlers.<locals>.DefaultHandler.getNrY   r7   r7   r7   r8   DefaultHandler  rZ   r"  c                   @   r  )z9ErrorResponseTest.get_handlers.<locals>.WriteErrorHandlerc                 S   s0   |  dd r| t|  d d S dd  d S r!  )r}  r/  r|  r?   r7   r7   r8   rW     s   z=ErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.getc                 [   sB   |  dd d|v r| d|d d j  d S | d|  d S )NContent-Type
text/plainexc_infozException: %sr   z
Status: %d)r  rV   rG   r@   status_coder  r7   r7   r8   write_error  s   zEErrorResponseTest.get_handlers.<locals>.WriteErrorHandler.write_errorNrG   rH   rI   rW   r(  r7   r7   r7   r8   WriteErrorHandler  s    r*  c                   @   r  )z?ErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandlerc                 S      dd  d S Nro   r   r7   r?   r7   r7   r8   rW   "  rO   zCErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.getc                 [      t d)Nzexception in write_errorr\  r&  r7   r7   r8   r(  %     zKErrorResponseTest.get_handlers.<locals>.FailedWriteErrorHandler.write_errorNr)  r7   r7   r7   r8   FailedWriteErrorHandler!  r  r0  /default/write_error/failed_write_error)r   r$   )r@   r"  r*  r0  r7   r7   r8   r<     s   zErrorResponseTest.get_handlersc                 C   s   t tdB | d}| |jd | d|j | d}| |jd | d|j | d}| |jd	 | d
|j W d    d S 1 sJw   Y  d S )NUncaught exceptionr1  r.  s   500: Internal Server Errorz/default?status=503  s   503: Service Unavailablez/default?status=435i  s   435: Unknown)r   r   r   rv   r   r  r   r   r7   r7   r8   test_default.  s   


"zErrorResponseTest.test_defaultc                 C   s|   t td/ | d}| |jd | d|j | d}| |jd | d|j W d    d S 1 s7w   Y  d S )Nr4  r2  r.  s   Exception: ZeroDivisionErrorz/write_error?status=503r5  s   Status: 503r   r   r   rv   r   r   r   r7   r7   r8   test_write_error<  s   

"z"ErrorResponseTest.test_write_errorc                 C   sV   t td | d}| |jd | d|j W d    d S 1 s$w   Y  d S )Nr4  r3  r.  r   r7  r   r7   r7   r8   test_failed_write_errorF  s
   
"z)ErrorResponseTest.test_failed_write_errorN)rG   rH   rI   r<   r6  r8  r9  r7   r7   r7   r8   r     s
    "
r   c                   @   sX  e Zd ZdZejejedZ	dd Z
dd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCdD Z*dEdF Z+dGdH Z,e-.ej/dIkdJdKdL Z0dMS )NStaticFileTests   63a36e950e134b5217e33c763e88840c10a07d80e6057d92b9ac97508de7fb1fa6f0e9b7531e169657165ea764e8963399cb6d921ffe6078425aaafe54c04563staticc                 C   sT   G dd dt }G dd d|}G dd dt }d|fd|fd	|fd
ttddfgS )Nc                   @   rP   )z5StaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s(   t | dd}| | j||d d S )Ninclude_versionr   )r<  )r|  r}  rV   
static_url)r@   r2   with_vr7   r7   r8   rW   X  s   z9StaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrY   r7   r7   r7   r8   StaticUrlHandlerW  rZ   r?  c                   @   s   e Zd ZdZdS )z=StaticFileTest.get_handlers.<locals>.AbsoluteStaticUrlHandlerTN)rG   rH   rI   include_hostr7   r7   r7   r8   AbsoluteStaticUrlHandler\  s    rA  c                   @   rP   )z=StaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandlerc           
      S   s   t | d}| | _| |}| j||d}||kr"| tdS | jjd }t|}|	|d|}|	|d|}|rE|dkoC|dk}	n|dkoL|dk}	| t|	 d S )Nr@  )r@  Fz://r   )
r  r}  r@  r=  rV   r   rY  protocolr  find)
r@   r2   
do_includeregular_urloverride_urlrC  protocol_lengthcheck_regularcheck_overrideresultr7   r7   r8   rW   `  s   
zAStaticFileTest.get_handlers.<locals>.OverrideStaticUrlHandler.getNrY   r7   r7   r7   r8   OverrideStaticUrlHandler_  rZ   rL  /static_url/(.*)z/abs_static_url/(.*)z/override_static_url/(.*)z/root_static/(.*)rL   )r2   )r   r   rb   )r@   r?  rA  rL  r7   r7   r8   r<   V  s   zStaticFileTest.get_handlersc                 C   s   t tddS )Nr;  )static_pathrb   r9   r?   r7   r7   r8   r=   {  rX   zStaticFileTest.get_app_kwargsc                 C   sH   |  d}| d|j |  d}| d|j | |jdd d S )N/robots.txt   Disallow: //static/robots.txtr#  r$  )r   r  r   rv   r   rW   r   r7   r7   r8   test_static_files~  s
   

z StaticFileTest.test_static_filesc                 C   s8   |  d}| d|j | d|j | d|j d S )Nz/robots.txt?v=12345rQ  zCache-ControlExpires)r   r  r   r   r   r7   r7   r8   test_static_files_cacheable  s   
z*StaticFileTest.test_static_files_cacheablec                 C   sb   |  d}| |jdd |  d}| |jdd |  d}| |jdddh d S )	Nz/static/sample.xml.gzr#  zapplication/gzipz/static/sample.xml.bz2zapplication/octet-streamz/static/sample.xmlztext/xmlzapplication/xml)r   rv   r   rW   r  r   r7   r7   r8   test_static_compressed_files  s   


z+StaticFileTest.test_static_compressed_filesc                 C   s"   |  d}| |jd| j  d S )Nz/static_url/robots.txts   /static/robots.txt?v=)r   rv   r   robots_txt_hashr   r7   r7   r8   test_static_url  s   
zStaticFileTest.test_static_urlc                 C   s0   |  d}| |jt| dd | j  d S )Nz/abs_static_url/robots.txtrL   s   static/robots.txt?v=)r   rv   r   r   r   rW  r   r7   r7   r8   test_absolute_static_url  s
   
z'StaticFileTest.test_absolute_static_urlc                 C   r  )Nz(/static_url/robots.txt?include_version=0s   /static/robots.txtr  r   r7   r7   r8   test_relative_version_exclusion  r  z.StaticFileTest.test_relative_version_exclusionc                 C   s*   |  d}| |jt| dd  d S )Nz,/abs_static_url/robots.txt?include_version=0rL   static/robots.txt)r   rv   r   r   r   r   r7   r7   r8   test_absolute_version_exclusion  s   
 z.StaticFileTest.test_absolute_version_exclusionc                 C   s   |  d |  d d S )NFT)_trigger_include_host_checkr?   r7   r7   r8   test_include_host_override  rR  z)StaticFileTest.test_include_host_overridec                 C   s0   d}|  |t| }| |jttd d S )Nz//override_static_url/robots.txt?include_host=%sT)r   r|  rv   r   r   r   )r@   r@  r2   r   r7   r7   r8   r]    s   z*StaticFileTest._trigger_include_host_checkc                 O   s   | j |ddi|}| j |ddi|}t }t|j|jD ]}|dr+|| q|D ]}| |j||j|d||j||j|f  q.|S )zPerforms a GET and HEAD request and returns the GET response.

        Fails if any ``Content-*`` headers returned by the two requests
        differ.
        r   HEADGETzContent-z)%s differs between GET (%s) and HEAD (%s))	r   rL  	itertoolschainr   
startswithaddrv   rW   )r@   rX  r  head_responseget_responsecontent_headershr7   r7   r8   get_and_head  s    



zStaticFileTest.get_and_headc                 C   sB   |  d}| j dd|jd id}| |jd | d|j d S )NrR  If-Modified-SinceLast-Modifiedr   0  Content-Length)ri  r   rv   r   r  r@   	response1	response2r7   r7   r8   !test_static_304_if_modified_since  s   
z0StaticFileTest.test_static_304_if_modified_sincec                 C   s4   |  d}| j dd|jd id}| |jd d S )NrR  If-None-MatchEtagr   rl  ri  r   rv   r   rn  r7   r7   r8   test_static_304_if_none_match  s
   
z,StaticFileTest.test_static_304_if_none_matchc                 C   s6   |  d}| j dd|jd dd}| |jd d S )NrR  z
"MISMATCH"rk  )rr  rj  r   r   rt  rn  r7   r7   r8   !test_static_304_etag_modified_bug  s   
z0StaticFileTest.test_static_304_etag_modified_bugc                 C   $   | j dddid}| |jd d S )NrR  rj  z!nv@l!dr   r   ri  rv   r   r   r7   r7   r8   )test_static_304_if_modified_since_invalid  s
   z8StaticFileTest.test_static_304_if_modified_since_invalidc                 C   rw  )NrR  rj  zFri, 01 Jan 1960 00:00:00 GMTr   r   rx  r   r7   r7   r8   'test_static_if_modified_since_pre_epoch  s
   z6StaticFileTest.test_static_if_modified_since_pre_epochc                 C   sf   t td}| jddt|jd id}| |jd | jddt|jd id}| |jd d S )Nr[  rR  rj  ro   r   r   rl  )r1   statr9   ri  r   st_mtimerv   r   )r@   r{  r   r7   r7   r8   'test_static_if_modified_since_time_zone  s   z6StaticFileTest.test_static_if_modified_since_time_zonec                 C   s0   |  d}| t|jdd| j d  d S )NrR  rs     ")ri  rv   r   r   rW   rW  r   r7   r7   r8   test_static_etag  s   
zStaticFileTest.test_static_etagc                 C   s|   | j dddid}| |jd | |jd | t|jdd| j d  | |jd	d
 | |jdd d S )NrR  Rangez	bytes=0-9r      s
   User-agentrs  r~  rm  10Content-Rangezbytes 0-9/26)ri  rv   r   r   r   r   rW   rW  r   r7   r7   r8   test_static_with_range  s   z%StaticFileTest.test_static_with_rangec                 C      | j dddid}| |jd tj| jd}t|dd}| |jt	|
  W d    n1 s4w   Y  | |jd	d
 | |jd d S )NrR  r  zbytes=0-r   r   
robots.txtutf-8r  rm  26r  ri  rv   r   r1   r2   r3   
static_diropenr   r   readr   rW   r   r@   r   robots_file_pathfr7   r7   r8    test_static_with_range_full_file  s   z/StaticFileTest.test_static_with_range_full_filec                 C   r  )NrR  r  zbytes=0-10000000r   r   r  r  r  rm  r  r  r  r  r7   r7   r8   $test_static_with_range_full_past_end*     z3StaticFileTest.test_static_with_range_full_past_endc                 C   s   | j dddid}| |jd tj| jd}t|dd}| |jt	|
 d	d   W d    n1 s8w   Y  | |jd
d | |jdd d S )NrR  r  zbytes=1-10000000r   r  r  r  r  ro   rm  25r  zbytes 1-25/26)ri  rv   r   r1   r2   r3   r  r  r   r   r  r   rW   r  r7   r7   r8   'test_static_with_range_partial_past_end5  s    z6StaticFileTest.test_static_with_range_partial_past_endc                 C   L   | j dddid}| |jd | |jdd | |jdd	 d S )
NrR  r  z	bytes=22-r      : /
rm  r  r  bytes 22-25/26ri  rv   r   r   rW   r   r7   r7   r8   test_static_with_range_end_edge@     z.StaticFileTest.test_static_with_range_end_edgec                 C   r  )
NrR  r  zbytes=-4r   r  rm  r  r  r  r  r   r7   r7   r8   test_static_with_range_neg_endH  r  z-StaticFileTest.test_static_with_range_neg_endc                 C   r  )NrR  r  zbytes=-1000000r   r   r  r  r  rm  r  r  r  r  r7   r7   r8   %test_static_with_range_neg_past_startP  r  z4StaticFileTest.test_static_with_range_neg_past_startc                 C   rw  )NrR  r  r   r   r   rx  r   r7   r7   r8   test_static_invalid_range[  s   z(StaticFileTest.test_static_invalid_rangec                 C   s8   | j dddid}| |jdd | |jd d S )NrR  r  zbytes=-0r   r  
bytes */26  )ri  rv   r   rW   r   r   r7   r7   r8   +test_static_unsatisfiable_range_zero_suffix_  s
   z:StaticFileTest.test_static_unsatisfiable_range_zero_suffixc                 C   8   | j dddid}| |jd | |jdd d S )NrR  r  zbytes=26r   r  r  r  ri  rv   r   r   rW   r   r7   r7   r8   -test_static_unsatisfiable_range_invalid_startf  
   z<StaticFileTest.test_static_unsatisfiable_range_invalid_startc                 C   r  )NrR  r  z
bytes=10-3r   r  r  r  r  r   r7   r7   r8   3test_static_unsatisfiable_range_end_less_than_startm  r  zBStaticFileTest.test_static_unsatisfiable_range_end_less_than_startc                 C   s`   | j ddd}| |jd | |jd | |jd d | t|jd d	| j d	  d S )
NrR  r_  r   r   r   rm  r  rs  r~  r   rv   r   r   r   r   rW  r   r7   r7   r8   test_static_headt  s   zStaticFileTest.test_static_headc                 C   sf   | j ddddid}| |jd | |jd | |jd d	 | t|jd
 d| j d  d S )NrR  r_  r  	bytes=1-4)r   r   r  r   rm  r  rs  r~  r  r   r7   r7   r8   test_static_head_range~  s   
z%StaticFileTest.test_static_head_rangec                 C   sl   | j ddd| j d dd}| |jd | |jd | d|j | t|jd	 d| j d  d S )
NrR  r  r~  )r  rr  r   rl  r   rm  rs  )ri  rW  rv   r   r   r  r   r   r   r7   r7   r8   test_static_range_if_none_match  s   z.StaticFileTest.test_static_range_if_none_matchc                 C   r  )Nz/static/blarg  rx  r   r7   r7   r8   test_static_404  r  zStaticFileTest.test_static_404c                 C   sX   | j   t | _ ttd | d}W d    n1 sw   Y  | |jd d S )Nz.*not in root static directoryz/static/../static_foo.txt  )http_clientrQ  r   r   r   ri  rv   r   r   r7   r7   r8   test_path_traversal_protection  s   
z-StaticFileTest.test_path_traversal_protectionposixznon-posix OSc                 C   sF   t jt jt jtd}| dtj	| }| 
|jd d S )Nr[  z/root_staticr   )r1   r2   r3   r4   abspathr5   ri  r  r  r   rv   r   )r@   r2   r   r7   r7   r8   test_root_static_path  s
   z$StaticFileTest.test_root_static_pathN)1rG   rH   rI   rW  r1   r2   r3   r4   r5   r  r<   r=   rS  rU  rV  rX  rY  rZ  r\  r^  r]  ri  rq  ru  rv  ry  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  unittestskipIfre   r  r7   r7   r7   r8   r:  M  sR    %		

r:  c                   @   r@  )
StaticDefaultFilenameTestc                 C      t tdt dddS Nr;  
index.htmldefault_filename)rN  static_handler_argsrO  r?   r7   r7   r8   r=        z(StaticDefaultFilenameTest.get_app_kwargsc                 C      g S r0   r7   r?   r7   r7   r8   r<     rF   z&StaticDefaultFilenameTest.get_handlersc                 C   s.   | j ddd}| |jd | d|j d S )N/static/dir/Fr4  r   s   this is the index
r   rv   r   r   r   r7   r7   r8   test_static_default_filename  s   z6StaticDefaultFilenameTest.test_static_default_filenamec                 C   s6   | j ddd}| |jd | |jd d d S )N/static/dirFr4  r  r7  r  )r   rv   r   r   r   endswithr   r7   r7   r8   test_static_default_redirect  s   z6StaticDefaultFilenameTest.test_static_default_redirectN)rG   rH   rI   r=   r<   r  r  r7   r7   r7   r8   r    s
    r  c                   @   r@  )
StaticDefaultFilenameRootTestc                 C   s    t tjtdt ddddS )Nr;  r  r  rL   )rN  r  static_url_prefix)rb   r1   r2   r  r9   r?   r7   r7   r8   r=     s
   z,StaticDefaultFilenameRootTest.get_app_kwargsc                 C   r  r0   r7   r?   r7   r7   r8   r<     rF   z*StaticDefaultFilenameRootTest.get_handlersc                 C      t  S r0   r   r?   r7   r7   r8   get_http_client  s   z-StaticDefaultFilenameRootTest.get_http_clientc                 C   s   t jt}t j|\}}t jdkr| || n|}ttd | j	d| ddd}W d    n1 s7w   Y  | |j
d d S )Nr  z/.*cannot redirect path with two initial slashesz//evil.com/../r  Fr4  r  )r1   r2   r4   r5   
splitdrivere   rv   r   r   r   r   )r@   test_dirdrivetailr   r7   r7   r8   test_no_open_redirect  s   

z3StaticDefaultFilenameRootTest.test_no_open_redirectN)rG   rH   rI   r=   r<   r  r  r7   r7   r7   r8   r    s
    r  c                   @   rj   )StaticFileWithPathTestc                 C   r  r  rO  r?   r7   r7   r8   r=     r  z%StaticFileWithPathTest.get_app_kwargsc                 C   s   dt dtdifgS )Nz	/foo/(.*)r2   z
templates/)r   r9   r?   r7   r7   r8   r<     r   z#StaticFileWithPathTest.get_handlersc                 C   r  )Nz/foo/utf8.htmls   Héllo
r  r   r7   r7   r8   
test_serve  r  z!StaticFileWithPathTest.test_serveN)rG   rH   rI   r=   r<   r  r7   r7   r7   r8   r    s    r  c                   @   r@  )
CustomStaticFileTestc                 C   s0   G dd dt }G dd dt}|| _d|fgS )Nc                   @   s^   e Zd Zedd Zdd Zedd Zdd Zedd
dZdd Z	dd Z
edd Zd	S )z>CustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandlerc                 S   s@   |  ||}|d}|d | }||d d  }d|||S )N.ro   z/static/{}.{}.{})get_versionrindexformat)clsr^   r2   version_hashextension_indexbefore_versionafter_versionr7   r7   r8   make_static_url  s   
zNCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.make_static_urlc                 S   s4   | d}| dd|}|d |  ||d   S )Nr  r   )r  )r@   url_pathr  version_indexr7   r7   r8   parse_url_path  s   
zMCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.parse_url_pathc                 S   s   d| S )NzCustomStaticFileTest:r7   r  r^   r2   r7   r7   r8   get_absolute_path  s   zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_absolute_pathc                 S   s   |S r0   r7   )r@   rootabsolute_pathr7   r7   r8   validate_absolute_path  rF   zUCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.validate_absolute_pathNc                 S   s,   |d u r|d u s
J |dkrdS t d| )NCustomStaticFileTest:foo.txtrn   unexpected path %rr.  )r@   r2   startendr7   r7   r8   get_content  s   zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_contentc                 S   s   | j dkrdS td| j  )Nr  r  r  )r  r\  r?   r7   r7   r8   get_content_size!  s   
zOCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_content_sizec                 S      d S r0   r7   r?   r7   r7   r8   get_modified_time&  rF   zPCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_modified_timec                 S      dS )N42r7   r  r7   r7   r8   r  )     zJCustomStaticFileTest.get_handlers.<locals>.MyStaticFileHandler.get_versionNN)rG   rH   rI   classmethodr  r  r  r  r  r  r  r  r7   r7   r7   r8   MyStaticFileHandler  s    

r  c                   @   rP   )z;CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandlerc                 S   s   |  | | d S r0   )rV   r=  r   r7   r7   r8   rW   .  r   z?CustomStaticFileTest.get_handlers.<locals>.StaticUrlHandler.getNrY   r7   r7   r7   r8   r?  -  rZ   r?  rM  )r   r   static_handler_class)r@   r  r?  r7   r7   r8   r<      s   ,
z!CustomStaticFileTest.get_handlersc                 C   s   t d| jdS )Ndummy)rN  r  )rb   r  r?   r7   r7   r8   r=   5  rX   z#CustomStaticFileTest.get_app_kwargsc                 C   r  )Nz/static/foo.42.txtrn   r  r   r7   r7   r8   r  8  r  zCustomStaticFileTest.test_servec                 C   sL   t tddd | d}| |jd W d    d S 1 sw   Y  d S )NzCould not open static fileF)requiredz/static_url/foo.txts   /static/foo.42.txt)r   r   r   rv   r   r   r7   r7   r8   rX  <  s   
"z$CustomStaticFileTest.test_static_urlN)rG   rH   rI   r<   r=   r  rX  r7   r7   r7   r8   r    s
    5r  c                   @   ,   e Zd ZG dd deZdd Zdd ZdS )HostMatchingTestc                   @   r  )zHostMatchingTest.Handlerc                 C   r(  r0   )reply)r@   r  r7   r7   r8   r+  D  r   z#HostMatchingTest.Handler.initializec                 C      |  | j d S r0   )rV   r  r?   r7   r7   r8   rW   G  rc  zHostMatchingTest.Handler.getN)rG   rH   rI   r+  rW   r7   r7   r7   r8   rN   C  r  rN   c                 C   s   dt jddifgS )Nr   r  wildcard)r  rN   r?   r7   r7   r8   r<   J  r  zHostMatchingTest.get_handlersc                 C   s<  | j ddtjddifg | j ddtjddifg | j ddtjdd	ifg | j d
dtjddifg | d}| |jd | d}| |jd | d}| |jd | jdddid}| |jd | jdddid}| |jd | jdddid}| |jd | jdddid}| |jd d S )Nwww.example.comr   r  [0]www\.example\.com/bar[1]/baz[2]zwww.e.*e.comz[3]s   wildcardr  Hostr      [0]   [1]   [2]zwww.exe.coms   [3])r>   add_handlersr  rN   r   rv   r   r   r   r7   r7   r8   test_host_matchingM  s4   


z#HostMatchingTest.test_host_matchingN)rG   rH   rI   r   rN   r<   r  r7   r7   r7   r8   r  B  s    r  c                   @   rj   )DefaultHostMatchingTestc                 C   r  r0   r7   r?   r7   r7   r8   r<   m  rF   z$DefaultHostMatchingTest.get_handlersc                 C   s   ddiS )Ndefault_hostr  r7   r?   r7   r7   r8   r=   p  r/  z&DefaultHostMatchingTest.get_app_kwargsc                 C   s   | j ddtjddifg | j ddtjddifg | j dd	tjdd
ifg | d}| |jd | d}| |jd | d	}| |jd | jdddid}| |jd d| j _| d	}| |jd d S )Nr  r   r  r  r  r  r  zwww.test.comr  r   r  r  r  z	X-Real-IprB  r   r  )	r>   r  r  rN   r   rv   r   r   r  r   r7   r7   r8   test_default_host_matchings  s(   



z2DefaultHostMatchingTest.test_default_host_matchingN)rG   rH   rI   r<   r=   r	  r7   r7   r7   r8   r  l  s    r  c                   @   r  )NamedURLSpecGroupsTestc                 C   s    G dd dt }d|fd|fgS )Nc                   @   rP   )z8NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandlerc                 S      |  | d S r0   rU   r   r7   r7   r8   rW     rX   z<NamedURLSpecGroupsTest.get_handlers.<locals>.EchoHandler.getNrY   r7   r7   r7   r8   rU    rZ   rU  z/str/(?P<path>.*)z/unicode/(?P<path>.*)r   )r@   rU  r7   r7   r8   r<     s   z#NamedURLSpecGroupsTest.get_handlersc                 C   s4   |  d}| |jd |  d}| |jd d S )Nz/str/foos   fooz/unicode/barrn   r  r   r7   r7   r8   test_named_urlspec_groups  s   

z0NamedURLSpecGroupsTest.test_named_urlspec_groupsN)rG   rH   rI   r<   r  r7   r7   r7   r8   r
    s    
r
  c                   @   $   e Zd ZG dd deZdd ZdS )ClearHeaderTestc                   @   rP   )zClearHeaderTest.Handlerc                 C   s0   |  dd |  dd | d | d d S )Nh1rm   h2r   nonexistent)r  clear_headerr?   r7   r7   r8   rW     s   
zClearHeaderTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s.   |  d}| d|j | |jd d d S )NrL   r  r  r   r   r  r   rv   r   r7   r7   r8   test_clear_header  s   
z!ClearHeaderTest.test_clear_headerN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                   @   r  )Header204Testc                   @   rP   )zHeader204Test.Handlerc                 C   s   |  d |   d S )N   )
set_statusr   r?   r7   r7   r8   rW     rT  zHeader204Test.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s8   |  d}| |jd | d|j | d|j d S )NrL   r  rm  Transfer-Encoding)r   rv   r   r  r   r   r7   r7   r8   test_204_headers     
zHeader204Test.test_204_headersN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                   @   r  )Header304Testc                   @   rP   )zHeader304Test.Handlerc                 C   s   |  dd | d d S )NContent-Languageen_USrT   )r  rV   r?   r7   r7   r8   rW     s   zHeader304Test.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s   |  d}| |jd d | |jd d | j dd|jd id}| |jd	 | d|j | d|j | d
|j d S )NrL   rm  5r  r  rr  rs  r   rl  r  )r   rv   r   r   r  rn  r7   r7   r8   test_304_headers  s   
zHeader304Test.test_304_headersN)rG   rH   rI   r   rN   r!  r7   r7   r7   r8   r    r  r  c                   @   r  )StatusReasonTestc                   @   rP   )zStatusReasonTest.Handlerc                 C   s<   | j jdg }| jt| d|rt|d nd d d S )Nreasonr   r   r#  )rY  rZ  rW   r  r|  r}  r   )r@   r#  r7   r7   r8   rW     s
   
zStatusReasonTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   r  r0   r   r?   r7   r7   r8   r       z StatusReasonTest.get_http_clientc                 C   s   |  d}| |jd | |jd |  d}| |jd | |jd |  d}| |jd | |jd |  d	}| |jd | |jd
 d S )Nz
/?code=304rl  zNot Modifiedz/?code=304&reason=FooFooz/?code=682&reason=Bar  Barz
/?code=682Unknown)r   rv   r   r#  r   r7   r7   r8   test_status  s   



zStatusReasonTest.test_statusN)rG   rH   rI   r   rN   r  r*  r7   r7   r7   r8   r"    s    r"  c                   @   r  )DateHeaderTestc                   @   rP   )zDateHeaderTest.Handlerc                 C   rR   rS   rU   r?   r7   r7   r8   rW     rX   zDateHeaderTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   sD   |  d}tj|jd }| |tjtjj	 tj
dd d S )NrL   Dater|   )seconds)r   r  r  r  r   r  r  r  r  r  r  )r@   r   header_dater7   r7   r8   test_date_header  s   

zDateHeaderTest.test_date_headerN)rG   rH   rI   r   rN   r/  r7   r7   r7   r8   r+    s    r+  c                   @   s<   e Zd ZG dd deZdd Zdd Zdd Zd	d
 ZdS )RaiseWithReasonTestc                   @   rP   )zRaiseWithReasonTest.Handlerc                 C   s   t ddd)Nr'  r&  r$  r    r?   r7   r7   r8   rW     rO   zRaiseWithReasonTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   r  r0   r   r?   r7   r7   r8   r     r%  z#RaiseWithReasonTest.get_http_clientc                 C   s8   |  d}| |jd | |jd | d|j d S )NrL   r'  r&  s   682: Foo)r   rv   r   r#  r  r   r   r7   r7   r8   test_raise_with_reason  r  z*RaiseWithReasonTest.test_raise_with_reasonc                 C   s   |  ttdddd d S )Nr'  r&  r$  zHTTP 682: Foorv   r   r    r?   r7   r7   r8   test_httperror_str
  r:   z&RaiseWithReasonTest.test_httperror_strc                 C   s   |  ttdd d S )Nr'  zHTTP 682: Unknownr3  r?   r7   r7   r8    test_httperror_str_from_httputil  s   z4RaiseWithReasonTest.test_httperror_str_from_httputilN)	rG   rH   rI   r   rN   r  r2  r4  r5  r7   r7   r7   r8   r0    s    r0  c                   @   r@  )
ErrorHandlerXSRFTestc                 C   s   dt tddfgS )N/error  r'  )r"   rb   r?   r7   r7   r8   r<     s   z!ErrorHandlerXSRFTest.get_handlersc                 C   r   NT)xsrf_cookiesr   r?   r7   r7   r8   r=     r   z#ErrorHandlerXSRFTest.get_app_kwargsc                 C   "   | j dddd}| |jd d S )Nr7  r   r  r   r8  r  r   r7   r7   r8   test_error_xsrf     z$ErrorHandlerXSRFTest.test_error_xsrfc                 C   r<  )Nz/404r   r  r   r  r  r   r7   r7   r8   test_404_xsrf  r>  z"ErrorHandlerXSRFTest.test_404_xsrfN)rG   rH   rI   r<   r=   r=  r?  r7   r7   r7   r8   r6    s
    r6  c                   @   sT   e Zd ZG dd deZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )GzipTestCasec                   @   rP   )zGzipTestCase.Handlerc                 C   s4   |  dD ]}| d| q| ddtj   d S )Nvaryr  zhello world!)r]  r  rV   r.   
MIN_LENGTH)r@   vr7   r7   r8   rW   &  s   zGzipTestCase.Handler.getNrY   r7   r7   r7   r8   rN   %  rZ   rN   c                 C   s   t dtjtjtddS )NTr;  )r  rN  )rb   r1   r2   r3   r4   r5   r?   r7   r7   r8   r=   ,  s   zGzipTestCase.get_app_kwargsc                 C   s"   |  |jd|jdd d S )Nr  zX-Consumed-Content-Encodingr  )rv   r   rW   r   r7   r7   r8   assert_compressed1  s   zGzipTestCase.assert_compressedc                 C   *   |  d}| | | |jd d d S )NrL   r  r  r   rE  rv   r   r   r7   r7   r8   	test_gzip;  s   

zGzipTestCase.test_gzipc                 C   rF  )NrP  r  r  rG  r   r7   r7   r8   test_gzip_static@  s   

zGzipTestCase.test_gzip_staticc                 C   s2   | j ddd}| d|j | |jd d d S )NrL   F)use_gzipr  r  r  r  r   r7   r7   r8   test_gzip_not_requestedG  r  z$GzipTestCase.test_gzip_not_requestedc                 C   s>   |  d}| | | dd |jd dD ddg d S )Nz/?vary=Accept-Languagec                 S      g | ]}|  qS r7   stripr  rO  r7   r7   r8   r  P  r  z:GzipTestCase.test_vary_already_present.<locals>.<listcomp>r  ,Accept-Languager  r   rE  rv   r   splitr   r7   r7   r8   test_vary_already_presentL  s   

z&GzipTestCase.test_vary_already_presentc                 C   s>   |  d}| | | dd |jd dD g d d S )Nz"/?vary=Accept-Language&vary=Cookiec                 S   rL  r7   rM  rO  r7   r7   r8   r  Y  r  zCGzipTestCase.test_vary_already_present_multiple.<locals>.<listcomp>r  rP  )rQ  r   r  rR  r   r7   r7   r8   "test_vary_already_present_multipleT  s   

z/GzipTestCase.test_vary_already_present_multipleN)rG   rH   rI   r   rN   r=   rE  rH  rI  rK  rT  rU  r7   r7   r7   r8   r@  $  s    
r@  c                   @   4   e Zd ZG dd deZdd Zdd Zdd Zd	S )
PathArgsInPrepareTestc                   @   r  )zPathArgsInPrepareTest.Handlerc                 C   s   |  t| j| jd d S )NrX  r  )rV   rb   rW  path_kwargsr?   r7   r7   r8   r  `  s   z%PathArgsInPrepareTest.Handler.preparec                 C   s   |dksJ |    d S )Nrm   r   r   r7   r7   r8   rW   c  s   z!PathArgsInPrepareTest.Handler.getNrG   rH   rI   r  rW   r7   r7   r7   r8   rN   _  r  rN   c                 C   s   d| j fd| j fgS )Nz	/pos/(.*)z/kw/(?P<path>.*)rM   r?   r7   r7   r8   r<   g  r   z"PathArgsInPrepareTest.get_handlersc                 C   s4   |  d}|  t|j}| |dgi d d S )Nz/pos/foorm   rX  r  r@   r   r  r7   r7   r8   test_posj  s   

zPathArgsInPrepareTest.test_posc                 C   s6   |  d}|  t|j}| |g ddid d S )Nz/kw/foor2   rm   rX  r  r\  r7   r7   r8   test_kwp  s   

zPathArgsInPrepareTest.test_kwN)rG   rH   rI   r   rN   r<   r]  r^  r7   r7   r7   r8   rW  ^  s
    rW  c                   @   r  )ClearAllCookiesTestc                   @   rP   )zClearAllCookiesTest.Handlerc                 C   s   |    | d d S Nok)clear_all_cookiesrV   r?   r7   r7   r8   rW   y  s   zClearAllCookiesTest.Handler.getNrY   r7   r7   r7   r8   rN   x  rZ   rN   c                 C   sN   | j dddid}t|jd}| |d d | |d d	 d S )
NrL   r   zfoo=bar; baz=xyzzyr   r   r   zbaz="";ro   zfoo="";)r   r   r   r   r   rc  )r@   r   set_cookiesr7   r7   r8   test_clear_all_cookies}  s   z*ClearAllCookiesTest.test_clear_all_cookiesN)rG   rH   rI   r   rN   rd  r7   r7   r7   r8   r_  w  r  r_  c                   @      e Zd ZdS )PermissionErrorNrG   rH   rI   r7   r7   r7   r8   rf        rf  c                   @   rV  )
ExceptionHandlerTestc                   @   rj   )zExceptionHandlerTest.Handlerc                 C   sD   |  d}|dkrtdd|dkrdd  d S |dkr td	d S )
Nexchttp  zno longer herezeroro   r   
permissionznot allowed)r}  r    rf  )r@   rj  r7   r7   r8   rW     s   

z ExceptionHandlerTest.Handler.getc                 K   sP   d|v r|d \}}}t |tr| d | d d S tj| |fi | d S )Nr%  r  rf  )
isinstancerf  r  rV   r   r(  )r@   r'  r  typrg   tbr7   r7   r8   r(    s   


z(ExceptionHandlerTest.Handler.write_errorc                 C   s4   t |trtd|jd  d S t| ||| d S )Nz&custom logging for PermissionError: %sr   )ro  rf  r   warningrX  r   log_exceptionr@   rp  rg   rq  r7   r7   r8   rs    s   
z*ExceptionHandlerTest.Handler.log_exceptionN)rG   rH   rI   rW   r(  rs  r7   r7   r7   r8   rN     s    		rN   c                 C   H   t td | d}| |jd W d    d S 1 sw   Y  d S )Nz.*no longer herez
/?exc=httprl  r  r   r7   r7   r8   test_http_error     
"z$ExceptionHandlerTest.test_http_errorc                 C   ru  )Nr4  z
/?exc=zeror.  r   r   r   rv   r   r   r7   r7   r8   test_unknown_error  s   
"z'ExceptionHandlerTest.test_unknown_errorc                 C   ru  )Nz/custom logging for PermissionError: not allowedz/?exc=permissionr  rx  r   r7   r7   r8   test_known_error  rw  z%ExceptionHandlerTest.test_known_errorN)rG   rH   rI   r   rN   rv  ry  rz  r7   r7   r7   r8   ri    s
    ri  c                   @   r  )BuggyLoggingTestc                   @   r  )zBuggyLoggingTest.Handlerc                 C   r+  r,  r7   r?   r7   r7   r8   rW     rO   zBuggyLoggingTest.Handler.getc                 C   r+  r,  r7   rt  r7   r7   r8   rs    rO   z&BuggyLoggingTest.Handler.log_exceptionN)rG   rH   rI   rW   rs  r7   r7   r7   r8   rN     r  rN   c                 C   rl  )Nz.*rL   )r   r   r   r?   r7   r7   r8   test_buggy_log_exception  rn  z)BuggyLoggingTest.test_buggy_log_exceptionN)rG   rH   rI   r   rN   r|  r7   r7   r7   r8   r{    r  r{  c                       s@   e Zd ZdZG dd deZdd Z fddZdd	 Z  Z	S )
UIMethodUIModuleTestz`Test that UI methods and modules are created correctly and
    associated with the handler.
    c                   @   r  )zUIMethodUIModuleTest.Handlerc                 C   rR   r   r  r?   r7   r7   r8   rW     rX   z UIMethodUIModuleTest.Handler.getc                 C   s
   |  dS )Nrg   )r}  r?   r7   r7   r8   rg     r   z"UIMethodUIModuleTest.Handler.valueN)rG   rH   rI   rW   rg   r7   r7   r7   r8   rN     r  rN   c                 C   s:   dd }G dd dt }tddi}t|d|id|idS )	Nc                 S   s   d| d|    dS )NzIn my_ui_method(z) with handler value r  )rg   )ry   xr7   r7   r8   my_ui_method  r  z9UIMethodUIModuleTest.get_app_kwargs.<locals>.my_ui_methodc                   @   rP   )z5UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModulec                 S   s   d |ttj| j S )Nz&In MyModule({}) with handler value {}.)r  typingcastr}  rN   ry   rg   )r@   r~  r7   r7   r8   r     s   z<UIMethodUIModuleTest.get_app_kwargs.<locals>.MyModule.renderNrG   rH   rI   r   r7   r7   r7   r8   MyModule  rZ   r  r   z1{{ my_ui_method(42) }} {% module MyModule(123) %}r  )r  
ui_methods
ui_modulesr)   r   rb   )r@   r  r  r  r7   r7   r8   r=     s   z#UIMethodUIModuleTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r    s   
zUIMethodUIModuleTest.tearDownc                 C   r  )Nz/?value=asdfsV   In my_ui_method(42) with handler value asdf. In MyModule(123) with handler value asdf.r  r   r7   r7   r8   test_ui_method  r  z#UIMethodUIModuleTest.test_ui_method)
rG   rH   rI   rJ   r   rN   r=   r  r  r  r7   r7   r  r8   r}    s    r}  c                   @   r  )GetArgumentErrorTestc                   @   rP   )zGetArgumentErrorTest.Handlerc              
   C   sV   z|  d | i  W d S  ty* } z| |j|jd W Y d }~d S d }~ww )Nrm   arg_namelog_message)r}  rV   r!   r  r  r  r7   r7   r8   rW     s   
"z GetArgumentErrorTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s&   |  d}| t|jddd d S )NrL   rm   zMissing argument foor  )r   rv   r   r   r   r7   r7   r8   test_catch_error  s
   
z%GetArgumentErrorTest.test_catch_errorN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                   @   r  )SetLazyPropertiesTestc                   @   r@  )
zSetLazyPropertiesTest.Handlerc                 C   s   d| _ td| _d S )NBenr  )current_userr   rW   r?   r7   r7   r8   r    s   z%SetLazyPropertiesTest.Handler.preparec                 C   rB   r0   rC   r?   r7   r7   r8   get_user_locale  rE   z-SetLazyPropertiesTest.Handler.get_user_localec                 C   rB   r0   rC   r?   r7   r7   r8   get_current_user  rE   z.SetLazyPropertiesTest.Handler.get_current_userc                 C   s"   |  d| j d| jj d d S )NzHello z ())rV   r  r   r   r?   r7   r7   r8   rW     s   "z!SetLazyPropertiesTest.Handler.getN)rG   rH   rI   r  r  r  rW   r7   r7   r7   r8   rN     s
    rN   c                 C   r  )NrL   s   Hello Ben (en_US)r  r   r7   r7   r8   test_set_properties     
z)SetLazyPropertiesTest.test_set_propertiesN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        r  c                       sV   e Zd Zdd Z fddZdd Zeddd	 Zd
d Z	dd Z
dd Z  ZS )GetCurrentUserTestc                 C   sD   G dd dt }G dd dt }tddddd	}t|||d
dS )Nc                   @   rP   )z<GetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModulec                 S   r  )Nr  r7   r?   r7   r7   r8   r     rF   zCGetCurrentUserTest.get_app_kwargs.<locals>.WithoutUserModule.renderNr  r7   r7   r7   r8   WithoutUserModule  rZ   r  c                   @   rP   )z9GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModulec                 S   s
   t | jS r0   )r   r  r?   r7   r7   r8   r   #  r   z@GetCurrentUserTest.get_app_kwargs.<locals>.WithUserModule.renderNr  r7   r7   r7   r8   WithUserModule"  rZ   r  r  z{{ current_user }}z {% module WithoutUserModule() %}z{% module WithUserModule() %})without_user.htmlwith_user.htmlwithout_user_module.htmlwith_user_module.html)r  r  )r  r  r  )r@   r  r  r  r7   r7   r8   r=     s   z!GetCurrentUserTest.get_app_kwargsc                    r  r0   r  r?   r  r7   r8   r  6  rR  zGetCurrentUserTest.tearDownc                 C   s|   G dd dt }G dd d|}G dd d|}G dd d|}G d	d
 d
|}G dd d|}d|fd|fd|fd|fgS )Nc                   @   r  )z;GetCurrentUserTest.get_handlers.<locals>.CurrentUserHandlerc                 S   s
   d| _ d S )NFhas_loaded_current_userr?   r7   r7   r8   r  <  r   zCGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.preparec                 S   s
   d| _ dS )NTr  r  r?   r7   r7   r8   r  ?  s   zLGetCurrentUserTest.get_handlers.<locals>.CurrentUserHandler.get_current_userN)rG   rH   rI   r  r  r7   r7   r7   r8   CurrentUserHandler;  r  r  c                   @   rP   )z;GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandlerc                 S      |  d | t| j d S )Nr  render_stringr   r   r  r?   r7   r7   r8   rW   D     
z?GetCurrentUserTest.get_handlers.<locals>.WithoutUserHandler.getNrY   r7   r7   r7   r8   WithoutUserHandlerC  rZ   r  c                   @   rP   )z8GetCurrentUserTest.get_handlers.<locals>.WithUserHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   I  r  z<GetCurrentUserTest.get_handlers.<locals>.WithUserHandler.getNrY   r7   r7   r7   r8   WithUserHandlerH  rZ   r  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandlerc                 S   r,  r0   )uir?   r7   r7   r8   get_template_namespaceN  s   zXGetCurrentUserTest.get_handlers.<locals>.CurrentUserModuleHandler.get_template_namespaceN)rG   rH   rI   r  r7   r7   r7   r8   CurrentUserModuleHandlerM  rZ   r  c                   @   rP   )zAGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   U  r  zEGetCurrentUserTest.get_handlers.<locals>.WithoutUserModuleHandler.getNrY   r7   r7   r7   r8   WithoutUserModuleHandlerT  rZ   r  c                   @   rP   )z>GetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandlerc                 S   r  )Nr  r  r?   r7   r7   r8   rW   Z  r  zBGetCurrentUserTest.get_handlers.<locals>.WithUserModuleHandler.getNrY   r7   r7   r7   r8   WithUserModuleHandlerY  rZ   r  /without_user
/with_user/without_user_module/with_user_moduler   )r@   r  r  r  r  r  r  r7   r7   r8   r<   :  s   zGetCurrentUserTest.get_handlersz	needs fixc                 C   r  )Nr     Falser  r   r7   r7   r8   test_get_current_user_is_lazye  r  z0GetCurrentUserTest.test_get_current_user_is_lazyc                 C   r  )Nr     Truer  r   r7   r7   r8   test_get_current_user_worksk  r  z.GetCurrentUserTest.test_get_current_user_worksc                 C   r  )Nr  r  r  r   r7   r7   r8   ,test_get_current_user_from_ui_module_is_lazyo  r  z?GetCurrentUserTest.test_get_current_user_from_ui_module_is_lazyc                 C   r  )Nr  r  r  r   r7   r7   r8   *test_get_current_user_from_ui_module_workss  r  z=GetCurrentUserTest.test_get_current_user_from_ui_module_works)rG   rH   rI   r=   r  r<   r  skipr  r  r  r  r  r7   r7   r  r8   r    s    +
r  c                   @   r  )UnimplementedHTTPMethodsTestc                   @   re  )z$UnimplementedHTTPMethodsTest.HandlerNrg  r7   r7   r7   r8   rN   y  rh  rN   c                 C   sR   dD ]}| j d|d}| |jd qdD ]}| j d|dd}| |jd qd S )N)r_  r`  DELETEOPTIONSrL   r    r   PUTr   r   r  )r@   r   r   r7   r7   r8   #test_unimplemented_standard_methods|  s   z@UnimplementedHTTPMethodsTest.test_unimplemented_standard_methodsN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r  x  s    r  c                   @   r  )#UnimplementedNonStandardMethodsTestc                   @   rP   )z+UnimplementedNonStandardMethodsTest.Handlerc                 C   rR   NotherrU   r?   r7   r7   r8   r    r0  z1UnimplementedNonStandardMethodsTest.Handler.otherN)rG   rH   rI   r  r7   r7   r7   r8   rN     rZ   rN   c                 C   r<  )NrL   PATCHr   r   r  r  r   r7   r7   r8   test_unimplemented_patch  s   z<UnimplementedNonStandardMethodsTest.test_unimplemented_patchc                 C   r<  )NrL   OTHERTr   allow_nonstandard_methodsr  r  r   r7   r7   r8   test_unimplemented_other  r>  z<UnimplementedNonStandardMethodsTest.test_unimplemented_otherN)rG   rH   rI   r   rN   r  r  r7   r7   r7   r8   r    s    r  c                   @   r  )AllHTTPMethodsTestc                   @   s(   e Zd Zdd Ze Z Z Z ZZdS )zAllHTTPMethodsTest.Handlerc                 C   s"   | j jd usJ | | j j d S r0   )rY  r   rV   r?   r7   r7   r8   r     r>  z!AllHTTPMethodsTest.Handler.methodN)	rG   rH   rI   r   rW   deleteoptionsr   putr7   r7   r7   r8   rN     s    rN   c                 C   sv   | j ddd}| |jd dD ]}| j d|d}| |jt| qdD ]}| j d|dd}| |jt| q%d S )NrL   r_  r  r   )r`  r  r  r  r   )r   rv   r   r   )r@   r   r   r7   r7   r8   test_standard_methods  s   z(AllHTTPMethodsTest.test_standard_methodsN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r    r  r  c                   @   r  )PatchMethodTestc                   @   s&   e Zd Zejd Zdd Zdd ZdS )zPatchMethodTest.Handler)r  c                 C   rR   )NpatchrU   r?   r7   r7   r8   r    rX   zPatchMethodTest.Handler.patchc                 C   rR   r  rU   r?   r7   r7   r8   r    rX   zPatchMethodTest.Handler.otherN)rG   rH   rI   r   SUPPORTED_METHODSr  r  r7   r7   r7   r8   rN     s    
rN   c                 C   r<  )NrL   r  r   r   s   patchr  r   r7   r7   r8   
test_patch  r>  zPatchMethodTest.test_patchc                 C   r<  )NrL   r  Tr  s   otherr  r   r7   r7   r8   
test_other  r>  zPatchMethodTest.test_otherN)rG   rH   rI   r   rN   r  r  r7   r7   r7   r8   r    s    r  c                   @   r  )FinishInPrepareTestc                   @   r  )zFinishInPrepareTest.Handlerc                 C   rR   )Nr   rZ  r?   r7   r7   r8   r    rX   z#FinishInPrepareTest.Handler.preparec                 C   r-  )Nzshould not reach this methodr.  r?   r7   r7   r8   rW     s   zFinishInPrepareTest.Handler.getNr[  r7   r7   r7   r8   rN     r  rN   c                 C   r  )NrL   s   doner  r   r7   r7   r8   test_finish_in_prepare  r  z*FinishInPrepareTest.test_finish_in_prepareN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r        
r  c                   @   r  )Default404Testc                 C   r  Nr   r   r?   r7   r7   r8   r<     s   
zDefault404Test.get_handlersc                 C   *   |  d}| |jd | |jd d S )NrL   r  sE   <html><title>404: Not Found</title><body>404: Not Found</body></html>r  r   r7   r7   r8   test_404  s   
zDefault404Test.test_404N)rG   rH   rI   r<   r  r7   r7   r7   r8   r    s    r  c                   @   rj   )Custom404Testc                 C   r  r  r   r?   r7   r7   r8   r<     r   zCustom404Test.get_handlersc                 C   s   G dd dt }t|dS )Nc                   @   rP   )z6Custom404Test.get_app_kwargs.<locals>.Custom404Handlerc                 S   s   |  d | d d S )Nr  zcustom 404 response)r  rV   r?   r7   r7   r8   rW     rR  z:Custom404Test.get_app_kwargs.<locals>.Custom404Handler.getNrY   r7   r7   r7   r8   Custom404Handler  rZ   r  )default_handler_class)r   rb   )r@   r  r7   r7   r8   r=     s   
zCustom404Test.get_app_kwargsc                 C   r  )NrL   r  s   custom 404 responser  r   r7   r7   r8   r    s   
zCustom404Test.test_404N)rG   rH   rI   r<   r=   r  r7   r7   r7   r8   r    s    r  c                   @   rj   )DefaultHandlerArgumentsTestc                 C   r  r  r   r?   r7   r7   r8   r<     r   z(DefaultHandlerArgumentsTest.get_handlersc                 C   s   t tt dddS )Nr  r9  )r  default_handler_args)rb   r"   r?   r7   r7   r8   r=     s   z*DefaultHandlerArgumentsTest.get_app_kwargsc                 C   r  )NrL   r  r  r   r7   r7   r8   test_403  r  z$DefaultHandlerArgumentsTest.test_403N)rG   rH   rI   r<   r=   r  r7   r7   r7   r8   r    s    r  c                   @   r  )HandlerByNameTestc                 C   s   dt fdtddgS )N/hello1)/hello2"tornado.test.web_test.HelloHandler/hello3r  )rQ   r$   r?   r7   r7   r8   r<    	  s   zHandlerByNameTest.get_handlersc                 C   sL   |  d}| |jd |  d}| |jd |  d}| |jd d S )Nr  r
  r  r  r  r@   respr7   r7   r8   test_handler_by_name	  s   


z&HandlerByNameTest.test_handler_by_nameN)rG   rH   rI   r<   r  r7   r7   r7   r8   r    s    r  c                   @   sL   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	dS )StreamingRequestBodyTestc                 C   sb   t G dd dt}t G dd dt}t G dd dt}d|t| dfd	|fd
|t| dfgS )Nc                   @   r@  )
zCStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandlerc                 S   r(  r0   r   r;  r7   r7   r8   r+  	  r   zNStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.initializec                 S   s   | j jd  d S r0   )r   prepared
set_resultr?   r7   r7   r8   r  	  r  zKStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.preparec                 S   s   | j j| d S r0   )r   r  r  r@   r  r7   r7   r8   data_received	  r  zQStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.data_receivedc                 S   s   | j jd  | i  d S r0   )r   finishedr  rV   r?   r7   r7   r8   rW   	  s   zGStreamingRequestBodyTest.get_handlers.<locals>.StreamingBodyHandler.getN)rG   rH   rI   r+  r  r  rW   r7   r7   r7   r8   StreamingBodyHandler	  s
    r  c                   @   rP   )zAStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandlerc                 S   r-  )N  r1  r?   r7   r7   r8   r  $	  s   zIStreamingRequestBodyTest.get_handlers.<locals>.EarlyReturnHandler.prepareNr  r7   r7   r7   r8   EarlyReturnHandler"	  s    r  c                       s$   e Zd Zdd Z fddZ  ZS )zDStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandlerc                 S   r(  r0   r   r;  r7   r7   r8   r+  +	  r   zOStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.initializec                    s   t    | jjd  d S r0   )r  r?  r   close_futurer  r?   r  r7   r8   r?  .	  r  zXStreamingRequestBodyTest.get_handlers.<locals>.CloseDetectionHandler.on_connection_close)rG   rH   rI   r+  r?  r  r7   r7   r  r8   CloseDetectionHandler)	  s    r  z/stream_bodyr   z/early_returnz/close_detection)r+   r   rb   )r@   r  r  r  r7   r7   r8   r<   	  s   	z%StreamingRequestBodyTest.get_handlersc                 C   sZ   t  t jt jd}|d|  f t|}|d| d  |r&|d |d |S )Nr   rB  s   GET s    HTTP/1.1
Host: 127.0.0.1
s   Connection: close
s   Transfer-Encoding: chunked

)rF  rG  rH  rI  rJ  r   rV   )r@   r$   connection_closerO  rK  r7   r7   r8   rI  8	  s   

z StreamingRequestBodyTest.connectc                 c   s    t  | _t  | _t  | _| jddd}| jV  |d | jV }| |d t  | _|d | jV }| |d |d | jV  | V }| |	d	 |
  d S )
Ns   /stream_bodyTr  	   4
asdf
s   asdfs	   4
qwer
s   qwers   0

s   {})r   r  r  r  rI  rV   rv   read_until_closer   r  rQ  r@   rK  r  r7   r7   r8   test_streaming_bodyC	  s$   



z,StreamingRequestBodyTest.test_streaming_bodyc                 c   s.    | j ddd}| V }| |d d S )N   /early_returnFr     HTTP/1.1 401)rI  r  r   rc  r  r7   r7   r8   test_early_returnZ	  s   
z*StreamingRequestBodyTest.test_early_returnc                 c   s8    | j ddd}|d | V }| |d d S )Nr  Fr  r  r  )rI  rV   r  r   rc  r  r7   r7   r8   test_early_return_with_data`	  s
   

z4StreamingRequestBodyTest.test_early_return_with_datac                 c   s,    t  | _| jddd}|  | jV  d S )Ns   /close_detectionFr  )r   r  rI  rQ  )r@   rK  r7   r7   r8   test_close_during_uploadg	  s
   z1StreamingRequestBodyTest.test_close_during_uploadN)
rG   rH   rI   r<   rI  r   r  r  r  r  r7   r7   r7   r8   r  	  s    &


r  c                   @   s>   e Zd Zdd Zejdd Zejdd Z	ejdd Z
d	S )
BaseFlowControlHandlerc                 C   s   || _ d | _g | _d S r0   )r   r   methodsr;  r7   r7   r8   r+  u	  s   
z!BaseFlowControlHandler.initializec                 c   sT    | j d ur| jd| d| j   || _ | j| z	d V  W d | _ d S d | _ w )Nzentered method z
 while in )r   r   failr  r  r  r7   r7   r8   	in_methodz	  s   
z BaseFlowControlHandler.in_methodc                 c   s    | j d tjV  d S )Nr  )r  r  r   momentr?   r7   r7   r8   r  	  s   zBaseFlowControlHandler.preparec                 c   sJ    |  d tjV  W d    n1 sw   Y  | t| jd d S )Nr   r  )r  r   r   rV   rb   r  r?   r7   r7   r8   r   	  s
   
zBaseFlowControlHandler.postN)rG   rH   rI   r+  
contextlibcontextmanagerr  r   r   r  r   r7   r7   r7   r8   r  s	  s    


r  c                   @   sL   e Zd Zdd Zdd ZdejfddZdejfdd	Zdejfd
dZ	dS )#BaseStreamingRequestFlowControlTestc                 C   s   t dddS )Nr   T)
chunk_sizedecompress_requestr   r?   r7   r7   r8   get_httpserver_options	  s   z:BaseStreamingRequestFlowControlTest.get_httpserver_optionsc                 C   r  r0   r   r?   r7   r7   r8   r  	  r%  z3BaseStreamingRequestFlowControlTest.get_http_clientr@   c                 C   s8   | j dddd}|  | t|jtg dd d S )NrL   abcdefghijklmnopqrstuvwxyzr   )r   r   r  r  r  r  r   r  )r   r  rv   r   r   rb   r   r7   r7   r8   test_flow_control_fixed_body	  s   z@BaseStreamingRequestFlowControlTest.test_flow_control_fixed_bodyc                    sR   g d t j fdd}| jd|dd}|  | t|jtg dd d S )	N)s   abcds   efghs   ijklc                 3   s     D ]}| |V  qd S r0   r7   )rV   ichunksr7   r8   body_producer	  s   zYBaseStreamingRequestFlowControlTest.test_flow_control_chunked_body.<locals>.body_producerrL   r   )r  r   r	  r  )r   r   r   r  rv   r   r   rb   )r@   r  r   r7   r  r8   test_flow_control_chunked_body	  s   zBBaseStreamingRequestFlowControlTest.test_flow_control_chunked_bodyc                 C   sl   t  }tjd|d}|d |  | }| jd|dddid}|  | t	|j
tg d	d
 d S )Nw)modefileobjs   abcdefghijklmnopqrstuvwxyzrL   r   r  r  )r   r   r   r	  r  )r/   r  GzipFilerV   rQ  getvaluer   r  rv   r   r   rb   )r@   bytesio	gzip_filecompressed_bodyr   r7   r7   r8   !test_flow_control_compressed_body	  s$   
zEBaseStreamingRequestFlowControlTest.test_flow_control_compressed_bodyN)
rG   rH   rI   r  r  r  Anyr
  r  r  r7   r7   r7   r8   r  	  s    r  c                   @   rP   )(DecoratedStreamingRequestFlowControlTestc                 C   "   G dd dt }d|t| dfgS )Nc                   @   r  )zZDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandlerc                 s   s:    |  d tjV  W d    d S 1 sw   Y  d S )Nr  )r  r   r   r  r7   r7   r8   r  	  s   
"zhDecoratedStreamingRequestFlowControlTest.get_handlers.<locals>.DecoratedFlowControlHandler.data_receivedN)rG   rH   rI   r   r   r  r7   r7   r7   r8   DecoratedFlowControlHandler	  r  r  rL   r   r  rb   )r@   r  r7   r7   r8   r<   	  s   z5DecoratedStreamingRequestFlowControlTest.get_handlersNrG   rH   rI   r<   r7   r7   r7   r8   r  	      r  c                   @   rP   )%NativeStreamingRequestFlowControlTestc                 C   r  )Nc                   @   rP   )zTNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandlerc                    sJ   |  d dd l}|dI d H  W d    d S 1 sw   Y  d S )Nr  r   )r  asynciorD  )r@   r  r!  r7   r7   r8   r  	  s
   "zbNativeStreamingRequestFlowControlTest.get_handlers.<locals>.NativeFlowControlHandler.data_receivedN)rG   rH   rI   r  r7   r7   r7   r8   NativeFlowControlHandler	  rZ   r"  rL   r   r  )r@   r"  r7   r7   r8   r<   	  s   z2NativeStreamingRequestFlowControlTest.get_handlersNr  r7   r7   r7   r8   r   	  r  r   c                   @   rj   )IncorrectContentLengthTestc                    sB   |  d | _ G  fdddt}G  fdddt}d|fd|fgS )Nc                          e Zd Z fddZdS )z8IncorrectContentLengthTest.get_handlers.<locals>.TooHighc              
      >   |  dd z| d W d S  ty } z| _ d }~ww )Nrm  r  ra  r  r   r\  server_errorr  r   r7   r8   rW   
     z<IncorrectContentLengthTest.get_handlers.<locals>.TooHigh.getNrY   r7   r   r7   r8   TooHigh
      r)  c                       r$  )z7IncorrectContentLengthTest.get_handlers.<locals>.TooLowc              
      r%  )Nrm  r  rT   r&  r  r   r7   r8   rW   
  r(  z;IncorrectContentLengthTest.get_handlers.<locals>.TooLow.getNrY   r7   r   r7   r8   TooLow

  r*  r+  /high/low)r'  r   )r@   r)  r+  r7   r   r8   r<   	  s
   		z'IncorrectContentLengthTest.get_handlersc              
   C      t td9 t td$ | t | jddd W d    n1 s#w   Y  W d    n1 s2w   Y  W d    n1 sAw   Y  | t| jd d S )N*(Uncaught exception|Exception in callback)S(Cannot send error response after headers written|Failed to flush partial response)r,  Traise_errorz0Tried to write 40 bytes less than Content-Length	r   r   r   assertRaisesr
   r   rv   r   r'  r?   r7   r7   r8   test_content_length_too_high
     
z7IncorrectContentLengthTest.test_content_length_too_highc              
   C   r.  )Nr/  r0  r-  Tr1  z,Tried to write more data than Content-Lengthr3  r?   r7   r7   r8   test_content_length_too_low%
  r6  z6IncorrectContentLengthTest.test_content_length_too_lowN)rG   rH   rI   r<   r5  r7  r7   r7   r7   r8   r#  	  s    r#  c                   @   r  )ClientCloseTestc                   @   rP   )zClientCloseTest.Handlerc                 C   s8   | j jdr| j jj  | d d S | d d S )NzHTTP/1rT   requires HTTP/1.x)rY  rq   rc  
connectionrK  rQ  rV   r?   r7   r7   r8   rW   8
  s   zClientCloseTest.Handler.getNrY   r7   r7   r7   r8   rN   7
  rZ   rN   c                 C   sf   |  ttjf! | jddd}|jdkr| d | |jd W d    d S 1 s,w   Y  d S )NrL   Tr1  s   requires HTTP/1.xr9  iW  )	r4  r
   r  SkipTestr   r   skipTestrv   r   r   r7   r7   r8   test_client_closeE
  s   

"z!ClientCloseTest.test_client_closeN)rG   rH   rI   r   rN   r=  r7   r7   r7   r8   r8  6
  r  r8  c                   @   s|   e Zd ZdZddddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )SignedValueTestzIt's a secret to everybody	asdfbasdf123123122342342)r   ro   r|   c                 C   s   |   d S )Ni 0* )presentr?   r7   r7   r8   pastQ
  rO   zSignedValueTest.pastc                 C   r  )Ni m|Mr7   r?   r7   r7   r8   rB  T
  rF   zSignedValueTest.presentc                 C   s   t tjddd| jd}| |d t tjddd| jd}| |d t tjdd| jd}| || ttjd|d| jd	}| |d
 ttjd|d| jd	}| |d
 d S )Nr^  rg   ro   )rq   clocks<   dmFsdWU=|1300000000|31c934969f53e48164c50768b40cbd7e2daaaa4fr|   se   2|1:0|10:1300000000|3:key|8:dmFsdWU=|3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152rD  )rs   rD     value)r&   r>  SECRETrB  rv   r'   )r@   	signed_v1	signed_v2signed_default
decoded_v1
decoded_v2r7   r7   r8   test_known_valuesW
  s2   z!SignedValueTest.test_known_valuesc                 C   sh   t tjdd| jd}t tjdd| jd}ttjd|| jd}| | ttjd|| jd}| | d S )Nkey1rg   rE  key2)r&   r>  rG  rB  r'   r   )r@   signed1signed2decoded1decoded2r7   r7   r8   test_name_swapw
  s   
zSignedValueTest.test_name_swapc                 C   sV   t tjdd| jd}ttjd|| jd}| |d ttjd|| jd}| | d S )NrN  rg   rE  rF  )r&   r>  rG  rC  r'   rv   rB  r   )r@   signeddecoded_pastdecoded_presentr7   r7   r8   test_expired
  s   zSignedValueTest.test_expiredc                    sN   d fdd}  |d  |d  |d  |d d S )N@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152c                    s   dt tjd|   jdkS NrF  r^  rE  r'   r>  rG  rB  )prefixr@   r   r7   r8   validate
     z8SignedValueTest.test_payload_tampering.<locals>.validate%2|1:0|10:1300000000|3:key|8:dmFsdWU=|z%2|1:1|10:1300000000|3:key|8:dmFsdWU=|z$2|1:0|10:130000000|3:key|8:dmFsdWU=|z&2|1:0|10:1300000000|3:keey|8:dmFsdWU=|r   assertFalser@   r^  r7   r]  r8   test_payload_tampering
  s   z&SignedValueTest.test_payload_tamperingc                    sj   d  fdd} |d |d |d |d |d |d	 d S )
Nr`  c                    s   dt tjd |  jdkS rZ  r[  )r   r\  r@   r7   r8   r^  
  r_  z:SignedValueTest.test_signature_tampering.<locals>.validaterY   00000000000000000000000000000000@4d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e152@3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e153?3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e15A3d4e60b996ff9c5d5788e333a0cba6f238a22c6c0f94788870e1a9ecd482e1538ra  rc  r7   re  r8   test_signature_tampering
  s(   z(SignedValueTest.test_signature_tamperingc                 C   s<   d}t tjd|| jd}ttjd|| jd}| || d S )Nr   r^  rE  )r&   r>  rG  rB  r'   rv   r@   rg   rU  decodedr7   r7   r8   test_non_ascii
  s   zSignedValueTest.test_non_asciic                 C   >   d}t tjd|| jdd}ttjd|| jd}| || d S Nr   r^  r   rD  r`   rE  r&   r>  SECRET_DICTrB  r'   rv   rl  r7   r7   r8   *test_key_versioning_read_write_default_key
     z:SignedValueTest.test_key_versioning_read_write_default_keyc                 C   ro  )Nr   r^  ro   rq  rE  rr  rl  r7   r7   r8   .test_key_versioning_read_write_non_default_key
  ru  z>SignedValueTest.test_key_versioning_read_write_non_default_keyc                 C   sN   d}t tjd|| jdd}tj }|d t|d|| jd}| | d S rp  )r&   r>  rs  rB  r   r   r'   r   )r@   rg   rU  newkeysrm  r7   r7   r8   test_key_versioning_invalid_key
  s   

z/SignedValueTest.test_key_versioning_invalid_keyc                 C   s2   d}t tjd|| jdd}t|}| d| d S )Nr   r^  ro   rq  )r&   r>  rs  rB  r(   rv   )r@   rg   rU  r`   r7   r7   r8   test_key_version_retrieval
  s   z*SignedValueTest.test_key_version_retrievalN)rG   rH   rI   rG  rs  rC  rB  rM  rT  rX  rd  rk  rn  rt  rv  rx  ry  r7   r7   r7   r8   r>  M
  s      



r>  c                       s   e Zd ZG dd deZdd Z fddZd(dd	Zd)d
dZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Z  ZS )*XSRFTestc                   @   r  )zXSRFTest.Handlerc                 C   s*   t | dd}|| jd< | | j d S )Nrq   r  xsrf_cookie_version)r|  r}  r^   rV   rt  )r@   rq   r7   r7   r8   rW   
  s   
zXSRFTest.Handler.getc                 C   rR   r`  rU   r?   r7   r7   r8   r      rX   zXSRFTest.Handler.postNrG   rH   rI   rW   r   r7   r7   r7   r8   rN   
  s    rN   c                 C   r   r:  r   r?   r7   r7   r8   r=     r   zXSRFTest.get_app_kwargsc                       t    |  | _d S r0   r  setUp	get_tokenrt  r?   r  r7   r8   r    rR  zXSRFTest.setUpNc                 C   sH   |d ur
|  |}nd }| j|d u rdnd| |d}|  t|jS )NrL   z/?version=%dr   cookie_headersr   r  r   r   )r@   	old_tokenrq   r   r   r7   r7   r8   r  
  s   
zXSRFTest.get_tokenc                 C      |d u r| j }dd| iS )Nr   z_xsrf=rt  r@   tokenr7   r7   r8   r       zXSRFTest.cookie_headersc                 C   L   t td | jdddd}W d    n1 sw   Y  | |jd d S N.*'_xsrf' argument missingrL   r   r   r   r  r  r   r7   r7   r8   test_xsrf_fail_no_token     z XSRFTest.test_xsrf_fail_no_tokenc              	   C   \   t td | jddtjt| jdd}W d    n1 s w   Y  | |j	d d S N!.*XSRF cookie does not match POSTrL   r   _xsrfr   r  
r   r   r   r  r  r  rb   rt  rv   r   r   r7   r7   r8   test_xsrf_fail_body_no_cookie     z&XSRFTest.test_xsrf_fail_body_no_cookiec              
   C   s`   t td | jdd|  tjtddd}W d    n1 s"w   Y  | |j	d d S )Nz%.*'_xsrf' argument has invalid formatrL   r   3|r  r  r  )
r   r   r   r  r  r  r  rb   rv   r   r   r7   r7   r8   &test_xsrf_fail_argument_invalid_format(  s   z/XSRFTest.test_xsrf_fail_argument_invalid_formatc              
   C   sf   t td | jdd| jddtjt| jdd}W d    n1 s%w   Y  | 	|j
d d S )	Nr  rL   r   r  r  r  r  r  )r   r   r   r  r  r  r  rb   rt  rv   r   r   r7   r7   r8   $test_xsrf_fail_cookie_invalid_format2  s   
z-XSRFTest.test_xsrf_fail_cookie_invalid_formatc                 C   sR   t td | jddd|  d}W d    n1 sw   Y  | |jd d S )Nr  rL   r   r   r   r   r   r  )r   r   r   r  rv   r   r   r7   r7   r8   test_xsrf_fail_cookie_no_body<  s   z&XSRFTest.test_xsrf_fail_cookie_no_bodyc                 C   :   | j ddtjtdd| jddd}| |jd d S )NrL   r   deadbeefr  r  r  r   r   r  r  r  rb   r  rv   r   r   r7   r7   r8   test_xsrf_success_short_tokenC     
z&XSRFTest.test_xsrf_success_short_tokenc                 C   r  )NrL   r   xoxor  r  r  r   r  r   r7   r7   r8   test_xsrf_success_non_hex_tokenL  r  z(XSRFTest.test_xsrf_success_non_hex_tokenc                 C   8   | j ddtjt| jd|  d}| |jd d S NrL   r   r  r  r   	r   r  r  r  rb   rt  r  rv   r   r   r7   r7   r8   test_xsrf_success_post_bodyU  s   z$XSRFTest.test_xsrf_success_post_bodyc                 C   s<   | j dtjt| jd dd|  d}| |jd d S )Nz/?r  r   r   r  r   r  r   r7   r7   r8   test_xsrf_success_query_string^  s   z'XSRFTest.test_xsrf_success_query_stringc              	   C   s:   | j dddtd| jifi |  d}| |jd d S )NrL   r   r   zX-Xsrftokenr  r   )r   rb   rt  r  rv   r   r   r7   r7   r8   test_xsrf_success_headerg  s   	z!XSRFTest.test_xsrf_success_headerc                 C   s:   d}t  }t|D ]	}||   q	| t|| d S )Nr   )rL  r  rd  r  rv   r  )r@   
NUM_TOKENStokensr  r7   r7   r8   test_distinct_tokenss  s
   zXSRFTest.test_distinct_tokensc              
   C   s   |   }| j|fD ]}| jddtjt|d| |d}| |j	d q	| j|f|| jffD ]3\}}t
td | jddtjt|d| |d}W d    n1 sWw   Y  | |j	d q0d S )NrL   r   r  r  r   r  r  )r  rt  r   r  r  r  rb   r  rv   r   r   r   )r@   token2r  r   cookie_token
body_tokenr7   r7   r8   test_cross_user{  s,   zXSRFTest.test_cross_userc              	   C   sx   | j }|h}tdD ]'}| |}|| | jddtjt| j d| 	|d}| 
|jd q
| 
t|d d S )N   rL   r   r  r  r      )rt  r  r  rd  r   r  r  r  rb   r  rv   r   r  )r@   r  tokens_seenr  r   r7   r7   r8   test_refresh_token  s   

zXSRFTest.test_refresh_tokenc              	   C   s   |  | jdd| jdd | jdd}tdD ]}| | j|dd| q| |}|  || |  || | ||f||ffD ]\}}| jddtjt|d| 	|d}| |j
d qBd S )	Nro   rp   r  rL   r   r  r  r   )assertNotEqualr  r  rv   r   r  r  r  rb   r  r   )r@   v1_tokenr  v2_tokenr  r  r   r7   r7   r8   test_versioning  s    
zXSRFTest.test_versioningr  r0   )rG   rH   rI   r   rN   r=   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r  r8   rz  
  s(    

	

				rz  c                       s`   e Zd ZG dd deZdd Z fddZddd	Zdd
dZdd Z	dd Z
dd Z  ZS )XSRFCookieNameTestc                   @   r  )zXSRFCookieNameTest.Handlerc                 C   r  r0   rV   rt  r?   r7   r7   r8   rW     rc  zXSRFCookieNameTest.Handler.getc                 C   rR   r`  rU   r?   r7   r7   r8   r     rX   zXSRFCookieNameTest.Handler.postNr|  r7   r7   r7   r8   rN     r  rN   c                 C   s   t ddddidS )NTz__Host-xsrfr   )r;  xsrf_cookie_namexsrf_cookie_kwargsr   r?   r7   r7   r8   r=     s
   z!XSRFCookieNameTest.get_app_kwargsc                    r}  r0   r~  r?   r  r7   r8   r    rR  zXSRFCookieNameTest.setUpNc                 C   s8   |d ur
|  |}nd }| jd|d}|  t|jS )NrL   r   r  )r@   r  r   r   r7   r7   r8   r    s   
zXSRFCookieNameTest.get_tokenc                 C   r  )Nr   z__Host-xsrf=r  r  r7   r7   r8   r    r  z!XSRFCookieNameTest.cookie_headersc                 C   r  r  r  r   r7   r7   r8   r    r  z*XSRFCookieNameTest.test_xsrf_fail_no_tokenc              	   C   r  r  r  r   r7   r7   r8   r    r  z0XSRFCookieNameTest.test_xsrf_fail_body_no_cookiec                 C   r  r  r  r   r7   r7   r8   r    s   z.XSRFCookieNameTest.test_xsrf_success_post_bodyr0   )rG   rH   rI   r   rN   r=   r  r  r  r  r  r  r  r7   r7   r  r8   r    s    

		r  c                   @   r  )XSRFCookieKwargsTestc                   @   rP   )zXSRFCookieKwargsTest.Handlerc                 C   r  r0   r  r?   r7   r7   r8   rW     rc  z XSRFCookieKwargsTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   s   t dt ddddS )NTr|   )r   rh   )r;  r  r   r?   r7   r7   r8   r=     s   z#XSRFCookieKwargsTest.get_app_kwargsc                 C   s   |  d}| d|jd   | d|jd   |jd}|d us'J td|}|d us3J tjtj	j
tjdd }tj| d }|jd u rX|jtj	j
d	}| t||  d
k  d S )NrL   z	httponly;r   zexpires=z.*; expires=(?P<expires>.+);.*r|   r  r  )tzinfor   )r   r  r   lowerrW   r   r   r  r  r  r  r  r  r  r  r  r  replacer   r   r!  r"  r7   r7   r8   test_xsrf_httponly  s   

z'XSRFCookieKwargsTest.test_xsrf_httponlyN)rG   rH   rI   r   rN   r=   r  r7   r7   r7   r8   r    s    r  c                   @   r  )FinishExceptionTestc                   @   rP   )zFinishExceptionTest.Handlerc                 C   s:   |  d | dd | ddrtd| d t )Nr  WWW-AuthenticateBasic realm="something"finish_valuer  zauthentication required)r  r  r}  r*   rV   r?   r7   r7   r8   rW     s   

zFinishExceptionTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   sH   dD ]}|  |}| |jd | d|jd | d|j qd S )N)rL   z/?finish_value=1r  r  r  s   authentication required)r   rv   r   r   rW   r   )r@   ur   r7   r7   r8   test_finish_exception$  s   
z)FinishExceptionTest.test_finish_exceptionN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r    r  r  c                   @   rj   )DecoratorTestc                 C   s0   G dd dt }G dd dt }d|fd|fgS )Nc                   @      e Zd Zedd ZdS )z6DecoratorTest.get_handlers.<locals>.RemoveSlashHandlerc                 S   r  r0   r7   r?   r7   r7   r8   rW   1  r  z:DecoratorTest.get_handlers.<locals>.RemoveSlashHandler.getN)rG   rH   rI   r,   rW   r7   r7   r7   r8   RemoveSlashHandler0      r  c                   @   r  )z3DecoratorTest.get_handlers.<locals>.AddSlashHandlerc                 S   r  r0   r7   r?   r7   r7   r8   rW   6  r  z7DecoratorTest.get_handlers.<locals>.AddSlashHandler.getN)rG   rH   rI   r-   rW   r7   r7   r7   r8   AddSlashHandler5  r  r  /removeslash/	/addslashr   )r@   r  r  r7   r7   r8   r<   /  s   zDecoratorTest.get_handlersc                 C   `   | j ddd}| |jd | |jd d | j ddd}| |jd | |jd d d S )	Nr  Fr4  r  r7  z/removeslashz/removeslash/?foo=barz/removeslash?foo=barr  r   r7   r7   r8   test_removeslash<     zDecoratorTest.test_removeslashc                 C   r  )	Nr  Fr4  r  r7  z
/addslash/z/addslash?foo=barz/addslash/?foo=barr  r   r7   r7   r8   test_addslashE  r  zDecoratorTest.test_addslashN)rG   rH   rI   r<   r  r  r7   r7   r7   r8   r  .  s    	r  c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )	CacheTestc                 C   s   G dd dt }d|fgS )Nc                   @   r  )z+CacheTest.get_handlers.<locals>.EtagHandlerc                 S   r  r0   rU   )r@   computed_etagr7   r7   r8   rW   R  rX   z/CacheTest.get_handlers.<locals>.EtagHandler.getc                 S   s
   | j d S rC  )_write_bufferr?   r7   r7   r8   compute_etagU  r   z8CacheTest.get_handlers.<locals>.EtagHandler.compute_etagN)rG   rH   rI   rW   r  r7   r7   r7   r8   EtagHandlerQ  r  r  z
/etag/(.*)r   )r@   r  r7   r7   r8   r<   P  s   
zCacheTest.get_handlersc                 C      d}d}|  ||d d S )N"xyzzy"*rl  
_test_etagr@   r  etagsr7   r7   r8   test_wildcard_etagZ     zCacheTest.test_wildcard_etagc                 C   s   d}d}|  ||d d S )Nr  rl  r  r  r7   r7   r8   test_strong_etag_match_  r  z CacheTest.test_strong_etag_matchc                 C   r  )N"xyzzy1""xyzzy1", "xyzzy2"rl  r  r  r7   r7   r8   test_multiple_strong_etag_matchd  r  z)CacheTest.test_multiple_strong_etag_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   test_strong_etag_not_matchi  r  z$CacheTest.test_strong_etag_not_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   #test_multiple_strong_etag_not_matchn  r  z-CacheTest.test_multiple_strong_etag_not_matchc                 C   r  )Nr  
W/"xyzzy1"rl  r  r  r7   r7   r8   test_weak_etag_matchs  r  zCacheTest.test_weak_etag_matchc                 C   r  )N"xyzzy2"W/"xyzzy1", W/"xyzzy2"rl  r  r  r7   r7   r8   test_multiple_weak_etag_matchx  r  z'CacheTest.test_multiple_weak_etag_matchc                 C   r  )Nr  r  r   r  r  r7   r7   r8   test_weak_etag_not_match}  r  z"CacheTest.test_weak_etag_not_matchc                 C   r  )Nz"xyzzy3"r  r   r  r  r7   r7   r8   !test_multiple_weak_etag_not_match  r  z+CacheTest.test_multiple_weak_etag_not_matchc                 C   s(   | j d| d|id}| |j| d S )Nz/etag/rr  r   r  )r@   r  r  r'  r   r7   r7   r8   r    s   zCacheTest._test_etagN)rG   rH   rI   r<   r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   r  O  s    
r  c                   @   r  )RequestSummaryTestc                   @   rP   )zRequestSummaryTest.Handlerc                 C   s   d | j _| |   d S r0   )rY  	remote_ipr   r  r?   r7   r7   r8   rW     s   zRequestSummaryTest.Handler.getNrY   r7   r7   r7   r8   rN     rZ   rN   c                 C   r  )NrL   s   GET / (None)r  r  r7   r7   r8   test_missing_remote_ip  r  z)RequestSummaryTest.test_missing_remote_ipN)rG   rH   rI   r   rN   r  r7   r7   r7   r8   r    r  r  c                   @   rP   )HTTPErrorTestc                 C   sF   t ddd}t|}| || | |j|j | |j|j d S )Nr  zGo awayr$  )r    r   assertIsNotrv   r'  r#  )r@   r   e2r7   r7   r8   	test_copy  s
   
zHTTPErrorTest.test_copyN)rG   rH   rI   r  r7   r7   r7   r8   r    rZ   r  c                   @   rP   )ApplicationTestc                 C   s"   t g }|jddd}|  d S )Nr   rB  )address)r   listenrS  )r@   r>   serverr7   r7   r8   test_listen  s   zApplicationTest.test_listenN)rG   rH   rI   r  r7   r7   r7   r8   r    rZ   r  c                   @   rj   )URLSpecReverseTestc                 C   s0   |  dtdd   |  dtdd   d S )Nz/favicon.icoz/favicon\.icoz^/favicon\.ico$rv   r$   reverser?   r7   r7   r8   test_reverse  r  zURLSpecReverseTest.test_reversec              	   C   sN   dg}|D ]}t |d }z| }| d||f  W q ty$   Y qw d S )Nz^/api/v\d+/foo/(\w+)$z<did not get expected exception when reversing %s. result: %s)r$   r  r  r  )r@   pathsr2   url_specrK  r7   r7   r8   test_non_reversible  s   
z&URLSpecReverseTest.test_non_reversiblec                 C   s4   |  dtdd d |  dtdd d d S )Nz/api/v1/foo/barz^/api/v1/foo/(\w+)$r   z/api.v1/foo/5/icon.pngz/api\.v1/foo/([0-9]+)/icon\.pngr  r  r?   r7   r7   r8   test_reverse_arguments  s   z)URLSpecReverseTest.test_reverse_argumentsN)rG   rH   rI   r  r  r   r7   r7   r7   r8   r    s    r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )RedirectHandlerTestc                 C   s(   dt ddifdt ddifdt ddifgS )N/srcr$   /dstz/src2z/dst2?foo=barz/(.*?)/(.*?)/(.*)z/{1}/{0}/{2})r  r?   r7   r7   r8   r<     s   z RedirectHandlerTest.get_handlersc                 C   r  )Nr  Fr4  r  r7  r  r  r   r7   r7   r8   test_basic_redirect  r  z'RedirectHandlerTest.test_basic_redirectc                 C   r  )Nz/src?foo=barFr4  r  r7  z/dst?foo=barr  r   r7   r7   r8   test_redirect_with_argument  r  z/RedirectHandlerTest.test_redirect_with_argumentc                 C   r  )Nz/src2?foo2=bar2Fr4  r  r7  z/dst2?foo=bar&foo2=bar2r  r   r7   r7   r8   %test_redirect_with_appending_argument  r  z9RedirectHandlerTest.test_redirect_with_appending_argumentc                 C   r  )Nz/a/b/cFr4  r  r7  z/b/a/cr  r   r7   r7   r8   test_redirect_pattern  r  z)RedirectHandlerTest.test_redirect_patternN)rG   rH   rI   r<   r  r  r  r  r7   r7   r7   r8   r    s    r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )AcceptLanguageTestz)Test evaluation of Accept-Language headerc                 C   s8   t tjtjtdd G dd dt}d|fgS )Ngettext_translationstornado_testc                   @   rP   )z>AcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandlerc                 S   s(   |  d|  jdd | d d S )Nr  _-r   )r  get_browser_localer   r  r   r?   r7   r7   r8   rW     s   zBAcceptLanguageTest.get_handlers.<locals>.AcceptLanguageHandler.getNrY   r7   r7   r7   r8   AcceptLanguageHandler  rZ   r  rL   )r   load_gettext_translationsr1   r2   r3   r4   r5   r   )r@   r  r7   r7   r8   r<     s   zAcceptLanguageTest.get_handlersc                 C   sL   | j dddid}| |jd d | j dddid}| |jd d d S )NrL   rQ  zfr-FR;q=0.9r   r  zfr-FRzfr-FR; q=0.9r   rv   r   r   r7   r7   r8   test_accept_language  s   z'AcceptLanguageTest.test_accept_languagec                 C   (   | j dddid}| |jd d d S )NrL   rQ  z	fr-FR;q=0r   r  en-USr  r   r7   r7   r8   test_accept_language_ignore     z.AcceptLanguageTest.test_accept_language_ignorec                 C   r  )NrL   rQ  z
fr-FR;q=-1r   r  r  r  r   r7   r7   r8   test_accept_language_invalid	  r  z/AcceptLanguageTest.test_accept_language_invalidN)rG   rH   rI   rJ   r<   r  r  r  r7   r7   r7   r8   r    s    r  )tornado.concurrentr   tornador   tornado.escaper   r   r   r   r   r	   tornado.httpclientr
   tornado.httputilr   tornado.iostreamr   r   tornado.locksr   tornado.logr   r   tornado.simple_httpclientr   tornado.templater   tornado.testingr   r   r   r   tornado.test.utilr   tornado.utilr   r   tornado.webr   r   r   r   r  r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r   r  r   r  email.utilsr  r  ior/   ra  r	  r1   r   rF  r  r  urllib.parser  r9   r;   rK   rQ   r[   TestCaserk   r   r   r   r'  r1  r:  rA  rU  rb  ro  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+  r0  r6  r@  rW  r_  r\  rf  ri  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r8  r>  rz  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   <module>   s     T6/1 !0,
  	B  k%C*":/.\b
M
; + M:!?	!