o
    JXîhéf ã                   @   sÆ  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 d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlZd dlZd dlZd dlmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dlm4Z4 d dlm5Z5 d dlm6Z6 d dlm7Z7 d dlm8Z8 d dlm9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z?m@Z@ d dl1mAZAmBZB dZCd ZDd!ZEG d"d#„ d#e@ƒZFG d$d%„ d%ejGƒZHG d&d'„ d'e@ƒZIG d(d)„ d)ejGƒZJG d*d+„ d+ejGƒZKG d,d-„ d-ejGƒZLG d.d/„ d/ejGƒZMG d0d1„ d1ejGƒZNG d2d3„ d3e@ƒZOG d4d5„ d5e@ƒZPG d6d7„ d7e@ƒZQG d8d9„ d9e@ƒZRG d:d;„ d;e@ƒZSG d<d=„ d=e@ƒZTG d>d?„ d?e@ƒZUG d@dA„ dAe@ƒZVG dBdC„ dCe@ƒZWG dDdE„ dEe@ƒZXG dFdG„ dGe@ƒZYG dHdI„ dIƒZZG dJdK„ dKeZeTƒZ[G dLdM„ dMeZeTƒZ\G dNdO„ dOejGƒZ]G dPdQ„ dQejGƒZ^G dRdS„ dSejGƒZ_G dTdU„ dUe@ƒZ`G dVdW„ dWe@ƒZaG dXdY„ dYe@ƒZbG dZd[„ d[e@ƒZcedd\kráe e¡  dS dS )]é    N)ÚStringIOÚBytesIO)Úchain©Úchoice)ÚThread)Úpatch)ÚCharset)Ú	GeneratorÚDecodedGeneratorÚBytesGenerator)ÚHeaderÚdecode_headerÚmake_header)ÚHeaderRegistry)ÚMessage)ÚMIMEApplication)Ú	MIMEAudio)ÚMIMEBase)Ú	MIMEImage)ÚMIMEMessage)ÚMIMEMultipart)ÚMIMENonMultipart)ÚMIMEText)ÚParserÚHeaderParser)Ú
base64mime)Úencoders©Úerrors)Ú	iterators)Ú
quoprimime)Úutils)Úthreading_helper)Úunlink)ÚopenfileÚTestEmailBase)Ú
FeedParserÚBytesFeedParserÚ
Ú ú c                   @   s´  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>dydz„ Z?d{d|„ Z@d}d~„ ZAdd€„ ZBdd‚„ ZCdƒd„„ ZDd…d†„ ZEd‡dˆ„ ZFd‰dŠ„ ZGd‹dŒ„ ZHddŽ„ ZIdd„ ZJd‘d’„ ZKd“d”„ ZLd•d–„ ZMd—d˜„ ZNd™dš„ ZOd›dœ„ ZPddž„ ZQdŸd „ ZRd¡d¢„ ZSd£d¤„ ZTd¥d¦„ ZUd§d¨„ ZVd©dª„ ZWd«S )¬ÚTestMessageAPIc                 C   s:   | j }|  d¡}|| d¡g d¢ƒ || dd¡dƒ d S )Nz
msg_20.txtZcc)zccc@zzz.orgzddd@zzz.orgzeee@zzz.orgÚxxzn/a)ÚassertEqualÚ_msgobjÚget_all©ÚselfÚeqÚmsg© r5   úD/opt/python-3.10.19/usr/lib/python3.10/test/test_email/test_email.pyÚtest_get_all9   s   
zTestMessageAPI.test_get_allc                 C   s   | j }tƒ }|| ¡ d ƒ tdƒ}| |¡ ||d dƒ || ¡ dƒ ||d dƒ || d¡dƒ ||d d	ƒ || ¡ jdƒ | d ¡ || ¡ d ƒ ||d dƒ tƒ }d
|d< d|d< d|d< | |¡ ||d d
ƒ ||d dƒ ||d dƒ d S )Nú
iso-8859-1úmime-versionz1.0ú
text/plainúcontent-typez text/plain; charset="iso-8859-1"Úcharsetúcontent-transfer-encodingúquoted-printablez2.0zMIME-Versionztext/x-weirdúContent-Typezquinted-puntableúContent-Transfer-Encodingz"text/x-weird; charset="iso-8859-1")r.   r   Úget_charsetr	   Úset_charsetÚget_content_typeÚ	get_paramÚinput_charset©r2   r3   r4   r<   r5   r5   r6   Útest_getset_charset?   s,   


z"TestMessageAPI.test_getset_charsetc                 C   s8   | j }tƒ }| d¡ || ¡ jdƒ ||d dƒ d S )Núus-asciir;   útext/plain; charset="us-ascii")r.   r   rB   rA   rE   r1   r5   r5   r6   Útest_set_charset_from_stringY   s
   
z+TestMessageAPI.test_set_charset_from_stringc                 C   s0   t ƒ }tdƒ}| d|¡ |  | ¡ jd¡ d S )Nr8   zThis is a string payload)r   r	   Úset_payloadr.   rA   rE   )r2   r4   r<   r5   r5   r6   Útest_set_payload_with_charset`   s   z,TestMessageAPI.test_set_payload_with_charsetc                 C   sV   d}t dƒ}tƒ }| ||¡ |  |d d¡ |  |jdd|¡ |  | ¡ d¡ d S )Nó   ÐÐ‘Ð’úutf-8r=   Úbase64T©Údecodez	0JDQkdCS
)r	   r   rK   r.   Úget_payload©r2   Údatar<   r4   r5   r5   r6   Ú+test_set_payload_with_8bit_data_and_charsetf   s   z:TestMessageAPI.test_set_payload_with_8bit_data_and_charsetc                 C   sR   d}t dƒ}d |_tƒ }| | d¡|¡ |  |d d¡ |  |jdd|¡ d S ©NrM   rN   r=   Ú8bitTrP   )r	   Úbody_encodingr   rK   rQ   r.   rR   rS   r5   r5   r6   Ú>test_set_payload_with_non_ascii_and_charset_body_encoding_noneo   s   zMTestMessageAPI.test_set_payload_with_non_ascii_and_charset_body_encoding_nonec                 C   sL   d}t dƒ}d |_tƒ }| ||¡ |  |d d¡ |  |jdd|¡ d S rV   )r	   rX   r   rK   r.   rR   rS   r5   r5   r6   Ú>test_set_payload_with_8bit_data_and_charset_body_encoding_nonex   s   zMTestMessageAPI.test_set_payload_with_8bit_data_and_charset_body_encoding_nonec                 C   s$   t ƒ }| g ¡ |  | ¡ g ¡ d S ©N©r   rK   r.   rR   ©r2   r4   r5   r5   r6   Útest_set_payload_to_list   ó   
z'TestMessageAPI.test_set_payload_to_listc                 C   s8   t ƒ }d|d< | d¡ tt ƒ ƒ}|  td|j|¡ d S )Númultipart/mixedr?   zstring payloadz[Aa]ttach.*non-multipart)r   rK   r   ZassertRaisesRegexÚ	TypeErrorÚattach)r2   r4   Zsub_msgr5   r5   r6   Ú"test_attach_when_payload_is_string†   s   

ÿz1TestMessageAPI.test_attach_when_payload_is_stringc                 C   sl   | j }|  d¡}| ¡ }||g d¢ƒ |  d¡}| d¡}||g d¢ƒ |  d¡}| ¡ }||g d¢ƒ d S )Nz
msg_08.txt)NrH   r8   ú
iso-8859-2úkoi8-rz
msg_09.txtÚdingbat)rf   rH   r8   rf   re   z
msg_12.txt)NrH   r8   Nrd   z
iso-8859-3rH   re   )r.   r/   Úget_charsets)r2   r3   r4   Úcharsetsr5   r5   r6   Útest_get_charsetsŽ   s   



z TestMessageAPI.test_get_charsetsc                 C   sV   | j }|  d¡}dd„ | ¡ D ƒ}||ddgƒ |  d¡}| d¡}|| ¡ dƒ d S )Nú
msg_04.txtc                 S   ó   g | ]}|  ¡ ‘qS r5   ©Úget_filename©Ú.0Úpr5   r5   r6   Ú
<listcomp>£   ó    z4TestMessageAPI.test_get_filename.<locals>.<listcomp>úmsg.txtú
msg_07.txté   údingusfish.gif)r.   r/   rR   rm   )r2   r3   r4   Ú	filenamesÚsubpartr5   r5   r6   Útest_get_filenameŸ   s   


z TestMessageAPI.test_get_filenamec                 C   s4   | j }|  d¡}dd„ | ¡ D ƒ}||ddgƒ d S )Nz
msg_44.txtc                 S   rk   r5   rl   rn   r5   r5   r6   rq   ®   rr   zHTestMessageAPI.test_get_filename_with_name_parameter.<locals>.<listcomp>rs   ©r.   r/   rR   )r2   r3   r4   rw   r5   r5   r6   Ú%test_get_filename_with_name_parameterª   s   
z4TestMessageAPI.test_get_filename_with_name_parameterc                 C   ó"   | j }|  d¡}|| ¡ dƒ d S )Nrt   ÚBOUNDARY)r.   r/   Úget_boundaryr1   r5   r5   r6   Útest_get_boundary±   s   
z TestMessageAPI.test_get_boundaryc                 C   sž   | j }|  d¡}| d¡ | ¡ d \}}|| ¡ dƒ ||dƒ |  d¡}| d¡ | ¡ d \}}|| ¡ dƒ ||dƒ |  d¡}|  tj|jd¡ d S )	Nú
msg_01.txtr}   é   r;   z3text/plain; charset="us-ascii"; boundary="BOUNDARY"rj   z$multipart/mixed; boundary="BOUNDARY"ú
msg_03.txt)r.   r/   Úset_boundaryÚitemsÚlowerÚassertRaisesr   ÚHeaderParseError)r2   r3   r4   ÚheaderÚvaluer5   r5   r6   Útest_set_boundary·   s   






ÿz TestMessageAPI.test_set_boundaryc                 C   sL   t dƒ}|  | ¡ d d d¡ | ¡  |  | ¡ d d d d… d¡ d S )Nz	form-datar   ru   zmultipart/form-dataé!   z!multipart/form-data; boundary="==)r   r.   r„   Ú	as_stringr]   r5   r5   r6   Útest_make_boundaryÍ   s   ÿz!TestMessageAPI.test_make_boundaryc                 C   sv   t ddd}| ¡ }W d   ƒ n1 sw   Y  tƒ }| |¡}tƒ }t|ddƒ}| |d¡ |  | ¡ |¡ d S )Nú
msg_46.txtrN   ©ÚencodingTr   F)	r%   Úreadr   Úparsestrr   r
   Úflattenr.   Úgetvalue©r2   ÚfpZmsgdataÚparserr4   ÚoutÚgenr5   r5   r6   Útest_message_rfc822_onlyØ   s   
ÿ
z'TestMessageAPI.test_message_rfc822_onlyc                 C   s~   t ddd}| ¡  d¡}W d   ƒ n1 sw   Y  tj ¡ }| |¡}tƒ }tj 	|¡}| 
|¡ |  | ¡ |¡ d S )NrŽ   rN   r   Úascii)r%   r‘   ÚencodeÚemailr—   ÚBytesHeaderParserZ
parsebytesr   Ú	generatorr   r“   r.   r”   r•   r5   r5   r6   Útest_byte_message_rfc822_onlyä   s   ÿ


z,TestMessageAPI.test_byte_message_rfc822_onlyc                 C   sž   | j }|  d¡}||jddd ƒ || d¡jdddƒ || d¡jdddƒ || d¡jddd	ƒ || d
¡jdddƒ || d¡jdddƒ d S )Nz
msg_10.txtTrP   r   s    This is a 7bit encoded message.
ru   s-   ¡This is a Quoted Printable encoded message!
é   s!   This is a Base64 encoded message.é   s"   This is a Base64 encoded message.
r   s/   This has no Content-Transfer-Encoding: header.
rz   r1   r5   r5   r6   Útest_get_decoded_payloadï   s$   
ÿÿÿÿÿz'TestMessageAPI.test_get_decoded_payloadc                 C   sZ   | j }tƒ }| d¡ dD ]}||d< ||jdddƒ q| d¡ ||jdddƒ d S )	Nz$begin 666 -
+:&5L;&\@=V]R;&0 
 
end
©z
x-uuencodeÚuuencodeZuuezx-uuer=   TrP   ó   hello worldÚfoos   foo)r.   r   rK   rR   )r2   r3   r4   Úcter5   r5   r6   Útest_get_decoded_uu_payload  s   

z*TestMessageAPI.test_get_decoded_uu_payloadc                 C   s   t ƒ }|  t|jd¡ d S )Nru   )r   r†   ra   rR   r]   r5   r5   r6   Ú*test_get_payload_n_raises_on_non_multipart  ó   z9TestMessageAPI.test_get_payload_n_raises_on_non_multipartc                 C   sn   | j }|  d¡}tddd}| ¡ }W d   ƒ n1 sw   Y  tƒ }t|ƒ}| |¡ || ¡ |ƒ d S )Nrt   z
msg_17.txtrN   r   )r.   r/   r%   r‘   r   r   r“   r”   )r2   r3   r4   r–   ÚtextÚsÚgr5   r5   r6   Útest_decoded_generator  s   

ÿ
z%TestMessageAPI.test_decoded_generatorc                 C   sb   t ƒ }d|d< d|d< |  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )	NZMeÚFromZYouÚtoÚfromZFROMÚToZTO)r   ÚassertInr]   r5   r5   r6   Útest__contains__  s   zTestMessageAPI.test__contains__c                 C   s–   |   d¡}tddd}| ¡ }W d   ƒ n1 sw   Y  |  |t|ƒ¡ |jdd}| d¡}|  |d  d¡¡ |  |t	 
|d	d … ¡¡ d S )
Nr€   rN   r   T©Úunixfromr)   r   zFrom ru   )r/   r%   r‘   r.   ÚstrrŒ   ÚsplitÚ
assertTrueÚ
startswithÚNLÚjoin)r2   r4   r–   r¬   ÚfullreprÚlinesr5   r5   r6   Útest_as_string*  s   

ÿ
zTestMessageAPI.test_as_stringc                 C   óT   |   d¡}|jjdd}|j|d}tƒ }t||d}| |¡ |  || ¡ ¡ d S ©Nr€   ú
©Úlinesep©Úpolicy)	r/   rÇ   ÚclonerŒ   r   r
   r“   r.   r”   ©r2   r4   Z	newpolicyr¾   r­   r®   r5   r5   r6   Útest_as_string_policy4  ó   

z$TestMessageAPI.test_as_string_policyc                 C   s<   t  d¡}| d¡}t  d¡}t |¡}|  | ¡ |¡ d S )Nuê               MIME-Version: 1.0
            Content-type: text/plain; charset="iso-8859-1"

            Test if non-ascii messages with no Content-Transfer-Encoding set
            can be as_string'd:
            FÃ¶Ã¶ bÃ¤r
            r8   a%              MIME-Version: 1.0
            Content-type: text/plain; charset="iso-8859-1"
            Content-Transfer-Encoding: quoted-printable

            Test if non-ascii messages with no Content-Transfer-Encoding set
            can be as_string'd:
            F=F6=F6 b=E4r
            )ÚtextwrapÚdedentrœ   r   Úmessage_from_bytesr.   rŒ   ©r2   ÚmÚsourceÚexpectedr4   r5   r5   r6   Ú#test_nonascii_as_string_without_cte=  s
   



	z2TestMessageAPI.test_nonascii_as_string_without_ctec                 C   s>   t  d¡}| d¡}| dd¡}t |¡}|  | ¡ |¡ d S )NuÀ               MIME-Version: 1.0

            Test if non-ascii messages with no Content-Type nor
            Content-Transfer-Encoding set can be as_string'd:
            FÃ¶Ã¶ bÃ¤r
            r8   r›   Úreplace)rÌ   rÍ   rœ   rQ   r   rÎ   r.   rŒ   rÏ   r5   r5   r6   Ú4test_nonascii_as_string_without_content_type_and_cteS  s
   


zCTestMessageAPI.test_nonascii_as_string_without_content_type_and_ctec                 C   sœ   |   d¡}tddd}| ¡  d¡}W d   ƒ n1 sw   Y  |  |t|ƒ¡ |jdd}| d¡}|  |d  	d	¡¡ |  |d 
|d
d … ¡¡ d S )Nr€   rN   r   r›   Tr¶   ó   
r   s   From ru   )r/   r%   r‘   rœ   r.   ÚbytesÚas_bytesr¹   rº   r»   r½   )r2   r4   r–   rT   r¾   r¿   r5   r5   r6   Útest_as_bytes`  s   
ÿ
zTestMessageAPI.test_as_bytesc                 C   rÁ   rÂ   )	r/   rÇ   rÈ   rØ   r   r   r“   r.   r”   rÉ   r5   r5   r6   Útest_as_bytes_policyj  rË   z#TestMessageAPI.test_as_bytes_policyc                 C   s    t  d¡}|  | d¡d¡ d S )NzContent-Type: blarg; baz; boo
Úbazr*   ©r   Úmessage_from_stringr.   rD   r]   r5   r5   r6   Útest_bad_paramt  ó   
zTestMessageAPI.test_bad_paramc                 C   ó   t  d¡}|  | ¡ d ¡ d S ©Nz
From: foo
©r   rÝ   r.   rm   r]   r5   r5   r6   Útest_missing_filenamex  ó   
z$TestMessageAPI.test_missing_filenamec                 C   s   t  d¡}|  | ¡ d¡ d S )Nz%Content-Disposition: blarg; filename
r*   râ   r]   r5   r5   r6   Útest_bogus_filename|  s   ÿz"TestMessageAPI.test_bogus_filenamec                 C   rà   rá   ©r   rÝ   r.   r~   r]   r5   r5   r6   Útest_missing_boundary  rä   z$TestMessageAPI.test_missing_boundaryc                 C   sx   | j }t d¡}||jddg d¢ƒ t d¡}||jddg d¢ƒ || ¡ d ƒ t d¡}||jddg d¢ƒ d S )Nú&X-Header: foo=one; bar=two; baz=three
úx-header©rˆ   ))r§   Úone)ÚbarÚtwo©rÛ   Zthreez X-Header: foo; bar=one; baz=two
))r§   r*   )rì   rë   )rÛ   rí   ú"X-Header: foo; bar="one"; baz=two
)r.   r   rÝ   Ú
get_paramsr1   r5   r5   r6   Útest_get_params…  s(   ÿÿÿÿÿÿzTestMessageAPI.test_get_paramsc                 C   s$   t ƒ }d|d< |  | d¡d¡ d S )Nz>Content-Type: Multipart/mixed; boundary = "CPIMSSMTPC06p5f3tG"r?   ÚboundaryZCPIMSSMTPC06p5f3tG)r   r.   rD   r]   r5   r5   r6   Útest_get_param_liberal–  s   z%TestMessageAPI.test_get_param_liberalc                 C   s’   | j }t d¡}||jddddƒ ||jdddd ƒ || d¡d ƒ t d¡}||jdddd	ƒ ||jdddd
ƒ ||jddddƒ d S )Nrè   rì   ré   rê   rí   Zquuzrï   r§   r*   rë   rÛ   ©r.   r   rÝ   rD   r1   r5   r5   r6   Útest_get_param›  s   ÿÿzTestMessageAPI.test_get_paramc                 C   s&   |   d¡}|  | d¡ d¡d¡ d S )Nz
msg_22.txtru   Únamez
wibble.JPG)r/   r.   rR   rD   r]   r5   r5   r6   Ú'test_get_param_funky_continuation_lines­  s   
z6TestMessageAPI.test_get_param_funky_continuation_linesc                 C   s6   t  d¡}|  | d¡d¡ |  |jdddd¡ d S )Nz4Content-Type: image/pjpeg; name="Jim&amp;&amp;Jill"
rö   zJim&amp;&amp;JillF©Úunquotez"Jim&amp;&amp;Jill"rÜ   r]   r5   r5   r6   Ú#test_get_param_with_semis_in_quotes²  s   ÿÿz2TestMessageAPI.test_get_param_with_semis_in_quotesc                 C   s<   t  d¡}|  | d¡d¡ t  d¡}|  | d¡d¡ d S )Nz5Content-Type: foo; bar*0="baz\"foobar"; bar*1="\"baz"rì   zbaz"foobar"bazrÜ   r]   r5   r5   r6   Útest_get_param_with_quotesº  s   ÿÿz)TestMessageAPI.test_get_param_with_quotesc                 C   s>   t  d¡}|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )NzHeader: existsrˆ   r   ZHEADERZheaderx)r   rÝ   r´   ZassertNotInr]   r5   r5   r6   Útest_field_containmentÂ  s
   
z%TestMessageAPI.test_field_containmentc                 C   s¨   | j }tƒ }| dd¡ || d¡dƒ | dd¡ || d¡dƒ ||jddddƒ || ¡ g d¢ƒ ||jddg d	¢ƒ |jdd
dd ||jdddd
ƒ d S )Nr<   úiso-2022-jpÚ
importanceú
high valueFrø   ú"high value")©r:   r*   )r<   rý   )rþ   rÿ   )r  )r<   z"iso-2022-jp")rþ   r   ziso-9999-xxzX-Jimmyrê   )r.   r   Ú	set_paramrD   rð   r1   r5   r5   r6   Útest_set_paramÉ  s   zTestMessageAPI.test_set_paramc                 C   sp   | j }|  d¡}|| ¡ g d¢ƒ | d¡}| d¡ || ¡ ddgƒ | d|¡ || ¡ ddd|fgƒ d S )Nú
msg_05.txt)©úmultipart/reportr*   )úreport-typeúdelivery-status©rò   ú%D1690A7AC1.996856090/mail.example.comr  r  r	  )r.   r/   rð   rD   Ú	del_paramr  )r2   r3   r4   Zold_valr5   r5   r6   Útest_del_paramÚ  s&   
ÿ

ÿÿþÿzTestMessageAPI.test_del_paramc                 C   s6   t ƒ }|jdddd | dd¡ |  |d d¡ d S )NúContent-DispositionÚ
attachmentúbud.gif©Úfilenamer  úcontent-disposition©r   Ú
add_headerr  r.   r]   r5   r5   r6   Útest_del_param_on_other_headerë  s   z-TestMessageAPI.test_del_param_on_other_headerc                 C   s   t ƒ }| dd¡ d S )Nr  r  )r   r  r]   r5   r5   r6   Ú$test_del_param_on_nonexistent_headerñ  s   z3TestMessageAPI.test_del_param_on_nonexistent_headerc                 C   s@   t ƒ }|jdddd |d }|jddd |  |d |¡ d S )Nr?   r:   rN   ©r<   Úfoobarrê   r  )r2   r4   Zexisting_headerr5   r5   r6   Útest_del_nonexistent_paramö  s
   z)TestMessageAPI.test_del_nonexistent_paramc                 C   sj   | j }tƒ }|  t|jd¡ | d¡ ||d dƒ | dd¡ ||d dƒ | d¡ ||d dƒ d S )	Nr¬   r:   r;   r<   rH   rI   z	text/htmlztext/html; charset="us-ascii")r.   r   r†   Ú
ValueErrorÚset_typer  r1   r5   r5   r6   Útest_set_typeý  s   

