o
    ñÅ[h—  ã                	   @   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 r½q®e.dkre j %e&e-d ¡Z/e0e j %e&e+¡d ƒZ+e+ 1¡ Z2W d  ƒ n1 säw   Y  e0e/d ƒZ+e 3e+¡Z4W d  ƒ n1 sþw   Y  e) 5e-e2e4d!œ¡ q®d"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   ú…/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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_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)   Z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?   rA   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ÚjoinrL   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(   rT   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-   )
rI   r   r(   rY   Ú	in_memoryrT   r=   rO   Zflush_to_diskZassertIs)r   Z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é
   rh   s
   1111111111s
   2222222222s   11111111112222222222)rI   r   r(   rY   rj   r=   rT   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_DIRrl   rh   ó   12345678901)	rL   rI   r   r(   r=   rj   ÚassertIsNotNonerX   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 )Nrn   TÚUPLOAD_KEEP_FILENAMErl   rh   ro   r;   ©	rL   rI   r   r(   r=   rj   r!   rX   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 ©	Nrn   Trr   ÚUPLOAD_KEEP_EXTENSIONSrl   rh   ro   rF   rs   r   r   r   r   Útest_file_full_name_with_ext¬   ó   


z%TestFile.test_file_full_name_with_extc                 C   ru   rv   rs   r   r   r   r   rx   º   ry   c                 C   sZ   d| j d< d| j d< | j d¡ |  | jj¡ tj | jj¡d }|  	|d¡ |  
¡  d S )NTrw   rl   rh   ro   r   s   .txt)rI   r   r(   r=   rj   rU   rV   ÚsplitextrX   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Únotexistingrn   Trr   rb   rh   ó
   1234567890©	r   rU   rV   rW   rI   ÚassertRaisesZ	FileErrorr   r(   r   r   r   r   Útest_invalid_dir_with_nameÕ   ó   

"ÿz#TestFile.test_invalid_dir_with_namec                 C   r}   )
Nr~   r   r€   rn   Frr   rb   rh   r   r‚   r   r   r   r   Útest_invalid_dir_no_nameß   r…   z!TestFile.test_invalid_dir_no_nameN)rB   rC   rD   r   rT   r\   r`   rg   rk   rm   rq   rt   rx   r|   r„   r†   r   r   r   r   rE   Y   s    
rE   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©Z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“   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)rB   rC   rD   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   )Z
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¡   Zset_callbackÚcallbackr!   )r   r¥   r   r£   r   Útest_callbacks  s   zTestBaseParser.test_callbacksN)rB   rC   rD   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©rS   Ú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²   rW   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   rS   Ú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   rS   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   rS   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)rB   rC   rD   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   )rL   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ö   )rL   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!   rW   rL   ©r   rS   r0   r   r   r   rT   ö  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(   rT   rþ   r0   r   r   r   r   r`     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   rT   rþ   r   r   r   r   Útest_multiple_chunks  s   

z*TestOctetStreamParser.test_multiple_chunksc                 C   s4   d| j _| j  d¡ | j  ¡  |  d¡ |  ¡  d S )Nrb   ó
   0123456789s   01234)r   rÓ   r(   r0   rT   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)rB   rC   rD   r   rT   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   ÚBase64DecoderrL   r   r   r   r   r   -  ó   zTestBase64Decoder.setUpTc                 C   óF   |r| j  ¡  | j d¡ |  | j ¡ |¡ | j d¡ | j ¡  d S rN   ©rL   r0   r   rP   r!   rQ   rR   rø   r   r   r   rT   1  ó   
