o
    hL                  	   @   sF  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Zddlm	Z	m
Z
mZ d dl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#dh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+e,e j"e#e'dZ'e'- Z.W d   n1 sw   Y  e,e+dZ'e/e'Z0W d   n1 sw   Y  e%1e)e.e0d  qd!d" Z2e
G d#d$ d$ejZ3G d%d& d&ejZ4d'd( Z5dS ))    N   )parametrizeparametrize_class	slow_test)BytesIO)	MagicMockMockpatch   )*c                 C   s   t | tr| t } | S N)
isinstancestrencodesysgetfilesystemencoding)val r   a/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/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_finalize0      
zTestField.test_finalizec                 C   r-   r#   )r   r&   closer   r'   r   r   r   r   
test_close5   r0   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 r3   )r   r4   r   )r   f1r5   r   r   r   test_equalityB   s   zTestField.test_equalityc                 C   s,   t dd}| |dk | d|k d S )N   foo   bar)r   r4   assertFalser   r   r   r   r   test_equality_with_otherH   s   z"TestField.test_equality_with_otherc                 C   s0   t d}| |jd |  | |jd  d S )Nr9       )r   r   r'   set_noner<   r   r   r   test_set_noneM   s   zTestField.test_set_noneN)__name__
__module____qualname__r   r!   r(   r,   r/   r2   r6   r8   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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   V   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joinrK   r   actual_file_name
assertTrueexists)r   	full_pathr   r   r   assert_existsb   s   zTestFile.assert_existsc                 C      | j d | d d S N   foobar)r   r&   rS   r   r   r   r   test_simplef      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_writej   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+   )
rH   r   r&   rX   	in_memoryrS   r;   rN   flush_to_diskassertIs)r   old_objr   r   r   test_file_fallbackq   s   



zTestFile.test_file_fallbackc                 C   sL   d| j d< | jd | | jj | jd | | jj | d d S )N
   rg   s
   1111111111s
   2222222222s   11111111112222222222)rH   r   r&   rX   ri   r;   rS   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_DIRrn   rg      12345678901)	rK   rH   r   r&   r;   ri   assertIsNotNonerW   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 )Nrp   TUPLOAD_KEEP_FILENAMErn   rg   rq   r9   	rK   rH   r   r&   r;   ri   r   rW   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 	Nrp   Trt   UPLOAD_KEEP_EXTENSIONSrn   rg   rq   rE   ru   r   r   r   r   test_file_full_name_with_ext      


z%TestFile.test_file_full_name_with_extc                 C   rw   rx   ru   r   r   r   r   rz      r{   c                 C   sZ   d| j d< d| j d< | jd | | jj tj| jjd }| 	|d | 
  d S )NTry   rn   rg   rq   r   s   .txt)rH   r   r&   r;   ri   rT   rU   splitextrW   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notexistingrp   Trt   ra   rg   
   1234567890	r   rT   rU   rV   rH   assertRaises	FileErrorr   r&   r   r   r   r   test_invalid_dir_with_name      

"z#TestFile.test_invalid_dir_with_namec                 C   r   )
Nr   r   r   rp   Frt   ra   rg   r   r   r   r   r   r   test_invalid_dir_no_name   r   z!TestFile.test_invalid_dir_no_nameN)rA   rB   rC   r   rS   r[   r_   rf   rm   ro   rs   rv   rz   r~   r   r   r   r   r   r   rD   U   s    
rD   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   r_         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   r9   )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)rA   rB   rC   r_   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)rA   rB   rC   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#d$ Zd%S )&TestQuerystringParserc                 O   sB   | ddr| j  | | jt| |ddrg | _d S d S )Nr.   Treset)popr   r.   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   2  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rR   startend)name_bufferr   r   on_field_name;     z2TestQuerystringParser.reset.<locals>.on_field_namec                    r   r   r   r   )data_bufferr   r   on_field_data>  r   z2TestQuerystringParser.reset.<locals>.on_field_datac                      s4   j dd f d d =  d d = d S Nr>   )r   r   rV   r   r   r   r   r   r   on_field_endA  s   
z1TestQuerystringParser.reset.<locals>.on_field_end)r   r   r   )r   QuerystringParserr   )r   r   r   r   r   r   r   r   r   5  s   
zTestQuerystringParser.resetc                 C      | j d | d d S )N   foo=barr9   r:   r   r&   r   r   r   r   r   test_simple_querystringR     z-TestQuerystringParser.test_simple_querystringc                 C   r   )Ns   &foo=barr   r   r   r   r   r    test_querystring_blank_beginningW  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_querystringa  
   z/TestQuerystringParser.test_multiple_querystringc                 C   s4   | j d | jddd | j d | d d S )Nr   r   Fr.   s   asdf=bazr   r   r   r   r   r   test_streaming_simplei  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)r9   s   onetwothrees   f=bazr   r   r   r   r   r   test_streaming_breaku  s   z*TestQuerystringParser.test_streaming_breakc                 C   r   )Ns   foo=bar;asdf=bazr   r   r   r   r   r   r   test_semicolon_separator  r   z.TestQuerystringParser.test_semicolon_separatorc                 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| | j| | j| | dd qd S )Ns   foo=bar&another=asdfT / r      anotherr   )	split_allr   r   strict_parsingprintr&   r   )r   rR   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&   r.   r   	exceptionoffset)r   rR   r   r   cntcmr   r   r   #test_strict_parsing_fail_double_sep  s   z9TestQuerystringParser.test_strict_parsing_fail_double_sepc                 C   sh   d}t |D ]+\}}td|d|d |   d}|| j|7 }|| j|7 }| dd qd S )Nr    r   r   r   r   )r   r   r   r   r&   r   )r   rR   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_valuec                 C   s   t | j}d S r   )reprr   )r   _ignoredr   r   r   	test_repr  s   zTestQuerystringParser.test_reprN)rA   rB   rC   r   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   )rK   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  )rK   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   rV   rK   r   rR   r.   r   r   r   rS     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&   rS   r	  r.   r   r   r   r   r_     s   



