ó
    Ö›‘hg$ ã                  óÜ  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJrJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  SSKJrJrJr  SSKJ r   SSK!J"r"J#r#  SSK$J%r%J&r&J'r'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.J/r/  SSK0J1r1  SSK2J3r3  SSK4J5r5J6r6J7r7  SSK8J9r9  SSK:J;r;J<r<J=r=  SSK>J?r?J@r@JArA  SSKBJCrCJDrD   SSKEJFrFJGrG  S rI " S S\D5      rJ " S S5      rK " S  S!\C5      rL " S" S#\C5      rM " S$ S%\D5      rN\" \1Rž                  \1R                   \1R¢                  5       " S& S'5      5       rR\" \1Rž                  \1R                   5       " S( S)5      5       rS " S* S+\1R¨                  5      rU " S, S-\U\1R¬                  5      rW " S. S/\1R°                  5      rY " S0 S1\1R´                  5      r[ " S2 S35      r\ " S4 S5\\\D5      r] " S6 S7\C5      r^ " S8 S9\\\D5      r_\" \"5       " S: S;5      5       r` " S< S=5      ra " S> S?\\\D5      rb " S@ SA\D5      rc " SB SC\\\D5      rd " SD SE\D5      re " SF SG\1R´                  5      rf " SH SI\\\D5      rg " SJ SK5      rh " SL SM\h5      ri " SN SO\i\C5      rj " SP SQ\i\C5      rk " SR SS\h\C5      rl " ST SU\h\C5      rm " SV SW\h\C5      rn " SX SY\h\D5      ro " SZ S[\h\C5      rp " S\ S]\h\C5      rq " S^ S_\1R°                  5      rr\" \1Ræ                  5       " S` Sa\=Rè                  5      5       ru " Sb Sc\D\\5      rv " Sd Se\D5      rw " Sf Sg\D\\5      rx " Sh Si\\\D5      ry\" \1Rô                  5       " Sj Sk\D\\5      5       r{ " Sl Sm5      r|\" \1Rú                  5       " Sn So5      5       r~\" \1Rþ                  5       " Sp Sq5      5       r€ " Sr Ss\D5      r�\" \F(       + St5      \" \'GR                  " \(S5      (       + Su5       " Sv Sw\\\D5      5       5       rƒ " Sx Sy\R5      r„ " Sz S{\\\D5      r… " S| S}\D5      r† " S~ S5      r‡ " S€ S�\D5      rˆ " S‚ Sƒ\D5      r‰ " S„ S…5      rŠ " S† S‡\Š\C5      r‹ " Sˆ S‰\Š\D5      rŒ " SŠ S‹\C5      r�g! \H a    SrFSrG GNœf = f)Œz"
Test case for twisted.mail.imap4
é    )ÚannotationsN)ÚOrderedDict©ÚBytesIO)Úchain)ÚOptionalÚType)ÚskipIf)Úimplementer)ÚverifyClassÚverifyObject)Ú'InMemoryUsernamePasswordDatabaseDontUse)ÚCramMD5CredentialsÚIUsernameHashedPasswordÚIUsernamePassword©ÚUnauthorizedLogin)ÚIRealmÚPortal)ÚdeferÚerrorÚ
interfacesÚreactor)ÚDeferred)ÚClock)ÚStringTransportÚ StringTransportWithDisconnection)Úimap4)Ú
MessageSet)ÚIChallengeResponseÚIClientAuthenticationÚICloseableMailboxIMAP)Úloopback)ÚfailureÚlogÚutil)Ú	iterbytesÚnativeStringÚnetworkString)ÚSynchronousTestCaseÚTestCase)ÚClientTLSContextÚServerTLSContextc                ó   • U 4S j$ )Nc                ó   • U" 5       $ ©N© )ÚresultÚfs     Ú_C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/mail/test/test_imap.pyÚ<lambda>Ústrip.<locals>.<lambda>:   s   € ™qœsó    r1   )r3   s    r4   Ústripr8   9   s   € ØÓ"Ð"r7   c                  ól   • \ rS rSrSS/SS/SS/SS	/S
S//rS rS rS rS rS r	S r
S rS rS rSrg)ÚIMAP4UTF7Testsé=   úHello worldó   Hello worldzHello & worlds   Hello &- worldõ   HelloÃ¿worldó   Hello&AP8-worldu   Ã¿Ã¾Ã½Ã¼s   &AP8A,gD9APw-u   ~peter/mail/æ—¥æœ¬èªž/å�°åŒ—s   ~peter/mail/&ZeVnLIqe-/&U,BTFw-c                ój   • SnU R                  UR                  SS5      UR                  S5      5        g)z’
Specifying an error policy to C{unicode.encode} with the
I{imap4-utf-7} codec should produce the same result as not
specifying the error policy.
r<   úimap4-utf-7ÚstrictN©ÚassertEqualÚencode©ÚselfÚtexts     r4   Útest_encodeWithErrorsÚ$IMAP4UTF7Tests.test_encodeWithErrorsI   s0   € ð ˆØ×ÑØ�K‰K˜ xÓ0°$·+±+¸mÓ2Lõ	
r7   c                ój   • SnU R                  UR                  SS5      UR                  S5      5        g)z?
Similar to L{test_encodeWithErrors}, but for C{bytes.decode}.
r=   rA   rB   N©rD   Údecode©rG   Úbytess     r4   Útest_decodeWithErrorsÚ$IMAP4UTF7Tests.test_decodeWithErrorsT   s0   € ð ˆØ×ÑØ�L‰L˜¨Ó1°5·<±<ÀÓ3Nõ	
r7   c                óJ   • SnU R                  UR                  S5      S5        g)zi
Unicode strings that contain an ampersand (C{&}) can be
encoded to bytes with the I{imap4-utf-7} codec.
u
   &Hello&Â½&rA   s   &-Hello&-&AL0-&-NrC   rF   s     r4   Útest_encodeAmpersandÚ#IMAP4UTF7Tests.test_encodeAmpersand]   s&   € ð
 6ˆØ×ÑØ�K‰K˜Ó&Øõ	
r7   c                óF   • U R                  SR                  S5      S5        g)zr
An I{imap4-utf-7} encoded string that does not shift back to
ASCII (i.e., it lacks a final C{-}) can be decoded.
s   &AL0rA   ô   Â½NrL   ©rG   s    r4   Ú!test_decodeWithoutFinalASCIIShiftÚ0IMAP4UTF7Tests.test_decodeWithoutFinalASCIIShifth   s!   € ð
 	×ÑØ�N‰N˜=Ó)Ø*õ	
r7   c                óŽ   • [         R                  " S5      " [        S5      5      nU R                  UR	                  5       S5        g)zT
C{codecs.getreader('imap4-utf-7')} returns the I{imap4-utf-7} stream
reader class.
rA   r?   r>   N)ÚcodecsÚ	getreaderr   rD   Úread)rG   Úreaders     r4   Útest_getreaderÚIMAP4UTF7Tests.test_getreaderr   s6   € ô
 ×!Ò! -Ô0´Ð9KÓ1LÓMˆØ×Ñ˜Ÿ™›Ð(8Õ9r7   c                ó²   • [        5       n[        R                  " S5      " U5      nUR                  S5        U R	                  UR                  5       S5        g)zT
C{codecs.getwriter('imap4-utf-7')} returns the I{imap4-utf-7} stream
writer class.
rA   r>   r?   N)r   r[   Ú	getwriterÚwriterD   Úgetvalue)rG   ÚoutputÚwriters      r4   Útest_getwriterÚIMAP4UTF7Tests.test_getwriterz   sE   € ô
 “ˆÜ×!Ò! -Ô0°Ó8ˆØ�‰Ð%Ô&Ø×Ñ˜Ÿ™Ó*Ð,>Õ?r7   c                óp   • U R                    H&  u  pU R                  UR                  S5      U5        M(     g)z„
The I{imap4-utf-7} can be used to encode a unicode string into a byte
string according to the IMAP4 modified UTF-7 encoding rules.
rA   N)ÚtestsrD   rE   ©rG   Úinputre   s      r4   Útest_encodeÚIMAP4UTF7Tests.test_encode„   s-   € ð
 "ŸZœZ‰MˆEØ×Ñ˜UŸ\™\¨-Ó8¸&ÖAò (r7   c                ón   • U R                    H%  u  pU R                  XR                  S5      5        M'     g)z„
The I{imap4-utf-7} can be used to decode a byte string into a unicode
string according to the IMAP4 modified UTF-7 encoding rules.
rA   N)rj   rD   rM   rk   s      r4   Útest_decodeÚIMAP4UTF7Tests.test_decodeŒ   s+   € ð
 "ŸZœZ‰MˆEØ×Ñ˜U§M¡M°-Ó$@ÖAò (r7   c                ó°  • [        [        SS5      [        SS5      5       Hp  n[        U5      R                  5       nU R	                  U[        U5      R                  S5      5        U R	                  [        U5      UR                  S5      5        Mr     U R	                  SR                  S5      S5        U R	                  SR                  S5      S5        g)	z�
The IMAP4 modified UTF-7 implementation encodes all printable
characters which are in ASCII using the corresponding ASCII byte.
é    é&   é'   é   rA   Ú&s   &-N)r   ÚrangeÚchrrE   rD   rM   )rG   ÚoÚcharbytes      r4   Útest_printableSingletonsÚ'IMAP4UTF7Tests.test_printableSingletons”   s    € ô ”u˜T 4Ó(¬%°°dÓ*;Ö<ˆAÜ˜1“v—}‘}“ˆHØ×Ñ˜X¤s¨1£v§}¡}°]Ó'CÔDØ×ÑœS ›V X§_¡_°]Ó%CÖDñ =ð 	×Ñ˜Ÿ™ MÓ2°EÔ:Ø×Ñ˜Ÿ™ mÓ4°cÕ:r7   r1   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rj   rI   rP   rS   rX   r_   rg   rm   rp   r|   Ú__static_attributes__r1   r7   r4   r:   r:   =   sg   † à	˜Ð'Ø	Ð+Ð,Ø	Ð-Ð.Ø	Ð-Ð.à9Ø.ð	
ð	€Eò	
ò
ò	
ò
ò:ò@òBòBõ;r7   r:   c                  ó,   • \ rS rSrS rS rS rS rSrg)ÚBufferingConsumeré¢   c                ó   • / U l         g r0   )ÚbufferrW   s    r4   Ú__init__ÚBufferingConsumer.__init__£   s	   € Øˆ�r7   c                ó’   • U R                   R                  U5        U R                  (       a  U R                  R                  5         g g r0   )r‡   ÚappendÚconsumerÚresumeProducingrN   s     r4   rc   ÚBufferingConsumer.write¦   s0   € Ø�‰×Ñ˜5Ô!Ø�=�=Ø�M‰M×)Ñ)Õ+ð r7   c                óD   • Xl         U R                   R                  5         g r0   )rŒ   r�   )rG   rŒ   Ú	streamings      r4   ÚregisterProducerÚ"BufferingConsumer.registerProducer«   s   € Ø ŒØ�‰×%Ñ%Õ'r7   c                ó   • S U l         g r0   )rŒ   rW   s    r4   ÚunregisterProducerÚ$BufferingConsumer.unregisterProducer¯   s	   € Øˆ�r7   )r‡   rŒ   N)	r~   r   r€   r�   rˆ   rc   r‘   r”   r‚   r1   r7   r4   r„   r„   ¢   s   † òò,ò
(õr7   r„   c                  ó2   • \ rS rSrS rS rS rS rS rSr	g)	ÚMessageProducerTestsé³   c                ó   ^ ^^^• Sm[        5       nSUS'   SUS'   SUS'   SUS	'   [        US
S TSS 5      n[        5       m[        R                  " U5      mTR                  T5      nUUUU 4S jnUR                  U5      $ )Ns   This is body text.  Rar.úsender@hostÚfromúrecipient@domainÚtoúbooga booga booÚsubjectú
text/plainúcontent-typer1   é{   c                ó†   >• TR                  U T5        TR                  SR                  TR                  5      ST-   5        g )Nr7   sf   {119}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: text/plain

)ÚassertIdenticalrD   Újoinr‡   )r2   ÚbodyÚcÚprG   s    €€€€r4   Ú
cbProducedÚ7MessageProducerTests.testSinglePart.<locals>.cbProducedÂ   s@   ø€ Ø× Ñ  ¨Ô+Ø×ÑØ—‘˜Ÿ™Ó"ðð
 ñõr7   ©r   ÚFakeyMessager„   r   ÚMessageProducerÚbeginProducingÚaddCallback)rG   ÚheadersÚmsgÚdr©   r¦   r§   r¨   s   `    @@@r4   ÚtestSinglePartÚ#MessageProducerTests.testSinglePart´   sŒ   û€ Ø*ˆÜ“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�Ñä˜7 B¨¨d°C¸Ó>ˆäÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷
	ð 
	ð �}‰}˜ZÓ(Ð(r7   c                óJ  ^ ^^^	• SnSm[        5       nSUS'   SUS'   SUS'   S	US
'   [        5       nSUS'   SUS
'   [        USS US[        USS TS S 5      /5      n[        5       m[        R                  " U5      m	T	R                  T5      nUUU	U 4S jnUR                  U5      $ )Nr7   ó&   Contained body message text.  Squarge.rš   r›   rœ   r�   rž   rŸ   ú%multipart/alternative; boundary="xyz"r¡   úthis is subject textr    r1   r¢   c                óŒ   >• TR                  U T5        TR                  SR                  TR                  5      ST-   S-   5        g )Nr7   sÅ   {239}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

ó   
--xyz--
©ÚfailUnlessIdenticalrD   r¥   r‡   ©r2   r§   Ú	innerBodyr¨   rG   s    €€€€r4   r©   Ú<MessageProducerTests.testSingleMultiPart.<locals>.cbProducedé   sJ   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð $ñ
$ð '9ñ
9õr7   r«   ©
rG   Ú	outerBodyr°   ÚinnerHeadersr±   r²   r©   r§   r¾   r¨   s
   `      @@@r4   ÚtestSingleMultiPartÚ(MessageProducerTests.testSingleMultiPartÐ   sÈ   û€ Øˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ð 	ð$ �}‰}˜ZÓ(Ð(r7   c                ó˜  ^ ^^	^
^• SnSm	Sm
[        5       nSUS'   SUS'   SUS	'   S
US'   [        5       nSUS	'   SUS'   [        5       nSUS	'   SUS'   [        USS US[        USS T	S S 5      [        USS T
S S 5      /5      n[        5       m[        R                  " U5      mTR                  T5      nUU	U
UU 4S jnUR                  U5      $ )Nr7   r¶   ó.   Secondary <i>message</i> text of squarge body.rš   r›   rœ   r�   rž   rŸ   r·   r¡   r¸   r    ú<b>this is subject</b>ú	text/htmlr1   r¢   c                ó˜   >• TR                  U T5        TR                  SR                  TR                  5      ST-   S-   T-   S-   5        g )Nr7   sÅ   {354}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

sE   
--xyz
Subject: <b>this is subject</b>
Content-Type: text/html

rº   r»   )r2   r§   Ú
innerBody1Ú
innerBody2r¨   rG   s    €€€€€r4   r©   Ú>MessageProducerTests.testMultipleMultiPart.<locals>.cbProduced  s^   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð %ñ
%ð(ñð %ñ%ð (:ñ:õr7   r«   )rG   rÁ   r°   rÂ   ÚinnerHeaders2r±   r²   r©   r§   rÊ   rË   r¨   s   `       @@@@r4   ÚtestMultipleMultiPartÚ*MessageProducerTests.testMultipleMultiPartý   sü   ü€ Øˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%ÜØØØØØä˜\¨2¨t°ZÀÀtÓLÜ˜]¨B°°jÀ$ÈÓMðó

ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ñ 	ð* �}‰}˜ZÓ(Ð(r7   c                óZ  ^ ^^^	• SnSm[        5       nSUS'   SUS'   SUS'   S	US
'   [        5       nSUS'   SUS
'   [        USSUS[        USSTSS5      /5      n[        5       m[        R                  " U5      m	S T	l        T	R                  T5      nUUU	U 4S jnUR                  U5      $ )z.
A boundary is generated if none is provided.
r7   r¶   rš   r›   rœ   r�   rž   rŸ   úmultipart/alternativer¡   r¸   r    r1   Nr¢   c                 ó.   • [         R                  " S5      $ )Nz$aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)ÚuuidÚUUIDr1   r7   r4   r5   Ú?MessageProducerTests.test_multiPartNoBoundary.<locals>.<lambda>M  s   € œ4Ÿ9š9Ð%KÔLr7   c                óŒ   >• TR                  U T5        TR                  SR                  TR                  5      ST-   S-   5        g )Nr7   s	  {341}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="----=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Subject: this is subject text
Content-Type: text/plain

s-   
------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--
r»   r½   s    €€€€r4   r©   ÚAMessageProducerTests.test_multiPartNoBoundary.<locals>.cbProducedQ  sL   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð ñð GñGõr7   )r   r¬   r„   r   r­   Ú_uuid4r®   r¯   rÀ   s
   `      @@@r4   Útest_multiPartNoBoundaryÚ-MessageProducerTests.test_multiPartNoBoundary3  sÑ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"9ˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆÙLˆŒà×Ñ˜QÓˆ÷	ð 	ð* �}‰}˜ZÓ(Ð(r7   c                óJ  ^ ^^^	• SnSm[        5       nSUS'   SUS'   SUS'   S	US
'   [        5       nSUS'   SUS
'   [        USSUS[        USSTSS5      /5      n[        5       m[        R                  " U5      m	T	R                  T5      nUUU	U 4S jnUR                  U5      $ )z.
A boundary without does not have them added.
r7   r¶   rš   r›   rœ   r�   rž   rŸ   z#multipart/alternative; boundary=xyzr¡   r¸   r    r1   Nr¢   c                óŒ   >• TR                  U T5        TR                  SR                  TR                  5      ST-   S-   5        g )Nr7   sÃ   {237}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary=xyz


--xyz
Subject: this is subject text
Content-Type: text/plain

rº   r»   r½   s    €€€€r4   r©   Ú?MessageProducerTests.test_multiPartNoQuotes.<locals>.cbProduced„  sJ   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð $ñ$ð '9ñ9õr7   r«   rÀ   s
   `      @@@r4   Útest_multiPartNoQuotesÚ+MessageProducerTests.test_multiPartNoQuotesh  sÊ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Gˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ð 	ð& �}‰}˜ZÓ(Ð(r7   r1   N)
r~   r   r€   r�   r³   rÃ   rÎ   rÙ   rÞ   r‚   r1   r7   r4   r—   r—   ³   s   † ò)ò8+)òZ4)òl3)õj/)r7   r—   c                  ó„   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rSrg)ÚMessageSetTestsiš  z
Tests for L{MessageSet}.
c                ó  • [        5       n[        5       nU R                  X5        U R                  US5        US-   nU R                  [        U5      S5        U R                  [	        U5      S/5        US-   nU R                  [        U5      S5        U R                  [	        U5      / SQ5        US-   nU R                  X5        U R                  [	        X-   5      / SQ5        UR                  S5        U R                  [        U5      S5        U R                  [	        U5      / SQ5        U R                  X5        UR                  S	S
5        U R                  [        U5      S5        U R                  [	        U5      / SQ5        g)a¼  
Test the following properties of L{MessageSet} addition and
equality:

    1. Two empty L{MessageSet}s are equal to each other;

    2. A L{MessageSet} is not equal to any other object;

    2. Adding a L{MessageSet} and another L{MessageSet} or an
       L{int} representing a single message or a sequence of
       L{int}s representing a sequence of message numbers
       produces a new L{MessageSet} that:

    3. Has a length equal to the number of messages within
       each sequence of message numbers;

    4. Yields each message number in ascending order when
       iterated over;

    6. L{MessageSet.add} with a single message or a start and
       end message satisfies 3 and 4 above.
r1   é   ©rã   é   rå   ©rã   é   rå   é   é   )rã   rç   rå   rè   é   é   é   )rã   rç   rå   rè   rê   rì   rë   N)r   rD   ÚassertNotEqualÚlenÚlistÚadd)rG   Úm1Úm2s      r4   Ú!test_equalityIterationAndAdditionÚ1MessageSetTests.test_equalityIterationAndAdditionŸ  s8  € ô. ‹\ˆÜ‹\ˆà×Ñ˜Ô Ø×Ñ˜B Ô#à�!‰VˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b› A 3Ô'à�&‰[ˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢9Ô-à�&‰[ˆØ×Ñ˜Ô Ø×Ñœ˜b™g›ª	Ô2à
�‰ˆqŒ	Ø×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢<Ô0à×Ñ˜BÔ#à
�‰ˆq�!ŒØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›Ò#8Õ9r7   c                óN   • U R                  [        [        [        SS5      5        g)zm
A L{MessageSet} that has a range that ends with L{None} raises
a L{TypeError} when its length is requested.
rã   N)ÚassertRaisesÚ	TypeErrorrî   r   rW   s    r4   Útest_lengthWithWildcardRangeÚ,MessageSetTests.test_lengthWithWildcardRangeÒ  s   € ð
 	×Ñœ)¤S¬*°Q¸Ó*=Õ>r7   c                ó.   • [        [        SS5      5        g)z4
L{MessageSet.__repr__} does not raise an exception
rã   rç   N)Úreprr   rW   s    r4   Útest_reprSanityÚMessageSetTests.test_reprSanityÙ  s   € ô 	ŒZ˜˜1ÓÕr7   c                ó  • [         R                  " S5      [         R                  " S5      [         R                  " SS5      [         R                  " SS5      /n/ SQn[        X5       H   u  p4U R                  [	        U5      U5        M"     g)zŒ
In a L{MessageSet}, in the presence of wildcards, if the
highest message id is known, the wildcard should get replaced
by that high value.
ó   *ó   1:*s   3:*rê   s   *:2)Ú*ú1:*z3:6z2:6N©r   ÚparseIdListÚziprD   Ústr©rG   ÚinputsÚoutputsÚirz   s        r4   Ú&test_stringRepresentationWithWildcardsÚ6MessageSetTests.test_stringRepresentationWithWildcardsß  su   € ô ×Ò˜dÓ#Ü×Ò˜fÓ%Ü×Ò˜f aÓ(Ü×Ò˜f aÓ(ð	
ˆò
ˆô ˜Ö(‰DˆAØ×ÑœS ›V QÖ'ò )r7   c                óÂ   • [         R                  " S5      [         R                  " S5      /nSS/n[        X5       H   u  p4U R                  [	        U5      U5        M"     g)zÏ
In a L{MessageSet}, inverting the high and low numbers in a
range doesn't affect the meaning of the range.  For example,
3:2 displays just like 2:3, because according to the RFC they
have the same meaning.
ó   2:3s   3:2ú2:3Nr  r  s        r4   Ú&test_stringRepresentationWithInversionÚ6MessageSetTests.test_stringRepresentationWithInversionö  s]   € ô ×Ò˜fÓ%Ü×Ò˜fÓ%ð
ˆð Øð
ˆô
 ˜Ö(‰DˆAØ×ÑœS ›V QÖ'ò )r7   c                ó¾   • [        S5      nU R                  [        U5      S5        U R                  [        U5      S5        U R                  [	        U5      S/5        g)zÖ
Creating a L{MessageSet} with a single message number adds
only that message to the L{MessageSet}; its serialized form
includes only that message number, its length is one, and it
yields only that message number.
rã   Ú1N©r   rD   r  rî   rï   ©rG   Úms     r4   Ú"test_createWithSingleMessageNumberÚ2MessageSetTests.test_createWithSingleMessageNumber
  sK   € ô �q‹MˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ˜a› 1 #Õ&r7   c                óÂ   • [        SS5      nU R                  [        U5      S5        U R                  [        U5      S5        U R                  [	        U5      / SQ5        g)a  
Creating a L{MessageSet} with both a start and end message
number adds the sequence between to the L{MessageSet}; its
serialized form consists that range, its length is the length
of the sequence, and it yields the message numbers inclusively
between the start and end.
rã   é
   z1:10)
rã   rç   rå   ré   rè   rê   rì   rë   é	   r  Nr  r  s     r4   Útest_createWithSequenceÚ'MessageSetTests.test_createWithSequence  sM   € ô �q˜"ÓˆØ×Ñœ˜Q› Ô(Ø×Ñœ˜Q› Ô$Ø×Ñœ˜a›Ò"AÕBr7   c                ó¼   • [        S5      nU R                  [        U5      S5        U R                  [        U5      S5        U R	                  [
        [        U5        g)z×
Creating a L{MessageSet} with a single L{None}, representing
C{*}, adds C{*} to the range; its serialized form includes
only C{*}, its length is one, but it cannot be iterated over
because its endpoint is unknown.
Nr  rã   )r   rD   r  rî   rö   r÷   rï   r  s     r4   Útest_createWithSingleWildcardÚ-MessageSetTests.test_createWithSingleWildcard#  sH   € ô �tÓˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ)¤T¨1Õ-r7   c                óÀ   • [        S5      nSUl        U R                  [        U5      S/5        [        SS5      nSUl        U R                  [        U5      / SQ5        g)zw
Setting L{MessageSet.last} replaces L{None}, representing
C{*}, with that number, making that L{MessageSet} iterable.
Nr  rå   rã   ræ   )r   ÚlastrD   rï   )rG   ÚsingleMessageReplacedÚrangeReplaceds      r4   Útest_setLastSingleWildcardÚ*MessageSetTests.test_setLastSingleWildcard/  sY   € ô
 !+¨4Ó 0ÐØ%'ÐÔ"Ø×ÑœÐ3Ó4°r°dÔ;ä" 1 dÓ+ˆØˆÔØ×Ñœ˜mÓ,ªiÕ8r7   c                óˆ   • [        SS5      nUR                  SS5        SUl        U R                  [	        U5      / SQ5        g)z<
Setting L{MessageSet.last} replaces L{None} in all ranges.
rã   Nrç   rè   ©rã   rç   rå   ré   rè   )r   rð   r"  rD   rï   r  s     r4   Útest_setLastWithWildcardRangeÚ-MessageSetTests.test_setLastWithWildcardRange<  s8   € ô �q˜$ÓˆØ	�‰ˆa�ŒØˆŒØ×Ñœ˜a›¢/Õ2r7   c                ó–   • [        SS5      nSUl        U R                  [        5         SUl        SSS5        g! , (       d  f       g= f)z)
L{MessageSet.last} cannot be set twice.
rã   Nrç   rå   )r   r"  rö   Ú
ValueErrorr  s     r4   Útest_setLastTwiceFailsÚ&MessageSetTests.test_setLastTwiceFailsE  s8   € ô �q˜$ÓˆØˆŒØ×ÑœzÕ*ØˆAŒF÷ +×*Ö*ús	   ©:º
Ac                ó"  • [        S5      nSUl        UR                  S5        U R                  [	        U5      SS/5        U R                  [	        US-   5      / SQ5        UR                  SS5        U R                  [	        U5      / SQ5        g)zâ
Adding a L{None}, representing C{*}, or a sequence that
includes L{None} to a L{MessageSet} whose
L{last<MessageSet.last>} property has been set replaces all
occurrences of L{None} with the value of
L{last<MessageSet.last>}.
rã   ré   N)Nrè   )rã   ré   rè   rå   )rã   rå   ré   )r   r"  rð   rD   rï   )rG   ÚhasLasts     r4   Útest_lastOverridesNoneInAddÚ+MessageSetTests.test_lastOverridesNoneInAddN  st   € ô ˜Q“-ˆØˆŒà�‰�DÔØ×Ñœ˜g›¨¨A¨Ô/à×Ñœ˜g¨	Ñ1Ó2²IÔ>à�‰�A�tÔØ×Ñœ˜g›ª	Õ2r7   c                ób   • [        SS5      nSUl        U R                  UR                  S5        g)z6
Accessing L{MessageSet.last} returns the last value.
rã   Nrç   )r   r"  rD   r  s     r4   Útest_getLastÚMessageSetTests.test_getLasta  s+   € ô �q˜$ÓˆØˆŒØ×Ñ˜Ÿ™ Õ#r7   c                ó>  • [        5       nUR                  S5        U R                  [        U5      S/5        [        5       nUR                  S5        U R                  [	        U5      S5        [        5       nUR                  S5        U R                  [        U5      / SQ5        [        5       nUR                  S5        U R                  [	        U5      S5        [        5       nUR                  [        SS5      5        U R                  [        U5      / SQ5        g)zË
L{MessageSet.extend} accepts as its arugment an L{int} or
L{None}, or a sequence L{int}s or L{None}s of length two, or
another L{MessageSet}, combining its argument with its
instance's existing ranges.
rã   Nr  rä   ræ   ©NNrå   )r   ÚextendrD   rï   r  )rG   ÚextendWithIntÚextendWithNoneÚextendWithSequenceOfIntsÚextendWithSequenceOfNonesÚextendWithMessageSets         r4   Útest_extendÚMessageSetTests.test_extendi  så   € ô #›ˆØ×Ñ˜QÔØ×Ñœ˜mÓ,¨q¨cÔ2ä#›ˆØ×Ñ˜dÔ#Ø×Ñœ˜^Ó,¨cÔ2ä#-£<Ð Ø ×'Ñ'¨Ô/Ø×ÑœÐ6Ó7ºÔCä$.£LÐ!Ø!×(Ñ(¨Ô6Ø×ÑœÐ6Ó7¸Ô=ä)›|ÐØ×#Ñ#¤J¨q°!Ó$4Ô5Ø×ÑœÐ2Ó3²YÕ?r7   c                óž  • [        SS5      n[        SS5      [        SS5      -   nU R                  SU5        U R                  SU5        US-   nU R                  [        5         SU;     SSS5        US-   nUR                  SS5        U R                  [        5         SU;     SSS5        g! , (       d  f       NI= f! , (       d  f       g= f)	zˆ
A L{MessageSet} contains a number if the number falls within
one of its ranges, and raises L{TypeError} if any range
contains L{None}.
rã   rì   ré   rê   rè   N)r  é   rë   )r   ÚassertInÚassertNotInrö   r÷   rð   )rG   ÚhasFiveÚdoesNotHaveFiveÚhasFiveButHasNoneÚhasFiveButHasNoneInSequences        r4   Útest_containsÚMessageSetTests.test_contains„  sº   € ô ˜Q Ó"ˆÜ$ Q¨Ó*¬Z¸¸1Ó-=Ñ=ˆà�‰�a˜Ô!Ø×Ñ˜˜OÔ,à# d™NÐØ×ÑœyÕ)ØÐ"Ò"÷ *ð '.°Ñ&8Ð#Ø#×'Ñ'¨¨4Ô0Ø×ÑœyÕ)ØÐ,Ò,÷ *Ð)÷ *Õ)ú÷
 *Õ)ús   Á$B-ÂB>Â-
B;Â>
Cc                óì  • [        SS5      n[        SS5      nX-   nU[        SS5      -   nU R                  [        US-   5      / SQ5        U R                  [        US	-   5      / S
Q5        U R                  [        US-   5      / SQ5        U R                  [        US-   5      / SQ5        U R                  [        US	-   5      / SQ5        U R                  [        U[        S5      -   5      / SQ5        g)z¶
Adding a sequence of message numbers to a L{MessageSet} that
begins or ends immediately before or after an existing
sequence in that L{MessageSet}, or overlaps one, merges the two.
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ì   N)r   rD   rï   )rG   Ú
mergeAfterÚmergeBeforeÚmergeBetweenSequenceÚmergeBetweenNumbers        r4   Útest_rangesMergedÚ!MessageSetTests.test_rangesMerged™  sÞ   € ô    1Ó%ˆ
Ü   AÓ&ˆà)Ñ7ÐØ'¬*°Q¸Ó*:Ñ:Ðà×Ñœ˜j¨6Ñ1Ó2²LÔAØ×Ñœ˜j¨6Ñ1Ó2²OÔDà×Ñœ˜k¨FÑ2Ó3²\ÔBØ×Ñœ˜k¨FÑ2Ó3²_ÔEà×ÑœÐ2°VÑ;Ó<Ò>VÔWØ×ÑÜÐ#¤j°£mÑ3Ó4Ò6Kõ	
r7   c                óþ   • U R                  [        SS5      [        SS5      5        U R                  [        [        SS5      5      / SQ5        [        SS5      nSUl        U R                  [        U5      SS/5        g)aŒ  
Test the C{seq-range} examples from Section 9, "Formal Syntax"
of RFC 3501::

    Example: 2:4 and 4:2 are equivalent and indicate values
             2, 3, and 4.

    Example: a unique identifier sequence range of
             3291:* includes the UID of the last message in
             the mailbox, even if that value is less than 3291.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
rç   ré   ©rç   rå   ré   iÛ  NiÚ  )rD   r   rï   r"  r  s     r4   Útest_seq_rangeExamplesÚ&MessageSetTests.test_seq_rangeExamples±  si   € ð 	×Ñœ A qÓ)¬:°a¸Ó+;Ô<Ø×Ñœœj¨¨AÓ.Ó/²Ô;ä�t˜TÓ"ˆØˆŒØ×Ñœ˜a› 4¨ ,Õ/r7   c                óT  • [        S5      [        SS5      -   [        S5      -   [        SS5      -   nSUl        U R                  SR                  S	 U 5       5      S
5        [        SS5      [        SS5      -   nSUl        U R                  SR                  S U 5       5      S5        g)aI  
Test the C{sequence-set} examples from Section 9, "Formal
Syntax" of RFC 3501.  In particular, L{MessageSet} reorders
and coalesces overlaps::

    Example: a message sequence number set of
             2,4:7,9,12:* for a mailbox with 15 messages is
             equivalent to 2,4,5,6,7,9,12,13,14,15

    Example: a message sequence number set of *:4,5:7
             for a mailbox with 10 messages is equivalent to
             10,9,8,7,6,5,4,5,6,7 and MAY be reordered and
             overlap coalesced to be 4,5,6,7,8,9,10.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
rç   ré   rì   r  rA  Né   Ú,c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr0   ©r  ©Ú.0r
  s     r4   Ú	<genexpr>Ú<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>Ý  s   é € Ð9Ò%8 ”S˜—V�VÒ%8ùó   ‚z2,4,5,6,7,9,12,13,14,15rè   r  c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr0   rY  rZ  s     r4   r\  r]  â  s   é € Ð!B²/¨Q¤# a§& &²/ùr^  z4,5,6,7,8,9,10)r   r"  rD   r¥   )rG   ÚfromFifteenMessagesÚfromTenMessagess      r4   Útest_sequence_setExamplesÚ)MessageSetTests.test_sequence_setExamplesÇ  s¢   € ô$ �q‹MœJ q¨!Ó,Ñ,¬z¸!«}Ñ<¼zÈ"ÈdÓ?SÑSð 	ð $&ÐÔ Ø×ÑØ�H‰HÑ9Ñ%8Ó9Ó9Ð;Tô	
ô % T¨1Ó-´
¸1¸aÓ0@Ñ@ˆØ!ˆÔØ×Ñ˜Ÿ™Ñ!B±/Ó!BÓBÐDTÕUr7   r1   N)r~   r   r€   r�   Ú__doc__ró   rø   rü   r  r  r  r  r  r%  r)  r-  r1  r4  r>  rH  rO  rS  rb  r‚   r1   r7   r4   rá   rá   š  se   † ñò1:òf?òò(ò.(ò(
'òCò
.ò9ò3òò3ò&$ò@ò6-ò*
ò00õ,Vr7   rá   c                  ó  • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S,r.g-).ÚIMAP4HelperTestsiå  z9
Tests for various helper utilities in the IMAP4 module.
c                óH   • [        [        R                  " SS/S5      5        g)z9
L{imap4.Command}'s C{repr} does not raise an exception.
s   COMMANDs   argó   extraN)rû   r   ÚCommandrW   s    r4   Útest_commandReprÚ!IMAP4HelperTests.test_commandReprê  s   € ô 	ŒU�]Š]˜:¨ x°(Ó<Õ=r7   c                ó
  ^ ^^^• Sm[        5       m[        T5      n[        R                  " U5      mTR	                  T5      nUUUU 4S jnU4S jnUR                  U5        UR                  U5        UR                  U5      $ )Ns   xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzc                óž   >• TR                  U T5        TR                  S[        T5      T4-  SR                  TR                  5      5        U $ )Ns   {%d}
%br7   )r¼   rD   rî   r¥   r‡   )r2   Úbr§   r¨   rG   s    €€€€r4   r©   Ú6IMAP4HelperTests.test_fileProducer.<locals>.cbProduced÷  sB   ø€ Ø×$Ñ$ V¨QÔ/Ø×Ñ˜]¬c°!«f°a¨[Ñ8¸#¿(¹(À1Ç8Á8Ó:LÔMØˆMr7   c                ó(   >• TR                  5         U $ r0   )r�   )r2   r¨   s    €r4   ÚcbResumeÚ4IMAP4HelperTests.test_fileProducer.<locals>.cbResumeü  s   ø€ ð ×ÑÔØˆMr7   )r„   r   r   ÚFileProducerr®   r¯   )rG   r3   r²   r©   rq  rn  r§   r¨   s   `    @@@r4   Útest_fileProducerÚ"IMAP4HelperTests.test_fileProducerð  ss   û€ Ø7ˆÜÓˆÜ�A‹JˆÜ×Ò˜qÓ!ˆØ×Ñ˜QÓˆ÷	ð 	õ
	ð 	
�‰�jÔ!Ø	�‰�hÔð �}‰}˜ZÓ(Ð(r7   c                ó"  • S/ SQSS//S/ SQ/ SQ/S/ S	Q/ S
Q//nU Ho  u  p#n[         R                  " US5      nU H#  nU R                  UR                  U5      5        M%     U H#  nU R	                  UR                  U5      5        M%     Mq     g )Núfoo/%gum/bar©zfoo/barzoo/lalagum/barzfoo/gumx/barzfoo/gum/bazúfoo/xgum/barúfoo/gum/barúfoo/x%x/bar©ÚfooÚbarzfuz fuz fuzz	foo/*/barúfoo/xyz/barz
foo/xx/baz)úfoo/xyx/barú
foo/xx/barúfoo/xxxxxxxxxxxxxx/barúfoo/xyz*abc/bar©r  zfoo/abc/barzfoo/xyzab/cbarzfoo/xyza/bcbar©zfoo/xyzabc/barzfoo/xyz/abc/barzfoo/xyz/123/abc/barÚ/©r   ÚwildcardToRegexpÚassertFalseÚmatchÚ
assertTrue©rG   ÚcasesÚwildcardÚfailÚsucceedÚxs         r4   Útest_wildcardÚIMAP4HelperTests.test_wildcard  s¡   € ð ÚLØ Ð/ðð ÚWÚGðð "ÚRÚLðð
ˆó$ (-Ñ#ˆH˜GÜ×-Ò-¨h¸Ó<ˆHÛ�Ø× Ñ  §¡°Ó!2Ö3ñ ã�Ø—‘ §¡¨qÓ 1Ö2ó ò	 (-r7   c                ó&  • S/ SQ/ SQ/S/ SQ/ SQ/S/ SQ/ S	Q//nU Hq  u  p#n[         R                  " US 5      nU H$  nU R                  UR                  U5      U5        M&     U H$  nU R	                  UR                  U5      U5        M&     Ms     g )
Nrw  rx  )ry  rz  zfoo/x/gum/barr{  r|  )r€  r�  r‚  zfoo/x/x/barrƒ  r„  r…  r‡  rŒ  s         r4   Útest_wildcardNoDelimÚ%IMAP4HelperTests.test_wildcardNoDelim"  s    € ð ÚLÚ@ðð ÚWÚVðð "ÚRÚLðð
ˆó$ (-Ñ#ˆH˜GÜ×-Ò-¨h¸Ó=ˆHÛ�Ø× Ñ  §¡°Ó!2°AÖ6ñ ã�Ø—‘ §¡¨qÓ 1°1Ö5ó ò	 (-r7   c           	     óÚ   • SSS.S4/nU H]  u  p#[         R                  " U5      nU R                  [        UR	                  S5      5      [        UR	                  S5      5      5        M_     g)zª
L{imap4._formatHeaders} accepts a C{dict} of header name/value pairs and
returns a string representing those headers in the standard multiline,
C{":"}-separated format.
ÚValue1ÚValue2)ÚHeader1ÚHeader2s"   Header2: Value2
Header1: Value1
TN)r   Ú_formatHeadersrD   ÚsortedÚ
splitlines)rG   r�  rl   Úexpectedre   s        r4   Útest_headerFormatterÚ%IMAP4HelperTests.test_headerFormatter<  sl   € ð %°Ñ:Ø9ðð
ˆó  %‰OˆEÜ×)Ò)¨%Ó0ˆFØ×ÑÜ�v×(Ñ(¨Ó.Ó/´¸×8KÑ8KÈDÓ8QÓ1Röò  %r7   c                ód  • / SQnSS/SS// SQ/ SQ/ SQ/ SQ/ S	Q/ S
Q/ SQ/ SQS/SS/S// SQS// SQS// SQS//n/ SQnU H2  nU R                  [        R                  [        R                  U5        M4     [	        X5       H+  u  pVU R                  [        R                  " U5      U5        M-     g )N)s   Hello Worlds   Hello "World!"s   World "Hello" "How are you?"s   "Hello world" How "are you?"s   foo bar "baz buz" NILs   foo bar "baz buz" "NIL"s   foo NIL "baz buz" bars   foo "NIL" "baz buz" bars   "NIL" bar "baz buz" foos   oo \"oo\" oos   "oo \"oo\" oo"ó   oo 	 oos	   "oo 	 oo"ó   oo \t oos
   "oo \t oo"ó   oo \o ooó
   "oo \o oo"r¥  r¦  ó   Helloó   Worlds   World!)r¨  r§  s   How are you?)r=   s   Hows   are you?)ó   fooó   baró   baz buzN)r©  rª  r«  ó   NIL)r©  Nr«  rª  )r©  r¬  r«  rª  )r¬  rª  r«  r©  )ó   oos   "oo"r­  ó
   oo "oo" oor­  r£  )r­  s   \tr­  r¤  )r­  ó   \or­  r¥  )s   "mismatched quotes   mismatched quote"s   mismatched"quotes   "oops here is" another")rö   r   ÚMismatchedQuotingÚsplitQuotedr  rD   )rG   r�  ÚanswersÚerrorsÚsÚcaserŸ  s          r4   Útest_quotedSplitterÚ$IMAP4HelperTests.test_quotedSplitterO  sÂ   € ò
ˆð. �xÐ Ø�yÐ!Ú1Ú1Ú.Ú0Ú.Ú0Ú0Ú#ØˆOØ�EˆNØˆMÚ"ØˆNÚ"ØˆNÚ"ØˆNð'
ˆò,
ˆó ˆAØ×Ñœe×5Ñ5´u×7HÑ7HÈ!ÖLñ ô " %Ö1‰NˆDØ×ÑœU×.Ò.¨tÓ4°hÖ?ò 2r7   c                ó  • / SQ/ SQ/ SQSS/S/ SQS/SS/ S	Q/S
SSS
/ SQS
SSS
/	S/ SQSS//nS// SQS/S/SS/S/SS//SS/S/SS/S//n[        X5       H+  u  p4U R                  [        R                  " U5      U5        M-     g )N)ó   aó   bó   có   dó   e)
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¿  s   abcde)r¹  s   bc ó   des   abcrÀ  s   bcds   abs   cdes   a s    es    bc  )r  rD   r   ÚcollapseStrings)rG   r�  r²  rµ  rŸ  s        r4   Útest_stringCollapserÚ%IMAP4HelperTests.test_stringCollapser‰  sÊ   € â*ÚHÚ  tÐ,ØÒ% tÐ,Ø�4Ò+Ð,Ø�4˜˜tÒ%7¸¸tÀTÈ4ÐPØÒ=¸tÀTÐJð
ˆð ˆJÚ!ØˆX�uÐØ�F�8˜TÐ"Ø�V�HÐØ�V�H˜eÐ$Ø�H�:˜uÐ%ð
ˆô " %Ö1‰NˆDØ×ÑœU×2Ò2°4Ó8¸(ÖCò 2r7   c                ó|  ^ • SR                  S/S-  5      nU 4S jnU" S[        U5      U4-  SS/ SQ/U/5        U" S	S
S/SSSSSSS/ SQ// SQ// SQ// SQ// SQ/ SQ/S S S/
SSSSS/S S SSS//
5        U" S S!/5        U" S"S#/5        U" S$S%/5        U" S&S'/5        U" S&S'/5        U" S(S)S*/5        U" S(S)S*/5        g )+Nó   
s   xxré   c                óV   >• [         R                  " U 5      nTR                  X!/5        g r0   )r   ÚparseNestedParensrD   )rµ  rŸ  ÚparsedrG   s      €r4   ÚcheckÚ0IMAP4HelperTests.test_parenParser.<locals>.check¤  s#   ø€ Ü×,Ò,¨TÓ2ˆFØ×Ñ˜V ZÕ0r7   s8   (BODY.PEEK[HEADER.FIELDS.NOT (subject bcc cc)] {%d}
%b)ó	   BODY.PEEKs   HEADER.FIELDS.NOT)s   subjects   bccs   ccs  (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) ((NIL NIL imap cac.washington.edu)) ((NIL NIL minutes CNRI.Reston.VA.US) ("John Klensin" NIL KLENSIN INFOODS.MIT.EDU)) NIL NIL <B27397-0100000@cac.washington.edu>) BODY (TEXT PLAIN (CHARSET US-ASCII) NIL NIL 7BIT 3028 92))ó   FLAGSs   \Seens   INTERNALDATEs   17-Jul-1996 02:44:25 -0700s   RFC822.SIZEs   4286s   ENVELOPEs%   Wed, 17 Jul 1996 02:23:25 -0700 (PDT)s$   IMAP4rev1 WG mtg summary and minutes)s
   Terry GrayNs   grayó   cac.washington.edu)NNs   imaprÍ  )NNs   minutess   CNRI.Reston.VA.US)s   John KlensinNs   KLENSINs   INFOODS.MIT.EDUs#   <B27397-0100000@cac.washington.edu>ó   BODYs   TEXTó   PLAINó   CHARSETs   US-ASCIIs   7BITs   3028s   92s   ("oo \"oo\" oo")r®  s   ("oo \\ oo")s   oo \\ oos   ("oo \ oo")s   oo \ oos	   ("oo \o")s   oo \os   (oo \o)r­  r¯  )r¥   rî   )rG   r´  rÉ  s   `  r4   Útest_parenParserÚ!IMAP4HelperTests.test_parenParser¡  s5  ø€ Ø�L‰L˜%˜ 1™Ó%ˆõ	1ñ 	ØIÌSÐQRËVÐUVÈKÑWØÐ0Ò2MÐNÐPQÐRô	
ñ 	ðJð Ø�ØØ-ØØØà<Ø;ÚJÐKÚJÐKÚJÐKÚAÐBâFÚOðð ØØ:ðð àØØ Ð-ØØØØØð	ð1"ô0	
ñd 	Ð# m _Ô5ÙÐ - Ô1Ùˆo ˜}Ô-áˆm˜i˜[Ô)Ùˆm˜i˜[Ô)Ùˆk˜E 6˜?Ô+Ùˆk˜E 6˜?Õ+r7   c           
     óÀ  • / SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ SQ/ S	Q/	nU H»  u  p#nUR                  S
5      n[        R                  " 5       nUR                  U5        U R	                  [        UR                  5      S5        U R                  [        UR                  S   [        XS5      5      5        U R	                  [        UR                  S   5      U5        M½     g )N)ÚENVELOPEÚEnvelopeÚenvelope)ÚFLAGSÚFlagsÚflags)ÚINTERNALDATEÚInternalDateÚinternaldate)úRFC822.HEADERÚRFC822Headerzrfc822.header)úRFC822.SIZEÚ
RFC822Sizezrfc822.size)úRFC822.TEXTÚ
RFC822Textzrfc822.text)ÚRFC822rã  Úrfc822)ÚUIDrå  Úuid)ÚBODYSTRUCTUREÚBodyStructureÚbodystructureÚasciirã   r   )rE   r   Ú_FetchParserÚparseStringrD   rî   r2   r‹  Ú
isinstanceÚgetattrr  )rG   r�  ÚinpÚoutpÚasStringr¨   s         r4   Útest_fetchParserSimpleÚ'IMAP4HelperTests.test_fetchParserSimpleð  s²   € â0Ú'Ú<Ú>Ú8Ú8Ú*Ú!Ú?ð

ˆó $)ÑˆC�xØ—*‘*˜WÓ%ˆCÜ×"Ò"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨AÔ.Ø�O‰OœJ q§x¡x°¡{´G¸AÓ4DÓEÔFØ×ÑœS §¡¨!¡Ó-¨xÖ8ò $)r7   c                óà  • SS/ SQ4/SS/ SQ4/SS/ S	Q4//nU HÌ  u  p#[         R                  " 5       nUR                  U5        U R                  [	        UR
                  5      US
   5        UR
                   Vs/ s H+  n[        U5      R                  5       R                  S5      PM-     nnUR                  5         US   R                  5         U R                  XcS   5        MÎ     g s  snf )Ns   ALLré   )ó   flagsó   internaldateó   rfc822.sizeó   envelopes   FULLrè   )rõ  rö  r÷  rø  s   bodys   FASTrå   )rõ  rö  r÷  r   rê  rã   )
r   rë  rì  rD   rî   r2   r  ÚlowerrE   Úsort)rG   r�  rï  rð  r¨   ÚtokenÚexpectedResults          r4   Útest_fetchParserMacrosÚ'IMAP4HelperTests.test_fetchParserMacros  sÝ   € à�aÒQÐRÐSàØÒUÐVðð �qÒEÐFÐGð
ˆó ‰IˆCÜ×"Ò"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨D°©GÔ4ØNOÏhÊhÓWÊhÀUœc %›j×.Ñ.Ó0×7Ñ7¸Ö@ÉhˆNÐWØ×ÑÔ!Ø�‰G�L‰LŒNØ×Ñ˜^°!©WÖ5ò ùò Xs   Á;2C+c                óZ  • [         R                  nU" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  S 5        U R                  [        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   5      S	5        U" 5       nUR                  S
5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  R                  / SQ5        U R                  UR
                  S   R                  S5        U R                  [!        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  R                  / SQ5        U R                  UR
                  S   R                  S5        U R                  [!        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R                  R                  S5        U R                  UR
                  S   R                  R                  / SQ5        U R                  UR
                  S   R                  S5        U R                  [!        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R"                  UR$                  5      5        U R                  UR
                  S   R&                  S5        U R                  UR
                  S   R(                  S5        U R                  UR
                  S   R*                  S5        U R                  UR
                  S   R                  S5        U R                  [!        UR
                  S   5      S5        U" 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  [        UR
                  S   R                  UR                  5      5        U R                  UR
                  S   R&                  S5        U R                  UR
                  S   R                  R                  SS/5        U R                  UR
                  S   R(                  S5        U R                  UR
                  S   R*                  S5        U R                  UR
                  S   R                  S5        U R                  [!        UR
                  S   5      S5        g )NrÎ  rã   r   FÚBODYrË  Ts   BODY[]zBODY[]s   BODY[HEADER]r1   zBODY[HEADER]s   BODY.PEEK[HEADER]s+   BODY[HEADER.FIELDS (Subject Cc Message-Id)])s   SUBJECTs   CCó
   MESSAGE-IDs0   BODY.PEEK[HEADER.FIELDS (Subject Cc Message-Id)]s4   BODY.PEEK[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s/   BODY[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s   BODY[1.MIME]<10.50>©r   r  é2   s?   BODY.PEEK[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   rç   rë   r  r  s   DATEég   éE   s:   BODY[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   rë  rì  rD   rî   r2   r‹  rí  ÚBodyÚpeekÚheaderr  ÚemptyÚHeaderÚnegateÚfieldsrO   ÚmimeÚMIMEÚpartÚpartialBeginÚpartialLength)rG   ÚPr¨   s      r4   Útest_fetchParserBodyÚ%IMAP4HelperTests.test_fetchParserBody  s›	  € Ü×Ñˆá‹CˆØ	�‰�gÔØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜Ÿ™ !™×+Ñ+¨TÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨6Ô2á‹CˆØ	�‰�lÔ#Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø×Ñœ˜QŸX™X a™[Ó)¨6Ô2á‹CˆØ	�‰�iÔ Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×*Ñ*¨DÔ1Ø×Ñœ˜QŸX™X a™[Ó)¨8Ô4á‹CˆØ	�‰�oÔ&Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨>Ô:á‹CˆØ	�‰Ð*Ô+Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨>Ô:á‹CˆØ	�‰ÐDÔEØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐIÔJØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐMÔNØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Rô	
ñ ‹CˆØ	�‰Ð,Ô-Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#3Ñ#3°Q·V±VÓ<Ô=Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø×Ñ˜Ÿ™ !™×1Ñ1°2Ô6Ø×Ñ˜Ÿ™ !™×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜qŸx™x¨™{Ó+Ð-CÔDá‹CˆØ	�‰ØNô	
ð 	×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×)Ñ)¨=Ô9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°]ÀGÐ4LÔMØ×Ñ˜Ÿ™ !™×1Ñ1°3Ô7Ø×Ñ˜Ÿ™ !™×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓØIõ	
r7   c                óž  • [         R                  " 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  [        UR
                  S   UR                  5      5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  SS9S5        g	)
zT
Partial requests starting at 0 and longer than the message
return the entire body.
s   BODY.PEEK[]<0.393216>rã   r   Ti   éd   )Úlengths	   BODY[]<0>N)r   rë  rì  rD   rî   r2   r‹  rí  r  r  r  r  r	  ÚgetBytes©rG   r¨   s     r4   Ú"test_fetchParserParseStringPartialÚ3IMAP4HelperTests.test_fetchParserParseStringPartialŒ  sø   € ô
 ×ÒÓ ˆØ	�‰Ð.Ô/Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø×Ñ˜Ÿ™ !™×1Ñ1°1Ô5Ø×Ñ˜Ÿ™ !™×2Ñ2°FÔ;Ø×Ñ˜Ÿ™ !™×*Ñ*¨DÔ1Ø×ÑØ�H‰H�Q‰K× Ñ ¨Ð Ð,Øõ	
r7   c                óô  • [         R                  " 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   UR                  5        U R                  UR
                  S   R                  UR                  5        U R                  [        UR
                  S   5      S5        g)z{
Parsing a C{BODY} whose C{HEADER} values require quoting
results in a object that perserves that quoting when
serialized.
s   BODY[HEADER.FIELDS ((Quoted)]rã   r   Fs   BODY[HEADER.FIELDS ("(Quoted")]N)r   rë  rì  rD   rî   r2   r  ÚassertIsInstancer  r  r
  rO   r  s     r4   Útest_fetchParserQuotedHeaderÚ-IMAP4HelperTests.test_fetchParserQuotedHeaderž  s±   € ô ×ÒÓ ˆØ	�‰Ð6Ô7Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q™k¨1¯6©6Ô2Ø×Ñ˜aŸh™h q™k×0Ñ0°!·(±(Ô;Ø×Ñœ˜qŸx™x¨™{Ó+Ð-OÕPr7   c                ó˜   • [         R                  " 5       nUR                  S5        U R                  [	        UR
                  5      5        g)z-
Parsing an empty string results in no data.
r7   N)r   rë  rì  r‰  rî   r2   r  s     r4   Útest_fetchParserEmptyStringÚ,IMAP4HelperTests.test_fetchParserEmptyString¬  s4   € ô ×ÒÓ ˆØ	�‰�cÔØ×Ñœ˜QŸX™X›Õ'r7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zD
Parsing a string with an unknown attribute raises an
L{Exception}.
s   UNKNOWNN©r   rë  rö   Ú	Exceptionrì  r  s     r4   Ú test_fetchParserUnknownAttributeÚ1IMAP4HelperTests.test_fetchParserUnknownAttribute´  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°JÕ?r7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zN
Parsing a string that prematurely ends in whitespace raises an
L{Exception}.
s   BODY[HEADER.FIELDS  Nr$  r  s     r4   Ú0test_fetchParserIncompleteStringEndsInWhitespaceÚAIMAP4HelperTests.test_fetchParserIncompleteStringEndsInWhitespace¼  ó)   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4KÕLr7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zg
Parsing a string that contains an unexpected character rather
than whitespace raises an L{Exception}.
s   BODY[HEADER.FIELDS!]Nr$  r  s     r4   Ú"test_fetchParserExpectedWhitespaceÚ3IMAP4HelperTests.test_fetchParserExpectedWhitespaceÄ  r+  r7   c                óô  • [         R                  " 5       nUR                  S5        U R                  [	        UR
                  5      S5        U R                  UR
                  S   UR                  5        U R                  UR
                  S   R                  S5        U R                  UR
                  S   R                  UR                  5        U R                  [        UR
                  S   5      S5        g)z*
A C{BODY} can contain a C{TEXT} section.
s
   BODY[TEXT]rã   r   FN)r   rë  rì  rD   rî   r2   r  r  r  rH   ÚTextrO   r  s     r4   Útest_fetchParserTextSectionÚ,IMAP4HelperTests.test_fetchParserTextSectionÌ  s¯   € ô ×ÒÓ ˆØ	�‰�mÔ$Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜aŸh™h q™k¨1¯6©6Ô2Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q™k×.Ñ.°·±Ô7Ø×Ñœ˜qŸx™x¨™{Ó+¨]Õ;r7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zC
Parsing a C{BODY} with an unknown section raises an
L{Exception}.
s   BODY[UNKNOWN]Nr$  r  s     r4   Útest_fetchParserUnknownSectionÚ/IMAP4HelperTests.test_fetchParserUnknownSectionØ  s)   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4DÕEr7   c                óÜ   • [         R                  " 5       nU R                  [        UR                  S5        [         R                  " 5       nU R                  [        UR                  S5        g)zM
Parsing a C{BODY} with an unterminated section list raises an
L{Exception}.
s   BODY[HEADERs   BODY[HEADER.FIELDS (SUBJECT)Nr$  r  s     r4   Ú#test_fetchParserMissingSectionCloseÚ4IMAP4HelperTests.test_fetchParserMissingSectionCloseà  sM   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°NÔCÜ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÕTr7   c                óÜ   • [         R                  " 5       nU R                  [        UR                  S5        [         R                  " 5       nU R                  [        UR                  S5        g)z�
Parsing a C{BODY} whose C{HEADER.FIELDS} list does not begin
with an open parenthesis (C{(}) or end with a close
parenthesis (C{)}) raises an L{Exception}.
s   BODY[HEADER.FIELDS Missing)]s   BODY[HEADER.FIELDS (Missing]Nr$  r  s     r4   Ú(test_fetchParserHeaderMissingParenthesesÚ9IMAP4HelperTests.test_fetchParserHeaderMissingParenthesesê  sN   € ô ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÔTÜ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÕTr7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zS
Parsing a C{BODY} with a range that lacks a period (C{.})
raises an L{Exception}.
s   BODY<01>Nr$  r  s     r4   Útest_fetchParserDotlessPartialÚ/IMAP4HelperTests.test_fetchParserDotlessPartialõ  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°KÕ@r7   c                óp   • [         R                  " 5       nU R                  [        UR                  S5        g)zt
Parsing a C{BODY} with a partial range that's missing its
closing greater than sign (C{>}) raises an L{EXCEPTION}.
s   BODY<0Nr$  r  s     r4   Útest_fetchParserUnclosedPartialÚ0IMAP4HelperTests.test_fetchParserUnclosedPartialý  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°IÕ>r7   c                óv   • SSS[        S5      SS/nSnU R                  [        R                  " U5      U5        g )Nr}  r~  Úbazó   this is a file
ÚbuzÚbizs4   "foo" "bar" "baz" {16}
this is a file
 "buz" "biz")r   rD   r   ÚcollapseNestedLists)rG   ÚinputStructurere   s      r4   Ú
test_filesÚIMAP4HelperTests.test_files  sD   € àØØÜÐ)Ó*ØØð
ˆð Mˆà×Ñœ×2Ò2°>ÓBÀFÕKr7   c                óÈ   • S[         R                  " S5      S[        S5      S[         R                  " S5      S/nSnU R                  [         R                  " U5      U5        g )	Nr©  rª  s   bazrD  s   this is
quoteds   buzr7   sC   "foo" bar "baz" {16}
this is a file
 {15}
this is
quoted buz "")r   ÚDontQuoteMer   rD   rG  rk   s      r4   Útest_quoteAvoiderÚ"IMAP4HelperTests.test_quoteAvoider  sa   € àÜ×Ò˜fÓ%ØÜÐ)Ó*Ø Ü×Ò˜fÓ%Øð
ˆðð 	ð 	×Ñœ×2Ò2°5Ó9¸6ÕBr7   c                ót   • SS//4/nU H+  u  p#U R                  [        R                  " U5      U5        M-     g )Ns   ({10}
0123456789)s
   0123456789)rD   r   rÇ  )rG   r�  rµ  rŸ  s       r4   Útest_literalsÚIMAP4HelperTests.test_literals'  s?   € à$¨ Ð&7Ð8ð
ˆó $‰NˆDØ×ÑœU×4Ò4°TÓ:¸HÖEò $r7   c                ór  • [         R                  " SS9[         R                  " SSSS9[         R                  " [         R                  " SS9[         R                  " SS95      [         R                  " SS9[         R                  " [         R                  " SS9[         R                  " SS9[         R                  " SS95      [         R                  " [         R                  " [         R                  " [         R                  " SS	S
S9[         R                  " SSSS9[         R                  " SSSSS9[         R                  " [         R                  " SS95      5      5      [         R                  " [         R                  " SS95      5      /n/ SQn[	        X5       H  u  p4U R                  X45        M     g )Nrã   )Úflagged)r�  Ú	unflaggedÚdeleted)rU  Útoday)Úbefore)Úunseen)ÚnewÚ	yesterdayiè  )r�  ÚsinceÚsmallerÚtuesdayi'  )r�  rW  Úlarger)r�  rX  rU  rW  Úspam)rŸ   z1:5©ræ  )ÚFLAGGEDz(DELETED UNFLAGGED)z(OR FLAGGED DELETED)z(BEFORE "today")z(OR DELETED (OR UNSEEN NEW))z¡(OR (NOT (OR (SINCE "yesterday" SMALLER 1000) (OR (BEFORE "tuesday" LARGER 10000) (OR (BEFORE "today" DELETED UNSEEN) (NOT (SUBJECT "spam")))))) (NOT (UID 1:5))))r   ÚQueryÚOrÚNotr  rD   )rG   r  r	  ÚqueryrŸ  s        r4   Útest_queryBuilderÚ"IMAP4HelperTests.test_queryBuilder/  s'  € ä�KŠK Ñ"Ü�KŠK˜q¨A°qÑ9Ü�HŠH”U—[’[¨Ñ+¬U¯[ª[ÀÑ-CÓDÜ�KŠK˜wÑ'Ü�HŠH”U—[’[¨Ñ+¬U¯[ª[ÀÑ-BÄEÇKÂKÐTUÑDVÓWÜ�HŠHÜ—	’	Ü—H’HÜŸš¨1°KÈÑNÜŸš¨1°YÀuÑMÜŸš¨1°QÀÈ'ÑRÜŸ	š	¤%§+¢+°fÑ"=Ó>ó	óô —	’	œ%Ÿ+š+¨%Ñ0Ó1ó
ð
ˆò&

ˆô  # 6Ö3‰OˆEØ×Ñ˜UÖ-ò  4r7   c                óP   • [         R                  " SS9nU R                  SU5        g)zÂ
When passed the C{keyword} argument, L{imap4.Query} returns an unquoted
string.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
@see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
Útwisted)Úkeywordz(KEYWORD twisted)N©r   rb  rD   ©rG   re  s     r4   Útest_queryKeywordFlagWithQuotesÚ0IMAP4HelperTests.test_queryKeywordFlagWithQuotesR  s#   € ô —’ IÑ.ˆØ×ÑÐ,¨eÕ4r7   c                óP   • [         R                  " SS9nU R                  SU5        g)zÄ
When passed the C{unkeyword} argument, L{imap4.Query} returns an
unquoted string.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
@see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
ri  )Ú	unkeywordz(UNKEYWORD twisted)Nrk  rl  s     r4   Ú!test_queryUnkeywordFlagWithQuotesÚ2IMAP4HelperTests.test_queryUnkeywordFlagWithQuotes]  s#   € ô —’ iÑ0ˆØ×ÑÐ.°Õ6r7   c                óz   • [         R                  " [         R                  " SS5      S9nU R                  US5        g)zv
When passed a L{MessageSet}, L{imap4.Query} returns a query
containing a quoted string representing the ID sequence.
rã   N©Úmessagesz(MESSAGES "1:*"))r   rb  r   rD   rl  s     r4   Útest_queryWithMesssageSetÚ*IMAP4HelperTests.test_queryWithMesssageSeth  s0   € ô
 —’¤U×%5Ò%5°a¸Ó%>Ñ?ˆØ×Ñ˜Ð 2Õ3r7   c                óP   • [         R                  " SS9nU R                  US5        g)zT
When passed an L{int}, L{imap4.Query} returns a query
containing a quoted integer.
rã   rt  z(MESSAGES "1")Nrk  rl  s     r4   Útest_queryWithIntegerÚ&IMAP4HelperTests.test_queryWithIntegerp  s#   € ô
 —’ QÑ'ˆØ×Ñ˜Ð 0Õ1r7   c                ó†   • U R                  [        R                  [        R                  [        R                  " SS95        g)zY
An L{imap4.Or} query with less than two arguments raises an
L{imap4.IllegalQueryError}.
rã   rt  N)rö   r   ÚIllegalQueryErrorrc  rb  rW   s    r4   Útest_queryOrIllegalQueryÚ)IMAP4HelperTests.test_queryOrIllegalQueryx  s*   € ð
 	×Ñœ%×1Ñ1´5·8±8¼U¿[º[ÐRSÑ=TÕUr7   c                ó4  • U R                  SUR                  5        S3[        R                  " S
0 US0D65        U R                  SUR                  5        S3[        R                  " S
0 USSR	                  S [        S5       5       5      < S30D65        g	)z¶
Helper to implement tests for value filtering of KEYWORD and UNKEYWORD
queries.

@param keyword: A native string giving the name of the L{imap4.Query}
    keyword argument to test.
Ú(z twistedrocks)ztwisted (){%*"\] rocksztwisted Ú c              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr0   )ry   )r[  Úchs     r4   r\  Ú9IMAP4HelperTests._keywordFilteringTest.<locals>.<genexpr>“  s   é € Ð;²¨2œs 2Ÿw˜w²ùr^  é!   z rocksNr1   )rD   Úupperr   rb  r¥   rx   )rG   rj  s     r4   Ú_keywordFilteringTestÚ&IMAP4HelperTests._keywordFilteringTest  s‘   € ð 	×ÑØ�—‘“Ð  Ð/Ü�KŠKÑ?˜7Ð$=Ð>Ñ?ô	
ð 	×ÑØ�—‘“Ð  Ð/Ü�KŠKñ áØ—w‘wÑ;´°r´Ó;Ö;ð>ðñõ	
r7   c                ó&   • U R                  S5        g)a¢  
When passed the C{keyword} argument, L{imap4.Query} returns an
C{atom} that consists of one or more non-special characters.

List of the invalid characters:

    ( ) { % * " \ ] CTL SP

@see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
@see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
@see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
rj  N©r‡  rW   s    r4   Útest_queryKeywordFlagÚ&IMAP4HelperTests.test_queryKeywordFlag˜  s   € ð 	×"Ñ" 9Õ-r7   c                ó&   • U R                  S5        g)a¤  
When passed the C{unkeyword} argument, L{imap4.Query} returns an
C{atom} that consists of one or more non-special characters.

List of the invalid characters:

    ( ) { % * " \ ] CTL SP

@see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
@see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
@see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
rp  NrŠ  rW   s    r4   Útest_queryUnkeywordFlagÚ(IMAP4HelperTests.test_queryUnkeywordFlag§  s   € ð 	×"Ñ" ;Õ/r7   c                ó~   • / SQnU H3  nU R                  [        R                  [        R                  US5        M5     g)zd
Trying to parse an invalid representation of a sequence range raises an
L{IllegalIdentifierError}.
)s   *:*r©  s   4:s   bar:5é90  N©rö   r   ÚIllegalIdentifierErrorr  ©rG   r  rl   s      r4   Útest_invalidIdListParserÚ)IMAP4HelperTests.test_invalidIdListParser¶  s6   € ò
 3ˆãˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈöò r7   c                ó~   • / SQnU H3  nU R                  [        R                  [        R                  US5        M5     g)zÓ
Zeroes and negative values are not accepted in id range expressions. RFC
3501 states that sequence numbers and sequence ranges consist of
non-negative numbers (RFC 3501 section 9, the seq-number grammar item).
)s   0:5s   0:0s   *:0ó   0s   -3:5s   1:-2s   -1r‘  Nr’  r”  s      r4   Ú#test_invalidIdListParserNonPositiveÚ4IMAP4HelperTests.test_invalidIdListParserNonPositiveÂ  s7   € ò IˆãˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈöò r7   c                ó¦  • / SQn[        SS5      [        SS5      [        SS5      [        SS5      -   [        SS5      [        S5      [        SS5      [        S5      [        S5      -   [        S5      -   [        SS5      [        SS5      [        SS5      [        SS	5      -   [        S5      [        SS5      -   [        S5      [        SS5      -   [        S
S	5      -   [        SS5      [        S
5      -   [        S	S5      -   [        SS5      /n/ SQn[        X5       H+  u  pEU R                  [        R                  " U5      U5        M-     [        X5       Hv  u  pEUc1  U R                  [        [        [        R                  " U5      5        M9  [        [        R                  " U5      5      nU R                  XeSU< SU< SU< 35        Mx     g)zQ
The function to parse sequence ranges yields appropriate L{MessageSet}
objects.
)r   s   5:*s   1:2,5:*rÿ   ó   1s   1,2s   1,3,5s   1:10s   1:10,11s	   1:5,10:20s   1,5:10s   1,5:10,15:20s   1:10,15,20:25ó   4:2rã   Nrè   rç   rå   r  é   é   rV  é   ré   )NNNrã   rã   rç   rå   r  rž  é   rì   é   é   rå   zlen(z) = z != )r   r  rD   r   r  rö   r÷   rî   )rG   r  r	  Úlengthsrl   rŸ  ÚLs          r4   Útest_parseIdListÚ!IMAP4HelperTests.test_parseIdListÏ  s—  € ò

ˆô$ �q˜$ÓÜ�q˜$ÓÜ�q˜$Ó¤*¨Q°Ó"2Ñ2Ü�t˜TÓ"Ü�q‹MÜ�q˜!ÓÜ�q‹MœJ q›MÑ)¬J°q«MÑ9Ü�q˜"ÓÜ�q˜"ÓÜ�q˜!Óœz¨"¨bÓ1Ñ1Ü�q‹MœJ q¨"Ó-Ñ-Ü�q‹MœJ q¨"Ó-Ñ-´
¸2¸rÓ0BÑBÜ�q˜"Ó¤
¨2£Ñ.´¸BÀÓ1CÑCÜ�q˜!Óð
ˆò" Kˆä" 6Ö3‰OˆEØ×ÑœU×.Ò.¨uÓ5°xÖ@ñ  4ô  # 6Ö3‰OˆEØÑØ×!Ñ!¤)¬S´%×2CÒ2CÀEÓ2JÖKäœ×)Ò)¨%Ó0Ó1�Ø× Ñ  °°U±I¸TÀ!ÁÀdÈ8É,Ð.WÖXò  4r7   c                óN   • U R                  [        [        R                  S5        g)z]
L{imap4.parseTime} raises L{ValueError} when given a a time
string whose format is invalid.
ÚinvalidN©rö   r,  r   Ú	parseTimerW   s    r4   Útest_parseTimeInvalidFormatÚ,IMAP4HelperTests.test_parseTimeInvalidFormat  s   € ð
 	×Ñœ*¤e§o¡o°yÕAr7   c                óh   • / SQnU H(  nU R                  [        [        R                  U5        M*     g)z^
L{imap4.parseTime} raises L{ValueError} when given a time
string composed of invalid values.
)zinvalid-July-2017z2-invalid-2017z2-July-invalidNrª  )rG   ÚinvalidStringsr©  s      r4   Útest_parseTimeInvalidValuesÚ,IMAP4HelperTests.test_parseTimeInvalidValues	  s+   € ò

ˆó
 &ˆGØ×Ñœj¬%¯/©/¸7ÖCò &r7   c                ó  • [        5       nUR                  5       UR                  5       UR                  5       UR	                  5       UR                  5       S.n[        R                  " XR                  5       5      nU R                  X#5        g)z‹
L{imap4.statusRequestHelper} builds a L{dict} mapping the
requested status names to values extracted from the provided
L{IMailboxIMAP}'s.
)ÚMESSAGESÚRECENTÚUIDNEXTÚUIDVALIDITYÚUNSEENN)
ÚSimpleMailboxÚgetMessageCountÚgetRecentCountÚ
getUIDNextÚgetUIDValidityÚgetUnseenCountr   ÚstatusRequestHelperÚkeysrD   )rG   ÚmboxrŸ  r2   s       r4   Útest_statusRequestHelperÚ)IMAP4HelperTests.test_statusRequestHelper  st   € ô ‹ˆð ×,Ñ,Ó.Ø×)Ñ)Ó+Ø—‘Ó(Ø×.Ñ.Ó0Ø×)Ñ)Ó+ñ
ˆô ×*Ò*¨4·±³ÓAˆà×Ñ˜Õ*r7   r1   N)/r~   r   r€   r�   rd  rj  rt  r’  r•  r   r¶  rÂ  rÑ  rò  rý  r  r  r  r!  r&  r)  r-  r1  r4  r7  r:  r=  r@  rI  rM  rP  rf  rm  rq  rv  ry  r}  r‡  r‹  rŽ  r•  r™  r¦  r¬  r°  rÁ  r‚   r1   r7   r4   rf  rf  å  sì   † ñò>ò)ò03ò46ò4ò&8@òtDò0M,ò^9ò*6ò&r
òh
ò$Qò(ò@òMòMò
<òFòUò	UòAò?òLòCò(Fò!.òF	5ò	7ò4ò2òVò
ò2.ò0ò
òò1YòfBòDõ+r7   rf  c                  óž   • \ rS rSr% Sr/ rS\S'   SrSrSr	S r
S	 rS
 rS rS rS rS rS rS rS rS rSS jrS rS rS rS rS rSrg)r¸  i+  ©z\Flag1ÚFlag2z\AnotherSysFlagÚLastFlagú+list[tuple[bytes, list[bytes], bytes, int]]ru  r   rã   Fc                ó~   • / U l         U R                   R                  U l        U R                   R                  U l        g r0   ©Ú	listenersr‹   ÚaddListenerÚremoveÚremoveListenerrW   s    r4   rˆ   ÚSimpleMailbox.__init__3  ó-   € ØˆŒØŸ>™>×0Ñ0ˆÔØ"Ÿn™n×3Ñ3ˆÕr7   c                ó   • U R                   $ r0   ©rÙ  rW   s    r4   ÚgetFlagsÚSimpleMailbox.getFlags8  ó   € Ø�z‰zÐr7   c                ó   • g)Né*   r1   rW   s    r4   r¼  ÚSimpleMailbox.getUIDValidity;  s   € Ør7   c                ó2   • [        U R                  5      S-   $ ©Nrã   ©rî   ru  rW   s    r4   r»  ÚSimpleMailbox.getUIDNext>  s   € Ü�4—=‘=Ó! AÑ%Ð%r7   c                ó   • g)Nr  r1   rW   s    r4   r¹  ÚSimpleMailbox.getMessageCountA  ó   € Ør7   c                ó   • g)Nrå   r1   rW   s    r4   rº  ÚSimpleMailbox.getRecentCountD  rÞ  r7   c                ó   • g)Nré   r1   rW   s    r4   r½  ÚSimpleMailbox.getUnseenCountG  rÞ  r7   c                ó   • U R                   $ r0   ©ÚrwrW   s    r4   ÚisWriteableÚSimpleMailbox.isWriteableJ  s   € Ø�w‰wˆr7   c                ó   • g r0   r1   rW   s    r4   ÚdestroyÚSimpleMailbox.destroyM  ó   € Ør7   c                ó   • g)Nr†  r1   rW   s    r4   ÚgetHierarchicalDelimiterÚ&SimpleMailbox.getHierarchicalDelimiterP  s   € Ør7   c                ó2  • 0 nSU;   a  U R                  5       US'   SU;   a  U R                  5       US'   SU;   a  U R                  5       S-   US'   SU;   a  U R                  5       US'   SU;   a  U R                  5       US'   [        R
                  " U5      $ )Nr³  r´  rµ  rã   r¶  r·  ©r¹  rº  ÚgetUIDr½  r   r�  ©rG   ÚnamesÚrs      r4   ÚrequestStatusÚSimpleMailbox.requestStatusS  s›   € ØˆØ˜ÓØ ×0Ñ0Ó2ˆAˆj‰MØ�uÓØ×-Ñ-Ó/ˆAˆh‰KØ˜ÓØ×/Ñ/Ó1°AÑ5ˆAˆi‰LØ˜EÓ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÓØ×-Ñ-Ó/ˆAˆh‰KÜ�}Š}˜QÓÐr7   Nc                ó¦   • U R                   R                  XX0R                  45        U =R                  S-  sl        [        R                  " S 5      $ rÙ  ©ru  r‹   ÚmUIDr   r�  ©rG   ÚmessagerÙ  Údates       r4   Ú
addMessageÚSimpleMailbox.addMessagea  s9   € Ø�‰×Ñ˜g¨d·I±IÐ>Ô?Ø�	Š	�Q‰�	Ü�}Š}˜TÓ"Ð"r7   c                óà   • / nU R                    H  nSUS   ;   d  M  UR                  U5        M!     U H  nU R                   R                  U5        M      U Vs/ s H  o"S   PM	     sn$ s  snf )Nú\Deletedrã   rå   ©ru  r‹   rÌ  ©rG   Údeleter
  s      r4   ÚexpungeÚSimpleMailbox.expungef  se   € ØˆØ—”ˆAØ˜a ™dÕ"Ø—‘˜aÖ ñ ó ˆAØ�M‰M× Ñ  Ö#ñ á$Ó%šf˜�!”™fÑ%Ð%ùÒ%ó   ÁA+c                ó   • SU l         g ©NT)ÚclosedrW   s    r4   ÚcloseÚSimpleMailbox.closeo  s	   € Øˆ�r7   c                ó   • g r0   r1   ©rG   ru  ræ  s      r4   ÚfetchÚSimpleMailbox.fetchr  ó   € àr7   c                ó   • g r0   r1   ©rG   rû  s     r4   rñ  ÚSimpleMailbox.getUIDv  r  r7   c                ó   • g r0   r1   ©rG   ru  rÙ  Úmoderæ  s        r4   ÚstoreÚSimpleMailbox.storez  r  r7   )rË  r	  rÊ  rÍ  r0   )r~   r   r€   r�   rÙ  ru  Ú__annotations__rù  rå  r	  rˆ   rÒ  r¼  r»  r¹  rº  r½  ræ  ré  rí  rõ  rý  r  r
  r  rñ  r  r‚   r1   r7   r4   r¸  r¸  +  sv   ‡ à@€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ô#ò
&òòòõr7   r¸  c                  óœ   • \ rS rSr% SrSr/ rS\S'   SrSr	Sr
S	 rS
 rS rS rS rS rS rS rS rS rS rSS jrS rS rS rS rSrg)ÚUncloseableMailboxi  z"
A mailbox that cannot be closed.
rÄ  rÇ  ru  r   rã   Fc                ó~   • / U l         U R                   R                  U l        U R                   R                  U l        g r0   rÉ  rW   s    r4   rˆ   ÚUncloseableMailbox.__init__‹  rÏ  r7   c                ó   • U R                   $ )z*
The flags

@return: A sequence of flags.
rÑ  rW   s    r4   rÒ  ÚUncloseableMailbox.getFlags�  s   € ð �z‰zÐr7   c                ó   • g)z.
The UID validity value.

@return: The value.
rÖ  r1   rW   s    r4   r¼  Ú!UncloseableMailbox.getUIDValidity˜  s   € ð r7   c                ó2   • [        U R                  5      S-   $ )z"
The next UID.

@return: The UID.
rã   rÚ  rW   s    r4   r»  ÚUncloseableMailbox.getUIDNext   s   € ô �4—=‘=Ó! AÑ%Ð%r7   c                ó   • g)z/
The number of messages.

@return: The number.
r  r1   rW   s    r4   r¹  Ú"UncloseableMailbox.getMessageCount¨  ó   € ð r7   c                ó   • g)ú,
The recent messages.

@return: The number.
rå   r1   rW   s    r4   rº  Ú!UncloseableMailbox.getRecentCount°  r&  r7   c                ó   • g)r(  ré   r1   rW   s    r4   r½  Ú!UncloseableMailbox.getUnseenCount¸  r&  r7   c                ó   • U R                   $ )zH
The recent messages.

@return: Whether or not the mailbox is writable.
rä  rW   s    r4   ræ  ÚUncloseableMailbox.isWriteableÀ  s   € ð �w‰wˆr7   c                ó   • g)z
Destroy this mailbox.
Nr1   rW   s    r4   ré  ÚUncloseableMailbox.destroyÈ  s   € ð 	r7   c                ó   • g)z=
Return the hierarchical delimiter.

@return: The delimiter.
r†  r1   rW   s    r4   rí  Ú+UncloseableMailbox.getHierarchicalDelimiterÎ  s   € ð r7   c                ó2  • 0 nSU;   a  U R                  5       US'   SU;   a  U R                  5       US'   SU;   a  U R                  5       S-   US'   SU;   a  U R                  5       US'   SU;   a  U R                  5       US'   [        R
                  " U5      $ )zn
Return the mailbox's status.

@param names: The status items to include.

@return: A L{dict} of status data.
r³  r´  rµ  rã   r¶  r·  rð  rò  s      r4   rõ  Ú UncloseableMailbox.requestStatusÖ  s�   € ð ˆØ˜ÓØ ×0Ñ0Ó2ˆAˆj‰MØ�uÓØ×-Ñ-Ó/ˆAˆh‰KØ˜ÓØ×/Ñ/Ó1°AÑ5ˆAˆi‰LØ˜EÓ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÓØ×-Ñ-Ó/ˆAˆh‰KÜ�}Š}˜QÓÐr7   Nc                ó¦   • U R                   R                  XX0R                  45        U =R                  S-  sl        [        R                  " S5      $ )zÌ
Add a message to the mailbox.

@param message: The message body.

@param flags: The message flags.

@param date: The message date.

@return: A L{Deferred} that fires when the message has been
    added.
rã   Nrø  rú  s       r4   rý  ÚUncloseableMailbox.addMessageë  s;   € ð 	�‰×Ñ˜g¨d·I±IÐ>Ô?Ø�	Š	�Q‰�	Ü�}Š}˜TÓ"Ð"r7   c                óà   • / nU R                    H  nSUS   ;   d  M  UR                  U5        M!     U H  nU R                   R                  U5        M      U Vs/ s H  o"S   PM	     sn$ s  snf )zR
Delete messages marked for deletion.

@return: A L{list} of deleted message IDs.
r   rã   rå   r  r  s      r4   r  ÚUncloseableMailbox.expungeü  sg   € ð ˆØ—”ˆAØ˜a ™dÕ"Ø—‘˜aÖ ñ ó ˆAØ�M‰M× Ñ  Ö#ñ á$Ó%šf˜�!”™fÑ%Ð%ùÒ%r  c                ó   • g r0   r1   r  s      r4   r  ÚUncloseableMailbox.fetch
  r  r7   c                ó   • g r0   r1   r  s     r4   rñ  ÚUncloseableMailbox.getUID  r  r7   c                ó   • g r0   r1   r  s        r4   r  ÚUncloseableMailbox.store  r  r7   )rË  rÊ  rÍ  r0   )r~   r   r€   r�   rd  rÙ  ru  r  rù  rå  r	  rˆ   rÒ  r¼  r»  r¹  rº  r½  ræ  ré  rí  rõ  rý  r  r  rñ  r  r‚   r1   r7   r4   r  r    sy   ‡ ñð A€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ô*#ò"&òòõr7   r  c                  ó,   • \ rS rSrSr\rS rSS jrSr	g)ÚAccountWithoutNamespacesi  zD
An in-memory account that does not provide L{INamespacePresenter}.
c                ó"   • U R                  5       $ r0   )ÚmailboxFactory)rG   ÚnameÚids      r4   Ú_emptyMailboxÚ&AccountWithoutNamespaces._emptyMailbox  s   € Ø×"Ñ"Ó$Ð$r7   c                óV   • [         R                  R                  X5      nUb  X#l        U$ r0   )r   ÚMemoryAccountÚselectrå  )rG   rB  rå  rÀ  s       r4   rH  ÚAccountWithoutNamespaces.select!  s(   € Ü×"Ñ"×)Ñ)¨$Ó5ˆØÑØŒGØˆr7   r1   N©rã   )
r~   r   r€   r�   rd  r¸  rA  rD  rH  r‚   r1   r7   r4   r?  r?    s   † ñð #€Nò%÷r7   r?  c                  ó   • \ rS rSrSrSrg)ÚAccounti(  z<
An in-memory account that provides L{INamespacePresenter}.
r1   N©r~   r   r€   r�   rd  r‚   r1   r7   r4   rL  rL  (  s   † ôr7   rL  c                  ó0   • \ rS rSr\" S5      rS rS rSrg)ÚSimpleServeri.  ó   testuserc                óô   • [         R                  R                  " U /UQ70 UD6  [        U S9n[	        U5      n[        5       nUR                  SS5        XPl        X@l        UR                  U5        SU l
        g )N©ÚaccountHolderrP  ó   password-testF)r   ÚIMAP4Serverrˆ   Ú	TestRealmr   r   ÚaddUserÚcheckerÚportalÚregisterCheckerÚtimeoutTest)rG   ÚargsÚkwÚrealmrY  r§   s         r4   rˆ   ÚSimpleServer.__init__1  sj   € Ü×Ñ×"Ò" 4Ð5¨$Ò5°"Ò5Ü¨Ñ-ˆÜ˜“ˆÜ3Ó5ˆØ	�	‰	�+Ð/Ô0ØŒØŒØ×Ñ˜qÔ!Ø ˆÕr7   c                óf   • U R                   (       a  g [        R                  R                  X5        g r0   )r[  r   rU  ÚlineReceived©rG   Úlines     r4   ra  ÚSimpleServer.lineReceived<  s"   € Ø××àä×Ñ×&Ñ& tÕ2r7   )rX  rY  r[  N)	r~   r   r€   r�   rL  Ú
theAccountrˆ   ra  r‚   r1   r7   r4   rO  rO  .  s   † Ù˜Ó%€Jò	!õ3r7   rO  c                  ó6   • \ rS rSrS	S jrS rS rS rS rSr	g)
ÚSimpleClientiD  Nc                ó\   • [         R                  R                  X5        Xl        / U l        g r0   )r   ÚIMAP4Clientrˆ   ÚdeferredÚevents)rG   rj  ÚcontextFactorys      r4   rˆ   ÚSimpleClient.__init__E  s"   € Ü×Ñ×"Ñ" 4Ô8Ø ŒØˆ�r7   c                ó:   • U R                   R                  S 5        g r0   )rj  Úcallback)rG   Úcapss     r4   ÚserverGreetingÚSimpleClient.serverGreetingJ  s   € Ø�‰×Ñ˜tÕ$r7   c                ór   • U R                   R                  SU/5        U R                  R                  5         g )NÚmodeChanged©rk  r‹   Ú	transportÚloseConnection)rG   Ú	writeables     r4   rt  ÚSimpleClient.modeChangedM  s)   € Ø�‰×Ñ˜M¨9Ð5Ô6Ø�‰×%Ñ%Õ'r7   c                ór   • U R                   R                  SU/5        U R                  R                  5         g )NÚflagsChangedru  ©rG   ÚnewFlagss     r4   r{  ÚSimpleClient.flagsChangedQ  s)   € Ø�‰×Ñ˜N¨HÐ5Ô6Ø�‰×%Ñ%Õ'r7   c                ór   • U R                   R                  SX/5        U R                  R                  5         g )NÚnewMessagesru  )rG   ÚexistsÚrecents      r4   r€  ÚSimpleClient.newMessagesU  s)   € Ø�‰×Ñ˜M¨6Ð:Ô;Ø�‰×%Ñ%Õ'r7   )rj  rk  r0   )
r~   r   r€   r�   rˆ   rq  rt  r{  r€  r‚   r1   r7   r4   rg  rg  D  s   † ôò
%ò(ò(õ(r7   rg  c                  óV   • \ rS rSr% SrS\S'   SrS\S'   S rS rS	 r	S
 r
S rS rSrg)ÚIMAP4HelperMixiniZ  NzOptional[ServerTLSContext]Ú	serverCTXzOptional[ClientTLSContext]Ú	clientCTXc                óò   • [         R                  " 5       n[        U R                  S9U l        [        XR                  S9U l        Xl        / [        l
        [        S5      n[        Ul        U[        l        g )N©rl  rP  )r   r   rO  r†  Úserverrg  r‡  ÚclientÚ	connectedr¸  ru  rL  ÚmboxTypere  )rG   r²   re  s      r4   ÚsetUpÚIMAP4HelperMixin.setUp^  sU   € Ü�NŠNÓˆÜ"°$·.±.ÑAˆŒÜ" 1·^±^ÑDˆŒØŒà!#ŒÔÜ˜[Ó)ˆ
Ü+ˆ
ÔØ",ŒÕr7   c                ó   • U ? U ?U ?g r0   )rŠ  r‹  rŒ  rW   s    r4   ÚtearDownÚIMAP4HelperMixin.tearDowni  s   € ØˆKØˆKØ‰Nr7   c                óL   • U R                   R                  R                  5         g r0   )r‹  rv  rw  )rG   Úignores     r4   Ú_cbStopClientÚIMAP4HelperMixin._cbStopClientn  s   € Ø�‰×Ñ×,Ñ,Õ.r7   c                óÚ   • U R                   R                  R                  5         U R                  R                  R                  5         [        R
                  " US[        U 5      -   5        g )NúProblem with )r‹  rv  rw  rŠ  r%   Úerrr  )rG   r$   s     r4   Ú
_ebGeneralÚIMAP4HelperMixin._ebGeneralq  sE   € Ø�‰×Ñ×,Ñ,Ô.Ø�‰×Ñ×,Ñ,Ô.Ü�Š�˜¬3¨t«9Ñ4Õ5r7   c                óX   • [         R                  " U R                  U R                  5      $ r0   )r#   ÚloopbackAsyncrŠ  r‹  rW   s    r4   r#   ÚIMAP4HelperMixin.loopbackv  s   € Ü×%Ò% d§k¡k°4·;±;Ó?Ð?r7   c                ó¦   • UR                   " [        R                  5        [        UR                  5      n[        U5      nU R                  X25        g)zö
Assert that the provided failure is an L{IMAP4Exception} with
the given message.

@param failure: A failure whose value L{IMAP4Exception}
@type failure: L{failure.Failure}

@param expected: The expected failure message.
@type expected: L{bytes}
N)Útrapr   ÚIMAP4Exceptionr  Úvaluerû   rD   )rG   r$   rŸ  rû  s       r4   ÚassertClientFailureMessageÚ+IMAP4HelperMixin.assertClientFailureMessagey  s;   € ð 	�Š”U×)Ñ)Ô*Ü�g—m‘mÓ$ˆÜ˜“>ˆà×Ñ˜Õ+r7   )r‹  rŒ  rŠ  )r~   r   r€   r�   r†  r  r‡  rŽ  r‘  r•  rš  r#   r£  r‚   r1   r7   r4   r…  r…  Z  s7   ‡ Ø,0€IÐ)Ó0Ø,0€IÐ)Ó0ò	-òò
/ò6ò
@õ,r7   r…  c                  óF  • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S2 r4S3 r5S4 r6S5r7g6)7ÚIMAP4ServerTestsi‹  c                ó  ^ ^^• 0 mUU 4S jnT R                   R                  [        U5      5      R                  T R                  5      n[
        R                  " T R                  5       U/5      nS S S S.mUR                  UUU 4S j5      $ )Nc                 ód   >• UU4S jn TR                   R                  5       R                  U 5      $ )Nc                óp   >• TR                  U 5        TR                  R                  R                  5         g r0   ©ÚupdaterŠ  rv  rw  ©r§   rp  rG   s    €€r4   ÚgotCapsÚAIMAP4ServerTests.testCapability.<locals>.getCaps.<locals>.gotCaps�  ó$   ø€ Ø—‘˜A”Ø—‘×%Ñ%×4Ñ4Õ6r7   ©r‹  ÚgetCapabilitiesr¯   ©r­  rp  rG   s    €€r4   ÚgetCapsÚ0IMAP4ServerTests.testCapability.<locals>.getCaps�  ó(   ø€ ö7ð —;‘;×.Ñ.Ó0×<Ñ<¸WÓEÐEr7   )ó	   IMAP4rev1ó	   NAMESPACEó   IDLEc                ó(   >• TR                  TT5      $ r0   ©rD   )Ú_rp  rŸ  rG   s    €€€r4   r5   Ú1IMAP4ServerTests.testCapability.<locals>.<lambda>™  s   ø€  t×'7Ñ'7¸À$Ô'Gr7   )rŒ  r¯   r8   Ú
addErrbackrš  r   ÚgatherResultsr#   )rG   r³  Úd1r²   rp  rŸ  s   `   @@r4   ÚtestCapabilityÚIMAP4ServerTests.testCapabilityŒ  sn   ú€ Øˆö	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ò §¡£°"Ð 5Ó6ˆØ"&°dÀTÑJˆØ�}‰}ÖGÓHÐHr7   c                óX  ^ ^^• 0 m[         T R                  R                  S'   UU 4S jnT R                  R	                  [        U5      5      R                  T R                  5      n[        R                  " T R                  5       U/5      nS S S S/S.mUR	                  UUU 4S j5      $ )Nó   CRAM-MD5c                 ód   >• UU4S jn TR                   R                  5       R                  U 5      $ )Nc                óp   >• TR                  U 5        TR                  R                  R                  5         g r0   rª  r¬  s    €€r4   r­  ÚIIMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps.<locals>.gotCaps   r¯  r7   r°  r²  s    €€r4   r³  Ú8IMAP4ServerTests.testCapabilityWithAuth.<locals>.getCapsŸ  rµ  r7   )r¶  r·  r¸  ó   AUTHc                ó(   >• TR                  TT5      $ r0   rº  )r»  rp  ÚexpCaprG   s    €€€r4   r5   Ú9IMAP4ServerTests.testCapabilityWithAuth.<locals>.<lambda>°  s   ø€  t×'7Ñ'7¸ÀÔ'Er7   )r   rŠ  ÚchallengersrŒ  r¯   r8   r½  rš  r   r¾  r#   )rG   r³  r¿  r²   rp  rÊ  s   `   @@r4   ÚtestCapabilityWithAuthÚ'IMAP4ServerTests.testCapabilityWithAuth›  s�   ú€ ØˆÜ/Aˆ�‰×Ñ Ñ,ö	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ò §¡£°"Ð 5Ó6ˆð ØØØ!�]ñ	
ˆð �}‰}ÖEÓFÐFr7   c                óâ   ^ • ST l         U 4S jnT R                  R                  [        U5      5      R	                  T R
                  5        T R                  5       nUR                  U 4S j5      $ )Nr   c                 óv   >• U4S jn TR                   R                  5       R                  [        U 5      5        g )Nc                 ó   >• ST l         g rÙ  )Ú	loggedOutrW   s   €r4   ÚsetLoggedOutÚAIMAP4ServerTests.testLogout.<locals>.logout.<locals>.setLoggedOut¶  s
   ø€ Ø!"�•r7   )r‹  Úlogoutr¯   r8   )rÓ  rG   s    €r4   rÕ  Ú+IMAP4ServerTests.testLogout.<locals>.logoutµ  s*   ø€ õ#ð �K‰K×ÑÓ ×,Ñ,¬U°<Ó-@ÕAr7   c                ó<   >• TR                  TR                  S5      $ rÙ  )rD   rÒ  ©r»  rG   s    €r4   r5   Ú-IMAP4ServerTests.testLogout.<locals>.<lambda>½  s   ø€  t×'7Ñ'7¸¿¹ÈÔ'Jr7   )rÒ  rŒ  r¯   r8   r½  rš  r#   )rG   rÕ  r²   s   `  r4   Ú
testLogoutÚIMAP4ServerTests.testLogout²  sR   ø€ ØˆŒõ	Bð 	�‰×"Ñ"¤5¨£=Ó1×<Ñ<¸T¿_¹_ÔMØ�M‰M‹OˆØ�}‰}ÔJÓKÐKr7   c                óâ   ^ • S T l         U 4S jnT R                  R                  [        U5      5      R	                  T R
                  5        T R                  5       nUR                  U 4S j5      $ )Nc                 ód   >• U4S jn TR                   R                  5       R                  U 5        g )Nc                ó\   >• U Tl         TR                  R                  R                  5         g r0   )Ú	responsesrŠ  rv  rw  )rß  rG   s    €r4   ÚsetResponsesÚ=IMAP4ServerTests.testNoop.<locals>.noop.<locals>.setResponsesÃ  s    ø€ Ø!*�”Ø—‘×%Ñ%×4Ñ4Õ6r7   )r‹  Únoopr¯   )rà  rG   s    €r4   râ  Ú'IMAP4ServerTests.testNoop.<locals>.noopÂ  s%   ø€ õ7ð �K‰K×ÑÓ×*Ñ*¨<Õ8r7   c                ó<   >• TR                  TR                  / 5      $ r0   )rD   rß  rØ  s    €r4   r5   Ú+IMAP4ServerTests.testNoop.<locals>.<lambda>Ë  s   ø€  t×'7Ñ'7¸¿¹ÈÔ'Kr7   )rß  rŒ  r¯   r8   r½  rš  r#   )rG   râ  r²   s   `  r4   ÚtestNoopÚIMAP4ServerTests.testNoop¿  sQ   ø€ ØˆŒõ	9ð 	�‰×"Ñ"¤5¨£;Ó/×:Ñ:¸4¿?¹?ÔKØ�M‰M‹OˆØ�}‰}ÔKÓLÐLr7   c                ó  ^ • U 4S jnT R                   R                  [        U5      5      R                  T R                  5      n[
        R                  " UT R                  5       /5      nUR                  T R                  5      $ )Nc                 ót   >• TR                   R                  SS5      n U R                  TR                  5        g ©NrP  rT  )r‹  Úloginr¯   r•  ©r²   rG   s    €r4   rë  Ú)IMAP4ServerTests.testLogin.<locals>.loginÎ  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�M‰M˜$×,Ñ,Õ-r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestLogin©rG   rë  r¿  r²   s   `   r4   Ú	testLoginÚIMAP4ServerTests.testLoginÍ  sa   ø€ õ	.ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ò  T§]¡]£_Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r7   c                ó¸   • U R                  U R                  R                  [        R                  5        U R                  U R                  R
                  S5        g ©NÚauth©rD   rŠ  ÚaccountrO  re  Ústate©rG   Úignoreds     r4   rî  ÚIMAP4ServerTests._cbTestLoginÖ  ó<   € Ø×Ñ˜Ÿ™×,Ñ,¬l×.EÑ.EÔFØ×Ñ˜Ÿ™×*Ñ*¨FÕ3r7   c                ó  ^ • U 4S jnT R                   R                  [        U5      5      R                  T R                  5      nT R                  5       n[        R                  " X#/5      nUR                  T R                  5      $ )Nc                 ót   >• TR                   R                  SS5      n U R                  TR                  5        g ©NrP  s   wrong-password©r‹  rë  ÚaddBothr•  rì  s    €r4   rë  Ú/IMAP4ServerTests.testFailedLogin.<locals>.loginÛ  ó,   ø€ Ø—‘×!Ñ! +Ð/@ÓAˆAØ�I‰I�d×(Ñ(Õ)r7   )	rŒ  r¯   r8   r½  rš  r#   r   r¾  Ú_cbTestFailedLogin©rG   rë  r¿  Úd2r²   s   `    r4   ÚtestFailedLoginÚ IMAP4ServerTests.testFailedLoginÚ  sc   ø€ õ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óœ   • U R                  U R                  R                  S 5        U R                  U R                  R                  S5        g )NÚunauth)rD   rŠ  rö  r÷  rø  s     r4   r  Ú#IMAP4ServerTests._cbTestFailedLoginä  s6   € Ø×Ñ˜Ÿ™×,Ñ,¨dÔ3Ø×Ñ˜Ÿ™×*Ñ*¨HÕ5r7   c                ó0  ^ • ST R                   l        U 4S jnT R                  R                  [	        U5      5      R                  T R                  5      nT R                  5       n[        R                  " X#/5      nUR                  T R                  5      $ )zR
Attempting to log into a server that has no L{Portal} results
in a failed login.
Nc                 ót   >• TR                   R                  SS5      n U R                  TR                  5        g rþ  rÿ  rì  s    €r4   rë  Ú7IMAP4ServerTests.test_loginWithoutPortal.<locals>.loginï  r  r7   )rŠ  rY  rŒ  r¯   r8   r½  rš  r#   r   r¾  r  r  s   `    r4   Útest_loginWithoutPortalÚ(IMAP4ServerTests.test_loginWithoutPortalè  sq   ø€ ð
 "ˆ�‰Ôõ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                ó^  ^ • S nUT R                   R                  R                  l        U 4S jnT R                  R                  [        U5      5      R                  T R                  5      nT R                  5       n[        R                  " X4/5      nUR                  T R                  5      $ )zÂ
The server responds with a C{BAD} response when its portal
attempts to log a user in with checker that claims to support
L{IAccount} but returns an an avatar interface that is not
L{IAccount}.
c                 ó   • SSS 4$ )NzNot IAccountzNot an accountc                 ó   • g r0   r1   r1   r7   r4   r5   ÚVIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar.<locals>.<lambda>  s   € ¸dr7   r1   )r»  Ú__s     r4   ÚbrokenRequestAvatarÚDIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar   s   € Ø"Ð$4±lÐCÐCr7   c                 ót   >• TR                   R                  SS5      n U R                  TR                  5        g rê  rÿ  rì  s    €r4   rë  Ú6IMAP4ServerTests.test_nonIAccountAvatar.<locals>.login  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�d×(Ñ(Õ)r7   )rŠ  rY  r^  ÚrequestAvatarrŒ  r¯   r8   r½  rš  r#   r   r¾  r  )rG   r  rë  r¿  r  r²   s   `     r4   Útest_nonIAccountAvatarÚ'IMAP4ServerTests.test_nonIAccountAvatarø  s„   ø€ ò	Dð 2Eˆ�‰×Ñ× Ñ Ô.õ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óú  ^ ^•  " S S[         5      mU4S jnUT R                  l        U 4S jnT R                  R	                  [        U5      5      nUR                  T R                  S5        UR                  UU 4S j5       nUR                  T R                  5        UR                  T R                  5        T R                  5       n[        R                  " X5/5      nUR	                  T R                  5      $ )zƒ
Any exception raised by L{IMAP4Server.authenticateLogin} that
is not L{UnauthorizedLogin} is logged results in a C{BAD}
response.
c                  ó   • \ rS rSrSrSrg)ÚAIMAP4ServerTests.test_loginException.<locals>.UnexpectedExceptioni  ú
An unexpected exception.
r1   NrM  r1   r7   r4   ÚUnexpectedExceptionr    ó   † ôr7   r   c                ó   >• T" S5      e)NÚWhoopsr1   )ÚuserÚpasswdr   s     €r4   ÚraisesUnexpectedExceptionÚGIMAP4ServerTests.test_loginException.<locals>.raisesUnexpectedException  s   ø€ Ù% hÓ/Ð/r7   c                 ó<   >• T R                   R                  SS5      $ rê  ©r‹  rë  rW   s   €r4   rë  Ú3IMAP4ServerTests.test_loginException.<locals>.login  ó   ø€ Ø—;‘;×$Ñ$ [Ð2BÓCÐCr7   s   Server error: Whoopsc                óF   >• TR                  TR                  T5      5        g r0   ©r‹  ÚflushLoggedErrors)r»  r   rG   s    €€r4   ÚassertErrorLoggedÚ?IMAP4ServerTests.test_loginException.<locals>.assertErrorLogged&  s   ø€ à�O‰O˜D×2Ñ2Ð3FÓGÕHr7   )r%  rŠ  ÚauthenticateLoginrŒ  r¯   r8   r½  r£  rš  r   r•  r#   r   r¾  r  )rG   r&  rë  r¿  r/  r  r²   r   s   `      @r4   Útest_loginExceptionÚ$IMAP4ServerTests.test_loginException  sÆ   ù€ ô	¤)ô 	õ
	0ð )Bˆ�‰Ô%õ	Dð �^‰^×'Ñ'¬¨e«Ó5ˆà
�‰�d×5Ñ5Ð7NÔOà	�‰õ	Ió 
ð	Ið 	�‰�d—o‘oÔ&Ø
�
‰
�4×%Ñ%Ô&à�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óF  ^ • SS0T R                   R                  l        U 4S jnT R                  R	                  [        U5      5      R                  T R                  5      n[        R                  " T R                  5       U/5      nUR	                  T R                  5      $ )Nó
   {test}useró   {test}passwordc                 óÌ   >• TR                   R                  SS5      n U R                  [        R                  S[        T5      -   5        U R                  TR                  5        g )Nr5  r6  r˜  )r‹  rë  r½  r%   r™  r  r¯   r•  rì  s    €r4   rë  Ú9IMAP4ServerTests.testLoginRequiringQuoting.<locals>.login4  sG   ø€ Ø—‘×!Ñ! -Ð1BÓCˆAØ�L‰LœŸ™ /´C¸³IÑ"=Ô>Ø�M‰M˜$×,Ñ,Õ-r7   )rŠ  rX  ÚusersrŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestLoginRequiringQuotingrï  s   `   r4   ÚtestLoginRequiringQuotingÚ*IMAP4ServerTests.testLoginRequiringQuoting1  sy   ø€ Ø%2Ð4EÐ$Fˆ�‰×ÑÔ!õ	.ð
 �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×>Ñ>Ó?Ð?r7   c                ó¸   • U R                  U R                  R                  [        R                  5        U R                  U R                  R
                  S5        g ró  rõ  rø  s     r4   r:  Ú-IMAP4ServerTests._cbTestLoginRequiringQuoting=  rû  r7   c                óœ  ^ • S T l         U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR	                  T R
                  5        T R                  5       n[        R                  " X4/5      nUR                  U 4S j5       nUR                  T R                  SS/// / /5        U$ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú-IMAP4ServerTests.testNamespace.<locals>.loginD  r+  r7   c                 ób   >• U4S jn TR                   R                  5       R                  U 5      $ )Nc                ó6   >• U Tl         TR                  S 5        g r0   ©ÚnamespaceArgsr•  ©r\  rG   s    €r4   ÚgotNamespaceÚGIMAP4ServerTests.testNamespace.<locals>.namespace.<locals>.gotNamespaceH  ó   ø€ Ø%)�Ô"Ø×"Ñ" 4Õ(r7   ©r‹  Ú	namespacer¯   ©rG  rG   s    €r4   rK  Ú1IMAP4ServerTests.testNamespace.<locals>.namespaceG  ó(   ø€ õ)ð —;‘;×(Ñ(Ó*×6Ñ6°|ÓDÐDr7   c                ó’   >• TR                    H+  nU H"  nU H  nTR                  U[        5        M     M$     M-     TR                   $ r0   )rE  r  r  )rù  Ú
namespacesÚpairr¢  rG   s       €r4   ÚassertAllPairsNativeStringsÚCIMAP4ServerTests.testNamespace.<locals>.assertAllPairsNativeStringsT  sE   ø€ à"×0Ô0�
Û&�DÛ!%˜Ø×-Ñ-¨e´SÖ9ó "&ó 'ñ 1ð ×%Ñ%Ð%r7   r�  r†  )
rE  rŒ  r¯   r8   r½  rš  r#   r   r¾  rD   )rG   rë  rK  r¿  r  r²   rR  s   `      r4   ÚtestNamespaceÚIMAP4ServerTests.testNamespaceA  s­   ø€ Ø!ˆÔõ	Dõ	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆà	
�‰ô	&ó 
ð	&ð 	
�‰�d×&Ñ&¨2¨s¨)¨°b¸"Ð(=Ô>Øˆr7   c                óÊ  ^ • [        S5      T R                  l        ST l        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR                  T R                  5        T R                  5       n[        R                  " X4/5      nUR                  U 4S j5        UR                  T R                  / / / /5        U$ )z~
A mailbox that does not provide L{INamespacePresenter} returns
empty L{list}s for its personal, shared, and user namespaces.
rP  Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú<IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.loging  r+  r7   c                 ób   >• U4S jn TR                   R                  5       R                  U 5      $ )Nc                ó6   >• U Tl         TR                  S 5        g r0   rD  rF  s    €r4   rG  ÚVIMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespace.<locals>.gotNamespacek  rI  r7   rJ  rL  s    €r4   rK  Ú@IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespacej  rN  r7   c                ó   >• TR                   $ r0   )rE  rØ  s    €r4   r5   Ú?IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.<lambda>v  s   ø€  × 2Ò 2r7   )r?  rŠ  re  rE  rŒ  r¯   r8   r½  rš  r#   r   r¾  rD   )rG   rë  rK  r¿  r  r²   s   `     r4   Útest_mailboxWithoutNamespaceÚ-IMAP4ServerTests.test_mailboxWithoutNamespace_  s®   ø€ ô
 ":¸+Ó!Fˆ�‰ÔØ!ˆÔõ	Dõ	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰Ô2Ô3Ø	�‰�d×&Ñ&¨¨R°¨Ô5Øˆr7   c                óš  ^ • [         R                  R                  S5        S T l        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR                  T R                  5        T R                  5       n[        R                  " X4/5      R                  T R                  5      $ )Nútest-mailboxc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests.testSelect.<locals>.login~  r+  r7   c                 ól   >• U4S jn TR                   R                  S5      nUR                  U 5        U$ )Nc                ó6   >• U Tl         TR                  S 5        g r0   )ÚselectedArgsr•  rF  s    €r4   ÚselectedÚ=IMAP4ServerTests.testSelect.<locals>.select.<locals>.selected‚  ó   ø€ Ø$(�Ô!Ø×"Ñ" 4Õ(r7   rb  )r‹  rH  r¯   )rh  r²   rG   s     €r4   rH  Ú+IMAP4ServerTests.testSelect.<locals>.select�  s/   ø€ õ)ð —‘×"Ñ" >Ó2ˆAØ�M‰M˜(Ô#ØˆHr7   )rO  re  Ú
addMailboxrg  rŒ  r¯   r8   r½  rš  r#   r   r¾  Ú_cbTestSelect)rG   rë  rH  r¿  r  s   `    r4   Ú
testSelectÚIMAP4ServerTests.testSelectz  s“   ø€ Ü×Ñ×*Ñ*¨>Ô:Ø ˆÔõ	Dõ	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8¸×9KÑ9KÓLÐLr7   c                ó  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5        T R                   R                  [        U5      5        T R                   R                  T R                  S5        T R                   R                  T R
                  5        T R                   R                  T R                  5        [        R                  " T R                   T R                  5       /5      nUR                  U 4S j5       nU$ )zP
A client that selects a mailbox that does not exist receives a
C{NO} response.
c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú9IMAP4ServerTests.test_selectWithoutMailbox.<locals>.login–  r+  r7   c                 ó:   >• T R                   R                  S5      $ )Nrb  ©r‹  rH  rW   s   €r4   rH  Ú:IMAP4ServerTests.test_selectWithoutMailbox.<locals>.select™  ó   ø€ Ø—;‘;×%Ñ% nÓ5Ð5r7   ó   No such mailboxc                óP   >• TR                  TR                  R                  5        g r0   )ÚassertIsNonerŠ  rÀ  rØ  s    €r4   ÚassertNoMailboxSelectedÚKIMAP4ServerTests.test_selectWithoutMailbox.<locals>.assertNoMailboxSelected¤  s   ø€ à×Ñ˜dŸk™k×.Ñ.Õ/r7   )
rŒ  r¯   r8   r½  r£  r•  rš  r   r¾  r#   )rG   rë  rH  ÚconnectionCompleterz  s   `    r4   Útest_selectWithoutMailboxÚ*IMAP4ServerTests.test_selectWithoutMailbox�  sÅ   ø€ õ	Dõ	6ð 	�‰×"Ñ"¤5¨£<Ô0Ø�‰×"Ñ"¤5¨£=Ô1Ø�‰×!Ñ! $×"AÑ"AÐCUÔVØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä"×0Ò0°$·.±.À$Ç-Á-Ã/Ð1RÓSÐà	×	'Ñ	'ô	0ó 
(ð	0ð "Ð!r7   c           	     óÎ   • [         R                  R                  S   nU R                  U R                  R
                  U5        U R                  U R                  SSSSSS.5        g )NúTEST-MAILBOXr  rå   rÖ  rÄ  T©ÚEXISTSr´  r¶  r×  ú
READ-WRITE)rO  re  Ú	mailboxesrD   rŠ  rÀ  rg  ©rG   rù  rÀ  s      r4   rm  ÚIMAP4ServerTests._cbTestSelectª  s]   € Ü×&Ñ&×0Ñ0°Ñ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×ÑàØØ!ØMØ"ñõ		
r7   c                óž  ^ • [         R                  R                  S5        ST l        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR                  T R                  5        T R                  5       n[        R                  " X4/5      nUR                  T R                  5      $ )a/  
L{IMAP4Client.examine} issues an I{EXAMINE} command to the server and
returns a L{Deferred} which fires with a C{dict} with as many of the
following keys as the server includes in its response: C{'FLAGS'},
C{'EXISTS'}, C{'RECENT'}, C{'UNSEEN'}, C{'READ-WRITE'}, C{'READ-ONLY'},
C{'UIDVALIDITY'}, and C{'PERMANENTFLAGS'}.

Unfortunately the server doesn't generate all of these so it's hard to
test the client's handling of them here.  See
L{IMAP4ClientExamineTests} below.

See U{RFC 3501<http://www.faqs.org/rfcs/rfc3501.html>}, section 6.3.2,
for details.
rb  Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú,IMAP4ServerTests.test_examine.<locals>.loginÊ  r+  r7   c                 ól   >• U4S jn TR                   R                  S5      nUR                  U 5        U$ )Nc                ó6   >• U Tl         TR                  S 5        g r0   )ÚexaminedArgsr•  rF  s    €r4   ÚexaminedÚ@IMAP4ServerTests.test_examine.<locals>.examine.<locals>.examinedÎ  rj  r7   rb  )r‹  Úexaminer¯   )r�  r²   rG   s     €r4   r�  Ú.IMAP4ServerTests.test_examine.<locals>.examineÍ  s/   ø€ õ)ð —‘×#Ñ# NÓ3ˆAØ�M‰M˜(Ô#ØˆHr7   )rO  re  rl  rŒ  rŒ  r¯   r8   r½  rš  r#   r   r¾  Ú_cbTestExamine)rG   rë  r�  r¿  r  r²   s   `     r4   Útest_examineÚIMAP4ServerTests.test_examine¸  s˜   ø€ ô 	×Ñ×*Ñ*¨>Ô:Ø ˆÔõ	Dõ	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜W“~Ô&Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r7   c           	     óÎ   • [         R                  R                  S   nU R                  U R                  R
                  U5        U R                  U R                  SSSSSS.5        g )Nr€  r  rå   rÖ  rÄ  Fr�  )rO  re  r„  rD   rŠ  rÀ  rŒ  r…  s      r4   r‘  ÚIMAP4ServerTests._cbTestExamineÝ  s]   € Ü×&Ñ&×0Ñ0°Ñ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×ÑàØØ!ØMØ#ñõ		
r7   c                óZ  ^ ^^^^	• Sm	SmU 4S jmU 4S jmU 4S jnUUUU U	4S jn/ T l         T R                  R                  [        U5      5      R                  [        U5      5      nT R	                  5       n[
        R                  " X4/5      nUR                  T R                  T	T5      $ )N)Útestboxútest/boxztest/útest/box/boxÚINBOX)r—  r˜  c                 ó<   >• T R                   R                  S5        g rÙ  ©r2   r‹   rW   s   €r4   ÚcbÚ'IMAP4ServerTests.testCreate.<locals>.cbï  ó   ø€ Ø�K‰K×Ñ˜qÕ!r7   c                ó<   >• TR                   R                  S5        g ©Nr   rœ  ©r$   rG   s    €r4   ÚebÚ'IMAP4ServerTests.testCreate.<locals>.ebò  rŸ  r7   c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests.testCreate.<locals>.loginõ  r+  r7   c                 óò   >• TT-    HG  n TR                   R                  U 5      nUR                  [        T5      5      R	                  T5        MI     WR                  TR                  TR                  5        g r0   )r‹  Úcreater¯   r8   r½  ÚaddCallbacksr•  rš  )rB  r²   r�  r£  r�  rG   r�  s     €€€€€r4   r¨  Ú+IMAP4ServerTests.testCreate.<locals>.createø  sZ   ø€ Ø $œ�Ø—K‘K×&Ñ& tÓ,�Ø—‘œe B›iÓ(×3Ñ3°BÖ7ñ 'ð �N‰N˜4×-Ñ-¨t¯©Õ?r7   )r2   rŒ  r¯   r8   r#   r   r¾  Ú_cbTestCreate)
rG   rë  r¨  r¿  r  r²   r�  r£  r�  r�  s
   `     @@@@r4   Ú
testCreateÚIMAP4ServerTests.testCreateë  s�   ü€ ØKˆØ&ˆõ	"õ	"õ	D÷	@ñ 	@ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5×AÑAÄ%ÈÃ-ÓPˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×/Ñ/°¸$Ó?Ð?r7   c                ó>  • U R                  U R                  S/[        U5      -  S/[        U5      -  -   5        [        [        R
                  R                  5      n[        / SQ5      nU R                  XE Vs/ s H  ofR                  5       PM     sn5        g s  snf )Nrã   r   )Úinboxr—  r˜  Útestr™  )rD   r2   rî   r�  rO  re  r„  r†  )rG   rù  r�  r�  rÀ  r²  Úas          r4   r«  ÚIMAP4ServerTests._cbTestCreate	  sw   € Ø×Ñ˜Ÿ™ q c¬C°«LÑ&8¸A¸3ÄÀTÃ¹?Ñ&JÔKÜ”l×-Ñ-×7Ñ7Ó8ˆÜÒQÓRˆØ×Ñ˜°7Ó;²7¨a§¡¦	±7Ñ;Õ<ùÒ;s   Á9B
c                ó´  ^ • [         R                  R                  S5        U 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR	                  U 4S j5        U$ )Nú	delete/mec                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests.testDelete.<locals>.login	  r+  r7   c                 ó:   >• T R                   R                  S5      $ ©Nr´  ©r‹  r  rW   s   €r4   r  Ú+IMAP4ServerTests.testDelete.<locals>.delete	  ó   ø€ Ø—;‘;×%Ñ% kÓ2Ð2r7   c                ój   >• TR                  [        [        R                  R                  5      / 5      $ r0   )rD   rï   rO  re  r„  rØ  s    €r4   r5   Ú-IMAP4ServerTests.testDelete.<locals>.<lambda>	  s$   ø€ �d×&Ñ&¤t¬L×,CÑ,C×,MÑ,MÓ'NÐPRÔSr7   ©rO  re  rl  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  )rG   rë  r  r¿  r  r²   s   `     r4   Ú
testDeleteÚIMAP4ServerTests.testDelete
	  s�   ø€ Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	3ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜSô	
ð ˆr7   c                ó
  ^ • [         R                  R                  S5        [         R                  R                  S5        U 4S jnU 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  U5        UR                  T R                  5        T R                  5       n[        R                  " XE/5      nUR	                  U 4S j5        U$ )zÉ
Attempting to delete a mailbox with hierarchically inferior
names fails with an informative error.

@see: U{https://tools.ietf.org/html/rfc3501#section-6.3.4}

@return: A L{Deferred} with assertions.
r  r´  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  ÚGIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.login)	  r+  r7   c                 ó:   >• T R                   R                  S5      $ ©Nr  r¹  rW   s   €r4   r  ÚHIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.delete,	  ó   ø€ Ø—;‘;×%Ñ% hÓ/Ð/r7   c                ó¢   >• U R                   " [        R                  5        TR                  [	        U R
                  5      [	        S5      5        g )Ns-   Name "DELETE" has inferior hierarchical names)r   r   r¡  rD   r  r¢  r¢  s    €r4   ÚassertIMAPExceptionÚUIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.assertIMAPException/	  s8   ø€ Ø�LŠLœ×-Ñ-Ô.Ø×ÑÜ�G—M‘MÓ"ÜÐDÓEõr7   c                ón   >• TR                  [        [        R                  R                  5      SS/5      $ )NÚDELETEz	DELETE/ME)rD   r�  rO  re  r„  rØ  s    €r4   r5   ÚJIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.<lambda>>	  s+   ø€ �d×&Ñ&Ü”|×.Ñ.×8Ñ8Ó9¸HÀkÐ;Rôr7   )rO  re  rl  rŒ  r¯   r8   r©  rš  r½  r•  r#   r   r¾  )rG   rë  r  rÉ  ÚloggedInÚ
loopedBackr²   s   `      r4   Ú'testDeleteWithInferiorHierarchicalNamesÚ8IMAP4ServerTests.testDeleteWithInferiorHierarchicalNames	  sÈ   ø€ ô 	×Ñ×*Ñ*¨8Ô4Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	0õ	ð —>‘>×-Ñ-¬e°E«lÓ;ˆØ×Ñœe F›m¨T¯_©_Ô=Ø×ÑÐ/Ô0Ø×Ñ˜d×0Ñ0Ô1à—]‘]“_ˆ
Ü×Ò Ð 6Ó7ˆØ	�‰ôô	
ð
 ˆr7   c                ó²  ^ • S T l         U 4S jnU 4S jnU 4S jnT R                  R                  [        U5      5      nUR	                  [        U5      T R
                  5        UR                  U5        UR	                  T R                  T R
                  5        T R                  5       n[        R                  " XE/5      nUR                  U 4S j5        U$ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú6IMAP4ServerTests.testIllegalInboxDelete.<locals>.loginG	  r+  r7   c                 ó:   >• T R                   R                  S5      $ )Nr¯  r¹  rW   s   €r4   r  Ú7IMAP4ServerTests.testIllegalInboxDelete.<locals>.deleteJ	  s   ø€ Ø—;‘;×%Ñ% gÓ.Ð.r7   c                ó   >• U Tl         g r0   ©Ústashed©r2   rG   s    €r4   ÚstashÚ6IMAP4ServerTests.testIllegalInboxDelete.<locals>.stashM	  s
   ø€ Ø!ˆD�Lr7   c                ój   >• TR                  [        TR                  [        R                  5      5      $ r0   ©r‹  rí  rÙ  r$   ÚFailurerØ  s    €r4   r5   Ú9IMAP4ServerTests.testIllegalInboxDelete.<locals>.<lambda>W	  ó   ø€ �d—o‘o¤j°·±¼w¿¹Ó&OÔPr7   ©rÙ  rŒ  r¯   r8   r©  rš  r   r•  r#   r   r¾  )rG   rë  r  rÛ  r¿  r  r²   s   `      r4   ÚtestIllegalInboxDeleteÚ'IMAP4ServerTests.testIllegalInboxDeleteD	  s¡   ø€ ØˆŒõ	Dõ	/õ	"ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜPô	
ð ˆr7   c                ó˜  ^ • U 4S jnU 4S jnU 4S jnS T l         T R                  R                  [        U5      5      nUR                  [        U5      5      R	                  U5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XE/5      nUR                  U 4S j5        U$ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú5IMAP4ServerTests.testNonExistentDelete.<locals>.login\	  r+  r7   c                 ó:   >• T R                   R                  S5      $ r¸  r¹  rW   s   €r4   r  Ú6IMAP4ServerTests.testNonExistentDelete.<locals>.delete_	  r»  r7   c                ó   >• U Tl         g r0   ©r$   r¢  s    €r4   ÚdeleteFailedÚ<IMAP4ServerTests.testNonExistentDelete.<locals>.deleteFailedb	  ó
   ø€ Ø"ˆD�Lr7   c                ót   >• TR                  [        TR                  R                  5      [        S5      5      $ )Nrw  ©rD   r  r$   r¢  rØ  s    €r4   r5   Ú8IMAP4ServerTests.testNonExistentDelete.<locals>.<lambda>l	  s'   ø€ �d×&Ñ&¤s¨4¯<©<×+=Ñ+=Ó'>ÄÐDVÓ@WÔXr7   )r$   rŒ  r¯   r8   r½  r©  r•  rš  r#   r   r¾  )rG   rë  r  rì  r¿  r  r²   s   `      r4   ÚtestNonExistentDeleteÚ&IMAP4ServerTests.testNonExistentDelete[	  sš   ø€ õ	Dõ	3õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜXô	
ð ˆr7   c                óR  ^ ^• [        5       nSUl        [        R                  R	                  SU5        [        R                  R	                  S5        U 4S jnU 4S jnU 4S jnS T l        T R                  R                  [        U5      5      nUR                  [        U5      5      R                  U5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XV/5      n[!        S5      mUR                  UU 4S j5        U$ )	N)z	\Noselectr  r´  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú1IMAP4ServerTests.testIllegalDelete.<locals>.loginv	  r+  r7   c                 ó:   >• T R                   R                  S5      $ rÅ  r¹  rW   s   €r4   r  Ú2IMAP4ServerTests.testIllegalDelete.<locals>.deletey	  rÇ  r7   c                ó   >• U Tl         g r0   rë  r¢  s    €r4   rì  Ú8IMAP4ServerTests.testIllegalDelete.<locals>.deleteFailed|	  rî  r7   s<   Hierarchically inferior mailboxes exist and \Noselect is setc                ób   >• TR                  [        TR                  R                  5      T5      $ r0   rð  )r»  rŸ  rG   s    €€r4   r5   Ú4IMAP4ServerTests.testIllegalDelete.<locals>.<lambda>ˆ	  s!   ø€  × 0Ñ 0´°T·\±\×5GÑ5GÓ1HÈ(Ô Sr7   )r¸  rÙ  rO  re  rl  r$   rŒ  r¯   r8   r½  r©  r•  rš  r#   r   r¾  r  )	rG   r  rë  r  rì  r¿  r  r²   rŸ  s	   `       @r4   ÚtestIllegalDeleteÚ"IMAP4ServerTests.testIllegalDeletep	  sÝ   ù€ Ü‹OˆØ!ˆŒÜ×Ñ×*Ñ*¨8°QÔ7Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	0õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆÜØPó
ˆð 	
�‰ÕSÔTØˆr7   c                ó´  ^ • [         R                  R                  S5        U 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR	                  U 4S j5        U$ )NÚoldmboxc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests.testRename.<locals>.loginŽ	  r+  r7   c                 ó<   >• T R                   R                  SS5      $ )Ns   oldmboxs   newname©r‹  ÚrenamerW   s   €r4   r  Ú+IMAP4ServerTests.testRename.<locals>.rename‘	  s   ø€ Ø—;‘;×%Ñ% j°*Ó=Ð=r7   c                óˆ   >• TR                  [        [        R                  R                  R                  5       5      S/5      $ )NÚNEWNAME)rD   rï   rO  re  r„  r¿  rØ  s    €r4   r5   Ú-IMAP4ServerTests.testRename.<locals>.<lambda>š	  s1   ø€ �d×&Ñ&Ü”\×,Ñ,×6Ñ6×;Ñ;Ó=Ó>ÀÀôr7   r¾  ©rG   rë  r  r¿  r  r²   s   `     r4   Ú
testRenameÚIMAP4ServerTests.testRename‹	  sŸ   ø€ Ü×Ñ×*Ñ*¨9Ô5õ	Dõ	>ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                ó²  ^ • S T l         U 4S jnU 4S jnU 4S jnT R                  R                  [        U5      5      nUR	                  [        U5      T R
                  5        UR                  U5        UR	                  T R                  T R
                  5        T R                  5       n[        R                  " XE/5      nUR                  U 4S j5        U$ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú6IMAP4ServerTests.testIllegalInboxRename.<locals>.login£	  r+  r7   c                 ó<   >• T R                   R                  SS5      $ )Nr¯  Úfrotzr  rW   s   €r4   r  Ú7IMAP4ServerTests.testIllegalInboxRename.<locals>.rename¦	  s   ø€ Ø—;‘;×%Ñ% g¨wÓ7Ð7r7   c                ó   >• U Tl         g r0   rØ  )ÚstuffrG   s    €r4   rÛ  Ú6IMAP4ServerTests.testIllegalInboxRename.<locals>.stash©	  s
   ø€ Ø ˆD�Lr7   c                ój   >• TR                  [        TR                  [        R                  5      5      $ r0   rÞ  rØ  s    €r4   r5   Ú9IMAP4ServerTests.testIllegalInboxRename.<locals>.<lambda>³	  rá  r7   râ  )rG   rë  r  rÛ  r¿  r  r²   s   `      r4   ÚtestIllegalInboxRenameÚ'IMAP4ServerTests.testIllegalInboxRename 	  s¡   ø€ ØˆŒõ	Dõ	8õ	!ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜPô	
ð ˆr7   c                óú  ^ • [         R                  R                  S5        [         R                  R                  S5        U 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR	                  T R                  5      $ )Nz
oldmbox/m1z
oldmbox/m2c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú6IMAP4ServerTests.testHierarchicalRename.<locals>.login»	  r+  r7   c                 ó<   >• T R                   R                  SS5      $ )Nr   Únewnamer  rW   s   €r4   r  Ú7IMAP4ServerTests.testHierarchicalRename.<locals>.rename¾	  s   ø€ Ø—;‘;×%Ñ% i°Ó;Ð;r7   )rO  re  r¨  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  Ú_cbTestHierarchicalRenamer
  s   `     r4   ÚtestHierarchicalRenameÚ'IMAP4ServerTests.testHierarchicalRename·	  s°   ø€ Ü×Ñ×&Ñ& |Ô4Ü×Ñ×&Ñ& |Ô4õ	Dõ	<ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×;Ñ;Ó<Ð<r7   c                óì   • [         R                  R                  R                  5       n/ SQn[	        [        U5      5      nU R                  X# Vs/ s H  oDR                  5       PM     sn5        g s  snf )N)r  z
newname/m1z
newname/m2)rO  re  r„  r¿  rï   r�  rD   r†  )rG   rù  ÚmboxesrŸ  r´  s        r4   r   Ú*IMAP4ServerTests._cbTestHierarchicalRenameÈ	  sU   € Ü×(Ñ(×2Ñ2×7Ñ7Ó9ˆÚ:ˆÜ”f˜V“nÓ%ˆØ×Ñ˜°XÓ!>²X°§'¡'¦)±XÑ!>Õ?ùÒ!>s   ÁA1
c                óv  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R
                  T R                  5        T R                  5       n[        R                  " X4/5      nUR                  U 4S j5        U$ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú-IMAP4ServerTests.testSubscribe.<locals>.loginÏ	  r+  r7   c                 ó:   >• T R                   R                  S5      $ ©Nz	this/mbox)r‹  Ú	subscriberW   s   €r4   r+  Ú1IMAP4ServerTests.testSubscribe.<locals>.subscribeÒ	  s   ø€ Ø—;‘;×(Ñ(¨Ó5Ð5r7   c                óZ   >• TR                  [        R                  R                  S/5      $ )Nú	THIS/MBOX©rD   rO  re  ÚsubscriptionsrØ  s    €r4   r5   Ú0IMAP4ServerTests.testSubscribe.<locals>.<lambda>Û	  ó#   ø€ �d×&Ñ&Ü×'Ñ'×5Ñ5¸°}ôr7   )	rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  )rG   rë  r+  r¿  r  r²   s   `     r4   ÚtestSubscribeÚIMAP4ServerTests.testSubscribeÎ	  sŒ   ø€ õ	Dõ	6ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜iÓ(¨$¯/©/Ô:Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                ó¤  ^ • SS/[         R                  l        U 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR	                  U 4S j5        U$ )Nr.  ú	THAT/MBOXc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú/IMAP4ServerTests.testUnsubscribe.<locals>.loginä	  r+  r7   c                 ó:   >• T R                   R                  S5      $ r*  )r‹  ÚunsubscriberW   s   €r4   r:  Ú5IMAP4ServerTests.testUnsubscribe.<locals>.unsubscribeç	  s   ø€ Ø—;‘;×*Ñ*¨;Ó7Ð7r7   c                óZ   >• TR                  [        R                  R                  S/5      $ )Nr6  r/  rØ  s    €r4   r5   Ú2IMAP4ServerTests.testUnsubscribe.<locals>.<lambda>ð	  r2  r7   )rO  re  r0  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  )rG   rë  r:  r¿  r  r²   s   `     r4   ÚtestUnsubscribeÚ IMAP4ServerTests.testUnsubscribeá	  sŸ   ø€ Ø1<¸kÐ0JŒ×ÑÔ-õ	Dõ	8ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜kÓ*¨D¯O©OÔ<Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                ón  ^ • [         R                  R                  S5        [         R                  R                  S5        [         R                  R                  S5        U 4S jnU 4S jnS T l        T R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  UT R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XE/5      R                  U 4S j5      $ )Núroot/subthingzroot/another-thingznon-root/subthingc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests._listSetup.<locals>.loginû	  r+  r7   c                ó   >• U Tl         g r0   ©Úlisted)r²  rG   s    €r4   rF  Ú+IMAP4ServerTests._listSetup.<locals>.listedþ	  s
   ø€ Ø!ˆD�Kr7   c                ó   >• TR                   $ r0   rE  rØ  s    €r4   r5   Ú-IMAP4ServerTests._listSetup.<locals>.<lambda>
  s	   ø€ À4Ç;Â;r7   )rO  re  rl  rF  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  )rG   r3   rë  rF  r¿  r  s   `     r4   Ú
_listSetupÚIMAP4ServerTests._listSetupö	  s×   ø€ Ü×Ñ×*Ñ*¨?Ô;Ü×Ñ×*Ñ*Ð+?Ô@Ü×Ñ×*Ñ*Ð+>Ô?õ	Dõ	"ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜a› $§/¡/Ô2Ø
�‰˜ §¡Ô0Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8Ô9NÓOÐOr7   c                ó€   • U H7  nU R                  US   [        S5        U R                  US   [        S5        M9     U$ )z¨
Assert a C{LIST} response's delimiter and mailbox are native
strings.

@param results: A list of tuples as returned by
    L{IMAP4Client.list} or L{IMAP4Client.lsub}.
rã   zdelimiter %r is not a strrç   zmailbox %r is not a str)r  r  )rG   Úresultsr2   s      r4   Ú'assertListDelimiterAndMailboxAreStringsÚ8IMAP4ServerTests.assertListDelimiterAndMailboxAreStrings	
  sC   € ó ˆFØ×!Ñ! &¨¡)¬SÐ2MÔNØ×!Ñ! &¨¡)¬SÐ2KÖLñ ð ˆr7   c                ó`   ^ • U 4S jnT R                  U5      nUR                  U 4S j5       nU$ )Nc                 ó<   >• T R                   R                  SS5      $ ©NÚrootÚ%)r‹  rï   rW   s   €r4   ÚmailboxListÚ.IMAP4ServerTests.testList.<locals>.mailboxList
  ó   ø€ Ø—;‘;×#Ñ# F¨CÓ0Ð0r7   c                ó(  >• [        [        R                  5      SS4[        [        R                  5      SS4/n[        S5       H4  nU R	                  S5      u  p4nTR                  [        U5      XE4U5        M6     TR                  U SU < 35        g )Nr†  úROOT/SUBTHINGzROOT/ANOTHER-THINGrç   r   zMore results than expected: )r�  r¸  rÙ  rx   ÚpoprB  r‰  )rF  ÚexpectedContentsr»  rÙ  Ú	delimiterÚmailboxrG   s         €r4   ÚassertListContentsÚ5IMAP4ServerTests.testList.<locals>.assertListContents
  s�   ø€ ô œ×+Ñ+Ó,¨c°?ÐCÜœ×+Ñ+Ó,¨cÐ3GÐHð Ðô
 ˜1–X�Ø,2¯J©J°q«MÑ)� 'Ø—‘Ü˜E“] IÐ7Ø$öñ ð ×Ñ˜VÐ'CÀFÁ:Ð%NÕOr7   )rJ  r¯   )rG   rU  r²   r^  s   `   r4   ÚtestListÚIMAP4ServerTests.testList
  s7   ø€ õ	1ð �O‰O˜KÓ(ˆà	
�‰ô	Pó 
ð	Pð ˆr7   c                ó  ^ • [         R                  R                  S5        U 4S jnT R                  U5      nUR	                  T R
                  5        UR	                  T R                  [        R                  SS4/5        U$ )NrY  c                 ó<   >• T R                   R                  SS5      $ rR  )r‹  ÚlsubrW   s   €r4   rd  Ú'IMAP4ServerTests.testLSub.<locals>.lsub1
  rW  r7   r†  )	rO  re  r+  rJ  r¯   rN  rD   r¸  rÙ  )rG   rd  r²   s   `  r4   ÚtestLSubÚIMAP4ServerTests.testLSub.
  sg   ø€ Ü×Ñ×)Ñ)¨/Ô:õ	1ð �O‰O˜DÓ!ˆØ	�‰�d×BÑBÔCØ	�‰�d×&Ñ&¬-×*=Ñ*=¸sÀOÐ)TÐ(UÔVØˆr7   c                ó  ^ • [         R                  R                  S5        U 4S jnU 4S jnU 4S jnS T l        T R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  UT R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XE/5      nUR                  U 4S j5        U$ )NrA  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests.testStatus.<locals>.login<
  r+  r7   c                 ó@   >• T R                   R                  SSSS5      $ )NrA  r³  rµ  r·  ©r‹  ÚstatusrW   s   €r4   rm  Ú+IMAP4ServerTests.testStatus.<locals>.status?
  s   ø€ Ø—;‘;×%Ñ% o°zÀ9ÈhÓWÐWr7   c                ó   >• U Tl         g r0   ©ÚstatusedrÚ  s    €r4   rq  Ú-IMAP4ServerTests.testStatus.<locals>.statusedB
  ó
   ø€ Ø"ˆD�Mr7   c                óD   >• TR                  TR                  SSSS.5      $ )Nr  s   10ré   )r³  rµ  r·  )rD   rq  rØ  s    €r4   r5   Ú-IMAP4ServerTests.testStatus.<locals>.<lambda>M
  s    ø€ �d×&Ñ&Ø—‘¨A¸%È1ÑMôr7   )rO  re  rl  rq  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  )rG   rë  rm  rq  r¿  r  r²   s   `      r4   Ú
testStatusÚIMAP4ServerTests.testStatus9
  s¾   ø€ Ü×Ñ×*Ñ*¨?Ô;õ	Dõ	Xõ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                óÐ  ^ • U 4S jnU 4S jnU 4S jnU 4S jnS =T l         T l        T R                  R                  [	        U5      5      nUR                  [	        U5      T R                  5        UR                  X45        UR                  T R                  T R                  5        T R                  5       n[        R                  " XV/5      R                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú0IMAP4ServerTests.testFailedStatus.<locals>.loginT
  r+  r7   c                 ó@   >• T R                   R                  SSSS5      $ )Nzroot/nonexistentr³  rµ  r·  rl  rW   s   €r4   rm  Ú1IMAP4ServerTests.testFailedStatus.<locals>.statusW
  s#   ø€ Ø—;‘;×%Ñ%Ø" J°	¸8óð r7   c                ó   >• U Tl         g r0   rp  rÚ  s    €r4   rq  Ú3IMAP4ServerTests.testFailedStatus.<locals>.statused\
  rs  r7   c                ó   >• U Tl         g r0   rë  r¢  s    €r4   ÚfailedÚ1IMAP4ServerTests.testFailedStatus.<locals>.failed_
  rî  r7   )rq  r$   rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  Ú_cbTestFailedStatus)rG   rë  rm  rq  r€  r¿  r  s   `      r4   ÚtestFailedStatusÚ!IMAP4ServerTests.testFailedStatusS
  s©   ø€ õ	Dõ	õ
	#õ	#ð (,Ð+ˆŒ˜œØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜Ô)Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8¸×9QÑ9QÓRÐRr7   c                óœ   • U R                  U R                  S 5        U R                  U R                  R                  R                  S5        g )N)s   Could not open mailbox)rD   rq  r$   r¢  r\  rø  s     r4   r‚  Ú$IMAP4ServerTests._cbTestFailedStatusj
  s7   € Ø×Ñ˜Ÿ™¨Ô-Ø×Ñ˜Ÿ™×+Ñ+×0Ñ0Ð2NÕOr7   c                ó  ^ ^• [         R                  " [        S5      m[        R                  R                  S5        U 4S jn[        R                  UU 4S j5       nT R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR                  T R                   T5      $ )Núrfc822.messagerA  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú.IMAP4ServerTests.testFullAppend.<locals>.loginr
  r+  r7   c               3  óž   >#   • [        TS5       n TR                  R                  SU SS5      v •nUsS S S 5        $ ! , (       d  f       g = f7f)NÚrbrA  )ú\SEENú\DELETEDz%Tue, 17 Jun 2003 11:22:16 -0600 (MDT))Úopenr‹  r‹   ©rû  r2   ÚinfilerG   s     €€r4   r‹   Ú/IMAP4ServerTests.testFullAppend.<locals>.appendu
  sG   øé € ä�f˜dÔ# wØ#Ÿ{™{×1Ñ1Ø#ØØ+Ø;ó	 ñ �ð ÷ $×#×#üs   ƒA�"<²
A¼
A
ÁA)r&   ÚsibpathÚ__file__rO  re  rl  r   ÚinlineCallbacksrŒ  r¯   r8   r©  rš  r•  r#   r¾  Ú_cbTestFullAppend©rG   rë  r‹   r¿  r  r²   r‘  s   `     @r4   ÚtestFullAppendÚIMAP4ServerTests.testFullAppendn
  sÄ   ù€ Ü—’œhÐ(8Ó9ˆÜ×Ñ×*Ñ*¨?Ô;õ	Dô 
×	Ñ	õ	ó 
ð	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆä×Ò  Ó)ˆà�}‰}˜T×3Ñ3°VÓ<Ð<r7   c                óž  • [         R                  R                  S   nU R                  S[	        UR
                  5      5        U R                  SS/SS4UR
                  S   SS  5        [        US5       nU R                  UR                  5       UR
                  S   S   R                  5       5        S S S 5        g ! , (       d  f       g = f)NrY  rã   r�  rŽ  s%   Tue, 17 Jun 2003 11:22:16 -0600 (MDT)r   rŒ  ©	rO  re  r„  rD   rî   ru  r�  r]   rd   ©rG   rù  r‘  Úmbr3   s        r4   r–  Ú"IMAP4ServerTests._cbTestFullAppend‰
  s¨   € Ü×$Ñ$×.Ñ.¨Ñ?ˆØ×Ñ˜œC §¡Ó,Ô-Ø×ÑØ˜Ð$Ð&NÐPQÐRØ�K‰K˜‰N˜1˜2Ðô	
ô �&˜$Ô 1Ø×Ñ˜QŸV™V›X r§{¡{°1¡~°aÑ'8×'AÑ'AÓ'CÔD÷  ×Öús   Á6?B>Â>
Cc                ó  ^ ^• [         R                  " [        S5      m[        R                  R                  S5        U 4S jn[        R                  UU 4S j5       nT R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " X4/5      nUR                  T R                   T5      $ )Nrˆ  úPARTIAL/SUBTHINGc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú1IMAP4ServerTests.testPartialAppend.<locals>.login—
  r+  r7   c               3  óD  >#   • [        TS5       n TR                  R                  [        R                  " S[        S[        R                  R                  T5      4-  5      STR                  R                  U 5      5      v •nUsS S S 5        $ ! , (       d  f       g = f7f)NrŒ  s   APPENDz)PARTIAL/SUBTHING (\SEEN) "Right now" {%d}r1   )
r�  r‹  ÚsendCommandr   ri  r)   ÚosÚpathÚgetsizeÚ_IMAP4Client__cbContinueAppendr�  s     €€r4   r‹   Ú2IMAP4ServerTests.testPartialAppend.<locals>.appendš
  s‡   øé € ä�f˜dÔ# wØ#Ÿ{™{×6Ñ6Ü—M’MØ!ô
 &ð#ä&(§g¡g§o¡o°fÓ&=Ð%?ñ@óð
 ØŸ™×BÑBØóó ñ �ð" ÷% $×#×#üs   ƒB �A5BÂ
B Â
BÂB )r&   r“  r”  rO  re  rl  r   r•  rŒ  r¯   r8   r©  rš  r•  r#   r¾  Ú_cbTestPartialAppendr—  s   `     @r4   ÚtestPartialAppendÚ"IMAP4ServerTests.testPartialAppend“
  sÅ   ù€ Ü—’œhÐ(8Ó9ˆÜ×Ñ×*Ñ*Ð+=Ô>õ	Dô 
×	Ñ	õ	ó 
ð	ð* �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×6Ñ6¸Ó?Ð?r7   c                óœ  • [         R                  R                  S   nU R                  S[	        UR
                  5      5        U R                  S/SS4UR
                  S   SS  5        [        US5       nU R                  UR                  5       UR
                  S   S   R                  5       5        S S S 5        g ! , (       d  f       g = f)Nr   rã   r�  s	   Right nowr   rŒ  r›  rœ  s        r4   rª  Ú%IMAP4ServerTests._cbTestPartialAppend·
  sž   € Ü×$Ñ$×.Ñ.Ð/AÑBˆØ×Ñ˜œC §¡Ó,Ô-Ø×Ñ˜8˜* l°AÐ6¸¿¹ÀA¹ÀqÀrÐ8JÔKÜ�&˜$Ô 1Ø×Ñ˜QŸV™V›X r§{¡{°1¡~°aÑ'8×'AÑ'AÓ'CÔD÷  ×Öús   Á5?B=Â=
Cc                ó®  ^ • [         R                  R                  S5        U 4S jnU 4S jnU 4S jnT R                  R	                  [        U5      5      nUR                  [        U5      T R                  5        UR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       $ )Nó   root/subthingc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú*IMAP4ServerTests._testCheck.<locals>.loginÁ
  r+  r7   c                 ó:   >• T R                   R                  S5      $ )Nr°  rt  rW   s   €r4   rH  Ú+IMAP4ServerTests._testCheck.<locals>.selectÄ
  s   ø€ Ø—;‘;×%Ñ%Ð&6Ó7Ð7r7   c                 ó8   >• T R                   R                  5       $ r0   )r‹  rÉ  rW   s   €r4   rÉ  Ú*IMAP4ServerTests._testCheck.<locals>.checkÇ
  ó   ø€ Ø—;‘;×$Ñ$Ó&Ð&r7   )
rO  re  rl  rŒ  r¯   r8   r©  rš  r•  r#   )rG   rë  rH  rÉ  r²   s   `    r4   Ú
_testCheckÚIMAP4ServerTests._testCheck¾
  s’   ø€ Ü×Ñ×*Ñ*Ð+;Ô<õ	Dõ	8õ	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�}‰}‹Ðr7   c                ó"   • U R                  5       $ )zN
Trigger the L{imap.IMAP4Server._cbSelectWork} callback
by selecting an mbox.
)r¸  rW   s    r4   Ú
test_checkÚIMAP4ServerTests.test_checkÐ
  s   € ð
 �‰Ó Ð r7   c                óŠ   ^ • SS jnU 4S jnT R                  [        SU5        T R                  5       nUR                  U5      $ )zZ
Trigger the L{imap.IMAP4Server._ebSelectWork} errback
by failing when we select an mbox.
c                ó.   • [         R                  " S5      e)NÚencoding)r   ÚIllegalMailboxEncoding)rG   rB  rå  s      r4   Ú
failSelectÚ3IMAP4ServerTests.test_checkFail.<locals>.failSelectÝ
  s   € Ü×.Ò.¨zÓ:Ð:r7   c                ó~   >• TR                  5       nTR                  US   R                  R                  S   S5        g )Nrã   r   s   SELECT failed: Server error)r.  rD   r¢  r\  )r”  ÚfailuresrG   s     €r4   ÚcheckResponseÚ6IMAP4ServerTests.test_checkFail.<locals>.checkResponseà
  s7   ø€ Ø×-Ñ-Ó/ˆHØ×Ñ˜X a™[×.Ñ.×3Ñ3°AÑ6Ð8VÕWr7   rH  rJ  )ÚpatchrL  r¸  r¯   )rG   rÁ  rÅ  r²   s   `   r4   Útest_checkFailÚIMAP4ServerTests.test_checkFail×
  s;   ø€ ô	;õ	Xð 	�
‰
”7˜H jÔ1Ø�O‰OÓˆØ�}‰}˜]Ó+Ð+r7   c                ó8  ^ • [        5       n/ SQUl        [        R                  R	                  SU5        U 4S jnU 4S jnU 4S jnT R
                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XV/5      R                  T R                  U5      $ )N©)s	   Message 1)r   ÚAnotherFlagNr   ©s	   Message 2)rÌ  Nrã   )s	   Message 3)r   Nrç   r]  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú)IMAP4ServerTests.testClose.<locals>.loginñ
  r+  r7   c                 ó:   >• T R                   R                  S5      $ )Ns   mailboxrt  rW   s   €r4   rH  Ú*IMAP4ServerTests.testClose.<locals>.selectô
  ó   ø€ Ø—;‘;×%Ñ% jÓ1Ð1r7   c                 ó8   >• T R                   R                  5       $ r0   )r‹  r
  rW   s   €r4   r
  Ú)IMAP4ServerTests.testClose.<locals>.close÷
  r·  r7   )r¸  ru  rO  re  rl  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  Ú_cbTestClose)rG   r  rë  rH  r
  r²   r  s   `      r4   Ú	testCloseÚIMAP4ServerTests.testCloseè
  sÊ   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8õ	Dõ	2õ	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�]‰]‹_ˆÜ×"Ò" A 7Ó+×7Ñ7¸×8IÑ8IÈ1ÓMÐMr7   c                óÂ   • U R                  [        UR                  5      S5        U R                  UR                  S   S5        U R                  UR                  5        g )Nrã   r   rÍ  )rD   rî   ru  r‹  r	  ©rG   rù  r  s      r4   rÕ  ÚIMAP4ServerTests._cbTestClose  sC   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A™Ð(QÔRØ�‰˜Ÿ™Õ!r7   c                óŽ  ^ • [        5       n/ SQUl        [        R                  R	                  SU5        U 4S jnU 4S jnU 4S jnU 4S jnS T l        T R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  [        U5      T R                  5        UR                  UT R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " Xg/5      nUR                  T R                  U5      $ )NrË  r]  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú+IMAP4ServerTests.testExpunge.<locals>.login  r+  r7   c                 ó:   >• T R                   R                  S5      $ )Nr]  rt  rW   s   €r4   rH  Ú,IMAP4ServerTests.testExpunge.<locals>.select  s   ø€ Ø—;‘;×%Ñ% iÓ0Ð0r7   c                 ó8   >• T R                   R                  5       $ r0   )r‹  r  rW   s   €r4   r  Ú-IMAP4ServerTests.testExpunge.<locals>.expunge  s   ø€ Ø—;‘;×&Ñ&Ó(Ð(r7   c                ób   >• TR                  TR                  R                  S L 5        U Tl        g r0   )r‰  rŠ  rÀ  rM  )rM  rG   s    €r4   ÚexpungedÚ.IMAP4ServerTests.testExpunge.<locals>.expunged  s'   ø€ Ø×Ñ˜TŸ[™[×-Ñ-°Ð5Ô6Ø"ˆD�Lr7   )r¸  ru  rO  re  rl  rM  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  Ú_cbTestExpunge)	rG   r  rë  rH  r  rã  r¿  r  r²   s	   `        r4   ÚtestExpungeÚIMAP4ServerTests.testExpunge  së   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8õ	Dõ	1õ	)õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰œ˜g›¨¯©Ô8Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0°!Ó4Ð4r7   c                óÈ   • U R                  [        UR                  5      S5        U R                  UR                  S   S5        U R                  U R                  SS/5        g )Nrã   r   rÍ  rç   )rD   rî   ru  rM  rÙ  s      r4   rå  ÚIMAP4ServerTests._cbTestExpunge&  sK   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A™Ð(QÔRà×Ñ˜Ÿ™¨¨1 vÕ.r7   )rŒ  r$   rF  rÒ  rE  rß  r2   rM  rg  rÙ  rq  N)8r~   r   r€   r�   rÀ  rÍ  rÚ  ræ  rð  rî  r  r  r  r  r2  r;  r:  rT  r_  rn  r}  rm  r’  r‘  r¬  r«  r¿  rÐ  rã  rò  rý  r  r  r!  r   r3  r>  rJ  rN  r`  rf  rv  rƒ  r‚  r˜  r–  r«  rª  r¸  r»  rÈ  rÖ  rÕ  ræ  rå  r‚   r1   r7   r4   r¦  r¦  ‹  s  † òIòGò.LòMò0ò4ò6ò6ò6ò 6ò,!6òF
@ò4òò<ò6Mò,"ò4
ò#2òJ
ò@ò2=òò&%òNò.ò*ò6ò*ò.=ò"@òò&ò*Pò&òò0	òò4Sò.Pò=ò6Eò"@òHEòò$!ò,ò"Nò2"ò
5õ@/r7   r¦  c                  ó  • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S*r,g+),ÚIMAP4ServerParsingTestsi-  z.
Test L{imap4.IMAP4Server}'s command parsing.
c                óÔ   • [        5       U l        [        R                  " 5       U l        U R                  R                  U R                  5        U R                  R                  5         g r0   )r   rv  r   rU  rŠ  ÚmakeConnectionÚclearrW   s    r4   rŽ  ÚIMAP4ServerParsingTests.setUp2  sB   € Ü(Ó*ˆŒÜ×'Ò'Ó)ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰×ÑÕr7   c                óˆ   • U R                   R                  [        R                  " [        R
                  " 5       5      5        g r0   ©rŠ  ÚconnectionLostr$   rß  r   ÚConnectionDonerW   s    r4   r‘  Ú IMAP4ServerParsingTests.tearDown8  ó&   € Ø�‰×"Ñ"¤7§?¢?´5×3GÒ3GÓ3IÓ#JÕKr7   c                óè   ^•  " S S[         5      mU4S jnSU R                  l        XR                  l        U R                  R	                  S5        U R                  U R                  T5      5        g)z?
L{imap4.IMAP4Server} logs exceptions raised by parse methods.
c                  ó   • \ rS rSrSrSrg)ÚSIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.UnhandledExceptioni@  ú
An unhandled exception.
r1   NrM  r1   r7   r4   ÚUnhandledExceptionrø  @  r!  r7   rú  c                ó   >• Ter0   r1   )rc  rú  s    €r4   ÚraisesValueErrorÚQIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.raisesValueErrorE  s	   ø€ Ø$Ð$r7   Úcommandó   invalidN)r%  rŠ  Ú
parseStateÚparse_commandra  r‹  r.  )rG   rü  rú  s     @r4   Útest_parseMethodExceptionLoggedÚ7IMAP4ServerParsingTests.test_parseMethodExceptionLogged;  sV   ø€ ô
	¤ô 	õ
	%ð "+ˆ�‰ÔØ$4�‰Ô!à�‰× Ñ  Ô,à�‰˜×.Ñ.Ð/AÓBÕCr7   c                ó  • U R                   R                  S5        U R                  U R                  R	                  5       S5        U R                   R                  [        R                  " [        R                  " S5      5      5        g)zj
L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
a line that includes a tag but no command.
ó   001s   001 BAD Missing command
ÚDoneN)
rŠ  r  rD   rv  r¢  rò  r$   rß  r   ró  rW   s    r4   Útest_missingCommandÚ+IMAP4ServerParsingTests.test_missingCommandO  s]   € ð
 	�‰×!Ñ! &Ô)à×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPà�‰×"Ñ"Ü�OŠOœE×0Ò0°Ó8Ó9õ	
r7   c                óŽ   • U R                   R                  S5        U R                  U R                  R	                  5       S5        g)zN
L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
an empty line.
r7   s   * BAD Null command
N)rŠ  r  rD   rv  r¢  rW   s    r4   Útest_emptyLineÚ&IMAP4ServerParsingTests.test_emptyLine\  s4   € ð
 	�‰×!Ñ! #Ô&à×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÕKr7   c                óþ   ^• U4S jnX@R                   l        U R                   R                  SR                  US/5      5        U R	                  U R
                  R                  5       SR                  X#/5      5        g)a  
Assert that the given exception results in the expected
response.

@param exception: The exception to raise.
@type exception: L{Exception}

@param tag: The IMAP tag.

@type: L{bytes}

@param expectedResponse: The expected bad response.
@type expectedResponse: L{bytes}
c                ó   >• Ter0   r1   )ÚtagÚcmdÚrestÚ	exceptions      €r4   ÚraisesÚDIMAP4ServerParsingTests.assertParseExceptionResponse.<locals>.raisesu  ó   ø€ ØˆOr7   r¾  rÿ  N)rŠ  ÚdispatchCommandr  r¥   rD   rv  r¢  ©rG   r  r  ÚexpectedResponser  s    `   r4   ÚassertParseExceptionResponseÚ4IMAP4ServerParsingTests.assertParseExceptionResponsee  s]   ø€ õ 	ð '-�‰Ô#à�‰×!Ñ! $§)¡)¨S°*Ð,=Ó">Ô?à×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐ;RÓ1SÕTr7   c                óR   • U R                  [        R                  " S5      SS5        g)z\
When a parsing method raises L{IllegalClientResponse}, the
server sends a C{BAD} response.
úclient responser  ó%   BAD Illegal syntax: client response
N)r  r   ÚIllegalClientResponserW   s    r4   Ú'test_parsingRaisesIllegalClientResponseÚ?IMAP4ServerParsingTests.test_parsingRaisesIllegalClientResponse~  s'   € ð
 	×)Ñ)Ü×'Ò'Ð(9Ó:ØØ6õ	
r7   c                óR   • U R                  [        R                  " S5      SS5        g)zV
When a parsing method raises L{IllegalOperation}, the server
sends a C{NO} response.
Ú	operationr  ó!   NO Illegal operation: operation
N)r  r   ÚIllegalOperationrW   s    r4   Ú*test_parsingRaisesIllegalOperationResponseÚBIMAP4ServerParsingTests.test_parsingRaisesIllegalOperationResponse‰  s&   € ð
 	×)Ñ)Ü×"Ò" ;Ó/ØØ2õ	
r7   c                óR   • U R                  [        R                  " S5      SS5        g)z\
When a parsing method raises L{IllegalMailboxEncoding}, the
server sends a C{NO} response.
r¿  r  ó#   NO Illegal mailbox name: encoding
N)r  r   rÀ  rW   s    r4   Ú(test_parsingRaisesIllegalMailboxEncodingÚ@IMAP4ServerParsingTests.test_parsingRaisesIllegalMailboxEncoding”  s&   € ð
 	×)Ñ)Ü×(Ò(¨Ó4ØØ4õ	
r7   c                óŽ   • U R                   R                  S5        U R                  U R                  R	                  5       S5        g)zQ
L{imap4.IMAP4Server} responds to an unsupported command with a
C{BAD} response.
s   001 HULLABALOOs   001 BAD Unsupported command
N)rŠ  ra  rD   rv  r¢  rW   s    r4   Útest_unsupportedCommandÚ/IMAP4ServerParsingTests.test_unsupportedCommandŸ  s5   € ð
 	�‰× Ñ Ð!2Ô3Ø×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÕTr7   c                óÊ   • U R                   R                  S5        U R                  U R                  R	                  5       S[        S5      R                  S5      -   S-   5        g)zf
L{imap4.IMAP4Server} responds with a C{BAD} response to a
command with more arguments than expected.
s   001 LOGIN A B Cs8   001 BAD Illegal syntax: Too many arguments for command: ó   Czutf-8rÅ  N)rŠ  ra  rD   rv  r¢  rû   rE   rW   s    r4   Útest_tooManyArgumentsForCommandÚ7IMAP4ServerParsingTests.test_tooManyArgumentsForCommand§  s[   € ð
 	�‰× Ñ Ð!3Ô4Ø×ÑØ�N‰N× Ñ Ó"ð7ä�t“*×#Ñ# GÓ,ñ-ð ñõ	
r7   c                ód  ^• U4S jnU R                  U R                  R                  S5        U4U R                  R                  SS -   U R                  l        U R                  R	                  USS5        U R                  U R
                  R                  5       SR                  X#/5      5        g)a
  
Assert that the given exception results in the expected
response.

@param exception: The exception to raise.
@type exception: L{Exception}

@param: The IMAP tag.

@type: L{bytes}

@param expectedResponse: The expected bad response.
@type expectedResponse: L{bytes}
c                ó   >• Ter0   r1   )ÚserverInstancer  r$  r%  r  s       €r4   r  ÚFIMAP4ServerParsingTests.assertCommandExceptionResponse.<locals>.raisesÇ  r  r7   r	  rã   Nó   LOGINs   user passwdr¾  )rD   rŠ  r÷  Úunauth_LOGINr  rv  r¢  r¥   r  s    `   r4   ÚassertCommandExceptionResponseÚ6IMAP4ServerParsingTests.assertCommandExceptionResponse·  s‡   ø€ õ 	ð 	×Ñ˜Ÿ™×*Ñ*¨HÔ5à$* 9¨t¯{©{×/GÑ/GÈÈÐ/KÑ#Kˆ�‰Ô à�‰×#Ñ# C¨°>ÔBà×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐ;RÓ1SÕTr7   c                óR   • U R                  [        R                  " S5      SS5        g)zU
When a command raises L{IllegalClientResponse}, the
server sends a C{BAD} response.
r  r  r  N)r7  r   r  rW   s    r4   Ú'test_commandRaisesIllegalClientResponseÚ?IMAP4ServerParsingTests.test_commandRaisesIllegalClientResponseÒ  s'   € ð
 	×+Ñ+Ü×'Ò'Ð(9Ó:ØØ6õ	
r7   c                óR   • U R                  [        R                  " S5      SS5        g)zO
When a command raises L{IllegalOperation}, the server sends a
C{NO} response.
r!  r  r"  N)r7  r   r#  rW   s    r4   Ú*test_commandRaisesIllegalOperationResponseÚBIMAP4ServerParsingTests.test_commandRaisesIllegalOperationResponseÝ  s&   € ð
 	×+Ñ+Ü×"Ò" ;Ó/ØØ2õ	
r7   c                óR   • U R                  [        R                  " S5      SS5        g)zU
When a command raises L{IllegalMailboxEncoding}, the server
sends a C{NO} response.
r¿  r  r'  N)r7  r   rÀ  rW   s    r4   Ú(test_commandRaisesIllegalMailboxEncodingÚ@IMAP4ServerParsingTests.test_commandRaisesIllegalMailboxEncodingè  s&   € ð
 	×+Ñ+Ü×(Ò(¨Ó4ØØ4õ	
r7   c                ó”   •  " S S[         5      nU R                  U" S5      SS5        U R                  U R                  U5      5        g)zj
Wehn a command raises an unhandled exception, the server sends
a C{BAD} response and logs the exception.
c                  ó   • \ rS rSrSrSrg)ÚXIMAP4ServerParsingTests.test_commandRaisesUnhandledException.<locals>.UnhandledExceptioniù  rù  r1   NrM  r1   r7   r4   rú  rD  ù  r!  r7   rú  Ú	unhandledr  s   BAD Server error: unhandled
N)r%  r7  r‹  r.  )rG   rú  s     r4   Ú$test_commandRaisesUnhandledExceptionÚ<IMAP4ServerParsingTests.test_commandRaisesUnhandledExceptionó  sF   € ô	¤ô 	ð
 	×+Ñ+Ù˜{Ó+ØØ.ô	
ð 	�‰˜×.Ñ.Ð/AÓBÕCr7   c                ó°   • SU R                   l        U R                   R                  S5        U R                  U R                  R                  5       S5        g)z`
A string literal whose length exceeds the maximum allowed
length results in a C{BAD} response.
ré   s   001 LOGIN {5}
sE   001 BAD Illegal syntax: Literal too long! I accept at most 4 octets
N)rŠ  Ú_literalStringLimitra  rD   rv  r¢  rW   s    r4   Útest_stringLiteralTooLongÚ1IMAP4ServerParsingTests.test_stringLiteralTooLong  sF   € ð
 +,ˆ�‰Ô'Ø�‰× Ñ Ð!5Ô6à×ÑØ�N‰N× Ñ Ó"ð.õ	
r7   c                ó€   • S H8  nU R                  [        R                  U R                  R                  U5        M:     g)zA
An empty string argument raises L{imap4.IllegalClientResponse}.
)r7   rÅ  r¾  N©rö   r   r  rŠ  Úarg_astring)rG   r	  s     r4   Útest_arg_astringEmptyLineÚ1IMAP4ServerParsingTests.test_arg_astringEmptyLine  s3   € ó *ˆEØ×ÑÜ×+Ñ+¨T¯[©[×-DÑ-DÀeöò *r7   c                ón   • U R                  [        R                  U R                  R                  S5        g)zP
An unmatched quote in a string argument raises
L{imap4.IllegalClientResponse}.
s   "openNrM  rW   s    r4   Útest_arg_astringUnmatchedQuotesÚ7IMAP4ServerParsingTests.test_arg_astringUnmatchedQuotes  s)   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@À(õ	
r7   c                ón   • U R                  [        R                  U R                  R                  S5        g)zV
An unmatched brace in a string literal's size raises
L{imap4.IllegalClientResponse}.
s   {0NrM  rW   s    r4   Ú&test_arg_astringUnmatchedLiteralBracesÚ>IMAP4ServerParsingTests.test_arg_astringUnmatchedLiteralBraces&  s'   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPUÕVr7   c                ón   • U R                  [        R                  U R                  R                  S5        g)zK
A non-integral string literal size raises
L{imap4.IllegalClientResponse}.
ó   {[object Object]}NrM  rW   s    r4   Ú"test_arg_astringInvalidLiteralSizeÚ:IMAP4ServerParsingTests.test_arg_astringInvalidLiteralSize-  ó*   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@ÐBVõ	
r7   c                ón   • U R                  [        R                  U R                  R                  S5        g)z0
An empty atom raises L{IllegalClientResponse}.
r7   N©rö   r   r  rŠ  Úarg_atomrW   s    r4   Útest_arg_atomEmptyLineÚ.IMAP4ServerParsingTests.test_arg_atomEmptyLine6  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7KÑ7KÈSÕQr7   c                ón   • U R                  [        R                  U R                  R                  S5        g)z3
A malformed atom raises L{IllegalClientResponse}.
s    not an atom Nr]  rW   s    r4   Útest_arg_atomMalformedAtomÚ2IMAP4ServerParsingTests.test_arg_atomMalformedAtom<  s*   € ð 	×ÑÜ×'Ñ'¨¯©×)=Ñ)=Ð?Oõ	
r7   c                ón   • U R                  [        R                  U R                  R                  S5        g)z>
An empty parenthesized list raises L{IllegalClientResponse}.
r7   N©rö   r   r  rŠ  Ú	arg_plistrW   s    r4   Útest_arg_plistEmptyLineÚ/IMAP4ServerParsingTests.test_arg_plistEmptyLineD  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈcÕRr7   c                óØ   • U R                  [        R                  U R                  R                  S5        U R                  [        R                  U R                  R                  S5        g)zM
A parenthesized with unmatched parentheses raises
L{IllegalClientResponse}.
s   (foos   foo)Nre  rW   s    r4   Ú"test_arg_plistUnmatchedParenthesesÚ:IMAP4ServerParsingTests.test_arg_plistUnmatchedParenthesesJ  sH   € ð
 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÔVØ×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÕVr7   c                ón   • U R                  [        R                  U R                  R                  S5        g)z8
An empty file literal raises L{IllegalClientResponse}.
r7   N©rö   r   r  rŠ  Úarg_literalrW   s    r4   Útest_arg_literalEmptyLineÚ1IMAP4ServerParsingTests.test_arg_literalEmptyLineR  s'   € ð 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPSÕTr7   c                óØ   • U R                  [        R                  U R                  R                  S5        U R                  [        R                  U R                  R                  S5        g)zB
A literal with unmatched braces raises
L{IllegalClientResponse}.
s   {10s   10}Nrm  rW   s    r4   Útest_arg_literalUnmatchedBracesÚ7IMAP4ServerParsingTests.test_arg_literalUnmatchedBracesX  sJ   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÔWØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÕWr7   c                ón   • U R                  [        R                  U R                  R                  S5        g)zD
A non-integral literal size raises
L{imap4.IllegalClientResponse}.
rX  Nrm  rW   s    r4   Ú"test_arg_literalInvalidLiteralSizeÚ:IMAP4ServerParsingTests.test_arg_literalInvalidLiteralSize`  r[  r7   c                óf   • SnU R                   R                  U5      u  p#U R                  US5        g)z8
A sequence set returns the unparsed portion of a line.
s   1:* blah blah blahs   blah blah blahN)rŠ  Ú
arg_seqsetrD   )rG   Úsequencer»  r  s       r4   Útest_arg_seqsetReturnsRestÚ2IMAP4ServerParsingTests.test_arg_seqsetReturnsResti  s0   € ð )ˆØ—+‘+×(Ñ(¨Ó2‰ˆØ×Ñ˜Ð0Õ1r7   c                ón   • U R                  [        R                  U R                  R                  S5        g)z<
An invalid sequence raises L{imap4.IllegalClientResponse}.
s   x:yN)rö   r   r  rŠ  rx  rW   s    r4   Útest_arg_seqsetInvalidSequenceÚ6IMAP4ServerParsingTests.test_arg_seqsetInvalidSequenceq  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7MÑ7MÈvÕVr7   c                óˆ   • SnU R                   R                  U5      u  p#U R                  X!/5        U R                  U5        g)z:
A single flag that is not contained in a list is parsed.
s   flagN)rŠ  Úarg_flaglistrD   r‰  )rG   ÚflagrÈ  r  s       r4   Útest_arg_flaglistOneFlagÚ0IMAP4ServerParsingTests.test_arg_flaglistOneFlagw  s=   € ð ˆØ—{‘{×/Ñ/°Ó5‰ˆØ×Ñ˜ Ô(Ø×Ñ˜Õr7   c                ón   • U R                  [        R                  U R                  R                  S5        g)zS
A list of flags with unmatched parentheses raises
L{imap4.IllegalClientResponse}.
s   (invalidN©rö   r   r  rŠ  r€  rW   s    r4   Ú&test_arg_flaglistMismatchedParentehsesÚ>IMAP4ServerParsingTests.test_arg_flaglistMismatchedParentehses€  s+   € ð
 	×ÑÜ×'Ñ'Ø�K‰K×$Ñ$Øõ	
r7   c                óØ   • U R                  [        R                  U R                  R                  S5        U R                  [        R                  U R                  R                  S5        g)zW
A list of flags that contains a malformed flag raises
L{imap4.IllegalClientResponse}.
s	   (first  )s   (first  second)Nr…  rW   s    r4   Útest_arg_flaglistMalformedFlagÚ6IMAP4ServerParsingTests.test_arg_flaglistMalformedFlag‹  sQ   € ð
 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÀ?ô	
ð 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÐCXõ	
r7   c                ó†   • SnU R                   R                  U5      u  p#U R                  U5        U R                  X15        g)zw
A line that does not begin with an open parenthesis (C{(}) is
parsed as L{None}, and the remainder is the whole line.
s   not (N)rŠ  Ú	opt_plistry  rD   )rG   rc  ÚplistÚ	remainders       r4   Ú$test_opt_plistMissingOpenParenthesisÚ<IMAP4ServerParsingTests.test_opt_plistMissingOpenParenthesis—  s<   € ð
 ˆØŸ;™;×0Ñ0°Ó6ÑˆØ×Ñ˜%Ô Ø×Ñ˜Õ)r7   c                ó†   • SnU R                   R                  U5      u  p#U R                  U5        U R                  X15        g)zr
A line that does not begin with a double quote (C{"}) is
parsed as L{None}, and the remainder is the whole line.
s   not "N)rŠ  Úopt_datetimery  rD   )rG   rc  ÚdtrŽ  s       r4   Ú!test_opt_datetimeMissingOpenQuoteÚ9IMAP4ServerParsingTests.test_opt_datetimeMissingOpenQuote¡  s;   € ð
 ˆØŸ™×0Ñ0°Ó6‰ˆØ×Ñ˜"ÔØ×Ñ˜Õ)r7   c                ór   • SnU R                  [        R                  U R                  R                  U5        g)z`
A line that does not have a closing double quote (C{"}) raises
L{imap4.IllegalClientResponse}.
s   "21-Jul-2017 19:37:07 -0700N)rö   r   r  rŠ  r’  rb  s     r4   Ú"test_opt_datetimeMissingCloseQuoteÚ:IMAP4ServerParsingTests.test_opt_datetimeMissingCloseQuote«  s,   € ð
 .ˆØ×Ñœ%×5Ñ5°t·{±{×7OÑ7OÐQUÕVr7   c                ór   • SnU R                  [        R                  U R                  R                  U5        g)zh
A line that contains C{CHARSET} but no character set
identifier raises L{imap4.IllegalClientResponse}.
rÐ  N)rö   r   r  rŠ  Úopt_charsetrb  s     r4   Ú!test_opt_charsetMissingIdentifierÚ9IMAP4ServerParsingTests.test_opt_charsetMissingIdentifier³  s,   € ð
 ˆØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPTÕUr7   c                óŠ   • SnU R                   R                  U5      u  p#U R                  US5        U R                  US5        g)zt
A line that ends with a C{CHARSET} identifier is parsed as
that identifier, and the remainder is the empty string.
s   CHARSET UTF-8ó   UTF-8r7   N©rŠ  rš  rD   ©rG   rc  Ú
identifierrŽ  s       r4   Útest_opt_charsetEndOfLineÚ1IMAP4ServerParsingTests.test_opt_charsetEndOfLine»  s@   € ð
  ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
Ø×Ñ˜ XÔ.Ø×Ñ˜ CÕ(r7   c                óŠ   • SnU R                   R                  U5      u  p#U R                  US5        U R                  US5        g)zˆ
A line that has additional data after a C{CHARSET} identifier
is parsed as that identifier, and the remainder is that
additional data.
s   CHARSET UTF-8 remainderrž  s	   remainderNrŸ  r   s       r4   Útest_opt_charsetWithRemainderÚ5IMAP4ServerParsingTests.test_opt_charsetWithRemainderÅ  s@   € ð *ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
Ø×Ñ˜ XÔ.Ø×Ñ˜ LÕ1r7   ©rŠ  rv  N)-r~   r   r€   r�   rd  rŽ  r‘  r  r  r
  r  r  r$  r(  r+  r/  r7  r:  r=  r@  rF  rJ  rO  rR  rU  rY  r_  rb  rg  rj  ro  rr  ru  rz  r}  r‚  r†  r‰  r�  r”  r—  r›  r¢  r¥  r‚   r1   r7   r4   rë  rë  -  sÚ   † ñòòLòDò(
òLòUò2	
ò	
ò	
òUò
ò Uò6	
ò	
ò	
òDò&
òò
òWò
òRò
òSòWòUòXò
ò2òWòò	
ò

ò*ò*òWòVò)õ	2r7   rë  c                  ó`   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)ÚIMAP4ServerSearchTestsiÑ  zK
Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.
c                óš   • [         R                  U 5        S/U l        S/U l        S/U l        SU l        [        SS0/ SSS	S 5      U l        g )
Nz10-Dec-2009z13-Dec-2009z16-Dec-2009r   rü  zMon, 13 Dec 2009 21:25:10 GMTz13 Dec 2009 00:00:00 GMTr�  éÒ  )r…  rŽ  ÚearlierQueryÚsameDateQueryÚ
laterQueryÚseqr¬   r±   rW   s    r4   rŽ  ÚIMAP4ServerSearchTests.setUpÖ  sX   € Ü×Ñ˜tÔ$Ø*˜OˆÔØ+˜_ˆÔØ(˜/ˆŒØˆŒÜØÐ4Ð5ØØ&ØØØó
ˆ�r7   c                ó,  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)zi
L{imap4.IMAP4Server.search_SENTBEFORE} returns True if the message date
is earlier than the query date.
N)r‰  rŠ  Úsearch_SENTBEFOREr¬  r¯  r±   r‹  r®  rW   s    r4   Útest_searchSentBeforeÚ,IMAP4ServerSearchTests.test_searchSentBeforeå  sf   € ð
 	×ÑØ�K‰K×)Ñ)¨$×*;Ñ*;¸T¿X¹XÀtÇxÁxÓPô	
ð 	�‰Ø�K‰K×)Ñ)¨$¯/©/¸4¿8¹8ÀTÇXÁXÓNõ	
r7   c                ó�  • U R                  U R                  R                  S/U R                  U R                  S5      5        U R                  U R                  R                  S/U R                  U R                  S5      5        U R                  U R                  R                  S/U R                  U R                  S5      5        g)zY
L{imap4.IMAP4Server.search_UID} returns True if the message UID is in
the search range.
r  )rã   r«  s   2:*rÿ   N)r‰  rŠ  Ú
search_UIDr¯  r±   r‹  rW   s    r4   Útest_searchWildcardÚ*IMAP4ServerSearchTests.test_searchWildcardñ  sŒ   € ð
 	×ÑØ�K‰K×"Ñ" F 8¨T¯X©X°t·x±xÀÓKô	
ð 	�‰˜Ÿ™×.Ñ.°¨x¸¿¹À4Ç8Á8ÈYÓWÔXØ�‰˜Ÿ™×.Ñ.°¨v°t·x±xÀÇÁÈ9ÓUÕVr7   c                óˆ   • U R                  U R                  R                  S/U R                  U R                  S5      5        g)zƒ
L{imap4.IMAP4Server.search_UID} should return True if there is a
wildcard, because a wildcard means "highest UID in the mailbox".
s   1235:*)r«  rã   N)r‹  rŠ  r¶  r¯  r±   rW   s    r4   Útest_searchWildcardHighÚ.IMAP4ServerSearchTests.test_searchWildcardHighý  s2   € ð
 	�‰Ø�K‰K×"Ñ" I ;°·±¸$¿(¹(ÀIÓNõ	
r7   c                ój   • [         R                  " S5      nU R                  [        U5      / SQ5        g)úd
L{imap4.IMAP4Server.search_SENTON} returns True if the message date is
the same as the query date.
r�  rR  N)r   r  rD   rï   )rG   Úmsgsets     r4   Útest_reversedSearchTermsÚ/IMAP4ServerSearchTests.test_reversedSearchTerms  s(   € ô
 ×"Ò" 6Ó*ˆØ×Ñœ˜f›¢yÕ1r7   c                óÀ  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)r½  N)	r‰  rŠ  Úsearch_SENTONr¬  r¯  r±   r‹  r­  r®  rW   s    r4   Útest_searchSentOnÚ(IMAP4ServerSearchTests.test_searchSentOn  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	�‰Ø�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	×Ñ˜Ÿ™×2Ñ2°4·?±?ÀDÇHÁHÈdÏhÉhÓWÕXr7   c                ó,  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)zf
L{imap4.IMAP4Server.search_SENTSINCE} returns True if the message date
is later than the query date.
N)r‹  rŠ  Úsearch_SENTSINCEr¬  r¯  r±   r‰  r®  rW   s    r4   Útest_searchSentSinceÚ+IMAP4ServerSearchTests.test_searchSentSince  sf   € ð
 	�‰Ø�K‰K×(Ñ(¨×):Ñ):¸D¿H¹HÀdÇhÁhÓOô	
ð 	×ÑØ�K‰K×(Ñ(¨¯©¸$¿(¹(ÀDÇHÁHÓMõ	
r7   c                óD  • U R                  U R                  R                  S/U R                  -   S/-   U R                  -   U R
                  U R                  S5      5        U R                  U R                  R                  S/U R                  -   S/-   U R                  -   U R
                  U R                  S5      5        U R                  U R                  R                  S/U R                  -   S/-   U R                  -   U R
                  U R                  S5      5        g)z�
L{imap4.IMAP4Server.search_OR} returns true if either of the two
expressions supplied to it returns true and returns false if neither
does.
Ú	SENTSINCEr7  ÚSENTONN)r‹  rŠ  Ú	search_ORr¬  r®  r¯  r±   r‰  rW   s    r4   Útest_searchOrÚ$IMAP4ServerSearchTests.test_searchOr'  sõ   € ð 	�‰Ø�K‰K×!Ñ!Ø� × 1Ñ 1Ñ1°[°MÑAÀDÇOÁOÑSØ—‘Ø—‘Øó	ô	
ð 	�‰Ø�K‰K×!Ñ!Ø� §¡Ñ/°;°-Ñ?À$×BSÑBSÑSØ—‘Ø—‘Øó	ô	
ð 	×ÑØ�K‰K×!Ñ!Ø�
˜TŸ_™_Ñ,°¨}Ñ<¸t¿¹ÑNØ—‘Ø—‘Øó	õ	
r7   c                ó@  • U R                  U R                  R                  S/U R                  -   U R                  U R
                  S5      5        U R                  U R                  R                  S/U R                  -   U R                  U R
                  S5      5        g)zf
L{imap4.IMAP4Server.search_NOT} returns the negation of the result
of the expression supplied to it.
rÊ  r7  rË  N)r‰  rŠ  Ú
search_NOTr¬  r¯  r±   r‹  r®  rW   s    r4   Útest_searchNotÚ%IMAP4ServerSearchTests.test_searchNotF  s~   € ð
 	×ÑØ�K‰K×"Ñ"Ø� × 1Ñ 1Ñ1°4·8±8¸T¿X¹XÀ|óô	
ð
 	�‰Ø�K‰K×"Ñ"Ø�
˜TŸ_™_Ñ,¨d¯h©h¸¿¹À,óõ	
r7   c                óÀ  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)zh
L{imap4.IMAP4Server.search_BEFORE} returns True if the
internal message date is before the query date.
N)	r‰  rŠ  Úsearch_BEFOREr¬  r¯  r±   r­  r‹  r®  rW   s    r4   Útest_searchBeforeÚ(IMAP4ServerSearchTests.test_searchBeforeV  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	×ÑØ�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	�‰˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÕWr7   c                óÀ  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)zi
L{imap4.IMAP4Server.search_ON} returns True if the
internal message date is the same as the query date.
N)r‰  rŠ  Ú	search_ONr¬  r¯  r±   r­  r®  rW   s    r4   Útest_searchOnÚ$IMAP4ServerSearchTests.test_searchOnc  s�   € ð
 	×Ñ˜Ÿ™×.Ñ.¨t×/@Ñ/@À$Ç(Á(ÈDÏHÉHÓUÔVØ×Ñ˜Ÿ™×.Ñ.¨t×/AÑ/AÀ4Ç8Á8ÈTÏXÉXÓVÔWØ×Ñ˜Ÿ™×.Ñ.¨t¯©ÀÇÁÈ$Ï(É(ÓSÕTr7   c                óÀ  • U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        U R                  U R                  R                  U R                  U R                  U R
                  5      5        g)zm
L{imap4.IMAP4Server.search_SINCE} returns True if the
internal message date is greater than the query date.
N)	r‹  rŠ  Úsearch_SINCEr¬  r¯  r±   r­  r‰  r®  rW   s    r4   Útest_searchSinceÚ'IMAP4ServerSearchTests.test_searchSincel  s�   € ð
 	�‰˜Ÿ™×0Ñ0°×1BÑ1BÀDÇHÁHÈdÏhÉhÓWÔXØ�‰Ø�K‰K×$Ñ$ T×%7Ñ%7¸¿¹À4Ç8Á8ÓLô	
ð 	×Ñ˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÕWr7   )r¬  r®  r±   r­  r¯  N)r~   r   r€   r�   rd  rŽ  r³  r·  rº  r¿  rÃ  rÇ  rÍ  rÑ  rÕ  rÙ  rÝ  r‚   r1   r7   r4   r©  r©  Ñ  sH   † ñò
ò

ò
Wò
ò2òYò

ò
ò>
ò XòUõ	Xr7   r©  c                  ó,   • \ rS rSrSrSrSS jrS rSrg)rV  ix  z„
A L{IRealm} for tests.

@cvar theAccount: An C{Account} instance.  Tests can set this to
    ensure predictable account retrieval.
Nc                óD   ^ ^• T(       a  U4S jT l         gU 4S jT l         g)a*  
Create a realm for testing.

@param accountHolder: (optional) An object whose C{theAccount}
    attribute will be returned instead of
    L{TestRealm.theAccount}.  Attribute access occurs on every
    avatar request, so any modifications to
    C{accountHolder.theAccount} will be reflected here.
c                 ó   >• T R                   $ r0   ©re  rR  s   €r4   r5   Ú$TestRealm.__init__.<locals>.<lambda>Ž  s   ø€  }×'?Ò'?r7   c                 ó   >• T R                   $ r0   râ  rW   s   €r4   r5   rã  �  s	   ø€  t§¢r7   N©Ú_getAccount)rG   rS  s   ``r4   rˆ   ÚTestRealm.__init__ƒ  s   ù€ ö Ü?ˆDÕä6ˆDÕr7   c                óF   • [         R                  U R                  5       S 4$ )Nc                 ó   • g r0   r1   r1   r7   r4   r5   Ú)TestRealm.requestAvatar.<locals>.<lambda>“  s   € ¸4r7   )r   ÚIAccountræ  )rG   ÚavatarIdÚmindr   s       r4   r  ÚTestRealm.requestAvatar’  s   € Ü�~‰~˜t×/Ñ/Ó1±<Ð?Ð?r7   rå  r0   )	r~   r   r€   r�   rd  re  rˆ   r  r‚   r1   r7   r4   rV  rV  x  s   † ñð €Jô7õ@r7   rV  c                  ó0   • \ rS rSr\\4rSS0rS rS r	Sr
g)ÚTestCheckeri–  rP  ó   secretc                óð   • UR                   U R                  ;   a\  [        R                  " UR                  U R                  UR                      5      R                  U R                  UR                   5      $ g r0   )Úusernamer9  r   ÚmaybeDeferredÚcheckPasswordr¯   Ú_cbCheck)rG   Úcredentialss     r4   ÚrequestAvatarIdÚTestChecker.requestAvatarId›  s\   € Ø×Ñ 4§:¡:Ó-Ü×&Ò&Ø×)Ñ)¨4¯:©:°k×6JÑ6JÑ+Kóç‰k˜$Ÿ-™-¨×)=Ñ)=Ó>ð?ð .r7   c                ó(   • U(       a  U$ [        5       er0   r   )rG   r2   ró  s      r4   rö  ÚTestChecker._cbCheck¡  s   € ÞØˆOÜÓ!Ð!r7   r1   N)r~   r   r€   r�   r   r   ÚcredentialInterfacesr9  rø  rö  r‚   r1   r7   r4   rð  rð  –  s"   † Ø3Ð5FÐGÐà˜)Ð$€Eò?õ"r7   rð  c                  óŒ   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rSrg)ÚAuthenticatorTestsi§  c                ó.  • [         R                  U 5        [        5       n[        S5      Ul        [        U5      U l        U R                  R                  [        5       5        U R                  U R                  l        SU l
        UR                  U l        g )NrP  r   )r…  rŽ  rV  rL  re  r   rY  rZ  rð  rŠ  Úauthenticatedrö  )rG   r^  s     r4   rŽ  ÚAuthenticatorTests.setUp¨  sh   € Ü×Ñ˜tÔ$ä“ˆÜ" ;Ó/ˆÔÜ˜U“mˆŒØ�‰×#Ñ#¤K£MÔ2Ø!Ÿ[™[ˆ�‰ÔàˆÔØ×'Ñ'ˆ�r7   c                ó  • [        [        [        5       " S S5      5       nU" 5       n[        [        U5        [        R
                  " SU05      nU R                  Ul        [        5       nUR                  U5        U R                  UR                  [        R                  " S5      5        U R                  SUR                  5       5        UR                  5         UR!                  S5        U R                  ["        R$                  " UR'                  5       5      UR                  5       5        UR                  5         UR!                  ["        R$                  " S5      S-   5        U R)                  UR                  5       S	5        g
)z�
L{imap4.IMAP4Server} accepts a L{dict} mapping challenge type
names to L{twisted.mail.interfaces.IChallengeResponse}
providers.
c                  ó,   • \ rS rSrS rS rS rS rSrg)Ú>AuthenticatorTests.test_customChallengers.<locals>.SPECIALAuthi»  c                ó   • g)Nó   SPECIALr1   rW   s    r4   ÚgetChallengeÚKAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.getChallenge½  ó   € Ø!r7   c                óB   • UR                  S S5      u  U l        U l        g rÙ  )Úsplitró  Úpassword©rG   Úresponses     r4   ÚsetResponseÚJAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.setResponseÀ  s   € Ø/7¯~©~¸dÀAÓ/FÑ,�”˜t�}r7   c                ó   • g©NFr1   rW   s    r4   ÚmoreChallengesÚMAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.moreChallengesÃ  s   € Ør7   c                ó&   • U R                   U l         g r0   )r  )rG   r  s     r4   rõ  ÚLAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.checkPasswordÆ  s   € Ø $§¡�•r7   )r  ró  N)	r~   r   r€   r�   r  r  r  rõ  r‚   r1   r7   r4   ÚSPECIALAuthr  »  s   † ò"òGòõ.r7   r  r  úConnection done.s   AUTH=SPECIALs   001 AUTHENTICATE SPECIAL
s   username passwordrÅ  s"   001 OK Authentication successful
N)r   r    r   r   r   rU  rY  r   rí  Ú
addCleanuprò  r   ró  rB  r¢  rî  ÚdataReceivedÚbase64Ú	b64encoder  rD   )rG   r  ÚspecialrŠ  rv  s        r4   Útest_customChallengersÚ)AuthenticatorTests.test_customChallengers´  s&  € ô 
Ô'Ô):Ó	;÷	.ð 	.ó 
<ð	.ñ “-ˆÜÔ'¨Ô1ä×"Ò" J°Ð#<Ó=ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰�o y§¡Ó'8Ô9à�‰ÔØ×ÑÐ;Ô<à�‰”f×&Ò& w×';Ñ';Ó'=Ó>À	ÇÁÓ@QÔRà�‰ÔØ×ÑœF×,Ò,Ð-AÓBÀWÑLÔMà×Ñ˜Ÿ™Ó*Ð,SÕTr7   c                óh  • [         R                  " 5       nU R                  Ul        [        5       nUR	                  U5        U R                  UR                  [        R                  " S5      5        UR                  5         UR                  S5        U R                  UR                  5       S5        g)zG
An unsupported C{AUTHENTICATE} method results in a negative
response.
r  s   001 AUTHENTICATE UNKNOWN
s(   001 NO AUTHENTICATE method unsupported
N)r   rU  rY  r   rí  r  rò  r   ró  rî  r  rD   r¢  )rG   rŠ  rv  s      r4   Útest_unsupportedMethodÚ)AuthenticatorTests.test_unsupportedMethodß  s‡   € ô
 ×"Ò"Ó$ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰Ôà×ÑÐ;Ô<Ø×ÑØ�O‰OÓÐLõ	
r7   c                óú  ^ • [         R                  T R                  R                  S'   [         R                  " S5      nT R
                  R                  U5        ST R                  l        U 4S jnT R                  R                  [        U5      5      nUR                  T R                  S5        UR                  T R                  T R                  5        [         R"                  " UT R%                  5       /5      $ )z^
An L{imap4.IMAP4Server} that is missing a L{Portal} responds
negatively to an authentication
r5  rP  Nc                 ó:   >• T R                   R                  S5      $ ©Nrñ  ©r‹  ÚauthenticaterW   s   €r4   rô  Ú3AuthenticatorTests.test_missingPortal.<locals>.authþ  ó   ø€ Ø—;‘;×+Ñ+¨IÓ6Ð6r7   s    Temporary authentication failure)r   ÚLOGINCredentialsrŠ  rÌ  ÚLOGINAuthenticatorr‹  ÚregisterAuthenticatorrY  rŒ  r¯   r8   r½  r£  r©  r•  rš  r   r¾  r#   )rG   ÚcAuthrô  r²   s   `   r4   Útest_missingPortalÚ%AuthenticatorTests.test_missingPortalò  sº   ø€ ô
 -2×,BÑ,Bˆ�‰×Ñ Ñ)ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0à!ˆ�‰Ôõ	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ð-Pô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó‚  ^ • [        [        5       " S S5      5       n[        [        5       " S S5      5       nU" 5       n[        [        U5        UT R                  R
                  S'   T R                  R                  U" 5       5        U 4S jnT R                  R                  [        U5      5      nUR                  T R                  S[        UR                  5      -   R                  S5      5        UR!                  T R"                  T R$                  5        [&        R(                  " UT R+                  5       /5      $ )	z}
When a challenger's
L{getChallenge<IChallengeResponse.getChallenge>} method raises
any exception, a C{NO} response is sent.
c                  ó*   • \ rS rSrSrS rS rS rSrg)ÚRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallengei  s   A challenge failurec                ó,   • [        U R                  5      er0   )r,  rû  rW   s    r4   r  Ú_AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.getChallenge  s   € Ü  §¡Ó.Ð.r7   c                ó   • g©zG
Never called.

@param response: See L{IChallengeResponse.setResponse}
Nr1   r  s     r4   r  Ú^AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.setResponse  ó   � r7   c                ó   • g©z
Never called.
Nr1   rW   s    r4   r  ÚaAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.moreChallenges  r8  r7   r1   N©	r~   r   r€   r�   rû  r  r  r  r‚   r1   r7   r4   ÚValueErrorAuthChallenger2    s   † à,ˆGò/òõr7   r=  c                  ó    • \ rS rSrS rS rSrg)ÚRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticatori#  c                ó   • g)Nó   ERRORr1   rW   s    r4   ÚgetNameÚZAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.getName%  s   € Ør7   c                ó   • g)Ns   IGNOREDr1   )rG   ÚsecretÚchals      r4   ÚchallengeResponseÚdAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.challengeResponse(  r	  r7   r1   N)r~   r   r€   r�   rB  rG  r‚   r1   r7   r4   ÚValueErrorAuthenticatorr?  #  s   † ò õ"r7   rI  rA  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú?AuthenticatorTests.test_challengerRaisesException.<locals>.auth1  r)  r7   zServer error: rê  )r   r    r!   r   rŠ  rÌ  r‹  r,  rŒ  r¯   r8   r½  r£  r  rû  rE   r©  r•  rš  r   r¾  r#   )rG   r=  rI  Úbadrô  r²   s   `     r4   Útest_challengerRaisesExceptionÚ1AuthenticatorTests.test_challengerRaisesException	  s	  ø€ ô 
Ô'Ó	(÷	ð 	ó 
)ð	ô$ 
Ô*Ó	+÷	"ð 	"ó 
,ð	"ñ &Ó'ˆÜÔ'¨Ô-à,Cˆ�‰×Ñ Ñ)Ø�‰×)Ñ)Ñ*AÓ*CÔDõ	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ø¤Ð$;×$CÑ$CÓ DÑD×LÑLÈWÓUô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó(  • [        [        5       " S S5      5       nU" 5       n[        [        U5        [        R                  " 5       nU R
                  Ul        XR                  S'   [        5       nUR                  U5        U R                  UR                  [        R                  " S5      5        U R                  SUR                  5       5        UR                  5         UR!                  S5        U R                  ["        R$                  " UR'                  5       5      UR                  5       5        UR                  5         UR!                  S5        U R)                  UR                  5       SR+                  S	UR,                  S
/5      5        g)zq
A client that responds with a challenge that cannot be decoded
as Base 64 receives an L{IllegalClientResponse}.
c                  ó*   • \ rS rSrSrS rS rS rSrg)ÚEAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallengeiC  s   Malformed Response - not base64c                ó   • g)Ns   SomeChallenger1   rW   s    r4   r  ÚRAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.getChallengeG  s   € Ø'r7   c                ó   • gr6  r1   r  s     r4   r  ÚQAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.setResponseJ  r8  r7   c                ó   • gr:  r1   rW   s    r4   r  ÚTAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.moreChallengesQ  r8  r7   r1   Nr<  r1   r7   r4   ÚNotBase64AuthChallengerQ  C  s   † à8ˆGò(òõr7   rX  s	   NOTBASE64r  s   AUTH=NOTBASE64s   001 AUTHENTICATE NOTBASE64
s     Not base64
r7   s   001 NO Authentication failed: rÅ  N)r   r    r   r   rU  rY  rÌ  r   rí  r  rò  r   ró  rB  r¢  rî  r  r  r  r  rD   r¥   rû  )rG   rX  Ú	notBase64rŠ  rv  s        r4   Útest_authNotBase64Ú%AuthenticatorTests.test_authNotBase64=  s6  € ô 
Ô'Ó	(÷	ð 	ó 
)ð	ñ$ +Ó,ˆ	ÜÔ'¨Ô3ä×"Ò"Ó$ˆØŸ™ˆŒØ+A×Ñ˜<Ñ(ä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰Ð'¨¯©Ó):Ô;à�‰ÔØ×ÑÐ=Ô>à�‰”f×&Ò& y×'=Ñ'=Ó'?Ó@À)Ç/Á/ÓBSÔTà�‰ÔØ×ÑÐ2Ô3à×ÑØ�O‰OÓØ�H‰HÐ7¸×9JÑ9JÈGÐTÓUõ	
r7   c                óL  ^ • [        5       n[        U5      nUT R                  l        [        R
                  =T R                  R                  S'   n[        [        U5        [        R                  " S5      nT R                  R                  U5        U 4S jnT R                  R                  [        U5      5      nUR                  T R                   S5        UR#                  T R$                  T R&                  5        [(        R*                  " T R-                  5       U/5      nU$ )z¬
A challenger that causes the login to fail
L{UnhandledCredentials} results in an C{NO} response.

@return: A L{Deferred} that fires when the authorization has
    failed.
r5  rP  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú:AuthenticatorTests.test_unhandledCredentials.<locals>.auth…  r)  r7   s+   Authentication failed: server misconfigured)rV  r   rŠ  rY  r   r*  rÌ  r   r    r+  r‹  r,  rŒ  r¯   r8   r½  r£  r©  r•  rš  r   r¾  r#   )rG   r^  rY  Ú	loginCredr-  rô  r¿  r²   s   `       r4   Útest_unhandledCredentialsÚ,AuthenticatorTests.test_unhandledCredentialsp  sà   ø€ ô “ˆÜ˜“ˆð $ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ø:ô	
ð 	�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØˆr7   c                óô  ^ ^
•  " S S[         5      m
 " U
4S jS5      n[        5       n[        U5      nUR                  U" 5       5        UT R                  l        [        R                  =T R                  R                  S'   n[        [        U5        [        R                  " S5      nT R                  R                  U5        U 4S jnU
U 4S jnT R                  R                  [!        U5      5      nUR#                  T R$                  S	5        UR                  [!        U5      5        UR'                  T R(                  T R*                  5        [,        R.                  " T R1                  5       U/5      n	U	$ )
z§
If the portal raises an exception other than
L{UnauthorizedLogin} or L{UnhandledCredentials}, the server
responds with a C{BAD} response and the exception is logged.
c                  ó   • \ rS rSrSrSrg)ÚKAuthenticatorTests.test_unexpectedLoginFailure.<locals>.UnexpectedExceptioni˜  r  r1   NrM  r1   r7   r4   r   rd  ˜  r!  r7   r   c                  ó.   >• \ rS rSrSr\\4rU 4S jrSr	g)ÚFAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingCheckeri�  zV
A credentials checker whose L{requestAvatarId} method
raises L{UnexpectedException}.
c                ó   >• T" S5      e)NzUnexpected error.r1   )rG   r÷  r   s     €r4   rø  ÚVAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingChecker.requestAvatarId¥  s   ø€ Ù)Ð*=Ó>Ð>r7   r1   N)
r~   r   r€   r�   rd  r   r   rü  rø  r‚   )r   s   €r4   ÚFailingCheckerrf  �  s    ø† ñð
 %<Ð=NÐ#OÐ ÷?ð ?r7   ri  r5  rP  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú<AuthenticatorTests.test_unexpectedLoginFailure.<locals>.auth´  r)  r7   c                 óF   >• TR                  TR                  T 5      5        g r0   r-  )r   rG   s   €€r4   ÚassertUnexpectedExceptionLoggedÚWAuthenticatorTests.test_unexpectedLoginFailure.<locals>.assertUnexpectedExceptionLogged·  s   ø€ Ø�O‰O˜D×2Ñ2Ð3FÓGÕHr7   s'   Server error: login failed unexpectedly)r%  rV  r   rZ  rŠ  rY  r   r*  rÌ  r   r    r+  r‹  r,  rŒ  r¯   r8   r½  r£  r©  r•  rš  r   r¾  r#   )rG   ri  r^  rY  r_  r-  rô  rm  r¿  r²   r   s   `         @r4   Útest_unexpectedLoginFailureÚ.AuthenticatorTests.test_unexpectedLoginFailure‘  s  ù€ ô	¤)ô 	÷
		?ô 		?ô “ˆÜ˜“ˆØ×Ñ™~Ó/Ô0Ø#ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7ö	Ið �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ð-Wô	
ð 	�‰”uÐ<Ó=Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØˆr7   c                ó  ^ • [         T R                  R                  S'   [        R                  " S5      nT R
                  R                  U5        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        T R                  5       n[        R                  " XE/5      nUR                  T R                   5      $ )NrÃ  rP  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú,AuthenticatorTests.testCramMD5.<locals>.authÈ  r)  r7   c                 ó   >• ST l         g rÙ  ©r   rW   s   €r4   ÚauthedÚ.AuthenticatorTests.testCramMD5.<locals>.authedË  ó   ø€ Ø!"ˆDÕr7   )r   rŠ  rÌ  r   ÚCramMD5ClientAuthenticatorr‹  r,  rŒ  r¯   r8   r©  rš  r•  r#   r   r¾  Ú_cbTestCramMD5)rG   r-  rô  rv  r¿  r  r²   s   `      r4   ÚtestCramMD5ÚAuthenticatorTests.testCramMD5Ã  s½   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ò0°Ó=ˆØ�‰×)Ñ)¨%Ô0õ	7õ	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r7   c                óœ   • U R                  U R                  S5        U R                  U R                  R                  U R                  5        g rÙ  ©rD   r   rŠ  rö  rø  s     r4   rz  Ú!AuthenticatorTests._cbTestCramMD5Õ  ó6   € Ø×Ñ˜×+Ñ+¨QÔ/Ø×Ñ˜Ÿ™×,Ñ,¨d¯l©lÕ;r7   c                ó"  ^ • [         T R                  R                  S'   [        R                  " S5      nT R
                  R                  U5        U 4S jnU 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      [        U5      5        UR                  T R                  T R                  5        [        R                  " T R                  5       U/5      nUR                  T R                   5      $ )NrÃ  rP  c                 ó:   >• T R                   R                  S5      $ ©Ns   not the secretr&  rW   s   €r4   ÚmisauthÚ5AuthenticatorTests.testFailedCramMD5.<locals>.misauthÞ  ó   ø€ Ø—;‘;×+Ñ+Ð,=Ó>Ð>r7   c                 ó   >• ST l         g rÙ  ru  rW   s   €r4   rv  Ú4AuthenticatorTests.testFailedCramMD5.<locals>.authedá  rx  r7   c                 ó   >• ST l         g ©Néÿÿÿÿru  rW   s   €r4   Ú	misauthedÚ7AuthenticatorTests.testFailedCramMD5.<locals>.misauthedä  ó   ø€ Ø!#ˆDÕr7   )r   rŠ  rÌ  r   ry  r‹  r,  rŒ  r¯   r8   r©  r•  rš  r   r¾  r#   Ú_cbTestFailedCramMD5©rG   r-  r„  rv  rŒ  r¿  r²   s   `      r4   ÚtestFailedCramMD5Ú$AuthenticatorTests.testFailedCramMD5Ù  sÁ   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ò0°Ó=ˆØ�‰×)Ñ)¨%Ô0õ	?õ	#õ	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×6Ñ6Ó7Ð7r7   c                óˆ   • U R                  U R                  S5        U R                  U R                  R                  S 5        g rŠ  r~  rø  s     r4   r�  Ú'AuthenticatorTests._cbTestFailedCramMD5í  ó2   € Ø×Ñ˜×+Ñ+¨RÔ0Ø×Ñ˜Ÿ™×,Ñ,¨dÕ3r7   c                óP  ^ • [         R                  =T R                  R                  S'   n[	        [
        U5        [         R                  " S5      nT R                  R                  U5        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        [        R                   " T R#                  5       U/5      nUR                  T R$                  5      $ )Nr5  rP  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú*AuthenticatorTests.testLOGIN.<locals>.authù  r)  r7   c                 ó   >• ST l         g rÙ  ru  rW   s   €r4   rv  Ú,AuthenticatorTests.testLOGIN.<locals>.authedü  rx  r7   )r   r*  rŠ  rÌ  r   r    r+  r‹  r,  rŒ  r¯   r8   r©  rš  r•  r   r¾  r#   Ú_cbTestLOGIN)rG   r_  r-  rô  rv  r¿  r²   s   `      r4   Ú	testLOGINÚAuthenticatorTests.testLOGINñ  óÑ   ø€ Ü8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7õ	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r7   c                óœ   • U R                  U R                  S5        U R                  U R                  R                  U R                  5        g rÙ  r~  rø  s     r4   r›  ÚAuthenticatorTests._cbTestLOGIN  r€  r7   c                ó6  ^ • [         R                  T R                  R                  S'   [         R                  " S5      nT R
                  R                  U5        U 4S jnU 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      [        U5      5        UR                  T R                  T R                  5        [        R                  " T R                  5       U/5      nUR                  T R                   5      $ )Nr5  rP  c                 ó:   >• T R                   R                  S5      $ rƒ  r&  rW   s   €r4   r„  Ú3AuthenticatorTests.testFailedLOGIN.<locals>.misauth  r†  r7   c                 ó   >• ST l         g rÙ  ru  rW   s   €r4   rv  Ú2AuthenticatorTests.testFailedLOGIN.<locals>.authed  rx  r7   c                 ó   >• ST l         g rŠ  ru  rW   s   €r4   rŒ  Ú5AuthenticatorTests.testFailedLOGIN.<locals>.misauthed  rŽ  r7   )r   r*  rŠ  rÌ  r+  r‹  r,  rŒ  r¯   r8   r©  r•  rš  r   r¾  r#   Ú_cbTestFailedLOGINr�  s   `      r4   ÚtestFailedLOGINÚ"AuthenticatorTests.testFailedLOGIN	  óÇ   ø€ Ü,1×,BÑ,Bˆ�‰×Ñ Ñ)Ü×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	?õ	#õ	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óˆ   • U R                  U R                  S5        U R                  U R                  R                  S 5        g rŠ  r~  rø  s     r4   r¨  Ú%AuthenticatorTests._cbTestFailedLOGIN  r•  r7   c                óP  ^ • [         R                  =T R                  R                  S'   n[	        [
        U5        [         R                  " S5      nT R                  R                  U5        U 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      T R                  5        UR                  T R                  T R                  5        [        R                   " T R#                  5       U/5      nUR                  T R$                  5      $ )NrÏ  rP  c                 ó:   >• T R                   R                  S5      $ r%  r&  rW   s   €r4   rô  Ú*AuthenticatorTests.testPLAIN.<locals>.auth)  r)  r7   c                 ó   >• ST l         g rÙ  ru  rW   s   €r4   rv  Ú,AuthenticatorTests.testPLAIN.<locals>.authed,  rx  r7   )r   ÚPLAINCredentialsrŠ  rÌ  r   r    ÚPLAINAuthenticatorr‹  r,  rŒ  r¯   r8   r©  rš  r•  r   r¾  r#   Ú_cbTestPLAIN)rG   Ú	plainCredr-  rô  rv  r¿  r²   s   `      r4   Ú	testPLAINÚAuthenticatorTests.testPLAIN!  rž  r7   c                óœ   • U R                  U R                  S5        U R                  U R                  R                  U R                  5        g rÙ  r~  rø  s     r4   rµ  ÚAuthenticatorTests._cbTestPLAIN5  r€  r7   c                ó6  ^ • [         R                  T R                  R                  S'   [         R                  " S5      nT R
                  R                  U5        U 4S jnU 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      [        U5      5        UR                  T R                  T R                  5        [        R                  " T R                  5       U/5      nUR                  T R                   5      $ )NrÏ  rP  c                 ó:   >• T R                   R                  S5      $ rƒ  r&  rW   s   €r4   r„  Ú3AuthenticatorTests.testFailedPLAIN.<locals>.misauth>  r†  r7   c                 ó   >• ST l         g rÙ  ru  rW   s   €r4   rv  Ú2AuthenticatorTests.testFailedPLAIN.<locals>.authedA  rx  r7   c                 ó   >• ST l         g rŠ  ru  rW   s   €r4   rŒ  Ú5AuthenticatorTests.testFailedPLAIN.<locals>.misauthedD  rŽ  r7   )r   r³  rŠ  rÌ  r´  r‹  r,  rŒ  r¯   r8   r©  r•  rš  r   r¾  r#   Ú_cbTestFailedPLAINr�  s   `      r4   ÚtestFailedPLAINÚ"AuthenticatorTests.testFailedPLAIN9  r«  r7   c                óˆ   • U R                  U R                  S5        U R                  U R                  R                  S 5        g rŠ  r~  rø  s     r4   rÂ  Ú%AuthenticatorTests._cbTestFailedPLAINM  r•  r7   )rö  r   rY  N)r~   r   r€   r�   rŽ  r  r!  r.  rM  rZ  r`  ro  r{  rz  r‘  r�  rœ  r›  r©  r¨  r·  rµ  rÃ  rÂ  r‚   r1   r7   r4   rþ  rþ  §  sl   † ò
(ò)UòV
ò&9ò.29òh1
òfòB0òd2ò$<ò8ò(4ò0ò(<ò6ò(4ò0ò(<ò6õ(4r7   rþ  c                  ó*   • \ rS rSrSrS rS rS rSrg)ÚSASLPLAINTestsiR  zÕ
Tests for I{SASL PLAIN} authentication, as implemented by
L{imap4.PLAINAuthenticator} and L{imap4.PLAINCredentials}.

@see: U{http://www.faqs.org/rfcs/rfc2595.html}
@see: U{http://www.faqs.org/rfcs/rfc4616.html}
c                ó”   • SnSnSn[         R                  " U5      nUR                  X#5      nU R                  USU-   S-   U-   5        g)zo
L{PLAINAuthenticator.challengeResponse} returns challenge strings of
the form::

    NUL<authn-id>NUL<secret>
rP  rñ  s	   challengeó    N)r   r´  rG  rD   )rG   ró  rE  rF  r-  r  s         r4   Ú#test_authenticatorChallengeResponseÚ2SASLPLAINTests.test_authenticatorChallengeResponse[  sR   € ð ˆØˆØˆÜ×(Ò(¨Ó2ˆØ×*Ñ*¨6Ó8ˆØ×Ñ˜ 5¨8Ñ#3°eÑ#;¸fÑ#DÕEr7   c                óÀ   • [         R                  " 5       nUR                  S5        U R                  UR                  S5        U R                  UR
                  S5        g)zf
L{PLAINCredentials.setResponse} parses challenge strings of the
form::

    NUL<authn-id>NUL<secret>
s    testuser secretrP  rñ  N)r   r³  r  rD   ró  r  ©rG   Úcreds     r4   Útest_credentialsSetResponseÚ*SASLPLAINTests.test_credentialsSetResponsei  sI   € ô ×%Ò%Ó'ˆØ×ÑÐ.Ô/Ø×Ñ˜Ÿ™¨Ô4Ø×Ñ˜Ÿ™¨	Õ2r7   c                ó0  • [         R                  " 5       nU R                  [         R                  UR                  S5        U R                  [         R                  UR                  S5        U R                  [         R                  UR                  S5        g)zv
L{PLAINCredentials.setResponse} raises L{imap4.IllegalClientResponse}
when passed a string not of the expected form.
s   hellos   hello worlds   hello world Zoom! N)r   r³  rö   r  r  rÎ  s     r4   Útest_credentialsInvalidResponseÚ.SASLPLAINTests.test_credentialsInvalidResponseu  su   € ô
 ×%Ò%Ó'ˆØ×Ñœ%×5Ñ5°t×7GÑ7GÈÔRØ×ÑÜ×'Ñ'¨×)9Ñ)9¸?ô	
ð 	×ÑÜ×'Ñ'¨×)9Ñ)9Ð;Sõ	
r7   r1   N)	r~   r   r€   r�   rd  rË  rÐ  rÓ  r‚   r1   r7   r4   rÈ  rÈ  R  s   † ñòFò
3õ
r7   rÈ  c                  ó\   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)ÚUnsolicitedResponseTestsi„  c                óL  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú5UnsolicitedResponseTests.testReadWrite.<locals>.login†  r+  r7   c                 ó<   >• T R                   R                  S5        g rÙ  ©rŠ  rt  rW   s   €r4   rÎ  Ú8UnsolicitedResponseTests.testReadWrite.<locals>.loggedIn‰  ó   ø€ Ø�K‰K×#Ñ# AÕ&r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestReadWrite©rG   rë  rÎ  r¿  r²   s   `    r4   ÚtestReadWriteÚ&UnsolicitedResponseTests.testReadWrite…  sw   ø€ õ	Dõ	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×2Ñ2Ó3Ð3r7   c                óZ   • U R                   R                  nU R                  USS//5        g )Nrt  rã   ©r‹  rk  rD   ©rG   rù  ÚEs      r4   rÞ  Ú)UnsolicitedResponseTests._cbTestReadWrite‘  ó)   € Ø�K‰K×ÑˆØ×Ñ˜˜m¨QÐ/Ð0Õ1r7   c                óL  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú4UnsolicitedResponseTests.testReadOnly.<locals>.login–  r+  r7   c                 ó<   >• T R                   R                  S5        g r¡  rÛ  rW   s   €r4   rÎ  Ú7UnsolicitedResponseTests.testReadOnly.<locals>.loggedIn™  rÝ  r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestReadOnlyrß  s   `    r4   ÚtestReadOnlyÚ%UnsolicitedResponseTests.testReadOnly•  sw   ø€ õ	Dõ	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×1Ñ1Ó2Ð2r7   c                óZ   • U R                   R                  nU R                  USS//5        g )Nrt  r   rã  rä  s      r4   rí  Ú(UnsolicitedResponseTests._cbTestReadOnly¡  rç  r7   c                ód  ^ ^• SS// S/S.mU 4S jnUU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  T5      $ )Nú	\Answeredr   ú\Recent)rã   rè   r  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú6UnsolicitedResponseTests.testFlagChange.<locals>.login¨  r+  r7   c                 ó<   >• TR                   R                  T 5        g r0   )rŠ  r{  )rÙ  rG   s   €€r4   rÎ  Ú9UnsolicitedResponseTests.testFlagChange.<locals>.loggedIn«  s   ø€ Ø�K‰K×$Ñ$ UÕ+r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestFlagChange)rG   rë  rÎ  r¿  r²   rÙ  s   `    @r4   ÚtestFlagChangeÚ'UnsolicitedResponseTests.testFlagChange¥  sŒ   ù€ Ø! ;Ð/°B¸Z¸LÑIˆõ	Dö	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×3Ñ3°UÓ;Ð;r7   c                óð   • U R                   R                  nUR                  5        Vs/ s H  nSUS   US   0/PM     nnUR                  S S9  UR                  S S9  U R	                  X55        g s  snf )Nr{  r   rã   c                ó   • U S   $ r¡  r1   ©rz   s    r4   r5   Ú<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>¶  s   € ˜Q˜qšTr7   )Úkeyc                ó   • U S   $ r¡  r1   rþ  s    r4   r5   rÿ  ·  s   €  ! A¢$r7   )r‹  rk  Úitemsrú  rD   )rG   rù  rÙ  rå  r‘  Úexpects         r4   rù  Ú*UnsolicitedResponseTests._cbTestFlagChange³  sl   € Ø�K‰K×ÑˆØ:?¿+¹+¼-ÓHº-°Q�> A a¡D¨!¨A©$ <Ó0¹-ˆÐHØ	�‰‘>ˆÑ"Ø�‰™ˆÑ'Ø×Ñ˜Õ#ùò Is   ©A3c                óL  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú7UnsolicitedResponseTests.testNewMessages.<locals>.login»  r+  r7   c                 ó>   >• T R                   R                  SS 5        g ©Nr  ©rŠ  r€  rW   s   €r4   rÎ  Ú:UnsolicitedResponseTests.testNewMessages.<locals>.loggedIn¾  s   ø€ Ø�K‰K×#Ñ# B¨Õ-r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestNewMessagesrß  s   `    r4   ÚtestNewMessagesÚ(UnsolicitedResponseTests.testNewMessagesº  sw   ø€ õ	Dõ	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óZ   • U R                   R                  nU R                  U/ SQ/5        g )N)r€  r  Nrã  rä  s      r4   r  Ú+UnsolicitedResponseTests._cbTestNewMessagesÆ  ó%   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ð7Õ8r7   c                óL  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú=UnsolicitedResponseTests.testNewRecentMessages.<locals>.loginË  r+  r7   c                 ó>   >• T R                   R                  S S5        g r	  r
  rW   s   €r4   rÎ  Ú@UnsolicitedResponseTests.testNewRecentMessages.<locals>.loggedInÎ  s   ø€ Ø�K‰K×#Ñ# D¨"Õ-r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestNewRecentMessagesrß  s   `    r4   ÚtestNewRecentMessagesÚ.UnsolicitedResponseTests.testNewRecentMessagesÊ  sw   ø€ õ	Dõ	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×:Ñ:Ó;Ð;r7   c                óZ   • U R                   R                  nU R                  U/ SQ/5        g )N©r€  Nr  rã  rä  s      r4   r  Ú1UnsolicitedResponseTests._cbTestNewRecentMessagesÖ  r  r7   c                óL  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      nUR                  [        U5      5      R                  T R                  5        [
        R                  " T R                  5       U/5      nUR                  T R                  5      $ )Nc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú@UnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loginÛ  r+  r7   c                 ó>   >• T R                   R                  SS5        g )NrŸ  r  r
  rW   s   €r4   rÎ  ÚCUnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loggedInÞ  s   ø€ Ø�K‰K×#Ñ# B¨Õ+r7   )	rŒ  r¯   r8   r½  rš  r   r¾  r#   Ú_cbTestNewMessagesAndRecentrß  s   `    r4   ÚtestNewMessagesAndRecentÚ1UnsolicitedResponseTests.testNewMessagesAndRecentÚ  sw   ø€ õ	Dõ	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×=Ñ=Ó>Ð>r7   c                ó`   • U R                   R                  nU R                  U/ SQ/ SQ/5        g )N)r€  rŸ  Nr  rã  rä  s      r4   r"  Ú4UnsolicitedResponseTests._cbTestNewMessagesAndRecentæ  s(   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ò8QÐRÕSr7   r1   N)r~   r   r€   r�   rà  rÞ  rî  rí  rú  rù  r  r  r  r  r#  r"  r‚   r1   r7   r4   rÖ  rÖ  „  s?   † ò
4ò2ò
3ò2ò<ò$ò
6ò9ò
<ò9ò
?õTr7   rÖ  c                  ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚClientCapabilityTestsië  zL
Tests for issuance of the CAPABILITY command and handling of its response.
c                óÖ   • [        5       U l        [        R                  " 5       U l        U R                  R                  U R                  5        U R                  R                  S5        g)zC
Create an L{imap4.IMAP4Client} connected to a L{StringTransport}.
s   * OK [IMAP4rev1]
N)r   rv  r   ri  Úprotocolrí  r  rW   s    r4   rŽ  ÚClientCapabilityTests.setUpð  sG   € ô )Ó*ˆŒÜ×)Ò)Ó+ˆŒØ�‰×$Ñ$ T§^¡^Ô4Ø�‰×"Ñ"Ð#:Õ;r7   c                óÔ   ^ • T R                   R                  SS9nT R                   R                  S5        T R                   R                  S5        U 4S jnUR                  U5        U$ )z
A capability response consisting only of atoms without C{'='} in them
should result in a dict mapping those atoms to L{None}.
F©ÚuseCaches&   * CAPABILITY IMAP4rev1 LOGINDISABLED
ó   0001 OK Capability completed.
c                ó0   >• TR                  U S S S.5        g )N)r¶  s   LOGINDISABLEDrº  ©ÚcapabilitiesrG   s    €r4   ÚgotCapabilitiesÚ?ClientCapabilityTests.test_simpleAtoms.<locals>.gotCapabilities  s   ø€ Ø×Ñ˜\¸$ÐRVÑ+WÕXr7   ©r*  r±  r  r¯   ©rG   ÚcapabilitiesResultr3  s   `  r4   Útest_simpleAtomsÚ&ClientCapabilityTests.test_simpleAtomsù  s_   ø€ ð
 "Ÿ]™]×:Ñ:ÀEÐ:ÐJÐØ�‰×"Ñ"Ð#NÔOØ�‰×"Ñ"Ð#GÔHõ	Yð 	×&Ñ& Ô7Ø!Ð!r7   c                óÔ   ^ • T R                   R                  SS9nT R                   R                  S5        T R                   R                  S5        U 4S jnUR                  U5        U$ )a‹  
A capability response consisting of atoms including C{'='} should have
those atoms split on that byte and have capabilities in the same
category aggregated into lists in the resulting dictionary.

(n.b. - I made up the word "category atom"; the protocol has no notion
of structure here, but rather allows each capability to define the
semantics of its entry in the capability response in a freeform manner.
If I had realized this earlier, the API for capabilities would look
different.  As it is, we can hope that no one defines any crazy
semantics which are incompatible with this API, or try to figure out a
better API when someone does. -exarkun)
Fr-  s.   * CAPABILITY IMAP4rev1 AUTH=LOGIN AUTH=PLAIN
r/  c                ó4   >• TR                  U S SS/S.5        g )Nr5  rÏ  )r¶  rÈ  rº  r1  s    €r4   r3  ÚAClientCapabilityTests.test_categoryAtoms.<locals>.gotCapabilities  s    ø€ Ø×ÑØ¨T¸XÀxÐ<PÑQõr7   r5  r6  s   `  r4   Útest_categoryAtomsÚ(ClientCapabilityTests.test_categoryAtoms  s^   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÐJÐØ�‰×"Ñ"Ð#VÔWØ�‰×"Ñ"Ð#GÔHõ	ð
 	×&Ñ& Ô7Ø!Ð!r7   c                óÔ   ^ • T R                   R                  SS9nT R                   R                  S5        T R                   R                  S5        U 4S jnUR                  U5        U$ )z¨
A capability response consisting of both simple and category atoms of
the same type should result in a list containing L{None} as well as the
values for the category.
Fr-  s0   * CAPABILITY IMAP4rev1 FOO FOO=BAR BAR=FOO BAR
r/  c                ó:   >• TR                  U S S S/SS /S.5        g )Nó   BARó   FOO)r¶  rB  rA  rº  r1  s    €r4   r3  Ú>ClientCapabilityTests.test_mixedAtoms.<locals>.gotCapabilities0  s&   ø€ Ø×ÑØØ#¨d°F¨^ÀfÈdÀ^ÑTõr7   r5  r6  s   `  r4   Útest_mixedAtomsÚ%ClientCapabilityTests.test_mixedAtoms"  sd   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÐJÐð 	�‰×"Ñ"ØAô	
ð 	�‰×"Ñ"Ð#GÔHõ	ð 	×&Ñ& Ô7Ø!Ð!r7   )r*  rv  N)
r~   r   r€   r�   rd  rŽ  r8  r=  rD  r‚   r1   r7   r4   r(  r(  ë  s   † ñò<ò"ò"õ4"r7   r(  c                  ó$   • \ rS rSrSrS rS rSrg)ÚStillSimplerClienti:  z@
An IMAP4 client which keeps track of unsolicited flag changes.
c                óP   • [         R                  R                  U 5        0 U l        g r0   )r   ri  rˆ   rÙ  rW   s    r4   rˆ   ÚStillSimplerClient.__init__?  s   € Ü×Ñ×"Ñ" 4Ô(Øˆ�
r7   c                ó:   • U R                   R                  U5        g r0   )rÙ  r«  r|  s     r4   r{  ÚStillSimplerClient.flagsChangedC  s   € Ø�
‰
×Ñ˜(Õ#r7   rÑ  N)r~   r   r€   r�   rd  rˆ   r{  r‚   r1   r7   r4   rG  rG  :  s   † ñòõ$r7   rG  c                  óJ   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)ÚHandCraftedTestsiG  c                ó$  ^ ^^^^• [        5       m[        R                  " 5       mTR                  T5        TR	                  S5        U U4S jmUU4S jmUU4S jnTR                  SS5      nTR                  S5        UR                  U5        U$ )Nó   * OK [IMAP4rev1]c                óh   >• TR                  TR                  5       R                  5       S   S5        g )Nr‹  s   0003 FETCH 1 (RFC822)©rD   r¢  rž  )rù  rG   rv  s    €€r4   ÚcbCheckTransportÚ>HandCraftedTests.testTrailingLiteral.<locals>.cbCheckTransportN  s,   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø(õr7   c                ó�   >• TR                  S5      nTR                  S5        TR                  S5        UR                  T5        U$ )Nr  s6   * 1 FETCH (RFC822 {10}
0123456789
 RFC822.SIZE 10)
s   0003 OK FETCH
)ÚfetchMessager  r¯   )rù  r²   r§   rR  s     €€r4   ÚcbSelectÚ6HandCraftedTests.testTrailingLiteral.<locals>.cbSelectT  sA   ø€ Ø—‘˜sÓ#ˆAØ�N‰NØOôð �N‰NÐ/Ô0Ø�M‰MÐ*Ô+ØˆHr7   c                ón   >• TR                  S5      nTR                  S5        UR                  T5        U$ ©Nr¯  ó   0002 OK SELECT)rH  ra  r¯   )rù  r²   r§   rV  s     €€r4   ÚcbLoginÚ5HandCraftedTests.testTrailingLiteral.<locals>.cbLogin]  s/   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-Ø�M‰M˜(Ô#ØˆHr7   ó   blahó   0001 OK LOGIN
)r   r   ri  rí  ra  rë  r  r¯   )rG   r[  r²   r§   rR  rV  rv  s   `  @@@@r4   ÚtestTrailingLiteralÚ$HandCraftedTests.testTrailingLiteralH  ss   ü€ Ü#Ó%ˆ	Ü×ÒÓˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+ö	ö	ö	ð �G‰G�G˜WÓ%ˆØ	�‰Ð+Ô,Ø	�‰�gÔØˆr7   c                óz  • U R                   R                  R                  SS5        [        5       nU R                   R	                  U5        UR                  5         U R                   R                  S5        U R                  UR                  5       S5        UR                  5         U R                   R                  S5        U R                  UR                  5       S5        UR                  5         U R                   R                  S5        U R                  UR                  5       5        U R                   R                  S5        U R                  UR                  5       S	5        U R                  U R                   R                  S
5        U R                   R                  [        R                  " S5      5        g)zE
String literals whose data is not immediately available are
parsed.
rP  rT  s   01 LOGIN {8}
s   + Ready for 8 octets of text
s   testuser {13}
s   + Ready for 13 octets of text
s   passwords   -test
ó   01 OK LOGIN succeeded
rô  r  N)rŠ  rX  rW  r   rí  rî  r  rD   r¢  Ú	assertNotr÷  rò  r   ró  ©rG   rv  s     r4   Útest_fragmentedStringLiteralsÚ.HandCraftedTests.test_fragmentedStringLiteralsh  s4  € ð
 	�‰×Ñ×#Ñ# KÐ1AÔBÜ#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ Ð!5Ô6Ø×Ñ˜Ÿ™Ó*Ð,PÔQà�‰ÔØ�‰× Ñ  Ô-Ø�‰�y—‘Ó(Ô)Ø�‰× Ñ  Ô.Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ò#7Ð8JÓ#KÕLr7   c                ó^  • SS0U R                   R                  l        [        5       nU R                   R	                  U5        UR                  5         U R                   R                  S5        U R                  UR                  5       S5        UR                  5         U R                   R                  S5        U R                  UR                  5       S5        U R                  U R                   R                  S5        U R                   R                  [        R                  " S5      5        g)	z#
Empty string literals are parsed.
r7   s   01 LOGIN {0}
s   + Ready for 0 octets of text
s   {0}
rb  rô  r  N)rŠ  rX  r9  r   rí  rî  r  rD   r¢  r÷  rò  r   ró  rd  s     r4   Útest_emptyStringLiteralÚ(HandCraftedTests.test_emptyStringLiteral‚  sÕ   € ð &)¨# Jˆ�‰×ÑÔ!Ü#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ  Ô,Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ò#7Ð8JÓ#KÕLr7   c                ó4  ^ ^^• [        5       m[        5       mTR                  T5        TR                  S5        U4S jnU4S jnU4S jnUU U4S jnU" 5       R	                  [        U5      5      R	                  [        U5      5      R	                  U5      $ )a.  
If unsolicited data is received along with solicited data in the
response to a I{FETCH} command issued by L{IMAP4Client.fetchSpecific},
the unsolicited data is passed to the appropriate callback and not
included in the result with which the L{Deferred} returned by
L{IMAP4Client.fetchSpecific} fires.
rO  c                 óN   >• TR                  SS5      n TR                  S5        U $ ©Nr]  r^  ©rë  r  ©r²   r§   s    €r4   rë  ÚRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.login¢  ó%   ø€ Ø—‘˜ Ó)ˆAØ�N‰NÐ/Ô0ØˆHr7   c                 óL   >• TR                  S5      n TR                  S5        U $ rY  ©rH  ra  rn  s    €r4   rH  ÚSHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.select§  ó#   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-ØˆHr7   c                 ó€  >• TR                  SSS/S9n TR                  S5        TR                  S5        TR                  S5        TR                  S5        TR                  S	5        TR                  S
5        TR                  S5        TR                  S5        TR                  S5        TR                  S5        U $ )Nr  úHEADER.FIELDSÚSUBJECT©Ú
headerTypeÚ
headerArgss1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {38}
s$   Subject: Suprise for your woman...
rÅ  ó   )
s   * 1 FETCH (FLAGS (\Seen))
s1   * 2 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {75}
sI   Subject: What you been doing. Order your meds here . ,. handcuff madsen
ó   0003 OK FETCH completed
©ÚfetchSpecificr  rn  s    €r4   r  ÚRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.fetch¬  s¨   ø€ Ø—‘Ø /¸y¸kð  ð ˆAð �N‰NÐQÔRØ�N‰NÐDÔEØ�N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ<Ô=Ø�N‰NÐQÔRØ�N‰NØ^ôð �N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c                óì   >• TR                  TR                  5       R                  5       S   S5        TR                  U SSS//S//SSS//S//S.5        TR                  TR                  S	S
/05        g )Nr‹  ó,   0003 FETCH 1:* BODY[HEADER.FIELDS (SUBJECT)]r   rv  rw  z&Subject: Suprise for your woman...

zKSubject: What you been doing. Order your meds here . ,. handcuff madsen

©rã   rç   rã   ú\Seen©rD   r¢  rž  rÙ  ©Úresr§   rG   rv  s    €€€r4   r°  ÚQHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.test¾  s˜   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð
 ×ÑØð #Ø,¨y¨kÐ:ØHððð #Ø,¨y¨kÐ:Ømððñôð( ×Ñ˜QŸW™W q¨8¨* oÕ6r7   ©r   rG  rí  ra  r¯   r8   ©rG   rë  rH  r  r°  r§   rv  s   `    @@r4   Ú2test_unsolicitedResponseMixedWithSolicitedResponseÚCHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse•  sv   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
	÷$	7ñ: ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                óX  ^ ^^• [        5       m[        R                  " 5       mTR                  T5        TR	                  S5        U4S jnU4S jnU4S jnU U4S jnU" 5       nUR                  [        U5      5        UR                  [        U5      5        UR                  U5        U$ )zN
Literals should be recognized even when they are not preceded by
whitespace.
rO  c                 óN   >• TR                  SS5      n TR                  S5        U $ rl  rm  ©r²   r*  s    €r4   rë  ÚFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.loginì  ó'   ø€ Ø—‘˜w¨Ó0ˆAØ×!Ñ!Ð"6Ô7ØˆHr7   c                 óL   >• TR                  S5      n TR                  S5        U $ )Nó   inboxrZ  rr  rŽ  s    €r4   rH  ÚGHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.selectñ  s%   ø€ Ø—‘ Ó)ˆAØ×!Ñ!Ð"3Ô4ØˆHr7   c                 óp   >• TR                  SSS/S9n TR                  S5        TR                  S5        U $ )Nr  rv  rw  rx  s8   * 1 FETCH (BODY[HEADER.FIELDS ({7}
SUBJECT)] "Hello")
r|  r}  rŽ  s    €r4   r  ÚFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.fetchö  sJ   ø€ Ø×&Ñ&Ø /¸y¸kð 'ð ˆAð ×!Ñ!ØOôð ×!Ñ!Ð"@ÔAØˆHr7   c                óž   >• TR                  TR                  5       R                  5       S   S5        TR                  U SSSS//S//05        g )Nr‹  r�  rã   r   rv  rw  ÚHellorQ  )r2   rG   rv  s    €€r4   r°  ÚEHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.test   sW   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð ×ÑØ˜˜f ¸¸Ð&DÀgÐNÐOÐPõr7   ©r   r   ri  rí  ra  r¯   r8   )rG   rë  rH  r  r°  r²   r*  rv  s   `     @@r4   Ú&test_literalWithoutPrecedingWhitespaceÚ7HandCraftedTests.test_literalWithoutPrecedingWhitespaceá  s†   ú€ ô
 $Ó%ˆ	Ü×$Ò$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2õ	õ
	õ
	ö	ñ ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Ø	�‰�dÔØˆr7   c                ó,  ^ ^^• [        5       m[        R                  " 5       mTR                  T5        TR	                  S5        U4S jnU4S jnUU U4S jnU" 5       nUR                  [        U5      5        UR                  [        U5      5        U$ )zÀ
If the server sends a literal length which cannot be parsed as an
integer, L{IMAP4Client.lineReceived} should cause the protocol to be
disconnected by raising L{imap4.IllegalServerResponse}.
rO  c                 óN   >• TR                  SS5      n TR                  S5        U $ rl  rm  rŽ  s    €r4   rë  Ú<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.login  r�  r7   c                 óL   >• TR                  S5      n TR                  S5        U $ rY  rr  rŽ  s    €r4   rH  Ú=HandCraftedTests.test_nonIntegerLiteralLength.<locals>.select   s%   ø€ Ø—‘ Ó(ˆAØ×!Ñ!Ð"3Ô4ØˆHr7   c                 óâ   >• T R                  SSS/S9  TR                  TR                  5       R                  5       S   S5        TR	                  [
        R                  T R                  S5        g )Nr  rv  rw  rx  r‹  r�  s   * 1 FETCH {xyz}
...)r~  rD   r¢  rž  rö   r   ÚIllegalServerResponser  )r*  rG   rv  s   €€€r4   r  Ú<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.fetch%  so   ø€ Ø×"Ñ"Ø /¸y¸kð #ñ ð ×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð
 ×ÑÜ×+Ñ+Ø×%Ñ%Ø)õr7   r™  )rG   rë  rH  r  r²   r*  rv  s   `    @@r4   Útest_nonIntegerLiteralLengthÚ-HandCraftedTests.test_nonIntegerLiteralLength  su   ú€ ô $Ó%ˆ	Ü×$Ò$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2õ	õ
	÷
	ñ  ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Øˆr7   c                ó0  ^ ^• [        5       n[        5       mTR                  U5        TR                  S5        U4S jnU4S jnU4S jnUU 4S jnU" 5       R	                  [        U5      5      R	                  [        U5      5      R	                  U5      $ )zà
Any unrequested flag information received along with other requested
information in an untagged I{FETCH} received in response to a request
issued with L{IMAP4Client.fetchSpecific} is passed to the
C{flagsChanged} callback.
rO  c                 óN   >• TR                  SS5      n TR                  S5        U $ rl  rm  rn  s    €r4   rë  ÚLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.loginF  rp  r7   c                 óL   >• TR                  S5      n TR                  S5        U $ rY  rr  rn  s    €r4   rH  ÚMHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.selectK  rt  r7   c                 ó  >• TR                  SSS/S9n TR                  S5        TR                  S5        TR                  S5        TR                  S5        TR                  S	5        TR                  S
5        TR                  S5        U $ )Nr   rv  rw  rx  s1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject one
s    FLAGS (\Recent))
s?   * 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject two
r{  r|  r}  rn  s    €r4   r  ÚLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.fetchP  s„   ø€ Ø—‘Ø ?À	¸{ð  ð ˆAð �N‰NÐQÔRØ�N‰NÐ6Ô7Ø�N‰NÐ4Ô5à�N‰NØUôð �N‰NÐ6Ô7Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c                óŽ   >• TR                  U SSS//S//SSS//S//S.5        TR                  TR                  S/S/S.5        g )	Nr   rv  rw  zSubject: subject one
zSubject: subject two
r‚  rô  rƒ  )rD   rÙ  )r†  r§   rG   s    €€r4   r°  ÚKHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.testa  sp   ø€ Ø×ÑØð #Ø,¨y¨kÐ:Ø6ððð #Ø,¨y¨kÐ:Ø6ððñôð( ×Ñ˜QŸW™W¨:¨,¸H¸:Ñ&FÕGr7   rˆ  )rG   rv  rë  rH  r  r°  r§   s   `     @r4   Ú,test_flagsChangedInsideFetchSpecificResponseÚ=HandCraftedTests.test_flagsChangedInsideFetchSpecificResponse:  sw   ù€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
	ö"	Hñ0 ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                ó4  ^ ^^• [        5       m[        5       mTR                  T5        TR                  S5        U4S jnU4S jnU4S jnUU U4S jnU" 5       R	                  [        U5      5      R	                  [        U5      5      R	                  U5      $ )zß
Any unrequested flag information received along with other requested
information in an untagged I{FETCH} received in response to a request
issued with L{IMAP4Client.fetchMessage} is passed to the
C{flagsChanged} callback.
rO  c                 óN   >• TR                  SS5      n TR                  S5        U $ rl  rm  rn  s    €r4   rë  ÚKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.login‹  rp  r7   c                 óL   >• TR                  S5      n TR                  S5        U $ rY  rr  rn  s    €r4   rH  ÚLHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.select�  rt  r7   c                 ó  >• TR                  S5      n TR                  S5        TR                  S5        TR                  S5        TR                  S5        TR                  S5        TR                  S5        TR                  S5        U $ )	Nr  s   * 1 FETCH (RFC822 {24}
s   Subject: first subject
s    FLAGS (\Seen))
s.   * 2 FETCH (FLAGS (\Recent \Seen) RFC822 {25}
s   Subject: second subject
r{  r|  )rU  r  rn  s    €r4   r  ÚKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.fetch•  sp   ø€ Ø—‘˜uÓ%ˆAØ�N‰NÐ8Ô9Ø�N‰NÐ8Ô9Ø�N‰NÐ2Ô3Ø�N‰NÐPÔQØ�N‰NÐ9Ô:Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c                óÞ   >• TR                  TR                  5       R                  5       S   S5        TR                  U SS0SS0S.5        TR                  TR                  S/SS/S.5        g )	Nr‹  s   0003 FETCH 1:* (RFC822)rã  zSubject: first subject
zSubject: second subject
r‚  rƒ  rô  r„  r…  s    €€€r4   r°  ÚJHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.test   sx   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø*ôð
 ×ÑØà Ð">Ð?Ø Ð"?Ð@ñôð ×Ñ˜QŸW™W¨8¨*¸*ÀhÐ9OÑ&PÕQr7   rˆ  r‰  s   `    @@r4   Ú+test_flagsChangedInsideFetchMessageResponseÚ<HandCraftedTests.test_flagsChangedInsideFetchMessageResponse  sw   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
		÷	Rñ" ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                ó2  • [        5       n[        R                  " 5       nX!l        UR	                  U5        UR                  S5        [        R                  " S5      nUR                  U5        UR                  S5      nU R                  U[        R                  5        UR                  S5        U R                  [        R                  5      nU R                  [!        U5      S5        U R                  US   R"                  R$                  S   S5        U$ )zŽ
When decoding a base64 encoded authentication message from the server,
decoding errors are logged and then the client closes the connection.
sP   * OK [CAPABILITY IMAP4rev1 IDLE NAMESPACE AUTH=CRAM-MD5] Twisted IMAP4rev1 ReadyrP  rE  s   + Something bad! and bad
rã   r   s   Something bad! and bad)r   r   ri  r*  rí  ra  ry  r,  r'  ÚassertFailurer   ró  r  r.  r¢  rD   rî   r¢  r\  )rG   rv  r*  r-  r²   Úloggeds         r4   Ú-test_authenticationChallengeDecodingExceptionÚ>HandCraftedTests.test_authenticationChallengeDecodingException·  sí   € ô
 5Ó6ˆ	Ü×$Ò$Ó&ˆØ%Ôà×Ñ 	Ô*Ø×Ñð'ô	
ô ×0Ò0°Ó=ˆØ×&Ñ& uÔ-à×!Ñ! (Ó+ˆð 	×Ñ˜1œe×2Ñ2Ô3à×ÑÐ=Ô>ð ×'Ñ'¬×(CÑ(CÓDˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×-Ñ-¨aÑ0Ð2KÔLØˆr7   r1   N)r~   r   r€   r�   r_  re  rh  rŠ  rš  r¤  r¯  rº  r¿  r‚   r1   r7   r4   rM  rM  G  s9   † òò@Mò4Mò&J
òX,ò\)òVC
òJ6
õpr7   rM  c                  óB   • \ rS rSr% Sr\R                  rS\S'   S r	Sr
g)ÚPreauthIMAP4ClientMixiniÖ  aR  
Mixin for L{SynchronousTestCase} subclasses which
provides a C{setUp} method which creates an L{IMAP4Client}
connected to a L{StringTransport} and puts it into the
I{authenticated} state.

@ivar transport: A L{StringTransport} to which C{client} is
    connected.

@ivar client: An L{IMAP4Client} which is connected to
    C{transport}.
zType[imap4.IMAP4Client]ÚclientProtocolc                óÌ   • [        5       U l        U R                  5       U l        U R                  R	                  U R                  5        U R                  R                  S5        g)zU
Create an IMAP4Client connected to a fake transport and in the
authenticated state.
s   * PREAUTH Hello unittest
N)r   rv  rÃ  r‹  rí  r  rW   s    r4   rŽ  ÚPreauthIMAP4ClientMixin.setUpæ  sG   € ô
 )Ó*ˆŒØ×)Ñ)Ó+ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰× Ñ Ð!@ÕAr7   )r‹  rv  N)r~   r   r€   r�   rd  r   ri  rÃ  r  rŽ  r‚   r1   r7   r4   rÂ  rÂ  Ö  s    ‡ ñð /4×.?Ñ.?€NÐ+Ó?õBr7   rÂ  c                  óx   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)ÚSelectionTestsMixiniñ  z`
Mixin for test cases which defines tests which apply to both I{EXAMINE} and
I{SELECT} support.
c                óÆ   • [        U R                  U R                  5      " S5      nU R                  U R                  R                  5       SU R                  -   S-   5        U$ )zÐ
Issue either an I{EXAMINE} or I{SELECT} command (depending on
C{self.method}), assert that the correct bytes are written to the
transport, and return the L{Deferred} returned by whichever method was
called.
Úfooboxs   0001 s	    foobox
)rî  r‹  ÚmethodrD   rv  r¢  rþ  ©rG   r²   s     r4   Ú_examineOrSelectÚ$SelectionTestsMixin._examineOrSelect÷  sR   € ô �D—K‘K §¡Ô-¨hÓ7ˆØ×ÑØ�N‰N× Ñ Ó" H¨t¯|©|Ñ$;¸nÑ$Lô	
ð ˆr7   c                ó¨   • U H!  nU R                   R                  US-   5        M#     U R                   R                  SU R                  -   S-   5        g)z©
Deliver the given (unterminated) response lines to C{self.client} and
then deliver a tagged SELECT or EXAMINE completion line to finish the
SELECT or EXAMINE response.
rÅ  s   0001 OK [READ-ONLY] s    completed
N)r‹  r  rþ  )rG   Úlinesrc  s      r4   Ú	_responseÚSelectionTestsMixin._response  sH   € ó ˆDØ�K‰K×$Ñ$ T¨G¡^Ö4ñ à�‰× Ñ Ø# d§l¡lÑ2Ð5FÑFõ	
r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)zõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{EXISTS} response, the L{Deferred} return by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'EXISTS'} key.
s
   * 3 EXISTSFrå   )rƒ  r‚  N©rÌ  rÐ  rD   ÚsuccessResultOfrË  s     r4   Útest_existsÚSelectionTestsMixin.test_exists  ó?   € ð ×!Ñ!Ó#ˆØ�‰�}Ô%Ø×Ñ˜×-Ñ-¨aÓ0ÀÐRSÑ2TÕUr7   c                ó†   • U R                  5       nU R                  S5        U R                  U[        R                  5        g)zÙ
If the server returns a non-integer EXISTS value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s   * foo EXISTSN©rÌ  rÐ  ÚfailureResultOfr   r¢  rË  s     r4   Útest_nonIntegerExistsÚ)SelectionTestsMixin.test_nonIntegerExists  ó4   € ð ×!Ñ!Ó#ˆØ�‰�Ô'Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)zõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{RECENT} response, the L{Deferred} return by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'RECENT'} key.
s
   * 5 RECENTFrè   )rƒ  r´  NrÓ  rË  s     r4   Útest_recentÚSelectionTestsMixin.test_recent&  r×  r7   c                ó†   • U R                  5       nU R                  S5        U R                  U[        R                  5        g)zÙ
If the server returns a non-integer RECENT value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s   * foo RECENTNrÙ  rË  s     r4   Útest_nonIntegerRecentÚ)SelectionTestsMixin.test_nonIntegerRecent1  rÝ  r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)z÷
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UNSEEN} response, the L{Deferred} returned by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'UNSEEN'} key.
s)   * OK [UNSEEN 8] Message 8 is first unseenFrë   )rƒ  r·  NrÓ  rË  s     r4   Útest_unseenÚSelectionTestsMixin.test_unseen<  s@   € ð ×!Ñ!Ó#ˆØ�‰ÐCÔDØ×Ñ˜×-Ñ-¨aÓ0ÀÐRSÑ2TÕUr7   c                ó†   • U R                  5       nU R                  S5        U R                  U[        R                  5        g)zÙ
If the server returns a non-integer UNSEEN value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s-   * OK [UNSEEN foo] Message foo is first unseenNrÙ  rË  s     r4   Útest_nonIntegerUnseenÚ)SelectionTestsMixin.test_nonIntegerUnseenG  s5   € ð ×!Ñ!Ó#ˆØ�‰ÐGÔHØ×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)a  
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UIDVALIDITY} response, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fires with a C{dict}
including the value associated with the C{'UIDVALIDITY'} key.
s#   * OK [UIDVALIDITY 12345] UIDs validFr‘  )rƒ  r¶  NrÓ  rË  s     r4   Útest_uidvalidityÚ$SelectionTestsMixin.test_uidvalidityR  sB   € ð ×!Ñ!Ó#ˆØ�‰Ð=Ô>Ø×ÑØ× Ñ  Ó#°EÈ%Ñ%Põ	
r7   c                ó†   • U R                  5       nU R                  S5        U R                  U[        R                  5        g)zÞ
If the server returns a non-integer UIDVALIDITY value in its response to
a I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s!   * OK [UIDVALIDITY foo] UIDs validNrÙ  rË  s     r4   Útest_nonIntegerUIDVALIDITYÚ.SelectionTestsMixin.test_nonIntegerUIDVALIDITY_  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)zù
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UIDNEXT} response, the L{Deferred} returned by L{IMAP4Client.select}
or L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'UIDNEXT'} key.
s&   * OK [UIDNEXT 4392] Predicted next UIDFi(  )rƒ  rµ  NrÓ  rË  s     r4   Útest_uidnextÚ SelectionTestsMixin.test_uidnextj  sB   € ð ×!Ñ!Ó#ˆØ�‰Ð@ÔAØ×ÑØ× Ñ  Ó#°EÀdÑ%Kõ	
r7   c                ó†   • U R                  5       nU R                  S5        U R                  U[        R                  5        g)zÚ
If the server returns a non-integer UIDNEXT value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s%   * OK [UIDNEXT foo] Predicted next UIDNrÙ  rË  s     r4   Útest_nonIntegerUIDNEXTÚ*SelectionTestsMixin.test_nonIntegerUIDNEXTw  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð?Ô@Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)úõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{FLAGS} response, the L{Deferred} returned by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'FLAGS'} key.
s2   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)F)ró  z\Flaggedr   rƒ  z\Draft)rƒ  r×  NrÓ  rË  s     r4   Ú
test_flagsÚSelectionTestsMixin.test_flags‚  sF   € ð ×!Ñ!Ó#ˆØ�‰ÐQÔRØ×ÑØ× Ñ  Ó#à#ØVñõ	
r7   c                óŽ   • U R                  5       nU R                  S5        U R                  U R                  U5      SSS.5        g)r÷  sN   * OK [PERMANENTFLAGS (\Starred)] Just one permanent flag in that list up thereF)z\Starred)rƒ  ÚPERMANENTFLAGSNrÓ  rË  s     r4   Útest_permanentflagsÚ'SelectionTestsMixin.test_permanentflags“  sI   € ð ×!Ñ!Ó#ˆØ�‰ð"ô	
ð 	×ÑØ× Ñ  Ó#Ø °NÑCõ	
r7   c                óŒ   • U R                  5       nU R                  S5        U R                  U R                  U5      SS05        g)zŒ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{OK} with unrecognized response code text, parsing does not fail.
s3   * OK [X-MADE-UP] I just made this response text up.rƒ  FNrÓ  rË  s     r4   Útest_unrecognizedOkÚ'SelectionTestsMixin.test_unrecognizedOk¤  sA   € ð
 ×!Ñ!Ó#ˆØ�‰ÐMÔNð 	×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÕHr7   c                óŒ   • U R                  5       nU R                  S5        U R                  U R                  U5      SS05        g)z‚
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{OK} with no response code text, parsing does not fail.
s   * OKrƒ  FNrÓ  rË  s     r4   Útest_bareOkÚSelectionTestsMixin.test_bareOk¯  s>   € ð
 ×!Ñ!Ó#ˆØ�‰�wÔØ×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÕHr7   r1   N)r~   r   r€   r�   rd  rÌ  rÐ  rÕ  rÛ  rß  râ  rå  rè  rë  rî  rñ  rô  rø  rü  rÿ  r	  r‚   r1   r7   r4   rÇ  rÇ  ñ  s\   † ñò
ò

ò	Vò	=ò	Vò	=ò	Vò	=ò
ò	=ò
ò	=ò
ò"
ò"	IõIr7   rÇ  c                  ó    • \ rS rSrSrSrSrSrg)ÚIMAP4ClientExamineTestsi¹  aÒ  
Tests for the L{IMAP4Client.examine} method.

An example of usage of the EXAMINE command from RFC 3501, section 6.3.2::

    S: * 17 EXISTS
    S: * 2 RECENT
    S: * OK [UNSEEN 8] Message 8 is first unseen
    S: * OK [UIDVALIDITY 3857529045] UIDs valid
    S: * OK [UIDNEXT 4392] Predicted next UID
    S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
    S: * OK [PERMANENTFLAGS ()] No permanent flags permitted
    S: A932 OK [READ-ONLY] EXAMINE completed
r�  s   EXAMINEr1   N©r~   r   r€   r�   rd  rÊ  rþ  r‚   r1   r7   r4   r	  r	  ¹  s   † ñð €FØƒGr7   r	  c                  ó    • \ rS rSrSrSrSrSrg)ÚIMAP4ClientSelectTestsiÍ  aè  
Tests for the L{IMAP4Client.select} method.

An example of usage of the SELECT command from RFC 3501, section 6.3.1::

    C: A142 SELECT INBOX
    S: * 172 EXISTS
    S: * 1 RECENT
    S: * OK [UNSEEN 12] Message 12 is first unseen
    S: * OK [UIDVALIDITY 3857529045] UIDs valid
    S: * OK [UIDNEXT 4392] Predicted next UID
    S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
    S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
    S: A142 OK [READ-WRITE] SELECT completed
rH  s   SELECTr1   Nr	  r1   r7   r4   r	  r	  Í  s   † ñð  €FØƒGr7   r	  c                  ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚIMAP4ClientExpungeTestsiâ  zû
Tests for the L{IMAP4Client.expunge} method.

An example of usage of the EXPUNGE command from RFC 3501, section 6.4.3::

    C: A202 EXPUNGE
    S: * 3 EXPUNGE
    S: * 3 EXPUNGE
    S: * 5 EXPUNGE
    S: * 8 EXPUNGE
    S: A202 OK EXPUNGE completed
c                óÂ   • U R                   R                  5       nU R                  U R                  R	                  5       S5        U R                  R                  5         U$ )Ns   0001 EXPUNGE
)r‹  r  rD   rv  r¢  rî  rË  s     r4   Ú_expungeÚ IMAP4ClientExpungeTests._expungeð  sG   € Ø�K‰K×ÑÓ!ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1DÔEØ�‰×ÑÔØˆr7   c                óœ   • U H+  nU R                   R                  [        SU S35      5        M-     U R                   R                  S5        g )Nz* z EXPUNGEs   0001 OK EXPUNGE COMPLETED)r‹  ra  r)   )rG   ÚsequenceNumbersÚnumbers      r4   rÐ  Ú!IMAP4ClientExpungeTests._responseö  s?   € Û%ˆFØ�K‰K×$Ñ$¤]°R¸°x¸xÐ3HÓ%IÖJñ &à�‰× Ñ Ð!=Õ>r7   c                ó�   • U R                  5       nU R                  / SQ5        U R                  U R                  U5      / SQ5        g)z¦
L{IMAP4Client.expunge} sends the I{EXPUNGE} command and returns a
L{Deferred} which fires with a C{list} of message sequence numbers
given by the server's response.
)rå   rå   rè   rë   N)r	  rÐ  rD   rÔ  rË  s     r4   Útest_expungeÚ$IMAP4ClientExpungeTests.test_expungeû  s6   € ð �M‰M‹OˆØ�‰’|Ô$Ø×Ñ˜×-Ñ-¨aÓ0²,Õ?r7   c                óŠ   • U R                  5       nU R                  / SQ5        U R                  U[        R                  5        g)z°
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.expunge}
fails with L{IllegalServerResponse}.
)rå   rå   r}  rë   N)r	  rÐ  rÚ  r   r¢  rË  s     r4   Útest_nonIntegerExpungedÚ/IMAP4ClientExpungeTests.test_nonIntegerExpunged  s2   € ð �M‰M‹OˆØ�‰Ò'Ô(Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   r1   N)
r~   r   r€   r�   rd  r	  rÐ  r	  r	  r‚   r1   r7   r4   r
	  r
	  â  s   † ñòò?ò
@õ=r7   r
	  c                  ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚIMAP4ClientSearchTestsi  a¹  
Tests for the L{IMAP4Client.search} method.

An example of usage of the SEARCH command from RFC 3501, section 6.4.4::

    C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"
    S: * SEARCH 2 84 882
    S: A282 OK SEARCH completed
    C: A283 SEARCH TEXT "string not in mailbox"
    S: * SEARCH
    S: A283 OK SEARCH completed
    C: A284 SEARCH CHARSET UTF-8 TEXT {6}
    C: XXXXXX
    S: * SEARCH 43
    S: A284 OK SEARCH completed
c                ó´   • U R                   R                  [        R                  " SS95      nU R	                  U R
                  R                  5       S5        U$ )NÚABCDEF)rH   s   0001 SEARCH (TEXT "ABCDEF")
)r‹  Úsearchr   rb  rD   rv  r¢  rË  s     r4   Ú_searchÚIMAP4ClientSearchTests._search"  sB   € Ø�K‰K×ÑœuŸ{š{°Ñ9Ó:ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÔTØˆr7   c                óÂ   • U R                   R                  S[        SR                  [	        [
        U5      5      5      -   5        U R                   R                  S5        g )Ns	   * SEARCH Ú s   0001 OK SEARCH completed)r‹  ra  r)   r¥   Úmapr  )rG   ÚmessageNumberss     r4   rÐ  Ú IMAP4ClientSearchTests._response'  sF   € Ø�‰× Ñ Øœ=¨¯©´#´c¸>Ó2JÓ)KÓLÑLô	
ð 	�‰× Ñ Ð!<Õ=r7   c                ó�   • U R                  5       nU R                  / SQ5        U R                  U R                  U5      / SQ5        g)z¤
L{IMAP4Client.search} sends the I{SEARCH} command and returns a
L{Deferred} which fires with a C{list} of message sequence numbers
given by the server's response.
)rç   rè   r  N)r	  rÐ  rD   rÔ  rË  s     r4   Útest_searchÚ"IMAP4ClientSearchTests.test_search-  s6   € ð �L‰L‹NˆØ�‰’zÔ"Ø×Ñ˜×-Ñ-¨aÓ0²*Õ=r7   c                óŠ   • U R                  5       nU R                  / SQ5        U R                  U[        R                  5        g)z¯
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.search}
fails with L{IllegalServerResponse}.
)rç   r}  r  N)r	  rÐ  rÚ  r   r¢  rË  s     r4   Útest_nonIntegerFoundÚ+IMAP4ClientSearchTests.test_nonIntegerFound7  s1   € ð �L‰L‹NˆØ�‰’~Ô&Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   r1   N)
r~   r   r€   r�   rd  r	  rÐ  r%	  r(	  r‚   r1   r7   r4   r	  r	    s   † ñò"ò
>ò>õ=r7   r	  c                  ó„   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rSrg)ÚIMAP4ClientFetchTestsiB  zJ
Tests for the L{IMAP4Client.fetch} method.

See RFC 3501, section 6.4.5.
c                óø  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SS	0SS
0SS0SS0S.5        g)zÞ
L{IMAP4Client.fetchUID} sends the I{FETCH UID} command and returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{dict}s mapping C{'UID'} to that message's I{UID} in the server's
response.
ú1:7ó   0001 FETCH 1:7 (UID)
ó   * 2 FETCH (UID 22)s   * 3 FETCH (UID 23)ó   * 4 FETCH (UID 24)s   * 5 FETCH (UID 25)ó   0001 OK FETCH completedrå  Ú22Ú23Ú24Ú25©rç   rå   ré   rè   N)r‹  ÚfetchUIDrD   rv  r¢  ra  rÔ  rË  s     r4   Útest_fetchUIDÚ#IMAP4ClientFetchTests.test_fetchUIDI  sÍ   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#Ø˜� 5¨$ -°U¸D°MÀuÈdÀmÑTõ	
r7   c                ó:  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U[        R                  5        g)z±
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.fetchUID}
fails with L{IllegalServerResponse}.
r  s   0001 FETCH 1 (UID)
s   * foo FETCH (UID 22)r1	  N©	r‹  r7	  rD   rv  r¢  ra  rÚ  r   r¢  rË  s     r4   Útest_fetchUIDNonIntegerFoundÚ2IMAP4ClientFetchTests.test_fetchUIDNonIntegerFound\  sr   € ð �K‰K× Ñ  Ó%ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÔKØ�‰× Ñ Ð!8Ô9Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                ó¦  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                  U[        R                  5        g)zœ
If the server responds with an incomplete I{FETCH} response line, the
L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
r-	  r.	  r/	  s   * 3 FETCH (UID)r0	  r1	  Nr;	  rË  s     r4   Útest_incompleteFetchUIDResponseÚ5IMAP4ClientFetchTests.test_incompleteFetchUIDResponseh  s˜   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!3Ô4Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óD  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SSS005        g)	zï
L{IMAP4Client.fetchBody} sends the I{FETCH BODY} command and returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{dict}s mapping C{'RFC822.TEXT'} to that message's body as given in
the server's response.
Ú3s   0001 FETCH 3 (RFC822.TEXT)
s&   * 3 FETCH (RFC822.TEXT "Message text")r1	  rå   rá  zMessage textN)r‹  Ú	fetchBodyrD   rv  r¢  ra  rÔ  rË  s     r4   Útest_fetchBodyÚ$IMAP4ClientFetchTests.test_fetchBodyv  s�   € ð �K‰K×!Ñ! #Ó&ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°}ÀnÐ6UÐ2VÕWr7   c                óH  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SS/ S//05        g)	a  
L{IMAP4Client.fetchSpecific} sends the I{BODY[]} command if no
parameters beyond the message set to retrieve are given.  It returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{list}s of corresponding message data given by the server's
response.
Ú7ó   0001 FETCH 7 BODY[]
s   * 7 FETCH (BODY[] "Some body")r1	  rì   r   ú	Some bodyN©r‹  r~  rD   rv  r¢  ra  rÔ  rË  s     r4   Útest_fetchSpecificÚ(IMAP4ClientFetchTests.test_fetchSpecificƒ  s†   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÕSr7   c                óF  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SS/ S	//05        g
)zk
L{IMAP4Client.fetchSpecific} issues a I{BODY.PEEK[]} command if passed
C{True} for the C{peek} parameter.
Ú6T)r  s   0001 FETCH 6 BODY.PEEK[]
s   * 6 FETCH (BODY[] "Some body")r1	  rê   r   rI	  NrJ	  rË  s     r4   Útest_fetchSpecificPeekÚ,IMAP4ClientFetchTests.test_fetchSpecificPeek‘  s‹   € ð
 �K‰K×%Ñ% c°Ð%Ð5ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQà�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÕSr7   c                óH  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SSS	/S
//05        g)a  
L{IMAP4Client.fetchSpecific}, when passed a sequence for
C{headerNumber}, sends the I{BODY[N.M]} command.  It returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{list}s of corresponding message data given by the server's
response.
rG	  ræ   ©ÚheaderNumbers   0001 FETCH 7 BODY[1.2.3]
s#   * 7 FETCH (BODY[1.2.3] "Some body")r1	  rì   r   z1.2.3rI	  NrJ	  rË  s     r4   Útest_fetchSpecificNumberedÚ0IMAP4ClientFetchTests.test_fetchSpecificNumbered�  s�   € ð �K‰K×%Ñ% c¸	Ð%ÐBˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQØ�‰× Ñ Ð!GÔHØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°G°9¸kÐ*JÐ)KÐ%Lõ	
r7   c                óH  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SSS/S	//05        g
)a	  
L{IMAP4Client.fetchSpecific}, when passed C{'TEXT'} for C{headerType},
sends the I{BODY[TEXT]} command.  It returns a L{Deferred} which fires
with a C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
Ú8ÚTEXT©ry  ó   0001 FETCH 8 BODY[TEXT]
s"   * 8 FETCH (BODY[TEXT] "Some body")r1	  rë   r   rI	  NrJ	  rË  s     r4   Útest_fetchSpecificTextÚ,IMAP4ClientFetchTests.test_fetchSpecificText­  ó�   € ð �K‰K×%Ñ% c°fÐ%Ð=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!FÔGØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸[Ð*IÐ)JÐ%Kõ	
r7   c                óJ  • U R                   R                  SSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SS	S
/S//05        g)a8  
If passed a value for the C{headerNumber} parameter and C{'TEXT'} for
the C{headerType} parameter, L{IMAP4Client.fetchSpecific} sends a
I{BODY[number.TEXT]} request and returns a L{Deferred} which fires with
a C{dict} mapping message sequence numbers to C{list}s of message data
given by the server's response.
Ú4rX	  rì   )ry  rS	  s   0001 FETCH 4 BODY[7.TEXT]
s$   * 4 FETCH (BODY[7.TEXT] "Some body")r1	  ré   r   z7.TEXTrI	  NrJ	  rË  s     r4   Útest_fetchSpecificNumberedTextÚ4IMAP4ClientFetchTests.test_fetchSpecificNumberedText¼  s’   € ð �K‰K×%Ñ% c°fÈ1Ð%ÐMˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1QÔRØ�‰× Ñ Ð!HÔIØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°H°:¸{Ð*KÐ)LÐ%Mõ	
r7   c                ó8  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U[        R                  5        g)zÔ
If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
which is truncated after the I{BODY[TEXT]} tokens, the L{Deferred}
returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
rW	  rX	  rY	  rZ	  s   * 8 FETCH (BODY[TEXT])r1	  N©	r‹  r~  rD   rv  r¢  ra  rÚ  r   r¢  rË  s     r4   Ú(test_incompleteFetchSpecificTextResponseÚ>IMAP4ClientFetchTests.test_incompleteFetchSpecificTextResponseÌ  sw   € ð �K‰K×%Ñ% c°fÐ%Ð=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!:Ô;Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óH  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SSS/S	//05        g
)a	  
L{IMAP4Client.fetchSpecific}, when passed C{'MIME'} for C{headerType},
sends the I{BODY[MIME]} command.  It returns a L{Deferred} which fires
with a C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
rW	  r  rY	  s   0001 FETCH 8 BODY[MIME]
s"   * 8 FETCH (BODY[MIME] "Some body")r1	  rë   r   rI	  NrJ	  rË  s     r4   Útest_fetchSpecificMIMEÚ,IMAP4ClientFetchTests.test_fetchSpecificMIMEÙ  r]	  r7   c                óN  • U R                   R                  SSSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      S	S
S/SS//05        g)a(  
L{IMAP4Client.fetchSpecific}, when passed C{offset} and C{length},
sends a partial content request (like I{BODY[TEXT]<offset.length>}).
It returns a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data given by the
server's response.
Ú9rX	  r£  rå   )ry  Úoffsetr  s   0001 FETCH 9 BODY[TEXT]<17.3>
s    * 9 FETCH (BODY[TEXT]<17> "foo")r1	  r  r   z<17>r}  NrJ	  rË  s     r4   Útest_fetchSpecificPartialÚ/IMAP4ClientFetchTests.test_fetchSpecificPartialè  s—   € ð �K‰K×%Ñ% c°fÀRÐPQÐ%ÐRˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1UÔVØ�‰× Ñ Ð!DÔEØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸VÀUÐ*KÐ)LÐ%Mõ	
r7   c                ó8  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U[        R                  5        g)zÜ
If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
which is truncated after the I{BODY[TEXT]<offset>} tokens, the
L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
rW	  rX	  rY	  rZ	  s   * 8 FETCH (BODY[TEXT]<17>)r1	  Nrc	  rË  s     r4   Ú+test_incompleteFetchSpecificPartialResponseÚAIMAP4ClientFetchTests.test_incompleteFetchSpecificPartialResponseø  sw   € ð �K‰K×%Ñ% c°fÐ%Ð=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!>Ô?Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   c                óH  • U R                   R                  S5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SS/ S//05        g)	a  
If the body of a message begins with I{<} and ends with I{>} (as,
for example, HTML bodies typically will), this is still interpreted
as the body by L{IMAP4Client.fetchSpecific} (and particularly, not
as a length indicator for a response to a request for a partial
body).
rG	  rH	  s&   * 7 FETCH (BODY[] "<html>test</html>")r1	  rì   r   z<html>test</html>NrJ	  rË  s     r4   Útest_fetchSpecificHTMLÚ,IMAP4ClientFetchTests.test_fetchSpecificHTML  sŠ   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°2Ð7JÐ*KÐ)LÐ%Mõ	
r7   c                óž  • U R                   R                  SUS9nU R                  U R                  R	                  5       SUR                  S5      -   S-   5        U R                   R                  SUR                  S5      -   S-   5        U R                   R                  S5        U R                  U R                  U5      S	S
U/ /S//05        g)a‡  
Assert that the provided C{BODY} section, when invoked with no
arguments, produces an empty list, and that it returns a
L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.

@param section: The C{BODY} section to test: either
    C{'HEADER.FIELDS'} or C{'HEADER.FIELDS.NOT'}
@type section: L{str}
Ú10rY	  s   0001 FETCH 10 BODY[rê  s    ()]
s   * 10 FETCH (BODY[s    ()] "")r1	  r  r   r�  N)r‹  r~  rD   rv  r¢  rE   ra  rÔ  )rG   Úsectionr²   s      r4   Ú&assertFetchSpecificFieldsWithEmptyListÚ<IMAP4ClientFetchTests.assertFetchSpecificFieldsWithEmptyList  s¿   € ð �K‰K×%Ñ% d°wÐ%Ð?ˆØ×ÑØ�N‰N× Ñ Ó"Ø" W§^¡^°GÓ%<Ñ<¸{ÑJô	
ð 	�‰× Ñ Ø  7§>¡>°'Ó#:Ñ:¸[ÑHô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°2¸À'È2ÀÐPRÐ8SÐ7TÐ2UÕVr7   c                ó&   • U R                  S5        g)aB  
L{IMAP4Client.fetchSpecific}, when passed C{'HEADER.FIELDS'}
for C{headerType} but no C{headerArgs}, sends the
I{BODY[HEADER.FIELDS]} command with no arguments.  It returns
a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.
rv  N©rw	  rW   s    r4   Ú,test_fetchSpecificHeaderFieldsWithoutHeadersÚBIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsWithoutHeaders.  s   € ð 	×3Ñ3°OÕDr7   c                ó&   • U R                  S5        g)aJ  
L{IMAP4Client.fetchSpecific}, when passed
C{'HEADER.FIELDS.NOT'} for C{headerType} but no C{headerArgs},
sends the I{BODY[HEADER.FIELDS.NOT]} command with no
arguments.  It returns a L{Deferred} which fires with a
C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
zHEADER.FIELDS.NOTNrz	  rW   s    r4   Ú/test_fetchSpecificHeaderFieldsNotWithoutHeadersÚEIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsNotWithoutHeaders9  s   € ð 	×3Ñ3Ð4GÕHr7   c                óH  • U R                   R                  SSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U R                  U5      SSS/S	//05        g
)a  
L{IMAP4Client.fetchSpecific}, when passed C{'HEADER'} for
C{headerType}, sends the I{BODY[HEADER]} command.  It returns
a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.
Ú11ÚHEADERrY	  s   0001 FETCH 11 BODY[HEADER]
sJ   * 11 FETCH (BODY[HEADER] "From: someone@localhost
Subject: Some subject")r1	  rž  r   z.From: someone@localhost
Subject: Some subjectNrJ	  rË  s     r4   Útest_fetchSpecificHeaderÚ.IMAP4ClientFetchTests.test_fetchSpecificHeaderD  s¡   € ð �K‰K×%Ñ% d°xÐ%Ð@ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ ðDô	
ð 	�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#ààØ!˜
ØJðððõ	
r7   r1   N)r~   r   r€   r�   rd  r8	  r<	  r?	  rD	  rK	  rO	  rT	  r[	  r`	  rd	  rg	  rl	  ro	  rr	  rw	  r{	  r~	  rƒ	  r‚   r1   r7   r4   r+	  r+	  B  sg   † ñò
ò&
=ò=òXòTò
Tò
ò 
ò
ò =ò
ò
ò =ò
ò Wò2	Eò	Iõ
r7   r+	  c                  ód   • \ rS rSrSr\rS rS rS r	S r
S rS rS	 rS
 rS rS rS rS rSrg)ÚIMAP4ClientStoreTestsia  a³  
Tests for the L{IMAP4Client.setFlags}, L{IMAP4Client.addFlags}, and
L{IMAP4Client.removeFlags} methods.

An example of usage of the STORE command, in terms of which these three
methods are implemented, from RFC 3501, section 6.4.6::

    C: A003 STORE 2:4 +FLAGS (\Deleted)
    S: * 2 FETCH (FLAGS (\Deleted \Seen))
    S: * 3 FETCH (FLAGS (\Deleted))
    S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
    S: A003 OK STORE completed
c                óZ  • [        U R                  U5      " SSS5      nU R                  U R                  R	                  5       SU-   S-   5        U R                  R                  S5        U R                  R                  S5        U R                  U R                  U5      SS	S
S/005        g)a=  
Test a non-silent flag modifying method.  Call the method, assert that
the correct bytes are sent, deliver a I{FETCH} response, and assert
that the result of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rB	  ©ú\Readrƒ  Fó   0001 STORE 3 ó    (\Read \Seen)
s   * 3 FETCH (FLAGS (\Read \Seen))ó   0001 OK STORE completedrå   r×  r‰	  rƒ  N©rî  r‹  rD   rv  r¢  ra  rÔ  ©rG   rÊ  Úitemr²   s       r4   Ú
_flagsTestÚ IMAP4ClientStoreTests._flagsTestr  sœ   € ô �D—K‘K Ô(¨Ð.BÀEÓJˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°wÀÈ8Ð@TÐ6UÐ2VÕWr7   c                ó  • [        U R                  U5      " SSS5      nU R                  U R                  R	                  5       SU-   S-   5        U R                  R                  S5        U R                  U R                  U5      0 5        g)a7  
Test a silent flag modifying method.  Call the method, assert that the
correct bytes are sent, deliver an I{OK} response, and assert that the
result of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rB	  rˆ	  TrŠ	  r‹	  rŒ	  Nr�	  rŽ	  s       r4   Ú_flagsSilentlyTestÚ(IMAP4ClientStoreTests._flagsSilentlyTestƒ  sz   € ô �D—K‘K Ô(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Õ5r7   c                ó¢  • [        U R                  U5      " SSS5      nU R                  U R                  R	                  5       SU-   S-   5        U R                  R                  S5        U R                  R                  S5        U R                  U R                  U5      0 5        U R                  U R                  R                  SS	S
/05        g)ap  
Test unsolicited data received in response to a silent flag modifying
method.  Call the method, assert that the correct bytes are sent,
deliver the unsolicited I{FETCH} response, and assert that the result
of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rB	  rˆ	  TrŠ	  r‹	  s   * 2 FETCH (FLAGS (\Read \Seen))rŒ	  rç   r‰	  rƒ  N)rî  r‹  rD   rv  r¢  ra  rÔ  rÙ  rŽ	  s       r4   Ú%_flagsSilentlyWithUnsolicitedDataTestÚ;IMAP4ClientStoreTests._flagsSilentlyWithUnsolicitedDataTest“  s±   € ô �D—K‘K Ô(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Ô5Ø×Ñ˜Ÿ™×*Ñ*¨Q°¸8Ð0DÐ,EÕFr7   c                ó(   • U R                  SS5        g)a!  
When passed a C{False} value for the C{silent} parameter,
L{IMAP4Client.setFlags} sends the I{STORE} command with a I{FLAGS} data
item and returns a L{Deferred} which fires with a C{dict} mapping
message sequence numbers to C{dict}s mapping C{'FLAGS'} to the new
flags of those messages.
ÚsetFlagsrÌ  N©r�	  rW   s    r4   Útest_setFlagsÚ#IMAP4ClientStoreTests.test_setFlags¦  s   € ð 	�‰˜
 HÕ-r7   c                ó(   • U R                  SS5        g)zÎ
When passed a C{True} value for the C{silent} parameter,
L{IMAP4Client.setFlags} sends the I{STORE} command with a
I{FLAGS.SILENT} data item and returns a L{Deferred} which fires with an
empty dictionary.
r™	  ó   FLAGS.SILENTN©r“	  rW   s    r4   Útest_setFlagsSilentlyÚ+IMAP4ClientStoreTests.test_setFlagsSilently°  s   € ð 	×Ñ 
¨OÕ<r7   c                ó(   • U R                  SS5        g)zŽ
If unsolicited flag data is received in response to a I{STORE}
I{FLAGS.SILENT} request, that data is passed to the C{flagsChanged}
callback.
r™	  rž	  N©r–	  rW   s    r4   Ú(test_setFlagsSilentlyWithUnsolicitedDataÚ>IMAP4ClientStoreTests.test_setFlagsSilentlyWithUnsolicitedData¹  s   € ð 	×2Ñ2°:¸ÕOr7   c                ó(   • U R                  SS5        g)zc
L{IMAP4Client.addFlags} is like L{IMAP4Client.setFlags}, but sends
I{+FLAGS} instead of I{FLAGS}.
ÚaddFlagss   +FLAGSNrš	  rW   s    r4   Útest_addFlagsÚ#IMAP4ClientStoreTests.test_addFlagsÁ  s   € ð
 	�‰˜
 IÕ.r7   c                ó(   • U R                  SS5        g)z¿
L{IMAP4Client.addFlags} with a C{True} value for C{silent} behaves like
L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
sends I{+FLAGS.SILENT} instead of I{FLAGS.SILENT}.
r§	  ó   +FLAGS.SILENTNrŸ	  rW   s    r4   Útest_addFlagsSilentlyÚ+IMAP4ClientStoreTests.test_addFlagsSilentlyÈ  s   € ð 	×Ñ 
Ð,<Õ=r7   c                ó(   • U R                  SS5        g)zy
L{IMAP4Client.addFlags} behaves like L{IMAP4Client.setFlags} when used
in silent mode and unsolicited data is received.
r§	  r«	  Nr£	  rW   s    r4   Ú(test_addFlagsSilentlyWithUnsolicitedDataÚ>IMAP4ClientStoreTests.test_addFlagsSilentlyWithUnsolicitedDataÐ  s   € ð
 	×2Ñ2°:Ð?OÕPr7   c                ó(   • U R                  SS5        g)zf
L{IMAP4Client.removeFlags} is like L{IMAP4Client.setFlags}, but sends
I{-FLAGS} instead of I{FLAGS}.
ÚremoveFlagss   -FLAGSNrš	  rW   s    r4   Útest_removeFlagsÚ&IMAP4ClientStoreTests.test_removeFlags×  s   € ð
 	�‰˜ yÕ1r7   c                ó(   • U R                  SS5        g)zÂ
L{IMAP4Client.removeFlags} with a C{True} value for C{silent} behaves
like L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
sends I{-FLAGS.SILENT} instead of I{FLAGS.SILENT}.
r²	  ó   -FLAGS.SILENTNrŸ	  rW   s    r4   Útest_removeFlagsSilentlyÚ.IMAP4ClientStoreTests.test_removeFlagsSilentlyÞ  s   € ð 	×Ñ Ð/?Õ@r7   c                ó(   • U R                  SS5        g)z|
L{IMAP4Client.removeFlags} behaves like L{IMAP4Client.setFlags} when
used in silent mode and unsolicited data is received.
r²	  r¶	  Nr£	  rW   s    r4   Ú+test_removeFlagsSilentlyWithUnsolicitedDataÚAIMAP4ClientStoreTests.test_removeFlagsSilentlyWithUnsolicitedDataæ  s   € ð
 	×2Ñ2°=ÐBRÕSr7   r1   N)r~   r   r€   r�   rd  rG  rÃ  r�	  r“	  r–	  r›	  r 	  r¤	  r¨	  r¬	  r¯	  r³	  r·	  rº	  r‚   r1   r7   r4   r†	  r†	  a  sP   † ñð (€NòXò"6ò Gò&.ò=òPò/ò>òQò2òAõTr7   r†	  c                  ó$   • \ rS rSrSrS rS rSrg)ÚIMAP4ClientStatusTestsiî  a?  
Tests for the L{IMAP4Client.status} method.

An example of usage of the STATUS command from RFC 3501, section
5.1.2::

    C: A042 STATUS blurdybloop (UIDNEXT MESSAGES)
    S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
    S: A042 OK STATUS completed

@see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
c                ó¬   • U R                  [        U R                  R                  SS5      nU R	                  [        U5      S[        S15      -   5        g)zy
Only allow sending the C{STATUS} names defined in RFC 3501.

@see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
rù  zIMPOSSIBLE?!zUnknown names: N)rö   r,  r‹  rm  rD   r  rû   )rG   Úexcs     r4   ÚtestUnknownNameÚ&IMAP4ClientStatusTests.testUnknownNameü  sN   € ð ×ÑÜØ�K‰K×ÑØØó	
ˆð 	×Ñœ˜S›Ð#4´t¸^Ð<LÓ7MÑ#MÕNr7   c                ó<  • U R                   R                  SS5      nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                   R                  S5        U R                  U[        R                  5        g)zq
C{STATUS} names that cannot be decoded as ASCII cause the
status Deferred to fail with L{IllegalServerResponse}
Úblurdybloopr³  s$   0001 STATUS blurdybloop (MESSAGES)
s?   * STATUS blurdybloop (MESSAGES 1 ASCIINAME "OK" NOTÿASCII "NO")s   0001 OK STATUS completedN)	r‹  rm  rD   rv  r¢  ra  rÚ  r   r¢  rË  s     r4   ÚtestUndecodableNameÚ*IMAP4ClientStatusTests.testUndecodableName
  s}   € ð �K‰K×Ñ˜}¨jÓ9ˆØ×ÑØ�N‰N× Ñ Ó"Ø5ô	
ð
 	�‰× Ñ ØUô	
ð 	�‰× Ñ Ð!<Ô=Ø×Ñ˜Q¤× ;Ñ ;Õ<r7   r1   N)r~   r   r€   r�   rd  rÀ	  rÄ	  r‚   r1   r7   r4   r½	  r½	  î  s   † ñòOõ=r7   r½	  c                  ó4   • \ rS rSrSr\rS rS rS r	S r
Srg)	ÚIMAP4ClientCopyTestsi  zÈ
Tests for the L{IMAP4Client.copy} method.

An example of the C{COPY} command, which this method implements,
from RFC 3501, section 6.4.7::

    C: A003 COPY 2:4 MEETING
    S: A003 OK COPY completed
c                ó
  • U R                   R                  SSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                  U R                  U5      / S45        g)	z—
L{IMAP4Client.copy} copies the messages identified by their
sequence numbers to the mailbox, returning a L{Deferred} that
succeeds with a true value.
r  ÚMEETINGFr`  ó   0001 COPY 2:3 MEETING
ó   0001 OK COPY completedó   OK COPY completedN©r‹  ÚcopyrD   rv  r¢  ra  rÔ  rË  s     r4   Útest_copySequenceNumbersÚ-IMAP4ClientCopyTests.test_copySequenceNumbers*  sv   € ð �K‰K×Ñ˜U I°5ÐÐ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÕMr7   c                ó6  • U R                   R                  SSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                  U R                  U5      R                  [        R                  5        g)z®
L{IMAP4Client.copy} returns a L{Deferred} that fails with an
L{IMAP4Exception} when the messages specified by the given
sequence numbers could not be copied to the mailbox.
r  rÉ	  Fr`  rÊ	  ó   0001 BAD COPY failedN©
r‹  rÎ	  rD   rv  r¢  ra  r  rÚ  r   r¡  rË  s     r4   Útest_copySequenceNumbersFailsÚ2IMAP4ClientCopyTests.test_copySequenceNumbersFails:  s|   € ð �K‰K×Ñ˜U I°5ÐÐ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÕRr7   c                ó
  • U R                   R                  SSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                  U R                  U5      / S45        g)	z‹
L{IMAP4Client.copy} copies the messages identified by their
UIDs to the mailbox, returning a L{Deferred} that succeeds
with a true value.
r  rÉ	  Tr`  ó   0001 UID COPY 2:3 MEETING
rË	  rÌ	  NrÍ	  rË  s     r4   Útest_copyUIDsÚ"IMAP4ClientCopyTests.test_copyUIDsJ  sv   € ð �K‰K×Ñ˜U I°4ÐÐ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÕMr7   c                ó6  • U R                   R                  SSSS9nU R                  U R                  R	                  5       S5        U R                   R                  S5        U R                  U R                  U5      R                  [        R                  5        g)z¢
L{IMAP4Client.copy} returns a L{Deferred} that fails with an
L{IMAP4Exception} when the messages specified by the given
UIDs could not be copied to the mailbox.
r  rÉ	  Tr`  r×	  rÒ	  NrÓ	  rË  s     r4   Útest_copyUIDsFailsÚ'IMAP4ClientCopyTests.test_copyUIDsFailsZ  s|   € ð �K‰K×Ñ˜U I°4ÐÐ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÕRr7   r1   N)r~   r   r€   r�   rd  rG  rÃ  rÏ	  rÔ	  rØ	  rÛ	  r‚   r1   r7   r4   rÇ	  rÇ	    s&   † ñð (€NòNò Sò Nõ Sr7   rÇ	  c                  ó"   • \ rS rSrSrSrS rSrg)ÚFakeyServerik  rH  Nc                ó   • g r0   r1   rW   s    r4   ÚsendServerGreetingÚFakeyServer.sendServerGreetingo  rë  r7   r1   )r~   r   r€   r�   r÷  Útimeoutrà	  r‚   r1   r7   r4   rÞ	  rÞ	  k  s   † Ø€EØ€Gõr7   rÞ	  c                  óN   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)r¬   is  )r°   rÙ  rü  Ú_bodyræ  c                ól   • Xl         X l        X@l        [        U5      U l        X0l        XPl        X`l        g r0   )r°   rÙ  rä	  rî   Úsizerü  ræ  Úsubpart)rG   r°   rÙ  rü  r¦   ræ  rç	  s          r4   rˆ   ÚFakeyMessage.__init__w  s+   € ØŒØŒ
ØŒ
Ü˜“IˆŒ	ØŒ	ØŒØ�r7   c                ó*   • X4U l         U R                  $ r0   )Úgot_headersr°   )rG   r  ró  s      r4   Ú
getHeadersÚFakeyMessage.getHeaders€  s   € Ø!˜=ˆÔØ�|‰|Ðr7   c                ó   • U R                   $ r0   rÑ  rW   s    r4   rÒ  ÚFakeyMessage.getFlags„  rÔ  r7   c                ó   • U R                   $ r0   )rü  rW   s    r4   ÚgetInternalDateÚFakeyMessage.getInternalDate‡  ó   € Ø�y‰yÐr7   c                ó,   • [        U R                  5      $ r0   )r   rä	  rW   s    r4   ÚgetBodyFileÚFakeyMessage.getBodyFileŠ  s   € Ü�t—z‘zÓ"Ð"r7   c                ó   • U R                   $ r0   )ræ	  rW   s    r4   ÚgetSizeÚFakeyMessage.getSize�  rò	  r7   c                ó   • U R                   $ r0   r`  rW   s    r4   rñ  ÚFakeyMessage.getUID�  s   € Ø�x‰xˆr7   c                ó   • U R                   S L$ r0   )rç	  rW   s    r4   ÚisMultipartÚFakeyMessage.isMultipart“  s   € Ø�|‰| 4Ð'Ð'r7   c                ó,   • Xl         U R                  U   $ r0   )Úgot_subpartrç	  )rG   r  s     r4   Ú
getSubPartÚFakeyMessage.getSubPart–  s   € ØÔØ�|‰|˜DÑ!Ð!r7   )	rä	  rü  rÙ  rê	  rÿ	  r°   ræ	  rç	  ræ  N)r~   r   r€   r�   ÚshowAttributesrˆ   rë	  rÒ  rð	  rô	  r÷	  rñ  rü	  r 
  r‚   r1   r7   r4   r¬   r¬   s  s4   † àA€Nòòòòò#òòò(õ"r7   r¬   c                  óD   • \ rS rSrSrSrS rS rS rS r	S r
S
S jrS	rg)ÚNewStoreTestsi›  Nc                óþ   • S =U l         U l        [        R                  " 5       U l        SU R                  l        X R                  l        [        R                  " 5       U l	        [        U R                  5      U l        g ©NrH  )Úreceived_messagesÚreceived_uidr   rU  rŠ  r÷  rÀ  r   r   rŒ  rg  r‹  rW   s    r4   rŽ  ÚNewStoreTests.setUpŸ  sV   € Ø59Ð9ˆÔ Ô!2ä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆ�r7   c                ó   • g r0   r1   ©rG   r‘  s     r4   rË  ÚNewStoreTests.addListener¨  rë  r7   c                ó   • g r0   r1   r
  s     r4   rÍ  ÚNewStoreTests.removeListener«  rë  r7   c                ó*   • X4U l         U R                  $ r0   )Ú	storeArgsr  )rG   r\  r]  s      r4   r  ÚNewStoreTests.store®  s   € Ø˜ˆŒØ�}‰}Ðr7   c                ól  ^ • U 4S jnU 4S jnT R                   R                  [        U5      5      R                  U5      R                  T R                  5      R	                  T R
                  5        U 4S jn[        R                  " T R                  T R                  SS9nUR                  U5        U$ )Nc                 ó|   >• T R                  T R                  T R                  T R                  T R                  5      $ r0   )Úfunctionru  rÙ  Úsilentræ  rW   s   €r4   rŒ  Ú+NewStoreTests._storeWork.<locals>.connected³  s(   ø€ Ø—=‘= §¡°·
±
¸D¿K¹KÈÏÉÓRÐRr7   c                ó   >• U Tl         g r0   ©r2   ©ÚRrG   s    €r4   r2   Ú(NewStoreTests._storeWork.<locals>.result¶  ó
   ø€ ØˆD�Kr7   c                óž   >• TR                  TR                  TR                  5        TR                  TR                  TR                  5        g r0   )rD   r2   rŸ  r
  ÚexpectedArgs©rù  rG   s    €r4   rÉ  Ú'NewStoreTests._storeWork.<locals>.check½  s5   ø€ Ø×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸ^™^¨T×->Ñ->Õ?r7   F©Únoisy©
rŒ  r¯   r8   r•  r½  rš  r#   ÚloopbackTCPrŠ  r‹  )rG   rŒ  r2   rÉ  r²   s   `    r4   Ú
_storeWorkÚNewStoreTests._storeWork²  s‰   ø€ õ	Sõ	ð 	�‰×"Ñ"¤5¨Ó#3Ó4×@Ñ@ÀÓH×TÑTØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	@ô × Ò  §¡¨d¯k©kÀÑGˆØ	�‰�eÔØˆr7   c                ó’  • U R                   R                  U l        SU l        / SQU l        SU l        Xl        / SQ/ SQ/ SQS.U l        S/ SQ0S/ SQ0S/ SQ0S.U l        [        R                  " 5       nUR                  S5        UR                  S5        UR                  S5        U/ SQS	4S
S	04U l        U R                  5       $ )Nz1,5,9)z\Az\BÚCF)rã   rè   r  r×  rã   rè   r  r   ræ  )r‹  r™	  r
  ru  rÙ  r
  ræ  r  rŸ  r   r   rð   r
  r%
  )rG   ræ  r±   s      r4   ÚtestSetFlagsÚNewStoreTests.testSetFlagsÅ  s¼   € ØŸ™×,Ñ,ˆŒØˆŒÚ(ˆŒ
ØˆŒØŒâ"Ú"Ú"ñ
ˆŒð Ò,Ð-ØÒ,Ð-ØÒ,Ð-ñ
ˆŒô
 ×ÒÓ ˆØ�‰�Œ
Ø�‰�Œ
Ø�‰�Œ
Ø!Ò#6¸Ð:¸UÀA¸JÐGˆÔØ�‰Ó Ð r7   )r‹  rŒ  rŸ  r
  rÙ  r
  ru  r
  r
  r  r2   rŠ  r
  r
  ræ  r  )r~   r   r€   r�   r2   r
  rŽ  rË  rÍ  r  r%
  r)
  r‚   r1   r7   r4   r
  r
  ›  s*   † Ø€FØ€Iò3òòòò÷&!r7   r
  c                  óN   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)ÚGetBodyStructureTestsiÝ  z­
Tests for L{imap4.getBodyStructure}, a helper for constructing a list which
directly corresponds to the wire information needed for a I{BODY} or
I{BODYSTRUCTURE} response.
c                óà   • SnSnSnSnSnSnSn[        US-   U-   S	-   U-   S
-   UUUS.SSUSS5      n[        R                  " U5      n	U R                  UUSUSS/UUU[	        U5      /U	5        g)z”
L{imap4.getBodyStructure} accepts a L{IMessagePart} provider and returns
a list giving the basic fields for the I{BODY} response for that
message.
ó   hello, worldÚimageÚjpegúus-asciiúsome kind of idúgreat justiceÚmaximumr†  ú
; charset=ú; x=y©r¡   ú
content-idúcontent-descriptionúcontent-transfer-encodingr1   r7   r¢   NÚcharsetr‘  Úy©r¬   r   ÚgetBodyStructurerD   rî   ©
rG   r¦   ÚmajorÚminorr;
  r¡  Údescriptionr¿  r±   Ú	structures
             r4   Útest_singlePartÚ%GetBodyStructureTests.test_singlePartä  s·   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ñ	ð ØØØØó
ˆô ×*Ò*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ðð õ	
r7   c                óò  • [        0 SSSSS5      n[        R                  " U5      nUSS u  p4U R                  SU5        U R                  SU5        [        SS0SSSSS5      n[        R                  " U5      nUSS u  pxU R                  SU5        U R                  SU5        [        SS0SSSSS5      n	[        R                  " U	5      n
U
SS u  p¼U R                  SU5        U R                  SU5        g)	z±
L{imap4.getBodyStructure} returns L{None} for the major and
minor MIME types of a L{IMessagePart} provider whose headers
lack a C{Content-Type}, or have an empty value for it.
r1   r7   r¢   Nrç   r¡   r�  Ú
)r¬   r   r>
  ÚassertIs)rG   ÚmissingÚmissingContentTypeStructureÚmissingMajorÚmissingMinorr	  ÚemptyContentTypeStructureÚ
emptyMajorÚ
emptyMinorÚnewlineÚnewlineContentTypeStructureÚnewlineMajorÚnewlineMinors                r4   Útest_emptyContentTypeÚ+GetBodyStructureTests.test_emptyContentType  sþ   € ô ˜r 2 s¨C°°dÓ;ˆÜ&+×&<Ò&<¸WÓ&EÐ#Ø%@ÀÀ!Ð%DÑ"ˆØ�‰�d˜LÔ)Ø�‰�d˜LÔ)ä˜n¨bÐ1°2°s¸CÀÀdÓKˆÜ$)×$:Ò$:¸5Ó$AÐ!Ø!:¸2¸AÐ!>Ñˆ
Ø�‰�d˜JÔ'Ø�‰�d˜JÔ'ä °Ð5°r¸3ÀÀSÈ$ÓOˆÜ&+×&<Ò&<¸WÓ&EÐ#Ø%@ÀÀ!Ð%DÑ"ˆØ�‰�d˜LÔ)Ø�‰�d˜LÕ)r7   c                óª   • [        SS0SSSSS5      n[        R                  " U5      nUSS u  p4U R                  US5        U R	                  US5        g)z—
L{imap4.getBodyStructure} returns only a non-L{None} major
MIME type for a L{IMessagePart} provider whose headers only
have a main a C{Content-Type}.
r¡   Úmainr1   r7   r¢   Nrç   )r¬   r   r>
  rD   rH
  )rG   rW
  ÚmainStructureÚ	mainMajorÚ	mainMinors        r4   Útest_onlyMajorContentTypeÚ/GetBodyStructureTests.test_onlyMajorContentType$  sZ   € ô ˜^¨VÐ4°b¸#¸sÀCÈÓNˆÜ×.Ò.¨tÓ4ˆØ,¨R¨aÐ0Ñˆ	Ø×Ñ˜ FÔ+Ø�‰�i Õ&r7   c                óú   • SnSnSnSnSnSnSnSn[        US	-   U-   S
-   U-   S-   UUUUSSSS.SSUSS5      n	[        R                  " U	SS9n
U R                  UUSUSS/UUU[	        U5      US/ SQ/SS/U
5        g)z 
L{imap4.getBodyStructure} returns a list giving the basic and extended
fields for a I{BODYSTRUCTURE} response if passed C{True} for the
C{extended} parameter.
r.
  r/
  r0
  r1
  r2
  r3
  r4
  Úabcdefabcdefr†  r5
  r6
  zattachment; name=foo; size=barÚfrÚFrance©r¡   r8
  r9
  r:
  úcontent-md5úcontent-dispositionúcontent-languageúcontent-locationr1   r�  r¢   NT©Úextendedr;
  r‘  r<
  Ú
attachment)rB  r}  ræ	  r~  r=
  )rG   r¦   r@
  rA
  r;
  r¡  rB
  r¿  Úmd5r±   rC
  s              r4   Útest_singlePartExtendedÚ-GetBodyStructureTests.test_singlePartExtended0  sÜ   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5Ø"Ø'GØ$(Ø$,ñ	ð ØØØØó
ˆô" ×*Ò*¨3¸Ñ>ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ØØÒ=Ð>ØØðð õ	
r7   c                ó´   • SnSnSn[        SUS-   U-   0SSUSS	5      n[        R                  " US
S9nU R                  XS	S	S	S	[	        U5      S	S	S	S	/U5        g	)zƒ
For fields with no information contained in the message headers,
L{imap4.getBodyStructure} fills in L{None} values in its result.
r/
  r0
  r.
  r¡   r†  r1   r7   r¢   NTrf
  r=
  )rG   r@
  rA
  r¦   r±   rC
  s         r4   Útest_singlePartWithMissingÚ0GetBodyStructureTests.test_singlePartWithMissinga  sz   € ð
 ˆØˆØˆÜØ˜U S™[¨5Ñ0Ð1°2°s¸DÀ#Àtó
ˆô ×*Ò*¨3¸Ñ>ˆ	Ø×ÑØ˜4  t¨T´3°t³9¸dÀDÈ$ÐPTÐUØõ	
r7   c                ó  • SnSnSnSnSnSnSn[        US-   U-   S	-   U-   S
-   UUUS.SSUSS5      n[        R                  " U5      n	U R                  UUSUSS/UUU[	        U5      [	        UR                  5       5      /U	5        g)zz
For a I{text/*} message, the number of lines in the message body are
included after the common single-part basic fields.
ó"   hello, world
how are you?
goodbye
rH   r0
  r1
  r2
  r3
  r4
  r†  r5
  r6
  r7
  r1   r7   r¢   Nr;
  r‘  r<
  )r¬   r   r>
  rD   rî   rž  r?
  s
             r4   Útest_textPartÚ#GetBodyStructureTests.test_textPartr  sÆ   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ñ	ð ØØØØó
ˆô ×*Ò*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	Ü�D—O‘OÓ%Ó&ð	ð õ	
r7   c                óF  • SnSnSnSnSnSnSn[        US-   U-   S	-   U-   S
-   SSUUUS.SSUSS5      n[        SS0SSSSU/5      n	[        R                  " U	5      n
U R                  SSSSSSS[        R                  " U5      [        R                  " U5      S/
U
5        g)zs
For a I{message/rfc822} message, the common basic fields are followed
by information about the contained message.
rp
  rH   r0
  r1
  r2
  r3
  r4
  r†  r5
  r6
  zAlice <alice@example.com>zBob <bob@example.com>)r¡   r›   r�   r8
  r9
  r:
  r1   r�  r¢   Nr¡   úmessage/rfc822r7   rû  rä  r   rå   )r¬   r   r>
  rD   ÚgetEnvelope)rG   r¦   r@
  rA
  r;
  r¡  rB
  r¿  r±   Ú	containerrC
  s              r4   Útest_rfc822MessageÚ(GetBodyStructureTests.test_rfc822Messageš  sù   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ3Ø-Ø(Ø'2Ø-5ñð ØØØØó
ˆô  !àÐ 0ðð ØØØØˆEó	
ˆ	ô ×*Ò*¨9Ó5ˆ	Ø×ÑàØØØØØØÜ×!Ò! #Ó&Ü×&Ò& sÓ+Øðð õ	
r7   c           	     ó  • [        SSSSS.SSSS	S
5      n[        SS0SSSSS
5      n[        SS0SSSSX/5      nU R                  [        R                  " U5      [        R                  " U5      S/[        R                  " U5      5        g
)zÎ
For a I{multipart/*} message, L{imap4.getBodyStructure} returns a list
containing the body structure information for each part of the message
followed by an element giving the MIME subtype of the message.
zimage/jpeg; x=yr2
  r3
  r4
  r7
  r1   r7   ó   hello worldr¢   Nr¡   ztext/plain; charset=us-asciió
   some stufféA  zmultipart/relatedé+  Úrelated©r¬   rD   r   r>
  ©rG   Ú
oneSubPartÚanotherSubPartrv
  s       r4   Útest_multiPartÚ$GetBodyStructureTests.test_multiPartÒ  sÇ   € ô "à 1Ø/Ø'6Ø-6ñ	ð ØØØØó
ˆ
ô &àÐ >ðð ØØØØó	
ˆô !àÐ 3ðð ØØØØÐ(ó	
ˆ	ð 	×Ñä×&Ò& zÓ2Ü×&Ò& ~Ó6Øðô
 ×"Ò" 9Ó-õ	
r7   c           	     ó.  • [        SSSSS.SSSS	S
5      n[        SS0SSSSS
5      n[        SSSSS.SSSSX/5      nU R                  [        R                  " USS9[        R                  " USS9SSS/SSS//SS/[        R                  " USS95        g
)a  
When passed a I{multipart/*} message and C{True} for the C{extended}
argument, L{imap4.getBodyStructure} includes extended structure
information from the parts of the multipart message and extended
structure information about the multipart message itself.
s   image/jpeg; x=ys   some kind of ids   great justices   maximum)ó   content-types
   content-ids   content-descriptions   content-transfer-encodingr1   r7   rz
  r¢   Nr†
  s   text/plain; charset=us-asciir{
  r|
  zmultipart/related; foo=barÚesÚSpainzattachment; name=monkeys)r¡   rd
  re
  rc
  r}
  Trf
  r~
  r}  r~  rh
  rB  Úmonkeysr
  r€
  s       r4   Útest_multiPartExtendedÚ,GetBodyStructureTests.test_multiPartExtended  sí   € ô "à!3Ø1Ø(8Ø.8ñ	ð ØØØØó
ˆ
ô &àÐ!@ðð ØØØØó	
ˆô !à <Ø$(Ø$+Ø'Añ	ð ØØØØÐ(ó
ˆ	ð 	×Ñä×&Ò& z¸DÑAÜ×&Ò& ~ÀÑEØØ˜�Ø ¨	Ð2Ð3ØØðô ×"Ò" 9°tÑ<õ	
r7   r1   N)r~   r   r€   r�   rd  rD
  rT
  r[
  rj
  rm
  rq
  rw
  rƒ
  rŠ
  r‚   r1   r7   r4   r,
  r,
  Ý  s9   † ñò&
òP*ò0
'ò/
òb
ò"&
òP6
òp1
õf9
r7   r,
  c                  ó6  • \ rS rSrS rS rS rS rS rS r	S/S jr
S	 rS/S
 jrS r\R                  " \R                   S5      r \R                  " \R                   S5        \R                  " \R                   \5        Sr\" \S5      S 5       rS/S jrS rS/S jrS rS/S jrS/S jrS rS/S jrS rS/S jrS r S r!S/S jr"S r#S/S  jr$S! r%S/S" jr&S# r'S$ r(S% r)S/S& jr*S' r+S/S( jr,S) r-S/S* jr.S+ r/S/S, jr0S- r1S.r2g! \R&                   a    Sr N”f = f)0ÚNewFetchTestsiA  c                ó  • S =U l         U l        S U l        [        R                  " 5       U l        SU R
                  l        X R
                  l        [        R                  " 5       U l
        [        U R                  5      U l        g r
  )r
  r
  r2   r   rU  rŠ  r÷  rÀ  r   r   rŒ  rg  r‹  rW   s    r4   rŽ  ÚNewFetchTests.setUpB  s]   € Ø59Ð9ˆÔ Ô!2ØˆŒä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆ�r7   c                ó   • g r0   r1   r
  s     r4   rË  ÚNewFetchTests.addListenerL  rë  r7   c                ó   • g r0   r1   r
  s     r4   rÍ  ÚNewFetchTests.removeListenerO  rë  r7   c           	     ó�   • Xl         X l        [        [        [	        [        U R                  5      5      U R                  5      5      $ r0   )r
  r
  Úiterr  rx   rî   ÚmsgObjsr  s      r4   r  ÚNewFetchTests.fetchR  s2   € Ø!)ÔØÔÜ”Cœœc $§,¡,Ó/Ó0°$·,±,Ó?Ó@Ð@r7   c                ó,  ^ ^• T(       ad  [        [        [        T R                  5      5      T R                  5       H.  u  p#[	        UR                  5       5      T R                  U   S'   M0     U 4S jnT R                  R                  U U4S j5      R                  U5      R                  T R                  5      R                  T R                  5        [        R                  " T R                  T R                  SS9nUR                  U 4S j5        U$ )Nrå  c                ó   >• U Tl         g r0   r
  r
  s    €r4   r2   Ú(NewFetchTests._fetchWork.<locals>.result\  r
  r7   c                ó<   >• TR                  TR                  T5      $ r0   ©r
  ru  )r»  rG   ræ  s    €€r4   r5   Ú*NewFetchTests._fetchWork.<locals>.<lambda>`  s   ø€ �d—m‘m D§M¡M°3Ô7r7   Fr!
  c                óP   >• TR                  TR                  TR                  5      $ r0   ©rD   r2   rŸ  )r‘  rG   s    €r4   r5   r�
  f  s   ø€  × 0Ñ 0°·±¸d¿m¹mÔ Lr7   )r  rx   rî   r–
  r  rñ  rŸ  rŒ  r¯   r•  r½  rš  r#   r$
  rŠ  r‹  )rG   ræ  r
  r±   r2   r²   s   ``    r4   Ú
_fetchWorkÚNewFetchTests._fetchWorkW  s¿   ù€ ÞÜœe¤C¨¯©Ó$5Ó6¸¿¹ÖE‘�Ü*-¨c¯j©j«lÓ*;�—‘˜aÑ  Ó'ñ Fõ	ð 	�‰×"Ñ"Ý7ó	
ç
‰+�fÓ
Ÿk™k¨$×*<Ñ*<Ó=¿j¹jØ�O‰Oô?
ô × Ò  §¡¨d¯k©kÀÑGˆØ	�‰ÔLÔMØˆr7   c           
     óÔ   ^ • U 4S jT l         ST l        [        0 SSSSS 5      [        0 SSSSS 5      [        0 SSSSS 5      /T l        SS	0SS
0SS0S.T l        T R                  S5      $ )Nc                ó:   >• TR                   R                  U 5      $ r0   ©r‹  r7	  )r  ÚurG   s     €r4   r5   Ú,NewFetchTests.testFetchUID.<locals>.<lambda>j  s   ø€  T§[¡[×%9Ñ%9¸!Ô%<r7   rG	  r1   r7   r‘  éç  éu'  rå  Ú12345Ú999Ú10101)r   rã   rç   r   )r
  ru  r¬   r–
  rŸ  r 
  rW   s   `r4   ÚtestFetchUIDÚNewFetchTests.testFetchUIDi  sƒ   ø€ Ü<ˆŒàˆŒä˜˜R  c¨5°$Ó7Ü˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7ð
ˆŒð �wÐØ�uˆ~Ø�wÐñ
ˆŒð
 �‰˜qÓ!Ð!r7   c           	     óÞ   • U R                   R                  U l        SU l        [	        0 / SQSSSS 5      [	        0 / SQSSSS 5      /U l        S/ SQ0S/ SQ0S.U l        U R                  U5      $ )	Nrj	  )ÚFlagAÚFlagBú\FlagCr7   é1Ô  )r±
  r¯
  r°
  r‘  r×  ©r   rã   )r‹  Ú
fetchFlagsr
  ru  r¬   r–
  rŸ  r 
  ©rG   ræ  s     r4   ÚtestFetchFlagsÚNewFetchTests.testFetchFlagsy  sw   € ØŸ™×.Ñ.ˆŒØˆŒä˜Ò:¸CÀÀeÈTÓRÜ˜Ò:¸CÀÀeÈTÓRð
ˆŒð
 Ò6Ð7ØÒ6Ð7ñ
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r¶
  rW   s    r4   ÚtestFetchFlagsUIDÚNewFetchTests.testFetchFlagsUID†  s   € Ø×"Ñ" 1Ó%Ð%r7   c                ó  • U R                   R                  U l        SU l        [	        0 SSSSS 5      [	        0 SSSSS 5      [	        0 SSSS	S 5      [	        0 SS
SSS 5      /U l        SS0SS0SS0SS0S.U l        U R                  U5      $ )NÚ13r1   s   Fri, 02 Nov 2003 21:25:10 GMTr7   iÀZ  s   Thu, 29 Dec 2013 11:31:52 ESTée   s   Mon, 10 Mar 1992 02:44:30 CSTéÊ   s   Sat, 11 Jan 2000 14:40:24 PSTi/  rÚ  z02-Nov-2003 21:25:10 +0000z29-Dec-2013 11:31:52 -0500z10-Mar-1992 02:44:30 -0600z11-Jan-2000 14:40:24 -0800)r   rã   rç   rå   )r‹  ÚfetchInternalDater
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchInternalDateÚ#NewFetchTests.testFetchInternalDate‰  s¯   € ØŸ™×5Ñ5ˆŒØˆŒä˜˜RÐ!AÀ3ÈÈtÓTÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRð	
ˆŒð Ð <Ð=ØÐ <Ð=ØÐ <Ð=ØÐ <Ð=ñ	
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )rÀ
  rW   s    r4   ÚtestFetchInternalDateUIDÚ&NewFetchTests.testFetchInternalDateUIDš  s   € Ø×)Ñ)¨!Ó,Ð,r7   Nú
es_AR.UTF8FTz'The es_AR.UTF8 locale is not installed.c                ó  • [         R                  " [         R                  S5      n[         R                  " [         R                  S5        U R                  [         R                  [         R                  U5        U R	                  S5      $ )z3
The month name in the date is locale independent.
NrÅ
  rã   )ÚlocaleÚ	setlocaleÚLC_ALLr  rÀ
  )rG   ÚcurrentLocales     r4   Ú'test_fetchInternalDateLocaleIndependentÚ5NewFetchTests.test_fetchInternalDateLocaleIndependent«  sY   € ô ×(Ò(¬¯©¸Ó=ˆÜ×ÒœŸ™¨Ô5Ø�‰œ×(Ñ(¬&¯-©-¸ÔGØ×)Ñ)¨!Ó,Ð,r7   c                óâ   • U R                   R                  U l        SU l        [	        SSSSSS.SS	S	S
S 5      /U l        SSSS/ SQ// SQ// SQ// SQ/S S S S/
00U l        U R                  U5      $ )NÚ15zuser@domainzresu@domainÚthursdayzit is a messagezid-id-id-yayaya)r›   r�   rü  rŸ   z
message-idr1   r7   ix  r   rÔ  )NNr$  Údomain)NNÚresurÐ
  )r‹  ÚfetchEnveloper
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchEnvelopeÚNewFetchTests.testFetchEnvelope¶  s¦   € ØŸ™×1Ñ1ˆŒØˆŒäà)Ø'Ø&Ø0Ø"3ñð ØØØØóð
ˆŒð" ØØØ%Ú3Ð4Ú3Ð4Ú3Ð4Ú3Ð4ØØØØ%ððð
ˆŒð  �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )rÓ
  rW   s    r4   ÚtestFetchEnvelopeUIDÚ"NewFetchTests.testFetchEnvelopeUIDÛ  s   € Ø×%Ñ% aÓ(Ð(r7   c                óà   • U R                   R                  U l        SU l        [	        SSSSSSSS	S
.SSSSS5      /U l        SSSS/ SQSSSSSSSSS//SS	/00U l        U R                  U5      $ )a+  
L{IMAP4Client.fetchBodyStructure} issues a I{FETCH BODYSTRUCTURE}
command and returns a Deferred which fires with a structure giving the
result of parsing the server's response.  The structure is a list
reflecting the parenthesized data sent by the server, as described by
RFC 3501, section 7.4.2.
ú3:9,10:*ú#text/plain; name=thing; key="value"úthis-is-the-content-idú!describing-the-content-goes-here!Ú8BITÚabcdef123456zattachment; filename=monkeysr‡
  zhttp://example.com/monkeysra
  r1   r�  ó   Body
Text
Goes
Here
éý Nr   rç  rH   Úplain©r   r¢  rB  ÚthingÚ20r_	  rh
  Úfilenamer‰
  ©r‹  ÚfetchBodyStructurer
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   Útest_fetchBodyStructureÚ%NewFetchTests.test_fetchBodyStructureÞ  sµ   € ð Ÿ™×6Ñ6ˆŒØ"ˆŒäà$IØ":Ø+NØ17Ø#1Ø+IØ(,Ø(Dñ	ð ØØ+ØØóð
ˆŒð( ØØØÚ5Ø,Ø7ØØØØ"Ø! J°	Ð#:Ð;ØØ0ð"ðð
ˆŒð$ �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ )zw
If passed C{True} for the C{uid} argument, C{fetchBodyStructure} can
also issue a I{UID FETCH BODYSTRUCTURE} command.
rã   )rè
  rW   s    r4   ÚtestFetchBodyStructureUIDÚ'NewFetchTests.testFetchBodyStructureUID  s   € ð
 ×+Ñ+¨AÓ.Ð.r7   c                ó  • U R                   R                  U l        SU l        [	        SSSSSSSS	S
.SSSSS5      n[	        SSSS.SSSSU/5      /U l        SSSS/ SQSSSSSSSS/SS	/SSS/SSS/00U l        U R                  U5      $ )z|
L{IMAP4Client.fetchBodyStructure} can also parse the response to a
I{FETCH BODYSTRUCTURE} command for a multipart message.
rÙ
  rÚ
  rÛ
  rÜ
  rÝ
  r_
  Ú123456abcdefÚinlinezouter space)r¡   r8
  r9
  r:
  rd
  rb
  rc
  re
  r1   r7   rß
  rà
  Nzmultipart/mixed; boundary="xyz"ÚenÚnearby)r¡   rd
  re
  r   rç  rH   rá
  râ
  rä
  r_	  ÚmixedÚboundaryÚxyzræ
  )rG   ræ  ÚinnerMessages      r4   Ú test_fetchBodyStructureMultipartÚ.NewFetchTests.test_fetchBodyStructureMultipart  sø   € ð
 Ÿ™×6Ñ6ˆŒØ"ˆŒÜ#à EØ6Ø'JØ-3Ø$(Ø-Ø'/Ø$1ñ	ð ØØ'ØØó
ˆô$ à$EØ(,Ø(0ñð
 ØØØØ�óð
ˆŒð ØàØÚ9Ø0Ø;ØØØØ&Ø! 4Ð(ØØ%ðð Ø Ð'ØØØð'"ðð
ˆŒð2 �‰˜sÓ#Ð#r7   c                óÐ   • U R                   R                  U l        SU l        [	        0 SSSS[	        SS0SSSS S 5      /5      /U l        S	S
/ SQ00U l        U R                  U5      $ )NÚ21r1   r7   ó   Yea whateveré±f r¡   ú	image/jpgó   Body Body Bodyr   r   ©NNNNNNÚ12©r‹  ÚfetchSimplifiedBodyr
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchSimplifiedBodyÚ%NewFetchTests.testFetchSimplifiedBodyW  s�   € ØŸ™×7Ñ7ˆŒØˆŒäØØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð& ˜VÒ%OÐPÐQˆŒà�‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r  rW   s    r4   ÚtestFetchSimplifiedBodyUIDÚ(NewFetchTests.testFetchSimplifiedBodyUIDq  s   € Ø×+Ñ+¨AÓ.Ð.r7   c                ó²   • U R                   R                  U l        SU l        [	        SS0SSSSS 5      /U l        SS	/ S
Q00U l        U R                  U5      $ )Nrù
  r¡   r    r1   r7   rú
  rû
  r   r   )rH   rá
  NNNNrÿ
  r  r   rµ
  s     r4   ÚtestFetchSimplifiedBodyTextÚ)NewFetchTests.testFetchSimplifiedBodyTextt  se   € ØŸ™×7Ñ7ˆŒØˆŒäØ Ð.°°C¸È%ÐQUóð
ˆŒð �ÒLÐMð
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r  rW   s    r4   ÚtestFetchSimplifiedBodyTextUIDÚ,NewFetchTests.testFetchSimplifiedBodyTextUID‚  s   € Ø×/Ñ/°Ó2Ð2r7   c                ó  • U R                   R                  U l        SU l        [	        SS0SSSS[	        SS0SS	S
S S 5      /5      /U l        SSSSS S S S SS S / SQ// SQ/S S S S S S /
/ SQS/
00U l        U R                  U5      $ )Nrù
  r¡   rt
  r1   r7   rú
  rû
  rü
  r�  rý
  r   r   rû  rä  rÿ
  ©NNN)r/
  ÚjpgNNNNÚ14r  r   rµ
  s     r4   ÚtestFetchSimplifiedBodyRFC822Ú+NewFetchTests.testFetchSimplifiedBodyRFC822…  s×   € ØŸ™×7Ñ7ˆŒØˆŒäØÐ!1Ð2ØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð( ØØØØØØØØàØÚ+Ð,Ú+Ð,ØØØØØØðò CØð+ðð
ˆŒð8 �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r  rW   s    r4   Ú testFetchSimplifiedBodyRFC822UIDÚ.NewFetchTests.testFetchSimplifiedBodyRFC822UID¹  s   € Ø×1Ñ1°!Ó4Ð4r7   c           	     ó2  • U R                   R                  U l        SU l        [	        SS0SSSSS5      [	        SS	0SSS
SS5      /n[	        SS0SSSSU5      n[	        SS0SSSSU/5      nU/U l        SS/ SQ/ SQS/S/00U l        U R                  S5      $ )a   
L{IMAP4Client.fetchSimplifiedBody} returns a dictionary mapping message
sequence numbers to fetch responses for the corresponding messages.  In
particular, for a multipart message, the value in the dictionary maps
the string C{"BODY"} to a list giving the body structure information for
that message, in the form of a list of subpart body structure
information followed by the subtype of the message (eg C{"alternative"}
for a I{multipart/alternative} message).  This structure is self-similar
in the case where a subpart is itself multipart.
rù
  r¡   r    r1   s   dates   Stuffr²
  NrÈ   s   ThingsiŸ~  rÑ   r7   s
   Irrelevantr‘  zmultipart/mixeds   RootOfiÍ� r   r   )rH   rá
  NNNNÚ5r  )rH   ÚhtmlNNNNrN	  r  Úalternativerò
  Fr   )rG   Úsinglesr  rò
  s       r4   Ú!test_fetchSimplifiedBodyMultipartÚ/NewFetchTests.test_fetchSimplifiedBodyMultipart¼  sï   € ð Ÿ™×7Ñ7ˆŒØˆŒô Ø Ð.°°G¸XÀuÈdóô Ø Ð-¨r°7¸IÀuÈdóð	
ˆô #ØÐ4Ð5ØØØØØó
ˆô àÐ.Ð/ØØØØØˆMó
ˆð �wˆŒð ØâKÚJØ%ðð
 ðð	ð
ˆŒð �‰˜uÓ%Ð%r7   c                ó®   • U R                   R                  U l        SU l        [	        SS0SSSSS 5      /U l        SS	S
00U l        U R                  U5      $ )Nz1,3,7,10101r
  ÚValuer1   r7   s   BODY TEXT
é[   r   rã  zHeader: Value

BODY TEXT
)r‹  rU  r
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchMessageÚNewFetchTests.testFetchMessageü  s^   € ØŸ™×0Ñ0ˆŒØ%ˆŒä˜( GÐ,¨b°#Ð7GÈÈTÓRð
ˆŒð ˜XÐ'KÐLÐMˆŒØ�‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r   rW   s    r4   ÚtestFetchMessageUIDÚ!NewFetchTests.testFetchMessageUID  ó   € Ø×$Ñ$ QÓ'Ð'r7   c                óô   • U R                   R                  U l        SU l        [	        SSS.SSSSS 5      /U l        [        [        R                  " SSS.5      5      nSS	U00U l	        U R                  U5      $ )
Nz9,6,2ÚV1ÚV2)ÚH1ÚH2r1   r7   éc   r   rÝ  )r‹  ÚfetchHeadersr
  ru  r¬   r–
  r(   r   rœ  rŸ  r 
  )rG   ræ  r°   s      r4   ÚtestFetchHeadersÚNewFetchTests.testFetchHeaders  s|   € ØŸ™×0Ñ0ˆŒØˆŒä ¨DÑ1°2°s¸CÀÀTÓJð
ˆŒô œu×3Ò3¸4ÀtÑ4LÓMÓNˆð � Ð)ð
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r-  rW   s    r4   ÚtestFetchHeadersUIDÚ!NewFetchTests.testFetchHeadersUID  r%  r7   c                ó®   • U R                   R                  U l        SU l        [	        SS0SSSSS 5      /U l        SS	S
00U l        U R                  U5      $ )Nz1,2,3,4,5,6,7r
  r  r1   r�  s   Body goes here
é«   r   rá  zBody goes here
)r‹  rC	  r
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchBodyÚNewFetchTests.testFetchBody  sc   € ØŸ™×-Ñ-ˆŒØ'ˆŒä˜( GÐ,¨b°"Ð6KÈSÐRVÓWð
ˆŒð �Ð3Ð4ð
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )r4  rW   s    r4   ÚtestFetchBodyUIDÚNewFetchTests.testFetchBodyUID$  ó   € Ø×!Ñ! !Ó$Ð$r7   c                óú  ^ • T R                   R                  T l        ST l        SnSnSn[	        5       nSUS'   SUS'   S	US
'   SUS'   [	        5       nSUS
'   SUS'   [	        5       nSUS
'   SUS'   [        USSUS[        USSUSS5      [        USSUSS5      /5      /T l        SSS/S//0T l        U 4S jnT R                  R                  U 4S j5        T R                  R                  U5        T R                  R                  T R                  5        T R                  R                  T R                  5        [        R                  " T R                  T R                   SS9nUR                  U 4S j5        U$ )zD
Test the server's handling of requests for specific body sections.
r  r�  r¶   rÆ   rš   r›   rœ   r�   rž   rŸ   r·   r¡   r¸   r    rÇ   rÈ   r1   Nr¢   r   r   z&Contained body message text.  Squarge.c                ó   >• U Tl         g r0   r
  r
  s    €r4   r2   Ú0NewFetchTests.testFetchBodyParts.<locals>.resultJ  r
  r7   c                ó8   >• TR                  TR                  SS9$ )Nrã   rR	  rœ
  rØ  s    €r4   r5   Ú2NewFetchTests.testFetchBodyParts.<locals>.<lambda>N  s   ø€ �d—m‘m D§M¡MÀ�mÑBr7   Fr!
  c                óP   >• TR                  TR                  TR                  5      $ r0   rŸ
  ©ÚignrG   s    €r4   r5   r>  U  ó   ø€  $×"2Ñ"2°4·;±;ÀÇÁÔ"Nr7   ©r‹  r~  r
  ru  r   r¬   r–
  rŸ  rŒ  r¯   r•  r½  rš  r#   r$
  rŠ  )	rG   rÁ   rÊ   rË   r°   rÂ   rÍ   r2   r²   s	   `        r4   ÚtestFetchBodyPartsÚ NewFetchTests.testFetchBodyParts'  s  ø€ ð Ÿ™×1Ñ1ˆŒØˆŒØˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%äØØØØØä  ¨r°4¸ÀTÈ4ÓPÜ  °°D¸*ÀdÈDÓQðó
ð
ˆŒð ˜f s eÐ-UÐVÐWÐXˆŒõ	ð 	�‰×"Ñ"ÜBô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ò  §¡¨d¯k©kÀÑGˆØ	�‰ÔNÔOØˆr7   c                óp  ^ ^• T R                   R                  T l        ST l        S/mSn[	        5       nSUS'   SUS'   SUS	'   S
US'   [        USSUSS5      /T l        SSS/S//0T l        U 4S jnT R                  R                  UU 4S j5        T R                  R                  U5        T R                  R                  T R                  5        T R                  R                  T R                  5        [        R                  " T R                  T R                   SS9nUR                  U 4S j5        U$ )zÏ
Single-part messages have an implicit first part which clients
should be able to retrieve explicitly.  Test that a client
requesting part 1 of a text/plain message receives the body of the
text/plain part.
r  rã   s   DA bodyrš   r›   rœ   r�   rž   rŸ   r    r¡   r1   Nr¢   r   r   zDA bodyc                ó   >• U Tl         g r0   r
  r
  s    €r4   r2   Ú>NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.resultl  r
  r7   c                ó8   >• TR                  TR                  TS9$ )NrR	  rœ
  )r»  ÚpartsrG   s    €€r4   r5   Ú@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>p  s   ø€ �d—m‘m D§M¡MÀ�mÑFr7   Fr!
  c                óP   >• TR                  TR                  TR                  5      $ r0   rŸ
  r@  s    €r4   r5   rK  w  rB  r7   rC  )rG   rÁ   r°   r2   r²   rJ  s   `    @r4   Ú test_fetchBodyPartOfNonMultipartÚ.NewFetchTests.test_fetchBodyPartOfNonMultipartX  s  ù€ ð Ÿ™×1Ñ1ˆŒØˆŒØ�ˆØˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�ÑÜ$ W¨b°$¸	À3ÈÓMÐNˆŒà˜f s e¨YÐ7Ð8Ð9ˆŒõ	ð 	�‰×"Ñ"ÝFô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ò  §¡¨d¯k©kÀÑGˆØ	�‰ÔNÔOØˆr7   c                óª   • U R                   R                  U l        SU l        [	        0 SSSSS 5      /U l        SSS00U l        U R                  U5      $ )	Nz	1:100,2:*r1   r7   s   xxxxxxxxxxxxxxxxxxxxr¢   r   rß  rä
  )r‹  Ú	fetchSizer
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchSizeÚNewFetchTests.testFetchSizez  s[   € ØŸ™×-Ñ-ˆŒØ#ˆŒä˜˜R  i°°dÓ;ð
ˆŒð �˜tÐ$ð
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )rQ  rW   s    r4   ÚtestFetchSizeUIDÚNewFetchTests.testFetchSizeUID…  r9  r7   c                ó.  • U R                   R                  U l        SU l        [	        0 SSSSS 5      [	        0 SSSS	S 5      /U l        / SQS
SS S / SQ// SQ/S S S S S S /
/ SQS./ SQSSS S / SQ// SQ/S S S S S S /
/ SQS.S.U l        U R                  U5      $ )Nz1,3)z\XYZz\YZXÚAbcs%   Sun, 25 Jul 2010 06:20:30 -0400 (EDT)s   xyzxyziŽ  )z\Onez\TwoÚThrees   Mon, 14 Apr 2003 19:43:44 -0400s   abcabcabcabcr}
  z25-Jul-2010 06:20:30 -0400rN	  r  )NNNNNNrN	  )r×  rÚ  rß  rÔ  r   z14-Apr-2003 19:43:44 -0400rÿ
  rþ
  r³
  )r‹  Ú	fetchFullr
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchFullÚNewFetchTests.testFetchFullˆ  sò   € ØŸ™×-Ñ-ˆŒØˆŒäØØ)Ø8ØØØóô ØØ+Ø2ØØØóð
ˆŒò( 3Ø <Ø"àØÚ'Ð(Ú'Ð(ØØØØØØðò Bñ!ò& 5Ø <Ø#àØÚ'Ð(Ú'Ð(ØØØØØØðò Cñ!ñ'%
ˆŒðL �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )rZ  rW   s    r4   ÚtestFetchFullUIDÚNewFetchTests.testFetchFullUIDÅ  r9  r7   c                ó  • U R                   R                  U l        SU l        [	        0 SSSSS 5      [	        0 SSSSS 5      /U l        S S / S	Q// S	Q/S S S S S S /
S
S/ S.S S / S	Q// S	Q/S S S S S S /
S
S/ S.S.U l        U R                  U5      $ )Nz1,2:3r1   s   Mon, 14 Apr 2003 19:43:44 +0400s   Lalalar¨
  s   Tue, 15 Apr 2003 19:43:44 +0200s   AlalaliêN  r  rN	  z14-Apr-2003 19:43:44 +0400)rÔ  rß  rÚ  r×  z15-Apr-2003 19:43:44 +0200r³
  )r‹  ÚfetchAllr
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchAllÚNewFetchTests.testFetchAllÈ  sâ   € ØŸ™×,Ñ,ˆŒØˆŒäØ�BÐ:¸IÀuÈdóô Ø�BÐ:¸IÀuÈdóð	
ˆŒð ØÚ'Ð(Ú'Ð(ØØØØØØðð  #Ø <Øñð& ØÚ'Ð(Ú'Ð(ØØØØØØðð  #Ø <Øññ%#
ˆŒðH �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )ra  rW   s    r4   ÚtestFetchAllUIDÚNewFetchTests.testFetchAllUIDù  s   € Ø× Ñ  Ó#Ð#r7   c                ó°   • U R                   R                  U l        SU l        [	        0 SSSSS 5      /U l        SS/SS	S
.0U l        U R                  U5      $ )Nr  )ú\Xs   19 Mar 2003 19:22:21 -0500r7   r  r   rg  z19-Mar-2003 19:22:21 -0500Ú0)r×  rÚ  rß  )r‹  Ú	fetchFastr
  ru  r¬   r–
  rŸ  r 
  rµ
  s     r4   ÚtestFetchFastÚNewFetchTests.testFetchFastü  se   € ØŸ™×-Ñ-ˆŒØˆŒä˜˜XÐ'DÀcÈ1ÈdÓSð
ˆŒð Ø˜Ø <Ø"ñð
ˆŒð �‰˜sÓ#Ð#r7   c                ó$   • U R                  S5      $ rÙ  )rj  rW   s    r4   ÚtestFetchFastUIDÚNewFetchTests.testFetchFastUID  r9  r7   )
r‹  rŒ  rŸ  r
  ru  r–
  r
  r
  r2   rŠ  r  )3r~   r   r€   r�   rŽ  rË  rÍ  r  r 
  r¬
  r¶
  r¹
  rÀ
  rÃ
  rÇ
  rÈ
  rÉ
  rÊ
  ÚnoEsARLocaleÚErrorr
   rË
  rÓ
  rÖ
  rè
  rë
  rö
  r  r  r  r  r  r  r  r   r#  r-  r0  r4  r7  rD  rM  rQ  rT  rZ  r]  ra  rd  rj  rm  r‚   r1   r7   r4   r�
  r�
  A  sL  † ò3òòòAò
ò$"ô $ò&ô$ò"-ð ×$Ò$ V§]¡]°DÓ9€MðØ×Ò˜Ÿ™¨Ô5ð 	×Ò˜Ÿ™¨Ô6ØˆáˆLÐCÓDñ-ó Eð-ô#$òJ)ô/$òb/ô?$ôB$ò4/ô$ò3ô2$òh5ò>&ô@$ò(ô$ò(ô	$ò%ò/òb ôD	$ò%ô;$òz%ô/$òb$ô$õ%øðM �<‰<ó ØŠðús   ÁD ÄDÄDr�
  c                  óx   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)ÚDefaultSearchTestsi  zn
Test the behavior of the server's SEARCH implementation, particularly in
the face of unhandled search terms.
c                ó†  • [         R                  " 5       U l        SU R                  l        X R                  l        [
        R                  " 5       U l        [        U R                  5      U l	        [        0 SSSSS 5      [        0 SSSSS 5      [        0 SSSSS 5      [        0 SSSSS 5      [        0 SSSSS 5      /U l        g )	NrH  r1   r7   r§
  r¨
  r‘  i!N  i"N  )r   rU  rŠ  r÷  rÀ  r   r   rŒ  rg  r‹  r¬   r–
  rW   s    r4   rŽ  ÚDefaultSearchTests.setUp  s©   € Ü×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆŒä˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7ð
ˆ�r7   c           
     ó€   • [        [        [        S[        U R                  5      S-   5      U R                  5      5      $ )zG
Pretend to be a mailbox and let C{self.server} lookup messages on me.
rã   )rï   r  rx   rî   r–
  r  s      r4   r  ÚDefaultSearchTests.fetch#  s/   € ô ”Cœ˜a¤ T§\¡\Ó!2°QÑ!6Ó7¸¿¹ÓFÓGÐGr7   c                ó  ^ ^^• UU 4S jnT R                   R                  [        U5      5      nUU 4S jnUR                  U5        UR                  T R                  5        UR	                  T R
                  5        T R                  5         U$ )aH  
Issue a search with given query and verify that the returned messages
match the given expected messages.

@param queryTerms: A string giving the search query.
@param expectedMessages: A list of the message sequence numbers
    expected as the result of the search.
@return: A L{Deferred} which fires when the test is complete.
c                 ó:   >• TR                   R                  T 5      $ r0   ©r‹  r	  ©Ú
queryTermsrG   s   €€r4   r	  Ú8DefaultSearchTests._messageSetSearchTest.<locals>.search4  rÒ  r7   c                ó*   >• TR                  U T5        g r0   rº  )rM  ÚexpectedMessagesrG   s    €€r4   ÚsearchedÚ:DefaultSearchTests._messageSetSearchTest.<locals>.searched9  s   ø€ Ø×Ñ˜WÐ&6Õ7r7   )rŒ  r¯   r8   r•  r½  rš  r#   )rG   r{  r~  r	  r²   r  s   ```   r4   Ú_messageSetSearchTestÚ(DefaultSearchTests._messageSetSearchTest)  se   ú€ ö	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆö	8ð 	
�‰�hÔØ	�‰�d×(Ñ(Ô)Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   c                ó(   • U R                  SS/5      $ )zp
Test that a search which starts with a message set properly limits
the search results to messages in that set.
r  rã   ©r�  rW   s    r4   Útest_searchMessageSetÚ(DefaultSearchTests.test_searchMessageSetB  s   € ð
 ×)Ñ)¨#°¨sÓ3Ð3r7   c                ó*   • U R                  S/ SQ5      $ )z^
If the search filter ends with a star, all the message from the
starting point are returned.
z2:*r6	  r„  rW   s    r4   Útest_searchMessageSetWithStarÚ0DefaultSearchTests.test_searchMessageSetWithStarI  ó   € ð
 ×)Ñ)¨%²Ó>Ð>r7   c                ó*   • U R                  S/ SQ5      $ )zs
If the search filter starts with a star, the result should be identical
with if the filter would end with a star.
z*:2r6	  r„  rW   s    r4   Ú"test_searchMessageSetWithStarFirstÚ5DefaultSearchTests.test_searchMessageSetWithStarFirstP  rŠ  r7   c                ó*   • U R                  S/ SQ5      $ )z}
If the search filter ends with a star, all the message from the
starting point are returned (also for the SEARCH UID case).
zUID 10000:*r6	  r„  rW   s    r4   Ú test_searchMessageSetUIDWithStarÚ3DefaultSearchTests.test_searchMessageSetUIDWithStarW  ó   € ð
 ×)Ñ)¨-ºÓFÐFr7   c                ó*   • U R                  S/ SQ5      $ )z’
If the search filter starts with a star, the result should be identical
with if the filter would end with a star (also for the SEARCH UID case).
zUID *:10000r6	  r„  rW   s    r4   Ú%test_searchMessageSetUIDWithStarFirstÚ8DefaultSearchTests.test_searchMessageSetUIDWithStarFirst^  r‘  r7   c                ó(   • U R                  SS/5      $ )zy
A search filter of 1234:* should include the UID of the last message in
the mailbox, even if its UID is less than 1234.
zUID 30000:*rè   r„  rW   s    r4   Ú,test_searchMessageSetUIDWithStarAndHighStartÚ?DefaultSearchTests.test_searchMessageSetUIDWithStarAndHighStarte  s   € ð ×)Ñ)¨-¸!¸Ó=Ð=r7   c                ó(   • U R                  SS/5      $ )z
If the search filter contains nesting terms, one of which includes a
message sequence set with a wildcard, IT ALL WORKS GOOD.
z(6:*)rè   r„  rW   s    r4   Útest_searchMessageSetWithListÚ0DefaultSearchTests.test_searchMessageSetWithListm  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r7   c                ó*   • U R                  SSS/5      $ )zj
If the search filter contains an I{OR} term, all messages
which match either subexpression are returned.
zOR 1 2rã   rç   r„  rW   s    r4   rÍ  Ú DefaultSearchTests.test_searchOrw  s   € ð
 ×)Ñ)¨(°Q¸°FÓ;Ð;r7   c                ó*   • U R                  S/ SQ5      $ )z¸
If the search filter contains an I{OR} term with a
subexpression which includes a message sequence set wildcard,
all messages in that set are considered for inclusion in the
results.
z
OR 2:* 2:*r6	  r„  rW   s    r4   Útest_searchOrMessageSetÚ*DefaultSearchTests.test_searchOrMessageSet~  s   € ð ×)Ñ)¨,ºÓEÐEr7   c                ó*   • U R                  S/ SQ5      $ )zn
If the search filter contains a I{NOT} term, all messages
which do not match the subexpression are returned.
zNOT 3)rã   rç   ré   rè   r„  rW   s    r4   rÑ  Ú!DefaultSearchTests.test_searchNot‡  s   € ð
 ×)Ñ)¨'²<Ó@Ð@r7   c                ó(   • U R                  SS/5      $ )z¶
If the search filter contains a I{NOT} term with a
subexpression which includes a message sequence set wildcard,
no messages in that set are considered for inclusion in the
result.
zNOT 2:*rã   r„  rW   s    r4   Útest_searchNotMessageSetÚ+DefaultSearchTests.test_searchNotMessageSetŽ  s   € ð ×)Ñ)¨)°a°SÓ9Ð9r7   c                ó(   • U R                  SS/5      $ )z©
If the search filter contains multiple terms implicitly
conjoined with a message sequence set wildcard, only the
intersection of the results of each term are returned.
z2:* 3rå   r„  rW   s    r4   Útest_searchAndMessageSetÚ+DefaultSearchTests.test_searchAndMessageSet—  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r7   c                ó(  ^ ^• SmUU 4S jnT R                   R                  [        U5      5      nT R                  U[        R
                  5      nU 4S jnUR                  U5        UR                  T R                  5        T R                  5         U$ )z«
If the search criteria is not a valid key, a NO result is returned to
the client (resulting in an error callback), and an IllegalQueryError is
logged on the server side.
ÚFOOc                 ó:   >• TR                   R                  T 5      $ r0   ry  rz  s   €€r4   r	  Ú=DefaultSearchTests.test_searchInvalidCriteria.<locals>.search§  rÒ  r7   c                óR  >• TR                   R                  R                  5         TR                  R                  R                  5         TR	                  [
        R                  5      nTR                  [        U5      S5        TR                  [        S5      [        U 5      5        g)ús
Verify that the server logs an IllegalQueryError and the
client raises an IMAP4Exception with 'Search failed:...'
rã   s)   SEARCH failed: Invalid search command FOON©
r‹  rv  rw  rŠ  r.  r   r|  rD   rî   r  ©rM  r³  rG   s     €r4   ÚerrorReceivedÚDDefaultSearchTests.test_searchInvalidCriteria.<locals>.errorReceived­  s}   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐ@ÓAÜ�G“õr7   ©	rŒ  r¯   r8   r½  r   r¡  r½  rš  r#   )rG   r	  r²   r°  r{  s   `   @r4   Útest_searchInvalidCriteriaÚ-DefaultSearchTests.test_searchInvalidCriteriaŸ  sr   ù€ ð ˆ
ö	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆõ	ð$ 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   )r‹  rŒ  r–
  rŠ  N)r~   r   r€   r�   rd  rŽ  r  r�  r…  rˆ  rŒ  r�  r“  r–  r™  rÍ  rž  rÑ  r£  r¦  r³  r‚   r1   r7   r4   rr  rr    s\   † ñò

òHòò24ò?ò?òGòGò>ò8ò<òFòAò:ò8õ#r7   rr  c                  óT   • \ rS rSrS rS rS r\rS rS r	S r
S rS	 rS
 rS rSrg)ÚFetchSearchStoreTestsiÅ  c                ó6  • S =U l         U l        S U l        S U l        S U l        S U l        [        R                  " 5       U l        SU R                  l	        X R                  l
        [        R                  " 5       U l        [        U R                  5      U l        g r
  )rŸ  r2   Úserver_received_queryÚserver_received_uidÚserver_received_partsÚserver_received_messagesr   rU  rŠ  r÷  rÀ  r   r   rŒ  rg  r‹  rW   s    r4   rŽ  ÚFetchSearchStoreTests.setUpÇ  st   € Ø&*Ð*ˆŒ˜œØ%)ˆÔ"Ø#'ˆÔ Ø%)ˆÔ"Ø(,ˆÔ%ä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆ�r7   c                ól   • US/:X  a  [         R                  " S5      eXl        X l        U R                  $ )NrB  z"FOO is not a valid search criteria)r   r|  r¸  r¹  rŸ  )rG   re  ræ  s      r4   r	  ÚFetchSearchStoreTests.searchÔ  s4   € à�V�HÓÜ×)Ò)Ð*NÓOÐOà%*Ô"Ø#&Ô Ø�}‰}Ðr7   c                ó   • g r0   r1   )rG   r±  r]  s      r4   rË  Ú!FetchSearchStoreTests.addListenerÝ  rë  r7   c                óp  ^ ^• U U4S jnU 4S jnT R                   R                  [        U5      5      R                  U5      R                  T R                  5      R	                  T R
                  5        U 4S jn[        R                  " T R                  T R                  SS9nUR                  U5        U$ )Nc                 óL   >• T R                   R                  T R                  TS9$ )Nr`  )r‹  r	  re  rµ
  s   €€r4   r	  Ú1FetchSearchStoreTests._searchWork.<locals>.searchã  s!   ø€ Ø—;‘;×%Ñ% d§j¡j°cÐ%Ð:Ð:r7   c                ó   >• U Tl         g r0   r
  r
  s    €r4   r2   Ú1FetchSearchStoreTests._searchWork.<locals>.resultæ  r
  r7   c                ó~  >• TR                  TR                  TR                  L 5        TR                  TR                  TR                  5        TR                  TR                  TR
                  5        TR                  [        R                  " TR                  R                  S5      5      TR                  5        g )NÚcharmap)r‰  r2   rŸ  rD   ræ  r¹  r   rÇ  re  rE   r¸  r
  s    €r4   rÉ  Ú0FetchSearchStoreTests._searchWork.<locals>.checkí  s†   ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñô ×'Ò'¨¯
©
×(9Ñ(9¸)Ó(DÓEØ×*Ñ*õ	r7   Fr!
  r#
  )rG   ræ  r	  r2   rÉ  r²   s   ``    r4   Ú_searchWorkÚ!FetchSearchStoreTests._searchWorkâ  s†   ù€ ö	;õ	ð 	�‰×"Ñ"¤5¨£=Ó1×=Ñ=¸fÓE×QÑQØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	ô × Ò  §¡¨d¯k©kÀÑGˆØ	�‰�eÔØˆr7   c                óÆ   • [         R                  " [         R                  " SS9[         R                  " SSS95      U l        / SQU l        SU l        U R                  S5      $ )N©rŸ   Ú	substring©r  é   é   ©r^  r\  )rã   ré   rè   rì   r   )r   rc  rb  re  rŸ  ræ  rÉ  rW   s    r4   Ú
testSearchÚ FetchSearchStoreTests.testSearchþ  sN   € Ü—X’XÜ�KŠKÐ7Ñ8Ü�KŠK˜t¨TÑ2ó
ˆŒ
ò %ˆŒØˆŒØ×Ñ Ó"Ð"r7   c                óÆ   • [         R                  " [         R                  " SS9[         R                  " SSS95      U l        SU l        / SQU l        U R                  S5      $ )NrÌ  rÎ  rÏ  rÐ  rÑ  rã   ræ   )r   rc  rb  re  ræ  rŸ  rÉ  rW   s    r4   ÚtestUIDSearchÚ#FetchSearchStoreTests.testUIDSearch  sN   € Ü—X’XÜ�KŠKÐ7Ñ8Ü�KŠK˜t¨TÑ2ó
ˆŒ
ð ˆŒÚ!ˆŒØ×Ñ Ó"Ð"r7   c                óŽ   •  U R                   U   S   $ ! [        [        4 a    U R                   US-
     s $ [         a     gf = f)Nrå  rã   rÖ  )rŸ  r÷   Ú
IndexErrorÚKeyError©rG   r±   s     r4   rñ  ÚFetchSearchStoreTests.getUID  sM   € ð	Ø—=‘= Ñ% eÑ,Ð,øÜœ:Ð&ó 	*Ø—=‘=  q¡Ñ)Ò)Üó 	Ùð	ús   ‚ ”"A¸	AÁAc                óF   • X l         [        U5      U l        U R                  $ r0   )r¹  r  r»  rŸ  r  s      r4   r  ÚFetchSearchStoreTests.fetch  s   € Ø#&Ô Ü(+¨H«ˆÔ%Ø�}‰}Ðr7   c                ó`  ^ • U 4S jnT R                   R                  [        U5      5      R                  U5      R                  T R                  5      R	                  T R
                  5        U 4S jn[        R                  " T R                  T R                  SS9nUR                  U5        U$ )Nc                ó   >• U Tl         g r0   r
  r
  s    €r4   r2   Ú0FetchSearchStoreTests._fetchWork.<locals>.result  r
  r7   c                ó  >• TR                  TR                  TR                  L 5        TR                  =(       a    TR                  R	                  5         TR
                  =(       a    TR
                  R	                  5         TR                  (       a1  TR                  R                  5        H  u  p[        U5      US'   M     TR                  TR                  TR                  5        TR                  TR                  TR                  5        TR                  TR                  TR
                  5        TR                  [        R                  " TR                  5      [        R                  " TR                  5      5        g )Nrå  )r‰  r2   rŸ  rJ  rú  rº  ræ  r  r  rD   r¹  r   r  ru  r»  )rù  ÚkÚvrG   s      €r4   rÉ  Ú/FetchSearchStoreTests._fetchWork.<locals>.check%  s  ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à�J‰J×,˜4Ÿ:™:Ÿ?™?Ó,øØ×&Ñ&×L¨4×+EÑ+E×+JÑ+JÓ+Løà�x�xØ ŸM™M×/Ñ/Ö1‘D�AÜ" 1›v�A�e“Hñ 2ð ×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñ˜TŸZ™Z¨×)CÑ)CÔDØ×ÑÜ×!Ò! $§-¡-Ó0Ü×!Ò! $×"?Ñ"?Ó@õr7   Fr!
  r#
  )rG   r  r2   rÉ  r²   s   `    r4   r 
  Ú FetchSearchStoreTests._fetchWork  s�   ø€ õ	ð 	�‰×"Ñ"¤5¨£<Ó0×<Ñ<¸VÓD×PÑPØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	ô& × Ò  §¡¨d¯k©kÀÑGˆØ	�‰�eÔØˆr7   c                ó(  ^ ^• SmUU 4S jnT R                   R                  [        U5      5      nT R                  U[        R
                  5      nU 4S jnUR                  U5        UR                  T R                  5        T R                  5         U$ )zÅ
If, as part of a search, an ISearchableMailbox raises an
IllegalQueryError (e.g. due to invalid search criteria), client sees a
failure response, and an IllegalQueryError is logged on the server.
r©  c                 ó:   >• TR                   R                  T 5      $ r0   ry  )re  rG   s   €€r4   r	  Ú6FetchSearchStoreTests.test_invalidTerm.<locals>.searchD  s   ø€ Ø—;‘;×%Ñ% eÓ,Ð,r7   c                óR  >• TR                   R                  R                  5         TR                  R                  R                  5         TR	                  [
        R                  5      nTR                  [        U5      S5        TR                  [        S5      [        U 5      5        g)r­  rã   s1   SEARCH failed: FOO is not a valid search criteriaNr®  r¯  s     €r4   r°  Ú=FetchSearchStoreTests.test_invalidTerm.<locals>.errorReceivedJ  s|   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐHÓIÌ3ÈwË<õr7   r²  )rG   r	  r²   r°  re  s   `   @r4   Útest_invalidTermÚ&FetchSearchStoreTests.test_invalidTerm<  sr   ù€ ð ˆö	-ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆõ	ð" 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   )r‹  rŒ  rŸ  re  r2   rŠ  r»  rº  r¸  r¹  ræ  N)r~   r   r€   r�   rŽ  r	  rË  rÍ  rÉ  rÒ  rÕ  rñ  r  r 
  rë  r‚   r1   r7   r4   r¶  r¶  Å  s;   † ò3òòð !€Nòò8#ò#òòò
õ>"r7   r¶  c                  ó    • \ rS rSrS rS rSrg)ÚFakeMailboxia  c                ó   • / U l         g r0   ©r\  rW   s    r4   rˆ   ÚFakeMailbox.__init__b  ó	   € Øˆ�	r7   c                óh   • U R                   R                  XU45        [        R                  " S 5      $ r0   )r\  r‹   r   r�  )rG   r¦   rÙ  rü  s       r4   rý  ÚFakeMailbox.addMessagee  s(   € Ø�	‰	×Ñ˜$ tÐ,Ô-Ü�}Š}˜TÓ"Ð"r7   rð  N)r~   r   r€   r�   rˆ   rý  r‚   r1   r7   r4   rî  rî  a  s   † òõ#r7   rî  c                  ó&   • \ rS rSrS rS rS rSrg)ÚFeaturefulMessageij  c                ó   • g)NrÙ  r1   rW   s    r4   rÒ  ÚFeaturefulMessage.getFlagsl  s   € Ør7   c                ó   • g)NrÜ  r1   rW   s    r4   rð	  Ú!FeaturefulMessage.getInternalDateo  s   € Ør7   c                ó   • [        S5      $ )Nó   openr   rW   s    r4   r�  ÚFeaturefulMessage.openr  s   € Ü�wÓÐr7   r1   N)r~   r   r€   r�   rÒ  rð	  r�  r‚   r1   r7   r4   rö  rö  j  s   † òòõ r7   rö  c                  ó    • \ rS rSrS rS rSrg)ÚMessageCopierMailboxiv  c                ó   • / U l         g r0   ©ÚmsgsrW   s    r4   rˆ   ÚMessageCopierMailbox.__init__x  rò  r7   c                ób   • U R                   R                  U5        [        U R                   5      $ r0   )r  r‹   rî   rÚ  s     r4   rÎ	  ÚMessageCopierMailbox.copy{  s"   € Ø�	‰	×Ñ˜ÔÜ�4—9‘9‹~Ðr7   r  N)r~   r   r€   r�   rˆ   rÎ	  r‚   r1   r7   r4   rÿ  rÿ  v  s   † òõr7   rÿ  c                  ó&   • \ rS rSrS rS rS rSrg)ÚCopyWorkerTestsi€  c                óò   ^ ^• [         R                  " 5       nUR                  n[        5       mU" [	        SS5       Vs/ s H  o3[        5       4PM     snST5      nUU 4S jnUR                  U5      $ s  snf )Nrã   rž  r  c                ó"  >• TR                    HP  nTR                  US   R                  5       S5        TR                  US   S5        TR                  US   S5        MR     U  H(  u  p#TR                  U5        TR                  US 5        M*     g )Nr   rü  rã   rÙ  rç   rÜ  )r\  rD   r]   r‹  )rM  r±  rm  r2   r  rG   s       €€r4   ÚcbCopyÚ5CopyWorkerTests.testFeaturefulMessage.<locals>.cbCopy‘  s}   ø€ Ø—V”V�Ø× Ñ   1¡§¡£¨gÔ6Ø× Ñ   1¡ wÔ/Ø× Ñ   1¡ ~Ö6ñ ó
 #*‘�Ø—‘ Ô'Ø× Ñ  ¨Ö.ò #*r7   )r   rU  Ú_IMAP4Server__cbCopyrî  rx   rö  r¯   )rG   r´  r3   r
  r²   r
  r  s   `     @r4   ÚtestFeaturefulMessageÚ%CopyWorkerTests.testFeaturefulMessage�  sj   ù€ Ü×ÒÓˆð ×"Ñ"ˆä‹MˆÙ´°q¸"´Ó>²¨AÔ$Ó&Ó'±Ñ>ÀÀqÓIˆö	/ð �}‰}˜VÓ$Ð$ùò ?s   ¾A4c                ót  ^ ^• [         R                  " 5       nUR                  n[        5       m[	        SS5       Vs/ s H%  n[        S[        U5      0SSSU4-  US-   S 5      PM'     nnU" [        [	        SS5      U5       Vs/ s H  oUPM     snST5      nUU 4S	 jnUR                  U5      $ s  snf s  snf )
Nrã   rž  zHeader-Counterr1   ó   Dates   Body %dr  r  c                óž  >• / nTR                    HO  nUR                  US   R                  5       5        TR                  US   S5        TR                  US   S5        MQ     UR	                  5         [        S [        SS5       5       5      nTR                  X5        U  H(  u  pETR                  U5        TR                  US 5        M*     g )Nr   rã   r1   rç   r  c              3  ó.   #   • U  H  nS X4-  v •  M     g7f)s   Header-Counter: %d

Body %dNr1   rZ  s     r4   r\  ÚJCopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy.<locals>.<genexpr>´  s   é € ð ÚGSÀ!Ð4¸°vÖ=Â|ùs   ‚rž  )r\  r‹   r]   rD   rú  r�  rx   r‹  )rM  Úseenr±  Úexprm  r2   r  rG   s         €€r4   r
  Ú7CopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy¬  sµ   ø€ ØˆDØ—V”V�Ø—‘˜A˜a™DŸI™I›KÔ(Ø× Ñ   1¡ rÔ*Ø× Ñ   1¡ wÖ/ñ ð
 �I‰IŒKÜñ ÜGLÈQÐPRÄ|óó ˆCð ×Ñ˜TÔ'ã")‘�Ø—‘ Ô'Ø× Ñ  ¨Ö.ò #*r7   )	r   rU  r  rî  rx   r¬   r  r  r¯   )	rG   r´  r3   r
  r  Úimr²   r
  r  s	   `       @r4   ÚtestUnfeaturefulMessageÚ'CopyWorkerTests.testUnfeaturefulMessage�  sÇ   ù€ Ü×ÒÓˆð ×"Ñ"ˆä‹Mˆô
 ˜1˜b”\ó	
ò "�ô Ø!¤3 q£6Ð*¨B°¸ÀqÀdÑ9JÈAÐPRÉFÐTXöñ "ð	 	ð 
ñ œC¤ a¨£¨dÔ3Ó4Ò3�bŠrÑ3Ñ4°e¸QÓ?ˆö	/ð" �}‰}˜VÓ$Ð$ùò3
ùò 5s   ¼,B0ÂB5c                óJ  ^ ^^• [         R                  " 5       nUR                  n[        5       m[	        SS5       Vs/ s H  n[        5       PM     snmU" [        [	        SS5      T5       Vs/ s H  oDPM     snST5      nUUU 4S jnUR                  U5      $ s  snf s  snf )Nrã   rž  s   tagc                óÌ   >• TR                  U [        [        S/S-  [        SS5      5      5      5        [        TTR                  5       H  u  pTR                  X5        M     g )Nrã   r  rž  )rD   rï   r  rx   r  r¤   )rM  ÚorigrY  r  r  rG   s      €€€r4   r
  Ú1CopyWorkerTests.testMessageCopier.<locals>.cbCopyÉ  sP   ø€ Ø×Ñ˜W¤d¬3°¨s°R©x¼¸qÀ"»Ó+FÓ&GÔHÜ   q§v¡vÖ.‘	�Ø×$Ñ$ TÖ/ò /r7   )r   rU  r  rÿ  rx   Úobjectr  r¯   )	rG   r´  r3   r
  r  r²   r
  r  r  s	   `      @@r4   ÚtestMessageCopierÚ!CopyWorkerTests.testMessageCopier¿  sŒ   ú€ Ü×ÒÓˆð ×"Ñ"ˆä Ó"ˆÜ"'¨¨2¤,Ó/¢,˜Q”–¡,Ñ/ˆÙœC¤ a¨£¨dÔ3Ó4Ò3�bŠrÑ3Ñ4°f¸aÓ@ˆ÷	0ð
 �}‰}˜VÓ$Ð$ùò 0ùÚ4s   ½BÁ.B r1   N)r~   r   r€   r�   r  r  r  r‚   r1   r7   r4   r  r  €  s   † ò%ò8 %õD%r7   r  zOpenSSL not presentzReactor doesn't support SSLc                  ó”   • \ rS rSrSrSr\(       a  \" 5       r\(       a  \" 5       rS rS r	S r
S rS rSS jrS	 rS
 rS rS rSrg)ÚTLSTestsiÑ  Nc                óV   • [         R                  " U R                  U R                  SS9$ )NFr!
  )r#   r$
  rŠ  r‹  rW   s    r4   r#   ÚTLSTests.loopbackÛ  s   € Ü×#Ò# D§K¡K°·±ÀEÑJÐJr7   c                óÌ  ^ ^	^
• [         R                  R                  S5        / m	U	U 4S jnU	U 4S jnU	U 4S jnU	U 4S jnU	U 4S jnST R                  l        XX4U/m
T
 H'  nT R
                  R                  [        U5      5        M)     T R
                  R                  T R                  T R                  5        U	U
U 4S jnT R                  5       nUR                  U5        U$ )	Nr’  c                 ó^   >• T R                  S 5        TR                  R                  SS5      $ rê  )r‹   r‹  rë  ©ÚcalledrG   s   €€r4   rë  Ú)TLSTests.testAPileOfThings.<locals>.loginâ  s'   ø€ Ø�M‰M˜$ÔØ—;‘;×$Ñ$ [Ð2BÓCÐCr7   c                 ó^   >• T R                  S 5        TR                  R                  SS5      $ )Nr’  ó   %)r‹   r‹  rï   r'  s   €€r4   rï   Ú(TLSTests.testAPileOfThings.<locals>.listæ  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×#Ñ# H¨dÓ3Ð3r7   c                 ó^   >• T R                  S 5        TR                  R                  SS5      $ )Nr’  rµ  )r‹   r‹  rm  r'  s   €€r4   rm  Ú*TLSTests.testAPileOfThings.<locals>.statusê  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ% h°	Ó:Ð:r7   c                 ó\   >• T R                  S 5        TR                  R                  S5      $ )Nr’  )r‹   r‹  r�  r'  s   €€r4   r�  Ú+TLSTests.testAPileOfThings.<locals>.examineî  s$   ø€ Ø�M‰M˜$ÔØ—;‘;×&Ñ& xÓ0Ð0r7   c                 óZ   >• T R                  S 5        TR                  R                  5       $ r0   )r‹   r‹  rÕ  r'  s   €€r4   rÕ  Ú*TLSTests.testAPileOfThings.<locals>.logoutò  s"   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ%Ó'Ð'r7   Tc                óæ   >• TR                  TR                  R                  S5        TR                  TR                  R                  S5        TR                  [	        T5      [	        T5      5        g r  )rD   rŠ  Ú
startedTLSr‹  rî   )rù  r(  ÚmethodsrG   s    €€€r4   rÉ  Ú)TLSTests.testAPileOfThings.<locals>.checkþ  sO   ø€ Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×ÑœS ›[¬#¨g«,Õ7r7   )rO  re  rl  r‹  ÚrequireTransportSecurityrŒ  r¯   r8   r©  r•  rš  r#   )rG   rë  rï   rm  r�  rÕ  rÊ  rÉ  r²   r(  r5  s   `        @@r4   ÚtestAPileOfThingsÚTLSTests.testAPileOfThingsÞ  s³   ú€ Ü×Ñ×*Ñ*¨8Ô4Øˆö	Dö	4ö	;ö	1ö	(ð 04ˆ�‰Ô,à °Ð8ˆÛˆFØ�N‰N×&Ñ&¤u¨V£}Ö5ñ ð 	�‰×#Ñ# D×$6Ñ$6¸¿¹ÔH÷	8ð
 �M‰M‹OˆØ	�‰�eÔØˆr7   c                óþ  ^ ^• T R                   R                  R                  SS5        / mT R                  R	                  [
        R                  " S5      5        T R                  R                  U 4S j5      R                  U 4S j5      R                  TR                  5      R                  T R                  5      R                  T R                  5        T R                  5       nUR                  U U4S j5        U$ )NrP  rT  c                ó:   >• TR                   R                  S5      $ )NrT  r&  rØ  s    €r4   r5   Ú)TLSTests.testLoginLogin.<locals>.<lambda>  s   ø€ �d—k‘k×.Ñ.Ð/?Ô@r7   c                ó8   >• TR                   R                  5       $ r0   )r‹  rÕ  rØ  s    €r4   r5   r<    s   ø€  §¡× 2Ñ 2Ô 4r7   c                ó:   >• TR                  [        T5      S5      $ rÙ  )rD   rî   ©r‘  rG   Úsuccesss    €€r4   r5   r<    s   ø€  × 0Ñ 0´°W³¸qÔ Ar7   )rŠ  rX  rW  r‹  r,  r   r+  rŒ  r¯   r‹   r•  r½  rš  r#   )rG   r²   r@  s   ` @r4   ÚtestLoginLoginÚTLSTests.testLoginLogin  s³   ù€ Ø�‰×Ñ×#Ñ# KÐ1AÔBØˆØ�‰×)Ñ)¬%×*BÒ*BÀ;Ó*OÔPØ�‰×"Ñ"Ü@ó	
ç
‰+Ô4Ó
5·k±kØ�N‰Nó7
ç
‰+Ø×Ñó
ç
‰*Ø�O‰Oô
ð �M‰M‹OˆØ	�‰ÕAÔBØˆr7   c                ó–  ^ ^• / mT R                   R                  [        T R                  R                  5      5        U 4S jnT R                   R                  U5        T R                   R                  TR
                  5        T R                  5       nUR                  U U4S j5        [        R                  " UT R                   /5      $ )zÄ
Begin a C{STARTTLS} sequence and assert that it results in a
TLS session.

@return: A L{Deferred} that fires when the underlying
    connection between the client and server has been terminated.
c                óŠ   >• TR                  [        R                  R                  TR                  R
                  5      5        g r0   )r‹  r   ÚISSLTransportÚ
providedByr‹  rv  r
  s    €r4   ÚcheckSecureÚ6TLSTests.startTLSAndAssertSession.<locals>.checkSecure$  s*   ø€ Ø�O‰OœJ×4Ñ4×?Ñ?ÀÇÁ×@UÑ@UÓVÕWr7   c                ó&   >• TR                  T5      $ r0   )r‹  r?  s    €€r4   r5   Ú3TLSTests.startTLSAndAssertSession.<locals>.<lambda>+  s   ø€  §¡°Ô 8r7   )	rŒ  r¯   r8   r‹  ÚstartTLSr‹   r#   r   r¾  )rG   rG  r²   r@  s   `  @r4   ÚstartTLSAndAssertSessionÚ!TLSTests.startTLSAndAssertSession  s�   ù€ ð ˆØ�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?õ	Xð 	�‰×"Ñ" ;Ô/Ø�‰×"Ñ" 7§>¡>Ô2à�M‰M‹OˆØ	�‰Õ8Ô9Ü×"Ò" A t§~¡~Ð#6Ó7Ð7r7   c                óº   • U R                  5       nU R                  R                  U R                  5        U R                  R	                  U R
                  5        U$ )zŠ
L{IMAP4Client.startTLS} triggers TLS negotiation and returns a
L{Deferred} which fires after the client's transport is using
encryption.
)rL  rŒ  r¯   r•  r½  rš  ©rG   Údisconnecteds     r4   Útest_startTLSÚTLSTests.test_startTLS.  sF   € ð ×4Ñ4Ó6ˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr7   c                ó&  • U R                  U R                  R                  5        SU R                  l        U R                  5       nU R                  R                  U R                  5        U R                  R                  U R                  5        U$ )zL
L{IMAPClient.startTLS} supplies a default TLS context if none is
supplied.
N)	ÚassertIsNotNoner‹  ÚcontextrL  rŒ  r¯   r•  r½  rš  rO  s     r4   Útest_startTLSDefaultÚTLSTests.test_startTLSDefault9  sj   € ð
 	×Ñ˜TŸ[™[×0Ñ0Ô1Ø"ˆ�‰ÔØ)-×)FÑ)FÓ)HˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr7   c                óÔ  •  " S S[         5      nU" U R                  U R                  S9U l        U R	                  5       nU R                  R                  [        U R                  R                  5      5        U R                  R                  U R                  S5        U R                  R                  U R                  5        U R                  R                  U R                  5        U$ )zE
A server that receives a second C{STARTTLS} sends a C{NO}
response.
c                  ó   • \ rS rSrS rSrg)Ú:TLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClientiK  c                ó˜   • U R                   (       d  [        R                  U 5      $ U R                  [        R
                  " S5      5      $ )Ns   STARTTLS)r4  rg  rK  r¤  r   ri  rW   s    r4   rK  ÚCTLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClient.startTLSL  s4   € Ø——Ü'×0Ñ0°Ó6Ð6à×'Ñ'¬¯ª°kÓ(BÓCÐCr7   r1   N)r~   r   r€   r�   rK  r‚   r1   r7   r4   ÚDoubleSTARTTLSClientrZ  K  s   † õDr7   r]  r‰  s   TLS already negotiated)rg  rŒ  r‡  r‹  rL  r¯   r8   rK  r½  r£  r•  rš  )rG   r]  rP  s      r4   Útest_doubleSTARTTLSÚTLSTests.test_doubleSTARTTLSE  s°   € ô	D¤<ô 	Dñ +Ø�N‰N¨4¯>©>ñ
ˆŒð ×4Ñ4Ó6ˆà�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?Ø�‰×!Ñ!Ø×+Ñ+Ð-Fô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr7   c                óÞ  ^ • [         R                  [         R                  S.T R                  l        [
        R                  U 4S j5       nT R                  R                  [        U5      5        T R                  5       nT R                  R                  [        U5      5        T R                  R                  T R                  5        T R                  R                  T R                  5        U$ )z�
Starting a TLS negotiation with an L{IMAP4Server} that already
has C{LOGIN} and C{PLAIN} L{IChallengeResponse} factories uses
those factories.
)r5  rÏ  c               3  ó¾   >#   • TR                   R                  5       v •n TR                  SU 5        TR                  SU S   5        TR                  SU S   5        g 7f)NrÈ  r5  rÏ  )r‹  r±  rB  r1  s    €r4   ÚassertLOGINandPLAINÚJTLSTests.test_startTLSWithExistingChallengers.<locals>.assertLOGINandPLAINm  sO   øé € à!%§¡×!<Ñ!<Ó!>Ñ>ˆLØ�M‰M˜' <Ô0Ø�M‰M˜( L°Ñ$9Ô:Ø�M‰M˜( L°Ñ$9Õ:ùs   ƒAA)r   r*  r³  rŠ  rÌ  r   r•  rŒ  r¯   r8   rL  r•  r½  rš  )rG   rb  rP  s   `  r4   Ú$test_startTLSWithExistingChallengersÚ-TLSTests.test_startTLSWithExistingChallengersb  s³   ø€ ô ×,Ñ,Ü×,Ñ,ñ#
ˆ�‰Ôô
 
×	Ñ	ô	;ó 
ð	;ð 	�‰×"Ñ"¤5Ð)<Ó#=Ô>à×4Ñ4Ó6ˆà�‰×"Ñ"¤5Ð)<Ó#=Ô>à�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr7   c                ó¦  ^ • S T R                   l        T R                  R                  U 4S j5        T R                  R	                  T R
                  S5        T R                  R                  T R                  5        T R                  R	                  T R                  5        [        R                  " T R                  5       T R                  /5      $ )zd
A client that attempts to log in before issuing the
C{STARTTLS} command receives a C{NO} response.
c                 ó2   • [         R                  " / S45      $ )NzOK Begin TLS negotiation now)r   r�  r1   r7   r4   r5   Ú3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>…  s   € ¤u§}¢}ØÐ/Ð0ô(
r7   c                ó<   >• TR                   R                  SS5      $ )Ns   wrongs   timer)  rØ  s    €r4   r5   rh  ‰  s   ø€ �d—k‘k×'Ñ'¨°'Ô:r7   s!   LOGIN is disabled before STARTTLS)r‹  rK  rŒ  r¯   r½  r£  r•  rš  r   r¾  r#   rW   s   `r4   Útest_loginBeforeSTARTTLSÚ!TLSTests.test_loginBeforeSTARTTLS  s˜   ø€ ñ 
ˆ�‰Ôð 	�‰×"Ñ"Ü:ô	
ð 	�‰×!Ñ!Ø×+Ñ+Ø0ô	
ð
 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä×"Ò" D§M¡M£O°T·^±^Ð#DÓEÐEr7   c                ó¨  ^ ^• / mU 4S jnT R                   R                  U5        T R                   R                  U 4S j5        T R                   R                  U4S j5        T R                   R                  T R                  5        T R                   R                  T R                  5        UU 4S jnT R                  5       R                  U5      $ )Nc                ó(   >• STR                   l        g r  )rŠ  ÚcanStartTLSr@  s    €r4   ÚbreakServerTLSÚ3TLSTests.testFailedStartTLS.<locals>.breakServerTLS™  s   ø€ Ø&+ˆD�K‰KÕ#r7   c                ó8   >• TR                   R                  5       $ r0   )r‹  rK  r@  s    €r4   r5   Ú-TLSTests.testFailedStartTLS.<locals>.<lambda>�  s   ø€ ¨t¯{©{×/CÑ/CÔ/Er7   c                ó`   >• TR                  U R                  [        R                  5      5      $ r0   )r‹   r   r   r¡  )r™  rÄ  s    €r4   r5   rr  Ÿ  s   ø€ ˜Ÿ™¨¯©´×1EÑ1EÓ(FÔGr7   c                ón   >• TR                  T5        TR                  TS   [        R                  5        g r¡  )r‹  r¤   r   r¡  )rù  rÄ  rG   s    €€r4   rÉ  Ú*TLSTests.testFailedStartTLS.<locals>.check¤  s)   ø€ Ø�O‰O˜HÔ%Ø× Ñ  ¨!¡¬e×.BÑ.BÕCr7   )rŒ  r¯   r½  r•  rš  r#   )rG   ro  rÉ  rÄ  s   `  @r4   ÚtestFailedStartTLSÚTLSTests.testFailedStartTLS–  s˜   ù€ Øˆõ	,ð 	�‰×"Ñ" >Ô2Ø�‰×"Ñ"Ô#EÔFØ�‰×!Ñ!ÜGô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ö	Dð �}‰}‹×*Ñ*¨5Ó1Ð1r7   )r‹  )ÚreturnzDeferred[object])r~   r   r€   r�   r†  r‡  r-   r,   r#   r8  rA  rL  rQ  rV  r^  rd  rj  rv  r‚   r1   r7   r4   r"  r"  Ñ  sY   † ð €IØ€IÞÙ$Ó&ˆ	ÞÙ$Ó&ˆ	òKò'òRò$8ò*	ô
òò:ò:Fõ.2r7   r"  c                  ó&   • \ rS rSrSrSrSrS rSrg)ÚSlowMailboxi«  rç   Nc                ó´   • [         R                  " 5       nU R                  U R                  UR                  S5        U R
                  R	                  S 5        U$ )Nr1   )r   r   Ú	callLaterÚhowSlowro  ÚfetchDeferred)rG   ru  ræ  r²   s       r4   r  ÚSlowMailbox.fetch²  s?   € Ü�NŠNÓˆØ�‰�t—|‘| Q§Z¡Z°Ô4Ø×Ñ×#Ñ# DÔ)Øˆr7   r1   )	r~   r   r€   r�   r}  r|  r~  r  r‚   r1   r7   r4   rz  rz  «  s   † Ø€GØ€IØ€Mõr7   rz  c                  ó8   • \ rS rSrS rS rS rS rS rS r	Sr
g	)
ÚTimeoutTestsi¹  c                óŠ  ^ ^^• [        5       mST R                  l        ST R                  l        TR
                  T R                  l        ST l        UU U4S jnU 4S jmT R                  R                  [        U5      5      nUR                  T R                  5        [        R                  " UT R                  5       /5      $ )zc
The *client* has a timeout mechanism which will close connections that
are inactive for a period.
Trè   Nc                 ó„   >• TR                   R                  SS5      n TR                  S5        U R                  T5        U $ )NrP  rT  rè   )r‹  rë  Úadvancer½  )r²   r§   rG   ÚtimedOuts    €€€r4   rë  Ú.TimeoutTests.test_serverTimeout.<locals>.loginÅ  s6   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�aŒLØ�L‰L˜Ô"ØˆHr7   c                óh   >• TR                  S 5        U R                  " [        R                  5        g r0   )r•  r   r   ÚTimeoutErrorr¢  s    €r4   r…  Ú1TimeoutTests.test_serverTimeout.<locals>.timedOutË  s#   ø€ Ø×Ñ˜tÔ$Ø�LŠLœ×+Ñ+Õ,r7   )r   rŠ  r[  r‹  râ	  r|  rg  rŒ  r¯   r8   r½  rš  r   r¾  r#   )rG   rë  r²   r§   r…  s   `  @@r4   Útest_serverTimeoutÚTimeoutTests.test_serverTimeoutº  sŒ   ú€ ô
 ‹GˆØ"&ˆ�‰ÔØˆ�‰ÔØ !§¡ˆ�‰ÔØ ˆÔ÷	õ	-ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰�T—_‘_Ô%Ü×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó2  ^ ^• [        5       mTR                  T R                  l        U 4S jnUU 4S jnT R                  R	                  [        U5      5      nUR	                  [        U5      5        [        R                  " UT R                  5       /5      $ )z$
The server times out a connection.
c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú/TimeoutTests.test_serverTimesOut.<locals>.loginÚ  r+  r7   c                 óV   >• T R                  TR                  R                  S-  5        g ©Nrç   ©r„  rŠ  ÚPOSTAUTH_TIMEOUT©r§   rG   s   €€r4   Ú
expireTimeÚ4TimeoutTests.test_serverTimesOut.<locals>.expireTimeÝ  ó   ø€ Ø�I‰I�d—k‘k×2Ñ2°QÑ6Õ7r7   )	r   r|  rŠ  rŒ  r¯   r8   r   r¾  r#   )rG   rë  r”  r²   r§   s   `   @r4   Útest_serverTimesOutÚ TimeoutTests.test_serverTimesOutÓ  sp   ù€ ô ‹GˆØ !§¡ˆ�‰Ôõ	Dö	8ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜JÓ'Ô(ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó  ^ ^^• T R                  [        R                  S[        5        [        R                  R	                  S5        [        R                  R
                  S   mT R                  [        R                  " T5      5        [        5       mTR                  T R                  l
        U 4S jnU 4S jnUU 4S jnUU 4S jnU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR                  [        U5      5        UR                  [        U5      5        UR                  [        U5      5        [        R                   " UT R#                  5       /5      $ )	zF
The server unsets the selected mailbox when timing out a
connection.
rA  úmailbox-testúMAILBOX-TESTc                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú7TimeoutTests.test_serverUnselectsMailbox.<locals>.loginõ  r+  r7   c                 ó:   >• T R                   R                  S5      $ ©Nrš  rt  rW   s   €r4   rH  Ú8TimeoutTests.test_serverUnselectsMailbox.<locals>.selectø  rv  r7   c                 óR   >• TR                  T TR                  R                  5        g r0   )rH
  rŠ  rÀ  ©rÀ  rG   s   €€r4   Ú	assertSetÚ;TimeoutTests.test_serverUnselectsMailbox.<locals>.assertSetû  s   ø€ Ø�M‰M˜$ §¡× 0Ñ 0Õ1r7   c                 óV   >• T R                  TR                  R                  S-  5        g r�  r‘  r“  s   €€r4   r”  Ú<TimeoutTests.test_serverUnselectsMailbox.<locals>.expireTimeþ  r–  r7   c                 óP   >• T R                  T R                  R                  5        g r0   )r‰  rŠ  rÀ  rW   s   €r4   ÚassertUnsetÚ=TimeoutTests.test_serverUnselectsMailbox.<locals>.assertUnset  s   ø€ Ø×Ñ˜TŸ[™[×-Ñ-Õ.r7   )rÇ  rO  re  r  rl  r„  r‰  r"   rF  r   r|  rŠ  rŒ  r¯   r8   r   r¾  r#   )	rG   rë  rH  r£  r”  r¨  r²   r§   rÀ  s	   `      @@r4   Útest_serverUnselectsMailboxÚ(TimeoutTests.test_serverUnselectsMailboxè  s  ú€ ð
 	�
‰
”<×*Ñ*Ð,<Ô>PÔQÜ×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Ñ@ˆØ×ÑÔ.×9Ò9¸$Ó?Ô@ä‹GˆØ !§¡ˆ�‰Ôõ	Dõ	6ö	2ö	8õ	/ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜IÓ&Ô'Ø	�‰”e˜JÓ'Ô(Ø	�‰”e˜KÓ(Ô)ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó�  ^ ^^• [         R                  R                  S5        [         R                  R                  S   m[	        [
        T5        [        5       mTR                  T R                  l        U 4S jnU 4S jnUU 4S jnUU 4S jnUU 4S jnT R                  R                  [        U5      5      nUR                  [        U5      5        UR                  [        U5      5        UR                  [        U5      5        UR                  [        U5      5        [        R                  " UT R                  5       /5      $ )zQ
The server closes the selected, closeable mailbox when timing
out a connection.
rš  r›  c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú?TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.login  r+  r7   c                 ó:   >• T R                   R                  S5      $ rŸ  rt  rW   s   €r4   rH  Ú@TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.select  rv  r7   c                 ó<   >• TR                  T R                  5        g r0   )r‰  r	  r¢  s   €€r4   ÚassertMailboxOpenÚKTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxOpen!  s   ø€ Ø×Ñ˜TŸ[™[Õ)r7   c                 óV   >• T R                  TR                  R                  S-  5        g r�  r‘  r“  s   €€r4   r”  ÚDTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.expireTime$  r–  r7   c                 ó<   >• TR                  T R                  5        g r0   )r‹  r	  r¢  s   €€r4   ÚassertMailboxClosedÚMTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxClosed'  s   ø€ Ø�O‰O˜DŸK™KÕ(r7   )rO  re  rl  r„  r   r"   r   r|  rŠ  rŒ  r¯   r8   r   r¾  r#   )	rG   rë  rH  r²  r”  r·  r²   r§   rÀ  s	   `      @@r4   Ú#test_serverTimesOutAndClosesMailboxÚ0TimeoutTests.test_serverTimesOutAndClosesMailbox  sè   ú€ ô
 	×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Ñ@ˆÜÔ*¨DÔ1ä‹GˆØ !§¡ˆ�‰Ôõ	Dõ	6ö	*ö	8ö	)ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”eÐ-Ó.Ô/Ø	�‰”e˜JÓ'Ô(Ø	�‰”eÐ/Ó0Ô1ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                óv  ^ ^• [        5       mTR                  [        l        [        R                  " 5       [        l        TR                  T R                  l        [        [        R                  l	        [        R                  R                  S5        T R                  R                  S5        U 4S jnU 4S jnU 4S jnU 4S jnU4S jn[        R
                  R                  U5        T R                  R                  [        U5      5      nUR                  [        U5      5        UR                  [        U5      5        UR                  [        U5      5        UR                  T R                  5        UR!                  T R"                  5        [        R$                  " UT R'                  5       /5      nU$ )z=
The connection timeout does not take effect during fetches.
rš  rã   c                 ó<   >• T R                   R                  SS5      $ rê  r)  rW   s   €r4   rë  Ú7TimeoutTests.test_longFetchDoesntTimeout.<locals>.loginB  r+  r7   c                 óp   >• T R                   R                  S5        T R                  R                  S5      $ )Nrã   rš  )rŠ  Ú
setTimeoutr‹  rH  rW   s   €r4   rH  Ú8TimeoutTests.test_longFetchDoesntTimeout.<locals>.selectE  s*   ø€ Ø�K‰K×"Ñ" 1Ô%Ø—;‘;×%Ñ% nÓ5Ð5r7   c                 ó:   >• T R                   R                  S5      $ )Nr  r¤
  rW   s   €r4   r  Ú7TimeoutTests.test_longFetchDoesntTimeout.<locals>.fetchI  s   ø€ Ø—;‘;×'Ñ'¨Ó.Ð.r7   c                 óR   >• T R                  T R                  R                  S5        g )Nrâ	  )rí   rŠ  r÷  rW   s   €r4   ÚstillConnectedÚ@TimeoutTests.test_longFetchDoesntTimeout.<locals>.stillConnectedL  s   ø€ Ø×Ñ §¡× 1Ñ 1°9Õ=r7   c                óL   >• [        S5       H  nTR                  S5        M     g )Nré   g      à?)rx   r„  )rù  r
  r§   s     €r4   Ú	cbAdvanceÚ;TimeoutTests.test_longFetchDoesntTimeout.<locals>.cbAdvanceO  s   ø€ Ü˜1–X�Ø—	‘	˜#–ò r7   )r   r|  rz  r   r   r~  rŠ  rO  re  rA  rl  r¿  r¯   rŒ  r8   r•  r½  rš  r¾  r#   )	rG   rë  rH  r  rÄ  rÇ  r¿  r²   r§   s	   `       @r4   Útest_longFetchDoesntTimeoutÚ(TimeoutTests.test_longFetchDoesntTimeout5  s&  ù€ ô ‹GˆØ !§¡ŒÔÜ$)§N¢NÓ$4ŒÔ!Ø !§¡ˆ�‰ÔÜ1<Œ×ÑÔ.Ü×Ñ×*Ñ*¨>Ô:à�‰×Ñ˜qÔ!õ	Dõ	6õ	/õ	>õ	ô 	×!Ñ!×-Ñ-¨iÔ8à�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰”u˜U“|Ô$Ø
�‰”u˜^Ó,Ô-Ø
�‰�t×)Ñ)Ô*Ø
�‰�d—o‘oÔ&Ü×Ò  T§]¡]£_Ð 5Ó6ˆØˆr7   c                ó  ^^• [        5       n[        5       nU R                  Ul        UR                  U R                  l        U R                  R                  U5        / mU R                  R                  mUU4S jU R                  l        UR                  S/U R                  R                  S-  /S-  -   5        U R                  TT5        UR                  SU R                  R                  S-  /5        U R                  T5        g)zc
The *server* has a timeout mechanism which will close connections that
are inactive for a period.
c                ó<   >• TR                  S 5      T" U 5      4S   $ rÙ  )r‹   )ÚreasonÚconnLostÚlosts    €€r4   r5   Ú<TimeoutTests.test_idleClientDoesDisconnect.<locals>.<lambda>m  s&   ø€ Ø�K‰K˜ÓÙ�VÓð5
ð ò5r7   g        g      @rç   g       @N)r   r   rŠ  r*  r|  rí  rò  ÚpumpÚtimeOutr‰  r‹  )rG   r§   rv  rÎ  rÏ  s      @@r4   Útest_idleClientDoesDisconnectÚ*TimeoutTests.test_idleClientDoesDisconnect^  sÐ   ù€ ô
 ‹Gˆä4Ó6ˆ	Ø!Ÿ[™[ˆ	ÔØ !§¡ˆ�‰ÔØ�‰×"Ñ" 9Ô-ð ˆØ—;‘;×-Ñ-ˆõ&ˆ�‰Ô"ð 	
�‰�ˆu˜Ÿ™×+Ñ+¨cÑ1Ð2°QÑ6Ñ6Ô7Ø×Ñ˜˜tÔ$ð 	
�‰��T—[‘[×(Ñ(¨3Ñ.Ð/Ô0Ø�‰˜Õr7   )rg  N)r~   r   r€   r�   rŠ  r—  rª  r¹  rÉ  rÓ  r‚   r1   r7   r4   r�  r�  ¹  s#   † ò9ò29ò*%9òN$9òL'õRr7   r�  c                  ó   • \ rS rSrS rSrg)ÚDisconnectionTestsi{  c                ó  • [         R                  " 5       n[        5       nUR                  U5        U R	                  UR                  SS5      [        R                  5      nUR                  [        R                  " S5      5        U$ )NrP  zexample.comúConnection closed)	r   ri  r   rí  r½  rë  r   ró  rò  )rG   r§   Útr²   s       r4   Ú"testClientDisconnectFailsDeferredsÚ5DisconnectionTests.testClientDisconnectFailsDeferreds|  sm   € Ü×ÒÓˆÜ,Ó.ˆØ	×Ñ˜ÔØ×ÑØ�G‰G�K Ó/´×1EÑ1Eó
ˆð 	
×Ñœ×-Ò-Ð.AÓBÔCØˆr7   r1   N)r~   r   r€   r�   rÚ  r‚   r1   r7   r4   rÖ  rÖ  {  s   † õr7   rÖ  c                  ó$   • \ rS rSrSrS rS rSrg)ÚSynchronousMailboxi‡  zV
Trivial, in-memory mailbox implementation which can produce a message
synchronously.
c                ó   • Xl         g r0   rt  )rG   ru  s     r4   rˆ   ÚSynchronousMailbox.__init__�  s   € Ø �r7   c              #  ód   #   • U(       a   S5       eU H  nX0R                   US-
     4v •  M     g 7f)NzCannot handle uid requests.rã   rt  )rG   r¾  ræ  r±   s       r4   r  ÚSynchronousMailbox.fetch�  s3   é € ÞÐ5Ð5Ó5ˆwÛˆCØ—}‘} S¨1¡WÑ-Ð-Ô-ò ùs   ‚.0rt  N)r~   r   r€   r�   rd  rˆ   r  r‚   r1   r7   r4   rÝ  rÝ  ‡  s   † ñò
!õ.r7   rÝ  c            
      ó�   • \ rS rSrSr\" 0 / SSSS5      \" 0 / SSSS5      \" 0 / SSSS5      /rS rS	 rS
 4S jr	S r
S rS rSrg)ÚPipeliningTestsi–  zE
Tests for various aspects of the IMAP4 server's pipelining support.
r7   r˜  Nrœ  ó   2c                óh  • / U l         [        5       U l        [        R                  " S S U R
                  5      U l        U R                  R                  U R                  5        [        U R                  5      nSU R                  l
        XR                  l        U R                  R                  5         g r
  )Ú	iteratorsr   rv  r   rU  ÚiterateInReactorrŠ  rí  rÝ  ru  r÷  rÀ  rî  )rG   r]  s     r4   rŽ  ÚPipeliningTests.setUp¡  s}   € ØˆŒä(Ó*ˆŒÜ×'Ò'¨¨d°D×4IÑ4IÓJˆŒØ�‰×"Ñ" 4§>¡>Ô2ä$ T§]¡]Ó3ˆð %ˆ�‰ÔØ"�‰Ôð 	�‰×ÑÕr7   c                óh   • [         R                  " 5       nU R                  R                  X45        U$ )z 
A fake L{imap4.iterateInReactor} that records the iterators it
receives.

@param iterator: An iterator.

@return: A L{Deferred} associated with this iterator.
)r   r   ræ  r‹   )rG   Úiteratorr²   s      r4   rç  Ú PipeliningTests.iterateInReactor±  s)   € ô �NŠNÓˆØ�‰×Ñ˜x˜mÔ,Øˆr7   c                 ó   • gr  r1   r1   r7   r4   r5   ÚPipeliningTests.<lambda>¾  s   € ¨Dr7   c                óÊ  • U R                   (       aÒ  U" 5       (       aÅ  U R                   S   S    Ha  nU R                  R                  (       d  M   U R                  R                  R                  5         U R                  R                  (       a  MA  Mc     U R                   R	                  S5      S   R                  S5        U R                   (       a  U" 5       (       a  MÃ  gggg)aN  
Advance pending iterators enqueued with L{iterateInReactor} in
a round-robin fashion, resuming the transport's producer until
it has completed.  This ensures bodies are flushed.

@param asLongAs: (optional) An optional predicate function.
    Flushing iterators continues as long as there are
    iterators and this returns L{True}.
r   rã   N)ræ  rv  Úproducerr�   rZ  ro  )rG   ÚasLongAsÚes      r4   ÚflushPendingÚPipeliningTests.flushPending¾  sš   € ð �n�n¡§¡Ø—^‘^ AÑ& qÔ)�Ø—n‘n×-×-Ñ-Ø—N‘N×+Ñ+×;Ñ;Ô=ð —n‘n×-×-Ó-ñ *ð —‘×"Ñ" 1Ó% aÑ(×1Ñ1°$Ô7ð �n�n¡§¤ˆn ˆnr7   c                óˆ   • U R                   R                  [        R                  " [        R
                  " 5       5      5        g r0   rñ  rW   s    r4   r‘  ÚPipeliningTests.tearDownÏ  rõ  r7   c                óR  • U R                   R                  S5        U R                  5         U R                  U R                  R                  5       SR                  S[        S[        U R                  S   R                  5       R                  5       5      < 35      S[        S[        U R                  S   R                  5       R                  5       5      < 35      S	[        S
[        U R                  S   R                  5       R                  5       5      < 35      /5      5        g)zh
Test that pipelined FETCH commands which can be responded to
synchronously are responded to correctly.
s9   01 FETCH 1 BODY[]
02 FETCH 2 BODY[]
03 FETCH 3 BODY[]
r7   ó   * 1 FETCH (BODY[] )
ú 01 OK FETCH completed
{5}


r   ó   * 2 FETCH (BODY[] )
z 02 OK FETCH completed
{5}


rã   s   * 3 FETCH (BODY[] )
z 03 OK FETCH completed
{5}


rç   N)rŠ  r  rò  rD   rv  r¢  r¥   r)   r(   ru  rô	  r]   rW   s    r4   Útest_synchronousFetchÚ%PipeliningTests.test_synchronousFetchÒ  sö   € ð 	�‰× Ñ ØVô	
ð 	×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hà.Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð /Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð /Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóðóõ	
r7   c                óf  • U R                   R                  S5        [        R                  " [        [        / SQ5      5      nU R                  US9  U R                  U R                  R                  5       SR                  S[        S[        U R                  S   R                  5       R                  5       5      < 35      /5      5        U R                  R!                  5         U R                   R#                  SS	9  U R%                  U R                  R                  5       5        U R                  5         U R                  U R                  R                  5       SR                  S
S[        S[        U R                  S   R                  5       R                  5       5      < 35      /5      5        g)z~
When a server status change occurs during an ongoing FETCH
command, the server status is buffered until the FETCH
completes.
s   01 FETCH 1,2 BODY[]
)TTF)rð  r7   r÷  z	{5}


r   T)rx  rù  s   * [READ-WRITE]
rø  rã   N)rŠ  r  Ú	functoolsÚpartialÚnextr•
  rò  rD   rv  r¢  r¥   r)   r(   ru  rô	  r]   rî  rt  r‰  )rG   Útwices     r4   Útest_bufferedServerStatusÚ)PipeliningTests.test_bufferedServerStatusõ  sa  € ð 	�‰× Ñ Ð!;Ô<ô ×!Ò!¤$¬Ò-@Ó(AÓBˆØ×Ñ 5ÐÑ)à×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /å!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð	ó
ô	
ð 	�‰×ÑÔð 	�‰×Ñ¨$ÐÑ/ð 	×Ñ˜Ÿ™×-Ñ-Ó/Ô0à×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /à)å!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð
óõ	
r7   )ræ  rŠ  rv  )r~   r   r€   r�   rd  r¬   ru  rŽ  rç  rò  r‘  rú  r  r‚   r1   r7   r4   rã  rã  –  sk   † ññ
 	�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3ð€Hòò ñ %1ô 8ò"Lò!
õF5
r7   rã  c                  ó$   • \ rS rSrSrS rS rSrg)ÚIMAP4ServerFetchTestsi-  zJ
This test case is for the FETCH tests that require
a C{StringTransport}.
c                óÂ   • [        5       U l        [        R                  " 5       U l        SU R                  l        U R                  R                  U R                  5        g r
  )r   rv  r   rU  rŠ  r÷  rí  rW   s    r4   rŽ  ÚIMAP4ServerFetchTests.setUp3  s>   € Ü(Ó*ˆŒÜ×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰×"Ñ" 4§>¡>Õ2r7   c                óX  • U R                   R                  5         U R                  R                  S5        SnU R	                  U R                   R                  5       U5        U R                   R                  5         U R                  R                  [        R                  " S5      5        g)zà
If by any chance, extra bytes got appended at the end of a valid
FETCH arguments, the client should get a BAD - arguments invalid
response.

See U{RFC 3501<http://tools.ietf.org/html/rfc3501#section-6.4.5>},
section 6.4.5,
s   0001 FETCH 1 FULLL
s+   0001 BAD Illegal syntax: Invalid Argument
rØ  N)	rv  rî  rŠ  r  rD   r¢  rò  r   ró  )rG   rŸ  s     r4   Ú"test_fetchWithPartialValidArgumentÚ8IMAP4ServerFetchTests.test_fetchWithPartialValidArgument9  sw   € ð 	�‰×ÑÔà�‰× Ñ Ð!:Ô;ØCˆØ×Ñ˜Ÿ™×-Ñ-Ó/°Ô:Ø�‰×ÑÔØ�‰×"Ñ"¤5×#7Ò#7Ð8KÓ#LÕMr7   r§  N)r~   r   r€   r�   rd  rŽ  r  r‚   r1   r7   r4   r  r  -  s   † ñò
3õNr7   r  c                  ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚLiteralTestsMixiniL  z{
Shared tests for literal classes.

@ivar literalFactory: A callable that returns instances of the
    literal under test.
c                ó8   • [         R                  " 5       U l        g)z
Shared setup.
N)r   r   rj  rW   s    r4   rŽ  ÚLiteralTestsMixin.setUpT  s   € ô ŸšÓ(ˆ�r7   c                ó´   • U R                  SU R                  5      nU R                  SUR                  S5      5        U R	                  U R                  5        g)zM
The literal returns L{None} when given less data than the
literal requires.
rÏ  Ns
   incomplete)ÚliteralFactoryrj  rH
  rc   ÚassertNoResult)rG   Úliterals     r4   Útest_partialWriteÚ#LiteralTestsMixin.test_partialWriteZ  sC   € ð
 ×%Ñ% d¨D¯M©MÓ:ˆØ�‰�d˜GŸM™M¨-Ó8Ô9Ø×Ñ˜DŸM™MÕ*r7   c                óø   • SnU R                  [        U5      U R                  5      nUR                  U5      nU R	                  U[
        5        U R                  U5        U R                  U R                  5        g)zb
The literal returns an empty L{bytes} instance when given
exactly the data the literal requires.
ó   completeN)r  rî   rj  rc   r  rO   r‰  r  ©rG   Údatar  Úleftovers       r4   Útest_exactWriteÚ!LiteralTestsMixin.test_exactWritec  sa   € ð
 ˆØ×%Ñ%¤c¨$£i°·±Ó?ˆØ—=‘= Ó&ˆà×Ñ˜h¬Ô.Ø×Ñ˜Ô"Ø×Ñ˜DŸM™MÕ*r7   c                ó˜   • SnU R                  [        S5      U R                  5      nUR                  U5      nU R	                  US5        g)z\
The literal returns any left over L{bytes} when given more
data than the literal requires.
s   completeleftoverr  ó   leftoverN)r  rî   rj  rc   rD   r  s       r4   Útest_overlongWriteÚ$LiteralTestsMixin.test_overlongWritep  sB   € ð
 #ˆØ×%Ñ%¤c¨+Ó&6¸¿¹ÓFˆà—=‘= Ó&ˆà×Ñ˜ ;Õ/r7   c                ó„   • U R                  SU R                  5      nSnUR                  U5      nU R                  X25        g)zW
The literal returns an empty L{bytes} instance
when given an empty L{bytes} instance.
r   r  N)r  rj  rc   rD   )rG   r  r  r  s       r4   Útest_emptyLiteralÚ#LiteralTestsMixin.test_emptyLiteral|  s;   € ð
 ×%Ñ% a¨¯©Ó7ˆØˆà—=‘= Ó&ˆà×Ñ˜Õ(r7   )rj  N)r~   r   r€   r�   rd  rŽ  r  r  r  r   r‚   r1   r7   r4   r  r  L  s    † ñò)ò+ò+ò
0õ
)r7   r  c                  ó6   • \ rS rSrSr\R                  rS rSr	g)ÚLiteralStringTestsi‰  z#
Tests for L{self.literalFactory}.
c                ó$  • SnSn[         R                  " [        U5      U R                  5      n[	        U5       H  nUR                  U5        M     UR                  S5        U R                  U R                  5      nU R                  XQU45        g)z¹
Calling L{imap4.LiteralString.callback} with a line fires the
instance's L{Deferred} with a 2-L{tuple} whose first element
is the collected data and whose second is the provided line.
ó   datarh  N)	r   ÚLiteralStringrî   rj  r'   rc   ro  rÔ  rD   )rG   r  Úextrar  r§   r2   s         r4   Útest_callbackÚ LiteralStringTests.test_callback�  sx   € ð ˆØˆä×%Ò%¤c¨$£i°·±Ó?ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñ˜¨ Õ/r7   r1   N)
r~   r   r€   r�   rd  r   r&  r  r(  r‚   r1   r7   r4   r#  r#  ‰  s   † ñð ×(Ñ(€Nõ0r7   r#  c                  ó<   • \ rS rSrSr\R                  rS rS r	Sr
g)ÚLiteralFileTestsi¤  z!
Tests for L{imap4.LiteralFile}.
c                ó|  • SnSn[         R                  " [        U5      U R                  5      n[	        U5       H  nUR                  U5        M     UR                  S5        U R                  U R                  5      nU R                  [        U5      S5        Uu  pbU R                  UR                  5       S5        g)z­
Calling L{imap4.LiteralFile.callback} with a line fires the
instance's L{Deferred} with a 2-L{tuple} whose first element
is the file and whose second is the provided line.
r%  rh  rç   N)
r   ÚLiteralFilerî   rj  r'   rc   ro  rÔ  rD   r]   ©rG   r  r'  r  r§   r2   ÚdataFiles          r4   r(  ÚLiteralFileTests.test_callback«  s—   € ð ˆØˆä×#Ò#¤C¨£I¨t¯}©}Ó=ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆØ×Ñ˜Ÿ™›¨'Õ2r7   c                ó¾  • SnSnU R                  [        R                  SS5        [        R                  " [        U5      U R                  5      n[        U5       H  nUR                  U5        M     UR                  S5        U R                  U R                  5      nU R                  [        U5      S5        Uu  pbU R                  UR                  5       S5        g)a  
A L{imap4.LiteralFile} whose size exceeds the maximum
in-memory size spools its content to disk, and invoking its
L{callback} with a line fires the instance's L{Deferred} with
a 2-L{tuple} whose first element is the spooled file and whose second
is the provided line.
r%  rh  Ú_memoryFileLimitrã   rç   N)rÇ  r   r-  rî   rj  r'   rc   ro  rÔ  rD   r]   r.  s          r4   Útest_callbackSpooledToDiskÚ+LiteralFileTests.test_callbackSpooledToDiskÁ  s®   € ð ˆØˆà�
‰
”5×$Ñ$Ð&8¸!Ô<ä×#Ò#¤C¨£I¨t¯}©}Ó=ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆØ×Ñ˜Ÿ™›¨'Õ2r7   r1   N)r~   r   r€   r�   rd  r   r-  r  r(  r3  r‚   r1   r7   r4   r+  r+  ¤  s   † ñð ×&Ñ&€Nò3õ,3r7   r+  c                  ó<   • \ rS rSrSrS rS rS rS rS r	S r
S	rg
)ÚWriteBufferTestsiÜ  z!
Tests for L{imap4.WriteBuffer}.
c                ó"   • [        5       U l        g r0   )r   rv  rW   s    r4   rŽ  ÚWriteBufferTests.setUpá  s   € Ü(Ó*ˆ�r7   c                óÖ   • [         R                  " U R                  5      nSUR                  -  nUR	                  U5        U R                  U R                  R                  5       5        g)zL
L{imap4.WriteBuffer} buffers writes that are smaller than its
buffer size.
ó   xN)r   ÚWriteBufferrv  Ú
bufferSizerc   r‰  r¢  ©rG   Úbufr  s      r4   r  Ú"WriteBufferTests.test_partialWriteä  sL   € ô
 ×Ò §¡Ó/ˆØ�c—n‘nÑ$ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Õ0r7   c                óÞ   • [         R                  " U R                  5      nSUR                  S-   -  nUR	                  U5        U R                  U R                  R                  5       U5        g)zq
L{imap4.WriteBuffer} writes data without buffering it when
the size of the data exceeds the size of its buffer.
r:  rã   N)r   r;  rv  r<  rc   rD   r¢  r=  s      r4   r  Ú#WriteBufferTests.test_overlongWriteð  sS   € ô
 ×Ò §¡Ó/ˆØ�s—~‘~¨Ñ)Ñ*ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/°Õ6r7   c                óT  • [         R                  " U R                  5      nSUR                  -  nSnUR	                  U5        U R                  U R                  R                  5       5        UR	                  U5        U R                  U R                  R                  5       X#-   5        g)zX
L{imap4.WriteBuffer} buffers writes until its buffer's size
exceeds its maximum value.
r:  ó   yN)r   r;  rv  r<  rc   r‰  r¢  rD   )rG   r>  Ú	firstDataÚ
secondDatas       r4   Útest_writesImplyFlushÚ&WriteBufferTests.test_writesImplyFlushü  s~   € ô
 ×Ò §¡Ó/ˆØ˜3Ÿ>™>Ñ)ˆ	Øˆ
à�	‰	�)Ôà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	�*Ôà×Ñ˜Ÿ™×-Ñ-Ó/°Ñ1GÕHr7   c                óJ  • [         R                  " U R                  5      nSUR                  -  nUR	                  U5        U R                  U R                  R                  5       5        UR                  5         U R                  U R                  R                  5       U5        g)zc
L{imap4.WriteBuffer.flush} flushes the buffer even when its
size is smaller than the buffer size.
r:  N)	r   r;  rv  r<  rc   r‰  r¢  ÚflushrD   r=  s      r4   Útest_explicitFlushÚ#WriteBufferTests.test_explicitFlush  sr   € ô
 ×Ò §¡Ó/ˆØ�s—~‘~Ñ&ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/°Õ6r7   c                ó¶   • [         R                  " U R                  5      nUR                  5         U R	                  U R                  R                  5       5        g)zG
L{imap4.WriteBuffer.flush} has no effect if when the buffer is
empty.
N)r   r;  rv  rI  r‰  r¢  )rG   r>  s     r4   Útest_explicitFlushEmptyBufferÚ.WriteBufferTests.test_explicitFlushEmptyBuffer  s<   € ô
 ×Ò §¡Ó/ˆà�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/Õ0r7   )rv  N)r~   r   r€   r�   rd  rŽ  r  r  rF  rJ  rM  r‚   r1   r7   r4   r6  r6  Ü  s&   † ñò+ò
1ò
7òIò"7õ 	1r7   r6  )Žrd  Ú
__future__r   r  r[   rý  rÇ
  r¥  rÓ   Úcollectionsr   Úior   Ú	itertoolsr   Útypingr   r	   Úunittestr
   Úzope.interfacer   Úzope.interface.verifyr   r   Útwisted.cred.checkersr   Útwisted.cred.credentialsr   r   r   Útwisted.cred.errorr   Útwisted.cred.portalr   r   Útwisted.internetr   r   r   r   Útwisted.internet.deferr   Útwisted.internet.taskr   Útwisted.internet.testingr   r   Útwisted.mailr   Útwisted.mail.imap4r   Útwisted.mail.interfacesr    r!   r"   Útwisted.protocolsr#   Útwisted.pythonr$   r%   r&   Útwisted.python.compatr'   r(   r)   Útwisted.trial.unittestr*   r+   Útwisted.test.ssl_helpersr,   r-   ÚImportErrorr8   r:   r„   r—   rá   rf  ÚIMailboxInfoÚIMailboxÚICloseableMailboxr¸  r  ÚMemoryAccountWithoutNamespacesr?  rG  rL  rU  rO  ri  rg  r…  r¦  rë  r©  rV  rð  rþ  rÈ  rÖ  r(  rG  rM  rÂ  rÇ  r	  r	  r
	  r	  r+	  r†	  r½	  rÇ	  rÞ	  ÚIMessageÚFancyStrMixinr¬   r
  r,
  r�
  rr  ÚISearchableMailboxr¶  rî  ÚIMessageFilerö  ÚIMessageCopierrÿ  r  ÚIReactorSSLr"  rz  r�  rÖ  rÝ  rã  r  r  r#  r+  r6  r1   r7   r4   Ú<module>rr     s  ðñõ #ã Û Û Û Û 	Û Ý #Ý Ý ß !Ý å &ß ;å I÷ñ õ
 1ß .ß >Ó >Ý +Ý 'ß VÝ Ý )÷ñ õ
 'ß -Ñ -ß HÑ Hß @ðßKò#ôb;�Xô b;÷Jñ ô"d)Ð.ô d)ôNHVÐ)ô HVôV
C+�xô C+ñL ˆU×Ñ §¡°×1HÑ1HÓI÷Pð Pó JðPñf ˆU×Ñ §¡Ó0÷Tð Tó 1ðTôn˜u×CÑCô ô"Ð&¨×(;Ñ(;ô ô3�5×$Ñ$ô 3ô,(�5×$Ñ$ô (÷,.,ñ .,ôb_/Ð'¨ô _/ôDa2Ð1ô a2ôHdXÐ-¨xô dXñN ˆVÓ÷@ð @ó ð@÷:"ñ "ô"h4Ð)¨8ô h4ôV/
�Xô /
ôddTÐ/°ô dTôNL"˜Hô L"ô^
$˜×*Ñ*ô 
$ôLÐ'¨ô L÷^Bñ Bô6EIÐ1ô EIôPÐ1Ð3Fô ô(Ð0Ð2Eô ô*+=Ð5Ð7Jô +=ô\/=Ð4Ð6Iô /=ôd\
Ð3Ð5Hô \
ô~JTÐ3°Xô JTôZ,=Ð4Ð6Iô ,=ô^KSÐ2Ð4Gô KSô\�%×#Ñ#ô ñ ˆU�^‰^Óô$"�4×%Ñ%ó $"ó ð$"ôN?!�HÐ.ô ?!ôDa
˜Hô a
ôHK%�HÐ.ô K%ô\sÐ)¨8ô sñl ˆU×%Ñ%Ó&ôX˜HÐ&6ó Xó 'ðX÷v#ñ #ñ ˆU×ÑÓ ÷ ð  ó !ð ñ ˆU×!Ñ!Ó"÷ð ó #ðôN%�hô N%ñb ÐÔÐ3Ó4ÙˆJ×"Ó" 7¨DÓ1Ô1Ð3PÓQôU2Ð ó U2ó Ró 5ðU2ôp�-ô ôÐ# Xô ôD	˜ô 	÷.ñ .ôT
�hô T
ônN˜Hô N÷>:)ñ :)ôz0Ð*Ð,?ô 0ô653Ð(¨(ô 53ôpJ1Ð*õ J1øðQu ó ØÐØÓðús   ÃQ Ñ
Q+Ñ*Q+