ó
    Ö›‘hyf ã                  ó.	  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKJrJr  SSKJr  SSKJrJr  SSKJr  SSKrSSKrSSK rSSK!rSSK"rSSK#rSSK$rSSK%rSSK&rSS	KJ'r'J(r(  SS
K)J*r*J+r+J,r,J-r-J.r.J/r/  SSK0J1r1  SSK2J3r3J4r4J5r5J6r6  SSK7J8r8J9r9J:r:  SSK;J<r<J=r=  SSK#J>r>  SSK&J?r?  SSK@JArA  SSKBJCrCJDrDJErE  SSKFJGrG  SSKHJIrIJJrJ  SSKKJLrL  SSKMJNrN  SSKOJPrP  \" \NS:g  S5       " S S\P5      5       rQ\" \NS:g  S5       " S S\P5      5       rR\" \NS:g  S5       " S S\P5      5       rS\" \NS:g  S5       " S  S!\P5      5       rT\" \NS:g  S5       " S" S#\P5      5       rU\" \NS:g  S5       " S$ S%\P5      5       rV\" \NS:g  S5       " S& S'\P5      5       rW\" \NS:g  S5       " S( S)\(R°                  R²                  5      5       rZ " S* S+5      r[\" \NS:g  S5       " S, S-\P\[5      5       r\\" \NS:g  S5       " S. S/\P\[5      5       r]\" \NS:g  S5       " S0 S1\P5      5       r^\" \NS:g  S5       " S2 S3\P5      5       r_\" \NS:g  S5       " S4 S5\P5      5       r`\" \(RP                  RÂ                  5       " S6 S75      5       rb\" \NS:g  S5       " S8 S9\P5      5       rc\" \NS:g  S5       " S: S;\P5      5       rd " S< S=\=RÊ                  5      rf\" \NS:g  S5       " S> S?\P5      5       rg\" \NS:g  S5       " S@ SA\P5      5       rh " SB SC5      ri\" \NS:g  S5       " SD SE\P5      5       rj\" \NS:g  S5       " SF SG\P5      5       rkSSHK@JlrlJmrmJnrn   " SI SJ\mRÞ                  5      rpSK rqSL rr\" \NS:g  S5       " SM SN\P5      5       rs\" \NS:g  S5       " SO SP\P5      5       rt " SQ SR5      ru\" \NS:g  S5       " SS ST\P5      5       rv " SU SV5      rw\" \NS:g  S5       " SW SX\P5      5       rx " SY SZ5      ry " S[ S\\(Rô                  Rö                  5      r| " S] S^\(Rô                  Rú                  5      r~ " S_ S`5      r\" \NS:g  S5       " Sa Sb\P5      5       r€ " Sc Sd5      r� " Se Sf5      r‚ " Sg Sh5      rƒ\" \NS:g  S5       " Si Sj\P5      5       r„g)kz.
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                  ód   • \ rS rSr\" \R                  S:¬  S5      S 5       rS rS r	S r
S rS	rg
)ÚDomainWithDefaultsTestsé@   ©é   únot ported to Python 3c           	     ó„  • [        S5       Vs0 s H  oUS-   _M
     nn[        R                  R                  US5      nU R                  [	        U5      S5        U R                  [        [        U5      5      [        [        S5      5      5        U R                  [        UR                  5       5      [        [        U5      5      5        [        UR                  5       5      nUR                  5         U R                  U[        S5       Vs/ s H	  oUS-   4PM     sn5        [        UR                  5       5      nUR                  5         U R                  U[        [        SS5      5      5        UR                  5       nUR                  5         U R                  U[        S5       Vs/ s H	  oUS-   4PM     sn5        UR                  5       nUR                  5         U R                  U[        [        SS5      5      5        [        S5       HQ  nU R                  X!   US-   5        U R                  UR                  U5      US-   5        U R                  X;   5        MS     US	 US	 US	 U R                  [	        U5      S5        U R                  US   S5        U R                  US   S5        U R                  US   S5        UR                  S SS	S
.5        U R                  [	        U5      S5        U R                  US   S 5        U R                  US   S5        U R                  US   S	5        UR!                  5         U R                  [	        U5      S5        U R                  UR#                  SS5      S5        U R                  US   S5        U R                  UR%                  5       S5        U R                  [	        U5      S5        UR'                  5       nU R                  UR(                  UR(                  5        U R                  UR*                  UR*                  5        g s  snf s  snf s  snf )Né
   ÚDefaulté   é   é   é   é   © Ú*)ÚaÚbÚcr:   r;   r<   r   ÚkeyÚvalue)r=   r>   )Úranger   ÚDomainWithDefaultDictÚassertEqualÚlenÚlistÚiterÚiterkeysÚ	iteritemsÚsortÚ
itervaluesÚitemsÚvaluesÚgetÚ
assertTrueÚupdateÚclearÚ
setdefaultÚpopitemÚcopyÚdomainsÚdefault)ÚselfÚxÚdrI   rJ   Údcopys         Ú_C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/mail/test/test_mail.pyÚtestMethodsÚ#DomainWithDefaultsTests.testMethodsB   sI  € ä % 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 "¨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   ŽP3ÄP8
Æ+P=
c                óì   • [         R                   R                  0 S5      nU R                  UR                  R                  U" U5      5        SUS'   U R                  [        SS05      U" U5      5        g)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.
r2   r>   r=   N)r   r@   ÚassertInÚ	__class__Ú__name__Ústr)rT   ÚstringifierÚdomains      rX   Ú_stringificationTestÚ,DomainWithDefaultsTests._stringificationTestz   s_   € ô —‘×0Ñ0°°YÓ?ˆØ�‰�f×&Ñ&×/Ñ/±¸VÓ1DÔEØˆˆu‰Ø�‰”c˜5 'Ð*Ó+©[¸Ó-@ÕAó    c                ó.   • U R                  [        5        g)z
L{DomainWithDefaultDict.__str__} should return a string including
the class name and the domain mapping held by the instance.
N)rb   r_   ©rT   s    rX   Útest_strÚ DomainWithDefaultsTests.test_str‰   s   € ð
 	×!Ñ!¤#Õ&rd   c                ó.   • U R                  [        5        g)z€
L{DomainWithDefaultDict.__repr__} should return a string including
the class name and the domain mapping held by the instance.
N)rb   Úreprrf   s    rX   Ú	test_reprÚ!DomainWithDefaultsTests.test_repr�   s   € ð
 	×!Ñ!¤$Õ'rd   c                ó>  • [         R                   R                  0 S5      nUR                  S5        SnU R                  U R                  /5      nU R                  S[        U5      5        U R                  [        US   S   5        U R                  X#S   S   5        g)	z
has_key is now deprecated.
r2   Úanythingzotwisted.mail.mail.DomainWithDefaultDict.has_key was deprecated in Twisted 16.3.0. Use the `in` keyword instead.é   r   ÚcategoryÚmessageN)r   r@   Úhas_keyÚflushWarningsÚtest_has_keyDeprecationrA   rB   ÚDeprecationWarning)rT   Úsutrq   Úwarningss       rX   rt   Ú/DomainWithDefaultsTests.test_has_keyDeprecation—   s�   € ô �i‰i×-Ñ-¨b°)Ó<ˆà�‰�JÔð?ð 	ð ×%Ñ% t×'CÑ'CÐ&DÓEˆØ×Ñ˜œC ›MÔ*Ø×ÑÔ+¨X°a©[¸Ñ-DÔEØ×Ñ˜¨1¡+¨iÑ"8Õ9rd   r8   N)r^   Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚsysÚversion_inforY   rb   rg   rk   rt   Ú__static_attributes__r8   rd   rX   r+   r+   @   s>   † áˆC×Ñ Ñ$Ð&>Ó?ñ53ó @ð53ònBò'ò(õ:rd   r+   c                  ó,   • \ rS rSrS rS rS rS rSrg)ÚBounceTestsé©   c                óJ   • [         R                   R                  5       U l        g ©N)r   ÚBounceDomainra   rf   s    rX   ÚsetUpÚBounceTests.setUp«   s   € Ü—i‘i×,Ñ,Ó.ˆ�rd   c                ón   • U R                  [        R                  U R                  R                  S5        g )Nzany user)ÚassertRaisesr   ÚAddressErrorra   Úexistsrf   s    rX   Ú
testExistsÚBounceTests.testExists®   s$   € Ø×Ñœ$×+Ñ+¨T¯[©[×-?Ñ-?ÀÕLrd   c                ó\   • U R                  U R                  R                  SS5      S5        g )Nzrandom q emailerr   F)rA   ra   Ú	willRelayrf   s    rX   Ú	testRelayÚBounceTests.testRelay±   s%   € Ø×Ñ˜Ÿ™×.Ñ.Ð/AÀ:ÓNÐPUÕVrd   c                ó¦   • U R                   R                  SS5        U R                  [        R                  U R                   R
                  S5        g )NÚbobÚpassword)ra   ÚaddUserrˆ   r   ÚSMTPBadRcptrŠ   rf   s    rX   ÚtestAddUserÚBounceTests.testAddUser´   s8   € Ø�‰×Ñ˜E :Ô.Ø×Ñœ$×*Ñ*¨D¯K©K×,>Ñ,>ÀÕFrd   )ra   N)	r^   ry   rz   r{   r…   r‹   r�   r–   r~   r8   rd   rX   r€   r€   ©   s   † ò/òMòWõGrd   r€   c                  ó   • \ rS rSrSrS rSrg)ÚBounceWithSMTPServerTestsé¹   zS
Tests for L{twisted.mail.mail.BounceDomain} with
L{twisted.mail.smtp.SMTPServer}.
c                óð  • [         R                   R                  5       n[         R                   R                  5       nUR                  SU5        [         R                  R                  U5      nUR                  S5      n[         R                  R                  USS5      nXTl        [        5       nUR                  " U5        UR                  " S5        UR                  " S5        UR                  " S5        UR                  " S5        U R                  UR                  5        UR                  " S5        U R                  UR!                  5       R#                  5       R%                  S5      S   S	5        g)
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ÚlineReceivedrL   ÚdisconnectingÚconnectionLostrA   r>   ÚstripÚsplit)rT   Úservicera   Úfactoryr   Ú	delivererÚ	transports          rX   Ú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õ	
rd   r8   N)r^   ry   rz   r{   Ú__doc__r®   r~   r8   rd   rX   r™   r™   ¹   s   † ñõ

rd   r™   c                  ó2   • \ rS rSrS rS rS rS rS rSr	g)	ÚFileMessageTestséà   c                ó`  • U R                  5       U l        U R                  5       U l        [        U R                  S5      U l        U R                  U R                  R                  5        [        R                  R                  U R                  U R                  U R                  5      U l	        g )NÚwb)
ÚmktempÚnameÚfinalÚopenÚfÚ
addCleanupÚcloser   ÚFileMessageÚfprf   s    rX   r…   ÚFileMessageTests.setUpâ   sh   € Ø—K‘K“MˆŒ	Ø—[‘[“]ˆŒ
Ü�d—i‘i Ó&ˆŒØ�‰˜Ÿ™Ÿ™Ô%Ü—)‘)×'Ñ'¨¯©°·	±	¸4¿:¹:ÓFˆ�rd   c                óh   • U R                   R                  5       R                  U R                  5      $ rƒ   )r¾   ÚeomReceivedÚaddCallbackÚ_cbFinalNamerf   s    rX   ÚtestFinalNameÚFileMessageTests.testFinalNameé   s&   € Ø�w‰w×"Ñ"Ó$×0Ñ0°×1BÑ1BÓCÐCrd   c                óô   • U R                  XR                  5        U R                  U R                  R                  5        U R                  [        R                  R                  U R                  5      5        g rƒ   )
rA   r¸   rL   rº   ÚclosedÚassertFalseÚosÚpathrŠ   r·   ©rT   Úresults     rX   rÃ   ÚFileMessageTests._cbFinalNameì   sG   € Ø×Ñ˜§¡Ô,Ø�‰˜Ÿ™Ÿ™Ô&Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Õ3rd   c                ó@  • SnUR                  5        H  nU R                  R                  U5        M      U R                  R                  5         [	        U R
                  S5       nU R                  UR                  5       U5        S S S 5        g ! , (       d  f       g = f)Nó"   first line
second line
third line
Úrb)Ú
splitlinesr¾   r¥   rÁ   r¹   r¸   rA   Úread)rT   ÚcontentsÚlinerº   s       rX   ÚtestContentsÚFileMessageTests.testContentsñ   sn   € Ø;ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔÜ�$—*‘*˜dÔ# qØ×Ñ˜QŸV™V›X xÔ0÷ $×#Ö#ús   Á%!BÂ
Bc                ó€  • SnUR                  5        H  nU R                  R                  U5        M      U R                  R                  5         U R	                  [
        R                  R                  U R                  5      5        U R	                  [
        R                  R                  U R                  5      5        g )Nó   first line
second line
)
rÑ   r¾   r¥   r§   rÈ   rÉ   rÊ   rŠ   r·   r¸   ©rT   rÓ   rÔ   s      rX   ÚtestInterruptedÚ FileMessageTests.testInterruptedù   sz   € Ø/ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔ Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ô3Ø×ÑœŸ™Ÿ™¨¯
©
Ó3Õ4rd   )rº   r¸   r¾   r·   N)
r^   ry   rz   r{   r…   rÄ   rÃ   rÕ   rÚ   r~   r8   rd   rX   r²   r²   à   s   † òGòDò4ò
1õ5rd   r²   c                  ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚMaildirMessageTestsi  zD
Tests for the file creating by the L{mail.maildir.MaildirMessage}.
c                ó„  • U R                  5       U l        U R                  5       U l        SU l        [	        U R                  S5      U l        U R                  U R
                  R                  5        [        R                  R                  U R                  U R
                  U R                  U R                  5      U l        g)z#
Create and open a temporary file.
s   user@example.comrµ   N)r¶   r·   r¸   r   r¹   rº   r»   r¼   r   ÚmaildirÚMaildirMessager¾   rf   s    rX   r…   ÚMaildirMessageTests.setUp  sz   € ð —K‘K“MˆŒ	Ø—[‘[“]ˆŒ
Ø*ˆŒÜ�d—i‘i Ó&ˆŒØ�‰˜Ÿ™Ÿ™Ô%Ü—,‘,×-Ñ-Ø�L‰L˜$Ÿ&™& $§)¡)¨T¯Z©Zó
ˆ�rd   c                óN   • [         R                   " U R                   S35      S   $ )zK
Search for the final file path.

@rtype: L{str}
@return: Final file path.
z	,S=[0-9]*r   )Úglobr¸   rf   s    rX   Ú
_finalNameÚMaildirMessageTests._finalName  s#   € ô �yŠy˜DŸJ™J˜< yÐ1Ó2°1Ñ5Ð5rd   c                óŠ  • U R                  U R                  R                  5       5      nU R                  XR                   S[
        R                  R                  U5       35        U R                  U R                  R                  5        U R                  [
        R                  R                  U R                  5      5        g)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Á   rA   r¸   rÉ   rÊ   ÚgetsizerL   rº   rÇ   rÈ   rŠ   r·   )rT   r¸   s     rX   Útest_finalNameÚ"MaildirMessageTests.test_finalName  s   € ð
 ×$Ñ$ T§W¡W×%8Ñ%8Ó%:Ó;ˆØ×Ñ˜§:¡: ,¨c´"·'±'·/±/À%Ó2HÐ1IÐ JÔKØ�‰˜Ÿ™Ÿ™Ô&Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Õ3rd   c                óh  • SnUR                  5        H  nU R                  R                  U5        M      U R                  U R                  R	                  5       5      n[        US5       nU R                  UR                  5       SU R                  U4-  5        SSS5        g! , (       d  f       g= f)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¹   rA   rÒ   r   )rT   rÓ   rÔ   r¸   rº   s        rX   Útest_contentsÚ!MaildirMessageTests.test_contents(  s‹   € ð
 <ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à×$Ñ$ T§W¡W×%8Ñ%8Ó%:Ó;ˆÜ�%˜Ô !Ø×ÑØ—‘“Ð1°T·\±\À8Ð4LÑLô÷ ×Öús   Á*0B#Â#
B1c                óP  • SnUR                  5        H  nU R                  R                  U5        M      U R                  R                  5         U R	                  [
        R                  R                  U R                  5      5        U R                  [        U R                  5        g)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      rX   Útest_interruptedÚ$MaildirMessageTests.test_interrupted6  sq   € ð
 0ˆØ×'Ñ'Ö)ˆDØ�G‰G× Ñ  Ö&ñ *à�‰×ÑÔ Ø×ÑœŸ™Ÿ™¨¯	©	Ó2Ô3Ø×Ñœ* d§o¡oÕ6rd   )r   rº   r¸   r¾   r·   N)r^   ry   rz   r{   r°   r…   rä   ré   rì   rð   r~   r8   rd   rX   rÝ   rÝ     s    † ñò
ò6ò4òõ
7rd   rÝ   c                  ó&   • \ rS rSrS rS rS rSrg)ÚMailServiceTestsiC  c                óJ   • [         R                   R                  5       U l        g rƒ   )r   r�   rª   rf   s    rX   r…   ÚMailServiceTests.setUpE  s   € Ü—y‘y×,Ñ,Ó.ˆ�rd   c                ó°  • U R                   R                  5       nU R                  [        U[        R
                  5      5        U R                  UR                  S5      [        R                  5        U R                   R                  5       nU R                  [        U[        R
                  5      5        U R                  UR                  S5      [        R                  5        U R                   R                  5       nU R                  [        U[        R
                  5      5        U R                  UR                  S5      [        R                  5        g )N)ú	127.0.0.1é90  )rª   ÚgetPOP3FactoryrL   Ú
isinstancer   ÚServerFactoryr¡   r   ÚPOP3ÚgetSMTPFactoryr   ÚSMTPÚgetESMTPFactoryÚESMTP)rT   rº   s     rX   Ú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ÕJrd   c                ó:  • [        5       n[        5       nXR                  R                  S'   X R                  R                  S'   U R                  U R                  R	                  S5      UL 5        U R                  U R                  R                  5       UL 5        g )Nra   Ú )Úobjectrª   ÚportalsrL   ÚlookupPortalÚdefaultPortal)rT   Úo1Úo2s      rX   ÚtestPortalsÚMailServiceTests.testPortalsU  sr   € Ü‹XˆÜ‹XˆØ)+�‰×Ñ˜XÑ&Ø#%�‰×Ñ˜RÑ à�‰˜Ÿ™×1Ñ1°(Ó;¸rÐAÔBØ�‰˜Ÿ™×2Ñ2Ó4¸Ð:Õ;rd   )rª   N)r^   ry   rz   r{   r…   r  r  r~   r8   rd   rX   ró   ró   C  s   † ò/òKõ<rd   ró   c                  ó¦   • \ rS rSrSrS rS r\" \R                  S:¬  S5      S 5       r
\" \R                  S:¬  S5      S 5       rS	 rS
 rS rSrg)ÚStringListMailboxTestsi_  zW
Tests for L{StringListMailbox}, an in-memory only implementation of
L{pop3.IMailbox}.
c                ó  • [         R                  R                  / SQ5      nU R                  UR	                  S5      S5        U R                  UR	                  S5      S5        U R                  UR	                  S5      S5        g)zr
L{StringListMailbox.listMessages} returns the length of the message at
the offset into the mailbox passed to it.
)ÚabcÚabr:   r   r.   ro   r4   N©r   rß   ÚStringListMailboxrA   ÚlistMessages©rT   Úmailboxs     rX   Útest_listOneMessageÚ*StringListMailboxTests.test_listOneMessagef  sj   € ô
 —,‘,×0Ñ0Ò1CÓDˆØ×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-¨aÓ0°!Õ4rd   c                óŠ   • [         R                  R                  / SQ5      nU R                  UR	                  5       / SQ5        g)zi
L{StringListMailbox.listMessages} returns a list of the lengths of all
messages if not passed an index.
)r:   r  r  )ro   r.   r4   Nr  r  s     rX   Útest_listAllMessagesÚ+StringListMailboxTests.test_listAllMessagesp  s2   € ô
 —,‘,×0Ñ0Ò1CÓDˆØ×Ñ˜×-Ñ-Ó/²Õ;rd   r-   r/   c                ó¤   • [         R                  R                  SS/5      nU R                  UR	                  S5      R                  5       S5        g)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 contentsro   N)r   rß   r  rA   Ú
getMessagerÒ   r  s     rX   Útest_getMessageÚ&StringListMailboxTests.test_getMessagex  sA   € ô —,‘,×0Ñ0°%¸Ð1IÓJˆØ×Ñ˜×+Ñ+¨AÓ.×3Ñ3Ó5°ÕGrd   c                ó¦   • [         R                  R                  SS/5      nU R                  UR	                  S5      UR	                  S5      5        g)zp
L{StringListMailbox.getUidl} returns a unique identifier for the
message at the given offset into the mailbox.
r  Úbarr   ro   N)r   rß   r  ÚassertNotEqualÚgetUidlr  s     rX   Útest_getUidlÚ#StringListMailboxTests.test_getUidl‚  s>   € ô —,‘,×0Ñ0°%¸°Ó@ˆØ×Ñ˜GŸO™O¨AÓ.°·±ÀÓ0BÕCrd   c                óê   • [         R                  R                  S/5      nUR                  S5        U R	                  UR                  S5      S5        U R	                  UR                  5       S/5        g)zv
L{StringListMailbox.deleteMessage} marks a message for deletion causing
further requests for its length to return 0.
r  r   N)r   rß   r  ÚdeleteMessagerA   r  r  s     rX   Útest_deleteMessageÚ)StringListMailboxTests.test_deleteMessage‹  s^   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Õ5rd   c                ó
  • [         R                  R                  S/5      nUR                  S5        UR	                  5         U R                  UR                  S5      S5        U R                  UR                  5       S/5        g)zw
L{StringListMailbox.undeleteMessages} causes any messages marked for
deletion to be returned to their original state.
r  r   r.   N)r   rß   r  r(  ÚundeleteMessagesrA   r  r  s     rX   Útest_undeleteMessagesÚ,StringListMailboxTests.test_undeleteMessages•  sj   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø× Ñ Ô"Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Õ5rd   c                ó*  • [         R                  R                  S/5      nUR                  S5        UR	                  5         UR                  5         U R                  UR                  S5      S5        U R                  UR                  5       S/5        g)za
L{StringListMailbox.sync} causes any messages as marked for deletion to
be permanently deleted.
r  r   N)r   rß   r  r(  Úsyncr,  rA   r  r  s     rX   Ú	test_syncÚ StringListMailboxTests.test_sync   ss   € ô
 —,‘,×0Ñ0°%°Ó9ˆØ×Ñ˜aÔ Ø�‰ŒØ× Ñ Ô"Ø×Ñ˜×-Ñ-¨aÓ0°!Ô4Ø×Ñ˜×-Ñ-Ó/°!°Õ5rd   r8   N)r^   ry   rz   r{   r°   r  r  r   r|   r}   r  r%  r)  r-  r1  r~   r8   rd   rX   r  r  _  st   † ñò
5ò<ñ ˆC×Ñ Ñ$Ð&>Ó?ñHó @ðHñ ˆC×Ñ Ñ$Ð&>Ó?ñDó @ðDò6ò	6õ
6rd   r  c                  ó2   • \ rS rSrSrSrSrS rS rS r	Sr
g)Ú&FailingMaildirMailboxAppendMessageTaski­  Tc                ó†   • U R                   (       a  [        R                  " XU5      $ [        [        R
                  S5      e©NzFaked Permission Problem)Ú
_openstaterÉ   r¹   ÚOSErrorÚerrnoÚEPERM)rT   ÚfnÚattrÚmodes       rX   ÚosopenÚ-FailingMaildirMailboxAppendMessageTask.osopenµ  s,   € Ø�?�?Ü—7’7˜2 TÓ*Ð*äœ%Ÿ+™+Ð'AÓBÐBrd   c                ó„   • U R                   (       a  [        R                  " X5      $ [        [        R
                  S5      e)NzFaked Space problem)Ú_writestaterÉ   Úwriter8  r9  ÚENOSPC)rT   ÚfhÚdatas      rX   ÚoswriteÚ.FailingMaildirMailboxAppendMessageTask.oswrite»  s,   € Ø××Ü—8’8˜BÓ%Ð%äœ%Ÿ,™,Ð(=Ó>Ð>rd   c                ó„   • U R                   (       a  [        R                  " X5      $ [        [        R
                  S5      er6  )Ú_renamestaterÉ   Úrenamer8  r9  r:  )rT   ÚoldnameÚnewnames      rX   ÚosrenameÚ/FailingMaildirMailboxAppendMessageTask.osrenameÁ  s,   € Ø××Ü—9’9˜WÓ.Ð.äœ%Ÿ+™+Ð'AÓBÐBrd   r8   N)r^   ry   rz   r{   r7  rA  rI  r>  rF  rM  r~   r8   rd   rX   r4  r4  ­  s$   † ð €JØ€KØ€LòCò?õCrd   r4  c                  ó.   • \ rS rSrSr      SS jrSrg)Ú_AppendTestMixiniÈ  z„
Mixin for L{MaildirMailbox.appendMessage} test cases which defines a helper
for serially appending multiple messages to a mailbox.
c                óN   ^^• SUU4S jjn[         R                  " U" 5       5      $ )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               “  ó~   >#   • / n T H-  nTR                  U5      I S h  v•N   U R                  S 5        M/     U $  N7frƒ   )ÚappendMessageÚappend)ÚresultsÚmÚmboxÚmessagess     €€rX   rT  Ú0_AppendTestMixin._appendMessages.<locals>.append×  sA   øé € Ø"$ˆGÛ�Ø×(Ñ(¨Ó+×+Ð+Ø—‘˜tÖ$ñ ð ˆNñ ,ùs   ƒ=Ÿ; =)Úreturnz
list[None]©r   ÚfromCoroutine)rT   rW  rX  rT  s    `` rX   Ú_appendMessagesÚ _AppendTestMixin._appendMessagesÎ  s"   ù€ ÷	ð 	ô ×%Ò%¡f£hÓ/Ð/rd   r8   N)rW  z#twisted.mail.maildir.MaildirMailboxrX  zlist[bytes]rZ  zDeferred[list[None]])r^   ry   rz   r{   r°   r]  r~   r8   rd   rX   rP  rP  È  s$   † ñð
0Ø7ð0ØCNð0à	÷0rd   rP  c                  óP   • \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	S	 r
S
rg)ÚMaildirAppendStringTestsiá  úG
Tests for L{MaildirMailbox.appendMessage} when invoked with a C{str}.
c                ó¨   • [         R                  " U R                  5       5      U l        [        R
                  R                  U R                  5        g rƒ   )rÉ   Úfsencoder¶   rV   r   rß   ÚinitializeMaildirrf   s    rX   r…   ÚMaildirAppendStringTests.setUpç  s.   € Ü—’˜TŸ[™[›]Ó+ˆŒÜ�‰×&Ñ& t§v¡vÕ.rd   c                óP   • UR                  S5      nU R                  U[        5      $ )Ns   TEST)rS  ÚassertFailureÚ	Exception)rT   ÚignoredrW  rV   s       rX   Ú_appendÚ MaildirAppendStringTests._appendë  s%   € Ø×Ñ˜wÓ'ˆØ×!Ñ! !¤YÓ/Ð/rd   Nc                ó¼  • UbF  U R                  [        UR                  SUR                  R                  5        X2R                  l        UbF  U R                  [        UR                  SUR                  R                  5        XBR                  l        UbG  U R                  [        UR                  SUR                  R
                  5        XRR                  l        gg)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.
NrI  rA  r7  )r»   ÚsetattrÚAppendFactoryrI  rA  r7  )rT   ri  rW  rJ  rB  r¹   s         rX   Ú	_setStateÚ"MaildirAppendStringTests._setStateï  sÀ   € ð ÑØ�O‰OÜØ×"Ñ"ØØ×"Ñ"×/Ñ/ô	ð /5×ÑÔ+ØÑØ�O‰OÜØ×"Ñ"ØØ×"Ñ"×.Ñ.ô	ð .3×ÑÔ*ØÑØ�O‰OÜ˜×+Ñ+¨\¸4×;MÑ;M×;XÑ;Xôð -1×ÑÕ)ð	 rd   c                óP  • [         R                  R                  U R                  5      n[        Ul        U R                  U[        SS5       Vs/ s H  nSU-  PM
     sn5      nUR                  U R                  S/S-  5        UR                  U R                  U5        U$ s  snf )ú~
L{MaildirMailbox.appendMessage} returns a L{Deferred} which fires when
the message has been added to the end of the mailbox.
ro   é   ó   XNr1   )r   rß   r   rV   r4  rn  r]  r?   rÂ   rA   Ú_cbTestAppend)rT   rW  ÚirV   s       rX   Útest_appendÚ$MaildirAppendStringTests.test_append  sˆ   € ô
 �|‰|×*Ñ*¨4¯6©6Ó2ˆÜCˆÔà× Ñ  ¼%ÀÀ2¼,Ó'Gº,°Q¨¨q¬¹,Ñ'GÓHˆØ	�‰�d×&Ñ&¨¨°©Ô4Ø	�‰�d×(Ñ(¨$Ô/Øˆùò (Hs   ÁB#
c                óJ   ^ • SU 4S jjn[         R                  " U" 5       5      $ )z…
Appending a message, then re-opening the mailbox by creating a new
MaildirMailbox, should result in seeing the message as loadable.
c               “  óú  >#   • [         R                  R                  TR                  5      n SnU R	                  U5      I S h  v•N   [         R                  R                  TR                  5      nUR                  5       nTR                  [        U5      S5        Uu  nTR                  U[        U5      5        TR                  UR                  S5      R                  5       UR                  5       5        g  Nµ7f)Ns   xyzzyro   r   )r   rß   r   rV   rS  r  rA   rB   r  rÒ   Údecode)Úmbox1ÚsampleÚmbox2ÚlistedÚmessageSizerT   s        €rX   Ú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;ÁC9ÁB6C;©rZ  ÚNoner[  )rT   r�  s   ` rX   Útest_reopenMailboxÚ+MaildirAppendStringTests.test_reopenMailbox  s   ø€ ÷		Jô ×%Ò%¡b£dÓ+Ð+rd   c           
     óˆ  • U R                  [        UR                  5       5      S5        U R                  [        S5       Vs/ s H+  n[        UR	                  U5      R                  5       5      PM-     sn[        [        SS5      5      5        U R                  SUSS9  U R                  SU5      nUR                  U R                  USSS9  UR                  U R                  U5        UR                  U R                  USSS	9  UR                  U R                  U5        UR                  U R                  USS
9  U$ s  snf )ú»
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.
r1   ro   rs  NF)rJ  T)rJ  rB  )rB  r¹   )r¹   )
rA   rB   r  r?   r  rÒ   rC   ro  rj  rÂ   )rT   ri  rW  rv  rV   s        rX   ru  Ú&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   Á2D?©rV   rƒ  )ri  r  rW  r   rZ  zDeferred[None])NNN©rZ  r   )r^   ry   rz   r{   r°   r…   rj  ro  rw  r…  ru  r~   r8   rd   rX   r`  r`  á  s&   † ñô/ô0ô!1ôFô,õ&rd   r`  c                  ó\   • \ rS rSrSrS r\" \R                  S:¬  S5      S 5       r	S r
Srg	)
ÚMaildirAppendFileTestsiG  ra  c                ó€   • U R                  5       U l        [        R                  R	                  U R                  5        g rƒ   ©r¶   rV   r   rß   rd  rf   s    rX   r…   ÚMaildirAppendFileTests.setUpM  ó%   € Ø—‘“ˆŒÜ�‰×&Ñ& t§v¡vÕ.rd   r-   r/   c                óª  • [         R                  R                  U R                  5      n/ n[	        SS5       Hj  n[
        R                  " 5       nUR                  SU-  5        UR                  SS5        UR                  U5        U R                  UR                  5        Ml     U R                  X5      nUR                  U R                  U5        U$ )rr  ro   rs  ÚXr   )r   rß   r   rV   r?   ÚtempfileÚTemporaryFilerB  ÚseekrT  r»   r¼   r]  rÂ   ru  )rT   rW  rX  rv  ÚtemprV   s         rX   rw  Ú"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×(Ñ(¨$Ô/Øˆrd   c           
     ó*  • U R                  [        UR                  5       5      S5        U R                  [        S5       Vs/ s H+  n[        UR	                  U5      R                  5       5      PM-     sn[        [        SS5      5      5        gs  snf )rˆ  r1   ro   rs  N)rA   rB   r  r?   r  rÒ   rC   )rT   rÌ   rW  rv  s       rX   ru  Ú$MaildirAppendFileTests._cbTestAppendd  sm   € ð 	×Ñœ˜T×.Ñ.Ó0Ó1°2Ô6Ø×ÑÜ5:¸2´YÓ?²Y°ŒS�—‘ Ó#×(Ñ(Ó*Ö+±YÑ?ÄÄeÈAÈrÃlÓASõ	
ùÚ?s   Á2BrŠ  N)r^   ry   rz   r{   r°   r…   r   r|   r}   rw  ru  r~   r8   rd   rX   r�  r�  G  s9   † ñò/ñ ˆC×Ñ Ñ$Ð&>Ó?ñó @ðõ$	
rd   r�  c                  ód   • \ rS rSrS rS rS rS r\" \	R                  S:¬  S5      S 5       rS	rg
)ÚMaildirTestsip  c                ó€   • U R                  5       U l        [        R                  R	                  U R                  5        g rƒ   r�  rf   s    rX   r…   ÚMaildirTests.setUpr  r‘  rd   c                óD   • [         R                  " U R                  5        g rƒ   )ÚshutilÚrmtreerV   rf   s    rX   ÚtearDownÚMaildirTests.tearDownv  s   € Ü�Š�d—f‘fÕrd   c                ó$  • U R                   n[        R                  R                  US5      nU R	                  [        R                  R                  U5      =(       a    [        R                  R                  U5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        U R	                  [        R                  R                  [        R                  R                  US5      5      5        g )Nú.TrashÚnewÚcurÚtmp)rV   rÉ   rÊ   ÚjoinrL   rŠ   Úisdir)rT   rV   Útrashs      rX   Ú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ÕBrd   c                ó  • [         R                  " 5       nUR                  S5        [        R                  R                  U5      nUR                  5       nUR                  S5        UR                  5       nU R                  X4:  5        g)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ÚgeneraterL   )rT   ÚclockÚ	generatorÚ	firstNameÚ
secondNames        rX   Útest_nameGeneratorÚMaildirTests.test_nameGeneratorŒ  sf   € ô —
’
“ˆØ�‰�dÔÜ—L‘L×6Ñ6°uÓ=ˆ	à×&Ñ&Ó(ˆ	Ø�‰�dÔØ×'Ñ'Ó)ˆ
à�‰˜	Ñ.Õ/rd   r-   r/   c           
     ó  • [         R                  R                  n[        R                  R
                  nS VVs/ s H"  n[        S5        H  oA" X2" 5       5      PM     M$     nnnSnU HB  n[        U" U R                  U5      S5       nUR                  SU-  5        SSS5        US-   nMD     [        R                  R                  U R                  5      n	U R                  U	R                  5       [        [        SS5      5      5        U R                  U	R                  S5      S5        U R                  U	R                  S5      S	5        U R                  U	R                  S	5      R                  5       S
5        U R                  U	R                  S5      R                  5       S5        0 n
[        S5       H+  nU	R!                  U5      nU R#                  Xº;   5        SX«'   M-     [         R                  R%                  US   5      u  pÇU	R'                  S5        U R                  U	R                  S5      S5        U R)                  [         R                  R+                  U" U R                  SSU5      5      5        U R#                  [         R                  R+                  U" U R                  US   5      5      5        U	R-                  5         U R                  U	R                  S5      S	5        U R#                  [         R                  R+                  U" U R                  SSU5      5      5        U R)                  [         R                  R+                  U" U R                  US   5      5      5        gs  snnf ! , (       d  f       GNä= f)zJ
Exercise the methods of L{IMailbox} as implemented by
L{MaildirMailbox}.
)r§  r¦  é   ro   ÚwrU   Nrs  r4   r6   ÚxxxxxxxÚxxr1   r   r¥  r§  )rÉ   rÊ   r©  r   rß   Ú_generateMaildirNamer?   r¹   rV   rB  r   rA   r  rC   r  rÒ   r$  rÈ   r©   r(  rL   rŠ   r,  )rT   ÚjÚnr;   rU   Úmsgsrv  rº   ÚfObjÚmbrV   ÚuÚps                rX   Ú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   º)M6Â
M<Í<
N	rŠ  N)r^   ry   rz   r{   r…   r¢  r¬  r·  r   r|   r}   rÆ  r~   r8   rd   rX   rœ  rœ  p  s?   † ò/òòCò&0ñ" ˆC×Ñ Ñ$Ð&>Ó?ñ(<ó @ó(<rd   rœ  c                  ó   • \ rS rSrSrS rSrg)ÚAbstractMaildirDomainTestsiÉ  z:
Tests for L{twisted.mail.maildir.AbstractMaildirDomain}.
c                ó|   • [        [        R                  R                  [        R                  R                  5        g)zG
L{maildir.AbstractMaildirDomain} implements L{mail.IAliasableDomain}.
N)r
   r   ÚIAliasableDomainrß   ÚAbstractMaildirDomainrf   s    rX   Útest_interfaceÚ)AbstractMaildirDomainTests.test_interfaceÏ  s"   € ô 	”D—I‘I×.Ñ.´·±×0RÑ0RÕSrd   r8   N)r^   ry   rz   r{   r°   rÍ  r~   r8   rd   rX   rÉ  rÉ  É  s   † ñõTrd   rÉ  c                  óà   • \ rS rSrSrSS jrS r\" \R                  S:¬  S5      S 5       r
S r\" \R                  S:¬  S5      S	 5       r\" \R                  S:¬  S5      S
 5       rSS jrSrg)ÚMaildirDirdbmDomainTestsiÖ  z#
Tests for L{MaildirDirdbmDomain}.
c                óæ   • U R                  5       U l        [        R                  R                  5       U l        [        R
                  R                  U R                  U R                  5      U l        g)z_
Create a temporary L{MaildirDirdbmDomain} and parent
L{MailService} before running each test.
N)r¶   ÚPr   r�   ÚSrß   ÚMaildirDirdbmDomainÚDrf   s    rX   r…   ÚMaildirDirdbmDomainTests.setUpÜ  sE   € ð
 —‘“ˆŒÜ—‘×&Ñ&Ó(ˆŒÜ—‘×1Ñ1°$·&±&¸$¿&¹&ÓAˆ�rd   c                óD   • [         R                  " U R                  5        g)zG
Remove the temporary C{maildir} directory when the test has
finished.
N)r   r¡  rÒ  rf   s    rX   r¢  Ú!MaildirDirdbmDomainTests.tearDownå  s   € ô
 	�Š�d—f‘fÕrd   r-   r/   c           	     ó¶  • SnU H   u  p#U R                   R                  X#5        M"     U H«  u  p#U R                  X R                   R                  ;   5        U R	                  U R                   R                  U   U5        U R                  [
        R                  R                  [
        R                  R                  U R                  U5      5      5        M­     g)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.
))Úuser1Úpwd1)Úuser2Úpwd2)Úuser3Úpwd3N)
rÕ  r”   rL   ÚdbmrA   rÉ   rÊ   rŠ   r©  rÒ  )rT   ÚtoAddrÄ  rÅ  s       rX   Ú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ò rd   c                óV  • U R                   R                  5       nU R                  [        U5      S5        U R	                  [
        R                  R                  R                  US   5      5        U R	                  [
        R                  R                  US   R                  ;   5        g)zv
L{MaildirDirdbmDomain.getCredentialsCheckers} initializes and
returns one L{ICredentialsChecker} checker by default.
ro   r   N)rÕ  ÚgetCredentialsCheckersrA   rB   rL   r   ÚcheckersÚICredentialsCheckerÚ
providedByÚcredentialsÚIUsernamePasswordÚcredentialInterfaces)rT   Úcredss     rX   Útest_credentialsÚ)MaildirDirdbmDomainTests.test_credentialsü  sy   € ð
 —‘×-Ñ-Ó/ˆà×Ñœ˜U› QÔ'Ø�‰œŸ™×9Ñ9×DÑDÀUÈ1ÁXÓNÔOØ�‰Ü×Ñ×.Ñ.°%¸±(×2OÑ2OÑOõ	
rd   c                óþ  •  " S S[         5      nU R                  R                  SS5        U R                  [        U R                  R
                  SSU5        U R                  R                  SS[        R                  5      nU R                  [        U5      S5        U R                  US   [        R                  L 5        U R                  [        R                  R                  US   5      5        US	   " 5         g)
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                  ó   • \ rS rSrSrg)Ú?MaildirDirdbmDomainTests.test_requestAvatar.<locals>.ISomethingi  r8   N)r^   ry   rz   r{   r~   r8   rd   rX   Ú
ISomethingrñ    s   † Úrd   rò  Úuserr“   Nr.   r   ro   r4   )r   rÕ  r”   rˆ   ÚNotImplementedErrorÚrequestAvatarr   ÚIMailboxrA   rB   rL   rè  )rT   rò  Úts      rX   Útest_requestAvatarÚ+MaildirDirdbmDomainTests.test_requestAvatar	  s¸   € ô	œô 	ð 	�‰�‰�v˜zÔ*Ø×ÑÜ §¡×!5Ñ!5°v¸tÀZô	
ð �F‰F× Ñ  ¨¬t¯}©}Ó=ˆØ×Ñœ˜Q› Ô#Ø�‰˜˜!™¤§¡Ð-Ô.Ø�‰œŸ™×0Ñ0°°1±Ó6Ô7à	ˆ!Š�rd   c                ó¢  • U R                   R                  SS5        U R                   R                  5       S   n[        R                  R                  SS5      nU R                  [        R                  R                  UR                  U5        [        R                  R                  SS5      nU R                  UR                  U5      S5        g)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“   r   zwrong passwordN)rÕ  r”   rå  r   ré  ÚUsernamePasswordrˆ   ÚerrorÚUnauthorizedLoginÚrequestAvatarIdrA   )rT   Údatabaserì  s      rX   Ú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¸&ÕArd   c                óJ  • U R                   R                  SS5        U R                  U R                   R                  S5      [        R
                  R                  U R                   R                  S5      5        SU R                   l        U R                  U R                   R                  S5      S5        SU R                   l        U R                  U R                   R                  S5      [        R
                  R                  U R                   R                  S5      5        g)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”   rA   ÚuserDirectoryrÉ   rÊ   r©  ÚrootÚ
postmasterÚassertIdenticalrf   s    rX   Ú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õ	
rd   )rÕ  rÒ  rÓ  Nrƒ  )r^   ry   rz   r{   r°   r…   r¢  r   r|   r}   râ  rí  rø  r   r	  r~   r8   rd   rX   rÐ  rÐ  Ö  s˜   † ñôBòñ ˆC×Ñ Ñ$Ð&>Ó?ñEó @ðEò
ñ ˆC×Ñ Ñ$Ð&>Ó?ñó @ðñ0 ˆC×Ñ Ñ$Ð&>Ó?ñBó @ðB÷ 
rd   rÐ  c                  óN   • \ rS rSrSrS
S jrS rS rS r        SS jr	S	r
g)ÚStubAliasableDomainiJ  z6
Minimal testable implementation of IAliasableDomain.
Nc                ó   • [        5       e©zc
No test coverage for invocations of this method on domain objects,
so we just won't implement it.
©rô  ©rT   ró  Úmemos      rX   rŠ   ÚStubAliasableDomain.existsP  ó   € ô
 "Ó#Ð#rd   c                ó   • [        5       er  r  )rT   ró  r“   s      rX   r”   ÚStubAliasableDomain.addUserW  r  rd   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.
r8   rf   s    rX   rå  Ú*StubAliasableDomain.getCredentialsCheckers^  s	   € ð ˆ	rd   c                ó   • Xl         g)z7
Just record the value so the test can check it later.
N©Ú
aliasGroup)rT   Úaliasess     rX   ÚsetAliasGroupÚ!StubAliasableDomain.setAliasGroupg  s	   € ð "�rd   c                ó   • [        5       e)z)
Stub domains cannot authenticate users.
r  )rT   ÚavatarIdÚmindr   s       rX   rõ  Ú!StubAliasableDomain.requestAvatarm  s   € ô "Ó#Ð#rd   r  rƒ   )r  zbytes | tuple[()]r   r  r   ztype[Interface]rZ  r   )r^   ry   rz   r{   r°   rŠ   r”   rå  r  rõ  r~   r8   rd   rX   r  r  J  s@   † ñô$ò$òò"ð$Ø)ð$Ø17ð$ØFUð$à	÷$rd   r  c                  ó®   • \ rS rSrS rS rS r\" \R                  S:¬  S5      S 5       r
\" \R                  S:¬  S5      S 5       rS	 rS
 rS rS rSrg)ÚServiceDomainTestsiv  c                ó  • [         R                   R                  5       U l        [         R                  R	                  U R                  S 5      U l        U R                  U R
                  l        SU R
                  l        SU R
                  l        U R                  5       U l
        [         R                  R                  U R                  U R                  5      nUR                  SS5        U R                  R                  SU5        g )NÚTESTÚhostnamer  r  útest.domain)r   r�   rÓ  rŸ   ÚDomainDeliveryBaserÕ  rª   ÚprotocolNameÚhostr¶   Útmpdirrß   rÔ  r”   rž   ©rT   ra   s     rX   r…   ÚServiceDomainTests.setUpx  s¥   € Ü—‘×&Ñ&Ó(ˆŒÜ—‘×2Ñ2°4·6±6¸4Ó@ˆŒØŸ™ˆ�‰ŒØ$ˆ�‰ÔØ ˆ�‰Œà—k‘k“mˆŒÜ—‘×1Ñ1°$·&±&¸$¿+¹+ÓFˆØ�‰�w Ô,Ø�‰×Ñ˜¨Õ/rd   c                óD   • [         R                  " U R                  5        g rƒ   ©r   r¡  r+  rf   s    rX   r¢  ÚServiceDomainTests.tearDown„  ó   € Ü�Š�d—k‘kÕ"rd   c                ó¼   • [        5       n[        5       nXR                  l        U R                  R	                  SU5        U R                  UR                  U5        g)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  )rT   r  ra   s      rX   ÚtestAddAliasableDomainÚ)ServiceDomainTests.testAddAliasableDomain‡  sF   € ô
 “(ˆÜ$Ó&ˆØ �‰ŒØ�‰×Ñ˜¨Ô/Ø×Ñ˜V×.Ñ.°Õ8rd   r-   r/   c                óh  • U R                   R                  S[        R                  " S5      S/5      n[        R
                  " U5      n[        R                  R                  5       nUR                  U5      nU R                  [        UR                  5       5      S5        U R                  SU5        g )N)Ú
remotehostz123.232.101.234z<someguy@someplace>zuser@host.namero   ÚReceived)rÕ  ÚreceivedHeaderr   ÚAddressÚioÚBytesIOÚemailÚparserÚParserÚparserA   rB   rI   r\   )rT   Úhdrr¾   ÚemailParserrV  s        rX   ÚtestReceivedHeaderÚ%ServiceDomainTests.testReceivedHeader’  s…   € à�f‰f×#Ñ#Ø-Ü�LŠLÐ.Ó/ØÐó
ˆô
 �ZŠZ˜‹_ˆÜ—l‘l×)Ñ)Ó+ˆØ×Ñ˜bÓ!ˆØ×Ñœ˜QŸW™W›Y›¨Ô+Ø�‰�j !Õ$rd   c                ó¼   • [         R                  " SSS S5      n[        R                  " U R                  R
                  U5      R                  U R                  5      $ )Nzuser@test.domainÚheloúwherever@whatever)r   ÚUserr   ÚmaybeDeferredrÕ  Ú
validateTorÂ   Ú_cbValidateTo©rT   ró  s     rX   ÚtestValidateToÚ!ServiceDomainTests.testValidateToŸ  sK   € ä�yŠyÐ+¨V°TÐ;NÓOˆÜ×"Ò" 4§6¡6×#4Ñ#4°dÓ;×GÑGØ×Ñó
ð 	
rd   c                ó8   • U R                  [        U5      5        g rƒ   )rL   ÚcallablerË   s     rX   rK  Ú ServiceDomainTests._cbValidateTo¦  s   € Ø�‰œ Ó(Õ)rd   c                óÆ   • [         R                  " SSS S5      nU R                  [        R                  " U R
                  R                  U5      [         R                  5      $ )Nzresu@test.domainrF  rG  ©r   rH  rg  r   rI  rÕ  rJ  r•   rL  s     rX   ÚtestValidateToBadUsernameÚ,ServiceDomainTests.testValidateToBadUsername©  óM   € Ü�yŠyÐ+¨V°TÐ;NÓOˆØ×!Ñ!Ü×Ò §¡× 1Ñ 1°4Ó8¼$×:JÑ:Jó
ð 	
rd   c                óÆ   • [         R                  " SSS S5      nU R                  [        R                  " U R
                  R                  U5      [         R                  5      $ )Nzuser@domain.testrF  rG  rS  rL  s     rX   ÚtestValidateToBadDomainÚ*ServiceDomainTests.testValidateToBadDomain¯  rV  rd   c                ó  • Sn[         R                  " S5      nU R                  U R                  R	                  X5      UL 5        Sn[         R                  " S5      nU R                  U R                  R	                  X5      UL 5        Sn[         R                  " S5      nU R                  U R                  R	                  X5      UL 5        U R                  [         R                  U R                  R                  S U5        g )N)r&  r÷   z<user@hostname>)r&  ú1.2.3.4z<>)r   r:  rL   rÕ  ÚvalidateFromrˆ   ÚSMTPBadSender)rT   rF  Úorigins      rX   Ú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ÈÕPrd   )rÕ  rÓ  r+  N)r^   ry   rz   r{   r…   r¢  r4  r   r|   r}   rC  rM  rK  rT  rX  r_  r~   r8   rd   rX   r#  r#  v  sv   † ò
0ò#ò	9ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
%ó @ð
%ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ò*ò
ò
õQrd   r#  c                  óö   • \ rS rSrSS jrS r\" \R                  S:¬  S5      S 5       r	S r
\" \R                  S:¬  S5      S 5       r\" \R                  S:¬  S5      S	 5       rSS
 jrS rSS jrSS jrSrg)ÚVirtualPOP3TestsiÅ  c                óT  • U R                  5       U l        [        R                  R                  5       U l        [        R
                  R                  U R                  U R                  5      U l        U R                  R                  SS5        U R                  R                  SU R                  5        U R                  R                  SU R                  5        [        R                  R                  5       U l        U R                  U R                  l        SU R                  l        g )Nr  r  s   test.domainrd   s   <unit test magic>)r¶   r+  r   r�   rÓ  rß   rÔ  rÕ  r”   rž   rŸ   ÚVirtualPOP3rÒ  rª   Úmagicrf   s    rX   r…   ÚVirtualPOP3Tests.setUpÇ  s³   € Ø—k‘k“mˆŒÜ—‘×&Ñ&Ó(ˆŒÜ—‘×1Ñ1°$·&±&¸$¿+¹+ÓFˆŒØ�‰�‰�w Ô,Ø�‰×Ñ˜¨¯©Ô0Ø�‰×Ñ˜˜dŸf™fÔ%Ü—‘×+Ñ+Ó-ˆŒØŸ™ˆ�‰ŒØ+ˆ�‰�rd   c                óD   • [         R                  " U R                  5        g rƒ   r/  rf   s    rX   r¢  ÚVirtualPOP3Tests.tearDownÒ  r1  rd   r-   r/   c                óÌ   • [        U R                  R                  S-   5      R                  5       nU R                  R	                  SU5      R                  U R                  5      $ )Nr“   ró  )r   rÒ  re  Ú	hexdigestÚauthenticateUserAPOPrÂ   Ú_cbAuthenticateAPOP©rT   Úresps     rX   ÚtestAuthenticateAPOPÚ%VirtualPOP3Tests.testAuthenticateAPOPÕ  sO   € ä�4—6‘6—<‘< *Ñ,Ó-×7Ñ7Ó9ˆØ�v‰v×*Ñ*¨6°4Ó8×DÑDØ×$Ñ$ó
ð 	
rd   c                óö   • U R                  [        U5      S5        U R                  US   [        R                  5        U R	                  [        R                  R                  US   5      5        US   " 5         g ©Nr.   r   ro   r4   ©rA   rB   r   rö  rL   rè  rË   s     rX   rl  Ú$VirtualPOP3Tests._cbAuthenticateAPOPÜ  óV   € Ø×Ñœ˜V› aÔ(Ø×Ñ˜ ™¤D§M¡MÔ2Ø�‰œŸ™×0Ñ0°¸±Ó;Ô<ØˆqŠ	�rd   c                óê   • [        U R                  R                  S-   5      R                  5       nU R	                  U R                  R                  SU5      [        R                  R                  5      $ )Nr“   Úresu)	r   rÒ  re  rj  rg  rk  r   rü  rý  rm  s     rX   Ú!testAuthenticateIncorrectUserAPOPÚ2VirtualPOP3Tests.testAuthenticateIncorrectUserAPOPâ  sU   € ä�4—6‘6—<‘< *Ñ,Ó-×7Ñ7Ó9ˆØ×!Ñ!Ø�F‰F×'Ñ'¨°Ó5´t·z±z×7SÑ7Só
ð 	
rd   c                ó¼   • [        S5      R                  5       nU R                  U R                  R	                  SU5      [
        R                  R                  5      $ )Nzwrong digestró  )r   rj  rg  rÒ  rk  r   rü  rý  rm  s     rX   Ú%testAuthenticateIncorrectResponseAPOPÚ6VirtualPOP3Tests.testAuthenticateIncorrectResponseAPOPé  sH   € ä�>Ó"×,Ñ,Ó.ˆØ×!Ñ!Ø�F‰F×'Ñ'¨°Ó5´t·z±z×7SÑ7Só
ð 	
rd   c                ól   • U R                   R                  SS5      R                  U R                  5      $ )Nr  r  )rÒ  ÚauthenticateUserPASSrÂ   Ú_cbAuthenticatePASSrf   s    rX   ÚtestAuthenticatePASSÚ%VirtualPOP3Tests.testAuthenticatePASSð  s/   € Ø�v‰v×*Ñ*¨7°KÓ@×LÑLØ×$Ñ$ó
ð 	
rd   c                óö   • U R                  [        U5      S5        U R                  US   [        R                  5        U R	                  [        R                  R                  US   5      5        US   " 5         g rr  rs  rË   s     rX   r  Ú$VirtualPOP3Tests._cbAuthenticatePASSõ  ru  rd   c                óŠ   • U R                  U R                  R                  SS5      [        R                  R
                  5      $ )Ns   resur  ©rg  rÒ  r~  r   rü  rý  rf   s    rX   ÚtestAuthenticateBadUserPASSÚ,VirtualPOP3Tests.testAuthenticateBadUserPASSû  s6   € Ø×!Ñ!Ø�F‰F×'Ñ'¨°Ó=Ü�J‰J×(Ñ(ó
ð 	
rd   c                óŠ   • U R                  U R                  R                  SS5      [        R                  R
                  5      $ )Nr  s   wrong passwordr…  rf   s    rX   ÚtestAuthenticateBadPasswordPASSÚ0VirtualPOP3Tests.testAuthenticateBadPasswordPASS  s7   € Ø×!Ñ!Ø�F‰F×'Ñ'¨Ð1BÓCÜ�J‰J×(Ñ(ó
ð 	
rd   )rÕ  rÒ  rÓ  r+  Nrƒ  )rZ  zDeferred[object]r‹  )r^   ry   rz   r{   r…   r¢  r   r|   r}   ro  rl  rx  r{  r€  r  r†  r‰  r~   r8   rd   rX   rb  rb  Å  s�   † ô	,ò#ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
òñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ñ ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ô
ò
ô
÷
rd   rb  c                  ó   • \ rS rSrS rSrg)Úemptyi  c                ó   • g rƒ   r8   rf   s    rX   Ú__init__Úempty.__init__	  s   € Ørd   r8   N)r^   ry   rz   r{   rŽ  r~   r8   rd   rX   rŒ  rŒ    s   † õrd   rŒ  c                  óL   • \ rS rSr\" \R                  S:¬  S5      S 5       rSrg)Ú
RelayTestsi  r-   r/   c                ó„  ^• [         R                   R                  5       n[         R                  R                  U5      n[        R
                  " S5      [        R                  " SSS5      /n[        R                  " SSS5      [        R                  " SSS5      /nU H‹  m[        5       nS	Ul        S
Ul	        [        5       Ul
        [        5       UR                  l        U4S jUR                  R                  l        U R                  [        UR                  U5      5      5        M�     U H�  m[        5       nSUl        [        5       Ul
        [        5       UR                  l        U4S jUR                  R                  l        SUl	        U R!                  ["        R$                  UR                  U5        M�     g )Nz/var/run/mail-relayÚTCPr÷   rø   z192.168.2.1é>   r[  i—  z	user@hostz	tsoh@resuc                 ó   >• T $ rƒ   r8   ©Úpeers   €rX   Ú<lambda>Ú'RelayTests.testExists.<locals>.<lambda>$  ó   ø€ ±drd   z
some@placec                 ó   >• T $ rƒ   r8   r–  s   €rX   r˜  r™  -  rš  rd   z	who@cares)r   r�   ÚrelayÚDomainQueuerr   ÚUNIXAddressÚIPv4AddressrŒ  ÚorigÚdestr   r­   ÚgetPeerrL   rP  rŠ   rˆ   r   r•   )rT   rª   ra   ÚdoRelayÚ	dontRelayró  r—  s         @rX   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ò rd   r8   N)	r^   ry   rz   r{   r   r|   r}   r‹   r~   r8   rd   rX   r‘  r‘    s*   † áˆC×Ñ Ñ$Ð&>Ó?ñ Eó @ó Erd   r‘  c                  ó2   • \ rS rSrS rS rS rS rS rSr	g)	ÚRelayerTestsi3  c                óº  • U R                  5       U l        [        R                  " U R                  5        / U l        [        S5       H·  n[        R                  R                  U R                  SU4-  5      n[        US-   S5       n[        R                  " SU4-  SU4-  /U5        S S S 5        [        US-   S5      nUR                  U5        UR                  S	S	5        U R                  R                  U5        M¹     [        R                  R!                  5       U l        U R"                  R%                  U R                  5        g ! , (       d  f       N¨= f)
Nr1   úbody-%dú-Hrµ   úfrom-%dúto-%dú-Dr»  r   )r¶   r+  rÉ   ÚmkdirÚmessageFilesr?   rÊ   r©  r¹   ÚpickleÚdumprB  r–  rT  r   rœ  ÚRelayerMixinÚRÚloadMessages)rT   rv  r·   rº   s       rX   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Å
E	c                óD   • [         R                  " U R                  5        g rƒ   r/  rf   s    rX   r¢  ÚRelayerTests.tearDownF  r1  rd   c                ó  • [        S5       HP  nU R                  U R                  R                  5       SU4-  5        U R                  R	                  SS S S S 5        MR     U R                  U R                  R                  5       S 5        g )Nr1   r«  éú   )r?   rA   r³  ÚgetMailFromÚsentMail©rT   rv  s     rX   ÚtestMailFromÚRelayerTests.testMailFromI  sk   € Ü�r–ˆAØ×Ñ˜TŸV™V×/Ñ/Ó1°9À¸tÑ3CÔDØ�F‰F�O‰O˜C  t¨T°4Ö8ñ ð 	×Ñ˜Ÿ™×+Ñ+Ó-¨tÕ4rd   c                ó  • [        S5       HQ  nU R                  U R                  R                  5       SU4-  /5        U R                  R	                  SS S S S 5        MS     U R                  U R                  R                  5       S 5        g )Nr1   r¬  r¹  )r?   rA   r³  Ú	getMailTor»  r¼  s     rX   Ú
testMailToÚRelayerTests.testMailToO  sm   € Ü�r–ˆAØ×Ñ˜TŸV™V×-Ñ-Ó/°'¸Q¸D±.Ð1AÔBØ�F‰F�O‰O˜C  t¨T°4Ö8ñ ð 	×Ñ˜Ÿ™×)Ñ)Ó+¨TÕ2rd   c                ó†  • [        S5       Hˆ  n[        R                  R                  U R                  SU4-  5      nU R                  U R                  R                  5       R                  5       U5        U R                  R                  SS S S S 5        MŠ     U R                  U R                  R                  5       S 5        g )Nr1   r©  r¹  )
r?   rÉ   rÊ   r©  r+  rA   r³  ÚgetMailDatarÒ   r»  )rT   rv  r·   s      rX   Ú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Õ4rd   )r³  r¯  r+  N)
r^   ry   rz   r{   r…   r¢  r½  rÁ  rÅ  r~   r8   rd   rX   r§  r§  3  s   † ò/ò"#ò5ò3õ5rd   r§  c                  ó,   • \ rS rSrS rS rS rS rSrg)ÚManageri]  c                ó.   • / U l         / U l        / U l        g rƒ   )Úsuccessr$   Údonerf   s    rX   rŽ  ÚManager.__init__^  s   € ØˆŒØˆŒØˆ�	rd   c                ó<   • U R                   R                  X45        g rƒ   )rÊ  rT  ©rT   r«   rq   s      rX   ÚnotifySuccessÚManager.notifySuccessc  ó   € Ø�‰×Ñ˜WÐ.Õ/rd   c                ó<   • U R                   R                  X45        g rƒ   )r$   rT  rÎ  s      rX   ÚnotifyFailureÚManager.notifyFailuref  rÑ  rd   c                ó:   • U R                   R                  U5        g rƒ   )rË  rT  )rT   r«   s     rX   Ú
notifyDoneÚManager.notifyDonei  s   € Ø�	‰	×Ñ˜Õ!rd   )rË  r$   rÊ  N)	r^   ry   rz   r{   rŽ  rÏ  rÓ  rÖ  r~   r8   rd   rX   rÈ  rÈ  ]  s   † òò
0ò0õ"rd   rÈ  c                  ó,   • \ rS rSrS rS rS rS rSrg)ÚManagedRelayerTestsim  c                ó€  • [        5       U l        [        [        SSS5      5      U l        [        5       U l        [        R                  R                  U R                  5      U l
        U R                  S S  U R                  l        U R                  S S  U R                  l        U R                  U R                  l        g )Nr   r3   r4   )rÈ  ÚmanagerrC   r?   rX  r  r«   r   ÚrelaymanagerÚManagedRelayerMixinrœ  Únamesrf   s    rX   r…   ÚManagedRelayerTests.setUpo  s~   € Ü“yˆŒÜœU 1 b¨!›_Ó-ˆŒÜ“xˆŒÜ×&Ñ&×:Ñ:¸4¿<¹<ÓHˆŒ
Ø"Ÿm™m©AÐ.ˆ�
‰
ÔØŸ=™=©Ð+ˆ�
‰
ÔØ!Ÿ\™\ˆ�
‰
Õrd   c                ó
  • U R                    H"  nU R                  R                  SS S S S 5        M$     U R                  U R                  R
                  U R                    Vs/ s H  o R                  U4PM     sn5        g s  snf )Nr¹  )rX  rœ  r»  rA   rÛ  rÊ  r«   ©rT   rv  rV  s      rX   Ú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                ó
  • U R                    H"  nU R                  R                  SS S S S 5        M$     U R                  U R                  R
                  U R                    Vs/ s H  o R                  U4PM     sn5        g s  snf )Ni&  )rX  rœ  r»  rA   rÛ  r$   r«   rá  s      rX   ÚtestFailedSentMailÚ&ManagedRelayerTests.testFailedSentMail€  rä  rå  c                óÔ   • U R                   R                  [        R                  " [	        5       5      5        U R                  U R                  R                  U R                  /5        g rƒ   )	rœ  r§   r$   ÚFailurerh  rA   rÛ  rË  r«   rf   s    rX   ÚtestConnectionLostÚ&ManagedRelayerTests.testConnectionLostˆ  s?   € Ø�
‰
×!Ñ!¤'§/¢/´)³+Ó">Ô?Ø×Ñ˜Ÿ™×*Ñ*¨T¯\©\¨NÕ;rd   )r«   rÛ  rX  rœ  N)	r^   ry   rz   r{   r…   râ  rç  rë  r~   r8   rd   rX   rÙ  rÙ  m  s   † ò*ò
ò
õ<rd   rÙ  c                  óÎ   • \ rS rSrS rS r\" \R                  S:¬  S5      S 5       r	\" \R                  S:¬  S5      S 5       r
\" \R                  S:¬  S5      S 5       rS	 rS
rg)ÚDirectoryQueueTestsi�  c                ó0  • U R                  5       U l        [        R                  " U R                  5        [        R
                  R                  U R                  5      U l        SU R                  l        [        S5       Hh  nU R                  R                  5       u  p#U   [        R                  " SU/U5        S S S 5        UR                  SU4-  5        UR                  5         Mj     U R                  R                  5         g ! , (       d  f       NR= f)NFé   Úheaders   body: %d)r¶   r+  rÉ   r®  r   rÜ  ÚQueueÚqueueÚnoisyr?   ÚcreateNewMessager°  r±  r¥   rÁ   ÚreadDirectory)rT   rV  ÚhdrFÚmsgFs       rX   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                óD   • [         R                  " U R                  5        g rƒ   r/  rf   s    rX   r¢  ÚDirectoryQueueTests.tearDown�  r1  rd   r-   r/   c                ó4  • U R                  U R                  R                  5       5        U R                  [	        U R                  R                  5       5      S5        U R                  R                  5       nU R                  R                  US   5        U R                  [	        U R                  R                  5       5      S5        U R                  R                  US   5        U R                  [	        U R                  R                  5       5      S5        g )Nrð  r   é   )rL   ró  Ú
hasWaitingrA   rB   Ú
getWaitingÚsetRelayingÚ
setWaiting)rT   Úwaitings     rX   Ú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Õ:rd   c           	     ó¸  • U R                   R                  5        Hu  nU R                   R                  U5        U R                  [	        U R                   R                  5       5      S[	        U R                   R                  5       5      -
  5        Mw     U R                  U R                   R                  5       5        U R                   R                  5       nU R                   R                  US   5        U R                  [	        U R                   R                  5       5      S5        U R                  [	        U R                   R                  5       5      S5        g )Nrð  r   ro   rý  )	ró  rÿ  r   rA   rB   Ú
getRelayedrÈ   rþ  r  )rT   rV  Úrelayeds      rX   Ú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Õ:rd   c                ó"  • U R                   R                  5       S   nU R                   R                  U5        U R                   R                  U5        U R	                  [        U R                   R                  5       5      S5        U R	                  [        U R                   R                  5       5      S5        U R                  XR                   R                  5       ;   5        U R                  XR                   R                  5       ;   5        g )Nr   rý  )ró  rÿ  r   rË  rA   rB   r  rÈ   )rT   Úmsgs     rX   Ú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Õ8rd   c                ó(  • / nU R                   R                  5        H-  nUR                  U R                   R                  U5      5        M/     UR	                  5         [        S5       H&  nU R                  UR                  S5      SU/5        M(     g )Nrð  r   rñ  )ró  rÿ  rT  ÚgetEnveloperG   r?   rA   Úpop)rT   Ú	envelopesr  rv  s       rX   ÚtestEnvelopeÚ DirectoryQueueTests.testEnvelopeÇ  sr   € Øˆ	à—:‘:×(Ñ(Ö*ˆCØ×Ñ˜TŸZ™Z×3Ñ3°CÓ8Ö9ñ +ð 	�‰ÔÜ�r–ˆAØ×Ñ˜YŸ]™]¨1Ó-°¸!¨}Ö=ò rd   )ró  r+  N)r^   ry   rz   r{   r…   r¢  r   r|   r}   r  r  r  r  r~   r8   rd   rX   rî  rî  �  s‰   † ò#ò#ñ ˆC×Ñ Ñ$Ð&>Ó?ñ	;ó @ð	;ñ ˆC×Ñ Ñ$Ð&>Ó?ñ;ó @ð;ñ ˆC×Ñ Ñ$Ð&>Ó?ñ	9ó @ð	9õ>rd   rî  )ÚclientÚcommonÚserverc                  ó$   • \ rS rSrS rSS jrSrg)ÚTestAuthorityiÕ  c                óP   • [         R                  R                  U 5        0 U l        g rƒ   )r  ÚResolverBaserŽ  Ú	addressesrf   s    rX   rŽ  ÚTestAuthority.__init__Ö  s   € Ü×Ñ×$Ñ$ TÔ*Øˆ�rd   Nc                óÞ  • XR                   ;   a¡  U[        R                  :X  a�  / nU R                   U    H_  n[        R                  " U[        R                  [        R                  S[        R
                  " SU5      5      nUR                  U5        Ma     [        R                  " U/ / 45      $ [        R                  " [        R                  " [        R                  " U5      5      5      $ )Né<   r   )r  r   ÚMXr"   ÚINr!   rT  r   ÚsucceedÚfailr$   rê  ÚDomainError)rT   r·   ÚclsÚtypeÚtimeoutrU  r:   rA  s           rX   Ú_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ÐArd   )r  rƒ   )r^   ry   rz   r{   rŽ  r'  r~   r8   rd   rX   r  r  Õ  s   † ò÷Brd   r  c                óØ  • [        5       U l        [        R                  " U R                  /5      n[        R
                  " U5      n [        R                  " SUSS9U l        U R                  R                  5       R                  n [        R                  " X2SS9U l         [        R                  " SU4/S9U l        g ! [         a    U R                  R                  5          Of = fM¤  )Nr   r÷   ©Ú	interface)Úservers)r  Úauthr  ÚDNSServerFactoryr   ÚDNSDatagramProtocolr   Ú	listenTCPÚportÚgetHostÚ	listenUDPÚudpPortr   ÚstopListeningr  ÚResolverÚresolver)rT   r«   r   Ú
portNumbers       rX   ÚsetUpDNSr9  ä  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  Ã $C'Ã&C'c                ó€  • / nUR                  [        R                  " U R                  R                  5      5        UR                  [        R                  " U R
                  R                  5      5         U R                  R                  R                  5         [        R                  " U5      $ ! [         a     N"f = frƒ   )rT  r   rI  r1  r5  r4  r7  Ú
_parseCallÚcancelÚBaseExceptionÚDeferredList)rT   Údls     rX   ÚtearDownDNSr@  ÷  s‹   € Ø	€BØ‡I�IŒe×!Ò! $§)¡)×"9Ñ"9Ó:Ô;Ø‡I�IŒe×!Ò! $§,¡,×"<Ñ"<Ó=Ô>ðØ�‰× Ñ ×'Ñ'Ô)ô ×Ò˜bÓ!Ð!øô ó Ùðús   Á6$B0 Â0
B=Â<B=c                  ó  • \ rS rSrSrS rS rS r\" \	R                  S:¬  S5      S 5       rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS r\" \	R                  S:¬  S5      S 5       rS rS rS rS rSr g)ÚMXTestsi  z.
Tests for L{mail.relaymanager.MXCalculator}.
c                óÀ   • [        U 5        [        R                  " 5       U l        [        R
                  R                  U R                  U R                  5      U l        g rƒ   )	r9  r   r¯  r³  r   rÜ  ÚMXCalculatorr7  Úmxrf   s    rX   r…   ÚMXTests.setUp  s8   € Ü�ŒÜ—Z’Z“\ˆŒ
Ü×#Ñ#×0Ñ0°·±ÀÇ
Á
ÓKˆ�rd   c                ó   • [        U 5      $ rƒ   )r@  rf   s    rX   r¢  ÚMXTests.tearDown  s   € Ü˜4Ó Ð rd   c                ó’   • U R                  [        R                  R                  U R                  5      R
                  [        5        g)zA
L{MXCalculator}'s default clock is C{twisted.internet.reactor}.
N)r  r   rÜ  rD  r7  r³  r   rf   s    rX   Útest_defaultClockÚMXTests.test_defaultClock  s2   € ð 	×ÑÜ×Ñ×*Ñ*¨4¯=©=Ó9×?Ñ?Äõ	
rd   r-   r/   c                óž   • S/U R                   R                  S'   U R                  R                  S5      R	                  U R
                  5      $ )Núthe.email.test.domainr'  )r-  r  rE  ÚgetMXrÂ   Ú_cbSimpleSuccessrf   s    rX   ÚtestSimpleSuccessÚMXTests.testSimpleSuccess  s=   € à.EÐ-Fˆ�	‰	×Ñ˜MÑ*Ø�w‰w�}‰}˜]Ó+×7Ñ7¸×8MÑ8MÓNÐNrd   c                ó†   • U R                  UR                  S5        U R                  [        UR                  5      S5        g )Nr   rM  )rA   Ú
preferencer_   r·   ©rT   rE  s     rX   rO  ÚMXTests._cbSimpleSuccess  s/   € Ø×Ñ˜Ÿ™¨Ô*Ø×Ñœ˜RŸW™W›Ð'>Õ?rd   c                ó‚   • SU R                   l        U R                  U R                   R                  S5      [        5      $ )NFr'  )rE  ÚfallbackToDomainrg  rN  ÚIOErrorrf   s    rX   ÚtestSimpleFailureÚMXTests.testSimpleFailure!  s.   € Ø#(ˆ�‰Ô Ø×!Ñ! $§'¡'§-¡-°Ó">ÄÓHÐHrd   c                ó`   • U R                  U R                  R                  S5      [        5      $ ©Nr'  )rg  rE  rN  r   rf   s    rX   ÚtestSimpleFailureWithFallbackÚ%MXTests.testSimpleFailureWithFallback%  s"   € Ø×!Ñ! $§'¡'§-¡-°Ó">ÄÓOÐOrd   c                ó¼   ^ ^^^•  " UU4S jS5      nU" 5       T R                   l        T R                   R                  T5      nUU 4S jnUR                  U5        U$ )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                  ó$   >• \ rS rSrU U4S jrSrg)Ú,MXTests._exchangeTest.<locals>.DummyResolveri4  c                ó€   >• UT:X  a  [         R                  " T/ / 45      $ [         R                  " [        T5      5      $ rƒ   )r   r!  r"  r#   )rT   r·   ra   Úrecordss     €€rX   ÚlookupMailExchangeÚ?MXTests._exchangeTest.<locals>.DummyResolver.lookupMailExchange5  s4   ø€ Ø˜6“>Ü Ÿ=š=¨'°2°rÐ):Ó;Ð;Ü—z’z¤,¨vÓ"6Ó7Ð7rd   r8   N©r^   ry   rz   r{   rd  r~   )ra   rc  s   €€rX   ÚDummyResolverra  4  s   ø† ÷8ñ 8rd   rg  c                óP   >• TR                  [        U R                  5      T5        g rƒ   ©rA   r_   r·   )ÚrecordÚcorrectMailExchangerT   s    €€rX   ÚgotMailExchangeÚ.MXTests._exchangeTest.<locals>.gotMailExchange=  s   ø€ Ø×ÑœS §¡Ó-Ð/BÕCrd   )rE  r7  rN  rÂ   )rT   ra   rc  rk  rg  rV   rl  s   ````   rX   Ú_exchangeTestÚMXTests._exchangeTest(  sH   û€ ÷	8õ 	8ñ )›?ˆ�‰ÔØ�G‰G�M‰M˜&Ó!ˆö	Dð 	
�‰�oÔ&Øˆrd   c           
     ó  • SnSnSn[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9/nU R                  XU5      $ )zP
The MX record with the lowest preference is returned by
L{MXCalculator.getMX}.
r3  úgood.example.comúbad.example.comro   ©r·   r%  Úpayloadr   r4   )r"   r!   ÚTYPErn  ©rT   ra   ÚgoodÚbadrc  s        rX   Útest_mailExchangePreferenceÚ#MXTests.test_mailExchangePreferenceC  sv   € ð
 ˆØ!ˆØˆô ˜&¤y§~¡~¼yÈÈCÓ?PÑQÜ˜&¤y§~¡~¼yÈÈDÓ?QÑRÜ˜&¤y§~¡~¼yÈÈCÓ?PÑQð
ˆð
 ×!Ñ! &°4Ó8Ð8rd   c           	     óô   • SnSnSn[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9/nU R                  R	                  U5        U R                  XU5      $ )zi
L{MXCalculator.getMX} returns the MX record with the lowest preference
which is not also marked as bad.
r3  rq  rr  r   rs  ro   ©r"   r!   ru  rE  ÚmarkBadrn  rv  s        rX   Útest_badExchangeExcludedÚ MXTests.test_badExchangeExcludedS  so   € ð
 ˆØ!ˆØˆô ˜&¤y§~¡~¼yÈÈCÓ?PÑQÜ˜&¤y§~¡~¼yÈÈDÓ?QÑRð
ˆð 	�‰�‰˜ÔØ×!Ñ! &°4Ó8Ð8rd   c           	     ó*  • SnSnSn[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9/nU R                  R	                  U5        U R                  R	                  U5        U R                  XU5      $ )z„
L{MXCalculator.getMX} returns the MX record with the lowest preference
if all the MX records in the response have been marked bad.
r3  rr  zworse.example.comr   rs  ro   r|  )rT   ra   rx  Úworserc  s        rX   Útest_fallbackForAllBadExchangesÚ'MXTests.test_fallbackForAllBadExchangesc  s   € ð
 ˆØˆØ#ˆô ˜&¤y§~¡~¼yÈÈCÓ?PÑQÜ˜&¤y§~¡~¼yÈÈEÓ?RÑSð
ˆð 	�‰�‰˜ÔØ�‰�‰˜ÔØ×!Ñ! &°3Ó7Ð7rd   c           	     óR  • SnSnSn[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9/nU R                  R	                  U5        U R
                  R                  U R                  R                  5        U R                  XU5      $ )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.
r3  rq  rr  r   rs  ro   )	r"   r!   ru  rE  r}  r³  r°  ÚtimeOutBadMXrn  ©rT   ra   rw  ÚpreviouslyBadrc  s        rX   Útest_badExchangeExpiresÚMXTests.test_badExchangeExpirest  s�   € ð ˆØ!ˆØ)ˆô Ø¤)§.¡.¼)ÀAÀ}Ó:Uñô ˜&¤y§~¡~¼yÈÈDÓ?QÑRð	
ˆð 	�‰�‰˜Ô&Ø�
‰
×Ñ˜4Ÿ7™7×/Ñ/Ô0Ø×!Ñ! &°=ÓAÐArd   c           	     óˆ  • SnSnSn[        U[        R                  [        SU5      S9[        U[        R                  [        SU5      S9/nU R                  R	                  U5        U R                  R                  U5        U R                  R                  U R                  R                  5        U R                  XU5      $ )zw
L{MXCalculator.getMX} returns the MX record with the lowest preference
if it was marked good after it was marked bad.
r3  rq  rr  r   rs  ro   )
r"   r!   ru  rE  r}  ÚmarkGoodr³  r°  r…  rn  r†  s        rX   Útest_goodExchangeUsedÚMXTests.test_goodExchangeUsedˆ  s¢   € ð
 ˆØ!ˆØ)ˆô Ø¤)§.¡.¼)ÀAÀ}Ó:Uñô ˜&¤y§~¡~¼yÈÈDÓ?QÑRð	
ˆð 	�‰�‰˜Ô&Ø�‰×Ñ˜Ô'Ø�
‰
×Ñ˜4Ÿ7™7×/Ñ/Ô0Ø×!Ñ! &°=ÓAÐArd   c                óÖ   ^^• SmSm " UU4S jS5      nU" 5       U R                   l        U R                   R                  T5      nUR                  U R                  [        TS95        U$ )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.
r[  zexample.orgc                  óB   >• \ rS rSrSr Y / / / 40r Y  Y0rS rS rSr	g)Ú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                óH   • [         R                  " U R                  U   5      $ rƒ   )r   r!  rE  r,  s     rX   rd  ÚLMXTests.test_successWithoutResults.<locals>.DummyResolver.lookupMailExchangeµ  s   € Ü—}’} T§W¡W¨V¡_Ó5Ð5rd   c                óH   • [         R                  " U R                  U   5      $ rƒ   )r   r!  r:   r,  s     rX   ÚgetHostByNameÚGMXTests.test_successWithoutResults.<locals>.DummyResolver.getHostByName¸  s   € Ü—}’} T§V¡V¨F¡^Ó4Ð4rd   r8   N)
r^   ry   rz   r{   r°   rE  r:   rd  r”  r~   )ra   Úips   €€rX   rg  r�  ¦  s-   ø† ñ	ñ ˜2˜r 2˜,Ð'ˆBÙ™�ˆAò6õ5rd   rg  ©r·   ©rE  r7  rN  rÂ   rA   r!   )rT   rg  rV   ra   r–  s      @@rX   Útest_successWithoutResultsÚ"MXTests.test_successWithoutResultsœ  sY   ù€ ð ˆØˆ÷	5õ 	5ñ* )›?ˆ�‰ÔØ�G‰G�M‰M˜&Ó!ˆØ	�‰�d×&Ñ&¬	°rÑ(:Ô;Øˆrd   c                óÂ   •  " S S5      nU" 5       U R                   l        U R                   R                  S5      nUR                  U R                  [        SS95        U$ )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                  ó$   • \ rS rSrSrS rS rSrg)ÚAMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolveriÈ  zS
Fake resolver which will fail an MX lookup but then succeed a
getHostByName call.
c                ó>   • [         R                  " [        5       5      $ rƒ   )r   r"  r#   r,  s     rX   rd  ÚTMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.lookupMailExchangeÎ  s   € Ü—z’z¤,£.Ó1Ð1rd   c                ó.   • [         R                  " S5      $ )Nr[  )r   r!  r,  s     rX   r”  ÚOMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.getHostByNameÑ  s   € Ü—}’} YÓ/Ð/rd   r8   N)r^   ry   rz   r{   r°   rd  r”  r~   r8   rd   rX   rg  r�  È  s   † ñò
2õ0rd   rg  ra   r[  r—  r˜  )rT   rg  rV   s      rX   Ú"test_failureWithSuccessfulFallbackÚ*MXTests.test_failureWithSuccessfulFallbackÀ  sL   € ÷
	0ñ 
	0ñ )›?ˆ�‰ÔØ�G‰G�M‰M˜(Ó#ˆØ	�‰�d×&Ñ&¬	°yÑ(AÔBØˆrd   c                óÞ   ^^^• SmSmSm " UUU4S jS5      nU" 5       U R                   l        U R                   R                  T5      nUR                  U R                  [        TS95        U$ )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                  ó*   >• \ rS rSrSrU UU4S jrSrg)Ú;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           
     óD  >• UT:X  a:  [         R                  " [        U[        R                  [        T5      S9// / 45      $ UT:X  a;  [         R                  " [        U[
        R                  [        ST5      S9// / 45      $ [         R                  " [        U5      5      $ )Nrs  r   )r   r!  r"   r    ru  r!   r"  r#   )rT   ra   ÚaliasÚ	canonicalÚexchanges     €€€rX   rd  ÚNMXTests.test_cnameWithoutGlueRecords.<locals>.DummyResolver.lookupMailExchangeé  s¬   ø€ Ø˜U“?Ü Ÿ=š=ô !)Ø)/Ü)5×):Ñ):Ü,8¸Ó,Cñ!"ðð Øð
óð ð ˜yÓ(Ü Ÿ=š=ô !)Ø)/Ü)2¯©Ü,5°a¸Ó,Bñ!"ðð Øð
óð ô !Ÿ:š:¤l°6Ó&:Ó;Ð;rd   r8   N)r^   ry   rz   r{   r°   rd  r~   )r«  r¬  r­  s   €€€rX   rg  r©  ã  s   ø† ñ÷
<ò <rd   rg  r—  r˜  )rT   rg  rV   r«  r¬  r­  s      @@@rX   Útest_cnameWithoutGlueRecordsÚ$MXTests.test_cnameWithoutGlueRecordsÙ  s_   ú€ ð $ˆØ+ˆ	Ø%ˆ÷$	<ö $	<ñL )›?ˆ�‰ÔØ�G‰G�M‰M˜%Ó ˆØ	�‰�d×&Ñ&¬	°xÑ(@ÔAØˆrd   c                ó  ^ ^•  " S S5      nSmU" 5       T R                   l        T R                   R                  ST5      nT R                  U[        R
                  R                  R                  5        UU 4S jnUR                  U5        U$ )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                  ó"   • \ rS rSrSrSrS rSrg)Ú.MXTests.test_cnameChain.<locals>.DummyResolveri  z[
Fake resolver which generates a CNAME chain of infinite length in
response to MX lookups.
r   c           	     óÀ   • U =R                   S-  sl         SU R                   4-  n[        R                  " [        U[        R
                  [	        U5      S9// / 45      $ )Nro   úx-%d.example.comrs  )ÚchainCounterr   r!  r"   r    ru  )rT   ra   r·   s      rX   rd  ÚAMXTests.test_cnameChain.<locals>.DummyResolver.lookupMailExchange  sg   € Ø×!Ò! QÑ&Õ!Ø)¨T×->Ñ->Ð,@Ñ@�Ü—}’}ô %Ø%+Ü%1×%6Ñ%6Ü(4°TÓ(:ñðð Øð
óð rd   r8   N)r^   ry   rz   r{   r°   r¶  rd  r~   r8   rd   rX   rg  r³    s   † ñð
 ˆLõrd   rg  r.   r§  c                óÊ   >• TR                  U R                  S   [        STS-   4-  5      5        TR                  TR                  R                  R
                  TS-   5        g )Nr   rµ  ro   )rA   Úargsr    rE  r7  r¶  )rü  Ú
cnameLimitrT   s    €€rX   ÚcbChainTooLongÚ/MXTests.test_cnameChain.<locals>.cbChainTooLong3  sV   ø€ Ø×ÑØ—
‘
˜1‘œ|Ð,>À*ÈqÁ.ÐARÑ,RÓSôð ×Ñ˜TŸW™W×-Ñ-×:Ñ:¸JÈ¹NÕKrd   )	rE  r7  rN  rg  Útwistedr   rÜ  ÚCanonicalNameChainTooLongrÂ   )rT   rg  rV   r»  rº  s   `   @rX   Útest_cnameChainÚMXTests.test_cnameChain  sp   ù€ ÷	ñ 	ð2 ˆ
Ù(›?ˆ�‰ÔØ�G‰G�M‰MÐ,¨jÓ9ˆØ×Ñ˜1œgŸl™l×7Ñ7×QÑQÔRö	Lð 	
�‰�nÔ%Øˆrd   c                óæ   ^^^^• / mSmSmSm " UUUU4S jS5      nU" 5       U R                   l        U R                   R                  T5      nUR                  U R                  [        TS95        U$ )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                  ó(   >• \ rS rSrU UUU4S jrSrg)Ú8MXTests.test_cnameWithGlueRecords.<locals>.DummyResolveriH  c                óÚ   >• UT:w  d  T(       a  / / / 4$ [         R                  " [        T[        R                  [        T5      S9[        T[
        R                  [        TS9S9// / 45      $ )Nrs  r—  )r   r!  r"   r    ru  r!   )rT   ra   r«  r¬  r­  ÚlookedUps     €€€€rX   rd  ÚKMXTests.test_cnameWithGlueRecords.<locals>.DummyResolver.lookupMailExchangeI  sw   ø€ Ø˜U“?¦hð   B˜<Ð'Ü—}’}ô %Ø%*Ü%1×%6Ñ%6Ü(4°YÓ(?ñô
 %Ø%.Ü%.§^¡^Ü(1°xÑ(@ñðð Øðóð rd   r8   Nrf  )r«  r¬  r­  rÅ  s   €€€€rX   rg  rÃ  H  s   ø† ÷ó rd   rg  r—  r˜  )rT   rg  rV   r«  r¬  r­  rÅ  s      @@@@rX   Útest_cnameWithGlueRecordsÚ!MXTests.test_cnameWithGlueRecords<  sc   û€ ð ˆØ#ˆØ+ˆ	Ø%ˆ÷	÷ 	ñ2 )›?ˆ�‰ÔØ�G‰G�M‰M˜%Ó ˆØ	�‰�d×&Ñ&¬	°xÑ(@ÔAØˆrd   c                óø   ^^• SmSm " UU4S jS5      nU" 5       U R                   l        U R                   R                  T5      nU R                  U[        R
                  R                  R                  5        U$ )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                  ó$   >• \ rS rSrU U4S jrSrg)Ú<MXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolverio  c           
     óº   >• [         R                  " [        T[        R                  [        T5      S9[        T[        R                  [        T5      S9// / 45      $ )Nrs  )r   r!  r"   r    ru  )rT   ra   Ú
firstAliasÚsecondAliass     €€rX   rd  ÚOMXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolver.lookupMailExchangep  sb   ø€ Ü—}’}ô %Ø%/Ü%1×%6Ñ%6Ü(4°[Ó(Añô
 %Ø%0Ü%1×%6Ñ%6Ü(4°ZÓ(@ñðð Øðóð rd   r8   Nrf  )rÍ  rÎ  s   €€rX   rg  rË  o  s   ø† ÷ñ rd   rg  )rE  r7  rN  rg  r½  r   rÜ  ÚCanonicalNameLoop)rT   rg  rV   rÍ  rÎ  s      @@rX   Útest_cnameLoopWithGlueRecordsÚ%MXTests.test_cnameLoopWithGlueRecordsf  s`   ù€ ð *ˆ
Ø*ˆ÷	õ 	ñ* )›?ˆ�‰ÔØ�G‰G�M‰M˜*Ó%ˆØ×Ñ˜1œgŸl™l×7Ñ7×IÑIÔJØˆrd   c                ó    • / SQU R                   R                  S'   U R                  R                  S5      R	                  U R
                  5      $ )N)zmx1.test.domainzmx2.test.domainzmx3.test.domainr'  )r-  r  rE  rN  rÂ   Ú_cbManyRecordsSuccessfulLookuprf   s    rX   ÚtestManyRecordsÚMXTests.testManyRecords‰  sC   € ò.
