U
    k<%eL˜  ã                
   @   s$  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$krnqLe*dkrLe j "e#e)d ¡Z+e,e j "e#e'¡dƒZ'e' -¡ Z.W 5 Q R X e,e+dƒZ'e /e'¡Z0W 5 Q R X e% 1e)e.e0d œ¡ qLd!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   ú]/var/www/html/Darija-Ai-API/env/lib/python3.8/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    s    zTestField.setUpc                 C   s   |   | jjd¡ d S r   )ÚassertEqualr   Ú
field_namer   r   r   r   Ú	test_name#   s    zTestField.test_namec                 C   s    | j  d¡ |  | j jd¡ d S ©Nó   test123©r   Úwriter   Úvaluer   r   r   r   Ú	test_data&   s    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   s*   | j  d¡ | j  ¡  |  | j jd¡ d S r!   )r   r$   Úfinalizer   r%   r   r   r   r   Útest_finalize0   s    
zTestField.test_finalizec                 C   s*   | j  d¡ | j  ¡  |  | j jd¡ d S r!   )r   r$   Úcloser   r%   r   r   r   r   Ú
test_close5   s    
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 r.   )r   r/   r   )r   Úf1r0   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   r/   Ú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 )Nr4   ó    )r   r   r%   Zset_noner7   r   r   r   Útest_set_noneM   s    zTestField.test_set_noneN)Ú__name__Ú
__module__Ú__qualname__r   r    r&   r)   r+   r-   r1   r3   r8   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ÚjoinrE   r   Úactual_file_nameÚ
assertTrueÚexists)r   Ú	full_pathr   r   r   Úassert_existsb   s    zTestFile.assert_existsc                 C   s   | j  d¡ |  d¡ d S ©Nó   foobar)r   r$   rM   r   r   r   r   Útest_simplef   s    zTestFile.test_simplec                 C   s2   t ƒ }d|j_|| j_| j d¡}|  |d¡ d S )Né   rW   )r   r$   Z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(   )
rB   r   r$   rR   Ú	in_memoryrM   r6   rH   Zflush_to_diskZassertIs)r   Z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é
   r^   s
   1111111111s
   2222222222s   11111111112222222222)rB   r   r$   rR   r`   r6   rM   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_DIRrb   r^   ó   12345678901)	rE   rB   r   r$   r6   r`   ÚassertIsNotNonerQ   rU   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 )Nrd   TÚUPLOAD_KEEP_FILENAMErb   r^   re   r4   ©	rE   rB   r   r$   r6   r`   r   rQ   rU   r   r   r   r   Útest_file_full_nameš   s    

zTestFile.test_file_full_namec                 C   s`   | j | jd< d| jd< d| jd< d| jd< | j d¡ |  | jj¡ |  | jjd¡ |  ¡  d S ©	Nrd   Trh   ÚUPLOAD_KEEP_EXTENSIONSrb   r^   re   r?   ri   r   r   r   r   Útest_file_full_name_with_ext¨   s    


z%TestFile.test_file_full_name_with_extc                 C   s`   | j | jd< d| jd< d| jd< d| jd< | j d¡ |  | jj¡ |  | jjd¡ |  ¡  d S rk   ri   r   r   r   r   rm   ¶   s    


c                 C   sZ   d| j d< d| j d< | j d¡ |  | jj¡ tj | jj¡d }|  	|d¡ |  
¡  d S )NTrl   rb   r^   re   r   s   .txt)rB   r   r$   r6   r`   rN   rO   ÚsplitextrQ   r   rU   )r   Úextr   r   r   Útest_no_dir_with_extensionÄ   s    

z#TestFile.test_no_dir_with_extensionc              	   C   sT   t tj ddd¡ƒ| jd< d| jd< d| jd< |  t¡ | j d	¡ W 5 Q R X d S )
Nú/ÚtmpÚnotexistingrd   Trh   rY   r^   ó
   1234567890©	r   rN   rO   rP   rB   ÚassertRaisesZ	FileErrorr   r$   r   r   r   r   Útest_invalid_dir_with_nameÑ   s
    

z#TestFile.test_invalid_dir_with_namec              	   C   sT   t tj ddd¡ƒ| jd< d| jd< d| jd< |  t¡ | j d	¡ W 5 Q R X d S )
Nrq   rr   rs   rd   Frh   rY   r^   rt   ru   r   r   r   r   Útest_invalid_dir_no_nameÛ   s
    