zTestMessageAPI.test_set_typec                 C   s.   t ƒ }d|d< | dd¡ |  |d d¡ d S )Nr:   zX-Content-Typeúapplication/octet-streamzx-content-type)r   r  r.   r]   r5   r5   r6   Útest_set_type_on_other_header  s   z,TestMessageAPI.test_set_type_on_other_headerc                 C   ó   t ƒ }|  | ¡ d¡ d S )Nr:   )r   r.   rC   r]   r5   r5   r6   Útest_get_content_type_missing  r«   z,TestMessageAPI.test_get_content_type_missingc                 C   s$   t ƒ }| d¡ |  | ¡ d¡ d S )Númessage/rfc822)r   Úset_default_typer.   rC   r]   r5   r5   r6   Ú/test_get_content_type_missing_with_default_type  r_   z>TestMessageAPI.test_get_content_type_missing_with_default_typec                 C   ó$   |   d¡}|  | d¡ ¡ d¡ d S )Nú
msg_30.txtr   r!  ©r/   r.   rR   rC   r]   r5   r5   r6   Ú+test_get_content_type_from_message_implicit  ó   
ÿz:TestMessageAPI.test_get_content_type_from_message_implicitc                 C   r$  )Nú
msg_28.txtr   r!  r&  r]   r5   r5   r6   Ú+test_get_content_type_from_message_explicit  r(  z:TestMessageAPI.test_get_content_type_from_message_explicitc                 C   ó   |   d¡}|  | ¡ d¡ d S )Nr‚   r:   ©r/   r.   rC   r]   r5   r5   r6   Ú6test_get_content_type_from_message_text_plain_implicit!  rä   zETestMessageAPI.test_get_content_type_from_message_text_plain_implicitc                 C   r+  )Nr€   r:   r,  r]   r5   r5   r6   Ú6test_get_content_type_from_message_text_plain_explicit%  rä   zETestMessageAPI.test_get_content_type_from_message_text_plain_explicitc                 C   r  )Nr¬   ©r   r.   Úget_content_maintyper]   r5   r5   r6   Ú!test_get_content_maintype_missing)  r«   z0TestMessageAPI.test_get_content_maintype_missingc                 C   ó$   t ƒ }| d¡ |  | ¡ d¡ d S )Nr!  Úmessage)r   r"  r.   r0  r]   r5   r5   r6   Ú3test_get_content_maintype_missing_with_default_type-  r_   zBTestMessageAPI.test_get_content_maintype_missing_with_default_typec                 C   r$  )Nr%  r   r3  ©r/   r.   rR   r0  r]   r5   r5   r6   Ú/test_get_content_maintype_from_message_implicit2  ó   
z>TestMessageAPI.test_get_content_maintype_from_message_implicitc                 C   r$  )Nr)  r   r3  r5  r]   r5   r5   r6   Ú/test_get_content_maintype_from_message_explicit6  r7  z>TestMessageAPI.test_get_content_maintype_from_message_explicitc                 C   r+  )Nr‚   r¬   ©r/   r.   r0  r]   r5   r5   r6   Ú:test_get_content_maintype_from_message_text_plain_implicit:  rä   zITestMessageAPI.test_get_content_maintype_from_message_text_plain_implicitc                 C   r+  )Nr€   r¬   r9  r]   r5   r5   r6   Ú:test_get_content_maintype_from_message_text_plain_explicit>  rä   zITestMessageAPI.test_get_content_maintype_from_message_text_plain_explicitc                 C   r  )NÚplain©r   r.   Úget_content_subtyper]   r5   r5   r6   Ú test_get_content_subtype_missingB  r«   z/TestMessageAPI.test_get_content_subtype_missingc                 C   r2  )Nr!  Úrfc822)r   r"  r.   r>  r]   r5   r5   r6   Ú2test_get_content_subtype_missing_with_default_typeF  r_   zATestMessageAPI.test_get_content_subtype_missing_with_default_typec                 C   r$  )Nr%  r   r@  ©r/   r.   rR   r>  r]   r5   r5   r6   Ú.test_get_content_subtype_from_message_implicitK  r7  z=TestMessageAPI.test_get_content_subtype_from_message_implicitc                 C   r$  )Nr)  r   r@  rB  r]   r5   r5   r6   Ú.test_get_content_subtype_from_message_explicitO  r7  z=TestMessageAPI.test_get_content_subtype_from_message_explicitc                 C   r+  )Nr‚   r<  ©r/   r.   r>  r]   r5   r5   r6   Ú9test_get_content_subtype_from_message_text_plain_implicitS  rä   zHTestMessageAPI.test_get_content_subtype_from_message_text_plain_implicitc                 C   r+  )Nr€   r<  rE  r]   r5   r5   r6   Ú9test_get_content_subtype_from_message_text_plain_explicitW  rä   zHTestMessageAPI.test_get_content_subtype_from_message_text_plain_explicitc                 C   ó"   t ƒ }d|d< |  | ¡ d¡ d S )Núno-slash-in-this-stringr?   r¬   r/  r]   r5   r5   r6   Útest_get_content_maintype_error[  ó   z.TestMessageAPI.test_get_content_maintype_errorc                 C   rH  )NrI  r?   r<  r=  r]   r5   r5   r6   Útest_get_content_subtype_error`  rK  z-TestMessageAPI.test_get_content_subtype_errorc                 C   sÖ   | j }tƒ }| dd¡ | dd¡ | dd¡ || ¡ g d¢ƒ || ¡ g d¢ƒ | dd	¡ || ¡ g d¢ƒ || ¡ g d
¢ƒ | dd¡ | dd¡ || ¡ g d¢ƒ || ¡ g d¢ƒ |  t|jdd¡ d S )NÚFirstÚOneÚSecondÚTwoÚThirdÚThree)rM  rO  rQ  )rN  rP  rR  ÚTwenty)rN  rS  rR  ÚElevenúOne Hundred)rM  rO  rQ  rM  )rU  rS  rR  rT  ZFourthZMissing)r.   r   r  ÚkeysÚvaluesÚreplace_headerr†   ÚKeyErrorr1   r5   r5   r6   Útest_replace_headere  s   z"TestMessageAPI.test_replace_headerc                 C   sp   t ƒ }|  | ¡ ¡ |jdddd |  | ¡ d¡ | dd¡ |  | ¡ d¡ | dd¡ |  | ¡ d¡ d S )Nr  r  z
random.avir  ÚinlineZInlinE)r   ÚassertIsNoneZget_content_dispositionr  r.   rX  r]   r5   r5   r6   Útest_get_content_dispositionv  s   ÿz+TestMessageAPI.test_get_content_dispositionc                 C   sP   d}t ƒ }d|d< d|d< | |¡ |  |jddd¡ |  |jd	 tj¡ d S )
NzAwDp0P7//y6LwKEAcPa/6Q=9zaudio/x-midir;   rO   r=   TrP   s    éÐþÿÿ.‹À¡ pö¿ér   )r   rK   r.   rR   ÚassertIsInstanceÚdefectsr   ÚInvalidBase64CharactersDefect©r2   Úxr4   r5   r5   r6   Útest_broken_base64_payload‚  s   
ÿÿz)TestMessageAPI.test_broken_base64_payloadc                 C   sB   d}t ƒ }d|d< d|d< | |¡ |  |jddt|dƒ¡ d S )	Nu   this is a brÃ¶ken thing to dor:   r;   rW   r=   TrP   zraw-unicode-escape)r   rK   r.   rR   r×   ra  r5   r5   r6   Útest_broken_unicode_payloadŽ  s   
ÿz*TestMessageAPI.test_broken_unicode_payloadc                 C   s>   d  d¡}tƒ }d|d< d|d< ||_|  |jdd|¡ d S )	Nu#   this is a quÃ©stionable thing to dorN   útext/plain; charset="utf-8"r;   rW   r=   TrP   )rœ   r   Z_payloadr.   rR   ra  r5   r5   r6   Útest_questionable_bytes_payload™  s   
z.TestMessageAPI.test_questionable_bytes_payloadc                 C   ó*   t ƒ }|jdddd |  d|d ¡ d S )Nr  r  r  r  zattachment; filename="bud.gif"©r   r  r.   r]   r5   r5   r6   Útest_ascii_add_header¤  s   ÿÿz$TestMessageAPI.test_ascii_add_headerc                 C   rg  )Nr  r  õ   FuÃŸballer.pptr  z/attachment; filename*=utf-8''Fu%C3%9Fballer.pptrh  r]   r5   r5   r6   Útest_noascii_add_header«  ó   ÿþz&TestMessageAPI.test_noascii_add_headerc                 C   rg  )Nr  r  )r8   r*   rj  r  z1attachment; filename*=iso-8859-1''Fu%DFballer.pptrh  r]   r5   r5   r6   Ú#test_nonascii_add_header_via_triple³  rl  z2TestMessageAPI.test_nonascii_add_header_via_triplec                 C   rg  )Nr  r  zwindows [filename].pptr  z-attachment; filename="windows [filename].ppt"rh  r]   r5   r5   r6   Ú#test_ascii_add_header_with_tspecial»  rl  z2TestMessageAPI.test_ascii_add_header_with_tspecialc                 C   rg  )Nr  r  u   FuÃŸballer [filename].pptr  z@attachment; filename*=utf-8''Fu%C3%9Fballer%20%5Bfilename%5D.pptrh  r]   r5   r5   r6   Ú&test_nonascii_add_header_with_tspecialÃ  rl  z5TestMessageAPI.test_nonascii_add_header_with_tspecialc                 C   óL   dD ]!}t ƒ }d| |d< d|d< | d¡ |  |jddd	d
| ¡ qd S )N©úlatin-1r›   útext/plain; charset=%sr;   r>   r=   s   foo=e6=96=87barTrP   ó	   fooæ–‡barú1get_payload returns wrong result with charset %s.r\   ©r2   r<   r4   r5   r5   r6   Útest_binary_quopri_payloadË  ó   

ýûz)TestMessageAPI.test_binary_quopri_payloadc                 C   rp  )Nrq  rs  r;   rO   r=   s   Zm9v5paHYmFyTrP   rt  ru  r\   rv  r5   r5   r6   Útest_binary_base64_payloadÖ  rx  z)TestMessageAPI.test_binary_base64_payloadc              
   C   s^   dD ]*}dD ]%}t ƒ }d| |d< ||d< | d¡ |  |jddd	td
ƒ ||¡¡ qqd S )Nrq  r¤   rs  r;   r=   s    begin 666 -
)9F]OYI:'8F%R
 
end
TrP   rt  )z!get_payload returns wrong result z"with charset {0} and encoding {1}.)r   rK   r.   rR   r¸   Úformat)r2   r<   r   r4   r5   r5   r6   Útest_binary_uuencode_payloadá  s   

ûûÿz+TestMessageAPI.test_binary_uuencode_payloadc                 C   s*   t ƒ }|jddd d |  d|d ¡ d S )Nr  r[  )Zfoo_barzinline; foo-barrh  r]   r5   r5   r6   Ú$test_add_header_with_name_only_paramï  ó   z3TestMessageAPI.test_add_header_with_name_only_paramc                 C   s&   t ƒ }| dd ¡ |  d|d ¡ d S )NzX-Statusr*   rh  r]   r5   r5   r6   Útest_add_header_with_no_valueô  ó   z,TestMessageAPI.test_add_header_with_no_valuec                 C   s&   t ƒ }tdƒ|d< |  tj|j¡ d S ©Nzdummy
X-Injected-Header: testZDummy)r   r   r†   r   r‡   rŒ   r]   r5   r5   r6   Ú(test_embedded_header_via_Header_rejectedû  r  z7TestMessageAPI.test_embedded_header_via_Header_rejectedc                 C   s"   t ƒ }d|d< |  tj|j¡ d S r€  )r   r†   r   r‡   rŒ   r]   r5   r5   r6   Ú(test_embedded_header_via_string_rejected   rK  z7TestMessageAPI.test_embedded_header_via_string_rejectedc                 C   s*   t dƒ}d|d< |  t|ƒt d¡¡ d S )Nzabc
u   Ã‰ testÚSubjectzÍ            Content-Type: text/plain; charset="us-ascii"
            MIME-Version: 1.0
            Content-Transfer-Encoding: 7bit
            Subject: =?utf-8?q?=C3=89_test?=

            abc
            ©r   r.   r¸   rÌ   rÍ   ©r2   rÐ   r5   r5   r6   Ú-test_unicode_header_defaults_to_utf8_encoding  s   z<TestMessageAPI.test_unicode_header_defaults_to_utf8_encodingc                 C   s"   t dƒ}|  t|ƒt d¡¡ d S )Nu   Ã‰ testabc
z¬            Content-Type: text/plain; charset="utf-8"
            MIME-Version: 1.0
            Content-Transfer-Encoding: base64

            w4kgdGVzdGFiYwo=
            r„  r…  r5   r5   r6   Ú+test_unicode_body_defaults_to_utf8_encoding  s   z:TestMessageAPI.test_unicode_body_defaults_to_utf8_encodingN)XÚ__name__Ú
__module__Ú__qualname__r7   rG   rJ   rL   rU   rY   rZ   r^   rc   ri   ry   r{   r   rŠ   r   rš   r    r£   r©   rª   r¯   rµ   rÀ   rÊ   rÓ   rÕ   rÙ   rÚ   rÞ   rã   rå   rç   rñ   ró   rõ   r÷   rú   rû   rü   r  r  r  r  r  r  r  r   r#  r'  r*  r-  r.  r1  r4  r6  r8  r:  r;  r?  rA  rC  rD  rF  rG  rJ  rL  rZ  r]  rc  rd  rf  ri  rk  rm  rn  ro  rw  ry  r{  r|  r~  r  r‚  r†  r‡  r5   r5   r5   r6   r,   8   s¬    			

	

r,   c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestEncodersc                 C   sp   t ddƒ}| ¡ }W d   ƒ n1 sw   Y  tjj |¡}| ¡ }| d¡}|  t	dd„ |D ƒƒd¡ d S )NúPyBanner048.gifÚrbr)   c                 S   ó   g | ]}t |ƒ‘qS r5   )Úlen©ro   rb  r5   r5   r6   rq   (  rr   z;TestEncoders.test_EncodersEncode_base64.<locals>.<listcomp>éL   )
r%   r‘   r   ÚmimeÚimager   rR   r¹   ÚassertLessEqualÚmax)r2   r–   ÚbindataZmimedZbase64edr¿   r5   r5   r6   Útest_EncodersEncode_base64!  s   
ÿ
z'TestEncoders.test_EncodersEncode_base64c                 C   s(   | j }tƒ }| d¡ ||d dƒ d S )NrH   r=   Ú7bit)r.   r   rB   r1   r5   r5   r6   Útest_encode_empty_payload*  s   
z&TestEncoders.test_encode_empty_payloadc                 C   sP   | j }tdƒ}||d dƒ tdƒ}||d dƒ tddd}||d dƒ d S )	Núhello worldr=   r™  u   hello Ã¸ worldrO   r8   ©Ú_charsetr>   )r.   r   r1   r5   r5   r6   Útest_default_cte0  s   zTestEncoders.test_default_ctec                 C   s8   | j }tddd}||d dƒ || ¡ t d¡ƒ d S )Nu   æ–‡
úeuc-jprœ  r=   r™  z¨            MIME-Version: 1.0
            Content-Type: text/plain; charset="iso-2022-jp"
            Content-Transfer-Encoding: 7bit

            $BJ8(B
            )r.   r   rŒ   rÌ   rÍ   r1   r5   r5   r6   Útest_encode7or8bit<  s   zTestEncoders.test_encode7or8bitc                 C   ó&   t dddƒ}|  t|ƒt d¡¡ d S )Nu   Ã¡Ã¶
r¬   z
ISO-8859-1z°            MIME-Version: 1.0
            Content-Type: text/text; charset="iso-8859-1"
            Content-Transfer-Encoding: quoted-printable

            =E1=F6
            r„  r]   r5   r5   r6   Útest_qp_encode_latin1K  s   z"TestEncoders.test_qp_encode_latin1c                 C   r¡  )Nu   Å¼
r¬   z
ISO-8859-2z­            MIME-Version: 1.0
            Content-Type: text/text; charset="iso-8859-2"
            Content-Transfer-Encoding: quoted-printable

            =BF
            r„  r]   r5   r5   r6   Útest_qp_encode_non_latin1U  s   z&TestEncoders.test_qp_encode_non_latin1N)	rˆ  r‰  rŠ  r˜  rš  rž  r   r¢  r£  r5   r5   r5   r6   rŒ    s    	
rŒ  c                   @   sH  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dS )PÚTestLongHeadersNc                 C   s:   | j }t d¡}tƒ }t|ƒ}| |¡ || ¡ dƒ d S )NzºSubject: bug demonstration
	12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789
	more text

test
)ÚndiffAssertEqualr   rÝ   r   r
   r“   r”   ©r2   r3   r4   Úsfpr®   r5   r5   r6   Útest_split_long_continuationf  s   

z,TestLongHeaders.test_split_long_continuationc                 C   sF   | j }d}t|dd}|| ¡ dƒ t| dd¡ƒ}|| ¡ dƒ d S )Nzªbug demonstration
	12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789
	more textú	©Úcontinuation_wsr+   zªbug demonstration
 12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789
 more text)r¥  r   rœ   rÔ   ©r2   r3   ZhstrÚhr5   r5   r6   Ú,test_another_long_almost_unsplittable_headerz  s   z<TestLongHeaders.test_another_long_almost_unsplittable_headerc                 C   sš   | j }tdƒ}tdƒ}tdƒ}d}d}d}t||dd}| ||¡ | ||¡ tƒ }	||	d< tƒ }
t|
ƒ}| |	¡ ||
 ¡ d	ƒ ||j	d
ddƒ d S )Nr8   rd   rN   ó©   Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an südlündischen Wandgemälden vorbei, gegen die rotierenden Klingen befördert. ó;   Finanèni metropole se hroutily pod tlakem jejich dùvtipu.. õø   æ­£ç¢ºã«è¨€ã†ã¨ç¿»è¨³ã¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ã€‚ä¸€éƒ¨ã¯ãƒ‰ã‚¤ãƒ„èªžã§ã™ãŒã€ã‚ã¨ã¯ã§ãŸã‚‰ã‚ã§ã™ã€‚å®Ÿéš›ã«ã¯ã€ŒWenn ist das Nunstuck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput.ã€ã¨è¨€ã£ã¦ã„ã¾ã™ã€‚rƒ  ©Úheader_namea!  Subject: =?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerderb?=
 =?iso-8859-1?q?and_komfortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndischen?=
 =?iso-8859-1?q?_Wandgem=E4lden_vorbei=2C_gegen_die_rotierenden_Klingen_bef?=
 =?iso-8859-1?q?=F6rdert=2E_?= =?iso-8859-2?q?Finan=E8ni_metropole_se_hrouti?=
 =?iso-8859-2?q?ly_pod_tlakem_jejich_d=F9vtipu=2E=2E_?= =?utf-8?b?5q2j56K6?=
 =?utf-8?b?44Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE44G+44Gb44KT44CC5LiA?=
 =?utf-8?b?6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB44GC44Go44Gv44Gn44Gf44KJ?=
 =?utf-8?b?44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CMV2VubiBpc3QgZGFzIE51bnN0dWNr?=
 =?utf-8?b?IGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRp?=
 =?utf-8?b?ZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC7jgI3jgajoqIDjgaPjgabjgYTjgb7jgZk=?=
 =?utf-8?b?44CC?=

r’  ©Ú
maxlinelena	  =?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerde?=
 =?iso-8859-1?q?rband_komfortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndis?=
 =?iso-8859-1?q?chen_Wandgem=E4lden_vorbei=2C_gegen_die_rotierenden_Klinge?=
 =?iso-8859-1?q?n_bef=F6rdert=2E_?= =?iso-8859-2?q?Finan=E8ni_metropole_se?=
 =?iso-8859-2?q?_hroutily_pod_tlakem_jejich_d=F9vtipu=2E=2E_?=
 =?utf-8?b?5q2j56K644Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE44G+44Gb?=
 =?utf-8?b?44KT44CC5LiA6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB44GC44Go?=
 =?utf-8?b?44Gv44Gn44Gf44KJ44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CMV2VubiBp?=
 =?utf-8?b?c3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWlo?=
 =?utf-8?b?ZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC7jgI0=?=
 =?utf-8?b?44Go6KiA44Gj44Gm44GE44G+44GZ44CC?=)
r¥  r	   r   Úappendr   r   r
   r“   r”   rœ   )r2   r3   r®   ÚczÚutf8Úg_headÚcz_headÚ	utf8_headr­  r4   r§  r5   r5   r6   Útest_long_nonstring‹  s"   
z#TestLongHeaders.test_long_nonstringc                 C   s$   | j }tddd}|| ¡ dƒ d S )Núiwasnipoop; giraffes="very-long-necked-animals"; spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"úX-Foobar-Spoink-Defrobnitr²  újwasnipoop; giraffes="very-long-necked-animals";
 spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"©r¥  r   rœ   ©r2   r3   r­  r5   r5   r6   Útest_long_header_encodeÁ  s
   þz'TestLongHeaders.test_long_header_encodec                 C   ó&   | j }tdddd}|| ¡ dƒ d S )Nr½  r¾  r©  ©r³  r«  r¿  rÀ  rÁ  r5   r5   r6   Ú<test_long_header_encode_with_tab_continuation_is_just_a_hintÊ  ó   ýzLTestLongHeaders.test_long_header_encode_with_tab_continuation_is_just_a_hintc                 C   rÃ  )Nziwasnipoop; giraffes="very-long-necked-animals";	spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"r¾  r©  rÄ  zjwasnipoop; giraffes="very-long-necked-animals";
	spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"rÀ  rÁ  r5   r5   r6   Ú-test_long_header_encode_with_tab_continuationÔ  rÆ  z=TestLongHeaders.test_long_header_encode_with_tab_continuationc                 C   s   t ddƒ}|  | ¡ d¡ d S )Nõ   æ–‡rŸ  ú=?iso-2022-jp?b?GyRCSjgbKEI=?=©r   r.   rœ   ©r2   r­  r5   r5   r6   Ú0test_header_encode_with_different_output_charsetÞ  rä   z@TestLongHeaders.test_header_encode_with_different_output_charsetc                 C   s(   t d d¡dƒ}d}|  | ¡ |¡ d S )Ns6   test-ja ¤ØÅê¹Æ¤µ¤ì¤¿¥á¡¼¥ë¤Ï»Ê²ñ¼Ô¤Î¾µÇ§¤òÂÔ¤Ã¤Æ¤¤¤Þ¤¹rŸ  z‚=?iso-2022-jp?b?dGVzdC1qYSAbJEIkWEVqOUYkNSRsJD8lYSE8JWskTztKMnE8VCROPjUbKEI=?=
 =?iso-2022-jp?b?GyRCRyckckJUJEMkRiQkJF4kORsoQg==?=)r   rQ   r.   rœ   )r2   r­  Úresr5   r5   r6   Ú5test_long_header_encode_with_different_output_charsetâ  s
   ýzETestLongHeaders.test_long_header_encode_with_different_output_charsetc                 C   s@   | j }tdƒ}d|d< tƒ }t|ƒ}| |¡ || ¡ dƒ d S )Nr*   r½  r¾  zæContent-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Foobar-Spoink-Defrobnit: wasnipoop; giraffes="very-long-necked-animals";
 spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"

)r¥  r   r   r
   r“   r”   r¦  r5   r5   r6   Útest_header_splitterì  s   ÿ
z$TestLongHeaders.test_header_splitterc                 C   sd   | j }tƒ }d|d< t dd„ tdƒD ƒ¡|d< | d¡ tƒ }t|ƒ}| |¡ || 	¡ dƒ d S )	Nútest@dom.ainr°   c                 s   s    | ]}d | V  qdS )z<%d@dom.ain>Nr5   ©ro   Úir5   r5   r6   Ú	<genexpr>  ó   € z@TestLongHeaders.test_no_semis_header_splitter.<locals>.<genexpr>é
   Ú
ReferencesÚTestzFrom: test@dom.ain
References: <0@dom.ain> <1@dom.ain> <2@dom.ain> <3@dom.ain> <4@dom.ain>
 <5@dom.ain> <6@dom.ain> <7@dom.ain> <8@dom.ain> <9@dom.ain>

Test)
r¥  r   ÚSPACEr½   ÚrangerK   r   r
   r“   r”   r¦  r5   r5   r6   Útest_no_semis_header_splitter   s   

z-TestLongHeaders.test_no_semis_header_splitterc                 C   ó    | j }tdƒ}|| ¡ dƒ d S )Nz‡Subject: the first part of this is short, but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfzˆSubject: the first part of this is short,
 but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfrÀ  rÁ  r5   r5   r6   Ú"test_last_split_chunk_does_not_fit  ó   z2TestLongHeaders.test_last_split_chunk_does_not_fitc                 C   rÛ  )Nz_, but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfz`,
 but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfrÀ  rÁ  r5   r5   r6   Ú>test_splittable_leading_char_followed_by_overlong_unsplittable  rÝ  zNTestLongHeaders.test_splittable_leading_char_followed_by_overlong_unsplittablec                 C   rÛ  )Nza, , but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfzb, ,
 but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itselfrÀ  rÁ  r5   r5   r6   ÚGtest_multiple_splittable_leading_char_followed_by_overlong_unsplittable"  rÝ  zWTestLongHeaders.test_multiple_splittable_leading_char_followed_by_overlong_unsplittablec                 C   ó    | j }tdƒ}|| ¡ dƒ d S )NzTthis_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself;rÀ  rÁ  r5   r5   r6   Ú1test_trailing_splittable_on_overlong_unsplittable+  ó   zATestLongHeaders.test_trailing_splittable_on_overlong_unsplittablec                 C   rÛ  )NzW; this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; zX;
 this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; rÀ  rÁ  r5   r5   r6   ÚItest_trailing_splittable_on_overlong_unsplittable_with_leading_splittable2  rÝ  zYTestLongHeaders.test_trailing_splittable_on_overlong_unsplittable_with_leading_splittablec                 C   rÛ  )NzpThis is a long line that has two whitespaces  in a row.  This used to cause truncation of the header when foldedzqThis is a long line that has two whitespaces  in a row.  This used to cause
 truncation of the header when foldedrÀ  rÁ  r5   r5   r6   Ú5test_long_header_with_multiple_sequential_split_chars;  râ  zETestLongHeaders.test_long_header_with_multiple_sequential_split_charsc                 C   rà  )NúKthisverylongheaderhas;semicolons;and,commas,butthey;arenotlegal;fold,pointsrÀ  rÁ  r5   r5   r6   Ú:test_splitter_split_on_punctuation_only_if_fws_with_headerC  râ  zJTestLongHeaders.test_splitter_split_on_punctuation_only_if_fws_with_headerc                 C   rÛ  )NzÂthis is a  test where we need to have more than one line before; our final line that is just too big to fit;; this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself;zÄthis is a  test where we need to have more than one line before;
 our final line that is just too big to fit;;
 this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself;rÀ  rÁ  r5   r5   r6   ÚDtest_leading_splittable_in_the_middle_just_before_overlong_last_partJ  ó   zTTestLongHeaders.test_leading_splittable_in_the_middle_just_before_overlong_last_partc                 C   rà  )NzTthis_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself rÀ  rÁ  r5   r5   r6   Ú/test_overlong_last_part_followed_by_split_pointU  râ  z?TestLongHeaders.test_overlong_last_part_followed_by_split_pointc                 C   rÛ  )Nz¨this_is_a__test_where_we_need_to_have_more_than_one_line_before_our_final_line_; ; this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; zªthis_is_a__test_where_we_need_to_have_more_than_one_line_before_our_final_line_;
 ;
 this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; rÀ  rÁ  r5   r5   r6   Ú@test_multiline_with_overlong_parts_separated_by_two_split_points\  rè  zPTestLongHeaders.test_multiline_with_overlong_parts_separated_by_two_split_pointsc                 C   rÛ  )Nz¦this is a test where we need to have more than one line before our final line; ; this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; z¨this is a test where we need to have more than one line before our final line;
 ;
 this_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself; rÀ  rÁ  r5   r5   r6   Ú>test_multiline_with_overlong_last_part_followed_by_split_pointg  rè  zNTestLongHeaders.test_multiline_with_overlong_last_part_followed_by_split_pointc                 C   s\   | j }tƒ }d|d< t dgd ¡|d< | d¡ tƒ }t|ƒ}| |¡ || ¡ dƒ d S )NrÐ  r°   z<foo@dom.ain>  rÕ  rÖ  r×  zÆFrom: test@dom.ain
References: <foo@dom.ain>   <foo@dom.ain>   <foo@dom.ain>   <foo@dom.ain>
   <foo@dom.ain>   <foo@dom.ain>   <foo@dom.ain>   <foo@dom.ain>
   <foo@dom.ain>   <foo@dom.ain>  

Test©	r¥  r   rØ  r½   rK   r   r
   r“   r”   r¦  r5   r5   r6   Ú%test_long_header_with_whitespace_runsr  s   