zTestBase64Decoder.assert_datac                 C   r¿   )Nó   Zm9vYmFyr_   ©rL   r(   rT   r   r   r   r   r`   :  ra   zTestBase64Decoder.test_simplec                 C   s<   |   t¡ | j d¡ W d   ƒ d S 1 sw   Y  d S )Ns   Zm9v!mFy)rƒ   ÚDecodeErrorrL   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   rL   r(   rT   ©r   ZbuffÚirß   Úsecondr   r   r   Útest_bad_splitG  ó   úz TestBase64Decoder.test_bad_splitc                 C   r  )Nr  rb   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)rL   r(   rƒ   r  r0   r   r   r   r   Útest_bad_lengthe  s   "ÿz!TestBase64Decoder.test_bad_lengthNr  )rB   rC   rD   r   rT   r`   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   ÚQuotedPrintableDecoderrL   r   r   r   r   r   m  r  z TestQuotedPrintableDecoder.setUpTc                 C   r	  rN   r
  rø   r   r   r   rT   q  r  z&TestQuotedPrintableDecoder.assert_datac                 C   r]   r^   r  r   r   r   r   r`   z  ra   z&TestQuotedPrintableDecoder.test_simplec                 C   r¿   )Ns	   foo=3DbarrÀ   r  r   r   r   r   Útest_with_escape~  ra   z+TestQuotedPrintableDecoder.test_with_escapec                 C   r¿   )Ns	   foo=
barr_   r  r   r   r   r   Útest_with_newline_escape‚  ra   z3TestQuotedPrintableDecoder.test_with_newline_escapec                 C   r¿   )Ns   foo=
barr_   r  r   r   r   r   Útest_with_only_newline_escape†  ra   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   r'  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  )rB   rC   rD   r   rT   r`   r(  r)  r*  r+  r,  r-  r#  r.  r   r   r   r   r&  l  s    
	
r&  r*   ÚhttpZ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                    r6  r   )Úfilesr²   r8  r   r   r   Úon_fileæ  r:  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)ÚboundaryrH   )r=  r;  r7  Ú
FormParserr   )r   r?  rH   r9  r<  rö   r   r   r   ÚmakeÞ  s   
ÿzTestFormParser.makec                 C   s(   |j }| d¡ | ¡ }|  ||¡ d S rN   )rO   rP   rQ   r!   )r   r   rS   Ú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   )r;  r"   rp   rD  r!   Ú	file_nameÚremover3   )r   r"   rE  rS   Ú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   )r7  r"   rp   r!   r)   rF  )r   r1  r)   rG  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 )Nr3  r?  zlatin-1r2  r   ÚerrorÚexpectedÚtyper1  ÚfieldrS   ÚfilerE  )r   r	   r   rA  r   r(   r0   ÚMultipartParseErrorrp   r!   ræ   r4  rI  rH  )r   rJ  r?  ÚexcÚ	processedÚerM  r1  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.httpr0  Nr?  r   ó   fieldó   test1ó   filerž   ó   test2)ÚopenrU   rV   rW   Úhttp_tests_dirrQ   rÜ   rA  r   r(   r0   r!   r4  rI  rH  )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.
        rU  r0  Nr?  r   r   rV  rW  rX  rž   rY  )rZ  rU   rV   rW   r[  rQ   rA  r  r4  r   r(   r0   r!   rI  rH  )r   r\  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 )	r^  zsingle_field_blocks.httpr0  Nr   r?  r   rV  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)rZ  rU   rV   rW   r[  rQ   r  r4  rA  r   r(   r0   r!   rI  )	r   r\  r   r*   rI   rL   r  r_  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r—t	 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
        rU  r0  Néè  r   ú&Running %d iterations of fuzz testing:)r   r   é   r   é   zInserting byte %r at offset %dr   zDeleting byte at offset %drd  zSwapping bytes %d and %dz  r?  ú2--------------------------------------------------úSuccesses:  %dúFailures:   %dúExceptions: %d)rZ  rU   rV   rW   r[  rQ   rÞ   r  Ú	bytearrayÚrandomÚchoiceÚ	randranger4  ÚinsertrA  r   r(   Úbytesr0   ÚFormParserError)r   r\  r   r*   Ú
iterationsÚ	successesÚfailuresÚ
exceptionsr  Z	fuzz_datarl  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.
        rb  r   rc  éd   i   z!  Testing with %d random bytes...r?  r   rf  rg  rh  ri  N)rÞ   r  rk  rm  rU   ÚurandomrA  r   r(   ro  r0   rp  r4  )r   rq  rr  rs  rt  r  Ú	data_sizerS   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 )Nr?  s   --boundaryfoobars   --boundaryfoobar)rA  rƒ   rP  r   r(   )r   rS   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±   r8  ©r;  r   r   r<  %  r    z1TestFormParser.test_octet_stream.<locals>.on_fileúapplication/octet-streamrF   )rö   rE  r,   s   1234r   r   s   test1234)r   r@  rY   r   r"  r÷   r(   r0   r=   Úcalledr!   r4  rD  ©r   r<  r9  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±   r8  ©r7  r   r   r9  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—   )
