+
    üÐjyf ã                  ó0	  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIt^ RIt^ RI t^ RI!t^ RI"t^ RI#t^ RI$t^ RI%t^ RI&t^ RIH't'H(t( ^ R	I)H*t*H+t+H,t,H-t-H.t.H/t/ ^ R
I0H1t1 ^ RI2H3t3H4t4H5t5H6t6 ^ RI7H8t8H9t9H:t: ^ RI;H<t<H=t= ^ RI#H>t> ^ RI&H?t? ^ RI@HAtA ^ RIBHCtCHDtDHEtE ^ RIFHGtG ^ RIHHItIHJtJ ^ RIKHLtL ^ RIMHNtN ^ RIOHPtP ]! ]NR8g  R4       ! R R]P4      4       tQ]! ]NR8g  R4       ! R R]P4      4       tR]! ]NR8g  R4       ! R R]P4      4       tS]! ]NR8g  R4       ! R R ]P4      4       tT]! ]NR8g  R4       ! R! R"]P4      4       tU]! ]NR8g  R4       ! R# R$]P4      4       tV]! ]NR8g  R4       ! R% R&]P4      4       tW]! ]NR8g  R4       ! R' R(](P°                  P²                  4      4       tZ ! R) R*4      t[]! ]NR8g  R4       ! R+ R,]P][4      4       t\]! ]NR8g  R4       ! R- R.]P][4      4       t]]! ]NR8g  R4       ! R/ R0]P4      4       t^]! ]NR8g  R4       ! R1 R2]P4      4       t_]! ]NR8g  R4       ! R3 R4]P4      4       t`]! ](PP                  PÂ                  4       ! R5 R64      4       tb]! ]NR8g  R4       ! R7 R8]P4      4       tc]! ]NR8g  R4       ! R9 R:]P4      4       td ! R; R<]=PÊ                  4      tf]! ]NR8g  R4       ! R= R>]P4      4       tg]! ]NR8g  R4       ! R? R@]P4      4       th ! RA RB4      ti]! ]NR8g  R4       ! RC RD]P4      4       tj]! ]NR8g  R4       ! RE RF]P4      4       tk^ RGI@HltlHmtmHntn  ! RH RI]mPÞ                  4      tpRJ tqRK tr]! ]NR8g  R4       ! RL RM]P4      4       ts]! ]NR8g  R4       ! RN RO]P4      4       tt ! RP RQ4      tu]! ]NR8g  R4       ! RR RS]P4      4       tv ! RT RU4      tw]! ]NR8g  R4       ! RV RW]P4      4       tx ! RX RY4      ty ! RZ R[](Pô                  Pö                  4      t| ! R\ R]](Pô                  Pú                  4      t~ ! R^ R_4      t]! ]NR8g  R4       ! R` Ra]P4      4       t€ ! Rb Rc4      t� ! Rd Re4      t‚ ! Rf Rg4      tƒ]! ]NR8g  R4       ! Rh Ri]P4      4       t„R# )jz.
Tests for large portions of L{twisted.mail}.
)ÚannotationsN)Úmd5)ÚAnyÚNoReturn)ÚskipIf)Ú	InterfaceÚimplementer)ÚverifyClass)ÚcredÚmail)ÚaddressÚdeferÚ
interfacesÚprotocolÚreactorÚtask)ÚDeferred)ÚCannotListenErrorÚDNSLookupErrorÚProcessDoneÚProcessTerminated)ÚLineSendingProtocolÚMemoryReactorClockÚStringTransport)Úpop3Úsmtp)ÚMaildirMailbox)Ú_AttemptManager)Údns)ÚRecord_CNAMEÚ	Record_MXÚRRHeader)ÚDNSNameError)ÚfailureÚlog)ÚFilePath)ÚplatformType)ÚTestCaseÚposixz twisted.mail only works on posixc                  óf   € ] tR t^@t]! ]P                  R	8¬  R4      R 4       tR tR t	R t
R tRtR# )
ÚDomainWithDefaultsTestsúnot ported to Python 3c           	     	óì  € \        ^
4       Uu/ uF  qV^
,           bK  	  pp\        P                  P                  VR4      pV P                  \	        V4      ^
4       V P                  \        \        V4      4      \        \        ^
4      4      4       V P                  \        VP                  4       4      \        \        V4      4      4       \        VP                  4       4      pVP                  4        T P                  T\        ^
4       Uu. uF  qV^
,           3NK  	  up4       \        VP                  4       4      pVP                  4        V P                  V\        \        ^
^4      4      4       VP                  4       pVP                  4        T P                  T\        ^
4       Uu. uF  qV^
,           3NK  	  up4       VP                  4       pVP                  4        V P                  V\        \        ^
^4      4      4       \        ^
4       F]  pV P                  W!,          V^
,           4       V P                  VP                  V4      V^
,           4       V P                  W9   4       K_  	  V^ V^ V^ V P                  \	        V4      ^4       V P                  V^,          R4       V P                  V^,          R4       V P                  V^,          R4       VP                  RRRR	RR/4       V P                  \	        V4      ^
4       V P                  VR,          R4       V P                  VR,          R	4       V P                  VR,          R4       VP!                  4        V P                  \	        V4      ^ 4       V P                  VP#                  RR4      R4       V P                  VR,          R4       V P                  VP%                  4       R
4       V P                  \	        V4      ^ 4       VP'                  4       pV P                  VP(                  VP(                  4       V P                  VP*                  VP*                  4       R# u upi u upi u upi )é
   ÚDefaultÚaNÚbÚcÚ*ÚkeyÚvalue© )r3   r4   )Úranger   ÚDomainWithDefaultDictÚassertEqualÚlenÚlistÚiterÚiterkeysÚ	iteritemsÚsortÚ
itervaluesÚitemsÚvaluesÚgetÚ
assertTrueÚupdateÚclearÚ
setdefaultÚpopitemÚcopyÚdomainsÚdefault)ÚselfÚxÚdr@   rA   Údcopys   &     Ú=/usr/lib/python3/dist-packages/twisted/mail/test/test_mail.pyÚtestMethodsÚ#DomainWithDefaultsTests.testMethodsB   sO  € ä % b¤	Ó*¡	˜1��B•ŠY¡	ˆÐ*Ü�I‰I×+Ñ+¨A¨yÓ9ˆà×Ñœ˜Q› Ô$Ø×Ñœœd 1›g›¬¬U°2«Y«Ô8Ø×Ñœ˜aŸj™j›lÓ+¬T´$°q³'«]Ô;ä�Q—[‘[“]Ó#ˆØ�
‰
ŒØ×Ñ˜´e¸B´iÓ @±i° Q¨¥V£±iÑ @ÔAä�a—l‘l“nÓ%ˆØ�‰ŒØ×Ñ˜¤¤e¨B°£mÓ!4Ô5à—‘“	ˆØ�
‰
ŒØ×Ñ˜´e¸B´iÓ @±i° Q¨¥V£±iÑ @ÔAà—‘“ˆØ�‰ŒØ×Ñ˜¤¤e¨B°£mÓ!4Ô5ä�r–ˆAØ×Ñ˜Q�T 1 r¥6Ô*Ø×Ñ˜QŸU™U 1›X q¨2¥vÔ.Ø�O‰O˜A™FÖ#ñ ð
 ˆaˆD�!�A�$˜˜!˜à×Ñœ˜Q› Ô#Ø×Ñ˜˜1�˜yÔ)Ø×Ñ˜˜1�˜yÔ)Ø×Ñ˜˜1�˜yÔ)à	�‰�#�t˜S " c¨3Ð/Ô0Ø×Ñœ˜Q› Ô$Ø×Ñ˜˜3� Ô&Ø×Ñ˜˜3� Ô$Ø×Ñ˜˜3� Ô%à	�‰Œ	Ø×Ñœ˜Q› Ô#à×Ñ˜Ÿ™ e¨WÓ5°wÔ?Ø×Ñ˜˜5� 7Ô+à×Ñ˜Ÿ™›Ð&6Ô7Ø×Ñœ˜Q› Ô#à—‘“ˆØ×Ñ˜Ÿ™ E§M¡MÔ2Ø×Ñ˜Ÿ™ E§M¡MÖ2ùòi +ùò !Aùò !As   ŽQ'ÄQ,
Æ1Q1
c                óî   € \         P                   P                  / R4      pV P                  VP                  P                  V! V4      4       RVR&   V P                  \        RR/4      V! V4      4       R# )aa  
Assert that the class name of a L{mail.mail.DomainWithDefaultDict}
instance and the string-formatted underlying domain dictionary both
appear in the string produced by the given string-returning function.

@type stringifier: one-argument callable
@param stringifier: either C{str} or C{repr}, to be used to get a
    string to make assertions against.
r.   r4   r3   N)r   r7   ÚassertInÚ	__class__Ú__name__Ústr)rK   ÚstringifierÚdomains   && rO   Ú_stringificationTestÚ,DomainWithDefaultsTests._stringificationTestz   s_   € ô —‘×0Ñ0°°YÓ?ˆØ�‰�f×&Ñ&×/Ñ/±¸VÓ1DÔEØˆˆu‰Ø�‰”c˜5 'Ð*Ó+©[¸Ó-@ÖAó    c                ó0   € V P                  \        4       R# )z
L{DomainWithDefaultDict.__str__} should return a string including
the class name and the domain mapping held by the instance.
N)rY   rV   ©rK   s   &rO   Útest_strÚ DomainWithDefaultsTests.test_str‰   s   € ð
 	×!Ñ!¤#Ö&r[   c                ó0   € V P                  \        4       R# )z€
L{DomainWithDefaultDict.__repr__} should return a string including
the class name and the domain mapping held by the instance.
N)rY   Úreprr]   s   &rO   Ú	test_reprÚ!DomainWithDefaultsTests.test_repr�   s   € ð
 	×!Ñ!¤$Ö'r[   c                ó`  € \         P                   P                  / R4      pVP                  R4       RpV P                  V P                  .4      pV P                  ^\        V4      4       V P                  \        V^ ,          R,          4       V P                  W#^ ,          R,          4       R# )z
has_key is now deprecated.
r.   Úanythingzotwisted.mail.mail.DomainWithDefaultDict.has_key was deprecated in Twisted 16.3.0. Use the `in` keyword instead.ÚcategoryÚmessageN)r   r7   Úhas_keyÚflushWarningsÚtest_has_keyDeprecationr8   r9   ÚDeprecationWarning)rK   Úsutrg   Úwarningss   &   rO   rj   Ú/DomainWithDefaultsTests.test_has_keyDeprecation—   s�   € ô �i‰i×-Ñ-¨b°)Ó<ˆà�‰�JÔð?ð 	ð ×%Ñ% t×'CÑ'CÐ&DÓEˆØ×Ñ˜œC ›MÔ*Ø×ÑÔ+¨X°a­[¸Õ-DÔEØ×Ñ˜¨1¥+¨iÕ"8Ö9r[   r5   N©é   )rU   Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚsysÚversion_inforP   rY   r^   rb   rj   Ú__static_attributes__r5   r[   rO   r*   r*   @   s>   † áˆC×Ñ Ñ$Ð&>Ó?ñ53ó @ð53ònBò'ò(ö:r[   r*   c                  ó.   € ] tR t^©tR tR tR tR tRtR# )ÚBounceTestsc                	óL   € \         P                   P                  4       V n        R # ©N)r   ÚBounceDomainrX   r]   s   &rO   ÚsetUpÚBounceTests.setUp«   s   € Ü—i‘i×,Ñ,Ó.ˆŽr[   c                	óp   € V P                  \        P                  V P                  P                  R 4       R# )zany userN)ÚassertRaisesr   ÚAddressErrorrX   Úexistsr]   s   &rO   Ú
testExistsÚBounceTests.testExists®   s$   € Ø×Ñœ$×+Ñ+¨T¯[©[×-?Ñ-?ÀÖLr[   c                	ó^   € V P                  V P                  P                  R R4      R4       R# )zrandom q emailerr   FN)r8   rX   Ú	willRelayr]   s   &rO   Ú	testRelayÚBounceTests.testRelay±   s%   € Ø×Ñ˜Ÿ™×.Ñ.Ð/AÀ:ÓNÐPUÖVr[   c                	ó¨   € V P                   P                  R R4       V P                  \        P                  V P                   P
                  R 4       R# )ÚbobÚpasswordN)rX   ÚaddUserr   r   ÚSMTPBadRcptr�   r]   s   &rO   ÚtestAddUserÚBounceTests.testAddUser´   s8   € Ø�‰×Ñ˜E :Ô.Ø×Ñœ$×*Ñ*¨D¯K©K×,>Ñ,>ÀÖFr[   )rX   N)	rU   rq   rr   rs   r|   r‚   r†   r�   rv   r5   r[   rO   rx   rx   ©   s   † ò/òMòWöGr[   rx   c                  ó    € ] tR t^¹tRtR tRtR# )ÚBounceWithSMTPServerTestszS
Tests for L{twisted.mail.mail.BounceDomain} with
L{twisted.mail.smtp.SMTPServer}.
c                óú  € \         P                   P                  4       p\         P                   P                  4       pVP                  RV4       \         P                  P                  V4      pVP                  R4      p\         P                  P                  VRR4      pWTn        \        4       pVP                  ! V4       VP                  ! R4       VP                  ! R4       VP                  ! R4       VP                  ! R4       V P                  VP                  4       VP                  ! R4       V P                  VP!                  4       P#                  4       P%                  R4      R	,          R4       R# )
zW
Incoming emails to a SMTP server with L{twisted.mail.mail.BounceDomain}
are rejected.
s   foo.comNs   HELO baz.nets   MAIL FROM:<a@baz.net>s   RCPT TO:<any@foo.com>s   QUITs   
s(   550 Cannot receive for specified addresséþÿÿÿ)r   ÚMailServicer{   Ú	addDomainÚ	protocolsÚSMTPFactoryÚbuildProtocolÚSMTPDomainDeliveryÚdeliveryr   ÚmakeConnectionÚlineReceivedrC   ÚdisconnectingÚconnectionLostr8   r4   ÚstripÚsplit)rK   ÚservicerX   Úfactoryr   Ú	delivererÚ	transports   &      rO   Útest_rejectedÚ'BounceWithSMTPServerTests.test_rejectedÀ   s  € ô
 —)‘)×'Ñ'Ó)ˆÜ—‘×'Ñ'Ó)ˆØ×Ñ˜* fÔ-ä—.‘.×,Ñ,¨WÓ5ˆØ×(Ñ(¨Ó.ˆä—N‘N×5Ñ5°g¸tÀTÓJˆ	Ø%Ôä#Ó%ˆ	Ø×Ò 	Ô*à×Ò˜oÔ.Ø×ÒÐ6Ô7Ø×ÒÐ6Ô7Ø×Ò˜gÔ&à�‰˜	×/Ñ/Ô0Ø×Ò Ô%à×ÑØ�O‰OÓ×#Ñ#Ó%×+Ñ+¨GÓ4°RÕ8Ø7ö	
r[   r5   N)rU   rq   rr   rs   Ú__doc__r¤   rv   r5   r[   rO   r�   r�   ¹   s   † ñö

r[   r�   c                  ó4   € ] tR t^àtR tR tR tR tR tRt	R# )ÚFileMessageTestsc                	ób  € V P                  4       V n        V P                  4       V n        \        V P                  R 4      V n        V P                  V P                  P                  4       \        P                  P                  V P                  V P                  V P                  4      V n	        R# )ÚwbN)
ÚmktempÚnameÚfinalÚopenÚfÚ
addCleanupÚcloser   ÚFileMessageÚfpr]   s   &rO   r|   ÚFileMessageTests.setUpâ   sh   € Ø—K‘K“MˆŒ	Ø—[‘[“]ˆŒ
Ü�d—i‘i Ó&ˆŒØ�‰˜Ÿ™Ÿ™Ô%Ü—)‘)×'Ñ'¨¯©°·	±	¸4¿:¹:ÓFˆŽr[   c                	óh   € V P                   P                  4       P                  V P                  4      # rz   )r³   ÚeomReceivedÚaddCallbackÚ_cbFinalNamer]   s   &rO   ÚtestFinalNameÚFileMessageTests.testFinalNameé   s&   € Ø�w‰w×"Ñ"Ó$×0Ñ0°×1BÑ1BÓCÐCr[   c                	óö   € V P                  WP                  4       V P                  V P                  P                  4       V P                  \        P                  P                  V P                  4      4       R # rz   )
r8   r­   rC   r¯   ÚclosedÚassertFalseÚosÚpathr�   r¬   ©rK   Úresults   &&rO   r¸   ÚFileMessageTests._cbFinalNameì   sG   € Ø×Ñ˜§¡Ô,Ø�‰˜Ÿ™Ÿ™Ô&Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ö3r[   c                	óX  € R pVP                  4        F  pV P                  P                  V4       K   	  V P                  P                  4        \	        V P
                  R4      ;_uu_ 4       pV P                  VP                  4       V4       RRR4       R#   + '       g   i     R# ; i)ó"   first line
second line
third line
ÚrbN)Ú
splitlinesr³   r›   r¶   r®   r­   r8   Úread)rK   ÚcontentsÚliner¯   s   &   rO   ÚtestContentsÚFileMessageTests.testContentsñ   st   € Ø;ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔÜ�$—*‘*˜d×#Ô# qØ×Ñ˜QŸV™V›X xÔ0÷ $×#×#Ò#ús   Á-!BÂB)	c                	ó‚  € R pVP                  4        F  pV P                  P                  V4       K   	  V P                  P                  4        V P	                  \
        P                  P                  V P                  4      4       V P	                  \
        P                  P                  V P                  4      4       R# )ó   first line
second line
N)
rÆ   r³   r›   r�   r½   r¾   r¿   r�   r¬   r­   ©rK   rÈ   rÉ   s   &  rO   ÚtestInterruptedÚ FileMessageTests.testInterruptedù   sz   € Ø/ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔ Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ô3Ø×ÑœŸ™Ÿ™¨¯
©
Ó3Ö4r[   )r¯   r­   r³   r¬   N)
rU   rq   rr   rs   r|   r¹   r¸   rÊ   rÏ   rv   r5   r[   rO   r¨   r¨   à   s   † òGòDò4ò
1ö5r[   r¨   c                  ó8   € ] tR tRtRtR tR tR tR tR t	Rt
R	# )
ÚMaildirMessageTestsi  zD
Tests for the file creating by the L{mail.maildir.MaildirMessage}.
c                ó†  € V P                  4       V n        V P                  4       V n        RV n        \	        V P                  R4      V n        V P                  V P
                  P                  4       \        P                  P                  V P                  V P
                  V P                  V P                  4      V n        R# )z#
Create and open a temporary file.
s   user@example.comrª   N)r«   r¬   r­   r   r®   r¯   r°   r±   r   ÚmaildirÚMaildirMessager³   r]   s   &rO   r|   ÚMaildirMessageTests.setUp  sz   € ð —K‘K“MˆŒ	Ø—[‘[“]ˆŒ
Ø*ˆŒÜ�d—i‘i Ó&ˆŒØ�‰˜Ÿ™Ÿ™Ô%Ü—,‘,×-Ñ-Ø�L‰L˜$Ÿ&™& $§)¡)¨T¯Z©Zó
ˆŽr[   c                óV   € \         P                   ! V P                   R24      ^ ,          # )zK
Search for the final file path.

@rtype: L{str}
@return: Final file path.
z	,S=[0-9]*)Úglobr­   r]   s   &rO   Ú
_finalNameÚMaildirMessageTests._finalName  s#   € ô �yŠy˜DŸJ™J˜< yÐ1Ó2°1Õ5Ð5r[   c                óŒ  € V P                  V P                  P                  4       4      pV P                  WP                   R\
        P                  P                  V4       24       V P                  V P                  P                  4       V P                  \
        P                  P                  V P                  4      4       R# )z“
Send the EOM to the message and check that the final file name contains
the correct file size and the temporary file has been closed and removed.
z,S=N)ÚsuccessResultOfr³   r¶   r8   r­   r¾   r¿   ÚgetsizerC   r¯   r¼   r½   r�   r¬   )rK   r­   s   & rO   Útest_finalNameÚ"MaildirMessageTests.test_finalName  s   € ð
 ×$Ñ$ T§W¡W×%8Ñ%8Ó%:Ó;ˆØ×Ñ˜§:¡: ,¨c´"·'±'·/±/À%Ó2HÐ1IÐ JÔKØ�‰˜Ÿ™Ÿ™Ô&Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ö3r[   c                óˆ  € RpVP                  4        F  pV P                  P                  V4       K   	  V P                  V P                  P	                  4       4      p\        VR4      ;_uu_ 4       pV P                  VP                  4       RV P                  V3,          4       RRR4       R#   + '       g   i     R# ; i)zˆ
