§
    Ètºf8c ã                   óø
  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZ ddlmZmZ ddlmZ ddlZddlZddlZddlZddlZddlZddlZddl Zddl!Zddlm"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* dd	l+m,Z, dd
l-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 ddl!m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZF ddlGmHZH ddlImJZJ  eeHdk    d¦  «         G d„ deJ¦  «        ¦   «         ZK eeHdk    d¦  «         G d„ deJ¦  «        ¦   «         ZL eeHdk    d¦  «         G d„ deJ¦  «        ¦   «         ZM eeHdk    d¦  «         G d„ deJ¦  «        ¦   «         ZN eeHdk    d¦  «         G d„ d eJ¦  «        ¦   «         ZO eeHdk    d¦  «         G d!„ d"eJ¦  «        ¦   «         ZP eeHdk    d¦  «         G d#„ d$eJ¦  «        ¦   «         ZQ eeHdk    d¦  «         G d%„ d&e#jR        jS        ¦  «        ¦   «         ZT G d'„ d(¦  «        ZU eeHdk    d¦  «         G d)„ d*eJeU¦  «        ¦   «         ZV eeHdk    d¦  «         G d+„ d,eJeU¦  «        ¦   «         ZW eeHdk    d¦  «         G d-„ d.eJ¦  «        ¦   «         ZX eeHdk    d¦  «         G d/„ d0eJ¦  «        ¦   «         ZY eeHdk    d¦  «         G d1„ d2eJ¦  «        ¦   «         ZZ ee#j#        j[        ¦  «         G d3„ d4¦  «        ¦   «         Z\ eeHdk    d¦  «         G d5„ d6eJ¦  «        ¦   «         Z] eeHdk    d¦  «         G d7„ d8eJ¦  «        ¦   «         Z^ G d9„ d:e8j_        ¦  «        Z` eeHdk    d¦  «         G d;„ d<eJ¦  «        ¦   «         Za eeHdk    d¦  «         G d=„ d>eJ¦  «        ¦   «         Zb G d?„ d@¦  «        Zc eeHdk    d¦  «         G dA„ dBeJ¦  «        ¦   «         Zd eeHdk    d¦  «         G dC„ dDeJ¦  «        ¦   «         ZeddEl:mfZfmgZgmhZh  G dF„ dGegji        ¦  «        ZjdH„ ZkdI„ Zl eeHdk    d¦  «         G dJ„ dKeJ¦  «        ¦   «         Zm eeHdk    d¦  «         G dL„ dMeJ¦  «        ¦   «         Zn G dN„ dO¦  «        Zo eeHdk    d¦  «         G dP„ dQeJ¦  «        ¦   «         Zp G dR„ dS¦  «        Zq eeHdk    d¦  «         G dT„ dUeJ¦  «        ¦   «         Zr G dV„ dW¦  «        Zs G dX„ dYe#jt        ju        ¦  «        Zv G dZ„ d[e#jt        jw        ¦  «        Zx G d\„ d]¦  «        Zy eeHdk    d¦  «         G d^„ d_eJ¦  «        ¦   «         Zz G d`„ da¦  «        Z{ G db„ dc¦  «        Z| G dd„ de¦  «        Z} eeHdk    d¦  «         G df„ dgeJ¦  «        ¦   «         Z~dS )hz.
Tests for large portions of L{twisted.mail}.
é    N)Úmd5)ÚskipIf)Ú	InterfaceÚimplementer)ÚverifyClass)ÚcredÚmail)ÚaddressÚdeferÚ
interfacesÚprotocolÚreactorÚtask)ÚDeferred)ÚCannotListenErrorÚDNSLookupErrorÚProcessDoneÚProcessTerminated)ÚLineSendingProtocolÚMemoryReactorClockÚStringTransport)Úpop3Úsmtp)Ú_AttemptManager)Údns)ÚRecord_CNAMEÚ	Record_MXÚRRHeader)ÚDNSNameError)ÚfailureÚlog)ÚFilePath)ÚplatformType)ÚTestCaseÚposixz twisted.mail only works on posixc                   ób   — e Zd Z eej        dk    d¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Z	d„ Z
dS )	ÚDomainWithDefaultsTests©é   únot ported to Python 3c           	      ó
  — d„ t          d¦  «        D ¦   «         }t          j                             |d¦  «        }|                      t	          |¦  «        d¦  «         |                      t          t          |¦  «        ¦  «        t          t          d¦  «        ¦  «        ¦  «         |                      t          |                     ¦   «         ¦  «        t          t          |¦  «        ¦  «        ¦  «         t          |                     ¦   «         ¦  «        }| 	                    ¦   «          |                      |d„ t          d¦  «        D ¦   «         ¦  «         t          | 
                    ¦   «         ¦  «        }| 	                    ¦   «          |                      |t          t          dd¦  «        ¦  «        ¦  «         |                     ¦   «         }| 	                    ¦   «          |                      |d„ t          d¦  «        D ¦   «         ¦  «         |                     ¦   «         }| 	                    ¦   «          |                      |t          t          dd¦  «        ¦  «        ¦  «         t          d¦  «        D ]d}|                      ||         |dz   ¦  «         |                      |                     |¦  «        |dz   ¦  «         |                      ||v ¦  «         Œe|d= |d= |d	= |                      t	          |¦  «        d
¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d	         d¦  «         |                     d dddœ¦  «         |                      t	          |¦  «        d¦  «         |                      |d         d ¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                     ¦   «          |                      t	          |¦  «        d¦  «         |                      |                     dd¦  «        d¦  «         |                      |d         d¦  «         |                      |                     ¦   «         d¦  «         |                      t	          |¦  «        d¦  «         |                     ¦   «         }|                      |j        |j        ¦  «         |                      |j        |j        ¦  «         d S )Nc                 ó   — i | ]}||d z   “Œ	S ©é
   © ©Ú.0Úxs     úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/mail/test/test_mail.pyú
<dictcomp>z7DomainWithDefaultsTests.testMethods.<locals>.<dictcomp>A   s   € Ð*Ð*Ð*˜1ˆQ��B‘Ð*Ð*Ð*ó    r.   ÚDefaultc                 ó   — g | ]	}||d z   f‘Œ
S r-   r/   r0   s     r3   ú
<listcomp>z7DomainWithDefaultsTests.testMethods.<locals>.<listcomp>J   ó    € Ð @Ð @Ð @° ! Q¨¡V Ð @Ð @Ð @r5   é   c                 ó   — g | ]	}||d z   f‘Œ
S r-   r/   r0   s     r3   r8   z7DomainWithDefaultsTests.testMethods.<locals>.<listcomp>R   r9   r5   é   é   é   é   r/   Ú*)ÚaÚbÚcrA   rB   rC   r   ÚkeyÚvalue)rD   rE   )Úranger	   ÚDomainWithDefaultDictÚassertEqualÚlenÚlistÚiterÚiterkeysÚ	iteritemsÚsortÚ
itervaluesÚitemsÚvaluesÚgetÚ
assertTrueÚupdateÚclearÚ
setdefaultÚpopitemÚcopyÚdomainsÚdefault)ÚselfÚdrP   rQ   r2   Údcopys         r3   ÚtestMethodsz#DomainWithDefaultsTests.testMethods?   s$  € à*Ð*¥ b¡	¤	Ð*Ñ*Ô*ˆÝŒI×+Ò+¨A¨yÑ9Ô9ˆà×Ò�˜Q™œ Ñ$Ô$Ð$Ø×Ò��d 1™gœg™œ­­U°2©Y¬Y©¬Ñ8Ô8Ð8Ø×Ò�˜aŸjšj™lœlÑ+Ô+­Tµ$°q±'´'©]¬]Ñ;Ô;Ð;å�Q—[’[‘]”]Ñ#Ô#ˆØ�
Š
‰ŒˆØ×Ò˜Ð @Ð @µe¸B±i´iÐ @Ñ @Ô @ÑAÔAÐAå�a—l’l‘n”nÑ%Ô%ˆØ�Š‰ŒˆØ×Ò˜¥¥e¨B°¡m¤mÑ!4Ô!4Ñ5Ô5Ð5à—’‘	”	ˆØ�
Š
‰ŒˆØ×Ò˜Ð @Ð @µe¸B±i´iÐ @Ñ @Ô @ÑAÔAÐAà—’‘”ˆØ�Š‰ŒˆØ×Ò˜¥¥e¨B°¡m¤mÑ!4Ô!4Ñ5Ô5Ð5å�r‘”ð 	$ð 	$ˆAØ×Ò˜Q˜qœT 1 r¡6Ñ*Ô*Ð*Ø×Ò˜QŸUšU 1™XœX q¨2¡vÑ.Ô.Ð.Ø�OŠO˜A ˜FÑ#Ô#Ð#Ð#àˆaˆD�!�A�$˜˜!˜à×Ò�˜Q™œ Ñ#Ô#Ð#Ø×Ò˜˜1œ˜yÑ)Ô)Ð)Ø×Ò˜˜1œ˜yÑ)Ô)Ð)Ø×Ò˜˜1œ˜yÑ)Ô)Ð)à	�Š�t "¨3Ð/Ð/Ñ0Ô0Ð0Ø×Ò�˜Q™œ Ñ$Ô$Ð$Ø×Ò˜˜3œ Ñ&Ô&Ð&Ø×Ò˜˜3œ Ñ$Ô$Ð$Ø×Ò˜˜3œ Ñ%Ô%Ð%à	�Š‰	Œ	ˆ	Ø×Ò�˜Q™œ Ñ#Ô#Ð#à×Ò˜Ÿš e¨WÑ5Ô5°wÑ?Ô?Ð?Ø×Ò˜˜5œ 7Ñ+Ô+Ð+à×Ò˜Ÿš™œÐ&6Ñ7Ô7Ð7Ø×Ò�˜Q™œ Ñ#Ô#Ð#à—’‘”ˆØ×Ò˜œ E¤MÑ2Ô2Ð2Ø×Ò˜œ E¤MÑ2Ô2Ð2Ð2Ð2r5   c                 óþ   — t           j                              i d¦  «        }|                      |j        j         ||¦  «        ¦  «         d|d<   |                      t          ddi¦  «         ||¦  «        ¦  «         dS )a™  
        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.
        r6   rE   rD   N)r	   rG   ÚassertInÚ	__class__Ú__name__Ústr)r[   ÚstringifierÚdomains      r3   Ú_stringificationTestz,DomainWithDefaultsTests._stringificationTestw   sy   € õ ”×0Ò0°°YÑ?Ô?ˆØ�Š�fÔ&Ô/°°¸VÑ1DÔ1DÑEÔEÐEØˆˆu‰Ø�Š•c˜5 'Ð*Ñ+Ô+¨[¨[¸Ñ-@Ô-@ÑAÔAÐAÐAÐAr5   c                 ó:   — |                       t          ¦  «         dS )z—
        L{DomainWithDefaultDict.__str__} should return a string including
        the class name and the domain mapping held by the instance.
        N)rf   rc   ©r[   s    r3   Útest_strz DomainWithDefaultsTests.test_str†   s   € ð
 	×!Ò!¥#Ñ&Ô&Ð&Ð&Ð&r5   c                 ó:   — |                       t          ¦  «         dS )z˜
        L{DomainWithDefaultDict.__repr__} should return a string including
        the class name and the domain mapping held by the instance.
        N)rf   Úreprrh   s    r3   Ú	test_reprz!DomainWithDefaultsTests.test_repr�   s   € ð
 	×!Ò!¥$Ñ'Ô'Ð'Ð'Ð'r5   c                 ó‚  — t           j                              i d¦  «        }|                     d¦  «         d}|                      | j        g¦  «        }|                      dt          |¦  «        ¦  «         |                      t          |d         d         ¦  «         |                      ||d         d         ¦  «         dS )	z,
        has_key is now deprecated.
        r6   Úanythingzotwisted.mail.mail.DomainWithDefaultDict.has_key was deprecated in Twisted 16.3.0. Use the `in` keyword instead.é   r   ÚcategoryÚmessageN)r	   rG   Úhas_keyÚflushWarningsÚtest_has_keyDeprecationrH   rI   ÚDeprecationWarning)r[   Úsutrq   Úwarningss       r3   rt   z/DomainWithDefaultsTests.test_has_keyDeprecation”   s³   € õ Œi×-Ò-¨b°)Ñ<Ô<ˆà�Š�JÑÔÐð?ð 	ð ×%Ò% tÔ'CÐ&DÑEÔEˆØ×Ò˜�C ™MœMÑ*Ô*Ð*Ø×ÒÕ+¨X°a¬[¸Ô-DÑEÔEÐEØ×Ò˜ (¨1¤+¨iÔ"8Ñ9Ô9Ð9Ð9Ð9r5   N)rb   Ú
__module__Ú__qualname__r   ÚsysÚversion_infor^   rf   ri   rl   rt   r/   r5   r3   r'   r'   =   s„   € € € € € à€VˆCÔ Ò$Ð&>Ñ?Ô?ð53ð 53ñ @Ô?ð53ðnBð Bð Bð'ð 'ð 'ð(ð (ð (ð:ð :ð :ð :ð :r5   r'   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚBounceTestsc                 óL   — t           j                              ¦   «         | _        d S ©N)r	   ÚBounceDomainre   rh   s    r3   ÚsetUpzBounceTests.setUp¨   s   € Ý”i×,Ò,Ñ.Ô.ˆŒˆˆr5   c                 ó\   — |                       t          j        | j        j        d¦  «         d S )Nzany user)ÚassertRaisesr   ÚAddressErrorre   Úexistsrh   s    r3   Ú
testExistszBounceTests.testExists«   s(   € Ø×Ò�$Ô+¨T¬[Ô-?ÀÑLÔLÐLÐLÐLr5   c                 ód   — |                       | j                             dd¦  «        d¦  «         d S )Nzrandom q emailerr   F)rH   re   Ú	willRelayrh   s    r3   Ú	testRelayzBounceTests.testRelay®   s2   € Ø×Ò˜œ×.Ò.Ð/AÀ:ÑNÔNÐPUÑVÔVÐVÐVÐVr5   c                 ó’   — | j                              dd¦  «         |                      t          j        | j         j        d¦  «         d S )NÚbobÚpassword)re   ÚaddUserrƒ   r   ÚSMTPBadRcptr…   rh   s    r3   ÚtestAddUserzBounceTests.testAddUser±   s@   € ØŒ×Ò˜E :Ñ.Ô.Ð.Ø×Ò�$Ô*¨D¬KÔ,>ÀÑFÔFÐFÐFÐFr5   N)rb   rx   ry   r�   r†   r‰   r�   r/   r5   r3   r}   r}   ¦   s[   € € € € € ð/ð /ð /ðMð Mð MðWð Wð WðGð Gð Gð Gð Gr5   r}   c                   ó   — e Zd ZdZd„ ZdS )ÚBounceWithSMTPServerTestsz_
    Tests for L{twisted.mail.mail.BounceDomain} with
    L{twisted.mail.smtp.SMTPServer}.
    c                 ó  — t           j                              ¦   «         }t           j                              ¦   «         }|                     d|¦  «         t           j                             |¦  «        }|                     d¦  «        }t           j                             |dd¦  «        }||_        t          ¦   «         } |j
        |¦  «          |j        d¦  «          |j        d¦  «          |j        d¦  «          |j        d¦  «         |                      |j        ¦  «          |j        d¦  «         |                      |                     ¦   «                              ¦   «                              d¦  «        d         d	¦  «         dS )
zo
        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ÚlineReceivedrS   ÚdisconnectingÚconnectionLostrH   rE   ÚstripÚsplit)r[   Úservicere   Úfactoryr   Ú	delivererÚ	transports          r3   Útest_rejectedz'BounceWithSMTPServerTests.test_rejected½   sn  € õ
 ”)×'Ò'Ñ)Ô)ˆÝ”×'Ò'Ñ)Ô)ˆØ×Ò˜* fÑ-Ô-Ð-å”.×,Ò,¨WÑ5Ô5ˆØ×(Ò(¨Ñ.Ô.ˆå”N×5Ò5°g¸tÀTÑJÔJˆ	Ø%ˆÔå#Ñ%Ô%ˆ	ØˆÔ 	Ñ*Ô*Ð*àˆÔ˜oÑ.Ô.Ð.ØˆÔÐ6Ñ7Ô7Ð7ØˆÔÐ6Ñ7Ô7Ð7ØˆÔ˜gÑ&Ô&Ð&à�Š˜	Ô/Ñ0Ô0Ð0ØˆÔ Ñ%Ô%Ð%à×ÒØ�OŠOÑÔ×#Ò#Ñ%Ô%×+Ò+¨GÑ4Ô4°RÔ8Ø7ñ	
ô 	
ð 	
ð 	
ð 	
r5   N)rb   rx   ry   Ú__doc__r¥   r/   r5   r3   r‘   r‘   ¶   s-   € € € € € ðð ð

ð 
ð 
ð 
ð 
r5   r‘   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚFileMessageTestsc                 óF  — |                       ¦   «         | _        |                       ¦   «         | _        t          | j        d¦  «        | _        |                      | j        j        ¦  «         t          j                             | j        | j        | j        ¦  «        | _	        d S )NÚwb)
ÚmktempÚnameÚfinalÚopenÚfÚ
addCleanupÚcloser	   ÚFileMessageÚfprh   s    r3   r�   zFileMessageTests.setUpß   sn   € Ø—K’K‘M”MˆŒ	Ø—[’[‘]”]ˆŒ
Ý�d”i Ñ&Ô&ˆŒØ�Š˜œœÑ%Ô%Ð%Ý”)×'Ò'¨¬°´	¸4¼:ÑFÔFˆŒˆˆr5   c                 ód   — | j                              ¦   «                              | j        ¦  «        S r   )r³   ÚeomReceivedÚaddCallbackÚ_cbFinalNamerh   s    r3   ÚtestFinalNamezFileMessageTests.testFinalNameæ   s'   € ØŒw×"Ò"Ñ$Ô$×0Ò0°Ô1BÑCÔCÐCr5   c                 óè   — |                       || j        ¦  «         |                      | j        j        ¦  «         |                      t          j                             | j	        ¦  «        ¦  «         d S r   )
rH   r­   rS   r¯   ÚclosedÚassertFalseÚosÚpathr…   r¬   ©r[   Úresults     r3   r·   zFileMessageTests._cbFinalNameé   sZ   € Ø×Ò˜ ¤Ñ,Ô,Ð,Ø�Š˜œœÑ&Ô&Ð&Ø×Ò�œŸš¨¬	Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3r5   c                 óJ  — d}|                      ¦   «         D ]}| j                             |¦  «         Œ| j                             ¦   «          t	          | j        d¦  «        5 }|                      |                     ¦   «         |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nó"   first line
second line
third line
Úrb)Ú
splitlinesr³   rœ   rµ   r®   r­   rH   Úread)r[   ÚcontentsÚliner¯   s       r3   ÚtestContentszFileMessageTests.testContentsî   sà   € Ø;ˆØ×'Ò'Ñ)Ô)ð 	'ð 	'ˆDØŒG× Ò  Ñ&Ô&Ð&Ð&ØŒ×ÒÑÔÐÝ�$”*˜dÑ#Ô#ð 	1 qØ×Ò˜QŸVšV™XœX xÑ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s   Á")BÂBÂBc                 óz  — d}|                      ¦   «         D ]}| j                             |¦  «         Œ| j                             ¦   «          |                      t
          j                             | j        ¦  «        ¦  «         |                      t
          j                             | j	        ¦  «        ¦  «         d S )Nó   first line