z!TestFile.test_invalid_dir_no_nameN)r;   r<   r=   r   rM   rU   rX   r]   ra   rc   rg   rj   rm   rp   rw   rx   r   r   r   r   r>   U   s   
r>   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   s(   t dƒ\}}|  |d¡ |  |i ¡ d S )Nzapplication/jsonó   application/json©Zparse_options_headerr   ©r   ÚtÚpr   r   r   rX   é   s    z"TestParseOptionsHeader.test_simplec                 C   s(   t dƒ\}}|  |d¡ |  |i ¡ d S )NÚ r9   r{   r|   r   r   r   Ú
test_blankî   s    z!TestParseOptionsHeader.test_blankc                 C   s,   t dƒ\}}|  |d¡ |  |ddi¡ d S )Nzapplication/json;par=valrz   ó   paró   valr{   r|   r   r   r   Útest_single_paramó   s    z(TestParseOptionsHeader.test_single_paramc                 C   s,   t dƒ\}}|  |d¡ |  |ddi¡ d S )Ns   application/json;     par=valrz   r   r‚   r{   r|   r   r   r   Útest_single_param_with_spacesø   s    z4TestParseOptionsHeader.test_single_param_with_spacesc                 C   s.   t dƒ\}}|  |d¡ |  |dddœ¡ d S )Ns!   application/json;par=val;asdf=foorz   r‚   r4   )r   ó   asdfr{   r|   r   r   r   Útest_multiple_paramsý   s    z+TestParseOptionsHeader.test_multiple_paramsc                 C   s,   t dƒ\}}|  |d¡ |  |ddi¡ d S )Ns   application/json;param="quoted"rz   ó   params   quotedr{   r|   r   r   r   Útest_quoted_param  s    z(TestParseOptionsHeader.test_quoted_paramc                 C   s    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  s    z7TestParseOptionsHeader.test_quoted_param_with_semicolonc                 C   s    t dƒ\}}|  |d d¡ d S )Ns1   application/json;param="This \" is \" a \" quote"r‡   s   This " is " a " quoter{   r|   r   r   r   Útest_quoted_param_with_escapes  s    z5TestParseOptionsHeader.test_quoted_param_with_escapesc                 C   s    t dƒ\}}|  |d d¡ d S )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)r;   r<   r=   rX   r€   rƒ   r„   r†   rˆ   r‰   rŠ   rŒ   r   r   r   r   ry   è   s   ry   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  s    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)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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   s>   |  dd¡r| j ¡  |  | jt|ƒ¡ | dd¡r:g | _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                    s   ˆ   | ||… ¡ d S r   ©Úappend©rL   ÚstartÚend)Úname_bufferr   r   Úon_field_name;  s    z2TestQuerystringParser.reset.<locals>.on_field_namec                    s   ˆ   | ||… ¡ d S r   r   rŸ   )Údata_bufferr   r   Úon_field_data>  s    z2TestQuerystringParser.reset.<locals>.on_field_datac                      s4   ˆj  d ˆ¡d ˆ ¡f¡ ˆd d …= ˆ d d …= d S ©Nr9   )r   rž   rP   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   s   | j  d¡ |  d¡ d S )Nó   foo=bar©r4   r5   ©r~   r$   rœ   r   r   r   r   Útest_simple_querystringR  s    z-TestQuerystringParser.test_simple_querystringc                 C   s   | j  d¡ |  d¡ d S )Ns   &foo=barr«   r¬   r   r   r   r   Ú test_querystring_blank_beginningW  s    z6TestQuerystringParser.test_querystring_blank_beginningc                 C   s   | j  d¡ |  d¡ d S )Nó   foo=bar&r«   r¬   r   r   r   r   Útest_querystring_blank_end\  s    z0TestQuerystringParser.test_querystring_blank_endc                 C   s   | j  d¡ |  dd¡ d S )Ns   foo=bar&asdf=bazr«   ©r…   ó   bazr¬   r   r   r   r   Útest_multiple_querystringa  s
    þ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)r4   s   onetwothrees   f=bazr±   r¬   r   r   r   r   Útest_streaming_breaku  s    þÿz*TestQuerystringParser.test_streaming_breakc                 C   s   | j  d¡ |  dd¡ d S )Ns   foo=bar;asdf=bazr«   r±   r¬   r   r   r   r   Útest_semicolon_separatorŠ  s
    þ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   s$   |   t¡ tdd}W 5 Q R X d S )Niœÿÿÿ©rº   )rv   Ú
