
    =hL                        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 e j&                  j)                  e j&                  j+                  e            Zd Z G d	 d
ej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z G d dej2                        Z  G d dej2                        Z!e j&                  jE                  edd      Z#dhZ$g Z% e jL                  e#      D ]  Z'e j&                  jQ                  e'      \  Z)Z*e)e$v r&e*dk(  s,e j&                  jE                  e#e)dz         Z+ e,e j&                  jE                  e#e'      d      5 Z'e'j[                         Z.ddd        e,e+d      5 Z' ej^                  e'      Z0ddd       e%jc                  e)e.e0d        d  Z2e
 G d! d"ej2                               Z3 G d# d$ej2                        Z4d% Z5y# 1 sw Y   zxY w# 1 sw Y   bxY w)&    N   )parametrizeparametrize_class	slow_test)BytesIO)	MagicMockMockpatch   )*c                 l    t        | t              r#| j                  t        j                               } | S N)
isinstancestrencodesysgetfilesystemencoding)vals    n/var/www/html/phonemate/phone_mate_backend/venv/lib/python3.12/site-packages/multipart/tests/test_multipart.pyforce_bytesr      s(    #sjj2245J    c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)	TestFieldc                 $    t        d      | _        y Nfoo)Fieldfselfs    r   setUpzTestField.setUp    s    ur   c                 P    | j                  | j                  j                  d       y r   )assertEqualr   
field_namer   s    r   	test_namezTestField.test_name#   s    **E2r   c                     | j                   j                  d       | j                  | j                   j                  d       y N   test123r   writer#   valuer   s    r   	test_datazTestField.test_data&   s*    Z z2r   c                    | j                   j                  d       | j                  | j                   j                  d       | j                   j                  d       | j                  | j                   j                  d       y )N   test   123r(   r)   r   s    r   test_cache_expirationzTestField.test_cache_expiration*   sR    Ww/Vz2r   c                     | j                   j                  d       | j                   j                          | j                  | j                   j                  d       y r'   )r   r*   finalizer#   r+   r   s    r   test_finalizezTestField.test_finalize0   s8    Z z2r   c                     | j                   j                  d       | j                   j                          | j                  | j                   j                  d       y r'   )r   r*   closer#   r+   r   s    r   
test_closezTestField.test_close5   s7    Z z2r   c                    t         j                  dd      }| j                  |j                  d       | j                  |j                  d       t         j                  dd       }| j                  |j                  d        y Ns   names   value)r   
from_valuer#   r$   r+   )r    r   f2s      r   test_from_valuezTestField.test_from_value:   sb    Wh/w/(+gt,4(r   c                     t         j                  dd      }t         j                  dd      }| j                  ||       y r8   )r   r9   r#   )r    f1r:   s      r   test_equalityzTestField.test_equalityB   s6    gx0gx0R r   c                     t         j                  dd      }| j                  |dk(         | j                  d|k(         y )N   foo   bar)r   r9   assertFalser    r   s     r   test_equality_with_otherz"TestField.test_equality_with_otherH   s8    VV,f%1%r   c                     t        d      }| j                  |j                  d       |j                          | j                  |j                  d        y )Nr@   r   )r   r#   r+   set_nonerC   s     r   test_set_nonezTestField.test_set_noneM   s<    &M#&	