z5TestLongHeaders.test_long_header_with_whitespace_runsc                 C   s`   | j }tƒ }d|d< t dgd ¡d |d< | d¡ tƒ }t|ƒ}| |¡ || ¡ dƒ d S )	NrÐ  r°   z<foo@dom.ain>rÕ  z; abcrÖ  r×  z·From: test@dom.ain
References: <foo@dom.ain> <foo@dom.ain> <foo@dom.ain> <foo@dom.ain>
 <foo@dom.ain> <foo@dom.ain> <foo@dom.ain> <foo@dom.ain> <foo@dom.ain>
 <foo@dom.ain>; abc

Testrì  r¦  r5   r5   r6   Ú'test_long_run_with_semi_header_splitterƒ  s   

z7TestLongHeaders.test_long_run_with_semi_header_splitterc                 C   sP   | j }tƒ }d|d< d|d< | d¡ tƒ }t|ƒ}| |¡ || ¡ dƒ d S )NrÐ  r°   rå  rÖ  r×  zrFrom: test@dom.ain
References: 
 thisverylongheaderhas;semicolons;and,commas,butthey;arenotlegal;fold,points

Test)r¥  r   rK   r   r
   r“   r”   r¦  r5   r5   r6   Ú.test_splitter_split_on_punctuation_only_if_fws”  s   

z>TestLongHeaders.test_splitter_split_on_punctuation_only_if_fwsc                 C   s:   | j }d}t|ƒ}|| ¡ dƒ tdƒ}|| ¡ dƒ d S )Nz\References: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz]References:
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxZPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrÀ  r¬  r5   r5   r6   Útest_no_split_long_header¦  s   z)TestLongHeaders.test_no_split_long_headerc                 C   s(   | j }d}t|dd}|| ¡ dƒ d S )NaW  from babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for <mailman-admin@babylon.socal-raves.org>; Sat, 2 Feb 2002 17:00:06 -0800 (PST)
	from babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for <mailman-admin@babylon.socal-raves.org>; Sat, 2 Feb 2002 17:00:06 -0800 (PST)
	from babylon.socal-raves.org (localhost [127.0.0.1]); by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81; for <mailman-admin@babylon.socal-raves.org>; Sat, 2 Feb 2002 17:00:06 -0800 (PST)
r©  rª  a_  from babylon.socal-raves.org (localhost [127.0.0.1]);
 by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81;
 for <mailman-admin@babylon.socal-raves.org>;
 Sat, 2 Feb 2002 17:00:06 -0800 (PST)
	from babylon.socal-raves.org (localhost [127.0.0.1]);
 by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81;
 for <mailman-admin@babylon.socal-raves.org>;
 Sat, 2 Feb 2002 17:00:06 -0800 (PST)
	from babylon.socal-raves.org (localhost [127.0.0.1]);
 by babylon.socal-raves.org (Postfix) with ESMTP id B570E51B81;
 for <mailman-admin@babylon.socal-raves.org>;
 Sat, 2 Feb 2002 17:00:06 -0800 (PST)rÀ  r¬  r5   r5   r6   Ú"test_splitting_multiple_long_lines²  s   z2TestLongHeaders.test_splitting_multiple_long_linesc                 C   s,   | j }d}t|dddd}|| ¡ dƒ d S )NzÞfrom modemcable093.139-201-24.que.mc.videotron.ca ([24.201.139.93] helo=cthulhu.gerg.ca)
	by kronos.mems-exchange.org with esmtp (Exim 4.05)
	id 17k4h5-00034i-00
	for test@mems-exchange.org; Wed, 28 Aug 2002 11:25:20 -0400éN   ZReceivedr©  )rµ  r³  r«  zßfrom modemcable093.139-201-24.que.mc.videotron.ca ([24.201.139.93]
 helo=cthulhu.gerg.ca)
	by kronos.mems-exchange.org with esmtp (Exim 4.05)
	id 17k4h5-00034i-00
	for test@mems-exchange.org; Wed, 28 Aug 2002 11:25:20 -0400rÀ  r¬  r5   r5   r6   Ú&test_splitting_first_line_only_is_longÈ  s   ÿz6TestLongHeaders.test_splitting_first_line_only_is_longc                 C   sf   | j }tƒ }tdddd}| d¡ ||jdddƒ ||d< ||jdd	d
ƒ ||jdd	dƒ d S )NzBritische Regierung gibtr8   rƒ  r²  u-   grÃ¼nes Licht fÃ¼r Offshore-Windkraftprojekter’  r´  zl=?iso-8859-1?q?Britische_Regierung_gibt_gr=FCnes_Licht_f=FCr_Offs?=
 =?iso-8859-1?q?hore-Windkraftprojekte?=©ZmaxheaderlenzwSubject: =?iso-8859-1?q?Britische_Regierung_gibt_gr=FCnes_Licht_f=FCr_Offs?=
 =?iso-8859-1?q?hore-Windkraftprojekte?=

r   zdSubject: =?iso-8859-1?q?Britische_Regierung_gibt_gr=FCnes_Licht_f=FCr_Offshore-Windkraftprojekte?=

)r¥  r   r   r¶  rœ   rŒ   )r2   r3   r4   r­  r5   r5   r6   Útest_long_8bit_headerØ  s   ÿ
z%TestLongHeaders.test_long_8bit_headerc                 C   sV   | j }tƒ }d}||d< ||jdddƒ tƒ }t|dd|d< ||jdddƒ d S )Nuh   Britische Regierung gibt grÃ¼nes Licht fÃ¼r Offshore-Windkraftprojekte <a-very-long-address@example.com>zReply-Torò  rô  zžReply-To: =?utf-8?q?Britische_Regierung_gibt_gr=C3=BCnes_Licht_f=C3=BCr_Offs?=
 =?utf-8?q?hore-Windkraftprojekte_=3Ca-very-long-address=40example=2Ecom=3E?=

r²  )r¥  r   rŒ   r   )r2   r3   r4   Zheader_stringr5   r5   r6   Ú test_long_8bit_header_no_charsetì  s   
ÿz0TestLongHeaders.test_long_8bit_header_no_charsetc                 C   s.   | j }d}tƒ }||d< ||jdddƒ d S )NzÂ"Someone Test #A" <someone@eecs.umich.edu>,<someone@eecs.umich.edu>, "Someone Test #B" <someone@umich.edu>, "Someone Test #C" <someone@eecs.umich.edu>, "Someone Test #D" <someone@eecs.umich.edu>r³   rò  rô  zËTo: "Someone Test #A" <someone@eecs.umich.edu>,<someone@eecs.umich.edu>,
 "Someone Test #B" <someone@umich.edu>,
 "Someone Test #C" <someone@eecs.umich.edu>,
 "Someone Test #D" <someone@eecs.umich.edu>

)r¥  r   rŒ   )r2   r3   r±   r4   r5   r5   r6   Útest_long_to_header  s
   z#TestLongHeaders.test_long_to_headerc                 C   s2   | j }d}t|ƒ}| d¡ ||jdddƒ d S )NzIThis is an example of string which has almost the limit of header length.zAdd another line.r’  r´  z\This is an example of string which has almost the limit of header length.
 Add another line.©r¥  r   r¶  rœ   ©r2   r3   r­   r­  r5   r5   r6   Útest_long_line_after_append  s
   
z+TestLongHeaders.test_long_line_after_appendc                 C   s.   | j }d}t|ƒ}| d¡ || ¡ dƒ d S )NzThis is a shorter line.z!Add another sentence. (Surprise?)z9This is a shorter line. Add another sentence. (Surprise?)rø  rù  r5   r5   r6   Útest_shorter_line_with_append  s   
ÿz-TestLongHeaders.test_shorter_line_with_appendc                 C   s2   | j }d}d}t|d|d}||jdddƒ d S )Nz!X-Very-Very-Very-Long-Header-Nameu­   Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an sÃ¼dlÃ¼ndischen WandgemÃ¤lden vorbei, gegen die rotierenden Klingen befÃ¶rdert. r8   r²  r’  r´  a  =?iso-8859-1?q?Die_Mieter_treten_hier_e?=
 =?iso-8859-1?q?in_werden_mit_einem_Foerderband_komfortabel_den_Korridor_e?=
 =?iso-8859-1?q?ntlang=2C_an_s=FCdl=FCndischen_Wandgem=E4lden_vorbei=2C_ge?=
 =?iso-8859-1?q?gen_die_rotierenden_Klingen_bef=F6rdert=2E_?=rÀ  )r2   r3   ÚfnZgsr­  r5   r5   r6   Útest_long_field_name#  s
   z$TestLongHeaders.test_long_field_namec                 C   s:   d}t ƒ }t|dd|d< ||d< |  |jddd¡ d S )	Nz‰from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by hrothgar.la.mastaler.com (tmda-ofmipd) with ESMTP; Wed, 05 Mar 2003 18:10:18 -0700r©  rª  ú
Received-1ú
Received-2rò  rô  a1  Received-1: from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by
 hrothgar.la.mastaler.com (tmda-ofmipd) with ESMTP;
 Wed, 05 Mar 2003 18:10:18 -0700
Received-2: from FOO.TLD (vizworld.acl.foo.tld [123.452.678.9]) by
 hrothgar.la.mastaler.com (tmda-ofmipd) with ESMTP;
 Wed, 05 Mar 2003 18:10:18 -0700

©r   r   r¥  rŒ   ©r2   r­  r4   r5   r5   r6   Útest_long_received_header2  s
   z)TestLongHeaders.test_long_received_headerc                 C   s<   d}t ƒ }t|ddd|d< ||d< |  |jddd¡ d S )	Nz<15975.17901.207240.414604@sgigritzmann1.mathematik.tu-muenchen.de> (David Bremner's message of "Thu, 6 Mar 2003 13:58:21 +0100")rþ  r©  rÄ  rÿ  rò  rô  a#  Received-1: 
 <15975.17901.207240.414604@sgigritzmann1.mathematik.tu-muenchen.de> (David
 Bremner's message of "Thu, 6 Mar 2003 13:58:21 +0100")
Received-2: 
 <15975.17901.207240.414604@sgigritzmann1.mathematik.tu-muenchen.de> (David
 Bremner's message of "Thu, 6 Mar 2003 13:58:21 +0100")

r   r  r5   r5   r6   Útest_string_headerinst_eqD  s   
ÿz)TestLongHeaders.test_string_headerinst_eqc                 C   sJ   | j }tƒ }d}||d< t|dd|d< d| |d< ||jddd	ƒ d S )
Nz’iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9
 locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzpzFace-1zFace-2r²  r+   zFace-3rò  rô  aØ  Face-1: 
 iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9
 locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp
Face-2: 
 iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9
 locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp
Face-3: 
 iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEUAAAAkHiJeRUIcGBi9
 locQDQ4zJykFBAXJfWDjAAACYUlEQVR4nF2TQY/jIAyFc6lydlG5x8Nyp1Y69wj1PN2I5gzp

©r¥  r   r   rŒ   )r2   r3   r4   Útr5   r5   r6   Ú-test_long_unbreakable_lines_with_continuationW  s   z=TestLongHeaders.test_long_unbreakable_lines_with_continuationc                 C   s*   | j }d}t |¡}||jdddƒ d S )Nz‰Received: from siimage.com ([172.25.1.3]) by zima.siliconimage.com with Microsoft SMTPSVC(5.0.2195.4905); Wed, 16 Oct 2002 07:41:11 -0700rò  rô  zŒReceived: from siimage.com ([172.25.1.3]) by zima.siliconimage.com with
 Microsoft SMTPSVC(5.0.2195.4905); Wed, 16 Oct 2002 07:41:11 -0700

)r¥  r   rÝ   rŒ   ©r2   r3   rÐ   r4   r5   r5   r6   Ú"test_another_long_multiline_headero  s   
z2TestLongHeaders.test_another_long_multiline_headerc                 C   s>   | j }d}tƒ }||d< t|dd|d< ||jdddƒ d S )Nz¦List-Unsubscribe: <http://lists.sourceforge.net/lists/listinfo/spamassassin-talk>,        <mailto:spamassassin-talk-request@lists.sourceforge.net?subject=unsubscribe>ZListr²  rò  rô  a_  List: List-Unsubscribe:
 <http://lists.sourceforge.net/lists/listinfo/spamassassin-talk>,
        <mailto:spamassassin-talk-request@lists.sourceforge.net?subject=unsubscribe>
List: List-Unsubscribe:
 <http://lists.sourceforge.net/lists/listinfo/spamassassin-talk>,
        <mailto:spamassassin-talk-request@lists.sourceforge.net?subject=unsubscribe>

r  )r2   r3   r­  r4   r5   r5   r6   Ú%test_long_lines_with_different_header|  s   z5TestLongHeaders.test_long_lines_with_different_headerc                 C   s6   t t d¡ddd}|  | ¡ d t d¡d ¡ d S )Nz¼            We're going to pretend this header is in a non-ascii character set
            	to see if line wrapping with encoded words and embedded
               folding white space worksrN   r×  )r<   r³  r)   zü            =?utf-8?q?We=27re_going_to_pretend_this_header_is_in_a_non-ascii_chara?=
             =?utf-8?q?cter_set?=
             =?utf-8?q?_to_see_if_line_wrapping_with_encoded_words_and_embedded?=
             =?utf-8?q?_folding_white_space_works?=)r   rÌ   rÍ   r.   rœ   rË  r5   r5   r6   Ú*test_long_rfc2047_header_with_embedded_fws  s   
û
üz:TestLongHeaders.test_long_rfc2047_header_with_embedded_fws)+rˆ  r‰  rŠ  ÚmaxDiffr¨  r®  r¼  rÂ  rÅ  rÇ  rÌ  rÎ  rÏ  rÚ  rÜ  rÞ  rß  rá  rã  rä  ræ  rç  ré  rê  rë  rí  rî  rï  rð  rñ  ró  rõ  rö  r÷  rú  rû  rý  r  r  r  r  r	  r
  r5   r5   r5   r6   r¤  b  sR    6	


					r¤  c                   @   r‹  )ÚTestFromManglingc                 C   s"   t ƒ | _d| jd< | j d¡ d S )Nzaaa@bbb.orgr°   z(From the desk of A.A.A.:
Blah blah blah
)r   r4   rK   ©r2   r5   r5   r6   ÚsetUp   s   
zTestFromMangling.setUpc                 C   ó2   t ƒ }t|dd}| | j¡ |  | ¡ d¡ d S )NT©Zmangle_from_z<From: aaa@bbb.org

>From the desk of A.A.A.:
Blah blah blah
©r   r
   r“   r4   r.   r”   ©r2   r­   r®   r5   r5   r6   Útest_mangled_from¨  ó   z"TestFromMangling.test_mangled_fromc                 C   r  )NFr  z;From: aaa@bbb.org

From the desk of A.A.A.:
Blah blah blah
r  r  r5   r5   r6   Útest_dont_mangle_from³  r  z&TestFromMangling.test_dont_mangle_fromc                 C   sT   t ƒ }t|dd}t t d¡¡}| |¡ |  tdd„ | 	¡  
d¡D ƒƒd¡ d S )NTr  a)              From: foo@bar.com
            Mime-Version: 1.0
            Content-Type: multipart/mixed; boundary=XXX

            From somewhere unknown

            --XXX
            Content-Type: text/plain

            foo

            --XXX--

            From somewhere unknowable
            c                 S   s   g | ]	}|  d ¡rd‘qS )z>From ru   )r»   r‘  r5   r5   r6   rq   Ò  s    
ÿzLTestFromMangling.test_mangle_from_in_preamble_and_epilog.<locals>.<listcomp>r)   r¡   )r   r
   r   rÝ   rÌ   rÍ   r“   r.   r  r”   r¹   )r2   r­   r®   r4   r5   r5   r6   Ú'test_mangle_from_in_preamble_and_epilog¾  s   
ÿz8TestFromMangling.test_mangle_from_in_preamble_and_epilogc                 C   sR   t  d¡ d¡}t |d ¡}tƒ }t|dd}| |¡ |  | 	¡ |d ¡ d S )Nz§            Content-Type: text/plain; charset="utf-8"
            MIME-Version: 1.0
            Content-Transfer-Encoding: 8bit
            From: aaa@bbb.org

        rN   s   From RÃ¶lli
Tr  s   >From RÃ¶lli
)
rÌ   rÍ   rœ   r   rÎ   r   r   r“   r.   r”   )r2   rÑ   r4   Úbr®   r5   r5   r6   Ú test_mangled_from_with_bad_bytesÕ  s   ú
z1TestFromMangling.test_mangled_from_with_bad_bytesc                 C   s   t  d¡ d¡}t |¡}d S )Nu               From: aperson@example.com
            Content-Type: multipart/mixed; boundary="1"
            Content-Transfer-Encoding: Ãˆ
        rN   )rÌ   rÍ   rœ   r   rÎ   )r2   rÑ   r4   r5   r5   r6   Ú$test_multipart_with_bad_bytes_in_cteã  s   üz5TestFromMangling.test_multipart_with_bad_bytes_in_cteN)	rˆ  r‰  rŠ  r  r  r  r  r  r  r5   r5   r5   r6   r  Ÿ  s    r  c                   @   ó4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestMIMEAudioc                 C   óD   t ddƒ}| ¡ | _W d   ƒ n1 sw   Y  t| jƒ| _d S )Núaudiotest.aurŽ  )r%   r‘   Ú
_audiodatar   Ú_au©r2   r–   r5   r5   r6   r  ï  ó   ÿzTestMIMEAudio.setUpc                 C   ó   |   | j ¡ d¡ d S )Nzaudio/basic)r.   r  rC   r  r5   r5   r6   Útest_guess_minor_typeô  ó   z#TestMIMEAudio.test_guess_minor_typec                 C   ó(   | j  ¡ }|  t t|dƒ¡| j¡ d S ©Nr›   )r  rR   r.   rO   Údecodebytesr×   r  ©r2   Úpayloadr5   r5   r6   Útest_encoding÷  ó   
ÿzTestMIMEAudio.test_encodingc                 C   ó    t | jdƒ}|  | ¡ d¡ d S )NÚfishz
audio/fish)r   r  r.   rC   )r2   Zaur5   r5   r6   Útest_checkSetMinorü  ó   z TestMIMEAudio.test_checkSetMinorc                 C   ó¾   | j }| jjdddd || jd dƒ || jjdddd	gƒ || jjd
dddƒ g }|| jjddddƒ |  | jjd|dd|¡ |  | j d|¡|¡ |  | jjd|dd|¡ d S )Nr  r  r  r  r  z#attachment; filename="audiotest.au"rê   ©r  r*   )r  r  r  r*   r§   ©Zfailobjrˆ   r  )r.   r  r  rð   rD   ÚassertIs©r2   r3   Úmissingr5   r5   r6   Útest_add_header   ó4   
ÿ
ÿÿÿÿÿÿÿzTestMIMEAudio.test_add_headerN©rˆ  r‰  rŠ  r  r#  r*  r.  r6  r5   r5   r5   r6   r  î  ó    r  c                   @   r  )ÚTestMIMEImagec                 C   r  )Nr  rŽ  )r%   r‘   Ú_imgdatar   Ú_imr   r5   r5   r6   r    r!  zTestMIMEImage.setUpc                 C   r"  )Nz	image/gif)r.   r<  rC   r  r5   r5   r6   r#    r$  z#TestMIMEImage.test_guess_minor_typec                 C   r%  r&  )r<  rR   r.   rO   r'  r×   r;  r(  r5   r5   r6   r*    r+  zTestMIMEImage.test_encodingc                 C   r,  )Nr-  z
image/fish)r   r;  r.   rC   )r2   Zimr5   r5   r6   r.  $  r/  z TestMIMEImage.test_checkSetMinorc                 C   r0  )Nr  r  rv   r  r  z%attachment; filename="dingusfish.gif"rê   r1  )r  rv   r  r*   r§   r2  r  )r.   r<  r  rð   rD   r3  r4  r5   r5   r6   r6  (  r7  zTestMIMEImage.test_add_headerNr8  r5   r5   r5   r6   r:    r9  r:  c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTestMIMEApplicationc                 C   s.   | j }tdƒ}|| ¡ dƒ ||d dƒ d S )Nó   úûüýþÿr  r=   rO   )r.   r   rC   r1   r5   r5   r6   Útest_headers?  s   z TestMIMEApplication.test_headersc                 C   s:   | j }d}t|ƒ}|| ¡  ¡ dƒ ||jdd|ƒ d S )Nr>  z+vv8/f7/TrP   )r.   r   rR   Ústrip)r2   r3   Ú	bytesdatar4   r5   r5   r6   Ú	test_bodyE  s
   zTestMIMEApplication.test_bodyc                 C   s¸   d}t |tjd}|  | ¡ dt|ƒ ¡ |  |jdd|¡ |  |d d¡ tƒ }t|ƒ}| |¡ | 	¡ }t
 |¡}|  | ¡ dt|ƒ ¡ |  |jdd|¡ |  |d d¡ d S )Nr>  ©Z_encoderõ   ï¿½TrP   r@   rW   )r   r   Úencode_7or8bitr.   rR   r  r   r   r“   r”   r   rÎ   ©r2   rA  r4   r­   r®   ZwireformÚmsg2r5   r5   r6   Ú$test_binary_body_with_encode_7or8bitM  s   

z8TestMIMEApplication.test_binary_body_with_encode_7or8bitc                 C   s˜   d}t |tjd}|  | ¡ dt|ƒ ¡ |  |jdd|¡ tƒ }t|ƒ}| |¡ | 	¡ }t
 |¡}|  | ¡ dt|ƒ ¡ |  |jdd|¡ d S )Nr>  rC  rD  TrP   )r   r   Úencode_noopr.   rR   r  r   r   r“   r”   r   rÎ   rF  r5   r5   r6   Ú!test_binary_body_with_encode_noop^  s   

z5TestMIMEApplication.test_binary_body_with_encode_noopc                 C   sh   d}t |tjd}|  |jdd|¡ tƒ }t|ƒ}| |¡ | ¡ }t	 
|¡}|  |jdd|¡ d S )Ns   úûüýþÿrC  TrP   )r   r   rI  r.   rR   r   r   r“   r”   r   rÎ   rF  r5   r5   r6   Ú0test_binary_body_with_unicode_linend_encode_noopo  s   

zDTestMIMEApplication.test_binary_body_with_unicode_linend_encode_noopc                 C   s¨   d}t |tjd}|  | ¡ d¡ |  |jdd|¡ |  |d d¡ tƒ }t|ƒ}| |¡ | ¡ }t	 
|¡}|  | ¡ d¡ |  |jdd|¡ |  |d d¡ d S )Ns   úûüýþÿ rC  z=FA=FB=FC=FD=FE=FF=20TrP   r@   r>   )r   r   Zencode_quoprir.   rR   r   r   r“   r”   r   rÎ   rF  r5   r5   r6   Ú#test_binary_body_with_encode_quopri{  s   

z7TestMIMEApplication.test_binary_body_with_encode_quopric                 C   sˆ   d}t |tjd}|  | ¡ d¡ |  |jdd|¡ tƒ }t|ƒ}| |¡ | ¡ }t	 
|¡}|  | ¡ d¡ |  |jdd|¡ d S )Nr>  rC  z	+vv8/f7/
TrP   )r   r   Zencode_base64r.   rR   r   r   r“   r”   r   rÎ   rF  r5   r5   r6   Ú#test_binary_body_with_encode_base64‹  s   

z7TestMIMEApplication.test_binary_body_with_encode_base64N)
rˆ  r‰  rŠ  r?  rB  rH  rJ  rK  rL  rM  r5   r5   r5   r6   r=  >  s    r=  c                   @   sV   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
 d¡dd„ ƒZdS )ÚTestMIMETextc                 C   s   t dƒ| _d S ©Núhello there)r   Ú_msgr  r5   r5   r6   r  ›  ó   zTestMIMEText.setUpc                 C   s`   | j }|| j ¡ dƒ || j d¡dƒ g }|  | j d|¡|¡ |  | jjd|dd|¡ d S )Nr:   r<   rH   r  rê   )r.   rQ  rC   rD   r3  r4  r5   r5   r6   Ú
test_typesž  s   ÿzTestMIMEText.test_typesc                 C   s&   |   | j ¡ d¡ |  | j ¡ ¡ d S rO  )r.   rQ  rR   ÚassertFalseÚis_multipartr  r5   r5   r6   Útest_payload§  s   zTestMIMEText.test_payloadc                 C   sz   | j }tddd}|| ¡ jdƒ ||d dƒ tdƒ}d |_td|d}|| ¡ jdƒ ||d dƒ || ¡ dƒ d S )NrP  rH   rœ  r;   rI   rN   re  )r.   r   rA   rE   r	   rX   rR   rF   r5   r5   r6   Útest_charset«  s   zTestMIMEText.test_charsetc                 C   s4   | j }tddd}|| ¡ jdƒ ||d dƒ d S )NrP  rH   rœ  r;   rI   )r.   r   rA   rE   r1   r5   r5   r6   Útest_7bit_input¸  s   zTestMIMEText.test_7bit_inputc                 C   s>   | j }tdƒ}|| ¡ dƒ ||d dƒ |  d| ¡ ¡ d S )NrP  rH   r;   rI   )r.   r   rA   r´   rŒ   r1   r5   r5   r6   Útest_7bit_input_no_charset¾  s
   z'TestMIMEText.test_7bit_input_no_charsetc                 C   sP   d}| j }t|dd}|| ¡ jdƒ ||d dƒ ||jdd| d¡ƒ d S )Nõ   ÐºÐ¸Ñ€Ð¸Ð»Ð¸Ñ†Ð°rN   rœ  r;   re  TrP   )r.   r   rA   Úoutput_charsetrR   rœ   )r2   Úteststrr3   r4   r5   r5   r6   Útest_utf8_inputÅ  s   zTestMIMEText.test_utf8_inputzBcan't fix because of backward compat in email5, will fix in email6c                 C   s   d}|   tt|¡ d S )NrZ  )r†   ÚUnicodeEncodeErrorr   )r2   r\  r5   r5   r6   Útest_utf8_input_no_charsetÍ  s   z'TestMIMEText.test_utf8_input_no_charsetN)rˆ  r‰  rŠ  r  rS  rV  rW  rX  rY  r]  ÚunittestÚskipr_  r5   r5   r5   r6   rN  š  s    	rN  c                   @   s¬   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)S )*ÚTestMultipartc                 C   s
  t ddƒ}| ¡ }W d   ƒ n1 sw   Y  tdddd}t|dd}|jd	d
dd tdƒ}| |¡ | |¡ d|d< d|d< d|d< d}t |¡}|d dkrYtj	}ntj
}|dkrcd}	nd}	d|	|d f }
t dt |¡¡|
 |d< || _|| _|| _d S )Nr  rŽ  Ú	multipartÚmixedr}   ©rò   rv   )rö   r  r  r  z$Hi there,

This is the dingus fish.
zBarry <barry@digicool.com>r°   z)Dingus Lovers <cravindogs@cravindogs.com>r³   zHere is your dingus fishrƒ  gÊ4FÓcpÍAéÿÿÿÿr   ú-ú+z %s%04dé$   z%a, %d %b %Y %H:%M:%SZDate)r%   r‘   r   r   r  r   rb   ÚtimeÚ	localtimeÚtimezoneÚaltzoneÚstrftimerQ  r<  Ú_txt)r2   r–   rT   Ú	containerr”  ZintroÚnowZ	timetupleZtzsecsÚsignZtzoffsetr5   r5   r6   r  ×  s@   
ÿÿ