Z
reset_mockr(   r0   r=   r  r!   r4  r"   r)   rY   r8  ©r7  rö   r<  r   r   r   Úsimple_test>  s   


z4TestFormParser.test_querystring.<locals>.simple_testú!application/x-www-form-urlencoded©rö   úapplication/x-url-encoded)r   r@  rY   r   r"  r¾   )r   r9  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   r@  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×   r@  r>   r   r   r   Útest_bad_content_typej  s   "ÿz$TestFormParser.test_bad_content_typec                 C   rŠ  )Nr>  )rƒ   rp  r@  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±   r8  r}  r   r   r<  y  r    zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_fileZUPLOAD_ERROR_ON_BAD_CTETr>  z
--boundary)rö   r?  rH   Fr   s   Test)r   r@  rƒ   rp  r(   r0   rD  )r   rS   r<  r9  rö   rH   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±   r8  r‚  r   r   r9  ’  r    z9TestFormParser.test_handles_None_fields.<locals>.on_fieldr…  r†  s   foo=bar&another&baz=asdfr   r;   r<   r   rÛ   r   rÊ   r—   )r   r@  r(   r0   r!   r"   r)   )r   r9  r<  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 )NrU  r0  r?  r   )rZ  rU   rV   rW   r[  rQ   rA  r4  r   r"  rÓ   r(   r0   r!   )r   r\  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 )NrU  r0  r   r?  ÚMAX_BODY_SIZErG   )rZ  rU   rV   rW   r[  rQ   r4  rA  r   r(   r0   r!   )r   r\  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±   r8  r}  r   r   r<  Ê  r    z:TestFormParser.test_octet_stream_max_size.<locals>.on_filer~  rF   r  rl   )rö   rE  rH   s   0123456789012345689r   r   )r   r@  r(   r0   rD  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×   ZMultipartParserr  r   r   r   Útest_invalid_max_size_multipartØ  r  z.TestFormParser.test_invalid_max_size_multipartN)rB   rC   rD   rA  rD  rH  rI  r   Ú
http_testsrT  r]  r`  ra  r   rv  rz  r{  r  rˆ  r‰  r‹  rŒ  r  rŽ  r  r’  r“  r”  r   r   r   r   r5  Ü  s4    
1#
H
%(r5  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_parserrY   r   r@  )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   Zassert_called_oncer!   Z	call_argsr‘  )r   r9  r<  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±   )rO  r}  r   r   r<  ü  r    zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_filer~  Ú10)r—  zContent-Lengthr  r   r   rl   )rž  r   r!   r4  r‘  )r   r<  r   r}  r   Útest_parse_form_content_lengthú  s   ÿú	z2TestHelperFunctions.test_parse_form_content_lengthN)rB   rC   rD   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   Z	TestSuiteZaddTestZ	makeSuiterE   r‡   r    r¨   rî   r  r&  r5  r–  )Úsuiter   r   r   r¢    s   r¢  ):rU   r   ÚglobÚyamlÚbase64rk  rJ   Úcompatr   r   r   r   Úior   Úsixr   r	   Zmockr
   r   r   Ú	multipartrV   ÚabspathÚdirnameÚ__file__Zcurr_dirr   ZTestCaser   rE   r‡   r    r¨   rî   r  r&  rW   r[  ÚsetZNON_PARAMETRIZED_TESTSr•  Úlistdirr   rz   Úfnamer{   Z	yaml_filerZ  rQ   r*   ÚloadZ	yaml_datar²   rÜ   r5  r–  r¢  r   r   r   r   Ú<module>   sl   6 - 3LAH


ÿÿý€    0