$'r   N)__name__
__module____qualname__r!   r%   r,   r0   r3   r6   r;   r>   rD   rG    r   r   r   r      s4    3333
3
)!&
(r   r   c                   `    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)TestFilec                     i | _         t        t        j                               | _        t        d| j                         | _        y )N   foo.txtconfig)cr   tempfilemkdtempdFiler   r   s    r   r!   zTestFile.setUpV   s0    X--/0j0r   c                     | j                   j                  }|j                  d       | j                  |j	                         |       |j                  d       |j                          y Nr   )r   file_objectseekr#   readtruncate)r    datar   s      r   assert_datazTestFile.assert_data[   sF    FF	q	4(	q		

r   c                     t         j                  j                  | j                  | j                  j
                        }| j                  t         j                  j                  |             y r   )ospathjoinrU   r   actual_file_name
assertTrueexists)r    	full_paths     r   assert_existszTestFile.assert_existsb   s=    GGLL)@)@A	y12r   c                 \    | j                   j                  d       | j                  d       y N   foobar)r   r*   r^   r   s    r   test_simplezTestFile.test_simplef        Y#r   c                     t               }d|j                  _        || j                  _        | j                  j                  d      }| j                  |d       y )N   rj   )r	   r*   return_valuer   _fileobjr#   )r    mvs      r   test_invalid_writezTestFile.test_invalid_writej   sB    F FFLL#Ar   c                 \   d| j                   d<   | j                  j                  d       | j                  | j                  j                         | j                  d       | j                  j                  d       | j                  | j                  j                         | j                  d       | j                  j                  }| j                  j                          | j                  | j                  j                         | j                  | j                  j                  |       y )Nr   MAX_MEMORY_FILE_SIZE   1r/   )
rR   r   r*   rd   	in_memoryr^   rB   rY   flush_to_diskassertIs)r    old_objs     r   test_file_fallbackzTestFile.test_file_fallbackq   s    )*%&T(()V))*  &&$$))*dff(('2r   c                 D   d| j                   d<   | j                  j                  d       | j                  | j                  j                         | j                  j                  d       | j                  | j                  j                         | j                  d       y )N
   ru   s
   1111111111s
   2222222222s   11111111112222222222)rR   r   r*   rd   rw   rB   r^   r   s    r   test_file_fallback_with_dataz%TestFile.test_file_fallback_with_data   sn    )+%&Y(()Y))*01r   c                 >   | j                   | j                  d<   d| j                  d<   | j                  j                  d       | j	                  | j                  j
                         | j                  | j                  j                         | j                          y )N
UPLOAD_DIRr}   ru      12345678901)	rU   rR   r   r*   rB   rw   assertIsNotNonerc   rg   r   s    r   test_file_namezTestFile.test_file_name   ss    #vv|)+%& 	^$))* 	TVV445r   c                 ^   | j                   | j                  d<   d| j                  d<   d| j                  d<   | j                  j                  d       | j	                  | j                  j
                         | j                  | j                  j                  d       | j                          y )Nr   TUPLOAD_KEEP_FILENAMEr}   ru   r   r@   	rU   rR   r   r*   rB   rw   r#   rc   rg   r   s    r   test_file_full_namezTestFile.test_file_full_name   s    #vv|)-%&)+%& 	^$))* 	00&9r   c                 |   | j                   | j                  d<   d| j                  d<   d| j                  d<   d| j                  d<   | j                  j                  d       | j	                  | j                  j
                         | j                  | j                  j                  d       | j                          y 	Nr   Tr   UPLOAD_KEEP_EXTENSIONSr}   ru   r   rO   r   r   s    r   test_file_full_name_with_extz%TestFile.test_file_full_name_with_ext       #vv|)-%&+/'()+%& 	^$))* 	00*=r   c                 |   | j                   | j                  d<   d| j                  d<   d| j                  d<   d| j                  d<   | j                  j                  d       | j	                  | j                  j
                         | j                  | j                  j                  d       | j                          y r   r   r   s    r   r   z%TestFile.test_file_full_name_with_ext   r   r   c                 p   d| j                   d<   d| j                   d<   | j                  j                  d       | j                  | j                  j                         t
        j                  j                  | j                  j                        d   }| j                  |d       | j                          y )NTr   r}   ru   r   r   s   .txt)rR   r   r*   rB   rw   r`   ra   splitextrc   r#   rg   )r    exts     r   test_no_dir_with_extensionz#TestFile.test_no_dir_with_extension   s    +/'()+%& 	^$))* ggtvv667:g&r   c                 8   t        t        j                  j                  ddd            | j                  d<   d| j                  d<   d| j                  d<   | j                  t              5  | j                  j                  d	       d d d        y # 1 sw Y   y xY w)
N/tmpnotexistingr   Tr   rn   ru   
   1234567890	r   r`   ra   rb   rR   assertRaises	FileErrorr   r*   r   s    r   test_invalid_dir_with_namez#TestFile.test_invalid_dir_with_name   sp    *277<<UM+RS|)-%&)*%& y)FFLL' *))   +BBc                 8   t        t        j                  j                  ddd            | j                  d<   d| j                  d<   d| j                  d<   | j                  t              5  | j                  j                  d	       d d d        y # 1 sw Y   y xY w)
Nr   r   r   r   Fr   rn   ru   r   r   r   s    r   test_invalid_dir_no_namez!TestFile.test_invalid_dir_no_name   sp    *277<<UM+RS|).%&)*%& y)FFLL' *))r   N)rH   rI   rJ   r!   r^   rg   rk   rs   r{   r~   r   r   r   r   r   r   rK   r   r   rM   rM   U   sH    1
3$3"	2((r   rM   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestParseOptionsHeaderc                 h    t        d      \  }}| j                  |d       | j                  |i        y )Nzapplication/json   application/jsonparse_options_headerr#   r    tps      r   rk   z"TestParseOptionsHeader.test_simple   s2    #$671/0Br   c                 h    t        d      \  }}| j                  |d       | j                  |i        y )N r   r   r   s      r   
test_blankz!TestParseOptionsHeader.test_blank   s0    #B'1C Br   c                 l    t        d      \  }}| j                  |d       | j                  |ddi       y )Nzapplication/json;par=valr      par   valr   r   s      r   test_single_paramz(TestParseOptionsHeader.test_single_param   s7    #$>?1/0VV,-r   c                 l    t        d      \  }}| j                  |d       | j                  |ddi       y )Ns   application/json;     par=valr   r   r   r   r   s      r   test_single_param_with_spacesz4TestParseOptionsHeader.test_single_param_with_spaces   s7    #$DE1/0VV,-r   c                 n    t        d      \  }}| j                  |d       | j                  |ddd       y )Ns!   application/json;par=val;asdf=foor   r   r@   )r      asdfr   r   s      r   test_multiple_paramsz+TestParseOptionsHeader.test_multiple_params   s7    #$HI1/0Vf=>r   c                 l    t        d      \  }}| j                  |d       | j                  |ddi       y )Ns   application/json;param="quoted"r      params   quotedr   r   s      r   test_quoted_paramz(TestParseOptionsHeader.test_quoted_param  s7    #$FG1/0Xy12r   c                 J    t        d      \  }}| j                  |d   d       y )Ns/   application/json;param="quoted;with;semicolons"r   s   quoted;with;semicolonsr   r   s      r    test_quoted_param_with_semicolonz7TestParseOptionsHeader.test_quoted_param_with_semicolon  s&    #$VW18&?@r   c                 J    t        d      \  }}| j                  |d   d       y )Ns1   application/json;param="This \" is \" a \" quote"r   s   This " is " a " quoter   r   s      r   test_quoted_param_with_escapesz5TestParseOptionsHeader.test_quoted_param_with_escapes  s&    #$[\18&>?r   c                 J    t        d      \  }}| j                  |d   d       y )Ns1   text/plain; filename="C:\this\is\a\path\file.txt"s   filename   file.txtr   r   s      r   test_handles_ie6_bugz+TestParseOptionsHeader.test_handles_ie6_bug  s%    #$]^1;5r   N)rH   rI   rJ   rk   r   r   r   r   r   r   r   r   rK   r   r   r   r      s1     
 
.
.
?
3
A@6r   r   c                       e Zd Zd Zd Zy)TestBaseParserc                 D    t               | _        i | j                  _        y r   )
BaseParserb	callbacksr   s    r   r!   zTestBaseParser.setUp  s    r   c                 F   dgfd}| j                   j                  d|       | j                   j                  d       | j                  d   d       | j                   j                  dd        | j                   j                  d       | j                  d   d       y )Nr   c                        dxx   dz  cc<   y )Nr   r   rK   )ls   r   on_fooz-TestBaseParser.test_callbacks.<locals>.on_foo  s    aDAIDr   r   r   )r   set_callbackcallbackr#   )r    r   r   s     @r   test_callbackszTestBaseParser.test_callbacks  s    C	 	E6*1q!E4(1q!r   N)rH   rI   rJ   r!   r   rK   r   r   r   r     s    "r   r   c                   x    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestQuerystringParserc                     |j                  dd      r| j                  j                          | j                  | j                  t        |             |j                  dd      rg | _        y y )Nr2   Treset)popr   r2   r#   r   listget)r    argskwargss      r   assert_fieldsz#TestQuerystringParser.assert_fields*  sP    ::j$'FFOOd,::gt$DF %r   c                 $    | j                          y r   )r   r   s    r   r!   zTestQuerystringParser.setUp2  s    

r   c                 n     g  _         g g fd}fd} fd}|||d}t        |       _        y )Nc                 .    j                  | ||        y r   append)r]   startendname_buffers      r   on_field_namez2TestQuerystringParser.reset.<locals>.on_field_name;      tE#/r   c                 .    j                  | ||        y r   r   )r]   r   r   data_buffers      r   on_field_dataz2TestQuerystringParser.reset.<locals>.on_field_data>  r   r   c                      j                   j                  dj                        dj                         f       d d =  d d = y Nr   )r   r   rb   )r   r   r    s   r   on_field_endz1TestQuerystringParser.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   zTestQuerystringParser.reset5  sC    	0	0	 +*(
	 #9-r   c                 \    | j                   j                  d       | j                  d       y )N   foo=barr@   rA   r   r*   r   r   s    r   test_simple_querystringz-TestQuerystringParser.test_simple_querystringR  s!    Z +,r   c                 \    | j                   j                  d       | j                  d       y )Ns   &foo=barr   r   r   s    r    test_querystring_blank_beginningz6TestQuerystringParser.test_querystring_blank_beginningW  !    [!+,r   c                 \    | j                   j                  d       | j                  d       y )N   foo=bar&r   r   r   s    r   test_querystring_blank_endz0TestQuerystringParser.test_querystring_blank_end\  r   r   c                 ^    | j                   j                  d       | j                  dd       y )Ns   foo=bar&asdf=bazr   r      bazr   r   s    r   test_multiple_querystringz/TestQuerystringParser.test_multiple_querystringa  '    ()	
r   c                     | j                   j                  d       | j                  dd       | j                   j                  d       | j                  d       y )Nr   r   Fr2   s   asdf=bazr   r   r   s    r   test_streaming_simplez+TestQuerystringParser.test_streaming_simplei  sN    [! 	 	

 	[!	
r   c                    | j                   j                  d       | j                  d       | j                   j                  d       | j                  d       | j                   j                  d       | j                  d       | j                   j                  d       | j                  dd       | j                   j                  d       | j                  d	       y )
Ns   foo=oneFr   s   twos   threes   &asd)r@   s   onetwothrees   f=bazr   r   r   s    r   test_streaming_breakz*TestQuerystringParser.test_streaming_breaku  s    Z E*VE*XE*W$ 	 	

 	X	
r   c                 ^    | j                   j                  d       | j                  dd       y )Ns   foo=bar;asdf=bazr   r   r   r   s    r   test_semicolon_separatorz.TestQuerystringParser.test_semicolon_separator  r   r   c                     d| j                   _        | j                   j                  d       | j                  dd       | j                   j                  d       | j                  d       y )N   r   r   Fr   s   a=123456)   as   12345)r   max_sizer*   r   r   s    r   test_too_large_fieldz*TestQuerystringParser.test_too_large_field  sT     	[!+e< 	[!+,r   c                 p    | j                  t              5  t        d      }d d d        y # 1 sw Y   y xY w)Nir   )r   
ValueErrorr   )r    r   s     r   test_invalid_max_sizez+TestQuerystringParser.test_invalid_max_size  s&    z*!40A +**   ,5c                     d}t        |      D ]~  \  }}| j                          d| j                  _        t	        |d|       | j                  j                  |       | j                  j                  |       | j                  dd        y )Ns   foo=bar&another=asdfT / r      anotherr   )	split_allr   r   strict_parsingprintr*   r   )r    r]   firstlasts       r   test_strict_parsing_passz.TestQuerystringParser.test_strict_parsing_pass  ss    &$T?KE4JJL$(DFF!UIS)*FFLLFFLL/1FG +r   c                    d}t        |      D ]  \  }}| j                          d| j                  _        d}| j	                  t
              5 }|| j                  j                  |      z  }|| j                  j                  |      z  }| j                  j                          d d d        | j                  |j                  j                  d|z
          y # 1 sw Y   8xY w)N   foo=bar&&another=asdfTr      )r
  r   r   r  r   QuerystringParseErrorr*   r2   r#   	exceptionoffset)r    r]   r  r  cntcms         r   #test_strict_parsing_fail_double_sepz9TestQuerystringParser.test_strict_parsing_fail_double_sep  s    '$T?KE4JJL$(DFF!C""#89Rtvv||E**tvv||D))! : ~  !4!4a#g> +
 :9s   ACC#	c                    d}t        |      D ]w  \  }}t        d|d|d       | j                          d}|| j                  j	                  |      z  }|| j                  j	                  |      z  }| j                  dd       y y )Nr   r  r   r   r  )r
  r  r   r   r*   r   )r    r]   r  r  r  s        r   test_double_sepz%TestQuerystringParser.test_double_sep  s~    '$T?KE4AeYc$+,JJLC466<<&&C466<<%%C/1FG +r   c                    d| j                   _        | j                  t              5 }| j                   j	                  d       d d d        '| j                  |j                  j                  d       y y # 1 sw Y   3xY w)NT   foo=bar&blank&another=asdfr  )r   r  r   r  r*   r#   r  r  )r    r  s     r   !test_strict_parsing_fail_no_valuez7TestQuerystringParser.test_strict_parsing_fail_no_value  sd     $45FFLL67 6 >R\\00!4  65s   A55A>c                 `    | j                   j                  d       | j                  ddd       y )Nr  r   )s   blankr   r  r   r   s    r   test_success_no_valuez+TestQuerystringParser.test_success_no_value  s*    23!	