second line
)
rÃ   r³   rœ   rž   r»   r¼   r½   r…   r¬   r­   ©r[   rÅ   rÆ   s      r3   ÚtestInterruptedz FileMessageTests.testInterruptedö   s�   € Ø/ˆØ×'Ò'Ñ)Ô)ð 	'ð 	'ˆDØŒG× Ò  Ñ&Ô&Ð&Ð&ØŒ×ÒÑ Ô Ð Ø×Ò�œŸš¨¬	Ñ2Ô2Ñ3Ô3Ð3Ø×Ò�œŸš¨¬
Ñ3Ô3Ñ4Ô4Ð4Ð4Ð4r5   N)rb   rx   ry   r�   r¸   r·   rÇ   rË   r/   r5   r3   r¨   r¨   Ý   se   € € € € € ðGð Gð GðDð Dð Dð4ð 4ð 4ð
1ð 1ð 1ð5ð 5ð 5ð 5ð 5r5   r¨   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚMaildirMessageTestszL
    Tests for the file creating by the L{mail.maildir.MaildirMessage}.
    c                 ó`  — |                       ¦   «         | _        |                       ¦   «         | _        d| _        t	          | j        d¦  «        | _        |                      | j        j        ¦  «         t          j	         
                    | j        | j        | j        | j        ¦  «        | _        dS )z3
        Create and open a temporary file.
        s   user@example.comrª   N)r«   r¬   r­   r
   r®   r¯   r°   r±   r	   ÚmaildirÚMaildirMessager³   rh   s    r3   r�   zMaildirMessageTests.setUp  s€   € ð —K’K‘M”MˆŒ	Ø—[’[‘]”]ˆŒ
Ø*ˆŒÝ�d”i Ñ&Ô&ˆŒØ�Š˜œœÑ%Ô%Ð%Ý”,×-Ò-ØŒL˜$œ& $¤)¨T¬Zñ
ô 
ˆŒˆˆr5   c                 óF   — t          j         | j        › d�¦  «        d         S )zk
        Search for the final file path.

        @rtype: L{str}
        @return: Final file path.
        z	,S=[0-9]*r   )Úglobr­   rh   s    r3   Ú
_finalNamezMaildirMessageTests._finalName  s$   € õ Œy˜DœJÐ1Ð1Ð1Ñ2Ô2°1Ô5Ð5r5   c                 ó„  — |                       | j                             ¦   «         ¦  «        }|                      || j        › dt
          j                             |¦  «        › �¦  «         |                      | j	        j
        ¦  «         |                      t
          j                             | j        ¦  «        ¦  «         dS )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µ   rH   r­   r¼   r½   ÚgetsizerS   r¯   rº   r»   r…   r¬   )r[   r­   s     r3   Útest_finalNamez"MaildirMessageTests.test_finalName  s™   € ð
 ×$Ò$ T¤W×%8Ò%8Ñ%:Ô%:Ñ;Ô;ˆØ×Ò˜ 4¤:Ð JÐ Jµ"´'·/²/À%Ñ2HÔ2HÐ JÐ JÑKÔKÐKØ�Š˜œœÑ&Ô&Ð&Ø×Ò�œŸš¨¬	Ñ2Ô2Ñ3Ô3Ð3Ð3Ð3r5   c                 óz  — d}|                      ¦   «         D ]}| j                             |¦  «         Œ|                      | j                             ¦   «         ¦  «        }t          |d¦  «        5 }|                      |                     ¦   «         d| j        |fz  ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )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®   rH   rÄ   r
   )r[   rÅ   rÆ   r­   r¯   s        r3   Útest_contentsz!MaildirMessageTests.test_contents%  s  € ð
 <ˆØ×'Ò'Ñ)Ô)ð 	'ð 	'ˆDØŒG× Ò  Ñ&Ô&Ð&Ð&Ø×$Ò$ T¤W×%8Ò%8Ñ%:Ô%:Ñ;Ô;ˆÝ�%˜ÑÔð 	 !Ø×ÒØ—’‘”Ð1°T´\À8Ð4LÑLñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   Á03B0Â0B4Â7B4c                 óL  — d}|                      ¦   «         D ]}| j                             |¦  «         Œ| j                             ¦   «          |                      t
          j                             | j        ¦  «        ¦  «         |  	                    t          | j        ¦  «         dS )zƒ
        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      r3   Útest_interruptedz$MaildirMessageTests.test_interrupted3  s“   € ð
 0ˆØ×'Ò'Ñ)Ô)ð 	'ð 	'ˆDØŒG× Ò  Ñ&Ô&Ð&Ð&ØŒ×ÒÑ Ô Ð Ø×Ò�œŸš¨¬	Ñ2Ô2Ñ3Ô3Ð3Ø×Ò�* d¤oÑ6Ô6Ð6Ð6Ð6r5   N)	rb   rx   ry   r¦   r�   rÓ   r×   rÙ   rÜ   r/   r5   r3   rÍ   rÍ   ÿ   si   € € € € € ðð ð
ð 
ð 
ð6ð 6ð 6ð4ð 4ð 4ðð ð ð
7ð 
7ð 
7ð 
7ð 
7r5   rÍ   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚMailServiceTestsc                 óL   — t           j                              ¦   «         | _        d S r   )r	   r”   r¡   rh   s    r3   r�   zMailServiceTests.setUpB  s   € Ý”y×,Ò,Ñ.Ô.ˆŒˆˆr5   c                 óÜ  — | j                              ¦   «         }|                      t          |t          j        ¦  «        ¦  «         |                      |                     d¦  «        t          j        ¦  «         | j          	                    ¦   «         }|                      t          |t          j        ¦  «        ¦  «         |                      |                     d¦  «        t          j        ¦  «         | j                              ¦   «         }|                      t          |t          j        ¦  «        ¦  «         |                      |                     d¦  «        t          j        ¦  «         d S )N)ú	127.0.0.1é90  )r¡   ÚgetPOP3FactoryrS   Ú
isinstancer   ÚServerFactoryr˜   r   ÚPOP3ÚgetSMTPFactoryr   ÚSMTPÚgetESMTPFactoryÚESMTP)r[   r¯   s     r3   ÚtestFactorieszMailServiceTests.testFactoriesE  s  € ØŒL×'Ò'Ñ)Ô)ˆØ�Š�
 1¥hÔ&<Ñ=Ô=Ñ>Ô>Ð>Ø�Š˜ŸšÐ(<Ñ=Ô=½t¼yÑIÔIÐIàŒL×'Ò'Ñ)Ô)ˆØ�Š�
 1¥hÔ&<Ñ=Ô=Ñ>Ô>Ð>Ø�Š˜ŸšÐ(<Ñ=Ô=½t¼yÑIÔIÐIàŒL×(Ò(Ñ*Ô*ˆØ�Š�
 1¥hÔ&<Ñ=Ô=Ñ>Ô>Ð>Ø�Š˜ŸšÐ(<Ñ=Ô=½t¼zÑJÔJÐJÐJÐJr5   c                 ó4  — t          ¦   «         }t          ¦   «         }|| j        j        d<   || j        j        d<   |                      | j                             d¦  «        |u ¦  «         |                      | j                             ¦   «         |u ¦  «         d S )Nre   Ú )Úobjectr¡   ÚportalsrS   ÚlookupPortalÚdefaultPortal)r[   Úo1Úo2s      r3   ÚtestPortalszMailServiceTests.testPortalsR  s„   € Ý‰XŒXˆÝ‰XŒXˆØ)+ˆŒÔ˜XÑ&Ø#%ˆŒÔ˜RÑ à�Š˜œ×1Ò1°(Ñ;Ô;¸rÐAÑBÔBÐBØ�Š˜œ×2Ò2Ñ4Ô4¸Ð:Ñ;Ô;Ð;Ð;Ð;r5   N)rb   rx   ry   r�   rë   rô   r/   r5   r3   rÞ   rÞ   @  sD   € € € € € ð/ð /ð /ðKð Kð Kð<ð <ð <ð <ð <r5   rÞ   c                   ó¨   — e Zd ZdZd„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Z	 eej        dk    d¦  «        d„ ¦   «         Z
d„ Zd	„ Zd
„ ZdS )ÚStringListMailboxTestszc
    Tests for L{StringListMailbox}, an in-memory only implementation of
    L{pop3.IMailbox}.
    c                 ó>  — t           j                             g d¢¦  «        }|                      |                     d¦  «        d¦  «         |                      |                     d¦  «        d¦  «         |                      |                     d¦  «        d¦  «         dS )zŠ
        L{StringListMailbox.listMessages} returns the length of the message at
        the offset into the mailbox passed to it.
        )ÚabcÚabrA   r   r)   ro   r<   N©r	   rÏ   ÚStringListMailboxrH   ÚlistMessages©r[   Úmailboxs     r3   Útest_listOneMessagez*StringListMailboxTests.test_listOneMessagec  s’   € õ
 ”,×0Ò0Ð1CÐ1CÐ1CÑDÔDˆØ×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ð4Ð4r5   c                 óœ   — t           j                             g d¢¦  «        }|                      |                     ¦   «         g d¢¦  «         dS )z�
        L{StringListMailbox.listMessages} returns a list of the lengths of all
        messages if not passed an index.
        )rA   rø   rù   )ro   r)   r<   Nrú   rý   s     r3   Útest_listAllMessagesz+StringListMailboxTests.test_listAllMessagesm  sL   € õ
 ”,×0Ò0Ð1CÐ1CÐ1CÑDÔDˆØ×Ò˜×-Ò-Ñ/Ô/°°°Ñ;Ô;Ð;Ð;Ð;r5   r(   r*   c                 ó¾   — t           j                             ddg¦  «        }|                      |                     d¦  «                             ¦   «         d¦  «         dS )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û   rH   Ú
getMessagerÄ   rý   s     r3   Útest_getMessagez&StringListMailboxTests.test_getMessageu  sT   € õ ”,×0Ò0°%¸Ð1IÑJÔJˆØ×Ò˜×+Ò+¨AÑ.Ô.×3Ò3Ñ5Ô5°ÑGÔGÐGÐGÐGr5   c                 óÀ   — t           j                             ddg¦  «        }|                      |                     d¦  «        |                     d¦  «        ¦  «         dS )zˆ
        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     r3   Útest_getUidlz#StringListMailboxTests.test_getUidl  sQ   € õ ”,×0Ò0°%¸°Ñ@Ô@ˆØ×Ò˜GŸOšO¨AÑ.Ô.°·²ÀÑ0BÔ0BÑCÔCÐCÐCÐCr5   c                 ó  — t           j                             dg¦  «        }|                     d¦  «         |                      |                     d¦  «        d¦  «         |                      |                     ¦   «         dg¦  «         dS )zŽ
        L{StringListMailbox.deleteMessage} marks a message for deletion causing
        further requests for its length to return 0.
        r  r   N)r	   rÏ   rû   ÚdeleteMessagerH   rü   rý   s     r3   Útest_deleteMessagez)StringListMailboxTests.test_deleteMessageˆ  s}   € õ
 ”,×0Ò0°%°Ñ9Ô9ˆØ×Ò˜aÑ Ô Ð Ø×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜×-Ò-Ñ/Ô/°!°Ñ5Ô5Ð5Ð5Ð5r5   c                 ó<  — t           j                             dg¦  «        }|                     d¦  «         |                     ¦   «          |                      |                     d¦  «        d¦  «         |                      |                     ¦   «         dg¦  «         dS )z�
        L{StringListMailbox.undeleteMessages} causes any messages marked for
        deletion to be returned to their original state.
        r  r   r)   N)r	   rÏ   rû   r  ÚundeleteMessagesrH   rü   rý   s     r3   Útest_undeleteMessagesz,StringListMailboxTests.test_undeleteMessages’  s�   € õ
 ”,×0Ò0°%°Ñ9Ô9ˆØ×Ò˜aÑ Ô Ð Ø× Ò Ñ"Ô"Ð"Ø×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜×-Ò-Ñ/Ô/°!°Ñ5Ô5Ð5Ð5Ð5r5   c                 ód  — t           j                             dg¦  «        }|                     d¦  «         |                     ¦   «          |                     ¦   «          |                      |                     d¦  «        d¦  «         |                      |                     ¦   «         dg¦  «         dS )zy
        L{StringListMailbox.sync} causes any messages as marked for deletion to
        be permanently deleted.
        r  r   N)r	   rÏ   rû   r  Úsyncr  rH   rü   rý   s     r3   Ú	test_syncz StringListMailboxTests.test_sync�  sœ   € õ
 ”,×0Ò0°%°Ñ9Ô9ˆØ×Ò˜aÑ Ô Ð Ø�Š‰ŒˆØ× Ò Ñ"Ô"Ð"Ø×Ò˜×-Ò-¨aÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜×-Ò-Ñ/Ô/°!°Ñ5Ô5Ð5Ð5Ð5r5   N)rb   rx   ry   r¦   rÿ   r  r   rz   r{   r  r
  r  r  r  r/   r5   r3   rö   rö   \  sÓ   € € € € € ðð ð
5ð 5ð 5ð<ð <ð <ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðHð Hñ @Ô?ðHð €VˆCÔ Ò$Ð&>Ñ?Ô?ðDð Dñ @Ô?ðDð6ð 6ð 6ð	6ð 	6ð 	6ð
6ð 
6ð 
6ð 
6ð 
6r5   rö   c                   ó,   — e Zd ZdZdZdZd„ Zd„ Zd„ ZdS )Ú&FailingMaildirMailboxAppendMessageTaskTc                 óp   — | j         rt          j        |||¦  «        S t          t          j        d¦  «        ‚©NzFaked Permission Problem)Ú
_openstater¼   r®   ÚOSErrorÚerrnoÚEPERM)r[   ÚfnÚattrÚmodes       r3   Úosopenz-FailingMaildirMailboxAppendMessageTask.osopen²  s4   € ØŒ?ð 	CÝ”7˜2˜t TÑ*Ô*Ð*å�%œ+Ð'AÑBÔBÐBr5   c                 ón   — | j         rt          j        ||¦  «        S t          t          j        d¦  «        ‚)NzFaked Space problem)Ú_writestater¼   Úwriter  r  ÚENOSPC)r[   ÚfhÚdatas      r3   Úoswritez.FailingMaildirMailboxAppendMessageTask.oswrite¸  s2   € ØÔð 	?Ý”8˜B Ñ%Ô%Ð%å�%œ,Ð(=Ñ>Ô>Ð>r5   c                 ón   — | j         rt          j        ||¦  «        S t          t          j        d¦  «        ‚r  )Ú_renamestater¼   Úrenamer  r  r  )r[   ÚoldnameÚnewnames      r3   Úosrenamez/FailingMaildirMailboxAppendMessageTask.osrename¾  s3   € ØÔð 	CÝ”9˜W gÑ.Ô.Ð.å�%œ+Ð'AÑBÔBÐBr5   N)	rb   rx   ry   r  r!  r(  r  r&  r,  r/   r5   r3   r  r  ª  sZ   € € € € € ð €JØ€KØ€LðCð Cð Cð?ð ?ð ?ðCð Cð Cð Cð Cr5   r  c                   ó   — e Zd ZdZd„ ZdS )Ú_AppendTestMixinz�
    Mixin for L{MaildirMailbox.appendMessage} test cases which defines a helper
    for serially appending multiple messages to a mailbox.
    c                 óª   ‡‡‡— g Šˆˆˆfd„}t          j         |¦   «         ¦  «                             ¦   «         }|                     ˆfd„¦  «         |S )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               3   ó|   •K  — ‰D ]5} ‰                      | ¦  «        }|                     ‰j        ¦  «         |V — Œ6d S r   )ÚappendMessager¶   Úappend)Úmr\   ÚmboxÚmessagesÚresultss     €€€r3   r2  z0_AppendTestMixin._appendMessages.<locals>.appendÓ  sR   øè è € Øð ð �Ø×&Ò& qÑ)Ô)�Ø—’˜gœnÑ-Ô-Ð-Ø����ðð r5   c                 ó   •— ‰S r   r/   )Úignoredr6  s    €r3   ú<lambda>z2_AppendTestMixin._appendMessages.<locals>.<lambda>Ú  s   ø€  g€ r5   )r   Ú	cooperateÚwhenDoner¶   )r[   r4  r5  r2  r\   r6  s    ``  @r3   Ú_appendMessagesz _AppendTestMixin._appendMessagesË  ss   øøø€ ð ˆð	ð 	ð 	ð 	ð 	ð 	ð 	õ ŒN˜6˜6™8œ8Ñ$Ô$×-Ò-Ñ/Ô/ˆØ	�ŠÐ-Ð-Ð-Ð-Ñ.Ô.Ð.Øˆr5   N)rb   rx   ry   r¦   r<  r/   r5   r3   r.  r.  Å  s-   € € € € € ðð ð
ð ð ð ð r5   r.  c                   óh   — e Zd ZdZd„ Zd„ Zd
d„Z eej	        dk    d¦  «        d„ ¦   «         Z
d	„ ZdS )ÚMaildirAppendStringTestsúO
    Tests for L{MaildirMailbox.appendMessage} when invoked with a C{str}.
    c                 ó€   — |                       ¦   «         | _        t          j                             | j        ¦  «         d S r   ©r«   r\   r	   rÏ   ÚinitializeMaildirrh   s    r3   r�   zMaildirAppendStringTests.setUpä  ó/   € Ø—’‘”ˆŒÝŒ×&Ò& t¤vÑ.Ô.Ð.Ð.Ð.r5   c                 ób   — |                      d¦  «        }|                      |t          ¦  «        S )NÚTEST)r1  ÚassertFailureÚ	Exception©r[   r8  r4  r\   s       r3   Ú_appendz MaildirAppendStringTests._appendè  s+   € Ø×Ò˜vÑ&Ô&ˆØ×!Ò! !¥YÑ/Ô/Ð/r5   Nc                 óf  — |�8|                       t          |j        d|j        j        ¦  «         ||j        _        |�8|                       t          |j        d|j        j        ¦  «         ||j        _        |�:|                       t          |j        d|j        j        ¦  «         ||j        _        dS dS )aÞ  
        Change the behavior of future C{rename}, C{write}, or C{open} calls made
        by the mailbox C{mbox}.

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

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

        @param open: Like C{rename}, but for the C{_openstate} attribute.
        Nr(  r!  r  )r°   ÚsetattrÚAppendFactoryr(  r!  r  )r[   r8  r4  r)  r"  r®   s         r3   Ú	_setStatez"MaildirAppendStringTests._setStateì  sÉ   € ð ÐØ�OŠOÝØÔ"ØØÔ"Ô/ñ	ô ð ð /5ˆDÔÔ+ØÐØ�OŠOÝØÔ"ØØÔ"Ô.ñ	ô ð ð .3ˆDÔÔ*ØÐØ�OŠOÝ˜Ô+¨\¸4Ô;MÔ;Xñô ð ð -1ˆDÔÔ)Ð)Ð)ð	 Ðr5   r(   r*   c                 ó6  — t           j                             | j        ¦  «        }t          |_        |                      |d„ t          dd¦  «        D ¦   «         ¦  «        }|                     | j	        dgdz  ¦  «         |                     | j
        |¦  «         |S )ú–
        L{MaildirMailbox.appendMessage} returns a L{Deferred} which fires when
        the message has been added to the end of the mailbox.
        c                 ó   — g | ]}d |z  ‘ŒS )ÚXr/   )r1   Úis     r3   r8   z8MaildirAppendStringTests.test_append.<locals>.<listcomp>  s   € Ð'FÐ'FÐ'F°A¨¨a©Ð'FÐ'FÐ'Fr5   ro   é   Nr.   )r	   rÏ   ÚMaildirMailboxr\   r  rL  r<  rF   r¶   rH   Ú_cbTestAppend)r[   r4  r\   s      r3   Útest_appendz$MaildirAppendStringTests.test_append  sˆ   € õ Œ|×*Ò*¨4¬6Ñ2Ô2ˆÝCˆÔà× Ò  Ð'FÐ'F½¸qÀ"¹¼Ð'FÑ'FÔ'FÑGÔGˆØ	�Š�dÔ&¨¨°©Ñ4Ô4Ð4Ø	�Š�dÔ(¨$Ñ/Ô/Ð/Øˆr5   c           	      ó€  ‡— |                       t          ‰                     ¦   «         ¦  «        d¦  «         |                       ˆfd„t          d¦  «        D ¦   «         t	          t          dd¦  «        ¦  «        ¦  «         |                      d‰d¬¦  «         |                      d‰¦  «        }|                     | j        ‰dd¬	¦  «         |                     | j        ‰¦  «         |                     | j        ‰dd¬
¦  «         |                     | j        ‰¦  «         |                     | j        ‰d¬¦  «         |S )úÛ
        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.
        r.   c                 óx   •— g | ]6}t          ‰                     |¦  «                             ¦   «         ¦  «        ‘Œ7S r/   ©rI   r  rÄ   ©r1   rR  r4  s     €r3   r8   z:MaildirAppendStringTests._cbTestAppend.<locals>.<listcomp>%  ó9   ø€ Ð?Ð?Ð?°�S�—’ Ñ#Ô#×(Ò(Ñ*Ô*Ñ+Ô+Ð?Ð?Ð?r5   ro   rS  NF)r)  T)r)  r"  )r"  r®   )r®   )rH   rI   rü   rF   rJ   rM  rI  r¶   rH  s     ` r3   rU  z&MaildirAppendStringTests._cbTestAppend  s&  ø€ ð 	×Ò�˜T×.Ò.Ñ0Ô0Ñ1Ô1°2Ñ6Ô6Ð6Ø×ÒØ?Ð?Ð?Ð?µU¸2±Y´YÐ?Ñ?Ô?ÅÅeÈAÈrÁlÄlÑASÔASñ	
ô 	
ð 	
ð 	�Š�t˜T¨%ˆÑ0Ô0Ð0Ø�LŠL˜˜tÑ$Ô$ˆØ	�Š�d”n d°4¸uˆÑEÔEÐEØ	�Š�d”l DÑ)Ô)Ð)Ø	�Š�d”n d°$¸UˆÑCÔCÐCØ	�Š�d”l DÑ)Ô)Ð)Ø	�Š�d”n d°ˆÑ6Ô6Ð6Øˆr5   )NNN)rb   rx   ry   r¦   r�   rI  rM  r   rz   r{   rV  rU  r/   r5   r3   r>  r>  Þ  s’   € € € € € ðð ð/ð /ð /ð0ð 0ð 0ð!1ð !1ð !1ð !1ðF €VˆCÔ Ò$Ð&>Ñ?Ô?ðð ñ @Ô?ððð ð ð ð r5   r>  c                   óZ   — e Zd ZdZd„ Z eej        dk    d¦  «        d„ ¦   «         Zd„ Z	dS )ÚMaildirAppendFileTestsr?  c                 ó€   — |                       ¦   «         | _        t          j                             | j        ¦  «         d S r   rA  rh   s    r3   r�   zMaildirAppendFileTests.setUp8  rC  r5   r(   r*   c                 óº  — t           j                             | j        ¦  «        }g }t	          dd¦  «        D ]r}t          j        ¦   «         }|                     d|z  ¦  «         |                     dd¦  «         | 	                    |¦  «         |  
                    |j        ¦  «         Œs|                      ||¦  «        }|                     | j        |¦  «         |S )rO  ro   rS  rQ  r   )r	   rÏ   rT  r\   rF   ÚtempfileÚTemporaryFiler"  Úseekr2  r°   r±   r<  r¶   rU  )r[   r4  r5  rR  Útempr\   s         r3   rV  z"MaildirAppendFileTests.test_append<  sÆ   € õ Œ|×*Ò*¨4¬6Ñ2Ô2ˆØˆÝ�q˜"‘”ð 	(ð 	(ˆAÝÔ)Ñ+Ô+ˆDØ�JŠJ�s˜Q‘wÑÔÐØ�IŠI�a˜‰OŒOˆOØ�OŠO˜DÑ!Ô!Ð!Ø�OŠO˜DœJÑ'Ô'Ð'Ð'à× Ò   xÑ0Ô0ˆØ	�Š�dÔ(¨$Ñ/Ô/Ð/Øˆr5   c           	      ó  ‡— |                       t          ‰                     ¦   «         ¦  «        d¦  «         |                       ˆfd„t          d¦  «        D ¦   «         t	          t          dd¦  «        ¦  «        ¦  «         dS )rX  r.   c                 óx   •— g | ]6}t          ‰                     |¦  «                             ¦   «         ¦  «        ‘Œ7S r/   rZ  r[  s     €r3   r8   z8MaildirAppendFileTests._cbTestAppend.<locals>.<listcomp>W  r\  r5   ro   rS  N)rH   rI   rü   rF   rJ   )r[   r¿   r4  s     `r3   rU  z$MaildirAppendFileTests._cbTestAppendO  s€   ø€ ð 	×Ò�˜T×.Ò.Ñ0Ô0Ñ1Ô1°2Ñ6Ô6Ð6Ø×ÒØ?Ð?Ð?Ð?µU¸2±Y´YÐ?Ñ?Ô?ÅÅeÈAÈrÁlÄlÑASÔASñ	
ô 	
ð 	
ð 	
ð 	
r5   N)
rb   rx   ry   r¦   r�   r   rz   r{   rV  rU  r/   r5   r3   r^  r^  2  sn   € € € € € ðð ð/ð /ð /ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðð ñ @Ô?ðð$	
ð 	
ð 	
ð 	
ð 	
r5   r^  c                   ób   — e Zd Zd„ Zd„ Zd„ Zd„ Z eej	        dk    d¦  «        d„ ¦   «         Z
dS )	ÚMaildirTestsc                 ó€   — |                       ¦   «         | _        t          j                             | j        ¦  «         d S r   rA  rh   s    r3   r�   zMaildirTests.setUp]  rC  r5   c                 ó8   — t          j        | j        ¦  «         d S r   )ÚshutilÚrmtreer\   rh   s    r3   ÚtearDownzMaildirTests.tearDowna  s   € ÝŒ�d”fÑÔÐÐÐr5   c                 óv  — | j         }t          j                             |d¦  «        }|                      t          j                             |¦  «        ot          j                             |¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         |                      t          j                             t          j                             |d¦  «        ¦  «        ¦  «         d S )Nú.TrashÚnewÚcurÚtmp)r\   r¼   r½   ÚjoinrS   r…   Úisdir)r[   r\   Útrashs      r3   ÚtestInitializerzMaildirTests.testInitializerd  s—  € ØŒFˆÝ”—’˜Q Ñ)Ô)ˆà�Š�œŸš qÑ)Ô)Ð>­b¬g¯mªm¸AÑ.>Ô.>Ñ?Ô?Ð?Ø�Š�œŸš¥r¤w§|¢|°A°uÑ'=Ô'=Ñ>Ô>Ñ?Ô?Ð?Ø�Š�œŸš¥r¤w§|¢|°A°uÑ'=Ô'=Ñ>Ô>Ñ?Ô?Ð?Ø�Š�œŸš¥r¤w§|¢|°A°uÑ'=Ô'=Ñ>Ô>Ñ?Ô?Ð?Ø�Š�œŸš¥b¤g§l¢l°1°eÑ&<Ô&<Ñ=Ô=Ñ>Ô>Ð>Ø�Š�œŸš¥b¤g§l¢l°1°eÑ&<Ô&<Ñ=Ô=Ñ>Ô>Ð>Ø�Š�œŸš¥b¤g§l¢l°1°eÑ&<Ô&<Ñ=Ô=Ñ>Ô>Ð>à�Š�œŸš¥r¤w§|¢|°E¸5Ñ'AÔ'AÑBÔBÑCÔCÐCØ�Š�œŸš¥r¤w§|¢|°E¸5Ñ'AÔ'AÑBÔBÑCÔCÐCØ�Š�œŸš¥r¤w§|¢|°E¸5Ñ'AÔ'AÑBÔBÑCÔCÐCØ�Š�œŸš¥b¤g§l¢l°5¸%Ñ&@Ô&@ÑAÔAÑBÔBÐBØ�Š�œŸš¥b¤g§l¢l°5¸%Ñ&@Ô&@ÑAÔAÑBÔBÐBØ�Š�œŸš¥b¤g§l¢l°5¸%Ñ&@Ô&@ÑAÔAÑBÔBÐBÐBÐBr5   c                 ó@  — t          j        ¦   «         }|                     d¦  «         t          j                             |¦  «        }|                     ¦   «         }|                     d¦  «         |                     ¦   «         }|                      ||k     ¦  «         dS )a  
        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ÚgeneraterS   )r[   ÚclockÚ	generatorÚ	firstNameÚ
secondNames        r3   Útest_nameGeneratorzMaildirTests.test_nameGeneratorw  s‡   € õ ”
‘”ˆØ�Š�dÑÔÐÝ”L×6Ò6°uÑ=Ô=ˆ	à×&Ò&Ñ(Ô(ˆ	Ø�Š�dÑÔÐØ×'Ò'Ñ)Ô)ˆ
à�Š˜	 JÒ.Ñ/Ô/Ð/Ð/Ð/r5   r(   r*   c           
      óx  ‡	‡
— t           j        j        Š	t          j        j        Š
ˆ	ˆ
fd„dD ¦   «         }d}|D ]V}t           ‰	| j        |¦  «        d¦  «        5 }|                     d|z  ¦  «         ddd¦  «         n# 1 swxY w Y   |dz   }ŒWt          j         	                    | j        ¦  «        }|  
                    |                     ¦   «         t          t          dd¦  «        ¦  «        ¦  «         |  
                    |                     d¦  «        d¦  «         |  
                    |                     d	¦  «        d
