
    iL                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrSSKJ	r	J
r
Jr  S SKJr  S SKJrJrJr  SSK7  \ R&                  R)                  \ R&                  R+                  \5      5      rS r " S	 S
\R2                  5      r " S S\R2                  5      r " S S\R2                  5      r " S S\R2                  5      r " S S\R2                  5      r " S S\R2                  5      r " S S\R2                  5      r  " S S\R2                  5      r!\ R&                  RE                  \SS5      r#S1r$/ r%\ RL                  " \#5       H  r'\ R&                  RQ                  \'5      u  r)r*\)\$;   a  M)  \*S:X  d  M1  \ R&                  RE                  \#\)S-   5      r+\," \ R&                  RE                  \#\'5      S5       r'\'R[                  5       r.SSS5        \," \+S5       r'\R^                  " \'5      r0SSS5        \%Rc                  \)\.\0S.5        M     S  r2\
 " S! S"\R2                  5      5       r3 " S# S$\R2                  5      r4S% r5g! , (       d  f       N= f! , (       d  f       Nn= f)&    N   )parametrizeparametrize_class	slow_test)BytesIO)	MagicMockMockpatch   )*c                 x    [        U [        5      (       a$  U R                  [        R                  " 5       5      n U $ N)
isinstancestrencodesysgetfilesystemencoding)vals    i/home/maestro/MAESTRO/maestro-backend/venv/lib/python3.13/site-packages/multipart/tests/test_multipart.pyforce_bytesr      s+    #sjj2245J    c                   P    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rSrg)	TestField   c                 $    [        S5      U l        g Nfoo)Fieldfselfs    r   setUpTestField.setUp    s    ur   c                 P    U R                  U R                  R                  S5        g r   )assertEqualr   
field_namer    s    r   	test_nameTestField.test_name#   s    **E2r   c                     U R                   R                  S5        U R                  U R                   R                  S5        g N   test123r   writer%   valuer    s    r   	test_dataTestField.test_data&   s*    Z z2r   c                    U R                   R                  S5        U R                  U R                   R                  S5        U R                   R                  S5        U R                  U R                   R                  S5        g )N   test   123r+   r,   r    s    r   test_cache_expirationTestField.test_cache_expiration*   sR    Ww/Vz2r   c                     U R                   R                  S5        U R                   R                  5         U R                  U R                   R                  S5        g r*   )r   r-   finalizer%   r.   r    s    r   test_finalizeTestField.test_finalize0   s8    Z z2r   c                     U R                   R                  S5        U R                   R                  5         U R                  U R                   R                  S5        g r*   )r   r-   closer%   r.   r    s    r   
test_closeTestField.test_close5   s7    Z z2r   c                    [         R                  SS5      nU R                  UR                  S5        U R                  UR                  S5        [         R                  SS 5      nU R                  UR                  S 5        g Ns   names   value)r   
from_valuer%   r&   r.   )r!   r   f2s      r   test_from_valueTestField.test_from_value:   sb    Wh/w/(+gt,4(r   c                 ~    [         R                  SS5      n[         R                  SS5      nU R                  X5        g r?   )r   r@   r%   )r!   f1rA   s      r   test_equalityTestField.test_equalityB   s4    gx0gx0 r   c                     [         R                  SS5      nU R                  US:H  5        U R                  SU:H  5        g )N   foo   bar)r   r@   assertFalser!   r   s     r   test_equality_with_other"TestField.test_equality_with_otherH   s8    VV,f%1%r   c                     [        S5      nU R                  UR                  S5        UR                  5         U R                  UR                  S 5        g )NrI   r   )r   r%   r.   set_nonerL   s     r   test_set_noneTestField.test_set_noneM   s<    &M#&	

$'r   )r   N)__name__
__module____qualname____firstlineno__r"   r'   r/   r4   r8   r<   rB   rF   rM   rQ   __static_attributes__ r   r   r   r      s4    3333
3
)!&
(r   r   c                   h    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)TestFileU   c                     0 U l         [        [        R                  " 5       5      U l        [        SU R                   S9U l        g )N   foo.txtconfig)cr   tempfilemkdtempdFiler   r    s    r   r"   TestFile.setUpV   s0    X--/0j0r   c                     U R                   R                  nUR                  S5        U R                  UR	                  5       U5        UR                  S5        UR                  5         g Nr   )r   file_objectseekr%   readtruncate)r!   datar   s      r   assert_dataTestFile.assert_data[   sF    FF	q	4(	q		

r   c                     [         R                  R                  U R                  U R                  R
                  5      nU R                  [         R                  R                  U5      5        g r   )ospathjoinrc   r   actual_file_name
assertTrueexists)r!   	full_paths     r   assert_existsTestFile.assert_existsb   s=    GGLL)@)@A	y12r   c                 \    U R                   R                  S5        U R                  S5        g N   foobar)r   r-   rm   r    s    r   test_simpleTestFile.test_simplef        Y#r   c                     [        5       nSUR                  l        XR                  l        U R                  R                  S5      nU R                  US5        g )N   r{   )r	   r-   return_valuer   _fileobjr%   )r!   mvs      r   test_invalid_writeTestFile.test_invalid_writej   s@    F FFLL#Ar   c                 \   SU R                   S'   U R                  R                  S5        U R                  U R                  R                  5        U R                  S5        U R                  R                  S5        U R                  U R                  R                  5        U R                  S5        U R                  R                  nU R                  R                  5         U R                  U R                  R                  5        U R                  U R                  R                  U5        g )Nr   MAX_MEMORY_FILE_SIZE   1r3   )
r`   r   r-   rt   	in_memoryrm   rK   rh   flush_to_diskassertIs)r!   old_objs     r   test_file_fallbackTestFile.test_file_fallbackq   s    )*%&T(()V))*  &&$$))*dff(('2r   c                 D   SU R                   S'   U R                  R                  S5        U R                  U R                  R                  5        U R                  R                  S5        U R                  U R                  R                  5        U R                  S5        g )N
   r   s
   1111111111s
   2222222222s   11111111112222222222)r`   r   r-   rt   r   rK   rm   r    s    r   test_file_fallback_with_data%TestFile.test_file_fallback_with_data   sn    )+%&Y(()Y))*01r   c                 >   U R                   U R                  S'   SU R                  S'   U R                  R                  S5        U R	                  U R                  R
                  5        U R                  U R                  R                  5        U R                  5         g )N