r   c                 .    t        | j                        }y r   )reprr   )r    _ignoreds     r   	test_reprzTestQuerystringParser.test_repr  s    <r   N)rH   rI   rJ   r   r!   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r$  rK   r   r   r   r   )  s^    .:-
-
-




*
	-1
H?"
H5
 r   r   c                   B    e Zd Zd Zd
dZd
dZd
dZd Zd Zd Z	d Z
y	)TestOctetStreamParserc                 z     g  _         d _        d _         fd} fd} fd}|||d}t        |       _        y )Nr   c                  0     xj                   dz  c_         y Nr   )startedr   s   r   on_startz-TestOctetStreamParser.setUp.<locals>.on_start  s    LLALr   c                 B    j                   j                  | ||        y r   )rU   r   )r]   r   r   r    s      r   on_dataz,TestOctetStreamParser.setUp.<locals>.on_data  s    FFMM$uS/*r   c                  0     xj                   dz  c_         y r)  )finishedr   s   r   on_endz+TestOctetStreamParser.setUp.<locals>.on_end  s    MMQMr   )r+  r-  r0  )rU   r*  r/  OctetStreamParserr   )r    r+  r-  r0  r   s   `    r   r!   zTestOctetStreamParser.setUp  sG    		+	 !
	 #9-r   c                 h    | j                  dj                  | j                        |       g | _        y r   )r#   rb   rU   r    r]   r2   s      r   r^   z!TestOctetStreamParser.assert_data  s&    $&&)40r   c                 z    |r| j                  | j                  d       y | j                  | j                  d       y Nr   r   )r#   r*  r    r   s     r   assert_startedz$TestOctetStreamParser.assert_started  s-    T\\1-T\\1-r   c                 z    |r| j                  | j                  d       y | j                  | j                  d       y r5  )r#   r/  r6  s     r   assert_finishedz%TestOctetStreamParser.assert_finished   s-    T]]A.T]]A.r   c                    | j                  d       | j                  j                  d       | j                          | j                  d       | j	                  d       | j                  j                          | j	                          y )NFrj   )r7  r   r*   r^   r9  r2   r   s    r   rk   z!TestOctetStreamParser.test_simple  sf    E" 	Y# 	U#r   c                    | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                          | j                  d       | j	                          y )Nr@   rA   r   s	   foobarbaz)r   r*   r2   r^   r9  r   s    r   test_multiple_chunksz*TestOctetStreamParser.test_multiple_chunks  sZ    VVV&r   c                     d| j                   _        | j                   j                  d       | j                   j                          | j	                  d       | j                          y )Nrn   
   0123456789s   01234)r   r   r*   r2   r^   r9  r   s    r   test_max_sizez#TestOctetStreamParser.test_max_size  sE    ]#"r   c                 p    | j                  t              5  t        d      }d d d        y # 1 sw Y   y xY w)Nr   r  )r   r  r1  r    qs     r   r  z+TestOctetStreamParser.test_invalid_max_size&  s&    z*!51A +**r  NT)rH   rI   rJ   r!   r^   r7  r9  rk   r<  r?  r  rK   r   r   r&  r&    s*    .,./2r   r&  c                   D    e Zd Zd ZddZd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestBase64Decoderc                 V    t               | _        t        | j                        | _        y r   )r   r   Base64DecoderrU   r   s    r   r!   zTestBase64Decoder.setUp-  s    tvv&r   c                 0   |r| j                   j                          | j                  j                  d       | j	                  | j                  j                         |       | j                  j                  d       | j                  j                          y rX   rU   r2   r   rZ   r#   r[   r\   r3  s      r   r^   zTestBase64Decoder.assert_data1  Y    FFOOA-Ar   c                 \    | j                   j                  d       | j                  d       y )N   Zm9vYmFyrj   rU   r*   r^   r   s    r   rk   zTestBase64Decoder.test_simple:  s     [!#r   c                     | j                  t              5  | j                  j                  d       d d d        y # 1 sw Y   y xY w)Ns   Zm9v!mFy)r   DecodeErrorrU   r*   r   s    r   test_badzTestBase64Decoder.test_bad>  s,    {+FFLL% ,++s	   ;Ac                     | j                   j                  d       | j                   j                  d       | j                  d       y )N   Zm9vs   YmFyrj   rM  r   s    r   test_split_properlyz%TestBase64Decoder.test_split_properlyB  s0    WW#r   c                     d}t        dd      D ]c  }|d | ||d  }}| j                          | j                  j                  |       | j                  j                  |       | j	                  d       e y )NrR  r      r@   ranger!   rU   r*   r^   r    buffir  seconds        r   test_bad_splitz TestBase64Decoder.test_bad_splitG  sc    q!A !Hd12h6EJJLFFLLFFLL V$ r   c                     d}t        dd      D ]c  }|d | ||d  }}| j                          | j                  j                  |       | j                  j                  |       | j	                  d       e y )NrL  rn   r  rj   rV  rX  s        r   test_long_bad_splitz%TestBase64Decoder.test_long_bad_splitQ  sc    q!A !Hd12h6EJJLFFLLFFLL Y' r   c                     t               }t        |      }|j                          |j                  j                          |j	                          |j                  j                          y r   )r	   rG  r2   assert_called_once_withr5   r    parserr   s      r   test_close_and_finalizez)TestBase64Decoder.test_close_and_finalize[  sE    &!	

//1		,,.r   c                     | j                   j                  d       | j                  t              5  | j                   j	                          d d d        y # 1 sw Y   y xY w)Ns   Zm9vYmF)rU   r*   r   rO  r2   r   s    r   test_bad_lengthz!TestBase64Decoder.test_bad_lengthe  s:    Z {+FFOO ,++s   AANrC  )rH   rI   rJ   r!   r^   rk   rP  rS  r\  r^  rc  re  rK   r   r   rE  rE  +  s/    '$&$
%(/r   rE  c                   P    e Zd Zd ZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestQuotedPrintableDecoderc                 V    t               | _        t        | j                        | _        y r   )r   r   QuotedPrintableDecoderrU   r   s    r   r!   z TestQuotedPrintableDecoder.setUpm  s    '/r   c                 0   |r| j                   j                          | j                  j                  d       | j	                  | j                  j                         |       | j                  j                  d       | j                  j                          y rX   rI  r3  s      r   r^   z&TestQuotedPrintableDecoder.assert_dataq  rJ  r   c                 \    | j                   j                  d       | j                  d       y ri   rM  r   s    r   rk   z&TestQuotedPrintableDecoder.test_simplez  rl   r   c                 \    | j                   j                  d       | j                  d       y )Ns	   foo=3Dbarr   rM  r   s    r   test_with_escapez+TestQuotedPrintableDecoder.test_with_escape~  s     \"$r   c                 \    | j                   j                  d       | j                  d       y )Ns	   foo=
barrj   rM  r   s    r   test_with_newline_escapez3TestQuotedPrintableDecoder.test_with_newline_escape  s     ^$#r   c                 \    | j                   j                  d       | j                  d       y )Ns   foo=
barrj   rM  r   s    r   test_with_only_newline_escapez8TestQuotedPrintableDecoder.test_with_only_newline_escape  s     \"#r   c                     | j                   j                  d       | j                   j                  d       | j                  d       y )Ns   foo=3s   Dbarr   rM  r   s    r   test_with_split_escapez1TestQuotedPrintableDecoder.test_with_split_escape  s0    XW$r   c                     | j                   j                  d       | j                   j                  d       | j                  d       y )Ns   foo=s   
barrj   rM  r   s    r    test_with_split_newline_escape_1z;TestQuotedPrintableDecoder.test_with_split_newline_escape_1  s0    YX#r   c                     | j                   j                  d       | j                   j                  d       | j                  d       y )Ns   foo=s   
barrj   rM  r   s    r    test_with_split_newline_escape_2z;TestQuotedPrintableDecoder.test_with_split_newline_escape_2  s0    WZ #r   c                     t               }t        |      }|j                          |j                  j                          |j	                          |j                  j                          y r   )r	   ri  r2   r`  r5   ra  s      r   rc  z2TestQuotedPrintableDecoder.test_close_and_finalize  sE    "6*	

//1		,,.r   c                 B   | j                   j                  d       | j                  d       | j                   j                  d       | j                   j                  d       | j                  d       | j                   j                  d       | j                  d       y)zG
        https://github.com/andrew-d/python-multipart/issues/6
        s   =3AXs   :Xs   =3s   AXs   q=3AXs   q:XNrM  r   s    r   test_not_alignedz+TestQuotedPrintableDecoder.test_not_aligned  sp     	W 	UUX r   NrC  )rH   rI   rJ   r!   r^   rk   rm  ro  rq  rs  ru  rw  rc  rz  rK   r   r   rg  rg  l  s9    0$%$$%
$
$
/!r   rg  r,   httpsingle_field_blocksz.httpz.yamlrb)nametestresultc              #   ^   K   t        dt        |       dz
        D ]  }| d| | |d f  yw)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)rW  len)r   rZ  s     r   r
  r
    s8      1c#hl#2AwAB   $s   +-c                       e Zd Zi fdZd Zd Zd Z ede      d        Z	d Z
d Zd	 Zed
        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestFormParserc                 z     d _         g  _        g  _         fd} fd} fd}t        d|||||       _        y )NFc                 <    j                   j                  |        y r   )fieldsr   r   r    s    r   on_fieldz%TestFormParser.make.<locals>.on_field  s    KKq!r   c                 <    j                   j                  |        y r   )filesr   r  s    r   on_filez$TestFormParser.make.<locals>.on_file  s    JJa r   c                      d _         y )NT)endedr   s   r   r0  z#TestFormParser.make.<locals>.on_end  s
    DJr   multipart/form-data)boundaryrQ   )r  r  r  
FormParserr   )r    r  rQ   r  r  r0  s   `     r   makezTestFormParser.make  sC    

	"	!	 18Wf%-f>r   c                     |j                   }|j                  d       |j                         }| j                  ||       y rX   )rY   rZ   r[   r#   )r    r   r]   o	file_datas        r   assert_file_datazTestFormParser.assert_file_data  s1    MM	q	FFH	D)r   c                 P   d }| j                   D ]  }|j                  |k(  s|} n | j                  |       	 | j                  ||       | j	                  |j
                  |       | j                   j                  |       |j                          y # |j                          w xY wr   )r  r$   r   r  r#   	file_nameremover5   )r    r$   r  r]   foundr   s         r   assert_filezTestFormParser.assert_file  s    A||z)  	U#		!!%.U__i8 JJe$ KKMEKKMs   A	B B%c                     d }| j                   D ]  }|j                  |k(  s|} n | j                  |       | j                  ||j                         | j                   j                  |       y r   )r  r$   r   r#   r+   r  )r    r~  r+   r  r   s        r   assert_fieldzTestFormParser.assert_field  sa    A||t#  	U#, 	5!r   paramc                    |d   d   }t        |t              r|j                  d      }| j                  |       d }	 | j                  j                  |d         }| j                  j                          d|d   d   v r7| j                  |       | j                  |d   d   d   |j                         y | j                  |t        |d                |d   d   D ]e  }|d   }|d	   j                  d      }|d
k(  r| j                  ||d          7|dk(  r)| j                  ||d   j                  d      |d          eJ  y # t        $ r}d}|}Y d }~d }~ww xY w)Nr  r  zlatin-1r  r   errorexpectedtyper~  fieldr]   filer  )r   r   r   r  r   r*   r2   MultipartParseErrorr   r#   r  r  r  r  )r    r  r  exc	processeder  r~  s           r   	test_httpzTestFormParser.test_http  sh    ?:.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                 &   d}t        t        j                  j                  t        |      d      5 }|j                         }ddd       t              D ]  \  }}| j                  d       d}|| j                  j                  |      z  }|| j                  j                  |      z  }| j                  j                          | j                  |t        |             | j                  dd       | j                  dd	d
        y# 1 sw Y   xY w)zz
        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)openr`   ra   rb   http_tests_dirr[   r
  r  r   r*   r2   r#   r  r  r  )r    	test_filer   r,   r  r  rZ  s          r   test_random_splittingz$TestFormParser.test_random_splittingM  s     4	"'',,~y94@AI A %Y/KE4IIj! Ae$$Ad##AFFOO QI/ h1Wk8< 0	 A@s   DDc                    d}t        t        j                  j                  t        |      d      5 }|j                         }ddd       | j                  d       d}t        t                    D ](  }|||dz    }|| j                  j                  |      z  }* | j                  j                          | j                  |t        |             | j                  dd       | j                  d	d
d       y# 1 sw Y   xY w)L
        This test parses a simple multipart body 1 byte at a time.
        r  r}  Nr  r   r   r  r  r  r   r  )r  r`   ra   rb   r  r[   r  rW  r  r   r*   r2   r#   r  r  )r    r  r   r,   rZ  xr   s          r   test_feed_single_bytesz%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                    d}t        t        j                  j                  t        |      d      5 }|j                         }ddd       t        dt              dz         D ]  }t        |      D ]  }| j                  d       d}| j                  j                  |d|        ||z  }t        |t        |      |      D ](  }||||z    }|| j                  j                  |      z  }* | j                  j                          | j                  |t        |             | j                  dd         y# 1 sw Y   xY w)	r  zsingle_field_blocks.httpr}  Nr   r  r   r  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)r  r`   ra   rb   r  r[   rW  r  r  r   r*   r2   r#   r  )	r    r  r   r,   rR   rU   rZ  r  r   s	            r   test_feed_blockszTestFormParser.test_feed_blocks  s   
 /	"'',,~y94@AI A q#i.1,-A1X 		*%Yr]+Qq#i.!4A "!AE*Aa(A 5 !   C	N3 !!("MO+  . A@s   D66D?c                 `   d}t        t        j                  j                  t        |      d      5 }|j                         }ddd       d}d}d}d}t        d|fz         t        |      D ]e  }t              }	t        j                  g d      }
|
dk(  rMt        j                  t        |            }t        j                  d	      }|	j                  ||       d
||fz  }nt|
dk(  r(t        j                  t        |            }|	|= d|fz  }nG|
dk(  rBt        j                  t        |      dz
        }|	|dz      |	|   c|	|<   |	|dz   <   d||dz   fz  }t        dz          | j                  d       d}	 | j                  j!                  t#        |	            }| j                  j%                          |t        |	      k(  r|dz  }a|dz  }h t        d       t        d|fz         t        d|fz         t        d|fz         y# 1 sw Y   xY w# t&        $ r	 |dz  }Y w xY w)ap  
        This test randomly fuzzes the request body to ensure that no strange
        exceptions are raised and we don't end up in a strange state.  The
        fuzzing consists of randomly doing one of the following:
            - Adding a random byte at a random offset
            - Randomly deleting a single byte
            - Randomly swapping two bytes
        r  r}  N  r   &Running %d iterations of fuzz testing:)r   r      r      zInserting byte %r at offset %dr   zDeleting byte at offset %dr  zSwapping bytes %d and %dz  r  2--------------------------------------------------Successes:  %dFailures:   %dExceptions: %d)r  r`   ra   rb   r  r[   r  rW  	bytearrayrandomchoice	randranger  insertr  r   r*   bytesr2   FormParserError)r    r  r   r,   
iterations	successesfailures
exceptionsrZ  	fuzz_datar  r   msgs                r   test_request_body_fuzzz%TestFormParser.test_request_body_fuzz  s"    4	"'',,~y94@AI A 
	
6*FGz"A!),I ]]9-F{$$S^4$$S)  A&6!Q?1$$S^4aL2aT91$$S^a%781:1q51A9Q<.	!iA.0Aq1u:= $* IIj! A	"FFLLy!12! I&NIMH[ #^ 	BC)-.(,-*./w A@` #  a
 s   H:>HHH-,H-c                 4   d}d}d}d}t        d|fz         t        |      D ]  }t        j                  dd      }t	        j
                  |      }t        d|fz         | j                  d       d}	 | j                  j                  t        |            }| j                  j                          |t        |      k(  r|dz  }|dz  } t        d	       t        d
|fz         t        d|fz         t        d|fz         y# t        $ r |dz  }Y w xY w)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  r  N)r  rW  r  r  r`   urandomr  r   r*   r  r2   r  r  )r    r  r  r  r  rZ  	data_sizer]   s           r   "test_request_body_fuzz_random_dataz1TestFormParser.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   4>DDDc                 d   | j                  d       d}| j                  t              5  | j                  j	                  |       d d d        | j                  d       d}| j                  t              5  | j                  j	                  |      }d d d        y # 1 sw Y   VxY w# 1 sw Y   y xY w)Nr  s   --boundaryfoobars   --boundaryfoobar)r  r   r  r   r*   )r    r]   rZ  s      r   test_bad_start_boundaryz&TestFormParser.test_bad_start_boundary  s    		*$23FFLL 4 			*"23T"A 43 43
 43s   B5B&B#&B/c                    g fd}t               }t               }t        d|||d      }| j                  t        |j                  t
                     |j                  d       |j                  d       |j                          | j                  |j                         | j                  t              d       | j                  d   d	       | j                  |j                         y )
Nc                 (    j                  |        y r   r   r   r  s    r   r  z1TestFormParser.test_octet_stream.<locals>.on_file%      LLOr   application/octet-streamrO   )r0  r  r.   s   1234r   r   s   test1234)r	   r  rd   r   rb  r1  r*   r2   rB   calledr#   r  r  r    r  r  r0  r   r  s        @r   test_octet_streamz TestFormParser.test_octet_stream#  s    	618WV_ij
188->?@			

 	)UQ'eAh4&r   c                 R    g fd}t               t                fd}t        d|      } j                  t        |j                  t
                      ||       t        d|      } j                  t        |j                  t
                      ||       y )Nc                 (    j                  |        y r   r   r   r  s    r   r  z1TestFormParser.test_querystring.<locals>.on_field9      MM!r   c                 N   d d = j                          j                          | j                  d       | j                  d       | j                          j                  j                         j                  t              d       j                  d   j                  d       j                  d   j                  d       j                  d   j                  d       j                  d   j                  d	       j                  j                         y )
Nr   s
   &test=asdfr   r   r@   rA   r   r.   r   )

reset_mockr*   r2   rB   r  r#   r  r$   r+   rd   )r   r  r0  r  r    s    r   simple_testz4TestFormParser.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r0  application/x-url-encoded)r	   r  rd   r   rb  r   )r    r  r  r   r  r0  r  s   `   @@@r   test_querystringzTestFormParser.test_querystring7  s    	&	+2 :HgV\]
188->?@A2HgfU
188->?@Ar   c                     t               }t        dd d       }||_        |j                          |j                  j	                          |j                          |j
                  j	                          y )Nr  )r	   r  rb  r2   r`  r5   ra  s      r   test_close_methodsz!TestFormParser.test_close_methods_  sQ    2D$?	

//1		,,.r   c                 r    | j                  t              5  t        dd d       }d d d        y # 1 sw Y   y xY w)Nzapplication/bad)r   r  r  rC   s     r   test_bad_content_typez$TestFormParser.test_bad_content_typej  s+    z*,dD9A +**   -6c                 r    | j                  t              5  t        dd d       }d d d        y # 1 sw Y   y xY w)Nr  )r   r  r  rC   s     r   test_no_boundary_givenz%TestFormParser.test_no_boundary_giveno  s-     /0$=A 0//r  c                    d}g fd}t               }t               }ddi}t        d|||d|      }| j                  t              5  |j	                  |       |j                          d d d        ddi}t        d|||d|      }|j	                  |       |j                          | j                  d	   d
       y # 1 sw Y   UxY w)Ns   ----boundary
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Content-Transfer-Encoding: badstuff

Test
----boundary--
c                 (    j                  |        y r   r   r  s    r   r  zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_filey  r  r   UPLOAD_ERROR_ON_BAD_CTETr  z
--boundary)r0  r  rQ   Fr   s   Test)r	   r  r   r  r*   r2   r  )r    r]   r  r  r0  rQ   r   r  s          @r   "test_bad_content_transfer_encodingz1TestFormParser.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   	"B??Cc                    g fd}t               }t               }t        d|||      }|j                  d       |j                          | j	                  d   j
                  d       | j	                  d   j                  d       | j	                  d   j
                  d	       | j	                  d   j                  d        | j	                  d
   j
                  d       | j	                  d
   j                  d       y )Nc                 (    j                  |        y r   r   r  s    r   r  z9TestFormParser.test_handles_None_fields.<locals>.on_field  r  r   r  r  s   foo=bar&another&baz=asdfr   r@   rA   r   r	  r   r   r   )r	   r  r*   r2   r#   r$   r+   )r    r  r  r0  r   r  s        @r   test_handles_None_fieldsz'TestFormParser.test_handles_None_fields  s    	&:HgV\]	+,	

--v6&1--z:$/--v6'2r   c                    d}t        t        j                  j                  t        |      d      5 }|j                         }d d d        | j                  d       t              dz  | j                  j                  _
        | j                  j                  |      }| j                  j                          | j                  |t        |      dz         y # 1 sw Y   xY w)Nr  r}  r  r   )r  r`   ra   rb   r  r[   r  r  r   rb  r   r*   r2   r#   )r    r  r   r,   rZ  s        r   test_max_size_multipartz&TestFormParser.test_max_size_multipart  s    3	"'',,~y94@AI A 			* "%Y!!3FFLL# 	C	NQ./ A@s   CCc                    d}t        t        j                  j                  t        |      d      5 }|j                         }d d d        t              dz  }| j                  dd|i       | j                  j                  |      }| j                  j                          | j                  |t        |      dz         y # 1 sw Y   xY w)Nr  r}  r   r  MAX_BODY_SIZErP   )r  r`   ra   rb   r  r[   r  r  r   r*   r2   r#   )r    r  r   r,   sizerZ  s         r   test_max_size_form_parserz(TestFormParser.test_max_size_form_parser  s    3	"'',,~y94@AI A
 9~!		*ot%<	=FFLL# 	C	NQ./ A@s   CC
c           	          g fd}t               }t               }t        d|||dddi      }|j                  d       |j                          | j	                  d   d	       y )
Nc                 (    j                  |        y r   r   r  s    r   r  z:TestFormParser.test_octet_stream_max_size.<locals>.on_file  r  r   r  rO   r  r}   )r0  r  rQ   s   0123456789012345689r   r>  )r	   r  r*   r2   r  r  s        @r   test_octet_stream_max_sizez)TestFormParser.test_octet_stream_max_size  se    	618W$
.35 	
&'	

eAh6r   c                 r    | j                  t              5  t        dd      }d d d        y # 1 sw Y   y xY w)Ns   boundr   r  )r   r  MultipartParserrA  s     r   test_invalid_max_size_multipartz.TestFormParser.test_invalid_max_size_multipart  s(    z*59A +**r  N)rH   rI   rJ   r  r  r  r  r   
http_testsr  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rK   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                   $    e Zd Zd Zd Zd Zd Zy)TestHelperFunctionsc                 `    t        ddid d       }| j                  t        |t                     y )NContent-Typer  )create_form_parserrd   r   r  )r    rs     r   test_create_form_parserz+TestHelperFunctions.test_create_form_parser  s,    0JK#T+
1j12r   c                 v    i }| j                  t              5  t        |d d        d d d        y # 1 sw Y   y xY wr   )r   r  r
  )r    headerss     r   test_create_form_parser_errorz1TestHelperFunctions.test_create_form_parser_error  s-    z*wd3 +**s   /8c                     t               }t               }t        ddit        d      ||       |j                  dk(  sJ | j	                  |j
                  d   d   j                  d       y )Nr	  r     123456789012345r   r   r   )r	   
parse_formr   
call_countr#   	call_argsr  )r    r  r  s      r   test_parse_formz#TestHelperFunctions.test_parse_form  sp    6&7 &'	
 !!Q&&& 	**1-a055r:r   c                     g fd}t        dddt        d      d |       | j                  t              d       | j                  d   j                  d       y )	Nc                 (    j                  |        y r   r   )r  r  s    r   r  zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_file  s    LLr   r  10)r	  zContent-Lengthr  r   r   r}   )r  r   r#   r  r  )r    r  r  s     @r   test_parse_form_content_lengthz2TestHelperFunctions.test_parse_form_content_length  sa    	 	7# &'	
 	UQ'q+r   N)rH   rI   rJ   r  r  r  r  rK   r   r   r  r    s    3
4
;$,r   r  c                     t        j                         } | j                  t         j                  j	                  t
                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | j                  t         j                  j	                  t                     | S r   )unittest	TestSuiteaddTestdefaultTestLoaderloadTestsFromTestCaserM   r   r   r   r&  rE  rg  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   )6r`   r   globyamlbase64r  rS   r  compatr   r   r   ior   unittest.mockr   r	   r
   	multipartra   abspathdirname__file__curr_dirr   TestCaser   rM   r   r   r   r&  rE  rg  rb   r  NON_PARAMETRIZED_TESTSr  listdirr   r   fnamer   	yaml_filer  r[   r,   	safe_load	yaml_datar   r
  r  r  r   rK   r   r   <module>r3     s=   	 
       
  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	I 	