¦  «         |  
                    |                     d
¦  «                             ¦   «         d¦  «         |  
                    |                     d¦  «                             ¦   «         d¦  «         i }t          d¦  «        D ]3}|                     |¦  «        }|                      ||v ¦  «         d||<   Œ4t           j                             |d	         ¦  «        \  }}|                     d	¦  «         |  
                    |                     d	¦  «        d¦  «         |                      t           j                              ‰	| j        dd|¦  «        ¦  «        ¦  «         |                      t           j                              ‰	| j        |d	         ¦  «        ¦  «        ¦  «         |                     ¦   «          |  
                    |                     d	¦  «        d
¦  «         |                      t           j                              ‰	| j        dd|¦  «        ¦  «        ¦  «         |                      t           j                              ‰	| j        |d	         ¦  «        ¦  «        ¦  «         dS )zb
        Exercise the methods of L{IMailbox} as implemented by
        L{MaildirMailbox}.
        c                 ó\   •— g | ](}t          d ¦  «        D ]} ‰| ‰¦   «         ¦  «        ‘ŒŒ)S )é   )rF   )r1   rB   r2   ÚjÚns      €€r3   r8   z-MaildirTests.test_mailbox.<locals>.<listcomp>�  s<   ø€ ÐDÐDÐD˜a½5À¹8¼8ÐDÐD°a���!�Q�Q‘S”S‘	”	ÐDÐDÐDÐDr5   )rq  rp  ro   Úwr2   NrS  r<   rƒ  r>   ÚxxxxxxxÚxxr.   r   ro  rq  )r¼   r½   rs  r	   rÏ   Ú_generateMaildirNamer®   r\   r"  rT  rH   rü   rJ   rF   r  rÄ   r	  r»   r    r  rS   r…   r  )r[   ÚmsgsrR  r¯   ÚfObjÚmbr\   ÚuÚpr„  r…  s            @@r3   Útest_mailboxzMaildirTests.test_mailboxˆ  sd  øø€ õ ŒGŒLˆÝŒLÔ-ˆØDÐDÐDÐDÐD >ÐDÑDÔDˆð ˆØð 	ð 	ˆAÝ�a�a˜œ ‘l”l CÑ(Ô(ð $¨DØ—
’
˜3 ™7Ñ#Ô#Ð#ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $à�A‘ˆAˆAåŒ\×(Ò(¨¬Ñ0Ô0ˆØ×Ò˜ŸšÑ*Ô*­Dµ°q¸"±´Ñ,>Ô,>Ñ?Ô?Ð?Ø×Ò˜Ÿš¨Ñ+Ô+¨QÑ/Ô/Ð/Ø×Ò˜Ÿš¨Ñ+Ô+¨QÑ/Ô/Ð/à×Ò˜Ÿš qÑ)Ô)×.Ò.Ñ0Ô0°'Ñ:Ô:Ð:Ø×Ò˜Ÿš qÑ)Ô)×.Ò.Ñ0Ô0°'Ñ:Ô:Ð:àˆÝ�r‘”ð 	ð 	ˆAØ—
’
˜1‘”ˆAØ×Ò˜Q !˜VÑ$Ô$Ð$ØˆAˆa‰DˆDåŒw�}Š}˜T !œWÑ%Ô%‰ˆˆ1à
×Ò˜ÑÔÐØ×Ò˜Ÿš¨Ñ+Ô+¨QÑ/Ô/Ð/Ø�Š�œŸš q q¨¬°¸5À!Ñ'DÔ'DÑEÔEÑFÔFÐFØ×Ò�œŸš¨¨¨$¬&°$°q´'Ñ(:Ô(:Ñ;Ô;Ñ<Ô<Ð<à
×ÒÑÔÐØ×Ò˜Ÿš¨Ñ+Ô+¨QÑ/Ô/Ð/Ø×Ò�œŸš¨¨¨$¬&°(¸EÀ1Ñ(EÔ(EÑFÔFÑGÔGÐGØ�Š�œŸš q q¨¬°°a´Ñ'9Ô'9Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;s   ÁA>Á>B	ÂB	N)rb   rx   ry   r�   rm  rv  r€  r   rz   r{   r�  r/   r5   r3   rh  rh  [  s…   € € € € € ð/ð /ð /ðð ð ðCð Cð Cð&0ð 0ð 0ð" €VˆCÔ Ò$Ð&>Ñ?Ô?ð(<ð (<ñ @Ô?ð(<ð (<ð (<r5   rh  c                   ó   — e Zd ZdZd„ ZdS )ÚAbstractMaildirDomainTestszB
    Tests for L{twisted.mail.maildir.AbstractMaildirDomain}.
    c                 ób   — t          t          j        j        t          j        j        ¦  «         dS )zW
        L{maildir.AbstractMaildirDomain} implements L{mail.IAliasableDomain}.
        N)r   r	   ÚIAliasableDomainrÏ   ÚAbstractMaildirDomainrh   s    r3   Útest_interfacez)AbstractMaildirDomainTests.test_interfaceº  s$   € õ 	•D”IÔ.µ´Ô0RÑSÔSÐSÐSÐSr5   N)rb   rx   ry   r¦   r•  r/   r5   r3   r‘  r‘  ´  s2   € € € € € ðð ðTð Tð Tð Tð Tr5   r‘  c                   ó  — e Zd ZdZd„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Z	d„ Z
 eej        dk    d¦  «        d„ ¦   «         Z eej        dk    d¦  «        d	„ ¦   «         Z eej        dk    d¦  «        d
„ ¦   «         ZdS )ÚMaildirDirdbmDomainTestsz+
    Tests for L{MaildirDirdbmDomain}.
    c                 óÜ   — |                       ¦   «         | _        t          j                             ¦   «         | _        t          j                             | j        | j        ¦  «        | _        dS )zw
        Create a temporary L{MaildirDirdbmDomain} and parent
        L{MailService} before running each test.
        N)r«   ÚPr	   r”   ÚSrÏ   ÚMaildirDirdbmDomainÚDrh   s    r3   r�   zMaildirDirdbmDomainTests.setUpÇ  sI   € ð
 —’‘”ˆŒÝ”×&Ò&Ñ(Ô(ˆŒÝ”×1Ò1°$´&¸$¼&ÑAÔAˆŒˆˆr5   c                 ó8   — t          j        | j        ¦  «         dS )z_
        Remove the temporary C{maildir} directory when the test has
        finished.
        N)rk  rl  r™  rh   s    r3   rm  z!MaildirDirdbmDomainTests.tearDownÐ  s   € õ
 	Œ�d”fÑÔÐÐÐr5   r(   r*   c           	      ó˜  — d}|D ] \  }}| j                              ||¦  «         Œ!|D ]¡\  }}|                      || j         j        v ¦  «         |                      | j         j        |         |¦  «         |                      t
          j                             t
          j                             | j	        |¦  «        ¦  «        ¦  «         Œ¢dS )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�   rS   ÚdbmrH   r¼   r½   r…   rs  r™  )r[   ÚtoAddr�  rŽ  s       r3   Útest_addUserz%MaildirDirdbmDomainTests.test_addUser×  sÄ   € ð JˆØð 	!ð 	!‰DˆAˆqØŒF�NŠN˜1˜aÑ Ô Ð Ð àð 	Eð 	E‰DˆAˆqØ�OŠO˜A ¤¤˜OÑ,Ô,Ð,Ø×Ò˜TœVœZ¨œ]¨AÑ.Ô.Ð.Ø�OŠO�BœGŸNšN­2¬7¯<ª<¸¼ÀÑ+BÔ+BÑCÔCÑDÔDÐDÐDð	Eð 	Er5   c                 óZ  — | j                              ¦   «         }|                      t          |¦  «        d¦  «         |                      t
          j        j                             |d         ¦  «        ¦  «         |                      t
          j	        j
        |d         j        v ¦  «         dS )zŽ
        L{MaildirDirdbmDomain.getCredentialsCheckers} initializes and
        returns one L{ICredentialsChecker} checker by default.
        ro   r   N)rœ  ÚgetCredentialsCheckersrH   rI   rS   r   ÚcheckersÚICredentialsCheckerÚ
providedByÚcredentialsÚIUsernamePasswordÚcredentialInterfaces)r[   Úcredss     r3   Útest_credentialsz)MaildirDirdbmDomainTests.test_credentialsç  s‘   € ð
 ”×-Ò-Ñ/Ô/ˆà×Ò�˜U™œ QÑ'Ô'Ð'Ø�Š�œÔ9×DÒDÀUÈ1ÄXÑNÔNÑOÔOÐOØ�ŠÝÔÔ.°%¸´(Ô2OÐOñ	
ô 	
ð 	
ð 	
ð 	
r5   c                 ó"  —  G d„ dt           ¦  «        }| j                             dd¦  «         |                      t          | j        j        dd|¦  «         | j                             ddt          j        ¦  «        }|                      t          |¦  «        d¦  «         |  
                    |d         t          j        u ¦  «         |  
                    t          j                             |d         ¦  «        ¦  «          |d	         ¦   «          dS )
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                   ó   — e Zd ZdS )ú?MaildirDirdbmDomainTests.test_requestAvatar.<locals>.ISomethingN)rb   rx   ry   r/   r5   r3   Ú
ISomethingr´  þ  s   € € € € € ØˆDr5   rµ  ÚuserrŒ   Nr)   r   ro   r<   )r   rœ  r�   rƒ   ÚNotImplementedErrorÚrequestAvatarr   ÚIMailboxrH   rI   rS   r¬  )r[   rµ  Úts      r3   Útest_requestAvatarz+MaildirDirdbmDomainTests.test_requestAvatarô  sû   € ð	ð 	ð 	ð 	ð 	�ñ 	ô 	ð 	ð 	Œ�Š�v˜zÑ*Ô*Ð*Ø×ÒÝ ¤Ô!5°v¸tÀZñ	
ô 	
ð 	
ð ŒF× Ò  ¨­t¬}Ñ=Ô=ˆØ×Ò�˜Q™œ Ñ#Ô#Ð#Ø�Š˜˜!œ¥¤Ð-Ñ.Ô.Ð.Ø�Š�œ×0Ò0°°1´Ñ6Ô6Ñ7Ô7Ð7àˆˆ!Œ‰Œˆˆˆr5   c                 ó¢  — | j                              dd¦  «         | j                              ¦   «         d         }t          j                             dd¦  «        }|                      t          j        j        |j	        |¦  «         t          j                             dd¦  «        }|  
                    | 	                    |¦  «        d¦  «         dS )a  
        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   úwrong passwordN)rœ  r�   r©  r   r­  ÚUsernamePasswordrƒ   ÚerrorÚUnauthorizedLoginÚrequestAvatarIdrH   )r[   Údatabaser°  s      r3   Útest_requestAvatarIdz-MaildirDirdbmDomainTests.test_requestAvatarId  s®   € ð 	Œ�Š�v˜zÑ*Ô*Ð*Ø”6×0Ò0Ñ2Ô2°1Ô5ˆåÔ ×1Ò1°&Ð:JÑKÔKˆØ×Ò�$œ*Ô6¸Ô8PÐRWÑXÔXÐXåÔ ×1Ò1°&¸*ÑEÔEˆØ×Ò˜×1Ò1°%Ñ8Ô8¸&ÑAÔAÐAÐAÐAr5   c                 ó   — | j                              dd¦  «         |                      | j                              d¦  «        t          j                             | j         j        d¦  «        ¦  «         d| j         _        |  	                    | j                              d¦  «        d¦  «         d| j         _        |                      | j                              d¦  «        t          j                             | j         j        d¦  «        ¦  «         dS )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.
        r¶  rŒ   FÚnouserNTÚ
postmaster)
rœ  r�   rH   ÚuserDirectoryr¼   r½   rs  ÚrootrÆ  ÚassertIdenticalrh   s    r3   Útest_userDirectoryz+MaildirDirdbmDomainTests.test_userDirectory  sâ   € ð 	Œ�Š�v˜zÑ*Ô*Ð*Ø×ÒØŒF× Ò  Ñ(Ô(­"¬'¯,ª,°t´v´{ÀFÑ*KÔ*Kñ	
ô 	
ð 	
ð "ˆŒÔØ×Ò˜TœV×1Ò1°(Ñ;Ô;¸TÑBÔBÐBà ˆŒÔØ×ÒØŒF× Ò  Ñ*Ô*­B¬G¯LªL¸¼¼ÀlÑ,SÔ,Sñ	
ô 	
ð 	
ð 	
ð 	
r5   N)rb   rx   ry   r¦   r�   rm  r   rz   r{   r§  r±  r»  rÃ  rÊ  r/   r5   r3   r—  r—  Á  s  € € € € € ðð ðBð Bð Bðð ð ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðEð Eñ @Ô?ðEð
ð 
ð 
ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðð ñ @Ô?ðð0 €VˆCÔ Ò$Ð&>Ñ?Ô?ðBð Bñ @Ô?ðBð  €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð 
ð 
r5   r—  c                   ó,   — e Zd ZdZdd„Zd„ Zd„ Zd„ ZdS )ÚStubAliasableDomainz>
    Minimal testable implementation of IAliasableDomain.
    Nc                 ó   — t          ¦   «         ‚©z{
        No test coverage for invocations of this method on domain objects,
        so we just won't implement it.
        ©r·  ©r[   r¶  Úmemos      r3   r…   zStubAliasableDomain.exists;  ó   € õ
 "Ñ#Ô#Ð#r5   c                 ó   — t          ¦   «         ‚rÎ  rÏ  )r[   r¶  rŒ   s      r3   r�   zStubAliasableDomain.addUserB  rÒ  r5   c                 ó   — g S )a!  
        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.
        r/   rh   s    r3   r©  z*StubAliasableDomain.getCredentialsCheckersI  s	   € ð ˆ	r5   c                 ó   — || _         dS )zG
        Just record the value so the test can check it later.
        N)Ú
aliasGroup)r[   Úaliasess     r3   ÚsetAliasGroupz!StubAliasableDomain.setAliasGroupR  s   € ð "ˆŒˆˆr5   r   )rb   rx   ry   r¦   r…   r�   r©  rØ  r/   r5   r3   rÌ  rÌ  5  s_   € € € € € ðð ð$ð $ð $ð $ð$ð $ð $ðð ð ð"ð "ð "ð "ð "r5   rÌ  c                   ó°   — e Zd Zd„ Zd„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Z	 eej        dk    d¦  «        d„ ¦   «         Z
d„ Zd	„ Zd
„ Zd„ ZdS )ÚServiceDomainTestsc                 óÚ  — t           j                              ¦   «         | _        t           j                             | j        d ¦  «        | _        | j        | j        _        d| j        _        d| j        _        |  	                    ¦   «         | _
        t           j                             | j        | j
        ¦  «        }|                     dd¦  «         | j                             d|¦  «         d S )NrE  Úhostnameó   useró   passwordútest.domain)r	   r”   rš  r–   ÚDomainDeliveryBaserœ  r¡   ÚprotocolNameÚhostr«   ÚtmpdirrÏ   r›  r�   r•   ©r[   re   s     r3   r�   zServiceDomainTests.setUp[  s¬   € Ý”×&Ò&Ñ(Ô(ˆŒÝ”×2Ò2°4´6¸4Ñ@Ô@ˆŒØœˆŒŒØ$ˆŒÔØ ˆŒŒà—k’k‘m”mˆŒÝ”×1Ò1°$´&¸$¼+ÑFÔFˆØ�Š�w Ñ,Ô,Ð,ØŒ×Ò˜¨Ñ/Ô/Ð/Ð/Ð/r5   c                 ó8   — t          j        | j        ¦  «         d S r   ©rk  rl  rã  rh   s    r3   rm  zServiceDomainTests.tearDowng  ó   € ÝŒ�d”kÑ"Ô"Ð"Ð"Ð"r5   c                 óÂ   — t          ¦   «         }t          ¦   «         }|| j        _        | j                             d|¦  «         |                      |j        |¦  «         dS )z‚
        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Ö  )r[   r×  re   s      r3   ÚtestAddAliasableDomainz)ServiceDomainTests.testAddAliasableDomainj  sX   € õ
 ‘(”(ˆÝ$Ñ&Ô&ˆØ ˆŒŒØŒ×Ò˜¨Ñ/Ô/Ð/Ø×Ò˜VÔ.°Ñ8Ô8Ð8Ð8Ð8r5   r(   r*   c                 óˆ  — | j                              dt          j        d¦  «        dg¦  «        }t	          j        |¦  «        }t          j                             ¦   «         }| 	                    |¦  «        }|  
                    t          |                     ¦   «         ¦  «        d¦  «         |                      d|¦  «         d S )N)Ú