z!TestOctetStreamParser.test_simplec                 C   sD   | j d | j d | j d | j   | d |   d S )Nr9   r:   r   s	   foobarbaz)r   r&   r.   rS   r	  r   r   r   r   test_multiple_chunks  s   

z*TestOctetStreamParser.test_multiple_chunksc                 C   s4   d| j _| j d | j   | d |   d S )Nra   
   0123456789s   01234)r   r   r&   r.   rS   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)rA   rB   rC   r   rS   r  r	  r_   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   Base64DecoderrK   r   r   r   r   r   -     zTestBase64Decoder.setUpTc                 C   F   |r| j   | jd | | j | | jd | j  d S rM   rK   r.   r   rO   r   rP   rQ   r  r   r   r   rS   1     
zTestBase64Decoder.assert_datac                 C   r   )N   Zm9vYmFyr^   rK   r&   rS   r   r   r   r   r_   :  r`   zTestBase64Decoder.test_simplec                 C   s<   |  t | jd W d    d S 1 sw   Y  d S )Ns   Zm9v!mFy)r   DecodeErrorrK   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      r9   ranger   rK   r&   rS   r   buffir   secondr   r   r   test_bad_splitG     z TestBase64Decoder.test_bad_splitc                 C   r   )Nr  ra   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  r.   assert_called_once_withr1   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)rK   r&   r   r  r.   r   r   r   r   test_bad_lengthe  s   "z!TestBase64Decoder.test_bad_lengthNr  )rA   rB   rC   r   rS   r_   r  r  r(  r*  r/  r1  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   QuotedPrintableDecoderrK   r   r   r   r   r   m  r  z TestQuotedPrintableDecoder.setUpTc                 C   r  rM   r  r  r   r   r   rS   q  r  z&TestQuotedPrintableDecoder.assert_datac                 C   r\   r]   r  r   r   r   r   r_   z  r`   z&TestQuotedPrintableDecoder.test_simplec                 C   r   )Ns	   foo=3Dbarr   r  r   r   r   r   test_with_escape~  r`   z+TestQuotedPrintableDecoder.test_with_escapec                 C   r   )Ns	   foo=
barr^   r  r   r   r   r   test_with_newline_escape  r`   z3TestQuotedPrintableDecoder.test_with_newline_escapec                 C   r   )Ns   foo=
barr^   r  r   r   r   r   test_with_only_newline_escape  r`   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   r3  r.   r,  r1   r-  r   r   r   r/    r0  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  )rA   rB   rC   r   rS   r_   r4  r5  r6  r7  r8  r9  r/  r:  r   r   r   r   r2  l  s    
	
r2  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                    rC  r   )filesr   rE  r   r   r   on_file  rG  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)boundaryrG   )rJ  rH  rD  
FormParserr   )r   rL  rG   rF  rI  r  r   r   r   make  s   
zTestFormParser.makec                 C   s(   |j }|d | }| || d S rM   )rN   rO   rP   r   )r   r   rR   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   )rH  r    rr   rQ  r   	file_nameremover1   )r   r    rR  rR   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   )rD  r    rr   r   r'   rS  )r   r>  r'   rT  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@  rL  zlatin-1r?  r   errorexpectedtyper>  fieldrR   filerR  )r   r   r   rN  r   r&   r.   MultipartParseErrorrr   r   r   rA  rV  rU  )r   rW  rL  exc	processederZ  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=  NrL  r      field   test1   filer      test2)openrT   rU   rV   http_tests_dirrP   r   rN  r   r&   r.   r   rA  rV  rU  )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.
        rb  r=  NrL  r   r   rc  rd  re  r   rf  )rg  rT   rU   rV   rh  rP   rN  r#  rA  r   r&   r.   r   rV  rU  )r   ri  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 )	rk  zsingle_field_blocks.httpr=  Nr   rL  r   rc  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)rg  rT   rU   rV   rh  rP   r#  rA  rN  r   r&   r.   r   rV  )	r   ri  r   r(   rH   rK   r&  rl  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
        rb  r=  N  r   &Running %d iterations of fuzz testing:)r   r
      r      zInserting byte %r at offset %dr
   zDeleting byte at offset %drq  zSwapping bytes %d and %dz  rL  2--------------------------------------------------Successes:  %dFailures:   %dExceptions: %d)rg  rT   rU   rV   rh  rP   r   r#  	bytearrayrandomchoice	randrangerA  insertrN  r   r&   bytesr.   FormParserError)r   ri  r   r(   
iterations	successesfailures
exceptionsr&  	fuzz_datary  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.
        ro  r   rp  d   i   z!  Testing with %d random bytes...rL  r   rs  rt  ru  rv  N)r   r#  rx  rz  rT   urandomrN  r   r&   r|  r.   r}  rA  )r   r~  r  r  r  r&  	data_sizerR   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 )NrL  s   --boundaryfoobars   --boundaryfoobar)rN  r   r]  r   r&   )r   rR   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   rE  rH  r   r   rI  %  r   z1TestFormParser.test_octet_stream.<locals>.on_fileapplication/octet-streamrE   )r  rR  r*   s   1234r   r   s   test1234)r   rM  rX   r   r.  r  r&   r.   r;   calledr   rA  rQ  r   rI  rF  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   rE  rD  r   r   rF  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   r9   r:   r   r*   r   )

reset_mockr&   r.   r;   r  r   rA  r    r'   rX   rE  rD  r  rI  r   r   r   simple_test>  s   


z4TestFormParser.test_querystring.<locals>.simple_test!application/x-www-form-urlencodedr  application/x-url-encoded)r   rM  rX   r   r.  r   )r   rF  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   rM  r.  r.   r,  r1   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   rM  r<   r   r   r   test_bad_content_typej  s   "z$TestFormParser.test_bad_content_typec                 C   r  )NrK  )r   r}  rM  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   rE  r  r   r   rI  y  r   zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_fileUPLOAD_ERROR_ON_BAD_CTETrK  z
--boundary)r  rL  rG   Fr   s   Test)r   rM  r   r}  r&   r.   rQ  )r   rR   rI  rF  r  rG   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   rE  r  r   r   rF    r   z9TestFormParser.test_handles_None_fields.<locals>.on_fieldr  r  s   foo=bar&another&baz=asdfr   r9   r:   r   r   r
   r   r   )r   rM  r&   r.   r   r    r'   )r   rF  rI  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 )Nrb  r=  rL  r
   )rg  rT   rU   rV   rh  rP   rN  rA  r   r.  r   r&   r.   r   )r   ri  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 )Nrb  r=  r
   rL  MAX_BODY_SIZErF   )rg  rT   rU   rV   rh  rP   rA  rN  r   r&   r.   r   )r   ri  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   rE  r  r   r   rI    r   z:TestFormParser.test_octet_stream_max_size.<locals>.on_filer  rE   r  rn   )r  rR  rG   s   0123456789012345689r   r  )r   rM  r&   r.   rQ  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)rA   rB   rC   rN  rQ  rU  rV  r   
http_testsra  rj  rm  rn  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rB    s4    
1#
H
%(rB  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_parserrX   r   rM  )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   sL   t  }t  }tdditd|| |jdksJ | |jd d jd d S )Nr  r     123456789012345r   r   r   )r   
parse_formr   
call_countr   	call_argsr  )r   rF  rI  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   )r\  r  r   r   rI    r   zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_filer  10)r  zContent-Lengthr  r   r   rn   )r  r   r   rA  r  )r   rI  r   r  r   test_parse_form_content_length  s   	z2TestHelperFunctions.test_parse_form_content_lengthN)rA   rB   rC   r  r  r  r  r   r   r   r   r    s
    r  c                  C   s   t  } | t jt | t jt | t jt | t jt | t jt	 | t jt
 | t jt | t jt | t jt | S r   )unittest	TestSuiteaddTestdefaultTestLoaderloadTestsFromTestCaserD   r   r   r   r   r  r2  rB  r  )suiter   r   r   r    s   r  )6rT   r   globyamlbase64rx  rI   r  compatr   r   r   ior   unittest.mockr   r   r	   	multipartrU   abspathdirname__file__curr_dirr   TestCaser   rD   r   r   r   r   r  r2  rV   rh  NON_PARAMETRIZED_TESTSr  listdirr   r|   fnamer}   	yaml_filerg  rP   r(   	safe_load	yaml_datar   r   rB  r  r  r   r   r   r   <module>   sl    6 - 7LAH

    0