ˆ�	‰	×Ñ˜MÑ*ð
 �w‰w�}‰}˜]Ó+×7Ñ7Ø×/Ñ/ó
ð 	
rd   c                ó<  • U R                  [        UR                  5      R                  SS5      S   S;   5        U R                  R                  [        UR                  5      5        U R                  R                  S5      R                  U R                  U5      $ )NÚ.ro   r   )Úmx1Úmx2Úmx3r'  )	rL   r_   r·   r©   rE  r}  rN  rÂ   Ú_cbManyRecordsDifferentResultrT  s     rX   rÔ  Ú&MXTests._cbManyRecordsSuccessfulLookup”  sq   € Ø�‰œ˜BŸG™G›×*Ñ*¨3°Ó2°1Ñ5Ð9NÑNÔOØ�‰�‰œ˜BŸG™G›Ô%Ø�w‰w�}‰}˜]Ó+×7Ñ7Ø×.Ñ.°ó
ð 	
rd   c                ó8  • U R                  [        UR                  5      [        UR                  5      5        U R                  R	                  [        UR                  5      5        U R                  R                  S5      R                  U R                  X!5      $ r\  )r#  r_   r·   rE  r}  rN  rÂ   Ú_cbManyRecordsLastResult)rT   ÚnextMXrE  s      rX   rÜ  Ú%MXTests._cbManyRecordsDifferentResult›  sg   € Ø×ÑœC §¡›L¬#¨f¯k©kÓ*:Ô;Ø�‰�‰œ˜FŸK™KÓ(Ô)à�w‰w�}‰}˜]Ó+×7Ñ7Ø×)Ñ)¨2ó
ð 	
rd   c                ó  • U R                  [        UR                  5      [        UR                  5      5        U R                  [        UR                  5      [        UR                  5      5        U R                  R	                  [        UR                  5      5        U R                  R                  [        UR                  5      5        U R                  R                  S5      R                  U R                  U5      $ r\  )	r#  r_   r·   rE  r}  r‹  rN  rÂ   Ú"_cbManyRecordsRepeatSpecificResult)rT   ÚlastMXrE  rà  s       rX   rß  Ú MXTests._cbManyRecordsLastResult£  s¤   € Ø×ÑœC §¡›L¬#¨f¯k©kÓ*:Ô;Ø×ÑœC §¡Ó,¬c°&·+±+Ó.>Ô?à�‰�‰œ˜FŸK™KÓ(Ô)Ø�‰×Ñœ˜VŸ[™[Ó)Ô*à�w‰w�}‰}˜]Ó+×7Ñ7Ø×3Ñ3°Vó
ð 	
rd   c                ót   • U R                  [        UR                  5      [        UR                  5      5        g rƒ   ri  )rT   ÚagainMXrà  s      rX   rã  Ú*MXTests._cbManyRecordsRepeatSpecificResult®  s$   € Ø×Ñœ˜WŸ\™\Ó*¬C°·±Ó,<Õ=rd   )r³  rE  N)!r^   ry   rz   r{   r°   r…   r¢  rJ  r   r|   r}   rP  rO  rY  r]  rn  ry  r~  r‚  rˆ  rŒ  r™  r¢  r¯  r¿  rÇ  rÑ  rÕ  rÔ  rÜ  rß  rã  r~   r8   rd   rX   rB  rB    sÒ   † ñòLò
!ò
ñ ˆC×Ñ Ñ$Ð&>Ó?ñOó @ðOò@òIòPòò69ò 9ò 8ò"Bò(Bò("òHò23òj,ò\(òT!ñF ˆC×Ñ Ñ$Ð&>Ó?ñ
ó @ð
ò
ò
ò	
õ>rd   rB  c                  ó¼   • \ rS rSr\R
                  " \S5      c  SrS rS r	\
" \R                  S:¬  S5      S 5       r\
" \R                  S:¬  S5      S	 5       rS
rg)ÚLiveFireExerciseTestsi²  Nz1UDP support is required to determining MX recordsc                ó,   • [        U 5        / SQU l        g )N)Ú	domainDirÚinsertionDomainÚinsertionQueueÚdestinationDomainÚdestinationQueue)r9  Útmpdirsrf   s    rX   r…   ÚLiveFireExerciseTests.setUp·  s   € Ü�Œò
ˆ�rd   c                ó¶   • U R                    H?  n[        R                  R                  U5      (       d  M)  [        R
                  " U5        MA     [        U 5      $ rƒ   )rñ  rÉ   rÊ   rŠ   r   r¡  r@  )rT   rV   s     rX   r¢  ÚLiveFireExerciseTests.tearDownÁ  s<   € Ø—”ˆAÜ�w‰w�~‰~˜a× Ó Ü—’˜aÖ ñ ô ˜4Ó Ð rd   r-   r/   c                ó´  ^ ^^^• [         R                   R                  5       nUR                  R                  [        R
                  R                  5       5        [         R                  R                  US5      mTR                  SS5        UR                  ST5        UR                  S   UR                  S'   [        UR                  S   R                  TR                  5       5        UR                  [         R                  R!                  U5      5        UR#                  5       n[$        R&                  " SUSS9T l        [+        / S	Q5      m[-        5       m[.        R0                  " 5       nU4S
 jUl        U4S jUl        [$        R4                  " ST R(                  R7                  5       R8                  U5        UU 4S jnTR;                  U5        T$ )Nrì  ró  r“   r'  r  r   r÷   r*  )ú
HELO mesonzMAIL FROM: <user@hostname>zRCPT TO: <user@test.domain>ÚDATAúThis is the messagerØ  ÚQUITc                 ó   >• T $ rƒ   r8   ©r  s   €rX   r˜  Ú9LiveFireExerciseTests.testLocalDelivery.<locals>.<lambda>å  ó   ø€ ™Vrd   c                 ó&   >• TR                  S 5      $ rƒ   ©Úcallback©r¹  rË  s    €rX   r˜  rü  æ  ó   ø€ ¨t¯}©}¸TÔ/Brd   c                ó   >• TR                  SS [        R                  5      S   nUR                  S5      R	                  5       nTR                  UR                  S5      S5        TR                  R                  5       $ ©Nró  ro   r   rø  éÿÿÿÿ)	rõ  r   rö  r  rÒ   r#  ÚfindÚ
smtpServerr5  )ÚignrW  r  ra   rT   s      €€rX   ÚfinishedÚ9LiveFireExerciseTests.testLocalDelivery.<locals>.finishedé  sd   ø€ Ø×'Ñ'¨°´d·m±mÓDÀQÑGˆDØ—/‘/ !Ó$×)Ñ)Ó+ˆCØ×Ñ §¡Ð)>Ó ?ÀÔDà—?‘?×0Ñ0Ó2Ð2rd   )r   r�   Ú
smtpPortalÚregisterCheckerr   ræ  ÚAllowAnonymousAccessrß   rÔ  r”   rž   r  Úmaprå  ÚsetQueuerœ  r�  rý   r   r0  r  r   r   r   ÚClientFactoryÚclientConnectionLostÚ
connectTCPr2  r1  rÂ   )rT   rª   rº   r	  r  ra   rË  s   `   @@@rX   Ú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ð 	×Ñ˜Ô"Øˆrd   c                ó¨  ^ ^^^^^	• [         R                   R                  5       nUR                  R                  [        R
                  R                  5       5        [         R                  R                  US5      mUR                  ST5        [        R                  " S5        UR                  [         R                  R                  S5      5        UR                  R!                  [         R"                  R%                  U5      5        [         R                  R'                  UR(                  5      m	T	=R*                  S-  sl        [         R                  R-                  T	S5      m[         R                  R/                  T R0                  5      T	l        S/T R4                  R6                  S'   UR9                  5       n[:        R<                  " SUSS	9T l        [         R                   R                  5       nUR                  R                  [        R
                  R                  5       5        [         R                  R                  US
5      mTRA                  SS5        UR                  ST5        [        R                  " S5        UR                  [         R                  R                  S5      5        [         R                  R-                  T	S5      mTRC                  5         UR9                  5       n[:        R<                  " SUSS	9T l"        T RD                  RG                  5       RH                  T	l%        [M        / SQ5      m[O        5       m[P        RR                  " 5       nU4S jUl(        U4S jUl*        [:        RV                  " ST R>                  RG                  5       RH                  U5        UUU	U 4S jnTRY                  U5        T$ )Nrí  zinsertion.domainrî  )ztest.identity.hostnamero   r÷   zdestination.domainr   r*  rï  ró  r“   rð  )rö  zMAIL FROM: <user@wherever>z"RCPT TO: <user@destination.domain>r÷  rø  rØ  rù  c                 ó   >• T $ rƒ   r8   rû  s   €rX   r˜  Ú9LiveFireExerciseTests.testRelayDelivery.<locals>.<lambda>)  rý  rd   c                 ó&   >• TR                  S 5      $ rƒ   rÿ  r  s    €rX   r˜  r  *  r  rd   c                óZ   >• TR                  5       nUUU4S jnUR                  U5        U$ )Nc                óV  >• TR                  SS [        R                  5      S   nUR                  S5      R	                  5       nTR                  UR                  S5      S5        TR                  R                  5         TR                  R                  5         TR                  5         g r  )rõ  r   rö  r  rÒ   r#  r  Ú	insServerr5  Ú
destServerÚstopService)r  rW  r  ra   ÚhelperrT   s      €€€rX   Ú	deliveredÚLLiveFireExerciseTests.testRelayDelivery.<locals>.finished.<locals>.delivered2  s}   ø€ Ø×+Ñ+¨F°D¼$¿-¹-ÓHÈÑK�Ø—o‘o aÓ(×-Ñ-Ó/�Ø×#Ñ# C§H¡HÐ-BÓ$CÀRÔHà—‘×,Ñ,Ô.Ø—‘×-Ñ-Ô/Ø×"Ñ"Õ$rd   )Ú
checkStaterÂ   )r  r£   r  ra   r  rÛ  rT   s      €€€€rX   r	  Ú9LiveFireExerciseTests.testRelayDelivery.<locals>.finished-  s-   ø€ ð ×)Ñ)Ó+ˆH÷%ð × Ñ  Ô+ØˆOrd   )-r   r�   r  r  r   ræ  r  rß   rÔ  rž   rÉ   r®  r  rÜ  rò  rR   ÚsetDefaultDomainrœ  r�  ÚSmartHostSMTPRelayingManagerró  ÚfArgsÚRelayStateHelperrD  r7  Úmxcalcr-  r  rý   r   r0  r  r”   ÚstartServicer  r2  r1  ÚPORTr   r   r   r  r  r  rÂ   )
rT   ÚinsServrº   ÚdestServr	  r  ra   rË  r  rÛ  s
   `    @@@@@rX   Ú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÷	ð 	ð" 	×Ñ˜Ô"Øˆrd   )r  r  r  rñ  )r^   ry   rz   r{   r   ÚIReactorUDPr   Úskipr…   r¢  r   r|   r}   r  r,  r~   r8   rd   rX   rê  rê  ²  sw   † à×Ò˜g tÓ,Ñ4ØBˆò