remotehostz123.232.101.234z<someguy@someplace>zuser@host.namero   ÚReceived)rœ  ÚreceivedHeaderr   ÚAddressÚioÚBytesIOÚemailÚparserÚParserÚparserH   rI   rP   r`   )r[   Úhdrr³   ÚemailParserr3  s        r3   ÚtestReceivedHeaderz%ServiceDomainTests.testReceivedHeaderu  s£   € àŒf×#Ò#Ø-ÝŒLÐ.Ñ/Ô/ØÐñ
ô 
ˆõ
 ŒZ˜‰_Œ_ˆÝ”l×)Ò)Ñ+Ô+ˆØ×Ò˜bÑ!Ô!ˆØ×Ò�˜QŸWšW™YœY™œ¨Ñ+Ô+Ð+Ø�Š�j !Ñ$Ô$Ð$Ð$Ð$r5   c                 óž   — t          j        ddd d¦  «        }t          j        | j        j        |¦  «                             | j        ¦  «        S )Nzuser@test.domainÚheloúwherever@whatever)r   ÚUserr   ÚmaybeDeferredrœ  Ú
validateTor¶   Ú_cbValidateTo©r[   r¶  s     r3   ÚtestValidateToz!ServiceDomainTests.testValidateTo‚  sI   € åŒyÐ+¨V°TÐ;NÑOÔOˆÝÔ" 4¤6Ô#4°dÑ;Ô;×GÒGØÔñ
ô 
ð 	
r5   c                 óJ   — |                       t          |¦  «        ¦  «         d S r   )rS   Úcallabler¾   s     r3   rÿ  z ServiceDomainTests._cbValidateTo‰  s"   € Ø�Š� Ñ(Ô(Ñ)Ô)Ð)Ð)Ð)r5   c                 óª   — t          j        ddd d¦  «        }|                      t          j        | j        j        |¦  «        t           j        ¦  «        S )Nzresu@test.domainrú  rû  ©r   rü  rF  r   rý  rœ  rþ  rŽ   r   s     r3   ÚtestValidateToBadUsernamez,ServiceDomainTests.testValidateToBadUsernameŒ  óK   € ÝŒyÐ+¨V°TÐ;NÑOÔOˆØ×!Ò!ÝÔ ¤Ô 1°4Ñ8Ô8½$Ô:Jñ
ô 
ð 	
r5   c                 óª   — t          j        ddd d¦  «        }|                      t          j        | j        j        |¦  «        t           j        ¦  «        S )Nzuser@domain.testrú  rû  r  r   s     r3   ÚtestValidateToBadDomainz*ServiceDomainTests.testValidateToBadDomain’  r  r5   c                 ó  — d}t          j        d¦  «        }|                      | j                             ||¦  «        |u ¦  «         d}t          j        d¦  «        }|                      | j                             ||¦  «        |u ¦  «         d}t          j        d¦  «        }|                      | j                             ||¦  «        |u ¦  «         |                      t           j        | j        j        d |¦  «         d S )N)rÜ  rá   z<user@hostname>)rÜ  ú1.2.3.4z<>)r   rï  rS   rœ  ÚvalidateFromrƒ   ÚSMTPBadSender)r[   rú  Úorigins      r3   ÚtestValidateFromz#ServiceDomainTests.testValidateFrom˜  sã   € Ø(ˆÝ”Ð/Ñ0Ô0ˆØ�Š˜œ×+Ò+¨D°&Ñ9Ô9¸VÐCÑDÔDÐDà&ˆÝ”Ð/Ñ0Ô0ˆØ�Š˜œ×+Ò+¨D°&Ñ9Ô9¸VÐCÑDÔDÐDà&ˆÝ”˜dÑ#Ô#ˆØ�Š˜œ×+Ò+¨D°&Ñ9Ô9¸VÐCÑDÔDÐDà×Ò�$Ô,¨d¬fÔ.AÀ4ÈÑPÔPÐPÐPÐPr5   N)rb   rx   ry   r�   rm  rê  r   rz   r{   rø  r  rÿ  r  r	  r  r/   r5   r3   rÚ  rÚ  Y  sæ   € € € € € ð
0ð 
0ð 
0ð#ð #ð #ð	9ð 	9ð 	9ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
%ð 
%ñ @Ô?ð
%ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð*ð *ð *ð
ð 
ð 
ð
ð 
ð 
ðQð Qð Qð Qð Qr5   rÚ  c                   óŽ  — e Zd Zd„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Zd„ Z	 eej        dk    d¦  «        d„ ¦   «         Z
 eej        dk    d¦  «        d„ ¦   «         Z eej        dk    d¦  «        d	„ ¦   «         Zd
„ Z eej        dk    d¦  «        d„ ¦   «         Z eej        dk    d¦  «        d„ ¦   «         ZdS )ÚVirtualPOP3Testsc                 ó®  — |                       ¦   «         | _        t          j                             ¦   «         | _        t          j                             | j        | j        ¦  «        | _        | j                             dd¦  «         | j         	                    d| j        ¦  «         t          j                             | j        ¦  «        }t          |j        | j                             ¦   «         ¦  «         |x| j        j        d<   | j        j        d<   t          j                             ¦   «         | _        | j        | j        _        d| j        _        d S )NrÝ  rÞ  rß  rí   z<unit test magic>)r«   rã  r	   r”   rš  rÏ   r›  rœ  r�   r•   r   ÚportalÚPortalÚmapÚregisterCheckerr©  rï   r–   ÚVirtualPOP3r™  r¡   Úmagic)r[   r  s     r3   r�   zVirtualPOP3Tests.setUpª  sô   € Ø—k’k‘m”mˆŒÝ”×&Ò&Ñ(Ô(ˆŒÝ”×1Ò1°$´&¸$¼+ÑFÔFˆŒØŒ�Š�w Ñ,Ô,Ð,ØŒ×Ò˜¨¬Ñ/Ô/Ð/å”×#Ò# D¤FÑ+Ô+ˆÝˆFÔ" D¤F×$AÒ$AÑ$CÔ$CÑDÔDÐDØ=CÐCˆŒŒ�rÑ˜TœVœ^¨MÑ:å”×+Ò+Ñ-Ô-ˆŒØœˆŒŒØ*ˆŒŒˆˆr5   c                 ó8   — t          j        | j        ¦  «         d S r   ræ  rh   s    r3   rm  zVirtualPOP3Tests.tearDown¹  rç  r5   r(   r*   c                 óÄ   — t          | j        j        dz   ¦  «                             ¦   «         }| j                             d|¦  «                             | j        ¦  «        S )NrŒ   r¶  )r   r™  r  Ú	hexdigestÚauthenticateUserAPOPr¶   Ú_cbAuthenticateAPOP©r[   Úresps     r3   ÚtestAuthenticateAPOPz%VirtualPOP3Tests.testAuthenticateAPOP¼  sT   € å�4”6”< *Ñ,Ñ-Ô-×7Ò7Ñ9Ô9ˆØŒv×*Ò*¨6°4Ñ8Ô8×DÒDØÔ$ñ
ô 
ð 	
r5   c                 ó(  — |                       t          |¦  «        d¦  «         |                       |d         t          j        ¦  «         |                      t          j                             |d         ¦  «        ¦  «          |d         ¦   «          d S ©Nr)   r   ro   r<   ©rH   rI   r   r¹  rS   r¬  r¾   s     r3   r  z$VirtualPOP3Tests._cbAuthenticateAPOPÃ  ós   € Ø×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜ œ¥D¤MÑ2Ô2Ð2Ø�Š�œ×0Ò0°¸´Ñ;Ô;Ñ<Ô<Ð<ØˆˆqŒ	‰Œˆˆˆr5   c                 óÚ   — t          | j        j        dz   ¦  «                             ¦   «         }|                      | j                             d|¦  «        t          j        j        ¦  «        S )NrŒ   Úresu)	r   r™  r  r  rF  r  r   r¿  rÀ  r  s     r3   Ú!testAuthenticateIncorrectUserAPOPz2VirtualPOP3Tests.testAuthenticateIncorrectUserAPOPÉ  sX   € å�4”6”< *Ñ,Ñ-Ô-×7Ò7Ñ9Ô9ˆØ×!Ò!ØŒF×'Ò'¨°Ñ5Ô5µt´zÔ7Sñ
ô 
ð 	
r5   c                 óÀ   — t          d¦  «                             ¦   «         }|                      | j                             d|¦  «        t
          j        j        ¦  «        S )Nzwrong digestr¶  )r   r  rF  r™  r  r   r¿  rÀ  r  s     r3   Ú%testAuthenticateIncorrectResponseAPOPz6VirtualPOP3Tests.testAuthenticateIncorrectResponseAPOPÐ  sO   € å�>Ñ"Ô"×,Ò,Ñ.Ô.ˆØ×!Ò!ØŒF×'Ò'¨°Ñ5Ô5µt´zÔ7Sñ
ô 
ð 	
r5   c                 óh   — | j                              dd¦  «                             | j        ¦  «        S )Nr¶  rŒ   )r™  ÚauthenticateUserPASSr¶   Ú_cbAuthenticatePASSrh   s    r3   ÚtestAuthenticatePASSz%VirtualPOP3Tests.testAuthenticatePASS×  s2   € àŒv×*Ò*¨6°:Ñ>Ô>×JÒJØÔ$ñ
ô 
ð 	
r5   c                 ó(  — |                       t          |¦  «        d¦  «         |                       |d         t          j        ¦  «         |                      t          j                             |d         ¦  «        ¦  «          |d         ¦   «          d S r"  r#  r¾   s     r3   r,  z$VirtualPOP3Tests._cbAuthenticatePASSÝ  r$  r5   c                 ó~   — |                       | j                             dd¦  «        t          j        j        ¦  «        S )Nr&  rŒ   ©rF  r™  r+  r   r¿  rÀ  rh   s    r3   ÚtestAuthenticateBadUserPASSz,VirtualPOP3Tests.testAuthenticateBadUserPASSã  s7   € à×!Ò!ØŒF×'Ò'¨°
Ñ;Ô;ÝŒJÔ(ñ
ô 
ð 	
r5   c                 ó~   — |                       | j                             dd¦  «        t          j        j        ¦  «        S )Nr¶  r½  r0  rh   s    r3   ÚtestAuthenticateBadPasswordPASSz0VirtualPOP3Tests.testAuthenticateBadPasswordPASSê  s8   € à×!Ò!ØŒF×'Ò'¨Ð0@ÑAÔAÝŒJÔ(ñ
ô 
ð 	
r5   N)rb   rx   ry   r�   rm  r   rz   r{   r   r  r'  r)  r-  r,  r1  r3  r/   r5   r3   r  r  ¨  s|  € € € € € ð+ð +ð +ð#ð #ð #ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ðð ð ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð
ð ð ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð 
ð 
r5   r  c                   ó   — e Zd Zd„ ZdS )Úemptyc                 ó   — d S r   r/   rh   s    r3   Ú__init__zempty.__init__ó  s   € Øˆr5   N)rb   rx   ry   r7  r/   r5   r3   r5  r5  ò  s#   € € € € € ðð ð ð ð r5   r5  c                   óJ   — e Zd Z eej        dk    d¦  «        d„ ¦   «         ZdS )Ú
RelayTestsr(   r*   c                 ód  ‡— t           j                              ¦   «         }t           j                             |¦  «        }t	          j        d¦  «        t	          j        ddd¦  «        g}t	          j        ddd¦  «        t	          j        ddd¦  «        g}|D ]’Št          ¦   «         }d	|_        d
|_	        t          ¦   «         |_
        t          ¦   «         |j
        _        ˆfd„|j
        j        _        |                      t          |                     |¦  «        ¦  «        ¦  «         Œ“|D ]ƒŠt          ¦   «         }d|_        t          ¦   «         |_
        t          ¦   «         |j
        _        ˆfd„|j
        j        _        d|_	        |                      t"          j        |j        |¦  «         Œ„d S )Nz/var/run/mail-relayÚTCPrá   râ   z192.168.2.1é>   r  i—  z	user@hostz	tsoh@resuc                  ó   •— ‰ S r   r/   ©Úpeers   €r3   r9  z'RelayTests.testExists.<locals>.<lambda>  ó   ø€ °d€ r5   z
some@placec                  ó   •— ‰ S r   r/   r>  s   €r3   r9  z'RelayTests.testExists.<locals>.<lambda>  r@  r5   z	who@cares)r	   r”   ÚrelayÚDomainQueuerr
   ÚUNIXAddressÚIPv4Addressr5  ÚorigÚdestr   r¤   ÚgetPeerrS   r  r…   rƒ   r   rŽ   )r[   r¡   re   ÚdoRelayÚ	dontRelayr¶  r?  s         @r3   r†   zRelayTests.testExistsù  s  ø€ å”)×'Ò'Ñ)Ô)ˆÝ”×(Ò(¨Ñ1Ô1ˆõ ÔÐ 5Ñ6Ô6ÝÔ  {°EÑ:Ô:ð
ˆõ Ô  }°bÑ9Ô9ÝÔ  y°$Ñ7Ô7ð
ˆ	ð
 ð 	;ð 	;ˆDÝ‘7”7ˆDØ#ˆDŒIØ#ˆDŒIÝ!™GœGˆDŒMÝ&+¡g¤gˆDŒMÔ#Ø.:¨l¨l¨lˆDŒMÔ#Ô+à�OŠO�H V§]¢]°4Ñ%8Ô%8Ñ9Ô9Ñ:Ô:Ð:Ð:àð 	Eð 	EˆDÝ‘7”7ˆDØ$ˆDŒIÝ!™GœGˆDŒMÝ&+¡g¤gˆDŒMÔ#Ø.:¨l¨l¨lˆDŒMÔ#Ô+Ø#ˆDŒIà×Ò�dÔ.°´¸tÑDÔDÐDÐDð	Eð 	Er5   N)rb   rx   ry   r   rz   r{   r†   r/   r5   r3   r9  r9  ÷  sI   € € € € € à€VˆCÔ Ò$Ð&>Ñ?Ô?ð Eð  Eñ @Ô?ð Eð  Eð  Er5   r9  c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚRelayerTestsc                 ó¶  — |                       ¦   «         | _        t          j        | j        ¦  «         g | _        t          d¦  «        D ]Í}t          j                             | j        d|fz  ¦  «        }t          |dz   d¦  «        5 }t          j
        d|fz  d|fz  g|¦  «         d d d ¦  «         n# 1 swxY w Y   t          |dz   d¦  «        }|                     |¦  «         |                     d	d	¦  «         | j                             |¦  «         ŒÎt          j                             ¦   «         | _        | j                             | j        ¦  «         d S )
Nr.   úbody-%dú-Hrª   úfrom-%dúto-%dú-Dr†  r   )r«   rã  r¼   ÚmkdirÚmessageFilesrF   r½   rs  r®   ÚpickleÚdumpr"  rc  r2  r	   rB  ÚRelayerMixinÚRÚloadMessages)r[   rR  r¬   r¯   s       r3   r�   zRelayerTests.setUp  s{  € Ø—k’k‘m”mˆŒÝ
Œ�”ÑÔÐØˆÔÝ�r‘”ð 	+ð 	+ˆAÝ”7—<’< ¤¨Y¸!¸Ñ-=Ñ>Ô>ˆDÝ�d˜T‘k 4Ñ(Ô(ð C¨AÝ”˜Y¨!¨Ñ-¨w¸!¸©~Ð>ÀÑBÔBÐBðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cõ �T˜D‘[ #Ñ&Ô&ˆAØ�GŠG�D‰MŒMˆMØ�FŠF�1�a‰LŒLˆLØÔ×$Ò$ TÑ*Ô*Ð*Ð*å”×(Ò(Ñ*Ô*ˆŒØŒ×Ò˜DÔ-Ñ.Ô.Ð.Ð.Ð.s   Â B3Â3B7	Â:B7	c                 ó8   — t          j        | j        ¦  «         d S r   ræ  rh   s    r3   rm  zRelayerTests.tearDown0  rç  r5   c                 ó"  — t          d¦  «        D ]Q}|                      | j                             ¦   «         d|fz  ¦  «         | j                             dd d d d ¦  «         ŒR|                      | j                             ¦   «         d ¦  «         d S )Nr.   rP  éú   )rF   rH   rX  ÚgetMailFromÚsentMail©r[   rR  s     r3   ÚtestMailFromzRelayerTests.testMailFrom3  s‹   € Ý�r‘”ð 	9ð 	9ˆAØ×Ò˜TœV×/Ò/Ñ1Ô1°9À¸tÑ3CÑDÔDÐDØŒF�OŠO˜C  t¨T°4Ñ8Ô8Ð8Ð8Ø×Ò˜œ×+Ò+Ñ-Ô-¨tÑ4Ô4Ð4Ð4Ð4r5   c                 ó$  — t          d¦  «        D ]R}|                      | j                             ¦   «         d|fz  g¦  «         | j                             dd d d d ¦  «         ŒS|                      | j                             ¦   «         d ¦  «         d S )Nr.   rQ  r\  )rF   rH   rX  Ú	getMailTor^  r_  s     r3   Ú
testMailTozRelayerTests.testMailTo9  s�   € Ý�r‘”ð 	9ð 	9ˆAØ×Ò˜TœV×-Ò-Ñ/Ô/°'¸Q¸D±.Ð1AÑBÔBÐBØŒF�OŠO˜C  t¨T°4Ñ8Ô8Ð8Ð8Ø×Ò˜œ×)Ò)Ñ+Ô+¨TÑ2Ô2Ð2Ð2Ð2r5   c                 ó�  — t          d¦  «        D ]ˆ}t          j                             | j        d|fz  ¦  «        }|                      | j                             ¦   «                              ¦   «         |¦  «         | j         	                    dd d d d ¦  «         Œ‰|                      | j                             ¦   «         d ¦  «         d S )Nr.   rN  r\  )
rF   r¼   r½   rs  rã  rH   rX  ÚgetMailDatarÄ   r^  )r[   rR  r¬   s      r3   ÚtestMailDatazRelayerTests.testMailData?  s®   € Ý�r‘”ð 	9ð 	9ˆAÝ”7—<’< ¤¨Y¸!¸Ñ-=Ñ>Ô>ˆDØ×Ò˜TœV×/Ò/Ñ1Ô1×6Ò6Ñ8Ô8¸$Ñ?Ô?Ð?ØŒF�OŠO˜C  t¨T°4Ñ8Ô8Ð8Ð8Ø×Ò˜œ×+Ò+Ñ-Ô-¨tÑ4Ô4Ð4Ð4Ð4r5   N)rb   rx   ry   r�   rm  r`  rc  rf  r/   r5   r3   rL  rL    s_   € € € € € ð/ð /ð /ð"#ð #ð #ð5ð 5ð 5ð3ð 3ð 3ð5ð 5ð 5ð 5ð 5r5   rL  c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚManagerc                 ó0   — g | _         g | _        g | _        d S r   )Úsuccessr    Údonerh   s    r3   r7  zManager.__init__H  s   € ØˆŒØˆŒØˆŒ	ˆ	ˆ	r5   c                 ó>   — | j                              ||f¦  «         d S r   )rj  r2  ©r[   r¢   rq   s      r3   ÚnotifySuccesszManager.notifySuccessM  ó#   € ØŒ×Ò˜W gÐ.Ñ/Ô/Ð/Ð/Ð/r5   c                 ó>   — | j                              ||f¦  «         d S r   )r    r2  rm  s      r3   ÚnotifyFailurezManager.notifyFailureP  ro  r5   c                 ó:   — | j                              |¦  «         d S r   )rk  r2  )r[   r¢   s     r3   Ú
notifyDonezManager.notifyDoneS  s   € ØŒ	×Ò˜Ñ!Ô!Ð!Ð!Ð!r5   N)rb   rx   ry   r7  rn  rq  rs  r/   r5   r3   rh  rh  G  sP   € € € € € ðð ð ð
0ð 0ð 0ð0ð 0ð 0ð"ð "ð "ð "ð "r5   rh  c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚManagedRelayerTestsc                 óp  — t          ¦   «         | _        t          t          ddd¦  «        ¦  «        | _        t          ¦   «         | _        t          j         	                    | j        ¦  «        | _
        | j        d d …         | j
        _        | j        d d …         | j
        _        | j        | j
        _        d S )Nr   r:   r<   )rh  ÚmanagerrJ   rF   r5  rî   r¢   r	   ÚrelaymanagerÚManagedRelayerMixinrB  Únamesrh   s    r3   r�   zManagedRelayerTests.setUpY  s‡   € Ý‘y”yˆŒÝ�U 1 b¨!™_œ_Ñ-Ô-ˆŒÝ‘x”xˆŒÝÔ&×:Ò:¸4¼<ÑHÔHˆŒ
Ø"œm¨A¨A¨AÔ.ˆŒ
ÔØœ=¨¨¨Ô+ˆŒ
ÔØ!œ\ˆŒ
ÔÐÐr5   c                 óº   ‡ — ‰ j         D ] }‰ j                             dd d d d ¦  «         Œ!‰                      ‰ j        j        ˆ fd„‰ j         D ¦   «         ¦  «         d S )Nr\  c                 ó"   •— g | ]}‰j         |f‘ŒS r/   ©r¢   ©r1   r3  r[   s     €r3   r8   z>ManagedRelayerTests.testSuccessfulSentMail.<locals>.<listcomp>g  ó    ø€ Ð"LÐ"LÐ"L¸ D¤L°!Ð#4Ð"LÐ"LÐ"Lr5   )r5  rB  r^  rH   rw  rj  r_  s   ` r3   ÚtestSuccessfulSentMailz*ManagedRelayerTests.testSuccessfulSentMailb  óx   ø€ Ø”ð 	=ð 	=ˆAØŒJ×Ò  T¨4°°tÑ<Ô<Ð<Ð<à×ÒØŒLÔ Ð"LÐ"LÐ"LÐ"L¸d¼mÐ"LÑ"LÔ"Lñ	
ô 	
ð 	
ð 	
ð 	
r5   c                 óº   ‡ — ‰ j         D ] }‰ j                             dd d d d ¦  «         Œ!‰                      ‰ j        j        ˆ fd„‰ j         D ¦   «         ¦  «         d S )Ni&  c                 ó"   •— g | ]}‰j         |f‘ŒS r/   r}  r~  s     €r3   r8   z:ManagedRelayerTests.testFailedSentMail.<locals>.<listcomp>o  r  r5   )r5  rB  r^  rH   rw  r    r_  s   ` r3   ÚtestFailedSentMailz&ManagedRelayerTests.testFailedSentMailj  r�  r5   c                 óÂ   — | j                              t          j        t	          ¦   «         ¦  «        ¦  «         |                      | j        j        | j        g¦  «         d S r   )	rB  rž   r    ÚFailurerG  rH   rw  rk  r¢   rh   s    r3   ÚtestConnectionLostz&ManagedRelayerTests.testConnectionLostr  sK   € ØŒ
×!Ò!¥'¤/µ)±+´+Ñ">Ô">Ñ?Ô?Ð?Ø×Ò˜œÔ*¨T¬\¨NÑ;Ô;Ð;Ð;Ð;r5   N)rb   rx   ry   r�   r€  r„  r‡  r/   r5   r3   ru  ru  W  sP   € € € € € ð*ð *ð *ð
ð 
ð 
ð
ð 
ð 
ð<ð <ð <ð <ð <r5   ru  c                   óÔ   — e Zd Zd„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Z eej        dk    d¦  «        d„ ¦   «         Z	 eej        dk    d¦  «        d„ ¦   «         Z
d„ Zd	S )
ÚDirectoryQueueTestsc                 ó  — |                       ¦   «         | _        t          j        | j        ¦  «         t          j                             | j        ¦  «        | _        d| j        _        t          d¦  «        D ]|}| j         
                    ¦   «         \  }}|5  t          j        d|g|¦  «         d d d ¦  «         n# 1 swxY w Y   |                     d|fz  ¦  «         |                     ¦   «          Œ}| j                             ¦   «          d S )NFé   Úheaders   body: %d)r«   rã  r¼   rS  r	   rx  ÚQueueÚqueueÚnoisyrF   ÚcreateNewMessagerU  rV  rœ   rµ   ÚreadDirectory)r[   r3  ÚhdrFÚmsgFs       r3   r�   zDirectoryQueueTests.setUpy  s.  € à—k’k‘m”mˆŒÝ
Œ�”ÑÔÐÝÔ&×,Ò,¨T¬[Ñ9Ô9ˆŒ
Ø ˆŒ
ÔÝ�r‘”ð 	ð 	ˆAØœ×4Ò4Ñ6Ô6‰JˆD�$Øð 1ð 1Ý”˜X q˜M¨4Ñ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à×Ò˜k¨Q¨DÑ0Ñ1Ô1Ð1Ø×ÒÑÔÐÐØŒ
× Ò Ñ"Ô"Ð"Ð"Ð"s   ÂB;Â;B?	ÃB?	c                 ó8   — t          j        | j        ¦  «         d S r   ræ  rh   s    r3   rm  zDirectoryQueueTests.tearDown‡  rç  r5   r(   r*   c                 ól  — |                       | j                             ¦   «         ¦  «         |                      t	          | j                             ¦   «         ¦  «        d¦  «         | j                             ¦   «         }| j                             |d         ¦  «         |                      t	          | j                             ¦   «         ¦  «        d¦  «         | j                             |d         ¦  «         |                      t	          | j                             ¦   «         ¦  «        d¦  «         d S )Nr‹  r   é   )rS   rŽ  Ú
hasWaitingrH   rI   Ú
getWaitingÚsetRelayingÚ
setWaiting)r[   Úwaitings     r3   ÚtestWaitingzDirectoryQueueTests.testWaitingŠ  só   € à�Š˜œ
×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°rÑ:Ô:Ð:à”*×'Ò'Ñ)Ô)ˆØŒ
×Ò˜w qœzÑ*Ô*Ð*Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°rÑ:Ô:Ð:àŒ
×Ò˜g aœjÑ)Ô)Ð)Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°rÑ:Ô:Ð:Ð:Ð:r5   c           	      óæ  — | j                              ¦   «         D ]}}| j                              |¦  «         |                      t	          | j                              ¦   «         ¦  «        dt	          | j                              ¦   «         ¦  «        z
  ¦  «         Œ~|                      | j                              ¦   «         ¦  «         | j                              ¦   «         }| j                              |d         ¦  «         |                      t	          | j                              ¦   «         ¦  «        d¦  «         |                      t	          | j                              ¦   «         ¦  «        d¦  «         d S )Nr‹  r   ro   r–  )	rŽ  r˜  r™  rH   rI   Ú