ValueErrorr©   )r   r~   r   r   r   Útest_invalid_max_size  s    z+TestQuerystringParser.test_invalid_max_sizec                 C   s`   d}t |ƒD ]N\}}|  ¡  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   rL   ÚfirstÚlastr   r   r   Útest_strict_parsing_pass¡  s    z.TestQuerystringParser.test_strict_parsing_passc              
   C   sŠ   d}t |ƒD ]x\}}|  ¡  d| j_d}|  t¡0}|| j |¡7 }|| j |¡7 }| j ¡  W 5 Q R X |d k	r|  |j	j
d| ¡ qd S )Nó   foo=bar&&another=asdfTr   é   )rÂ   r–   r~   rÃ   rv   ÚQuerystringParseErrorr$   r*   r   Ú	exceptionÚoffset)r   rL   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 ]V\}}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   rL   rÅ   rÆ   rÍ   r   r   r   Útest_double_sep¾  s    z%TestQuerystringParser.test_double_sepc              	   C   sF   d| j _|  t¡}| j  d¡ W 5 Q R X |d k	rB|  |jjd¡ d S )NTó   foo=bar&blank&another=asdfrÉ   )r~   rÃ   rv   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   blankr9   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   Z_ignoredr   r   r   Ú	test_reprÚ  s    zTestQuerystringParser.test_reprN)r;   r<   r=   rœ   r   r–   r­   r®   r°   r³   rµ   r¶   r·   r»   r¾   rÇ   rÏ   rÑ   rÓ   rÔ   rÖ   r   r   r   r   r•   )  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                      s   ˆ  j d7  _ d S ©Nr   )Ústartedr   r   r   r   Úon_startå  s    z-TestOctetStreamParser.setUp.<locals>.on_startc                    s   ˆ j  | ||… ¡ d S r   )rE   rž   rŸ   r   r   r   Úon_dataè  s    z,TestOctetStreamParser.setUp.<locals>.on_datac                      s   ˆ  j d7  _ d S rØ   )Úfinishedr   r   r   r   Úon_endë  s    z+TestOctetStreamParser.setUp.<locals>.on_end)rÚ   rÛ   rÝ   )rE   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   rP   rE   ©r   rL   r*   r   r   r   rM   ö  s    z!TestOctetStreamParser.assert_datac                 C   s&   |r|   | jd¡ n|   | jd¡ d S ©Nr   r   )r   rÙ   ©r   r   r   r   r   Úassert_startedú  s    z$TestOctetStreamParser.assert_startedc                 C   s&   |r|   | jd¡ n|   | jd¡ d S rà   )r   rÜ   rá   r   r   r   Úassert_finished   s    z%TestOctetStreamParser.assert_finishedc                 C   sH   |   d¡ | j d¡ |   ¡  |  d¡ |  d¡ | j ¡  |  ¡  d S )NFrW   )râ   r~   r$   rM   rã   r*   r   r   r   r   rX     s    



z!TestOctetStreamParser.test_simplec                 C   sD   | j  d¡ | j  d¡ | j  d¡ | j  ¡  |  d¡ |  ¡  d S )Nr4   r5   r²   s	   foobarbaz)r~   r$   r*   rM   rã   r   r   r   r   Útest_multiple_chunks  s    

z*TestOctetStreamParser.test_multiple_chunksc                 C   s4   d| j _| j  d¡ | j  ¡  |  d¡ |  ¡  d S )NrY   ó
   0123456789s   01234)r~   rº   r$   r*   rM   rã   r   r   r   r   Útest_max_size  s
    

z#TestOctetStreamParser.test_max_sizec              	   C   s$   |   t¡ tdd}W 5 Q R X d S )Nr   r¼   )rv   r½   rÞ   ©r   Úqr   r   r   r¾   &  s    z+TestOctetStreamParser.test_invalid_max_sizeN)T)T)T)r;   r<   r=   r   rM   râ   rã   rX   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   s   t ƒ | _t| jƒ| _d S r   )r   r   ÚBase64DecoderrE   r   r   r   r   r   -  s    zTestBase64Decoder.setUpTc                 C   sF   |r| j  ¡  | j d¡ |  | j ¡ |¡ | j d¡ | j ¡  d S rG   ©rE   r*   r   rI   r   rJ   rK   rß   r   r   r   rM   1  s    
zTestBase64Decoder.assert_datac                 C   s   | j  d¡ |  d¡ d S )Nó   Zm9vYmFyrW   ©rE   r$   rM   r   r   r   r   rX   :  s    zTestBase64Decoder.test_simplec              	   C   s&   |   t¡ | j d¡ W 5 Q R X d S )Ns   Zm9v!mFy)rv   ÚDecodeErrorrE   r$   r   r   r   r   Útest_bad>  s    zTestBase64Decoder.test_badc                 C   s&   | j  d¡ | j  d¡ |  d¡ d S )Nó   Zm9vs   YmFyrW   rí   r   r   r   r   Útest_split_properlyB  s    z%TestBase64Decoder.test_split_properlyc                 C   s\   d}t ddƒD ]H}|d |… ||d …  }}|  ¡  | j |¡ | j |¡ |  d¡ qd S )Nrð   r   é   r4   ©Úranger   rE   r$   rM   ©r   ZbuffÚirÅ   Úsecondr   r   r   Útest_bad_splitG  s    z TestBase64Decoder.test_bad_splitc                 C   s\   d}t ddƒD ]H}|d |… ||d …  }}|  ¡  | j |¡ | j |¡ |  d¡ qd S )Nrì   rY   rÉ   rW   ró   rõ   r   r   r   Útest_long_bad_splitQ  s    z%TestBase64Decoder.test_long_bad_splitc                 C   s6   t ƒ }t|ƒ}| ¡  |j ¡  | ¡  |j ¡  d S r   )r   rê   r*   Úassert_called_once_withr,   ©r   Úparserr   r   r   r   Útest_close_and_finalize[  s    
z)TestBase64Decoder.test_close_and_finalizec              	   C   s0   | j  d¡ |  t¡ | j  ¡  W 5 Q R X d S )Ns   Zm9vYmF)rE   r$   rv   rî   r*   r   r   r   r   Útest_bad_lengthe  s    z!TestBase64Decoder.test_bad_lengthN)T)r;   r<   r=   r   rM   rX   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   s   t ƒ | _t| jƒ| _d S r   )r   r   ÚQuotedPrintableDecoderrE   r   r   r   r   r   m  s    z TestQuotedPrintableDecoder.setUpTc                 C   sF   |r| j  ¡  | j d¡ |  | j ¡ |¡ | j d¡ | j ¡  d S rG   rë   rß   r   r   r   rM   q  s    
z&TestQuotedPrintableDecoder.assert_datac                 C   s   | j  d¡ |  d¡ d S rV   rí   r   r   r   r   rX   z  s    z&TestQuotedPrintableDecoder.test_simplec                 C   s   | j  d¡ |  d¡ d S )Ns	   foo=3Dbarrª   rí   r   r   r   r   Útest_with_escape~  s    z+TestQuotedPrintableDecoder.test_with_escapec                 C   s   | j  d¡ |  d¡ d S )Ns	   foo=
barrW   rí   r   r   r   r   Útest_with_newline_escape‚  s    z3TestQuotedPrintableDecoder.test_with_newline_escapec                 C   s   | j  d¡ |  d¡ d S )Ns   foo=
barrW   rí   r   r   r   r   Útest_with_only_newline_escape†  s    z8TestQuotedPrintableDecoder.test_with_only_newline_escapec                 C   s&   | j  d¡ | j  d¡ |  d¡ d S )Ns   foo=3s   Dbarrª   rí   r   r   r   r   Útest_with_split_escapeŠ  s    z1TestQuotedPrintableDecoder.test_with_split_escapec                 C   s&   | j  d¡ | j  d¡ |  d¡ d S )Ns   foo=s   
barrW   rí   r   r   r   r   Ú test_with_split_newline_escape_1  s    z;TestQuotedPrintableDecoder.test_with_split_newline_escape_1c                 C   s&   | j  d¡ | j  d¡ |  d¡ d S )Ns   foo=s   
barrW   rí   r   r   r   r   Ú test_with_split_newline_escape_2”  s    z;TestQuotedPrintableDecoder.test_with_split_newline_escape_2c                 C   s6   t ƒ }t|ƒ}| ¡  |j ¡  | ¡  |j ¡  d S r   )r   r   r*   rú   r,   rû   r   r   r   rý   ™  s    
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_alignedN)T)r;   r<   r=   r   rM   rX   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   s6   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                    s   ˆ j  | ¡ d S r   )Úfieldsrž   ©r   r   r   r   Úon_fieldã  s    z%TestFormParser.make.<locals>.on_fieldc                    s   ˆ j  | ¡ d S r   )Úfilesrž   r  r   r   r   Úon_fileæ  s    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)ÚboundaryrA   )r  r  r  Ú
FormParserr   )r   r  rA   r  r  rÝ   r   r   r   ÚmakeÞ  s    
 ÿzTestFormParser.makec                 C   s(   |j }| d¡ | ¡ }|  ||¡ d S rG   )rH   rI   rJ   r   )r   r   rL   ÚoÚ	file_datar   r   r   Úassert_file_datað  s    
zTestFormParser.assert_file_datac                 C   sf   d }| j D ]}|j|kr
|} q"q
|  |¡ z*|  ||¡ |  |j|¡ | j  |¡ W 5 | ¡  X d S r   )r  r   rf   r,   r  r   Ú	file_nameÚremove)r   r   r  rL   Úfoundr   r   r   r   Úassert_fileö  s    


zTestFormParser.assert_filec                 C   sJ   d }| j D ]}|j|kr
|} q"q
|  |¡ |  ||j¡ | j  |¡ d S r   )r  r   rf   r   r%   r  )r   r
  r%   r  r   r   r   r   Úassert_field  s    


zTestFormParser.assert_fieldÚparamc              
   C   s<  |d d }t |tƒr | d¡}|  |¡ d }z| j |d ¡}| j ¡  W n* tk
rv } zd}|}W 5 d }~X Y nX d|d d kr°|  |¡ |  	|d d d |j
¡ d S |  	|t|d ƒ¡ |d d D ]f}|d }|d	  d¡}|d
kr|  ||d ¡ qÐ|dkr.|  ||d  d¡|d ¡ qÐdsÐt‚qÐd S )Nr  r  zlatin-1r  r   ÚerrorÚexpectedÚtyper
  ÚfieldrL   Úfiler  F)r   r   r   r  r   r$   r*   ÚMultipartParseErrorrf   r   rÌ   r  r   r  ÚAssertionError)r   r!  r  ÚexcÚ	processedÚer$  r
  r   r   r   Ú	test_http  s8    





ýzTestFormParser.test_httpc              	   C   s¤   d}t tj t|¡dƒ}| ¡ }W 5 Q R X t|ƒD ]j\}}|  d¡ d}|| j 	|¡7 }|| j 	|¡7 }| j 
¡  |  |t|ƒ¡ |  dd¡ |  ddd	¡ q4d
S )zz
        This test runs a simple multipart body with one field and one file
        through every possible split.
        úsingle_field_single_file.httpr	  r  r   ó   fieldó   test1ó   filer‹   ó   test2N)ÚopenrN   rO   rP   Úhttp_tests_dirrJ   rÂ   r  r   r$   r*   r   r  r   r  )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 5 Q R X |  d¡ d}tt|ƒƒD ]$}|||d … }|| j	 
|¡7 }qF| j	 ¡  |  |t|ƒ¡ |  dd¡ |  dd	d
¡ dS )úL
        This test parses a simple multipart body 1 byte at a time.
        r-  r	  r  r   r   r.  r/  r0  r‹   r1  N)r2  rN   rO   rP   r3  rJ   r  rô   r  r   r$   r*   r   r   r  )r   r4  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 5 Q R X tdt|ƒd ƒD ]˜}t|ƒD ]Š}|  d¡ d}| j	 
|d|… ¡ ||7 }t|t|ƒ|ƒD ]$}|||| … }|| j	 
|¡7 }qˆ| j	 ¡  |  |t|ƒ¡ |  dd¡ qJq>dS )	r6  zsingle_field_blocks.httpr	  r   r  r   Nr.  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)r2  rN   rO   rP   r3  rJ   rô   r  r  r   r$   r*   r   r   )	r   r4  r   r&   rB   rE   rö   r7  rŽ   r   r   r   Útest_feed_blocks†  s"    

ÿzTestFormParser.test_feed_blocksc              	   C   sÐ  d}t tj t|¡dƒ}| ¡ }W 5 Q R X d}d}d}d}td|f ƒ t|ƒD ]D}t|ƒ}	t	 
dddg¡}
|
dkrªt	 t|ƒ¡}t	 d	¡}|	 ||¡ d
||f }nv|
dkrÒt	 t|ƒ¡}|	|= d|f }nN|
dkr t	 t|ƒd ¡}|	|d  |	|  |	|< |	|d < d||d f }td| ƒ |  d¡ d}z| j t|	ƒ¡}| j ¡  W n tk
rv   |d7 }Y qRX |t|	ƒkr|d7 }qR|d7 }qRt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	  éè  r   ú&Running %d iterations of fuzz testing:r   r
   é   é   zInserting byte %r at offset %dzDeleting byte at offset %dzSwapping bytes %d and %dz  r  ú2--------------------------------------------------úSuccesses:  %dúFailures:   %dúExceptions: %dN)r2  rN   rO   rP   r3  rJ   rÄ   rô   Ú	bytearrayÚrandomÚchoiceÚ	randranger  Úinsertr  r   r$   Úbytesr*   ÚFormParserError)r   r4  r   r&   Ú
iterationsÚ	successesÚfailuresÚ
exceptionsrö   Z	fuzz_datarD  rŽ   Úmsgr   r   r   Útest_request_body_fuzz©  sN    

"


z%TestFormParser.test_request_body_fuzzc              	   C   sî   d}d}d}d}t d|f ƒ t|ƒD ]}t dd¡}t |¡}t d|f ƒ |  d¡ d}z| j t	|ƒ¡}| j 
¡  W n tk
r–   |d7 }Y q&X |t|ƒkr®|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.
        r:  r   r;  éd   i   z!  Testing with %d random bytes...r  r   r>  r?  r@  rA  N)rÄ   rô   rC  rE  rN   Úurandomr  r   r$   rG  r*   rH  r  )r   rI  rJ  rK  rL  rö   Ú	data_sizerL   r   r   r   Ú"test_request_body_fuzz_random_dataò  s.    



z1TestFormParser.test_request_body_fuzz_random_datac              	   C   sd   |   d¡ d}|  t¡ | j |¡ W 5 Q R X |   d¡ d}|  t¡ | j |¡}W 5 Q R X d S )Nr  s   --boundaryfoobars   --boundaryfoobar)r  rv   r'  r   r$   )r   rL   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                    s   ˆ   | ¡ d S r   r   r  ©r  r   r   r  %  s    z1TestFormParser.test_octet_stream.<locals>.on_fileúapplication/octet-streamr?   )rÝ   r  r'   s   1234r   r   s   test1234)r   r  rR   r   rü   rÞ   r$   r*   r6   Úcalledr   r  r  ©r   r  r  rÝ   r   r   rT  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                    s   ˆ   | ¡ d S r   r   r  ©r  r   r   r  9  s    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   r4   r5   r   r'   r…   )
Z
reset_mockr$   r*   r6   rV  r   r  r   r%   rR   r  ©r  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  rR   r   rü   r©   )r   r  r[  r   r   rZ  r   Útest_querystring7  s    zTestFormParser.test_querystringc                 C   s@   t ƒ }tdd d ƒ}||_| ¡  |j ¡  | ¡  |j ¡  d S )Nr^  )r   r  rü   r*   rú   r,   rû   r   r   r   Útest_close_methods_  s    
z!TestFormParser.test_close_methodsc              	   C   s&   |   t¡ tdd d ƒ}W 5 Q R X d S )Nzapplication/bad)rv   r½   r  r7   r   r   r   Útest_bad_content_typej  s    z$TestFormParser.test_bad_content_typec              	   C   s&   |   t¡ tdd d ƒ}W 5 Q R X d S )Nr  )rv   rH  r  r7   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 5 Q R X 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                    s   ˆ   | ¡ d S r   r   r  rT  r   r   r  y  s    zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_fileZUPLOAD_ERROR_ON_BAD_CTETr  z
--boundary)rÝ   r  rA   Fr   s   Test)r   r  rv   rH  r$   r*   r  )r   rL   r  r  rÝ   rA   r   r   rT  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                    s   ˆ   | ¡ d S r   r   r  rY  r   r   r  ’  s    z9TestFormParser.test_handles_None_fields.<locals>.on_fieldr\  r]  s   foo=bar&another&baz=asdfr   r4   r5   r   rÁ   r
   r²   r…   )r   r  r$   r*   r   r   r%   )r   r  r  rÝ   r   r   rY  r   Útest_handles_None_fields  s    
z'TestFormParser.test_handles_None_fieldsc              	   C   sv   d}t tj t|¡dƒ}| ¡ }W 5 Q R X |  d¡ t|ƒd | jj	_
| j |¡}| j ¡  |  |t|ƒd ¡ d S )Nr-  r	  r  r
   )r2  rN   rO   rP   r3  rJ   r  r  r   rü   rº   r$   r*   r   )r   r4  r   r&   rö   r   r   r   Útest_max_size_multipart¤  s    

z&TestFormParser.test_max_size_multipartc              	   C   sx   d}t tj t|¡dƒ}| ¡ }W 5 Q R X t|ƒd }| jdd|id | j 	|¡}| j 
¡  |  |t|ƒd ¡ d S )Nr-  r	  r
   r  ÚMAX_BODY_SIZEr@   )r2  rN   rO   rP   r3  rJ   r  r  r   r$   r*   r   )r   r4  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                    s   ˆ   | ¡ d S r   r   r  rT  r   r   r  Ê  s    z:TestFormParser.test_octet_stream_max_size.<locals>.on_filerU  r?   rf  rb   )rÝ   r  rA   s   0123456789012345689r   rå   )r   r  r$   r*   r  rW  r   rT  r   Útest_octet_stream_max_sizeÈ  s     þ
z)TestFormParser.test_octet_stream_max_sizec              	   C   s&   |   t¡ tddd}W 5 Q R X d S )Ns   boundr   r¼   )rv   r½   ZMultipartParserrç   r   r   r   Útest_invalid_max_size_multipartØ  s    z.TestFormParser.test_invalid_max_size_multipartN)r;   r<   r=   r  r  r  r   r   Ú
http_testsr,  r5  r8  r9  r   rN  rR  rS  rX  r_  r`  ra  rb  rc  rd  re  rh  ri  rj  r   r   r   r   r  Ü  s2   
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-TyperU  )Úcreate_form_parserrR   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 5 Q R X d S r   )rv   r½   rn  )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s0t‚|  |jd d jd¡ d S )Nrm  rU  ó   123456789012345r   r   r¸   )r   Ú
parse_formr   Z
call_countr(  r   Z	call_argsrg  )r   r  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                    s   ˆ   | ¡ d S r   r   )r&  rT  r   r   r  ü  s    zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_filerU  Ú10)rm  zContent-Lengthrs  r   r   rb   )rt  r   r   r  rg  )r   r  r   rT  r   Útest_parse_form_content_lengthú  s    ÿú	z2TestHelperFunctions.test_parse_form_content_lengthN)r;   r<   r=   rp  rr  ru  rw  r   r   r   r   rl  Ý  s   rl  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   )ÚunittestZ	TestSuiteZaddTestZdefaultTestLoaderZloadTestsFromTestCaser>   ry   r   r•   r×   ré   rÿ   r  rl  )Úsuiter   r   r   ry    s    ry  )6rN   r   ÚglobÚyamlÚbase64rC  rC   rx  Úcompatr   r   r   Úior   Zunittest.mockr   r   r	   Ú	multipartrO   ÚabspathÚdirnameÚ__file__Zcurr_dirr   ZTestCaser   r>   ry   r   r•   r×   ré   rÿ   rP   r3  ZNON_PARAMETRIZED_TESTSrk  Úlistdirr   rn   Úfnamero   Z	yaml_filer2  rJ   r&   Z	safe_loadZ	yaml_datarž   rÂ   r  rl  ry  r   r   r   r   Ú<module>   sd   6 - 7LAH

ý    0