ò!ñ ˆC×Ñ Ñ$Ð&>Ó?ñ)ó @ð)ñV ˆC×Ñ Ñ$Ð&>Ó?ñKó @óKrd   rê  c                  ó,   • \ rS rSrS rS rS rS rSrg)ÚLineBufferMessageiB  c                ó.   • / U l         SU l        SU l        g )NF)ÚlinesÚeomÚlostrf   s    rX   rŽ  ÚLineBufferMessage.__init__C  s   € ØˆŒ
ØˆŒØˆ�	rd   c                ó:   • U R                   R                  U5        g rƒ   )r3  rT  )rT   rÔ   s     rX   r¥   ÚLineBufferMessage.lineReceivedH  s   € Ø�
‰
×Ñ˜$Õrd   c                ó<   • SU l         [        R                  " S5      $ )NTz
<Whatever>)r4  r   r!  rf   s    rX   rÁ   ÚLineBufferMessage.eomReceivedK  s   € ØˆŒÜ�}Š}˜\Ó*Ð*rd   c                ó   • SU l         g )NT)r5  rf   s    rX   r§   Ú LineBufferMessage.connectionLostO  s	   € Øˆ�	rd   )r4  r3  r5  N)	r^   ry   rz   r{   rŽ  r¥   rÁ   r§   r~   r8   rd   rX   r1  r1  B  s   † òò
 ò+õrd   r1  c                  ó¤   • \ rS rSr/ SQrS r\" \R                  S:¬  S5      S 5       r	S r
S r\" \R                  S:¬  S5      S	 5       rS
 rSrg)Ú