getRelayedr»   r—  rš  )r[   r3  Úrelayeds      r3   ÚtestRelayingz DirectoryQueueTests.testRelaying–  s7  € à”×&Ò&Ñ(Ô(ð 	ð 	ˆAØŒJ×"Ò" 1Ñ%Ô%Ð%Ø×ÒÝ�D”J×)Ò)Ñ+Ô+Ñ,Ô,¨bµ3°t´z×7LÒ7LÑ7NÔ7NÑ3OÔ3OÑ.Oñô ð ð ð 	×Ò˜œ×.Ò.Ñ0Ô0Ñ1Ô1Ð1à”*×'Ò'Ñ)Ô)ˆØŒ
×Ò˜g aœjÑ)Ô)Ð)Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°qÑ9Ô9Ð9Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°rÑ:Ô:Ð:Ð:Ð:r5   c                 óL  — | j                              ¦   «         d         }| j                              |¦  «         | j                              |¦  «         |                      t          | j                              ¦   «         ¦  «        d¦  «         |                      t          | j                              ¦   «         ¦  «        d¦  «         |                      || j                              ¦   «         v ¦  «         |                      || j                              ¦   «         v ¦  «         d S )Nr   r–  )rŽ  r˜  r™  rk  rH   rI   rž  r»   )r[   Úmsgs     r3   ÚtestDonezDirectoryQueueTests.testDone¥  sð   € àŒj×#Ò#Ñ%Ô% aÔ(ˆØŒ
×Ò˜sÑ#Ô#Ð#ØŒ
�Š˜ÑÔÐà×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°rÑ:Ô:Ð:Ø×Ò�˜TœZ×2Ò2Ñ4Ô4Ñ5Ô5°qÑ9Ô9Ð9à×Ò˜ ¤
× 5Ò 5Ñ 7Ô 7Ð7Ñ8Ô8Ð8Ø×Ò˜ ¤
× 5Ò 5Ñ 7Ô 7Ð7Ñ8Ô8Ð8Ð8Ð8r5   c                 ó>  — g }| j                              ¦   «         D ]/}|                     | j                              |¦  «        ¦  «         Œ0|                     ¦   «          t          d¦  «        D ]-}|                      |                     d¦  «        d|g¦  «         Œ.d S )Nr‹  r   rŒ  )rŽ  r˜  r2  ÚgetEnveloperN   rF   rH   Úpop)r[   Ú	envelopesr¢  rR  s       r3   ÚtestEnvelopez DirectoryQueueTests.testEnvelope±  s£   € Øˆ	à”:×(Ò(Ñ*Ô*ð 	:ð 	:ˆCØ×Ò˜TœZ×3Ò3°CÑ8Ô8Ñ9Ô9Ð9Ð9à�ŠÑÔÐÝ�r‘”ð 	>ð 	>ˆAØ×Ò˜YŸ]š]¨1Ñ-Ô-°¸!¨}Ñ=Ô=Ð=Ð=ð	>ð 	>r5   N)rb   rx   ry   r�   rm  r   rz   r{   rœ  r   r£  r¨  r/   r5   r3   r‰  r‰  w  s×   € € € € € ð#ð #ð #ð#ð #ð #ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð	;ð 	;ñ @Ô?ð	;ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð;ð ;ñ @Ô?ð;ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð	9ð 	9ñ @Ô?ð	9ð>ð >ð >ð >ð >r5   r‰  )ÚclientÚcommonÚserverc                   ó   — e Zd Zd„ Zdd„ZdS )ÚTestAuthorityc                 óR   — t           j                             | ¦  «         i | _        d S r   )rª  ÚResolverBaser7  Ú	addressesrh   s    r3   r7  zTestAuthority.__init__À  s$   € ÝÔ×$Ò$ TÑ*Ô*Ð*ØˆŒˆˆr5   Nc                 óž  — || j         v r�|t          j        k    r}g }| j         |         D ]V}t          j        |t          j        t          j        dt          j        d|¦  «        ¦  «        }|                     |¦  «         ŒWt          j        |g g f¦  «        S t          j	        t          j        t          j        |¦  «        ¦  «        ¦  «        S )Né<   r   )r°  r   ÚMXr   ÚINr   r2  r   ÚsucceedÚfailr    r†  ÚDomainError)r[   r¬   ÚclsÚtypeÚtimeoutr6  rA   rö  s           r3   Ú_lookupzTestAuthority._lookupÄ  s«   € Ø�4”>Ð!Ð! d­c¬f¢n nØˆGØ”^ DÔ)ð $ð $�Ý”l 4­¬µ´¸½S¼]È1ÈaÑ=PÔ=PÑQÔQ�Ø—’˜sÑ#Ô#Ð#Ð#Ý”= '¨2¨rÐ!2Ñ3Ô3Ð3ÝŒz�'œ/­#¬/¸$Ñ*?Ô*?Ñ@Ô@ÑAÔAÐAr5   r   )rb   rx   ry   r7  r»  r/   r5   r3   r­  r­  ¿  s=   € € € € € ðð ð ðBð Bð Bð Bð Bð Br5   r­  c                 óÈ  — t          ¦   «         | _        t          j        | j        g¦  «        }t	          j        |¦  «        }	 t          j        d|d¬¦  «        | _        | j         	                    ¦   «         j        }	 t          j
        ||d¬¦  «        | _        n*# t          $ r | j                             ¦   «          Y nw xY wŒ‚t          j        d|fg¬¦  «        | _        d S )Nro   r   rá   ©Ú	interface)Úservers)r­  Úauthr«  ÚDNSServerFactoryr   ÚDNSDatagramProtocolr   Ú	listenTCPÚportÚgetHostÚ	listenUDPÚudpPortr   ÚstopListeningr©  ÚResolverÚresolver)r[   r¢   r   Ú
portNumbers       r3   ÚsetUpDNSrÌ  Î  sí   € Ý‘”€D„IÝÔ% t¤y kÑ2Ô2€GÝÔ& wÑ/Ô/€HðÝÔ% a¨¸KÐHÑHÔHˆŒ	Ø”Y×&Ò&Ñ(Ô(Ô-ˆ
ð	Ý"Ô,Ø˜H°ðñ ô ˆDŒLð øõ !ð 	&ð 	&ð 	&ØŒI×#Ò#Ñ%Ô%Ð%Ð%Ð%ð	&øøøðõ ”O¨k¸:Ð-FÐ,GÐHÑHÔH€D„M€M€Ms   Á>B Â#CÃ Cc                 óR  — g }|                      t          j        | j        j        ¦  «        ¦  «         |                      t          j        | j        j        ¦  «        ¦  «         	 | j        j                             ¦   «          n# t          $ r Y nw xY wt          j
        |¦  «        S r   )r2  r   rý  rÄ  rÈ  rÇ  rÊ  Ú
_parseCallÚcancelÚBaseExceptionÚDeferredList)r[   Údls     r3   ÚtearDownDNSrÓ  á  s›   € Ø	€BØ‡I‚I�eÔ! $¤)Ô"9Ñ:Ô:Ñ;Ô;Ð;Ø‡I‚I�eÔ! $¤,Ô"<Ñ=Ô=Ñ>Ô>Ð>ðØŒÔ ×'Ò'Ñ)Ô)Ð)Ð)øÝð ð ð ØˆðøøøåÔ˜bÑ!Ô!Ð!s   Á&B Â
BÂBc                   ó  — e Zd ZdZd„ Zd„ Zd„ Z eej	        dk    d¦  «        d„ ¦   «         Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z eej	        dk    d¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ ZdS )ÚMXTestsz6
    Tests for L{mail.relaymanager.MXCalculator}.
    c                 ó²   — t          | ¦  «         t          j        ¦   «         | _        t          j                             | j        | j        ¦  «        | _        d S r   )	rÌ  r   rx  r|  r	   rx  ÚMXCalculatorrÊ  Úmxrh   s    r3   r�   zMXTests.setUpò  s<   € Ý�‰ŒˆÝ”Z‘\”\ˆŒ
ÝÔ#×0Ò0°´ÀÄ
ÑKÔKˆŒˆˆr5   c                 ó    — t          | ¦  «        S r   )rÓ  rh   s    r3   rm  zMXTests.tearDown÷  s   € Ý˜4Ñ Ô Ð r5   c                 óŠ   — |                       t          j                             | j        ¦  «        j        t          ¦  «         dS )zQ
        L{MXCalculator}'s default clock is C{twisted.internet.reactor}.
        N)rÉ  r	   rx  r×  rÊ  r|  r   rh   s    r3   Útest_defaultClockzMXTests.test_defaultClockú  sA   € ð 	×ÒÝÔ×*Ò*¨4¬=Ñ9Ô9Ô?Åñ	
ô 	
ð 	
ð 	
ð 	
r5   r(   r*   c                 ó†   — dg| j         j        d<   | j                             d¦  «                             | j        ¦  «        S )Núthe.email.test.domainrß  )rÀ  r°  rØ  ÚgetMXr¶   Ú_cbSimpleSuccessrh   s    r3   ÚtestSimpleSuccesszMXTests.testSimpleSuccess  s9   € à.EÐ-FˆŒ	Ô˜MÑ*ØŒw�}Š}˜]Ñ+Ô+×7Ò7¸Ô8MÑNÔNÐNr5   c                 óŒ   — |                       |j        d¦  «         |                       t          |j        ¦  «        d¦  «         d S )Nr   rÝ  )rH   Ú
preferencerc   r¬   ©r[   rØ  s     r3   rß  zMXTests._cbSimpleSuccess  s?   € Ø×Ò˜œ¨Ñ*Ô*Ð*Ø×Ò�˜RœW™œÐ'>Ñ?Ô?Ð?Ð?Ð?r5   c                 ó€   — d| j         _        |                      | j                              d¦  «        t          ¦  «        S )NFrß  )rØ  ÚfallbackToDomainrF  rÞ  ÚIOErrorrh   s    r3   ÚtestSimpleFailurezMXTests.testSimpleFailure  s0   € Ø#(ˆŒÔ Ø×!Ò! $¤'§-¢-°Ñ">Ô">ÅÑHÔHÐHr5   c                 óh   — |                       | j                             d¦  «        t          ¦  «        S ©Nrß  )rF  rØ  rÞ  r   rh   s    r3   ÚtestSimpleFailureWithFallbackz%MXTests.testSimpleFailureWithFallback  s&   € Ø×!Ò! $¤'§-¢-°Ñ">Ô">ÅÑOÔOÐOr5   c                 óÀ   ‡ ‡‡‡—  G ˆˆfd„d¦  «        } |¦   «         ‰ j         _        ‰ j                              ‰¦  «        }ˆˆ fd„}|                     |¦  «         |S )aZ  
        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                   ó   •— e Zd Zˆ ˆfd„ZdS )ú,MXTests._exchangeTest.<locals>.DummyResolverc                 ó€   •— |‰k    rt          j        ‰g g f¦  «        S t          j        t          ‰¦  «        ¦  «        S r   )r   rµ  r¶  r   )r[   r¬   re   Úrecordss     €€r3   ÚlookupMailExchangez?MXTests._exchangeTest.<locals>.DummyResolver.lookupMailExchange  s;   ø€ Ø˜6’>�>Ý œ=¨'°2°rÐ):Ñ;Ô;Ð;Ý”z¥,¨vÑ"6Ô"6Ñ7Ô7Ð7r5   N©rb   rx   ry   rð  )re   rï  s   €€r3   ÚDummyResolverrí    s3   ø€ € € € € ð8ð 8ð 8ð 8ð 8ð 8ð 8ð 8r5   rò  c                 óX   •— ‰                      t          | j        ¦  «        ‰¦  «         d S r   ©rH   rc   r¬   )ÚrecordÚcorrectMailExchanger[   s    €€r3   ÚgotMailExchangez.MXTests._exchangeTest.<locals>.gotMailExchange'  s*   ø€ Ø×Ò�S ¤Ñ-Ô-Ð/BÑCÔCÐCÐCÐCr5   )rØ  rÊ  rÞ  r¶   )r[   re   rï  rö  rò  r\   r÷  s   ````   r3   Ú_exchangeTestzMXTests._exchangeTest  sŸ   øøøø€ ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð )˜=™?œ?ˆŒÔØŒG�MŠM˜&Ñ!Ô!ˆð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	
�Š�oÑ&Ô&Ð&Øˆr5   c           
      ó6  — d}d}d}t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        g}|                      |||¦  «        S )zh
        The MX record with the lowest preference is returned by
        L{MXCalculator.getMX}.
        ré  úgood.example.comúbad.example.comro   ©r¬   r¹  Úpayloadr   r<   )r   r   ÚTYPErø  ©r[   re   ÚgoodÚbadrï  s        r3   Útest_mailExchangePreferencez#MXTests.test_mailExchangePreference-  s�   € ð
 ˆØ!ˆØˆõ ˜&¥y¤~½yÈÈCÑ?PÔ?PÐQÑQÔQÝ˜&¥y¤~½yÈÈDÑ?QÔ?QÐRÑRÔRÝ˜&¥y¤~½yÈÈCÑ?PÔ?PÐQÑQÔQð
ˆð
 ×!Ò! &¨'°4Ñ8Ô8Ð8r5   c           	      ó  — d}d}d}t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        g}| j                             |¦  «         |                      |||¦  «        S )z�
        L{MXCalculator.getMX} returns the MX record with the lowest preference
        which is not also marked as bad.
        ré  rú  rû  r   rü  ro   ©r   r   rþ  rØ  ÚmarkBadrø  rÿ  s        r3   Útest_badExchangeExcludedz MXTests.test_badExchangeExcluded=  s†   € ð
 ˆØ!ˆØˆõ ˜&¥y¤~½yÈÈCÑ?PÔ?PÐQÑQÔQÝ˜&¥y¤~½yÈÈDÑ?QÔ?QÐRÑRÔRð
ˆð 	Œ�Š˜ÑÔÐØ×!Ò! &¨'°4Ñ8Ô8Ð8r5   c           	      óL  — d}d}d}t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        g}| j                             |¦  «         | j                             |¦  «         |                      |||¦  «        S )zœ
        L{MXCalculator.getMX} returns the MX record with the lowest preference
        if all the MX records in the response have been marked bad.
        ré  rû  zworse.example.comr   rü  ro   r  )r[   re   r  Úworserï  s        r3   Útest_fallbackForAllBadExchangesz'MXTests.test_fallbackForAllBadExchangesM  sš   € ð
 ˆØˆØ#ˆõ ˜&¥y¤~½yÈÈCÑ?PÔ?PÐQÑQÔQÝ˜&¥y¤~½yÈÈEÑ?RÔ?RÐSÑSÔSð
ˆð 	Œ�Š˜ÑÔÐØŒ�Š˜ÑÔÐØ×!Ò! &¨'°3Ñ7Ô7Ð7r5   c           	      ó`  — d}d}d}t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        g}| j                             |¦  «         | j                             | j        j        ¦  «         |                      |||¦  «        S )z¸
        L{MXCalculator.getMX} returns the MX record with the lowest preference
        if it was last marked bad longer than L{MXCalculator.timeOutBadMX}
        seconds ago.
        ré  rú  rû  r   rü  ro   )	r   r   rþ  rØ  r  r|  ry  ÚtimeOutBadMXrø  ©r[   re   r   ÚpreviouslyBadrï  s        r3   Útest_badExchangeExpireszMXTests.test_badExchangeExpires^  sª   € ð ˆØ!ˆØ)ˆõ Ø¥)¤.½)ÀAÀ}Ñ:UÔ:Uðñ ô õ ˜&¥y¤~½yÈÈDÑ?QÔ?QÐRÑRÔRð	
ˆð 	Œ�Š˜Ñ&Ô&Ð&ØŒ
×Ò˜4œ7Ô/Ñ0Ô0Ð0Ø×!Ò! &¨'°=ÑAÔAÐAr5   c           	      ó”  — d}d}d}t          |t          j        t          d|¦  «        ¬¦  «        t          |t          j        t          d|¦  «        ¬¦  «        g}| j                             |¦  «         | j                             |¦  «         | j                             | j        j        ¦  «         |  	                    |||¦  «        S )z�
        L{MXCalculator.getMX} returns the MX record with the lowest preference
        if it was marked good after it was marked bad.
        ré  rú  rû  r   rü  ro   )
r   r   rþ  rØ  r  ÚmarkGoodr|  ry  r  rø  r  s        r3   Útest_goodExchangeUsedzMXTests.test_goodExchangeUsedr  sÀ   € ð
 ˆØ!ˆØ)ˆõ Ø¥)¤.½)ÀAÀ}Ñ:UÔ:Uðñ ô õ ˜&¥y¤~½yÈÈDÑ?QÔ?QÐRÑRÔRð	
ˆð 	Œ�Š˜Ñ&Ô&Ð&ØŒ×Ò˜Ñ'Ô'Ð'ØŒ
×Ò˜4œ7Ô/Ñ0Ô0Ð0Ø×!Ò! &¨'°=ÑAÔAÐAr5   c                 óà   ‡‡— dŠdŠ G ˆˆfd„d¦  «        } |¦   «         | j         _        | j                              ‰¦  «        }|                     | j        t          ‰¬¦  «        ¦  «         |S )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                   ó6   •— e Zd ZdZ” g g g fiZ” ”iZd„ Zd„ ZdS )ú9MXTests.test_successWithoutResults.<locals>.DummyResolverah  
            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                 ó@   — t          j        | j        |         ¦  «        S r   )r   rµ  rØ  rä  s     r3   rð  zLMXTests.test_successWithoutResults.<locals>.DummyResolver.lookupMailExchangeŸ  s   € Ý”} T¤W¨V¤_Ñ5Ô5Ð5r5   c                 ó@   — t          j        | j        |         ¦  «        S r   )r   rµ  rA   rä  s     r3   ÚgetHostByNamezGMXTests.test_successWithoutResults.<locals>.DummyResolver.getHostByName¢  s   € Ý”} T¤V¨F¤^Ñ4Ô4Ð4r5   N)rb   rx   ry   r¦   rØ  rA   rð  r  )re   Úips   €€r3   rò  r  �  sX   ø€ € € € € ð	ð 	ð ˜2˜r 2˜,Ð'ˆBØ˜�ˆAð6ð 6ð 6ð5ð 5ð 5ð 5ð 5r5   rò  ©r¬   ©rØ  rÊ  rÞ  r¶   rH   r   )r[   rò  r\   re   r  s      @@r3   Útest_successWithoutResultsz"MXTests.test_successWithoutResults†  s“   øø€ ð ˆØˆð	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ñ 	5ô 	5ð 	5ð* )˜=™?œ?ˆŒÔØŒG�MŠM˜&Ñ!Ô!ˆØ	�Š�dÔ&­	°rÐ(:Ñ(:Ô(:Ñ;Ô;Ð;Øˆr5   c                 óÎ   —  G d„ d¦  «        } |¦   «         | j         _        | j                              d¦  «        }|                     | j        t          d¬¦  «        ¦  «         |S )a'  
        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                   ó   — e Zd ZdZd„ Zd„ ZdS )úAMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolverzw
            Fake resolver which will fail an MX lookup but then succeed a
            getHostByName call.
            c                 óB   — t          j        t          ¦   «         ¦  «        S r   )r   r¶  r   rä  s     r3   rð  zTMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.lookupMailExchange¸  s   € Ý”z¥,¡.¤.Ñ1Ô1Ð1r5   c                 ó*   — t          j        d¦  «        S )Nr  )r   rµ  rä  s     r3   r  zOMXTests.test_failureWithSuccessfulFallback.<locals>.DummyResolver.getHostByName»  s   € Ý”} YÑ/Ô/Ð/r5   N)rb   rx   ry   r¦   rð  r  r/   r5   r3   rò  r  ²  s<   € € € € € ðð ð
2ð 2ð 2ð0ð 0ð 0ð 0ð 0r5   rò  re   r  r  r  )r[   rò  r\   s      r3   Ú"test_failureWithSuccessfulFallbackz*MXTests.test_failureWithSuccessfulFallbackª  sv   € ð
	0ð 
	0ð 
	0ð 
	0ð 
	0ñ 
	0ô 
	0ð 
	0ð )˜=™?œ?ˆŒÔØŒG�MŠM˜(Ñ#Ô#ˆØ	�Š�dÔ&­	°yÐ(AÑ(AÔ(AÑBÔBÐBØˆr5   c                 óè   ‡‡‡— dŠdŠdŠ G ˆˆˆfd„d¦  «        } |¦   «         | j         _        | j                              ‰¦  «        }|                     | j        t          ‰¬¦  «        ¦  «         |S )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                   ó"   •— e Zd ZdZˆ ˆˆfd„ZdS )ú;MXTests.test_cnameWithoutGlueRecords.<locals>.DummyResolverz¬
            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           
      ó\  •— |‰k    r?t          j        t          |t          j        t          ‰¦  «        ¬¦  «        gg g f¦  «        S |‰k    r@t          j        t          |t
          j        t          d‰¦  «        ¬¦  «        gg g f¦  «        S t          j        t          |¦  «        ¦  «        S )Nrü  r   )r   rµ  r   r   rþ  r   r¶  r   )r[   re   ÚaliasÚ	canonicalÚexchanges     €€€r3   rð  zNMXTests.test_cnameWithoutGlueRecords.<locals>.DummyResolver.lookupMailExchangeÓ  sÐ   ø€ Ø˜U’?�?Ý œ=õ !)Ø)/Ý)5Ô):Ý,8¸Ñ,CÔ,Cð!"ñ !"ô !"ðð Øð
ñô ð ð ˜yÒ(Ð(Ý œ=õ !)Ø)/Ý)2¬Ý,5°a¸Ñ,BÔ,Bð!"ñ !"ô !"ðð Øð
ñô ð õ !œ:¥l°6Ñ&:Ô&:Ñ;Ô;Ð;r5   N)rb   rx   ry   r¦   rð  )r)  r*  r+  s   €€€r3   rò  r'  Í  sB   ø€ € € € € ðð ð
<ð <ð <ð <ð <ð <ð <ð <ð <r5   rò  r  r  )r[   rò  r\   r)  r*  r+  s      @@@r3   Útest_cnameWithoutGlueRecordsz$MXTests.test_cnameWithoutGlueRecordsÃ  sŸ   øøø€ ð $ˆØ+ˆ	Ø%ˆð$	<ð $	<ð $	<ð $	<ð $	<ð $	<ð $	<ð $	<ð $	<ñ $	<ô $	<ð $	<ðL )˜=™?œ?ˆŒÔØŒG�MŠM˜%Ñ Ô ˆØ	�Š�dÔ&­	°xÐ(@Ñ(@Ô(@ÑAÔAÐAØˆr5   c                 ó  ‡ ‡—  G d„ d¦  «        }dŠ |¦   «         ‰ j         _        ‰ j                              d‰¦  «        }‰                      |t          j        j        j        ¦  «         ˆˆ fd„}|                     |¦  «         |S )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                   ó   — e Zd ZdZdZd„ ZdS )ú.MXTests.test_cnameChain.<locals>.DummyResolverz
            Fake resolver which generates a CNAME chain of infinite length in
            response to MX lookups.
            r   c           	      ó¶   — | xj         dz  c_         d| j         fz  }t          j        t          |t          j        t	          |¦  «        ¬¦  «        gg g f¦  «        S )Nro   úx-%d.example.comrü  )ÚchainCounterr   rµ  r   r   rþ  )r[   re   r¬   s      r3   rð  zAMXTests.test_cnameChain.<locals>.DummyResolver.lookupMailExchange  st   € ØÐ!Ô! QÑ&Ð!Ô!Ø)¨TÔ->Ð,@Ñ@�Ý”}õ %Ø%+Ý%1Ô%6Ý(4°TÑ(:Ô(:ðñ ô ðð Øð
ñô ð r5   N)rb   rx   ry   r¦   r2  rð  r/   r5   r3   rò  r/  ÿ  s4   € € € € € ðð ð
 ˆLðð ð ð ð r5   rò  r)   r%  c                 óÂ   •— ‰                      | j        d         t          d‰dz   fz  ¦  «        ¦  «         ‰                      ‰j        j        j        ‰dz   ¦  «         d S )Nr   r1  ro   )rH   Úargsr   rØ  rÊ  r2  )r¿  Ú