UPLOAD_DIRr   r      12345678901)	rc   r`   r   r-   rK   r   assertIsNotNoners   rw   r    s    r   test_file_nameTestFile.test_file_name   ss    #vv|)+%& 	^$))* 	TVV445r   c                 ^   U R                   U R                  S'   SU R                  S'   SU R                  S'   U R                  R                  S5        U R	                  U R                  R
                  5        U R                  U R                  R                  S5        U R                  5         g )Nr   TUPLOAD_KEEP_FILENAMEr   r   r   rI   	rc   r`   r   r-   rK   r   r%   rs   rw   r    s    r   test_file_full_nameTestFile.test_file_full_name   s    #vv|)-%&)+%& 	^$))* 	00&9r   c                 |   U R                   U R                  S'   SU R                  S'   SU R                  S'   SU R                  S'   U R                  R                  S5        U R	                  U R                  R
                  5        U R                  U R                  R                  S5        U R                  5         g 	Nr   Tr   UPLOAD_KEEP_EXTENSIONSr   r   r   r]   r   r    s    r   test_file_full_name_with_ext%TestFile.test_file_full_name_with_ext       #vv|)-%&+/'()+%& 	^$))* 	00*=r   c                 |   U R                   U R                  S'   SU R                  S'   SU R                  S'   SU R                  S'   U R                  R                  S5        U R	                  U R                  R
                  5        U R                  U R                  R                  S5        U R                  5         g r   r   r    s    r   r   r      r   r   c                 p   SU R                   S'   SU R                   S'   U R                  R                  S5        U R                  U R                  R                  5        [
        R                  R                  U R                  R                  5      S   nU R                  US5        U R                  5         g )NTr   r   r   r   r   s   .txt)r`   r   r-   rK   r   rp   rq   splitextrs   r%   rw   )r!   exts     r   test_no_dir_with_extension#TestFile.test_no_dir_with_extension   s    +/'()+%& 	^$))* ggtvv667:g&r   c                 B   [        [        R                  R                  SSS5      5      U R                  S'   SU R                  S'   SU R                  S'   U R                  [        5         U R                  R                  S	5        S S S 5        g ! , (       d  f       g = f)
N/tmpnotexistingr   Tr   r   r   
   1234567890	r   rp   rq   rr   r`   assertRaises	FileErrorr   r-   r    s    r   test_invalid_dir_with_name#TestFile.test_invalid_dir_with_name   sp    *277<<UM+RS|)-%&)*%& y)FFLL' *))   +B
Bc                 B   [        [        R                  R                  SSS5      5      U R                  S'   SU R                  S'   SU R                  S'   U R                  [        5         U R                  R                  S	5        S S S 5        g ! , (       d  f       g = f)
Nr   r   r   r   Fr   r   r   r   r   r    s    r   test_invalid_dir_no_name!TestFile.test_invalid_dir_no_name   sp    *277<<UM+RS|).%&)*%& y)FFLL' *))r   )r`   rc   r   N)rS   rT   rU   rV   r"   rm   rw   r|   r   r   r   r   r   r   r   r   r   rW   rX   r   r   rZ   rZ   U   sH    1
3$3"	2((r   rZ   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)TestParseOptionsHeader   c                 f    [        S5      u  pU R                  US5        U R                  U0 5        g )Nzapplication/json   application/jsonparse_options_headerr%   r!   tps      r   r|   "TestParseOptionsHeader.test_simple   s0    #$67/0Br   c                 f    [        S5      u  pU R                  US5        U R                  U0 5        g )N r   r   r   s      r   
test_blank!TestParseOptionsHeader.test_blank   s.    #B'C Br   c                 j    [        S5      u  pU R                  US5        U R                  USS05        g )Nzapplication/json;par=valr      par   valr   r   s      r   test_single_param(TestParseOptionsHeader.test_single_param   s5    #$>?/0VV,-r   c                 j    [        S5      u  pU R                  US5        U R                  USS05        g )Ns   application/json;     par=valr   r   r   r   r   s      r   test_single_param_with_spaces4TestParseOptionsHeader.test_single_param_with_spaces   s5    #$DE/0VV,-r   c                 l    [        S5      u  pU R                  US5        U R                  USSS.5        g )Ns!   application/json;par=val;asdf=foor   r   rI   )r      asdfr   r   s      r   test_multiple_params+TestParseOptionsHeader.test_multiple_params   s5    #$HI/0Vf=>r   c                 j    [        S5      u  pU R                  US5        U R                  USS05        g )Ns   application/json;param="quoted"r      params   quotedr   r   s      r   test_quoted_param(TestParseOptionsHeader.test_quoted_param  s5    #$FG/0Xy12r   c                 H    [        S5      u  pU R                  US   S5        g )Ns/   application/json;param="quoted;with;semicolons"r   s   quoted;with;semicolonsr   r   s      r    test_quoted_param_with_semicolon7TestParseOptionsHeader.test_quoted_param_with_semicolon  s$    #$VW8&?@r   c                 H    [        S5      u  pU R                  US   S5        g )Ns1   application/json;param="This \" is \" a \" quote"r   s   This " is " a " quoter   r   s      r   test_quoted_param_with_escapes5TestParseOptionsHeader.test_quoted_param_with_escapes  s$    #$[\8&>?r   c                 H    [        S5      u  pU R                  US   S5        g )Ns1   text/plain; filename="C:\this\is\a\path\file.txt"s   filename   file.txtr   r   s      r   test_handles_ie6_bug+TestParseOptionsHeader.test_handles_ie6_bug  s#    #$]^;5r   rX   N)rS   rT   rU   rV   r|   r   r   r   r   r   r   r   r   rW   rX   r   r   r   r      s1     
 