AliasTestsiS  ©z
First linez	Next liner  zAfter a blank linez	Last linec                ó  • 0 n/ SQnU H$  n[         R                  R                  XSS 5        M&     U R                  US   SS/5        U R                  US   S/5        U R                  US   S	/5        U R                  US
   / SQ5        g )N)zuser:  another@host
znextuser:  |/bin/program
zuser:  me@again
z"moreusers: :/etc/include/filename
z3multiuser: first@host, second@host,last@anotherhostr(   ró  zanother@hostzme@againÚnextuserz|/bin/programÚ	moreusersz:/etc/include/filenameÚ	multiuser)z
first@hostzsecond@hostzlast@anotherhost)r   r«  ÚhandlerA   )rT   rÌ   r3  Úls       rX   Ú
testHandleÚAliasTests.testHandleW  s•   € Øˆò
ˆó ˆAÜ�J‰J×Ñ˜f¨°TÖ:ñ ð 	×Ñ˜ ™¨.¸*Ð)EÔFØ×Ñ˜ 
Ñ+¨oÐ->Ô?Ø×Ñ˜ Ñ,Ð/GÐ.HÔIØ×ÑØ�;ÑÒ!Rõ	
rd   r-   r/   c                óB  • S[        5       0n[        R                  R                  U[        R
                  " [        R                  " S5      R                  5       5      S9nU R                  [        U5      S5        US   n[        U5      nS H$  nU R                  UR                  U5      S5        M&     U R                  [        U5      S5        US	   n[        U5      nS
 H$  nU R                  UR                  U5      S5        M&     U R                  [        U5      S5        US   n[        U5      nU R                  UR                  S5      S5        S H(  nU R                  UR                  U5      SSU-  5        M*     U R                  [        U5      S5        g )Nr  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¾   r.   Útestuser)Úaddress1Úaddress2Úaddress3zcontinuation@addressz/bin/process/thisr  rº  Úusertwo)ÚthisaddressÚthataddressÚlastaddressÚlastuserz/includable)z	/filenameÚprogramr   z%s not found)r  r   r«  ÚloadAliasFiler;  r<  ÚtextwrapÚdedentÚencoderA   rB   r_   r#  r  )rT   rR   rÌ   ÚgroupÚsr:   s         rX   Ú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Õ'rd   c                ó  • [        5       [        5       [        5       4n[        R                  R                  U5      nU R                   H  nUR                  U5        M     UR                  5       R                  U R                  U5      $ rƒ   )	r1  r   r«  ÚMultiWrapperr3  r¥   rÁ   rÂ   Ú_cbMultiWrapper)rT   rÁ  r  ÚLs       rX   ÚtestMultiWrapperÚAliasTests.testMultiWrapperš  si   € Ü Ó"Ô$5Ó$7Ô9JÓ9LÐLˆÜ�j‰j×%Ñ% dÓ+ˆà—”ˆAØ×Ñ˜QÖñ à�‰Ó ×,Ñ,¨T×-AÑ-AÀ4ÓHÐHrd   c                óÎ   • U H_  nU R                  UR                  5        U R                  UR                  5        U R	                  U R
                  UR
                  5        Ma     g rƒ   )rL   r4  rÈ   r5  rA   r3  )rT   ri  rÁ  rV  s       rX   r]  ÚAliasTests._cbMultiWrapper¢  sF   € ÛˆAØ�O‰O˜AŸE™EÔ"Ø×Ñ˜QŸV™VÔ$Ø×Ñ˜TŸZ™Z¨¯©Ö1ò rd   c                ó   • U R                  5       n[        R                  R                  US S 5      nUR	                  5       nU R
                   H  nUR                  U5        M     UR                  5       R                  U R                  U5      $ rƒ   )
r¶   r   r«  Ú	FileAliasÚcreateMessageReceiverr3  r¥   rÁ   rÂ   Ú_cbTestFileAlias)rT   Útmpfiler:   rV  rE  s        rX   ÚtestFileAliasÚAliasTests.testFileAlias¨  sl   € à—+‘+“-ˆÜ�J‰J× Ñ  ¨$°Ó5ˆØ×#Ñ#Ó%ˆà—”ˆAØ�N‰N˜1Öñ à�}‰}‹×*Ñ*¨4×+@Ñ+@À'ÓJÐJrd   c                óÖ   • [        U5       nUR                  5       nS S S 5        U R                  W Vs/ s H  oUS S PM	     snU R                  5        g ! , (       d  f       N>= fs  snf )Nr  ©r¹   Ú	readlinesrA   r3  )rT   ri  rg  rº   r3  r^  s         rX   rf  ÚAliasTests._cbTestFileAlias²  sL   € Ü�'Œ]˜aØ—K‘K“MˆE÷ à×Ñ©%Ó0ª% Q˜C˜R›&©%Ñ0°$·*±*Õ=÷ �]üâ0s   ŒA´A&Á
A#r8   N)r^   ry   rz   r{   r3  rF  r   r|   r}   rY  r_  r]  rh  rf  r~   r8   rd   rX   r>  r>  S  so   † âN€Eò
ñ( ˆC×Ñ Ñ$Ð&>Ó?ñ,(ó @ð,(ò\Iò2ñ ˆC×Ñ Ñ$Ð&>Ó?ñKó @ðKõ>rd   r>  c                  ó(   • \ rS rSrSrS rSS jrSrg)ÚDummyDomaini¸  z'
Test domain for L{AddressAliasTests}.
c                ó   • Xl         g rƒ   ©r   )rT   r   s     rX   rŽ  ÚDummyDomain.__init__½  s   € Ø�rd   Nc                ó`   ^ ^• U(       a  [         R                  R                  S5      eU U4S j$ )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   >• T[        T R                  5      :H  $ rƒ   )r_   r   rL  s   €€rX   r˜  Ú$DummyDomain.exists.<locals>.<lambda>Ë  s   ø€ �tœs 4§<¡<Ó0Ò0rd   )r   r   r•   r  s   `` rX   rŠ   ÚDummyDomain.existsÀ  s#   ù€ ö Ü—)‘)×'Ñ'¨Ó.Ð.å0Ð0rd   rq  rƒ   )r^   ry   rz   r{   r°   rŽ  rŠ   r~   r8   rd   rX   ro  ro  ¸  s   † ñò÷1rd   ro  c                  ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚAddressAliasTestsiÎ  z/
Tests for L{twisted.mail.alias.AddressAlias}.
c                ó  • [         R                  R                  S5      U l        U R                  R                  [        U R                  5      0n[         R                  R                  U R                  XR                  5      U l        g)z
Setup an L{AddressAlias}.
zfoo@barN)r   r   r:  r   ra   ro  r«  ÚAddressAlias)rT   rR   s     rX   r…   ÚAddressAliasTests.setUpÔ  sW   € ô —y‘y×(Ñ(¨Ó3ˆŒØ—<‘<×&Ñ&¬°D·L±LÓ(AÐBˆÜ—Z‘Z×,Ñ,¨T¯\©\¸7ÇLÁLÓQˆ�
rd   c                óV   • U R                  U R                  R                  5       5        g)z|
L{createMessageReceiever} calls C{exists()} on the domain object
which key matches the C{alias} passed to L{AddressAlias}.
N)rL   r«  re  rf   s    rX   Útest_createMessageReceiverÚ,AddressAliasTests.test_createMessageReceiverÜ  s   € ð
 	�‰˜Ÿ
™
×8Ñ8Ó:Õ;rd   c                óN   • U R                  [        U R                  5      S5        g)z@
The string presentation of L{AddressAlias} includes the alias.
z<Address foo@bar>N)rA   r_   r«  rf   s    rX   rg   ÚAddressAliasTests.test_strã  s   € ð 	×Ñœ˜TŸZ™Z›Ð*=Õ>rd   c                ór   • U R                  U R                  R                  U R                  S05      S5        g)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)rA   r«  Úresolver   rf   s    rX   Útest_resolveÚAddressAliasTests.test_resolveé  s,   € ð
 	×Ñ˜Ÿ™×+Ñ+¨T¯\©\¸5Ð,AÓBÀDÕIrd   c                óZ   • U R                  U R                  R                  0 5      S5        g)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)rA   r«  rƒ  rf   s    rX   Útest_resolveWithoutAliasmapÚ-AddressAliasTests.test_resolveWithoutAliasmapð  s#   € ð
 	×Ñ˜Ÿ™×+Ñ+¨BÓ/°Õ6rd   )r   r«  N)r^   ry   rz   r{   r°   r…   r~  rg   r„  r‡  r~   r8   rd   rX   ry  ry  Î  s"   † ñòRò<ò?òJõ7rd   ry  c                  ó   • \ rS rSrS/rSrg)ÚDummyProcessiø  ÚonEndr8   N)r^   ry   rz   r{   Ú	__slots__r~   r8   rd   rX   rŠ  rŠ  ø  s	   † Ø�	ƒIrd   rŠ  c                  ó   • \ rS rSrSrS rSrg)ÚMockProcessAliasiü  z<
An alias processor that doesn't actually launch processes.
c                ó   • g)z
Don't spawn a process.
Nr8   )rT   ÚprotorR  rÊ   s       rX   ÚspawnProcessÚMockProcessAlias.spawnProcess  ó   � rd   r8   N)r^   ry   rz   r{   r°   r‘  r~   r8   rd   rX   rŽ  rŽ  ü  s   † ñõrd   rŽ  c                  ó   • \ rS rSrSr\rSrg)ÚMockAliasGroupi  z+
An alias group using C{MockProcessAlias}.
r8   N)r^   ry   rz   r{   r°   rŽ  ÚprocessAliasFactoryr~   r8   rd   rX   r•  r•    s   † ñð +Órd   r•  c                  ó*   • \ rS rSrSrS rS rS rSrg)ÚStubProcessi  z‡
Fake implementation of L{IProcessTransport}.

@ivar signals: A list of all the signals which have been sent to this fake
    process.
c                ó   • / U l         g rƒ   ©Úsignalsrf   s    rX   rŽ  ÚStubProcess.__init__  s	   € Øˆ�rd   c                ó   • g)z(
No-op implementation of disconnection.
Nr8   rf   s    rX   ÚloseConnectionÚStubProcess.loseConnection  r“  rd   c                ó:   • U R                   R                  U5        g)z<
Record a signal sent to this process for later inspection.
N)r›  rT  )rT   Úsignals     rX   ÚsignalProcessÚStubProcess.signalProcess  s   € ð 	�‰×Ñ˜FÕ#rd   rš  N)	r^   ry   rz   r{   r°   rŽ  rž  r¢  r~   r8   rd   rX   r˜  r˜    s   † ñòòõ
$rd   r˜  c                  ó*  • \ rS rSrSr\R                  " \S5      c  Sr/ SQr	S r
S rS rS	 r\" \R                   S
:¬  S5      S 5       rS rS rS rS rS r\" \R                   S
:¬  S5      S 5       r\" \R                   S
:¬  S5      S 5       rSrg)ÚProcessAliasTestsi&  z
Tests for alias resolution.
NzIReactorProcess not supportedr?  c                óö   • US-  S-  nU R                  [        R                  " U5      5        U R                  [        R                  " U5      U5        U R                  [        R                  " U5      5        U$ )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.
é   r   )rL   rÉ   Ú	WIFEXITEDrA   ÚWEXITSTATUSrÈ   ÚWIFSIGNALED)rT   ÚcodeÚstatuss      rX   Ú
exitStatusÚProcessAliasTests.exitStatus1  s]   € ð ˜!‘)˜q‘ˆð 	�‰œŸš VÓ,Ô-Ø×ÑœŸš¨Ó/°Ô6Ø×ÑœŸš¨Ó/Ô0àˆrd   c                óê   • UnU R                  [        R                  " U5      5        U R                  [        R                  " U5      U5        U R                  [        R                  " U5      5        U$ )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.
)rL   rÉ   rª  rA   ÚWTERMSIGrÈ   r¨  )rT   r¡  r¬  s      rX   ÚsignalStatusÚProcessAliasTests.signalStatusF  sU   € ð ˆð 	�‰œŸš vÓ.Ô/Ø×ÑœŸš VÓ,¨fÔ5Ø×ÑœŸš fÓ-Ô.àˆrd   c                óD   • [         R                  U l        S[         l        g)z2
Replace L{smtp.DNSNAME} with a well-known value.
r  N)r   ÚDNSNAMErf   s    rX   r…   ÚProcessAliasTests.setUp^  s   € ô —|‘|ˆŒØŒ�rd   c                ó.   • U R                   [        l         g)z0
Restore the original value of L{smtp.DNSNAME}.
N)r´  r   rf   s    rX   r¢  ÚProcessAliasTests.tearDowne  s   € ð —|‘|Œ�rd   r-   r/   c                ó¢  ^ • [        T R                  5       5      nUR                  S5        [        R                  " UR
                  S5        [        R                  R                  UR
                  SS5      nUR                  5       nT R                   H  nUR                  U5        M     U 4S jnUR                  5       R                  U5      $ )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                óØ   >• [        S5       nUR                  5       nS S S 5        TR                  W Vs/ s H  o3S S PM	     snTR                  5        g ! , (       d  f       N>= fs  snf )Nzprocess.alias.outr  rk  )ri  rº   r3  r^  rT   s       €rX   Ú_cbProcessAliasÚ<ProcessAliasTests.test_processAlias.<locals>._cbProcessAlias�  sP   ø€ ÜÐ)Ô*¨aØŸ™›�÷ +à×Ñ©eÓ4ªe¨  ›f©eÑ4°d·j±jÕA÷ +Õ*üâ4s   �AµA'Á
A$)r&   r¶   Ú
setContentrÉ   ÚchmodrÊ   r   r«  ÚProcessAliasre  r3  r¥   rÁ   rÂ   )rT   Úshr:   rV  rE  rº  s   `     rX   Útest_processAliasÚ#ProcessAliasTests.test_processAliask  s�   ø€ ô �d—k‘k“mÓ$ˆØ
�‰ðô	
ô 	�Š�—‘˜%Ô Ü�J‰J×#Ñ# B§G¡G¨T°4Ó8ˆØ×#Ñ#Ó%ˆà—”ˆAØ�N‰N˜1Öñ õ	Bð
 �}‰}‹×*Ñ*¨?Ó;Ð;rd   c                óÈ  ^ ^^• [         R                  " 5       n[        5       m[        R                  R                  5       mTR                  T5        [        R                  R                  TSU5      nUR                  5       nUR                  " UR                  5        UU U4S jnT R                  U[        R                  R                  5        UR                  U5        U$ )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                ó®   >• TR                  TR                  S/5        TR                  [        TR	                  [
        R                  5      5      5        g )NÚKILL)rA   r›  ÚprocessEndedr   r±  r¡  ÚSIGKILL)ri  r�  rT   r­   s    €€€rX   ÚtimedOutÚ<ProcessAliasTests.test_processAliasTimeout.<locals>.timedOut˜  s@   ø€ Ø×Ñ˜Y×.Ñ.°°Ô9ð ×ÑÔ0°×1BÑ1BÄ6Ç>Á>Ó1RÓSÕTrd   )r   r¯  r˜  r   r«  ÚProcessAliasProtocolr¤   ÚMessageWrapperrÁ   r°  ÚcompletionTimeoutrg  ÚProcessAliasTimeoutrÂ   )rT   r   ÚreceiverrV   rÇ  r�  r­   s   `    @@rX   Útest_processAliasTimeoutÚ*ProcessAliasTests.test_processAliasTimeoutˆ  s¢   ú€ ô —*’*“,ˆÜ“Mˆ	Ü—
‘
×/Ñ/Ó1ˆØ×Ñ˜YÔ'ä—:‘:×,Ñ,¨U°D¸'ÓBˆØ× Ñ Ó"ˆØ�Š˜×2Ñ2Ô3÷	Uð 	×Ñ˜1œdŸj™j×<Ñ<Ô=Ø	�‰�hÔØˆrd   c                ó^  • [        5       n[        R                  R                  5       nUR                  " U5        [        R                  R                  USS5      nUR                  " [        R                  " [        S5      5      5        U R                  UR                  5       [        5      $ )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.
Nr   )r˜  r   r«  rÉ  r¤   rÊ  rÅ  r$   rê  r   rg  rÁ   )rT   r­   r   rÍ  s       rX   Útest_earlyProcessTerminationÚ.ProcessAliasTests.test_earlyProcessTermination¢  sz   € ô  “Mˆ	Ü—:‘:×2Ñ2Ó4ˆØ×Ò 	Ô*Ü—:‘:×,Ñ,¨X°t¸TÓBˆØ×ÒœgŸošo¬k¸!«nÓ=Ô>Ø×!Ñ! (×"6Ñ"6Ó"8¼+ÓFÐFrd   c                ó^  • [        5       n[        R                  R                  5       nUR                  " U5        [        R                  R                  USS5      nUR                  " [        R                  " [        U5      5      5        U R                  UR                  5       [        5      $ )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   rg  rÁ   )rT   r¬  r­   r   rÍ  s        rX   Ú_terminationTestÚ"ProcessAliasTests._terminationTest¯  s}   € ô  “Mˆ	Ü—:‘:×2Ñ2Ó4ˆØ×Ò 	Ô*Ü—:‘:×,Ñ,¨X°t¸TÓBˆØ×ÒœgŸošoÔ.?ÀÓ.GÓHÔIØ×!Ñ! (×"6Ñ"6Ó"8Ô:KÓLÐLrd   c                óB   • U R                  U R                  S5      5      $ )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.
ro   )rÔ  r­  rf   s    rX   Útest_errorProcessTerminationÚ.ProcessAliasTests.test_errorProcessTermination¼  s   € ð ×$Ñ$ T§_¡_°QÓ%7Ó8Ð8rd   c                ó^   • U R                  U R                  [        R                  5      5      $ )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¡  ÚSIGHUPrf   s    rX   Útest_signalProcessTerminationÚ/ProcessAliasTests.test_signalProcessTerminationÄ  s$   € ð ×$Ñ$ T×%6Ñ%6´v·}±}Ó%EÓFÐFrd   c           	     ól  • 0 nS[        U/ SQ5      0n[        / SQUS5      n[        SS/US5      n[        R                  R	                  SUS5      nUR                  UUUS	.5        UR                  U5      n[        [        UR                  5      nUR                  5         [        [        [        R                  R	                  S
SS5      [        R                  R                  [        5       S5      [        R                  R                  S5      /5      nUR                  5         U R                  Xx5        UR                  U5      n	[        [        U	R                  5      n
U
R                  5         [        [        [        R                  R	                  SSS5      [        R                  R	                  SSS5      /5      nUR                  5         U R                  X¨5        UR                  U5      n[        [        UR                  5      nUR                  5         [        [        [        R                  R	                  S
SS5      [        R                  R                  [        5       S5      [        R                  R                  S5      /5      nUR                  5         U R                  XÈ5        g)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Þ  )rÚ  ú|echoú/fileÚalias1rÜ  rÞ  Úalias2Úalias3©rà  rá  râ  rÚ  NÚechorß  )Ú
TestDomainr•  r   r«  r{  rM   rƒ  r  r_   ÚobjsrG   rÊ  rŠ  ÚFileWrapperrA   )rT   r  ra   ÚA1ÚA2ÚA3Úres1Úr1ÚexpectedÚres2Úr2Úres3Úr3s                rX   Ú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Ó/ðó
ˆð 	�‰ŒØ×Ñ˜Õ&rd   c                ó6  • 0 nS[        U/ 5      0n[        R                  R                  SUS5      n[        R                  R                  SUS5      n[        R                  R                  SUS5      nUR	                  X4US.5        U R                  US   R                  U5      S5        U R                  US   R                  U5      S5        U R                  US   R                  U5      S5        [        SS/US5      nXaS'   UR                  U5      n[        [        UR                  5      nUR                  5         [        [        [        R                  R                  [        5       S	5      /5      n	U	R                  5         U R                  X‰5        g)
z>
Check that a cycle in alias resolution is correctly handled.
r  rá  rà  râ  rã  NrÞ  Úalias4rä  )rå  r   r«  r{  rM   rA   rƒ  r•  r  r_   ræ  rG   rÊ  rŠ  )
rT   r  ra   rè  ré  rê  ÚA4ÚresÚrrí  s
             rX   Útest_cyclicAliasÚ"ProcessAliasTests.test_cyclicAlias	  sN  € ð
 ˆØ”j ¨"Ó-Ð.ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆÜ�Z‰Z×$Ñ$ X¨v°xÓ@ˆØ�‰ "¸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ˆØ�‰ŒØ×Ñ˜Õ%rd   )r´  )r^   ry   rz   r{   r°   r   ÚIReactorProcessr   r/  r3  r­  r±  r…   r¢  r   r|   r}   rÀ  rÎ  rÑ  rÔ  r×  rÛ  rò  rù  r~   r8   rd   rX   r¥  r¥  &  sÏ   † ñð ×!Ò! '¨4Ó0Ñ8Ø.ˆâN€Eòò*ò0ò$ñ ˆC×Ñ Ñ$Ð&>Ó?ñ<ó @ð<ò8ò4GòMò9òGñ ˆC×Ñ Ñ$Ð&>Ó?ñ>'ó @ð>'ñ@ ˆC×Ñ Ñ$Ð&>Ó?ñ&ó @ó&rd   r¥  c                  ó$   • \ rS rSrS rSS jrSrg)rå  i(	  c                ó   • Xl         X l        g rƒ   ©r  Úusers)rT   r  rÿ  s      rX   rŽ  ÚTestDomain.__init__)	  s   € ØŒØ�
rd   Nc                óD  ^^• TR                   R                  mTU R                  ;   a  U4S j$  U R                  T   nUR	                  U R                  U5      mT(       a  U4S j$ [
        R                  " T5      e! [         a    [
        R                  " T5      ef = f)Nc                 óF   >• [         R                  R                  T S S 5      $ rƒ   )r   r«  r{  )ró  s   €rX   r˜  Ú#TestDomain.exists.<locals>.<lambda>0	  s   ø€ œ4Ÿ:™:×2Ñ2°4¸¸tÔDrd   c                 ó   >• T $ rƒ   r8   )r  s   €rX   r˜  r  8	  s   ø€ ™wrd   )r¡  Úlocalrÿ  r  rƒ  r   r•   r=  )rT   ró  r  r:   r  s    `  @rX   rŠ   ÚTestDomain.exists-	  s‡   ù€ Ø�y‰y�‰ˆØ�4—:‘:ÓÜDÐDð	)Ø—‘˜TÑ"ˆAð —i‘i §¡¨dÓ3ˆGÞÜ&Ð&Ü×"Ò" 4Ó(Ð(øô ó 	)Ü×"Ò" 4Ó(Ð(ð	)ús   °A> Á>!Brþ  rƒ   )r^   ry   rz   r{   rŽ  rŠ   r~   r8   rd   rX   rå  rå  (	  s   † ò÷)rd   rå  c                  ó<   • \ rS rSrSrS rS rS rS rS r	S r
