o
    7ήc                  	   @   sV  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddl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 ddlT e je jeZd	d
 ZG dd dejZG dd dejZG dd dejZG dd dejZ G dd dejZ!G dd dejZ"G dd dejZ#G dd dejZ$e j%eddZ&e'dgZ(g Z)e *e&D ]^Z+e j,e+\Z-Z.e-e(v rqe.dkre j%e&e-d Z/e0e j%e&e+d Z+e+1 Z2W d   n1 sw   Y  e0e/d Z+e3e+Z4W d   n1 sw   Y  e)5e-e2e4d! qd"d# Z6e	G d$d% d%ejZ7G d&d' d'ejZ8d(d) Z9dS )*    N   )parametrizeparametrize_class	slow_testunittest)BytesIO)binary_type	text_type)	MagicMockMockpatch   )*c                 C   s   t | tr| t } | S N)
isinstancer	   encodesysgetfilesystemencoding)val r   E/tmp/pip-target-vg8gfxp4/lib/python/multipart/tests/test_multipart.pyforce_bytes   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 )	TestFieldc                 C   s   t d| _d S Nfoo)Fieldfselfr   r   r   setUp$      zTestField.setUpc                 C   s   |  | jjd d S r   )assertEqualr   
field_namer   r   r   r   	test_name'      zTestField.test_namec                 C   s    | j d | | j jd d S N   test123r   writer!   valuer   r   r   r   	test_data*      zTestField.test_datac                 C   s<   | j d | | j jd | j d | | j jd d S )N   test   123r&   r'   r   r   r   r   test_cache_expiration.   s   zTestField.test_cache_expirationc                 C   *   | j d | j   | | j jd d S r%   )r   r(   finalizer!   r)   r   r   r   r   test_finalize4      
zTestField.test_finalizec                 C   r/   r%   )r   r(   closer!   r)   r   r   r   r   
test_close9   r2   zTestField.test_closec                 C   sF   t dd}| |jd | |jd t dd }| |jd  d S Ns   names   value)r   
from_valuer!   r"   r)   )r   r   f2r   r   r   test_from_value>   s
   zTestField.test_from_valuec                 C   s(   t dd}t dd}| || d S r5   )r   r6   r!   )r   f1r7   r   r   r   test_equalityF   s   zTestField.test_equalityc                 C   s,   t dd}| |dk | d|k d S )N   foo   bar)r   r6   assertFalser   r   r   r   r   test_equality_with_otherL   s   z"TestField.test_equality_with_otherc                 C   s0   t d}| |jd |  | |jd  d S )Nr;       )r   r!   r)   set_noner>   r   r   r   test_set_noneQ   s   zTestField.test_set_noneN)__name__
__module____qualname__r   r#   r*   r.   r1   r4   r8   r:   r?   rB   r   r   r   r   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d Zdd Zdd Zdd ZdS )TestFilec                 C   s(   i | _ tt | _td| j d| _d S )N   foo.txtconfig)cr   tempfilemkdtempdFiler   r   r   r   r   r   Z   s   zTestFile.setUpc                 C   s8   | j j}|d | | | |d |  d S Nr   )r   file_objectseekr!   readtruncate)r   datar   r   r   r   assert_data_   s
   

zTestFile.assert_datac                 C   s*   t j| j| jj}| t j| d S r   )ospathjoinrM   r   actual_file_name
assertTrueexists)r   	full_pathr   r   r   assert_existsf   s   zTestFile.assert_existsc                 C      | j d | d d S N   foobar)r   r(   rU   r   r   r   r   test_simplej      zTestFile.test_simplec                 C   s2   t  }d|j_|| j_| jd}| |d d S )N   r`   )r   r(   return_valuer   _fileobjr!   )r   mvr   r   r   test_invalid_writen   s
   zTestFile.test_invalid_writec                 C   s   d| j d< | jd | | jj | d | jd | | jj | d | jj}| j  | | jj | 	| jj| d S )Nr   MAX_MEMORY_FILE_SIZE   1r-   )
rJ   r   r(   rZ   	in_memoryrU   r=   rP   flush_to_diskassertIs)r   old_objr   r   r   test_file_fallbacku   s   



zTestFile.test_file_fallbackc                 C   sL   d| j d< | jd | | jj | jd | | jj | d d S )N
   ri   s
   1111111111s
   2222222222s   11111111112222222222)rJ   r   r(   rZ   rk   r=   rU   r   r   r   r   test_file_fallback_with_data   s   
z%TestFile.test_file_fallback_with_datac                 C   sJ   | j | jd< d| jd< | jd | | jj | | jj |   d S )N
UPLOAD_DIRrp   ri      12345678901)	rM   rJ   r   r(   r=   rk   assertIsNotNonerY   r]   r   r   r   r   test_file_name   s   
zTestFile.test_file_namec                 C   sV   | j | jd< d| jd< d| jd< | jd | | jj | | jjd |   d S )Nrr   TUPLOAD_KEEP_FILENAMErp   ri   rs   r;   	rM   rJ   r   r(   r=   rk   r!   rY   r]   r   r   r   r   test_file_full_name   s   

zTestFile.test_file_full_namec                 C   `   | j | jd< d| jd< d| jd< d| jd< | jd | | jj | | jjd |   d S 	Nrr   Trv   UPLOAD_KEEP_EXTENSIONSrp   ri   rs   rG   rw   r   r   r   r   test_file_full_name_with_ext      