cnameLimitr[   s    €€r3   ÚcbChainTooLongz/MXTests.test_cnameChain.<locals>.cbChainTooLong  se   ø€ Ø×ÒØ”
˜1”�|Ð,>À*ÈqÁ.ÐARÑ,RÑSÔSñô ð ð ×Ò˜TœWÔ-Ô:¸JÈ¹NÑKÔKÐKÐKÐKr5   )	rØ  rÊ  rÞ  rF  Útwistedr	   rx  ÚCanonicalNameChainTooLongr¶   )r[   rò  r\   r6  r5  s   `   @r3   Útest_cnameChainzMXTests.test_cnameChainø  s´   øø€ ð	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð2 ˆ
Ø(˜=™?œ?ˆŒÔØŒG�MŠMÐ,¨jÑ9Ô9ˆØ×Ò˜1�gœlÔ7ÔQÑRÔRÐRð	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	
�Š�nÑ%Ô%Ð%Øˆr5   c                 óð   ‡‡‡‡— g ŠdŠdŠdŠ G ˆˆˆˆfd„d¦  «        } |¦   «         | j         _        | j                              ‰¦  «        }|                     | j        t          ‰¬¦  «        ¦  «         |S )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                   ó    •— e Zd Zˆ ˆˆˆfd„ZdS )ú8MXTests.test_cnameWithGlueRecords.<locals>.DummyResolverc           
      óî   •— |‰k    s‰rg g g fS t          j        t          ‰t          j        t          ‰¦  «        ¬¦  «        t          ‰t
          j        t          ‰¬¦  «        ¬¦  «        gg g f¦  «        S )Nrü  r  )r   rµ  r   r   rþ  r   )r[   re   r)  r*  r+  ÚlookedUps     €€€€r3   rð  zKMXTests.test_cnameWithGlueRecords.<locals>.DummyResolver.lookupMailExchange3  s–   ø€ Ø˜U’?�? h�?ð   B˜<Ð'Ý”}õ %Ø%*Ý%1Ô%6Ý(4°YÑ(?Ô(?ðñ ô õ
 %Ø%.Ý%.¤^Ý(1°xÐ(@Ñ(@Ô(@ðñ ô ðð Øðñô ð r5   Nrñ  )r)  r*  r+  r>  s   €€€€r3   rò  r<  2  s=   ø€ € € € € ðð ð ð ð ð ð ð ð ð r5   rò  r  r  )r[   rò  r\   r)  r*  r+  r>  s      @@@@r3   Útest_cnameWithGlueRecordsz!MXTests.test_cnameWithGlueRecords&  s©   øøøø€ ð ˆØ#ˆØ+ˆ	Ø%ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð2 )˜=™?œ?ˆŒÔØŒG�MŠM˜%Ñ Ô ˆØ	�Š�dÔ&­	°xÐ(@Ñ(@Ô(@ÑAÔAÐAØˆr5   c                 óâ   ‡‡— dŠdŠ G ˆˆfd„d¦  «        } |¦   «         | j         _        | j                              ‰¦  «        }|                      |t          j        j        j        ¦  «         |S )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                   ó   •— e Zd Zˆ ˆfd„ZdS )ú<MXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolverc           
      óÒ   •— t          j        t          ‰t          j        t          ‰¦  «        ¬¦  «        t          ‰t          j        t          ‰¦  «        ¬¦  «        gg g f¦  «        S )Nrü  )r   rµ  r   r   rþ  )r[   re   Ú
firstAliasÚsecondAliass     €€r3   rð  zOMXTests.test_cnameLoopWithGlueRecords.<locals>.DummyResolver.lookupMailExchangeZ  sy   ø€ Ý”}õ %Ø%/Ý%1Ô%6Ý(4°[Ñ(AÔ(Aðñ ô õ
 %Ø%0Ý%1Ô%6Ý(4°ZÑ(@Ô(@ðñ ô ðð Øðñô ð r5   Nrñ  )rD  rE  s   €€r3   rò  rB  Y  s3   ø€ € € € € ðð ð ð ð ð ð ð r5   rò  )rØ  rÊ  rÞ  rF  r7  r	   rx  ÚCanonicalNameLoop)r[   rò  r\   rD  rE  s      @@r3   Útest_cnameLoopWithGlueRecordsz%MXTests.test_cnameLoopWithGlueRecordsP  s�   øø€ ð *ˆ
Ø*ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð* )˜=™?œ?ˆŒÔØŒG�MŠM˜*Ñ%Ô%ˆØ×Ò˜1�gœlÔ7ÔIÑJÔJÐJØˆr5   c                 óˆ   — g d¢| j         j        d<   | j                             d¦  «                             | j        ¦  «        S )N)zmx1.test.domainzmx2.test.domainzmx3.test.domainrß  )rÀ  r°  rØ  rÞ  r¶   Ú_cbManyRecordsSuccessfulLookuprh   s    r3   ÚtestManyRecordszMXTests.testManyRecordss  sK   € ð.
ð .
ð .
ˆŒ	Ô˜MÑ*ð
 Œw�}Š}˜]Ñ+Ô+×7Ò7ØÔ/ñ
ô 
ð 	
r5   c                 óF  — |                       t          |j        ¦  «                             dd¦  «        d         dv ¦  «         | j                             t          |j        ¦  «        ¦  «         | j                             d¦  «                             | j        |¦  «        S )Nú.ro   r   )Úmx1Úmx2Úmx3rß  )	rS   rc   r¬   r    rØ  r  rÞ  r¶   Ú_cbManyRecordsDifferentResultrã  s     r3   rI  z&MXTests._cbManyRecordsSuccessfulLookup~  s�   € Ø�Š�˜BœG™œ×*Ò*¨3°Ñ2Ô2°1Ô5Ð9NÐNÑOÔOÐOØŒ�Š�˜BœG™œÑ%Ô%Ð%ØŒw�}Š}˜]Ñ+Ô+×7Ò7ØÔ.°ñ
ô 
ð 	
r5   c                 ó6  — |                       t          |j        ¦  «        t          |j        ¦  «        ¦  «         | j                             t          |j        ¦  «        ¦  «         | j                             d¦  «                             | j        ||¦  «        S ré  )r  rc   r¬   rØ  r  rÞ  r¶   Ú_cbManyRecordsLastResult)r[   ÚnextMXrØ  s      r3   rP  z%MXTests._cbManyRecordsDifferentResult…  sx   € Ø×Ò�C ¤™LœL­#¨f¬kÑ*:Ô*:Ñ;Ô;Ð;ØŒ�Š�˜FœKÑ(Ô(Ñ)Ô)Ð)àŒw�}Š}˜]Ñ+Ô+×7Ò7ØÔ)¨2¨vñ
ô 
ð 	
r5   c                 ó   — |                       t          |j        ¦  «        t          |j        ¦  «        ¦  «         |                       t          |j        ¦  «        t          |j        ¦  «        ¦  «         | j                             t          |j        ¦  «        ¦  «         | j                             t          |j        ¦  «        ¦  «         | j                             d¦  «                             | j        |¦  «        S ré  )	r  rc   r¬   rØ  r  r  rÞ  r¶   Ú"_cbManyRecordsRepeatSpecificResult)r[   ÚlastMXrØ  rS  s       r3   rR  z MXTests._cbManyRecordsLastResult�  sÀ   € Ø×Ò�C ¤™LœL­#¨f¬kÑ*:Ô*:Ñ;Ô;Ð;Ø×Ò�C ¤Ñ,Ô,­c°&´+Ñ.>Ô.>Ñ?Ô?Ð?àŒ�Š�˜FœKÑ(Ô(Ñ)Ô)Ð)ØŒ×Ò�˜Vœ[Ñ)Ô)Ñ*Ô*Ð*àŒw�}Š}˜]Ñ+Ô+×7Ò7ØÔ3°Vñ
ô 
ð 	
r5   c                 óz   — |                       t          |j        ¦  «        t          |j        ¦  «        ¦  «         d S r   rô  )r[   ÚagainMXrS  s      r3   rU  z*MXTests._cbManyRecordsRepeatSpecificResult˜  s2   € Ø×Ò�˜Wœ\Ñ*Ô*­C°´Ñ,<Ô,<Ñ=Ô=Ð=Ð=Ð=r5   N)rb   rx   ry   r¦   r�   rm  rÛ  r   rz   r{   rà  rß  rç  rê  rø  r  r  r	  r  r  r  r!  r,  r9  r?  rG  rJ  rI  rP  rR  rU  r/   r5   r3   rÕ  rÕ  ì  sæ  € € € € € ðð ðLð Lð Lð
!ð !ð !ð
ð 
ð 
ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðOð Oñ @Ô?ðOð@ð @ð @ðIð Ið IðPð Pð Pðð ð ð69ð 9ð 9ð 9ð 9ð 9ð 8ð 8ð 8ð"Bð Bð Bð(Bð Bð Bð("ð "ð "ðHð ð ð23ð 3ð 3ðj,ð ,ð ,ð\(ð (ð (ðT!ð !ð !ðF €VˆCÔ Ò$Ð&>Ñ?Ô?ð
ð 
ñ @Ô?ð
ð
ð 
ð 
ð
ð 
ð 
ð	
ð 	
ð 	
ð>ð >ð >ð >ð >r5   rÕ  c                   ó¸   — e Zd Z ej        ed¦  «        €dZd„ Zd„ Z e	e
j        dk    d¦  «        d„ ¦   «         Z e	e
j        dk    d¦  «        d„ ¦   «         ZdS )	ÚLiveFireExerciseTestsNz1UDP support is required to determining MX recordsc                 ó6   — t          | ¦  «         g d¢| _        d S )N)Ú	domainDirÚinsertionDomainÚinsertionQueueÚdestinationDomainÚdestinationQueue)rÌ  Útmpdirsrh   s    r3   r�   zLiveFireExerciseTests.setUp¡  s$   € Ý�‰Œˆð
ð 
ð 
ˆŒˆˆr5   c                 óš   — | j         D ]5}t          j                             |¦  «        rt	          j        |¦  «         Œ6t          | ¦  «        S r   )ra  r¼   r½   r…   rk  rl  rÓ  )r[   r\   s     r3   rm  zLiveFireExerciseTests.tearDown«  sH   € Ø”ð 	!ð 	!ˆAÝŒw�~Š~˜aÑ Ô ð !Ý”˜aÑ Ô Ð øÝ˜4Ñ Ô Ð r5   r(   r*   c                 óÆ  ‡ ‡‡‡— t           j                              ¦   «         }|j                             t          j                             ¦   «         ¦  «         t           j                             |d¦  «        Š‰ 	                    dd¦  «         | 
                    d‰¦  «         |j        d         |j        d<   t          |j        d         j        ‰                     ¦   «         ¦  «         |                     t           j                             |¦  «        ¦  «         |                     ¦   «         }t%          j        d|d¬¦  «        ‰ _        t+          g d	¢¦  «        Št-          ¦   «         Št/          j        ¦   «         }ˆfd
„|_        ˆfd„|_        t%          j        d‰ j                             ¦   «         j        |¦  «         ˆˆ fd„}‰                     |¦  «         ‰S )Nr\  r¶  rŒ   rß  rí   r   rá   r½  )ú
HELO mesonzMAIL FROM: <user@hostname>zRCPT TO: <user@test.domain>ÚDATAúThis is the messagerL  ÚQUITc                  ó   •— ‰ S r   r/   ©r©  s   €r3   r9  z9LiveFireExerciseTests.testLocalDelivery.<locals>.<lambda>Ï  ó   ø€ ˜V€ r5   c                  ó.   •— ‰                      d ¦  «        S r   ©Úcallback©r4  rk  s    €r3   r9  z9LiveFireExerciseTests.testLocalDelivery.<locals>.<lambda>Ð  ó   ø€ ¨t¯}ª}¸TÑ/BÔ/B€ r5   c                 ó$  •— ‰                      dd t          j        ¦  «        d         }|                     d¦  «                             ¦   «         }‰                     |                     d¦  «        d¦  «         ‰j                             ¦   «         S ©Nr¶  ro   r   rf  éÿÿÿÿ)	r¸  r   r¹  r  rÄ   r  ÚfindÚ
smtpServerrÈ  )Úignr4  r¢  re   r[   s      €€r3   Úfinishedz9LiveFireExerciseTests.testLocalDelivery.<locals>.finishedÓ  su   ø€ Ø×'Ò'¨°µd´mÑDÔDÀQÔGˆDØ—/’/ !Ñ$Ô$×)Ò)Ñ+Ô+ˆCØ×Ò §¢Ð)>Ñ ?Ô ?ÀÑDÔDÐDà”?×0Ò0Ñ2Ô2Ð2r5   )r	   r”   Ú
smtpPortalr  r   rª  ÚAllowAnonymousAccessrÏ   r›  r�   r•   rï   r  r©  ÚsetQueuerB  rC  rç   r   rÃ  rt  r   r   r   ÚClientFactoryÚclientConnectionLostÚ
connectTCPrÅ  rÄ  r¶   )r[   r¡   r¯   rv  r©  re   rk  s   `   @@@r3   ÚtestLocalDeliveryz'LiveFireExerciseTests.testLocalDelivery±  sº  øøøø€ å”)×'Ò'Ñ)Ô)ˆØÔ×*Ò*­4¬=×+MÒ+MÑ+OÔ+OÑPÔPÐPÝ”×1Ò1°'¸;ÑGÔGˆØ�Š�v˜zÑ*Ô*Ð*Ø×Ò˜-¨Ñ0Ô0Ð0Ø%œo¨mÔ<ˆŒ˜ÑÝˆGŒO˜BÔÔ/°×1NÒ1NÑ1PÔ1PÑQÔQÐQà×Ò�œ×0Ò0°Ñ9Ô9Ñ:Ô:Ð:à×"Ò"Ñ$Ô$ˆå!Ô+¨A¨q¸KÐHÑHÔHˆŒå$ðð ð ñ

ô 

ˆõ ‰zŒzˆÝÔ"Ñ$Ô$ˆØ#�^�^�^ˆŒ
Ø!BÐ!BÐ!BÐ!BˆÔÝÔ˜;¨¬×(?Ò(?Ñ(AÔ(AÔ(FÈÑJÔJÐJð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	×Ò˜Ñ"Ô"Ð"Øˆr5   c                 óž  ‡ ‡‡‡‡‡	— t           j                              ¦   «         }|j                             t          j                             ¦   «         ¦  «         t           j                             |d¦  «        Š| 	                    d‰¦  «         t          j        d¦  «         |                     t           j                             d¦  «        ¦  «         |j                             t           j                             |¦  «        ¦  «         t           j                             |j        ¦  «        Š	‰	xj        dz  c_        t           j                             ‰	d¦  «        Št           j                             ‰ j        ¦  «        ‰	_        dg‰ j        j        d<   |                     ¦   «         }t;          j        d|d¬	¦  «        ‰ _        t           j                              ¦   «         }|j                             t          j                             ¦   «         ¦  «         t           j                             |d
¦  «        Š‰                      dd¦  «         | 	                    d‰¦  «         t          j        d¦  «         |                     t           j                             d¦  «        ¦  «         t           j                             ‰	d¦  «        Š‰ !                    ¦   «          |                     ¦   «         }t;          j        d|d¬	¦  «        ‰ _"        ‰ j"         #                    ¦   «         j$        ‰	_%        tM          g d¢¦  «        ŠtO          ¦   «         ŠtQ          j)        ¦   «         }ˆfd„|_(        ˆfd„|_*        t;          j+        d‰ j         #                    ¦   «         j$        |¦  «         ˆˆˆ	ˆ fd„}‰ ,                    |¦  «         ‰S )Nr]  zinsertion.domainr^  )ztest.identity.hostnamero   rá   zdestination.domainr   r½  r_  r¶  rŒ   r`  )rd  zMAIL FROM: <user@wherever>z"RCPT TO: <user@destination.domain>re  rf  rL  rg  c                  ó   •— ‰ S r   r/   ri  s   €r3   r9  z9LiveFireExerciseTests.testRelayDelivery.<locals>.<lambda>  rj  r5   c                  ó.   •— ‰                      d ¦  «        S r   rl  rn  s    €r3   r9  z9LiveFireExerciseTests.testRelayDelivery.<locals>.<lambda>  ro  r5   c                 óh   •— ‰                      ¦   «         }ˆˆˆfd„}|                     |¦  «         |S )Nc                 ó‚  •— ‰                      dd t          j        ¦  «        d         }|                     d¦  «                             ¦   «         }‰                     |                     d¦  «        d¦  «         ‰j                             ¦   «          ‰j	                             ¦   «          ‰ 
                    ¦   «          d S rq  )r¸  r   r¹  r  rÄ   r  rs  Ú	insServerrÈ  Ú
destServerÚstopService)ru  r4  r¢  re   Úhelperr[   s      €€€r3   Ú	deliveredzLLiveFireExerciseTests.testRelayDelivery.<locals>.finished.<locals>.delivered  s¡   ø€ Ø×+Ò+¨F°D½$¼-ÑHÔHÈÔK�Ø—o’o aÑ(Ô(×-Ò-Ñ/Ô/�Ø×#Ò# C§H¢HÐ-BÑ$CÔ$CÀRÑHÔHÐHà”×,Ò,Ñ.Ô.Ð.Ø”×-Ò-Ñ/Ô/Ð/Ø×"Ò"Ñ$Ô$Ð$Ð$Ð$r5   )Ú
checkStater¶   )ru  rš   r‡  re   r†  rw  r[   s      €€€€r3   rv  z9LiveFireExerciseTests.testRelayDelivery.<locals>.finished  sT   ø€ ð ×)Ò)Ñ+Ô+ˆHð%ð %ð %ð %ð %ð %ð %ð × Ò  Ñ+Ô+Ð+ØˆOr5   )-r	   r”   rw  r  r   rª  rx  rÏ   r›  r•   r¼   rS  ry  rx  r�  rY   ÚsetDefaultDomainrB  rC  ÚSmartHostSMTPRelayingManagerrŽ  ÚfArgsÚRelayStateHelperr×  rÊ  ÚmxcalcrÀ  r°  rç   r   rÃ  rƒ  r�   ÚstartServicer„  rÅ  rÄ  ÚPORTr   r   r   rz  r{  r|  r¶   )
r[   ÚinsServr¯   ÚdestServrv  r©  re   rk  r†  rw  s
   `    @@@@@r3   ÚtestRelayDeliveryz'LiveFireExerciseTests.testRelayDeliveryÝ  sE  øøøøøø€ õ ”)×'Ò'Ñ)Ô)ˆØÔ×*Ò*­4¬=×+MÒ+MÑ+OÔ+OÑPÔPÐPÝ”×1Ò1°'Ð;LÑMÔMˆØ×ÒÐ,¨fÑ5Ô5Ð5Ý
ŒÐ!Ñ"Ô"Ð"Ø×Ò�Ô*×0Ò0Ð1AÑBÔBÑCÔCÐCØŒ×(Ò(­¬×)@Ò)@ÀÑ)IÔ)IÑJÔJÐJÝÔ#×@Ò@ÀÄÑOÔOˆØˆŒÐ4Ñ4ˆŒÝÔ"×3Ò3°G¸QÑ?Ô?ˆåÔ*×7Ò7¸¼ÑFÔFˆŒà5@°MˆŒ	ÔÐ0Ñ1à×"Ò"Ñ$Ô$ˆÝ Ô*¨1¨a¸;ÐGÑGÔGˆŒõ ”9×(Ò(Ñ*Ô*ˆØÔ×+Ò+­D¬M×,NÒ,NÑ,PÔ,PÑQÔQÐQÝ”×1Ò1°(Ð<OÑPÔPˆØ�Š�v˜zÑ*Ô*Ð*Ø×ÒÐ/°Ñ8Ô8Ð8Ý
ŒÐ#Ñ$Ô$Ð$Ø×Ò�$Ô+×1Ò1Ð2DÑEÔEÑFÔFÐFÝÔ"×3Ò3°G¸QÑ?Ô?ˆØ×ÒÑÔÐà×#Ò#Ñ%Ô%ˆÝ!Ô+¨A¨q¸KÐHÑHÔHˆŒð ”×.Ò.Ñ0Ô0Ô5ˆŒå$ðð ð ñ

ô 

ˆõ ‰zŒzˆÝÔ"Ñ$Ô$ˆØ#�^�^�^ˆŒ
Ø!BÐ!BÐ!BÐ!BˆÔÝÔ˜;¨¬×(>Ò(>Ñ(@Ô(@Ô(EÀqÑIÔIÐIð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð" 	×Ò˜Ñ"Ô"Ð"Øˆr5   )rb   rx   ry   r   ÚIReactorUDPr   Úskipr�   rm  r   rz   r{   r}  r’  r/   r5   r3   rZ  rZ  œ  s¶   € € € € € à€zÔ˜g tÑ,Ô,Ð4ØBˆð
ð 
ð 
ð!ð !ð !ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð)ð )ñ @Ô?ð)ðV €VˆCÔ Ò$Ð&>Ñ?Ô?ðKð Kñ @Ô?ðKð Kð Kr5   rZ  c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚLineBufferMessagec                 ó0   — g | _         d| _        d| _        d S )NF)ÚlinesÚeomÚlostrh   s    r3   r7  zLineBufferMessage.__init__-  s   € ØˆŒ
ØˆŒØˆŒ	ˆ	ˆ	r5   c                 ó:   — | j                              |¦  «         d S r   )r˜  r2  )r[   rÆ   s     r3   rœ   zLineBufferMessage.lineReceived2  s   € ØŒ
×Ò˜$ÑÔÐÐÐr5   c                 ó8   — d| _         t          j        d¦  «        S )NTz
<Whatever>)r™  r   rµ  rh   s    r3   rµ   zLineBufferMessage.eomReceived5  s   € ØˆŒÝŒ}˜\Ñ*Ô*Ð*r5   c                 ó   — d| _         d S )NT)rš  rh   s    r3   rž   z LineBufferMessage.connectionLost9  s   € ØˆŒ	ˆ	ˆ	r5   N)rb   rx   ry   r7  rœ   rµ   rž   r/   r5   r3   r–  r–  ,  sP   € € € € € ðð ð ð
 ð  ð  ð+ð +ð +ðð ð ð ð r5   r–  c                   ó¦   — e Zd Zg d¢Zd„ Z eej        dk    d¦  «        d„ ¦   «         Zd„ Z	d„ Z
 eej        dk    d¦  «        d„ ¦   «         Zd	„ Zd
S )Ú
AliasTests©z
First linez	Next linerí   zAfter a blank linez	Last linec                 óL  — i }g d¢}|D ]$}t           j                             ||dd ¦  «         Œ%|                      |d         ddg¦  «         |                      |d         dg¦  «         |                      |d         d	g¦  «         |                      |d
         g d¢¦  «         d S )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)  ÚhandlerH   )r[   r¿   r˜  Úls       r3   Ú
testHandlezAliasTests.testHandleA  s×   € Øˆð
ð 
ð 
ˆð ð 	;ð 	;ˆAÝŒJ×Ò˜f a¨°TÑ:Ô:Ð:Ð:à×Ò˜ œ¨.¸*Ð)EÑFÔFÐFØ×Ò˜ 
Ô+¨oÐ->Ñ?Ô?Ð?Ø×Ò˜ Ô,Ð/GÐ.HÑIÔIÐIØ×ÒØ�;ÔÐ!RÐ!RÐ!Rñ	
ô 	
ð 	
ð 	
ð 	
r5   r(   r*   c                 óä  — dt          ¦   «         i}t          j                             |t	          j        t          j        d¦  «                             ¦   «         ¦  «        ¬¦  «        }|  	                    t          |¦  «        d¦  «         |d         }t          |¦  «        }dD ]+}|                      |                     |¦  «        d¦  «         Œ,|  	                    t          |¦  «        d¦  «         |d	         }t          |¦  «        }d
D ]+}|                      |                     |¦  «        d¦  «         Œ,|  	                    t          |¦  «        d¦  «         |d         }t          |¦  «        }|  	                    |                     d¦  «        d¦  «         dD ]/}|                      |                     |¦  «        dd|z  ¦  «         Œ0|  	                    t          |¦  «        d¦  «         d S )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/thisrr  rƒ  Úusertwo)ÚthisaddressÚthataddressÚlastaddressÚlastuserz/includable)z	/filenameÚprogramr
   z%s not found)rî   r	   r)  ÚloadAliasFilerð  rñ  ÚtextwrapÚdedentÚencoderH   rI   rc   r  rs  )r[   rY   r¿   ÚgroupÚsrA   s         r3   ÚtestFileLoaderzAliasTests.testFileLoaderU  sØ  € à•v‘x”x�.ˆÝ”×)Ò)ØÝŒzÝ”ðñ
ô 
÷ ’&‘(”(ñô ð *ñ 
ô 
ˆð" 	×Ò�˜V™œ aÑ(Ô(Ð(à�zÔ"ˆÝ�‰JŒJˆð
ð 	/ð 	/ˆAð ×Ò §¢ q¡	¤	¨2Ñ.Ô.Ð.Ð.Ø×Ò�˜U™œ QÑ'Ô'Ð'à�yÔ!ˆÝ�‰JŒJˆØ>ð 	/ð 	/ˆAØ×Ò §¢ q¡	¤	¨2Ñ.Ô.Ð.Ð.Ø×Ò�˜U™œ QÑ'Ô'Ð'à�zÔ"ˆÝ�‰JŒJˆØ×Ò˜Ÿš Ñ.Ô.°Ñ3Ô3Ð3Ø4ð 	Cð 	CˆAØ×Ò §¢ q¡	¤	¨2¨~ÀÑ/AÑBÔBÐBÐBØ×Ò�˜U™œ QÑ'Ô'Ð'Ð'Ð'r5   c                 ó*  — t          ¦   «         t          ¦   «         t          ¦   «         f}t          j                             |¦  «        }| j        D ]}|                     |¦  «         Œ|                     ¦   «                              | j        |¦  «        S r   )	r–  r	   r)  ÚMultiWrapperr˜  rœ   rµ   r¶   Ú_cbMultiWrapper)r[   rŠ  r¢  ÚLs       r3   ÚtestMultiWrapperzAliasTests.testMultiWrapper„  s‚   € Ý Ñ"Ô"Õ$5Ñ$7Ô$7Õ9JÑ9LÔ9LÐLˆÝŒj×%Ò% dÑ+Ô+ˆà”ð 	 ð 	 ˆAØ×Ò˜QÑÔÐÐØ�ŠÑ Ô ×,Ò,¨TÔ-AÀ4ÑHÔHÐHr5   c                 ó¸   — |D ]V}|                       |j        ¦  «         |                      |j        ¦  «         |                      | j        |j        ¦  «         ŒWd S r   )rS   r™  r»   rš  rH   r˜  )r[   r8  rŠ  r3  s       r3   r¼  zAliasTests._cbMultiWrapperŒ  sb   € Øð 	2ð 	2ˆAØ�OŠO˜AœEÑ"Ô"Ð"Ø×Ò˜QœVÑ$Ô$Ð$Ø×Ò˜TœZ¨¬Ñ1Ô1Ð1Ð1ð	2ð 	2r5   c                 ó,  — |                       ¦   «         }t          j                             |d d ¦  «        }|                     ¦   «         }| j        D ]}|                     |¦  «         Œ|                     ¦   «                              | j	        |¦  «        S r   )
r«   r	   r)  Ú	FileAliasÚcreateMessageReceiverr˜  rœ   rµ   r¶   Ú_cbTestFileAlias)r[   ÚtmpfilerA   r3  r¦  s        r3   ÚtestFileAliaszAliasTests.testFileAlias’  s€   € à—+’+‘-”-ˆÝŒJ× Ò  ¨$°Ñ5Ô5ˆØ×#Ò#Ñ%Ô%ˆà”ð 	ð 	ˆAØ�NŠN˜1ÑÔÐÐØ�}Š}‰Œ×*Ò*¨4Ô+@À'ÑJÔJÐJr5   c                 óÆ   — t          |¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |                      d„ |D ¦   «         | j        ¦  «         d S )Nc                 ó"   — g | ]}|d d…         ‘ŒS ©Nrr  r/   ©r1   r½  s     r3   r8   z/AliasTests._cbTestFileAlias.<locals>.<listcomp>Ÿ  s    € Ð0Ð0Ð0 Q˜!˜C˜R˜Cœ&Ð0Ð0Ð0r5   ©r®   Ú	readlinesrH   r˜  )r[   r8  rÄ  r¯   r˜  s        r3   rÃ  zAliasTests._cbTestFileAliasœ  sš   € Ý�'‰]Œ]ð 	"˜aØ—K’K‘M”MˆEð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"à×ÒÐ0Ð0¨%Ð0Ñ0Ô0°$´*Ñ=Ô=Ð=Ð=Ð=s   �1±5¸5N)rb   rx   ry   r˜  r§  r   rz   r{   r¹  r¾  r¼  rÅ  rÃ  r/   r5   r3   rŸ  rŸ  =  sÆ   € € € € € àNÐNÐN€Eð
ð 
ð 
ð( €VˆCÔ Ò$Ð&>Ñ?Ô?ð,(ð ,(ñ @Ô?ð,(ð\Ið Ið Ið2ð 2ð 2ð €VˆCÔ Ò$Ð&>Ñ?Ô?ðKð Kñ @Ô?ðKð>ð >ð >ð >ð >r5   rŸ  c                   ó    — e Zd ZdZd„ Zdd„ZdS )ÚDummyDomainz/
    Test domain for L{AddressAliasTests}.
    c                 ó   — || _         d S r   )r
   )r[   r
   s     r3   r7  zDummyDomain.__init__§  s   € ØˆŒˆˆr5   Nc                 óT   ‡ ‡— |rt           j                             d¦  «        ‚ˆ ˆfd„S )a
  
        @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          ‰ j        ¦  «        k    S r   )rc   r
   r   s   €€r3   r9  z$DummyDomain.exists.<locals>.<lambda>µ  s   ø€ �t�s 4¤<Ñ0Ô0Ò0€ r5   )r	   r   rŽ   rÐ  s   `` r3   r…   zDummyDomain.existsª  s6   øø€ ð ð 	/Ý”)×'Ò'¨Ñ.Ô.Ð.à0Ð0Ð0Ð0Ð0Ð0r5   r   )rb   rx   ry   r¦   r7  r…   r/   r5   r3   rÍ  rÍ  ¢  sA   € € € € € ðð ðð ð ð1ð 1ð 1ð 1ð 1ð 1r5   rÍ  c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚAddressAliasTestsz7
    Tests for L{twisted.mail.alias.AddressAlias}.
    c                 óî   — t           j                             d¦  «        | _        | j        j        t          | j        ¦  «        i}t           j                             | j        || j        ¦  «        | _        dS )z+
        Setup an L{AddressAlias}.
        zfoo@barN)r	   r   rï  r
   re   rÍ  r)  ÚAddressAlias)r[   rY   s     r3   r�   zAddressAliasTests.setUp¾  sW   € õ ”y×(Ò(¨Ñ3Ô3ˆŒØ”<Ô&­°D´LÑ(AÔ(AÐBˆÝ”Z×,Ò,¨T¬\¸7ÀDÄLÑQÔQˆŒ
ˆ
ˆ
r5   c                 ó^   — |                       | j                             ¦   «         ¦  «         dS )z”
        L{createMessageReceiever} calls C{exists()} on the domain object
        which key matches the C{alias} passed to L{AddressAlias}.
        N)rS   r)  rÂ  rh   s    r3   Útest_createMessageReceiverz,AddressAliasTests.test_createMessageReceiverÆ  s*   € ð
 	�Š˜œ
×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;r5   c                 óV   — |                       t          | j        ¦  «        d¦  «         dS )zP
        The string presentation of L{AddressAlias} includes the alias.
        z<Address foo@bar>N)rH   rc   r)  rh   s    r3   ri   zAddressAliasTests.test_strÍ  s)   € ð 	×Ò�˜TœZ™œÐ*=Ñ>Ô>Ð>Ð>Ð>r5   c                 óp   — |                       | j                             | j        di¦  «        d¦  «         dS )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)rH   r)  Úresolver
   rh   s    r3   Útest_resolvezAddressAliasTests.test_resolveÓ  s7   € ð
 	×Ò˜œ×+Ò+¨T¬\¸5Ð,AÑBÔBÀDÑIÔIÐIÐIÐIr5   c                 ób   — |                       | j                             i ¦  «        d¦  «         dS )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)rH   r)  rÚ  rh   s    r3   Útest_resolveWithoutAliasmapz-AddressAliasTests.test_resolveWithoutAliasmapÚ  s0   € ð
 	×Ò˜œ×+Ò+¨BÑ/Ô/°Ñ6Ô6Ð6Ð6Ð6r5   N)	rb   rx   ry   r¦   r�   r×  ri   rÛ  rÝ  r/   r5   r3   rÓ  rÓ  ¸  so   € € € € € ðð ðRð Rð Rð<ð <ð <ð?ð ?ð ?ðJð Jð Jð7ð 7ð 7ð 7ð 7r5   rÓ  c                   ó   — e Zd ZdgZdS )ÚDummyProcessÚonEndN)rb   rx   ry   Ú	__slots__r/   r5   r3   rß  rß  â  s   € € € € € Ø�	€I€I€Ir5   rß  c                   ó   — e Zd ZdZd„ ZdS )ÚMockProcessAliaszD
    An alias processor that doesn't actually launch processes.
    c                 ó   — dS )z(
        Don't spawn a process.
        Nr/   )r[   Úprotor²  r½   s       r3   ÚspawnProcesszMockProcessAlias.spawnProcessë  ó   € € € r5   N)rb   rx   ry   r¦   ræ  r/   r5   r3   rã  rã  æ  s-   € € € € € ðð ðð ð ð ð r5   rã  c                   ó   — e Zd ZdZeZdS )ÚMockAliasGroupz3
    An alias group using C{MockProcessAlias}.
    N)rb   rx   ry   r¦   rã  ÚprocessAliasFactoryr/   r5   r3   ré  ré  ñ  s"   € € € € € ðð ð +ÐÐÐr5   ré  c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚStubProcessz—
    Fake implementation of L{IProcessTransport}.

    @ivar signals: A list of all the signals which have been sent to this fake
        process.
    c                 ó   — g | _         d S r   )Úsignalsrh   s    r3   r7  zStubProcess.__init__  s   € ØˆŒˆˆr5   c                 ó   — dS )z8
        No-op implementation of disconnection.
        Nr/   rh   s    r3   ÚloseConnectionzStubProcess.loseConnection  rç  r5   c                 ó:   — | j                              |¦  «         dS )zL
        Record a signal sent to this process for later inspection.
        N)rî  r2  )r[   Úsignals     r3   ÚsignalProcesszStubProcess.signalProcess	  s    € ð 	Œ×Ò˜FÑ#Ô#Ð#Ð#Ð#r5   N)rb   rx   ry   r¦   r7  rð  ró  r/   r5   r3   rì  rì  ù  sK   € € € € € ðð ðð ð ðð ð ð
$ð $ð $ð $ð $r5   rì  c                   ó*  — e Zd ZdZ ej        ed¦  «        €dZg d¢Zd„ Z	d„ Z
d„ Zd„ Z eej        d	k    d
¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Z eej        d	k    d
¦  «        d„ ¦   «         Z eej        d	k    d
¦  «        d„ ¦   «         ZdS )ÚProcessAliasTestsz%
    Tests for alias resolution.
    NzIReactorProcess not supportedr   c                 ó  — |dz  dz  }|                       t          j        |¦  «        ¦  «         |                      t          j        |¦  «        |¦  «         |                      t          j        |¦  «        ¦  «         |S )a  
        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   )rS   r¼   Ú	WIFEXITEDrH   ÚWEXITSTATUSr»   ÚWIFSIGNALED)r[   ÚcodeÚstatuss      r3   Ú
exitStatuszProcessAliasTests.exitStatus  sr   € ð ˜!‘)˜q‘ˆð 	�Š�œ VÑ,Ô,Ñ-Ô-Ð-Ø×Ò�œ¨Ñ/Ô/°Ñ6Ô6Ð6Ø×Ò�œ¨Ñ/Ô/Ñ0Ô0Ð0àˆr5   c                 óö   — |}|                       t          j        |¦  «        ¦  «         |                      t          j        |¦  «        |¦  «         |                      t          j        |¦  «        ¦  «         |S )a  
        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.
        )rS   r¼   rú  rH   ÚWTERMSIGr»   rø  )r[   rò  rü  s      r3   ÚsignalStatuszProcessAliasTests.signalStatus0  sj   € ð ˆð 	�Š�œ vÑ.Ô.Ñ/Ô/Ð/Ø×Ò�œ VÑ,Ô,¨fÑ5Ô5Ð5Ø×Ò�œ fÑ-Ô-Ñ.Ô.Ð.àˆr5   c                 ó@   — t           j        | _        dt           _        dS )zB
        Replace L{smtp.DNSNAME} with a well-known value.
        rí   N)r   ÚDNSNAMErh   s    r3   r�   zProcessAliasTests.setUpH  s   € õ ”|ˆŒØ�Œˆˆr5   c                 ó(   — | j         t          _         dS )z@
        Restore the original value of L{smtp.DNSNAME}.
        N)r  r   rh   s    r3   rm  zProcessAliasTests.tearDownO  s   € ð ”|�Œˆˆr5   r(   r*   c                 ó®  ‡ — t          ‰                      ¦   «         ¦  «        }|                     d¦  «         t          j        |j        d¦  «         t          j                             |j        dd¦  «        }| 	                    ¦   «         }‰ j
        D ]}|                     |¦  «         Œˆ fd„}|                     ¦   «                              |¦  «        S )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                 óÈ   •— t          d¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   ‰                     d„ |D ¦   «         ‰j        ¦  «         d S )Nzprocess.alias.outc                 ó"   — g | ]}|d d…         ‘ŒS rÈ  r/   rÉ  s     r3   r8   zPProcessAliasTests.test_processAlias.<locals>._cbProcessAlias.<locals>.<listcomp>n  s    € Ð4Ð4Ð4¨˜a   œfÐ4Ð4Ð4r5   rÊ  )r8  r¯   r˜  r[   s      €r3   Ú_cbProcessAliasz<ProcessAliasTests.test_processAlias.<locals>._cbProcessAliask  sž   ø€ ÝÐ)Ñ*Ô*ð &¨aØŸš™œ�ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &à×ÒÐ4Ð4¨eÐ4Ñ4Ô4°d´jÑAÔAÐAÐAÐAs   ‘2²6¹6)r"   r«   Ú
setContentr¼   Úchmodr½   r	   r)  ÚProcessAliasrÂ  r˜  rœ   rµ   r¶   )r[   ÚshrA   r3  r¦  r  s   `     r3   Útest_processAliasz#ProcessAliasTests.test_processAliasU  sÙ   ø€ õ �d—k’k‘m”mÑ$Ô$ˆØ
�Šðñ	
ô 	
ð 	
õ 	Œ�”˜%Ñ Ô Ð ÝŒJ×#Ò# B¤G¨T°4Ñ8Ô8ˆØ×#Ò#Ñ%Ô%ˆà”ð 	ð 	ˆAØ�NŠN˜1ÑÔÐÐð	Bð 	Bð 	Bð 	Bð 	Bð
 �}Š}‰Œ×*Ò*¨?Ñ;Ô;Ð;r5   c                 óÊ  ‡ ‡‡— t          j        ¦   «         }t          ¦   «         Št          j                             ¦   «         Š‰                     ‰¦  «         t          j                             ‰d|¦  «        }|                     ¦   «         } |j	        |j
        ¦  «         ˆˆ ˆfd„}‰                      |t          j        j        ¦  «         |                     |¦  «         |S )a  
        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                 ó¾   •— ‰                      ‰j        dg¦  «         ‰                     t          ‰                     t
          j        ¦  «        ¦  «        ¦  «         d S )NÚKILL)rH   rî  ÚprocessEndedr   r   rò  ÚSIGKILL)r8  rå  r[   r¤   s    €€€r3   ÚtimedOutz<ProcessAliasTests.test_processAliasTimeout.<locals>.timedOut‚  sS   ø€ Ø×Ò˜YÔ.°°Ñ9Ô9Ð9ð ×ÒÕ0°×1BÒ1BÅ6Ä>Ñ1RÔ1RÑSÔSÑTÔTÐTÐTÐTr5   )r   rx  rì  r	   r)  ÚProcessAliasProtocolr›   ÚMessageWrapperrµ   ry  ÚcompletionTimeoutrF  ÚProcessAliasTimeoutr¶   )r[   r   Úreceiverr\   r  rå  r¤   s   `    @@r3   Útest_processAliasTimeoutz*ProcessAliasTests.test_processAliasTimeoutr  sß   øøø€ õ ”*‘,”,ˆÝ‘M”Mˆ	Ý”
×/Ò/Ñ1Ô1ˆØ×Ò˜YÑ'Ô'Ð'å”:×,Ò,¨U°D¸'ÑBÔBˆØ× Ò Ñ"Ô"ˆØˆŒ˜Ô2Ñ3Ô3Ð3ð	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	×Ò˜1�dœjÔ<Ñ=Ô=Ð=Ø	�Š�hÑÔÐØˆr5   c                 ót  — t          ¦   «         }t          j                             ¦   «         } |j        |¦  «         t          j                             |dd¦  «        } |j        t          j        t          d¦  «        ¦  «        ¦  «         |  
                    |                     ¦   «         t          ¦  «        S )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   rF  rµ   )r[   r¤   r   r  s       r3   Útest_earlyProcessTerminationz.ProcessAliasTests.test_earlyProcessTerminationŒ  s‘   € õ  ‘M”Mˆ	Ý”:×2Ò2Ñ4Ô4ˆØˆÔ 	Ñ*Ô*Ð*Ý”:×,Ò,¨X°t¸TÑBÔBˆØˆÔ�gœo­k¸!©n¬nÑ=Ô=Ñ>Ô>Ð>Ø×!Ò! (×"6Ò"6Ñ"8Ô"8½+ÑFÔFÐFr5   c                 ót  — t          ¦   «         }t          j                             ¦   «         } |j        |¦  «         t          j                             |dd¦  «        } |j        t          j        t          |¦  «        ¦  «        ¦  «         |  
                    |                     ¦   «         t          ¦  «        S )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   rF  rµ   )r[   rü  r¤   r   r  s        r3   Ú_terminationTestz"ProcessAliasTests._terminationTest™  s•   € õ  ‘M”Mˆ	Ý”:×2Ò2Ñ4Ô4ˆØˆÔ 	Ñ*Ô*Ð*Ý”:×,Ò,¨X°t¸TÑBÔBˆØˆÔ�gœoÕ.?ÀÑ.GÔ.GÑHÔHÑIÔIÐIØ×!Ò! (×"6Ò"6Ñ"8Ô"8Õ:KÑLÔLÐLr5   c                 óR   — |                       |                      d¦  «        ¦  «        S )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ý  rh   s    r3   Útest_errorProcessTerminationz.ProcessAliasTests.test_errorProcessTermination¦  s$   € ð ×$Ò$ T§_¢_°QÑ%7Ô%7Ñ8Ô8Ð8r5   c                 óf   — |                       |                      t          j        ¦  «        ¦  «        S )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ò  ÚSIGHUPrh   s    r3   Útest_signalProcessTerminationz/ProcessAliasTests.test_signalProcessTermination®  s(   € ð ×$Ò$ T×%6Ò%6µv´}Ñ%EÔ%EÑFÔFÐFr5   c           	      ó"  — i }dt          |g d¢¦  «        i}t          g d¢|d¦  «        }t          ddg|d¦  «        }t          j                             d|d¦  «        }|                     |||d	œ¦  «         |                     |¦  «        }t          t          |j	        ¦  «        }| 
                    ¦   «          t          t          t          j                             d
dd¦  «        t          j                             t          ¦   «         d¦  «        t          j                             d¦  «        g¦  «        }| 
                    ¦   «          |                      ||¦  «         |                     |¦  «        }	t          t          |	j	        ¦  «        }
|
 
                    ¦   «          t          t          t          j                             ddd¦  «        t          j                             ddd¦  «        g¦  «        }| 
                    ¦   «          |                      |
|¦  «         |                     |¦  «        }t          t          |j	        ¦  «        }| 
                    ¦   «          t          t          t          j                             d
dd¦  «        t          j                             t          ¦   «         d¦  «        t          j                             d¦  «        g¦  «        }| 
                    ¦   «          |                      ||¦  «         dS )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Õ  rT   rÚ  r  rc   ÚobjsrN   r  rß  ÚFileWrapperrH   )r[   r×  re   ÚA1ÚA2ÚA3Úres1Úr1ÚexpectedÚres2Úr2Úres3Úr3s                r3   Útest_aliasResolutionz&ProcessAliasTests.test_aliasResolution¶  s‘  € ð ˆØ•j Ð*EÐ*EÐ*EÑFÔFÐGˆÝÐ7Ð7Ð7¸ÀÑJÔJˆÝ˜W gÐ.°¸ÑAÔAˆÝŒZ×$Ò$ X¨v°xÑ@Ô@ˆØ�ŠàØØðð ñ	
ô 	
ð 	
ð �zŠz˜'Ñ"Ô"ˆÝ•�d”iÑ Ô ˆØ
�Š‰	Œ	ˆ	ÝÝå”
×'Ò'¨°°tÑ<Ô<Ý”
×)Ò)­,©.¬.¸&ÑAÔAÝ”
×&Ò& wÑ/Ô/ðñ
ô 
ˆð 	�Š‰ŒˆØ×Ò˜˜XÑ&Ô&Ð&à�zŠz˜'Ñ"Ô"ˆÝ•�d”iÑ Ô ˆØ
�Š‰	Œ	ˆ	ÝÝå”
×'Ò'¨°°tÑ<Ô<Ý”
×'Ò'¨°°tÑ<Ô<ðñ
ô 
ˆð 	�Š‰ŒˆØ×Ò˜˜XÑ&Ô&Ð&à�zŠz˜'Ñ"Ô"ˆÝ•�d”iÑ Ô ˆØ
�Š‰	Œ	ˆ	ÝÝå”
×'Ò'¨°°tÑ<Ô<Ý”
×)Ò)­,©.¬.¸&ÑAÔAÝ”
×&Ò& wÑ/Ô/ðñ
ô 
ˆð 	�Š‰ŒˆØ×Ò˜˜XÑ&Ô&Ð&Ð&Ð&r5   c                 óÊ  — i }dt          |g ¦  «        i}t          j                             d|d¦  «        }t          j                             d|d¦  «        }t          j                             d|d¦  «        }|                     |||dœ¦  «         |                      |d                              |¦  «        d¦  «         |                      |d                              |¦  «        d¦  «         |                      |d                              |¦  «        d¦  «         t          ddg|d¦  «        }||d<   |                     |¦  «        }t          t          |j
        ¦  «        }|                     ¦   «          t          t          t          j                             t          ¦   «         d	¦  «        g¦  «        }	|	                     ¦   «          |                      ||	¦  «         dS )
zN
        Check that a cycle in alias resolution is correctly handled.
        rí   r&  r%  r'  r(  Nr#  Úalias4r)  )r*  r	   r)  rÕ  rT   rH   rÚ  ré  r  rc   r+  rN   r  rß  )
r[   r×  re   r-  r.  r/  ÚA4ÚresÚrr2  s
             r3   Útest_cyclicAliasz"ProcessAliasTests.test_cyclicAlias÷  sŸ  € ð
 ˆØ•j ¨"Ñ-Ô-Ð.ˆÝŒZ×$Ò$ X¨v°xÑ@Ô@ˆÝŒZ×$Ò$ X¨v°xÑ@Ô@ˆÝŒZ×$Ò$ X¨v°xÑ@Ô@ˆØ�Š "°¸bÐAÐAÑBÔBÐBà×Ò˜ Ô*×2Ò2°7Ñ;Ô;¸TÑBÔBÐBØ×Ò˜ Ô*×2Ò2°7Ñ;Ô;¸TÑBÔBÐBØ×Ò˜ Ô*×2Ò2°7Ñ;Ô;¸TÑBÔBÐBå˜W hÐ/°¸ÑBÔBˆØˆ�Ñà�jŠj˜Ñ!Ô!ˆÝ•�S”XÑÔˆØ	�Š‰ŒˆÝ•s�TœZ×6Ò6µ|±~´~ÀvÑNÔNÐOÑPÔPˆØ�Š‰ŒˆØ×Ò˜˜HÑ%Ô%Ð%Ð%Ð%r5   )rb   rx   ry   r¦   r   ÚIReactorProcessr   r”  r˜  rý  r   r�   rm  r   rz   r{   r  r  r  r  r  r!  r7  r=  r/   r5   r3   rõ  rõ    sl  € € € € € ðð ð "€zÔ! '¨4Ñ0Ô0Ð8Ø.ˆàNÐNÐN€Eðð ð ð*ð ð ð0ð ð ð$ð $ð $ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð<ð <ñ @Ô?ð<ð8ð ð ð4Gð Gð GðMð Mð Mð9ð 9ð 9ðGð Gð Gð €VˆCÔ Ò$Ð&>Ñ?Ô?ð>'ð >'ñ @Ô?ð>'ð@ €VˆCÔ Ò$Ð&>Ñ?Ô?ð&ð &ñ @Ô?ð&ð &ð &r5   rõ  c                   ó   — e Zd Zd„ Zdd„ZdS )r*  c                 ó"   — || _         || _        d S r   )r×  Úusers)r[   r×  rA  s      r3   r7  zTestDomain.__init__	  s   € ØˆŒØˆŒ
ˆ
ˆ
r5   Nc                 ó  ‡‡— ‰j         j        Š‰| j        v rˆfd„S 	 | j        ‰         }|                     | j        |¦  «        Š‰rˆfd„S t          j        ‰¦  «        ‚# t          $ r t          j        ‰¦  «        ‚w xY w)Nc                  óF   •— t           j                             ‰ d d ¦  «        S r   )r	   r)  rÕ  )r¶  s   €r3   r9  z#TestDomain.exists.<locals>.<lambda>	  s   ø€ �4œ:×2Ò2°4¸¸tÑDÔD€ r5   c                  ó   •— ‰ S r   r/   )r×  s   €r3   r9  z#TestDomain.exists.<locals>.<lambda>"	  s   ø€ ˜w€ r5   )rG  ÚlocalrA  r×  rÚ  r   rŽ   rÐ  )r[   r¶  rÑ  rA   r×  s    `  @r3   r…   zTestDomain.exists	  s¤   øø€ ØŒyŒˆØ�4”:ÐÐØDÐDÐDÐDÐDð	)Ø”˜TÔ"ˆAð —i’i ¤¨dÑ3Ô3ˆGØð 'Ø&���Ð&ÝÔ" 4Ñ(Ô(Ð(øõ ð 	)ð 	)ð 	)ÝÔ" 4Ñ(Ô(Ð(ð	)øøøs   žA! Á!B r   )rb   rx   ry   r7  r…   r/   r5   r3   r*  r*  	  s7   € € € € € ðð ð ð)ð )ð )ð )ð )ð )r5   r*  c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	Ú
DummyQueuezÒ
    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                 ó   — || _         dS )zŽ
        @type directory: L{bytes}
        @param directory: The pathname of the directory holding messages in the
            queue.
        N)Ú	directory)r[   rI  s     r3   r7  zDummyQueue.__init__0	  s   € ð #ˆŒˆˆr5   c                 óì   — t           j                             |¦  «        }t          j        |                      |¦  «        dz   ¦  «         t          j        |                      |¦  «        dz   ¦  «         dS )z‹
        Remove a message from the queue.

        @type message: L{bytes}
        @param message: The base filename of a message.
        rR  rO  N)r¼   r½   ÚbasenameÚremoveÚgetPath©r[   rq   s     r3   rk  zDummyQueue.done8	  sa   € õ ”'×"Ò" 7Ñ+Ô+ˆÝ
Œ	�$—,’,˜wÑ'Ô'¨$Ñ.Ñ/Ô/Ð/Ý
Œ	�$—,’,˜wÑ'Ô'¨$Ñ.Ñ/Ô/Ð/Ð/Ð/r5   c                 ón   — t          t          j                             | j        |dz   ¦  «        d¦  «        S )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.
        rO  rÂ   )r®   r¼   r½   rs  rI  rN  s     r3   ÚgetEnvelopeFilezDummyQueue.getEnvelopeFileC	  s*   € õ •B”G—L’L ¤°¸4±Ñ@Ô@À$ÑGÔGÐGr5   c                 óL   — t           j                             | j        |¦  «        S )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½   rs  rI  rN  s     r3   rM  zDummyQueue.getPathO	  s   € õ Œw�|Š|˜DœN¨GÑ4Ô4Ð4r5   c                 ó¾  — t          j         ¦   «         › dt          | ¦  «        › �}t          t          j                             | j        |dz   ¦  «        d¦  «        }t          j                             | j        |dz   ¦  «        }t          j                             | j        |dz   ¦  «        }t          |d¦  «        }|t          j                             |||¦  «        fS )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.
        Ú_rO  rª   z-CrR  )	ÚtimeÚidr®   r¼   r½   rs  rI  r	   r²   )r[   ÚfnameÚ
headerFileÚtempFilenameÚfinalFilenameÚmessageFiles         r3   r�  zDummyQueue.createNewMessage[	  sµ   € õ ”9‘;”;Ð+Ð+¥ D¡¤Ð+Ð+ˆÝ�"œ'Ÿ,š, t¤~°u¸t±|ÑDÔDÀdÑKÔKˆ
Ý”w—|’| D¤N°E¸D±LÑAÔAˆÝœŸš T¤^°U¸T±\ÑBÔBˆÝ˜<¨Ñ.Ô.ˆà�4œ9×0Ò0Ø˜ }ñ
ô 
ð 
ð 	
r5   c                 ó   — dS )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.
        Nr/   rN  s     r3   rš  zDummyQueue.setWaitingm	  s	   € ð 	ˆr5   N)