S	rg
)Ú
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                ó   • Xl         g)zn
@type directory: L{bytes}
@param directory: The pathname of the directory holding messages in the
    queue.
N©Ú	directory)rT   r  s     rX   rŽ  ÚDummyQueue.__init__F	  s	   € ð #�rd   c                óâ   • [         R                  R                  U5      n[         R                  " U R	                  U5      S-   5        [         R                  " U R	                  U5      S-   5        g)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©rT   rq   s     rX   rË  ÚDummyQueue.doneN	  sL   € ô —'‘'×"Ñ" 7Ó+ˆÜ
�	Š	�$—,‘,˜wÓ'¨$Ñ.Ô/Ü
�	Š	�$—,‘,˜wÓ'¨$Ñ.Õ/rd   c                óp   • [        [        R                  R                  U R                  US-   5      S5      $ )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     rX   ÚgetEnvelopeFileÚDummyQueue.getEnvelopeFileY	  s(   € ô ”B—G‘G—L‘L §¡°¸4±Ó@À$ÓGÐGrd   c                óV   • [         R                  R                  U R                  U5      $ )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     rX   r  ÚDummyQueue.getPathe	  s   € ô �w‰w�|‰|˜DŸN™N¨GÓ4Ð4rd   c                óÆ  • [         R                   " 5        S[        U 5       3n[        [        R                  R                  U R                  US-   5      S5      n[        R                  R                  U R                  US-   5      n[        R                  R                  U R                  US-   5      n[        US5      nU[        R                  R                  XSU5      4$ )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½   )rT   ÚfnameÚ
headerFileÚtempFilenameÚfinalFilenameÚmessageFiles         rX   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Ø }ó
ð 
ð 	
rd   c                ó   • g)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.
Nr8   r  s     rX   r  ÚDummyQueue.setWaitingƒ	  s   € ð 	rd   r
  N)r^   ry   rz   r{   r°   rŽ  rË  r  r  rõ  r  r~   r8   rd   rX   r  r  <	  s&   † ñò#ò	0ò
Hò
5ò
õ$rd   r  c                  ó   • \ rS rSrSrS rSrg)Ú!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                ó   • 0 U l         Xl        g)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ó  )rT   ró  s     rX   rŽ  Ú*DummySmartHostSMTPRelayingManager.__init__™	  s   € ð ˆŒØ�
rd   r'  N)r^   ry   rz   r{   r°   rŽ  r~   r8   rd   rX   r%  r%  �	  s   † ñ	õrd   r%  c                  óÜ   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS r\" \R"                  S:¬  S5      S 5       r\" \R"                  S:¬  S5      S 5       rS rS rS rS rSrg)Ú_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                óÚ  • U R                  5       U l        [        R                  " U R                  5        [	        5       U l        SU l        [        R                  " U R                  5        [        [        [        U R                  5      5      SU R
                  5      U l        [        [        [        U R                  5      5      SU R
                  5      U l        SnSn[        R                  R!                  U R                  U5      U l        [        R                  R!                  U R                  U5      U l        ['        U R"                  S-   S5      R)                  5         ['        U R$                  S-   S5      R)                  5         U/U R                  R*                  R,                  S'   U/U R                  R*                  R,                  S	'   ['        U R"                  S
-   S5       n[.        R0                  " SS/U5        SSS5        ['        U R$                  S
-   S5       n[.        R0                  " SS/U5        SSS5        g! , (       d  f       NJ= f! , (       d  f       g= f)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¶   r+  rÉ   r®  r   r   ÚeventLogr%   ÚaddObserverÚ_logObserverr   r%  r  ÚnoisyAttemptMgrÚquietAttemptMgrrÊ   r©  r-  r.  r¹   r¼   rÛ  r(  r°  r±  )rT   ÚnoisyBaseNameÚquietBaseNameÚenvelopes       rX   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°XÜ�KŠKÐ,Ð.?Ð@À(ÔK÷ 2ô �$×#Ñ# dÑ*¨DÔ1°XÜ�KŠKÐ,Ð.?Ð@À(ÔK÷ 2Ð1÷ 2Õ1ú÷ 2Õ1ús   Ç-IÈ(IÉ
IÉ
I*c                ó„   • [         R                  " U R                  5        [        R                  " U R
                  5        g)z?
Unregister for log events and remove the temporary directory.
N)r%   ÚremoveObserverr3  r   r¡  r+  rf   s    rX   r¢  Ú_AttemptManagerTests.tearDownñ	  s(   € ô 	×Ò˜4×,Ñ,Ô-Ü�Š�d—k‘kÕ"rd   c                ó   • Xl         g)zš
A log observer.

@type eventDict: L{dict} of L{bytes} -> L{object}
@param eventDict: Information about the last informational log message
    generated.
N)r1  )rT   Ú	eventDicts     rX   r3  Ú!_AttemptManagerTests._logObserverø	  s	   € ð "�rd   c                óˆ   • [        [        [        U R                  5      5      5      nU R	                  UR
                  5        g)zu
When an attempt manager is created without the noisy parameter, the
noisy instance variable should default to true.
N)r   r%  r  r+  rL   rô  ©rT   Úams     rX   Útest_initNoisyDefaultÚ*_AttemptManagerTests.test_initNoisyDefault
  s-   € ô
 Ô>¼zÈ$Ï+É+Ó?VÓWÓXˆØ�‰˜Ÿ™Õ!rd   c                óN   • U R                  U R                  R                  5        g)z}
When an attempt manager is created with the noisy parameter set to
true, the noisy instance variable should be set to true.
N)rL   r4  rô  rf   s    rX   Útest_initNoisyÚ#_AttemptManagerTests.test_initNoisy

  s   € ð
 	�‰˜×,Ñ,×2Ñ2Õ3rd   c                óN   • U R                  U R                  R                  5        g)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È   r5  rô  rf   s    rX   Útest_initQuietÚ#_AttemptManagerTests.test_initQuiet
  s   € ð
 	×Ñ˜×-Ñ-×3Ñ3Õ4rd   c                ó’   • [        [        [        U R                  5      5      5      nU R	                  UR
                  [
        5        g)z‡
When an attempt manager is created without the reactor parameter, the
reactor instance variable should default to the global reactor.
N)r   r%  r  r+  rA   r   rA  s     rX   Útest_initReactorDefaultÚ,_AttemptManagerTests.test_initReactorDefault
  s1   € ô
 Ô>¼zÈ$Ï+É+Ó?VÓWÓXˆØ×Ñ˜Ÿ™¤WÕ-rd   c                ód   • U R                  U R                  R                  U R                  5        g)z{
When an attempt manager is created with a reactor provided, the
reactor instance variable should default to that reactor.
N)rA   r4  r   rf   s    rX   Útest_initReactorÚ%_AttemptManagerTests.test_initReactor 
  s$   € ð
 	×Ñ˜×-Ñ-×5Ñ5°t·|±|ÕDrd   c                ó†   • U R                   R                  SU R                  5        U R                  U R                  5        g)z_