Send a message contents and the EOM to the message and check that the
final file contains the correct header and the message contents.
rÄ   rÅ   s   Delivered-To: %s
%sN)	rÆ   r³   r›   rÜ   r¶   r®   r8   rÇ   r   )rK   rÈ   rÉ   r­   r¯   s   &    rO   Útest_contentsÚ!MaildirMessageTests.test_contents(  s‘   € ð
 <ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à×$Ñ$ T§W¡W×%8Ñ%8Ó%:Ó;ˆÜ�%˜×Ô !Ø×ÑØ—‘“Ð1°T·\±\À8Ð4LÕLô÷ ××Òús   Á24B0Â0C	c                óR  € RpVP                  4        F  pV P                  P                  V4       K   	  V P                  P                  4        V P	                  \
        P                  P                  V P                  4      4       V P                  \        V P                  4       R# )zk
Check that the interrupted message transfer removes the temporary file
and a doesn't create a final file.
rÍ   N)rÆ   r³   r›   r�   r½   r¾   r¿   r�   r¬   r   Ú
IndexErrorrÙ   rÎ   s   &  rO   Útest_interruptedÚ$MaildirMessageTests.test_interrupted6  sq   € ð
 0ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔ Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ô3Ø×Ñœ* d§o¡oÖ6r[   )r   r¯   r­   r³   r¬   N)rU   rq   rr   rs   r¦   r|   rÙ   rÞ   rá   rå   rv   r5   r[   rO   rÒ   rÒ     s    † ñò
ò6ò4òö
7r[   rÒ   c                  ó(   € ] tR tRtR tR tR tRtR# )ÚMailServiceTestsiC  c                	óL   € \         P                   P                  4       V n        R # rz   )r   r“   r    r]   s   &rO   r|   ÚMailServiceTests.setUpE  s   € Ü—y‘y×,Ñ,Ó.ˆŽr[   c                	ó²  € V P                   P                  4       pV P                  \        V\        P
                  4      4       V P                  VP                  R4      \        P                  4       V P                   P                  4       pV P                  \        V\        P
                  4      4       V P                  VP                  R4      \        P                  4       V P                   P                  4       pV P                  \        V\        P
                  4      4       V P                  VP                  R4      \        P                  4       R# )ú	127.0.0.1N)rì   é90  )r    ÚgetPOP3FactoryrC   Ú
isinstancer   ÚServerFactoryr—   r   ÚPOP3ÚgetSMTPFactoryr   ÚSMTPÚgetESMTPFactoryÚESMTP)rK   r¯   s   & rO   ÚtestFactoriesÚMailServiceTests.testFactoriesH  s×   € Ø�L‰L×'Ñ'Ó)ˆØ�‰œ
 1¤h×&<Ñ&<Ó=Ô>Ø�‰˜Ÿ™Ð(<Ó=¼t¿y¹yÔIà�L‰L×'Ñ'Ó)ˆØ�‰œ
 1¤h×&<Ñ&<Ó=Ô>Ø�‰˜Ÿ™Ð(<Ó=¼t¿y¹yÔIà�L‰L×(Ñ(Ó*ˆØ�‰œ
 1¤h×&<Ñ&<Ó=Ô>Ø�‰˜Ÿ™Ð(<Ó=¼t¿z¹zÖJr[   c                	ó<  € \        4       p\        4       pWP                  P                  R &   W P                  P                  R&   V P                  V P                  P	                  R 4      VJ 4       V P                  V P                  P                  4       VJ 4       R# )rX   Ú N)Úobjectr    ÚportalsrC   ÚlookupPortalÚdefaultPortal)rK   Úo1Úo2s   &  rO   ÚtestPortalsÚMailServiceTests.testPortalsU  sr   € Ü‹XˆÜ‹XˆØ)+�‰×Ñ˜XÑ&Ø#%�‰×Ñ˜RÑ à�‰˜Ÿ™×1Ñ1°(Ó;¸rÐAÔBØ�‰˜Ÿ™×2Ñ2Ó4¸Ð:Ö;r[   )r    N)rU   rq   rr   rs   r|   rö   r   rv   r5   r[   rO   rè   rè   C  s   † ò/òKö<r[   rè   c                  ó¨   € ] tR tRtRtR tR t]! ]P                  R8¬  R4      R 4       t
]! ]P                  R8¬  R4      R 4       tR tR	 tR
 tRtR# )ÚStringListMailboxTestsi_  zW
Tests for L{StringListMailbox}, an in-memory only implementation of
L{pop3.IMailbox}.
c                ó  € \         P                  P                  . RO4      pV P                  VP	                  ^ 4      ^4       V P                  VP	                  ^4      ^4       V P                  VP	                  ^4      ^4       R# )zr
L{StringListMailbox.listMessages} returns the length of the message at
the offset into the mailbox passed to it.
N)ÚabcÚabr/   ©r   rÔ   ÚStringListMailboxr8   ÚlistMessages©rK   Úmailboxs   & rO   Útest_listOneMessageÚ*StringListMailboxTests.test_listOneMessagef  sj   € ô
 —,‘,×0Ñ0Ò1CÓDˆØ×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-¨aÓ0°!Ö4r[   c                óŒ   € \         P                  P                  . RO4      pV P                  VP	                  4       . RO4       R# )zi
L{StringListMailbox.listMessages} returns a list of the lengths of all
messages if not passed an index.
N)r/   r  r  )é   rp   é   r  r
  s   & rO   Útest_listAllMessagesÚ+StringListMailboxTests.test_listAllMessagesp  s2   € ô
 —,‘,×0Ñ0Ò1CÓDˆØ×Ñ˜×-Ñ-Ó/²Ö;r[   r+   c                ó¦   € \         P                  P                  RR.4      pV P                  VP	                  ^4      P                  4       R4       R# )z•
L{StringListMailbox.getMessage} returns a file-like object from which
the contents of the message at the given offset into the mailbox can be
read.
Úfoozreal contentsN)r   rÔ   r  r8   Ú
getMessagerÇ   r
  s   & rO   Útest_getMessageÚ&StringListMailboxTests.test_getMessagex  sA   € ô —,‘,×0Ñ0°%¸Ð1IÓJˆØ×Ñ˜×+Ñ+¨AÓ.×3Ñ3Ó5°ÖGr[   c                ó¨   € \         P                  P                  RR.4      pV P                  VP	                  ^ 4      VP	                  ^4      4       R# )zp
L{StringListMailbox.getUidl} returns a unique identifier for the
message at the given offset into the mailbox.
r  ÚbarN)r   rÔ   r  ÚassertNotEqualÚgetUidlr
  s   & rO   Útest_getUidlÚ#StringListMailboxTests.test_getUidl‚  s>   € ô —,‘,×0Ñ0°%¸°Ó@ˆØ×Ñ˜GŸO™O¨AÓ.°·±ÀÓ0BÖCr[   c                óì   € \         P                  P                  R.4      pVP                  ^ 4       V P	                  VP                  ^ 4      ^ 4       V P	                  VP                  4       ^ .4       R# )zv
L{StringListMailbox.deleteMessage} marks a message for deletion causing
further requests for its length to return 0.
r  N)r   rÔ   r  ÚdeleteMessager8   r	  r
  s   & rO   Útest_deleteMessageÚ)StringListMailboxTests.test_deleteMessage‹  s^   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Ö5r[   c                ó  € \         P                  P                  R.4      pVP                  ^ 4       VP	                  4        V P                  VP                  ^ 4      ^4       V P                  VP                  4       ^.4       R# )zw
L{StringListMailbox.undeleteMessages} causes any messages marked for
deletion to be returned to their original state.
r  N)r   rÔ   r  r  ÚundeleteMessagesr8   r	  r
  s   & rO   Útest_undeleteMessagesÚ,StringListMailboxTests.test_undeleteMessages•  sj   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø× Ñ Ô"Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Ö5r[   c                ó,  € \         P                  P                  R.4      pVP                  ^ 4       VP	                  4        VP                  4        V P                  VP                  ^ 4      ^ 4       V P                  VP                  4       ^ .4       R# )za
L{StringListMailbox.sync} causes any messages as marked for deletion to
be permanently deleted.
r  N)r   rÔ   r  r  Úsyncr#  r8   r	  r
  s   & rO   Ú	test_syncÚ StringListMailboxTests.test_sync   ss   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø�‰ŒØ× Ñ Ô"Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Ö5r[   r5   Nro   )rU   rq   rr   rs   r¦   r  r  r   rt   ru   r  r  r   r$  r(  rv   r5   r[   rO   r  r  _  st   † ñò
5ò<ñ ˆC×Ñ Ñ$Ð&>Ó?ñHó @ðHñ ˆC×Ñ Ñ$Ð&>Ó?ñDó @ðDò6ò	6ö
6r[   r  c                  ó4   € ] tR tRtRtRtRtR tR tR t	Rt
R# )Ú&FailingMaildirMailboxAppendMessageTaski­  Tc                	óˆ   € V P                   '       d   \        P                  ! WV4      # \        \        P
                  R 4      h©zFaked Permission Problem)Ú
_openstater¾   r®   ÚOSErrorÚerrnoÚEPERM)rK   ÚfnÚattrÚmodes   &&&&rO   ÚosopenÚ-FailingMaildirMailboxAppendMessageTask.osopenµ  s.   € Ø�?�?ˆ?Ü—7’7˜2 TÓ*Ð*äœ%Ÿ+™+Ð'AÓBÐBr[   c                	ó†   € V P                   '       d   \        P                  ! W4      # \        \        P
                  R 4      h)zFaked Space problem)Ú_writestater¾   Úwriter/  r0  ÚENOSPC)rK   ÚfhÚdatas   &&&rO   ÚoswriteÚ.FailingMaildirMailboxAppendMessageTask.oswrite»  s/   € Ø××ÐÜ—8’8˜BÓ%Ð%äœ%Ÿ,™,Ð(=Ó>Ð>r[   c                	ó†   € V P                   '       d   \        P                  ! W4      # \        \        P
                  R 4      hr-  )Ú_renamestater¾   Úrenamer/  r0  r1  )rK   ÚoldnameÚnewnames   &&&rO   ÚosrenameÚ/FailingMaildirMailboxAppendMessageTask.osrenameÁ  s/   € Ø××ÐÜ—9’9˜WÓ.Ð.äœ%Ÿ+™+Ð'AÓBÐBr[   r5   N)rU   rq   rr   rs   r.  r8  r@  r5  r=  rD  rv   r5   r[   rO   r+  r+  ­  s$   † ð €JØ€KØ€LòCò?öCr[   r+  c                  ó&   € ] tR tRtRtR R ltRtR# )Ú_AppendTestMixiniÈ  z„
Mixin for L{MaildirMailbox.appendMessage} test cases which defines a helper
for serially appending multiple messages to a mailbox.
c               ó$   € V ^8„  d   QhRRRRRR/# )r  Úmboxz#twisted.mail.maildir.MaildirMailboxÚmessageszlist[bytes]ÚreturnzDeferred[list[None]]r5   )Úformats   "rO   Ú__annotate__Ú_AppendTestMixin.__annotate__Î  s$   € ÷ 0ñ 0Ø7ð0ØCNð0à	ñ0r[   c                óP   aa€ R VV3R llp\         P                  ! V! 4       4      # )zÌ
Deliver the given messages one at a time.  Delivery is serialized to
guarantee a predictable order in the mailbox (overlapped message deliver
makes no guarantees about which message which appear first).
c               ó   € V ^8„  d   QhRR/# )r  rK  z
list[None]r5   )rL  s   "rO   rM  Ú6_AppendTestMixin._appendMessages.<locals>.__annotate__×  s   € ÷ 	ñ 	˜jñ 	r[   c               “  ó~   <"  € . p S F-  pSP                  V4      G R j  x€L
  V P                  R 4       K/  	  V #  L5irz   )ÚappendMessageÚappend)ÚresultsÚmrI  rJ  s     €€rO   rT  Ú0_AppendTestMixin._appendMessages.<locals>.append×  sA   øé € Ø"$ˆGÛ�Ø×(Ñ(¨Ó+×+Ð+Ø—‘˜tÖ$ñ ð ˆNñ ,ùs   ƒ=Ÿ; =©r   ÚfromCoroutine)rK   rI  rJ  rT  s   &ff rO   Ú_appendMessagesÚ _AppendTestMixin._appendMessagesÎ  s"   ù€ ÷	ñ 	ô ×%Ò%¡f£hÓ/Ð/r[   r5   N)rU   rq   rr   rs   r¦   rZ  rv   r5   r[   rO   rG  rG  È  s   † ñ÷
0ñ 0r[   rG  c                  óZ   € ] tR tRtRtR R ltR R ltRR ltR	 R
 ltR R lt	R t
RtR# )ÚMaildirAppendStringTestsiá  úG
Tests for L{MaildirMailbox.appendMessage} when invoked with a C{str}.
c               ó   € V ^8„  d   QhRR/# ©r  rK  ÚNoner5   )rL  s   "rO   rM  Ú%MaildirAppendStringTests.__annotate__ç  s   € ÷ /ñ /�tñ /r[   c                	óª   € \         P                  ! V P                  4       4      V n        \        P
                  P                  V P                  4       R # rz   )r¾   Úfsencoder«   rM   r   rÔ   ÚinitializeMaildirr]   s   &rO   r|   ÚMaildirAppendStringTests.setUpç  s.   € Ü—’˜TŸ[™[›]Ó+ˆŒÜ�‰×&Ñ& t§v¡vÖ.r[   c               ó$   € V ^8„  d   QhRRRRRR/# )r  Úignoredrú   rI  r   rK  zDeferred[None]r5   )rL  s   "rO   rM  rb  ë  s!   € ÷ 0ñ 0˜vð 0¨^ð 0Àñ 0r[   c                	óP   € VP                  R 4      pV P                  V\        4      # )s   TEST)rS  ÚassertFailureÚ	Exception)rK   rh  rI  rM   s   &&& rO   Ú_appendÚ MaildirAppendStringTests._appendë  s%   € Ø×Ñ˜wÓ'ˆØ×!Ñ! !¤YÓ/Ð/r[   Nc                óÆ  € VeG   V P                  \        VP                  RVP                  P                  4       W2P                  n        VeG   V P                  \        VP                  RVP                  P                  4       WBP                  n        VeI   V P                  \        VP                  RVP                  P
                  4       WRP                  n        R# R# )až  
Change the behavior of future C{rename}, C{write}, or C{open} calls made
by the mailbox C{mbox}.

@param rename: If not L{None}, a new value for the C{_renamestate}
    attribute of the mailbox's append factory.  The original value will
    be restored at the end of the test.

@param write: Like C{rename}, but for the C{_writestate} attribute.

@param open: Like C{rename}, but for the C{_openstate} attribute.
Nr@  r8  r.  )r°   ÚsetattrÚAppendFactoryr@  r8  r.  )rK   rh  rI  rA  r9  r®   s   &&&&&&rO   Ú	_setStateÚ"MaildirAppendStringTests._setStateï  sÀ   € ð ÒØ�O‰OÜØ×"Ñ"ØØ×"Ñ"×/Ñ/ô	ð /5×ÑÔ+ØÒØ�O‰OÜØ×"Ñ"ØØ×"Ñ"×.Ñ.ô	ð .3×ÑÔ*ØÒØ�O‰OÜ˜×+Ñ+¨\¸4×;MÑ;M×;XÑ;Xôð -1×ÑÖ)ñ	 r[   c               ó   € V ^8„  d   QhRR/# ©r  rK  r   r5   )rL  s   "rO   rM  rb    s   € ÷ ñ ˜Sñ r[   c                ó^  € \         P                  P                  V P                  4      p\        Vn        T P                  T\        ^^4       Uu. uF  pRV,          NK  	  up4      pVP                  V P                  R.^
,          4       VP                  V P                  V4       V# u upi )ú~
L{MaildirMailbox.appendMessage} returns a L{Deferred} which fires when
the message has been added to the end of the mailbox.
ó   XN)r   rÔ   r   rM   r+  rp  rZ  r6   r·   r8   Ú_cbTestAppend)rK   rI  ÚirM   s   &   rO   Útest_appendÚ$MaildirAppendStringTests.test_append  sŠ   € ô
 �|‰|×*Ñ*¨4¯6©6Ó2ˆÜCˆÔà× Ñ  ¼%ÀÀ2¼,Ó'G¹,°Q¨¨q¯¨¹,Ñ'GÓHˆØ	�‰�d×&Ñ&¨¨°­Ô4Ø	�‰�d×(Ñ(¨$Ô/Øˆùò (Hs   ÁB*
c               ó   € V ^8„  d   QhRR/# rt  r5   )rL  s   "rO   rM  rb    s   € ÷ ,ñ , Cñ ,r[   c                óL   a € R V 3R llp\         P                  ! V! 4       4      # )z…
Appending a message, then re-opening the mailbox by creating a new
MaildirMailbox, should result in seeing the message as loadable.
c               ó   € V ^8„  d   QhRR/# r`  r5   )rL  s   "rO   rM  ÚAMaildirAppendStringTests.test_reopenMailbox.<locals>.__annotate__%  s   € ÷ 		Jñ 		J˜$ñ 		Jr[   c               “  óü  <"  € \         P                  P                  SP                  4      p R pV P	                  V4      G Rj  x€L
  \         P                  P                  SP                  4      pVP                  4       pSP                  \        V4      ^4       Vw  pSP                  V\        V4      4       SP                  VP                  ^ 4      P                  4       VP                  4       4       R#  L¶5i)s   xyzzyN)r   rÔ   r   rM   rS  r	  r8   r9   r  rÇ   Údecode)Úmbox1ÚsampleÚmbox2ÚlistedÚmessageSizerK   s        €rO   ÚgoÚ7MaildirAppendStringTests.test_reopenMailbox.<locals>.go%  s»   øé € Ü—L‘L×/Ñ/°·±Ó7ˆEØˆFØ×%Ñ% fÓ-×-Ð-Ü—L‘L×/Ñ/°·±Ó7ˆEØ×'Ñ'Ó)ˆFØ×ÑœS ›[¨!Ô,Ø"‰Mˆ[Ø×Ñ˜[¬#¨f«+Ô6Ø×Ñ˜U×-Ñ-¨aÓ0×5Ñ5Ó7¸¿¹»ÖIñ .ùs   ƒA C<ÁC:ÁB7C<rX  )rK   r‡  s   f rO   Útest_reopenMailboxÚ+MaildirAppendStringTests.test_reopenMailbox  s$   ø€ ÷		Jð 		Jô ×%Ò%¡b£dÓ+Ð+r[   c           
     óž  € V P                  \        VP                  4       4      ^
4       T P                  \        ^
4       Uu. uF+  p\        VP	                  V4      P                  4       4      NK-  	  up\        \        ^^4      4      4       V P                  RVRR7       V P                  RV4      pVP                  V P                  VRRR7       VP                  V P                  V4       VP                  V P                  VRRR7       VP                  V P                  V4       VP                  V P                  VRR7       V# u upi )ú»
Check that the mailbox has the expected number (ten) of messages in it,
and that each has the expected contents, and that they are in the same
order as that in which they were appended.
NF)rA  T)rA  r9  )r9  r®   )r®   )
r8   r9   r	  r6   r  rÇ   r:   rq  rl  r·   )rK   rh  rI  ry  rM   s   &&&  rO   rx  Ú&MaildirAppendStringTests._cbTestAppend2  s  € ð 	×Ñœ˜T×.Ñ.Ó0Ó1°2Ô6Ø×ÑÜ5:¸2´YÓ?±Y°ŒS�—‘ Ó#×(Ñ(Ó*Ö+±YÑ?ÄÄeÈAÈrÃlÓASô	
ð 	�‰�t˜T¨%ˆÔ0Ø�L‰L˜˜tÓ$ˆØ	�‰�d—n‘n d°4¸uˆÔEØ	�‰�d—l‘l DÔ)Ø	�‰�d—n‘n d°$¸UˆÔCØ	�‰�d—l‘l DÔ)Ø	�‰�d—n‘n d°ˆÔ6Øˆùò @s   Á1E
©rM   )NNN)rU   rq   rr   rs   r¦   r|   rl  rq  rz  r‰  rx  rv   r5   r[   rO   r]  r]  á  s&   † ñõ/õ0ô!1õFõ,ö&r[   r]  c                  ó^   € ] tR tRtRtR t]! ]P                  R	8¬  R4      R 4       t	R t
RtR# )
ÚMaildirAppendFileTestsiG  r^  c                	ó‚   € V P                  4       V n        \        P                  P	                  V P                  4       R # rz   ©r«   rM   r   rÔ   re  r]   s   &rO   r|   ÚMaildirAppendFileTests.setUpM  ó%   € Ø—‘“ˆŒÜ�‰×&Ñ& t§v¡vÖ.r[   r+   c                ó²  € \         P                  P                  V P                  4      p. p\	        ^^4       Fn  p\
        P                  ! 4       pVP                  RV,          4       VP                  ^ ^ 4       VP                  V4       V P                  VP                  4       Kp  	  V P                  W4      pVP                  V P                  V4       V# )rv  ÚX)r   rÔ   r   rM   r6   ÚtempfileÚTemporaryFiler9  ÚseekrT  r°   r±   rZ  r·   rx  )rK   rI  rJ  ry  ÚtemprM   s   &     rO   rz  Ú"MaildirAppendFileTests.test_appendQ  s£   € ô �|‰|×*Ñ*¨4¯6©6Ó2ˆØˆÜ�q˜"–ˆAÜ×)Ò)Ó+ˆDØ�J‰J�s˜Q•wÔØ�I‰I�a˜ŒOØ�O‰O˜DÔ!Ø�O‰O˜DŸJ™JÖ'ñ ð × Ñ  Ó0ˆØ	�‰�d×(Ñ(¨$Ô/Øˆr[   c           
     ó*  € V P                  \        VP                  4       4      ^