rb   rx   ry   r¦   r7  rk  rP  rM  r�  rš  r/   r5   r3   rG  rG  &	  s{   € € € € € ðð ð#ð #ð #ð	0ð 	0ð 	0ð
Hð 
Hð 
Hð
5ð 
5ð 
5ð
ð 
ð 
ð$ð ð ð ð r5   rG  c                   ó   — e Zd ZdZd„ ZdS )Ú!DummySmartHostSMTPRelayingManagera4  
    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                 ó"   — i | _         || _        dS )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Ž  )r[   rŽ  s     r3   r7  z*DummySmartHostSMTPRelayingManager.__init__ƒ	  s   € ð ˆŒØˆŒ
ˆ
ˆ
r5   N)rb   rx   ry   r¦   r7  r/   r5   r3   r]  r]  w	  s-   € € € € € ð	ð 	ðð ð ð ð r5   r]  c                   óÞ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Z eej        dk    d¦  «        d„ ¦   «         Z eej        dk    d¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ ZdS )Ú_AttemptManagerTestsa  
    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                 ó‚  — |                       ¦   «         | _        t          j        | j        ¦  «         t	          ¦   «         | _        d| _        t          j        | j	        ¦  «         t          t          t          | j        ¦  «        ¦  «        d| j        ¦  «        | _        t          t          t          | j        ¦  «        ¦  «        d| j        ¦  «        | _        d}d}t          j                             | j        |¦  «        | _        t          j                             | j        |¦  «        | _        t'          | j        dz   d¦  «                             ¦   «          t'          | j        dz   d¦  «                             ¦   «          |g| j        j        j        d<   |g| j        j        j        d	<   t'          | j        d