.
.
?
3
A@6r   r   c                        \ rS rSrS rS rSrg)TestBaseParseri  c                 D    [        5       U l        0 U R                  l        g r   )
BaseParserb	callbacksr    s    r   r"   TestBaseParser.setUp  s    r   c                 H  ^ S/mU4S jnU R                   R                  SU5        U R                   R                  S5        U R                  TS   S5        U R                   R                  SS 5        U R                   R                  S5        U R                  TS   S5        g )Nr   c                      > T S==   S-  ss'   g )Nr   r   rX   )ls   r   on_foo-TestBaseParser.test_callbacks.<locals>.on_foo  s    aDAIDr   r   r   )r   set_callbackcallbackr%   )r!   r   r   s     @r   test_callbacksTestBaseParser.test_callbacks  s    C	 	E6*1q!E4(1q!r   )r   N)rS   rT   rU   rV   r"   r   rW   rX   r   r   r   r     s    "r   r   c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rSrg)TestQuerystringParseri)  c                     UR                  SS5      (       a  U R                  R                  5         U R                  U R                  [        U5      5        UR                  SS5      (       a  / U l        g g )Nr7   Treset)popr   r7   r%   r   listget)r!   argskwargss      r   assert_fields#TestQuerystringParser.assert_fields*  sV    ::j$''FFOOd,::gt$$DF %r   c                 $    U R                  5         g r   )r   r    s    r   r"   TestQuerystringParser.setUp2  s    

r   c                 t   ^ ^^ / T l         / m/ mU4S jnU4S jnUUU 4S jnUUUS.n[        U5      T l        g )Nc                 ,   > TR                  XU 5        g r   append)rl   startendname_buffers      r   on_field_name2TestQuerystringParser.reset.<locals>.on_field_name;      t#/r   c                 ,   > TR                  XU 5        g r   r  )rl   r  r  data_buffers      r   on_field_data2TestQuerystringParser.reset.<locals>.on_field_data>  r  r   c                     > TR                   R                  SR                  T5      SR                  T 5      45        TS S 2	 T S S 2	 g Nr   )r   r  rr   )r
  r  r!   s   r   on_field_end1TestQuerystringParser.reset.<locals>.on_field_endA  s@    FFMM%% 
 AAr   )r  r  r  )r   QuerystringParserr   )r!   r  r  r  r   r
  r  s   `    @@r   r   TestQuerystringParser.reset5  sC    	0	0	 +*(
	 #9-r   c                 \    U R                   R                  S5        U R                  S5        g )N   foo=barrI   rJ   r   r-   r   r    s    r   test_simple_querystring-TestQuerystringParser.test_simple_querystringR  s!    Z +,r   c                 \    U R                   R                  S5        U R                  S5        g )Ns   &foo=barr  r  r    s    r    test_querystring_blank_beginning6TestQuerystringParser.test_querystring_blank_beginningW  !    [!+,r   c                 \    U R                   R                  S5        U R                  S5        g )N   foo=bar&r  r  r    s    r   test_querystring_blank_end0TestQuerystringParser.test_querystring_blank_end\  r  r   c                 ^    U R                   R                  S5        U R                  SS5        g )Ns   foo=bar&asdf=bazr  r      bazr  r    s    r   test_multiple_querystring/TestQuerystringParser.test_multiple_querystringa  '    ()	
r   c                     U R                   R                  S5        U R                  SSS9  U R                   R                  S5        U R                  S5        g )Nr  r  Fr7   s   asdf=bazr"  r  r    s    r   test_streaming_simple+TestQuerystringParser.test_streaming_simplei  sN    [! 	 	

 	[!	
r   c                    U R                   R                  S5        U R                  SS9  U R                   R                  S5        U R                  SS9  U R                   R                  S5        U R                  SS9  U R                   R                  S5        U R                  SSS9  U R                   R                  S5        U R                  S	5        g )
Ns   foo=oneFr(  s   twos   threes   &asd)rI   s   onetwothrees   f=bazr"  r  r    s    r   test_streaming_break*TestQuerystringParser.test_streaming_breaku  s    Z E*VE*XE*W$ 	 	

 	X	
r   c                 ^    U R                   R                  S5        U R                  SS5        g )Ns   foo=bar;asdf=bazr  r"  r  r    s    r   test_semicolon_separator.TestQuerystringParser.test_semicolon_separator  r&  r   c                     SU R                   l        U R                   R                  S5        U R                  SSS9  U R                   R                  S5        U R                  S5        g )N   r  r  Fr(  s   a=123456)   as   12345)r   max_sizer-   r   r    s    r   test_too_large_field*TestQuerystringParser.test_too_large_field  sT     	[!+e< 	[!+,r   c                 t    U R                  [        5         [        SS9nS S S 5        g ! , (       d  f       g = f)Nir4  )r   
ValueErrorr  )r!   r   s     r   test_invalid_max_size+TestQuerystringParser.test_invalid_max_size  s&    z*!40A +**   
)
7c                 &   Sn[        U5       H  u  p#U R                  5         SU R                  l        [	        U< SU< 35        U R                  R                  U5        U R                  R                  U5        U R                  SS5        M     g )Ns   foo=bar&another=asdfT / r     anotherr   )	split_allr   r   strict_parsingprintr-   r   )r!   rl   firstlasts       r   test_strict_parsing_pass.TestQuerystringParser.test_strict_parsing_pass  sq    &$T?KEJJL$(DFF!UIS)*FFLLFFLL/1FG +r   c                    Sn[        U5       H  u  p#U R                  5         SU R                  l        SnU R	                  [
        5       nX@R                  R                  U5      -  nX@R                  R                  U5      -  nU R                  R                  5         S S S 5        Wc  M  U R                  UR                  R                  SU-
  5        M     g ! , (       d  f       NA= f)N   foo=bar&&another=asdfTr      )rA  r   r   rB  r   QuerystringParseErrorr-   r7   r%   	exceptionoffset)r!   rl   rD  rE  cntcms         r   #test_strict_parsing_fail_double_sep9TestQuerystringParser.test_strict_parsing_fail_double_sep  s    '$T?KEJJL$(DFF!C""#89Rvv||E**vv||D))! : ~  !4!4a#g> +
 :9s   AC
C)	c                    Sn[        U5       Hw  u  p#[        SU< SU< S35        U R                  5         SnX@R                  R	                  U5      -  nX@R                  R	                  U5      -  nU R                  SS5        My     g )NrI   r>  r   r  r?  )rA  rC  r   r   r-   r   )r!   rl   rD  rE  rN  s        r   test_double_sep%TestQuerystringParser.test_double_sep  sx    '$T?KEAeYc$+,JJLC66<<&&C66<<%%C/1FG +r   c                    SU R                   l        U R                  [        5       nU R                   R	                  S5        S S S 5        Wb'  U R                  UR                  R                  S5        g g ! , (       d  f       N9= f)NT   foo=bar&blank&another=asdfrJ  )r   rB  r   rK  r-   r%   rL  rM  )r!   rO  s     r   !test_strict_parsing_fail_no_value7TestQuerystringParser.test_strict_parsing_fail_no_value  sd     $45FFLL67 6 >R\\00!4  65s   A66
Bc                 `    U R                   R                  S5        U R                  SSS5        g )NrW  r  )s   blankr   r?  r  r    s    r   test_success_no_value+TestQuerystringParser.test_success_no_value  s*    23!	
r   c                 .    [        U R                  5      ng r   )reprr   )r!   _ignoreds     r   	test_reprTestQuerystringParser.test_repr  s    <r   )r   r   N)rS   rT   rU   rV   r   r"   r   r  r  r  r$  r)  r,  r/  r5  r:  rF  rP  rT  rX  r[  r`  rW   rX   r   r   r   r   )  s^    .:-
-
-