4       T P                  \        ^
4       Uu. uF+  p\        VP	                  V4      P                  4       4      NK-  	  up\        \        ^^4      4      4       R# u upi )rŒ  N)r8   r9   r	  r6   r  rÇ   r:   )rK   rÁ   rI  ry  s   &&& rO   rx  Ú$MaildirAppendFileTests._cbTestAppendd  sm   € ð 	×Ñœ˜T×.Ñ.Ó0Ó1°2Ô6Ø×ÑÜ5:¸2´YÓ?±Y°ŒS�—‘ Ó#×(Ñ(Ó*Ö+±YÑ?ÄÄeÈAÈrÃlÓASö	
ùÚ?s   Á1BrŽ  Nro   )rU   rq   rr   rs   r¦   r|   r   rt   ru   rz  rx  rv   r5   r[   rO   r�  r�  G  s9   † ñò/ñ ˆC×Ñ Ñ$Ð&>Ó?ñó @ðö$	
r[   r�  c                  óf   € ] tR tRtR tR tR tR t]! ]	P                  R
8¬  R4      R 4       tRtR	# )ÚMaildirTestsip  c                	ó‚   € V P                  4       V n        \        P                  P	                  V P                  4       R # rz   r’  r]   s   &rO   r|   ÚMaildirTests.setUpr  r”  r[   c                	óF   € \         P                  ! V P                  4       R # rz   )ÚshutilÚrmtreerM   r]   s   &rO   ÚtearDownÚMaildirTests.tearDownv  s   € Ü�Š�d—f‘fÖr[   c                	ó(  € V P                   p\        P                  P                  VR 4      pT P	                  \        P                  P                  V4      ;'       d     \        P                  P                  V4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       V P	                  \        P                  P                  \        P                  P                  VR4      4      4       R# )ú.TrashÚnewÚcurÚtmpN)rM   r¾   r¿   ÚjoinrC   r�   Úisdir)rK   rM   Útrashs   &  rO   ÚtestInitializerÚMaildirTests.testInitializery  s-  € Ø�F‰FˆÜ—‘—‘˜Q Ó)ˆà�‰œŸ™Ÿ™ qÓ)×>Ð>¬b¯g©g¯m©m¸AÓ.>Ô?Ø�‰œŸ™Ÿ™¤r§w¡w§|¡|°A°uÓ'=Ó>Ô?Ø�‰œŸ™Ÿ™¤r§w¡w§|¡|°A°uÓ'=Ó>Ô?Ø�‰œŸ™Ÿ™¤r§w¡w§|¡|°A°uÓ'=Ó>Ô?Ø�‰œŸ™Ÿ™¤b§g¡g§l¡l°1°eÓ&<Ó=Ô>Ø�‰œŸ™Ÿ™¤b§g¡g§l¡l°1°eÓ&<Ó=Ô>Ø�‰œŸ™Ÿ™¤b§g¡g§l¡l°1°eÓ&<Ó=Ô>à�‰œŸ™Ÿ™¤r§w¡w§|¡|°E¸5Ó'AÓBÔCØ�‰œŸ™Ÿ™¤r§w¡w§|¡|°E¸5Ó'AÓBÔCØ�‰œŸ™Ÿ™¤r§w¡w§|¡|°E¸5Ó'AÓBÔCØ�‰œŸ™Ÿ™¤b§g¡g§l¡l°5¸%Ó&@ÓAÔBØ�‰œŸ™Ÿ™¤b§g¡g§l¡l°5¸%Ó&@ÓAÔBØ�‰œŸ™Ÿ™¤b§g¡g§l¡l°5¸%Ó&@ÓAÖBr[   c                ó  € \         P                  ! 4       pVP                  R4       \        P                  P                  V4      pVP                  4       pVP                  R4       VP                  4       pV P                  W48  4       R# )zß
Each call to L{_MaildirNameGenerator.generate} returns a unique
string suitable for use as the basename of a new message file.  The
names are ordered such that those generated earlier sort less than
those generated later.
gš™™™™™©?N)r   ÚClockÚadvancer   rÔ   Ú_MaildirNameGeneratorÚgeneraterC   )rK   ÚclockÚ	generatorÚ	firstNameÚ
secondNames   &    rO   Útest_nameGeneratorÚMaildirTests.test_nameGeneratorŒ  sf   € ô —
’
“ˆØ�‰�dÔÜ—L‘L×6Ñ6°uÓ=ˆ	à×&Ñ&Ó(ˆ	Ø�‰�dÔØ×'Ñ'Ó)ˆ
à�‰˜	Ñ.Ö/r[   r+   c           
     óV  € \         P                  P                  p\        P                  P
                  pR UUu. uF!  p\        ^4       F  qA! W2! 4       4      NK  	  K#  	  ppp^pV FR  p\        V! V P                  V4      R4      ;_uu_ 4       pVP                  RV,          4       RRR4       V^,           pKT  	  \        P                  P                  V P                  4      p	V P                  V	P                  4       \        \        ^^4      4      4       V P                  V	P                  ^4      ^4       V P                  V	P                  ^4      ^4       V P                  V	P                  ^4      P                  4       R4       V P                  V	P                  ^4      P                  4       R4       / p
\        ^
4       F+  pV	P!                  V4      pV P#                  Wº9   4       RW«&   K-  	  \         P                  P%                  V^,          4      w  rÇV	P'                  ^4       V P                  V	P                  ^4      ^ 4       V P)                  \         P                  P+                  V! V P                  RRV4      4      4       V P#                  \         P                  P+                  V! V P                  V^,          4      4      4       V	P-                  4        V P                  V	P                  ^4      ^4       V P#                  \         P                  P+                  V! V P                  RRV4      4      4       V P)                  \         P                  P+                  V! V P                  V^,          4      4      4       R# u uppi   + '       g   i     EL÷; i)	zJ
Exercise the methods of L{IMailbox} as implemented by
L{MaildirMailbox}.
rª  ÚwrL   Nr¨  )rª  r©  ÚxxxxxxxÚxx)r¾   r¿   r¬  r   rÔ   Ú_generateMaildirNamer6   r®   rM   r9  r   r8   r	  r:   r  rÇ   r  r½   rŸ   r  rC   r�   r#  )rK   ÚjÚnr0   rL   Úmsgsry  r¯   ÚfObjÚmbrM   ÚuÚps   &            rO   Útest_mailboxÚMaildirTests.test_mailbox�  s–  € ô �G‰G�L‰LˆÜ�L‰L×-Ñ-ˆÙ#1ÔD¡>˜a¼5À¾8°a��!�Q“S–	¹8‘	¡>ˆÑDð ˆÛˆAÜ‘a˜Ÿ™ “l C×(Ô(¨DØ—
‘
˜3 �7Ô#÷ )à�A•ŠAñ ô
 �\‰\×(Ñ(¨¯©Ó0ˆØ×Ñ˜Ÿ™Ó*¬D´°q¸"³Ó,>Ô?Ø×Ñ˜Ÿ™¨Ó+¨QÔ/Ø×Ñ˜Ÿ™¨Ó+¨QÔ/à×Ñ˜Ÿ™ qÓ)×.Ñ.Ó0°'Ô:Ø×Ñ˜Ÿ™ qÓ)×.Ñ.Ó0°'Ô:àˆÜ�r–ˆAØ—
‘
˜1“ˆAØ×Ñ˜Q™VÔ$ØˆA‹Dñ ô
 �w‰w�}‰}˜T !�WÓ%‰ˆà
×Ñ˜ÔØ×Ñ˜Ÿ™¨Ó+¨QÔ/Ø�‰œŸ™Ÿ™¡q¨¯©°¸5À!Ó'DÓEÔFØ×ÑœŸ™Ÿ™©¨$¯&©&°$°qµ'Ó(:Ó;Ô<à
×ÑÔØ×Ñ˜Ÿ™¨Ó+¨QÔ/Ø×ÑœŸ™Ÿ™©¨$¯&©&°(¸EÀ1Ó(EÓFÔGØ�‰œŸ™Ÿ™¡q¨¯©°°aµÓ'9Ó:Ö;ùóC E÷
 )×(Ð(ús   º'NÂNÎN(rŽ  Nro   )rU   rq   rr   rs   r|   r¥  r¯  rº  r   rt   ru   rÈ  rv   r5   r[   rO   rŸ  rŸ  p  s?   † ò/òòCò&0ñ" ˆC×Ñ Ñ$Ð&>Ó?ñ(<ó @ô(<r[   rŸ  c                  ó    € ] tR tRtRtR tRtR# )ÚAbstractMaildirDomainTestsiÉ  z:
Tests for L{twisted.mail.maildir.AbstractMaildirDomain}.
c                ó~   € \        \        P                  P                  \        P                  P                  4       R# )zG
L{maildir.AbstractMaildirDomain} implements L{mail.IAliasableDomain}.
N)r	   r   ÚIAliasableDomainrÔ   ÚAbstractMaildirDomainr]   s   &rO   Útest_interfaceÚ)AbstractMaildirDomainTests.test_interfaceÏ  s"   € ô 	”D—I‘I×.Ñ.´·±×0RÑ0RÖSr[   r5   N)rU   rq   rr   rs   r¦   rÏ  rv   r5   r[   rO   rË  rË  É  s   † ñöTr[   rË  c                  óæ   € ] tR tRtRtR R ltR t]! ]P                  R8¬  R4      R 4       t
R t]! ]P                  R8¬  R4      R	 4       t]! ]P                  R8¬  R4      R
 4       tR R ltRtR# )ÚMaildirDirdbmDomainTestsiÖ  z#
Tests for L{MaildirDirdbmDomain}.
c               ó   € V ^8„  d   QhRR/# r`  r5   )rL  s   "rO   rM  Ú%MaildirDirdbmDomainTests.__annotate__Ü  s   € ÷ Bñ B�tñ Br[   c                óè   € V P                  4       V n        \        P                  P                  4       V n        \        P
                  P                  V P                  V P                  4      V n        R# )z_
Create a temporary L{MaildirDirdbmDomain} and parent
L{MailService} before running each test.
N)r«   ÚPr   r“   ÚSrÔ   ÚMaildirDirdbmDomainÚDr]   s   &rO   r|   ÚMaildirDirdbmDomainTests.setUpÜ  sE   € ð
 —‘“ˆŒÜ—‘×&Ñ&Ó(ˆŒÜ—‘×1Ñ1°$·&±&¸$¿&¹&ÓAˆŽr[   c                óF   € \         P                  ! V P                  4       R# )zG
Remove the temporary C{maildir} directory when the test has
finished.
N)r£  r¤  rÖ  r]   s   &rO   r¥  Ú!MaildirDirdbmDomainTests.tearDownå  s   € ô
 	�Š�d—f‘fÖr[   r+   c           	     óÀ  € RpV F   w  r#V P                   P                  W#4       K"  	  V F¯  w  r#V P                  W P                   P                  9   4       V P	                  V P                   P                  V,          V4       V P                  \
        P                  P                  \
        P                  P                  V P                  V4      4      4       K±  	  R# )zž
L{MaildirDirdbmDomain.addUser} accepts a user and password
argument. It stores those in a C{dbm} dictionary
attribute and creates a directory for each user.
N))Úuser1Úpwd1)Úuser2Úpwd2)Úuser3Úpwd3)
rÙ  r‹   rC   Údbmr8   r¾   r¿   r�   r¬  rÖ  )rK   ÚtoAddrÆ  rÇ  s   &   rO   Útest_addUserÚ%MaildirDirdbmDomainTests.test_addUserì  s’   € ð JˆÛ‰DˆAØ�F‰F�N‰N˜1Ö ñ ó ‰DˆAØ�O‰O˜A§¡§¡™OÔ,Ø×Ñ˜TŸV™VŸZ™Z¨�]¨AÔ.Ø�O‰OœBŸG™GŸN™N¬2¯7©7¯<©<¸¿¹ÀÓ+BÓCÖDó r[   c                óh  € V P                   P                  4       pV P                  \        V4      ^4       V P	                  \
        P                  P                  P                  V^ ,          4      4       V P	                  \
        P                  P                  V^ ,          P                  9   4       R# )zv
L{MaildirDirdbmDomain.getCredentialsCheckers} initializes and
returns one L{ICredentialsChecker} checker by default.
N)rÙ  ÚgetCredentialsCheckersr8   r9   rC   r
   ÚcheckersÚICredentialsCheckerÚ
providedByÚcredentialsÚIUsernamePasswordÚcredentialInterfaces)rK   Úcredss   & rO   Útest_credentialsÚ)MaildirDirdbmDomainTests.test_credentialsü  sy   € ð
 —‘×-Ñ-Ó/ˆà×Ñœ˜U› QÔ'Ø�‰œŸ™×9Ñ9×DÑDÀUÈ1ÅXÓNÔOØ�‰Ü×Ñ×.Ñ.°%¸µ(×2OÑ2OÑOö	
r[   c                ó  €  ! R R\         4      pV P                  P                  RR4       V P                  \        V P                  P
                  RRV4       V P                  P                  RR\        P                  4      pV P                  \        V4      ^4       V P                  V^ ,          \        P                  J 4       V P                  \        P                  P                  V^,          4      4       V^,          ! 4        R# )a  
L{MaildirDirdbmDomain.requestAvatar} raises L{NotImplementedError}
unless it is supplied with an L{pop3.IMailbox} interface.
When called with an L{pop3.IMailbox}, it returns a 3-tuple
containing L{pop3.IMailbox}, an implementation of that interface
and a NOOP callable.
c                  ó   € ] tR tRtRtR# )Ú?MaildirDirdbmDomainTests.test_requestAvatar.<locals>.ISomethingi  r5   N)rU   rq   rr   rs   rv   r5   r[   rO   Ú
ISomethingrõ    s   † Ûr[   rö  ÚuserrŠ   N)r   rÙ  r‹   r   ÚNotImplementedErrorÚrequestAvatarr   ÚIMailboxr8   r9   rC   rì  )rK   rö  Úts   &  rO   Útest_requestAvatarÚ+MaildirDirdbmDomainTests.test_requestAvatar	  s¸   € ô	œô 	ð 	�‰�‰�v˜zÔ*Ø×ÑÜ §¡×!5Ñ!5°v¸tÀZô	
ð �F‰F× Ñ  ¨¬t¯}©}Ó=ˆØ×Ñœ˜Q› Ô#Ø�‰˜˜!�¤§¡Ð-Ô.Ø�‰œŸ™×0Ñ0°°1µÓ6Ô7à	ˆ!ŽŽr[   c                ó¬  € V P                   P                  RR4       V P                   P                  4       ^ ,          p\        P                  P                  RR4      pV P                  \        P                  P                  VP                  V4       \        P                  P                  RR4      pV P                  VP                  V4      R4       R# )zà
L{DirdbmDatabase.requestAvatarId} raises L{UnauthorizedLogin} if
supplied with invalid user credentials.
When called with valid credentials, L{requestAvatarId} returns
the username associated with the supplied credentials.
r÷  rŠ   zwrong passwordN)rÙ  r‹   ré  r
   rí  ÚUsernamePasswordr   ÚerrorÚUnauthorizedLoginÚrequestAvatarIdr8   )rK   Údatabaserð  s   &  rO   Útest_requestAvatarIdÚ-MaildirDirdbmDomainTests.test_requestAvatarId"  sœ   € ð 	�‰�‰�v˜zÔ*Ø—6‘6×0Ñ0Ó2°1Õ5ˆä× Ñ ×1Ñ1°&Ð:JÓKˆØ×Ñœ$Ÿ*™*×6Ñ6¸×8PÑ8PÐRWÔXä× Ñ ×1Ñ1°&¸*ÓEˆØ×Ñ˜×1Ñ1°%Ó8¸&ÖAr[   c               ó   € V ^8„  d   QhRR/# r`  r5   )rL  s   "rO   rM  rÔ  3  s   € ÷ 
ñ 
 Dñ 
r[   c                óL  € V P                   P                  RR4       V P                  V P                   P                  R4      \        P
                  P                  V P                   P                  R4      4       RV P                   n        V P                  V P                   P                  R4      R4       RV P                   n        V P                  V P                   P                  R4      \        P
                  P                  V P                   P                  R4      4       R# )a-  
L{MaildirDirdbmDomain.userDirectory} is supplied with a user name
and returns the path to that user's maildir subdirectory.
Calling L{MaildirDirdbmDomain.userDirectory} with a
non-existent user returns the 'postmaster' directory if there
is a postmaster or returns L{None} if there is no postmaster.
ó   useró   passwordFs   nouserNTs
   postmaster)
rÙ  r‹   r8   ÚuserDirectoryr¾   r¿   r¬  ÚrootÚ
postmasterÚassertIdenticalr]   s   &rO   Útest_userDirectoryÚ+MaildirDirdbmDomainTests.test_userDirectory3  sÂ   € ð 	�‰�‰�w Ô,Ø×ÑØ�F‰F× Ñ  Ó)¬2¯7©7¯<©<¸¿¹¿¹ÀWÓ+Mô	
ð "ˆ�‰ÔØ×Ñ˜TŸV™V×1Ñ1°)Ó<¸dÔCà ˆ�‰ÔØ×ÑØ�F‰F× Ñ  Ó+Ü�G‰G�L‰L˜Ÿ™Ÿ™ mÓ4ö	
r[   )rÙ  rÖ  r×  Nro   )rU   rq   rr   rs   r¦   r|   r¥  r   rt   ru   ræ  rñ  rü  r  r  rv   r5   r[   rO   rÒ  rÒ  Ö  s�   † ñõBòñ ˆC×Ñ Ñ$Ð&>Ó?ñEó @ðEò
ñ ˆC×Ñ Ñ$Ð&>Ó?ñó @ðñ0 ˆC×Ñ Ñ$Ð&>Ó?ñBó @ðB÷ 
ñ 
r[   rÒ  c                  óB   € ] tR tRtRtRR ltR tR tR tR R	 lt	R
t
R# )ÚStubAliasableDomainiJ  z6
Minimal testable implementation of IAliasableDomain.
Nc                ó   € \        4       h©zc
No test coverage for invocations of this method on domain objects,
so we just won't implement it.
©rø  ©rK   r÷  Úmemos   &&&rO   r�   ÚStubAliasableDomain.existsP  ó   € ô
 "Ó#Ð#r[   c                ó   € \        4       hr  r  )rK   r÷  rŠ   s   &&&rO   r‹   ÚStubAliasableDomain.addUserW  r  r[   c                ó   € . # )zù
This needs to succeed in order for other tests to complete
successfully, but we don't actually assert anything about its
behavior.  Return an empty list.  Sometime later we should return
something else and assert that a portal got set up properly.
r5   r]   s   &rO   ré  Ú*StubAliasableDomain.getCredentialsCheckers^  s	   € ð ˆ	r[   c                ó   € Wn         R# )z7
Just record the value so the test can check it later.
N©Ú
aliasGroup)rK   Úaliasess   &&rO   ÚsetAliasGroupÚ!StubAliasableDomain.setAliasGroupg  s	   € ð "Žr[   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r  ÚavatarIdzbytes | tuple[()]Úmindrú   r   ztype[Interface]rK  r   r5   )rL  s   "rO   rM  Ú StubAliasableDomain.__annotate__m  s,   € ÷ $ñ $Ø)ð$Ø17ð$ØFUð$à	ñ$r[   c                ó   € \        4       h)z)
Stub domains cannot authenticate users.
r  )rK   r$  r%  r   s   &&&*rO   rù  Ú!StubAliasableDomain.requestAvatarm  s   € ô "Ó#Ð#r[   r  rz   )rU   rq   rr   rs   r¦   r�   r‹   ré  r!  rù  rv   r5   r[   rO   r  r  J  s%   † ñô$ò$òò"÷$ñ $r[   r  c                  ó°   € ] tR tRtR tR tR t]! ]P                  R8¬  R4      R 4       t
]! ]P                  R8¬  R4      R 4       tR tR	 tR
 tR tRtR# )ÚServiceDomainTestsiv  c                	ó  € \         P                   P                  4       V n        \         P                  P	                  V P                  R 4      V n        V P                  V P
                  n        RV P
                  n        RV P
                  n        V P                  4       V n
        \         P                  P                  V P                  V P                  4      pVP                  RR4       V P                  P                  RV4       R # )NÚTESTÚhostnamer  r	  útest.domain)r   r“   r×  r•   ÚDomainDeliveryBaserÙ  r    ÚprotocolNameÚhostr«   ÚtmpdirrÔ   rØ  r‹   r”   ©rK   rX   s   & rO   r|   ÚServiceDomainTests.setUpx  s¥   € Ü—‘×&Ñ&Ó(ˆŒÜ—‘×2Ñ2°4·6±6¸4Ó@ˆŒØŸ™ˆ�‰ŒØ$ˆ�‰ÔØ ˆ�‰Œà—k‘k“mˆŒÜ—‘×1Ñ1°$·&±&¸$¿+¹+ÓFˆØ�‰�w Ô,Ø�‰×Ñ˜¨Ö/r[   c                	óF   € \         P                  ! V P                  4       R # rz   ©r£  r¤  r2  r]   s   &rO   r¥  ÚServiceDomainTests.tearDown„  ó   € Ü�Š�d—k‘kÖ"r[   c                ó¾   € \        4       p\        4       pWP                  n        V P                  P	                  RV4       V P                  VP                  V4       R# )zj
Test that adding an IAliasableDomain to a mail service properly sets
up alias group references and such.
úexample.comN)rú   r  r×  r   r”   r  r  )rK   r   rX   s   &  rO   ÚtestAddAliasableDomainÚ)ServiceDomainTests.testAddAliasableDomain‡  sF   € ô
 “(ˆÜ$Ó&ˆØ �‰ŒØ�‰×Ñ˜¨Ô/Ø×Ñ˜V×.Ñ.°Ö8r[   r+   c                	ój  € V P                   P                  R\        P                  ! R4      R.4      p\        P
                  ! V4      p\        P                  P                  4       pVP                  V4      pV P                  \        VP                  4       4      ^4       V P                  RV4       R# )Ú
remotehostz<someguy@someplace>zuser@host.nameÚReceivedN)r>  z123.232.101.234)rÙ  ÚreceivedHeaderr   ÚAddressÚioÚBytesIOÚemailÚparserÚParserÚparser8   r9   r@   rS   )rK   Úhdrr³   ÚemailParserrV  s   &    rO   ÚtestReceivedHeaderÚ%ServiceDomainTests.testReceivedHeader’  s…   € à�f‰f×#Ñ#Ø-Ü�LŠLÐ.Ó/ØÐó
ˆô
 �ZŠZ˜‹_ˆÜ—l‘l×)Ñ)Ó+ˆØ×Ñ˜bÓ!ˆØ×Ñœ˜QŸW™W›Y›¨Ô+Ø�‰�j !Ö$r[   c                	ó¼   € \         P                  ! R RRR4      p\        P                  ! V P                  P
                  V4      P                  V P                  4      # )zuser@test.domainÚheloNúwherever@whatever)r   ÚUserr   ÚmaybeDeferredrÙ  Ú
validateTor·   Ú_cbValidateTo©rK   r÷  s   & rO   ÚtestValidateToÚ!ServiceDomainTests.testValidateToŸ  sK   € ä�yŠyÐ+¨V°TÐ;NÓOˆÜ×"Ò" 4§6¡6×#4Ñ#4°dÓ;×GÑGØ×Ñó
ð 	
r[   c                	ó:   € V P                  \        V4      4       R # rz   )rC   ÚcallablerÀ   s   &&rO   rR  Ú ServiceDomainTests._cbValidateTo¦  s   € Ø�‰œ Ó(Ö)r[   c                	óÆ   € \         P                  ! R RRR4      pV P                  \        P                  ! V P
                  P                  V4      \         P                  4      # )zresu@test.domainrM  NrN  ©r   rO  rj  r   rP  rÙ  rQ  rŒ   rS  s   & rO   ÚtestValidateToBadUsernameÚ,ServiceDomainTests.testValidateToBadUsername©  óM   € Ü�yŠyÐ+¨V°TÐ;NÓOˆØ×!Ñ!Ü×Ò §¡× 1Ñ 1°4Ó8¼$×:JÑ:Jó
ð 	
r[   c                	óÆ   € \         P                  ! R RRR4      pV P                  \        P                  ! V P
                  P                  V4      \         P                  4      # )zuser@domain.testrM  NrN  rZ  rS  s   & rO   ÚtestValidateToBadDomainÚ*ServiceDomainTests.testValidateToBadDomain¯  r]  r[   c                	ó
  € Rp\         P                  ! R4      pV P                  V P                  P	                  W4      VJ 4       Rp\         P                  ! R4      pV P                  V P                  P	                  W4      VJ 4       Rp\         P                  ! R4      pV P                  V P                  P	                  W4      VJ 4       V P                  \         P                  V P                  P                  RV4       R# )r-  z<user@hostname>z<>N)r-  rì   )r-  ú1.2.3.4)r   rA  rC   rÙ  ÚvalidateFromr   ÚSMTPBadSender)rK   rM  Úorigins   &  rO   ÚtestValidateFromÚ#ServiceDomainTests.testValidateFromµ  sÁ   € Ø(ˆÜ—’Ð/Ó0ˆØ�‰˜Ÿ™×+Ñ+¨DÓ9¸VÐCÔDà&ˆÜ—’Ð/Ó0ˆØ�‰˜Ÿ™×+Ñ+¨DÓ9¸VÐCÔDà&ˆÜ—’˜dÓ#ˆØ�‰˜Ÿ™×+Ñ+¨DÓ9¸VÐCÔDà×Ñœ$×,Ñ,¨d¯f©f×.AÑ.AÀ4ÈÖPr[   )rÙ  r×  r2  Nro   )rU   rq   rr   rs   r|   r¥  r;  r   rt   ru   rJ  rT  rR  r[  r_  rf  rv   r5   r[   rO   r*  r*  v  sv   † ò
0ò#ò	9ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
%ó @ð
%ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ò*ò
ò
öQr[   r*  c                  ó   € ] tR tRtR R ltR t]! ]P                  R8¬  R4      R 4       t	R t
]! ]P                  R8¬  R4      R 4       t]! ]P                  R8¬  R4      R	 4       tR
 R ltR tR R ltR R ltRtR# )ÚVirtualPOP3TestsiÅ  c               ó   € V ^8„  d   QhRR/# r`  r5   )rL  s   "rO   rM  ÚVirtualPOP3Tests.__annotate__Ç  s   € ÷ 	,ñ 	,�tñ 	,r[   c                	óV  € V P                  4       V n        \        P                  P                  4       V n        \        P
                  P                  V P                  V P                  4      V n        V P                  P                  R R4       V P                  P                  RV P                  4       V P                  P                  RV P                  4       \        P                  P                  4       V n        V P                  V P                  n        RV P                  n        R# )r  r	  s   test.domainr[   s   <unit test magic>N)r«   r2  r   r“   r×  rÔ   rØ  rÙ  r‹   r”   r•   ÚVirtualPOP3rÖ  r    Úmagicr]   s   &rO   r|   ÚVirtualPOP3Tests.setUpÇ  s³   € Ø—k‘k“mˆŒÜ—‘×&Ñ&Ó(ˆŒÜ—‘×1Ñ1°$·&±&¸$¿+¹+ÓFˆŒØ�‰�‰�w Ô,Ø�‰×Ñ˜¨¯©Ô0Ø�‰×Ñ˜˜dŸf™fÔ%Ü—‘×+Ñ+Ó-ˆŒØŸ™ˆ�‰ŒØ+ˆ�‰Žr[   c                	óF   € \         P                  ! V P                  4       R # rz   r6  r]   s   &rO   r¥  ÚVirtualPOP3Tests.tearDownÒ  r8  r[   r+   c                	óÔ   € \        V P                  P                  R ,           4      P                  4       pV P                  P	                  RV4      P                  V P                  4      # )rŠ   r÷  )r   rÖ  rn  Ú	hexdigestÚauthenticateUserAPOPr·   Ú_cbAuthenticateAPOP©rK   Úresps   & rO   ÚtestAuthenticateAPOPÚ%VirtualPOP3Tests.testAuthenticateAPOPÕ  sO   € ä�4—6‘6—<‘< *Õ,Ó-×7Ñ7Ó9ˆØ�v‰v×*Ñ*¨6°4Ó8×DÑDØ×$Ñ$ó