z   d¦  «        5 }t/          j        ddg|¦  «         ddd¦  «         n# 1 swxY w Y   t'          | j        d
z   d¦  «        5 }t/          j        ddg|¦  «         ddd¦  «         dS # 1 swxY w Y   dS )a  
        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ÚquietMessagerR  r†  ÚnoisyRelayerÚquietRelayerrO  rª   zfrom-noisy@domainzto-noisy@domainzfrom-quiet@domainzto-quiet@domain)r«   rã  r¼   rS  r   r   ÚeventLogr!   ÚaddObserverÚ_logObserverr   r]  rG  ÚnoisyAttemptMgrÚquietAttemptMgrr½   rs  rc  rd  r®   r±   rw  r_  rU  rV  )r[   ÚnoisyBaseNameÚquietBaseNameÚenvelopes       r3   r�   z_AttemptManagerTests.setUp®	  s˜  € ð —k’k‘m”mˆŒÝ
Œ�”ÑÔÐå)Ñ+Ô+ˆŒàˆŒÝŒ˜Ô)Ñ*Ô*Ð*å.Ý-­j¸¼Ñ.EÔ.EÑFÔFØØŒLñ 
ô  
ˆÔõ
  /Ý-­j¸¼Ñ.EÔ.EÑFÔFØØŒLñ 
ô  
ˆÔð 'ˆØ&ˆåœGŸLšL¨¬°mÑDÔDˆÔÝœGŸLšL¨¬°mÑDÔDˆÔåˆTÔ Ñ% sÑ+Ô+×1Ò1Ñ3Ô3Ð3åˆTÔ Ñ% sÑ+Ô+×1Ò1Ñ3Ô3Ð3à@M¸ˆÔÔ$Ô,¨^Ñ<Ø@M¸ˆÔÔ$Ô,¨^Ñ<å�$Ô# dÑ*¨DÑ1Ô1ð 	L°XÝŒKÐ,Ð.?Ð@À(ÑKÔKÐKð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lõ �$Ô# dÑ*¨DÑ1Ô1ð 	L°XÝŒKÐ,Ð.?Ð@À(ÑKÔKÐKð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls$   ÇG,Ç,G0Ç3G0ÈH4È4H8È;H8c                 ój   — t          j        | j        ¦  «         t          j        | j        ¦  «         dS )zO
        Unregister for log events and remove the temporary directory.
        N)r!   ÚremoveObserverri  rk  rl  rã  rh   s    r3   rm  z_AttemptManagerTests.tearDownÛ	  s0   € õ 	Ô˜4Ô,Ñ-Ô-Ð-ÝŒ�d”kÑ"Ô"Ð"Ð"Ð"r5   c                 ó   — || _         dS )zÂ
        A log observer.

        @type eventDict: L{dict} of L{bytes} -> L{object}
        @param eventDict: Information about the last informational log message
            generated.
        N)rg  )r[   Ú	eventDicts     r3   ri  z!_AttemptManagerTests._logObserverâ	  s   € ð "ˆŒˆˆr5   c                 ó–   — t          t          t          | j        ¦  «        ¦  «        ¦  «        }|                      |j        ¦  «         dS )z�
        When an attempt manager is created without the noisy parameter, the
        noisy instance variable should default to true.
        N)r   r]  rG  rã  rS   r�  ©r[   Úams     r3   Útest_initNoisyDefaultz*_AttemptManagerTests.test_initNoisyDefaultì	  s>   € õ
 Õ>½zÈ$Ì+Ñ?VÔ?VÑWÔWÑXÔXˆØ�Š˜œÑ!Ô!Ð!Ð!Ð!r5   c                 óD   — |                       | j        j        ¦  «         dS )z•
        When an attempt manager is created with the noisy parameter set to
        true, the noisy instance variable should be set to true.
        N)rS   rj  r�  rh   s    r3   Útest_initNoisyz#_AttemptManagerTests.test_initNoisyô	  s"   € ð
 	�Š˜Ô,Ô2Ñ3Ô3Ð3Ð3Ð3r5   c                 óD   — |                       | j        j        ¦  «         dS )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»   rk  r�  rh   s    r3   Útest_initQuietz#_AttemptManagerTests.test_initQuietû	  s$   € ð
 	×Ò˜Ô-Ô3Ñ4Ô4Ð4Ð4Ð4r5   c                 ó¢   — t          t          t          | j        ¦  «        ¦  «        ¦  «        }|                      |j        t
          ¦  «         dS )zŸ
        When an attempt manager is created without the reactor parameter, the
        reactor instance variable should default to the global reactor.
        N)r   r]  rG  rã  rH   r   rt  s     r3   Útest_initReactorDefaultz,_AttemptManagerTests.test_initReactorDefault
  sB   € õ
 Õ>½zÈ$Ì+Ñ?VÔ?VÑWÔWÑXÔXˆØ×Ò˜œ¥WÑ-Ô-Ð-Ð-Ð-r5   c                 óP   — |                       | j        j        | j        ¦  «         dS )z“
        When an attempt manager is created with a reactor provided, the
        reactor instance variable should default to that reactor.
        N)rH   rj  r   rh   s    r3   Útest_initReactorz%_AttemptManagerTests.test_initReactor

  s(   € ð
 	×Ò˜Ô-Ô5°t´|ÑDÔDÐDÐDÐDr5   c                 óz   — | j                              d| j        ¦  «         |                      | j        ¦  «         dS )zw
        For an attempt manager with the noisy flag set, notifySuccess should
        result in a log message.
        re  N)rj  rn  rc  rS   rg  rh   s    r3   Útest_notifySuccessNoisyz,_AttemptManagerTests.test_notifySuccessNoisy
  s:   € ð
 	Ô×*Ò*¨>¸4Ô;LÑMÔMÐMØ�Š˜œÑ&Ô&Ð&Ð&Ð&r5   c                 óz   — | j                              d| j        ¦  «         |                      | j        ¦  «         dS )z|
        For an attempt manager with the noisy flag not set, notifySuccess
        should result in no log message.
        rf  N)rk  rn  rd  r»   rg  rh   s    r3   Útest_notifySuccessQuietz,_AttemptManagerTests.test_notifySuccessQuiet
  s<   € ð
 	Ô×*Ò*¨>¸4Ô;LÑMÔMÐMØ×Ò˜œÑ'Ô'Ð'Ð'Ð'r5   r(   r*   c                 óz   — | j                              d| j        ¦  «         |                      | j        ¦  «         dS )zw
        For an attempt manager with the noisy flag set, notifyFailure should
        result in a log message.
        re  N)rj  rq  rc  rS   rg  rh   s    r3   Útest_notifyFailureNoisyz,_AttemptManagerTests.test_notifyFailureNoisy!
  s:   € ð 	Ô×*Ò*¨>¸4Ô;LÑMÔMÐMØ�Š˜œÑ&Ô&Ð&Ð&Ð&r5   c                 óz   — | j                              d| j        ¦  «         |                      | j        ¦  «         dS )z|
        For an attempt manager with the noisy flag not set, notifyFailure
        should result in no log message.
        rf  N)rk  rq  rd  r»   rg  rh   s    r3   Útest_notifyFailureQuietz,_AttemptManagerTests.test_notifyFailureQuiet*
  s<   € ð 	Ô×*Ò*¨>¸4Ô;LÑMÔMÐMØ×Ò˜œÑ'Ô'Ð'Ð'Ð'r5   c                 ón   — | j                              d¦  «         |                      | j        ¦  «         dS )zt
        For an attempt manager with the noisy flag set, notifyDone should
        result in a log message.
        re  N)rj  rs  rS   rg  rh   s    r3   Útest_notifyDoneNoisyz)_AttemptManagerTests.test_notifyDoneNoisy3
  s5   € ð
 	Ô×'Ò'¨Ñ7Ô7Ð7Ø�Š˜œÑ&Ô&Ð&Ð&Ð&r5   c                 ón   — | j                              d¦  «         |                      | j        ¦  «         dS )zy
        For an attempt manager with the noisy flag not set, notifyDone
        should result in no log message.
        rf  N)rk  rs  r»   rg  rh   s    r3   Útest_notifyDoneQuietz)_AttemptManagerTests.test_notifyDoneQuiet;
  s7   € ð
 	Ô×'Ò'¨Ñ7Ô7Ð7Ø×Ò˜œÑ'Ô'Ð'Ð'Ð'r5   c                 ó¢   — | j                              d¦  «         |                      | j        ¦  «         | j                             d¦  «         dS )z|
        For an attempt manager with the noisy flag set, notifyNoConnection
        should result in a log message.
        re  r²  N)rj  ÚnotifyNoConnectionrS   rg  r   ry  rh   s    r3   Útest_notifyNoConnectionNoisyz1_AttemptManagerTests.test_notifyNoConnectionNoisyC
  sK   € ð
 	Ô×/Ò/°Ñ?Ô?Ð?Ø�Š˜œÑ&Ô&Ð&ØŒ×Ò˜RÑ Ô Ð Ð Ð r5   c                 ó¢   — | j                              d¦  «         |                      | j        ¦  «         | j                             d¦  «         dS )z�
        For an attempt manager with the noisy flag not set, notifyNoConnection
        should result in no log message.
        rf  r²  N)rk  rŒ  r»   rg  r   ry  rh   s    r3   Útest_notifyNoConnectionQuietz1_AttemptManagerTests.test_notifyNoConnectionQuietL
  sM   € ð
 	Ô×/Ò/°Ñ?Ô?Ð?Ø×Ò˜œÑ'Ô'Ð'ØŒ×Ò˜RÑ Ô Ð Ð Ð r5   N)rb   rx   ry   r¦   r�   rm  ri  rv  rx  rz  r|  r~  r€  r‚  r   rz   r{   r„  r†  rˆ  rŠ  r�  r�  r/   r5   r3   ra  ra  Ž	  s[  € € € € € ðð ð<+Lð +Lð +LðZ#ð #ð #ð"ð "ð "ð"ð "ð "ð4ð 4ð 4ð5ð 5ð 5ð.ð .ð .ðEð Eð Eð'ð 'ð 'ð(ð (ð (ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð'ð 'ñ @Ô?ð'ð €VˆCÔ Ò$Ð&>Ñ?Ô?ð(ð (ñ @Ô?ð(ð'ð 'ð 'ð(ð (ð (ð!ð !ð !ð!ð !ð !ð !ð !r5   ra  )r¦   Úemail.messagerò  Úemail.parserr  rÒ   rð  r¼   rU  rk  rò  rz   ra  r´  rT  Úhashlibr   Úunittestr   Úzope.interfacer   r   Úzope.interface.verifyr   Útwisted.cred.checkersr7  Ú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   Ú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Ï   Ú _MaildirMailboxAppendMessageTaskr  r.  r>  r^  rh  r‘  r—  r“  rÌ  rÚ  r  rü  r5  r9  rL  rh  ru  r‰  r©  rª  r«  r¯  r­  rÌ  rÓ  rÕ  rZ  r–  rŸ  rÍ  rÓ  rß  r)  r
  rã  Ú
AliasGroupré  rì  rõ  r*  rG  r]  ra  r/   r5   r3   ú<module>r­     su  ððð ð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø -Ð -Ð -Ð -Ð -Ð -à Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ð Ð Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
 $Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /Ø +Ð +Ð +Ð +Ð +Ð +ð €ˆ˜ÒÐ!CÑDÔDðe:ð e:ð e:ð e:ð e:˜hñ e:ô e:ñ EÔDðe:ðP €ˆ˜ÒÐ!CÑDÔDðGð Gð Gð Gð G�(ñ Gô Gñ EÔDðGð €ˆ˜ÒÐ!CÑDÔDð#
ð #
ð #
ð #
ð #
 ñ #
ô #
ñ EÔDð#
ðL €ˆ˜ÒÐ!CÑDÔDð5ð 5ð 5ð 5ð 5�xñ 5ô 5ñ EÔDð5ðB €ˆ˜ÒÐ!CÑDÔDð=7ð =7ð =7ð =7ð =7˜(ñ =7ô =7ñ EÔDð=7ð@ €ˆ˜ÒÐ!CÑDÔDð<ð <ð <ð <ð <�xñ <ô <ñ EÔDð<ð6 €ˆ˜ÒÐ!CÑDÔDðJ6ð J6ð J6ð J6ð J6˜Xñ J6ô J6ñ EÔDðJ6ðZ €ˆ˜ÒÐ!CÑDÔDðCð Cð Cð Cð CØ„LÔ1ñCô Cñ EÔDðCð4ð ð ð ð ñ ô ð ð2 €ˆ˜ÒÐ!CÑDÔDðPð Pð Pð Pð P˜xÐ)9ñ Pô Pñ EÔDðPðf €ˆ˜ÒÐ!CÑDÔDð%
ð %
ð %
ð %
ð %
˜XÐ'7ñ %
ô %
ñ EÔDð%
ðP €ˆ˜ÒÐ!CÑDÔDðU<ð U<ð U<ð U<ð U<�8ñ U<ô U<ñ EÔDðU<ðp €ˆ˜ÒÐ!CÑDÔDð	Tð 	Tð 	Tð 	Tð 	T ñ 	Tô 	Tñ EÔDð	Tð €ˆ˜ÒÐ!CÑDÔDðp
ð p
ð p
ð p
ð p
˜xñ p
ô p
ñ EÔDðp
ðf €ˆTŒYÔ'Ñ(Ô(ð "ð  "ð  "ð  "ð  "ñ  "ô  "ñ )Ô(ð "ðF €ˆ˜ÒÐ!CÑDÔDðKQð KQð KQð KQð KQ˜ñ KQô KQñ EÔDðKQð\ €ˆ˜ÒÐ!CÑDÔDðF
ð F
ð F
ð F
ð F
�xñ F
ô F
ñ EÔDðF
ðRð ð ð ð ˆDŒIñ ô ð ð
 €ˆ˜ÒÐ!CÑDÔDð"Eð "Eð "Eð "Eð "E�ñ "Eô "Eñ EÔDð"EðJ €ˆ˜ÒÐ!CÑDÔDð&5ð &5ð &5ð &5ð &5�8ñ &5ô &5ñ EÔDð&5ðR"ð "ð "ð "ð "ñ "ô "ð "ð  €ˆ˜ÒÐ!CÑDÔDð<ð <ð <ð <ð <˜(ñ <ô <ñ EÔDð<ð> €ˆ˜ÒÐ!CÑDÔDðA>ð A>ð A>ð A>ð A>˜(ñ A>ô A>ñ EÔDðA>ðH 1Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ðBð Bð Bð Bð B�FÔ'ñ Bô Bð BðIð Ið Ið&"ð "ð "ð €ˆ˜ÒÐ!CÑDÔDðl>ð l>ð l>ð l>ð l>ˆhñ l>ô l>ñ EÔDðl>ð^ €ˆ˜ÒÐ!CÑDÔDðLð Lð Lð Lð L˜Hñ Lô Lñ EÔDðLð^ð ð ð ð ñ ô ð ð" €ˆ˜ÒÐ!CÑDÔDða>ð a>ð a>ð a>ð a>�ñ a>ô a>ñ EÔDða>ðH1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð, €ˆ˜ÒÐ!CÑDÔDð&7ð &7ð &7ð &7ð &7˜ñ &7ô &7ñ EÔDð&7ðRð ð ð ð ñ ô ð ðð ð ð ð �t”zÔ.ñ ô ð ð+ð +ð +ð +ð +�T”ZÔ*ñ +ô +ð +ð$ð $ð $ð $ð $ñ $ô $ð $ð. €ˆ˜ÒÐ!CÑDÔDð~&ð ~&ð ~&ð ~&ð ~&˜ñ ~&ô ~&ñ EÔDð~&ðB)ð )ð )ð )ð )ñ )ô )ð )ð(Nð Nð Nð Nð Nñ Nô Nð Nðbð ð ð ð ñ ô ð ð. €ˆ˜ÒÐ!CÑDÔDðD!ð D!ð D!ð D!ð D!˜8ñ D!ô D!ñ EÔDðD!ð D!ð D!r5   