For an attempt manager with the noisy flag set, notifySuccess should
result in a log message.
r/  N)r4  rÏ  r-  rL   r1  rf   s    rX   Útest_notifySuccessNoisyÚ,_AttemptManagerTests.test_notifySuccessNoisy'
  s0   € ð
 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ�‰˜Ÿ™Õ&rd   c                ó†   • U R                   R                  SU R                  5        U R                  U R                  5        g)zd
For an attempt manager with the noisy flag not set, notifySuccess
should result in no log message.
r0  N)r5  rÏ  r.  rÈ   r1  rf   s    rX   Útest_notifySuccessQuietÚ,_AttemptManagerTests.test_notifySuccessQuiet/
  s2   € ð
 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ×Ñ˜Ÿ™Õ'rd   r-   r/   c                ó†   • U R                   R                  SU R                  5        U R                  U R                  5        g)z_
For an attempt manager with the noisy flag set, notifyFailure should
result in a log message.
r/  N)r4  rÓ  r-  rL   r1  rf   s    rX   Útest_notifyFailureNoisyÚ,_AttemptManagerTests.test_notifyFailureNoisy7
  s0   € ð 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ�‰˜Ÿ™Õ&rd   c                ó†   • U R                   R                  SU R                  5        U R                  U R                  5        g)zd