ð 	
r[   c                	ó  € V P                  \        V4      ^4       V P                  V^ ,          \        P                  4       V P	                  \        P                  P                  V^,          4      4       V^,          ! 4        R# ©rp   N©r8   r9   r   rú  rC   rì  rÀ   s   &&rO   ru  Ú$VirtualPOP3Tests._cbAuthenticateAPOPÜ  óV   € Ø×Ñœ˜V› aÔ(Ø×Ñ˜ �¤D§M¡MÔ2Ø�‰œŸ™×0Ñ0°¸µÓ;Ô<ØˆqŽ	Žr[   c                	óò   € \        V P                  P                  R ,           4      P                  4       pV P	                  V P                  P                  RV4      \        P                  P                  4      # )rŠ   Úresu)	r   rÖ  rn  rs  rj  rt  r
   r   r  rv  s   & rO   Ú!testAuthenticateIncorrectUserAPOPÚ2VirtualPOP3Tests.testAuthenticateIncorrectUserAPOPâ  sU   € ä�4—6‘6—<‘< *Õ,Ó-×7Ñ7Ó9ˆØ×!Ñ!Ø�F‰F×'Ñ'¨°Ó5´t·z±z×7SÑ7Só
ð 	
r[   c                	ó¼   € \        R 4      P                  4       pV P                  V P                  P	                  RV4      \
        P                  P                  4      # )zwrong digestr÷  )r   rs  rj  rÖ  rt  r
   r   r  rv  s   & rO   Ú%testAuthenticateIncorrectResponseAPOPÚ6VirtualPOP3Tests.testAuthenticateIncorrectResponseAPOPé  sH   € ä�>Ó"×,Ñ,Ó.ˆØ×!Ñ!Ø�F‰F×'Ñ'¨°Ó5´t·z±z×7SÑ7Só
ð 	
r[   c               ó   € V ^8„  d   QhRR/# )r  rK  zDeferred[object]r5   )rL  s   "rO   rM  rk  ð  s   € ÷ 
ñ 
Ð&6ñ 
r[   c                	ól   € V P                   P                  R R4      P                  V P                  4      # )r  r	  )rÖ  ÚauthenticateUserPASSr·   Ú_cbAuthenticatePASSr]   s   &rO   ÚtestAuthenticatePASSÚ%VirtualPOP3Tests.testAuthenticatePASSð  s/   € Ø�v‰v×*Ñ*¨7°KÓ@×LÑLØ×$Ñ$ó
ð 	
r[   c                	ó  € V P                  \        V4      ^4       V P                  V^ ,          \        P                  4       V P	                  \        P                  P                  V^,          4      4       V^,          ! 4        R# r{  r|  rÀ   s   &&rO   r‰  Ú$VirtualPOP3Tests._cbAuthenticatePASSõ  r~  r[   c               ó   € V ^8„  d   QhRR/# rt  r5   )rL  s   "rO   rM  rk  û  s   € ÷ 
ñ 
¨Sñ 
r[   c                	óŠ   € V P                  V P                  P                  R R4      \        P                  P
                  4      # )s   resur	  ©rj  rÖ  rˆ  r
   r   r  r]   s   &rO   ÚtestAuthenticateBadUserPASSÚ,VirtualPOP3Tests.testAuthenticateBadUserPASSû  s6   € Ø×!Ñ!Ø�F‰F×'Ñ'¨°Ó=Ü�J‰J×(Ñ(ó
ð 	
r[   c               ó   € V ^8„  d   QhRR/# rt  r5   )rL  s   "rO   rM  rk    s   € ÷ 
ñ 
°ñ 
r[   c                	óŠ   € V P                  V P                  P                  R R4      \        P                  P
                  4      # )r  s   wrong passwordr�  r]   s   &rO   ÚtestAuthenticateBadPasswordPASSÚ0VirtualPOP3Tests.testAuthenticateBadPasswordPASS  s7   € Ø×!Ñ!Ø�F‰F×'Ñ'¨Ð1BÓCÜ�J‰J×(Ñ(ó
ð 	
r[   )rÙ  rÖ  r×  r2  Nro   )rU   rq   rr   rs   r|   r¥  r   rt   ru   rx  ru  r�  r„  rŠ  r‰  r‘  r•  rv   r5   r[   rO   ri  ri  Å  s¢   † õ	,ò#ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
òñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
õ
ò
õ
÷
ñ 
r[   ri  c                  ó   € ] tR tRtR tRtR# )Úemptyi  c                	ó   € R # rz   r5   r]   s   &rO   Ú__init__Úempty.__init__	  s   € Ùr[   r5   N)rU   rq   rr   rs   rš  rv   r5   r[   rO   r˜  r˜    s   † ör[   r˜  c                  óN   € ] tR tRt]! ]P                  R8¬  R4      R 4       tRtR# )Ú
RelayTestsi  r+   c                	ó†  a€ \         P                   P                  4       p\         P                  P                  V4      p\        P
                  ! R 4      \        P                  ! RRR4      .p\        P                  ! RR^>4      \        P                  ! RRR4      .pV F‹  o\        4       pRVn        RVn	        \        4       Vn
        \        4       VP                  n        V3R	 lVP                  P                  n        V P                  \        VP                  V4      4      4       K�  	  V F�  o\        4       pR
Vn        \        4       Vn
        \        4       VP                  n        V3R lVP                  P                  n        RVn	        V P!                  \"        P$                  VP                  V4       K�  	  R# )z/var/run/mail-relayÚTCPrì   rí   z192.168.2.1rb  i—  z	user@hostz	tsoh@resuc                 ó   <€ S # rz   r5   ©Úpeers   €rO   Ú<lambda>Ú'RelayTests.testExists.<locals>.<lambda>$  ó   ø€ ±dr[   z
some@placec                 ó   <€ S # rz   r5   r¡  s   €rO   r£  r¤  -  r¥  r[   z	who@caresN)r   r“   ÚrelayÚDomainQueuerr   ÚUNIXAddressÚIPv4Addressr˜  ÚorigÚdestr   r£   ÚgetPeerrC   rW  r�   r   r   rŒ   )rK   r    rX   ÚdoRelayÚ	dontRelayr÷  r¢  s   &     @rO   r‚   ÚRelayTests.testExists  sJ  ø€ ä—)‘)×'Ñ'Ó)ˆÜ—‘×(Ñ(¨Ó1ˆô ×ÒÐ 5Ó6Ü×Ò  {°EÓ:ð
ˆô ×Ò  }°bÓ9Ü×Ò  y°$Ó7ð
ˆ	ó
 ˆDÜ“7ˆDØ#ˆDŒIØ#ˆDŒIÜ!›GˆDŒMÜ&+£gˆD�M‰MÔ#Ü.:ˆD�M‰M×#Ñ#Ô+à�O‰OœH V§]¡]°4Ó%8Ó9Ö:ñ ó ˆDÜ“7ˆDØ$ˆDŒIÜ!›GˆDŒMÜ&+£gˆD�M‰MÔ#Ü.:ˆD�M‰M×#Ñ#Ô+Ø#ˆDŒIà×Ñœd×.Ñ.°·±¸tÖDó r[   r5   Nro   )	rU   rq   rr   rs   r   rt   ru   r‚   rv   r5   r[   rO   r�  r�    s*   † áˆC×Ñ Ñ$Ð&>Ó?ñ Eó @ô Er[   r�  c                  ó4   € ] tR tRtR tR tR tR tR tRt	R# )	ÚRelayerTestsi3  c                	óø  € V P                  4       V n        \        P                  ! V P                  4       . V n        \        ^
4       FÓ  p\        P                  P                  V P                  RV3,          4      p\        VR,           R4      ;_uu_ 4       p\        P                  ! RV3,          RV3,          .V4       RRR4       \        VR,           R4      pVP                  V4       VP                  ^ ^ 4       V P                  P                  V4       KÕ  	  \        P                  P!                  4       V n        V P"                  P%                  V P                  4       R#   + '       g   i     L¯; i)	r-   úbody-%dú-Hrª   úfrom-%dúto-%dNú-Dr½  )r«   r2  r¾   ÚmkdirÚmessageFilesr6   r¿   r¬  r®   ÚpickleÚdumpr9  r™  rT  r   r§  ÚRelayerMixinÚRÚloadMessages)rK   ry  r¬   r¯   s   &   rO   r|   ÚRelayerTests.setUp5  s  € Ø—k‘k“mˆŒÜ
�Š�—‘ÔØˆÔÜ�r–ˆAÜ—7‘7—<‘< §¡¨Y¸!¸Õ-=Ó>ˆDÜ�d˜T•k 4×(Ô(¨AÜ—’˜Y¨!¨Õ-¨w¸!¸­~Ð>ÀÔB÷ )ô �T˜D•[ #Ó&ˆAØ�G‰G�DŒMØ�F‰F�1�aŒLØ×Ñ×$Ñ$ TÖ*ñ ô —‘×(Ñ(Ó*ˆŒØ�‰×Ñ˜D×-Ñ-Ö.÷ )×(ús   Â*E)Å)E9c                	óF   € \         P                  ! V P                  4       R # rz   r6  r]   s   &rO   r¥  ÚRelayerTests.tearDownF  r8  r[   c                	ó   € \        ^
4       FT  pV P                  V P                  P                  4       RV3,          4       V P                  P	                  ^úRRRR4       KV  	  V P                  V P                  P                  4       R4       R# )r-   r¶  N)r6   r8   r¾  ÚgetMailFromÚsentMail©rK   ry  s   & rO   ÚtestMailFromÚRelayerTests.testMailFromI  sk   € Ü�r–ˆAØ×Ñ˜TŸV™V×/Ñ/Ó1°9À¸tÕ3CÔDØ�F‰F�O‰O˜C  t¨T°4Ö8ñ ð 	×Ñ˜Ÿ™×+Ñ+Ó-¨tÖ4r[   c                	ó"  € \        ^
4       FU  pV P                  V P                  P                  4       RV3,          .4       V P                  P	                  ^úRRRR4       KW  	  V P                  V P                  P                  4       R4       R# )r-   r·  N)r6   r8   r¾  Ú	getMailTorÅ  rÆ  s   & rO   Ú
testMailToÚRelayerTests.testMailToO  sm   € Ü�r–ˆAØ×Ñ˜TŸV™V×-Ñ-Ó/°'¸Q¸Dµ.Ð1AÔBØ�F‰F�O‰O˜C  t¨T°4Ö8ñ ð 	×Ñ˜Ÿ™×)Ñ)Ó+¨TÖ2r[   c                	ó�  € \        ^
4       FŒ  p\        P                  P                  V P                  RV3,          4      pV P                  V P                  P                  4       P                  4       V4       V P                  P                  ^úRRRR4       KŽ  	  V P                  V P                  P                  4       R4       R# )r-   r´  N)
r6   r¾   r¿   r¬  r2  r8   r¾  ÚgetMailDatarÇ   rÅ  )rK   ry  r¬   s   &  rO   ÚtestMailDataÚRelayerTests.testMailDataU  sŒ   € Ü�r–ˆAÜ—7‘7—<‘< §¡¨Y¸!¸Õ-=Ó>ˆDØ×Ñ˜TŸV™V×/Ñ/Ó1×6Ñ6Ó8¸$Ô?Ø�F‰F�O‰O˜C  t¨T°4Ö8ñ ð 	×Ñ˜Ÿ™×+Ñ+Ó-¨tÖ4r[   )r¾  rº  r2  N)
rU   rq   rr   rs   r|   r¥  rÇ  rË  rÏ  rv   r5   r[   rO   r²  r²  3  s   † ò/ò"#ò5ò3ö5r[   r²  c                  ó.   € ] tR tRtR tR tR tR tRtR# )ÚManageri]  c                	ó0   € . V n         . V n        . V n        R # rz   )Úsuccessr#   Údoner]   s   &rO   rš  ÚManager.__init__^  s   € ØˆŒØˆŒØˆŽ	r[   c                	ó>   € V P                   P                  W34       R # rz   )rÔ  rT  ©rK   r¡   rg   s   &&&rO   ÚnotifySuccessÚManager.notifySuccessc  ó   € Ø�‰×Ñ˜WÐ.Ö/r[   c                	ó>   € V P                   P                  W34       R # rz   )r#   rT  rØ  s   &&&rO   ÚnotifyFailureÚManager.notifyFailuref  rÛ  r[   c                	ó<   € V P                   P                  V4       R # rz   )rÕ  rT  )rK   r¡   s   &&rO   Ú
notifyDoneÚManager.notifyDonei  s   € Ø�	‰	×Ñ˜Ö!r[   )rÕ  r#   rÔ  N)	rU   rq   rr   rs   rš  rÙ  rÝ  rà  rv   r5   r[   rO   rÒ  rÒ  ]  s   † òò
0ò0ö"r[   rÒ  c                  ó.   € ] tR tRtR tR tR tR tRtR# )ÚManagedRelayerTestsim  c                	ó’  € \        4       V n        \        \        ^ ^^4      4      V n        \        4       V n        \        P                  P                  V P                  4      V n
        V P                  R,          V P                  n        V P                  R,          V P                  n        V P                  V P                  n        R# )é    :NNNN)rÒ  Úmanagerr:   r6   rJ  rú   r¡   r   ÚrelaymanagerÚManagedRelayerMixinr§  Únamesr]   s   &rO   r|   ÚManagedRelayerTests.setUpo  s~   € Ü“yˆŒÜœU 1 b¨!›_Ó-ˆŒÜ“xˆŒÜ×&Ñ&×:Ñ:¸4¿<¹<ÓHˆŒ
Ø"Ÿm™m¨AÕ.ˆ�
‰
ÔØŸ=™=¨Õ+ˆ�
‰
ÔØ!Ÿ\™\ˆ�
‰
Ör[   c                	ó
  € V P                    F"  pV P                  P                  ^úRRRR4       K$  	  T P                  V P                  P
                  V P                    Uu. uF  q P                  V3NK  	  up4       R# u upi )éú   N)rJ  r§  rÅ  r8   ræ  rÔ  r¡   ©rK   ry  rV  s   &  rO   ÚtestSuccessfulSentMailÚ*ManagedRelayerTests.testSuccessfulSentMailx  óf   € Ø—”ˆAØ�J‰J×Ñ  T¨4°°tÖ<ñ ð 	×ÑØ�L‰L× Ñ ¸d¿mºmÓ"L¹m¸§L¡L°!Ó#4¹mÑ"Lö	
ùÚ"Ló   Á!B 
c                	ó
  € V P                    F"  pV P                  P                  R RRRR4       K$  	  T P                  V P                  P
                  V P                    Uu. uF  q P                  V3NK  	  up4       R# u upi )i&  N)rJ  r§  rÅ  r8   ræ  r#   r¡   rí  s   &  rO   ÚtestFailedSentMailÚ&ManagedRelayerTests.testFailedSentMail€  rð  rñ  c                	óÖ   € V P                   P                  \        P                  ! \	        4       4      4       V P                  V P                  P                  V P                  .4       R # rz   )	r§  r�   r#   ÚFailurerk  r8   ræ  rÕ  r¡   r]   s   &rO   ÚtestConnectionLostÚ&ManagedRelayerTests.testConnectionLostˆ  s?   € Ø�
‰
×!Ñ!¤'§/¢/´)³+Ó">Ô?Ø×Ñ˜Ÿ™×*Ñ*¨T¯\©\¨NÖ;r[   )r¡   ræ  rJ  r§  N)	rU   rq   rr   rs   r|   rî  ró  r÷  rv   r5   r[   rO   rã  rã  m  s   † ò*ò
ò
ö<r[   rã  c                  óÐ   € ] tR tRtR tR t]! ]P                  R8¬  R4      R 4       t	]! ]P                  R8¬  R4      R 4       t
]! ]P                  R8¬  R4      R 4       tR tR	tR
# )ÚDirectoryQueueTestsi�  c                	óN  € V P                  4       V n        \        P                  ! V P                  4       \        P
                  P                  V P                  4      V n        R V P                  n        \        ^4       Ft  pV P                  P                  4       w  r#V;_uu_ 4        \        P                  ! RV.V4       RRR4       VP                  RV3,          4       VP                  4        Kv  	  V P                  P                  4        R#   + '       g   i     LY; i)FÚheaderNs   body: %d)r«   r2  r¾   r¹  r   rç  ÚQueueÚqueueÚnoisyr6   ÚcreateNewMessager»  r¼  r›   r¶   ÚreadDirectory)rK   rV  ÚhdrFÚmsgFs   &   rO   r|   ÚDirectoryQueueTests.setUp�  sÀ   € à—k‘k“mˆŒÜ
�Š�—‘ÔÜ×&Ñ&×,Ñ,¨T¯[©[Ó9ˆŒ
Ø ˆ�
‰
ÔÜ�r–ˆAØŸ™×4Ñ4Ó6‰JˆDß’Ü—’˜X q˜M¨4Ô0÷ à×Ñ˜k¨Q¨DÕ0Ô1Ø×ÑÖñ ð 	�
‰
× Ñ Ö"÷	 —ús   Â)DÄD$c                	óF   € \         P                  ! V P                  4       R # rz   r6  r]   s   &rO   r¥  ÚDirectoryQueueTests.tearDown�  r8  r[   r+   c                	óF  € V P                  V P                  P                  4       4       V P                  \	        V P                  P                  4       4      ^4       V P                  P                  4       pV P                  P                  V^ ,          4       V P                  \	        V P                  P                  4       4      ^4       V P                  P                  V^ ,          4       V P                  \	        V P                  P                  4       4      ^4       R# ©é   N)rC   rþ  Ú
hasWaitingr8   r9   Ú
getWaitingÚsetRelayingÚ
setWaiting)rK   Úwaitings   & rO   ÚtestWaitingÚDirectoryQueueTests.testWaiting   s¿   € à�‰˜Ÿ
™
×-Ñ-Ó/Ô0Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°rÔ:à—*‘*×'Ñ'Ó)ˆØ�
‰
×Ñ˜w q�zÔ*Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°rÔ:à�
‰
×Ñ˜g a�jÔ)Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°rÖ:r[   c           	     	óÊ  € V P                   P                  4        Fy  pV P                   P                  V4       V P                  \	        V P                   P                  4       4      ^\	        V P                   P                  4       4      ,
          4       K{  	  V P                  V P                   P                  4       4       V P                   P                  4       pV P                   P                  V^ ,          4       V P                  \	        V P                   P                  4       4      ^4       V P                  \	        V P                   P                  4       4      ^4       R# r  )	rþ  r  r  r8   r9   Ú
getRelayedr½   r
  r  )rK   rV  Úrelayeds   &  rO   ÚtestRelayingÚ DirectoryQueueTests.testRelaying¬  sð   € à—‘×&Ñ&Ö(ˆAØ�J‰J×"Ñ" 1Ô%Ø×ÑÜ�D—J‘J×)Ñ)Ó+Ó,¨b´3°t·z±z×7LÑ7LÓ7NÓ3OÕ.Oöñ )ð 	×Ñ˜Ÿ™×.Ñ.Ó0Ô1à—*‘*×'Ñ'Ó)ˆØ�
‰
×Ñ˜g a�jÔ)Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°qÔ9Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°rÖ:r[   c                	ó,  € V P                   P                  4       ^ ,          pV P                   P                  V4       V P                   P                  V4       V P	                  \        V P                   P                  4       4      ^4       V P	                  \        V P                   P                  4       4      ^ 4       V P                  WP                   P                  4       9   4       V P                  WP                   P                  4       9   4       R# )rå  N)rþ  r  r  rÕ  r8   r9   r  r½   )rK   Úmsgs   & rO   ÚtestDoneÚDirectoryQueueTests.testDone»  s»   € à�j‰j×#Ñ#Ó% aÕ(ˆØ�
‰
×Ñ˜sÔ#Ø�
‰
�‰˜Ôà×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°rÔ:Ø×Ñœ˜TŸZ™Z×2Ñ2Ó4Ó5°qÔ9à×Ñ˜§
¡
× 5Ñ 5Ó 7Ñ7Ô8Ø×Ñ˜§
¡
× 5Ñ 5Ó 7Ñ7Ö8r[   c                	ó*  € . pV P                   P                  4        F-  pVP                  V P                   P                  V4      4       K/  	  VP	                  4        \        ^4       F&  pV P                  VP                  ^ 4      RV.4       K(  	  R# )r	  rü  N)rþ  r  rT  ÚgetEnveloper>   r6   r8   Úpop)rK   Ú	envelopesr  ry  s   &   rO   ÚtestEnvelopeÚ DirectoryQueueTests.testEnvelopeÇ  sr   € Øˆ	à—:‘:×(Ñ(Ö*ˆCØ×Ñ˜TŸZ™Z×3Ñ3°CÓ8Ö9ñ +ð 	�‰ÔÜ�r–ˆAØ×Ñ˜YŸ]™]¨1Ó-°¸!¨}Ö=ó r[   )rþ  r2  Nro   )rU   rq   rr   rs   r|   r¥  r   rt   ru   r  r  r  r  rv   r5   r[   rO   rú  rú  �  s‰   † ò#ò#ñ ˆC×Ñ Ñ$Ð&>Ó?ñ	;ó @ð	;ñ ˆC×Ñ Ñ$Ð&>Ó?ñ;ó @ð;ñ ˆC×Ñ Ñ$Ð&>Ó?ñ	9ó @ð	9ö>r[   rú  )ÚclientÚcommonÚserverc                  ó&   € ] tR tRtR tRR ltRtR# )ÚTestAuthorityiÕ  c                	óR   € \         P                  P                  V 4       / V n        R # rz   )r!  ÚResolverBaserš  Ú	addressesr]   s   &rO   rš  ÚTestAuthority.__init__Ö  s   € Ü×Ñ×$Ñ$ TÔ*ØˆŽr[   Nc                	óê  € WP                   9   d§   V\        P                  8X  d’   . pV P                   V,           F_  p\        P                  ! V\        P                  \        P                  ^<\        P
                  ! ^ V4      4      pVP                  V4       Ka  	  \        P                  ! V. . 34      # \        P                  ! \        P                  ! \        P                  ! V4      4      4      # )é<   )r'  r   ÚMXr!   ÚINr    rT  r   ÚsucceedÚfailr#   rö  ÚDomainError)rK   r¬   ÚclsÚtypeÚtimeoutrU  r/   rH  s   &&&&&   rO   Ú_lookupÚTestAuthority._lookupÚ  sŸ   € Ø—>‘>Ô! d¬c¯f©f¤nØˆGØ—^‘^ D×)Ð)�Ü—l’l 4¬¯©´·±¸¼S¿]º]È1ÈaÓ=PÓQ�Ø—‘˜sÖ#ñ *ô —=’= '¨2¨rÐ!2Ó3Ð3Ü�zŠzœ'Ÿ/š/¬#¯/ª/¸$Ó*?Ó@ÓAÐAr[   )r'  rz   )rU   rq   rr   rs   rš  r3  rv   r5   r[   rO   r$  r$  Õ  s   † ò÷Bð Br[   r$  c                óì  € \        4       V n        \        P                  ! V P                  .4      p\        P
                  ! V4      p \        P                  ! ^ VRR7      V n        V P                  P                  4       P                  p \        P                  ! W2RR7      V n         \        P                  ! RT3.R7      T n        R#   \         d    T P                  P                  4         K«  i ; i)r  rì   ©Ú	interface)ÚserversN)r$  Úauthr"  ÚDNSServerFactoryr   ÚDNSDatagramProtocolr   Ú	listenTCPÚportÚgetHostÚ	listenUDPÚudpPortr   ÚstopListeningr   ÚResolverÚresolver)rK   r¡   r   Ú
portNumbers   &   rO   ÚsetUpDNSrE  ä  s¼   € Ü“€D„IÜ×%Ò% t§y¡y kÓ2€GÜ×&Ò& wÓ/€HØ
Ü×%Ò% a¨¸KÔHˆŒ	Ø—Y‘Y×&Ñ&Ó(×-Ñ-ˆ
ð	Ü"×,Ò,Ø°ôˆDŒLð Ü—O’O¨k¸:Ð-FÐ,GÔH€D†Møô	 !ô 	&Ø�I‰I×#Ñ#×%ð	&ús   ÂC
 Ã
%C3Ã2C3c                ó‚  € . pVP                  \        P                  ! V P                  P                  4      4       VP                  \        P                  ! V P
                  P                  4      4        V P                  P                  P                  4        \        P                  ! V4      #   \         d     L#i ; irz   )rT  r   rP  r=  rA  r@  rC  Ú
_parseCallÚcancelÚBaseExceptionÚDeferredList)rK   Údls   & rO   ÚtearDownDNSrL  ÷  s‹   € Ø	€BØ‡I�IŒe×!Ò! $§)¡)×"9Ñ"9Ó:Ô;Ø‡I�IŒe×!Ò! $§,¡,×"<Ñ"<Ó=Ô>ðØ�‰× Ñ ×'Ñ'Ô)ô ×Ò˜bÓ!Ð!øô ô Ùðús   Á6$B0 Â0B>Â=B>c                  ó  € ] tR tRtRtR tR tR t]! ]	P                  R8¬  R4      R 4       tR tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR t]! ]	P                  R8¬  R4      R 4       tR tR tR tR tRt R# )ÚMXTestsi  z.
Tests for L{mail.relaymanager.MXCalculator}.
c                	óÂ   € \        V 4       \        P                  ! 4       V n        \        P
                  P                  V P                  V P                  4      V n        R # rz   )	rE  r   r²  r¶  r   rç  ÚMXCalculatorrC  Úmxr]   s   &rO   r|   ÚMXTests.setUp  s8   € Ü�ŒÜ—Z’Z“\ˆŒ