z%TestFile.test_file_full_name_with_extc                 C   ry   rz   rw   r   r   r   r   r|      r}   c                 C   sZ   d| j d< d| j d< | jd | | jj tj| jjd }| 	|d | 
  d S )NTr{   rp   ri   rs   r   s   .txt)rJ   r   r(   r=   rk   rV   rW   splitextrY   r!   r]   )r   extr   r   r   test_no_dir_with_extension   s   

z#TestFile.test_no_dir_with_extensionc                 C   j   t tjddd| jd< d| jd< d| jd< | t | jd	 W d    d S 1 s.w   Y  d S )
N/tmpnotexistingrr   Trv   rc   ri   
   1234567890	r   rV   rW   rX   rJ   assertRaises	FileErrorr   r(   r   r   r   r   test_invalid_dir_with_name      

"z#TestFile.test_invalid_dir_with_namec                 C   r   )
Nr   r   r   rr   Frv   rc   ri   r   r   r   r   r   r   test_invalid_dir_no_name   r   z!TestFile.test_invalid_dir_no_nameN)rC   rD   rE   r   rU   r]   ra   rh   ro   rq   ru   rx   r|   r   r   r   r   r   r   r   rF   Y   s    
rF   c                   @   sT   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S )TestParseOptionsHeaderc                 C   (   t d\}}| |d | |i  d S )Nzapplication/json   application/jsonparse_options_headerr!   r   tpr   r   r   ra         z"TestParseOptionsHeader.test_simplec                 C   r   )N r@   r   r   r   r   r   
test_blank   r   z!TestParseOptionsHeader.test_blankc                 C   ,   t d\}}| |d | |ddi d S )Nzapplication/json;par=valr      par   valr   r   r   r   r   test_single_param      z(TestParseOptionsHeader.test_single_paramc                 C   r   )Ns   application/json;     par=valr   r   r   r   r   r   r   r   test_single_param_with_spaces   r   z4TestParseOptionsHeader.test_single_param_with_spacesc                 C   s.   t d\}}| |d | |ddd d S )Ns!   application/json;par=val;asdf=foor   r   r;   )r      asdfr   r   r   r   r   test_multiple_params  s   z+TestParseOptionsHeader.test_multiple_paramsc                 C   r   )Ns   application/json;param="quoted"r      params   quotedr   r   r   r   r   test_quoted_param  r   z(TestParseOptionsHeader.test_quoted_paramc                 C       t d\}}| |d d d S )Ns/   application/json;param="quoted;with;semicolons"r   s   quoted;with;semicolonsr   r   r   r   r    test_quoted_param_with_semicolon  r+   z7TestParseOptionsHeader.test_quoted_param_with_semicolonc                 C   r   )Ns1   application/json;param="This \" is \" a \" quote"r   s   This " is " a " quoter   r   r   r   r   test_quoted_param_with_escapes  r+   z5TestParseOptionsHeader.test_quoted_param_with_escapesc                 C   r   )Ns1   text/plain; filename="C:\this\is\a\path\file.txt"s   filename   file.txtr   r   r   r   r   test_handles_ie6_bug  s   z+TestParseOptionsHeader.test_handles_ie6_bugN)rC   rD   rE   ra   r   r   r   r   r   r   r   r   r   r   r   r   r      s    r   c                   @   s   e Zd Zdd Zdd ZdS )TestBaseParserc                 C   s   t  | _i | j_d S r   )
BaseParserb	callbacksr   r   r   r   r     s   zTestBaseParser.setUpc                    sj   dg  fdd}| j d| | j d |  d d | j dd  | j d |  d d d S )Nr   c                      s    d  d7  < d S )Nr   r   r   r   lr   r   on_foo!  r$   z-TestBaseParser.test_callbacks.<locals>.on_foor   r   )r   set_callbackcallbackr!   )r   r   r   r   r   test_callbacks  s   zTestBaseParser.test_callbacksN)rC   rD   rE   r   r   r   r   r   r   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d Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$TestQuerystringParserc                 O   sB   | ddr| j  | | jt| |ddrg | _d S d S )Nr0   Treset)popr   r0   r!   r   listget)r   argskwargsr   r   r   assert_fields.  s   