þþ
zTestMultipart.setUpc                 C   s°   | j }| j}| j}|  | ¡ ¡ || ¡ dƒ |t| ¡ ƒdƒ |t|jdƒ | d¡}| d¡}|  	|| j
¡ |  	|| j¡ || ¡ ||gƒ |  | ¡ ¡ |  | ¡ ¡ d S )Nr`   r¡   r   ru   )r.   r†   rQ  rº   rU  rC   r  rR   Ú
IndexErrorr3  ro  r<  rT  )r2   r3   ÚraisesrÐ   Zm0Zm1r5   r5   r6   Útest_hierarchyû  s   

zTestMultipart.test_hierarchyc                 C   s$   d}t ƒ  |¡}|  || ¡ ¡ d S )NzžContent-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain


--BOUNDARY


--BOUNDARY--
)r   r’   r¥  rŒ   )r2   r¬   r4   r5   r5   r6   Útest_empty_multipart_idempotent  s   z-TestMultipart.test_empty_multipart_idempotentc                 C   s@   t ddƒ}d|d< d|d< d|d< | d	¡ |  | ¡ d
¡ d S )Nrc  rd  ú	A subjectrƒ  úaperson@dom.ainr³   úbperson@dom.ainr°   r}   zœContent-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain

--BOUNDARY

--BOUNDARY--
)r   rƒ   r¥  rŒ   ©r2   Úouterr5   r5   r6   Ú/test_no_parts_in_a_multipart_with_none_epilogue  s   

z=TestMultipart.test_no_parts_in_a_multipart_with_none_epiloguec                 C   sL   t ddƒ}d|d< d|d< d|d< d	|_d	|_| d
¡ |  | ¡ d¡ d S )Nrc  rd  rw  rƒ  rx  r³   ry  r°   r*   r}   zContent-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain


--BOUNDARY

--BOUNDARY--
)r   ÚpreambleÚepiloguerƒ   r¥  rŒ   rz  r5   r5   r6   Ú0test_no_parts_in_a_multipart_with_empty_epilogue0  s   

z>TestMultipart.test_no_parts_in_a_multipart_with_empty_epiloguec                 C   sV   | j }tddƒ}d|d< d|d< d|d< | d	¡ td
ƒ}| |¡ || ¡ dƒ d S )Nrc  rd  rw  rƒ  rx  r³   ry  r°   r}   r›  á  Content-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain

--BOUNDARY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

hello world
--BOUNDARY--
)r¥  r   rƒ   r   rb   rŒ   ©r2   r3   r{  r4   r5   r5   r6   Útest_one_part_in_a_multipartE  s   


z*TestMultipart.test_one_part_in_a_multipartc                 C   ó\   | j }tddƒ}d|d< d|d< d|d< d	|_td
ƒ}| |¡ | d¡ || ¡ dƒ d S )Nrc  rd  rw  rƒ  rx  r³   ry  r°   r*   r›  r}   a  Content-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain


--BOUNDARY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

hello world
--BOUNDARY--
©r¥  r   r}  r   rb   rƒ   rŒ   r  r5   r5   r6   Ú1test_seq_parts_in_a_multipart_with_empty_preamble^  ó   


z?TestMultipart.test_seq_parts_in_a_multipart_with_empty_preamblec                 C   ó\   | j }tddƒ}d|d< d|d< d|d< d |_td	ƒ}| |¡ | d
¡ || ¡ dƒ d S ©Nrc  rd  rw  rƒ  rx  r³   ry  r°   r›  r}   r€  r„  r  r5   r5   r6   Ú0test_seq_parts_in_a_multipart_with_none_preamblez  r†  z>TestMultipart.test_seq_parts_in_a_multipart_with_none_preamblec                 C   r‡  rˆ  ©r¥  r   r~  r   rb   rƒ   rŒ   r  r5   r5   r6   Ú0test_seq_parts_in_a_multipart_with_none_epilogue•  r†  z>TestMultipart.test_seq_parts_in_a_multipart_with_none_epiloguec                 C   rƒ  )Nrc  rd  rw  rƒ  rx  r³   ry  r°   r*   r›  r}   r€  rŠ  r  r5   r5   r6   Ú1test_seq_parts_in_a_multipart_with_empty_epilogue°  r†  z?TestMultipart.test_seq_parts_in_a_multipart_with_empty_epiloguec                 C   rƒ  )Nrc  rd  rw  rƒ  rx  r³   ry  r°   r)   r›  r}   a  Content-Type: multipart/mixed; boundary="BOUNDARY"
MIME-Version: 1.0
Subject: A subject
To: aperson@dom.ain
From: bperson@dom.ain

--BOUNDARY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

hello world
--BOUNDARY--

rŠ  r  r5   r5   r6   Ú.test_seq_parts_in_a_multipart_with_nl_epilogueË  r†  z<TestMultipart.test_seq_parts_in_a_multipart_with_nl_epiloguec                 C   s–   | j }|  d¡}|t| ¡ ƒdƒ | d¡}|| ¡ dƒ |t| ¡ ƒdƒ | ¡ D ]}|| ¡ dƒ |t| ¡ ƒdƒ | d¡}|| ¡ dƒ q*d S )Nú
msg_36.txtr¡   ru   zmultipart/alternativezmessage/external-bodyr   r:   )r.   r/   r  rR   rC   )r2   r3   r4   Úmsg1rx   Ú
subsubpartr5   r5   r6   Útest_message_external_bodyæ  s   


üz(TestMultipart.test_message_external_bodyc                 C   s"   |   d¡}|  t| ¡ ƒd¡ d S )Nz
msg_37.txtr¢   )r/   r.   r  rR   r]   r5   r5   r6   Útest_double_boundaryó  s   
z"TestMultipart.test_double_boundaryc                 C   ó4   | j }|  d¡}tƒ }t ||¡ || ¡ dƒ d S )Nz
msg_38.txtzŠmultipart/mixed
    multipart/mixed
        multipart/alternative
            text/plain
        text/plain
    text/plain
    text/plain
©r¥  r/   r   r    Z
_structurer”   ©r2   r3   r4   r§  r5   r5   r6   Ú)test_nested_inner_contains_outer_boundaryú  ó
   
z7TestMultipart.test_nested_inner_contains_outer_boundaryc                 C   r“  )Nz
msg_39.txtz“multipart/mixed
    multipart/mixed
        multipart/alternative
        application/octet-stream
        application/octet-stream
    text/plain
r”  r•  r5   r5   r6   Útest_nested_with_same_boundary  s
   
z,TestMultipart.test_nested_with_same_boundaryc                 C   r+  )Nz
msg_40.txtzÅMIME-Version: 1.0
Content-Type: text/html; boundary="--961284236552522269"

----961284236552522269
Content-Type: text/html;
Content-Transfer-Encoding: 7Bit

<html></html>

----961284236552522269--
)r/   r.   rŒ   r]   r5   r5   r6   Útest_boundary_in_non_multipart  rä   z,TestMultipart.test_boundary_in_non_multipartc                 C   sB   | j }t d¡}|  | ¡ ¡ || ¡ dƒ |t| ¡ ƒdƒ d S )NzžMIME-Version: 1.0
Content-Type: multipart/mixed; boundary="    XXXX"

--    XXXX
Content-Type: text/plain


--    XXXX
Content-Type: text/plain

--    XXXX--
z    XXXXr¡   )r.   r   rÝ   rº   rU  r~   r  rR   r1   r5   r5   r6   Ú test_boundary_with_leading_space-  s
   
z.TestMultipart.test_boundary_with_leading_spacec                 C   s&   t ƒ  d¡}|  | d¡ ¡ d¡ d S )NzòContent-Type: multipart/mixed; boundary="===============0012394164=="
MIME-Version: 1.0

--===============0012394164==
Content-Type: image/file1.jpg
MIME-Version: 1.0
Content-Transfer-Encoding: base64

YXNkZg==
--===============0012394164==--r   zYXNkZg==)r   r’   r.   rR   r…  r5   r5   r6   Ú&test_boundary_without_trailing_newline@  s   z4TestMultipart.test_boundary_without_trailing_newlinec                 C   s    t ddƒ}|  |jtjj¡ d S )Nrc  rd  )r   r3  rÇ   r   Úcompat32r…  r5   r5   r6   Útest_mimebase_default_policyN  rß   z*TestMultipart.test_mimebase_default_policyc                 C   s(   t ddtjjd}|  |jtjj¡ d S )Nrc  rd  rÆ   )r   r   rÇ   Údefaultr3  r…  r5   r5   r6   Útest_mimebase_custom_policyR  ó   z)TestMultipart.test_mimebase_custom_policyN)rˆ  r‰  rŠ  r  ru  rv  r|  r  r‚  r…  r‰  r‹  rŒ  r  r‘  r’  r–  r˜  r™  rš  r›  r  rŸ  r5   r5   r5   r6   rb  Ö  s*    $rb  c                   @   s~   e Zd Zdd„ Zdd„ Zdd„ Ze d¡Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestNonConformantc                 C   s>   | j }|  d¡}|| ¡ dƒ || ¡ dƒ || ¡ dƒ d S )Nz
msg_14.txtr:   r¬   r<  )r.   r/   rC   r0  r>  r1   r5   r5   r6   Útest_parse_missing_minor_typeY  s
   
z/TestNonConformant.test_parse_missing_minor_typec                 C   sN   |   d¡}| d¡}|  t|dƒ¡ |  t|jƒd¡ |  |jd tj	¡ d S )Nú
msg_15.txtr   r_  ru   )
r/   rR   rº   Úhasattrr.   r  r_  r^  r   ÚStartBoundaryNotFoundDefect)r2   r4   Úinnerr5   r5   r6   Útest_same_boundary_inner_outera  s   

ÿz0TestNonConformant.test_same_boundary_inner_outerc                 C   sX   |   d¡}|  | ¡ t¡ |  t|jƒd¡ |  |jd tj¡ |  |jd tj	¡ d S )Nz
msg_25.txtr¡   r   ru   )
r/   r^  rR   r¸   r.   r  r_  r   ÚNoBoundaryInMultipartDefectÚ!MultipartInvariantViolationDefectr]   r5   r5   r6   Útest_multipart_no_boundaryk  ó   
ÿÿz,TestNonConformant.test_multipart_no_boundarya^          Date: Wed, 14 Nov 2007 12:56:23 GMT
        From: foo@bar.invalid
        To: foo@bar.invalid
        Subject: Content-Transfer-Encoding: base64 and multipart
        MIME-Version: 1.0
        Content-Type: multipart/mixed;
            boundary="===============3344438784458119861=="{}

        --===============3344438784458119861==
        Content-Type: text/plain

        Test message

        --===============3344438784458119861==
        Content-Type: application/octet-stream
        Content-Transfer-Encoding: base64

        YWJj

        --===============3344438784458119861==--
        c                 C   s<   |   | j d¡¡}|  t|jƒd¡ |  |jd tj¡ d S )Nz"
Content-Transfer-Encoding: base64ru   r   )	Ú_str_msgÚmultipart_msgrz  r.   r  r_  r^  r   Z-InvalidMultipartContentTransferEncodingDefectr]   r5   r5   r6   Útest_multipart_invalid_cteŒ  s   
ÿÿz,TestNonConformant.test_multipart_invalid_ctec                 C   s(   |   | j d¡¡}|  t|jƒd¡ d S )Nr*   r   ©r¬  r­  rz  r.   r  r_  r]   r5   r5   r6   Útest_multipart_no_cte_no_defect”  r   z1TestNonConformant.test_multipart_no_cte_no_defectc                 C   s8   dD ]}|   | j d |¡¡¡}|  t|jƒd¡ qd S )N)r™  rW   ZBINaryz
Content-Transfer-Encoding: {}r   r¯  )r2   r¨   r4   r5   r5   r6   Ú"test_multipart_valid_cte_no_defect™  s   ÿÿüz4TestNonConformant.test_multipart_valid_cte_no_defectc                 C   s¦   | j }| j}tƒ }d|d< || ¡ dƒ || ¡ dƒ || ¡ dƒ |d= d|d< || ¡ dƒ || ¡ dƒ || ¡ dƒ tƒ }t|ƒ}| |¡ || 	¡ dƒ d S )Nr¬   r?   r<  r:   r;   r§   zContent-Type: foo

)
r.   r¥  r   r0  r>  rC   r   r
   r“   r”   )r2   r3   Úneqr4   r­   r®   r5   r5   r6   Útest_invalid_content_type¡  s    
z+TestNonConformant.test_invalid_content_typec                 C   r|   )Nú
msg_31.txtzm--BOUNDARY
Content-Type: text/plain

message 1

--BOUNDARY
Content-Type: text/plain

message 2

--BOUNDARY--
)r¥  r/   rR   r1   r5   r5   r6   Útest_no_start_boundary¶  ó   
z(TestNonConformant.test_no_start_boundaryc                 C   r|   )Nz
msg_35.txtz‰From: aperson@dom.ain
To: bperson@dom.ain
Subject: here's something interesting

counter to RFC 2822, there's no separating newline here
)r¥  r/   rŒ   r1   r5   r5   r6   Útest_no_separating_blank_lineÇ  r¶  z/TestNonConformant.test_no_separating_blank_linec                 C   sX   |   d¡}|  t|dƒ¡ |  t|jƒd¡ |  |jd tj¡ |  |jd tj	¡ d S )Nz
msg_41.txtr_  r¡   r   ru   )
r/   rº   r¤  r.   r  r_  r^  r   r¨  r©  r]   r5   r5   r6   Útest_lying_multipartÓ  r«  z&TestNonConformant.test_lying_multipartc                 C   sD   |   d¡}| d¡ d¡}|  t|jƒd¡ |  |jd tj¡ d S )Nz
msg_42.txtru   r   )r/   rR   r.   r  r_  r^  r   r¥  )r2   r{  Zbadr5   r5   r6   Útest_missing_start_boundaryÝ  s   
	ÿz-TestNonConformant.test_missing_start_boundaryc                 C   sj   | j }d}t |¡}|| ¡ dgƒ || ¡ dƒ |t|jƒdƒ |  |jtj	g¡ ||jd j
dƒ d S )Nz Line 1
Subject: test

bodyrƒ  Úbodyru   r   z Line 1
)r.   r   rÝ   rV  rR   r  r_  ÚassertDefectsEqualr   Z#FirstHeaderLineIsContinuationDefectÚliner  r5   r5   r6   Ú&test_first_line_is_continuation_headerí  s   
ÿz8TestNonConformant.test_first_line_is_continuation_headerc                 C   sB   |   d¡}|  | ¡ dg¡ |  | ¡ d¡ |  |jtjg¡ d S )Nz&Subject: test
not a header
To: abc

b
rƒ  znot a header
To: abc

b
)r¬  r.   rV  rR   r»  r_  r   Z MissingHeaderBodySeparatorDefectr]   r5   r5   r6   Ú"test_missing_header_body_separatorù  s   
ÿz4TestNonConformant.test_missing_header_body_separatorN)rˆ  r‰  rŠ  r¢  r§  rª  rÌ   rÍ   r­  r®  r°  r±  r³  rµ  r·  r¸  r¹  r½  r¾  r5   r5   r5   r6   r¡  W  s    

	
r¡  c                   @   óŒ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )"ÚTestRFC2047c                 C   sN   | j }d}t|ƒ}||g d¢ƒ t|ƒ}|t|ƒdƒ |  |jddd¡ d S )NzVRe: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz
 foo bar =?mac-iceland?q?r=8Aksm=9Arg=8Cs?=))s   Re: N©s
   rŠksmšrgŒszmac-iceland)s    baz foo bar NrÁ  u+   Re: rÃ¤ksmÃ¶rgÃ¥s baz foo bar rÃ¤ksmÃ¶rgÃ¥sr’  r´  ziRe: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?=
 =?mac-iceland?q?=9Arg=8Cs?=)r.   r   r   r¸   r¥  rœ   ©r2   r3   r­   Údhrˆ   r5   r5   r6   Útest_rfc2047_multiline	  s   ÿz"TestRFC2047.test_rfc2047_multilinec                 C   s:   | j }d}t|ƒ}||ddgƒ tt|ƒƒ}||dƒ d S )Nz0=?ISO-8859-1?Q?Andr=E9?= Pirard <pirard@dom.ain>)s   Andrér8   )s    Pirard <pirard@dom.ain>Nu   AndrÃ© Pirard <pirard@dom.ain>©r.   r   r¸   r   rÂ  r5   r5   r6   Útest_whitespace_keeper_unicode	  s   ÿz*TestRFC2047.test_whitespace_keeper_unicodec                 C   s:   | j }d}t|ƒ}||g d¢ƒ tt|ƒƒ}||dƒ d S )NzWThe =?iso-8859-1?b?cXVpY2sgYnJvd24gZm94?= jumped over the =?iso-8859-1?b?bGF6eSBkb2c=?=))s   The N)s   quick brown foxr8   )s    jumped over the N)s   lazy dogr8   z,The quick brown fox jumped over the lazy dogrÅ  )r2   r3   r­   rÃ  Úhur5   r5   r6   Ú test_whitespace_keeper_unicode_2!	  s   z,TestRFC2047.test_whitespace_keeper_unicode_2c                 C   ó    d}t |ƒ}|  |g d¢¡ d S )Nz3Sm=?ISO-8859-1?B?9g==?=rg=?ISO-8859-1?B?5Q==?=sbord))s   SmN©ó   ör8   )s   rgN©ó   år8   )s   sbordN©r   r.   ©r2   r­   rÃ  r5   r5   r6   Útest_rfc2047_missing_whitespace*	  ó   z+TestRFC2047.test_rfc2047_missing_whitespacec                 C   rÉ  )Nz7Sm =?ISO-8859-1?B?9g==?= rg =?ISO-8859-1?B?5Q==?= sbord))s   Sm NrÊ  )s    rg NrÌ  )s    sbordNrÎ  rÏ  r5   r5   r6   Útest_rfc2047_with_whitespace1	  rÑ  z(TestRFC2047.test_rfc2047_with_whitespacec                 C   s<   d}g d¢}|D ]\}}t || ƒ}|  ||dfg¡ qd S )Nz=?iso-8859-1?B?%s?=))zdm==ó   v)zdm=rÓ  )ZdmrÓ  )zdmk=ó   vi)ZdmkrÔ  r8   rÎ  )r2   r­   rT   ÚqÚarÃ  r5   r5   r6   Útest_rfc2047_B_bad_padding8	  s   þz&TestRFC2047.test_rfc2047_B_bad_paddingc                 C   s   d}|   t|ƒdg¡ d S )Nz=?iso-8859-1?Q?andr=e9=zz?=)s   andré=zzr8   ©r.   r   ©r2   r­   r5   r5   r6   Útest_rfc2047_Q_invalid_digitsB	  s   
ÿz)TestRFC2047.test_rfc2047_Q_invalid_digitsc                 C   ó   d}|   t|ƒg d¢¡ d S )Nz(=?ISO-8859-1?Q?a?=))©ó   (N©ó   ar8   ©ó   )NrØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_1H	  ó   
ÿz"TestRFC2047.test_rfc2047_rfc2047_1c                 C   rÛ  )Nz(=?ISO-8859-1?Q?a?= b))rÜ  rÞ  )s    b)NrØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_2N	  rã  z"TestRFC2047.test_rfc2047_rfc2047_2c                 C   rÛ  )Nz'(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)©rÜ  )s   abr8   rà  rØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_3T	  rã  z"TestRFC2047.test_rfc2047_rfc2047_3c                 C   rÛ  )Nz((=?ISO-8859-1?Q?a?=  =?ISO-8859-1?Q?b?=)rå  rØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_4Z	  rã  z"TestRFC2047.test_rfc2047_rfc2047_4c                 C   rÛ  )Nz,(=?ISO-8859-1?Q?a?=
    =?ISO-8859-1?Q?b?=)rå  rØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_5a`	  rã  z#TestRFC2047.test_rfc2047_rfc2047_5ac                 C   rÛ  )Nz+(=?ISO-8859-1?Q?a?=
    =?ISO-8859-1?Q?b?=)rå  rØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_5bf	  rã  z#TestRFC2047.test_rfc2047_rfc2047_5bc                 C   rÛ  )Nz(=?ISO-8859-1?Q?a_b?=))rÜ  )s   a br8   rà  rØ  rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_6l	  rã  z"TestRFC2047.test_rfc2047_rfc2047_6c                 C   sP   d}|   t|ƒg d¢¡ |   tt|ƒƒ ¡ | ¡ ¡ |   ttt|ƒƒƒd¡ d S )Nz((=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=))rÜ  rÞ  )s    brd   rà  z(a b))r.   r   r   rœ   r…   r¸   rÙ  r5   r5   r6   Útest_rfc2047_rfc2047_7r	  s   
ÿz"TestRFC2047.test_rfc2047_rfc2047_7c                 C   sV   d}|   t|ƒddg¡ |   tt|ƒƒ ¡ d | ¡ ¡¡ |   ttt|ƒƒƒd¡ d S )Nz9=?windows-1252?q?=22M=FCller_T=22?=
 <T.Mueller@xxx.com>)s
   "Müller T"zwindows-1252)s   <T.Mueller@xxx.com>Nr*   u   "MÃ¼ller T" <T.Mueller@xxx.com>)r.   r   r   rœ   r½   Ú
splitlinesr¸   rÙ  r5   r5   r6   Útest_multiline_header{	  s   
ÿÿÿÿz!TestRFC2047.test_multiline_headerN)rˆ  r‰  rŠ  rÄ  rÆ  rÈ  rÐ  rÒ  r×  rÚ  râ  rä  ræ  rç  rè  ré  rê  rë  rí  r5   r5   r5   r6   rÀ  	  s"    		
	rÀ  c                   @   r¿  )"ÚTestMIMEMessagec                 C   s<   t ddd}| ¡ | _W d   ƒ d S 1 sw   Y  d S )Nú
msg_11.txtrN   r   )r%   r‘   Z_textr   r5   r5   r6   r  ˆ	  s   "ÿzTestMIMEMessage.setUpc                 C   s   |   ttd¡ d S )Nza plain string)r†   ra   r   r  r5   r5   r6   Útest_type_errorŒ	  s   zTestMIMEMessage.test_type_errorc                 C   sv   | j }d}tƒ }||d< t|ƒ}|| ¡ dƒ | ¡ }|  |t¡ |t|ƒdƒ |d }|  ||¡ ||d |ƒ d S )NzA sub-messagerƒ  r!  ru   r   Úsubject)	r.   r   r   rC   rR   r^  Úlistr  r3  )r2   r3   rñ  rÐ   Úrr)  rx   r5   r5   r6   Útest_valid_argument	  s   z#TestMIMEMessage.test_valid_argumentc                 C   s:   t ƒ }d|d< t ƒ }d|d< t|ƒ}|  tj|j|¡ d S )Nú	subpart 1rƒ  z	subpart 2)r   r   r†   r   ÚMultipartConversionErrorrb   )r2   r  rG  ró  r5   r5   r6   Útest_bad_multipart	  s   z"TestMIMEMessage.test_bad_multipartc                 C   sT   t ƒ }d|d< | d¡ t|ƒ}d|d< tƒ }t|ƒ}| |¡ |  | ¡ d¡ d S )NúAn enclosed messagerƒ  ú!Here is the body of the message.
zThe enclosing messagezŽContent-Type: message/rfc822
MIME-Version: 1.0
Subject: The enclosing message

Subject: An enclosed message

Here is the body of the message.
)r   rK   r   r   r
   r“   r.   r”   )r2   rÐ   ró  r­   r®   r5   r5   r6   Útest_generate¥	  s   

zTestMIMEMessage.test_generatec                 C   st   | j }|  d¡}|| ¡ dƒ | ¡ }|  |t¡ |t|ƒdƒ |d }|  |t¡ ||d dƒ || ¡ dƒ d S )Nrï  r!  ru   r   rñ  rø  rù  )r.   r/   rC   rR   r^  rò  r  r   )r2   r3   r4   r)  Zsubmsgr5   r5   r6   Útest_parse_message_rfc822¹	  s   
z)TestMIMEMessage.test_parse_message_rfc822c                 C   s–  | j }|  d¡}|| ¡ dƒ |  | ¡ ¡ |t| ¡ ƒdƒ | d¡}|| ¡ dƒ || ¡ dƒ | d¡}|| ¡ dƒ |t| ¡ ƒd	ƒ | d¡}|  |t¡ ||d
 dƒ ||j	ddddƒ ||j	dddd ƒ | d¡}|  |t¡ ||d dƒ ||j
ddddgƒ ||j	ddddƒ | d	¡}|| ¡ dƒ | ¡ }|  |t¡ |t|ƒdƒ |d }|  |t¡ || ¡ dƒ ||d dƒ d S )Nú
msg_16.txtr  r¢   r   r:   a¶  This report relates to a message you sent with the following header fields:

  Message-id: <002001c144a6$8752e060$56104586@oxy.edu>
  Date: Sun, 23 Sep 2001 20:10:55 -0700
  From: "Ian T. Henry" <henryi@oxy.edu>
  To: SoCal Raves <scr@socal-raves.org>
  Subject: [scr] yeah for Ians!!

Your message cannot be delivered to the following recipients:

  Recipient address: jangel1@cougar.noc.ucla.edu
  Reason: recipient reached disk quota

ru   zmessage/delivery-statusr¡   zoriginal-envelope-idz"0GK500B4HD0888@cougar.noc.ucla.eduZdnszreporting-mtarê   r*   ZnsdÚactionZfailedzoriginal-recipient)r@  r*   )zjangel1@cougar.noc.ucla.edur*   r@  zfinal-recipientr!  ú
message-idz(<002001c144a6$8752e060$56104586@oxy.edu>)r.   r/   rC   rº   rU  r  rR   r^  r   rD   rð   rò  )r2   r3   r4   rx   Zdsn1Zdsn2r)  r  r5   r5   r6   Útest_dsnÅ	  sD   




ÿ
ÿzTestMIMEMessage.test_dsnc           	      C   sÂ   | j }tddd}| ¡ }W d   ƒ n1 sw   Y  tƒ }d|d< d|d< d|d	< d
|_d|_tdƒ}tdƒ}|jdddd | |¡ | |¡ t	ƒ }t
|ƒ}| |¡ || ¡ |ƒ d S )Nú
msg_21.txtrN   r   rx  r°   ry  r³   r×  rƒ  úMIME messagezEnd of MIME message
rN  rP  r?   r`   r}   re  )r¥  r%   r‘   r   r}  r~  r   r  rb   r   r
   r“   r”   )	r2   r3   r–   r¬   r4   r  rG  r§  r®   r5   r5   r6   Útest_epilogueþ	  s&   
ÿ


zTestMIMEMessage.test_epiloguec                 C   sv   | j }tƒ }d|d< d|d< d|d< d|_d|_td	ƒ}td
ƒ}|jdddd | |¡ | |¡ || ¡ dƒ d S )Nrx  r°   ry  r³   r×  rƒ  r  r*   rN  rP  r?   r`   r}   re  ad  From: aperson@dom.ain
To: bperson@dom.ain
Subject: Test
Content-Type: multipart/mixed; boundary="BOUNDARY"

MIME message
--BOUNDARY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

One
--BOUNDARY
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Two
--BOUNDARY--
)r¥  r   r}  r~  r   r  rb   rŒ   )r2   r3   r4   r  rG  r5   r5   r6   Útest_no_nl_preamble
  s   

z#TestMIMEMessage.test_no_nl_preamblec                 C   óØ   | j }tddd}t |¡}W d   ƒ n1 sw   Y  | d¡}|| ¡ dƒ || ¡ dƒ | d¡}|| ¡ dƒ || ¡ dƒ | d¡}|| ¡ dƒ || ¡ dƒ | d¡}|| ¡ dƒ || ¡ dƒ d S )Nr%  rN   r   r   r!  ru   r:   ©r.   r%   r   Úmessage_from_filerR   Úget_default_typerC   ©r2   r3   r–   r4   Z
container1Z
container2Zcontainer1aZcontainer2ar5   r5   r6   Útest_default_type5
  ó    ÿ



z!TestMIMEMessage.test_default_typec                 C   r  )Nr)  rN   r   r   r!  ru   r:   r  r  r5   r5   r6   Ú.test_default_type_with_explicit_container_typeF
  r
  z>TestMIMEMessage.test_default_type_with_explicit_container_typec                 C   sü   | j }| j}tddƒ}d|_tdƒ}tdƒ}t|ƒ}t|ƒ}| |¡ | |¡ || ¡ dƒ || ¡ dƒ || ¡ dƒ || ¡ dƒ || 	d¡dƒ |d	= |d
= |d	= |d
= || ¡ dƒ || ¡ dƒ || ¡ dƒ || ¡ dƒ || 	d¡dƒ d S )NÚdigestr}   r*   ú
message 1
ú
message 2
r!  r   a   Content-Type: multipart/digest; boundary="BOUNDARY"
MIME-Version: 1.0

--BOUNDARY
Content-Type: message/rfc822
MIME-Version: 1.0

Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

message 1

--BOUNDARY
Content-Type: message/rfc822
MIME-Version: 1.0

Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

message 2

--BOUNDARY--
r;   r9   aB  Content-Type: multipart/digest; boundary="BOUNDARY"
MIME-Version: 1.0

--BOUNDARY

Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

message 1

--BOUNDARY

Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

message 2

--BOUNDARY--
)
r.   r¥  r   r~  r   r   rb   rC   r  rŒ   )r2   r3   r²  rp  Z	subpart1aZ	subpart2aZsubpart1Zsubpart2r5   r5   r6   Útest_default_type_non_parsedW
  s0   


z,TestMIMEMessage.test_default_type_non_parsedc                 C   sZ   | j }tdƒ}tdƒ}t||fd}|t| ¡ ƒdƒ || d¡|ƒ || d¡|ƒ d S )Nr*   )Z	_subpartsr¡   r   ru   )r.   r   r   r  rR   )r2   r3   Ztext1Ztext2r4   r5   r5   r6   Ú$test_mime_attachments_in_constructor¡
  s   z4TestMIMEMessage.test_mime_attachments_in_constructorc                 C   s   t ƒ }|  | ¡ ¡ d S r[   )r   rº   rU  r]   r5   r5   r6   Ú"test_default_multipart_constructorª
  s   z2TestMIMEMessage.test_default_multipart_constructorc                 C   s0   t ƒ }d|d< d|d< |  | d¡ddg¡ d S )Núa@b.comr³   úc@d.comr±   )r   r.   r0   r]   r5   r5   r6   Útest_multipart_default_policy®
  s   z-TestMIMEMessage.test_multipart_default_policyc                 C   s^   t tjjd}d|d< |  t¡}d|d< W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )NrÆ   r  r³   r  z.There may be at most 1 To headers in a message)	r   r   rÇ   rž  r†   r  r.   r¸   Ú	exception)r2   r4   Úcmr5   r5   r6   Útest_multipart_custom_policy´
  s   
ÿÿz,TestMIMEMessage.test_multipart_custom_policyN)rˆ  r‰  rŠ  r  rð  rô  r÷  rú  rû  rÿ  r  r  r	  r  r  r  r  r  r  r5   r5   r5   r6   rî  ‡	  s"    9#J	rî  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestNonMultipartc                 C   s   t ddƒ}|  | ¡ ¡ d S )Nr¬   r<  )r   rT  rU  r]   r5   r5   r6   Ú"test_nonmultipart_is_not_multipart¿
  s   
z3TestNonMultipart.test_nonmultipart_is_not_multipartc                 C   s.   t ƒ }d|d< tddƒ}|  tj|j|¡ d S )Nrõ  rƒ  r¬   r<  )r   r   r†   r   rö  rb   )r2   r4   ró  r5   r5   r6   Útest_attach_raises_exceptionÃ
  s   
z-TestNonMultipart.test_attach_raises_exceptionN)rˆ  r‰  rŠ  r  r  r5   r5   r5   r6   r  ¾
  s    r  c                   @   sÒ   e Zd ZdZdd„ Zd4dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3S )5ÚTestIdempotentr)   c                 C   sF   t |dd}| ¡ }W d   ƒ n1 sw   Y  t |¡}||fS ©NrN   r   ©r%   r‘   r   rÝ   ©r2   r  r–   rT   r4   r5   r5   r6   r/   Ó
  s
   
ÿ
zTestIdempotent._msgobjFc                 C   s8   | j }tƒ }t|dd}|j||d ||| ¡ ƒ d S )Nr   rô  r¶   )r¥  r   r
   r“   r”   )r2   r4   r¬   r·   r3   r­   r®   r5   r5   r6   Ú_idempotentÙ
  s
   zTestIdempotent._idempotentc                 C   sˆ   | j }|  d¡\}}|| ¡ dƒ || ¡ dƒ || ¡ dƒ || ¡ d dƒ || d¡dƒ ||jd ƒ ||jd ƒ |  	||¡ d S )	Nr€   r:   r¬   r<  ru   )r<   rH   r<   rH   )
r.   r/   rC   r0  r>  rð   rD   r}  r~  r  ©r2   r3   r4   r¬   r5   r5   r6   Útest_parse_text_messageà
  s   z&TestIdempotent.test_parse_text_messagec                 C   sP   | j }|  d¡\}}|| ¡ dƒ || ¡ d ƒ || d¡d ƒ |  ||¡ d S )Nr‚   r:   r<   )r.   r/   rC   rð   rD   r  r   r5   r5   r6   Útest_parse_untyped_messageì
  s   z)TestIdempotent.test_parse_untyped_messagec                 C   ó   |   d¡\}}|  ||¡ d S )Nrj   ©r/   r  ©r2   r4   r¬   r5   r5   r6   Útest_simple_multipartô
  ó   z$TestIdempotent.test_simple_multipartc                 C   r#  )Nú
msg_02.txtr$  r%  r5   r5   r6   Útest_MIME_digestø
  r'  zTestIdempotent.test_MIME_digestc                 C   r#  )Nz
msg_27.txtr$  r%  r5   r5   r6   Útest_long_headerü
  r'  zTestIdempotent.test_long_headerc                 C   r#  )Nr)  r$  r%  r5   r5   r6   Ú"test_MIME_digest_with_part_headers   r'  z1TestIdempotent.test_MIME_digest_with_part_headersc                 C   r#  )Nú
msg_06.txtr$  r%  r5   r5   r6   Útest_mixed_with_image  r'  z$TestIdempotent.test_mixed_with_imagec                 C   r#  )Nr  r$  r%  r5   r5   r6   Útest_multipart_report  r'  z$TestIdempotent.test_multipart_reportc                 C   r#  )Nrü  r$  r%  r5   r5   r6   rÿ    r'  zTestIdempotent.test_dsnc                 C   r#  )Nr   r$  r%  r5   r5   r6   Útest_preamble_epilogue  r'  z%TestIdempotent.test_preamble_epiloguec                 C   r#  )Nz
msg_23.txtr$  r%  r5   r5   r6   Útest_multipart_one_part  r'  z&TestIdempotent.test_multipart_one_partc                 C   r#  )Nz
msg_24.txtr$  r%  r5   r5   r6   Útest_multipart_no_parts  r'  z&TestIdempotent.test_multipart_no_partsc                 C   r#  )Nr´  r$  r%  r5   r5   r6   rµ    r'  z%TestIdempotent.test_no_start_boundaryc                 C   r#  )Nú
msg_32.txtr$  r%  r5   r5   r6   Útest_rfc2231_charset   r'  z#TestIdempotent.test_rfc2231_charsetc                 C   r#  )Nz
msg_33.txtr$  r%  r5   r5   r6   Útest_more_rfc2231_parameters$  r'  z+TestIdempotent.test_more_rfc2231_parametersc                 C   r#  )Nz
msg_34.txtr$  r%  r5   r5   r6   Ú%test_text_plain_in_a_multipart_digest(  r'  z4TestIdempotent.test_text_plain_in_a_multipart_digestc                 C   r#  )Nzmsg_12a.txtr$  r%  r5   r5   r6   Útest_nested_multipart_mixeds,  r'  z+TestIdempotent.test_nested_multipart_mixedsc                 C   r#  )NrŽ  r$  r%  r5   r5   r6   Ú%test_message_external_body_idempotent0  r'  z4TestIdempotent.test_message_external_body_idempotentc                 C   s"   |   d¡\}}| j||dd d S )Nú
msg_43.txtTr¶   r$  r%  r5   r5   r6   Útest_message_delivery_status4  s   z+TestIdempotent.test_message_delivery_statusc                 C   r#  ©Nú
msg_45.txtr$  r%  r5   r5   r6   Útest_message_signed_idempotent8  r'  z-TestIdempotent.test_message_signed_idempotentc                 C   sX  | j }|  d¡\}}|| ¡ dƒ i }| ¡ D ]\}}|||< q||d dƒ ||d dƒ ||jd| j ƒ ||j| jƒ |t| ¡ ƒdƒ | d	¡}|| ¡ d
ƒ || ¡ d| j ƒ | d¡}|| ¡ d
ƒ || ¡ d| j ƒ | d¡}	||	 ¡ dƒ |  	|	t
¡ |	 ¡ }
|  	|
t¡ |t|
ƒdƒ |
d	 }|  	|t
¡ || ¡ d| j ƒ d S )Nr  r  r  r  rò   r
  z$This is a MIME-encapsulated message.r¢   r   r:   zYadda yadda yaddaru   r¡   r!  )r.   r/   rC   rð   r}  rÅ   r~  r  rR   r^  r   rò  )r2   r3   r4   r¬   ÚparamsZpkZpvr  rG  Zmsg3r)  Zmsg4r5   r5   r6   Útest_content_type<  s4   



z TestIdempotent.test_content_typec                 C   sŠ   | j }|  d¡\}}|| ¡ dƒ | ¡ }|  |t¡ |t|ƒdƒ |d }|  |t¡ || ¡ dƒ |  | ¡ t¡ || ¡ | j	ƒ d S )Nr,  r!  ru   r   r:   )
r.   r/   rC   rR   r^  rò  r  r   r¸   rÅ   )r2   r3   r4   r¬   r)  r  r5   r5   r6   Útest_parser[  s   zTestIdempotent.test_parserN©F)rˆ  r‰  rŠ  rÅ   r/   r  r!  r"  r&  r)  r*  r+  r-  r.  rÿ  r/  r0  r1  rµ  r3  r4  r5  r6  r7  r9  r<  r>  r?  r5   r5   r5   r6   r  Ï
  s4    
r  c                   @   sä  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwS )xÚTestMiscellaneousc                 C   sn   t ddd}| ¡ }W d   ƒ n1 sw   Y  t |¡}tƒ }t|dd}| |¡ |  || ¡ ¡ d S ©Nr€   rN   r   r   rô  ©	r%   r‘   r   rÝ   r   r
   r“   r.   r”   ©r2   r–   r¬   r4   r­   r®   r5   r5   r6   Útest_message_from_stringo  s   
ÿ

z*TestMiscellaneous.test_message_from_stringc                 C   sz   t ddd-}| ¡ }| d¡ t |¡}tƒ }t|dd}| |¡ |  || 	¡ ¡ W d   ƒ d S 1 s6w   Y  d S rB  )
r%   r‘   Úseekr   r  r   r
   r“   r.   r”   rD  r5   r5   r6   Útest_message_from_filez  s   