Ü×#Ñ#×0Ñ0°·±ÀÇ
Á
ÓKˆŽr[   c                	ó   € \        V 4      # rz   )rL  r]   s   &rO   r¥  ÚMXTests.tearDown  s   € Ü˜4Ó Ð r[   c                ó”   € V P                  \        P                  P                  V P                  4      P
                  \        4       R# )zA
L{MXCalculator}'s default clock is C{twisted.internet.reactor}.
N)r  r   rç  rP  rC  r¶  r   r]   s   &rO   Útest_defaultClockÚMXTests.test_defaultClock  s2   € ð 	×ÑÜ×Ñ×*Ñ*¨4¯=©=Ó9×?Ñ?Äö	
r[   r+   c                	óž   € R .V P                   P                  R&   V P                  P                  R4      P	                  V P
                  4      # )úthe.email.test.domainr.  )r9  r'  rQ  ÚgetMXr·   Ú_cbSimpleSuccessr]   s   &rO   ÚtestSimpleSuccessÚMXTests.testSimpleSuccess  s=   € à.EÐ-Fˆ�	‰	×Ñ˜MÑ*Ø�w‰w�}‰}˜]Ó+×7Ñ7¸×8MÑ8MÓNÐNr[   c                	óˆ   € V P                  VP                  ^ 4       V P                  \        VP                  4      R4       R# )rå  rY  N)r8   Ú
preferencerV   r¬   ©rK   rQ  s   &&rO   r[  ÚMXTests._cbSimpleSuccess  s/   € Ø×Ñ˜Ÿ™¨Ô*Ø×Ñœ˜RŸW™W›Ð'>Ö?r[   c                	ó‚   € R V P                   n        V P                  V P                   P                  R4      \        4      # )Fr.  )rQ  ÚfallbackToDomainrj  rZ  ÚIOErrorr]   s   &rO   ÚtestSimpleFailureÚMXTests.testSimpleFailure!  s.   € Ø#(ˆ�‰Ô Ø×!Ñ! $§'¡'§-¡-°Ó">ÄÓHÐHr[   c                	ó`   € V P                  V P                  P                  R 4      \        4      # ©r.  )rj  rQ  rZ  r   r]   s   &rO   ÚtestSimpleFailureWithFallbackÚ%MXTests.testSimpleFailureWithFallback%  s"   € Ø×!Ñ! $§'¡'§-¡-°Ó">ÄÓOÐOr[   c                ó¼   a aaa€  ! VV3R lR4      pV! 4       S P                   n        S P                   P                  S4      pVV 3R lpVP                  V4       V# )a  
Issue an MX request for the given domain and arrange for it to be
responded to with the given records.  Verify that the resulting mail
exchange is the indicated host.

@type domain: C{str}
@type records: C{list} of L{RRHeader}
@type correctMailExchange: C{str}
@rtype: L{Deferred}
c                  ó&   <€ ] tR tRtV V3R ltRtR# )Ú,MXTests._exchangeTest.<locals>.DummyResolveri4  c                	ó‚   <€ VS8X  d   \         P                  ! S. . 34      # \         P                  ! \        S4      4      # rz   )r   r-  r.  r"   )rK   r¬   rX   Úrecordss   &&€€rO   ÚlookupMailExchangeÚ?MXTests._exchangeTest.<locals>.DummyResolver.lookupMailExchange5  s4   ø€ Ø˜6”>Ü Ÿ=š=¨'°2°rÐ):Ó;Ð;Ü—z’z¤,¨vÓ"6Ó7Ð7r[   r5   N©rU   rq   rr   rs   rp  rv   )rX   ro  s   €€rO   ÚDummyResolverrm  4  s   ø† ÷8ò 8r[   rs  c                óR   <€ SP                  \        V P                  4      S4       R # rz   ©r8   rV   r¬   )ÚrecordÚcorrectMailExchangerK   s   &€€rO   ÚgotMailExchangeÚ.MXTests._exchangeTest.<locals>.gotMailExchange=  s   ø€ Ø×ÑœS §¡Ó-Ð/BÖCr[   )rQ  rC  rZ  r·   )rK   rX   ro  rw  rs  rM   rx  s   ffff   rO   Ú_exchangeTestÚMXTests._exchangeTest(  sH   û€ ÷	8õ 	8ñ )›?ˆ�‰ÔØ�G‰G�M‰M˜&Ó!ˆö	Dð 	
�‰�oÔ&Øˆr[   c           
     ó  € RpRpRp\        V\        P                  \        ^V4      R7      \        V\        P                  \        ^ V4      R7      \        V\        P                  \        ^V4      R7      .pV P                  WV4      # )zP
The MX record with the lowest preference is returned by
L{MXCalculator.getMX}.
r:  úgood.example.comúbad.example.com©r¬   r1  Úpayload)r!   r    ÚTYPErz  ©rK   rX   ÚgoodÚbadro  s   &    rO   Útest_mailExchangePreferenceÚ#MXTests.test_mailExchangePreferenceC  sv   € ð
 ˆØ!ˆØˆô ˜&¤y§~¡~¼yÈÈCÓ?PÔQÜ˜&¤y§~¡~¼yÈÈDÓ?QÔRÜ˜&¤y§~¡~¼yÈÈCÓ?PÔQð
ˆð
 ×!Ñ! &°4Ó8Ð8r[   c           	     ó   € RpRpRp\        V\        P                  \        ^ V4      R7      \        V\        P                  \        ^V4      R7      .pV P                  P	                  V4       V P                  WV4      # )zi
L{MXCalculator.getMX} returns the MX record with the lowest preference
which is not also marked as bad.
r:  r}  r~  r  ©r!   r    r�  rQ  ÚmarkBadrz  r‚  s   &    rO   Útest_badExchangeExcludedÚ MXTests.test_badExchangeExcludedS  so   € ð
 ˆØ!ˆØˆô ˜&¤y§~¡~¼yÈÈCÓ?PÔQÜ˜&¤y§~¡~¼yÈÈDÓ?QÔRð
ˆð 	�‰�‰˜ÔØ×!Ñ! &°4Ó8Ð8r[   c           	     ó6  € RpRpRp\        V\        P                  \        ^ V4      R7      \        V\        P                  \        ^V4      R7      .pV P                  P	                  V4       V P                  P	                  V4       V P                  WV4      # )z„
L{MXCalculator.getMX} returns the MX record with the lowest preference
if all the MX records in the response have been marked bad.
r:  r~  zworse.example.comr  rˆ  )rK   rX   r„  Úworsero  s   &    rO   Útest_fallbackForAllBadExchangesÚ'MXTests.test_fallbackForAllBadExchangesc  s   € ð
 ˆØˆØ#ˆô ˜&¤y§~¡~¼yÈÈCÓ?PÔQÜ˜&¤y§~¡~¼yÈÈEÓ?RÔSð
ˆð 	�‰�‰˜ÔØ�‰�‰˜ÔØ×!Ñ! &°3Ó7Ð7r[   c           	     ó^  € RpRpRp\        V\        P                  \        ^ V4      R7      \        V\        P                  \        ^V4      R7      .pV P                  P	                  V4       V P
                  P                  V P                  P                  4       V P                  WV4      # )z˜
L{MXCalculator.getMX} returns the MX record with the lowest preference
if it was last marked bad longer than L{MXCalculator.timeOutBadMX}
seconds ago.
r:  r}  r~  r  )	r!   r    r�  rQ  r‰  r¶  r³  ÚtimeOutBadMXrz  ©rK   rX   rƒ  ÚpreviouslyBadro  s   &    rO   Útest_badExchangeExpiresÚMXTests.test_badExchangeExpirest  s�   € ð ˆØ!ˆØ)ˆô Ø¤)§.¡.¼)ÀAÀ}Ó:Uôô ˜&¤y§~¡~¼yÈÈDÓ?QÔRð	
ˆð 	�‰�‰˜Ô&Ø�
‰
×Ñ˜4Ÿ7™7×/Ñ/Ô0Ø×!Ñ! &°=ÓAÐAr[   c           	     ó”  € RpRpRp\        V\        P                  \        ^ V4      R7      \        V\        P                  \        ^V4      R7      .pV P                  P	                  V4       V P                  P                  V4       V P                  P                  V P                  P                  4       V P                  WV4      # )zw
L{MXCalculator.getMX} returns the MX record with the lowest preference
if it was marked good after it was marked bad.
r:  r}  r~  r  )
r!   r    r�  rQ  r‰  ÚmarkGoodr¶  r³  r‘  rz  r’  s   &    rO   Útest_goodExchangeUsedÚMXTests.test_goodExchangeUsedˆ  s¢   € ð
 ˆØ!ˆØ)ˆô Ø¤)§.¡.¼)ÀAÀ}Ó:Uôô ˜&¤y§~¡~¼yÈÈDÓ?QÔRð	
ˆð 	�‰�‰˜Ô&Ø�‰×Ñ˜Ô'Ø�
‰
×Ñ˜4Ÿ7™7×/Ñ/Ô0Ø×!Ñ! &°=ÓAÐAr[   c                óÜ   aa€ RoRo ! VV3R lR4      pV! 4       V P                   n        V P                   P                  S4      pVP                  V P                  \        SR7      4       V# )zÀ
If an MX lookup succeeds but the result set is empty,
L{MXCalculator.getMX} should try to look up an I{A} record for the
requested name and call back its returned Deferred with that
address.
rb  zexample.orgc                  óD   <€ ] tR tRtRt Z . . . 3/t Z  Z/tR tR tRt	R# )Ú9MXTests.test_successWithoutResults.<locals>.DummyResolveri¦  a  
Fake resolver which will respond to an MX lookup with an empty
result set.

@ivar mx: A dictionary mapping hostnames to three-tuples of
    results to be returned from I{MX} lookups.

@ivar a: A dictionary mapping hostnames to addresses to be
    returned from I{A} lookups.
c                	óP   € \         P                  ! V P                  V,          4      # rz   )r   r-  rQ  r3  s   &&rO   rp  ÚLMXTests.test_successWithoutResults.<locals>.DummyResolver.lookupMailExchangeµ  s   € Ü—}’} T§W¡W¨V¥_Ó5Ð5r[   c                	óP   € \         P                  ! V P                  V,          4      # rz   )r   r-  r/   r3  s   &&rO   ÚgetHostByNameÚGMXTests.test_successWithoutResults.<locals>.DummyResolver.getHostByName¸  s   € Ü—}’} T§V¡V¨F¥^Ó4Ð4r[   r5   N)
rU   rq   rr   rs   r¦   rQ  r/   rp  r   rv   )rX   Úips   €€rO   rs  rœ  ¦  s-   ø† ñ	ñ ˜2˜r 2˜,Ð'ˆBÙ™�ˆAò6ö5r[   rs  ©r¬   ©rQ  rC  rZ  r·   r8   r    )rK   rs  rM   rX   r¢  s   &  @@rO   Útest_successWithoutResultsÚ"MXTests.test_successWithoutResultsœ  sY   ù€ ð ˆØˆ÷	5õ 	5ñ* )›?ˆ�‰ÔØ�G‰G�M‰M˜&Ó!ˆØ	�‰�d×&Ñ&¬	°rÔ(:Ô;Øˆr[   c                óÈ   €  ! R R4      pV! 4       V P                   n        V P                   P                  R4      pVP                  V P                  \        RR7      4       V# )zÿ
Test that if the MX record lookup fails, fallback is enabled, and an A
record is available for the name, then the Deferred returned by
L{MXCalculator.getMX} ultimately fires with a Record_MX instance which
gives the address in the A record for the name.
c                  ó&   € ] tR tRtRtR tR tRtR# )ÚAMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolveriÈ  zS
Fake resolver which will fail an MX lookup but then succeed a
getHostByName call.
c                	ó>   € \         P                  ! \        4       4      # rz   )r   r.  r"   r3  s   &&rO   rp  ÚTMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.lookupMailExchangeÎ  s   € Ü—z’z¤,£.Ó1Ð1r[   c                	ó.   € \         P                  ! R 4      # )rb  )r   r-  r3  s   &&rO   r   ÚOMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.getHostByNameÑ  s   € Ü—}’} YÓ/Ð/r[   r5   N)rU   rq   rr   rs   r¦   rp  r   rv   r5   r[   rO   rs  r©  È  s   † ñò
2ö0r[   rs  rX   rb  r£  r¤  )rK   rs  rM   s   &  rO   Ú"test_failureWithSuccessfulFallbackÚ*MXTests.test_failureWithSuccessfulFallbackÀ  sL   € ÷
	0ñ 
	0ñ )›?ˆ�‰ÔØ�G‰G�M‰M˜(Ó#ˆØ	�‰�d×&Ñ&¬	°yÔ(AÔBØˆr[   c                óä   aaa€ RoRoRo ! VVV3R lR4      pV! 4       V P                   n        V P                   P                  S4      pVP                  V P                  \        SR7      4       V# )z¬
If an MX lookup returns a single CNAME record as a result, MXCalculator
will perform an MX lookup for the canonical name indicated and return
the MX record which results.
úalias.example.comúcanonical.example.comúmail.example.comc                  ó,   <€ ] tR tRtRtV VV3R ltRtR# )Ú;MXTests.test_cnameWithoutGlueRecords.<locals>.DummyResolveriã  zˆ
Fake resolver which will return a CNAME for an MX lookup of a name
which is an alias and an MX for an MX lookup of the canonical name.
c           
     	óT  <€ VS8X  d>   \         P                  ! \        V\        P                  \        S4      R 7      .. . 34      # VS8X  d?   \         P                  ! \        V\
        P                  \        ^ S4      R 7      .. . 34      # \         P                  ! \        V4      4      # ©r  )r   r-  r!   r   r�  r    r.  r"   )rK   rX   ÚaliasÚ	canonicalÚexchanges   &&€€€rO   rp  ÚNMXTests.test_cnameWithoutGlueRecords.<locals>.DummyResolver.lookupMailExchangeé  s¬   ø€ Ø˜U”?Ü Ÿ=š=ô !)Ø)/Ü)5×):Ñ):Ü,8¸Ó,Cô!"ðð Øð