z#TestQuerystringParser.assert_fieldsc                 C   s   |    d S r   )r   r   r   r   r   r   6  s   zTestQuerystringParser.setUpc                    sP   g _ g g  fdd} fdd} fdd}|||d}t|_d S )Nc                         | ||  d S r   appendrT   startend)name_bufferr   r   on_field_name?     z2TestQuerystringParser.reset.<locals>.on_field_namec                    r   r   r   r   )data_bufferr   r   on_field_dataB  r   z2TestQuerystringParser.reset.<locals>.on_field_datac                      s4   j dd f d d =  d d = d S Nr@   )r   r   rX   r   r   r   r   r   r   on_field_endE  s   
z1TestQuerystringParser.reset.<locals>.on_field_end)r   r   r   )r   QuerystringParserr   )r   r   r   r   r   r   r   r   r   9  s   
zTestQuerystringParser.resetc                 C      | j d | d d S )N   foo=barr;   r<   r   r(   r   r   r   r   r   test_simple_querystringV     z-TestQuerystringParser.test_simple_querystringc                 C   r   )Ns   &foo=barr   r   r   r   r   r    test_querystring_blank_beginning[  r   z6TestQuerystringParser.test_querystring_blank_beginningc                 C   r   )N   foo=bar&r   r   r   r   r   r   test_querystring_blank_end`  r   z0TestQuerystringParser.test_querystring_blank_endc                 C      | j d | dd d S )Ns   foo=bar&asdf=bazr   r      bazr   r   r   r   r   test_multiple_querystringe  
   z/TestQuerystringParser.test_multiple_querystringc                 C   s4   | j d | jddd | j d | d d S )Nr   r   Fr0   s   asdf=bazr   r   r   r   r   r   test_streaming_simplem  s   z+TestQuerystringParser.test_streaming_simplec                 C   s|   | j d | jdd | j d | jdd | j d | jdd | j d | jddd | j d | d	 d S )
Ns   foo=oneFr   s   twos   threes   &asd)r;   s   onetwothrees   f=bazr   r   r   r   r   r   test_streaming_breaky  s   z*TestQuerystringParser.test_streaming_breakc                 C   r   )Ns   foo=bar;asdf=bazr   r   r   r   r   r   r   test_semicolon_seperator  r   z.TestQuerystringParser.test_semicolon_seperatorc                 C   s<   d| j _| j d | jddd | j d | d d S )N   r   r   Fr   s   a=123456)   as   12345)r   max_sizer(   r   r   r   r   r   test_too_large_field  s
   z*TestQuerystringParser.test_too_large_fieldc                 C   :   |  t tdd}W d    d S 1 sw   Y  d S )Nir   )r   
ValueErrorr   )r   r   r   r   r   test_invalid_max_size     "z+TestQuerystringParser.test_invalid_max_sizec                 C   s^   d}t |D ]&\}}|   d| j_td||f  | j| | j| | dd qd S )Ns   foo=bar&another=asdfTz%r / %rr      anotherr   )	split_allr   r   strict_parsingprintr(   r   )r   rT   firstlastr   r   r   test_strict_parsing_pass  s   z.TestQuerystringParser.test_strict_parsing_passc              	   C   s   d}t |D ]F\}}|   d| j_d}| t}|| j|7 }|| j|7 }| j  W d    n1 s9w   Y  |d urL| |j	j
d|  qd S )N   foo=bar&&another=asdfTr      )r   r   r   r   r   QuerystringParseErrorr(   r0   r!   	exceptionoffset)r   rT   r   r   cntcmr   r   r   #test_strict_parsing_fail_double_sep  s   z9TestQuerystringParser.test_strict_parsing_fail_double_sepc                 C   sb   d}t |D ](\}}td||f  |   d}|| j|7 }|| j|7 }| dd qd S )Nr   z	 %r / %r r   r   r   )r   r   r   r   r(   r   )r   rT   r   r   r   r   r   r   test_double_sep  s   z%TestQuerystringParser.test_double_sepc                 C   s^   d| j _| t}| j d W d    n1 sw   Y  |d ur-| |jjd d S d S )NT   foo=bar&blank&another=asdfr   )r   r   r   r   r(   r!   r   r   )r   r   r   r   r   !test_strict_parsing_fail_no_value  s   z7TestQuerystringParser.test_strict_parsing_fail_no_valuec                 C   s   | j d | ddd d S )Nr   r   )s   blankr@   r   r   r   r   r   r   test_success_no_value  s   z+TestQuerystringParser.test_success_no_valueN)rC   rD   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   -  s$    r   c                   @   sR   e Zd Zdd ZdddZdddZddd	Zd
d Zdd Zdd Z	dd Z
dS )TestOctetStreamParserc                    sP   g  _ d _d _ fdd} fdd} fdd}|||d}t| _d S )	Nr   c                           j d7  _ d S Nr   )startedr   r   r   r   on_start     z-TestOctetStreamParser.setUp.<locals>.on_startc                    s    j | ||  d S r   )rM   r   r   r   r   r   on_data  s   z,TestOctetStreamParser.setUp.<locals>.on_datac                      r   r   )finishedr   r   r   r   on_end  r   z+TestOctetStreamParser.setUp.<locals>.on_end)r   r   r   )rM   r   r   OctetStreamParserr   )r   r   r   r   r   r   r   r   r     s   zTestOctetStreamParser.setUpTc                 C   s   |  d| j| g | _d S r   )r!   rX   rM   r   rT   r0   r   r   r   rU     s   
z!TestOctetStreamParser.assert_datac                 C   (   |r|  | jd d S |  | jd d S Nr   r   )r!   r   r   r   r   r   r   assert_started     z$TestOctetStreamParser.assert_startedc                 C   r  r  )r!   r   r  r   r   r   assert_finished   r  z%TestOctetStreamParser.assert_finishedc                 C   sH   |  d | jd |    | d | d | j  |   d S )NFr`   )r  r   r(   rU   r  r0   r   r   r   r   ra     s   



z!TestOctetStreamParser.test_simplec                 C   sD   | j d | j d | j d | j   | d |   d S )Nr;   r<   r   s	   foobarbaz)r   r(   r0   rU   r  r   r   r   r   test_multiple_chunks  s   

z*TestOctetStreamParser.test_multiple_chunksc                 C   s4   d| j _| j d | j   | d |   d S )Nrc   
   0123456789s   01234)r   r   r(   r0   rU   r  r   r   r   r   test_max_size  s
   

z#TestOctetStreamParser.test_max_sizec                 C   r   )Nr   r   )r   r   r   r   qr   r   r   r   &  r   z+TestOctetStreamParser.test_invalid_max_sizeNT)rC   rD   rE   r   rU   r  r  ra   r  r	  r   r   r   r   r   r     s    


		r   c                   @   sV   e Zd Z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S )TestBase64Decoderc                 C      t  | _t| j| _d S r   )r   r   Base64DecoderrM   r   r   r   r   r   -     zTestBase64Decoder.setUpTc                 C   F   |r| j   | jd | | j | | jd | j  d S rO   rM   r0   r   rQ   r!   rR   rS   r   r   r   r   rU   1     