"÷z(TestMiscellaneous.test_message_from_filec                 C   sº   t ddd}| ¡ }W d   ƒ n1 sw   Y  G dd„ dtƒ}t ||¡}|  ||¡ t ddd}| ¡ }W d   ƒ n1 sCw   Y  t ||¡}| ¡ D ]}|  ||¡ qRd S )Nr€   rN   r   c                   @   ó   e Zd ZdS )zHTestMiscellaneous.test_message_from_string_with_class.<locals>.MyMessageN©rˆ  r‰  rŠ  r5   r5   r5   r6   Ú	MyMessage‹  ó    rJ  r(  )r%   r‘   r   r   rÝ   r^  Úwalk)r2   r–   r¬   rJ  r4   rx   r5   r5   r6   Ú#test_message_from_string_with_class†  s   
ÿ
ÿÿz5TestMiscellaneous.test_message_from_string_with_classc                 C   sª   G dd„ dt ƒ}tddd}t ||¡}W d   ƒ n1 sw   Y  |  ||¡ tddd}t ||¡}W d   ƒ n1 sAw   Y  | ¡ D ]}|  ||¡ qJd S )Nc                   @   rH  )zFTestMiscellaneous.test_message_from_file_with_class.<locals>.MyMessageNrI  r5   r5   r5   r6   rJ  ™  rK  rJ  r€   rN   r   r(  )r   r%   r   r  r^  rL  )r2   rJ  r–   r4   rx   r5   r5   r6   Ú!test_message_from_file_with_class—  s   ÿÿÿz3TestMiscellaneous.test_message_from_file_with_classc                 C   s,   G dd„ dt ƒ}|  d|¡}|  ||¡ d S )Nc                       s   e Zd Z‡ fdd„Z‡  ZS )zSTestMiscellaneous.test_custom_message_does_not_require_arguments.<locals>.MyMessagec                    s   t ƒ  ¡  d S r[   )ÚsuperÚ__init__r  ©Ú	__class__r5   r6   rP  §  rR  z\TestMiscellaneous.test_custom_message_does_not_require_arguments.<locals>.MyMessage.__init__)rˆ  r‰  rŠ  rP  Ú__classcell__r5   r5   rQ  r6   rJ  ¦  s    rJ  zSubject: test

test)r   r¬  r^  )r2   rJ  r4   r5   r5   r6   Ú.test_custom_message_does_not_require_arguments¥  s   z@TestMiscellaneous.test_custom_message_does_not_require_argumentsc                 C   s"   t dƒ}|  t|jƒg d¢¡ d S )Nr   )r   r<   r   r   Ú
feedparserrŸ   rˆ   r    r3  Zmessage_from_binary_filerÎ   r  rÝ   r“  r—   r!   r"   )Ú
__import__r.   ÚsortedÚ__all__)r2   Úmoduler5   r5   r6   Útest__all__¬  s   zTestMiscellaneous.test__all__c                 C   s:   t   ¡ }|  t t |¡¡d d… t  |¡d d… ¡ d S )Né   )rj  r.   r"   Ú	parsedateÚ
formatdateÚgmtime©r2   rq  r5   r5   r6   Útest_formatdate¶  s   ÿz!TestMiscellaneous.test_formatdatec                 C   s>   t   ¡ }|  t tj|dd¡d d… t  |¡d d… ¡ d S )NT©rk  r[  )rj  r.   r"   r\  r]  rk  r_  r5   r5   r6   Útest_formatdate_localtime»  s
   þz+TestMiscellaneous.test_formatdate_localtimec              	   C   sV   t   ¡ }|  tj|ddt  dt  |¡¡¡ |  tj|dddt  dt  |¡¡¡ d S )NFra  z%a, %d %b %Y %H:%M:%S -0000T)rk  Zusegmtz%a, %d %b %Y %H:%M:%S GMT)rj  r.   r"   r]  rn  r^  r_  r5   r5   r6   Útest_formatdate_usegmtÁ  s   þþz(TestMiscellaneous.test_formatdate_usegmtc              	   C   s‚   g d¢}|D ](}| j |d |  t |¡¡ |  t |¡¡ W d   ƒ n1 s)w   Y  q|  t d ¡¡ |  t d ¡¡ d S )N)	r*   r+   Ú0zA Complete Waste of Timez Wed, 3 Apr 2002 12.34.56.78+0800z17 June , 2022zFriday, -Nov-82 16:14:55 ESTzFriday, Nov--82 16:14:55 ESTzFriday, 19-Nov- 16:14:55 EST)Údtstr)ÚsubTestr\  r"   r\  Úparsedate_tz)r2   Zinvalid_datesre  r5   r5   r6   Ú/test_parsedate_returns_None_for_invalid_stringsË  s   þ€zATestMiscellaneous.test_parsedate_returns_None_for_invalid_stringsc                 C   ó:   |   t d¡d¡ |   t d¡d¡ |   t d¡d¡ d S )NzWed, 3 Apr 2002 14:58:26 +0800©
éÒ  r   r¢   é   é:   é   r   ru   rf  é€p  zWed,3 Apr 2002 14:58:26 +0800zWed 3 Apr 2002 14:58:26 +0800©r.   r"   rg  r  r5   r5   r6   Útest_parsedate_compactá  s   ÿÿÿz(TestMiscellaneous.test_parsedate_compactc                 C   s*   | j }|t d¡dƒ |t d¡dƒ d S )Nú5 Feb 2003 13:47:26 -0800©
éÓ  r¡   é   é   é/   rn  r   ru   rf  é€ÿÿzFebruary 5, 2003 13:47:26 -0800rp  ©r2   r3   r5   r5   r6   Útest_parsedate_no_dayofweekë  ó   
ÿ
ÿz-TestMiscellaneous.test_parsedate_no_dayofweekc                 C   ó   |   t d¡d¡ d S )NzWed, 3 Apr 2002 14:58:26+0800rj  rp  r  r5   r5   r6   Ú.test_parsedate_no_space_before_positive_offsetò  ó   ÿz@TestMiscellaneous.test_parsedate_no_space_before_positive_offsetc                 C   r|  )NzWed, 3 Apr 2002 14:58:26-0800)
rk  r   r¢   rl  rm  rn  r   ru   rf  rx  rp  r  r5   r5   r6   Ú.test_parsedate_no_space_before_negative_offsetö  s   ÿz@TestMiscellaneous.test_parsedate_no_space_before_negative_offsetc                 C   ó*   | j }|t d¡dƒ |t d¡dƒ d S )Nz5 Feb 2003 13.47.26 -0800rs  z5 Feb 2003 13.47 -0800)
rt  r¡   ru  rv  rw  r   r   ru   rf  rx  rp  ry  r5   r5   r6   Ú%test_parsedate_accepts_time_with_dotsû  r{  z7TestMiscellaneous.test_parsedate_accepts_time_with_dotsc                 C   r|  )NzFriday, 19-Nov-82 16:14:55 EST)
i¾  é   é   é   rl  é7   r   ru   rf  i°¹ÿÿrp  r  r5   r5   r6   Útest_parsedate_rfc_850  r~  z(TestMiscellaneous.test_parsedate_rfc_850c                 C   r|  )NzWed, 3 Apr 2002 14:58 +0800©
rk  r   r¢   rl  rm  r   r   ru   rf  ro  rp  r  r5   r5   r6   Útest_parsedate_no_seconds  r~  z+TestMiscellaneous.test_parsedate_no_secondsc                 C   ó(   |   t d¡d¡ |   t d¡d¡ d S )NzWed, 3 Apr 2002 14.58.26 +0800rj  zWed, 3 Apr 2002 14.58 +0800r‡  rp  r  r5   r5   r6   Ú!test_parsedate_dot_time_delimiter
  ó   ÿÿz3TestMiscellaneous.test_parsedate_dot_time_delimiterc                 C   s¶   | j }t d¡}tt |¡ƒ}|t |¡d d… |d d… ƒ |tt d|¡ƒdƒ t d¡}tt |d d… ¡ƒ}|t |¡d d… |d d… ƒ |tt d|d d… ¡ƒdƒ d S )Nrr  r[  z%Yrt  é	   )	r.   r"   r\  Úintrj  Úmktimerk  rn  rg  )r2   r3   Ztimetupr  r5   r5   r6   Ú+test_parsedate_acceptable_to_time_functions  s   
 
 "z=TestMiscellaneous.test_parsedate_acceptable_to_time_functionsc                 C   r‰  )N)
é²  ru   ru   r   r   r   rf  rf  rf  r   r   )
r  ru   ru   r   r   r   rf  rf  rf  iÒ  i.ûÿÿ)r.   r"   Z	mktime_tzr  r5   r5   r6   Útest_mktime_tz  r‹  z TestMiscellaneous.test_mktime_tzc                 C   s4   |   t d¡t d¡¡ |   t d¡t d¡¡ dS )a   Test for parsing a date with a two-digit year.

        Parsing a date with a two-digit year should return the correct
        four-digit year. RFC822 allows two-digit years, but RFC2822 (which
        obsoletes RFC822) requires four-digit years.

        z25 Feb 03 13:47:26 -0800z25 Feb 2003 13:47:26 -0800z25 Feb 71 13:47:26 -0800z25 Feb 1971 13:47:26 -0800Nrp  r  r5   r5   r6   Útest_parsedate_y2k!  s   ÿÿz$TestMiscellaneous.test_parsedate_y2kc                 C   s.   |   t d¡d¡ |   t t d¡¡d¡ d S )Nz<>©r*   r*   r*   ©r.   r"   Ú	parseaddrÚ
formataddrr  r5   r5   r6   Útest_parseaddr_empty.  s   z&TestMiscellaneous.test_parseaddr_emptyc                 C   ri  )Nza@b@cr“  za@b.c@cza@172.17.0.1@c©r.   r"   r•  r  r5   r5   r6   Útest_parseaddr_multiple_domains2  s   þþþz1TestMiscellaneous.test_parseaddr_multiple_domainsc                 C   r|  )N)zA Silly Personúperson@dom.ainzA Silly Person <person@dom.ain>©r.   r"   r–  r  r5   r5   r6   Útest_noquote_dump@  ó   þz#TestMiscellaneous.test_noquote_dumpc                 C   sP   |   t d¡d¡ |   t d¡d¡ d}d}|   t t ||f¡¡||f¡ d S )N)zA (Very) Silly Personrš  z("A (Very) Silly Person" <person@dom.ain>z*"A \(Very\) Silly Person" <person@dom.ain>zA \(Special\) Personrš  ©r.   r"   r–  r•  ©r2   rÖ  r  r5   r5   r6   Útest_escape_dumpE  s   þþ$z"TestMiscellaneous.test_escape_dumpc                 C   s>   |   t d¡d¡ d}d}|   t t ||f¡¡||f¡ d S )N)úArthur \Backslash\ Foobarrš  z."Arthur \\Backslash\\ Foobar" <person@dom.ain>r¡  rš  rž  rŸ  r5   r5   r6   Útest_escape_backslashesP  s   þ$z)TestMiscellaneous.test_escape_backslashesc                 C   sB   d}d}d}d}|   t ||f¡|¡ |   t ||fd¡|¡ d S )Nõ   HÃ¤ns WÃ¼rstrš  ú-=?utf-8?b?SMOkbnMgV8O8cnN0?= <person@dom.ain>z0=?iso-8859-1?q?H=E4ns_W=FCrst?= <person@dom.ain>r8   r›  )r2   rö   ÚaddrÚutf8_base64Zlatin1_quoprir5   r5   r6   Útest_quotes_unicode_namesX  s   ÿz+TestMiscellaneous.test_quotes_unicode_namesc                    sl   d}d}d}d‰ G ‡ fdd„dƒ}|ƒ }dˆ |f }|   t ||f|¡|¡ |   t ||ftdƒ¡|¡ d S )	Nr£  rš  r¤  ZFOOBARc                       s   e Zd Z‡ fdd„ZdS )zKTestMiscellaneous.test_accepts_any_charset_like_object.<locals>.CharsetMockc                    s   ˆ S r[   r5   )r2   Ústring©r  r5   r6   Úheader_encodei  s   zYTestMiscellaneous.test_accepts_any_charset_like_object.<locals>.CharsetMock.header_encodeN)rˆ  r‰  rŠ  rª  r5   r©  r5   r6   ÚCharsetMockh  s    r«  z%s <%s>rN   )r.   r"   r–  r	   )r2   rö   r¥  r¦  r«  ZmockZmock_expectedr5   r©  r6   Ú$test_accepts_any_charset_like_objectb  s   ÿz6TestMiscellaneous.test_accepts_any_charset_like_objectc                 C   s(   d}d}t ƒ }|  ttj||f|¡ d S )Nr£  rš  )Úobjectr†   ÚAttributeErrorr"   r–  )r2   rö   r¥  Zbad_charsetr5   r5   r6   Ú-test_invalid_charset_like_object_raises_errorq  s   ÿz?TestMiscellaneous.test_invalid_charset_like_object_raises_errorc                 C   s0   d}|   ttjd |f¡ |   ttjd|f¡ d S )Nu   persÃ¶n@dom.inÚName)r†   ÚUnicodeErrorr"   r–  ©r2   r¥  r5   r5   r6   Ú!test_unicode_address_raises_errorz  s   z3TestMiscellaneous.test_unicode_address_raises_errorc                 C   sV   d}d}d\}}|   t |¡||f¡ |   t |¡||f¡ |   t ||f¡|¡ d S )NzJohn X. Doe <jxd@example.com>z"John X. Doe" <jxd@example.com>)zJohn X. Doezjxd@example.comr”  )r2   rb  ÚyrÖ  r  r5   r5   r6   Útest_name_with_dot€  s   z$TestMiscellaneous.test_name_with_dotc                 C   s:   | j }|t d¡dƒ |t d¡dƒ |t d¡dƒ d S )Nú""example" example"@example.com)r*   r¶  ú!"\"example\" example"@example.com)r*   r·  ú#"\\"example\\" example"@example.com)r*   r¸  r˜  ry  r5   r5   r6   Ú2test_parseaddr_preserves_quoted_pairs_in_addresses‰  s   

ÿ
ÿ
ÿzDTestMiscellaneous.test_parseaddr_preserves_quoted_pairs_in_addressesc                 C   s^   |   dt d¡¡ |   dt d¡¡ |   dt d¡¡ |   dt d¡¡ |   dt d	¡¡ d S )
N)r*   úmerwok wok@xample.comrº  )r*   úmerwok  wok@xample.comr»  z merwok  wok  @xample.com)r*   úmerwok"wok"  wok@xample.comr¼  )r*   zmerwok.wok.wok@xample.comzmerwok. wok .  wok@xample.comr˜  r  r5   r5   r6   Ú-test_parseaddr_preserves_spaces_in_local_part›  s   ÿÿÿÿÿz?TestMiscellaneous.test_parseaddr_preserves_spaces_in_local_partc                 C   s0   d}d}|   t |¡|¡ |   t |¡|¡ d S )N)z#'foo@example.com' (foo@example.com)úfoo@example.comz7"'foo@example.com' (foo@example.com)" <foo@example.com>r”  )r2   r¥  Zaddrstrr5   r5   r6   Ú6test_formataddr_does_not_quote_parens_in_quoted_string­  s   zHTestMiscellaneous.test_formataddr_does_not_quote_parens_in_quoted_stringc                 C   s   d}|   t |¡d¡ d S )NzFoo
	Bar <foo@example.com>)zFoo Barr¾  r˜  )r2   rb  r5   r5   r6   Útest_multiline_from_comment¶  s   z-TestMiscellaneous.test_multiline_from_commentc                 C   r|  )N)zA Silly; Personrš  z""A Silly; Person" <person@dom.ain>r›  r  r5   r5   r6   Útest_quote_dump¼  r  z!TestMiscellaneous.test_quote_dumpc                 C   s¨   | j }| j}tƒ }tƒ }||dƒ ||dƒ ||dƒ |d|ƒ |d|ƒ |d|ƒ ||dƒ ||dƒ ||dƒ |d|ƒ |d|ƒ |d|ƒ |||ƒ |||ƒ d S )NrH   úUS-ASCIIzUs-AsCiIZusasciiZUSASCIIZUsAsCiI)r.   ZassertNotEqualr	   )r2   r3   ÚneZcset1Zcset2r5   r5   r6   Útest_charset_richcomparisonsÁ  s$   












z.TestMiscellaneous.test_charset_richcomparisonsc                 C   s"   | j }|t ddg¡ddgƒ d S )Núaperson@dom.ain (Al Person)zBud Person <bperson@dom.ain>©z	Al Personrx  )z
Bud Personry  ©r.   r"   Úgetaddressesry  r5   r5   r6   Útest_getaddressesÕ  s   ÿÿþz#TestMiscellaneous.test_getaddressesc                 C   s   |   t g d¢¡g d¢¡ dS )zGH-106669 regression test.)z"Bud, Person" <bperson@dom.ain>rÅ  z#"Mariusz Felisiak" <to@example.com>))zBud, Personry  rÆ  )zMariusz Felisiakúto@example.comNrÇ  r  r5   r5   r6   Útest_getaddresses_comma_in_nameÜ  s   ÿøz1TestMiscellaneous.test_getaddresses_comma_in_namec                 C   sÒ  d}d}d}dd|› d|fgfdd|f|d|fgfdd|f|d|f|gfdd|f|d|fgfd	d|› d
|› dfgfdd|f|d|fgfd||d|fgfdd|f|d|fgfdd|fd|fgfdd|d fd|fgfdd|fdd|› dfgffD ]S\}}|› |› d|› d}| j |d7 |  t |g¡|g¡ |  tj|gdd|¡ |  t |g¡|¡ |  tj|gddd|f¡ W d  ƒ n1 sÈw   Y  qz|› d|› d}|  t |g¡d|fd|fg¡ |  tj|gddd|fd|fg¡ |  t |g¡|¡ |  tj|gddd|f¡ d}d}|  t |g¡|g¡ |  tj|gdd|g¡ |  t |g¡|¡ |  tj|gddd|f¡ d}d}|  t |g¡|g¡ |  tj|gdd|g¡ |  t |g¡|¡ |  tj|gddd|f¡ d}|  t |g¡|g¡ |  tj|gddg d¢¡ |  t |g¡|¡ |  tj|gddd|f¡ d}|  t |g¡ddg¡ |  tj|gddddg¡ |  t |g¡|¡ |  tj|gddd|f¡ |  tjjd ¡ dS )!z>Test for parsing errors from CVE-2023-27043 and CVE-2019-16056úalice@example.orgúbob@example.comr“  ú(ú<ú>ú)r*   ú[z[<z>]ú]ú@ú;ú:Ú.ú")ÚaddressF©ÚstrictNz,<z,"Alice, alice@example.org" <bob@example.com>)zAlice, alice@example.orgrÍ  zalice@example.org (Alice))ÚAlicerÌ  zalice@example.org )Alice())r*   rÌ  r“  )r*   rÜ  ú<"Jane Doe" <jane@example.net>, "John Doe" <john@example.net>)zJane Doezjane@example.net)zJohn Doezjohn@example.netT)rf  r.   r"   rÈ  r•  r   Zsupports_strict_parsing)r2   ZaliceZbobÚemptyZinvalid_separatorZexpected_non_strictrÙ  Zexpected_strictr5   r5   r6   Útest_parsing_errorsí  sª   õÿÿÿÿø€ÿÿÿÿÿÿÿÿÿÿÿÿÿz%TestMiscellaneous.test_parsing_errorsc                 C   s  dgdgfdgdgfddgddgfdgdgfd	gdgfd
gg d¢fdgdgfdgdgfdgdgfdgddgff
D ].\}}| j |d |  t |¡|¡ |  tj|dd|¡ W d   ƒ n1 saw   Y  q8dg}|  t |¡dg¡ |  tj|ddg d¢¡ d S )Nu&   "SÃ¼rname, Firstname" <to@example.com>)u   SÃ¼rname, FirstnamerÊ  zfoo: ;r“  z#"Jason R. Mastaler" <jason@dom.ain>)zJason R. Mastalerzjason@dom.ainz=Pete(A nice \) chap) <pete(his account)@silly.test(his host)>)z)Pete (A nice ) chap his account his host)zpete@silly.testz<(Empty list)(start)Undisclosed recipients  :(nobody(I know))z=Mary <@machine.tld:mary@example.net>, , jdoe@test   . example))ZMaryzmary@example.netr“  )r*   zjdoe@test.examplez*John Doe <jdoe@machine(comment).  example>)zJohn Doe (comment)zjdoe@machine.examplez3"Mary Smith: Personal Account" <smith@home.example>)zMary Smith: Personal Accountzsmith@home.examplezUndisclosed recipients:;z7<boss@nil.test>, "Giant; \"Big\" Box" <bob@example.net>)r*   zboss@nil.test)zGiant; "Big" Boxzbob@example.net)Ú	addressesFrÚ  z	[]*-- =~$)r“  r“  )r*   z*--)rf  r.   r"   rÈ  )r2   rà  rÒ   r5   r5   r6   Útest_getaddresses_nastyE  s^   ÿÿÿÿÿÿÿÿÿÿäÿÿý€ÿÿz)TestMiscellaneous.test_getaddresses_nastyc                 C   s(   | j }t dg¡}||d d dƒ dS )z(Test proper handling of a nested commentz%User ((nested comment)) <foo@bar.com>r   ru   úfoo@bar.comNrÇ  )r2   r3   Úaddrsr5   r5   r6   Ú"test_getaddresses_embedded_commentq  s   z4TestMiscellaneous.test_getaddresses_embedded_commentc                 C   s(   t  tdƒg¡}|  |d d d¡ dS )z%Test the handling of a Header object.zAl Person <aperson@dom.ain>r   ru   rx  N)r"   rÈ  r   r.   )r2   rã  r5   r5   r6   Útest_getaddresses_header_objw  s   z.TestMiscellaneous.test_getaddresses_header_objc                    s€   G dd„ dt ƒ‰ ‡ fdd„tdƒD ƒ}t |¡ W d   ƒ n1 s#w   Y  tdd„ |D ƒg ƒ}|  tt|ƒƒt|ƒ¡ d S )Nc                   @   ó   e Zd Zdd„ ZdS )zBTestMiscellaneous.test_make_msgid_collisions.<locals>.MsgidsThreadc                 S   sN   g | _ | j j}tj}tj}|ƒ d }|ƒ |k r%||ddƒ |ƒ |k sd S d S )Ng      @útestdomain-string©Údomain)Úmsgidsr¶  r"   Ú
make_msgidrj  Ú	monotonic)r2   r¶  rë  ZclockZtfinr5   r5   r6   Úrun  s   

ÿzFTestMiscellaneous.test_make_msgid_collisions.<locals>.MsgidsThread.runN)rˆ  r‰  rŠ  rí  r5   r5   r5   r6   ÚMsgidsThread~  s    rî  c                    s   g | ]}ˆ ƒ ‘qS r5   r5   rÑ  ©rî  r5   r6   rq   ‰  ó    z@TestMiscellaneous.test_make_msgid_collisions.<locals>.<listcomp>ru  c                 S   s   g | ]}|j ‘qS r5   )rê  )ro   r  r5   r5   r6   rq   Œ  rð  )r   rÙ  r#   Zstart_threadsÚsumr.   r  Úset)r2   ÚthreadsZall_idsr5   rï  r6   Útest_make_msgid_collisions|  s   ÿz,TestMiscellaneous.test_make_msgid_collisionsc                 C   s.   | j }tƒ }|jdddd || ¡ dƒ d S )Nr  r  zfoo\wacky"namer  )r.   r   r  rm   r1   r5   r5   r6   Útest_utils_quote_unquote  s   ÿz*TestMiscellaneous.test_utils_quote_unquotec                 C   s   t dƒ}|  | ¡ d¡ d S )Nznot a charsetrO   ©r	   r.   Úget_body_encoding©r2   r<   r5   r5   r6   Ú)test_get_body_encoding_with_bogus_charset–  s   z;TestMiscellaneous.test_get_body_encoding_with_bogus_charsetc                 C   s  | j }tƒ }d|d< ||d dƒ | ¡ }|t|ƒdƒ ||d dƒ t|d ƒ}|| ¡ dƒ |jd|d	 || ¡ d
ƒ ||jdddƒ ||d dƒ tƒ }d|d< | ¡ }|t|ƒdƒ ||d dƒ t|d ƒ}|| ¡ tj	ƒ |jd|d	 || ¡ dƒ ||d dƒ d S )Nztext/plain; charset=UTF-8r?   r;   ru   r   rN   rO   r¦   r  úaGVsbG8gd29ybGQ=
TrP   r=   ztext/plain; charset="US-ASCII"rH   r›  r™  )
r.   r   rg   r  r	   r÷  rK   rR   r   rE  )r2   r3   r4   rh   r<   r5   r5   r6   Ú-test_get_body_encoding_with_uppercase_charsetš  s.   z?TestMiscellaneous.test_get_body_encoding_with_uppercase_charsetc                 C   s(   t dƒ}t dƒ}|  | ¡ | ¡ ¡ d S )NrH   rÂ  rö  )r2   ZlcZucr5   r5   r6   Útest_charsets_case_insensitive´  s   z0TestMiscellaneous.test_charsets_case_insensitivec                 C   r“  )Nr8  aB  multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
        text/plain
    text/rfc822-headers
r”  r•  r5   r5   r6   Ú1test_partial_falls_inside_message_delivery_status¹  r—  zCTestMiscellaneous.test_partial_falls_inside_message_delivery_statusc                 C   s"   |   tjjdddd … d¡ d S )Nrç  rè  iíÿÿÿz@testdomain-string>©r.   r   r"   rë  r  r5   r5   r6   Útest_make_msgid_domainã  s   þz(TestMiscellaneous.test_make_msgid_domainc                 C   s$   |   tjjddddd … d¡ d S )Nztest-idstringrç  )Zidstringré  ißÿÿÿz!.test-idstring@testdomain-string>rþ  r  r5   r5   r6   Útest_make_msgid_idstringè  s   ÿÿýz*TestMiscellaneous.test_make_msgid_idstringc                 C   sV   t dƒ}d |_}|  tj ¡  d| d ¡¡ W d   ƒ d S 1 s$w   Y  d S )Nzsocket.getfqdnzpythontest.example.comrÔ  rÐ  )r   Zreturn_valuerº   r   r"   rë  Úendswith)r2   Zmock_getfqdnré  r5   r5   r6   Útest_make_msgid_default_domainî  s   



ÿÿ"þz0TestMiscellaneous.test_make_msgid_default_domainc                 C   s|   t dddd}| ¡ }W d   ƒ n1 sw   Y  | dd¡}t |¡}tƒ }tj |¡}| |¡ |  	| 
¡ |¡ d S )Nú
msg_26.txtrN   r)   ©r   ÚnewlinerÃ   )r%   r‘   rÔ   r   rÝ   r   rŸ   r
   r“   r.   r”   ©r2   ÚfZmsgtxtZ	msgtxt_nlr4   r­   r®   r5   r5   r6   Útest_Generator_linendõ  s   
ÿ

z'TestMiscellaneous.test_Generator_linendc                 C   s†   t dddd}| ¡ }W d   ƒ n1 sw   Y  | dd¡}t |¡}tƒ }tj |¡}|j|dd |  	| 
¡  d¡|¡ d S )Nr  rN   r)   r  rÃ   rÄ   r›   )r%   r‘   rÔ   r   rÝ   r   rŸ   r   r“   r.   r”   rQ   r  r5   r5   r6   Útest_BytesGenerator_linend   s   
ÿ
z,TestMiscellaneous.test_BytesGenerator_linendc                 C   sˆ   t ddƒ}| ¡ }W d   ƒ n1 sw   Y  | dd¡}| dd¡}t |¡}tƒ }tj |¡}|j|dd |  	| 
¡ |¡ d S )	Nr  rŽ  s   with attachments   foöó   
rÖ   rÃ   rÄ   )r%   r‘   rÔ   r   rÎ   r   rŸ   r   r“   r.   r”   r  r5   r5   r6   Ú)test_BytesGenerator_linend_with_non_ascii  s   
ÿ
z;TestMiscellaneous.test_BytesGenerator_linend_with_non_asciic              	   C   sD  t ddƒ}| ¡ }W d   ƒ n1 sw   Y  t ddƒ}| ¡ }W d   ƒ n1 s-w   Y  tdft|fft|ffttƒ fftdftdfg}|D ]S\}}| j	|j
dd ||Ž }|  |jtjj¡ W d   ƒ n1 spw   Y  | j	|j
dd ||d	tjjiŽ}|  |jtjj¡ W d   ƒ n1 sšw   Y  qLd S )
Nr  rŽ  r  )r*   )rc  rd  rœ  )ÚclsrÇ   rž  rÇ   )r%   r‘   r   r   r   r   r   r   r   rf  rˆ  r3  rÇ   r   rœ  rž  )r2   r–   Z	audiodatar—  Zclassesr  ÚconstructorrÐ   r5   r5   r6   Ú!test_mime_classes_policy_argument  s0   
ÿ
ÿ
úþþ€üz3TestMiscellaneous.test_mime_classes_policy_argumentc                 C   s8   |   tt d¡ƒg d¢¡ |   tt d¡ƒddg¡ d S )Nza\\b\"c\\"d)©r   rÖ  )r¡   ú\\)r¢   r  )ru  z\")r[  Úc)é   r  )rŒ  rØ  )rÕ  Údza\r  )ru   ú\)r.   rò  r"   Z_iter_escaped_charsr  r5   r5   r6   Útest_iter_escaped_chars,  s   ÿ	ÿz)TestMiscellaneous.test_iter_escaped_charsc                    s|   ‡ fdd„}|ddƒ |ddƒ |ddƒ |d	d
ƒ |ddƒ |ddƒ |ddƒ |ddƒ dD ]}ˆ   t |¡|¡ q0d S )Nc                    s   ˆ   t | ¡|¡ d S r[   ©r.   r"   Z_strip_quoted_realnames)r¥  rÒ   r  r5   r6   Úcheck:  r$  z<TestMiscellaneous.test_strip_quoted_realnames.<locals>.checkrÝ  z( <jane@example.net>,  <john@example.net>z""Jane \"Doe\"." <jane@example.net>z <jane@example.net>zbefore"name"afterZbeforeafterzbefore"name"Úbeforezb"name"r  z"name"afterZafterz"name"arÖ  z"name"r*   )z8Jane Doe <jane@example.net>, John Doe <john@example.net>zlone " quoter  )r2   r  r¥  r5   r  r6   Útest_strip_quoted_realnames9  s    ÿÿ