For an attempt manager with the noisy flag not set, notifyFailure
should result in no log message.
r0  N)r5  rÓ  r.  rÈ   r1  rf   s    rX   Útest_notifyFailureQuietÚ,_AttemptManagerTests.test_notifyFailureQuiet@
  s2   € ð 	×Ñ×*Ñ*¨>¸4×;LÑ;LÔMØ×Ñ˜Ÿ™Õ'rd   c                óp   • U R                   R                  S5        U R                  U R                  5        g)z\
For an attempt manager with the noisy flag set, notifyDone should
result in a log message.
r/  N)r4  rÖ  rL   r1  rf   s    rX   Útest_notifyDoneNoisyÚ)_AttemptManagerTests.test_notifyDoneNoisyI
  s(   € ð
 	×Ñ×'Ñ'¨Ô7Ø�‰˜Ÿ™Õ&rd   c                óp   • U R                   R                  S5        U R                  U R                  5        g)za
For an attempt manager with the noisy flag not set, notifyDone
should result in no log message.
r0  N)r5  rÖ  rÈ   r1  rf   s    rX   Útest_notifyDoneQuietÚ)_AttemptManagerTests.test_notifyDoneQuietQ
  s*   € ð
 	×Ñ×'Ñ'¨Ô7Ø×Ñ˜Ÿ™Õ'rd   c                ó¦   • U R                   R                  S5        U R                  U R                  5        U R                  R                  S5        g)zd