zTestBase64Decoder.assert_datac                 C   r   )N   Zm9vYmFyr`   rM   r(   rU   r   r   r   r   ra   :  rb   zTestBase64Decoder.test_simplec                 C   s<   |  t | jd W d    d S 1 sw   Y  d S )Ns   Zm9v!mFy)r   DecodeErrorrM   r(   r   r   r   r   test_bad>     "zTestBase64Decoder.test_badc                 C   &   | j d | j d | d d S )N   Zm9vs   YmFyr`   r  r   r   r   r   test_split_properlyB     z%TestBase64Decoder.test_split_properlyc                 C   \   d}t ddD ]$}|d | ||d  }}|   | j| | j| | d qd S )Nr  r      r;   ranger   rM   r(   rU   r   buffir   secondr   r   r   test_bad_splitG     z TestBase64Decoder.test_bad_splitc                 C   r  )Nr  rc   r   r`   r  r!  r   r   r   test_long_bad_splitQ  r&  z%TestBase64Decoder.test_long_bad_splitc                 C   6   t  }t|}|  |j  |  |j  d S r   )r   r  r0   assert_called_once_withr3   r   parserr   r   r   r   test_close_and_finalize[     
z)TestBase64Decoder.test_close_and_finalizec                 C   sF   | j d | t | j   W d    d S 1 sw   Y  d S )Ns   Zm9vYmF)rM   r(   r   r  r0   r   r   r   r   test_bad_lengthe  s   "z!TestBase64Decoder.test_bad_lengthNr  )rC   rD   rE   r   rU   ra   r  r  r%  r'  r,  r.  r   r   r   r   r  +  s    
	


r  c                   @   sf   e Zd Z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S )TestQuotedPrintableDecoderc                 C   r  r   )r   r   QuotedPrintableDecoderrM   r   r   r   r   r   m  r  z TestQuotedPrintableDecoder.setUpTc                 C   r  rO   r  r   r   r   r   rU   q  r  z&TestQuotedPrintableDecoder.assert_datac                 C   r^   r_   r  r   r   r   r   ra   z  rb   z&TestQuotedPrintableDecoder.test_simplec                 C   r   )Ns	   foo=3Dbarr   r  r   r   r   r   test_with_escape~  rb   z+TestQuotedPrintableDecoder.test_with_escapec                 C   r   )Ns	   foo=
barr`   r  r   r   r   r   test_with_newline_escape  rb   z3TestQuotedPrintableDecoder.test_with_newline_escapec                 C   r   )Ns   foo=
barr`   r  r   r   r   r   test_with_only_newline_escape  rb   z8TestQuotedPrintableDecoder.test_with_only_newline_escapec                 C   r  )Ns   foo=3s   Dbarr   r  r   r   r   r   test_with_split_escape  r  z1TestQuotedPrintableDecoder.test_with_split_escapec                 C   r  )Ns   foo=s   
barr`   r  r   r   r   r    test_with_split_newline_escape_1  r  z;TestQuotedPrintableDecoder.test_with_split_newline_escape_1c                 C   r  )Ns   foo=s   
barr`   r  r   r   r   r    test_with_split_newline_escape_2  r  z;TestQuotedPrintableDecoder.test_with_split_newline_escape_2c                 C   r(  r   )r   r0  r0   r)  r3   r*  r   r   r   r,    r-  z2TestQuotedPrintableDecoder.test_close_and_finalizec                 C   sR   | j d | d | j d | j d | d | j d | d dS )zG
        https://github.com/andrew-d/python-multipart/issues/6
        s   =3AXs   :Xs   =3s   AXs   q=3AXs   q:XNr  r   r   r   r   test_not_aligned  s   

z+TestQuotedPrintableDecoder.test_not_alignedNr  )rC   rD   rE   r   rU   ra   r1  r2  r3  r4  r5  r6  r,  r7  r   r   r   r   r/  l  s    
	
r/  r*   httpsingle_field_blocksz.httpz.yamlrb)nametestresultc                 c   s8    t dt| d D ]}| d| | |d fV  q
dS )z
    This function will split an array all possible ways.  For example:
        split_all([1,2,3,4])
    will give:
        ([1], [2,3,4]), ([1,2], [3,4]), ([1,2,3], [4])
    r   N)r   len)r   r#  r   r   r   r     s   r   c                   @   s   e Zd Zi fddZdd Zdd Zdd Zed	ed
d Z	dd Z
dd Zdd Zedd Ze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 )/TestFormParserc                    sP   d _ g  _g  _ fdd} fdd} fdd}td|||||d	 _d S )
NFc                        j |  d S r   )fieldsr   r   r   r   r   on_field     z%TestFormParser.make.<locals>.on_fieldc                    r@  r   )filesr   rB  r   r   r   on_file  rD  z$TestFormParser.make.<locals>.on_filec                      s
   d _ d S )NT)endedr   r   r   r   r     s   
z#TestFormParser.make.<locals>.on_endmultipart/form-data)boundaryrI   )rG  rE  rA  
FormParserr   )r   rI  rI   rC  rF  r   r   r   r   make  s   
zTestFormParser.makec                 C   s(   |j }|d | }| || d S rO   )rP   rQ   rR   r!   )r   r   rT   o	file_datar   r   r   assert_file_data  s   
zTestFormParser.assert_file_datac                 C   sl   d }| j D ]}|j|kr|} nq| | z| || | |j| | j | W |  d S |  w r   )rE  r"   rt   rN  r!   	file_nameremover3   )r   r"   rO  rT   foundr   r   r   r   assert_file  s   


zTestFormParser.assert_filec                 C   sJ   d }| j D ]}|j|kr|} nq| | | ||j | j | d S r   )rA  r"   rt   r!   r)   rP  )r   r;  r)   rQ  r   r   r   r   assert_field  s   


zTestFormParser.assert_fieldparamc              
   C   s4  |d d }t |tr|d}| | d }z| j|d }| j  W n ty< } z
d}|}W Y d }~nd }~ww d|d d v rY| | | 	|d d d |j
 d S | 	|t|d  |d d D ].}|d }|d	 d}|d
kr| ||d  qi|dkr| ||d d|d  qiJ d S )Nr=  rI  zlatin-1r<  r   errorexpectedtyper;  fieldrT   filerO  )r   r	   r   rK  r   r(   r0   MultipartParseErrorrt   r!   r   r>  rS  rR  )r   rT  rI  exc	processederW  r;  r   r   r   	test_http  s>   




zTestFormParser.test_httpc                 C   s   d}t tjt|d}| }W d   n1 sw   Y  t|D ]5\}}| d d}|| j	|7 }|| j	|7 }| j
  | |t| | dd | dd	d
 q$dS )zz
        This test runs a simple multipart body with one field and one file
        through every possible split.
        single_field_single_file.httpr:  NrI  r      field   test1   filer      test2)openrV   rW   rX   http_tests_dirrR   r   rK  r   r(   r0   r!   r>  rS  rR  )r   	test_filer   r*   r   r   r#  r   r   r   test_random_splittingM  s   


z$TestFormParser.test_random_splittingc                 C   s   d}t tjt|d}| }W d   n1 sw   Y  | d d}tt|D ]}|||d  }|| j	
|7 }q-| j	  | |t| | dd | d	d
d dS )L
        This test parses a simple multipart body 1 byte at a time.
        r_  r:  NrI  r   r   r`  ra  rb  r   rc  )rd  rV   rW   rX   re  rR   rK  r   r>  r   r(   r0   r!   rS  rR  )r   rf  r   r*   r#  xr   r   r   r   test_feed_single_bytesi  s   