üz-TestMiscellaneous.test_strip_quoted_realnamesc                 C   sv   d}|   t |› d¡¡ |  t |› d¡¡ |  t |› d¡¡ |  t |› d¡¡ |   t d|› ¡¡ d S )Nzalice@example.netz (Alice)z )Alice(z	 (Alice))z	 ((Alice)z")Alice((" )rº   r"   Z_check_parenthesisrT  r²  r5   r5   r6   Útest_check_parenthesisR  s   z(TestMiscellaneous.test_check_parenthesisN)>rˆ  r‰  rŠ  rE  rG  rM  rN  rT  rZ  r`  rb  rc  rh  rq  rz  r}  r  r  r†  rˆ  rŠ  r  r‘  r’  r—  r™  rœ  r   r¢  r§  r¬  r¯  r³  rµ  r¹  r½  r¿  rÀ  rÁ  rÄ  rÉ  rË  rß  rá  rä  rå  rô  rõ  rù  rû  rü  rý  rÿ  r   r  r  r	  r  r  r  r  r  r5   r5   r5   r6   rA  n  sx    



			X,*rA  c                   @   r  )ÚTestIteratorsc                 C   sº   | j }| j}|  d¡}t |¡}t|ƒ}|t|ƒdƒ |t |¡| 	¡ ƒ |  d¡}t |¡}t|ƒ}|t|ƒdƒ t
ddd}|t |¡| ¡ ƒ W d   ƒ d S 1 sVw   Y  d S )Nr€   r[  r(  é+   z
msg_19.txtrN   r   )r.   r¥  r/   r    Zbody_line_iteratorrò  r  ÚEMPTYSTRINGr½   rR   r%   r‘   )r2   r3   r²  r4   Úitr¿   r–   r5   r5   r6   Útest_body_line_iterator_  s   



"ÿz%TestIterators.test_body_line_iteratorc                 C   sb   | j }|  d¡}t |d¡}g }d}|D ]}|d7 }| | ¡ ¡ q||dƒ |t |¡dƒ d S )Nrj   r¬   r   ru   r¡   z`a simple kind of mirror
to reflect upon our own
a simple kind of mirror
to reflect upon our own
©r.   r/   r    Ztyped_subpart_iteratorr¶  rR   r  r½   ©r2   r3   r4   r  r¿   Zsubpartsrx   r5   r5   r6   Útest_typed_subpart_iteratorp  s   

z)TestIterators.test_typed_subpart_iteratorc                 C   sd   | j }|  d¡}t |dd¡}g }d}|D ]}|d7 }| | ¡ ¡ q||dƒ |t |¡dƒ d S )Nr‚   r¬   r<  r   ru   z%
Hi,

Do you like this message?

-Me
r   r!  r5   r5   r6   Ú(test_typed_subpart_iterator_default_type  s   

z6TestIterators.test_typed_subpart_iterator_default_typec                 C   s°   g d¢}ddl m}m} |ƒ }g }d}|D ]'\}}| |¡ ||7 }d}	t|j|ƒD ]}
| |
¡ |	d7 }	q*|  ||	¡ q|  t|ƒ|¡ |  d 	dd„ |D ƒ¡d 	|¡¡ dS )	zÂFeedParser BufferedSubFile.push() assumed it received complete
           line endings.  A CR ending one push() followed by a LF starting
           the next push() added an empty line.
        ))za 
r¡   )r  r   )zc
ru   )r*   r   )zd
ru   )zer   )z
fru   )rÃ   ru   r   ©ÚBufferedSubFileÚNeedMoreDataru   r*   c                 S   ó   g | ]\}}|‘qS r5   r5   )ro   ÚilÚnr5   r5   r6   rq   °  rr   z0TestIterators.test_pushCR_LF.<locals>.<listcomp>N)
Úemail.feedparserr%  r&  ÚpushÚiterÚreadliner¶  r.   r  r½   )r2   Zimtr%  r&  ÚbsfZomÚntr(  r)  Zn1Zolr5   r5   r6   Útest_pushCR_LF”  s   



&zTestIterators.test_pushCR_LFc                    s¢   ddl m}m} d}d}d‰ d ‡ fdd„t|ƒD ƒ¡d	 }| d
¡}|ƒ }g }tdt|ƒ|ƒD ]}	||	|	| … }
| |
¡ | t	|j
|ƒ¡ q0|  ||¡ d S )Nr   r$  i'  ru  zabcd 	
r*   c                 3   s    | ]}t ˆ ƒV  qd S r[   r   rÑ  ©Úcharsr5   r6   rÓ  ¹  rÔ  z1TestIterators.test_push_random.<locals>.<genexpr>r)   T)r*  r%  r&  r½   rÙ  rì  r  r+  Úextendr,  r-  r.   )r2   r%  r&  r)  Ú	chunksizer­   Útargetr.  r¿   rÒ  Úchunkr5   r1  r6   Útest_push_random²  s    

zTestIterators.test_push_randomN)rˆ  r‰  rŠ  r  r"  r#  r0  r7  r5   r5   r5   r6   r  ^  s    r  c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestFeedParsersc                 C   s"   t ƒ }|D ]}| |¡ q| ¡ S r[   )r'   ÚfeedÚclose)r2   ÚchunksrU  r6  r5   r5   r6   ÚparseÇ  s   zTestFeedParsers.parsec                 C   s.   |   d¡}|  |d d¡ |  |d d¡ d S )NzFirst: val
: bad
Second: valrM  ÚvalrO  )r=  r.   r]   r5   r5   r6   Útest_empty_header_name_handledÍ  s   
z.TestFeedParsers.test_empty_header_name_handledc                 C   sê   |   dg¡}|  | ¡ g d¢¡ |   dg¡}|  | ¡ g d¢¡ |   ddg¡}|  | ¡ ddg¡ |   dd	g¡}|  | ¡ dd
g¡ |   ddg¡}|  | ¡ dd
g¡ |   dg¡}|  | ¡ dg¡ |   g d¢¡}|  | ¡ ddg¡ d S )Nza:
b:c:
d:
)rÖ  r  r  r  za:
b:c:
d:za:búc:
rÖ  Zbcúa:zb:
r  z
b:
u   a:Â…b:â€¨c:
)rÖ  u	   Â…b:â€¨c:)rA  u   b:Â…r@  ©rÖ  r*   )r  u   Â…c:)r=  r.   rV  r„   r…  r5   r5   r6   Útest_newlinesÓ  s   zTestFeedParsers.test_newlinesc                 C   s  d\}}|   dgd| g|  ¡}|  | ¡ dg¡ |  | ¡ d| | ¡ |   dgd| g|  ¡}|  | ¡ dg¡ |  | ¡ d| | ¡ |   dgd| d g|  ¡}|  | ¡ dg¡ |  | ¡ d| d | ¡ |   ddgd| g|  ¡}|  | ¡ d	d
d| | fg¡ d S )N)iè  i N  za:b

rb  )rÖ  r  za:bõ   Â…rA  zb: rB  r  )r=  r.   r„   rR   )r2   ÚMÚNrÐ   r5   r5   r6   Útest_long_lineså  s   $zTestFeedParsers.test_long_linesN)rˆ  r‰  rŠ  r=  r?  rC  rG  r5   r5   r5   r6   r9  Å  s
    r9  c                   @   s˜   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdS )$ÚTestParsersc                 C   sŠ   | j }tddd}tƒ  |¡}W d   ƒ n1 sw   Y  ||d dƒ ||d dƒ || ¡ dƒ |  | ¡ ¡ |  | ¡ t	¡ d S )	Nr(  rN   r   r²   úppp-request@zzz.orgr±   úppp@zzz.orgr`   )
r.   r%   r   r=  rC   rT  rU  r^  rR   r¸   ©r2   r3   r–   r4   r5   r5   r6   Útest_header_parser÷  s   ÿzTestParsers.test_header_parserc                 C   s    | j }tddƒ}tj ¡  |¡}W d   ƒ n1 sw   Y  ||d dƒ ||d dƒ || ¡ dƒ |  | ¡ ¡ |  	| 
¡ t¡ |  	|j
dd	t¡ d S )
Nr(  rŽ  r²   rI  r±   rJ  r`   TrP   )r.   r%   r   r—   rž   r=  rC   rT  rU  r^  rR   r¸   r×   rK  r5   r5   r6   Útest_bytes_header_parser  s   ÿz$TestParsers.test_bytes_header_parserc                 C   sL   t ddƒ}tj ¡  |¡ |  |j¡ W d   ƒ d S 1 sw   Y  d S )Nr(  rŽ  )r%   r   r—   ÚBytesParserr=  rT  Úclosedr   r5   r5   r6   Ú%test_bytes_parser_does_not_close_file  s   "þz1TestParsers.test_bytes_parser_does_not_close_filec                 C   sb   t ddƒ"}tjj}|  tjj|tjjdj	|¡ |  
|j¡ W d   ƒ d S 1 s*w   Y  d S )Nr£  rŽ  rÆ   )r%   r   r—   rN  r†   r   r¥  rÇ   rÛ  r=  rT  rO  )r2   r–   ZbytesParserr5   r5   r6   Ú2test_bytes_parser_on_exception_does_not_close_file  s   
þ"ûz>TestParsers.test_bytes_parser_on_exception_does_not_close_filec                 C   sN   t ddd}tj ¡  |¡ |  |j¡ W d   ƒ d S 1 s w   Y  d S )Nr(  rN   r   )r%   r   r—   r   r=  rT  rO  r   r5   r5   r6   Útest_parser_does_not_close_file  s   "þz+TestParsers.test_parser_does_not_close_filec                 C   sd   t ddd"}tjj}|  tjj|tjjdj	|¡ |  
|j¡ W d   ƒ d S 1 s+w   Y  d S )Nr£  rN   r   rÆ   )r%   r   r—   r   r†   r   r¥  rÇ   rÛ  r=  rT  rO  )r2   r–   r—   r5   r5   r6   Ú,test_parser_on_exception_does_not_close_file   s   
ÿ"üz8TestParsers.test_parser_on_exception_does_not_close_filec                 C   ó>   | j }t d¡}||d dƒ ||d dƒ || ¡ dƒ d S )Nz¤From: aperson@dom.ain
To: bperson@dom.ain
Subject: the next line has a space on it
 
Date: Mon, 8 Apr 2002 15:09:19 -0400
Message-ID: spam

Here's the message body
rñ  ú!the next line has a space on it
 rþ  ÚspamúHere's the message body
©r.   r   rÝ   rR   r1   r5   r5   r6   Útest_whitespace_continuation'  ó
   

z(TestParsers.test_whitespace_continuationc                 C   rT  )Nz¤From: aperson@dom.ain
To: bperson@dom.ain
Date: Mon, 8 Apr 2002 15:09:19 -0400
Message-ID: spam
Subject: the next line has a space on it
 

Here's the message body
rñ  rU  rþ  rV  rW  rX  r1   r5   r5   r6   Ú(test_whitespace_continuation_last_header9  rZ  z4TestParsers.test_whitespace_continuation_last_headerc                 C   s”   | j }tdddd}tƒ  |¡}W d   ƒ n1 sw   Y  |t| ¡ ƒdƒ | d¡}|| ¡ dƒ || ¡ dƒ | d	¡}|| ¡ d
ƒ d S )Nr  rN   r)   r  r¡   r   r:   z!Simple email with attachment.

ru   zapplication/riscos)r.   r%   r   r=  r  rR   rC   )r2   r3   r–   r4   Úpart1Úpart2r5   r5   r6   Útest_crlf_separationK  s   ÿ

z TestParsers.test_crlf_separationc                 C   sp   t dddd}| ¡ }W d   ƒ n1 sw   Y  t |¡}tƒ }t|ƒ}|j|dd |  | ¡ |¡ d S )Nr  rN   r)   r  rÃ   rÄ   rC  rD  r5   r5   r6   Útest_crlf_flattenV  s   
ÿ
zTestParsers.test_crlf_flattenNc           	      C   s>  | j }| j}tddd}t |¡}W d   ƒ n1 sw   Y  || ¡ dƒ |t| ¡ ƒdƒ | d¡}|| ¡ dƒ || ¡ dƒ |t| ¡ ƒdƒ | d¡}|| ¡ dƒ || ¡ dƒ || ¡ d	ƒ | d¡}|| ¡ dƒ || ¡ dƒ |t| ¡ ƒdƒ | d¡}|| ¡ dƒ || ¡ dƒ || ¡ d
ƒ d S )Nr)  rN   r   ru   r¡   r   r!  r:   r  r  )	r.   r¥  r%   r   r  rU  r  rR   rC   )	r2   r3   r²  r–   r4   r\  Zpart1ar]  Zpart2ar5   r5   r6   Ú-test_multipart_digest_with_extra_mime_headersb  s.   ÿ



z9TestParsers.test_multipart_digest_with_extra_mime_headersc                 C   s,   g d¢}t  t |¡¡}|  |d d¡ d S )N)z$From: Andrew Person <aperson@dom.ainzSubject: Testz%Date: Tue, 20 Aug 2002 16:43:45 +1000ÚdatezTue, 20 Aug 2002 16:43:45 +1000)r   rÝ   r¼   r½   r.   )r2   r¿   r4   r5   r5   r6   Útest_three_lines  s   zTestParsers.test_three_linesc                 C   sH   | j }d}d}d||f }t |¡}|| d¡|ƒ || d¡|ƒ d S )Nr¬   z	more textz'Header: %s
Next-Header: %s

Body

r   zNext-Header)r.   r   rÝ   Úget)r2   r3   Zvalue1Zvalue2rÐ   r4   r5   r5   r6   Ú3test_strip_line_feed_and_carriage_return_in_headers‰  s   ÿ
z?TestParsers.test_strip_line_feed_and_carriage_return_in_headersc                 C   sP   | j }d}t |¡}|t|ƒdƒ |tdd„ |D ƒƒg d¢ƒ || ¡ dƒ d S )Nz(>From: foo
From: bar
!"#QUX;~: zoo

bodyr¢   c                 s   ó    | ]}|V  qd S r[   r5   )ro   Zfieldr5   r5   r6   rÓ  ™  ó   € z9TestParsers.test_rfc2822_header_syntax.<locals>.<genexpr>)z!"#QUX;~z>Fromr°   rº  )r.   r   rÝ   r  rW  rR   r  r5   r5   r6   Útest_rfc2822_header_syntax”  s   
z&TestParsers.test_rfc2822_header_syntaxc                 C   s*   | j }d}t |¡}|t| ¡ ƒdƒ d S )Nz<>From foo@example.com 11:25:53
From: bar
!"#QUX;~: zoo

bodyr   )r.   r   rÝ   r  rV  r  r5   r5   r6   Ú(test_rfc2822_space_not_allowed_in_headerœ  s   
z4TestParsers.test_rfc2822_space_not_allowed_in_headerc                 C   sD   | j }d}t |¡}| ¡ }| ¡  ||g d¢ƒ || ¡ dƒ d S )Nz7A: first header
B: second header
CC: third header

body)ÚAÚBZCCrº  )r.   r   rÝ   rV  ÚsortrR   )r2   r3   rÐ   r4   Zheadersr5   r5   r6   Ú!test_rfc2822_one_character_header¢  s   
z-TestParsers.test_rfc2822_one_character_headerc                 C   s,   d}t  |¡}|  | d¡ ¡  d¡¡ d S )Nz°From: foo@bar.com
To: baz
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary=BOUNDARY

--BOUNDARY
Content-Type: text/plain

body ending with CRLF newline

--BOUNDARY--
r   rÃ   )r   rÝ   rº   rR   r  ©r2   rÐ   r4   r5   r5   r6   Útest_CRLFLF_at_end_of_part«  s   ÿ
z&TestParsers.test_CRLFLF_at_end_of_part)rˆ  r‰  rŠ  rL  rM  rP  rQ  rR  rS  rY  r[  r^  r_  r  r`  rb  rd  rg  rh  rl  rn  r5   r5   r5   r6   rH  õ  s&    
	rH  c                   @   s‚  e Zd Ze d¡Zdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdZd dd„ eD ƒ¡d  d¡Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Ze d*¡ d¡Zd+d,„ Zd-d.„ Ze d/¡Zd0d1„ Zd2d3„ Z d4d5„ Z!e "d¡Z#d6ge#d7d8…< d e#¡Z#d9d:„ Z$e d;¡ d<¡Z%e d=¡Z&d>d?„ Z'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+dHdI„ Z,dJdK„ Z-dLZ.dLS )MÚTest8BitBytesHandlingz½        From: foo@bar.com
        To: baz
        Mime-Version: 1.0
        Content-Type: text/plain; charset={charset}
        Content-Transfer-Encoding: {cte}

        {bodyline}
        c                 C   sP   | j jdddd d¡}t |¡}|  | ¡ d¡ |  |jddd d¡¡ d S )NrN   rW   õ   pÃ¶stal©r<   r¨   Zbodylineõ   pÃ¶stal
TrP   ©Úbodytest_msgrz  rœ   r   rÎ   r.   rR   rm  r5   r5   r6   Útest_known_8bit_CTEÒ  ó   þþ
ÿz)Test8BitBytesHandling.test_known_8bit_CTEc                 C   óP   | j jdddd d¡}t |¡}|  | ¡ d¡ |  |jddd	 d¡¡ d S )
NZnotavalidcharsetrW   rp  rq  rN   u   pï¿½ï¿½stal
TrP   rr  rs  rm  r5   r5   r6   Útest_unknown_8bit_CTEÛ  rv  z+Test8BitBytesHandling.test_unknown_8bit_CTEc                 C   sP   | j jdddd d¡}t |¡}|  | ¡ d¡ |  |jddd d¡¡ d S )	NrN   r>   õ   p=C3=B6stÃ¡lrq  u   p=C3=B6stÃ¡l
TrP   õ	   pÃ¶stÃ¡l
rs  rm  r5   r5   r6   Útest_8bit_in_quopri_bodyä  s   
þþ
ÿz.Test8BitBytesHandling.test_8bit_in_quopri_bodyc                 C   rw  )
Nr›   r>   ry  rq  rN   u   p=C3=B6stï¿½ï¿½l
TrP   rz  rs  rm  r5   r5   r6   Ú.test_invalid_8bit_in_non_8bit_cte_uses_replaceö  s   þþ
ÿzDTest8BitBytesHandling.test_invalid_8bit_in_non_8bit_cte_uses_replacec                 C   sT   | j jdddd d¡}t |¡}|  |jddd d¡¡ |  |jd t	j
¡ d S )	NrN   rO   u   cMO2c3RhbAÃ¡=rq  TrP   rp  r   )rt  rz  rœ   r   rÎ   r.   rR   r^  r_  r   r`  rm  r5   r5   r6   Útest_8bit_in_base64_body  s   þþ
ÿÿz.Test8BitBytesHandling.test_8bit_in_base64_bodyc                 C   s@   | j jdddd d¡}t |¡}|  |jddd d¡¡ d S )NrN   r¥   u   <,.V<W1A; Ã¡ rq  TrP   u   <,.V<W1A; Ã¡ 
rs  rm  r5   r5   r6   Útest_8bit_in_uuencode_body  s   þþ
ÿz0Test8BitBytesHandling.test_8bit_in_uuencode_body))zFrom: foo@bar.com©r°   râ  )u   To: bÃ¡z)r³   z=?unknown-8bit?q?b=C3=A1z?=)uV   Subject: Maintenant je vous prÃ©sente mon collÃ¨gue, le pouf cÃ©lÃ¨bre
	Jean de Baddie)rƒ  z†=?unknown-8bit?q?Maintenant_je_vous_pr=C3=A9sente_mon_coll=C3=A8gue=2C_le_pouf_c=C3=A9l=C3=A8bre?=
 =?unknown-8bit?q?_Jean_de_Baddie?=)u   From: gÃ¶st)r°   z=?unknown-8bit?b?Z8O2c3Q=?=r)   c                 C   r'  r5   r5   )ro   ÚsrcÚ_r5   r5   r6   rq   (  rr   z Test8BitBytesHandling.<listcomp>z
Yes, they are flying.
rN   c                 C   s:   t  | j¡}|  t| d¡ƒd¡ |  t|d ƒd¡ d S )Nr±   õ   bï¿½ï¿½z)r   rÎ   Úheadertest_msgr.   r¸   rc  r]   r5   r5   r6   Útest_get_8bit_header+  s   z*Test8BitBytesHandling.test_get_8bit_headerc                 C   s8   t  | j¡}|  t|ƒt d¡jdd„ | jD ƒŽ ¡ d S )Nzä                            From: {}
                            To: {}
                            Subject: {}
                            From: {}

                            Yes, they are flying.
                            c                 S   s   g | ]\}}|d  ‘qS )ru   r5   )ro   r  rÒ   r5   r5   r6   rq   :  s    zATest8BitBytesHandling.test_print_8bit_headers.<locals>.<listcomp>)	r   rÎ   rƒ  r.   r¸   rÌ   rÍ   rz  Úheadertest_headersr]   r5   r5   r6   Útest_print_8bit_headers0  s   
ÿùÿz-Test8BitBytesHandling.test_print_8bit_headersc                 C   ó.   t  | j¡}|  dd„ | ¡ D ƒg d¢¡ d S )Nc                 S   r  r5   ©r¸   r‘  r5   r5   r6   rq   ?  rr   zGTest8BitBytesHandling.test_values_with_8bit_headers.<locals>.<listcomp>)râ  r‚  õ]   Maintenant je vous prï¿½ï¿½sente mon collï¿½ï¿½gue, le pouf cï¿½ï¿½lï¿½ï¿½bre
	Jean de Baddieõ	   gï¿½ï¿½st)r   rÎ   rƒ  ÚassertListEqualrW  r]   r5   r5   r6   Útest_values_with_8bit_headers=  ó   ÿz3Test8BitBytesHandling.test_values_with_8bit_headersc                 C   r‡  )Nc                 S   s    g | ]\}}t |ƒt |ƒf‘qS r5   rˆ  )ro   rb  r´  r5   r5   r6   rq   J  s     zFTest8BitBytesHandling.test_items_with_8bit_headers.<locals>.<listcomp>)r  )r³   r‚  )rƒ  r‰  )r°   rŠ  )r   rÎ   rƒ  r‹  r„   r]   r5   r5   r6   Útest_items_with_8bit_headersH  r  z2Test8BitBytesHandling.test_items_with_8bit_headersc                 C   s0   t  | j¡}|  dd„ | d¡D ƒddg¡ d S )Nc                 S   r  r5   rˆ  r‘  r5   r5   r6   rq   V  rr   zHTest8BitBytesHandling.test_get_all_with_8bit_headers.<locals>.<listcomp>r²   râ  rŠ  )r   rÎ   rƒ  r‹  r0   r]   r5   r5   r6   Útest_get_all_with_8bit_headersT  s   ÿÿz4Test8BitBytesHandling.test_get_all_with_8bit_headersc                 C   sJ   t  t d¡ d¡¡}|  | ¡ d¡ |  | ¡ d¡ |  | ¡ d¡ d S )NuA               Content-Type: text/plÂ§in; charset=utf-8
            rr  u   text/plï¿½inr¬   u   plï¿½in)	r   rÎ   rÌ   rÍ   rœ   r.   rC   r0  r>  r]   r5   r5   r6   Útest_get_content_type_with_8bitZ  s   þz5Test8BitBytesHandling.test_get_content_type_with_8bitc                 C   sX   t  d d¡¡}|  |jddg d¢¡ |  |jdddd¡ |  |jdddd ¡ d S )	Nu(   X-Header: foo=Â§ne; bÂ§r=two; baz=three
rr  ré   rê   ))r§   õ   ï¿½ne)u   bï¿½rrí   rî   ZFoor‘  u   bÂ§r)r   rÎ   rœ   r.   rð   rD   r]   r5   r5   r6   Útest_get_params_with_8bitc  s   ÿÿz/Test8BitBytesHandling.test_get_params_with_8bitc                 C   s,   t  t d¡ d¡¡}|  | d¡d¡ d S )Nõn               Content-Type: text/plain; charset=us-ascii;
             title*=us-ascii'en'This%20is%20not%20fÂ§nrr  Útitle)rH   Úenu   This is not fï¿½n)r   rÎ   rÌ   rÍ   rœ   r.   rD   r]   r5   r5   r6   Ú!test_get_rfc2231_params_with_8bitm  s   ýÿz7Test8BitBytesHandling.test_get_rfc2231_params_with_8bitc                 C   s8   t  t d¡ d¡¡}| dd¡ |  | d¡d¡ d S )Nr“  rr  r”  Útest)r   rÎ   rÌ   rÍ   rœ   r  r.   rD   r]   r5   r5   r6   Ú!test_set_rfc2231_params_with_8bitu  s
   ýz7Test8BitBytesHandling.test_set_rfc2231_params_with_8bitc                 C   sF   t  t d¡ d¡¡}| d¡ |  | d¡d ¡ |  | ¡ d¡ d S )Nr“  rr  r”  r¬   )	r   rÎ   rÌ   rÍ   rœ   r  r.   rD   r0  r]   r5   r5   r6   Ú!test_del_rfc2231_params_with_8bit}  s   ý
z7Test8BitBytesHandling.test_del_rfc2231_params_with_8bitc                 C   s>   t  t d¡ d¡¡}|  | ¡ d¡ |  |jddd¡ d S )Nu†               Content-Transfer-Encoding: bÂ§se64
            Content-Type: text/plain; charset=latin-1

            payload
            rr  zpayload
TrP   s   payload
)r   rÎ   rÌ   rÍ   rœ   r.   rR   r]   r5   r5   r6   Ú%test_get_payload_with_8bit_cte_header†  s
   ûz;Test8BitBytesHandling.test_get_payload_with_8bit_cte_headeru0          From: foo@bar.com
        To: bÃ¡z
        Subject: Maintenant je vous prÃ©sente mon collÃ¨gue, le pouf cÃ©lÃ¨bre
        	Jean de Baddie
        Mime-Version: 1.0
        Content-Type: text/plain; charset="utf-8"
        Content-Transfer-Encoding: 8bit

        Ð”Ð°, Ð¾Ð½Ð¸ Ð»ÐµÑ‚ÑÑ‚.
        c                 C   s:   t  | j¡}tƒ }t j |¡ |¡ |  | ¡ | j¡ d S r[   )	r   rÎ   Únon_latin_bin_msgr   rŸ   r   r“   r.   r”   ©r2   r4   r˜   r5   r5   r6   Útest_bytes_generatorœ  ó   z*Test8BitBytesHandling.test_bytes_generatorc                 C   s6   t j ¡ }tƒ }t j |¡ |¡ |  | ¡ d¡ d S )NrÖ   )	r   r3  r   r   rŸ   r   r“   r.   r”   rœ  r5   r5   r6   Ú&test_bytes_generator_handles_None_body¢  s   
z<Test8BitBytesHandling.test_bytes_generator_handles_None_bodya«          From: foo@bar.com
        To: =?unknown-8bit?q?b=C3=A1z?=
        Subject: =?unknown-8bit?q?Maintenant_je_vous_pr=C3=A9sente_mon_coll=C3=A8gue?=
         =?unknown-8bit?q?=2C_le_pouf_c=C3=A9l=C3=A8bre?=
         =?unknown-8bit?q?_Jean_de_Baddie?=
        Mime-Version: 1.0
        Content-Type: text/plain; charset="utf-8"
        Content-Transfer-Encoding: base64

        0JTQsCwg0L7QvdC4INC70LXRgtGP0YIuCg==
        c                 C   s:   t  | j¡}tƒ }t j |¡ |¡ |  | ¡ | j	¡ d S r[   )