óð ð ˜yÔ(Ü Ÿ=š=ô !)Ø)/Ü)2¯©Ü,5°a¸Ó,Bô!"ðð Øð
óð ô !Ÿ:š:¤l°6Ó&:Ó;Ð;r[   r5   N)rU   rq   rr   rs   r¦   rp  rv   )r¸  r¹  rº  s   €€€rO   rs  rµ  ã  s   ø† ñ÷
<ó <r[   rs  r£  r¤  )rK   rs  rM   r¸  r¹  rº  s   &  @@@rO   Útest_cnameWithoutGlueRecordsÚ$MXTests.test_cnameWithoutGlueRecordsÙ  s_   ú€ ð $ˆØ+ˆ	Ø%ˆ÷$	<ö $	<ñL )›?ˆ�‰ÔØ�G‰G�M‰M˜%Ó ˆØ	�‰�d×&Ñ&¬	°xÔ(@ÔAØˆr[   c                ó  a a€  ! R R4      p^oV! 4       S P                   n        S P                   P                  RS4      pS P                  V\        P
                  P                  P                  4       VV 3R lpVP                  V4       V# )z©
If L{MXCalculator.getMX} encounters a CNAME chain which is longer than
the length specified, the returned L{Deferred} should errback with
L{CanonicalNameChainTooLong}.
c                  ó$   € ] tR tRtRt^ tR tRtR# )Ú.MXTests.test_cnameChain.<locals>.DummyResolveri  z[
Fake resolver which generates a CNAME chain of infinite length in
response to MX lookups.
c           	     	óÖ   € V ;P                   ^,          un         RV P                   3,          p\        P                  ! \        V\        P
                  \	        V4      R7      .. . 34      # )r  úx-%d.example.comr  )ÚchainCounterr   r-  r!   r   r�  )rK   rX   r¬   s   && rO   rp  ÚAMXTests.test_cnameChain.<locals>.DummyResolver.lookupMailExchange  sg   € Ø×!Ò! QÕ&Õ!Ø)¨T×->Ñ->Ð,@Õ@�Ü—}’}ô %Ø%+Ü%1×%6Ñ%6Ü(4°TÓ(:ôðð Øð
óð r[   r5   N)rU   rq   rr   rs   r¦   rÃ  rp  rv   r5   r[   rO   rs  rÀ    s   † ñð
 ˆLör[   rs  r³  c                óì   <€ SP                  V P                  ^ ,          \        RS^,           3,          4      4       SP                  SP                  P                  P
                  S^,           4       R# )rå  rÂ  N)r8   Úargsr   rQ  rC  rÃ  )r   Ú
cnameLimitrK   s   &€€rO   ÚcbChainTooLongÚ/MXTests.test_cnameChain.<locals>.cbChainTooLong3  sV   ø€ Ø×ÑØ—
‘
˜1•œ|Ð,>À*ÈqÅ.ÐARÕ,RÓSôð ×Ñ˜TŸW™W×-Ñ-×:Ñ:¸JÈ½NÖKr[   )	rQ  rC  rZ  rj  Útwistedr   rç  ÚCanonicalNameChainTooLongr·   )rK   rs  rM   rÈ  rÇ  s   f   @rO   Útest_cnameChainÚMXTests.test_cnameChain  sp   ù€ ÷	ñ 	ð2 ˆ
Ù(›?ˆ�‰ÔØ�G‰G�M‰MÐ,¨jÓ9ˆØ×Ñ˜1œgŸl™l×7Ñ7×QÑQÔRö	Lð 	
�‰�nÔ%Øˆr[   c                óì   aaaa€ . oRoRoRo ! VVVV3R lR4      pV! 4       V P                   n        V P                   P                  S4      pVP                  V P                  \        SR7      4       V# )zÔ
If an MX lookup returns a CNAME and the MX record for the CNAME, the
L{Deferred} returned by L{MXCalculator.getMX} should be called back
with the name from the MX record without further lookups being
attempted.
r±  r²  r³  c                  ó*   <€ ] tR tRtV VVV3R ltRtR# )Ú8MXTests.test_cnameWithGlueRecords.<locals>.DummyResolveriH  c                	óð   <€ VS8w  g	   S'       d   . . . 3# \         P                  ! \        S\        P                  \        S4      R 7      \        S\
        P                  \        SR7      R 7      .. . 34      # )r  r£  )r   r-  r!   r   r�  r    )rK   rX   r¸  r¹  rº  ÚlookedUps   &&€€€€rO   rp  ÚKMXTests.test_cnameWithGlueRecords.<locals>.DummyResolver.lookupMailExchangeI  sw   ø€ Ø˜U”?§hð   B˜<Ð'Ü—}’}ô %Ø%*Ü%1×%6Ñ%6Ü(4°YÓ(?ôô
 %Ø%.Ü%.§^¡^Ü(1°xÔ(@ôðð Øðóð r[   r5   Nrr  )r¸  r¹  rº  rÒ  s   €€€€rO   rs  rÐ  H  s   ø† ÷ô r[   rs  r£  r¤  )rK   rs  rM   r¸  r¹  rº  rÒ  s   &  @@@@rO   Útest_cnameWithGlueRecordsÚ!MXTests.test_cnameWithGlueRecords<  sc   û€ ð ˆØ#ˆØ+ˆ	Ø%ˆ÷	÷ 	ñ2 )›?ˆ�‰ÔØ�G‰G�M‰M˜%Ó ˆØ	�‰�d×&Ñ&¬	°xÔ(@ÔAØˆr[   c                óø   aa€ RoRo ! VV3R lR4      pV! 4       V P                   n        V P                   P                  S4      pV P                  V\        P
                  P                  P                  4       V# )zÇ
If an MX lookup returns two CNAME records which point to each other,
the loop should be detected and the L{Deferred} returned by
L{MXCalculator.getMX} should be errbacked with L{CanonicalNameLoop}.
zcname1.example.comzcname2.example.comc                  ó&   <€ ] tR tRtV V3R ltRtR# )Ú<MXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolverio  c           
     	óÆ   <€ \         P                  ! \        S\        P                  \        S4      R 7      \        S\        P                  \        S4      R 7      .. . 34      # r·  )r   r-  r!   r   r�  )rK   rX   Ú
firstAliasÚsecondAliass   &&€€rO   rp  ÚOMXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolver.lookupMailExchangep  sb   ø€ Ü—}’}ô %Ø%/Ü%1×%6Ñ%6Ü(4°[Ó(Aôô
 %Ø%0Ü%1×%6Ñ%6Ü(4°ZÓ(@ôðð Øðóð r[   r5   Nrr  )rÚ  rÛ  s   €€rO   rs  rØ  o  s   ø† ÷ò r[   rs  )rQ  rC  rZ  rj  rÊ  r   rç  ÚCanonicalNameLoop)rK   rs  rM   rÚ  rÛ  s   &  @@rO   Útest_cnameLoopWithGlueRecordsÚ%MXTests.test_cnameLoopWithGlueRecordsf  s`   ù€ ð *ˆ
Ø*ˆ÷	õ 	ñ* )›?ˆ�‰ÔØ�G‰G�M‰M˜*Ó%ˆØ×Ñ˜1œgŸl™l×7Ñ7×IÑIÔJØˆr[   c                	ó    € . ROV P                   P                  R&   V P                  P                  R4      P	                  V P
                  4      # )úmx1.test.domainr.  )rá  zmx2.test.domainzmx3.test.domain)r9  r'  rQ  rZ  r·   Ú_cbManyRecordsSuccessfulLookupr]   s   &rO   ÚtestManyRecordsÚMXTests.testManyRecords‰  sC   € ò.
ˆ�	‰	×Ñ˜MÑ*ð
 �w‰w�}‰}˜]Ó+×7Ñ7Ø×/Ñ/ó
ð 	
r[   c                	óD  € V P                  \        VP                  4      P                  R ^4      ^ ,          R9   4       V P                  P                  \        VP                  4      4       V P                  P                  R4      P                  V P                  V4      # )Ú.r.  )Úmx1Úmx2Úmx3)	rC   rV   r¬   rŸ   rQ  r‰  rZ  r·   Ú_cbManyRecordsDifferentResultr`  s   &&rO   râ  Ú&MXTests._cbManyRecordsSuccessfulLookup”  sq   € Ø�‰œ˜BŸG™G›×*Ñ*¨3°Ó2°1Õ5Ð9NÑNÔOØ�‰�‰œ˜BŸG™G›Ô%Ø�w‰w�}‰}˜]Ó+×7Ñ7Ø×.Ñ.°ó
ð 	
r[   c                	ó8  € V P                  \        VP                  4      \        VP                  4      4       V P                  P	                  \        VP                  4      4       V P                  P                  R 4      P                  V P                  W!4      # rh  )r  rV   r¬   rQ  r‰  rZ  r·   Ú_cbManyRecordsLastResult)rK   ÚnextMXrQ  s   &&&rO   rê  Ú%MXTests._cbManyRecordsDifferentResult›  sg   € Ø×ÑœC §¡›L¬#¨f¯k©kÓ*:Ô;Ø�‰�‰œ˜FŸK™KÓ(Ô)à�w‰w�}‰}˜]Ó+×7Ñ7Ø×)Ñ)¨2ó
ð 	
r[   c                	ó  € V P                  \        VP                  4      \        VP                  4      4       V P                  \        VP                  4      \        VP                  4      4       V P                  P	                  \        VP                  4      4       V P                  P                  \        VP                  4      4       V P                  P                  R 4      P                  V P                  V4      # rh  )	r  rV   r¬   rQ  r‰  r—  rZ  r·   Ú"_cbManyRecordsRepeatSpecificResult)rK   ÚlastMXrQ  rî  s   &&&&rO   rí  Ú MXTests._cbManyRecordsLastResult£  s¤   € Ø×ÑœC §¡›L¬#¨f¯k©kÓ*:Ô;Ø×ÑœC §¡Ó,¬c°&·+±+Ó.>Ô?à�‰�‰œ˜FŸK™KÓ(Ô)Ø�‰×Ñœ˜VŸ[™[Ó)Ô*à�w‰w�}‰}˜]Ó+×7Ñ7Ø×3Ñ3°Vó
ð 	
r[   c                	óv   € V P                  \        VP                  4      \        VP                  4      4       R # rz   ru  )rK   ÚagainMXrî  s   &&&rO   rñ  Ú*MXTests._cbManyRecordsRepeatSpecificResult®  s$   € Ø×Ñœ˜WŸ\™\Ó*¬C°·±Ó,<Ö=r[   )r¶  rQ  Nro   )!rU   rq   rr   rs   r¦   r|   r¥  rV  r   rt   ru   r\  r[  re  ri  rz  r…  rŠ  rŽ  r”  r˜  r¥  r®  r¼  rÌ  rÔ  rÞ  rã  râ  rê  rí  rñ  rv   r5   r[   rO   rN  rN    sÒ   † ñòLò
!ò
ñ ˆC×Ñ Ñ$Ð&>Ó?ñOó @ðOò@òIòPòò69ò 9ò 8ò"Bò(Bò("òHò23òj,ò\(òT!ñF ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ò
ò
ò	
ö>r[   rN  c                  óÀ   € ] tR tRt]P
                  ! ]R4      f   RtR tR t	]
! ]P                  R
8¬  R4      R 4       t]
! ]P                  R
8¬  R4      R 4       tR	tR# )ÚLiveFireExerciseTestsi²  Nz1UDP support is required to determining MX recordsc                	ó.   € \        V 4       . ROV n        R# )Ú	domainDirN)rú  ÚinsertionDomainÚinsertionQueueÚdestinationDomainÚdestinationQueue)rE  Útmpdirsr]   s   &rO   r|   ÚLiveFireExerciseTests.setUp·  s   € Ü�Œò
ˆŽr[   c                	ó¸   € V P                    F@  p\        P                  P                  V4      '       g   K*  \        P
                  ! V4       KB  	  \        V 4      # rz   )rÿ  r¾   r¿   r�   r£  r¤  rL  )rK   rM   s   & rO   r¥  ÚLiveFireExerciseTests.tearDownÁ  s<   € Ø—”ˆAÜ�w‰w�~‰~˜a× Ô Ü—’˜aÖ ñ ô ˜4Ó Ð r[   r+   c                	óÊ  a aaa€ \         P                   P                  4       pVP                  P                  \        P
                  P                  4       4       \         P                  P                  VR 4      oSP                  RR4       VP                  RS4       VP                  R,          VP                  R&   \        VP                  R,          P                  SP                  4       4       VP                  \         P                  P!                  V4      4       VP#                  4       p\$        P&                  ! ^ VRR7      S n        \+        . R
O4      o\-        4       o\.        P0                  ! 4       pV3R lVn        V3R lVn        \$        P4                  ! RS P(                  P7                  4       P8                  V4       VV 3R	 lpSP;                  V4       S# )rú  r÷  rŠ   r.  rù   rì   r6  c                 ó   <€ S # rz   r5   ©r   s   €rO   r£  Ú9LiveFireExerciseTests.testLocalDelivery.<locals>.<lambda>å  ó   ø€ ™Vr[   c                 ó&   <€ SP                  R 4      # rz   ©Úcallback©rÆ  rÕ  s   *€rO   r£  r  æ  ó   ø€ ¨t¯}©}¸TÔ/Br[   c                ó  <€ SP                  R R\        P                  4      ^,          pVP                  ^ 4      P	                  4       pSP                  VP                  R4      R4       SP                  P                  4       # ©r÷  NúThis is the messageéÿÿÿÿ)	rù  r   rú  r  rÇ   r  ÚfindÚ
smtpServerrA  )ÚignrI  r  rX   rK   s   &  €€rO   ÚfinishedÚ9LiveFireExerciseTests.testLocalDelivery.<locals>.finishedé  sd   ø€ Ø×'Ñ'¨°´d·m±mÓDÀQÕGˆDØ—/‘/ !Ó$×)Ñ)Ó+ˆCØ×Ñ §¡Ð)>Ó ?ÀÔDà—?‘?×0Ñ0Ó2Ð2r[   )ú
HELO mesonzMAIL FROM: <user@hostname>zRCPT TO: <user@test.domain>ÚDATAr  ræ  ÚQUIT)r   r“   Ú
smtpPortalÚregisterCheckerr
   rê  ÚAllowAnonymousAccessrÔ   rØ  r‹   r”   rû   Úmapré  ÚsetQueuer§  r¨  rò   r   r<  r  r   r   r   ÚClientFactoryÚclientConnectionLostÚ
connectTCPr>  r=  r·   )rK   r    r¯   r  r   rX   rÕ  s   f   @@@rO   ÚtestLocalDeliveryÚ'LiveFireExerciseTests.testLocalDeliveryÇ  sX  û€ ä—)‘)×'Ñ'Ó)ˆØ×Ñ×*Ñ*¬4¯=©=×+MÑ+MÓ+OÔPÜ—‘×1Ñ1°'¸;ÓGˆØ�‰�v˜zÔ*Ø×Ñ˜-¨Ô0Ø%Ÿo™o¨mÕ<ˆ�‰˜ÑÜˆG�O‰O˜BÕ×/Ñ/°×1NÑ1NÓ1PÔQà×ÑœŸ™×0Ñ0°Ó9Ô:à×"Ñ"Ó$ˆä!×+Ò+¨A¨q¸KÔHˆŒä$òó

ˆô ‹zˆÜ×"Ò"Ó$ˆÜ#ˆŒ
Ü!BˆÔÜ×Ò˜;¨¯©×(?Ñ(?Ó(A×(FÑ(FÈÔJö	3ð 	×Ñ˜Ô"Øˆr[   c                	ó¼  a aaaaa	€ \         P                   P                  4       pVP                  P                  \        P
                  P                  4       4       \         P                  P                  VR 4      oVP                  RS4       \        P                  ! R4       VP                  \         P                  P                  R4      4       VP                  P!                  \         P"                  P%                  V4      4       \         P                  P'                  VP(                  4      o	S	;P*                  R,          un        \         P                  P-                  S	^4      o\         P                  P/                  S P0                  4      S	n        R.S P4                  P6                  R&   VP9                  4       p\:        P<                  ! ^ VRR7      S n        \         P                   P                  4       pVP                  P                  \        P
                  P                  4       4       \         P                  P                  VR4      oSPA                  RR4       VP                  RS4       \        P                  ! R	4       VP                  \         P                  P                  R	4      4       \         P                  P-                  S	^4      oSPC                  4        VP9                  4       p\:        P<                  ! ^ VRR7      S n"        S PD                  PG                  4       PH                  S	n%        \M        . RO4      o\O        4       o\P        PR                  ! 4       pV3R
 lVn(        V3R lVn*        \:        PV                  ! RS P>                  PG                  4       PH                  V4       VVV	V 3R lpSPY                  V4       S# )rû  zinsertion.domainrü  rì   zdestination.domainr6  rý  r÷  rŠ   rþ  c                 ó   <€ S # rz   r5   r  s   €rO   r£  Ú9LiveFireExerciseTests.testRelayDelivery.<locals>.<lambda>)  r  r[   c                 ó&   <€ SP                  R 4      # rz   r	  r  s   *€rO   r£  r%  *  r  r[   c                óZ   <€ SP                  4       pVVV3R  lpVP                  V4       V# )c                ó`  <€ SP                  R R\        P                  4      ^,          pVP                  ^ 4      P	                  4       pSP                  VP                  R4      R4       SP                  P                  4        SP                  P                  4        SP                  4        R# r  )rù  r   rú  r  rÇ   r  r  Ú	insServerrA  Ú
destServerÚstopService)r  rI  r  rX   ÚhelperrK   s   &  €€€rO   Ú	deliveredÚLLiveFireExerciseTests.testRelayDelivery.<locals>.finished.<locals>.delivered2  s}   ø€ Ø×+Ñ+¨F°D¼$¿-¹-ÓHÈÕK�Ø—o‘o aÓ(×-Ñ-Ó/�Ø×#Ñ# C§H¡HÐ-BÓ$CÀRÔHà—‘×,Ñ,Ô.Ø—‘×-Ñ-Ô/Ø×"Ñ"Ö$r[   )Ú
checkStater·   )r  r™   r-  rX   r,  ræ  rK   s   &  €€€€rO   r  Ú9LiveFireExerciseTests.testRelayDelivery.<locals>.finished-  s-   ø€ ð ×)Ñ)Ó+ˆH÷%ð × Ñ  Ô+ØˆOr[   )ztest.identity.hostname)r  zMAIL FROM: <user@wherever>z"RCPT TO: <user@destination.domain>r  r  ræ  r  )-r   r“   r  r  r
   rê  r  rÔ   rØ  r”   r¾   r¹  r  rç  rý  rI   ÚsetDefaultDomainr§  r¨  ÚSmartHostSMTPRelayingManagerrþ  ÚfArgsÚRelayStateHelperrP  rC  Úmxcalcr9  r'  rò   r   r<  r)  r‹   ÚstartServicer*  r>  r=  ÚPORTr   r   r   r  r  r   r·   )
rK   ÚinsServr¯   ÚdestServr  r   rX   rÕ  r,  ræ  s
   f    @@@@@rO   ÚtestRelayDeliveryÚ'LiveFireExerciseTests.testRelayDeliveryó  s»  ý€ ô —)‘)×'Ñ'Ó)ˆØ×Ñ×*Ñ*¬4¯=©=×+MÑ+MÓ+OÔPÜ—‘×1Ñ1°'Ð;LÓMˆØ×ÑÐ,¨fÔ5Ü
�ŠÐ!Ô"Ø×Ñœ×*Ñ*×0Ñ0Ð1AÓBÔCØ�‰×(Ñ(¬¯©×)@Ñ)@ÀÓ)IÔJÜ×#Ñ#×@Ñ@ÀÇÁÓOˆØ�ŠÐ4Õ4�Ü×"Ñ"×3Ñ3°G¸QÓ?ˆä×*Ñ*×7Ñ7¸¿¹ÓFˆŒà5@°Mˆ�	‰	×ÑÐ0Ñ1à×"Ñ"Ó$ˆÜ ×*Ò*¨1¨a¸;ÔGˆŒô —9‘9×(Ñ(Ó*ˆØ×Ñ×+Ñ+¬D¯M©M×,NÑ,NÓ,PÔQÜ—‘×1Ñ1°(Ð<OÓPˆØ�‰�v˜zÔ*Ø×ÑÐ/°Ô8Ü
�ŠÐ#Ô$Ø×Ñœ$×+Ñ+×1Ñ1Ð2DÓEÔFÜ×"Ñ"×3Ñ3°G¸QÓ?ˆØ×ÑÔà×#Ñ#Ó%ˆÜ!×+Ò+¨A¨q¸KÔHˆŒð —‘×.Ñ.Ó0×5Ñ5ˆŒä$òó

ˆô ‹zˆÜ×"Ò"Ó$ˆÜ#ˆŒ
Ü!BˆÔÜ×Ò˜;¨¯©×(>Ñ(>Ó(@×(EÑ(EÀqÔI÷	ð 	ð" 	×Ñ˜Ô"Øˆr[   )r*  r)  r  rÿ  ro   )rU   rq   rr   rs   r   ÚIReactorUDPr   Úskipr|   r¥  r   rt   ru   r!  r:  rv   r5   r[   rO   rø  rø  ²  sw   † à×Ò˜g tÓ,Ò4ØBˆò
ò!ñ ˆC×Ñ Ñ$Ð&>Ó?ñ)ó @ð)ñV ˆC×Ñ Ñ$Ð&>Ó?ñKó @ôKr[   rø  c                  ó.   € ] tR tRtR tR tR tR tRtR# )ÚLineBufferMessageiB  c                	ó0   € . V n         R V n        R V n        R# )FN)ÚlinesÚeomÚlostr]   s   &rO   rš  ÚLineBufferMessage.__init__C  s   € ØˆŒ
ØˆŒØˆŽ	r[   c                	ó<   € V P                   P                  V4       R # rz   )rA  rT  )rK   rÉ   s   &&rO   r›   ÚLineBufferMessage.lineReceivedH  s   € Ø�
‰
×Ñ˜$Ör[   c                	ó<   € R V n         \        P                  ! R4      # )Tz
<Whatever>)rB  r   r-  r]   s   &rO   r¶   ÚLineBufferMessage.eomReceivedK  s   € ØˆŒÜ�}Š}˜\Ó*Ð*r[   c                	ó   € R V n         R# )TN)rC  r]   s   &rO   r�   Ú LineBufferMessage.connectionLostO  s	   € ØˆŽ	r[   )rB  rA  rC  N)	rU   rq   rr   rs   rš  r›   r¶   r�   rv   r5   r[   rO   r?  r?  B  s   † òò
 ò+ör[   r?  c                  ó¦   € ] tR tRt. ROtR t]! ]P                  R8¬  R4      R 4       t	R t
R t]! ]P                  R8¬  R4      R 4       tR tR	tR
# )Ú
AliasTestsiS  c                	ó:  € / p. ROpV F$  p\         P                  P                  WRR4       K&  	  V P                  VR,          RR.4       V P                  VR,          R.4       V P                  VR,          R	.4       V P                  VR
,          . RO4       R# )úuser:  another@host
r'   Nr÷  zanother@hostzme@againÚnextuserz|/bin/programÚ	moreusersz:/etc/include/filenameÚ	multiuser)rN  znextuser:  |/bin/program
zuser:  me@again
z"moreusers: :/etc/include/filename
z3multiuser: first@host, second@host,last@anotherhost)z
first@hostzsecond@hostzlast@anotherhost)r   r¸  Úhandler8   )rK   rÁ   rA  Úls   &   rO   Ú
testHandleÚAliasTests.testHandleW  s•   € Øˆò
ˆó ˆAÜ�J‰J×Ñ˜f¨°TÖ:ñ ð 	×Ñ˜ �¨.¸*Ð)EÔFØ×Ñ˜ 
Õ+¨oÐ->Ô?Ø×Ñ˜ Õ,Ð/GÐ.HÔIØ×ÑØ�;ÕÒ!Rö	
r[   r+   c                	ój  € R \        4       /p\        P                  P                  V\        P
                  ! \        P                  ! R4      P                  4       4      R7      pV P                  \        V4      ^4       VR,          p\        V4      pR	 F$  pV P                  VP                  V4      R
4       K&  	  V P                  \        V4      ^4       VR,          p\        V4      pR F$  pV P                  VP                  V4      R
4       K&  	  V P                  \        V4      ^4       VR,          p\        V4      pV P                  VP                  R4      R
4       R F,  pV P                  VP                  V4      R
RV,          4       K.  	  V P                  \        V4      ^4       R# )rù   a…                      # Here's a comment
                       # woop another one
                    testuser:                   address1,address2, address3,
                        continuation@address, |/bin/process/this

                    usertwo:thisaddress,thataddress, lastaddress
                    lastuser:       :/includable, /filename, |/program, address
                    )r³   ÚtestuserÚusertwoÚlastuserz/includablez%s not foundN)Úaddress1Úaddress2Úaddress3zcontinuation@addressz/bin/process/thisr  )ÚthisaddressÚthataddressÚlastaddress)z	/filenameÚprogramr   )rú   r   r¸  ÚloadAliasFilerB  rC  ÚtextwrapÚdedentÚencoder8   r9   rV   r  r  )rK   rI   rÁ   ÚgroupÚsr/   s   &     rO   ÚtestFileLoaderÚAliasTests.testFileLoaderk  sf  € à”v“x�.ˆÜ—‘×)Ñ)ØÜ�zŠzÜ—’ðó