*
	-1
H?"
H5
 r   r   c                   P    \ rS rSrS rSS jrSS jrSS jrS rS r	S r
S	 rS
rg)TestOctetStreamParseri  c                    ^  / T l         ST l        ST l        U 4S jnU 4S jnU 4S jnUUUS.n[        U5      T l        g )Nr   c                  0   > T =R                   S-  sl         g Nr   )startedr    s   r   on_start-TestOctetStreamParser.setUp.<locals>.on_start  s    LLALr   c                 @   > TR                   R                  XU 5        g r   )rc   r  )rl   r  r  r!   s      r   on_data,TestOctetStreamParser.setUp.<locals>.on_data  s    FFMM$S/*r   c                  0   > T =R                   S-  sl         g rf  )finishedr    s   r   on_end+TestOctetStreamParser.setUp.<locals>.on_end  s    MMQMr   )rh  rk  ro  )rc   rg  rn  OctetStreamParserr   )r!   rh  rk  ro  r   s   `    r   r"   TestOctetStreamParser.setUp  sG    		+	 !
	 #9-r   c                 h    U R                  SR                  U R                  5      U5        / U l        g r  )r%   rr   rc   r!   rl   r7   s      r   rm   !TestOctetStreamParser.assert_data  s&    $&&)40r   c                     U(       a  U R                  U R                  S5        g U R                  U R                  S5        g Nr   r   )r%   rg  r!   r   s     r   assert_started$TestOctetStreamParser.assert_started  s-    T\\1-T\\1-r   c                     U(       a  U R                  U R                  S5        g U R                  U R                  S5        g rw  )r%   rn  rx  s     r   assert_finished%TestOctetStreamParser.assert_finished   s-    T]]A.T]]A.r   c                    U R                  S5        U R                  R                  S5        U R                  5         U R                  S5        U R	                  S5        U R                  R                  5         U R	                  5         g )NFr{   )ry  r   r-   rm   r|  r7   r    s    r   r|   !TestOctetStreamParser.test_simple  sf    E" 	Y# 	U#r   c                    U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  5         U R                  S5        U R	                  5         g )NrI   rJ   r#  s	   foobarbaz)r   r-   r7   rm   r|  r    s    r   test_multiple_chunks*TestOctetStreamParser.test_multiple_chunks  sZ    VVV&r   c                     SU R                   l        U R                   R                  S5        U R                   R                  5         U R	                  S5        U R                  5         g )Nr   
   0123456789s   01234)r   r4  r-   r7   rm   r|  r    s    r   test_max_size#TestOctetStreamParser.test_max_size  sE    ]#"r   c                 t    U R                  [        5         [        SS9nS S S 5        g ! , (       d  f       g = f)Nr   r8  )r   r9  rq  r!   qs     r   r:  +TestOctetStreamParser.test_invalid_max_size&  s&    z*!51A +**r<  )rc   rn  r   rg  NT)rS   rT   rU   rV   r"   rm   ry  r|  r|   r  r  r:  rW   rX   r   r   rc  rc    s*    .,./2r   rc  c                   N    \ rS rSrS rSS jrS rS rS rS r	S r
S	 rS
 rSrg)TestBase64Decoderi+  c                 V    [        5       U l        [        U R                  5      U l        g r   )r   r   Base64Decoderrc   r    s    r   r"   TestBase64Decoder.setUp-  s    tvv&r   c                 :   U(       a  U R                   R                  5         U R                  R                  S5        U R	                  U R                  R                  5       U5        U R                  R                  S5        U R                  R                  5         g rg   rc   r7   r   ri   r%   rj   rk   rt  s      r   rm   TestBase64Decoder.assert_data1  Y    FFOOA-Ar   c                 \    U R                   R                  S5        U R                  S5        g )N   Zm9vYmFyr{   rc   r-   rm   r    s    r   r|   TestBase64Decoder.test_simple:  s     [!#r   c                     U R                  [        5         U R                  R                  S5        S S S 5        g ! , (       d  f       g = f)Ns   Zm9v!mFy)r   DecodeErrorrc   r-   r    s    r   test_badTestBase64Decoder.test_bad>  s,    {+FFLL% ,++s	   ;
A	c                     U R                   R                  S5        U R                   R                  S5        U R                  S5        g )N   Zm9vs   YmFyr{   r  r    s    r   test_split_properly%TestBase64Decoder.test_split_properlyB  s0    WW#r   c                     Sn[        SS5       Hb  nUS U XS  pCU R                  5         U R                  R                  U5        U R                  R                  U5        U R	                  S5        Md     g )Nr  r      rI   ranger"   rc   r-   rm   r!   buffirD  seconds        r   test_bad_split TestBase64Decoder.test_bad_splitG  s_    q!A !Hd2h6JJLFFLLFFLL V$ r   c                     Sn[        SS5       Hb  nUS U XS  pCU R                  5         U R                  R                  U5        U R                  R                  U5        U R	                  S5        Md     g )Nr  r   rJ  r{   r  r  s        r   test_long_bad_split%TestBase64Decoder.test_long_bad_splitQ  s_    q!A !Hd2h6JJLFFLLFFLL Y' r   c                     [        5       n[        U5      nUR                  5         UR                  R                  5         UR	                  5         UR                  R                  5         g r   )r	   r  r7   assert_called_once_withr;   r!   parserr   s      r   test_close_and_finalize)TestBase64Decoder.test_close_and_finalize[  sE    &!	

//1		,,.r   c                     U R                   R                  S5        U R                  [        5         U R                   R	                  5         S S S 5        g ! , (       d  f       g = f)Ns   Zm9vYmF)rc   r-   r   r  r7   r    s    r   test_bad_length!TestBase64Decoder.test_bad_lengthe  s:    Z {+FFOO ,++s   A
A#rc   r   Nr  )rS   rT   rU   rV   r"   rm   r|   r  r  r  r  r  r  rW   rX   r   r   r  r  +  s/    '$&$
%(/r   r  c                   Z    \ rS rSrS rSS jrS rS rS rS r	S r
S	 rS
 rS rS rSrg)TestQuotedPrintableDecoderil  c                 V    [        5       U l        [        U R                  5      U l        g r   )r   r   QuotedPrintableDecoderrc   r    s    r   r"    TestQuotedPrintableDecoder.setUpm  s    '/r   c                 :   U(       a  U R                   R                  5         U R                  R                  S5        U R	                  U R                  R                  5       U5        U R                  R                  S5        U R                  R                  5         g rg   r  rt  s      r   rm   &TestQuotedPrintableDecoder.assert_dataq  r  r   c                 \    U R                   R                  S5        U R                  S5        g rz   r  r    s    r   r|   &TestQuotedPrintableDecoder.test_simplez  r~   r   c                 \    U R                   R                  S5        U R                  S5        g )Ns	   foo=3Dbarr  r  r    s    r   test_with_escape+TestQuotedPrintableDecoder.test_with_escape~  s     \"$r   c                 \    U R                   R                  S5        U R                  S5        g )Ns	   foo=
barr{   r  r    s    r   test_with_newline_escape3TestQuotedPrintableDecoder.test_with_newline_escape  s     ^$#r   c                 \    U R                   R                  S5        U R                  S5        g )Ns   foo=
barr{   r  r    s    r   test_with_only_newline_escape8TestQuotedPrintableDecoder.test_with_only_newline_escape  s     \"#r   c                     U R                   R                  S5        U R                   R                  S5        U R                  S5        g )Ns   foo=3s   Dbarr  r  r    s    r   test_with_split_escape1TestQuotedPrintableDecoder.test_with_split_escape  s0    XW$r   c                     U R                   R                  S5        U R                   R                  S5        U R                  S5        g )Ns   foo=s   
barr{   r  r    s    r    test_with_split_newline_escape_1;TestQuotedPrintableDecoder.test_with_split_newline_escape_1  s0    YX#r   c                     U R                   R                  S5        U R                   R                  S5        U R                  S5        g )Ns   foo=s   
barr{   r  r    s    r    test_with_split_newline_escape_2;TestQuotedPrintableDecoder.test_with_split_newline_escape_2  s0    WZ #r   c                     [        5       n[        U5      nUR                  5         UR                  R                  5         UR	                  5         UR                  R                  5         g r   )r	   r  r7   r  r;   r  s      r   r  2TestQuotedPrintableDecoder.test_close_and_finalize  sE    "6*	

//1		,,.r   c                 B   U R                   R                  S5        U R                  S5        U R                   R                  S5        U R                   R                  S5        U R                  S5        U R                   R                  S5        U R                  S5        g)z7
https://github.com/andrew-d/python-multipart/issues/6
s   =3AXs   :Xs   =3s   AXs   q=3AXs   q:XNr  r    s    r   test_not_aligned+TestQuotedPrintableDecoder.test_not_aligned  sp     	W 	UUX r   r  Nr  )rS   rT   rU   rV   r"   rm   r|   r  r  r  r  r  r  r  r  rW   rX   r   r   r  r  l  s9    0$%$$%
$
$
/!r   r  r/   httpsingle_field_blocksz.httpz.yamlrb)nametestresultc              #   `   #    [        S[        U 5      S-
  5       H  nU SU XS 4v   M     g7f)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  s     r   rA  rA    s5      1c#hl#2AwB   $s   ,.c                       \ rS rSr0 4S jrS rS rS r\" S\	5      S 5       r
S rS	 rS
 r\S 5       r\S 5       rS rS rS rS rS rS rS rS rS rS rS rS rSrg)TestFormParseri  c           	      v   ^  ST l         / T l        / T l        U 4S jnU 4S jnU 4S jn[        SX4UXS9T l        g )NFc                 <   > TR                   R                  U 5        g r   )fieldsr  r   r!   s    r   on_field%TestFormParser.make.<locals>.on_field  s    KKq!r   c                 <   > TR                   R                  U 5        g r   )filesr  r  s    r   on_file$TestFormParser.make.<locals>.on_file  s    JJa r   c                     > ST l         g )NT)endedr    s   r   ro  #TestFormParser.make.<locals>.on_end  s
    DJr   multipart/form-data)boundaryr_   )r  r  r  
FormParserr   )r!   r  r_   r  r  ro  s   `     r   makeTestFormParser.make  s?    

	"	!	 18f%->r   c                     UR                   nUR                  S5        UR                  5       nU R                  XB5        g rg   )rh   ri   rj   r%   )r!   r   rl   o	file_datas        r   assert_file_dataTestFormParser.assert_file_data  s/    MM	q	FFH	)r   c                 T   S nU R                    H  nUR                  U:X  d  M  Un  O   U R                  U5         U R                  XC5        U R	                  UR
                  U5        U R                   R                  U5        UR                  5         g ! UR                  5         f = fr   )r  r&   r   r  r%   	file_nameremover;   )r!   r&   r  rl   foundr   s         r   assert_fileTestFormParser.assert_file  s    A||z)  	U#		!!%.U__i8 JJe$ KKMEKKMs   AB B'c                     S nU R                    H  nUR                  U:X  d  M  Un  O   U R                  U5        U R                  X#R                  5        U R                   R                  U5        g r   )r  r&   r   r%   r.   r  )r!   r  r.   r  r   s        r   assert_fieldTestFormParser.assert_field  s_    A||t#  	U#, 	5!r   paramc                    US   S   n[        U[        5      (       a  UR                  S5      nU R                  U5        S n U R                  R                  US   5      nU R                  R                  5         SUS   S   ;   a7  U R                  U5        U R                  US   S   S   UR                  5        g U R                  U[        US   5      5        US   S    Hh  nUS   nUS	   R                  S5      nUS
:X  a  U R                  XuS   5        M8  US:X  a*  U R                  UUS   R                  S5      US   5        Mh   e   g ! [         a  nSnUn S nANS nAff = f)Nr  r  zlatin-1r  r   errorexpectedtyper  fieldrl   filer  )r   r   r   r  r   r-   r7   MultipartParseErrorr   r%   rM  r  r   r  )r!   r  r  exc	processeder  r  s           r   	test_httpTestFormParser.test_http  si    ?:.h$$y1H		( 	U6]3IFFOO eHoj11  %U8_Z8A3::N 	Cf$67 x,AV9DV9##I.Dw!!$&	2  kN)))4fI u! -' # 	IC	s   8E 
E)E$$E)c                 .   Sn[        [        R                  R                  [        U5      S5       nUR                  5       nSSS5        [        W5       H  u  pEU R                  S5        SnX`R                  R                  U5      -  nX`R                  R                  U5      -  nU R                  R                  5         U R                  U[        U5      5        U R                  SS5        U R                  SS	S
5        M     g! , (       d  f       N= f)zb
This test runs a simple multipart body with one field and one file
through every possible split.
single_field_single_file.httpr  Nr  r      field   test1   filer      test2)openrp   rq   rr   http_tests_dirrj   rA  r  r   r-   r7   r%   r  r   r  )r!   	test_filer   r/   rD  rE  r  s          r   test_random_splitting$TestFormParser.test_random_splittingM  s     4	"'',,~y94@AI A %Y/KEIIj! Ae$$Ad##AFFOO QI/ h1Wk8< 0	 A@s   D
Dc                    Sn[        [        R                  R                  [        U5      S5       nUR                  5       nSSS5        U R                  S5        Sn[        [        W5      5       H'  nX5US-    nX@R                  R                  U5      -  nM)     U R                  R                  5         U R                  U[        U5      5        U R                  SS5        U R                  S	S
S5        g! , (       d  f       N= f)<
This test parses a simple multipart body 1 byte at a time.
r  r  Nr  r   r   r  r  r  r   r  )r  rp   rq   rr   r  rj   r  r  r  r   r-   r7   r%   r   r  )r!   r  r   r/   r  xr   s          r   test_feed_single_bytes%TestFormParser.test_feed_single_bytesi  s    
 4	"'',,~y94@AI A 			*
 s9~&AAE"Aa A ' 	 	C	N+ 	(H-+x8+ A@s   C77
Dc                    Sn[        [        R                  R                  [        U5      S5       nUR                  5       nSSS5        [        S[        W5      S-   5       H  n[        U5       H  nU R                  S5        SnU R                  R                  USU 5        Xe-  n[        U[        U5      U5       H&  nX7Xt-    nX`R                  R                  U5      -  nM(     U R                  R                  5         U R                  U[        U5      5        U R                  SS5        M     M     g! , (       d  f       N= f)	r  zsingle_field_blocks.httpr  Nr   r  r   r  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)r  rp   rq   rr   r  rj   r  r  r  r   r-   r7   r%   r   )	r!   r  r   r/   r`   rc   r  r  r   s	            r   test_feed_blocksTestFormParser.test_feed_blocks  s   
 /	"'',,~y94@AI A q#i.1,-A1X 		*%Yr]+q#i.!4A "AE*Aa(A 5 !   C	N3 !!("MO+  . A@s   D88
Ec                 v   Sn[        [        R                  R                  [        U5      S5       nUR                  5       nSSS5        SnSnSnSn[        SU4-  5        [        U5       GHh  n[        W5      n	[        R                  " / SQ5      n
U
S:X  aM  [        R                  " [        U5      5      n[        R                  " S	5      nU	R                  X5        S
X4-  nOrU
S:X  a(  [        R                  " [        U5      5      nX	 SU4-  nODU
S:X  a>  [        R                  " [        U5      S-
  5      nXS-      X   sX'   XS-   '   SXS-   4-  n[        SW-   5        U R                  S5        Sn U R                  R!                  [#        U	5      5      nU R                  R%                  5         U[        U	5      :X  a  US-  nGMc  US-  nGMk     [        S5        [        SU4-  5        [        SU4-  5        [        SU4-  5        g! , (       d  f       GN= f! [&         a
    US-  n GM  f = f)a8  
This test randomly fuzzes the request body to ensure that no strange
exceptions are raised and we don't end up in a strange state.  The
fuzzing consists of randomly doing one of the following:
    - Adding a random byte at a random offset
    - Randomly deleting a single byte
    - Randomly swapping two bytes
r  r  N  r   &Running %d iterations of fuzz testing:)r   r      r      zInserting byte %r at offset %dr   zDeleting byte at offset %dr%  zSwapping bytes %d and %dz  r  2--------------------------------------------------Successes:  %dFailures:   %dExceptions: %d)r  rp   rq   rr   r  rj   rC  r  	bytearrayrandomchoice	randranger  insertr  r   r-   bytesr7   FormParserError)r!   r  r   r/   
iterations	successesfailures
exceptionsr  	fuzz_datar-  r   msgs                r   test_request_body_fuzz%TestFormParser.test_request_body_fuzz  s    4	"'',,~y94@AI A 
	
6*FGz"A!),I ]]9-F{$$S^4$$S)  &6!?1$$S^4L2aT91$$S^a%781:q51A9<.	iA.0A1u:= $* IIj! A	"FFLLy!12! I&NIMH[ #^ 	BC)-.(,-*./w A@` #  a
 s   H:>H$
H!$H87H8c                 D   SnSnSnSn[        SU4-  5        [        U5       H  n[        R                  " SS5      n[        R
                  " U5      n[        SU4-  5        U R                  S5        Sn U R                  R                  [        U5      5      nU R                  R                  5         U[        U5      :X  a  US-  nM  US-  nM     [        S	5        [        S
U4-  5        [        SU4-  5        [        SU4-  5        g! [         a	    US-  n M  f = f)ze
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)  r*  N)rC  r  r,  r.  rp   urandomr  r   r-   r0  r7   r  r1  )r!   r2  r3  r4  r5  r  	data_sizerl   s           r   "test_request_body_fuzz_random_data1TestFormParser.test_request_body_fuzz_random_data  s    
	
6*FGz"A((d3I::i(D5DE IIj! A	"FFLLt-! D	>NIMH' #* 	BC)-.(,-*./ #  a
 s   6>DDDc                 x   U R                  S5        SnU R                  [        5         U R                  R	                  U5        S S S 5        U R                  S5        SnU R                  [        5         U R                  R	                  U5      nS S S 5        g ! , (       d  f       N[= f! , (       d  f       g = f)Nr  s   --boundaryfoobars   --boundaryfoobar)r  r   r	  r   r-   )r!   rl   r  s      r   test_bad_start_boundary&TestFormParser.test_bad_start_boundary  s    		*$23FFLL 4 			*"23T"A 43 43
 43s   B5B+
B(+
B9c                   ^ / mU4S jn[        5       n[        5       n[        SX!USS9nU R                  [        UR                  [
        5      5        UR                  S5        UR                  S5        UR                  5         U R                  UR                  5        U R                  [        T5      S5        U R                  TS   S	5        U R                  UR                  5        g )
Nc                 (   > TR                  U 5        g r   r  r   r  s    r   r  1TestFormParser.test_octet_stream.<locals>.on_file%      LLOr   application/octet-streamr]   )ro  r  r2   s   1234r   r   s   test1234)r	   r  rt   r   r  rq  r-   r7   rK   calledr%   r  r  r!   r  r  ro  r   r  s        @r   test_octet_stream TestFormParser.test_octet_stream#  s    	618V_ij
188->?@			

 	)UQ'eAh4&r   c                 J  ^ ^^^ / mU4S jn[        5       m[        5       mUUUU 4S jn[        SUTTS9nT R                  [        UR                  [
        5      5        U" U5        [        SUTTS9nT R                  [        UR                  [
        5      5        U" U5        g )Nc                 (   > TR                  U 5        g r   r  r   r  s    r   r  1TestFormParser.test_querystring.<locals>.on_field9      MM!r   c                 N  > TS S 2	 TR                  5         TR                  5         U R                  S5        U R                  S5        U R                  5         TR                  TR                  5        TR                  [        T5      S5        TR                  TS   R                  S5        TR                  TS   R                  S5        TR                  TS   R                  S5        TR                  TS   R                  S	5        TR                  TR                  5        g )
Nr  s
   &test=asdfr   r   rI   rJ   r   r2   r   )

reset_mockr-   r7   rK   rI  r%   r  r&   r.   rt   )r   r  ro  r  r!   s    r   simple_test4TestFormParser.test_querystring.<locals>.simple_test>  s    q	  GGJGGM"JJL W^^,S[!, VAY116:VAY__f5VAY117;VAY__g6 OOFMM*r   !application/x-www-form-urlencodedro  application/x-url-encoded)r	   r  rt   r   r  r  )r!   r  rT  r   r  ro  r  s   `   @@@r   test_querystringTestFormParser.test_querystring7  s    	&	+ 	+2 :HgV\]
188->?@A2HgfU
188->?@Ar   c                     [        5       n[        SS S 5      nXl        UR                  5         UR                  R	                  5         UR                  5         UR
                  R	                  5         g )NrX  )r	   r  r  r7   r  r;   r  s      r   test_close_methods!TestFormParser.test_close_methods_  sO    2D$?	

//1		,,.r   c                 |    U R                  [        5         [        SS S 5      nS S S 5        g ! , (       d  f       g = f)Nzapplication/bad)r   r9  r  rL   s     r   test_bad_content_type$TestFormParser.test_bad_content_typej  s+    z*,dD9A +**   -
;c                 |    U R                  [        5         [        SS S 5      nS S S 5        g ! , (       d  f       g = f)Nr  )r   r1  r  rL   s     r   test_no_boundary_given%TestFormParser.test_no_boundary_giveno  s-     /0$=A 0//ra  c           	        ^ Sn/ mU4S jn[        5       n[        5       nSS0n[        SX2USUS9nU R                  [        5         UR	                  U5        UR                  5         S S S 5        SS0n[        SX2USUS9nUR	                  U5        UR                  5         U R                  TS	   S
5        g ! , (       d  f       NV= f)Ns   ----boundary
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Content-Transfer-Encoding: badstuff

Test
----boundary--
c                 (   > TR                  U 5        g r   r  rE  s    r   r  BTestFormParser.test_bad_content_transfer_encoding.<locals>.on_filey  rG  r   UPLOAD_ERROR_ON_BAD_CTETr  z
--boundary)ro  r  r_   Fr   s   Test)r	   r  r   r1  r-   r7   r  )r!   rl   r  r  ro  r_   r   r  s          @r   "test_bad_content_transfer_encoding1TestFormParser.test_bad_content_transfer_encodingu  s     H	6 ,T2,h$|FL /GGDMJJL 0
 ,U3,h$|FL 	
	

eAh0 0/s   "B88
Cc                 
  ^ / mU4S jn[        5       n[        5       n[        SXUS9nUR                  S5        UR                  5         U R	                  TS   R
                  S5        U R	                  TS   R                  S5        U R	                  TS   R
                  S	5        U R	                  TS   R                  S 5        U R	                  TS
   R
                  S5        U R	                  TS
   R                  S5        g )Nc                 (   > TR                  U 5        g r   r  rO  s    r   r  9TestFormParser.test_handles_None_fields.<locals>.on_field  rQ  r   rV  rW  s   foo=bar&another&baz=asdfr   rI   rJ   r   r@  r   r#  r   )r	   r  r-   r7   r%   r&   r.   )r!   r  r  ro  r   r  s        @r   test_handles_None_fields'TestFormParser.test_handles_None_fields  s    	&:HV\]	+,	

--v6&1--z:$/--v6'2r   c                    Sn[        [        R                  R                  [        U5      S5       nUR                  5       nS S S 5        U R                  S5        [        W5      S-  U R                  R                  l
        U R                  R                  U5      nU R                  R                  5         U R                  U[        U5      S-  5        g ! , (       d  f       N= f)Nr  r  r  r   )r  rp   rq   rr   r  rj   r  r  r   r  r4  r-   r7   r%   )r!   r  r   r/   r  s        r   test_max_size_multipart&TestFormParser.test_max_size_multipart  s    3	"'',,~y94@AI A 			* "%Y!!3FFLL# 	C	NQ./ A@s   C
C$c                    Sn[        [        R                  R                  [        U5      S5       nUR                  5       nS S S 5        [        W5      S-  nU R                  SSU0S9  U R                  R                  U5      nU R                  R                  5         U R                  U[        U5      S-  5        g ! , (       d  f       N= f)Nr  r  r   r  MAX_BODY_SIZEr^   )r  rp   rq   rr   r  rj   r  r  r   r-   r7   r%   )r!   r  r   r/   sizer  s         r   test_max_size_form_parser(TestFormParser.test_max_size_form_parser  s    3	"'',,~y94@AI A
 9~!		*ot%<	=FFLL# 	C	NQ./ A@s   B>>
Cc           	         ^ / mU4S jn[        5       n[        5       n[        SX!USSS0S9nUR                  S5        UR                  5         U R	                  TS   S	5        g )
Nc                 (   > TR                  U 5        g r   r  rE  s    r   r  :TestFormParser.test_octet_stream_max_size.<locals>.on_file  rG  r   rH  r]   rt  r   )ro  r  r_   s   0123456789012345689r   r  )r	   r  r-   r7   r  rJ  s        @r   test_octet_stream_max_size)TestFormParser.test_octet_stream_max_size  sc    	618$
.35 	
&'	

eAh6r   c                 v    U R                  [        5         [        SSS9nS S S 5        g ! , (       d  f       g = f)Ns   boundr   r8  )r   r9  MultipartParserr  s     r   test_invalid_max_size_multipart.TestFormParser.test_invalid_max_size_multipart  s(    z*59A +**s   *
8)r  r   r  r  N)rS   rT   rU   rV   r  r  r  r   r   
http_testsr  r  r  r   r   r8  r>  rA  rK  rY  r\  r_  rc  ri  rn  rq  rv  r{  r  rW   rX   r   r   r  r    s    $& >$*," *%/ &/b=89:!OF F0 F0P #0 #0J	#'(&P	/:
>163(0&0"7 :r   r  c                   ,    \ rS rSrS rS rS rS rSrg)TestHelperFunctionsi  c                 `    [        SS0S S 5      nU R                  [        U[        5      5        g )NContent-TyperH  )create_form_parserrt   r   r  )r!   rs     r   test_create_form_parser+TestHelperFunctions.test_create_form_parser  s,    0JK#T+
1j12r   c                     0 nU R                  [        5         [        US S 5        S S S 5        g ! , (       d  f       g = fr   )r   r9  r  )r!   headerss     r   test_create_form_parser_error1TestHelperFunctions.test_create_form_parser_error  s-    z*wd3 +**s   /
=c                     [        5       n[        5       n[        SS0[        S5      UU5        UR                  S:X  d   eU R	                  UR
                  S   S   R                  S5        g )Nr  rH     123456789012345r   r   r2  )r	   
parse_formr   
call_countr%   	call_argsru  )r!   r  r  s      r   test_parse_form#TestHelperFunctions.test_parse_form  sp    6&7 &'	
 !!Q&&& 	**1-a055r:r   c                    ^ / mU4S jn[        SSS.[        S5      S U5        U R                  [        T5      S5        U R                  TS   R                  S5        g )	Nc                 (   > TR                  U 5        g r   r  )r  r  s    r   r  CTestHelperFunctions.test_parse_form_content_length.<locals>.on_file  s    LLr   rH  10)r  zContent-Lengthr  r   r   r   )r  r   r%   r  ru  )r!   r  r  s     @r   test_parse_form_content_length2TestHelperFunctions.test_parse_form_content_length  sa    	 	7# &'	
 	UQ'q+r   rX   N)	rS   rT   rU   rV   r  r  r  r  rW   rX   r   r   r  r    s    3
4
;$,r   r  c                     [         R                  " 5       n U R                  [         R                  R	                  [
        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U R                  [         R                  R	                  [        5      5        U $ r   )unittest	TestSuiteaddTestdefaultTestLoaderloadTestsFromTestCaserZ   r   r   r   rc  r  r  r  r  )suites    r   r  r    s     E	MM(,,BB8LM	MM(,,BBCYZ[	MM(,,BB>RS	MM(,,BBCXYZ	MM(,,BBCXYZ	MM(,,BBCTUV	MM(,,BBC]^_	MM(,,BB>RS	MM(,,BBCVWXLr   )6rp   r   globyamlbase64r,  ra   r  compatr   r   r   ior   unittest.mockr   r	   r
   	multipartrq   abspathdirname__file__curr_dirr   TestCaser   rZ   r   r   r   rc  r  r  rr   r  NON_PARAMETRIZED_TESTSr  listdirr   r   fnamer   	yaml_filer  rj   r/   	safe_load	yaml_datar  rA  r  r  r  rX   r   r   <module>r     s9   	 
       
  0 0  77??277??8453(!! 3(lN(x   N(f*6X.. *6Z"X&& "(s H-- s lI2H-- I2X>)) >BD!!2!2 D!P hV< 00 
	N	#A!!!$JE3&&
g~GGLLA	 "'',,~q148AI 9 )T"aq)I # 	
 	# 
$0! }:X&& }: }:@,,(++ ,,`S 98 #"s   I(I#
I 	#
I1	