r   rÎ   r›  r   rŸ   r
   r“   r.   r”   Ú non_latin_bin_msg_as7bit_wrappedrœ  r5   r5   r6   Útest_generator_handles_8bit¶  rž  z1Test8BitBytesHandling.test_generator_handles_8bitc                 C   s`   t  | j¡}tƒ }t|ƒ |¡ | ¡ }ttƒ ƒ |¡ tƒ }t|ƒ |¡ |  	| ¡ |¡ d S r[   )
r   rÎ   r›  r   r   r“   r”   r
   r   r.   )r2   r4   r˜   Z
orig_valuer5   r5   r6   Ú;test_str_generator_should_not_mutate_msg_when_handling_8bit¼  s   zQTest8BitBytesHandling.test_str_generator_should_not_mutate_msg_when_handling_8bitc                 C   sn   t  | j¡}tƒ }t j |¡j|dd | ¡  d¡}|  	|d  ¡ d d¡ |  	d 
|dd … ¡| j¡ d S )NTr¶   rÖ   r   s   Fromru   )r   rÎ   r›  r   rŸ   r   r“   r”   r¹   r.   r½   )r2   r4   r˜   r¿   r5   r5   r6   Ú#test_bytes_generator_with_unix_fromÆ  s    z9Test8BitBytesHandling.test_bytes_generator_with_unix_fromzkSubject: =?unknown-8bit?q?Maintenant_je_vous_pr=C3=A9sente_mon_coll=C3=A8gue=2C_le_pouf_c=C3=A9l=C3=A8bre?=r¡   r   c                 C   s–   d}|   t|¡ t|dƒ}| | j¡ W d   ƒ n1 sw   Y  t|dƒ}tj ¡  |¡}W d   ƒ n1 s;w   Y  |  	t
|ƒ| j¡ d S )Nztest.msgÚwbrŽ  )Z
addCleanupr$   ÚopenÚwriter›  r   r—   rN  r=  r.   r¸   Únon_latin_bin_msg_as7bit)r2   rü  ZtestfilerÐ   r5   r5   r6   Útest_message_from_binary_file×  s   ÿÿz3Test8BitBytesHandling.test_message_from_binary_fileu          From: foo@bar.com
        To: Dinsdale
        Subject: Nudge nudge, wink, wink
        Mime-Version: 1.0
        Content-Type: text/plain; charset="latin-1"
        Content-Transfer-Encoding: 8bit

        oh lÃ  lÃ , know what I mean, know what I mean?
        rr  a           From: foo@bar.com
        To: Dinsdale
        Subject: Nudge nudge, wink, wink
        Mime-Version: 1.0
        Content-Type: text/plain; charset="iso-8859-1"
        Content-Transfer-Encoding: quoted-printable

        oh l=E0 l=E0, know what I mean, know what I mean?
        c                 C   s"   t  | j¡}|  t|ƒ| j¡ d S r[   )r   rÎ   Úlatin_bin_msgr.   r¸   Úlatin_bin_msg_as7bitr…  r5   r5   r6   Ú:test_string_generator_reencodes_to_quopri_when_appropriateö  s   zPTest8BitBytesHandling.test_string_generator_reencodes_to_quopri_when_appropriatec                 C   sD   t  | j¡}tƒ }t j |¡ |¡ |  | ¡ | j 	d¡d ¡ d S )Nrr  r)   )
r   rÎ   r©  r   rŸ   r   r“   r.   r”   rQ   )r2   rÐ   r˜   r5   r5   r6   Ú)test_decoded_generator_emits_unicode_bodyú  s   
ÿz?Test8BitBytesHandling.test_decoded_generator_emits_unicode_bodyc                 C   sX   t j ¡ }tdt| jƒdƒD ]}| | j||d … ¡ q| ¡ }|  t	|ƒ| j
¡ d S )Nr   rÕ  )r   rU  r(   rÙ  r  r©  r:  r;  r.   r¸   rª  )r2   ZbfprÒ  rÐ   r5   r5   r6   Útest_bytes_feedparser  s
   
z+Test8BitBytesHandling.test_bytes_feedparserc                 C   sp   t ddƒ}| ¡ }W d   ƒ n1 sw   Y  t |¡}tƒ }tj |¡}|j|dd |  | 	¡ |¡ d S )Nr  rŽ  rÃ   rÄ   )
r%   r‘   r   rÎ   r   rŸ   r   r“   r.   r”   rD  r5   r5   r6   r_    s   
ÿ
z'Test8BitBytesHandling.test_crlf_flattenc                 C   sJ   t  d¡ d¡}t |¡}tƒ }tj |¡}| |¡ |  	| 
¡ |¡ d S )Nuo              Date: Fri, 18 Mar 2011 17:15:43 +0100
            To: foo@example.com
            From: foodwatch-Newsletter <bar@example.com>
            Subject: Aktuelles zu Japan, Klonfleisch und Smiley-System
            Message-ID: <76a486bee62b0d200f33dc2ca08220ad@localhost.localdomain>
            MIME-Version: 1.0
            Content-Type: multipart/alternative;
                    boundary="b1_76a486bee62b0d200f33dc2ca08220ad"

            --b1_76a486bee62b0d200f33dc2ca08220ad
            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit

            Guten Tag, ,

            mit groÃŸer Betroffenheit verfolgen auch wir im foodwatch-Team die
            Nachrichten aus Japan.


            --b1_76a486bee62b0d200f33dc2ca08220ad
            Content-Type: text/html; charset="utf-8"
            Content-Transfer-Encoding: 8bit

            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/html4/loose.dtd">
            <html lang="de">
            <head>
                    <title>foodwatch - Newsletter</title>
            </head>
            <body>
              <p>mit gro&szlig;er Betroffenheit verfolgen auch wir im foodwatch-Team
                 die Nachrichten aus Japan.</p>
            </body>
            </html>
            --b1_76a486bee62b0d200f33dc2ca08220ad--

            rN   )rÌ   rÍ   rœ   r   rÎ   r   rŸ   r   r“   r.   r”   )r2   rÑ   r4   r­   r®   r5   r5   r6   Útest_8bit_multipart  s   %Û
&
z)Test8BitBytesHandling.test_8bit_multipartc                 C   óF   t ƒ }tdƒ|d< tƒ }tj |¡}|j|dd |  | ¡ d¡ d S )Nõ   Å¾luÅ¥ouÄkÃ½ kÅ¯Åˆrƒ  rÃ   rÄ   s5   Subject: =?utf-8?b?xb5sdcWlb3XEjWvDvSBrxa/FiA==?=

)	r   r   r   r   rŸ   r   r“   r.   r”   ©r2   rÐ   r­   r®   r5   r5   r6   Ú'test_bytes_generator_b_encoding_linesepB  ó   þz=Test8BitBytesHandling.test_bytes_generator_b_encoding_linesepc                 C   r¯  )Nr°  rƒ  rÃ   rÄ   z5Subject: =?utf-8?b?xb5sdcWlb3XEjWvDvSBrxa/FiA==?=

)	r   r   r   r   rŸ   r
   r“   r.   r”   r±  r5   r5   r6   Ú!test_generator_b_encoding_linesepN  r³  z7Test8BitBytesHandling.test_generator_b_encoding_linesepN)/rˆ  r‰  rŠ  rÌ   rÍ   rt  ru  rx  r{  r|  r}  r~  r…  r½   rœ   rƒ  r„  r†  rŒ  rŽ  r  r  r’  r–  r˜  r™  rš  r›  r  rŸ  r   r¡  r¢  r£  r¹   r§  r¨  r©  rª  r«  r¬  r­  r_  r®  r²  r´  r  r5   r5   r5   r6   ro  ¿  sf    
	
		
ÿÿ	
	

ö


ÿ
		÷

	.ro  c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )Ú BaseTestBytesGeneratorIdempotentNc                 C   sT   t |dƒ}| ¡ }W d   ƒ n1 sw   Y  | j | j|¡}t |¡}||fS )NrŽ  )r%   r‘   Únormalize_linesep_regexÚsubÚblinesepr   rÎ   r  r5   r5   r6   r/   a  s   
ÿ
z(BaseTestBytesGeneratorIdempotent._msgobjFc                 C   s<   t ƒ }tjj|dd}|j||| jd |  || ¡ ¡ d S )Nr   rô  )r·   rÅ   )r   r   rŸ   r   r“   rÅ   r.   r”   )r2   r4   rT   r·   r  r®   r5   r5   r6   r  h  s   z,BaseTestBytesGeneratorIdempotent._idempotentr@  )rˆ  r‰  rŠ  r  r/   r  r5   r5   r5   r6   rµ  ]  s    rµ  c                   @   ó   e Zd ZdZdZe d¡ZdS )ÚTestBytesGeneratorIdempotentNLr)   rÖ   s   \r\nN©rˆ  r‰  rŠ  rÅ   r¸  ÚreÚcompiler¶  r5   r5   r5   r6   rº  o  ó    rº  c                   @   r¹  )Ú TestBytesGeneratorIdempotentCRLFrÃ   r
  s	   (?<!\r)\nNr»  r5   r5   r5   r6   r¿  v  r¾  r¿  c                   @   r8  )
Ú
TestBase64c                 C   s”   | j }|t d¡ttjdddƒƒ tdƒD ]1}|dkrd}n|dkr&d}n|d	kr-d
}n|dkr4d}n	|dkr;d}nd}|t d| ¡|ƒ qd S )NÚhelloó   hellor*   ©Úeolé   r   r¢   r   r[  r  rŒ  é   r„  é   rb  )r.   r   Úheader_lengthr  Úbody_encoderÙ  )r2   r3   ÚsizeZbsizer5   r5   r6   Útest_len~  s   
ÿùzTestBase64.test_lenc                 C   r€  )Nr*   ó    zaGVsbG8=rÂ  )r.   r   rQ   ry  r5   r5   r6   Útest_decode‹  r}  zTestBase64.test_decodec                 C   sd   | j }|t d¡dƒ |t d¡dƒ |t d¡dƒ |tjddd	d
ƒ |tjdddddƒ d S )NrÌ  r*   rÂ  z	aGVsbG8=
s   hello
z	aGVsbG8K
sd   xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx é(   r´  zŒeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IA==
rÃ   ©rµ  rÄ  zeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgg
eHh4eCB4eHh4IA==
)r.   r   rÉ  ry  r5   r5   r6   Útest_encode  s   ÿzTestBase64.test_encodec                 C   sZ   | j }tj}||dƒdƒ ||dƒdƒ ||dƒdƒ ||dddd	ƒ ||dƒdƒ d S )
NrÁ  z=?iso-8859-1?b?aGVsbG8=?=úhello
worldz!=?iso-8859-1?b?aGVsbG8NCndvcmxk?=úhello
worldz!=?iso-8859-1?b?aGVsbG8Kd29ybGQ=?=rd   r  z=?iso-8859-2?b?aGVsbG8=?=)r.   r   rª  )r2   r3   Úher5   r5   r6   Útest_header_encode¦  s   zTestBase64.test_header_encodeN)rˆ  r‰  rŠ  rË  rÍ  rÐ  rÔ  r5   r5   r5   r6   rÀ  }  s
    rÀ  c                   @   s*  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdˆdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zdˆd&d'„Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,d‰dVdW„Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdS )ŠÚ
TestQuopric                    sÄ   t tttdƒtdƒd ƒttdƒtdƒd ƒttdƒtdƒd ƒdd	„ d
D ƒƒƒˆ _‡ fdd„tdƒD ƒˆ _t ttdƒtdƒd ƒƒˆ _ˆ j tdƒ¡ ˆ j tdƒ¡ ‡ fdd„tdƒD ƒˆ _	d S )NrÖ  Úzru   ri  ÚZrd  Ú9c                 s   re  r[   r5   ©ro   r  r5   r5   r6   rÓ  ¹  rf  z#TestQuopri.setUp.<locals>.<genexpr>s   !*+-/c                    ó   g | ]	}|ˆ j vr|‘qS r5   )ÚhlitrÙ  r  r5   r6   rq   ¼  ó    z$TestQuopri.setUp.<locals>.<listcomp>é   r+   ú~r©  ú=c                    rÚ  r5   )ÚblitrÙ  r  r5   r6   rq   Å  rÜ  )
rò  r   rÙ  ÚordrÛ  Úhnonrà  r¶  ÚremoveÚbnonr  r5   r  r6   r  ²  s   üzTestQuopri.setUpc                 C   óP   | j D ]}|  t |¡dt|ƒ ¡ q| jD ]}|  t |¡dt|ƒ ¡ qd S )Nz'Should not be header quopri encoded: %sz#Should be header quopri encoded: %s)rÛ  rT  r!   Zheader_checkÚchrrâ  rº   ©r2   r  r5   r5   r6   Útest_quopri_header_checkÈ  ó   

ÿ

ÿÿz#TestQuopri.test_quopri_header_checkc                 C   rå  )Nz%Should not be body quopri encoded: %sz!Should be body quopri encoded: %s)rà  rT  r!   Z
body_checkræ  rä  rº   rç  r5   r5   r6   Útest_quopri_body_checkÐ  ré  z!TestQuopri.test_quopri_body_checkc                 C   sä   | j }|t d¡dƒ |ttjdddƒt d¡d ƒ |t d¡dƒ |ttjdddƒt d¡d ƒ | jD ]}|t t|gƒ¡dd	t|ƒ ƒ q8| jD ]}|t	d
ƒkrWqN|t t|gƒ¡ddt|ƒ ƒ qN|t d¡dƒ d S )NrÂ  ru  Zxxxr  rÕ  s
   h@e@l@l@o@rÇ  ru   zexpected length 1 for %rr+   r¢   zexpected length 3 for %ró    )
r.   r!   rÈ  r  rª  rÛ  r×   ræ  râ  rá  ©r2   r3   r  r5   r5   r6   Útest_header_quopri_lenØ  s0   þÿþÿ

ÿ

ÿz!TestQuopri.test_header_quopri_lenc                 C   sN   | j }| jD ]}|t t|gƒ¡dƒ q| jD ]}|t t|gƒ¡dƒ qd S )Nru   r¢   )r.   rà  r!   Zbody_lengthr×   rä  rì  r5   r5   r6   Útest_body_quopri_lenñ  s   

ÿzTestQuopri.test_body_quopri_lenc                 C   s2   t dƒD ]}t|ƒ}|  t t |¡¡|¡ qd S )NrÝ  )rÙ  ræ  r.   r!   rù   Úquote)r2   rb  r  r5   r5   r6   Útest_quote_unquote_idempotentø  s   þz(TestQuopri.test_quote_unquote_idempotentNc                 C   s0   |d u r
t  |¡}nt  ||¡}|  ||¡ d S r[   )r!   rª  r.   )r2   rˆ   Zexpected_encoded_headerr<   Úencoded_headerr5   r5   r6   Ú_test_header_encodeý  s   zTestQuopri._test_header_encodec                 C   ó   |   dd¡ d S )NrÌ  r*   ©rò  r  r5   r5   r6   Útest_header_encode_null  ó   z"TestQuopri.test_header_encode_nullc                 C   ró  )NrÂ  z=?iso-8859-1?q?hello?=rô  r  r5   r5   r6   Útest_header_encode_one_word  rö  z&TestQuopri.test_header_encode_one_wordc                 C   ró  )Ns   hello
worldz=?iso-8859-1?q?hello=0Aworld?=rô  r  r5   r5   r6   Útest_header_encode_two_lines
  ó   ÿz'TestQuopri.test_header_encode_two_linesc                 C   ró  )Ns   helloÇtherez=?iso-8859-1?q?hello=C7there?=rô  r  r5   r5   r6   Útest_header_encode_non_ascii  rù  z'TestQuopri.test_header_encode_non_asciic                 C   ó   | j dddd d S )NrÂ  z=?iso-8859-2?q?hello?=rd   r  rô  r  r5   r5   r6   Útest_header_encode_alt_charset  s   
ÿz)TestQuopri.test_header_encode_alt_charsetc                 C   s   t  |¡}|  ||¡ d S r[   )r!   Úheader_decoder.   )r2   rñ  Zexpected_decoded_headerZdecoded_headerr5   r5   r6   Ú_test_header_decode  s   
zTestQuopri._test_header_decodec                 C   ó   |   dd¡ d S ©Nr*   ©rþ  r  r5   r5   r6   Útest_header_decode_null  rö  z"TestQuopri.test_header_decode_nullc                 C   rÿ  ©NrÁ  r  r  r5   r5   r6   Útest_header_decode_one_word  rö  z&TestQuopri.test_header_decode_one_wordc                 C   ró  )Nzhello=0AworldrÒ  r  r  r5   r5   r6   Útest_header_decode_two_lines   rö  z'TestQuopri.test_header_decode_two_linesc                 C   ró  )Nzhello=C7thereu   helloÃ‡therer  r  r5   r5   r6   Útest_header_decode_non_ascii#  rö  z'TestQuopri.test_header_decode_non_asciic                 C   r|  )Na  =30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30=30A  00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)r.   r!   rý  r  r5   r5   r6   Útest_header_decode_re_bug_18380&  s   z*TestQuopri.test_header_decode_re_bug_18380c                 C   s2   |d u r
t  |¡}nt j||d}|  ||¡ d S )NrÃ  )r!   rQ   r.   )r2   ÚencodedZexpected_decodedrÄ  Údecodedr5   r5   r6   Ú_test_decode*  s   zTestQuopri._test_decodec                 C   rÿ  r   ©r
  r  r5   r5   r6   Útest_decode_null_word1  rö  z TestQuopri.test_decode_null_wordc                 C   ró  )NrÃ   r)   r  r  r5   r5   r6   Útest_decode_null_line_null_word4  rö  z*TestQuopri.test_decode_null_line_null_wordc                 C   rÿ  r  r  r  r5   r5   r6   Útest_decode_one_word7  rö  zTestQuopri.test_decode_one_wordc                 C   s   | j dddd d S )NrÁ  ÚXrÃ  r  r  r5   r5   r6   Útest_decode_one_word_eol:  ó   z#TestQuopri.test_decode_one_word_eolc                 C   ró  ©Núhello
úhello
r  r  r5   r5   r6   Útest_decode_one_line=  rö  zTestQuopri.test_decode_one_linec                 C   rÿ  ©Nr  r  r  r5   r5   r6   Útest_decode_one_line_lf@  rö  z"TestQuopri.test_decode_one_line_lfc                 C   ró  )Nzhellor  r  r  r5   r5   r6   Útest_decode_one_line_crC  rö  z"TestQuopri.test_decode_one_line_crc                 C   rû  )Nr  ÚhelloXr  rÃ  r  r  r5   r5   r6   Útest_decode_one_line_nlF  r  z"TestQuopri.test_decode_one_line_nlc                 C   rû  )Nr  r  r  rÃ  r  r  r5   r5   r6   Útest_decode_one_line_crnlI  r  z$TestQuopri.test_decode_one_line_crnlc                 C   ró  )NrÑ  rÒ  r  r  r5   r5   r6   Útest_decode_one_line_one_wordL  rö  z(TestQuopri.test_decode_one_line_one_wordc                 C   rû  )NrÑ  ZhelloXworldr  rÃ  r  r  r5   r5   r6   Ú!test_decode_one_line_one_word_eolO  r  z,TestQuopri.test_decode_one_line_one_word_eolc                 C   ró  )Núhello
world
úhello
world
r  r  r5   r5   r6   Útest_decode_two_linesR  rö  z TestQuopri.test_decode_two_linesc                 C   rû  )Nr  ZhelloXworldXr  rÃ  r  r  r5   r5   r6   Útest_decode_two_lines_eolU  r  z$TestQuopri.test_decode_two_lines_eolc                 C   rÿ  )NAè  SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamr  r  r5   r5   r6   Útest_decode_one_long_lineX  rö  z$TestQuopri.test_decode_one_long_linec                 C   ró  )Nr+   r*   r  r  r5   r5   r6   Útest_decode_one_space[  rö  z TestQuopri.test_decode_one_spacec                 C   ró  )Nz     r*   r  r  r5   r5   r6   Útest_decode_multiple_spaces^  rö  z&TestQuopri.test_decode_multiple_spacesc                 C   ró  )Nzhello    
r  r  r  r5   r5   r6   Ú$test_decode_one_line_trailing_spacesa  rö  z/TestQuopri.test_decode_one_line_trailing_spacesc                 C   ró  )Nzhello    
world   
r  r  r  r5   r5   r6   Ú%test_decode_two_lines_trailing_spacesd  rö  z0TestQuopri.test_decode_two_lines_trailing_spacesc                 C   ró  )Nz=22quoted=20words=22z"quoted words"r  r  r5   r5   r6   Útest_decode_quoted_wordg  rö  z"TestQuopri.test_decode_quoted_wordc                 C   ró  )Nzab=CD=EFõ   abÃÃ¯r  r  r5   r5   r6   Útest_decode_uppercase_quotingj  rö  z(TestQuopri.test_decode_uppercase_quotingc                 C   ró  )Nzab=cd=efr(  r  r  r5   r5   r6   Útest_decode_lowercase_quotingm  rö  z(TestQuopri.test_decode_lowercase_quotingc                 C   ró  )Nzsoft line=
breakzsoft linebreakr  r  r5   r5   r6   Útest_decode_soft_line_breakp  rö  z&TestQuopri.test_decode_soft_line_breakc                 C   rÿ  )NzA=1,B=A ==> A+B==2r  r  r5   r5   r6   Útest_decode_false_quotings  rö  z$TestQuopri.test_decode_false_quotingc                 C   s„   i }|d u r	d}n||d< |d u rd}n||d< t j|fi |¤Ž}|  ||¡ |dks/|dkr>| ¡ D ]}|  t|ƒ|¡ q3d S d S )Nr’  rµ  r)   rÄ  rÃ   )r!   rÉ  r.   rì  r•  r  )r2   rº  Zexpected_encoded_bodyrµ  rÄ  ÚkwargsZencoded_bodyr¼  r5   r5   r6   Ú_test_encodev  s   üzTestQuopri._test_encodec                 C   rÿ  r   ©r.  r  r5   r5   r6   Útest_encode_nullŠ  rö  zTestQuopri.test_encode_nullc                 C   rÿ  )Nz

r/  r  r5   r5   r6   Útest_encode_null_lines  rö  z!TestQuopri.test_encode_null_linesc                 C   rÿ  r  r/  r  r5   r5   r6   Útest_encode_one_line  rö  zTestQuopri.test_encode_one_linec                 C   ró  r  r/  r  r5   r5   r6   Útest_encode_one_line_crlf“  rö  z$TestQuopri.test_encode_one_line_crlfc                 C   rû  )Nr  r  rÃ   rÃ  r/  r  r5   r5   r6   Útest_encode_one_line_eol–  r  z#TestQuopri.test_encode_one_line_eolc                 C   s    | j d d¡ d¡ddd d S )Nu   helloÏ…
rN   Úlatin1zhello=CF=85
rÃ   rÃ  )r.  rœ   rQ   r  r5   r5   r6   Ú(test_encode_one_line_eol_after_non_ascii™  s   
ÿz3TestQuopri.test_encode_one_line_eol_after_non_asciic                 C   ró  )Nr+   z=20r/  r  r5   r5   r6   Útest_encode_one_spacež  rö  z TestQuopri.test_encode_one_spacec                 C   ró  )Nz 
z=20
r/  r  r5   r5   r6   Útest_encode_one_line_one_space¡  rö  z)TestQuopri.test_encode_one_line_one_spacec                 C   ró  )Nz 
 
z=20
=20
r/  r  r5   r5   r6   Útest_encode_two_lines_one_space©  rö  z*TestQuopri.test_encode_two_lines_one_spacec                 C   ró  )Nzhello   z
hello  =20r/  r  r5   r5   r6   Ú$test_encode_one_word_trailing_spaces¬  rö  z/TestQuopri.test_encode_one_word_trailing_spacesc                 C   ró  )Nz	hello   
zhello  =20
r/  r  r5   r5   r6   Ú$test_encode_one_line_trailing_spaces¯  rö  z/TestQuopri.test_encode_one_line_trailing_spacesc                 C   ró  )Nzhello  	z
hello  =09r/  r  r5   r5   r6   Ú!test_encode_one_word_trailing_tab²  rö  z,TestQuopri.test_encode_one_word_trailing_tabc                 C   ró  )Nz	hello  	
zhello  =09
r/  r  r5   r5   r6   Ú!test_encode_one_line_trailing_tabµ  rö  z,TestQuopri.test_encode_one_line_trailing_tabc                 C   rû  )Nú
abcd 
1234zabcd =

1234r[  r´  r/  r  r5   r5   r6   Ú,test_encode_trailing_space_before_maxlinelen¸  r  z7TestQuopri.test_encode_trailing_space_before_maxlinelenc                 C   rû  )Nr>  zabcd=
=20
1234ru  r´  r/  r  r5   r5   r6   Ú(test_encode_trailing_space_at_maxlinelen»  r  z3TestQuopri.test_encode_trailing_space_at_maxlinelenc                 C   rû  )Nr>  zabc=
d=20
1234r   r´  r/  r  r5   r5   r6   Ú,test_encode_trailing_space_beyond_maxlinelen¾  r  z7TestQuopri.test_encode_trailing_space_beyond_maxlinelenc                 C   ró  )Nz
 
 
 
 
 
z=20
=20
=20
=20
=20
r/  r  r5   r5   r6   Útest_encode_whitespace_linesÁ  rö  z'TestQuopri.test_encode_whitespace_linesc                 C   ró  )Nza = bza =3D br/  r  r5   r5   r6   Útest_encode_quoted_equalsÄ  rö  z$TestQuopri.test_encode_quoted_equalsc                 C   ró  )NZdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
xxxxxxxxxxxxxxxxxxxxxxxxxr/  r  r5   r5   r6   Útest_encode_one_long_stringÇ  rö  z&TestQuopri.test_encode_one_long_stringc                 C   ró  )Nzexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
zgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
xxxxxxxxxxxxxxxxxxxxxxxxx
r/  r  r5   r5   r6   Útest_encode_one_long_lineÊ  rö  z$TestQuopri.test_encode_one_long_linec                 C   ró  )NzÉxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
zÍxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
r/  r  r5   r5   r6   Útest_encode_one_very_long_lineÍ  rù  z)TestQuopri.test_encode_one_very_long_linec                 C   rû  )Nz=====z=3D=
=3D=
=3D=
=3D=
=3Dr   r´  r/  r  r5   r5   r6   Útest_encode_shortest_maxlinelenÑ  r  z*TestQuopri.test_encode_shortest_maxlinelenc                 C   s   | j t| jdddd d S )Nr*   r¢   r´  )r†   r  r.  r  r5   r5   r6   Ú test_encode_maxlinelen_too_smallÔ  s   z+TestQuopri.test_encode_maxlinelen_too_smallc                 C   st   | j }|t d¡dƒ |t d¡dƒ |t d¡dƒ |tjddddƒ |tjddd	d
dƒ |t d¡dƒ d S )Nr*   rÁ  rÑ  rÒ  údxxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx rÎ  r´  zjxxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx=
 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxx=
x xxxx xxxx xxxx xxxx=20rÃ   rÏ  zlxxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx=
 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxx=
x xxxx xxxx xxxx xxxx=20zone line

two line)r.   r!   rÉ  ry  r5   r5   r6   rÐ  ×  s   ÿ
ýzTestQuopri.test_encoder[   )NN)Frˆ  r‰  rŠ  r  rè  rê  rí  rî  rð  rò  rõ  r÷  rø  rú  rü  rþ  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r)  r*  r+  r,  r.  r0  r1  r2  r3  r4  r6  r7  r8  r9  r:  r;  r<  r=  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rÐ  r5   r5   r5   r6   rÕ  ±  sˆ    


rÕ  c                   @   r8  )
ÚTestCharsetc                 C   s0   ddl m} z|jd= W d S  ty   Y d S w )Nr   r  Úfake)r   r<   ZCHARSETSrY  )r2   ÚCharsetModuler5   r5   r6   ÚtearDownô  s   ÿzTestCharset.tearDownc                 C   sN   | j }tdƒ}|| d¡dƒ d}|  t|j|¡ tdƒ}|| |¡dƒ d S )NrH   úHello World!u   Â¤Â¢Â¤Â¤Â¤Â¦Â¤Â¨Â¤ÂªrN   z(=?utf-8?b?wqTCosKkwqTCpMKmwqTCqMKkwqo=?=)r.   r	   rª  r†   r±  )r2   r3   r  r­   r5   r5   r6   Útest_codec_encodeableû  s   z!TestCharset.test_codec_encodeablec                 C   s   | j }tdƒ}|d| d¡ƒ tdƒ}|d| d¡ƒ tdƒ}|d| d¡ƒ td	ƒ}d
dlm} | d|jd d¡ tdƒ}|d| d¡ƒ d S )Nr8   zhello w=F6rldu   hello wÃ¶rldrN   rú  r¦   rH   r›  rŸ  r   r  rK  )r.   r	   rÉ  r   r<   Zadd_charsetZQP)r2   r3   r  rL  r5   r5   r6   Útest_body_encode  s   zTestCharset.test_body_encodec                 C   s,   t dƒ}|  t|ƒd¡ |  tjt d¡ d S )NrH   u   ascÃ¿ii)r	   r.   r¸   r†   r   ZCharsetErrorrø  r5   r5   r6   Útest_unicode_charset_name%  s   z%TestCharset.test_unicode_charset_nameN)rˆ  r‰  rŠ  rM  rO  rP  rQ  r5   r5   r5   r6   rJ  ó  s
    rJ  c                   @   sÔ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3S )4Ú
TestHeaderc                 C   ó8   | j }tdƒ}|| ¡ dƒ | d¡ || ¡ dƒ d S )NrN  z Goodbye World!zHello World!  Goodbye World!©r¥  r   rœ   r¶  rÁ  r5   r5   r6   Útest_simple.  ó
   
zTestHeader.test_simplec                 C   rS  )NrN  zGoodbye World!zHello World! Goodbye World!rT  rÁ  r5   r5   r6   Útest_simple_surprise5  rV  zTestHeader.test_simple_surprisec                 C   s   d}|   t|ƒ|d fg¡ d S )Nzno decoding neededrØ  rË  r5   r5   r6   Útest_header_needs_no_decoding<  s   z(TestHeader.test_header_needs_no_decodingc                 C   s8   t ddd}|jdd d¡D ]
}|  t|ƒd¡ qd S )Na¶  I am the very model of a modern Major-General; I've information vegetable, animal, and mineral; I know the kings of England, and I quote the fights historical from Marathon to Waterloo, in order categorical; I'm very well acquainted, too, with matters mathematical; I understand equations, both the simple and quadratical; about binomial theorem I'm teeming with a lot o' news, with many cheerful facts about the square of the hypotenuse.r’  r´  r+   )Z
splitcharsz
 )r   rœ   r¹   r•  r  )r2   r­  Úlr5   r5   r6   Ú	test_long@  s   ÿÿzTestHeader.test_longc                 C   sæ   | j }tdƒ}tdƒ}tdƒ}d}d}d}t||ƒ}| ||¡ | ||¡ |jdd}	||	d	ƒ t|	ƒ}
|t|
ƒd
ƒ ||
d |dfƒ ||
d |dfƒ ||
d | d¡dfƒ t|ƒ}||d d¡ƒ t	t|	ƒƒ}|||ƒ d S )Nr8   rd   rN   r¯  r°  r±  r’  r´  a  =?iso-8859-1?q?Die_Mieter_treten_hier_ein_werden_mit_einem_Foerderband_kom?=
 =?iso-8859-1?q?fortabel_den_Korridor_entlang=2C_an_s=FCdl=FCndischen_Wand?=
 =?iso-8859-1?q?gem=E4lden_vorbei=2C_gegen_die_rotierenden_Klingen_bef=F6r?=
 =?iso-8859-1?q?dert=2E_?= =?iso-8859-2?q?Finan=E8ni_metropole_se_hroutily?=
 =?iso-8859-2?q?_pod_tlakem_jejich_d=F9vtipu=2E=2E_?= =?utf-8?b?5q2j56K6?=
 =?utf-8?b?44Gr6KiA44GG44Go57+76Kiz44Gv44GV44KM44Gm44GE44G+44Gb44KT44CC?=
 =?utf-8?b?5LiA6YOo44Gv44OJ44Kk44OE6Kqe44Gn44GZ44GM44CB44GC44Go44Gv44Gn?=
 =?utf-8?b?44Gf44KJ44KB44Gn44GZ44CC5a6f6Zqb44Gr44Gv44CMV2VubiBpc3QgZGFz?=
 =?utf-8?b?IE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5k?=
 =?utf-8?b?IGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC7jgI3jgajoqIA=?=
 =?utf-8?b?44Gj44Gm44GE44G+44GZ44CC?=r¢   r   ru   r¡   sâ  Die Mieter treten hier ein werden mit einem Foerderband komfortabel den Korridor entlang, an sÃ¼dlÃ¼ndischen WandgemÃ¤lden vorbei, gegen die rotierenden Klingen befÃ¶rdert. FinanÄni metropole se hroutily pod tlakem jejich dÅ¯vtipu.. æ­£ç¢ºã«è¨€ã†ã¨ç¿»è¨³ã¯ã•ã‚Œã¦ã„ã¾ã›ã‚“ã€‚ä¸€éƒ¨ã¯ãƒ‰ã‚¤ãƒ„èªžã§ã™ãŒã€ã‚ã¨ã¯ã§ãŸã‚‰ã‚ã§ã™ã€‚å®Ÿéš›ã«ã¯ã€ŒWenn ist das Nunstuck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput.ã€ã¨è¨€ã£ã¦ã„ã¾ã™ã€‚)
r¥  r	   r   r¶  rœ   r   r  r¸   rQ   r   )r2   r3   r®   r·  r¸  r¹  rº  r»  r­  Úencr	  ZustrZnewhr5   r5   r6   Útest_multilingualF  s0   

ïzTestHeader.test_multilingualc                 C   r  r   rÊ  rË  r5   r5   r6   Útest_empty_header_encode…  r«   z#TestHeader.test_empty_header_encodec                 C   s4   | j }tƒ }||dƒ | dtdƒ¡ ||dƒ d S )Nr*   r§   r8   )r¥  r   r¶  r	   rÁ  r5   r5   r6   Útest_header_ctor_default_args‰  s
   
z(TestHeader.test_header_ctor_default_argsc                 C   s„   | j }d}t|ƒ}|| ¡ dƒ |t|ƒ|ƒ t|dd}|| ¡ dƒ |t|ƒ|ƒ t|ddd}|| ¡ |ƒ |t|ƒ|ƒ d S )Nz|A very long line that must get split to something other than at the 76th character boundary to test the non-default behaviorz}A very long line that must get split to something other than at the 76th
 character boundary to test the non-default behaviorrƒ  r²  z}A very long line that must get split to something other than at the
 76th character boundary to test the non-default behaviori   )rµ  r³  )r¥  r   rœ   r¸   r¬  r5   r5   r6   Útest_explicit_maxlinelen  s   z#TestHeader.test_explicit_maxlinelenc                 C   sŠ   | j }tddd}d}| |¡ | ¡ }||dƒ ||ttt|ƒƒƒƒ tddd}| d¡ | ¡ }||dƒ ||ttt|ƒƒƒƒ d S )Nr8   rÇ  ©r<   rµ  rI  a  =?iso-8859-1?q?xxx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_x?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?x_?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?xx?=
 =?iso-8859-1?q?_?=rÎ  zÁ=?iso-8859-1?q?xxxx_xxxx_xxxx_xxxx_xxx?=
 =?iso-8859-1?q?x_xxxx_xxxx_xxxx_xxxx_?=
 =?iso-8859-1?q?xxxx_xxxx_xxxx_xxxx_xx?=
 =?iso-8859-1?q?xx_xxxx_xxxx_xxxx_xxxx?=
 =?iso-8859-1?q?_xxxx_xxxx_?=©r¥  r   r¶  rœ   r¸   r   r   ©r2   r3   r­  rb  r­   r5   r5   r6   Útest_quopri_splittable£  s   

3

z!TestHeader.test_quopri_splittablec                 C   sŠ   | j }tddd}d}| |¡ | ¡ }||dƒ ||ttt|ƒƒƒƒ tddd}| |¡ | ¡ }||dƒ ||ttt|ƒƒƒƒ d S )Nre   rÇ  r`  rI  a„  =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IHh4?=
 =?koi8-r?b?eHgg?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?eCB4?=
 =?koi8-r?b?eHh4?=
 =?koi8-r?b?IA==?=rÎ  zà=?koi8-r?b?eHh4eCB4eHh4IHh4eHggeHh4?=
 =?koi8-r?b?eCB4eHh4IHh4eHggeHh4eCB4?=
 =?koi8-r?b?eHh4IHh4eHggeHh4eCB4eHh4?=
 =?koi8-r?b?IHh4eHggeHh4eCB4eHh4IHh4?=
 =?koi8-r?b?eHggeHh4eCB4eHh4IHh4eHgg?=
 =?koi8-r?b?eHh4eCB4eHh4IA==?=ra  rb  r5   r5   r6   Útest_base64_splittableè  s   