÷ ‘&“(óð *ó 
ˆð" 	×Ñœ˜V› aÔ(à�zÕ"ˆÜ�‹Jˆó
ˆAð ×Ñ §¡ q£	¨2Ö.ñ
ð 	×Ñœ˜U› QÔ'à�yÕ!ˆÜ�‹JˆÛ>ˆAØ×Ñ §¡ q£	¨2Ö.ñ ?à×Ñœ˜U› QÔ'à�zÕ"ˆÜ�‹JˆØ×Ñ˜Ÿ™ Ó.°Ô3Û4ˆAØ×Ñ §¡ q£	¨2¨~ÀÕ/AÖBñ 5à×Ñœ˜U› QÖ'r[   c                	ó  € \        4       \        4       \        4       3p\        P                  P                  V4      pV P                   F  pVP                  V4       K  	  VP                  4       P                  V P                  V4      # rz   )	r?  r   r¸  ÚMultiWrapperrA  r›   r¶   r·   Ú_cbMultiWrapper)rK   rÃ  r  ÚLs   &   rO   ÚtestMultiWrapperÚAliasTests.testMultiWrapperš  si   € Ü Ó"Ô$5Ó$7Ô9JÓ9LÐLˆÜ�j‰j×%Ñ% dÓ+ˆà—”ˆAØ×Ñ˜QÖñ à�‰Ó ×,Ñ,¨T×-AÑ-AÀ4ÓHÐHr[   c                	óÐ   € V F_  pV P                  VP                  4       V P                  VP                  4       V P	                  V P
                  VP
                  4       Ka  	  R # rz   )rC   rB  r½   rC  r8   rA  )rK   rh  rÃ  rV  s   &&& rO   rk  ÚAliasTests._cbMultiWrapper¢  sF   € ÛˆAØ�O‰O˜AŸE™EÔ"Ø×Ñ˜QŸV™VÔ$Ø×Ñ˜TŸZ™Z¨¯©Ö1ó r[   c                	ó   € V P                  4       p\        P                  P                  VR R 4      pVP	                  4       pV P
                   F  pVP                  V4       K  	  VP                  4       P                  V P                  V4      # rz   )
r«   r   r¸  Ú	FileAliasÚcreateMessageReceiverrA  r›   r¶   r·   Ú_cbTestFileAlias)rK   Útmpfiler/   rV  rS  s   &    rO   ÚtestFileAliasÚAliasTests.testFileAlias¨  sl   € à—+‘+“-ˆÜ�J‰J× Ñ  ¨$°Ó5ˆØ×#Ñ#Ó%ˆà—”ˆAØ�N‰N˜1Öñ à�}‰}‹×*Ñ*¨4×+@Ñ+@À'ÓJÐJr[   c                	óê   € \        V4      ;_uu_ 4       pVP                  4       pR R R 4       T P                  X Uu. uF  qUR R NK	  	  upV P                  4       R #   + '       g   i     L@; iu upi )Nr  ©r®   Ú	readlinesr8   rA  )rK   rh  ru  r¯   rA  rl  s   &&&   rO   rt  ÚAliasTests._cbTestFileAlias²  sN   € Ü�'�]Œ]˜aØ—K‘K“MˆE÷ à×Ñ©%Ó0©% Q˜C˜R›&©%Ñ0°$·*±*Ö=÷ �]üâ0s   ”A¼A0ÁA-	r5   N©z
First linez	Next linerù   zAfter a blank linez	Last linero   )rU   rq   rr   rs   rA  rT  r   rt   ru   rg  rm  rk  rv  rt  rv   r5   r[   rO   rL  rL  S  so   † âN€Eò
ñ( ˆC×Ñ Ñ$Ð&>Ó?ñ,(ó @ð,(ò\Iò2ñ ˆC×Ñ Ñ$Ð&>Ó?ñKó @ðKö>r[   rL  c                  ó*   € ] tR tRtRtR tRR ltRtR# )ÚDummyDomaini¸  z'
Test domain for L{AddressAliasTests}.
c                	ó   € Wn         R # rz   ©r   )rK   r   s   &&rO   rš  ÚDummyDomain.__init__½  s   € ØŽr[   Nc                ób   a a€ V'       d    \         P                  P                  R4      hV V3R l# )zÚ
@returns: When a C{memo} is passed in this will raise a
    L{smtp.SMTPBadRcpt} exception, otherwise a boolean
    indicating if the C{user} and string version of
    L{self.address} are equal or not.
@rtype: C{bool}
Úhamc                 ó4   <€ S\        S P                  4      8H  # rz   )rV   r   rS  s   €€rO   r£  Ú$DummyDomain.exists.<locals>.<lambda>Ë  s   ø€ �tœs 4§<¡<Ó0Ò0r[   )r   r   rŒ   r  s   ff&rO   r�   ÚDummyDomain.existsÀ  s#   ù€ ÷ Ü—)‘)×'Ñ'¨Ó.Ð.å0Ð0r[   r€  rz   )rU   rq   rr   rs   r¦   rš  r�   rv   r5   r[   rO   r~  r~  ¸  s   † ñò÷1ð 1r[   r~  c                  ó8   € ] tR tRtRtR tR tR tR tR t	Rt
R	# )
ÚAddressAliasTestsiÎ  z/
Tests for L{twisted.mail.alias.AddressAlias}.
c                ó  € \         P                  P                  R4      V n        V P                  P                  \        V P                  4      /p\         P                  P                  V P                  WP                  4      V n        R# )z
Setup an L{AddressAlias}.
zfoo@barN)r   r   rA  r   rX   r~  r¸  ÚAddressAlias)rK   rI   s   & rO   r|   ÚAddressAliasTests.setUpÔ  sW   € ô —y‘y×(Ñ(¨Ó3ˆŒØ—<‘<×&Ñ&¬°D·L±LÓ(AÐBˆÜ—Z‘Z×,Ñ,¨T¯\©\¸7ÇLÁLÓQˆŽ
r[   c                óX   € V P                  V P                  P                  4       4       R# )z|
L{createMessageReceiever} calls C{exists()} on the domain object
which key matches the C{alias} passed to L{AddressAlias}.
N)rC   r¸  rs  r]   s   &rO   Útest_createMessageReceiverÚ,AddressAliasTests.test_createMessageReceiverÜ  s   € ð
 	�‰˜Ÿ
™
×8Ñ8Ó:Ö;r[   c                óP   € V P                  \        V P                  4      R4       R# )z@
The string presentation of L{AddressAlias} includes the alias.
z<Address foo@bar>N)r8   rV   r¸  r]   s   &rO   r^   ÚAddressAliasTests.test_strã  s   € ð 	×Ñœ˜TŸZ™Z›Ð*=Ö>r[   c                ót   € V P                  V P                  P                  V P                  R/4      R4       R# )z
L{resolve} will look for additional aliases when an C{aliasmap}
dictionary is passed, and returns L{None} if none were found.
r  N)r8   r¸  Úresolver   r]   s   &rO   Útest_resolveÚAddressAliasTests.test_resolveé  s,   € ð
 	×Ñ˜Ÿ™×+Ñ+¨T¯\©\¸5Ð,AÓBÀDÖIr[   c                ó\   € V P                  V P                  P                  / 4      R4       R# )z‰
L{resolve} returns L{None} when the alias could not be found in the
C{aliasmap} and no L{mail.smtp.User} with this alias exists either.
N)r8   r¸  r’  r]   s   &rO   Útest_resolveWithoutAliasmapÚ-AddressAliasTests.test_resolveWithoutAliasmapð  s#   € ð
 	×Ñ˜Ÿ™×+Ñ+¨BÓ/°Ö6r[   )r   r¸  N)rU   rq   rr   rs   r¦   r|   r�  r^   r“  r–  rv   r5   r[   rO   rˆ  rˆ  Î  s"   † ñòRò<ò?òJö7r[   rˆ  c                  ó   € ] tR tRtR.tRtR# )ÚDummyProcessiø  ÚonEndr5   N)rU   rq   rr   rs   Ú	__slots__rv   r5   r[   rO   r™  r™  ø  s	   † Ø�	„Ir[   r™  c                  ó    € ] tR tRtRtR tRtR# )ÚMockProcessAliasiü  z<
An alias processor that doesn't actually launch processes.
c                ó   € R# )z
Don't spawn a process.
Nr5   )rK   Úprotor`  r¿   s   &&&&rO   ÚspawnProcessÚMockProcessAlias.spawnProcess  ó   ‚ r[   r5   N)rU   rq   rr   rs   r¦   r   rv   r5   r[   rO   r�  r�  ü  s   † ñör[   r�  c                  ó   € ] tR tRtRt]tRtR# )ÚMockAliasGroupi  z+
An alias group using C{MockProcessAlias}.
r5   N)rU   rq   rr   rs   r¦   r�  ÚprocessAliasFactoryrv   r5   r[   rO   r¤  r¤    s   † ñð +Ôr[   r¤  c                  ó,   € ] tR tRtRtR tR tR tRtR# )ÚStubProcessi  z‡
Fake implementation of L{IProcessTransport}.

@ivar signals: A list of all the signals which have been sent to this fake
    process.
c                	ó   € . V n         R # rz   ©Úsignalsr]   s   &rO   rš  ÚStubProcess.__init__  s	   € ØˆŽr[   c                ó   € R# )z(
No-op implementation of disconnection.
Nr5   r]   s   &rO   ÚloseConnectionÚStubProcess.loseConnection  r¢  r[   c                ó<   € V P                   P                  V4       R# )z<
Record a signal sent to this process for later inspection.
N)rª  rT  )rK   Úsignals   &&rO   ÚsignalProcessÚStubProcess.signalProcess  s   € ð 	�‰×Ñ˜FÖ#r[   r©  N)	rU   rq   rr   rs   r¦   rš  r­  r±  rv   r5   r[   rO   r§  r§    s   † ñòòö
$r[   r§  c                  ó.  € ] tR tRtRt]P                  ! ]R4      f   Rt. ROt	R t
R tR tR t]! ]P                   R8¬  R	4      R
 4       tR tR tR tR tR t]! ]P                   R8¬  R	4      R 4       t]! ]P                   R8¬  R	4      R 4       tRtR# )ÚProcessAliasTestsi&  z
Tests for alias resolution.
NzIReactorProcess not supportedc                ó  € V^,          ^ ,          pV P                  \        P                  ! V4      4       V P                  \        P                  ! V4      V4       V P                  \        P                  ! V4      4       V# )zÞ
Construct a status from the given exit code.

@type code: L{int} between 0 and 255 inclusive.
@param code: The exit status which the code will represent.

@rtype: L{int}
@return: A status integer for the given exit code.
)rC   r¾   Ú	WIFEXITEDr8   ÚWEXITSTATUSr½   ÚWIFSIGNALED)rK   ÚcodeÚstatuss   && rO   Ú
exitStatusÚProcessAliasTests.exitStatus1  s]   € ð ˜!•)˜q•ˆð 	�‰œŸš VÓ,Ô-Ø×ÑœŸš¨Ó/°Ô6Ø×ÑœŸš¨Ó/Ô0àˆr[   c                óê   € TpV P                  \        P                  ! V4      4       V P                  \        P                  ! V4      V4       V P                  \        P                  ! V4      4       V# )zà
Construct a status from the given signal.

@type signal: L{int} between 0 and 255 inclusive.
@param signal: The signal number which the status will represent.

@rtype: L{int}
@return: A status integer for the given signal.
)rC   r¾   r¸  r8   ÚWTERMSIGr½   r¶  )rK   r°  rº  s   && rO   ÚsignalStatusÚProcessAliasTests.signalStatusF  sU   € ð ˆð 	�‰œŸš vÓ.Ô/Ø×ÑœŸš VÓ,¨fÔ5Ø×ÑœŸš fÓ-Ô.àˆr[   c                óF   € \         P                  V n        R\         n        R# )z2
Replace L{smtp.DNSNAME} with a well-known value.
rù   N)r   ÚDNSNAMEr]   s   &rO   r|   ÚProcessAliasTests.setUp^  s   € ô —|‘|ˆŒØŒŽr[   c                ó0   € V P                   \        n         R# )z0
Restore the original value of L{smtp.DNSNAME}.
N)rÂ  r   r]   s   &rO   r¥  ÚProcessAliasTests.tearDowne  s   € ð —|‘|ŒŽr[   r+   c                ó¢  a € \        S P                  4       4      pVP                  R4       \        P                  ! VP
                  R4       \        P                  P                  VP
                  RR4      pVP                  4       pS P                   F  pVP                  V4       K  	  V 3R lpVP                  4       P                  V4      # )zŒ
Standard call to C{mail.alias.ProcessAlias}: check that the specified
script is called, and that the input is correctly transferred to it.
zX#!/bin/sh
rm -f process.alias.out
while read i; do
    echo $i >> process.alias.out
doneiÀ  Nc                óì   <€ \        R 4      ;_uu_ 4       pVP                  4       pRRR4       SP                  X Uu. uF  q3RR NK	  	  upSP                  4       R#   + '       g   i     L@; iu upi )zprocess.alias.outNr  ry  )rh  r¯   rA  rl  rK   s   &   €rO   Ú_cbProcessAliasÚ<ProcessAliasTests.test_processAlias.<locals>._cbProcessAlias�  sS   ø€ ÜÐ)×*Ô*¨aØŸ™›�÷ +à×Ñ©eÓ4©e¨  ›f©eÑ4°d·j±jÖA÷ +×*üâ4s   •A½A1ÁA.	)r%   r«   Ú
setContentr¾   Úchmodr¿   r   r¸  ÚProcessAliasrs  rA  r›   r¶   r·   )rK   Úshr/   rV  rS  rÈ  s   f     rO   Útest_processAliasÚ#ProcessAliasTests.test_processAliask  s�   ø€ ô �d—k‘k“mÓ$ˆØ
�‰ðô	
ô 	�Š�—‘˜%Ô Ü�J‰J×#Ñ# B§G¡G¨T°4Ó8ˆØ×#Ñ#Ó%ˆà—”ˆAØ�N‰N˜1Öñ õ	Bð
 �}‰}‹×*Ñ*¨?Ó;Ð;r[   c                óÈ  a aa€ \         P                  ! 4       p\        4       o\        P                  P                  4       oSP                  S4       \        P                  P                  SRV4      pVP                  4       pVP                  ! VP                  4       VV V3R lpS P                  V\        P                  P                  4       VP                  V4       V# )zã
If the alias child process does not exit within a particular period of
time, the L{Deferred} returned by L{MessageWrapper.eomReceived} should
fail with L{ProcessAliasTimeout} and send the I{KILL} signal to the
child process..
Nc                ó°   <€ SP                  SP                  R .4       SP                  \        SP	                  \
        P                  4      4      4       R# )ÚKILLN)r8   rª  ÚprocessEndedr   r¿  r°  ÚSIGKILL)rh  rŸ  rK   r£   s   &€€€rO   ÚtimedOutÚ<ProcessAliasTests.test_processAliasTimeout.<locals>.timedOut˜  s@   ø€ Ø×Ñ˜Y×.Ñ.°°Ô9ð ×ÑÔ0°×1BÑ1BÄ6Ç>Á>Ó1RÓSÖTr[   )r   r²  r§  r   r¸  ÚProcessAliasProtocolrš   ÚMessageWrapperr¶   r³  ÚcompletionTimeoutrj  ÚProcessAliasTimeoutr·   )rK   r   ÚreceiverrM   rÕ  rŸ  r£   s   f    @@rO   Útest_processAliasTimeoutÚ*ProcessAliasTests.test_processAliasTimeoutˆ  s¢   ú€ ô —*’*“,ˆÜ“Mˆ	Ü—
‘
×/Ñ/Ó1ˆØ×Ñ˜YÔ'ä—:‘:×,Ñ,¨U°D¸'ÓBˆØ× Ñ Ó"ˆØ�Š˜×2Ñ2Ô3÷	Uð 	×Ñ˜1œdŸj™j×<Ñ<Ô=Ø	�‰�hÔØˆr[   c                ó^  € \        4       p\        P                  P                  4       pVP                  ! V4       \        P                  P                  VRR4      pVP                  ! \        P                  ! \        ^ 4      4      4       V P                  VP                  4       \        4      # )zŸ
If the process associated with an L{mail.alias.MessageWrapper} exits
before I{eomReceived} is called, the L{Deferred} returned by
I{eomReceived} should fail.
N)r§  r   r¸  r×  rš   rØ  rÓ  r#   rö  r   rj  r¶   )rK   r£   r   rÛ  s   &   rO   Útest_earlyProcessTerminationÚ.ProcessAliasTests.test_earlyProcessTermination¢  sz   € ô  “Mˆ	Ü—:‘:×2Ñ2Ó4ˆØ×Ò 	Ô*Ü—:‘:×,Ñ,¨X°t¸TÓBˆØ×ÒœgŸošo¬k¸!«nÓ=Ô>Ø×!Ñ! (×"6Ñ"6Ó"8¼+ÓFÐFr[   c                ó^  € \        4       p\        P                  P                  4       pVP                  ! V4       \        P                  P                  VRR4      pVP                  ! \        P                  ! \        V4      4      4       V P                  VP                  4       \        4      # )zµ
Verify that if the process associated with an
L{mail.alias.MessageWrapper} exits with the given status, the
L{Deferred} returned by I{eomReceived} fails with L{ProcessTerminated}.
N)r§  r   r¸  r×  rš   rØ  rÓ  r#   rö  r   rj  r¶   )rK   rº  r£   r   rÛ  s   &&   rO   Ú_terminationTestÚ"ProcessAliasTests._terminationTest¯  s}   € ô  “Mˆ	Ü—:‘:×2Ñ2Ó4ˆØ×Ò 	Ô*Ü—:‘:×,Ñ,¨X°t¸TÓBˆØ×ÒœgŸošoÔ.?ÀÓ.GÓHÔIØ×!Ñ! (×"6Ñ"6Ó"8Ô:KÓLÐLr[   c                óB   € V P                  V P                  ^4      4      # )z™
If the process associated with an L{mail.alias.MessageWrapper} exits
with a non-zero exit code, the L{Deferred} returned by I{eomReceived}
should fail.
)râ  r»  r]   s   &rO   Útest_errorProcessTerminationÚ.ProcessAliasTests.test_errorProcessTermination¼  s   € ð ×$Ñ$ T§_¡_°QÓ%7Ó8Ð8r[   c                ó^   € V P                  V P                  \        P                  4      4      # )zœ
If the process associated with an L{mail.alias.MessageWrapper} exits
because it received a signal, the L{Deferred} returned by
I{eomReceived} should fail.
)râ  r¿  r°  ÚSIGHUPr]   s   &rO   Útest_signalProcessTerminationÚ/ProcessAliasTests.test_signalProcessTerminationÄ  s$   € ð ×$Ñ$ T×%6Ñ%6´v·}±}Ó%EÓFÐFr[   c           	     ór  € / pR\        V. RO4      /p\        . ROVR4      p\        RR.VR4      p\        P                  P	                  RVR4      pVP                  RVRVRV/4       VP                  V4      p\        \        VP                  4      pVP                  4        \        \        \        P                  P	                  RR	R	4      \        P                  P                  \        4       R
4      \        P                  P                  R4      .4      pVP                  4        V P                  Wx4       VP                  V4      p	\        \        V	P                  4      p
V
P                  4        \        \        \        P                  P	                  RR	R	4      \        P                  P	                  RR	R	4      .4      pVP                  4        V P                  W¨4       VP                  V4      p\        \        VP                  4      pVP                  4        \        \        \        P                  P	                  RR	R	4      \        P                  P                  \        4       R
4      \        P                  P                  R4      .4      pVP                  4        V P                  WÈ4       R	# )a…  
Check that the C{resolve} method of alias processors produce the correct
set of objects:
    - direct alias with L{mail.alias.AddressAlias} if a simple input is passed
    - aliases in a file with L{mail.alias.FileWrapper} if an input in the format
      '/file' is given
    - aliases resulting of a process call wrapped by L{mail.alias.MessageWrapper}
      if the format is '|process'
rù   rÞ  rà  râ  ú/fileÚalias1Úalias2Úalias3NÚecho)rÞ  rà  râ  )rÞ  ú|echorì  )Ú
TestDomainr¤  r   r¸  rŠ  rD   r’  r  rV   Úobjsr>   rØ  r™  ÚFileWrapperr8   )rK   r   rX   ÚA1ÚA2ÚA3Úres1Úr1ÚexpectedÚres2Úr2Úres3Úr3s   &            rO   Útest_aliasResolutionÚ&ProcessAliasTests.test_aliasResolutionÌ  s  € ð ˆØ”j Ò*EÓFÐGˆÜÒ7¸ÀÓJˆÜ˜W gÐ.°¸ÓAˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆØ�‰à˜"Ø˜"Ø˜"ðô	
ð �z‰z˜'Ó"ˆÜ”�d—i‘iÓ ˆØ
�‰Œ	ÜÜä—
‘
×'Ñ'¨°°tÓ<Ü—
‘
×)Ñ)¬,«.¸&ÓAÜ—
‘
×&Ñ& wÓ/ðó
ˆð 	�‰ŒØ×Ñ˜Ô&à�z‰z˜'Ó"ˆÜ”�d—i‘iÓ ˆØ
�‰Œ	ÜÜä—
‘
×'Ñ'¨°°tÓ<Ü—
‘
×'Ñ'¨°°tÓ<ðó
ˆð 	�‰ŒØ×Ñ˜Ô&à�z‰z˜'Ó"ˆÜ”�d—i‘iÓ ˆØ
�‰Œ	ÜÜä—
‘
×'Ñ'¨°°tÓ<Ü—
‘
×)Ñ)¬,«.¸&ÓAÜ—
‘
×&Ñ& wÓ/ðó
ˆð 	�‰ŒØ×Ñ˜Ö&r[   c                óV  € / pR\        V. 4      /p\        P                  P                  RVR4      p\        P                  P                  RVR4      p\        P                  P                  RVR4      pVP	                  RVRVRV/4       V P                  VR,          P                  V4      R4       V P                  VR,          P                  V4      R4       V P                  VR,          P                  V4      R4       \        RR.VR4      pWaR&   VP                  V4      p\        \        VP                  4      pVP                  4        \        \        \        P                  P                  \        4       R4      .4      p	V	P                  4        V P                  W‰4       R# )	z>
Check that a cycle in alias resolution is correctly handled.
rù   rî  rí  rï  Nrñ  Úalias4rð  )rò  r   r¸  rŠ  rD   r8   r’  r¤  r  rV   ró  r>   rØ  r™  )
rK   r   rX   rõ  rö  r÷  ÚA4ÚresÚrrú  s
   &         rO   Útest_cyclicAliasÚ"ProcessAliasTests.test_cyclicAlias	  sV  € ð
 ˆØ”j ¨"Ó-Ð.ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆØ�‰˜ " h°°H¸bÐAÔBà×Ñ˜ Õ*×2Ñ2°7Ó;¸TÔBØ×Ñ˜ Õ*×2Ñ2°7Ó;¸TÔBØ×Ñ˜ Õ*×2Ñ2°7Ó;¸TÔBä˜W hÐ/°¸ÓBˆØ�Ñà�j‰j˜Ó!ˆÜ”�S—X‘XÓˆØ	�‰ŒÜ”sœTŸZ™Z×6Ñ6´|³~ÀvÓNÐOÓPˆØ�‰ŒØ×Ñ˜Ö%r[   )rÂ  r|  ro   )rU   rq   rr   rs   r¦   r   ÚIReactorProcessr   r=  rA  r»  r¿  r|   r¥  r   rt   ru   rÎ  rÜ  rß  râ  rå  ré  rÿ  r  rv   r5   r[   rO   r´  r´  &  sÏ   † ñð ×!Ò! '¨4Ó0Ò8Ø.ˆâN€Eòò*ò0ò$ñ ˆC×Ñ Ñ$Ð&>Ó?ñ<ó @ð<ò8ò4GòMò9òGñ ˆC×Ñ Ñ$Ð&>Ó?ñ>'ó @ð>'ñ@ ˆC×Ñ Ñ$Ð&>Ó?ñ&ó @ô&r[   r´  c                  ó&   € ] tR tRtR tRR ltRtR# )rò  i(	  c                	ó   € Wn         W n        R # rz   ©r   Úusers)rK   r   r  s   &&&rO   rš  ÚTestDomain.__init__)	  s   € ØŒØŽ
r[   Nc                	óR  aa€ SP                   P                  oSV P                  9   d   V3R  l#  V P                  S,          pVP	                  V P                  V4      oS'       d   V3R l# \
        P                  ! S4      h  \         d    \
        P                  ! S4      hi ; i)c                 óF   <€ \         P                  P                  S R R 4      # rz   )r   r¸  rŠ  )r÷  s   €rO   r£  Ú#TestDomain.exists.<locals>.<lambda>0	  s   ø€ œ4Ÿ:™:×2Ñ2°4¸¸tÔDr[   c                 ó   <€ S # rz   r5   )r   s   €rO   r£  r  8	  s   ø€ ™wr[   )r¬  Úlocalr  r   r’  r   rŒ   rI  )rK   r÷  r  r/   r   s   &f& @rO   r�   ÚTestDomain.exists-	  s‡   ù€ Ø�y‰y�‰ˆØ�4—:‘:ÔÜDÐDð	)Ø—‘˜TÕ"ˆAð —i‘i §¡¨dÓ3ˆGßÜ&Ð&Ü×"Ò" 4Ó(Ð(øô ô 	)Ü×"Ò" 4Ó(Ð(ð	)ús   ±B Â"B&r  rz   )rU   rq   rr   rs   rš  r�   rv   r5   r[   rO   rò  rò  (	  s   † ò÷)ð )r[   rò  c                  ó>   € ] tR tRtRtR tR tR tR tR t	R t
R	tR
# )Ú
DummyQueuei<	  z¾
A fake relay queue to use for testing.

This queue doesn't keep track of which messages are waiting to be relayed
or are in the process of being relayed.

@ivar directory: See L{__init__}.
c                ó   € Wn         R# )zn
@type directory: L{bytes}
@param directory: The pathname of the directory holding messages in the
    queue.
N©Ú	directory)rK   r  s   &&rO   rš  ÚDummyQueue.__init__F	  s	   € ð #Žr[   c                óô   € \         P                  P                  V4      p\         P                  ! V P	                  V4      R,           4       \         P                  ! V P	                  V4      R,           4       R# )zk
Remove a message from the queue.

@type message: L{bytes}
@param message: The base filename of a message.
r¸  rµ  N)r¾   r¿   ÚbasenameÚremoveÚgetPath©rK   rg   s   &&rO   rÕ  ÚDummyQueue.doneN	  sL   € ô —'‘'×"Ñ" 7Ó+ˆÜ
�	Š	�$—,‘,˜wÓ'¨$Õ.Ô/Ü
�	Š	�$—,‘,˜wÓ'¨$Õ.Ö/r[   c                óx   € \        \        P                  P                  V P                  VR,           4      R4      # )z¹
Get the envelope file for a message in the queue.

@type message: L{bytes}
@param message: The base filename of a message.

@rtype: L{file}
@return: The envelope file for the message.
rµ  rÅ   )r®   r¾   r¿   r¬  r  r  s   &&rO   ÚgetEnvelopeFileÚDummyQueue.getEnvelopeFileY	  s(   € ô ”B—G‘G—L‘L §¡°¸4µÓ@À$ÓGÐGr[   c                óV   € \         P                  P                  V P                  V4      # )zÅ
Return the full base pathname of a message in the queue.

@type message: L{bytes}
@param message: The base filename of a message.

@rtype: L{bytes}
@return: The full base pathname of the message.
)r¾   r¿   r¬  r  r  s   &&rO   r  ÚDummyQueue.getPathe	  s   € ô �w‰w�|‰|˜DŸN™N¨GÓ4Ð4r[   c                óÞ  € \         P                   ! 4        R\        V 4       2p\        \        P                  P                  V P                  VR,           4      R4      p\        P                  P                  V P                  VR,           4      p\        P                  P                  V P                  VR,           4      p\        VR4      pV\        P                  P                  WSV4      3# )z·
Create a new message in the queue.

@rtype: 2-L{tuple} of (E{1}) L{file}, (E{2}) L{FileMessage}
@return: The envelope file and a message receiver for a new message in
    the queue.
Ú_rµ  rª   z-Cr¸  )	ÚtimeÚidr®   r¾   r¿   r¬  r  r   r²   )rK   ÚfnameÚ
headerFileÚtempFilenameÚfinalFilenameÚmessageFiles   &     rO   r   ÚDummyQueue.createNewMessageq	  s¨   € ô —9’9“;�-˜q¤ D£ 
Ð+ˆÜœ"Ÿ'™'Ÿ,™, t§~¡~°u¸tµ|ÓDÀdÓKˆ
Ü—w‘w—|‘| D§N¡N°E¸DµLÓAˆÜŸ™Ÿ™ T§^¡^°U¸Tµ\ÓBˆÜ˜<¨Ó.ˆàœ4Ÿ9™9×0Ñ0Ø }ó
ð 
ð 	
r[   c                ó   € R# )z‰
Ignore the request to mark a message as waiting to be relayed.

@type message: L{bytes}
@param message: The base filename of a message.
Nr5   r  s   &&rO   r  ÚDummyQueue.setWaitingƒ	  s   € ñ 	r[   r  N)rU   rq   rr   rs   r¦   rš  rÕ  r!  r  r   r  rv   r5   r[   rO   r  r  <	  s&   † ñò#ò	0ò
Hò
5ò
ö$r[   r  c                  ó    € ] tR tRtRtR tRtR# )Ú!DummySmartHostSMTPRelayingManageri�	  a  
A fake smart host to use for testing.

@type managed: L{dict} of L{bytes} -> L{list} of
    L{list} of L{bytes}
@ivar managed: A mapping of a string identifying a managed relayer to
    filenames of messages the managed relayer is responsible for.

@ivar queue: See L{__init__}.
c                ó    € / V n         Wn        R# )z”
Initialize the minimum necessary members of a smart host.

@type queue: L{DummyQueue}
@param queue: A queue that can be used for testing purposes.
N©Úmanagedrþ  )rK   rþ  s   &&rO   rš  Ú*DummySmartHostSMTPRelayingManager.__init__™	  s   € ð ˆŒØŽ
r[   r4  N)rU   rq   rr   rs   r¦   rš  rv   r5   r[   rO   r2  r2  �	  s   † ñ	ör[   r2  c                  óÞ   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR t]! ]P"                  R8¬  R4      R 4       t]! ]P"                  R8¬  R4      R 4       tR tR tR tR tRtR# )Ú_AttemptManagerTestsi¤	  a´  
Test the behavior of L{_AttemptManager}.

@type tmpdir: L{bytes}
@ivar tmpdir: The path to a temporary directory holding the message files.

@type reactor: L{MemoryReactorClock}
@ivar reactor: The reactor used for test purposes.

@type eventLog: L{None} or L{dict} of L{bytes} -> L{object}
@ivar eventLog: Information about the last informational log message
    generated or none if no log message has been generated.

@type noisyAttemptMgr: L{_AttemptManager}
@ivar noisyAttemptMgr: An attempt manager which generates informational
    log messages.

@type quietAttemptMgr: L{_AttemptManager}
@ivar quietAttemptMgr: An attempt manager which does not generate
    informational log messages.

@type noisyMessage: L{bytes}
@ivar noisyMessage: The full base pathname of the message to be used with
    the noisy attempt manager.

@type quietMessage: L{bytes}
@ivar quietMessage: The full base pathname of the message to be used with
    the quiet.
c                ó&  € V P                  4       V n        \        P                  ! V P                  4       \	        4       V n        RV n        \        P                  ! V P                  4       \        \        \        V P                  4      4      RV P
                  4      V n        \        \        \        V P                  4      4      RV P
                  4      V n        RpRp\        P                  P!                  V P                  V4      V n        \        P                  P!                  V P                  V4      V n        \'        V P"                  R,           R4      P)                  4        \'        V P$                  R,           R4      P)                  4        V.V P                  P*                  P,                  R&   V.V P                  P*                  P,                  R	&   \'        V P"                  R
,           R4      ;_uu_ 4       p\.        P0                  ! RR.V4       RRR4       \'        V P$                  R
,           R4      ;_uu_ 4       p\.        P0                  ! RR.V4       RRR4       R#   + '       g   i     LY; i  + '       g   i     R# ; i)zÞ
Set up a temporary directory for the queue, attempt managers with the
noisy flag on and off, message files for use with each attempt manager,
and a reactor.  Also, register to be notified when log messages are
generated.
NTFÚnoisyMessageÚquietMessager¸  r½  ÚnoisyRelayerÚquietRelayerrµ  rª   zfrom-noisy@domainzto-noisy@domainzfrom-quiet@domainzto-quiet@domain)r«   r2  r¾   r¹  r   r   ÚeventLogr$   ÚaddObserverÚ_logObserverr   r2  r  ÚnoisyAttemptMgrÚquietAttemptMgrr¿   r¬  r:  r;  r®   r±   ræ  r5  r»  r¼  )rK   ÚnoisyBaseNameÚquietBaseNameÚenvelopes   &   rO   r|   Ú_AttemptManagerTests.setUpÄ	  sÒ  € ð —k‘k“mˆŒÜ
�Š�—‘Ôä)Ó+ˆŒàˆŒÜ�Š˜×)Ñ)Ô*ä.Ü-¬j¸¿¹Ó.EÓFØØ�L‰Ló 
ˆÔô
  /Ü-¬j¸¿¹Ó.EÓFØØ�L‰Ló 
ˆÔð 'ˆØ&ˆäŸG™GŸL™L¨¯©°mÓDˆÔÜŸG™GŸL™L¨¯©°mÓDˆÔäˆT×Ñ Õ% sÓ+×1Ñ1Ô3äˆT×Ñ Õ% sÓ+×1Ñ1Ô3à@M¸ˆ×Ñ×$Ñ$×,Ñ,¨^Ñ<Ø@M¸ˆ×Ñ×$Ñ$×,Ñ,¨^Ñ<ä�$×#Ñ# dÕ*¨D×1Ô1°XÜ�KŠKÐ,Ð.?Ð@À(ÔK÷ 2ô �$×#Ñ# dÕ*¨D×1Ô1°XÜ�KŠKÐ,Ð.?Ð@À(ÔK÷ 2Ñ1÷ 2×1ú÷ 2×1Ð1ús   ÈI,ÉI?É,I<	É?J	c                ó†   € \         P                  ! V P                  4       \        P                  ! V P
                  4       R# )z?
Unregister for log events and remove the temporary directory.
N)r$   ÚremoveObserverr@  r£  r¤  r2  r]   s   &rO   r¥  Ú_AttemptManagerTests.tearDownñ	  s(   € ô 	×Ò˜4×,Ñ,Ô-Ü�Š�d—k‘kÖ"r[   c                ó   € Wn         R# )zš
A log observer.

@type eventDict: L{dict} of L{bytes} -> L{object}
@param eventDict: Information about the last informational log message
    generated.
N)r>  )rK   Ú	eventDicts   &&rO   r@  Ú!_AttemptManagerTests._logObserverø	  s	   € ð "Žr[   c                óŠ   € \        \        \        V P                  4      4      4      pV P	                  VP
                  4       R# )zu
When an attempt manager is created without the noisy parameter, the
noisy instance variable should default to true.
N)r   r2  r  r2  rC   rÿ  ©rK   Úams   & rO   Útest_initNoisyDefaultÚ*_AttemptManagerTests.test_initNoisyDefault
  s-   € ô
 Ô>¼zÈ$Ï+É+Ó?VÓWÓXˆØ�‰˜Ÿ™Ö!r[   c                óP   € V P                  V P                  P                  4       R# )z}
When an attempt manager is created with the noisy parameter set to
true, the noisy instance variable should be set to true.
N)rC   rA  rÿ  r]   s   &rO   Útest_initNoisyÚ#_AttemptManagerTests.test_initNoisy

  s   € ð
 	�‰˜×,Ñ,×2Ñ2Ö3r[   c                óP   € V P                  V P                  P                  4       R# )z
When an attempt manager is created with the noisy parameter set to
false, the noisy instance variable should be set to false.
N)r½   rB  rÿ  r]   s   &rO   Útest_initQuietÚ#_AttemptManagerTests.test_initQuiet
  s   € ð
 	×Ñ˜×-Ñ-×3Ñ3Ö4r[   c                ó”   € \        \        \        V P                  4      4      4      pV P	                  VP
                  \
        4       R# )z‡
When an attempt manager is created without the reactor parameter, the
reactor instance variable should default to the global reactor.
N)r   r2  r  r2  r8   r   rN  s   & rO   Útest_initReactorDefaultÚ,_AttemptManagerTests.test_initReactorDefault
  s1   € ô
 Ô>¼zÈ$Ï+É+Ó?VÓWÓXˆØ×Ñ˜Ÿ™¤WÖ-r[   c                óf   € V P                  V P                  P                  V P                  4       R# )z{
When an attempt manager is created with a reactor provided, the
reactor instance variable should default to that reactor.
N)r8   rA  r   r]   s   &rO   Útest_initReactorÚ%_AttemptManagerTests.test_initReactor 
  s$   € ð
 	×Ñ˜×-Ñ-×5Ñ5°t·|±|ÖDr[   c                óˆ   € V P                   P                  RV P                  4       V P                  V P                  4       R# )z_
For an attempt manager with the noisy flag set, notifySuccess should
result in a log message.
r<  N)rA  rÙ  r:  rC   r>  r]   s   &rO   Útest_notifySuccessNoisyÚ,_AttemptManagerTests.test_notifySuccessNoisy'
  s0   € ð
 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ�‰˜Ÿ™Ö&r[   c                óˆ   € V P                   P                  RV P                  4       V P                  V P                  4       R# )zd
For an attempt manager with the noisy flag not set, notifySuccess
should result in no log message.
r=  N)rB  rÙ  r;  r½   r>  r]   s   &rO   Útest_notifySuccessQuietÚ,_AttemptManagerTests.test_notifySuccessQuiet/
  s2   € ð
 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ×Ñ˜Ÿ™Ö'r[   r+   c                óˆ   € V P                   P                  RV P                  4       V P                  V P                  4       R# )z_
For an attempt manager with the noisy flag set, notifyFailure should
result in a log message.
r<  N)rA  rÝ  r:  rC   r>  r]   s   &rO   Útest_notifyFailureNoisyÚ,_AttemptManagerTests.test_notifyFailureNoisy7
  s0   € ð 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ�‰˜Ÿ™Ö&r[   c                óˆ   € V P                   P                  RV P                  4       V P                  V P                  4       R# )zd
For an attempt manager with the noisy flag not set, notifyFailure
should result in no log message.
r=  N)rB  rÝ  r;  r½   r>  r]   s   &rO   Útest_notifyFailureQuietÚ,_AttemptManagerTests.test_notifyFailureQuiet@
  s2   € ð 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ×Ñ˜Ÿ™Ö'r[   c                ór   € V P                   P                  R4       V P                  V P                  4       R# )z\
For an attempt manager with the noisy flag set, notifyDone should
result in a log message.
r<  N)rA  rà  rC   r>  r]   s   &rO   Útest_notifyDoneNoisyÚ)_AttemptManagerTests.test_notifyDoneNoisyI
  s(   € ð
 	×Ñ×'Ñ'¨Ô7Ø�‰˜Ÿ™Ö&r[   c                ór   € V P                   P                  R4       V P                  V P                  4       R# )za
For an attempt manager with the noisy flag not set, notifyDone
should result in no log message.
r=  N)rB  rà  r½   r>  r]   s   &rO   Útest_notifyDoneQuietÚ)_AttemptManagerTests.test_notifyDoneQuietQ
  s*   € ð
 	×Ñ×'Ñ'¨Ô7Ø×Ñ˜Ÿ™Ö'r[   c                ó¨   € V P                   P                  R4       V P                  V P                  4       V P                  P                  ^<4       R# )zd
For an attempt manager with the noisy flag set, notifyNoConnection
should result in a log message.
r<  N)rA  ÚnotifyNoConnectionrC   r>  r   r³  r]   s   &rO   Útest_notifyNoConnectionNoisyÚ1_AttemptManagerTests.test_notifyNoConnectionNoisyY
  s:   € ð
 	×Ñ×/Ñ/°Ô?Ø�‰˜Ÿ™Ô&Ø�‰×Ñ˜RÖ r[   c                ó¨   € V P                   P                  R4       V P                  V P                  4       V P                  P                  ^<4       R# )zi
For an attempt manager with the noisy flag not set, notifyNoConnection
should result in no log message.
r=  N)rB  rq  r½   r>  r   r³  r]   s   &rO   Útest_notifyNoConnectionQuietÚ1_AttemptManagerTests.test_notifyNoConnectionQuietb
  s<   € ð
 	×Ñ×/Ñ/°Ô?Ø×Ñ˜Ÿ™Ô'Ø�‰×Ñ˜RÖ r[   )r>  rA  r:  rB  r;  r   r2  Nro   )rU   rq   rr   rs   r¦   r|   r¥  r@  rP  rS  rV  rY  r\  r_  rb  r   rt   ru   re  rh  rk  rn  rr  ru  rv   r5   r[   rO   r8  r8  ¤	  s    † ñò<+LòZ#ò"ò"ò4ò5ò.òEò'ò(ñ ˆC×Ñ Ñ$Ð&>Ó?ñ'ó @ð'ñ ˆC×Ñ Ñ$Ð&>Ó?ñ(ó @ð(ò'ò(ò!ö!r[   r8  )…r¦   Ú
__future__r   Úemail.messagerD  Úemail.parserr0  rØ   rB  r¾   r»  r£  r°  rt   r—  rb  r'  Úhashlibr   Útypingr   r   Úunittestr   Úzope.interfacer   r   Úzope.interface.verifyr	   Útwisted.cred.checkersrÊ  Útwisted.cred.credentialsÚtwisted.cred.portalÚtwisted.mail.aliasÚtwisted.mail.mailÚtwisted.mail.maildirÚtwisted.mail.protocolsÚtwisted.mail.relayÚtwisted.mail.relaymanagerr
   r   Útwisted.internetr   r   r   r   r   r   Útwisted.internet.deferr   Útwisted.internet.errorr   r   r   r   Útwisted.internet.testingr   r   r   Útwisted.mailr   r   r   r   Útwisted.namesr   Útwisted.names.dnsr   r    r!   Útwisted.names.errorr"   Útwisted.pythonr#   r$   Útwisted.python.filepathr%   Útwisted.python.runtimer&   Útwisted.trial.unittestr'   r*   rx   r�   r¨   rÒ   rè   r  rÔ   Ú _MaildirMailboxAppendMessageTaskr+  rG  r]  r�  rŸ  rË  rÒ  rÍ  r  r*  ri  rO  r˜  r�  r²  rÒ  rã  rú  r   r!  r"  r&  r$  rE  rL  rN  rø  r?  rL  r~  rˆ  r™  r¸  rÌ  r�  Ú
AliasGroupr¤  r§  r´  rò  r  r2  r8  r5   r[   rO   Ú<module>r–     sä  ðñõ #ã Û Û Û Û 	Û 	Û Û Û Û 
Û Û Û Ý ß  Ý ç 1Ý -ã Û Û Û Û Û Û Û Û  ß ß P× PÝ +÷ó ÷ñ ÷
 $Ý /Ý 5Ý ß ?Ñ ?Ý ,ß 'Ý ,Ý /Ý +ñ ˆ˜ÑÐ!CÓDôe:˜hó e:ó Eðe:ñP ˆ˜ÑÐ!CÓDôG�(ó Gó EðGñ ˆ˜ÑÐ!CÓDô#
 ó #
ó Eð#
ñL ˆ˜ÑÐ!CÓDô5�xó 5ó Eð5ñB ˆ˜ÑÐ!CÓDô=7˜(ó =7ó Eð=7ñ@ ˆ˜ÑÐ!CÓDô<�xó <ó Eð<ñ6 ˆ˜ÑÐ!CÓDôJ6˜Xó J6ó EðJ6ñZ ˆ˜ÑÐ!CÓDôCØ‡L�L×1Ñ1óCó EðC÷40ñ 0ñ2 ˆ˜ÑÐ!CÓDôb˜xÐ)9ó bó EðbñJ ˆ˜ÑÐ!CÓDô%
˜XÐ'7ó %
ó Eð%
ñP ˆ˜ÑÐ!CÓDôU<�8ó U<ó EðU<ñp ˆ˜ÑÐ!CÓDô	T ó 	Tó Eð	Tñ ˆ˜ÑÐ!CÓDôp
˜xó p
ó Eðp
ñf ˆT�Y‰Y×'Ñ'Ó(÷($ð ($ó )ð($ñV ˆ˜ÑÐ!CÓDôKQ˜ó KQó EðKQñ\ ˆ˜ÑÐ!CÓDô?
�xó ?
ó Eð?
ôDˆD�I‰Iô ñ
 ˆ˜ÑÐ!CÓDô"E�ó "Eó Eð"EñJ ˆ˜ÑÐ!CÓDô&5�8ó &5ó Eð&5÷R"ñ "ñ  ˆ˜ÑÐ!CÓDô<˜(ó <ó Eð<ñ> ˆ˜ÑÐ!CÓDôA>˜(ó A>ó EðA>÷H 1Ñ 0ôB�F×'Ñ'ô BòIò&"ñ ˆ˜ÑÐ!CÓDôl>ˆhó l>ó Eðl>ñ^ ˆ˜ÑÐ!CÓDôL˜Hó Ló EðL÷^ñ ñ" ˆ˜ÑÐ!CÓDôa>�ó a>ó Eða>÷H1ñ 1ñ, ˆ˜ÑÐ!CÓDô&7˜ó &7ó Eð&7÷Rñ ô�t—z‘z×.Ñ.ô ô+�T—Z‘Z×*Ñ*ô +÷$ñ $ñ. ˆ˜ÑÐ!CÓDô~&˜ó ~&ó Eð~&÷B)ñ )÷(Nñ N÷bñ ñ. ˆ˜ÑÐ!CÓDôD!˜8ó D!ó EòD!r[   