For an attempt manager with the noisy flag set, notifyNoConnection
should result in a log message.
r/  r  N)r4  ÚnotifyNoConnectionrL   r1  r   r°  rf   s    rX   Útest_notifyNoConnectionNoisyÚ1_AttemptManagerTests.test_notifyNoConnectionNoisyY
  s:   € ð
 	×Ñ×/Ñ/°Ô?Ø�‰˜Ÿ™Ô&Ø�‰×Ñ˜RÕ rd   c                ó¦   • U R                   R                  S5        U R                  U R                  5        U R                  R                  S5        g)zi
For an attempt manager with the noisy flag not set, notifyNoConnection
should result in no log message.
r0  r  N)r5  rd  rÈ   r1  r   r°  rf   s    rX   Útest_notifyNoConnectionQuietÚ1_AttemptManagerTests.test_notifyNoConnectionQuietb
  s<   € ð
 	×Ñ×/Ñ/°Ô?Ø×Ñ˜Ÿ™Ô'Ø�‰×Ñ˜RÕ rd   )r1  r4  r-  r5  r.  r   r+  N)r^   ry   rz   r{   r°   r…   r¢  r3  rC  rF  rI  rL  rO  rR  rU  r   r|   r}   rX  r[  r^  ra  re  rh  r~   r8   rd   rX   r+  r+  ¤	  s    † ñò<+LòZ#ò"ò"ò4ò5ò.òEò'ò(ñ ˆC×Ñ Ñ$Ð&>Ó?ñ'ó @ð'ñ ˆC×Ñ Ñ$Ð&>Ó?ñ(ó @ð(ò'ò(ò!õ!rd   r+  )…r°   Ú
__future__r   Úemail.messager=  Úemail.parserr9  rã   r;  rÉ   r°  r   r¡  r|   r”  rT  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+   r€   r™   r²   rÝ   ró   r  rß   Ú _MaildirMailboxAppendMessageTaskr4  rP  r`  r�  rœ  rÉ  rÐ  rË  r  r#  rb  rH  rŒ  r‘  r§  rÈ  rÙ  rî  r  r  r  r  r  r9  r@  rB  rê  r1  r>  ro  ry  rŠ  r«  r¾  rŽ  Ú
AliasGroupr•  r˜  r¥  rå  r  r%  r+  r8   rd   rX   Ú<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!rd   