#

z!TestHeader.test_base64_splittablec                 C   s8   | j }d}t|ƒ}||dgƒ t|ƒ}||| ¡ ƒ d S )NrÁ  )rÁ  N©r.   r   r   rœ   )r2   r3   r­   rb  r­  r5   r5   r6   Útest_us_ascii_header  s   zTestHeader.test_us_ascii_headerc                 C   s&   | j }tƒ }| dd¡ ||dƒ d S )NrÁ  r8   )r.   r   r¶  rÁ  r5   r5   r6   Útest_string_charset&  s   zTestHeader.test_string_charsetc                 C   s:   | j }tddƒ}|| ¡ dƒ tddƒ}|| ¡ dƒ d S )Nrp  rN   z=?utf-8?q?p=C3=B6stal?=u   èŠåœ°æ™‚å¤«z=?utf-8?b?6I+K5Zyw5pmC5aSr?=©r.   r   rœ   rÁ  r5   r5   r6   Útest_utf8_shortest5  s
   

zTestHeader.test_utf8_shortestc                 C   sr   | j }| j}d}|tt|ƒ tƒ }|t|j|ƒ | dd¡}|tt|ddƒ|ƒ |j|dd |t|ƒ|ƒ d S )Nó0   Ynwp4dUEbay Auction Semiar- No Charge – Earn BigrN   rÔ   r   )r†   r.   r±  r   r¶  rQ   r¸   )r2   rt  r3   rb  r­  Úer5   r5   r6   Útest_bad_8bit_header<  s   zTestHeader.test_bad_8bit_headerc                 C   sN   d}|  dd¡}t|tjjd}|  t|ƒd¡ |  tj |¡|dfg¡ d S )Nrj  r›   Úsurrogateescaper  õ2   Ynwp4dUEbay Auction Semiar- No Charge ï¿½ Earn Bigúunknown-8bit)	rQ   r   r   r<   ÚUNKNOWN8BITr.   r¸   rˆ   r   )r2   rb  rk  r­  r5   r5   r6   Útest_escaped_8bit_headerH  s   
ÿz#TestHeader.test_escaped_8bit_headerc                 C   sB   d}t |tjjd}|  t|ƒd¡ |  tj |¡|dfg¡ d S ©Nrj  r  rn  ro  )r   r   r<   rp  r.   r¸   rˆ   r   )r2   rb  r­  r5   r5   r6   Ú&test_header_handles_binary_unknown8bitP  s   
ÿz1TestHeader.test_header_handles_binary_unknown8bitc                 C   sV   d}t |tjjd}tj tj |¡¡}|  t|ƒd¡ |  tj |¡|dfg¡ d S rr  )	r   r   r<   rp  rˆ   r   r   r.   r¸   )r2   rb  r­  Zh2r5   r5   r6   Ú+test_make_header_handles_binary_unknown8bitW  s   
ÿz6TestHeader.test_make_header_handles_binary_unknown8bitc                 C   s2   t dƒ}tj |¡}| d¡ |  t|ƒd¡ d S )Nr—  )r›   Ztest2)r   r   rˆ   r   r¶  r.   r¸   )r2   r­  r<  r5   r5   r6   Ú0test_modify_returned_list_does_not_change_header_  s   
z;TestHeader.test_modify_returned_list_does_not_change_headerc                 C   sR   | j }tƒ }| dd¡ | d¡ | ¡ }||dƒ tt|ƒƒ}|| ¡ |ƒ d S )NrÁ  r8   Zworldz=?iso-8859-1?q?hello?= world)r.   r   r¶  rœ   r   r   )r2   r3   r­  r­   r5   r5   r6   Ú test_encoded_adjacent_nonencodede  s   

z+TestHeader.test_encoded_adjacent_nonencodedc                 C   s:   | j }d}t|ƒ}||g d¢ƒ t|ƒ}|| ¡ dƒ d S )NzGSubject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztk=?= =?koi8-r?q?=CA?= zz.))s	   Subject: N)s   ðÒÏ×ÅÒËÁ ÎÁ ÆÉÎÁÌØÎÙÊre   )s    zz.Nz6Subject: =?koi8-r?b?8NLP18XSy8EgzsEgxsnOwczYztnK?= zz.re  )r2   r3   r­   ÚpartsZhdrr5   r5   r6   Útest_whitespace_keepero  s   ÿz!TestHeader.test_whitespace_keeperc                 C   s   | j }d}|tjt|ƒ d S )NzXSubject: =?EUC-KR?B?CSixpLDtKSC/7Liuvsax4iC6uLmwMcijIKHaILzSwd/H0SC8+LCjwLsgv7W/+Mj3I ?=)r†   r   r‡   r   )r2   rt  r­   r5   r5   r6   Útest_broken_base64_headerx  s   z$TestHeader.test_broken_base64_headerc                 C   s    t ddd}|  | ¡ d¡ d S )NrÈ  Ú	shift_jisr  rÉ  rÊ  rË  r5   r5   r6   Útest_shift_jis_charset}  r/  z!TestHeader.test_shift_jis_charsetc                 C   s   t  d¡}|  t|ƒd¡ d S )NzEmptyHeader:zEmptyHeader: 

)r   rÝ   r.   r¸   r]   r5   r5   r6   Ú!test_flatten_header_with_no_value  s   
z,TestHeader.test_flatten_header_with_no_valuec                 C   s"   t ƒ }d|d< |  t|ƒd¡ d S )Nz   value with leading wsZ
SomeHeaderz&SomeHeader:    value with leading ws

)r   r.   r¸   r]   r5   r5   r6   Ú)test_encode_preserves_leading_ws_on_valueˆ  rK  z4TestHeader.test_encode_preserves_leading_ws_on_valuec                 C   s   |   tdƒ ¡ d¡ d S )Nr+   rh  r  r5   r5   r6   Útest_whitespace_header  s   z!TestHeader.test_whitespace_headerN)rˆ  r‰  rŠ  rU  rW  rX  rZ  r\  r]  r^  r_  rc  rd  rf  rg  ri  rl  rq  rs  rt  ru  rv  rx  ry  r{  r|  r}  r~  r5   r5   r5   r6   rR  -  s4    ?E6
	rR  c                   @   sü   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=S )>ÚTestRFC2231c                 C   s8   | j }|  d¡}|| d¡dƒ ||jddddƒ d S )Nz
msg_29.txtr”  ©rH   r•  ú%This is even more ***fun*** isn't it!Frø   )rH   r•  z'"This is even more ***fun*** isn't it!")r.   r/   rD   r1   r5   r5   r6   rõ   —  s   

ÿÿzTestRFC2231.test_get_paramc                 C   s€   | j }tƒ }|jdddd || d¡dƒ |jddddd || d¡dƒ |  d	¡}|jddddd ||jd
ddƒ d S )Nr”  r  rH   r  )rH   r*   r  r•  ©r<   Úlanguager€  r€   rò  rô  a"  Return-Path: <bbb@zzz.org>
Delivered-To: bbb@zzz.org
Received: by mail.zzz.org (Postfix, from userid 889)
	id 27CEAD38CC; Fri,  4 May 2001 14:05:44 -0400 (EDT)
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
From: bbb@ddd.com (John X. Doe)
To: bbb@zzz.org
Subject: This is a test message
Date: Fri, 4 May 2001 14:05:44 -0400
Content-Type: text/plain; charset=us-ascii;
 title*=us-ascii'en'This%20is%20even%20more%20%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it%21


Hi,

Do you like this message?

-Me
)r¥  r   r  rD   r/   rŒ   r1   r5   r5   r6   r  Ÿ  s&   ÿ
ÿÿ
ÿ
ÿzTestRFC2231.test_set_paramc                 C   sf   t ƒ }| dd¡ |  |d d¡ |jdddd |  |d d¡ |jdd	dd |  |d d
¡ d S )Nr”  r§   r;   ztext/plain; title="foo"rì   F)Zrequoteztext/plain; title=barz	(bar)bellztext/plain; title="(bar)bell")r   r  r.   r]   r5   r5   r6   Útest_set_param_requoteÄ  s   z"TestRFC2231.test_set_param_requotec                 C   sX   | j }|  d¡}|jddddd |jddddd |jdd	d
 ||jdddƒ d S )Nr€   r§   rì   rH   r•  r‚  r”  r  r?   rê   rò  rô  a$  Return-Path: <bbb@zzz.org>
Delivered-To: bbb@zzz.org
Received: by mail.zzz.org (Postfix, from userid 889)
	id 27CEAD38CC; Fri,  4 May 2001 14:05:44 -0400 (EDT)
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
From: bbb@ddd.com (John X. Doe)
To: bbb@zzz.org
Subject: This is a test message
Date: Fri, 4 May 2001 14:05:44 -0400
Content-Type: text/plain; charset="us-ascii";
 title*=us-ascii'en'This%20is%20even%20more%20%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it%21


Hi,

Do you like this message?

-Me
)r¥  r/   r  r  rŒ   r1   r5   r5   r6   r  Î  s   
ÿzTestRFC2231.test_del_paramc                 C   r|   )Nr2  rH   )r.   r/   Úget_content_charsetr1   r5   r5   r6   Ú test_rfc2231_get_content_charsetï  r¶  z,TestRFC2231.test_rfc2231_get_content_charsetc                 C   ó8   t  d¡}t |¡}|  | ¡ d¡ |  || ¡ ¡ d S )NzÈ            Content-Disposition: inline;
            	filename*0*=''This%20is%20even%20more%20;
            	filename*1*=%2A%2A%2Afun%2A%2A%2A%20;
            	filename*2="is it not.pdf"

            ú)This is even more ***fun*** is it not.pdf©rÌ   rÍ   r   rÝ   r.   rm   rŒ   rm  r5   r5   r6   Útest_rfc2231_parse_rfc_quotingõ  ó   


ÿz*TestRFC2231.test_rfc2231_parse_rfc_quotingc                 C   r‡  )NzÌ            Content-Disposition: inline;
            	filename*0*="''This%20is%20even%20more%20";
            	filename*1*="%2A%2A%2Afun%2A%2A%2A%20";
            	filename*2="is it not.pdf"

            rˆ  r‰  rm  r5   r5   r6   Ú test_rfc2231_parse_extra_quoting  r‹  z,TestRFC2231.test_rfc2231_parse_extra_quotingc                 C   ó4   d}t  |¡}| d¡}|  |t¡ |  |d¡ d S )Na  Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEMP_nsmail.htm"
Content-Type: text/html; NAME*0=file____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEM; NAME*1=P_nsmail.htm

ÚNAMEzMfile____C__DOCUMENTS_20AND_20SETTINGS_FABIEN_LOCAL_20SETTINGS_TEMP_nsmail.htm©r   rÝ   rD   ZassertNotIsInstanceÚtupler.   ©r2   rÐ   r4   Zparamr5   r5   r6   Ú#test_rfc2231_no_language_or_charset  s   

þz/TestRFC2231.test_rfc2231_no_language_or_charsetc                 C   ó"   d}t  |¡}|  | ¡ d¡ d S ©NzContent-Disposition: inline;
	filename*0*="''This%20is%20even%20more%20";
	filename*1*="%2A%2A%2Afun%2A%2A%2A%20";
	filename*2="is it not.pdf"

rˆ  râ   rm  r5   r5   r6   Ú/test_rfc2231_no_language_or_charset_in_filename"  ó
   

ÿz;TestRFC2231.test_rfc2231_no_language_or_charset_in_filenamec                 C   r“  r”  râ   rm  r5   r5   r6   Ú7test_rfc2231_no_language_or_charset_in_filename_encoded/  r–  zCTestRFC2231.test_rfc2231_no_language_or_charset_in_filename_encodedc                 C   r“  )NzContent-Disposition: inline;
	filename*0="''This%20is%20even%20more%20";
	filename*1*="%2A%2A%2Afun%2A%2A%2A%20";
	filename*2="is it not.pdf"

z1This%20is%20even%20more%20***fun*** is it not.pdfrâ   rm  r5   r5   r6   Útest_rfc2231_partly_encoded=  ó   
þz'TestRFC2231.test_rfc2231_partly_encodedc                 C   r“  )NzŒContent-Disposition: inline;
	filename*0="This%20is%20even%20more%20";
	filename*1="%2A%2A%2Afun%2A%2A%2A%20";
	filename*2="is it not.pdf"

z?This%20is%20even%20more%20%2A%2A%2Afun%2A%2A%2A%20is it not.pdfrâ   rm  r5   r5   r6   Útest_rfc2231_partly_nonencodedJ  r™  z*TestRFC2231.test_rfc2231_partly_nonencodedc                 C   r“  )Nz˜Content-Type: multipart/alternative;
	boundary*0*="''This%20is%20even%20more%20";
	boundary*1*="%2A%2A%2Afun%2A%2A%2A%20";
	boundary*2="is it not.pdf"

rˆ  ræ   rm  r5   r5   r6   Ú/test_rfc2231_no_language_or_charset_in_boundaryW  r–  z;TestRFC2231.test_rfc2231_no_language_or_charset_in_boundaryc                 C   r“  )NzˆContent-Type: text/plain;
	charset*0*="This%20is%20even%20more%20";
	charset*1*="%2A%2A%2Afun%2A%2A%2A%20";
	charset*2="is it not.pdf"

z)this is even more ***fun*** is it not.pdf©r   rÝ   r.   r…  rm  r5   r5   r6   Ú.test_rfc2231_no_language_or_charset_in_charsetc  s
   

ÿz:TestRFC2231.test_rfc2231_no_language_or_charset_in_charsetc                 C   r“  )Nz—Content-Disposition: inline;
	filename*0*="bogus'xx'This%20is%20even%20more%20";
	filename*1*="%2A%2A%2Afun%2A%2A%2A%20";
	filename*2="is it not.pdf"

rˆ  râ   rm  r5   r5   r6   Ú%test_rfc2231_bad_encoding_in_filenameq  r–  z1TestRFC2231.test_rfc2231_bad_encoding_in_filenamec                 C   ó"   d}t  |¡}|  | ¡ d ¡ d S )Nz:Content-Type: text/plain; charset*=bogus''utf-8%E2%80%9D

rœ  rm  r5   r5   r6   Ú$test_rfc2231_bad_encoding_in_charset}  ó   
z0TestRFC2231.test_rfc2231_bad_encoding_in_charsetc                 C   rŸ  )Nz:Content-Type: text/plain; charset*=ascii''utf-8%E2%80%9D

rœ  rm  r5   r5   r6   Ú%test_rfc2231_bad_character_in_charset‡  r¡  z1TestRFC2231.test_rfc2231_bad_character_in_charsetc                 C   r“  )Nz›Content-Disposition: inline;
	filename*0*="ascii'xx'This%20is%20even%20more%20";
	filename*1*="%2A%2A%2Afun%2A%2A%2A%20";
	filename*2*="is it not.pdf%E2"

u,   This is even more ***fun*** is it not.pdfï¿½râ   rm  r5   r5   r6   Ú&test_rfc2231_bad_character_in_filename‘  r–  z2TestRFC2231.test_rfc2231_bad_character_in_filenamec                 C   r“  )Nz^Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename*=X-UNKNOWN''myfile.txt

ú
myfile.txtrâ   rm  r5   r5   r6   Útest_rfc2231_unknown_encoding  ó   
z)TestRFC2231.test_rfc2231_unknown_encodingc                 C   r“  )Nuc   Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename*=utf-8í³¢í²€í²''myfile.txt

r¤  râ   rm  r5   r5   r6   Ú&test_rfc2231_bad_character_in_encoding¦  r¦  z2TestRFC2231.test_rfc2231_bad_character_in_encodingc                 C   sF   | j }d}t |¡}| d¡\}}}||d ƒ ||d ƒ ||dƒ d S )NzJContent-Type: application/x-foo;
	name*0*="Frank's"; name*1*=" Document"

rö   úFrank's Documentrô   ©r2   r3   rÐ   r4   r<   rƒ  r­   r5   r5   r6   Ú-test_rfc2231_single_tick_in_filename_extended¯  ó   


z9TestRFC2231.test_rfc2231_single_tick_in_filename_extendedc                 C   r  )NzGContent-Type: application/x-foo; name*0="Frank's"; name*1=" Document"

rö   r¨  r  r‘  r5   r5   r6   Ú$test_rfc2231_single_tick_in_filename½  s
   

z0TestRFC2231.test_rfc2231_single_tick_in_filenamec                 C   r“  )NzAContent-Disposition: inline;
	filename*0*="'This%20is%20broken";
z'This is brokenrâ   rm  r5   r5   r6   Útest_rfc2231_missing_tickÇ  ó   
þz%TestRFC2231.test_rfc2231_missing_tickc                 C   r“  )NzAContent-Disposition: inline;
	filename*0*="'This%20is%E2broken";
u   'This isï¿½brokenrâ   rm  r5   r5   r6   Ú0test_rfc2231_missing_tick_with_encoded_non_asciiÑ  r®  z<TestRFC2231.test_rfc2231_missing_tick_with_encoded_non_asciic                 C   óF   | j }d}t |¡}| d¡\}}}||dƒ ||dƒ ||dƒ d S )NzYContent-Type: application/x-foo;
	name*0*="us-ascii'en-us'Frank's"; name*1*=" Document"

rö   rH   úen-usr¨  rô   r©  r5   r5   r6   Ú!test_rfc2231_tick_attack_extendedÜ  r«  z-TestRFC2231.test_rfc2231_tick_attack_extendedc                 C   r  )NzWContent-Type: application/x-foo;
	name*0="us-ascii'en-us'Frank's"; name*1=" Document"

rö   zus-ascii'en-us'Frank's Documentr  r‘  r5   r5   r6   Útest_rfc2231_tick_attackê  s
   

z$TestRFC2231.test_rfc2231_tick_attackc                 C   s(   | j }d}t |¡}|| d¡dƒ d S )Nz:Content-Type: application/x-foo; name="Frank's Document"

rö   r¨  rô   r  r5   r5   r6   Útest_rfc2231_no_extended_valuesö  s   
z+TestRFC2231.test_rfc2231_no_extended_valuesc                 C   r°  )NziContent-Type: application/x-foo;
	name*0*="us-ascii'en-us'My";
	name*1=" Document";
	name*2*=" For You"

rö   rH   r±  úMy Document For Yourô   r©  r5   r5   r6   Ú,test_rfc2231_encoded_then_unencoded_segments   ó   


z8TestRFC2231.test_rfc2231_encoded_then_unencoded_segmentsc                 C   r°  )NziContent-Type: application/x-foo;
	name*0="us-ascii'en-us'My";
	name*1*=" Document";
	name*2*=" For You"

rö   rH   r±  rµ  rô   r©  r5   r5   r6   Ú,test_rfc2231_unencoded_then_encoded_segments  r·  z8TestRFC2231.test_rfc2231_unencoded_then_encoded_segmentsc              	   C   sL   ddg}|D ]}| j |d t |¡}W d   ƒ n1 sw   Y  qd S )NzÿFrom: user@host.com
To: user@host.com
Bad-Header:
 =?us-ascii?Q?LCSwrV11+IB0rSbSker+M9vWR7wEDSuGqmHD89Gt=ea0nJFSaiz4vX3XMJPT4vrE?=
 =?us-ascii?Q?xGUZeOnp0o22pLBB7CYLH74Js=wOlK6Tfru2U47qR?=
 =?us-ascii?Q?72OfyEY2p2=2FrA9xNFyvH+fBTCmazxwzF8nGkK6D?=

Hello!
u‹  From: Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ <xxx@xxx>
To: "xxx" <xxx@xxx>
Subject:   Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½
MIME-Version: 1.0
Content-Type: text/plain; charset="windows-1251";
Content-Transfer-Encoding: 8bit

Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½ Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½Ã¯Â¿Â½
)rÐ   )rf  r   rÝ   )r2   ÚmessagesrÐ   r4   r5   r5   r6   Ú+test_should_not_hang_on_invalid_ew_messages   s   øÿ€ÿz7TestRFC2231.test_should_not_hang_on_invalid_ew_messagesN)!rˆ  r‰  rŠ  rõ   r  r„  r  r†  rŠ  rŒ  r’  r•  r—  r˜  rš  r›  r  rž  r   r¢  r£  r¥  r§  rª  r¬  r­  r¯  r²  r³  r´  r¶  r¸  rº  r5   r5   r5   r6   r  “  s>    %
!

		


r  c                   @   r  )Ú
TestSignedc                 C   sL   t |dd}| ¡ }t |¡}W d   ƒ ||fS 1 sw   Y  ||fS r  r  )r2   r  r–   Úoriginalr4   r5   r5   r6   Ú_msg_and_obj<  s   
þýzTestSigned._msg_and_objc                 C   sL   dd l }| d|j|jB ¡}| |¡ d¡}| |¡ d¡}|  ||¡ d S )Nr   z^--([^\n]+)\n(.*?)\n--\1$r¡   )r¼  r½  ÚSrE  ÚsearchÚgroupr.   )r2   r¼  Úresultr¼  ZrepartZinpartZoutpartr5   r5   r6   Ú_signed_parts_eqB  s
   zTestSigned._signed_parts_eqc                 C   s&   |   d¡\}}| ¡ }|  ||¡ d S r:  ©r½  rŒ   rÂ  ©r2   r¼  r4   rÁ  r5   r5   r6   Útest_long_headers_as_stringJ  s   z&TestSigned.test_long_headers_as_stringc                 C   s*   |   d¡\}}|jdd}|  ||¡ d S )Nr;  é<   rô  rÃ  rÄ  r5   r5   r6   Ú(test_long_headers_as_string_maxheaderlenO  s   z3TestSigned.test_long_headers_as_string_maxheaderlenc                 C   s:   |   d¡\}}tƒ }t|ƒ |¡ | ¡ }|  ||¡ d S r:  )r½  r   r
   r“   r”   rÂ  )r2   r¼  r4   r–   rÁ  r5   r5   r6   Útest_long_headers_flattenT  s
   z$TestSigned.test_long_headers_flattenN)rˆ  r‰  rŠ  r½  rÂ  rÅ  rÇ  rÈ  r5   r5   r5   r6   r»  :  s    r»  c                   @   ræ  )ÚTestHeaderRegistryc                 C   s(   t ƒ }|ddƒ}|  |jd tj¡ d S )Nr  zattachment; 0*00="foo"r   )r   r^  r_  r   ZInvalidHeaderDefect)r2   ZregrÖ  r5   r5   r6   Útest_HeaderRegistry]  s   
z&TestHeaderRegistry.test_HeaderRegistryN)rˆ  r‰  rŠ  rÊ  r5   r5   r5   r6   rÉ  [  s    rÉ  Ú__main__)fr¼  rj  rO   r`  rÌ   Úior   r   Ú	itertoolsr   Úrandomr   Ú	threadingr   Zunittest.mockr   r   Zemail.policyZemail.utilsZemail.charsetr	   Zemail.generatorr
   r   r   Zemail.headerr   r   r   Zemail.headerregistryr   Zemail.messager   Zemail.mime.applicationr   Zemail.mime.audior   Zemail.mime.baser   Zemail.mime.imager   Zemail.mime.messager   Zemail.mime.multipartr   Zemail.mime.nonmultipartr   Zemail.mime.textr   Zemail.parserr   r   r   r   r   r    r!   r"   Ztest.supportr#   Ztest.support.os_helperr$   Ztest.test_emailr%   r&   r'   r(   r¼   r  rØ  r,   ZTestCaserŒ  r¤  r  r  r:  r=  rN  rb  r¡  rÀ  rî  r  r  rA  r  r9  rH  ro  rµ  rº  r¿  rÀ  rÕ  rJ  rR  r  r»  rÉ  rˆ  Úmainr5   r5   r5   r6   Ú<module>   sÚ        lC    AO((\<    0   9       ug0 K   !ÿÿ4  D:  h   *!
ÿ