z%TestFormParser.test_feed_single_bytesc           	      C   s   d}t tjt|d}| }W d   n1 sw   Y  tdt|d D ]L}t|D ]E}| d d}| j	
|d|  ||7 }t|t||D ]}||||  }|| j	
|7 }qN| j	  | |t| | dd q/q)dS )	rh  zsingle_field_blocks.httpr:  Nr   rI  r   r`  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)rd  rV   rW   rX   re  rR   r   r>  rK  r   r(   r0   r!   rS  )	r   rf  r   r*   rJ   rM   r#  ri  r   r   r   r   test_feed_blocks  s(   


zTestFormParser.test_feed_blocksc              	   C   s  d}t tjt|d}| }W d   n1 sw   Y  d}d}d}d}td|f  t|D ]}t|}	t	
g d}
|
dkr]t	t|}t	d	}|	|| d
||f }n:|
dkrqt	t|}|	|= d|f }n&|
dkrt	t|d }|	|d  |	| |	|< |	|d < d||d f }td|  | d d}z| jt|	}| j  W n ty   |d7 }Y q3w |t|	kr|d7 }q3|d7 }q3td td|f  td|f  td|f  dS )ap  
        This test randomly fuzzes the request body to ensure that no strange
        exceptions are raised and we don't end up in a strange state.  The
        fuzzing consists of randomly doing one of the following:
            - Adding a random byte at a random offset
            - Randomly deleting a single byte
            - Randomly swapping two bytes
        r_  r:  N  r   &Running %d iterations of fuzz testing:)r   r      r      zInserting byte %r at offset %dr   zDeleting byte at offset %drn  zSwapping bytes %d and %dz  rI  2--------------------------------------------------Successes:  %dFailures:   %dExceptions: %d)rd  rV   rW   rX   re  rR   r   r   	bytearrayrandomchoice	randranger>  insertrK  r   r(   bytesr0   FormParserError)r   rf  r   r*   
iterations	successesfailures
exceptionsr#  	fuzz_datarv  r   msgr   r   r   test_request_body_fuzz  sR   

"


z%TestFormParser.test_request_body_fuzzc              	   C   s   d}d}d}d}t d|f  t|D ]G}tdd}t|}t d|f  | d d}z| jt	|}| j
  W n tyJ   |d7 }Y qw |t|krV|d7 }q|d7 }qt d	 t d
|f  t d|f  t d|f  dS )z}
        This test will fuzz the multipart parser with some number of iterations
        of randomly-generated data.
        rl  r   rm  d   i   z!  Testing with %d random bytes...rI  r   rp  rq  rr  rs  N)r   r   ru  rw  rV   urandomrK  r   r(   ry  r0   rz  r>  )r   r{  r|  r}  r~  r#  	data_sizerT   r   r   r   "test_request_body_fuzz_random_data  s0   



z1TestFormParser.test_request_body_fuzz_random_datac                 C   s   |  d d}| t | j| W d    n1 sw   Y  |  d d}| t | j|}W d    d S 1 s@w   Y  d S )NrI  s   --boundaryfoobars   --boundaryfoobar)rK  r   rZ  r   r(   )r   rT   r#  r   r   r   test_bad_start_boundary  s   

"z&TestFormParser.test_bad_start_boundaryc                    s   g   fdd}t  }t  }td|||dd}| t|jt |d |d |  | |j	 | 
t d |  d	 d
 | |j	 d S )Nc                         |  d S r   r   rB  rE  r   r   rF  %  r    z1TestFormParser.test_octet_stream.<locals>.on_fileapplication/octet-streamrG   )r   rO  r,   s   1234r   r   s   test1234)r   rJ  rZ   r   r+  r   r(   r0   r=   calledr!   r>  rN  r   rF  rC  r   r   r   r  r   test_octet_stream#  s   

z TestFormParser.test_octet_streamc                    s   g   fdd}t  t   fdd}td|d}t|jt || td|d}t|jt || d S )Nc                    r  r   r   rB  rA  r   r   rC  9  r    z1TestFormParser.test_querystring.<locals>.on_fieldc                    s    d d =       | d | d |   j t d  d jd  d jd  d jd  d jd	 	j d S )
Nr   s
   &test=asdfr   r   r;   r<   r   r,   r   )

reset_mockr(   r0   r=   r  r!   r>  r"   r)   rZ   rB  rA  r   rF  r   r   r   simple_test>  s   


z4TestFormParser.test_querystring.<locals>.simple_test!application/x-www-form-urlencodedr   application/x-url-encoded)r   rJ  rZ   r   r+  r   )r   rC  r  r   r   r  r   test_querystring7  s   zTestFormParser.test_querystringc                 C   s@   t  }tdd d }||_|  |j  |  |j  d S )Nr  )r   rJ  r+  r0   r)  r3   r*  r   r   r   test_close_methods_  s   
z!TestFormParser.test_close_methodsc                 C   <   |  t tdd d }W d    d S 1 sw   Y  d S )Nzapplication/bad)r   r   rJ  r>   r   r   r   test_bad_content_typej  s   "z$TestFormParser.test_bad_content_typec                 C   r  )NrH  )r   rz  rJ  r>   r   r   r   test_no_boundary_giveno  s   "z%TestFormParser.test_no_boundary_givenc                    s   d}g   fdd}t  }t  }ddi}td|||d|d}| t || |  W d    n1 s7w   Y  dd	i}td|||d|d}|| |  |  d
 d d S )Ns   ----boundary
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Content-Transfer-Encoding: badstuff

Test
----boundary--
c                    r  r   r   rB  r  r   r   rF  y  r    zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_fileUPLOAD_ERROR_ON_BAD_CTETrH  z
--boundary)r   rI  rI   Fr   s   Test)r   rJ  r   rz  r(   r0   rN  )r   rT   rF  rC  r   rI   r   r   r  r   "test_bad_content_transfer_encodingu  s(   


z1TestFormParser.test_bad_content_transfer_encodingc                    s   g   fdd}t  }t  }td|||d}|d |  |  d jd |  d jd |  d	 jd
 |  d	 jd  |  d jd |  d jd d S )Nc                    r  r   r   rB  r  r   r   rC    r    z9TestFormParser.test_handles_None_fields.<locals>.on_fieldr  r  s   foo=bar&another&baz=asdfr   r;   r<   r   r   r   r   r   )r   rJ  r(   r0   r!   r"   r)   )r   rC  rF  r   r   r   r  r   test_handles_None_fields  s   
z'TestFormParser.test_handles_None_fieldsc                 C   s   d}t tjt|d}| }W d    n1 sw   Y  | d t|d | jj	_
| j|}| j  | |t|d  d S )Nr_  r:  rI  r   )rd  rV   rW   rX   re  rR   rK  r>  r   r+  r   r(   r0   r!   )r   rf  r   r*   r#  r   r   r   test_max_size_multipart  s   


z&TestFormParser.test_max_size_multipartc                 C   s   d}t tjt|d}| }W d    n1 sw   Y  t|d }| jdd|id | j	|}| j
  | |t|d  d S )Nr_  r:  r   rI  MAX_BODY_SIZErH   )rd  rV   rW   rX   re  rR   r>  rK  r   r(   r0   r!   )r   rf  r   r*   sizer#  r   r   r   test_max_size_form_parser  s   

z(TestFormParser.test_max_size_form_parserc                    sZ   g   fdd}t  }t  }td|||dddid}|d |  |  d	 d
 d S )Nc                    r  r   r   rB  r  r   r   rF    r    z:TestFormParser.test_octet_stream_max_size.<locals>.on_filer  rG   r  rp   )r   rO  rI   s   0123456789012345689r   r  )r   rJ  r(   r0   rN  r  r   r  r   test_octet_stream_max_size  s   
z)TestFormParser.test_octet_stream_max_sizec                 C   s<   |  t tddd}W d    d S 1 sw   Y  d S )Ns   boundr   r   )r   r   MultipartParserr
  r   r   r   test_invalid_max_size_multipart  r  z.TestFormParser.test_invalid_max_size_multipartN)rC   rD   rE   rK  rN  rR  rS  r   
http_testsr^  rg  rj  rk  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r?    s4    
1#
H
%(r?  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestHelperFunctionsc                 C   s$   t ddid d }| t|t d S )NContent-Typer  )create_form_parserrZ   r   rJ  )r   rr   r   r   test_create_form_parser  s   z+TestHelperFunctions.test_create_form_parserc                 C   s@   i }|  t t|d d  W d    d S 1 sw   Y  d S r   )r   r   r  )r   headersr   r   r   test_create_form_parser_error  s   "z1TestHelperFunctions.test_create_form_parser_errorc                 C   sF   t  }t  }tdditd|| |  | |jd d jd d S )Nr  r     123456789012345r   r   )r   
parse_formr   assert_called_oncer!   	call_argsr  )r   rC  rF  r   r   r   test_parse_form  s   z#TestHelperFunctions.test_parse_formc                    sN   g   fdd}t dddtdd | | t d |  d jd	 d S )
Nc                    r  r   r   )rY  r  r   r   rF    r    zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_filer  10)r  zContent-Lengthr  r   r   rp   )r  r   r!   r>  r  )r   rF  r   r  r   test_parse_form_content_length  s   	z2TestHelperFunctions.test_parse_form_content_lengthN)rC   rD   rE   r  r  r  r  r   r   r   r   r    s
    r  c                  C   s   t  } | t t | t t | t t | t t | t t | t t	 | t t
 | t t | t t | S r   )r   	TestSuiteaddTest	makeSuiterF   r   r   r   r   r  r/  r?  r  )suiter   r   r   r    s   r  ):rV   r   globyamlbase64ru  rK   compatr   r   r   r   ior   sixr   r	   mockr
   r   r   	multipartrW   abspathdirname__file__curr_dirr   TestCaser   rF   r   r   r   r   r  r/  rX   re  setNON_PARAMETRIZED_TESTSr  listdirr   r~   fnamer   	yaml_filerd  rR   r*   load	yaml_datar   r   r?  r  r  r   r   r   r   <module>   sl   6 - 3LAH


    0