
    Yf!                   	   d 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	m
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mZ dd
lmZmZ ddlmZ ddlmZmZmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD 	 ddlEmFZFmGZG n# eH$ r dZFdZGY nw xY wd ZI G d deD          ZJ G d d          ZK G d  d!eC          ZL G d" d#eC          ZM G d$ d%eD          ZN ee1jO        e1jP        e1jQ                   G d& d'                      ZR ee1jO        e1jP                   G d( d)                      ZS G d* d+e1jT                  ZU G d, d-eUe1jV                  ZW G d. d/e1jX                  ZY G d0 d1e1jZ                  Z[ G d2 d3          Z\ G d4 d5e\eD          Z] G d6 d7eC          Z^ G d8 d9e\eD          Z_ ee"           G d: d;                      Z` G d< d=          Za G d> d?e\eD          Zb G d@ dAeD          Zc G dB dCe\eD          Zd G dD dEeD          Ze G dF dGe1jZ                  Zf G dH dIe\eD          Zg G dJ dK          Zh G dL dMeh          Zi G dN dOeieC          Zj G dP dQeieC          Zk G dR dSeheC          Zl G dT dUeheC          Zm G dV dWeheC          Zn G dX dYeheD          Zo G dZ d[eheC          Zp G d\ d]eheC          Zq G d^ d_e1jX                  Zr ee1js                   G d` dae=jt                              Zu G db dceDe\          Zv G dd deeD          Zw G df dgeDe\          Zx G dh die\eD          Zy ee1jz                   G dj dkeDe\                      Z{ G dl dm          Z| ee1j}                   G dn do                      Z~ ee1j                   G dp dq                      Z G dr dseD          Z eeF dt           e e'j        e(d           du           G dv dwe\eD                                  Z G dx dyeR          Z G dz d{e\eD          Z G d| d}eD          Z G d~ d          Z G d deD          Z G d deD          Z G d d          Z G d deeC          Z G d deeD          Z G d deC          ZdS )z"
Test case for twisted.mail.imap4
    )annotationsN)OrderedDictBytesIO)chain)OptionalType)skipIf)implementer)verifyClassverifyObject)'InMemoryUsernamePasswordDatabaseDontUse)CramMD5CredentialsIUsernameHashedPasswordIUsernamePasswordUnauthorizedLogin)IRealmPortal)defererror
interfacesreactor)Deferred)Clock)StringTransport StringTransportWithDisconnection)imap4)
MessageSet)IChallengeResponseIClientAuthenticationICloseableMailboxIMAP)loopback)failurelogutil)	iterbytesnativeStringnetworkString)SynchronousTestCaseTestCase)ClientTLSContextServerTLSContextc                    | fdS )Nc                     |            S N )resultfs     M/var/www/html/env/lib/python3.11/site-packages/twisted/mail/test/test_imap.py<lambda>zstrip.<locals>.<lambda>:   s    qqss     r1   )r3   s    r4   stripr7   9   s    """"r6   c                  f    e Zd Zddgddgddgddgd	d
ggZd Zd Zd Zd Zd Zd Z	d Z
d Zd ZdS )IMAP4UTF7TestsHello world   Hello worldzHello & worlds   Hello &- world   Helloÿworld   Hello&AP8-worldu   ÿþýüs   &AP8A,gD9APw-u   ~peter/mail/日本語/台北s   ~peter/mail/&ZeVnLIqe-/&U,BTFw-c                    d}|                      |                    dd          |                    d                     dS )z
        Specifying an error policy to C{unicode.encode} with the
        I{imap4-utf-7} codec should produce the same result as not
        specifying the error policy.
        r:   imap4-utf-7strictNassertEqualencodeselftexts     r4   test_encodeWithErrorsz$IMAP4UTF7Tests.test_encodeWithErrorsI   sJ     KKx00$++m2L2L	
 	
 	
 	
 	
r6   c                    d}|                      |                    dd          |                    d                     dS )zO
        Similar to L{test_encodeWithErrors}, but for C{bytes.decode}.
        r;   r?   r@   NrB   decoderE   bytess     r4   test_decodeWithErrorsz$IMAP4UTF7Tests.test_decodeWithErrorsT   sJ     LL115<<3N3N	
 	
 	
 	
 	
r6   c                \    d}|                      |                    d          d           dS )z
        Unicode strings that contain an ampersand (C{&}) can be
        encoded to bytes with the I{imap4-utf-7} codec.
        u
   &Hello&½&r?   s   &-Hello&-&AL0-&-NrA   rD   s     r4   test_encodeAmpersandz#IMAP4UTF7Tests.test_encodeAmpersand]   s=    
 6KK&&	
 	
 	
 	
 	
r6   c                X    |                      d                    d          d           dS )z
        An I{imap4-utf-7} encoded string that does not shift back to
        ASCII (i.e., it lacks a final C{-}) can be decoded.
        s   &AL0r?      ½NrI   rE   s    r4   !test_decodeWithoutFinalASCIIShiftz0IMAP4UTF7Tests.test_decodeWithoutFinalASCIIShifth   s8    
 	NN=))*	
 	
 	
 	
 	
r6   c                     t          j        d          t          d                    }|                     |                                d           dS )zl
        C{codecs.getreader('imap4-utf-7')} returns the I{imap4-utf-7} stream
        reader class.
        r?   r=   r<   N)codecs	getreaderr   rB   read)rE   readers     r4   test_getreaderzIMAP4UTF7Tests.test_getreaderr   sL    
 1!-009K1L1LMM(899999r6   c                    t                      } t          j        d          |          }|                    d           |                     |                                d           dS )zl
        C{codecs.getwriter('imap4-utf-7')} returns the I{imap4-utf-7} stream
        writer class.
        r?   r<   r=   N)r   rU   	getwriterwriterB   getvalue)rE   outputwriters      r4   test_getwriterzIMAP4UTF7Tests.test_getwriterz   sa    
 0!-0088%&&&**,>?????r6   c                r    | j         D ].\  }}|                     |                    d          |           /dS )z
        The I{imap4-utf-7} can be used to encode a unicode string into a byte
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)testsrB   rC   rE   inputr^   s      r4   test_encodezIMAP4UTF7Tests.test_encode   sL    
 "Z 	B 	BME6U\\-88&AAAA	B 	Br6   c                r    | j         D ].\  }}|                     ||                    d                     /dS )z
        The I{imap4-utf-7} can be used to decode a byte string into a unicode
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)rb   rB   rJ   rc   s      r4   test_decodezIMAP4UTF7Tests.test_decode   sL    
 "Z 	B 	BME6UFMM-$@$@AAAA	B 	Br6   c                "   t          t          dd          t          dd                    D ]}t          |                                          }|                     |t          |                              d                     |                     t          |          |                    d                     |                     d                    d          d           |                     d                    d          d           dS )	z
        The IMAP4 modified UTF-7 implementation encodes all printable
        characters which are in ASCII using the corresponding ASCII byte.
            &   '      r?   &s   &-N)r   rangechrrC   rB   rJ   )rE   ocharbytes      r4   test_printableSingletonsz'IMAP4UTF7Tests.test_printableSingletons   s     uT4((%d*;*;<< 	E 	EA1vv}}HXs1vv}}]'C'CDDDSVVX__]%C%CDDDDM22E:::m44c:::::r6   N)__name__
__module____qualname__rb   rG   rM   rO   rS   rY   r`   re   rg   rr   r1   r6   r4   r9   r9   =   s        	'	+,	-.	-.9.	
	E	
 	
 	

 
 
	
 	
 	

 
 
: : :@ @ @B B BB B B; ; ; ; ;r6   r9   c                  &    e Zd Zd Zd Zd Zd ZdS )BufferingConsumerc                    g | _         d S r0   )bufferrR   s    r4   __init__zBufferingConsumer.__init__   s    r6   c                ~    | j                             |           | j        r| j                                         d S d S r0   )ry   appendconsumerresumeProducingrK   s     r4   r\   zBufferingConsumer.write   sF    5!!!= 	,M))+++++	, 	,r6   c                F    || _         | j                                          d S r0   )r}   r~   )rE   r}   	streamings      r4   registerProducerz"BufferingConsumer.registerProducer   s#     %%'''''r6   c                    d | _         d S r0   )r}   rR   s    r4   unregisterProducerz$BufferingConsumer.unregisterProducer   s    r6   N)rs   rt   ru   rz   r\   r   r   r1   r6   r4   rw   rw      sP          , , ,
( ( (    r6   rw   c                  ,    e Zd Zd Zd Zd Zd Zd ZdS )MessageProducerTestsc                "    dt                      }d|d<   d|d<   d|d<   d|d	<   t          |d
d dd           }t                      t          j        |                                        } fd}|                    |          S )Ns   This is body text.  Rar.sender@hostfromrecipient@domaintobooga booga boosubject
text/plaincontent-typer1   {   c                                         |                                d                    j                  dz              d S )Nr6   sf   {119}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: text/plain

)assertIdenticalrB   joinry   )r2   bodycprE   s    r4   
cbProducedz7MessageProducerTests.testSinglePart.<locals>.cbProduced   s[      +++""
     r6   r   FakeyMessagerw   r   MessageProducerbeginProducingaddCallback)rE   headersmsgdr   r   r   r   s   `    @@@r4   testSinglePartz#MessageProducerTests.testSinglePart   s    *--'*.	".7BdC>>!#&&Q
	 
	 
	 
	 
	 
	 
	 
	 }}Z(((r6   c                |   	 d}dt                      }d|d<   d|d<   d|d<   d	|d
<   t                      }d|d<   d|d
<   t          |dd |dt          |dd d d           g          }t                      t          j        |          		                              }	 fd}|                    |          S )Nr6   &   Contained body message text.  Squarge.r   r   r   r   r   r   %multipart/alternative; boundary="xyz"r   this is subject textr   r1   r   c                                         |                                d                    j                  dz   dz              d S )Nr6   s   {239}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

   
--xyz--
failUnlessIdenticalrB   r   ry   r2   r   	innerBodyr   rE   s    r4   r   z<MessageProducerTests.testSingleMultiPart.<locals>.cbProduced   se    $$VQ///""
 $
$ '9
9    r6   r   
rE   	outerBodyr   innerHeadersr   r   r   r   r   r   s
   `      @@@r4   testSingleMultiPartz(MessageProducerTests.testSingleMultiPart   s    	=	--'*.	"I"}}"8Y'3^$,D)T4HHI
 
 !#&&Q	 	 	 	 	 	 	 	$ }}Z(((r6   c                   	
 d}d	d
t                      }d|d<   d|d<   d|d	<   d
|d<   t                      }d|d	<   d|d<   t                      }d|d	<   d|d<   t          |dd |dt          |dd 	d d           t          |dd 
d d           g          }t                      t          j        |                                        }	
 fd}|                    |          S )Nr6   r   .   Secondary <i>message</i> text of squarge body.r   r   r   r   r   r   r   r   r   r   <b>this is subject</b>	text/htmlr1   r   c                                         |                                d                    j                  dz   dz   z   dz              d S )Nr6   s   {354}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

sE   
--xyz
Subject: <b>this is subject</b>
Content-Type: text/html

r   r   )r2   r   
innerBody1
innerBody2r   rE   s    r4   r   z>MessageProducerTests.testMultipleMultiPart.<locals>.cbProduced  sy    $$VQ///""
 %
%( %% (::    r6   r   )rE   r   r   r   innerHeaders2r   r   r   r   r   r   r   s   `       @@@@r4   testMultipleMultiPartz*MessageProducerTests.testMultipleMultiPart   s=   	>
F
--'*.	"I"}}"8Y'3^$##;i (3n%\2tZtLL]Bj$MM

 

 !#&&Q	 	 	 	 	 	 	 	 	* }}Z(((r6   c                   	 d}dt                      }d|d<   d|d<   d|d<   d	|d
<   t                      }d|d<   d|d
<   t          |dd|dt          |dddd          g          }t                      t          j        |          	d 	_        	                              }	 fd}|                    |          S )z>
        A boundary is generated if none is provided.
        r6   r   r   r   r   r   r   r   multipart/alternativer   r   r   r1   Nr   c                 *    t          j        d          S )Nz$aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)uuidUUIDr1   r6   r4   r5   z?MessageProducerTests.test_multiPartNoBoundary.<locals>.<lambda>M  s    49%KLL r6   c                                         |                                d                    j                  dz   dz              d S )Nr6   s	  {341}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="----=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Subject: this is subject text
Content-Type: text/plain

s-   
------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--
r   r   s    r4   r   zAMessageProducerTests.test_multiPartNoBoundary.<locals>.cbProducedQ  sg    $$VQ///""  GG    r6   )r   r   rw   r   r   _uuid4r   r   r   s
   `      @@@r4   test_multiPartNoBoundaryz-MessageProducerTests.test_multiPartNoBoundary3  s
    	=	--'*.	"9"}}"8Y'3^$,D)T4HHI
 
 !#&&LLQ	 	 	 	 	 	 	 	* }}Z(((r6   c                |   	 d}dt                      }d|d<   d|d<   d|d<   d	|d
<   t                      }d|d<   d|d
<   t          |dd|dt          |dddd          g          }t                      t          j        |          		                              }	 fd}|                    |          S )z>
        A boundary without does not have them added.
        r6   r   r   r   r   r   r   r   z#multipart/alternative; boundary=xyzr   r   r   r1   Nr   c                                         |                                d                    j                  dz   dz              d S )Nr6   s   {237}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary=xyz


--xyz
Subject: this is subject text
Content-Type: text/plain

r   r   r   s    r4   r   z?MessageProducerTests.test_multiPartNoQuotes.<locals>.cbProduced  se    $$VQ///"" $$ '99    r6   r   r   s
   `      @@@r4   test_multiPartNoQuotesz+MessageProducerTests.test_multiPartNoQuotesh  s     	=	--'*.	"G"}}"8Y'3^$,D)T4HHI
 
 !#&&Q	 	 	 	 	 	 	 	& }}Z(((r6   N)rs   rt   ru   r   r   r   r   r   r1   r6   r4   r   r      sb        ) ) )8+) +) +)Z4) 4) 4)l3) 3) 3)j/) /) /) /) /)r6   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d Zd Zd Zd Zd Zd Zd Zd ZdS )MessageSetTestsz"
    Tests for L{MessageSet}.
    c                   t                      }t                      }|                     ||           |                     |d           |dz   }|                     t          |          d           |                     t	          |          dg           |dz   }|                     t          |          d           |                     t	          |          g d           |dz   }|                     ||           |                     t	          ||z             g d           |                    d           |                     t          |          d           |                     t	          |          g d           |                     ||           |                    d	d
           |                     t          |          d           |                     t	          |          g d           dS )a4  
        Test the following properties of L{MessageSet} addition and
        equality:

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

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

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

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

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

            6. L{MessageSet.add} with a single message or a start and
               end message satisfies 3 and 4 above.
        r1      r      r   r      r         )r   r   r   r            )r   r   r   r   r   r   r   N)r   rB   assertNotEquallenlistadd)rE   m1m2s      r4   !test_equalityIterationAndAdditionz1MessageSetTests.test_equalityIterationAndAddition  s   . \\\\R   B###!VR!$$$bA3'''&[R!$$$b999---&[R   b2g			222
q			R!$$$b<<<000B###
q!R!$$$b#8#8#899999r6   c                d    |                      t          t          t          dd                     dS )z
        A L{MessageSet} that has a range that ends with L{None} raises
        a L{TypeError} when its length is requested.
        r   N)assertRaises	TypeErrorr   r   rR   s    r4   test_lengthWithWildcardRangez,MessageSetTests.test_lengthWithWildcardRange  s,    
 	)S*Q*=*=>>>>>r6   c                @    t          t          dd                     dS )zD
        L{MessageSet.__repr__} does not raise an exception
        r   r   N)reprr   rR   s    r4   test_reprSanityzMessageSetTests.test_reprSanity  s"     	Z1r6   c                    t          j        d          t          j        d          t          j        dd          t          j        dd          g}g d}t          ||          D ](\  }}|                     t	          |          |           )dS )z
        In a L{MessageSet}, in the presence of wildcards, if the
        highest message id is known, the wildcard should get replaced
        by that high value.
           *   1:*s   3:*r   s   *:2)*1:*z3:6z2:6Nr   parseIdListziprB   strrE   inputsoutputsirp   s        r4   &test_stringRepresentationWithWildcardsz6MessageSetTests.test_stringRepresentationWithWildcards  s     d##f%%fa((fa((	

 
 
 (( 	( 	(DAqSVVQ''''	( 	(r6   c                    t          j        d          t          j        d          g}ddg}t          ||          D ](\  }}|                     t	          |          |           )dS )z
        In a L{MessageSet}, inverting the high and low numbers in a
        range doesn't affect the meaning of the range.  For example,
        3:2 displays just like 2:3, because according to the RFC they
        have the same meaning.
           2:3s   3:22:3Nr   r   s        r4   &test_stringRepresentationWithInversionz6MessageSetTests.test_stringRepresentationWithInversion  s~     f%%f%%
 

 (( 	( 	(DAqSVVQ''''	( 	(r6   c                    t          d          }|                     t          |          d           |                     t          |          d           |                     t	          |          dg           dS )z
        Creating a L{MessageSet} with a single message number adds
        only that message to the L{MessageSet}; its serialized form
        includes only that message number, its length is one, and it
        yields only that message number.
        r   1Nr   rB   r   r   r   rE   ms     r4   "test_createWithSingleMessageNumberz2MessageSetTests.test_createWithSingleMessageNumber
  sk     qMMQ%%%Q###a1#&&&&&r6   c                    t          dd          }|                     t          |          d           |                     t          |          d           |                     t	          |          g d           dS )a?  
        Creating a L{MessageSet} with both a start and end message
        number adds the sequence between to the L{MessageSet}; its
        serialized form consists that range, its length is the length
        of the sequence, and it yields the message numbers inclusively
        between the start and end.
        r   
   z1:10)
r   r   r   r   r   r   r   r   	   r   Nr   r   s     r4   test_createWithSequencez'MessageSetTests.test_createWithSequence  st     q"Q(((Q$$$a"A"A"ABBBBBr6   c                    t          d          }|                     t          |          d           |                     t          |          d           |                     t
          t          |           dS )z
        Creating a L{MessageSet} with a single L{None}, representing
        C{*}, adds C{*} to the range; its serialized form includes
        only C{*}, its length is one, but it cannot be iterated over
        because its endpoint is unknown.
        Nr   r   )r   rB   r   r   r   r   r   r   s     r4   test_createWithSingleWildcardz-MessageSetTests.test_createWithSingleWildcard#  sg     tQ%%%Q###)T1-----r6   c                    t          d          }d|_        |                     t          |          dg           t          dd          }d|_        |                     t          |          g d           dS )z
        Setting L{MessageSet.last} replaces L{None}, representing
        C{*}, with that number, making that L{MessageSet} iterable.
        Nr   r   r   r   )r   lastrB   r   )rE   singleMessageReplacedrangeReplaceds      r4   test_setLastSingleWildcardz*MessageSetTests.test_setLastSingleWildcard/  s{    
 !+4 0 0%'"344rd;;;"1d++m,,iii88888r6   c                    t          dd          }|                    dd           d|_        |                     t	          |          g d           dS )zL
        Setting L{MessageSet.last} replaces L{None} in all ranges.
        r   Nr   r   r   r   r   r   r   )r   r   r   rB   r   r   s     r4   test_setLastWithWildcardRangez-MessageSetTests.test_setLastWithWildcardRange<  sQ     q$	aa///22222r6   c                    t          dd          }d|_        |                     t                    5  d|_        ddd           dS # 1 swxY w Y   dS )z9
        L{MessageSet.last} cannot be set twice.
        r   Nr   r   )r   r   r   
ValueErrorr   s     r4   test_setLastTwiceFailsz&MessageSetTests.test_setLastTwiceFailsE  s     q$z** 	 	AF	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                l   t          d          }d|_        |                    d           |                     t	          |          ddg           |                     t	          |dz             g d           |                    dd           |                     t	          |          g d           dS )a  
        Adding a L{None}, representing C{*}, or a sequence that
        includes L{None} to a L{MessageSet} whose
        L{last<MessageSet.last>} property has been set replaces all
        occurrences of L{None} with the value of
        L{last<MessageSet.last>}.
        r   r   N)Nr   )r   r   r   r   )r   r   r   )r   r   r   rB   r   )rE   hasLasts     r4   test_lastOverridesNoneInAddz+MessageSetTests.test_lastOverridesNoneInAddN  s     Q--DgA///g	122III>>>Atg			22222r6   c                j    t          dd          }d|_        |                     |j        d           dS )zF
        Accessing L{MessageSet.last} returns the last value.
        r   Nr   )r   r   rB   r   s     r4   test_getLastzMessageSetTests.test_getLasta  s8     q$#####r6   c                   t                      }|                    d           |                     t          |          dg           t                      }|                    d           |                     t	          |          d           t                      }|                    d           |                     t          |          g d           t                      }|                    d           |                     t	          |          d           t                      }|                    t          dd                     |                     t          |          g d           dS )z
        L{MessageSet.extend} accepts as its arugment an L{int} or
        L{None}, or a sequence L{int}s or L{None}s of length two, or
        another L{MessageSet}, combining its argument with its
        instance's existing ranges.
        r   Nr   r   r   NNr   )r   extendrB   r   r   )rE   extendWithIntextendWithNoneextendWithSequenceOfIntsextendWithSequenceOfNonesextendWithMessageSets         r4   test_extendzMessageSetTests.test_extendi  sK    #Qm,,qc222#d###^,,c222#-<<  ''///677CCC$.LL!!((666677===)||##Jq!$4$4555233YYY?????r6   c                   t          dd          }t          dd          t          dd          z   }|                     d|           |                     d|           |dz   }|                     t                    5  d|v  ddd           n# 1 swxY w Y   |dz   }|                    dd           |                     t                    5  d|v  ddd           dS # 1 swxY w Y   dS )	z
        A L{MessageSet} contains a number if the number falls within
        one of its ranges, and raises L{TypeError} if any range
        contains L{None}.
        r   r   r   r   r   N)r      r   )r   assertInassertNotInr   r   r   )rE   hasFivedoesNotHaveFivehasFiveButHasNonehasFiveButHasNoneInSequences        r4   test_containszMessageSetTests.test_contains  s    Q""$Q**Z1-=-==a!!!O,,,#dNy)) 	# 	#"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# '.&8##''4000y)) 	- 	-,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s$   =BBBC  C$'C$c                p   t          dd          }t          dd          }||z   }|t          dd          z   }|                     t          |dz             g d           |                     t          |d	z             g d
           |                     t          |dz             g d           |                     t          |dz             g d           |                     t          |d	z             g d           |                     t          |t          d          z             g d           dS )z
        Adding a sequence of message numbers to a L{MessageSet} that
        begins or ends immediately before or after an existing
        sequence in that L{MessageSet}, or overlaps one, merges the two.
        r   r   r   r   r   r   )r   r   )r   r   r   r   )r   r   r  )r   r   )r   r   r   r   )r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   N)r   rB   r   )rE   
mergeAftermergeBeforemergeBetweenSequencemergeBetweenNumbers        r4   test_rangesMergedz!MessageSetTests.test_rangesMerged  sK     1%%
 A&&)K7'*Q*:*::j6122LLLAAAj6122OOODDDkF233\\\BBBkF233___EEE2V;<<>V>V>VWWW#jmm3446K6K6K	
 	
 	
 	
 	
r6   c                H   |                      t          dd          t          dd                     |                      t          t          dd                    g d           t          dd          }d|_        |                      t          |          ddg           dS )a  
        Test the C{seq-range} examples from Section 9, "Formal Syntax"
        of RFC 3501::

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

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

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        r   r   r   r   r   i  Ni  )rB   r   r   r   r   s     r4   test_seq_rangeExamplesz&MessageSetTests.test_seq_rangeExamples  s     	Aq)):a+;+;<<<jA..//;;;tT""a4,/////r6   c                   t          d          t          dd          z   t          d          z   t          dd          z   }d|_        |                     d                    d	 |D                       d
           t          dd          t          dd          z   }d|_        |                     d                    d |D                       d           dS )a  
        Test the C{sequence-set} examples from Section 9, "Formal
        Syntax" of RFC 3501.  In particular, L{MessageSet} reorders
        and coalesces overlaps::

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

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

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        r   r   r   r   r  N   ,c              3  4   K   | ]}t          |          V  d S r0   r   .0r   s     r4   	<genexpr>z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>  s(      99SVV999999r6   z2,4,5,6,7,9,12,13,14,15r   r   c              3  4   K   | ]}t          |          V  d S r0   r*  r+  s     r4   r-  z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>  s(      !B!BQ#a&&!B!B!B!B!B!Br6   z4,5,6,7,8,9,10)r   r   rB   r   )rE   fromFifteenMessagesfromTenMessagess      r4   test_sequence_setExamplesz)MessageSetTests.test_sequence_setExamples  s    $ qMMJq!,,,z!}}<z"d?S?SS 	 $& HH99%899999;T	
 	
 	
 %T1--
1a0@0@@!!B!B/!B!B!BBBDTUUUUUr6   N)rs   rt   ru   __doc__r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r"  r%  r1  r1   r6   r4   r   r     s8        1: 1: 1:f? ? ?  ( ( (.( ( ((
' 
' 
'C C C
. 
. 
.9 9 93 3 3  3 3 3&$ $ $@ @ @6- - -*
 
 
00 0 0,V V V V Vr6   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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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*S )+IMAP4HelperTestszA
    Tests for various helper utilities in the IMAP4 module.
    c                N    t          t          j        ddgd                     dS )zI
        L{imap4.Command}'s C{repr} does not raise an exception.
        s   COMMANDs   arg   extraN)r   r   CommandrR   s    r4   test_commandReprz!IMAP4HelperTests.test_commandRepr  s(     	U]:x(<<=====r6   c                2    dt                      t                    }t          j        |                                        } fd}fd}|                    |           |                    |           |                    |          S )Ns   xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzc                                         |                                dt                    fz  d                    j                             | S )Ns   {%d}
%br6   )r   rB   r   r   ry   )r2   br   r   rE   s    r4   r   z6IMAP4HelperTests.test_fileProducer.<locals>.cbProduced  sQ    $$VQ///]c!ffa[8#((18:L:LMMMMr6   c                0                                      | S r0   )r~   )r2   r   s    r4   cbResumez4IMAP4HelperTests.test_fileProducer.<locals>.cbResume  s     Mr6   )rw   r   r   FileProducerr   r   )rE   r3   r   r   r=  r;  r   r   s   `    @@@r4   test_fileProducerz"IMAP4HelperTests.test_fileProducer  s    7AJJq!!Q	 	 	 	 	 	 	 	
	 	 	 	 	 	
j!!!	h }}Z(((r6   c                *   dg dddggdg dg dgdg d	g d
gg}|D ]u\  }}}t          j        |d          }|D ]*}|                     |                    |                     +|D ]*}|                     |                    |                     +vd S )Nfoo/%gum/barzfoo/barzoo/lalagum/barzfoo/gumx/barzfoo/gum/bazfoo/xgum/barfoo/gum/barfoo/x%x/barfoobarzfuz fuz fuzz	foo/*/barfoo/xyz/barz
foo/xx/baz)foo/xyx/bar
foo/xx/barfoo/xxxxxxxxxxxxxx/barfoo/xyz*abc/barrI  zfoo/abc/barzfoo/xyzab/cbarzfoo/xyza/bcbarzfoo/xyzabc/barzfoo/xyz/abc/barzfoo/xyz/123/abc/bar/r   wildcardToRegexpassertFalsematch
assertTruerE   caseswildcardfailsucceedxs         r4   test_wildcardzIMAP4HelperTests.test_wildcard  s     LLL/ WWWGGG "RRRLLL
$ (- 	3 	3#HdG-h<<H 4 4  !2!23333 3 3q 1 122223		3 	3r6   c                .   dg dg dgdg dg dgdg dg d	gg}|D ]w\  }}}t          j        |d           }|D ]+}|                     |                    |          |           ,|D ]+}|                     |                    |          |           ,xd S )
NrA  rB  )rC  rD  zfoo/x/gum/barrE  rF  )rJ  rK  rL  zfoo/x/x/barrM  rN  rO  rQ  rV  s         r4   test_wildcardNoDelimz%IMAP4HelperTests.test_wildcardNoDelim"  s     LLL@@@ WWWVVV "RRRLLL
$ (- 	6 	6#HdG-h==H 7 7  !2!2A6666 6 6q 1 1155556		6 	6r6   c           	         ddddfg}|D ]o\  }}t          j        |          }|                     t          |                    d                    t          |                    d                               pdS )z
        L{imap4._formatHeaders} accepts a C{dict} of header name/value pairs and
        returns a string representing those headers in the standard multiline,
        C{":"}-separated format.
        Value1Value2)Header1Header2s"   Header2: Value2
Header1: Value1
TN)r   _formatHeadersrB   sorted
splitlines)rE   rW  rd   expectedr^   s        r4   test_headerFormatterz%IMAP4HelperTests.test_headerFormatter<  s     %::9
  % 	 	OE8)%00Fv((..//8K8KD8Q8Q1R1R   	 	r6   c                ^   g d}ddgddgg dg dg dg dg d	g d
g dg ddgddgdgg ddgg ddgg ddgg}g d}|D ]-}|                      t          j        t          j        |           .t	          ||          D ]-\  }}|                     t          j        |          |           .d S )N)s   Hello Worlds   Hello "World!"s   World "Hello" "How are you?"s   "Hello world" How "are you?"s   foo bar "baz buz" NILs   foo bar "baz buz" "NIL"s   foo NIL "baz buz" bars   foo "NIL" "baz buz" bars   "NIL" bar "baz buz" foos   oo \"oo\" oos   "oo \"oo\" oo"   oo 	 oos	   "oo 	 oo"   oo \t oos
   "oo \t oo"   oo \o oo
   "oo \o oo"rl  rm     Hello   Worlds   World!)ro  rn  s   How are you?)r;   s   Hows   are you?)   foo   bar   baz buzN)rp  rq  rr     NIL)rp  Nrr  rq  )rp  rs  rr  rq  )rs  rq  rr  rp  )   oos   "oo"rt  
   oo "oo" oort  rj  )rt  s   \trt  rk  )rt     \ort  rl  )s   "mismatched quotes   mismatched quote"s   mismatched"quotes   "oops here is" another")r   r   MismatchedQuotingsplitQuotedr   rB   )rE   rW  answerserrorsscaserg  s          r4   test_quotedSplitterz$IMAP4HelperTests.test_quotedSplitterO  sC   
 
 
. x y!111111...000...000000###OENM"""N"""N"""N'
,
 
 
  	M 	MAe5u7H!LLLL!%11 	@ 	@ND(U.t44h????	@ 	@r6   c                   g dg dg dddgdg ddgddg d	gd
ddd
g dd
ddd
g	dg dddgg}dgg ddgdgddgdgddggddgdgddgdgg}t          ||          D ]-\  }}|                     t          j        |          |           .d S )N)   a   b   c   d   e)
r         "r  r  r  r  r  r  r  )r  r  r  r  r  r  )r  r  r  r  )r  r  r  r  r  )r  r  r  r  r  r  r  s   abcde)r  s   bc    des   abcr  s   bcds   abs   cdes   a s    es    bc  )r   rB   r   collapseStrings)rE   rW  ry  r|  rg  s        r4   test_stringCollapserz%IMAP4HelperTests.test_stringCollapser  s   ***HHHt,%%%t,4+++,4t%7%7%7tT4P===tTJ
 J!!!XuF8T"VHVHe$H:u%
 "%11 	D 	DND(U2488(CCCC	D 	Dr6   c                    d                     dgdz            } fd} |dt          |          |fz  ddg dg|g            |d	d
dgdddddddg dgg dgg dgg dgg dg dgd d dg
dddddgd d dddgg
            |d d!g            |d"d#g            |d$d%g            |d&d'g            |d&d'g            |d(d)d*g            |d(d)d*g           d S )+N   
s   xxr   c                ^    t          j        |           }                    ||g           d S r0   )r   parseNestedParensrB   )r|  rg  parsedrE   s      r4   checkz0IMAP4HelperTests.test_parenParser.<locals>.check  s1    ,T22FVhZ00000r6   s8   (BODY.PEEK[HEADER.FIELDS.NOT (subject bcc cc)] {%d}
%b)	   BODY.PEEKs   HEADER.FIELDS.NOT)s   subjects   bccs   ccs  (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) ((NIL NIL imap cac.washington.edu)) ((NIL NIL minutes CNRI.Reston.VA.US) ("John Klensin" NIL KLENSIN INFOODS.MIT.EDU)) NIL NIL <B27397-0100000@cac.washington.edu>) BODY (TEXT PLAIN (CHARSET US-ASCII) NIL NIL 7BIT 3028 92))   FLAGSs   \Seens   INTERNALDATEs   17-Jul-1996 02:44:25 -0700s   RFC822.SIZEs   4286s   ENVELOPEs%   Wed, 17 Jul 1996 02:23:25 -0700 (PDT)s$   IMAP4rev1 WG mtg summary and minutes)s
   Terry GrayNs   gray   cac.washington.edu)NNs   imapr  )NNs   minutess   CNRI.Reston.VA.US)s   John KlensinNs   KLENSINs   INFOODS.MIT.EDUs#   <B27397-0100000@cac.washington.edu>   BODYs   TEXT   PLAIN   CHARSETs   US-ASCIIs   7BITs   3028s   92s   ("oo \"oo\" oo")ru  s   ("oo \\ oo")s   oo \\ oos   ("oo \ oo")s   oo \ oos	   ("oo \o")s   oo \os   (oo \o)rt  rv  )r   r   )rE   r{  r  s   `  r4   test_parenParserz!IMAP4HelperTests.test_parenParser  s   LL%1%%	1 	1 	1 	1 	1 	ISQRVVUVKW02M2M2MNPQR	
 	
 	
 	J -<;JJJKJJJKJJJKAAABFFFOOO : -	1"0	
 0	
 0	
d 	#m_555-111o}---mi[)))mi[)))kE6?+++kE6?+++++r6   c           
        g dg dg dg dg dg dg dg dg d	g	}|D ]\  }}}|                     d
          }t          j                    }|                    |           |                     t          |j                  d           |                     t          |j        d         t          ||                               |                     t          |j        d                   |           d S )N)ENVELOPEEnvelopeenvelope)FLAGSFlagsflags)INTERNALDATEInternalDateinternaldate)RFC822.HEADERRFC822Headerzrfc822.header)RFC822.SIZE
RFC822Sizezrfc822.size)RFC822.TEXT
RFC822Textzrfc822.text)RFC822r  rfc822)UIDr  uid)BODYSTRUCTUREBodyStructurebodystructureasciir   r   )rC   r   _FetchParserparseStringrB   r   r2   rU  
isinstancegetattrr   )rE   rW  inpoutpasStringr   s         r4   test_fetchParserSimplez'IMAP4HelperTests.test_fetchParserSimple  s   000'''<<<>>>888888***!!!???

 $) 	9 	9Cx**W%%C"$$AMM#S]]A...OOJqx{GAt4D4DEEFFFS!--x8888	9 	9r6   c                   ddg dfgddg dfgddg d	fgg}|D ]\  }}t          j                    }|                    |           |                     t	          |j                  |d
                    d |j        D             }|                                 |d                                          |                     ||d                    d S )Ns   ALLr   )   flags   internaldate   rfc822.size   envelopes   FULLr   )r  r  r  r  s   bodys   FASTr   )r  r  r  r   c                v    g | ]6}t          |                                                              d           7S )r  )r   lowerrC   )r,  tokens     r4   
<listcomp>z;IMAP4HelperTests.test_fetchParserMacros.<locals>.<listcomp>  s8    WWWUc%jj..0077@@WWWr6   r   )r   r  r  rB   r   r2   sort)rE   rW  r  r  r   expectedResults         r4   test_fetchParserMacrosz'IMAP4HelperTests.test_fetchParserMacros  s    aQQQRSUUUV qEEEFG
  	6 	6IC"$$AMM#S]]DG444WWahWWWN!!!GLLNNN^T!W5555	6 	6r6   c                0   t           j        } |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     |j        d         j
        d            |                     t          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j        d           |                     t          |j        d                   d	            |            }|                    d
           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j
        j        d           |                     |j        d         j
        j        d           |                     |j        d         j        d           |                     t          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j
        j        d           |                     |j        d         j
        j        d           |                     |j        d         j        d           |                     t          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j
        j        d           |                     |j        d         j
        j        g d           |                     |j        d         j        d           |                     t!          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j
        j        d           |                     |j        d         j
        j        g d           |                     |j        d         j        d           |                     t!          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j
        j        d           |                     |j        d         j
        j        g d           |                     |j        d         j        d           |                     t!          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j        |j                             |                     |j        d         j        d           |                     |j        d         j        d           |                     |j        d         j        d           |                     |j        d         j        d           |                     t!          |j        d                   d            |            }|                    d           |                     t	          |j                  d           |                     t          |j        d         |j                             |                     |j        d         j	        d           |                     t          |j        d         j
        |j                             |                     |j        d         j        d           |                     |j        d         j
        j        ddg           |                     |j        d         j        d           |                     |j        d         j        d           |                     |j        d         j        d           |                     t!          |j        d                   d           d S )Nr  r   r   FBODYr  Ts   BODY[]zBODY[]s   BODY[HEADER]r1   zBODY[HEADER]s   BODY.PEEK[HEADER]s+   BODY[HEADER.FIELDS (Subject Cc Message-Id)])s   SUBJECTs   CC
   MESSAGE-IDs0   BODY.PEEK[HEADER.FIELDS (Subject Cc Message-Id)]s4   BODY.PEEK[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s/   BODY[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s   BODY[1.MIME]<10.50>r   r   2   s?   BODY.PEEK[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   r   r   r   r  s   DATEg   E   s:   BODY[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   r  r  rB   r   r2   rU  r  Bodypeekheaderr   emptyHeadernegatefieldsrL   mimeMIMEpartpartialBeginpartialLength)rE   Pr   s      r4   test_fetchParserBodyz%IMAP4HelperTests.test_fetchParserBody  s
   ACC	gQX***
18A;77888!)5111!+T222QXa[))6222ACC	l###QX***
18A;77888!)4000QXa[))6222ACC	i   QX***
18A;77888!*D111QXa[))8444ACC	o&&&QX***
18A;77888!)5111
18A;#5qx@@AAA!+2D999!+2B777!*E222QXa[))>:::ACC	*+++QX***
18A;77888!)4000
18A;#5qx@@AAA!+2D999!+2B777!*E222QXa[))>:::ACC	DEEEQX***
18A;77888!)5111
18A;#5qx@@AAA!+2E:::!+24V4V4VWWW!*E222!(1+ N	
 	
 	
 ACC	IJJJQX***
18A;77888!)4000
18A;#5qx@@AAA!+2E:::!+24V4V4VWWW!*E222!(1+ N	
 	
 	
 ACC	MNNNQX***
18A;77888!)4000
18A;#5qx@@AAA!+2D999!+24V4V4VWWW!*E222!(1+ R	
 	
 	
 ACC	,---QX***
18A;77888!)5111
18A;#3QV<<===!)4000!12666!2B777!*E222qx{++-CDDDACC	N	
 	
 	
 	QX***
18A;77888!)4000
18A;#5qx@@AAA!)=999!+2]G4LMMM!13777!2B777!*E222!(1+I	
 	
 	
 	
 	
r6   c                   t          j                    }|                    d           |                     t	          |j                  d           |                     |j        d         j        d           |                     |j        d         |j                   |                     |j        d         j	        |j
                   |                     t          |j        d                   d           dS )z
        Parsing a C{BODY} whose C{HEADER} values require quoting
        results in a object that perserves that quoting when
        serialized.
        s   BODY[HEADER.FIELDS ((Quoted)]r   r   Fs   BODY[HEADER.FIELDS ("(Quoted")]N)r   r  r  rB   r   r2   r  assertIsInstancer  r  r  rL   rE   r   s     r4   test_fetchParserQuotedHeaderz-IMAP4HelperTests.test_fetchParserQuotedHeader  s       	6777QX***!)5111ahqk16222ahqk0!(;;;qx{++-OPPPPPr6   c                    t          j                    }|                    d           |                     t	          |j                             dS )z=
        Parsing an empty string results in no data.
        r6   N)r   r  r  rS  r   r2   r  s     r4   test_fetchParserEmptyStringz,IMAP4HelperTests.test_fetchParserEmptyString  sF       	cQX'''''r6   c                n    t          j                    }|                     t          |j        d           dS )z\
        Parsing a string with an unknown attribute raises an
        L{Exception}.
        s   UNKNOWNNr   r  r   	Exceptionr  r  s     r4    test_fetchParserUnknownAttributez1IMAP4HelperTests.test_fetchParserUnknownAttribute  s2    
   )Q]J?????r6   c                n    t          j                    }|                     t          |j        d           dS )zf
        Parsing a string that prematurely ends in whitespace raises an
        L{Exception}.
        s   BODY[HEADER.FIELDS  Nr  r  s     r4   0test_fetchParserIncompleteStringEndsInWhitespacezAIMAP4HelperTests.test_fetchParserIncompleteStringEndsInWhitespace  3    
   )Q]4KLLLLLr6   c                n    t          j                    }|                     t          |j        d           dS )z
        Parsing a string that contains an unexpected character rather
        than whitespace raises an L{Exception}.
        s   BODY[HEADER.FIELDS!]Nr  r  s     r4   "test_fetchParserExpectedWhitespacez3IMAP4HelperTests.test_fetchParserExpectedWhitespace  r  r6   c                   t          j                    }|                    d           |                     t	          |j                  d           |                     |j        d         |j                   |                     |j        d         j        d           |                     |j        d         j	        |j
                   |                     t          |j        d                   d           dS )z:
        A C{BODY} can contain a C{TEXT} section.
        s
   BODY[TEXT]r   r   FN)r   r  r  rB   r   r2   r  r  r  rF   TextrL   r  s     r4   test_fetchParserTextSectionz,IMAP4HelperTests.test_fetchParserTextSection  s       	m$$$QX***ahqk16222!)5111ahqk.777qx{++];;;;;r6   c                n    t          j                    }|                     t          |j        d           dS )z[
        Parsing a C{BODY} with an unknown section raises an
        L{Exception}.
        s   BODY[UNKNOWN]Nr  r  s     r4   test_fetchParserUnknownSectionz/IMAP4HelperTests.test_fetchParserUnknownSection  s3    
   )Q]4DEEEEEr6   c                    t          j                    }|                     t          |j        d           t          j                    }|                     t          |j        d           dS )ze
        Parsing a C{BODY} with an unterminated section list raises an
        L{Exception}.
        s   BODY[HEADERs   BODY[HEADER.FIELDS (SUBJECT)Nr  r  s     r4   #test_fetchParserMissingSectionClosez4IMAP4HelperTests.test_fetchParserMissingSectionClose  s[    
   )Q]NCCC  )Q]4STTTTTr6   c                    t          j                    }|                     t          |j        d           t          j                    }|                     t          |j        d           dS )z
        Parsing a C{BODY} whose C{HEADER.FIELDS} list does not begin
        with an open parenthesis (C{(}) or end with a close
        parenthesis (C{)}) raises an L{Exception}.
        s   BODY[HEADER.FIELDS Missing)]s   BODY[HEADER.FIELDS (Missing]Nr  r  s     r4   (test_fetchParserHeaderMissingParenthesesz9IMAP4HelperTests.test_fetchParserHeaderMissingParentheses  s\       )Q]4STTT  )Q]4STTTTTr6   c                n    t          j                    }|                     t          |j        d           dS )zk
        Parsing a C{BODY} with a range that lacks a period (C{.})
        raises an L{Exception}.
        s   BODY<01>Nr  r  s     r4   test_fetchParserDotlessPartialz/IMAP4HelperTests.test_fetchParserDotlessPartial  s2    
   )Q]K@@@@@r6   c                n    t          j                    }|                     t          |j        d           dS )z
        Parsing a C{BODY} with a partial range that's missing its
        closing greater than sign (C{>}) raises an L{EXCEPTION}.
        s   BODY<0Nr  r  s     r4   test_fetchParserUnclosedPartialz0IMAP4HelperTests.test_fetchParserUnclosedPartial  s2    
   )Q]I>>>>>r6   c                    dddt          d          ddg}d}|                     t          j        |          |           d S )NrG  rH  baz   this is a file
buzbizs4   "foo" "bar" "baz" {16}
this is a file
 "buz" "biz")r   rB   r   collapseNestedLists)rE   inputStructurer^   s      r4   
test_fileszIMAP4HelperTests.test_files  sS    )**
 M2>BBFKKKKKr6   c                    dt          j        d          dt          d          dt          j        d          dg}d}|                     t          j        |          |           d S )	Nrp  rq  s   bazr  s   this is
quoteds   buzr6   sC   "foo" bar "baz" {16}
this is a file
 {15}
this is
quoted buz "")r   DontQuoteMer   rB   r  rc   s      r4   test_quoteAvoiderz"IMAP4HelperTests.test_quoteAvoider  sp    f%%)** f%%
 	 	25996BBBBBr6   c                t    ddggfg}|D ]-\  }}|                      t          j        |          |           .d S )Ns   ({10}
0123456789)s
   0123456789)rB   r   r  )rE   rW  r|  rg  s       r4   test_literalszIMAP4HelperTests.test_literals  s]    $&78
 $ 	F 	FND(U4T::HEEEE	F 	Fr6   c                   t          j        d          t          j        ddd          t          j        t          j        d          t          j        d                    t          j        d          t          j        t          j        d          t          j        d          t          j        d                    t          j        t          j        t          j        t          j        dd	d
          t          j        ddd          t          j        dddd          t          j        t          j        d                                        t          j        t          j        d                              g}g d}t	          ||          D ]\  }}|                     ||           d S )Nr   )flagged)re  	unflaggeddeleted)r  today)before)unseen)new	yesterdayi  )re  sincesmallertuesdayi'  )re  r  larger)re  r  r  r  spam)r   z1:5r  )FLAGGEDz(DELETED UNFLAGGED)z(OR FLAGGED DELETED)z(BEFORE "today")z(OR DELETED (OR UNSEEN NEW))z(OR (NOT (OR (SINCE "yesterday" SMALLER 1000) (OR (BEFORE "tuesday" LARGER 10000) (OR (BEFORE "today" DELETED UNSEEN) (NOT (SUBJECT "spam")))))) (NOT (UID 1:5))))r   QueryOrNotr   rB   )rE   r   r   queryrg  s        r4   test_queryBuilderz"IMAP4HelperTests.test_queryBuilder  s   K"""KqAq999HU[+++U[-C-C-CDDKw'''HU[+++U[-B-B-BEKTUDVDVDVWWH	H1KNNN1YuMMM1Q'RRR	%+f"="="=>>	   	%+%00011
 

&

 

 

  #6733 	. 	.OE8UH----	. 	.r6   c                \    t          j        d          }|                     d|           dS )z
        When passed the C{keyword} argument, L{imap4.Query} returns an unquoted
        string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        twisted)keywordz(KEYWORD twisted)Nr   r  rB   rE   r  s     r4   test_queryKeywordFlagWithQuotesz0IMAP4HelperTests.test_queryKeywordFlagWithQuotes@  s3     I...,e44444r6   c                \    t          j        d          }|                     d|           dS )z
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        unquoted string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        r  )	unkeywordz(UNKEYWORD twisted)Nr  r  s     r4   !test_queryUnkeywordFlagWithQuotesz2IMAP4HelperTests.test_queryUnkeywordFlagWithQuotesK  s3     i000.66666r6   c                    t          j        t          j        dd                    }|                     |d           dS )z
        When passed a L{MessageSet}, L{imap4.Query} returns a query
        containing a quoted string representing the ID sequence.
        r   Nmessagesz(MESSAGES "1:*"))r   r  r   rB   r  s     r4   test_queryWithMesssageSetz*IMAP4HelperTests.test_queryWithMesssageSetV  s@    
 U%5a%>%>??? 233333r6   c                \    t          j        d          }|                     |d           dS )zl
        When passed an L{int}, L{imap4.Query} returns a query
        containing a quoted integer.
        r   r  z(MESSAGES "1")Nr  r  s     r4   test_queryWithIntegerz&IMAP4HelperTests.test_queryWithInteger^  s3    
 Q''' 011111r6   c                    |                      t          j        t          j        t          j        d                     dS )zq
        An L{imap4.Or} query with less than two arguments raises an
        L{imap4.IllegalQueryError}.
        r   r  N)r   r   IllegalQueryErrorr  r  rR   s    r4   test_queryOrIllegalQueryz)IMAP4HelperTests.test_queryOrIllegalQueryf  s5    
 	%158U[RS=T=T=TUUUUUr6   c                V   |                      d|                                 dt          j        d
i |di           |                      d|                                 dt          j        d
i |dd                    d t          d          D                       di           d	S )z
        Helper to implement tests for value filtering of KEYWORD and UNKEYWORD
        queries.

        @param keyword: A native string giving the name of the L{imap4.Query}
            keyword argument to test.
        (z twistedrocks)ztwisted (){%*"\] rocksztwisted  c              3  4   K   | ]}t          |          V  d S r0   )ro   )r,  chs     r4   r-  z9IMAP4HelperTests._keywordFilteringTest.<locals>.<genexpr>  s(      ;;2s2ww;;;;;;r6   !   z rocksNr1   )rB   upperr   r  r   rn   )rE   r  s     r4   _keywordFilteringTestz&IMAP4HelperTests._keywordFilteringTestm  s     	////K??7$=>??	
 	
 	
 	////K  Gww;;r;;;;;;;> 	
 	
 	
 	
 	
r6   c                0    |                      d           dS )a  
        When passed the C{keyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  Nr.  rR   s    r4   test_queryKeywordFlagz&IMAP4HelperTests.test_queryKeywordFlag  s     	""9-----r6   c                0    |                      d           dS )a  
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  Nr0  rR   s    r4   test_queryUnkeywordFlagz(IMAP4HelperTests.test_queryUnkeywordFlag  s     	"";/////r6   c                p    g d}|D ].}|                      t          j        t          j        |d           /dS )z|
        Trying to parse an invalid representation of a sequence range raises an
        L{IllegalIdentifierError}.
        )s   *:*rp  s   4:s   bar:590  Nr   r   IllegalIdentifierErrorr   rE   r   rd   s      r4   test_invalidIdListParserz)IMAP4HelperTests.test_invalidIdListParser  sT    
 322 	 	E,e.?   	 	r6   c                p    g d}|D ].}|                      t          j        t          j        |d           /dS )z
        Zeroes and negative values are not accepted in id range expressions. RFC
        3501 states that sequence numbers and sequence ranges consist of
        non-negative numbers (RFC 3501 section 9, the seq-number grammar item).
        )s   0:5s   0:0s   *:0   0s   -3:5s   1:-2s   -1r5  Nr6  r8  s      r4   #test_invalidIdListParserNonPositivez4IMAP4HelperTests.test_invalidIdListParserNonPositive  sU     IHH 	 	E,e.?   	 	r6   c                x   g d}t          dd          t          dd          t          dd          t          dd          z   t          dd          t          d          t          dd          t          d          t          d          z   t          d          z   t          dd          t          dd          t          dd          t          dd	          z   t          d          t          dd          z   t          d          t          dd          z   t          d
d	          z   t          dd          t          d
          z   t          d	d          z   t          dd          g}g d}t          ||          D ]-\  }}|                     t          j        |          |           .t          ||          D ]|\  }}|4|                     t          t          t          j        |                     ;t          t          j        |                    }|                     ||d|d|d|           }dS )zi
        The function to parse sequence ranges yields appropriate L{MessageSet}
        objects.
        )r   s   5:*s   1:2,5:*r      1s   1,2s   1,3,5s   1:10s   1:10,11s	   1:5,10:20s   1,5:10s   1,5:10,15:20s   1:10,15,20:25   4:2r   Nr   r   r   r         r'     r   )NNNr   r   r   r   r   r@     r         r   zlen(z) = z != )r   r   rB   r   r   r   r   r   )rE   r   r   lengthsrd   rg  Ls          r4   test_parseIdListz!IMAP4HelperTests.test_parseIdList  s1   

 
 
$ q$q$q$*Q"2"22tT""qMMq!qMMJqMM)JqMM9q"q"q!z"b111qMMJq"---qMMJq"---
2r0B0BBq"
2.B1C1CCq!
" KJJ"6733 	A 	AOE8U.u55x@@@@"6733 	Y 	YOE8!!)S%2CE2J2JKKKK)%0011  H.WU.W.W!.W.W8.W.WXXXX	Y 	Yr6   c                R    |                      t          t          j        d           dS )zu
        L{imap4.parseTime} raises L{ValueError} when given a a time
        string whose format is invalid.
        invalidNr   r  r   	parseTimerR   s    r4   test_parseTimeInvalidFormatz,IMAP4HelperTests.test_parseTimeInvalidFormat  s$    
 	*eoyAAAAAr6   c                d    g d}|D ](}|                      t          t          j        |           )dS )zv
        L{imap4.parseTime} raises L{ValueError} when given a time
        string composed of invalid values.
        )zinvalid-July-2017z2-invalid-2017z2-July-invalidNrK  )rE   invalidStringsrJ  s      r4   test_parseTimeInvalidValuesz,IMAP4HelperTests.test_parseTimeInvalidValues  sO    

 
 

 & 	D 	DGj%/7CCCC	D 	Dr6   c                `   t                      }|                                |                                |                                |                                |                                d}t          j        ||                                          }| 	                    ||           dS )z
        L{imap4.statusRequestHelper} builds a L{dict} mapping the
        requested status names to values extracted from the provided
        L{IMailboxIMAP}'s.
        )MESSAGESRECENTUIDNEXTUIDVALIDITYUNSEENN)
SimpleMailboxgetMessageCountgetRecentCount
getUIDNextgetUIDValiditygetUnseenCountr   statusRequestHelperkeysrB   )rE   mboxrg  r2   s       r4   test_statusRequestHelperz)IMAP4HelperTests.test_statusRequestHelper  s      ,,..))++((..00))++
 
 *4AA6*****r6   N),rs   rt   ru   r2  r8  r?  r\  r^  rh  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r#  r&  r.  r1  r3  r9  r<  rH  rM  rP  r`  r1   r6   r4   r4  r4    s        > > >) ) )03 3 346 6 64  &8@ 8@ 8@tD D D0M, M, M,^9 9 9*6 6 6&r
 r
 r
hQ Q Q( ( (@ @ @M M MM M M
< 
< 
<F F FU U U	U 	U 	UA A A? ? ?L L LC C C(F F F!. !. !.F	5 	5 	5	7 	7 	74 4 42 2 2V V V
 
 
2. . .0 0 0
 
 
  1Y 1Y 1YfB B BD D D+ + + + +r6   r4  c                      e Zd ZU dZg Zde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dZd Zd Zd Zd Zd ZdS )rW  z\Flag1Flag2z\AnotherSysFlagLastFlag+list[tuple[bytes, list[bytes], bytes, int]]r   r   r   Fc                X    g | _         | j         j        | _        | j         j        | _        d S r0   	listenersr|   addListenerremoveremoveListenerrR   s    r4   rz   zSimpleMailbox.__init__!  )    >0"n3r6   c                    | j         S r0   r  rR   s    r4   getFlagszSimpleMailbox.getFlags&  
    zr6   c                    dS )N*   r1   rR   s    r4   r[  zSimpleMailbox.getUIDValidity)  s    rr6   c                0    t          | j                  dz   S Nr   r   r   rR   s    r4   rZ  zSimpleMailbox.getUIDNext,  s    4=!!A%%r6   c                    dS )Nr   r1   rR   s    r4   rX  zSimpleMailbox.getMessageCount/      qr6   c                    dS )Nr   r1   rR   s    r4   rY  zSimpleMailbox.getRecentCount2  rw  r6   c                    dS )Nr   r1   rR   s    r4   r\  zSimpleMailbox.getUnseenCount5  rw  r6   c                    | j         S r0   rwrR   s    r4   isWriteablezSimpleMailbox.isWriteable8  s	    wr6   c                    d S r0   r1   rR   s    r4   destroyzSimpleMailbox.destroy;      r6   c                    dS )NrP  r1   rR   s    r4   getHierarchicalDelimiterz&SimpleMailbox.getHierarchicalDelimiter>  s    sr6   c                B   i }d|v r|                                  |d<   d|v r|                                 |d<   d|v r|                                  dz   |d<   d|v r|                                 |d<   d|v r|                                 |d<   t	          j        |          S )NrR  rS  rT  r   rU  rV  rX  rY  getUIDr\  r   rZ  rE   namesrs      r4   requestStatuszSimpleMailbox.requestStatusA  s     0022AjMu--//AhK//11A5AiLE!!#{{}}Amu--//AhK}Qr6   Nc                    | j                             |||| j        f           | xj        dz  c_        t          j        d           S rt  r   r|   mUIDr   rZ  rE   messager  dates       r4   
addMessagezSimpleMailbox.addMessageO  sB    gudDI>???		Q		}T"""r6   c                    g }| j         D ]!}d|d         v r|                    |           "|D ]}| j                             |           d |D             S )N\Deletedr   c                    g | ]
}|d          S r   r1   r+  s     r4   r  z)SimpleMailbox.expunge.<locals>.<listcomp>[      %%%!%%%r6   r   r|   rj  rE   deleter   s      r4   expungezSimpleMailbox.expungeT  sv     	! 	!Aad""a    	$ 	$AM  ####%%f%%%%r6   c                    d| _         d S NT)closedrR   s    r4   closezSimpleMailbox.close]  s    r6   c                    d S r0   r1   rE   r   r  s      r4   fetchzSimpleMailbox.fetch`      r6   c                    d S r0   r1   rE   r  s     r4   r  zSimpleMailbox.getUIDd  r  r6   c                    d S r0   r1   rE   r   r  moder  s        r4   storezSimpleMailbox.storeh  r  r6   r0   )rs   rt   ru   r  r   __annotations__r  r|  r  rz   ro  r[  rZ  rX  rY  r\  r}  r  r  r  r  r  r  r  r  r  r1   r6   r4   rW  rW    s?        @E<>H>>>>D	
BF4 4 4
    & & &                 # # # #
& & &          r6   rW  c                      e Zd ZU dZdZg Zde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dZd Zd Zd Zd ZdS )UncloseableMailboxz*
    A mailbox that cannot be closed.
    rb  re  r   r   r   Fc                X    g | _         | j         j        | _        | j         j        | _        d S r0   rg  rR   s    r4   rz   zUncloseableMailbox.__init__y  rl  r6   c                    | j         S )zB
        The flags

        @return: A sequence of flags.
        rn  rR   s    r4   ro  zUncloseableMailbox.getFlags~  s     zr6   c                    dS )zF
        The UID validity value.

        @return: The value.
        rr  r1   rR   s    r4   r[  z!UncloseableMailbox.getUIDValidity  s	     rr6   c                0    t          | j                  dz   S )z:
        The next UID.

        @return: The UID.
        r   ru  rR   s    r4   rZ  zUncloseableMailbox.getUIDNext  s     4=!!A%%r6   c                    dS )zG
        The number of messages.

        @return: The number.
        r   r1   rR   s    r4   rX  z"UncloseableMailbox.getMessageCount  	     qr6   c                    dS )D
        The recent messages.

        @return: The number.
        r   r1   rR   s    r4   rY  z!UncloseableMailbox.getRecentCount  r  r6   c                    dS )r  r   r1   rR   s    r4   r\  z!UncloseableMailbox.getUnseenCount  r  r6   c                    | j         S )z`
        The recent messages.

        @return: Whether or not the mailbox is writable.
        r{  rR   s    r4   r}  zUncloseableMailbox.isWriteable  s     wr6   c                    dS )z'
        Destroy this mailbox.
        Nr1   rR   s    r4   r  zUncloseableMailbox.destroy  s	     	r6   c                    dS )zU
        Return the hierarchical delimiter.

        @return: The delimiter.
        rP  r1   rR   s    r4   r  z+UncloseableMailbox.getHierarchicalDelimiter  s	     sr6   c                B   i }d|v r|                                  |d<   d|v r|                                 |d<   d|v r|                                  dz   |d<   d|v r|                                 |d<   d|v r|                                 |d<   t	          j        |          S )z
        Return the mailbox's status.

        @param names: The status items to include.

        @return: A L{dict} of status data.
        rR  rS  rT  r   rU  rV  r  r  s      r4   r  z UncloseableMailbox.requestStatus  s      0022AjMu--//AhK//11A5AiLE!!#{{}}Amu--//AhK}Qr6   Nc                    | j                             |||| j        f           | xj        dz  c_        t          j        d          S )a  
        Add a message to the mailbox.

        @param message: The message body.

        @param flags: The message flags.

        @param date: The message date.

        @return: A L{Deferred} that fires when the message has been
            added.
        r   Nr  r  s       r4   r  zUncloseableMailbox.addMessage  sD     	gudDI>???		Q		}T"""r6   c                    g }| j         D ]!}d|d         v r|                    |           "|D ]}| j                             |           d |D             S )zj
        Delete messages marked for deletion.

        @return: A L{list} of deleted message IDs.
        r  r   c                    g | ]
}|d          S r  r1   r+  s     r4   r  z.UncloseableMailbox.expunge.<locals>.<listcomp>  r  r6   r  r  s      r4   r  zUncloseableMailbox.expunge  sx      	! 	!Aad""a    	$ 	$AM  ####%%f%%%%r6   c                    d S r0   r1   r  s      r4   r  zUncloseableMailbox.fetch  r  r6   c                    d S r0   r1   r  s     r4   r  zUncloseableMailbox.getUID  r  r6   c                    d S r0   r1   r  s        r4   r  zUncloseableMailbox.store   r  r6   r0   )rs   rt   ru   r2  r  r   r  r  r|  r  rz   ro  r[  rZ  rX  rY  r\  r}  r  r  r  r  r  r  r  r  r1   r6   r4   r  r  m  s=          AE<>H>>>>D	
BF4 4 4
    & & &                 *# # # #"& & &        r6   r  c                  $    e Zd ZdZeZd ZddZdS )AccountWithoutNamespaceszL
    An in-memory account that does not provide L{INamespacePresenter}.
    c                *    |                                  S r0   )mailboxFactory)rE   nameids      r4   _emptyMailboxz&AccountWithoutNamespaces._emptyMailbox  s    ""$$$r6   r   c                X    t           j                            | |          }|||_        |S r0   )r   MemoryAccountselectr|  )rE   r  r|  r_  s       r4   r  zAccountWithoutNamespaces.select  s,    "))$55DGr6   Nr   )rs   rt   ru   r2  rW  r  r  r  r1   r6   r4   r  r    sH          #N% % %     r6   r  c                      e Zd ZdZdS )AccountzD
    An in-memory account that provides L{INamespacePresenter}.
    Nrs   rt   ru   r2  r1   r6   r4   r  r    s           r6   r  c                  0    e Zd Z ed          Zd Zd ZdS )SimpleServer   testuserc                   t          j        j        | g|R i | t          |           }t	          |          }t                      }|                    dd           || _        || _        |	                    |           d| _
        d S )NaccountHolderr     password-testF)r   IMAP4Serverrz   	TestRealmr   r   addUsercheckerportalregisterCheckertimeoutTest)rE   argskwrealmr  r   s         r4   rz   zSimpleServer.__init__  s    "45$555"555---355			+/000q!!! r6   c                X    | j         rd S t          j                            | |           d S r0   )r  r   r  lineReceivedrE   lines     r4   r  zSimpleServer.lineReceived*  s1     	F&&tT22222r6   N)rs   rt   ru   r  
theAccountrz   r  r1   r6   r4   r  r    sA        %%J	! 	! 	!3 3 3 3 3r6   r  c                  .    e Zd ZddZd Zd Zd Zd ZdS )SimpleClientNc                b    t           j                            | |           || _        g | _        d S r0   )r   IMAP4Clientrz   deferredevents)rE   r  contextFactorys      r4   rz   zSimpleClient.__init__3  s-    ""4888 r6   c                :    | j                             d            d S r0   )r  callback)rE   capss     r4   serverGreetingzSimpleClient.serverGreeting8  s    t$$$$$r6   c                p    | j                             d|g           | j                                         d S )NmodeChangedr  r|   	transportloseConnection)rE   	writeables     r4   r  zSimpleClient.modeChanged;  s7    M95666%%'''''r6   c                p    | j                             d|g           | j                                         d S )NflagsChangedr  rE   newFlagss     r4   r  zSimpleClient.flagsChanged?  s7    NH5666%%'''''r6   c                r    | j                             d||g           | j                                         d S )NnewMessagesr  )rE   existsrecents      r4   r  zSimpleClient.newMessagesC  s9    M66:;;;%%'''''r6   r0   )rs   rt   ru   rz   r  r  r  r  r1   r6   r4   r  r  2  sd           
% % %( ( (( ( (( ( ( ( (r6   r  c                  P    e Zd ZU dZded<   dZded<   d Zd Zd Zd	 Z	d
 Z
d ZdS )IMAP4HelperMixinNzOptional[ServerTLSContext]	serverCTXzOptional[ClientTLSContext]	clientCTXc                
   t          j                    }t          | j                  | _        t          || j                  | _        || _        g t          _
        t          d          }t          |_        |t          _        d S )Nr  r  )r   r   r  r  serverr  r  client	connectedrW  r   r  mboxTyper  )rE   r   r  s      r4   setUpzIMAP4HelperMixin.setUpL  sk    N"$.AAA"1T^DDD!#[))
+
",r6   c                    | ` | `| `d S r0   )r  r  r  rR   s    r4   tearDownzIMAP4HelperMixin.tearDownW  s    KKNNNr6   c                B    | j         j                                         d S r0   )r  r  r  )rE   ignores     r4   _cbStopClientzIMAP4HelperMixin._cbStopClient\  s    ,,.....r6   c                    | j         j                                         | j        j                                         t	          j        |dt          |           z              d S )NProblem with )r  r  r  r  r%   errr   )rE   r$   s     r4   
_ebGeneralzIMAP4HelperMixin._ebGeneral_  sS    ,,...,,...3t99455555r6   c                @    t          j        | j        | j                  S r0   )r#   loopbackAsyncr  r  rR   s    r4   r#   zIMAP4HelperMixin.loopbackd  s    %dk4;???r6   c                     |j         t          j                   t          |j                  }t          |          }|                     ||           dS )a.  
        Assert that the provided failure is an L{IMAP4Exception} with
        the given message.

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

        @param expected: The expected failure message.
        @type expected: L{bytes}
        N)trapr   IMAP4Exceptionr   valuer   rB   )rE   r$   rg  r  s       r4   assertClientFailureMessagez+IMAP4HelperMixin.assertClientFailureMessageg  sO     	U)***gm$$>>(+++++r6   )rs   rt   ru   r  r  r  r  r  r
  r  r#   r  r1   r6   r4   r  r  H  s         ,0I0000,0I0000	- 	- 	-  
/ / /6 6 6
@ @ @, , , , ,r6   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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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-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4S )5IMAP4ServerTestsc                &    i  fd} j                             t          |                                         j                  }t          j                                         |g          }d d d d|                     fd          S )Nc                 h    fd} j                                                             |           S )Nc                n                         |            j        j                                         d S r0   updater  r  r  r   r  rE   s    r4   gotCapszAIMAP4ServerTests.testCapability.<locals>.getCaps.<locals>.gotCaps~  /    A%4466666r6   r  getCapabilitiesr   r  r  rE   s    r4   getCapsz0IMAP4ServerTests.testCapability.<locals>.getCaps}  E    7 7 7 7 7 7 ;..00<<WEEEr6   )	   IMAP4rev1	   NAMESPACE   IDLEc                0                                   S r0   rB   )_r  rg  rE   s    r4   r5   z1IMAP4ServerTests.testCapability.<locals>.<lambda>  s    t'7'7$'G'G r6   )r  r   r7   
addErrbackr  r   gatherResultsr#   )rE   r#  d1r   r  rg  s   `   @@r4   testCapabilityzIMAP4ServerTests.testCapabilityz  s    	F 	F 	F 	F 	F 	F ^''g77BB4?SS" 566"&dTJJ}}GGGGGGHHHr6   c                R    i t            j        j        d<    fd} j                            t          |                                         j                  }t          j	         
                                |g          }d d d dgd|                     fd          S )N   CRAM-MD5c                 h    fd} j                                                             |           S )Nc                n                         |            j        j                                         d S r0   r  r  s    r4   r  zIIMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps.<locals>.gotCaps  r  r6   r   r"  s    r4   r#  z8IMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps  r$  r6   )r%  r&  r'     AUTHc                0                                   S r0   r)  )r*  r  expCaprE   s    r4   r5   z9IMAP4ServerTests.testCapabilityWithAuth.<locals>.<lambda>  s    t'7'7'E'E r6   )r   r  challengersr  r   r7   r+  r  r   r,  r#   )rE   r#  r-  r   r  r5  s   `   @@r4   testCapabilityWithAuthz'IMAP4ServerTests.testCapabilityWithAuth  s    /A,	F 	F 	F 	F 	F 	F ^''g77BB4?SS" 566 !]	
 
 }}EEEEEEFFFr6   c                     d _          fd} j                            t          |                                         j                                                    }|                     fd          S )Nr   c                     fd} j                                                             t          |                      d S )Nc                     d _         d S rt  )	loggedOutrR   s   r4   setLoggedOutzAIMAP4ServerTests.testLogout.<locals>.logout.<locals>.setLoggedOut  s    !"r6   )r  logoutr   r7   )r<  rE   s    r4   r=  z+IMAP4ServerTests.testLogout.<locals>.logout  sN    # # # # # K  ,,U<-@-@AAAAAr6   c                :                         j        d          S rt  )rB   r;  r*  rE   s    r4   r5   z-IMAP4ServerTests.testLogout.<locals>.<lambda>  s    t'7'7'J'J r6   )r;  r  r   r7   r+  r  r#   )rE   r=  r   s   `  r4   
testLogoutzIMAP4ServerTests.testLogout  s    	B 	B 	B 	B 	B 	""5==11<<T_MMMMMOO}}JJJJKKKr6   c                     d  _          fd} j                            t          |                                         j                                                    }|                     fd          S )Nc                 j    fd} j                                                             |            d S )Nc                R    | _         j        j                                         d S r0   )	responsesr  r  r  )rD  rE   s    r4   setResponsesz=IMAP4ServerTests.testNoop.<locals>.noop.<locals>.setResponses  s'    !*%4466666r6   )r  noopr   )rE  rE   s    r4   rF  z'IMAP4ServerTests.testNoop.<locals>.noop  sF    7 7 7 7 7 K**<88888r6   c                :                         j        g           S r0   )rB   rD  r?  s    r4   r5   z+IMAP4ServerTests.testNoop.<locals>.<lambda>  s    t'7'7'K'K r6   )rD  r  r   r7   r+  r  r#   )rE   rF  r   s   `  r4   testNoopzIMAP4ServerTests.testNoop  sz    	9 	9 	9 	9 	9 	""5;;//::4?KKKMMOO}}KKKKLLLr6   c                     fd} j                             t          |                                         j                  }t          j        |                                 g          }|                     j                  S )Nc                 r    j                             dd          } |                     j                   d S Nr  r  )r  loginr   r
  r   rE   s    r4   rL  z)IMAP4ServerTests.testLogin.<locals>.login  s6    !!+/?@@AMM$,-----r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestLoginrE   rL  r-  r   s   `   r4   	testLoginzIMAP4ServerTests.testLogin  s{    	. 	. 	. 	. 	. ^''e55@@QQT]]__ 566}}T.///r6   c                    |                      | j        j        t          j                   |                      | j        j        d           d S NauthrB   r  accountr  r  staterE   ignoreds     r4   rN  zIMAP4ServerTests._cbTestLogin  A    ,l.EFFF*F33333r6   c                     fd} j                             t          |                                         j                  }                                 }t          j        ||g          }|                     j                  S )Nc                 r    j                             dd          } |                     j                   d S Nr  s   wrong-passwordr  rL  addBothr
  rM  s    r4   rL  z/IMAP4ServerTests.testFailedLogin.<locals>.login  6    !!+/@AAAIId()))))r6   )	r  r   r7   r+  r  r#   r   r,  _cbTestFailedLoginrE   rL  r-  d2r   s   `    r4   testFailedLoginz IMAP4ServerTests.testFailedLogin  s    	* 	* 	* 	* 	* ^''e55@@QQ]]__R))}}T4555r6   c                    |                      | j        j        d            |                      | j        j        d           d S )Nunauth)rB   r  rU  rV  rW  s     r4   r`  z#IMAP4ServerTests._cbTestFailedLogin  s>    ,d333*H55555r6   c                ,    d j         _         fd} j                            t	          |                                         j                  }                                 }t          j	        ||g          }|                     j
                  S )zj
        Attempting to log into a server that has no L{Portal} results
        in a failed login.
        Nc                 r    j                             dd          } |                     j                   d S r\  r]  rM  s    r4   rL  z7IMAP4ServerTests.test_loginWithoutPortal.<locals>.login  r_  r6   )r  r  r  r   r7   r+  r  r#   r   r,  r`  ra  s   `    r4   test_loginWithoutPortalz(IMAP4ServerTests.test_loginWithoutPortal  s    
 "	* 	* 	* 	* 	* ^''e55@@QQ]]__R))}}T4555r6   c                F    d }| j         j        j        _         fd} j                            t          |                                         j                  } 	                                }t          j        ||g          }|                     j                  S )z
        The server responds with a C{BAD} response when its portal
        attempts to log a user in with checker that claims to support
        L{IAccount} but returns an an avatar interface that is not
        L{IAccount}.
        c                     ddd fS )NzNot IAccountzNot an accountc                     d S r0   r1   r1   r6   r4   r5   zVIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar.<locals>.<lambda>  s    d r6   r1   )r*  __s     r4   brokenRequestAvatarzDIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar  s    "$4llCCr6   c                 r    j                             dd          } |                     j                   d S rK  r]  rM  s    r4   rL  z6IMAP4ServerTests.test_nonIAccountAvatar.<locals>.login  s6    !!+/?@@AIId()))))r6   )r  r  r  requestAvatarr  r   r7   r+  r  r#   r   r,  r`  )rE   rm  rL  r-  rb  r   s   `     r4   test_nonIAccountAvatarz'IMAP4ServerTests.test_nonIAccountAvatar  s    	D 	D 	D 2E .	* 	* 	* 	* 	* ^''e55@@QQ]]__R))}}T4555r6   c                     G d dt                     fd}| j        _         fd} j                            t          |                    }|                     j        d           |j         fd            }|                     j                   |	                     j
                                                    }t          j        ||g          }|                     j                  S )z
        Any exception raised by L{IMAP4Server.authenticateLogin} that
        is not L{UnauthorizedLogin} is logged results in a C{BAD}
        response.
        c                      e Zd ZdZdS )AIMAP4ServerTests.test_loginException.<locals>.UnexpectedException2
            An unexpected exception.
            Nr  r1   r6   r4   UnexpectedExceptionrs               r6   ru  c                     d          )NWhoopsr1   )userpasswdru  s     r4   raisesUnexpectedExceptionzGIMAP4ServerTests.test_loginException.<locals>.raisesUnexpectedException  s    %%h///r6   c                 :     j                             dd          S rK  r  rL  rR   s   r4   rL  z3IMAP4ServerTests.test_loginException.<locals>.login      ;$$[2BCCCr6   s   Server error: Whoopsc                X                                                                  d S r0   rU  flushLoggedErrors)r*  ru  rE   s    r4   assertErrorLoggedz?IMAP4ServerTests.test_loginException.<locals>.assertErrorLogged  s*    OOD223FGGHHHHHr6   )r  r  authenticateLoginr  r   r7   r+  r  r  r^  r
  r#   r   r,  r`  )rE   r{  rL  r-  r  rb  r   ru  s   `      @r4   test_loginExceptionz$IMAP4ServerTests.test_loginException  s8   	 	 	 	 	) 	 	 	
	0 	0 	0 	0 	0 )B%	D 	D 	D 	D 	D ^''e55
d57NOOO		I 	I 	I 	I 	I 
	I 	do&&&


4%&&&]]__R))}}T4555r6   c                6    ddi j         j        _         fd} j                            t          |                                         j                  }t          j	         
                                |g          }|                     j                  S )N
   {test}user   {test}passwordc                     j                             dd          } |                     t          j        dt                    z              |                     j                   d S )Nr  r  r  )r  rL  r+  r%   r  r   r   r
  rM  s    r4   rL  z9IMAP4ServerTests.testLoginRequiringQuoting.<locals>.login"  sW    !!-1BCCALL/CII"=>>>MM$,-----r6   )r  r  usersr  r   r7   r+  r  r   r,  r#   _cbTestLoginRequiringQuotingrO  s   `   r4   testLoginRequiringQuotingz*IMAP4ServerTests.testLoginRequiringQuoting  s    %24E$F!	. 	. 	. 	. 	.
 ^''e55@@QQ" 566}}T>???r6   c                    |                      | j        j        t          j                   |                      | j        j        d           d S rR  rT  rW  s     r4   r  z-IMAP4ServerTests._cbTestLoginRequiringQuoting+  rY  r6   c                    d  _          fd} fd} j                            t          |                    }|                    t          |                     |                     j                                                    }t          j        ||g          }|j         fd            }|                     j	        ddggg g g           |S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z-IMAP4ServerTests.testNamespace.<locals>.login2  r~  r6   c                 f    fd} j                                                             |           S )Nc                @    | _                             d            d S r0   namespaceArgsr
  r  rE   s    r4   gotNamespacezGIMAP4ServerTests.testNamespace.<locals>.namespace.<locals>.gotNamespace6  %    %)"""4(((((r6   r  	namespacer   r  rE   s    r4   r  z1IMAP4ServerTests.testNamespace.<locals>.namespace5  @    ) ) ) ) ) ;((**66|DDDr6   c                p    j         D ]'}|D ]"}|D ]}                    |t                     #(j         S r0   )r  r  r   )rX  
namespacespairr  rE   s       r4   assertAllPairsNativeStringszCIMAP4ServerTests.testNamespace.<locals>.assertAllPairsNativeStringsB  sa    "0 : :
& : :D!% : :--eS9999:: %%r6   r)  rP  )
r  r  r   r7   r+  r  r#   r   r,  rB   )rE   rL  r  r-  rb  r   r  s   `      r4   testNamespacezIMAP4ServerTests.testNamespace/  s   !	D 	D 	D 	D 	D	E 	E 	E 	E 	E ^''e55
uY''(((
do&&&]]__R))	
	& 	& 	& 	& 
	& 	
d&2s)b"(=>>>r6   c                    t          d           j        _        d _         fd} fd} j                            t          |                    }|                    t          |                     |                     j                    	                                }t          j        ||g          }|                     fd           |                     j        g g g g           |S )z
        A mailbox that does not provide L{INamespacePresenter} returns
        empty L{list}s for its personal, shared, and user namespaces.
        r  Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z<IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.loginU  r~  r6   c                 f    fd} j                                                             |           S )Nc                @    | _                             d            d S r0   r  r  s    r4   r  zVIMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespace.<locals>.gotNamespaceY  r  r6   r  r  s    r4   r  z@IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespaceX  r  r6   c                    j         S r0   )r  r?  s    r4   r5   z?IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.<lambda>d  s
     2 r6   )r  r  r  r  r  r   r7   r+  r  r#   r   r,  rB   )rE   rL  r  r-  rb  r   s   `     r4   test_mailboxWithoutNamespacez-IMAP4ServerTests.test_mailboxWithoutNamespaceM  s   
 ":+!F!F!	D 	D 	D 	D 	D	E 	E 	E 	E 	E ^''e55
uY''(((
do&&&]]__R))	2222333	d&R555r6   c                    t           j                            d           d  _         fd} fd} j                            t          |                    }|                    t          |                     |                     j                    	                                }t          j        ||g                               j                  S )Ntest-mailboxc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests.testSelect.<locals>.loginl  r~  r6   c                 p    fd} j                             d          }|                    |            |S )Nc                @    | _                             d            d S r0   )selectedArgsr
  r  s    r4   selectedz=IMAP4ServerTests.testSelect.<locals>.select.<locals>.selectedp  %    $(!""4(((((r6   r  )r  r  r   )r  r   rE   s     r4   r  z+IMAP4ServerTests.testSelect.<locals>.selecto  sJ    ) ) ) ) ) "">22AMM(###Hr6   )r  r  
addMailboxr  r  r   r7   r+  r  r#   r   r,  _cbTestSelect)rE   rL  r  r-  rb  s   `    r4   
testSelectzIMAP4ServerTests.testSelecth  s    **>::: 	D 	D 	D 	D 	D	 	 	 	 	 ^''e55
uV}}%%%
do&&&]]__"B8,,889KLLLr6   c                     fd} fd} j                             t          |                      j                             t          |                      j                              j        d            j                              j                    j                              j                   t          j         j          	                                g          }|j         fd            }|S )zh
        A client that selects a mailbox that does not exist receives a
        C{NO} response.
        c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z9IMAP4ServerTests.test_selectWithoutMailbox.<locals>.login  r~  r6   c                 8     j                             d          S )Nr  r  r  rR   s   r4   r  z:IMAP4ServerTests.test_selectWithoutMailbox.<locals>.select      ;%%n555r6      No such mailboxc                F                         j        j                   d S r0   )assertIsNoner  r_  r?  s    r4   assertNoMailboxSelectedzKIMAP4ServerTests.test_selectWithoutMailbox.<locals>.assertNoMailboxSelected  s"    dk./////r6   )
r  r   r7   r+  r  r
  r  r   r,  r#   )rE   rL  r  connectionCompleter  s   `    r4   test_selectWithoutMailboxz*IMAP4ServerTests.test_selectWithoutMailbox~  s   	D 	D 	D 	D 	D	6 	6 	6 	6 	6 	""5<<000""5==111!!$"ACUVVV""4#5666!!$/222"0$.$--//1RSS		'	0 	0 	0 	0 
(	'	0 "!r6   c           	         t           j        j        d         }|                     | j        j        |           |                     | j        dddddd           d S )NTEST-MAILBOXr   r   rr  rb  TEXISTSrS  rU  r  
READ-WRITE)r  r  	mailboxesrB   r  r_  r  rE   rX  r_  s      r4   r  zIMAP4ServerTests._cbTestSelect  sn    &0@)4000!M" 		
 		
 		
 		
 		
r6   c                    t           j                            d           d _         fd} fd} j                            t          |                    }|                    t          |                     |                     j                    	                                }t          j        ||g          }|                     j                  S )a  
        L{IMAP4Client.examine} issues an I{EXAMINE} command to the server and
        returns a L{Deferred} which fires with a C{dict} with as many of the
        following keys as the server includes in its response: C{'FLAGS'},
        C{'EXISTS'}, C{'RECENT'}, C{'UNSEEN'}, C{'READ-WRITE'}, C{'READ-ONLY'},
        C{'UIDVALIDITY'}, and C{'PERMANENTFLAGS'}.

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

        See U{RFC 3501<http://www.faqs.org/rfcs/rfc3501.html>}, section 6.3.2,
        for details.
        r  Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z,IMAP4ServerTests.test_examine.<locals>.login  r~  r6   c                 p    fd} j                             d          }|                    |            |S )Nc                @    | _                             d            d S r0   )examinedArgsr
  r  s    r4   examinedz@IMAP4ServerTests.test_examine.<locals>.examine.<locals>.examined  r  r6   r  )r  examiner   )r  r   rE   s     r4   r  z.IMAP4ServerTests.test_examine.<locals>.examine  sJ    ) ) ) ) ) ##N33AMM(###Hr6   )r  r  r  r  r  r   r7   r+  r  r#   r   r,  _cbTestExamine)rE   rL  r  r-  rb  r   s   `     r4   test_examinezIMAP4ServerTests.test_examine  s     	**>::: 	D 	D 	D 	D 	D	 	 	 	 	 ^''e55
uW~~&&&
do&&&]]__R))}}T0111r6   c           	         t           j        j        d         }|                     | j        j        |           |                     | j        dddddd           d S )Nr  r   r   rr  rb  Fr  )r  r  r  rB   r  r_  r  r  s      r4   r  zIMAP4ServerTests._cbTestExamine  sn    &0@)4000!M# 		
 		
 		
 		
 		
r6   c                l   	 d	d fd fd fd} 	fd}g  _          j                            t          |                                        t          |                    }                                 }t          j        ||g          }|                     j        	          S )N)testboxtest/boxztest/test/box/boxINBOX)r  r  c                 <     j                             d           d S rt  r2   r|   rR   s   r4   cbz'IMAP4ServerTests.testCreate.<locals>.cb      Kq!!!!!r6   c                <    j                             d           d S Nr   r  r$   rE   s    r4   ebz'IMAP4ServerTests.testCreate.<locals>.eb  r  r6   c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests.testCreate.<locals>.login  r~  r6   c                     z   D ]Q} j                             |           }|                    t                                                             R|                    j        j                   d S r0   )r  creater   r7   r+  addCallbacksr
  r  )r  r   r  r  rY  rE   rZ  s     r4   r  z+IMAP4ServerTests.testCreate.<locals>.create  ss    $ 8 8K&&t,,eBii((33B7777NN4-t?????r6   )r2   r  r   r7   r#   r   r,  _cbTestCreate)
rE   rL  r  r-  rb  r   r  r  rY  rZ  s
   `     @@@@r4   
testCreatezIMAP4ServerTests.testCreate  s	   K&	" 	" 	" 	" 	"	" 	" 	" 	" 	"	D 	D 	D 	D 	D	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ ^''e55AA%--PP]]__R))}}T/$???r6   c                $   |                      | j        dgt          |          z  dgt          |          z  z              t          t          j        j                  }t          g d          }|                      |d |D                        d S )Nr   r   )inboxr  r  testr  c                6    g | ]}|                                 S r1   r-  )r,  as     r4   r  z2IMAP4ServerTests._cbTestCreate.<locals>.<listcomp>  s     ;;;a		;;;r6   )rB   r2   r   re  r  r  r  )rE   rX  rZ  rY  r_  ry  s         r4   r  zIMAP4ServerTests._cbTestCreate  s    qcCLL&8A3T?&JKKKl-788QQQRR;;7;;;<<<<<r6   c                    t           j                            d            fd} fd} j                            t          |                    }|                    t          |           j                   |                     j         j                    	                                }t          j        ||g          }|                     fd           |S )N	delete/mec                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests.testDelete.<locals>.login  r~  r6   c                 8     j                             d          S Nr  r  r  rR   s   r4   r  z+IMAP4ServerTests.testDelete.<locals>.delete      ;%%k222r6   c                h                         t          t          j        j                  g           S r0   )rB   r   r  r  r  r?  s    r4   r5   z-IMAP4ServerTests.testDelete.<locals>.<lambda>	  s&    d&&tL,C,M'N'NPRSS r6   r  r  r  r  r   r7   r  r  r
  r#   r   r,  )rE   rL  r  r-  rb  r   s   `     r4   
testDeletezIMAP4ServerTests.testDelete  s    **;777	D 	D 	D 	D 	D	3 	3 	3 	3 	3 ^''e55
ft777
*DO<<<]]__R))	SSSS	
 	
 	
 r6   c                "    t           j                            d           t           j                            d            fd} fd} fd} j                            t          |                    }|                    t          |           j                   |                    |           |                     j	                    
                                }t          j        ||g          }|                     fd           |S )z
        Attempting to delete a mailbox with hierarchically inferior
        names fails with an informative error.

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

        @return: A L{Deferred} with assertions.
        r  r  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  zGIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.login	  r~  r6   c                 8     j                             d          S Nr  r  rR   s   r4   r  zHIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.delete	      ;%%h///r6   c                     | j         t          j                                       t	          | j                  t	          d                     d S )Ns-   Name "DELETE" has inferior hierarchical names)r  r   r  rB   r   r  r  s    r4   assertIMAPExceptionzUIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.assertIMAPException	  sS    GL-...GM""DEE    r6   c                l                         t          t          j        j                  ddg          S )NDELETEz	DELETE/ME)rB   re  r  r  r  r?  s    r4   r5   zJIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.<lambda>,	  s/    d&&|.899Hk;R  r6   )r  r  r  r  r   r7   r  r  r+  r
  r#   r   r,  )rE   rL  r  r  loggedIn
loopedBackr   s   `      r4   'testDeleteWithInferiorHierarchicalNamesz8IMAP4ServerTests.testDeleteWithInferiorHierarchicalNames	  s=    	**8444**;777	D 	D 	D 	D 	D	0 	0 	0 	0 	0	 	 	 	 	 >--eEll;;eFmmT_===/000d0111]]__
: 677	   	
 	
 	

 r6   c                    d  _          fd} fd} fd} j                            t          |                    }|                    t          |           j                   |                    |           |                     j         j                                                    }t          j
        ||g          }|                     fd           |S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z6IMAP4ServerTests.testIllegalInboxDelete.<locals>.login5	  r~  r6   c                 8     j                             d          S )Nr  r  rR   s   r4   r  z7IMAP4ServerTests.testIllegalInboxDelete.<locals>.delete8	  s    ;%%g...r6   c                    | _         d S r0   stashedr2   rE   s    r4   stashz6IMAP4ServerTests.testIllegalInboxDelete.<locals>.stash;	  s    !DLLLr6   c                h                         t          j        t          j                            S r0   rU  r  r   r$   Failurer?  s    r4   r5   z9IMAP4ServerTests.testIllegalInboxDelete.<locals>.<lambda>E	  !    doojw&O&OPP r6   r   r  r   r7   r  r  r^  r
  r#   r   r,  )rE   rL  r  r  r-  rb  r   s   `      r4   testIllegalInboxDeletez'IMAP4ServerTests.testIllegalInboxDelete2	  s   	D 	D 	D 	D 	D	/ 	/ 	/ 	/ 	/	" 	" 	" 	" 	" ^''e55
ft777


5
*DO<<<]]__R))	PPPP	
 	
 	
 r6   c                     fd} fd} fd}d  _          j                            t          |                    }|                    t          |                                        |           |                     j         j                                                    }t          j
        ||g          }|                     fd           |S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z5IMAP4ServerTests.testNonExistentDelete.<locals>.loginJ	  r~  r6   c                 8     j                             d          S r  r  rR   s   r4   r  z6IMAP4ServerTests.testNonExistentDelete.<locals>.deleteM	  r  r6   c                    | _         d S r0   r$   r  s    r4   deleteFailedz<IMAP4ServerTests.testNonExistentDelete.<locals>.deleteFailedP	      "DLLLr6   c                x                         t          j        j                  t          d                    S )Nr  rB   r   r$   r  r?  s    r4   r5   z8IMAP4ServerTests.testNonExistentDelete.<locals>.<lambda>Z	  s-    d&&s4<+='>'>DV@W@WXX r6   )r$   r  r   r7   r+  r  r
  r  r#   r   r,  )rE   rL  r  r  r-  rb  r   s   `      r4   testNonExistentDeletez&IMAP4ServerTests.testNonExistentDeleteI	  s    	D 	D 	D 	D 	D	3 	3 	3 	3 	3	# 	# 	# 	# 	# ^''e55
uV}}%%00>>>
*DO<<<]]__R))	XXXX	
 	
 	
 r6   c                z    t                      }d|_        t          j                            d|           t          j                            d            fd} fd} fd}d  _         j                            t          |                    }|                    t          |                    	                    |           |
                     j         j                                                    }t          j        ||g          }t!          d          |                     fd           |S )	N)z	\Noselectr  r  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z1IMAP4ServerTests.testIllegalDelete.<locals>.logind	  r~  r6   c                 8     j                             d          S r  r  rR   s   r4   r  z2IMAP4ServerTests.testIllegalDelete.<locals>.deleteg	  r  r6   c                    | _         d S r0   r  r  s    r4   r  z8IMAP4ServerTests.testIllegalDelete.<locals>.deleteFailedj	  r  r6   s<   Hierarchically inferior mailboxes exist and \Noselect is setc                ^                         t          j        j                            S r0   r  )r*  rg  rE   s    r4   r5   z4IMAP4ServerTests.testIllegalDelete.<locals>.<lambda>v	  s$     0 0T\5G1H1H( S S r6   )rW  r  r  r  r  r$   r  r   r7   r+  r  r
  r  r#   r   r,  r   )	rE   r   rL  r  r  r-  rb  r   rg  s	   `       @r4   testIllegalDeletez"IMAP4ServerTests.testIllegalDelete^	  sP   OO!**8Q777**;777	D 	D 	D 	D 	D	0 	0 	0 	0 	0	# 	# 	# 	# 	# ^''e55
uV}}%%00>>>
*DO<<<]]__R))P
 
 	
SSSSSTTTr6   c                    t           j                            d            fd} fd} j                            t          |                    }|                    t          |           j                   |                     j         j                    	                                }t          j        ||g          }|                     fd           |S )Noldmboxc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests.testRename.<locals>.login|	  r~  r6   c                 :     j                             dd          S )Ns   oldmboxs   newnamer  renamerR   s   r4   r  z+IMAP4ServerTests.testRename.<locals>.rename	  s    ;%%j*===r6   c                                         t          t          j        j                                                  dg          S )NNEWNAME)rB   r   r  r  r  r^  r?  s    r4   r5   z-IMAP4ServerTests.testRename.<locals>.<lambda>	  s8    d&&\,6;;==>>  r6   r  rE   rL  r  r-  rb  r   s   `     r4   
testRenamezIMAP4ServerTests.testRenamey	  s    **9555	D 	D 	D 	D 	D	> 	> 	> 	> 	> ^''e55
ft777
*DO<<<]]__R))	   	
 	
 	

 r6   c                    d  _          fd} fd} fd} j                            t          |                    }|                    t          |           j                   |                    |           |                     j         j                                                    }t          j
        ||g          }|                     fd           |S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.login	  r~  r6   c                 :     j                             dd          S )Nr  frotzr  rR   s   r4   r  z7IMAP4ServerTests.testIllegalInboxRename.<locals>.rename	  s    ;%%gw777r6   c                    | _         d S r0   r  )stuffrE   s    r4   r  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.stash	  s     DLLLr6   c                h                         t          j        t          j                            S r0   r  r?  s    r4   r5   z9IMAP4ServerTests.testIllegalInboxRename.<locals>.<lambda>	  r  r6   r  )rE   rL  r  r  r-  rb  r   s   `      r4   testIllegalInboxRenamez'IMAP4ServerTests.testIllegalInboxRename	  s   	D 	D 	D 	D 	D	8 	8 	8 	8 	8	! 	! 	! 	! 	! ^''e55
ft777


5
*DO<<<]]__R))	PPPP	
 	
 	
 r6   c                    t           j                            d           t           j                            d            fd} fd} j                            t          |                    }|                    t          |           j                   |                     j         j                    	                                }t          j        ||g          }|                     j                  S )Nz
oldmbox/m1z
oldmbox/m2c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z6IMAP4ServerTests.testHierarchicalRename.<locals>.login	  r~  r6   c                 :     j                             dd          S )Nr  newnamer  rR   s   r4   r  z7IMAP4ServerTests.testHierarchicalRename.<locals>.rename	  s    ;%%i;;;r6   )r  r  r  r  r   r7   r  r  r
  r#   r   r,  _cbTestHierarchicalRenamer!  s   `     r4   testHierarchicalRenamez'IMAP4ServerTests.testHierarchicalRename	  s    &&|444&&|444	D 	D 	D 	D 	D	< 	< 	< 	< 	< ^''e55
ft777
*DO<<<]]__R))}}T;<<<r6   c                    t           j        j                                        }g d}t	          t          |                    }|                     |d |D                        d S )N)r.  z
newname/m1z
newname/m2c                6    g | ]}|                                 S r1   r  )r,  r{  s     r4   r  z>IMAP4ServerTests._cbTestHierarchicalRename.<locals>.<listcomp>	  s     !>!>!>!''))!>!>!>r6   )r  r  r  r^  r   re  rB   )rE   rX  mboxesrg  s       r4   r/  z*IMAP4ServerTests._cbTestHierarchicalRename	  sb    (27799:::fVnn%%!>!>X!>!>!>?????r6   c                ~     fd} fd} j                             t          |                    }|                    t          |           j                   |                     j         j                                                    }t          j        ||g          }|                     fd           |S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z-IMAP4ServerTests.testSubscribe.<locals>.login	  r~  r6   c                 8     j                             d          S Nz	this/mbox)r  	subscriberR   s   r4   r8  z1IMAP4ServerTests.testSubscribe.<locals>.subscribe	  s    ;((555r6   c                P                         t          j        j        dg          S )N	THIS/MBOXrB   r  r  subscriptionsr?  s    r4   r5   z0IMAP4ServerTests.testSubscribe.<locals>.<lambda>	  $    d&&'5}  r6   )	r  r   r7   r  r  r
  r#   r   r,  )rE   rL  r8  r-  rb  r   s   `     r4   testSubscribezIMAP4ServerTests.testSubscribe	  s    	D 	D 	D 	D 	D	6 	6 	6 	6 	6 ^''e55
i(($/:::
*DO<<<]]__R))	   	
 	
 	

 r6   c                    ddgt           j        _         fd} fd} j                            t          |                    }|                    t          |           j                   |                     j         j                    	                                }t          j        ||g          }|                     fd           |S )Nr:  	THAT/MBOXc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z/IMAP4ServerTests.testUnsubscribe.<locals>.login	  r~  r6   c                 8     j                             d          S r7  )r  unsubscriberR   s   r4   rC  z5IMAP4ServerTests.testUnsubscribe.<locals>.unsubscribe	  s    ;**;777r6   c                P                         t          j        j        dg          S )Nr@  r;  r?  s    r4   r5   z2IMAP4ServerTests.testUnsubscribe.<locals>.<lambda>	  r=  r6   )r  r  r<  r  r   r7   r  r  r
  r#   r   r,  )rE   rL  rC  r-  rb  r   s   `     r4   testUnsubscribez IMAP4ServerTests.testUnsubscribe	  s    1<k0J-	D 	D 	D 	D 	D	8 	8 	8 	8 	8 ^''e55
k**DO<<<
*DO<<<]]__R))	   	
 	
 	

 r6   c                t    t           j                            d           t           j                            d           t           j                            d            fd} fd}d  _         j                            t          |                    }|                    t          |           j                   |                    | j                   |                     j	         j                    
                                }t          j        ||g                               fd          S )Nroot/subthingzroot/another-thingznon-root/subthingc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests._listSetup.<locals>.login	  r~  r6   c                    | _         d S r0   listed)ry  rE   s    r4   rK  z+IMAP4ServerTests._listSetup.<locals>.listed	  s    !DKKKr6   c                    j         S r0   rJ  r?  s    r4   r5   z-IMAP4ServerTests._listSetup.<locals>.<lambda>	  s	    4; r6   )r  r  r  rK  r  r   r7   r  r  r
  r#   r   r,  )rE   r3   rL  rK  r-  rb  s   `     r4   
_listSetupzIMAP4ServerTests._listSetup	  s*   **?;;;**+?@@@**+>???	D 	D 	D 	D 	D	" 	" 	" 	" 	" ^''e55
a$/222
000
*DO<<<]]__"B8,,889N9N9N9NOOOr6   c                    |D ]F}|                      |d         t          d           |                      |d         t          d           G|S )z
        Assert a C{LIST} response's delimiter and mailbox are native
        strings.

        @param results: A list of tuples as returned by
            L{IMAP4Client.list} or L{IMAP4Client.lsub}.
        r   zdelimiter %r is not a strr   zmailbox %r is not a str)r  r   )rE   resultsr2   s      r4   'assertListDelimiterAndMailboxAreStringsz8IMAP4ServerTests.assertListDelimiterAndMailboxAreStrings	  sW      	M 	MF!!&)S2MNNN!!&)S2KLLLLr6   c                `      fd}                      |          }|j         fd            }|S )Nc                 :     j                             dd          S Nroot%)r  r   rR   s   r4   mailboxListz.IMAP4ServerTests.testList.<locals>.mailboxList
      ;##FC000r6   c                L   t          t          j                  ddft          t          j                  ddfg}t          d          D ]A}|                     d          \  }}}                    t          |          ||f|           B                    | d|            d S )NrP  ROOT/SUBTHINGzROOT/ANOTHER-THINGr   r   zMore results than expected: )re  rW  r  rn   popr  rS  )rK  expectedContentsr*  r  	delimitermailboxrE   s         r4   assertListContentsz5IMAP4ServerTests.testList.<locals>.assertListContents

  s     +,,c?C+,,c3GH 
 1XX  ,2JJqMM)y'E]]Iw7$   
 V%NF%N%NOOOOOr6   )rM  r   )rE   rV  r   r^  s   `   r4   testListzIMAP4ServerTests.testList
  s`    	1 	1 	1 	1 	1 OOK((	
	P 	P 	P 	P 
	P r6   c                     t           j                            d            fd}                     |          }|                     j                   |                     j        t          j        ddfg           |S )NrY  c                 :     j                             dd          S rS  )r  lsubrR   s   r4   rb  z'IMAP4ServerTests.testLSub.<locals>.lsub
  rW  r6   rP  )	r  r  r8  rM  r   rP  rB   rW  r  )rE   rb  r   s   `  r4   testLSubzIMAP4ServerTests.testLSub
  s    ))/:::	1 	1 	1 	1 	1 OOD!!	dBCCC	d&-*=sO)T(UVVVr6   c                
    t           j                            d            fd} fd} fd}d  _         j                            t          |                    }|                    t          |           j                   |                    | j                   |                     j	         j                    
                                }t          j        ||g          }|                     fd           |S )NrG  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests.testStatus.<locals>.login*
  r~  r6   c                 >     j                             dddd          S )NrG  rR  rT  rV  r  statusrR   s   r4   rh  z+IMAP4ServerTests.testStatus.<locals>.status-
  s    ;%%oz9hWWWr6   c                    | _         d S r0   statusedr  s    r4   rk  z-IMAP4ServerTests.testStatus.<locals>.statused0
      "DMMMr6   c                B                         j        dddd          S )Nr   s   10r   )rR  rT  rV  )rB   rk  r?  s    r4   r5   z-IMAP4ServerTests.testStatus.<locals>.<lambda>;
  s(    d&&A%1MM  r6   )r  r  r  rk  r  r   r7   r  r  r
  r#   r   r,  )rE   rL  rh  rk  r-  rb  r   s   `      r4   
testStatuszIMAP4ServerTests.testStatus'
  s0   **?;;;	D 	D 	D 	D 	D	X 	X 	X 	X 	X	# 	# 	# 	# 	# ^''e55
ft777
$/222
*DO<<<]]__R))	   	
 	
 	

 r6   c                     fd} fd} fd} fd}d x _          _         j                            t	          |                    }|                    t	          |           j                   |                    ||           |                     j         j                                                    }t          j
        ||g                               j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z0IMAP4ServerTests.testFailedStatus.<locals>.loginB
  r~  r6   c                 >     j                             dddd          S )Nzroot/nonexistentrR  rT  rV  rg  rR   s   r4   rh  z1IMAP4ServerTests.testFailedStatus.<locals>.statusE
  s&    ;%%"J	8  r6   c                    | _         d S r0   rj  r  s    r4   rk  z3IMAP4ServerTests.testFailedStatus.<locals>.statusedJ
  rl  r6   c                    | _         d S r0   r  r  s    r4   failedz1IMAP4ServerTests.testFailedStatus.<locals>.failedM
  r  r6   )rk  r$   r  r   r7   r  r  r
  r#   r   r,  _cbTestFailedStatus)rE   rL  rh  rk  rt  r-  rb  s   `      r4   testFailedStatusz!IMAP4ServerTests.testFailedStatusA
  s   	D 	D 	D 	D 	D	 	 	 	 	
	# 	# 	# 	# 	#	# 	# 	# 	# 	# (,+^''e55
ft777
&)))
*DO<<<]]__"B8,,889QRRRr6   c                    |                      | j        d            |                      | j        j        j        d           d S )N)s   Could not open mailbox)rB   rk  r$   r  r  rW  s     r4   ru  z$IMAP4ServerTests._cbTestFailedStatusX
  s?    ---+02NOOOOOr6   c                    t          j        t          d          t          j                            d            fd}t          j         fd            } j        	                    t          |                    }|                    t          |           j                   |                     j         j                                                    }t          j        ||g          }|	                     j                  S )Nrfc822.messagerG  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z.IMAP4ServerTests.testFullAppend.<locals>.login`
  r~  r6   c               3     K   t          d          5 } j                            d| dd          V }|cd d d            S # 1 swxY w Y   d S )NrbrG  )\SEEN\DELETEDz%Tue, 17 Jun 2003 11:22:16 -0600 (MDT))openr  r|   r  r2   infilerE   s     r4   r|   z/IMAP4ServerTests.testFullAppend.<locals>.appendc
  s      fd## w#{11#+;	                       s   !AA	A)r&   sibpath__file__r  r  r  r   inlineCallbacksr  r   r7   r  r  r
  r#   r,  _cbTestFullAppendrE   rL  r|   r-  rb  r   r  s   `     @r4   testFullAppendzIMAP4ServerTests.testFullAppend\
  s   h(899**?;;;	D 	D 	D 	D 	D 
		 	 	 	 	 
		 ^''e55
ft777
*DO<<<]]__R))}}T3V<<<r6   c                   t           j        j        d         }|                     dt	          |j                             |                     ddgddf|j        d         dd                     t          |d          5 }|                     |                                |j        d         d                                                    d d d            d S # 1 swxY w Y   d S )NrY  r   r}  r~  s%   Tue, 17 Jun 2003 11:22:16 -0600 (MDT)r   r|  	r  r  r  rB   r   r   r  rW   r]   rE   rX  r  mbr3   s        r4   r  z"IMAP4ServerTests._cbTestFullAppendw
  s(   $.?C,,---$&NPQRKN122	
 	
 	
 &$ 	E1QVVXXr{1~a'8'A'A'C'CDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   >ACCCc                    t          j        t          d          t          j                            d            fd}t          j         fd            } j        	                    t          |                    }|                    t          |           j                   |                     j         j                                                    }t          j        ||g          }|	                     j                  S )Nry  PARTIAL/SUBTHINGc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z1IMAP4ServerTests.testPartialAppend.<locals>.login
  r~  r6   c               3  4  K   t          d          5 } j                            t          j        dt          dt          j                                      fz            dj        j	        |                     V }|cd d d            S # 1 swxY w Y   d S )Nr|  s   APPENDz)PARTIAL/SUBTHING (\SEEN) "Right now" {%d}r1   )
r  r  sendCommandr   r7  r)   ospathgetsize_IMAP4Client__cbContinueAppendr  s     r4   r|   z2IMAP4ServerTests.testPartialAppend.<locals>.append
  s      fd## w#{66M!
 &#&(goof&=&=%?@ 
 B      " %                 s   A,BBB)r&   r  r  r  r  r  r   r  r  r   r7   r  r  r
  r#   r,  _cbTestPartialAppendr  s   `     @r4   testPartialAppendz"IMAP4ServerTests.testPartialAppend
  s   h(899**+=>>>	D 	D 	D 	D 	D 
		 	 	 	 	 
		* ^''e55
ft777
*DO<<<]]__R))}}T6???r6   c                   t           j        j        d         }|                     dt	          |j                             |                     dgddf|j        d         dd                     t          |d          5 }|                     |                                |j        d         d                                                    d d d            d S # 1 swxY w Y   d S )Nr  r   r}  s	   Right nowr   r|  r  r  s        r4   r  z%IMAP4ServerTests._cbTestPartialAppend
  s   $./ABC,,---8*lA6Aqrr8JKKK&$ 	E1QVVXXr{1~a'8'A'A'C'CDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   =ACCCc                    t           j                            d            fd} fd} fd} j                            t          |                    }|                    t          |           j                   |                    t          |           j                   |                     j         j                    	                                S )N   root/subthingc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z*IMAP4ServerTests._testCheck.<locals>.login
  r~  r6   c                 8     j                             d          S )Nr  r  rR   s   r4   r  z+IMAP4ServerTests._testCheck.<locals>.select
  s    ;%%&6777r6   c                 6     j                                         S r0   )r  r  rR   s   r4   r  z*IMAP4ServerTests._testCheck.<locals>.check
      ;$$&&&r6   )
r  r  r  r  r   r7   r  r  r
  r#   )rE   rL  r  r  r   s   `    r4   
_testCheckzIMAP4ServerTests._testCheck
  s    **+;<<<	D 	D 	D 	D 	D	8 	8 	8 	8 	8	' 	' 	' 	' 	' N&&uU||44	uV}}do666	uU||T_555	t)4?;;;}}r6   c                *    |                                  S )zf
        Trigger the L{imap.IMAP4Server._cbSelectWork} callback
        by selecting an mbox.
        )r  rR   s    r4   
test_checkzIMAP4ServerTests.test_check
  s    
    r6   c                     dd} fd}                      t          d|                                            }|                    |          S )zr
        Trigger the L{imap.IMAP4Server._ebSelectWork} errback
        by failing when we select an mbox.
        r   c                *    t          j        d          )Nencoding)r   IllegalMailboxEncoding)rE   r  r|  s      r4   
failSelectz3IMAP4ServerTests.test_checkFail.<locals>.failSelect
  s    .z:::r6   c                                                     }                    |d         j        j        d         d           d S )Nr   r   s   SELECT failed: Server error)r  rB   r  r  )r	  failuresrE   s     r4   checkResponsez6IMAP4ServerTests.test_checkFail.<locals>.checkResponse
  s@    --//HXa[.3A68VWWWWWr6   r  r  )patchr  r  r   )rE   r  r  r   s   `   r4   test_checkFailzIMAP4ServerTests.test_checkFail
  sn    	; 	; 	; 	;	X 	X 	X 	X 	X 	

7Hj111OO}}]+++r6   c                D    t                      }g d|_        t          j                            d|            fd} fd} fd} j                            t          |                    }|                    t          |           j	                   |                    t          |           j	                   |                     j
         j	                                                    }t          j        ||g                               j        |          S )N)s	   Message 1)r  AnotherFlagNr   s	   Message 2)r  Nr   )s	   Message 3)r  Nr   r]  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z)IMAP4ServerTests.testClose.<locals>.login
  r~  r6   c                 8     j                             d          S )Ns   mailboxr  rR   s   r4   r  z*IMAP4ServerTests.testClose.<locals>.select
      ;%%j111r6   c                 6     j                                         S r0   )r  r  rR   s   r4   r  z)IMAP4ServerTests.testClose.<locals>.close
  r  r6   )rW  r   r  r  r  r  r   r7   r  r  r
  r#   r   r,  _cbTestClose)rE   r   rL  r  r  r   rb  s   `      r4   	testClosezIMAP4ServerTests.testClose
  s-   OO
 
 


 	**9a888	D 	D 	D 	D 	D	2 	2 	2 	2 	2	' 	' 	' 	' 	' N&&uU||44	uV}}do666	uU||T_555	t)4?;;;]]__"Ar7++778I1MMMr6   c                    |                      t          |j                  d           |                      |j        d         d           |                     |j                   d S )Nr   r   r  )rB   r   r   rU  r  rE   rX  r   s      r4   r  zIMAP4ServerTests._cbTestClose
  sW    QZ!,,,A(QRRR!!!!!r6   c                    t                      }g d|_        t          j                            d|            fd} fd} fd} fd}d  _         j                            t          |                    }|	                    t          |           j
                   |	                    t          |           j
                   |	                    | j
                   |	                     j         j
                                                    }t          j        ||g          }|                     j        |          S )Nr  r]  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z+IMAP4ServerTests.testExpunge.<locals>.login
  r~  r6   c                 8     j                             d          S )Nr]  r  rR   s   r4   r  z,IMAP4ServerTests.testExpunge.<locals>.select   s    ;%%i000r6   c                 6     j                                         S r0   )r  r  rR   s   r4   r  z-IMAP4ServerTests.testExpunge.<locals>.expunge  s    ;&&(((r6   c                X                         j        j        d u            | _        d S r0   )rS  r  r_  rO  )rO  rE   s    r4   expungedz.IMAP4ServerTests.testExpunge.<locals>.expunged  s,    T[-5666"DLLLr6   )rW  r   r  r  r  rO  r  r   r7   r  r  r
  r#   r   r,  _cbTestExpunge)	rE   r   rL  r  r  r  r-  rb  r   s	   `        r4   testExpungezIMAP4ServerTests.testExpunge
  sf   OO
 
 


 	**9a888	D 	D 	D 	D 	D	1 	1 	1 	1 	1	) 	) 	) 	) 	)	# 	# 	# 	# 	# ^''e55
ft777
g888
$/222
*DO<<<]]__R))}}T0!444r6   c                    |                      t          |j                  d           |                      |j        d         d           |                      | j        ddg           d S )Nr   r   r  r   )rB   r   r   rO  r  s      r4   r  zIMAP4ServerTests._cbTestExpunge  s_    QZ!,,,A(QRRR1v.....r6   N)6rs   rt   ru   r.  r7  r@  rH  rP  rN  rc  r`  rh  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r*  r0  r/  r>  rE  rM  rP  r_  rc  rn  rv  ru  r  r  r  r  r  r  r  r  r  r  r  r1   r6   r4   r  r  y  sC       I I IG G G.L L LM M M0 0 04 4 46 6 66 6 66 6 6 6 6 6,!6 !6 !6F
@ 
@ 
@4 4 4  <  6M M M," " "4
 
 
#2 #2 #2J
 
 
@ @ @2= = =  &% % %N  .  *  6  *  .= = ="@ @ @  &  *P P P&    0	 	 	  4S S S.P P P= = =6E E E"@ "@ "@HE E E  $! ! !, , ,"N N N2" " "
5 5 5@/ / / / /r6   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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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)S )*IMAP4ServerParsingTestsz6
    Test L{imap4.IMAP4Server}'s command parsing.
    c                    t                      | _        t          j                    | _        | j                            | j                   | j                                         d S r0   )r   r  r   r  r  makeConnectionclearrR   s    r4   r  zIMAP4ServerParsingTests.setUp   sQ    (**'))""4>222r6   c                    | j                             t          j        t	          j                                         d S r0   r  connectionLostr$   r  r   ConnectionDonerR   s    r4   r  z IMAP4ServerParsingTests.tearDown&  1    ""7?53G3I3I#J#JKKKKKr6   c                     G d dt                     fd}d| j        _        || j        _        | j                            d           |                     |                                          dS )zO
        L{imap4.IMAP4Server} logs exceptions raised by parse methods.
        c                      e Zd ZdZdS )SIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.UnhandledException1
            An unhandled exception.
            Nr  r1   r6   r4   UnhandledExceptionr  .  rv  r6   r  c                    r0   r1   )r  r  s    r4   raisesValueErrorzQIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.raisesValueError3  s	    $$r6   command   invalidN)r  r  
parseStateparse_commandr  rU  r  )rE   r  r  s     @r4   test_parseMethodExceptionLoggedz7IMAP4ServerParsingTests.test_parseMethodExceptionLogged)  s    
	 	 	 	 	 	 	 	
	% 	% 	% 	% 	% "+$4!  ,,,../ABBCCCCCr6   c                   | j                             d           |                     | j                                        d           | j                             t          j        t          j	        d                               dS )z
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        a line that includes a tag but no command.
           001s   001 BAD Missing command
DoneN)
r  r  rB   r  r  r  r$   r  r   r  rR   s    r4   test_missingCommandz+IMAP4ServerParsingTests.test_missingCommand=  s{    
 	!!&)))--//1OPPP""OE08899	
 	
 	
 	
 	
r6   c                    | j                             d           |                     | j                                        d           dS )zf
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        an empty line.
        r6   s   * BAD Null command
N)r  r  rB   r  r  rR   s    r4   test_emptyLinez&IMAP4ServerParsingTests.test_emptyLineJ  sE    
 	!!#&&&--//1JKKKKKr6   c                   fd}|| j         _        | j                             d                    |dg                     |                     | j                                        d                    ||g                     dS )aV  
        Assert that the given exception results in the expected
        response.

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

        @param tag: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                    r0   r1   )tagcmdrest	exceptions      r4   raiseszDIMAP4ServerParsingTests.assertParseExceptionResponse.<locals>.raisesc      Or6   r  r  N)r  dispatchCommandr  r   rB   r  r  rE   r  r  expectedResponser  s    `   r4   assertParseExceptionResponsez4IMAP4ServerParsingTests.assertParseExceptionResponseS  s     	 	 	 	 	 '-#!!$))S*,=">">???--//CAQ;R1S1STTTTTr6   c                X    |                      t          j        d          dd           dS )zt
        When a parsing method raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        client responser  %   BAD Illegal syntax: client response
N)r  r   IllegalClientResponserR   s    r4   'test_parsingRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_parsingRaisesIllegalClientResponsel  s;    
 	))'(9::6	
 	
 	
 	
 	
r6   c                X    |                      t          j        d          dd           dS )zn
        When a parsing method raises L{IllegalOperation}, the server
        sends a C{NO} response.
        	operationr  !   NO Illegal operation: operation
N)r  r   IllegalOperationrR   s    r4   *test_parsingRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_parsingRaisesIllegalOperationResponsew  s:    
 	))";//2	
 	
 	
 	
 	
r6   c                X    |                      t          j        d          dd           dS )zt
        When a parsing method raises L{IllegalMailboxEncoding}, the
        server sends a C{NO} response.
        r  r  #   NO Illegal mailbox name: encoding
N)r  r   r  rR   s    r4   (test_parsingRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_parsingRaisesIllegalMailboxEncoding  s:    
 	))(444	
 	
 	
 	
 	
r6   c                    | j                             d           |                     | j                                        d           dS )zi
        L{imap4.IMAP4Server} responds to an unsupported command with a
        C{BAD} response.
        s   001 HULLABALOOs   001 BAD Unsupported command
N)r  r  rB   r  r  rR   s    r4   test_unsupportedCommandz/IMAP4ServerParsingTests.test_unsupportedCommand  sF    
 	  !2333--//1STTTTTr6   c                    | j                             d           |                     | j                                        dt          d                              d          z   dz              dS )z~
        L{imap4.IMAP4Server} responds with a C{BAD} response to a
        command with more arguments than expected.
        s   001 LOGIN A B Cs8   001 BAD Illegal syntax: Too many arguments for command:    Czutf-8r  N)r  r  rB   r  r  r   rC   rR   s    r4   test_tooManyArgumentsForCommandz7IMAP4ServerParsingTests.test_tooManyArgumentsForCommand  sy    
 	  !3444N  ""7t**##G,,- 	
 	
 	
 	
 	
r6   c                R   fd}|                      | j        j        d           |f| j        j        dd         z   | j        _        | j                            |dd           |                      | j                                        d                    ||g                     dS )aR  
        Assert that the given exception results in the expected
        response.

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

        @param: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                    r0   r1   )serverInstancer  ry  rz  r  s       r4   r  zFIMAP4ServerParsingTests.assertCommandExceptionResponse.<locals>.raises  r  r6   re  r   N   LOGINs   user passwdr  )rB   r  rV  unauth_LOGINr  r  r  r   r  s    `   r4   assertCommandExceptionResponsez6IMAP4ServerParsingTests.assertCommandExceptionResponse  s     	 	 	 	 	 	*H555$*9t{/G/K#K ##C>BBB--//CAQ;R1S1STTTTTr6   c                X    |                      t          j        d          dd           dS )zm
        When a command raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        r  r  r  N)r  r   r  rR   s    r4   'test_commandRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_commandRaisesIllegalClientResponse  s;    
 	++'(9::6	
 	
 	
 	
 	
r6   c                X    |                      t          j        d          dd           dS )zg
        When a command raises L{IllegalOperation}, the server sends a
        C{NO} response.
        r  r  r  N)r  r   r  rR   s    r4   *test_commandRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_commandRaisesIllegalOperationResponse  s:    
 	++";//2	
 	
 	
 	
 	
r6   c                X    |                      t          j        d          dd           dS )zm
        When a command raises L{IllegalMailboxEncoding}, the server
        sends a C{NO} response.
        r  r  r  N)r  r   r  rR   s    r4   (test_commandRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_commandRaisesIllegalMailboxEncoding  s:    
 	++(444	
 	
 	
 	
 	
r6   c                     G d dt                     }|                      |d          dd           |                     |                     |                     dS )z
        Wehn a command raises an unhandled exception, the server sends
        a C{BAD} response and logs the exception.
        c                      e Zd ZdZdS )XIMAP4ServerParsingTests.test_commandRaisesUnhandledException.<locals>.UnhandledExceptionr  Nr  r1   r6   r4   r  r    rv  r6   r  	unhandledr  s   BAD Server error: unhandled
N)r  r  rU  r  )rE   r  s     r4   $test_commandRaisesUnhandledExceptionz<IMAP4ServerParsingTests.test_commandRaisesUnhandledException  s    	 	 	 	 	 	 	 	
 	++{++.	
 	
 	
 	../ABBCCCCCr6   c                    d| j         _        | j                             d           |                     | j                                        d           dS )zx
        A string literal whose length exceeds the maximum allowed
        length results in a C{BAD} response.
        r   s   001 LOGIN {5}
sE   001 BAD Illegal syntax: Literal too long! I accept at most 4 octets
N)r  _literalStringLimitr  rB   r  r  rR   s    r4   test_stringLiteralTooLongz1IMAP4ServerParsingTests.test_stringLiteralTooLong  s]    
 +,'  !5666N  "".	
 	
 	
 	
 	
r6   c                f    dD ]-}|                      t          j        | j        j        |           .dS )zQ
        An empty string argument raises L{imap4.IllegalClientResponse}.
        )r6   r  r  Nr   r   r  r  arg_astring)rE   r  s     r4   test_arg_astringEmptyLinez1IMAP4ServerParsingTests.test_arg_astringEmptyLine  sI     * 	 	E+T[-De   	 	r6   c                \    |                      t          j        | j        j        d           dS )zh
        An unmatched quote in a string argument raises
        L{imap4.IllegalClientResponse}.
        s   "openNr  rR   s    r4   test_arg_astringUnmatchedQuotesz7IMAP4ServerParsingTests.test_arg_astringUnmatchedQuotes  s5    
 	')@(	
 	
 	
 	
 	
r6   c                \    |                      t          j        | j        j        d           dS )zn
        An unmatched brace in a string literal's size raises
        L{imap4.IllegalClientResponse}.
        s   {0Nr  rR   s    r4   &test_arg_astringUnmatchedLiteralBracesz>IMAP4ServerParsingTests.test_arg_astringUnmatchedLiteralBraces  s+    
 	%5t{7NPUVVVVVr6   c                \    |                      t          j        | j        j        d           dS )zc
        A non-integral string literal size raises
        L{imap4.IllegalClientResponse}.
           {[object Object]}Nr  rR   s    r4   "test_arg_astringInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_astringInvalidLiteralSize  6    
 	')@BV	
 	
 	
 	
 	
r6   c                \    |                      t          j        | j        j        d           dS )z@
        An empty atom raises L{IllegalClientResponse}.
        r6   Nr   r   r  r  arg_atomrR   s    r4   test_arg_atomEmptyLinez.IMAP4ServerParsingTests.test_arg_atomEmptyLine$  s*     	%5t{7KSQQQQQr6   c                \    |                      t          j        | j        j        d           dS )zC
        A malformed atom raises L{IllegalClientResponse}.
        s    not an atom Nr  rR   s    r4   test_arg_atomMalformedAtomz2IMAP4ServerParsingTests.test_arg_atomMalformedAtom*  s6     	')=?O	
 	
 	
 	
 	
r6   c                \    |                      t          j        | j        j        d           dS )zN
        An empty parenthesized list raises L{IllegalClientResponse}.
        r6   Nr   r   r  r  	arg_plistrR   s    r4   test_arg_plistEmptyLinez/IMAP4ServerParsingTests.test_arg_plistEmptyLine2  s*     	%5t{7LcRRRRRr6   c                    |                      t          j        | j        j        d           |                      t          j        | j        j        d           dS )ze
        A parenthesized with unmatched parentheses raises
        L{IllegalClientResponse}.
        s   (foos   foo)Nr!  rR   s    r4   "test_arg_plistUnmatchedParenthesesz:IMAP4ServerParsingTests.test_arg_plistUnmatchedParentheses8  sJ    
 	%5t{7LgVVV%5t{7LgVVVVVr6   c                \    |                      t          j        | j        j        d           dS )zH
        An empty file literal raises L{IllegalClientResponse}.
        r6   Nr   r   r  r  arg_literalrR   s    r4   test_arg_literalEmptyLinez1IMAP4ServerParsingTests.test_arg_literalEmptyLine@  s+     	%5t{7NPSTTTTTr6   c                    |                      t          j        | j        j        d           |                      t          j        | j        j        d           dS )zZ
        A literal with unmatched braces raises
        L{IllegalClientResponse}.
        s   {10s   10}Nr'  rR   s    r4   test_arg_literalUnmatchedBracesz7IMAP4ServerParsingTests.test_arg_literalUnmatchedBracesF  sL    
 	%5t{7NPVWWW%5t{7NPVWWWWWr6   c                \    |                      t          j        | j        j        d           dS )z\
        A non-integral literal size raises
        L{imap4.IllegalClientResponse}.
        r  Nr'  rR   s    r4   "test_arg_literalInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_literalInvalidLiteralSizeN  r  r6   c                p    d}| j                             |          \  }}|                     |d           dS )zH
        A sequence set returns the unparsed portion of a line.
        s   1:* blah blah blahs   blah blah blahN)r  
arg_seqsetrB   )rE   sequencer*  r  s       r4   test_arg_seqsetReturnsRestz2IMAP4ServerParsingTests.test_arg_seqsetReturnsRestW  s?     )+((224011111r6   c                \    |                      t          j        | j        j        d           dS )zL
        An invalid sequence raises L{imap4.IllegalClientResponse}.
        s   x:yN)r   r   r  r  r/  rR   s    r4   test_arg_seqsetInvalidSequencez6IMAP4ServerParsingTests.test_arg_seqsetInvalidSequence_  s*     	%5t{7MvVVVVVr6   c                    d}| j                             |          \  }}|                     ||g           |                     |           dS )zJ
        A single flag that is not contained in a list is parsed.
        s   flagN)r  arg_flaglistrB   rS  )rE   flagr  r  s       r4   test_arg_flaglistOneFlagz0IMAP4ServerParsingTests.test_arg_flaglistOneFlage  sT     {//55$(((r6   c                \    |                      t          j        | j        j        d           dS )zk
        A list of flags with unmatched parentheses raises
        L{imap4.IllegalClientResponse}.
        s   (invalidNr   r   r  r  r5  rR   s    r4   &test_arg_flaglistMismatchedParentehsesz>IMAP4ServerParsingTests.test_arg_flaglistMismatchedParentehsesn  s7    
 	'K$	
 	
 	
 	
 	
r6   c                    |                      t          j        | j        j        d           |                      t          j        | j        j        d           dS )zo
        A list of flags that contains a malformed flag raises
        L{imap4.IllegalClientResponse}.
        s	   (first  )s   (first  second)Nr9  rR   s    r4   test_arg_flaglistMalformedFlagz6IMAP4ServerParsingTests.test_arg_flaglistMalformedFlagy  s_    
 	')A?	
 	
 	
 	')ACX	
 	
 	
 	
 	
r6   c                    d}| j                             |          \  }}|                     |           |                     ||           dS )z
        A line that does not begin with an open parenthesis (C{(}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not (N)r  	opt_plistr  rB   )rE   r  plist	remainders       r4   $test_opt_plistMissingOpenParenthesisz<IMAP4ServerParsingTests.test_opt_plistMissingOpenParenthesis  sS    
 ;0066y%   D)))))r6   c                    d}| j                             |          \  }}|                     |           |                     ||           dS )z
        A line that does not begin with a double quote (C{"}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not "N)r  opt_datetimer  rB   )rE   r  dtr@  s       r4   !test_opt_datetimeMissingOpenQuotez9IMAP4ServerParsingTests.test_opt_datetimeMissingOpenQuote  sR    
 0066I"D)))))r6   c                `    d}|                      t          j        | j        j        |           dS )zx
        A line that does not have a closing double quote (C{"}) raises
        L{imap4.IllegalClientResponse}.
        s   "21-Jul-2017 19:37:07 -0700N)r   r   r  r  rC  r  s     r4   "test_opt_datetimeMissingCloseQuotez:IMAP4ServerParsingTests.test_opt_datetimeMissingCloseQuote  s0    
 .%5t{7OQUVVVVVr6   c                `    d}|                      t          j        | j        j        |           dS )z
        A line that contains C{CHARSET} but no character set
        identifier raises L{imap4.IllegalClientResponse}.
        r  N)r   r   r  r  opt_charsetr  s     r4   !test_opt_charsetMissingIdentifierz9IMAP4ServerParsingTests.test_opt_charsetMissingIdentifier  s0    
 %5t{7NPTUUUUUr6   c                    d}| j                             |          \  }}|                     |d           |                     |d           dS )z
        A line that ends with a C{CHARSET} identifier is parsed as
        that identifier, and the remainder is the empty string.
        s   CHARSET UTF-8   UTF-8r6   Nr  rI  rB   rE   r  
identifierr@  s       r4   test_opt_charsetEndOfLinez1IMAP4ServerParsingTests.test_opt_charsetEndOfLine  sU    
   $ 7 7 = =
IX...C(((((r6   c                    d}| j                             |          \  }}|                     |d           |                     |d           dS )z
        A line that has additional data after a C{CHARSET} identifier
        is parsed as that identifier, and the remainder is that
        additional data.
        s   CHARSET UTF-8 remainderrL  s	   remainderNrM  rN  s       r4   test_opt_charsetWithRemainderz5IMAP4ServerParsingTests.test_opt_charsetWithRemainder  sU     * $ 7 7 = =
IX...L11111r6   N)+rs   rt   ru   r2  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r#  r%  r)  r+  r-  r1  r3  r7  r:  r<  rA  rE  rG  rJ  rP  rR  r1   r6   r4   r  r    s          L L LD D D(
 
 
L L LU U U2	
 	
 	
	
 	
 	
	
 	
 	
U U U
 
 
 U U U6	
 	
 	
	
 	
 	
	
 	
 	
D D D&
 
 
  
 
 
W W W
 
 
R R R
 
 
S S SW W WU U UX X X
 
 
2 2 2W W W  	
 	
 	


 

 

* * ** * *W W WV V V) ) )	2 	2 	2 	2 	2r6   r  c                  Z    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d Zd ZdS )IMAP4ServerSearchTestszS
    Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.
    c                    t                               |            dg| _        dg| _        dg| _        d| _        t          ddig ddd	d           | _        d S )
Nz10-Dec-2009z13-Dec-2009z16-Dec-2009r   r  zMon, 13 Dec 2009 21:25:10 GMTz13 Dec 2009 00:00:00 GMTr)    )r  r  earlierQuerysameDateQuery
laterQueryseqr   r   rR   s    r4   r  zIMAP4ServerSearchTests.setUp  sg    t$$$*O+_(/45&
 
r6   c                    |                      | j                            | j        | j        | j                             |                     | j                            | j        | j        | j                             dS )z
        L{imap4.IMAP4Server.search_SENTBEFORE} returns True if the message date
        is earlier than the query date.
        N)rS  r  search_SENTBEFORErW  rZ  r   rU  rY  rR   s    r4   test_searchSentBeforez,IMAP4ServerSearchTests.test_searchSentBefore  sy    
 	K))$*;TXtxPP	
 	
 	
 	K))$/48TXNN	
 	
 	
 	
 	
r6   c                h   |                      | j                            dg| j        | j        d                     |                     | j                            dg| j        | j        d                     |                     | j                            dg| j        | j        d                     dS )zq
        L{imap4.IMAP4Server.search_UID} returns True if the message UID is in
        the search range.
        r   )r   rV  s   2:*r   N)rS  r  
search_UIDrZ  r   rU  rR   s    r4   test_searchWildcardz*IMAP4ServerSearchTests.test_searchWildcard  s    
 	K""F8TXtxKK	
 	
 	
 	..x48YWWXXX..vtx9UUVVVVVr6   c                |    |                      | j                            dg| j        | j        d                     dS )z
        L{imap4.IMAP4Server.search_UID} should return True if there is a
        wildcard, because a wildcard means "highest UID in the mailbox".
        s   1235:*)rV  r   N)rU  r  r_  rZ  r   rR   s    r4   test_searchWildcardHighz.IMAP4ServerSearchTests.test_searchWildcardHigh  sC    
 	K""I;$(INN	
 	
 	
 	
 	
r6   c                x    t          j        d          }|                     t          |          g d           dS )|
        L{imap4.IMAP4Server.search_SENTON} returns True if the message date is
        the same as the query date.
        r?  r$  N)r   r   rB   r   )rE   msgsets     r4   test_reversedSearchTermsz/IMAP4ServerSearchTests.test_reversedSearchTerms  s:    
 "6**fyyy11111r6   c                z   |                      | j                            | j        | j        | j                             |                     | j                            | j        | j        | j                             |                      | j                            | j        | j        | j                             dS )rd  N)	rS  r  search_SENTONrW  rZ  r   rU  rX  rY  rR   s    r4   test_searchSentOnz(IMAP4ServerSearchTests.test_searchSentOn  s    
 	K%%d&748LL	
 	
 	
 	K%%d&8$(DHMM	
 	
 	
 	224?DHdhWWXXXXXr6   c                    |                      | j                            | j        | j        | j                             |                     | j                            | j        | j        | j                             dS )z~
        L{imap4.IMAP4Server.search_SENTSINCE} returns True if the message date
        is later than the query date.
        N)rU  r  search_SENTSINCErW  rZ  r   rS  rY  rR   s    r4   test_searchSentSincez+IMAP4ServerSearchTests.test_searchSentSince	  sy    
 	K(():DHdhOO	
 	
 	
 	K(($(DHMM	
 	
 	
 	
 	
r6   c                   |                      | j                            dg| j        z   dgz   | j        z   | j        | j        d                     |                      | j                            dg| j        z   dgz   | j        z   | j        | j        d                     |                     | j                            dg| j        z   dgz   | j        z   | j        | j        d                     dS )z
        L{imap4.IMAP4Server.search_OR} returns true if either of the two
        expressions supplied to it returns true and returns false if neither
        does.
        	SENTSINCEr  SENTONN)rU  r  	search_ORrW  rY  rZ  r   rS  rR   s    r4   test_searchOrz$IMAP4ServerSearchTests.test_searchOr  s    	K!! 11[MADOS	 	
 	
 	
 	K!!/;-?$BSS	 	
 	
 	
 	K!!
T_,}<tN	 	
 	
 	
 	
 	
r6   c                   |                      | j                            dg| j        z   | j        | j        d                     |                     | j                            dg| j        z   | j        | j        d                     dS )z~
        L{imap4.IMAP4Server.search_NOT} returns the negation of the result
        of the expression supplied to it.
        rn  r  ro  N)rS  r  
search_NOTrW  rZ  r   rU  rY  rR   s    r4   test_searchNotz%IMAP4ServerSearchTests.test_searchNot4  s    
 	K"" 1148TX| 	
 	
 	

 	K""
T_,dh, 	
 	
 	
 	
 	
r6   c                z   |                      | j                            | j        | j        | j                             |                      | j                            | j        | j        | j                             |                     | j                            | j        | j        | j                             dS )z
        L{imap4.IMAP4Server.search_BEFORE} returns True if the
        internal message date is before the query date.
        N)	rS  r  search_BEFORErW  rZ  r   rX  rU  rY  rR   s    r4   test_searchBeforez(IMAP4ServerSearchTests.test_searchBeforeD  s    
 	K%%d&748LL	
 	
 	
 	K%%d&8$(DHMM	
 	
 	
 	11$/48TXVVWWWWWr6   c                z   |                      | j                            | j        | j        | j                             |                      | j                            | j        | j        | j                             |                      | j                            | j        | j        | j                             dS )z
        L{imap4.IMAP4Server.search_ON} returns True if the
        internal message date is the same as the query date.
        N)rS  r  	search_ONrW  rZ  r   rX  rY  rR   s    r4   test_searchOnz$IMAP4ServerSearchTests.test_searchOnQ  s    
 	..t/@$(DHUUVVV..t/A48TXVVWWW..t$(SSTTTTTr6   c                z   |                      | j                            | j        | j        | j                             |                      | j                            | j        | j        | j                             |                     | j                            | j        | j        | j                             dS )z
        L{imap4.IMAP4Server.search_SINCE} returns True if the
        internal message date is greater than the query date.
        N)	rU  r  search_SINCErW  rZ  r   rX  rS  rY  rR   s    r4   test_searchSincez'IMAP4ServerSearchTests.test_searchSinceZ  s    
 	001BDHdhWWXXXK$$T%748LL	
 	
 	
 	11$/48TXVVWWWWWr6   N)rs   rt   ru   r2  r  r]  r`  rb  rf  ri  rl  rq  rt  rw  rz  r}  r1   r6   r4   rT  rT    s         
 
 


 

 


W 
W 
W
 
 
2 2 2Y Y Y

 

 


 
 
>
 
 
 X X XU U U	X 	X 	X 	X 	Xr6   rT  c                  $    e Zd ZdZdZddZd ZdS )r  z
    A L{IRealm} for tests.

    @cvar theAccount: An C{Account} instance.  Tests can set this to
        ensure predictable account retrieval.
    Nc                :     rfd _         dS  fd _         dS )ab  
        Create a realm for testing.

        @param accountHolder: (optional) An object whose C{theAccount}
            attribute will be returned instead of
            L{TestRealm.theAccount}.  Attribute access occurs on every
            avatar request, so any modifications to
            C{accountHolder.theAccount} will be reflected here.
        c                      j         S r0   r  r  s   r4   r5   z$TestRealm.__init__.<locals>.<lambda>|  s
    }'? r6   c                      j         S r0   r  rR   s   r4   r5   z$TestRealm.__init__.<locals>.<lambda>~  s	    t r6   N)_getAccount)rE   r  s   ``r4   rz   zTestRealm.__init__q  s<      	7????D6666Dr6   c                F    t           j        |                                 d fS )Nc                     d S r0   r1   r1   r6   r4   r5   z)TestRealm.requestAvatar.<locals>.<lambda>  s    4 r6   )r   IAccountr  )rE   avatarIdmindr   s       r4   ro  zTestRealm.requestAvatar  s    ~t//11<<??r6   r0   )rs   rt   ru   r2  r  rz   ro  r1   r6   r4   r  r  f  sM          J7 7 7 7@ @ @ @ @r6   r  c                  *    e Zd ZeefZddiZd Zd ZdS )TestCheckerr     secretc                    |j         | j        v rHt          j        |j        | j        |j                                                | j        |j                   S d S r0   )usernamer  r   maybeDeferredcheckPasswordr   _cbCheck)rE   credentialss     r4   requestAvatarIdzTestChecker.requestAvatarId  sU    4:--&)4:k6J+K k$-)=>>? .-r6   c                &    |r|S t                      r0   r   )rE   r2   r  s      r4   r  zTestChecker._cbCheck  s     	O!!!r6   N)	rs   rt   ru   r   r   credentialInterfacesr  r  r  r1   r6   r4   r  r    sH        35FG)$E? ? ?" " " " "r6   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d Zd Zd Zd Zd Zd Zd Zd Zd ZdS )AuthenticatorTestsc                :   t                               |            t                      }t          d          |_        t          |          | _        | j                            t                                 | j        | j	        _        d| _
        |j        | _        d S )Nr  r   )r  r  r  r  r  r   r  r  r  r  authenticatedrU  )rE   r  s     r4   r  zAuthenticatorTests.setUp  sx    t$$$";//Umm##KMM222!['r6   c                   t          t          t                     G d d                      } |            }t          t          |           t	          j        d|i          }| j        |_        t                      }|                    |           | 	                    |j
        t          j        d                     |                     d|                                           |                                 |                    d           |                     t#          j        |                                          |                                           |                                 |                    t#          j        d          dz              |                     |                                d	           d
S )z
        L{imap4.IMAP4Server} accepts a L{dict} mapping challenge type
        names to L{twisted.mail.interfaces.IChallengeResponse}
        providers.
        c                  &    e Zd Zd Zd Zd Zd ZdS )>AuthenticatorTests.test_customChallengers.<locals>.SPECIALAuthc                    dS )N   SPECIALr1   rR   s    r4   getChallengezKAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.getChallenge      !zr6   c                L    |                     d d          \  | _        | _        d S rt  )splitr  passwordrE   responses     r4   setResponsezJAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.setResponse  s"    /7~~dA/F/F,t}}}r6   c                    dS NFr1   rR   s    r4   moreChallengeszMAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.moreChallenges  s    ur6   c                    | j         | _         d S r0   )r  )rE   r  s     r4   r  zLAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.checkPassword  s     $r6   N)rs   rt   ru   r  r  r  r  r1   r6   r4   SPECIALAuthr    sS        " " "G G G  . . . . .r6   r  r  Connection done.s   AUTH=SPECIALs   001 AUTHENTICATE SPECIAL
s   username passwordr  s"   001 OK Authentication successful
N)r   r    r   r   r   r  r  r   r  
addCleanupr  r   r  r  r  r  dataReceivedbase64	b64encoder  rB   )rE   r  specialr  r  s        r4   test_customChallengersz)AuthenticatorTests.test_customChallengers  s    
'):	;	;	. 	. 	. 	. 	. 	. 	. 
<	;	. +--'111"J#<==#%%	i(((-u/CDV/W/WXXXoy'8'8999;<<<f&w';';'='=>>	@Q@QRRRF,-ABBWLMMM**,STTTTTr6   c                   t          j                    }| j        |_        t                      }|                    |           |                     |j        t          j        d                     |	                                 |
                    d           |                     |                                d           dS )z_
        An unsupported C{AUTHENTICATE} method results in a negative
        response.
        r  s   001 AUTHENTICATE UNKNOWN
s(   001 NO AUTHENTICATE method unsupported
N)r   r  r  r   r  r  r  r   r  r  r  rB   r  )rE   r  r  s      r4   test_unsupportedMethodz)AuthenticatorTests.test_unsupportedMethod  s    
 "$$#%%	i(((-u/CDV/W/WXXX;<<<OOL	
 	
 	
 	
 	
r6   c                    t           j         j        j        d<   t          j        d          } j                            |           d j        _         fd} j        	                    t          |                    }|                     j        d           |                     j         j                   t!          j        |                                 g          S )zv
        An L{imap4.IMAP4Server} that is missing a L{Portal} responds
        negatively to an authentication
        r  r  Nc                 8     j                             d          S Nr  r  authenticaterR   s   r4   rS  z3AuthenticatorTests.test_missingPortal.<locals>.auth      ;++I666r6   s    Temporary authentication failure)r   LOGINCredentialsr  r6  LOGINAuthenticatorr  registerAuthenticatorr  r  r   r7   r+  r  r  r
  r  r   r,  r#   )rE   cAuthrS  r   s   `   r4   test_missingPortalz%AuthenticatorTests.test_missingPortal  s    
 -2,B)(55))%000!	7 	7 	7 	7 	7 N&&uT{{33	+-P	
 	
 	
 	
t)4?;;;"At}}#7888r6   c                    t          t                     G d d                      }t          t                     G d d                      } |            }t          t          |           | j        j        d<    j                             |                        fd} j        	                    t          |                    }|                     j        dt          |j                  z                       d                     |                     j         j                   t'          j        |                                 g          S )	z
        When a challenger's
        L{getChallenge<IChallengeResponse.getChallenge>} method raises
        any exception, a C{NO} response is sent.
        c                  $    e Zd ZdZd Zd Zd ZdS )RAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenges   A challenge failurec                *    t          | j                  r0   )r  r  rR   s    r4   r  z_AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.getChallenge  s     ...r6   c                    dS zw
                Never called.

                @param response: See L{IChallengeResponse.setResponse}
                Nr1   r  s     r4   r  z^AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.setResponse        r6   c                    dS z/
                Never called.
                Nr1   rR   s    r4   r  zaAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.moreChallenges  r  r6   Nrs   rt   ru   r  r  r  r  r1   r6   r4   ValueErrorAuthChallenger    sF        ,G/ / /      r6   r  c                      e Zd Zd Zd ZdS )RAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticatorc                    dS )N   ERRORr1   rR   s    r4   getNamezZAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.getName  s    xr6   c                    dS )Ns   IGNOREDr1   )rE   secretchals      r4   challengeResponsezdAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.challengeResponse  r  r6   N)rs   rt   ru   r  r  r1   r6   r4   ValueErrorAuthenticatorr    s2             " " " " "r6   r  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z?AuthenticatorTests.test_challengerRaisesException.<locals>.auth  r  r6   zServer error: r  )r   r    r!   r   r  r6  r  r  r  r   r7   r+  r  r   r  rC   r  r
  r  r   r,  r#   )rE   r  r  badrS  r   s   `     r4   test_challengerRaisesExceptionz1AuthenticatorTests.test_challengerRaisesException  s|    
'	(	(	 	 	 	 	 	 	 
)	(	$ 
*	+	+	" 	" 	" 	" 	" 	" 	" 
,	+	" &%'''---,C)))*A*A*C*CDDD	7 	7 	7 	7 	7 N&&uT{{33	+$;$C D DDLLWUU	
 	
 	
 	
t)4?;;;"At}}#7888r6   c                   t          t                     G d d                      } |            }t          t          |           t          j                    }| j        |_        ||j        d<   t                      }|                    |           | 	                    |j
        t          j        d                     |                     d|                                           |                                 |                    d           |                     t#          j        |                                          |                                           |                                 |                    d           |                     |                                d                    d	|j        d
g                     dS )z
        A client that responds with a challenge that cannot be decoded
        as Base 64 receives an L{IllegalClientResponse}.
        c                  $    e Zd ZdZd Zd Zd ZdS )EAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenges   Malformed Response - not base64c                    dS )Ns   SomeChallenger1   rR   s    r4   r  zRAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.getChallenge5  s    ''r6   c                    dS r  r1   r  s     r4   r  zQAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.setResponse8  r  r6   c                    dS r  r1   rR   s    r4   r  zTAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.moreChallenges?  r  r6   Nr  r1   r6   r4   NotBase64AuthChallenger  1  sF        8G( ( (      r6   r  s	   NOTBASE64r  s   AUTH=NOTBASE64s   001 AUTHENTICATE NOTBASE64
s     Not base64
r6   s   001 NO Authentication failed: r  N)r   r    r   r   r  r  r6  r   r  r  r  r   r  r  r  r  r  r  r  r  rB   r   r  )rE   r  	notBase64r  r  s        r4   test_authNotBase64z%AuthenticatorTests.test_authNotBase64+  s    
'	(	(	 	 	 	 	 	 	 
)	(	$ +*,,	'333"$$+A<(#%%	i(((-u/CDV/W/WXXX'):):;;;=>>>f&y'='='?'?@@)//BSBSTTT2333OOHH79JGTUU	
 	
 	
 	
 	
r6   c                4    t                      }t          |          }| j        _        t          j        x j        j        d<   }t          t          |           t	          j	        d          } j
                            |            fd} j                            t          |                    }|                     j        d           |                     j         j                   t)          j                                         |g          }|S )z
        A challenger that causes the login to fail
        L{UnhandledCredentials} results in an C{NO} response.

        @return: A L{Deferred} that fires when the authorization has
            failed.
        r  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z:AuthenticatorTests.test_unhandledCredentials.<locals>.auths  r  r6   s+   Authentication failed: server misconfigured)r  r   r  r  r   r  r6  r   r    r  r  r  r  r   r7   r+  r  r  r
  r  r   r,  r#   )rE   r  r  	loginCredr  rS  r-  r   s   `       r4   test_unhandledCredentialsz,AuthenticatorTests.test_unhandledCredentials^  s     $8=8NN)I&	222(55))%000	7 	7 	7 	7 	7 ^''d44
+:	
 	
 	
 	*DO<<<" 566r6   c                   
  G d dt                     
 G 
fdd          }t                      }t          |          }|                     |                       | j        _        t          j        x j        j        d<   }t          t          |           t          j        d          } j                            |            fd}
 fd} j                            t!          |                    }|                     j        d	           |                    t!          |                     |                     j         j                   t-          j                                         |g          }	|	S )
z
        If the portal raises an exception other than
        L{UnauthorizedLogin} or L{UnhandledCredentials}, the server
        responds with a C{BAD} response and the exception is logged.
        c                      e Zd ZdZdS )KAuthenticatorTests.test_unexpectedLoginFailure.<locals>.UnexpectedExceptionrt  Nr  r1   r6   r4   ru  r    rv  r6   ru  c                  &    e Zd ZdZeefZ fdZdS )FAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingCheckerzz
            A credentials checker whose L{requestAvatarId} method
            raises L{UnexpectedException}.
            c                     d          )NzUnexpected error.r1   )rE   r  ru  s     r4   r  zVAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingChecker.requestAvatarId  s    ))*=>>>r6   N)rs   rt   ru   r2  r   r   r  r  )ru  s   r4   FailingCheckerr    sF         
 %<=N#O ? ? ? ? ? ? ?r6   r  r  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z<AuthenticatorTests.test_unexpectedLoginFailure.<locals>.auth  r  r6   c                 X                                                                   d S r0   r  )ru  rE   s   r4   assertUnexpectedExceptionLoggedzWAuthenticatorTests.test_unexpectedLoginFailure.<locals>.assertUnexpectedExceptionLogged  s*    OOD223FGGHHHHHr6   s'   Server error: login failed unexpectedly)r  r  r   r  r  r  r   r  r6  r   r    r  r  r  r  r   r7   r+  r  r  r
  r  r   r,  r#   )rE   r  r  r  r  r  rS  r  r-  r   ru  s   `         @r4   test_unexpectedLoginFailurez.AuthenticatorTests.test_unexpectedLoginFailure  s   	 	 	 	 	) 	 	 	
		? 		? 		? 		? 		? 		? 		? 		? 		? 		? ~~//000#8=8NN)I&	222(55))%000	7 	7 	7 	7 	7	I 	I 	I 	I 	I 	I ^''d44
+-W	
 	
 	
 	u<==>>>
*DO<<<" 566r6   c                    t            j        j        d<   t          j        d          } j                            |            fd} fd} j                            t          |                    }|
                    t          |           j                   |
                     j         j                                                    }t          j        ||g          }|                     j                  S )Nr0  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z,AuthenticatorTests.testCramMD5.<locals>.auth  r  r6   c                     d _         d S rt  r  rR   s   r4   authedz.AuthenticatorTests.testCramMD5.<locals>.authed      !"Dr6   )r   r  r6  r   CramMD5ClientAuthenticatorr  r  r  r   r7   r  r  r
  r#   r   r,  _cbTestCramMD5)rE   r  rS  r  r-  rb  r   s   `      r4   testCramMD5zAuthenticatorTests.testCramMD5  s    /A,0==))%000	7 	7 	7 	7 	7	# 	# 	# 	# 	# ^''d44
ft777
*DO<<<]]__R))}}T0111r6   c                    |                      | j        d           |                      | j        j        | j                   d S rt  rB   r  r  rU  rW  s     r4   r  z!AuthenticatorTests._cbTestCramMD5  >    +Q///,dl;;;;;r6   c                    t            j        j        d<   t          j        d          } j                            |            fd} fd} fd} j                            t          |                    }|
                    t          |          t          |                     |
                     j         j                   t          j                                         |g          }|                     j                  S )Nr0  r  c                 8     j                             d          S Ns   not the secretr  rR   s   r4   misauthz5AuthenticatorTests.testFailedCramMD5.<locals>.misauth      ;++,=>>>r6   c                     d _         d S rt  r  rR   s   r4   r  z4AuthenticatorTests.testFailedCramMD5.<locals>.authed  r  r6   c                     d _         d S Nr  rR   s   r4   	misauthedz7AuthenticatorTests.testFailedCramMD5.<locals>.misauthed      !#Dr6   )r   r  r6  r   r  r  r  r  r   r7   r  r
  r  r   r,  r#   _cbTestFailedCramMD5rE   r  r  r  r  r-  r   s   `      r4   testFailedCramMD5z$AuthenticatorTests.testFailedCramMD5  s   /A,0==))%000	? 	? 	? 	? 	?	# 	# 	# 	# 	#	$ 	$ 	$ 	$ 	$ ^''g77
fuY'7'7888
*DO<<<" 566}}T6777r6   c                |    |                      | j        d           |                      | j        j        d            d S r  r  rW  s     r4   r  z'AuthenticatorTests._cbTestFailedCramMD5  <    +R000,d33333r6   c                6    t           j        x j        j        d<   }t	          t
          |           t          j        d          } j                            |            fd} fd} j	        
                    t          |                    }|                    t          |           j                   |                     j         j                   t          j                                         |g          }|
                     j                  S )Nr  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z*AuthenticatorTests.testLOGIN.<locals>.auth  r  r6   c                     d _         d S rt  r  rR   s   r4   r  z,AuthenticatorTests.testLOGIN.<locals>.authed  r  r6   )r   r  r  r6  r   r    r  r  r  r  r   r7   r  r  r
  r   r,  r#   _cbTestLOGIN)rE   r  r  rS  r  r-  r   s   `      r4   	testLOGINzAuthenticatorTests.testLOGIN     8=8NN)I&	222(55))%000	7 	7 	7 	7 	7	# 	# 	# 	# 	# ^''d44
ft777
*DO<<<" 566}}T.///r6   c                    |                      | j        d           |                      | j        j        | j                   d S rt  r  rW  s     r4   r  zAuthenticatorTests._cbTestLOGIN  r  r6   c                "    t           j         j        j        d<   t          j        d          } j                            |            fd} fd} fd} j                            t          |                    }|
                    t          |          t          |                     |
                     j         j                   t          j                                         |g          }|                     j                  S )Nr  r  c                 8     j                             d          S r  r  rR   s   r4   r  z3AuthenticatorTests.testFailedLOGIN.<locals>.misauth  r  r6   c                     d _         d S rt  r  rR   s   r4   r  z2AuthenticatorTests.testFailedLOGIN.<locals>.authed  r  r6   c                     d _         d S r  r  rR   s   r4   r  z5AuthenticatorTests.testFailedLOGIN.<locals>.misauthed  r  r6   )r   r  r  r6  r  r  r  r  r   r7   r  r
  r  r   r,  r#   _cbTestFailedLOGINr  s   `      r4   testFailedLOGINz"AuthenticatorTests.testFailedLOGIN     ,1,B)(55))%000	? 	? 	? 	? 	?	# 	# 	# 	# 	#	$ 	$ 	$ 	$ 	$ ^''g77
fuY'7'7888
*DO<<<" 566}}T4555r6   c                |    |                      | j        d           |                      | j        j        d            d S r  r  rW  s     r4   r  z%AuthenticatorTests._cbTestFailedLOGIN  r
  r6   c                6    t           j        x j        j        d<   }t	          t
          |           t          j        d          } j                            |            fd} fd} j	        
                    t          |                    }|                    t          |           j                   |                     j         j                   t          j                                         |g          }|
                     j                  S )Nr  r  c                 8     j                             d          S r  r  rR   s   r4   rS  z*AuthenticatorTests.testPLAIN.<locals>.auth  r  r6   c                     d _         d S rt  r  rR   s   r4   r  z,AuthenticatorTests.testPLAIN.<locals>.authed  r  r6   )r   PLAINCredentialsr  r6  r   r    PLAINAuthenticatorr  r  r  r   r7   r  r  r
  r   r,  r#   _cbTestPLAIN)rE   	plainCredr  rS  r  r-  r   s   `      r4   	testPLAINzAuthenticatorTests.testPLAIN  r  r6   c                    |                      | j        d           |                      | j        j        | j                   d S rt  r  rW  s     r4   r  zAuthenticatorTests._cbTestPLAIN#  r  r6   c                "    t           j         j        j        d<   t          j        d          } j                            |            fd} fd} fd} j                            t          |                    }|
                    t          |          t          |                     |
                     j         j                   t          j                                         |g          }|                     j                  S )Nr  r  c                 8     j                             d          S r  r  rR   s   r4   r  z3AuthenticatorTests.testFailedPLAIN.<locals>.misauth,  r  r6   c                     d _         d S rt  r  rR   s   r4   r  z2AuthenticatorTests.testFailedPLAIN.<locals>.authed/  r  r6   c                     d _         d S r  r  rR   s   r4   r  z5AuthenticatorTests.testFailedPLAIN.<locals>.misauthed2  r  r6   )r   r  r  r6  r  r  r  r  r   r7   r  r
  r  r   r,  r#   _cbTestFailedPLAINr  s   `      r4   testFailedPLAINz"AuthenticatorTests.testFailedPLAIN'  r  r6   c                |    |                      | j        d           |                      | j        j        d            d S r  r  rW  s     r4   r'  z%AuthenticatorTests._cbTestFailedPLAIN;  r
  r6   N)rs   rt   ru   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r  r(  r'  r1   r6   r4   r  r    sH       
( 
( 
()U )U )UV
 
 
&9 9 9.29 29 29h1
 1
 1
f  B0 0 0d2 2 2$< < <8 8 8(4 4 40 0 0(< < <6 6 6(4 4 40 0 0(< < <6 6 6(4 4 4 4 4r6   r  c                  $    e Zd ZdZd Zd Zd ZdS )SASLPLAINTestsz
    Tests for I{SASL PLAIN} authentication, as implemented by
    L{imap4.PLAINAuthenticator} and L{imap4.PLAINCredentials}.

    @see: U{http://www.faqs.org/rfcs/rfc2595.html}
    @see: U{http://www.faqs.org/rfcs/rfc4616.html}
    c                    d}d}d}t          j        |          }|                    ||          }|                     |d|z   dz   |z              dS )z
        L{PLAINAuthenticator.challengeResponse} returns challenge strings of
        the form::

            NUL<authn-id>NUL<secret>
        r  r  s	   challenge    N)r   r  r  rB   )rE   r  r  r  r  r  s         r4   #test_authenticatorChallengeResponsez2SASLPLAINTests.test_authenticatorChallengeResponseI  sc     (22**648858#3e#;f#DEEEEEr6   c                    t          j                    }|                    d           |                     |j        d           |                     |j        d           dS )z
        L{PLAINCredentials.setResponse} parses challenge strings of the
        form::

            NUL<authn-id>NUL<secret>
        s    testuser secretr  r  N)r   r  r  rB   r  r  rE   creds     r4   test_credentialsSetResponsez*SASLPLAINTests.test_credentialsSetResponseW  s]     %''.///444	22222r6   c                   t          j                    }|                     t           j        |j        d           |                     t           j        |j        d           |                     t           j        |j        d           dS )z
        L{PLAINCredentials.setResponse} raises L{imap4.IllegalClientResponse}
        when passed a string not of the expected form.
        s   hellos   hello worlds   hello world Zoom! N)r   r  r   r  r  r0  s     r4   test_credentialsInvalidResponsez.SASLPLAINTests.test_credentialsInvalidResponsec  s    
 %''%5t7GRRR')9?	
 	
 	
 	')9;S	
 	
 	
 	
 	
r6   N)rs   rt   ru   r2  r.  r2  r4  r1   r6   r4   r+  r+  @  sN         F F F
3 
3 
3
 
 
 
 
r6   r+  c                  V    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d ZdS )UnsolicitedResponseTestsc                ^     fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z5UnsolicitedResponseTests.testReadWrite.<locals>.logint  r~  r6   c                 <     j                             d           d S rt  r  r  rR   s   r4   r  z8UnsolicitedResponseTests.testReadWrite.<locals>.loggedInw      K##A&&&&&r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestReadWriterE   rL  r  r-  r   s   `    r4   testReadWritez&UnsolicitedResponseTests.testReadWrites  s    	D 	D 	D 	D 	D	' 	' 	' 	' 	' ^''e55
uX''224?CCC" 566}}T2333r6   c                P    | j         j        }|                     |ddgg           d S )Nr  r   r  r  rB   rE   rX  Es      r4   r<  z)UnsolicitedResponseTests._cbTestReadWrite  0    KmQ/011111r6   c                ^     fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z4UnsolicitedResponseTests.testReadOnly.<locals>.login  r~  r6   c                 <     j                             d           d S r  r:  rR   s   r4   r  z7UnsolicitedResponseTests.testReadOnly.<locals>.loggedIn  r;  r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestReadOnlyr=  s   `    r4   testReadOnlyz%UnsolicitedResponseTests.testReadOnly  s    	D 	D 	D 	D 	D	' 	' 	' 	' 	' ^''e55
uX''224?CCC" 566}}T1222r6   c                P    | j         j        }|                     |ddgg           d S )Nr  r   r@  rA  s      r4   rG  z(UnsolicitedResponseTests._cbTestReadOnly  rC  r6   c                v    ddgg dgd fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )N	\Answeredr  \Recent)r   r   r   c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z6UnsolicitedResponseTests.testFlagChange.<locals>.login  r~  r6   c                 <    j                                         d S r0   )r  r  )r  rE   s   r4   r  z9UnsolicitedResponseTests.testFlagChange.<locals>.loggedIn  s    K$$U+++++r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestFlagChange)rE   rL  r  r-  r   r  s   `    @r4   testFlagChangez'UnsolicitedResponseTests.testFlagChange  s    !;/BZLII	D 	D 	D 	D 	D	, 	, 	, 	, 	, 	, ^''e55
uX''224?CCC" 566}}T3U;;;r6   c                    | j         j        }d |                                D             }|                    d            |                    d            |                     ||           d S )Nc                2    g | ]}d |d         |d         igS )r  r   r   r1   )r,  r[  s     r4   r  z>UnsolicitedResponseTests._cbTestFlagChange.<locals>.<listcomp>  s)    HHHQ>AaD!A$<0HHHr6   c                    | d         S r  r1   rp   s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>  s
    QqT r6   )keyc                    | d         S r  r1   rT  s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>  s
    !A$ r6   )r  r  itemsr  rB   )rE   rX  r  rB  expects        r4   rO  z*UnsolicitedResponseTests._cbTestFlagChange  so    KHH%++--HHH	>>"""'''F#####r6   c                ^     fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z7UnsolicitedResponseTests.testNewMessages.<locals>.login  r~  r6   c                 >     j                             dd            d S Nr   r  r  rR   s   r4   r  z:UnsolicitedResponseTests.testNewMessages.<locals>.loggedIn  s!    K##B-----r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestNewMessagesr=  s   `    r4   testNewMessagesz(UnsolicitedResponseTests.testNewMessages  s    	D 	D 	D 	D 	D	. 	. 	. 	. 	. ^''e55
uX''224?CCC" 566}}T4555r6   c                P    | j         j        }|                     |g dg           d S )N)r  r   Nr@  rA  s      r4   r^  z+UnsolicitedResponseTests._cbTestNewMessages  2    K666788888r6   c                ^     fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z=UnsolicitedResponseTests.testNewRecentMessages.<locals>.login  r~  r6   c                 >     j                             d d           d S r\  r]  rR   s   r4   r  z@UnsolicitedResponseTests.testNewRecentMessages.<locals>.loggedIn  s!    K##D"-----r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestNewRecentMessagesr=  s   `    r4   testNewRecentMessagesz.UnsolicitedResponseTests.testNewRecentMessages  s    	D 	D 	D 	D 	D	. 	. 	. 	. 	. ^''e55
uX''224?CCC" 566}}T:;;;r6   c                P    | j         j        }|                     |g dg           d S )Nr  Nr   r@  rA  s      r4   re  z1UnsolicitedResponseTests._cbTestNewRecentMessages  ra  r6   c                ^     fd} fd} j                             t          |                    }|                    t          |                                         j                   t          j                                         |g          }|                     j                  S )Nc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z@UnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.login  r~  r6   c                 >     j                             dd           d S )NrA  r   r]  rR   s   r4   r  zCUnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loggedIn  s!    K##B+++++r6   )	r  r   r7   r+  r  r   r,  r#   _cbTestNewMessagesAndRecentr=  s   `    r4   testNewMessagesAndRecentz1UnsolicitedResponseTests.testNewMessagesAndRecent  s    	D 	D 	D 	D 	D	, 	, 	, 	, 	, ^''e55
uX''224?CCC" 566}}T=>>>r6   c                V    | j         j        }|                     |g dg dg           d S )N)r  rA  Nrh  r@  rA  s      r4   rl  z4UnsolicitedResponseTests._cbTestNewMessagesAndRecent  s;    K6668Q8Q8QRSSSSSr6   N)rs   rt   ru   r>  r<  rH  rG  rP  rO  r_  r^  rf  re  rm  rl  r1   r6   r4   r6  r6  r  s        
4 
4 
42 2 2
3 
3 
32 2 2< < <$ $ $
6 
6 
69 9 9
< 
< 
<9 9 9
? 
? 
?T T T T Tr6   r6  c                  *    e Zd ZdZd Zd Zd Zd ZdS )ClientCapabilityTestszT
    Tests for issuance of the CAPABILITY command and handling of its response.
    c                    t                      | _        t          j                    | _        | j                            | j                   | j                            d           dS )zS
        Create an L{imap4.IMAP4Client} connected to a L{StringTransport}.
        s   * OK [IMAP4rev1]
N)r   r  r   r  protocolr  r  rR   s    r4   r  zClientCapabilityTests.setUp  sV     )**)++$$T^444""#:;;;;;r6   c                      j                             d          } j                             d            j                             d            fd}|                    |           |S )z
        A capability response consisting only of atoms without C{'='} in them
        should result in a dict mapping those atoms to L{None}.
        FuseCaches&   * CAPABILITY IMAP4rev1 LOGINDISABLED
   0001 OK Capability completed.
c                :                         | d d d           d S )N)r%  s   LOGINDISABLEDr)  capabilitiesrE   s    r4   gotCapabilitiesz?ClientCapabilityTests.test_simpleAtoms.<locals>.gotCapabilities  s(    \$RV+W+WXXXXXr6   rr  r!  r  r   rE   capabilitiesResultrz  s   `  r4   test_simpleAtomsz&ClientCapabilityTests.test_simpleAtoms  s    
 "]::E:JJ""#NOOO""#GHHH	Y 	Y 	Y 	Y 	Y 	&&777!!r6   c                      j                             d          } j                             d            j                             d            fd}|                    |           |S )a  
        A capability response consisting of atoms including C{'='} should have
        those atoms split on that byte and have capabilities in the same
        category aggregated into lists in the resulting dictionary.

        (n.b. - I made up the word "category atom"; the protocol has no notion
        of structure here, but rather allows each capability to define the
        semantics of its entry in the capability response in a freeform manner.
        If I had realized this earlier, the API for capabilities would look
        different.  As it is, we can hope that no one defines any crazy
        semantics which are incompatible with this API, or try to figure out a
        better API when someone does. -exarkun)
        Frt  s.   * CAPABILITY IMAP4rev1 AUTH=LOGIN AUTH=PLAIN
rv  c                >                         | d ddgd           d S )Nr  r  )r%  r3  r)  rx  s    r4   rz  zAClientCapabilityTests.test_categoryAtoms.<locals>.gotCapabilities  s7    TXx<PQQ    r6   r{  r|  s   `  r4   test_categoryAtomsz(ClientCapabilityTests.test_categoryAtoms  s     "]::E:JJ""#VWWW""#GHHH	 	 	 	 	
 	&&777!!r6   c                      j                             d          } j                             d            j                             d            fd}|                    |           |S )z
        A capability response consisting of both simple and category atoms of
        the same type should result in a list containing L{None} as well as the
        values for the category.
        Frt  s0   * CAPABILITY IMAP4rev1 FOO FOO=BAR BAR=FOO BAR
rv  c                D                         | d d dgdd gd           d S )N   BAR   FOO)r%  r  r  r)  rx  s    r4   rz  z>ClientCapabilityTests.test_mixedAtoms.<locals>.gotCapabilities  s=    #dF^fd^TT    r6   r{  r|  s   `  r4   test_mixedAtomsz%ClientCapabilityTests.test_mixedAtoms  s     "]::E:JJ 	""A	
 	
 	
 	""#GHHH	 	 	 	 	 	&&777!!r6   N)rs   rt   ru   r2  r  r~  r  r  r1   r6   r4   rp  rp    sZ         < < <" " "" " "4" " " " "r6   rp  c                      e Zd ZdZd Zd ZdS )StillSimplerClientzH
    An IMAP4 client which keeps track of unsolicited flag changes.
    c                R    t           j                            |            i | _        d S r0   )r   r  rz   r  rR   s    r4   rz   zStillSimplerClient.__init__-  s$    ""4(((


r6   c                :    | j                             |           d S r0   )r  r  r  s     r4   r  zStillSimplerClient.flagsChanged1  s    
(#####r6   N)rs   rt   ru   r2  rz   r  r1   r6   r4   r  r  (  s<           $ $ $ $ $r6   r  c                  D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )HandCraftedTestsc                J    t                      t          j                                                                       d            fdfdfd}                    dd          }                    d           |                    |           |S )N   * OK [IMAP4rev1]c                                                                                                         d         d           d S )Nr  s   0003 FETCH 1 (RFC822)rB   r  rf  )rX  rE   r  s    r4   cbCheckTransportz>HandCraftedTests.testTrailingLiteral.<locals>.cbCheckTransport<  sF    !!,,..r2(    r6   c                                         d          }                    d                               d           |                               |S )Nr   s6   * 1 FETCH (RFC822 {10}
0123456789
 RFC822.SIZE 10)
s   0003 OK FETCH
)fetchMessager  r   )rX  r   r   r  s     r4   cbSelectz6HandCraftedTests.testTrailingLiteral.<locals>.cbSelectB  sZ    s##ANNO   NN/000MM*+++Hr6   c                                         d          }                    d           |                               |S Nr     0002 OK SELECT)r  r  r   )rX  r   r   r  s     r4   cbLoginz5HandCraftedTests.testTrailingLiteral.<locals>.cbLoginK  s>    !!ANN,---MM(###Hr6      blah   0001 OK LOGIN
)r   r   r  r  r  rL  r  r   )rE   r  r   r   r  r  r  s   `  @@@@r4   testTrailingLiteralz$HandCraftedTests.testTrailingLiteral6  s    #%%		###	*+++	 	 	 	 	 		 	 	 	 	 		 	 	 	 	 	 GGGW%%	+,,,	gr6   c                   | j         j                            dd           t                      }| j                             |           |                                 | j                             d           |                     |                                d           |                                 | j                             d           |                     |                                d           |                                 | j                             d           | 	                    |                                           | j                             d           |                     |                                d	           |                     | j         j
        d
           | j                             t          j        d                     dS )z]
        String literals whose data is not immediately available are
        parsed.
        r  r  s   01 LOGIN {8}
s   + Ready for 8 octets of text
s   testuser {13}
s   + Ready for 13 octets of text
s   passwords   -test
   01 OK LOGIN succeeded
rS  r  N)r  r  r  r   r  r  r  rB   r  	assertNotrV  r  r   r  rE   r  s     r4   test_fragmentedStringLiteralsz.HandCraftedTests.test_fragmentedStringLiteralsV  s   
 	##K1ABBB#%%	""9---  !4555**,OPPP  !5666**,PQQQ  ---y(()))  ...**,HIII*F333""5#78J#K#KLLLLLr6   c                l   ddi| j         j        _        t                      }| j                             |           |                                 | j                             d           |                     |                                d           |                                 | j                             d           |                     |                                d           |                     | j         j	        d           | j         
                    t          j        d                     dS )	z3
        Empty string literals are parsed.
        r6   s   01 LOGIN {0}
s   + Ready for 0 octets of text
s   {0}
r  rS  r  N)r  r  r  r   r  r  r  rB   r  rV  r  r   r  r  s     r4   test_emptyStringLiteralz(HandCraftedTests.test_emptyStringLiteralp  s    &)#J!#%%	""9---  !4555**,OPPP  ,,,**,HIII*F333""5#78J#K#KLLLLLr6   c                z    t                      t                                                                         d           fd}fd}fd} fd} |                                t          |                                        t          |                                        |          S )a^  
        If unsolicited data is received along with solicited data in the
        response to a I{FETCH} command issued by L{IMAP4Client.fetchSpecific},
        the unsolicited data is passed to the appropriate callback and not
        included in the result with which the L{Deferred} returned by
        L{IMAP4Client.fetchSpecific} fires.
        r  c                 ^                         dd          }                     d           | S Nr  r  rL  r  r   r   s    r4   rL  zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.login  .    ))ANN/000Hr6   c                 \                         d          }                     d           | S r  r  r  r  s    r4   r  zSHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.select  ,    !!ANN,---Hr6   c                                         dddg          }                     d                               d                               d                               d                               d	                               d
                               d                               d                               d                               d           | S )Nr   HEADER.FIELDSSUBJECT
headerType
headerArgss1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {38}
s$   Subject: Suprise for your woman...
r     )
s   * 1 FETCH (FLAGS (\Seen))
s1   * 2 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {75}
sI   Subject: What you been doing. Order your meds here . ,. handcuff madsen
   0003 OK FETCH completed
fetchSpecificr  r  s    r4   r  zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.fetch  s    /yk    A NNQRRRNNDEEENN7###NN8$$$NN<===NNQRRRNN^   NN7###NN8$$$NN9:::Hr6   c                                                                                                        d         d                                | dddggdggdddggdggd                                j        d	d
gi           d S )Nr  ,   0003 FETCH 1:* BODY[HEADER.FIELDS (SUBJECT)]r  r  r  z&Subject: Suprise for your woman...

zKSubject: What you been doing. Order your meds here . ,. handcuff madsen

r   r   r   \SeenrB   r  rf  r  resr   rE   r  s    r4   r  zQHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.test  s    !!,,..r2?  
  #,yk:H #,yk:m   ( QWq8*o66666r6   r   r  r  r  r   r7   rE   rL  r  r  r  r   r  s   `    @@r4   2test_unsolicitedResponseMixedWithSolicitedResponsezCHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse  s     $%%	  	###	*+++	 	 	 	 	
	 	 	 	 	
	 	 	 	 	$	7 	7 	7 	7 	7 	7 	7: EGG[v''[u&&[		
r6   c                    t                      t          j                                                                       d           fd}fd}fd} fd} |            }|                    t          |                     |                    t          |                     |                    |           |S )zf
        Literals should be recognized even when they are not preceded by
        whitespace.
        r  c                 ^                         dd          }                     d           | S r  r  r   rr  s    r4   rL  zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.login  0    w00A!!"6777Hr6   c                 \                         d          }                     d           | S )N   inboxr  r  r  s    r4   r  zGHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.select  s.    ))A!!"3444Hr6   c                                          dddg          }                     d                               d           | S )Nr   r  r  r  s8   * 1 FETCH (BODY[HEADER.FIELDS ({7}
SUBJECT)] "Hello")
r  r  r  s    r4   r  zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.fetch  s_    &&/yk '  A !!O   !!"@AAAHr6   c                                                                                                         d         d                                | ddddggdggi           d S )Nr  r  r   r  r  r  Hellor  )r2   rE   r  s    r4   r  zEHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.test  s{    !!,,..r2?   f&DgNOP    r6   r   r   r  r  r  r   r7   )rE   rL  r  r  r  r   rr  r  s   `     @@r4   &test_literalWithoutPrecedingWhitespacez7HandCraftedTests.test_literalWithoutPrecedingWhitespace  s   
 $%%	$&&	***1222	 	 	 	 	
	 	 	 	 	
	 	 	 	 		 	 	 	 	 	 EGG	eFmm$$$	eEll###	dr6   c                `    t                      t          j                                                                       d           fd}fd} fd} |            }|                    t          |                     |                    t          |                     |S )z
        If the server sends a literal length which cannot be parsed as an
        integer, L{IMAP4Client.lineReceived} should cause the protocol to be
        disconnected by raising L{imap4.IllegalServerResponse}.
        r  c                 ^                         dd          }                     d           | S r  r  r  s    r4   rL  z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.login	  r  r6   c                 \                         d          }                     d           | S r  r  r  s    r4   r  z=HandCraftedTests.test_nonIntegerLiteralLength.<locals>.select  s.    ((A!!"3444Hr6   c                                          dddg                                                                                               d         d                               t
          j         j        d           d S )Nr   r  r  r  r  r  s   * 1 FETCH {xyz}
...)r  rB   r  rf  r   r   IllegalServerResponser  )rr  rE   r  s   r4   r  z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.fetch  s    ""/yk #    !!,,..r2?  
 +%)    r6   r  )rE   rL  r  r  r   rr  r  s   `    @@r4   test_nonIntegerLiteralLengthz-HandCraftedTests.test_nonIntegerLiteralLength  s     $%%	$&&	***1222	 	 	 	 	
	 	 	 	 	
	 	 	 	 	 	 	  EGG	eFmm$$$	eEll###r6   c                v    t                      }t                                          |                               d           fd}fd}fd} fd} |                                t          |                                        t          |                                        |          S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchSpecific} is passed to the
        C{flagsChanged} callback.
        r  c                 ^                         dd          }                     d           | S r  r  r  s    r4   rL  zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.login4  r  r6   c                 \                         d          }                     d           | S r  r  r  s    r4   r  zMHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.select9  r  r6   c                 `                        dddg          }                     d                               d                               d                               d                               d	                               d
                               d           | S )Nr   r  r  r  s1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject one
s    FLAGS (\Recent))
s?   * 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject two
r  r  r  r  s    r4   r  zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.fetch>  s    ?	{    A NNQRRRNN6777NN4555NNU   NN6777NN8$$$NN9:::Hr6   c                                         | dddggdggdddggdggd                                j        dgdgd           d S )	Nr  r  r  zSubject: subject one
zSubject: subject two
r  rL  r  )rB   r  )r  r   rE   s    r4   r  zKHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.testO  s     #,yk:6 #,yk:6   ( QW:,H:&F&FGGGGGr6   r  )rE   r  rL  r  r  r  r   s   `     @r4   ,test_flagsChangedInsideFetchSpecificResponsez=HandCraftedTests.test_flagsChangedInsideFetchSpecificResponse(  s     $%%	  	###	*+++	 	 	 	 	
	 	 	 	 	
	 	 	 	 	"	H 	H 	H 	H 	H 	H0 EGG[v''[u&&[		
r6   c                z    t                      t                                                                         d           fd}fd}fd} fd} |                                t          |                                        t          |                                        |          S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchMessage} is passed to the
        C{flagsChanged} callback.
        r  c                 ^                         dd          }                     d           | S r  r  r  s    r4   rL  zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.loginy  r  r6   c                 \                         d          }                     d           | S r  r  r  s    r4   r  zLHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.select~  r  r6   c                 X                        d          }                     d                               d                               d                               d                               d                               d                               d           | S )	Nr   s   * 1 FETCH (RFC822 {24}
s   Subject: first subject
s    FLAGS (\Seen))
s.   * 2 FETCH (FLAGS (\Recent \Seen) RFC822 {25}
s   Subject: second subject
r  r  )r  r  r  s    r4   r  zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.fetch  s    u%%ANN8999NN8999NN2333NNPQQQNN9:::NN8$$$NN9:::Hr6   c                                                                                                        d         d                                | ddiddid                                j        dgddgd           d S )	Nr  s   0003 FETCH 1:* (RFC822)r  zSubject: first subject
zSubject: second subject
r  r  rL  r  r  s    r4   r  zJHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.test  s    !!,,..r2*  
  ">? "?@    QW8**h9O&P&PQQQQQr6   r  r  s   `    @@r4   +test_flagsChangedInsideFetchMessageResponsez<HandCraftedTests.test_flagsChangedInsideFetchMessageResponsem  s     $%%	  	###	*+++	 	 	 	 	
	 	 	 	 	
		 		 		 		 			R 	R 	R 	R 	R 	R 	R" EGG[v''[u&&[		
r6   c                l   t                      }t          j                    }||_        |                    |           |                    d           t          j        d          }|                    |           |                    d          }| 	                    |t          j                   |                    d           |                     t          j                  }|                     t!          |          d           |                     |d         j        j        d         d           |S )z
        When decoding a base64 encoded authentication message from the server,
        decoding errors are logged and then the client closes the connection.
        sP   * OK [CAPABILITY IMAP4rev1 IDLE NAMESPACE AUTH=CRAM-MD5] Twisted IMAP4rev1 Readyr  r  s   + Something bad! and bad
r   r   s   Something bad! and bad)r   r   r  rr  r  r  r  r  r  assertFailurer   r  r  r  r  rB   r   r  r  )rE   r  rr  r  r   loggeds         r4   -test_authenticationChallengeDecodingExceptionz>HandCraftedTests.test_authenticationChallengeDecodingException  s   
 566	$&&%		***'	
 	
 	
 0==&&u---!!(++ 	1e2333=>>> ''(CDDVa(((-a02KLLLr6   N)rs   rt   ru   r  r  r  r  r  r  r  r  r  r1   r6   r4   r  r  5  s          @M M M4M M M&J
 J
 J
X, , ,\) ) )VC
 C
 C
J6
 6
 6
p    r6   r  c                  2    e Zd ZU dZej        Zded<   d ZdS )PreauthIMAP4ClientMixinav  
    Mixin for L{SynchronousTestCase} subclasses which
    provides a C{setUp} method which creates an L{IMAP4Client}
    connected to a L{StringTransport} and puts it into the
    I{authenticated} state.

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

    @ivar client: An L{IMAP4Client} which is connected to
        C{transport}.
    zType[imap4.IMAP4Client]clientProtocolc                    t                      | _        |                                 | _        | j                            | j                   | j                            d           dS )zm
        Create an IMAP4Client connected to a fake transport and in the
        authenticated state.
        s   * PREAUTH Hello unittest
N)r   r  r  r  r  r  rR   s    r4   r  zPreauthIMAP4ClientMixin.setUp  sY    
 )**))++""4>222  !@AAAAAr6   N)	rs   rt   ru   r2  r   r  r  r  r  r1   r6   r4   r  r    sJ           /4.?N????B B B B Br6   r  c                  r    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d Zd Zd Zd Zd Zd ZdS )SelectionTestsMixinzl
    Mixin for test cases which defines tests which apply to both I{EXAMINE} and
    I{SELECT} support.
    c                     t          | j        | j                  d          }|                     | j                                        d| j        z   dz              |S )z
        Issue either an I{EXAMINE} or I{SELECT} command (depending on
        C{self.method}), assert that the correct bytes are written to the
        transport, and return the L{Deferred} returned by whichever method was
        called.
        fooboxs   0001 s	    foobox
)r  r  methodrB   r  r  r  rE   r   s     r4   _examineOrSelectz$SelectionTestsMixin._examineOrSelect  s_     .GDK--h77N  ""Ht|$;n$L	
 	
 	
 r6   c                    |D ]}| j                             |dz               | j                             d| j        z   dz              dS )z
        Deliver the given (unterminated) response lines to C{self.client} and
        then deliver a tagged SELECT or EXAMINE completion line to finish the
        SELECT or EXAMINE response.
        r  s   0001 OK [READ-ONLY] s    completed
N)r  r  r  )rE   linesr  s      r4   	_responsezSelectionTestsMixin._response  sd      	5 	5DK$$TG^4444  #dl25FF	
 	
 	
 	
 	
r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{EXISTS} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'EXISTS'} key.
        s
   * 3 EXISTSFr   )r  r  Nr  r  rB   successResultOfr  s     r4   test_existszSelectionTestsMixin.test_exists  Z     !!##}%%%--a00RS2T2TUUUUUr6   c                    |                                  }|                     d           |                     |t          j                   dS )a  
        If the server returns a non-integer EXISTS value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo EXISTSNr  r  failureResultOfr   r  r  s     r4   test_nonIntegerExistsz)SelectionTestsMixin.test_nonIntegerExists	  F     !!##'''Q ;<<<<<r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{RECENT} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'RECENT'} key.
        s
   * 5 RECENTFr   )r  rS  Nr  r  s     r4   test_recentzSelectionTestsMixin.test_recent  r  r6   c                    |                                  }|                     d           |                     |t          j                   dS )a  
        If the server returns a non-integer RECENT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo RECENTNr  r  s     r4   test_nonIntegerRecentz)SelectionTestsMixin.test_nonIntegerRecent  r  r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UNSEEN} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UNSEEN'} key.
        s)   * OK [UNSEEN 8] Message 8 is first unseenFr   )r  rV  Nr  r  s     r4   test_unseenzSelectionTestsMixin.test_unseen*  s[     !!##CDDD--a00RS2T2TUUUUUr6   c                    |                                  }|                     d           |                     |t          j                   dS )a  
        If the server returns a non-integer UNSEEN value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s-   * OK [UNSEEN foo] Message foo is first unseenNr  r  s     r4   test_nonIntegerUnseenz)SelectionTestsMixin.test_nonIntegerUnseen5  sG     !!##GHHHQ ;<<<<<r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )a)  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDVALIDITY} response, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fires with a C{dict}
        including the value associated with the C{'UIDVALIDITY'} key.
        s#   * OK [UIDVALIDITY 12345] UIDs validFr5  )r  rU  Nr  r  s     r4   test_uidvalidityz$SelectionTestsMixin.test_uidvalidity@  se     !!##=>>>  ##E%%P%P	
 	
 	
 	
 	
r6   c                    |                                  }|                     d           |                     |t          j                   dS )a  
        If the server returns a non-integer UIDVALIDITY value in its response to
        a I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s!   * OK [UIDVALIDITY foo] UIDs validNr  r  s     r4   test_nonIntegerUIDVALIDITYz.SelectionTestsMixin.test_nonIntegerUIDVALIDITYM  sG     !!##;<<<Q ;<<<<<r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )a!  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDNEXT} response, the L{Deferred} returned by L{IMAP4Client.select}
        or L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UIDNEXT'} key.
        s&   * OK [UIDNEXT 4392] Predicted next UIDFi(  )r  rT  Nr  r  s     r4   test_uidnextz SelectionTestsMixin.test_uidnextX  se     !!##@AAA  ##Ed%K%K	
 	
 	
 	
 	
r6   c                    |                                  }|                     d           |                     |t          j                   dS )a  
        If the server returns a non-integer UIDNEXT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s%   * OK [UIDNEXT foo] Predicted next UIDNr  r  s     r4   test_nonIntegerUIDNEXTz*SelectionTestsMixin.test_nonIntegerUIDNEXTe  sG     !!##?@@@Q ;<<<<<r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{FLAGS} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'FLAGS'} key.
        s2   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)F)rK  z\Flaggedr  r  z\Draft)r  r  Nr  r  s     r4   
test_flagszSelectionTestsMixin.test_flagsp  sk     !!##QRRR  ###V 	
 	
 	
 	
 	
r6   c                    |                                  }|                     d           |                     |                     |          ddd           dS )r
  sN   * OK [PERMANENTFLAGS (\Starred)] Just one permanent flag in that list up thereF)z\Starred)r  PERMANENTFLAGSNr  r  s     r4   test_permanentflagsz'SelectionTestsMixin.test_permanentflags  sp     !!##"	
 	
 	
 	  ## NCC	
 	
 	
 	
 	
r6   c                    |                                  }|                     d           |                     |                     |          ddi           dS )z
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with unrecognized response code text, parsing does not fail.
        s3   * OK [X-MADE-UP] I just made this response text up.r  FNr  r  s     r4   test_unrecognizedOkz'SelectionTestsMixin.test_unrecognizedOk  sY    
 !!##MNNN 	--a00<2GHHHHHr6   c                    |                                  }|                     d           |                     |                     |          ddi           dS )z
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with no response code text, parsing does not fail.
        s   * OKr  FNr  r  s     r4   test_bareOkzSelectionTestsMixin.test_bareOk  sV    
 !!##w--a00<2GHHHHHr6   N)rs   rt   ru   r2  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r1   r6   r4   r  r    s        
  

 

 

	V 	V 	V	= 	= 	=	V 	V 	V	= 	= 	=	V 	V 	V	= 	= 	=
 
 
	= 	= 	=
 
 
	= 	= 	=
 
 
"
 
 
"	I 	I 	II I I I Ir6   r  c                      e Zd ZdZdZdZdS )IMAP4ClientExamineTestsa  
    Tests for the L{IMAP4Client.examine} method.

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

        S: * 17 EXISTS
        S: * 2 RECENT
        S: * OK [UNSEEN 8] Message 8 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS ()] No permanent flags permitted
        S: A932 OK [READ-ONLY] EXAMINE completed
    r  s   EXAMINENrs   rt   ru   r2  r  r  r1   r6   r4   r  r    s$          FGGGr6   r  c                      e Zd ZdZdZdZdS )IMAP4ClientSelectTestsa  
    Tests for the L{IMAP4Client.select} method.

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

        C: A142 SELECT INBOX
        S: * 172 EXISTS
        S: * 1 RECENT
        S: * OK [UNSEEN 12] Message 12 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
        S: A142 OK [READ-WRITE] SELECT completed
    r  s   SELECTNr  r1   r6   r4   r  r    s$           FGGGr6   r  c                  *    e Zd ZdZd Zd Zd Zd ZdS )IMAP4ClientExpungeTestsa  
    Tests for the L{IMAP4Client.expunge} method.

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

        C: A202 EXPUNGE
        S: * 3 EXPUNGE
        S: * 3 EXPUNGE
        S: * 5 EXPUNGE
        S: * 8 EXPUNGE
        S: A202 OK EXPUNGE completed
    c                    | j                                         }|                     | j                                        d           | j                                         |S )Ns   0001 EXPUNGE
)r  r  rB   r  r  r  r  s     r4   _expungez IMAP4ClientExpungeTests._expunge  sS    K!!--//1DEEEr6   c                    |D ]-}| j                             t          d| d                     .| j                             d           d S )Nz* z EXPUNGEs   0001 OK EXPUNGE COMPLETED)r  r  r)   )rE   sequenceNumbersnumbers      r4   r  z!IMAP4ClientExpungeTests._response  s]    % 	K 	KFK$$]3H3H3H3H%I%IJJJJ  !=>>>>>r6   c                    |                                  }|                     g d           |                     |                     |          g d           dS )z
        L{IMAP4Client.expunge} sends the I{EXPUNGE} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )r   r   r   r   N)r  r  rB   r  r  s     r4   test_expungez$IMAP4ClientExpungeTests.test_expunge  sU     MMOO|||$$$--a00,,,?????r6   c                    |                                  }|                     g d           |                     |t          j                   dS )z
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.expunge}
        fails with L{IllegalServerResponse}.
        )r   r   rG  r   N)r  r  r  r   r  r  s     r4   test_nonIntegerExpungedz/IMAP4ClientExpungeTests.test_nonIntegerExpunged  sI     MMOO'''(((Q ;<<<<<r6   N)rs   rt   ru   r2  r  r  r   r"  r1   r6   r4   r  r    s]           ? ? ?
@ @ @= = = = =r6   r  c                  *    e Zd ZdZd Zd Zd Zd ZdS )IMAP4ClientSearchTestsa  
    Tests for the L{IMAP4Client.search} method.

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

        C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"
        S: * SEARCH 2 84 882
        S: A282 OK SEARCH completed
        C: A283 SEARCH TEXT "string not in mailbox"
        S: * SEARCH
        S: A283 OK SEARCH completed
        C: A284 SEARCH CHARSET UTF-8 TEXT {6}
        C: XXXXXX
        S: * SEARCH 43
        S: A284 OK SEARCH completed
    c                    | j                             t          j        d                    }|                     | j                                        d           |S )NABCDEF)rF   s   0001 SEARCH (TEXT "ABCDEF")
)r  searchr   r  rB   r  r  r  s     r4   _searchzIMAP4ClientSearchTests._search  sN    Ku{999::--//1STTTr6   c                    | j                             dt          d                    t	          t
          |                              z              | j                             d           d S )Ns	   * SEARCH  s   0001 OK SEARCH completed)r  r  r)   r   mapr   )rE   messageNumberss     r4   r  z IMAP4ClientSearchTests._response  sa      =#c>2J2J)K)KLLL	
 	
 	
 	  !<=====r6   c                    |                                  }|                     g d           |                     |                     |          g d           dS )z
        L{IMAP4Client.search} sends the I{SEARCH} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )r   r   r   N)r(  r  rB   r  r  s     r4   test_searchz"IMAP4ClientSearchTests.test_search  sU     LLNNzzz"""--a00***=====r6   c                    |                                  }|                     g d           |                     |t          j                   dS )z
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.search}
        fails with L{IllegalServerResponse}.
        )r   rG  r   N)r(  r  r  r   r  r  s     r4   test_nonIntegerFoundz+IMAP4ClientSearchTests.test_nonIntegerFound%  sF     LLNN~~~&&&Q ;<<<<<r6   N)rs   rt   ru   r2  r(  r  r.  r0  r1   r6   r4   r$  r$    sZ         "  
> > >> > >= = = = =r6   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d Zd Zd Zd Zd Zd Zd Zd ZdS )IMAP4ClientFetchTestszV
    Tests for the L{IMAP4Client.fetch} method.

    See RFC 3501, section 6.4.5.
    c                   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           | j                             d           | j                             d           | j                             d           |                     |                     |          dd	idd
iddiddid           dS )a  
        L{IMAP4Client.fetchUID} sends the I{FETCH UID} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'UID'} to that message's I{UID} in the server's
        response.
        1:7   0001 FETCH 1:7 (UID)
   * 2 FETCH (UID 22)s   * 3 FETCH (UID 23)   * 4 FETCH (UID 24)s   * 5 FETCH (UID 25)   0001 OK FETCH completedr  22232425r   r   r   r   N)r  fetchUIDrB   r  r  r  r  r  s     r4   test_fetchUIDz#IMAP4ClientFetchTests.test_fetchUID7  s    K  ''--//1LMMM  !6777  !6777  !6777  !6777  !;<<<  ##5$-UDMudmTT	
 	
 	
 	
 	
r6   c                <   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           |                     |t          j                   dS )z
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.fetchUID}
        fails with L{IllegalServerResponse}.
        r   s   0001 FETCH 1 (UID)
s   * foo FETCH (UID 22)r8  N	r  r>  rB   r  r  r  r  r   r  r  s     r4   test_fetchUIDNonIntegerFoundz2IMAP4ClientFetchTests.test_fetchUIDNonIntegerFoundJ  s     K  %%--//1JKKK  !8999  !;<<<Q ;<<<<<r6   c                   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           | j                             d           | j                             d           |                     |t          j                   dS )z
        If the server responds with an incomplete I{FETCH} response line, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        r4  r5  r6  s   * 3 FETCH (UID)r7  r8  NrA  r  s     r4   test_incompleteFetchUIDResponsez5IMAP4ClientFetchTests.test_incompleteFetchUIDResponseV  s     K  ''--//1LMMM  !6777  !3444  !6777  !;<<<Q ;<<<<<r6   c                V   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          dddii           dS )	a  
        L{IMAP4Client.fetchBody} sends the I{FETCH BODY} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'RFC822.TEXT'} to that message's body as given in
        the server's response.
        3s   0001 FETCH 3 (RFC822.TEXT)
s&   * 3 FETCH (RFC822.TEXT "Message text")r8  r   r  zMessage textN)r  	fetchBodyrB   r  r  r  r  r  s     r4   test_fetchBodyz$IMAP4ClientFetchTests.test_fetchBodyd  s     K!!#&&--//1RSSS  !JKKK  !;<<<--a001}n6U2VWWWWWr6   c                Z   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          ddg dggi           dS )	aI  
        L{IMAP4Client.fetchSpecific} sends the I{BODY[]} command if no
        parameters beyond the message set to retrieve are given.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        7   0001 FETCH 7 BODY[]
s   * 7 FETCH (BODY[] "Some body")r8  r   r  	Some bodyNr  r  rB   r  r  r  r  r  s     r4   test_fetchSpecificz(IMAP4ClientFetchTests.test_fetchSpecificq  s     K%%c**--//1KLLL  !BCCC  !;<<<--a001K7P6Q2RSSSSSr6   c                ^   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          ddg d	ggi           d
S )z
        L{IMAP4Client.fetchSpecific} issues a I{BODY.PEEK[]} command if passed
        C{True} for the C{peek} parameter.
        6T)r  s   0001 FETCH 6 BODY.PEEK[]
s   * 6 FETCH (BODY[] "Some body")r8  r   r  rL  NrM  r  s     r4   test_fetchSpecificPeekz,IMAP4ClientFetchTests.test_fetchSpecificPeek  s    
 K%%c%55--//1PQQQ  !BCCC  !;<<<--a001K7P6Q2RSSSSSr6   c                `   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          ddd	gd
ggi           dS )a;  
        L{IMAP4Client.fetchSpecific}, when passed a sequence for
        C{headerNumber}, sends the I{BODY[N.M]} command.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        rJ  r   headerNumbers   0001 FETCH 7 BODY[1.2.3]
s#   * 7 FETCH (BODY[1.2.3] "Some body")r8  r   r  z1.2.3rL  NrM  r  s     r4   test_fetchSpecificNumberedz0IMAP4ClientFetchTests.test_fetchSpecificNumbered  s     K%%c	%BB--//1PQQQ  !GHHH  !;<<<  ##a6G9k*J)K%L	
 	
 	
 	
 	
r6   c                `   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          dddgd	ggi           d
S )a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'TEXT'} for C{headerType},
        sends the I{BODY[TEXT]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        8TEXTr     0001 FETCH 8 BODY[TEXT]
s"   * 8 FETCH (BODY[TEXT] "Some body")r8  r   r  rL  NrM  r  s     r4   test_fetchSpecificTextz,IMAP4ClientFetchTests.test_fetchSpecificText       K%%cf%==--//1OPPP  !FGGG  !;<<<  ##a6F8[*I)J%K	
 	
 	
 	
 	
r6   c                b   | j                             ddd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          dd	d
gdggi           dS )ah  
        If passed a value for the C{headerNumber} parameter and C{'TEXT'} for
        the C{headerType} parameter, L{IMAP4Client.fetchSpecific} sends a
        I{BODY[number.TEXT]} request and returns a L{Deferred} which fires with
        a C{dict} mapping message sequence numbers to C{list}s of message data
        given by the server's response.
        4rX  r   )r  rT  s   0001 FETCH 4 BODY[7.TEXT]
s$   * 4 FETCH (BODY[7.TEXT] "Some body")r8  r   r  z7.TEXTrL  NrM  r  s     r4   test_fetchSpecificNumberedTextz4IMAP4ClientFetchTests.test_fetchSpecificNumberedText  s     K%%cf1%MM--//1QRRR  !HIII  !;<<<  ##a6H:{*K)L%M	
 	
 	
 	
 	
r6   c                @   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |t          j                   dS )z
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]} tokens, the L{Deferred}
        returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rW  rX  rY  rZ  s   * 8 FETCH (BODY[TEXT])r8  N	r  r  rB   r  r  r  r  r   r  r  s     r4   (test_incompleteFetchSpecificTextResponsez>IMAP4ClientFetchTests.test_incompleteFetchSpecificTextResponse  s     K%%cf%==--//1OPPP  !:;;;  !;<<<Q ;<<<<<r6   c                `   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          dddgd	ggi           d
S )a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'MIME'} for C{headerType},
        sends the I{BODY[MIME]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        rW  r  rY  s   0001 FETCH 8 BODY[MIME]
s"   * 8 FETCH (BODY[MIME] "Some body")r8  r   r  rL  NrM  r  s     r4   test_fetchSpecificMIMEz,IMAP4ClientFetchTests.test_fetchSpecificMIME  r\  r6   c                f   | j                             dddd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          d	d
dgddggi           dS )aX  
        L{IMAP4Client.fetchSpecific}, when passed C{offset} and C{length},
        sends a partial content request (like I{BODY[TEXT]<offset.length>}).
        It returns a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data given by the
        server's response.
        9rX  rE  r   )r  offsetlengths   0001 FETCH 9 BODY[TEXT]<17.3>
s    * 9 FETCH (BODY[TEXT]<17> "foo")r8  r   r  z<17>rG  NrM  r  s     r4   test_fetchSpecificPartialz/IMAP4ClientFetchTests.test_fetchSpecificPartial  s     K%%cfRPQ%RR--//1UVVV  !DEEE  !;<<<  ##a6F8VU*K)L%M	
 	
 	
 	
 	
r6   c                @   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |t          j                   dS )a  
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]<offset>} tokens, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rW  rX  rY  rZ  s   * 8 FETCH (BODY[TEXT]<17>)r8  Nra  r  s     r4   +test_incompleteFetchSpecificPartialResponsezAIMAP4ClientFetchTests.test_incompleteFetchSpecificPartialResponse  s     K%%cf%==--//1OPPP  !>???  !;<<<Q ;<<<<<r6   c                Z   | j                             d          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          ddg dggi           dS )	aA  
        If the body of a message begins with I{<} and ends with I{>} (as,
        for example, HTML bodies typically will), this is still interpreted
        as the body by L{IMAP4Client.fetchSpecific} (and particularly, not
        as a length indicator for a response to a request for a partial
        body).
        rJ  rK  s&   * 7 FETCH (BODY[] "<html>test</html>")r8  r   r  z<html>test</html>NrM  r  s     r4   test_fetchSpecificHTMLz,IMAP4ClientFetchTests.test_fetchSpecificHTML  s     K%%c**--//1KLLL  !JKKK  !;<<<  ##a627J*K)L%M	
 	
 	
 	
 	
r6   c                   | j                             d|          }|                     | j                                        d|                    d          z   dz              | j                             d|                    d          z   dz              | j                             d           |                     |                     |          d	d
|g gdggi           dS )a  
        Assert that the provided C{BODY} section, when invoked with no
        arguments, produces an empty list, and that it returns a
        L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.

        @param section: The C{BODY} section to test: either
            C{'HEADER.FIELDS'} or C{'HEADER.FIELDS.NOT'}
        @type section: L{str}
        10rY  s   0001 FETCH 10 BODY[r  s    ()]
s   * 10 FETCH (BODY[s    ()] "")r8  r   r  r)  N)r  r  rB   r  r  rC   r  r  )rE   sectionr   s      r4   &assertFetchSpecificFieldsWithEmptyListz<IMAP4ClientFetchTests.assertFetchSpecificFieldsWithEmptyList  s     K%%dw%??N  """W^^G%<%<<{J	
 	
 	
 	   7>>'#:#::[H	
 	
 	
 	  !;<<<--a002'2PR8S7T2UVVVVVr6   c                0    |                      d           dS )az  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER.FIELDS'}
        for C{headerType} but no C{headerArgs}, sends the
        I{BODY[HEADER.FIELDS]} command with no arguments.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        r  Nrq  rR   s    r4   ,test_fetchSpecificHeaderFieldsWithoutHeaderszBIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsWithoutHeaders  s     	33ODDDDDr6   c                0    |                      d           dS )a  
        L{IMAP4Client.fetchSpecific}, when passed
        C{'HEADER.FIELDS.NOT'} for C{headerType} but no C{headerArgs},
        sends the I{BODY[HEADER.FIELDS.NOT]} command with no
        arguments.  It returns a L{Deferred} which fires with a
        C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        zHEADER.FIELDS.NOTNrs  rR   s    r4   /test_fetchSpecificHeaderFieldsNotWithoutHeaderszEIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsNotWithoutHeaders'  s     	334GHHHHHr6   c                `   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |                     |          dddgd	ggi           d
S )a=  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER'} for
        C{headerType}, sends the I{BODY[HEADER]} command.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        11HEADERrY  s   0001 FETCH 11 BODY[HEADER]
sJ   * 11 FETCH (BODY[HEADER] "From: someone@localhost
Subject: Some subject")r8  r@  r  z.From: someone@localhost
Subject: Some subjectNrM  r  s     r4   test_fetchSpecificHeaderz.IMAP4ClientFetchTests.test_fetchSpecificHeader2  s     K%%dx%@@--//1RSSS  D	
 	
 	
 	  !;<<<  ##!
J	
 	
 	
 	
 	
r6   N)rs   rt   ru   r2  r?  rB  rD  rH  rN  rQ  rU  r[  r_  rb  rd  ri  rk  rm  rq  rt  rv  rz  r1   r6   r4   r2  r2  0  s>        
 
 
&
= 
= 
== = =X X XT T T
T 
T 
T
 
 
 
 
 

 
 
 = = =
 
 

 
 
 = = =
 
 
 W W W2	E 	E 	E	I 	I 	I
 
 
 
 
r6   r2  c                  ^    e Zd ZdZ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dS )IMAP4ClientStoreTestsa  
    Tests for the L{IMAP4Client.setFlags}, L{IMAP4Client.addFlags}, and
    L{IMAP4Client.removeFlags} methods.

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

        C: A003 STORE 2:4 +FLAGS (\Deleted)
        S: * 2 FETCH (FLAGS (\Deleted \Seen))
        S: * 3 FETCH (FLAGS (\Deleted))
        S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
        S: A003 OK STORE completed
    c                r    t          | j        |          ddd          }|                     | j                                        d|z   dz              | j                            d           | j                            d           |                     |                     |          dd	d
dgii           dS )am  
        Test a non-silent flag modifying method.  Call the method, assert that
        the correct bytes are sent, deliver a I{FETCH} response, and assert
        that the result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  \Readr  F   0001 STORE 3     (\Read \Seen)
s   * 3 FETCH (FLAGS (\Read \Seen))   0001 OK STORE completedr   r  r  r  Nr  r  rB   r  r  r  r  rE   r  itemr   s       r4   
_flagsTestz IMAP4ClientStoreTests._flagsTest`  s     )GDK((.BEJJN  ""$4t$;>U$U	
 	
 	
 	  !EFFF  !;<<<--a001w8@T6U2VWWWWWr6   c                2    t          | j        |          ddd          }|                     | j                                        d|z   dz              | j                            d           |                     |                     |          i            dS )ag  
        Test a silent flag modifying method.  Call the method, assert that the
        correct bytes are sent, deliver an I{OK} response, and assert that the
        result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  r~  Tr  r  r  Nr  r  s       r4   _flagsSilentlyTestz(IMAP4ClientStoreTests._flagsSilentlyTestq  s     )GDK((.BDIIN  ""$4t$;>U$U	
 	
 	
 	  !;<<<--a00"55555r6   c                    t          | j        |          ddd          }|                     | j                                        d|z   dz              | j                            d           | j                            d           |                     |                     |          i            |                     | j        j        dd	d
gi           dS )a  
        Test unsolicited data received in response to a silent flag modifying
        method.  Call the method, assert that the correct bytes are sent,
        deliver the unsolicited I{FETCH} response, and assert that the result
        of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  r~  Tr  r  s   * 2 FETCH (FLAGS (\Read \Seen))r  r   r  r  N)r  r  rB   r  r  r  r  r  r  s       r4   %_flagsSilentlyWithUnsolicitedDataTestz;IMAP4ClientStoreTests._flagsSilentlyWithUnsolicitedDataTest  s     )GDK((.BDIIN  ""$4t$;>U$U	
 	
 	
 	  !EFFF  !;<<<--a00"555*Q80D,EFFFFFr6   c                2    |                      dd           dS )aQ  
        When passed a C{False} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a I{FLAGS} data
        item and returns a L{Deferred} which fires with a C{dict} mapping
        message sequence numbers to C{dict}s mapping C{'FLAGS'} to the new
        flags of those messages.
        setFlagsr  Nr  rR   s    r4   test_setFlagsz#IMAP4ClientStoreTests.test_setFlags  s     	
H-----r6   c                2    |                      dd           dS )z
        When passed a C{True} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a
        I{FLAGS.SILENT} data item and returns a L{Deferred} which fires with an
        empty dictionary.
        r     FLAGS.SILENTNr  rR   s    r4   test_setFlagsSilentlyz+IMAP4ClientStoreTests.test_setFlagsSilently  s      	
O<<<<<r6   c                2    |                      dd           dS )z
        If unsolicited flag data is received in response to a I{STORE}
        I{FLAGS.SILENT} request, that data is passed to the C{flagsChanged}
        callback.
        r  r  Nr  rR   s    r4   (test_setFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_setFlagsSilentlyWithUnsolicitedData  s      	22:OOOOOr6   c                2    |                      dd           dS )z{
        L{IMAP4Client.addFlags} is like L{IMAP4Client.setFlags}, but sends
        I{+FLAGS} instead of I{FLAGS}.
        addFlagss   +FLAGSNr  rR   s    r4   test_addFlagsz#IMAP4ClientStoreTests.test_addFlags  s    
 	
I.....r6   c                2    |                      dd           dS )z
        L{IMAP4Client.addFlags} with a C{True} value for C{silent} behaves like
        L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{+FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        r     +FLAGS.SILENTNr  rR   s    r4   test_addFlagsSilentlyz+IMAP4ClientStoreTests.test_addFlagsSilently  s!     	
,<=====r6   c                2    |                      dd           dS )z
        L{IMAP4Client.addFlags} behaves like L{IMAP4Client.setFlags} when used
        in silent mode and unsolicited data is received.
        r  r  Nr  rR   s    r4   (test_addFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_addFlagsSilentlyWithUnsolicitedData  s!    
 	22:?OPPPPPr6   c                2    |                      dd           dS )z~
        L{IMAP4Client.removeFlags} is like L{IMAP4Client.setFlags}, but sends
        I{-FLAGS} instead of I{FLAGS}.
        removeFlagss   -FLAGSNr  rR   s    r4   test_removeFlagsz&IMAP4ClientStoreTests.test_removeFlags  s    
 	y11111r6   c                2    |                      dd           dS )z
        L{IMAP4Client.removeFlags} with a C{True} value for C{silent} behaves
        like L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{-FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        r     -FLAGS.SILENTNr  rR   s    r4   test_removeFlagsSilentlyz.IMAP4ClientStoreTests.test_removeFlagsSilently  s!     	/?@@@@@r6   c                2    |                      dd           dS )z
        L{IMAP4Client.removeFlags} behaves like L{IMAP4Client.setFlags} when
        used in silent mode and unsolicited data is received.
        r  r  Nr  rR   s    r4   +test_removeFlagsSilentlyWithUnsolicitedDatazAIMAP4ClientStoreTests.test_removeFlagsSilentlyWithUnsolicitedData  s!    
 	22=BRSSSSSr6   N)rs   rt   ru   r2  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1   r6   r4   r|  r|  O  s          (NX X X"6 6 6 G G G&. . .= = =P P P/ / /> > >Q Q Q2 2 2A A AT T T T Tr6   r|  c                      e Zd ZdZd Zd ZdS )IMAP4ClientStatusTestsa_  
    Tests for the L{IMAP4Client.status} method.

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

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

    @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
    c                    |                      t          | j        j        dd          }|                     t          |          dt          dh          z              dS )z
        Only allow sending the C{STATUS} names defined in RFC 3501.

        @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
        rX  zIMPOSSIBLE?!zUnknown names: N)r   r  r  rh  rB   r   r   )rE   excs     r4   testUnknownNamez&IMAP4ClientStatusTests.testUnknownName  s_     K	
 
 	S#4t^<L7M7M#MNNNNNr6   c                >   | j                             dd          }|                     | j                                        d           | j                             d           | j                             d           |                     |t          j                   dS )z
        C{STATUS} names that cannot be decoded as ASCII cause the
        status Deferred to fail with L{IllegalServerResponse}
        blurdyblooprR  s$   0001 STATUS blurdybloop (MESSAGES)
s?   * STATUS blurdybloop (MESSAGES 1 ASCIINAME "OK" NOTASCII "NO")s   0001 OK STATUS completedN)	r  rh  rB   r  r  r  r  r   r  r  s     r4   testUndecodableNamez*IMAP4ClientStatusTests.testUndecodableName  s     K}j99N  ""5	
 	
 	

 	  U	
 	
 	
 	  !<===Q ;<<<<<r6   N)rs   rt   ru   r2  r  r  r1   r6   r4   r  r    s?         O O O= = = = =r6   r  c                  .    e Zd ZdZeZd Zd Zd Zd Z	dS )IMAP4ClientCopyTestsz
    Tests for the L{IMAP4Client.copy} method.

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

        C: A003 COPY 2:4 MEETING
        S: A003 OK COPY completed
    c                $   | j                             ddd          }|                     | j                                        d           | j                             d           |                     |                     |          g df           dS )	z
        L{IMAP4Client.copy} copies the messages identified by their
        sequence numbers to the mailbox, returning a L{Deferred} that
        succeeds with a true value.
        r   MEETINGFr     0001 COPY 2:3 MEETING
   0001 OK COPY completed   OK COPY completedNr  copyrB   r  r  r  r  r  s     r4   test_copySequenceNumbersz-IMAP4ClientCopyTests.test_copySequenceNumbers  s     KUI599N  ""(	
 	
 	

 	  !:;;;--a0027K2LMMMMMr6   c                >   | j                             ddd          }|                     | j                                        d           | j                             d           |                     |                     |          j        t          j	                   dS )z
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        sequence numbers could not be copied to the mailbox.
        r   r  Fr  r     0001 BAD COPY failedN
r  r  rB   r  r  r  r  r  r   r  r  s     r4   test_copySequenceNumbersFailsz2IMAP4ClientCopyTests.test_copySequenceNumbersFails(  s     KUI599N  ""(	
 	
 	

 	  !8999d22155;U=QRRRRRr6   c                $   | j                             ddd          }|                     | j                                        d           | j                             d           |                     |                     |          g df           dS )	z
        L{IMAP4Client.copy} copies the messages identified by their
        UIDs to the mailbox, returning a L{Deferred} that succeeds
        with a true value.
        r   r  Tr     0001 UID COPY 2:3 MEETING
r  r  Nr  r  s     r4   test_copyUIDsz"IMAP4ClientCopyTests.test_copyUIDs8  s     KUI488N  "",	
 	
 	

 	  !:;;;--a0027K2LMMMMMr6   c                >   | j                             ddd          }|                     | j                                        d           | j                             d           |                     |                     |          j        t          j	                   dS )z
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        UIDs could not be copied to the mailbox.
        r   r  Tr  r  r  Nr  r  s     r4   test_copyUIDsFailsz'IMAP4ClientCopyTests.test_copyUIDsFailsH  s     KUI488N  "",	
 	
 	

 	  !8999d22155;U=QRRRRRr6   N)
rs   rt   ru   r2  r  r  r  r  r  r  r1   r6   r4   r  r    so          (NN N N S S S N N N S S S S Sr6   r  c                      e Zd ZdZdZd ZdS )FakeyServerr  Nc                    d S r0   r1   rR   s    r4   sendServerGreetingzFakeyServer.sendServerGreeting]  r  r6   )rs   rt   ru   rV  timeoutr  r1   r6   r4   r  r  Y  s-        EG    r6   r  c                  H    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S )r   )r   r  r  _bodyr  c                    || _         || _        || _        t          |          | _        || _        || _        || _        d S r0   )r   r  r  r   sizer  r  subpart)rE   r   r  r  r   r  r  s          r4   rz   zFakeyMessage.__init__e  s=    

II		r6   c                "    ||f| _         | j        S r0   )got_headersr   )rE   r  r  s      r4   
getHeaderszFakeyMessage.getHeadersn  s    !5=|r6   c                    | j         S r0   rn  rR   s    r4   ro  zFakeyMessage.getFlagsr  rp  r6   c                    | j         S r0   )r  rR   s    r4   getInternalDatezFakeyMessage.getInternalDateu  
    yr6   c                *    t          | j                  S r0   )r   r  rR   s    r4   getBodyFilezFakeyMessage.getBodyFilex  s    tz"""r6   c                    | j         S r0   )r  rR   s    r4   getSizezFakeyMessage.getSize{  r  r6   c                    | j         S r0   r  rR   s    r4   r  zFakeyMessage.getUID~  s	    xr6   c                    | j         d uS r0   )r  rR   s    r4   isMultipartzFakeyMessage.isMultipart  s    |4''r6   c                *    || _         | j        |         S r0   )got_subpartr  )rE   r  s     r4   
getSubPartzFakeyMessage.getSubPart  s    |D!!r6   N)rs   rt   ru   showAttributesrz   r  ro  r  r  r  r  r  r  r1   r6   r4   r   r   a  s        AN        # # #    ( ( (" " " " "r6   r   c                  <    e Zd ZdZdZd Zd Zd Zd Zd Z	d	dZ
dS )
NewStoreTestsNc                    d x| _         | _        t          j                    | _        d| j        _        | | j        _        t          j                    | _	        t          | j	                  | _        d S Nr  )received_messagesreceived_uidr   r  r  rV  r_  r   r   r  r  r  rR   s    r4   r  zNewStoreTests.setUp  sZ    599!2'))$))"4>22r6   c                    d S r0   r1   rE   r[  s     r4   ri  zNewStoreTests.addListener  r  r6   c                    d S r0   r1   r  s     r4   rk  zNewStoreTests.removeListener  r  r6   c                "    ||f| _         | j        S r0   )	storeArgsr  )rE   r  r  s      r4   r  zNewStoreTests.store  s    r}r6   c                f     fd} fd} j                             t          |                                        |                               j                                       j                    fd}t          j         j         j	        d          }|                    |           |S )Nc                 \                           j         j         j         j                  S r0   )functionr   r  silentr  rR   s   r4   r  z+NewStoreTests._storeWork.<locals>.connected  s#    ==
DKRRRr6   c                    | _         d S r0   r2   RrE   s    r4   r2   z(NewStoreTests._storeWork.<locals>.result      DKKKr6   c                                         j        j                                        j        j                   d S r0   )rB   r2   rg  r  expectedArgsrX  rE   s    r4   r  z'NewStoreTests._storeWork.<locals>.check  s>    T[$-888T^T->?????r6   Fnoisy
r  r   r7   r
  r+  r  r#   loopbackTCPr  r  )rE   r  r2   r  r   s   `    r4   
_storeWorkzNewStoreTests._storeWork  s    	S 	S 	S 	S 	S	 	 	 	 	 	""5#3#344@@HHTT	
 	

*T_
%
%
%	@ 	@ 	@ 	@ 	@  dkGGG	er6   r   c                   | j         j        | _        d| _        g d| _        d| _        || _        g dg dg dd| _        dg didg didg did| _        t          j
                    }|                    d           |                    d           |                    d           |g dd	fd
d	if| _        |                                 S )Nz1,5,9)z\Az\BCF)r   r   r   r  r   r   r   r   r  )r  r  r  r   r  r  r  r  rg  r   r   r   r  r  )rE   r  r   s      r4   testSetFlagszNewStoreTests.testSetFlags  s   ,(((
"""""""""
 
 ,,,-,,,-,,,-
 

   








!#6#6#6:UAJG   r6   r  )rs   rt   ru   r2   r  r  ri  rk  r  r  r  r1   r6   r4   r  r    s}        FI3 3 3        &! ! ! ! ! !r6   r  c                  H    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S )GetBodyStructureTestsz
    Tests for L{imap4.getBodyStructure}, a helper for constructing a list which
    directly corresponds to the wire information needed for a I{BODY} or
    I{BODYSTRUCTURE} response.
    c                    d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   |||ddd|dd          }t          j        |          }	|                     ||d|ddg|||t	          |          g|	           dS )z
        L{imap4.getBodyStructure} accepts a L{IMessagePart} provider and returns
        a list giving the basic fields for the I{BODY} response for that
        message.
           hello, worldimagejpegus-asciisome kind of idgreat justicemaximumrP  
; charset=; x=yr   
content-idcontent-descriptioncontent-transfer-encodingr1   r6   r   Ncharsetr[  yr   r   getBodyStructurerB   r   
rE   r   majorminorr  rO  descriptionr  r   	structures
             r4   test_singlePartz%GetBodyStructureTests.test_singlePart  s     &
% %e 3l BW Lw V('2-5	  
 
 *3//	GS#.D		 	
 	
 	
 	
 	
r6   c                T   t          i ddddd          }t          j        |          }|dd         \  }}|                     d|           |                     d|           t          ddiddddd          }t          j        |          }|dd         \  }}|                     d|           |                     d|           t          ddiddddd          }	t          j        |	          }
|
dd         \  }}|                     d|           |                     d|           dS )	z
        L{imap4.getBodyStructure} returns L{None} for the major and
        minor MIME types of a L{IMessagePart} provider whose headers
        lack a C{Content-Type}, or have an empty value for it.
        r1   r6   r   Nr   r   r)  
)r   r   r  assertIs)rE   missingmissingContentTypeStructuremissingMajormissingMinorr  emptyContentTypeStructure
emptyMajor
emptyMinornewlinenewlineContentTypeStructurenewlineMajornewlineMinors                r4   test_emptyContentTypez+GetBodyStructureTests.test_emptyContentType  s=    r2sCd;;&+&<W&E&E#%@!%D"ldL)))dL)))nb12sCdKK$)$:5$A$A!!:2A2!>
JdJ'''dJ'''5r3S$OO&+&<W&E&E#%@!%D"ldL)))dL)))))r6   c                    t          ddiddddd          }t          j        |          }|dd         \  }}|                     |d           |                     |d           dS )z
        L{imap4.getBodyStructure} returns only a non-L{None} major
        MIME type for a L{IMessagePart} provider whose headers only
        have a main a C{Content-Type}.
        r   mainr1   r6   r   Nr   )r   r   r  rB   r  )rE   r&  mainStructure	mainMajor	mainMinors        r4   test_onlyMajorContentTypez/GetBodyStructureTests.test_onlyMajorContentType  ss     ^V4b#sCNN.t44,RaR0	9F+++i&&&&&r6   c                   d}d}d}d}d}d}d}d}t          |d	z   |z   d
z   |z   dz   ||||dddddd|dd          }	t          j        |	d          }
|                     ||d|ddg|||t	          |          |dg dgddg|
           dS )z
        L{imap4.getBodyStructure} returns a list giving the basic and extended
        fields for a I{BODYSTRUCTURE} response if passed C{True} for the
        C{extended} parameter.
        r  r   r  r  r  r  r  abcdefabcdefrP  r  r  zattachment; name=foo; size=barfrFrancer   r	  r
  r  content-md5content-dispositioncontent-languagecontent-locationr1   r)  r   NTextendedr  r[  r  
attachment)r  rG  r  rH  r  )rE   r   r  r  r  rO  r  r  md5r   r  s              r4   test_singlePartExtendedz-GetBodyStructureTests.test_singlePartExtended  s    &
% %e 3l BW Lw V('2-5"'G$($,	 	 
 
" *3>>>	GS#.D		===> 	
 	
 	
 	
 	
r6   c                    d}d}d}t          d|dz   |z   idd|dd	          }t          j        |d
          }|                     ||d	d	d	d	t	          |          d	d	d	d	g|           d	S )z
        For fields with no information contained in the message headers,
        L{imap4.getBodyStructure} fills in L{None} values in its result.
        r   r  r  r   rP  r1   r6   r   NTr4  r  )rE   r  r  r   r   r  s         r4   test_singlePartWithMissingz0GetBodyStructureTests.test_singlePartWithMissingO  s    
 US[5012sD#t
 
 *3>>>	E4tT3t99dD$PTU	
 	
 	
 	
 	
r6   c                6   d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   |||ddd|dd          }t          j        |          }	|                     ||d|ddg|||t	          |          t	          |                                          g|	           dS )z
        For a I{text/*} message, the number of lines in the message body are
        included after the common single-part basic fields.
        "   hello, world
how are you?
goodbye
rF   r  r  r  r  r  rP  r  r  r  r1   r6   r   Nr  r[  r  )r   r   r  rB   r   rf  r  s
             r4   test_textPartz#GetBodyStructureTests.test_textPart`  s    
 8&
% %e 3l BW Lw V('2-5	  
 
 *3//	GS#.D		DOO%%&&	 	
 	
 	
 	
 	
r6   c                T   d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   dd|||ddd|dd          }t          ddidddd|g          }	t          j        |	          }
|                     dddddddt          j        |          t          j        |          dg
|
           dS )z
        For a I{message/rfc822} message, the common basic fields are followed
        by information about the contained message.
        r<  rF   r  r  r  r  r  rP  r  r  zAlice <alice@example.com>zBob <bob@example.com>)r   r   r   r	  r
  r  r1   r)  r   Nr   message/rfc822r6   r  r  r   r   )r   r   r  rB   getEnvelope)rE   r   r  r  r  rO  r  r  r   	containerr  s              r4   test_rfc822Messagez(GetBodyStructureTests.test_rfc822Message  s   
 8&
% %e 3l BW Lw V3-('2-5  
 
  ! 0 E	
 	
	 *955	!#&&&s++ 	
 	
 	
 	
 	
r6   c           	     2   t          ddddddddd	d
          }t          ddiddddd
          }t          ddidddd||g          }|                     t          j        |          t          j        |          dgt          j        |                     d
S )z
        For a I{multipart/*} message, L{imap4.getBodyStructure} returns a list
        containing the body structure information for each part of the message
        followed by an element giving the MIME subtype of the message.
        zimage/jpeg; x=yr  r  r  r  r1   r6      hello worldr   Nr   ztext/plain; charset=us-ascii
   some stuffA  zmultipart/related+  relatedr   rB   r   r  rE   
oneSubPartanotherSubPartrA  s       r4   test_multiPartz$GetBodyStructureTests.test_multiPart  s     " 1/'6-6	  
 

 & > 	
 	
 ! 3 (	
 	
	 	&z22&~66
 "9--	
 	
 	
 	
 	
r6   c           	     X   t          ddddddddd	d
          }t          ddiddddd
          }t          ddddddddd||g          }|                     t          j        |d          t          j        |d          dddgdddggddgt          j        |d                     d
S )a)  
        When passed a I{multipart/*} message and C{True} for the C{extended}
        argument, L{imap4.getBodyStructure} includes extended structure
        information from the parts of the multipart message and extended
        structure information about the multipart message itself.
        s   image/jpeg; x=ys   some kind of ids   great justices   maximum)   content-types
   content-ids   content-descriptions   content-transfer-encodingr1   r6   rD  r   NrO  s   text/plain; charset=us-asciirE  rF  zmultipart/related; foo=baresSpainzattachment; name=monkeys)r   r2  r3  r1  rG  Tr4  rH  rG  rH  r6  r  monkeysrI  rJ  s       r4   test_multiPartExtendedz,GetBodyStructureTests.test_multiPartExtended  s%    "!31(8.8	  
 

 &!@ 	
 	
 ! <$($+'A	  (
 
	 	&zDAAA&~EEE	23 "9t<<<	
 	
 	
 	
 	
r6   N)rs   rt   ru   r2  r  r$  r*  r8  r:  r=  rB  rM  rS  r1   r6   r4   r  r    s         &
 &
 &
P* * *0
' 
' 
'/
 /
 /
b
 
 
"&
 &
 &
P6
 6
 6
p1
 1
 1
f9
 9
 9
 9
 9
r6   r  c                     e Zd Zd Zd Zd Zd Zd Zd Zd.dZ	d	 Z
d.d
Zd Z ej        ej        d          Z	  ej        ej        d            ej        ej        e           dZn# ej        $ r dZY nw xY w eed          d             Zd.dZd Zd.dZd Zd.dZd.dZd Zd.dZd Zd.dZd Zd Z d.dZ!d Z"d.d Z#d! Z$d.d"Z%d# Z&d$ Z'd% Z(d.d&Z)d' Z*d.d(Z+d) Z,d.d*Z-d+ Z.d.d,Z/d- Z0dS )/NewFetchTestsc                    d x| _         | _        d | _        t          j                    | _        d| j        _        | | j        _        t          j	                    | _
        t          | j
                  | _        d S r  )r  r  r2   r   r  r  rV  r_  r   r   r  r  r  rR   s    r4   r  zNewFetchTests.setUp0  sa    599!2'))$))"4>22r6   c                    d S r0   r1   r  s     r4   ri  zNewFetchTests.addListener:  r  r6   c                    d S r0   r1   r  s     r4   rk  zNewFetchTests.removeListener=  r  r6   c           	         || _         || _        t          t          t	          t          | j                            | j                            S r0   )r  r  iterr   rn   r   msgObjsr  s      r4   r  zNewFetchTests.fetch@  s>    !)Cc$,//00$,??@@@r6   c                    rit          t          t           j                             j                  D ]4\  }}t	          |                                           j        |         d<   5 fd} j                             fd                              |                               j	                  
                     j                   t          j         j         j        d          }|                     fd           |S )Nr  c                    | _         d S r0   r  r  s    r4   r2   z(NewFetchTests._fetchWork.<locals>.resultJ  r  r6   c                :                         j                  S r0   r  r   )r*  rE   r  s    r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>N  s    dmmDM377 r6   Fr  c                D                         j        j                  S r0   rB   r2   rg  )r[  rE   s    r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>T  s     0 0dm L L r6   )r   rn   r   r[  r   r  rg  r  r   r
  r+  r  r#   r  r  r  )rE   r  r   r   r2   r   s   ``    r4   
_fetchWorkzNewFetchTests._fetchWorkE  s    	<eC$5$566EE < <3*-cjjll*;*;a ''	 	 	 	 	 	""77777	
 	

+f

kk$*<==jjO?
 ?
 ?
  dkGGG	LLLLMMMr6   c           
           fd _         d _        t          i ddddd           t          i ddddd           t          i ddddd           g _        dd	idd
iddid _                             d          S )Nc                8    j                             |           S r0   r  r>  )r   urE   s     r4   r5   z,NewFetchTests.testFetchUID.<locals>.<lambda>X  s    T[%9%9!%<%< r6   rJ  r1   r6   r5    u'  r  1234599910101)r   r   r   r   )r  r   r   r[  rg  rb  rR   s   `r4   testFetchUIDzNewFetchTests.testFetchUIDW  s    <<<<Rc5$77Rc355Rc5$77
 wu~w
 

 q!!!r6   r   c           	         | j         j        | _        d| _        t	          i g ddddd           t	          i g ddddd           g| _        dg didg did| _        |                     |          S )	Nrf  )FlagAFlagB\FlagCr6   1  )rp  rn  ro  r5  r  r   r   )r  
fetchFlagsr  r   r   r[  rg  rb  rE   r  s     r4   testFetchFlagszNewFetchTests.testFetchFlagsg  s    .:::CeTRR:::CeTRR

 66676667
 
 s###r6   c                ,    |                      d          S rt  )ru  rR   s    r4   testFetchFlagsUIDzNewFetchTests.testFetchFlagsUIDt  s    ""1%%%r6   c                *   | j         j        | _        d| _        t	          i ddddd           t	          i ddddd           t	          i dddd	d           t	          i dd
ddd           g| _        ddiddiddiddid| _        |                     |          S )N13r1   s   Fri, 02 Nov 2003 21:25:10 GMTr6   iZ  s   Thu, 29 Dec 2013 11:31:52 ESTe   s   Mon, 10 Mar 1992 02:44:30 CST   s   Sat, 11 Jan 2000 14:40:24 PSTi/  r  z02-Nov-2003 21:25:10 +0000z29-Dec-2013 11:31:52 -0500z10-Mar-1992 02:44:30 -0600z11-Jan-2000 14:40:24 -0800)r   r   r   r   )r  fetchInternalDater  r   r   r[  rg  rb  rt  s     r4   testFetchInternalDatez#NewFetchTests.testFetchInternalDatew  s    5R!A3tTTR!A3TRRR!A3TRRR!A3TRR	
  <= <= <= <=	
 
 s###r6   c                ,    |                      d          S rt  )r}  rR   s    r4   testFetchInternalDateUIDz&NewFetchTests.testFetchInternalDateUID  s    ))!,,,r6   N
es_AR.UTF8FTz'The es_AR.UTF8 locale is not installed.c                    t          j        t           j        d          }t          j        t           j        d           |                     t           j        t           j        |           |                     d          S )zC
        The month name in the date is locale independent.
        Nr  r   )locale	setlocaleLC_ALLr  r}  )rE   currentLocales     r4   'test_fetchInternalDateLocaleIndependentz5NewFetchTests.test_fetchInternalDateLocaleIndependent  s\     (==555(&-GGG))!,,,r6   c                    | j         j        | _        d| _        t	          dddddddd	d	d
d           g| _        ddddg dgg dgg dgg dgd d d dg
ii| _        |                     |          S )N15zuser@domainzresu@domainthursdayzit is a messagezid-id-id-yayaya)r   r   r  r   z
message-idr1   r6   ix  r   r  )NNry  domain)NNresur  )r  fetchEnveloper  r   r   r[  rg  rb  rt  s     r4   testFetchEnvelopezNewFetchTests.testFetchEnvelope  s    1)'&0"3   
" %3334333433343334%
  s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchEnvelopeUIDz"NewFetchTests.testFetchEnvelopeUID  s    %%a(((r6   c                    | j         j        | _        d| _        t	          dddddddd	d
ddddd          g| _        ddddg ddddddddddggdd	gii| _        |                     |          S )a[  
        L{IMAP4Client.fetchBodyStructure} issues a I{FETCH BODYSTRUCTURE}
        command and returns a Deferred which fires with a structure giving the
        result of parsing the server's response.  The structure is a list
        reflecting the parenthesized data sent by the server, as described by
        RFC 3501, section 7.4.2.
        3:9,10:*#text/plain; name=thing; key="value"this-is-the-content-id!describing-the-content-goes-here!8BITabcdef123456zattachment; filename=monkeysrP  zhttp://example.com/monkeysr/  r1   r)     Body
Text
Goes
Here
 Nr   r  rF   plainrU  r  r  thing20r^  r6  filenamerR  r  fetchBodyStructurer  r   r   r[  rg  rb  rt  s     r4   test_fetchBodyStructurez%NewFetchTests.test_fetchBodyStructure  s     6"$I":+N17#1+I(,(D	 	 + 
( 555,7"!J	#:;0"
$ s###r6   c                ,    |                      d          S )z
        If passed C{True} for the C{uid} argument, C{fetchBodyStructure} can
        also issue a I{UID FETCH BODYSTRUCTURE} command.
        r   )r  rR   s    r4   testFetchBodyStructureUIDz'NewFetchTests.testFetchBodyStructureUID  s    
 ++A...r6   c                   | j         j        | _        d| _        t	          dddddddd	d
ddddd          }t	          dddddddd|g          g| _        ddddg dddddddddgdd	gdddgdddgii| _        |                     |          S )z
        L{IMAP4Client.fetchBodyStructure} can also parse the response to a
        I{FETCH BODYSTRUCTURE} command for a multipart message.
        r  r  r  r  r  r-  123456abcdefinlinezouter space)r   r	  r
  r  r2  r0  r1  r3  r1   r6   r  r  Nzmultipart/mixed; boundary="xyz"ennearby)r   r2  r3  r   r  rF   r  r  r  r^  mixedboundaryxyzr  )rE   r  innerMessages      r4    test_fetchBodyStructureMultipartz.NewFetchTests.test_fetchBodyStructureMultipart  s   
 6"# E6'J-3$(-'/$1	 	 '
 
$ $E(,(0 
  
 9990;&!4(% ''"
2 s###r6   c                    | j         j        | _        d| _        t	          i ddddt	          ddidddd d           g          g| _        d	d
g dii| _        |                     |          S )N21r1   r6      Yea whateverf r   	image/jpg   Body Body Bodyr   r  NNNNNN12r  fetchSimplifiedBodyr  r   r   r[  rg  rb  rt  s     r4   testFetchSimplifiedBodyz%NewFetchTests.testFetchSimplifiedBodyE  s    7 '5) 	 
& V%O%O%OPQs###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchSimplifiedBodyUIDz(NewFetchTests.testFetchSimplifiedBodyUID_  s    ++A...r6   c                    | j         j        | _        d| _        t	          ddiddddd           g| _        dd	g d
ii| _        |                     |          S )Nr  r   r   r1   r6   r  r  r   r  )rF   r  NNNNr  r   r  rt  s     r4   testFetchSimplifiedBodyTextz)NewFetchTests.testFetchSimplifiedBodyTextb  sn    7.C%QU 
 LLLM
 s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchSimplifiedBodyTextUIDz,NewFetchTests.testFetchSimplifiedBodyTextUIDp  s    //222r6   c                   | j         j        | _        d| _        t	          ddiddddt	          ddidd	d
d d           g          g| _        ddddd d d d dd d g dgg dgd d d d d d g
g ddg
ii| _        |                     |          S )Nr  r   r?  r1   r6   r  r  r  r)  r  r   r  r  r  r  NNN)r   jpgNNNN14r   r  rt  s     r4   testFetchSimplifiedBodyRFC822z+NewFetchTests.testFetchSimplifiedBodyRFC822s  s    7!12 '5) 	 
( +++,+++, CBB+
8 s###r6   c                ,    |                      d          S rt  )r  rR   s    r4    testFetchSimplifiedBodyRFC822UIDz.NewFetchTests.testFetchSimplifiedBodyRFC822UID  s    11!444r6   c           	     F   | j         j        | _        d| _        t	          ddiddddd          t	          dd	iddd
dd          g}t	          ddidddd|          }t	          ddidddd|g          }|g| _        ddg dg ddgdgii| _        |                     d          S )ah  
        L{IMAP4Client.fetchSimplifiedBody} returns a dictionary mapping message
        sequence numbers to fetch responses for the corresponding messages.  In
        particular, for a multipart message, the value in the dictionary maps
        the string C{"BODY"} to a list giving the body structure information for
        that message, in the form of a list of subpart body structure
        information followed by the subtype of the message (eg C{"alternative"}
        for a I{multipart/alternative} message).  This structure is self-similar
        in the case where a subpart is itself multipart.
        r  r   r   r1   s   dates   Stuffrq  Nr   s   Thingsi~  r   r6   s
   Irrelevantr5  zmultipart/mixeds   RootOfí r   r  )rF   r  NNNN5r   )rF   htmlNNNNrP  r   alternativer  Fr  )rE   singlesr  r  s       r4   !test_fetchSimplifiedBodyMultipartz/NewFetchTests.test_fetchSimplifiedBodyMultipart  s    7 .GXud  -r7Iud 	
 #45
 
 ./M
 
 w KKKJJJ%
 	
 u%%%r6   c                    | j         j        | _        d| _        t	          ddiddddd           g| _        dd	d
ii| _        |                     |          S )Nz1,3,7,10101r  Valuer1   r6   s   BODY TEXT
[   r   r  zHeader: Value

BODY TEXT
)r  r  r  r   r   r[  rg  rb  rt  s     r4   testFetchMessagezNewFetchTests.testFetchMessage  s_    0%(G,b#7GTRR
 X'KLMs###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchMessageUIDz!NewFetchTests.testFetchMessageUID      $$Q'''r6   c                    | j         j        | _        d| _        t	          dddddddd           g| _        t          t          j        ddd                    }dd	|ii| _	        | 
                    |          S )
Nz9,6,2V1V2)H1H2r1   r6   c   r   r  )r  fetchHeadersr  r   r   r[  r(   r   rd  rg  rb  )rE   r  r   s      r4   testFetchHeaderszNewFetchTests.testFetchHeaders  s    0D112sCTJJ
 u34t4L4LMMNN )
 s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchHeadersUIDz!NewFetchTests.testFetchHeadersUID  r  r6   c                    | j         j        | _        d| _        t	          ddiddddd           g| _        dd	d
ii| _        |                     |          S )Nz1,2,3,4,5,6,7r  r  r1   r)  s   Body goes here
   r   r  zBody goes here
)r  rG  r  r   r   r[  rg  rb  rt  s     r4   testFetchBodyzNewFetchTests.testFetchBody  sd    -'(G,b"6KSRVWW
 34
 s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchBodyUIDzNewFetchTests.testFetchBodyUID      !!!$$$r6   c                     j         j         _        d _        d}d}d}t	                      }d|d<   d|d<   d	|d
<   d|d<   t	                      }d|d
<   d|d<   t	                      }d|d
<   d|d<   t          |dd|dt          |dd|dd          t          |dd|dd          g          g _        dddgdggi _         fd} j        	                     fd            j        	                    |            j        	                     j
                    j                             j                   t          j         j         j         d          }|	                     fd           |S )zT
        Test the server's handling of requests for specific body sections.
        r   r)  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   Nr   r   r  z&Contained body message text.  Squarge.c                    | _         d S r0   r  r  s    r4   r2   z0NewFetchTests.testFetchBodyParts.<locals>.result8  r  r6   c                <                         j        d          S )Nr   rS  r_  r?  s    r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda><  s    dmmDMmBB r6   Fr  c                D                         j        j                  S r0   ra  ignrE   s    r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda>C      $"2"24;"N"N r6   r  r  r  r   r   r   r[  rg  r  r   r
  r+  r  r#   r  r  )	rE   r   r   r   r   r   r   r2   r   s	   `        r4   testFetchBodyPartsz NewFetchTests.testFetchBodyParts  s    1	>
F
--'*.	"I"}}"8Y'3^$##;i (3n% r4T4PP D*dDQQ
 

 fse-UVWX	 	 	 	 	 	""BBBB	
 	
 	
 	""6***""4#5666!!$/222 dkGGG	NNNNOOOr6   c                @     j         j         _        d _        dgd}t	                      }d|d<   d|d<   d|d	<   d
|d<   t          |dd|dd          g _        dddgdggi _         fd} j        	                     fd            j        	                    |            j        	                     j
                    j                             j                   t          j         j         j         d          }|	                     fd           |S )z
        Single-part messages have an implicit first part which clients
        should be able to retrieve explicitly.  Test that a client
        requesting part 1 of a text/plain message receives the body of the
        text/plain part.
        r   r   s   DA bodyr   r   r   r   r   r   r   r   r1   Nr   r   r  zDA bodyc                    | _         d S r0   r  r  s    r4   r2   z>NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.resultZ  r  r6   c                <                         j                  S )NrS  r_  )r*  partsrE   s    r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>^  s    dmmDMmFF r6   Fr  c                D                         j        j                  S r0   ra  r  s    r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>e  r  r6   r  )rE   r   r   r2   r   r  s   `    @r4    test_fetchBodyPartOfNonMultipartz.NewFetchTests.test_fetchBodyPartOfNonMultipartF  sQ    1	--'*.	".$Wb$	3MMNfseY789	 	 	 	 	 	""FFFFF	
 	
 	
 	""6***""4#5666!!$/222 dkGGG	NNNNOOOr6   c                    | j         j        | _        d| _        t	          i ddddd           g| _        dddii| _        |                     |          S )	Nz	1:100,2:*r1   r6   s   xxxxxxxxxxxxxxxxxxxxr   r   r  r  )r  	fetchSizer  r   r   r[  rg  rb  rt  s     r4   testFetchSizezNewFetchTests.testFetchSizeh  s\    -#Rid;;
 t$
 s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchSizeUIDzNewFetchTests.testFetchSizeUIDs  r  r6   c                2   | j         j        | _        d| _        t	          i ddddd           t	          i dddd	d           g| _        g dd
dd d g dgg dgd d d d d d g
g ddg dddd d g dgg dgd d d d d d g
g ddd| _        |                     |          S )Nz1,3)z\XYZz\YZXAbcs%   Sun, 25 Jul 2010 06:20:30 -0400 (EDT)s   xyzxyzi  )z\Onez\TwoThrees   Mon, 14 Apr 2003 19:43:44 -0400s   abcabcabcabcrG  z25-Jul-2010 06:20:30 -0400rP  r  )NNNNNNrP  )r  r  r  r  r  z14-Apr-2003 19:43:44 -0400r  r  rr  )r  	fetchFullr  r   r   r[  rg  rb  rt  s     r4   testFetchFullzNewFetchTests.testFetchFullv  s9   -)8  +2 
( 322 <"'''('''( BAA! & 544 <#'''('''( CBB! '%
 %
L s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchFullUIDzNewFetchTests.testFetchFullUID  r  r6   c                   | j         j        | _        d| _        t	          i ddddd           t	          i ddddd           g| _        d d g d	gg d	gd d d d d d g
d
dg dd d g d	gg d	gd d d d d d g
d
dg dd| _        |                     |          S )Nz1,2:3r1   s   Mon, 14 Apr 2003 19:43:44 +0400s   Lalalarh  s   Tue, 15 Apr 2003 19:43:44 +0200s   AlalaliN  r  rP  z14-Apr-2003 19:43:44 +0400)r  r  r  r  z15-Apr-2003 19:43:44 +0200rr  )r  fetchAllr  r   r   r[  rg  rb  rt  s     r4   testFetchAllzNewFetchTests.testFetchAll  s   ,B:Iud  B:Iud 	
 '''('''(  # < & '''('''(  # < %#
 #
H s###r6   c                ,    |                      d          S rt  )r  rR   s    r4   testFetchAllUIDzNewFetchTests.testFetchAllUID  s      ###r6   c                    | j         j        | _        d| _        t	          i ddddd           g| _        ddgdd	d
i| _        |                     |          S )Nr   )\Xs   19 Mar 2003 19:22:21 -0500r6   r   r   r	  z19-Mar-2003 19:22:21 -05000)r  r  r  )r  	fetchFastr  r   r   r[  rg  rb  rt  s     r4   testFetchFastzNewFetchTests.testFetchFast  sk    -X'Dc1dSS
  <" 
 s###r6   c                ,    |                      d          S rt  )r	  rR   s    r4   testFetchFastUIDzNewFetchTests.testFetchFastUID  r  r6   r  )1rs   rt   ru   r  ri  rk  r  rb  rl  ru  rw  r}  r  r  r  r  r  noEsARLocaleErrorr
   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r	  r	  r1   r6   r4   rU  rU  /  sK       3 3 3    A A A
  $" " " $ $ $ $& & &$ $ $ $"- - - %F$V]D99M555 	666	 <    VLCDD- - ED-#$ #$ #$ #$J) ) )/$ /$ /$ /$b/ / /?$ ?$ ?$ ?$B$ $ $ $4/ / /$ $ $ $3 3 32$ 2$ 2$ 2$h5 5 5>& >& >&@$ $ $ $( ( ($ $ $ $( ( (	$ 	$ 	$ 	$% % %/ / /b     D	$ 	$ 	$ 	$% % %;$ ;$ ;$ ;$z% % %/$ /$ /$ /$b$ $ $$ $ $ $% % % % %s   A+ +A:9A:rU  c                  r    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d Zd Zd Zd Zd Zd ZdS )DefaultSearchTestszz
    Test the behavior of the server's SEARCH implementation, particularly in
    the face of unhandled search terms.
    c                   t          j                    | _        d| j        _        | | j        _        t          j                    | _        t          | j                  | _	        t          i ddddd           t          i ddddd           t          i ddddd           t          i ddddd           t          i ddddd           g| _        d S )	Nr  r1   r6   rg  rh  r5  i!N  i"N  )r   r  r  rV  r_  r   r   r  r  r  r   r[  rR   s    r4   r  zDefaultSearchTests.setUp  s    '))$))"4>22Rc355Rc5$77Rc5$77Rc5$77Rc5$77
r6   c           
         t          t          t          dt          | j                  dz             | j                            S )zW
        Pretend to be a mailbox and let C{self.server} lookup messages on me.
        r   )r   r   rn   r   r[  r  s      r4   r  zDefaultSearchTests.fetch  s7     CaT\!2!2Q!677FFGGGr6   c                ,     fd} j                             t          |                    } fd}|                    |           |                     j                   |                     j                                                     |S )a  
        Issue a search with given query and verify that the returned messages
        match the given expected messages.

        @param queryTerms: A string giving the search query.
        @param expectedMessages: A list of the message sequence numbers
            expected as the result of the search.
        @return: A L{Deferred} which fires when the test is complete.
        c                 8    j                                        S r0   r  r'  
queryTermsrE   s   r4   r'  z8DefaultSearchTests._messageSetSearchTest.<locals>.search"  r  r6   c                4                         |            d S r0   r)  )rO  expectedMessagesrE   s    r4   searchedz:DefaultSearchTests._messageSetSearchTest.<locals>.searched'  s     W&677777r6   )r  r   r7   r
  r+  r  r#   )rE   r	  r	  r'  r   r	  s   ```   r4   _messageSetSearchTestz(DefaultSearchTests._messageSetSearchTest  s    	2 	2 	2 	2 	2 	2 N&&uV}}55	8 	8 	8 	8 	8 	8 	
h	d()))	T_%%%r6   c                0    |                      ddg          S )z
        Test that a search which starts with a message set properly limits
        the search results to messages in that set.
        r   r   r	  rR   s    r4   test_searchMessageSetz(DefaultSearchTests.test_searchMessageSet0  s    
 ))#s333r6   c                2    |                      dg d          S )zv
        If the search filter ends with a star, all the message from the
        starting point are returned.
        z2:*r=  r	  rR   s    r4   test_searchMessageSetWithStarz0DefaultSearchTests.test_searchMessageSetWithStar7      
 ))%>>>r6   c                2    |                      dg d          S )z
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star.
        z*:2r=  r	  rR   s    r4   "test_searchMessageSetWithStarFirstz5DefaultSearchTests.test_searchMessageSetWithStarFirst>  r	  r6   c                2    |                      dg d          S )z
        If the search filter ends with a star, all the message from the
        starting point are returned (also for the SEARCH UID case).
        zUID 10000:*r=  r	  rR   s    r4    test_searchMessageSetUIDWithStarz3DefaultSearchTests.test_searchMessageSetUIDWithStarE      
 ))-FFFr6   c                2    |                      dg d          S )z
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star (also for the SEARCH UID case).
        zUID *:10000r=  r	  rR   s    r4   %test_searchMessageSetUIDWithStarFirstz8DefaultSearchTests.test_searchMessageSetUIDWithStarFirstL  r"	  r6   c                0    |                      ddg          S )z
        A search filter of 1234:* should include the UID of the last message in
        the mailbox, even if its UID is less than 1234.
        zUID 30000:*r   r	  rR   s    r4   ,test_searchMessageSetUIDWithStarAndHighStartz?DefaultSearchTests.test_searchMessageSetUIDWithStarAndHighStartS  s     ))-!===r6   c                0    |                      ddg          S )z
        If the search filter contains nesting terms, one of which includes a
        message sequence set with a wildcard, IT ALL WORKS GOOD.
        z(6:*)r   r	  rR   s    r4   test_searchMessageSetWithListz0DefaultSearchTests.test_searchMessageSetWithList[  s     ))'A3777r6   c                2    |                      dddg          S )z
        If the search filter contains an I{OR} term, all messages
        which match either subexpression are returned.
        zOR 1 2r   r   r	  rR   s    r4   rq  z DefaultSearchTests.test_searchOre  s    
 ))(QF;;;r6   c                2    |                      dg d          S )z
        If the search filter contains an I{OR} term with a
        subexpression which includes a message sequence set wildcard,
        all messages in that set are considered for inclusion in the
        results.
        z
OR 2:* 2:*r=  r	  rR   s    r4   test_searchOrMessageSetz*DefaultSearchTests.test_searchOrMessageSetl  s     )),EEEr6   c                2    |                      dg d          S )z
        If the search filter contains a I{NOT} term, all messages
        which do not match the subexpression are returned.
        zNOT 3)r   r   r   r   r	  rR   s    r4   rt  z!DefaultSearchTests.test_searchNotu  s    
 ))'<<<@@@r6   c                0    |                      ddg          S )z
        If the search filter contains a I{NOT} term with a
        subexpression which includes a message sequence set wildcard,
        no messages in that set are considered for inclusion in the
        result.
        zNOT 2:*r   r	  rR   s    r4   test_searchNotMessageSetz+DefaultSearchTests.test_searchNotMessageSet|  s     )))aS999r6   c                0    |                      ddg          S )z
        If the search filter contains multiple terms implicitly
        conjoined with a message sequence set wildcard, only the
        intersection of the results of each term are returned.
        z2:* 3r   r	  rR   s    r4   test_searchAndMessageSetz+DefaultSearchTests.test_searchAndMessageSet  s     ))'A3777r6   c                8    d fd} j                             t          |                    }                     |t          j                  } fd}|                    |           |                     j                                                     |S )z
        If the search criteria is not a valid key, a NO result is returned to
        the client (resulting in an error callback), and an IllegalQueryError is
        logged on the server side.
        FOOc                 8    j                                        S r0   r	  r	  s   r4   r'  z=DefaultSearchTests.test_searchInvalidCriteria.<locals>.search  r  r6   c                d   j         j                                         j        j                                                             t
          j                  }                    t          |          d                               t          d          t          |                      dS )
            Verify that the server logs an IllegalQueryError and the
            client raises an IMAP4Exception with 'Search failed:...'
            r   s)   SEARCH failed: Invalid search command FOON
r  r  r  r  r  r   r%  rB   r   r   rO  rz  rE   s     r4   errorReceivedzDDefaultSearchTests.test_searchInvalidCriteria.<locals>.errorReceived  s    
 K!00222K!00222 ++E,CDDFS[[!,,, @AAG    r6   	r  r   r7   r  r   r  r+  r  r#   )rE   r'  r   r8	  r	  s   `   @r4   test_searchInvalidCriteriaz-DefaultSearchTests.test_searchInvalidCriteria  s     
	2 	2 	2 	2 	2 	2 N&&uV}}55q%"677	 	 	 	 	$ 	
m$$$	T_%%%r6   N)rs   rt   ru   r2  r  r  r	  r	  r	  r	  r!	  r$	  r&	  r(	  rq  r+	  rt  r.	  r0	  r:	  r1   r6   r4   r	  r	    s        

 
 
H H H  24 4 4? ? ?? ? ?G G GG G G> > >8 8 8< < <F F FA A A: : :8 8 8# # # # #r6   r	  c                  N    e Zd Zd Zd Zd ZeZd Zd Zd Z	d Z
d Zd	 Zd
 ZdS )FetchSearchStoreTestsc                   d x| _         | _        d | _        d | _        d | _        d | _        t          j                    | _        d| j        _	        | | j        _
        t          j                    | _        t          | j                  | _        d S r  )rg  r2   server_received_queryserver_received_uidserver_received_partsserver_received_messagesr   r  r  rV  r_  r   r   r  r  r  rR   s    r4   r  zFetchSearchStoreTests.setUp  sx    &**%)"#' %)"(,%'))$))"4>22r6   c                b    |dgk    rt          j        d          || _        || _        | j        S )Nr  z"FOO is not a valid search criteria)r   r%  r>	  r?	  rg  )rE   r  r  s      r4   r'  zFetchSearchStoreTests.search  s9    VH)*NOOO%*"#& }r6   c                    d S r0   r1   )rE   r  r  s      r4   ri  z!FetchSearchStoreTests.addListener  r  r6   c                j     fd} fd} j                             t          |                                        |                               j                                       j                    fd}t          j         j         j	        d          }|                    |           |S )Nc                 F     j                              j                  S )Nr  )r  r'  r  rt  s   r4   r'  z1FetchSearchStoreTests._searchWork.<locals>.search  s     ;%%djc%:::r6   c                    | _         d S r0   r  r  s    r4   r2   z1FetchSearchStoreTests._searchWork.<locals>.result  r  r6   c                T                        j        j        u                                j        j                                       j        j                                       t          j        j        	                    d                    j
                   d S )Ncharmap)rS  r2   rg  rB   r  r?	  r   r  r  rC   r>	  r  s    r4   r  z0FetchSearchStoreTests._searchWork.<locals>.check  s    T[DM9:::T[$-888TXt'?@@@ '
(9(9)(D(DEE*	    r6   Fr  r  )rE   r  r'  r2   r  r   s   ``    r4   _searchWorkz!FetchSearchStoreTests._searchWork  s    	; 	; 	; 	; 	; 	;	 	 	 	 	 	""5==11==fEEQQ	
 	

*T_
%
%
%	 	 	 	 	  dkGGG	er6   c                    t          j        t          j        d          t          j        dd                    | _        g d| _        d| _        |                     d          S )Nr   	substringr        r  r
  )r   r   r   r   r   )r   r  r  r  rg  r  rI	  rR   s    r4   
testSearchz FetchSearchStoreTests.testSearch  s`    XK7888KtT222
 

 %"""r6   c                    t          j        t          j        d          t          j        dd                    | _        d| _        g d| _        |                     d          S )NrK	  rM	  rN	  rO	  rP	  r   r   )r   r  r  r  r  rg  rI	  rR   s    r4   testUIDSearchz#FetchSearchStoreTests.testUIDSearch  s`    XK7888KtT222
 

 !		"""r6   c                    	 | j         |         d         S # t          t          f$ r | j         |dz
           cY S t          $ r Y dS w xY w)Nr  r   rr  )rg  r   
IndexErrorKeyErrorrE   r   s     r4   r  zFetchSearchStoreTests.getUID  si    	=%e,,:& 	* 	* 	*=q)))) 	 	 	22	s    !A	AAc                F    || _         t          |          | _        | j        S r0   )r?	  r   rA	  rg  r  s      r4   r  zFetchSearchStoreTests.fetch  s     #& (+H%}r6   c                \     fd} j                             t          |                                        |                               j                                       j                    fd}t          j         j         j	        d          }|                    |           |S )Nc                    | _         d S r0   r  r  s    r4   r2   z0FetchSearchStoreTests._fetchWork.<locals>.result  r  r6   c                                        j        j        u            j        oj                                         j        oj                                         j        r1j                                        D ]\  }}t          |          |d<   	                    j        j                   	                    j        j
                   	                    j        j                   	                    t          j        j                  t          j        j                             d S )Nr  )rS  r2   rg  r  r  r@	  r  rW  r   rB   r?	  r   r   r   rA	  )rX  kvrE   s      r4   r  z/FetchSearchStoreTests._fetchWork.<locals>.check  s!   T[DM9:::J,4:??,,&L4+E+J+J+L+Lx & M//11 & &DAq"1vvAeHHT[$-888TXt'?@@@TZ)CDDD!$-00!$"?@@    r6   Fr  r  )rE   r  r2   r  r   s   `    r4   rb  z FetchSearchStoreTests._fetchWork  s    	 	 	 	 	 	""5<<00<<VDDPP	
 	

*T_
%
%
%	 	 	 	 	&  dkGGG	er6   c                8    d fd} j                             t          |                    }                     |t          j                  } fd}|                    |           |                     j                                                     |S )z
        If, as part of a search, an ISearchableMailbox raises an
        IllegalQueryError (e.g. due to invalid search criteria), client sees a
        failure response, and an IllegalQueryError is logged on the server.
        r2	  c                 8    j                                        S r0   r	  )r  rE   s   r4   r'  z6FetchSearchStoreTests.test_invalidTerm.<locals>.search2  s    ;%%e,,,r6   c                d   j         j                                         j        j                                                             t
          j                  }                    t          |          d                               t          d          t          |                      dS )r5	  r   s1   SEARCH failed: FOO is not a valid search criteriaNr6	  r7	  s     r4   r8	  z=FetchSearchStoreTests.test_invalidTerm.<locals>.errorReceived8  s    
 K!00222K!00222 ++E,CDDFS[[!,,, HII3w<<    r6   r9	  )rE   r'  r   r8	  r  s   `   @r4   test_invalidTermz&FetchSearchStoreTests.test_invalidTerm*  s     	- 	- 	- 	- 	- 	- N&&uV}}55q%"677	 	 	 	 	" 	
m$$$	T_%%%r6   N)rs   rt   ru   r  r'  ri  rk  rI	  rQ	  rS	  r  r  rb  ra	  r1   r6   r4   r<	  r<	    s        3 3 3     !N  8# # ## # #    
  >" " " " "r6   r<	  c                      e Zd Zd Zd ZdS )FakeMailboxc                    g | _         d S r0   )r  rR   s    r4   rz   zFakeMailbox.__init__P      			r6   c                d    | j                             |||f           t          j        d           S r0   )r  r|   r   rZ  )rE   r   r  r  s       r4   r  zFakeMailbox.addMessageS  s/    	$t,---}T"""r6   N)rs   rt   ru   rz   r  r1   r6   r4   rc	  rc	  O  s2          # # # # #r6   rc	  c                       e Zd Zd Zd Zd ZdS )FeaturefulMessagec                    dS )Nr  r1   rR   s    r4   ro  zFeaturefulMessage.getFlagsZ  s    wr6   c                    dS )Nr  r1   rR   s    r4   r  z!FeaturefulMessage.getInternalDate]  s    ~r6   c                     t          d          S )N   openr   rR   s    r4   r  zFeaturefulMessage.open`  s    wr6   N)rs   rt   ru   ro  r  r  r1   r6   r4   rh	  rh	  X  sA                     r6   rh	  c                      e Zd Zd Zd ZdS )MessageCopierMailboxc                    g | _         d S r0   )msgsrR   s    r4   rz   zMessageCopierMailbox.__init__f  re	  r6   c                ^    | j                             |           t          | j                   S r0   )rp	  r|   r   rW	  s     r4   r  zMessageCopierMailbox.copyi  s&    	49~~r6   N)rs   rt   ru   rz   r  r1   r6   r4   rn	  rn	  d  s2              r6   rn	  c                       e Zd Zd Zd Zd ZdS )CopyWorkerTestsc                     t          j                    }|j        }t                       |d t	          dd          D             d          } fd}|                    |          S )Nc                .    g | ]}|t                      fS r1   )rh	  r+  s     r4   r  z9CopyWorkerTests.testFeaturefulMessage.<locals>.<listcomp>}  s$    >>>A$&&'>>>r6   r   r@  r  c                N   j         D ]h}                    |d                                         d                               |d         d                               |d         d           i| D ]0\  }}                    |                               |d            1d S )Nr   rl	  r   r  r   r  )r  rB   rW   rU  )rO  r  rh  r2   r   rE   s       r4   cbCopyz5CopyWorkerTests.testFeaturefulMessage.<locals>.cbCopy  s    V 7 7  1g666  1w///  1~6666") / /'''  ..../ /r6   )r   r  _IMAP4Server__cbCopyrc	  rn   r   )rE   r{  r3   r   rw	  r   s   `    @r4   testFeaturefulMessagez%CopyWorkerTests.testFeaturefulMessageo  s     "MMA>>q">>>qII	/ 	/ 	/ 	/ 	/ 	/ }}V$$$r6   c           	     &    t          j                    }|j        }t                      d t	          dd          D             } |d t          t	          dd          |          D             d          } fd}|                    |          S )Nc           
     b    g | ],}t          d t          |          iddd|fz  |dz   d          -S )zHeader-Counterr1      Dates   Body %dr   N)r   r   r+  s     r4   r  z;CopyWorkerTests.testUnfeaturefulMessage.<locals>.<listcomp>  sY     
 
 
  !3q66*Bqd9JAPRFTX 
 
 
r6   r   r@  c                    g | ]}|S r1   r1   r,  ims     r4   r  z;CopyWorkerTests.testUnfeaturefulMessage.<locals>.<listcomp>      444br444r6   r  c                   g }j         D ]g}|                    |d                                                                        |d         d                               |d         d           h|                                 t          d t          dd          D                       }                    ||           | D ]0\  }}                    |                               |d            1d S )Nr   r   r1   r   r|	  c              3  $   K   | ]}d ||fz  V  dS )s   Header-Counter: %d

Body %dNr1   r+  s     r4   r-  zJCopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy.<locals>.<genexpr>  s=        BC41v=     r6   r@  )r  r|   rW   rB   r  re  rn   rU  )rO  seenr  exprh  r2   r   rE   s         r4   rw	  z7CopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy  s   DV 0 0AaDIIKK(((  1r***  1w////IIKKK  GLQPR||    C T3'''") / /'''  ..../ /r6   )r   r  rx	  rc	  rn   r   r   )rE   r{  r3   rp	  r   rw	  r   s   `     @r4   testUnfeaturefulMessagez'CopyWorkerTests.testUnfeaturefulMessage  s     "MM
 
 1b\\	
 
 
 A44Cad33444eQ??	/ 	/ 	/ 	/ 	/ 	/" }}V$$$r6   c           	     *    t          j                    }|j        }t                      d t	          dd          D              |d t          t	          dd                    D             d          } fd}|                    |          S )Nc                *    g | ]}t                      S r1   )objectr+  s     r4   r  z5CopyWorkerTests.testMessageCopier.<locals>.<listcomp>  s    ///Q///r6   r   r@  c                    g | ]}|S r1   r1   r~	  s     r4   r  z5CopyWorkerTests.testMessageCopier.<locals>.<listcomp>  r	  r6   s   tagc                                         | t          t          dgdz  t          dd                                         t          j                  D ]\  }}                    ||           d S )Nr   r   r@  )rB   r   r   rn   rp	  r   )rO  origr  r   rp	  rE   s      r4   rw	  z1CopyWorkerTests.testMessageCopier.<locals>.cbCopy  s{    Wd3sRxq"+F+F&G&GHHH qv.. 0 0	c$$T3////0 0r6   )r   r  rx	  rn	  rn   r   r   )rE   r{  r3   r   rw	  r   rp	  s   `    @@r4   testMessageCopierz!CopyWorkerTests.testMessageCopier  s     " ""//%2,,///A44Cad33444fa@@	0 	0 	0 	0 	0 	0 	0
 }}V$$$r6   N)rs   rt   ru   ry	  r	  r	  r1   r6   r4   rs	  rs	  n  sB        % % %8 %  %  %D% % % % %r6   rs	  zOpenSSL not presentzReactor doesn't support SSLc                      e Zd ZdZdZer
 e            Zer
 e            Zd Zd Zd Z	d Z
d Zdd	Zd
 Zd Zd Zd ZdS )TLSTestsNc                D    t          j        | j        | j        d          S )NFr  )r#   r  r  r  rR   s    r4   r#   zTLSTests.loopback  s    #DKEJJJJr6   c                   	
 t           j                            d           g 		 fd}	 fd}	 fd}	 fd}	 fd}d j        _        |||||g

D ])} j                            t          |                     * j                             j	         j
                   	
 fd}                                 }|                    |           |S )	Nr  c                 d                          d            j                            dd          S rK  )r|   r  rL  calledrE   s   r4   rL  z)TLSTests.testAPileOfThings.<locals>.login  s.    MM$;$$[2BCCCr6   c                 d                          d            j                            dd          S )Nr     %)r|   r  r   r	  s   r4   r   z(TLSTests.testAPileOfThings.<locals>.list  s-    MM$;##Hd333r6   c                 d                          d            j                            dd          S )Nr  rT  )r|   r  rh  r	  s   r4   rh  z*TLSTests.testAPileOfThings.<locals>.status  s-    MM$;%%h	:::r6   c                 b                          d            j                            d          S )Nr  )r|   r  r  r	  s   r4   r  z+TLSTests.testAPileOfThings.<locals>.examine  s+    MM$;&&x000r6   c                 `                          d            j                                        S r0   )r|   r  r=  r	  s   r4   r=  z*TLSTests.testAPileOfThings.<locals>.logout  s)    MM$;%%'''r6   Tc                                         j        j        d                                j        j        d                                t	                    t	                               d S r  )rB   r  
startedTLSr  r   )rX  r	  methodsrE   s    r4   r  z)TLSTests.testAPileOfThings.<locals>.check  sa    T[3T:::T[3T:::S[[#g,,77777r6   )r  r  r  r  requireTransportSecurityr  r   r7   r  r
  r  r#   )rE   rL  r   rh  r  r=  r  r  r   r	  r	  s   `        @@r4   testAPileOfThingszTLSTests.testAPileOfThings  sm   **8444	D 	D 	D 	D 	D 	D	4 	4 	4 	4 	4 	4	; 	; 	; 	; 	; 	;	1 	1 	1 	1 	1 	1	( 	( 	( 	( 	( 	( 04,$8 	6 	6FN&&uV}}5555##D$6HHH	8 	8 	8 	8 	8 	8 	8
 MMOO	er6   c                     j         j                            dd           g  j                            t          j        d                      j                             fd                               fd                              j	                                       j
                                       j                                                    }|                     fd           |S )Nr  r  c                8    j                             d          S )Nr  r  r?  s    r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>  s    dk../?@@ r6   c                6    j                                         S r0   )r  r=  r?  s    r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>  s     2 2 4 4 r6   c                J                         t                    d          S rt  )rB   r   r[  rE   successs    r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>  s     0 0Wq A A r6   )r  r  r  r  r  r   r  r  r   r|   r
  r+  r  r#   )rE   r   r	  s   ` @r4   testLoginLoginzTLSTests.testLoginLogin  s    ##K1ABBB))%*B;*O*OPPP""@@@@	
 	

+4444
5
5kkN7
 7

+
 

*O
 
 
 MMOO	AAAAABBBr6   c                x    g  j                             t           j        j                              fd} j                             |            j                             j                                                    }|                     fd           t          j        | j         g          S )z
        Begin a C{STARTTLS} sequence and assert that it results in a
        TLS session.

        @return: A L{Deferred} that fires when the underlying
            connection between the client and server has been terminated.
        c                                         t          j                            j        j                             d S r0   )rU  r   ISSLTransport
providedByr  r  r  s    r4   checkSecurez6TLSTests.startTLSAndAssertSession.<locals>.checkSecure  s1    OOJ4??@UVVWWWWWr6   c                .                                   S r0   )rU  r	  s    r4   r5   z3TLSTests.startTLSAndAssertSession.<locals>.<lambda>  s     8 8 r6   )	r  r   r7   r  startTLSr|   r#   r   r,  )rE   r	  r   r	  s   `  @r4   startTLSAndAssertSessionz!TLSTests.startTLSAndAssertSession  s     ""5)=#>#>???	X 	X 	X 	X 	X 	"";///""7>222MMOO	88888999"At~#6777r6   c                    |                                  }| j                            | j                   | j                            | j                   |S )z
        L{IMAP4Client.startTLS} triggers TLS negotiation and returns a
        L{Deferred} which fires after the client's transport is using
        encryption.
        )r	  r  r   r
  r+  r  rE   disconnecteds     r4   test_startTLSzTLSTests.test_startTLS  sL     4466""4#5666!!$/222r6   returnDeferred[object]c                    |                      | j        j                   d| j        _        |                                 }| j                            | j                   | j                            | j                   |S )zd
        L{IMAPClient.startTLS} supplies a default TLS context if none is
        supplied.
        N)	assertIsNotNoner  contextr	  r  r   r
  r+  r  r	  s     r4   test_startTLSDefaultzTLSTests.test_startTLSDefault'  so    
 	T[0111")-)F)F)H)H""4#5666!!$/222r6   c                    G d dt                     } || j        | j                  | _        |                                 }| j                            t          | j        j                             | j                            | j	        d           | j                            | j
                   | j                            | j                   |S )z]
        A server that receives a second C{STARTTLS} sends a C{NO}
        response.
        c                      e Zd Zd ZdS ):TLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClientc                    | j         st                              |           S |                     t	          j        d                    S )Ns   STARTTLS)r	  r  r	  r  r   r7  rR   s    r4   r	  zCTLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClient.startTLS:  s>     7'00666''k(B(BCCCr6   N)rs   rt   ru   r	  r1   r6   r4   DoubleSTARTTLSClientr	  9  s(        D D D D Dr6   r	  r   s   TLS already negotiated)r  r  r  r  r	  r   r7   r	  r+  r  r
  r  )rE   r	  r	  s      r4   test_doubleSTARTTLSzTLSTests.test_doubleSTARTTLS3  s    	D 	D 	D 	D 	D< 	D 	D 	D +*N4>
 
 
 4466""5)=#>#>???!!+-F	
 	
 	
 	""4#5666!!$/222r6   c                    t           j        t           j        d j        _        t
          j         fd            } j                            t          |                      
                                } j                            t          |                      j                             j                    j                             j                   |S )z
        Starting a TLS negotiation with an L{IMAP4Server} that already
        has C{LOGIN} and C{PLAIN} L{IChallengeResponse} factories uses
        those factories.
        )r  r  c               3     K   j                                         V }                     d|                                d| d                                        d| d                    d S )Nr3  r  r  )r  r!  r  rx  s    r4   assertLOGINandPLAINzJTLSTests.test_startTLSWithExistingChallengers.<locals>.assertLOGINandPLAIN[  sl      !%!<!<!>!>>>LMM'<000MM(L$9:::MM(L$9:::::r6   )r   r  r  r  r6  r   r  r  r   r7   r	  r
  r+  r  )rE   r	  r	  s   `  r4   $test_startTLSWithExistingChallengersz-TLSTests.test_startTLSWithExistingChallengersP  s     ,,#
 #

 
		; 	; 	; 	; 
		; 	""5)<#=#=>>>4466""5)<#=#=>>>""4#5666!!$/222r6   c                n    d  j         _         j                             fd            j                             j        d            j                             j                    j                             j                   t          j	         
                                 j        g          S )z|
        A client that attempts to log in before issuing the
        C{STARTTLS} command receives a C{NO} response.
        c                 .    t          j        g df          S )NzOK Begin TLS negotiation now)r   rZ  r1   r6   r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>s  s    u}/0(
 (
 r6   c                :    j                             dd          S )Ns   wrongs   timer}  r?  s    r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>w  s    dk''':: r6   s!   LOGIN is disabled before STARTTLS)r  r	  r  r   r+  r  r
  r  r   r,  r#   rR   s   `r4   test_loginBeforeSTARTTLSz!TLSTests.test_loginBeforeSTARTTLSm  s     
  
 	""::::	
 	
 	
 	!!+0	
 	
 	

 	""4#5666!!$/222"DMMOOT^#DEEEr6   c                    g  fd} j                             |            j                              fd            j                             fd            j                              j                    j                              j                    fd}                                                     |          S )Nc                     dj         _        d S r  )r  canStartTLSr  s    r4   breakServerTLSz3TLSTests.testFailedStartTLS.<locals>.breakServerTLS  s    &+DK###r6   c                6    j                                         S r0   )r  r	  r  s    r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>  s    t{/C/C/E/E r6   c                h                         |                     t          j                            S r0   )r|   r  r   r  )r  r  s    r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>  s"    1E(F(FGG r6   c                ~                                                        d         t          j                   d S r  )rU  r   r   r  )rX  r  rE   s    r4   r  z*TLSTests.testFailedStartTLS.<locals>.check  s8    OOH%%%  !e.BCCCCCr6   )r  r   r+  r
  r  r#   )rE   r	  r  r  s   `  @r4   testFailedStartTLSzTLSTests.testFailedStartTLS  s    	, 	, 	, 	, 	, 	"">222""#E#E#E#EFFF!!GGGG	
 	
 	
 	""4#5666!!$/222	D 	D 	D 	D 	D 	D }}**5111r6   )r	  r	  )rs   rt   ru   r  r  r-   r,   r#   r	  r	  r	  r	  r	  r	  r	  r	  r	  r1   r6   r4   r	  r	    s         II '$$&&	 '$$&&	K K K' ' 'R  $8 8 8*	 	 	
 
 
 
  :  :F F F.2 2 2 2 2r6   r	  c                       e Zd ZdZdZdZd ZdS )SlowMailboxr   Nc                    t          j                    }|                     | j        |j        d           | j                            d            |S )Nr1   )r   r   	callLaterhowSlowr  fetchDeferred)rE   r   r  r   s       r4   r  zSlowMailbox.fetch  sE    Nt|QZ444##D)))r6   )rs   rt   ru   r	  r	  r	  r  r1   r6   r4   r	  r	    s2        GIM    r6   r	  c                  2    e Zd Zd Zd Zd Zd Zd Zd ZdS )TimeoutTestsc                n    t                      d j        _        d j        _        j         j        _        d _         fd} fd j                            t          |                    }|
                     j                   t          j        |                                 g          S )z{
        The *client* has a timeout mechanism which will close connections that
        are inactive for a period.
        Tr   Nc                     j                             dd          }                     d           |                                | S )Nr  r  r   )r  rL  advancer+  )r   r   rE   timedOuts    r4   rL  z.TimeoutTests.test_serverTimeout.<locals>.login  sA    !!+/?@@AIIaLLLLL"""Hr6   c                f                         d             | j        t          j                   d S r0   )r
  r  r   TimeoutErrorr  s    r4   r	  z1TimeoutTests.test_serverTimeout.<locals>.timedOut  s2    t$$$GL+,,,,,r6   )r   r  r  r  r  r	  r  r  r   r7   r+  r  r   r,  r#   )rE   rL  r   r   r	  s   `  @@r4   test_serverTimeoutzTimeoutTests.test_serverTimeout  s    
 GG"& ! 	 	 	 	 	 	 		- 	- 	- 	- 	- N&&uU||44	T_%%%"At}}#7888r6   c                <    t                      j         j        _         fd} fd} j                            t          |                    }|                    t          |                     t          j        |                                 g          S )z4
        The server times out a connection.
        c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z/TimeoutTests.test_serverTimesOut.<locals>.login  r~  r6   c                 L                          j        j        dz             d S Nr   r	  r  POSTAUTH_TIMEOUTr   rE   s   r4   
expireTimez4TimeoutTests.test_serverTimesOut.<locals>.expireTime  %    IIdk2Q677777r6   )	r   r	  r  r  r   r7   r   r,  r#   )rE   rL  r	  r   r   s   `   @r4   test_serverTimesOutz TimeoutTests.test_serverTimesOut  s     GG !	D 	D 	D 	D 	D	8 	8 	8 	8 	8 	8 N&&uU||44	eJ''(((
 "At}}#7888r6   c                0                          t          j        dt                     t          j                            d           t          j        j        d                              t          j                             t                      j
         j        _
         fd} fd} fd} fd} fd} j                            t          |                    }|                    t          |                     |                    t          |                     |                    t          |                     |                    t          |                     t          j        |                                 g          S )	z^
        The server unsets the selected mailbox when timing out a
        connection.
        r  mailbox-testMAILBOX-TESTc                 :     j                             dd          S rK  r}  rR   s   r4   rL  z7TimeoutTests.test_serverUnselectsMailbox.<locals>.login  r~  r6   c                 8     j                             d          S Nr	  r  rR   s   r4   r  z8TimeoutTests.test_serverUnselectsMailbox.<locals>.select  r  r6   c                 H                          j        j                   d S r0   )r  r  r_  r_  rE   s   r4   	assertSetz;TimeoutTests.test_serverUnselectsMailbox.<locals>.assertSet  s"    MM$ 011111r6   c                 L                          j        j        dz             d S r	  r	  r	  s   r4   r	  z<TimeoutTests.test_serverUnselectsMailbox.<locals>.expireTime  r	  r6   c                 F                           j        j                   d S r0   )rS  r  r_  rR   s   r4   assertUnsetz=TimeoutTests.test_serverUnselectsMailbox.<locals>.assertUnset  s"    T[-.....r6   )r  r  r  r  r  r  rS  r"   r	  r   r	  r  r  r   r7   r   r,  r#   )	rE   rL  r  r	  r	  r	  r   r   r_  s	   `      @@r4   test_serverUnselectsMailboxz(TimeoutTests.test_serverUnselectsMailbox  s   
 	

<*,<>PQQQ**>:::&0@.9$??@@@GG !	D 	D 	D 	D 	D	6 	6 	6 	6 	6	2 	2 	2 	2 	2 	2	8 	8 	8 	8 	8 	8	/ 	/ 	/ 	/ 	/ N&&uU||44	eFmm$$$	eI&&'''	eJ''(((	eK(()))
 "At}}#7888r6   c                    t           j                            d           t           j        j        d         t	          t
                     t                      j         j        _         fd} fd} fd} fd} fd} j	        
                    t          |                    }|
                    t          |                     |
                    t          |                     |
                    t          |                     |
                    t          |                     t          j        |                                 g          S )zi
        The server closes the selected, closeable mailbox when timing
        out a connection.
        r	  r	  c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z?TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.login	  r~  r6   c                 8     j                             d          S r	  r  rR   s   r4   r  z@TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.select  r  r6   c                 <                          j                   d S r0   )rS  r  r	  s   r4   assertMailboxOpenzKTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxOpen  s    T[)))))r6   c                 L                          j        j        dz             d S r	  r	  r	  s   r4   r	  zDTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.expireTime  r	  r6   c                 <                          j                   d S r0   )rU  r  r	  s   r4   assertMailboxClosedzMTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxClosed  s    OODK(((((r6   )r  r  r  r  r   r"   r   r	  r  r  r   r7   r   r,  r#   )	rE   rL  r  r	  r	  r	  r   r   r_  s	   `      @@r4   #test_serverTimesOutAndClosesMailboxz0TimeoutTests.test_serverTimesOutAndClosesMailbox  s   
 	**>:::&0@*D111GG !	D 	D 	D 	D 	D	6 	6 	6 	6 	6	* 	* 	* 	* 	* 	*	8 	8 	8 	8 	8 	8	) 	) 	) 	) 	) 	) N&&uU||44	eFmm$$$	e-..///	eJ''(((	e/00111
 "At}}#7888r6   c                    t                      j        t          _        t          j                    t          _        j         j        _        t          t          j        _	        t          j        
                    d            j                            d            fd} fd} fd} fd}fd}t          j                            |            j                            t          |                    }|                    t          |                     |                    t          |                     |                    t          |                     |                     j                   |                     j                   t          j        |                                 g          }|S )zM
        The connection timeout does not take effect during fetches.
        r	  r   c                 :     j                             dd          S rK  r}  rR   s   r4   rL  z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.login0  r~  r6   c                 l     j                             d            j                            d          S )Nr   r	  )r  
setTimeoutr  r  rR   s   r4   r  z8TimeoutTests.test_longFetchDoesntTimeout.<locals>.select3  s/    K""1%%%;%%n555r6   c                 8     j                             d          S )Nr   re  rR   s   r4   r  z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.fetch7  s    ;''...r6   c                 H                           j        j        d           d S )Nr  )r   r  rV  rR   s   r4   stillConnectedz@TimeoutTests.test_longFetchDoesntTimeout.<locals>.stillConnected:  s$     19=====r6   c                V    t          d          D ]}                    d           d S )Nr   g      ?)rn   r	  )rX  r   r   s     r4   	cbAdvancez;TimeoutTests.test_longFetchDoesntTimeout.<locals>.cbAdvance=  s3    1XX  		# r6   )r   r	  r	  r   r   r	  r  r  r  r  r  r	  r   r  r7   r
  r+  r  r,  r#   )	rE   rL  r  r  r
  r
  r-  r   r   s	   `       @r4   test_longFetchDoesntTimeoutz(TimeoutTests.test_longFetchDoesntTimeout#  s    GG !$)N$4$4! !1<.**>:::q!!!	D 	D 	D 	D 	D	6 	6 	6 	6 	6	/ 	/ 	/ 	/ 	/	> 	> 	> 	> 	>	 	 	 	 	 	!--i888^''e55
uV}}%%%
uU||$$$
u^,,---
t)***
do&&&T]]__ 566r6   c                   t                      }t                      }| j        |_        |j        | j        _        | j                            |           g | j        j        fd| j        _        |                    dg| j        j        dz  gdz  z              | 	                               |                    d| j        j        dz  g           | 
                               dS )z{
        The *server* has a timeout mechanism which will close connections that
        are inactive for a period.
        c                P                         d            |           fd         S rt  )r|   )reasonconnLostlosts    r4   r5   z<TimeoutTests.test_idleClientDoesDisconnect.<locals>.<lambda>[  s0    KKHV5
 5 r6   g        g      @r   g       @N)r   r   r  rr  r	  r  r  pumptimeOutrS  rU  )rE   r   r  r	
  r

  s      @@r4   test_idleClientDoesDisconnectz*TimeoutTests.test_idleClientDoesDisconnectL  s    
 GG466	![	 !""9--- ;-& & & & &" 	
u+c12Q66777t$$$ 	
T[(3./000r6   N)	rs   rt   ru   r	  r	  r	  r	  r
  r
  r1   r6   r4   r	  r	    sq        9 9 929 9 9*%9 %9 %9N$9 $9 $9L' ' 'R    r6   r	  c                      e Zd Zd ZdS )DisconnectionTestsc                (   t          j                    }t                      }|                    |           |                     |                    dd          t          j                  }|                    t          j        d                     |S )Nr  zexample.comConnection closed)	r   r  r   r  r  rL  r   r  r  )rE   r   tr   s       r4   "testClientDisconnectFailsDeferredsz5DisconnectionTests.testClientDisconnectFailsDeferredsj  s    ,..	GGK//1E
 
 	
-.ABBCCCr6   N)rs   rt   ru   r
  r1   r6   r4   r
  r
  i  s#            r6   r
  c                      e Zd ZdZd Zd ZdS )SynchronousMailboxzb
    Trivial, in-memory mailbox implementation which can produce a message
    synchronously.
    c                    || _         d S r0   r  )rE   r   s     r4   rz   zSynchronousMailbox.__init__{  s     r6   c              #  T   K   |r
J d            |D ]}|| j         |dz
           fV  d S )NzCannot handle uid requests.r   r  )rE   re  r  r   s       r4   r  zSynchronousMailbox.fetch~  sR      55555w 	. 	.Ct}S1W------	. 	.r6   N)rs   rt   ru   r2  rz   r  r1   r6   r4   r
  r
  u  s<         
! ! !. . . . .r6   r
  c            
          e Zd ZdZ ei g dddd           ei g dddd           ei g dddd          gZd Zd Zd	 fd
Zd Z	d Z
d ZdS )PipeliningTestszM
    Tests for various aspects of the IMAP4 server's pipelining support.
    r6   r;  Nr>     2c                B   g | _         t                      | _        t          j        d d | j                  | _        | j                            | j                   t          | j	                  }d| j        _
        || j        _        | j                                         d S r  )	iteratorsr   r  r   r  iterateInReactorr  r  r
  r   rV  r_  r  )rE   r]  s     r4   r  zPipeliningTests.setUp  s    (**'dD4IJJ""4>222$T]33 %" 	r6   c                d    t          j                    }| j                            ||f           |S )z
        A fake L{imap4.iterateInReactor} that records the iterators it
        receives.

        @param iterator: An iterator.

        @return: A L{Deferred} associated with this iterator.
        )r   r   r
  r|   )rE   iteratorr   s      r4   r
  z PipeliningTests.iterateInReactor  s0     Nxm,,,r6   c                     dS r  r1   r1   r6   r4   r5   zPipeliningTests.<lambda>  s    D r6   c                T   | j         r |            r| j         d         d         D ]8}| j        j        r*| j        j                                         | j        j        *9| j                             d          d                             d           | j         r |            dS dS dS dS )a  
        Advance pending iterators enqueued with L{iterateInReactor} in
        a round-robin fashion, resuming the transport's producer until
        it has completed.  This ensures bodies are flushed.

        @param asLongAs: (optional) An optional predicate function.
            Flushing iterators continues as long as there are
            iterators and this returns L{True}.
        r   r   N)r
  r  producerr~   rZ  r  )rE   asLongAses      r4   flushPendingzPipeliningTests.flushPending  s     n 	8 	8^A&q) 8 8n- >N+;;=== n- > ""1%%a(11$777 n 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8r6   c                    | j                             t          j        t	          j                                         d S r0   r  rR   s    r4   r  zPipeliningTests.tearDown  r  r6   c                   | j                             d           |                                  |                     | j                                        d                    dt          dt          | j	        d         
                                                                                    dt          dt          | j	        d         
                                                                                    d	t          d
t          | j	        d         
                                                                                    g                     dS )z
        Test that pipelined FETCH commands which can be responded to
        synchronously are responded to correctly.
        s9   01 FETCH 1 BODY[]
02 FETCH 2 BODY[]
03 FETCH 3 BODY[]
r6      * 1 FETCH (BODY[] )
 01 OK FETCH completed
{5}


r      * 2 FETCH (BODY[] )
z 02 OK FETCH completed
{5}


r   s   * 3 FETCH (BODY[] )
z 03 OK FETCH completed
{5}


r   N)r  r  r%
  rB   r  r  r   r)   r(   r   r  rW   rR   s    r4   test_synchronousFetchz%PipeliningTests.test_synchronousFetch  sQ    	  V	
 	
 	
 	N  ""HH.!M'a(8(D(D(F(F(K(K(M(MNNNQ  /!M'a(8(D(D(F(F(K(K(M(MNNNQ  /!M'a(8(D(D(F(F(K(K(M(MNNNQ  	
 	
 	
 	
 	
r6   c                   | j                             d           t          j        t          t          g d                    }|                     |           |                     | j        	                                d
                    dt          dt          | j        d                                                                                             g                     | j                                         | j                             d	           |                     | j        	                                           |                                  |                     | j        	                                d
                    d
dt          dt          | j        d                                                                                             g                     dS )z
        When a server status change occurs during an ongoing FETCH
        command, the server status is buffered until the FETCH
        completes.
        s   01 FETCH 1,2 BODY[]
)TTF)r#
  r6   r(
  z	{5}


r   T)r  r*
  s   * [READ-WRITE]
r)
  r   N)r  r  	functoolspartialnextrZ  r%
  rB   r  r  r   r)   r(   r   r  rW   r  r  rS  )rE   twices     r4   test_bufferedServerStatusz)PipeliningTests.test_bufferedServerStatus  s    	  !;<<< !$-@-@-@(A(ABB5)))N  ""HH /!M'a(8(D(D(F(F(K(K(M(MNNNQ 	
 
	
 	
 	
 	 	$/// 	--//000N  ""HH /)!M'a(8(D(D(F(F(K(K(M(MNNNQ 
 	
 	
 	
 	
 	
r6   )rs   rt   ru   r2  r   r   r  r
  r%
  r  r+
  r1
  r1   r6   r4   r
  r
    s         
 	RS$d33RS$d33RS$d33H      %1L 8 8 8 8"L L L!
 !
 !
F5
 5
 5
 5
 5
r6   r
  c                      e Zd ZdZd Zd ZdS )IMAP4ServerFetchTestszV
    This test case is for the FETCH tests that require
    a C{StringTransport}.
    c                    t                      | _        t          j                    | _        d| j        _        | j                            | j                   d S r  )r   r  r   r  r  rV  r  rR   s    r4   r  zIMAP4ServerFetchTests.setUp!  sG    (**'))$""4>22222r6   c                T   | j                                          | j                            d           d}|                     | j                                         |           | j                                          | j                            t          j        d                     dS )a  
        If by any chance, extra bytes got appended at the end of a valid
        FETCH arguments, the client should get a BAD - arguments invalid
        response.

        See U{RFC 3501<http://tools.ietf.org/html/rfc3501#section-6.4.5>},
        section 6.4.5,
        s   0001 FETCH 1 FULLL
s+   0001 BAD Illegal syntax: Invalid Argument
r
  N)	r  r  r  r  rB   r  r  r   r  )rE   rg  s     r4   "test_fetchWithPartialValidArgumentz8IMAP4ServerFetchTests.test_fetchWithPartialValidArgument'  s     	  !:;;;C--//:::""5#78K#L#LMMMMMr6   N)rs   rt   ru   r2  r  r6
  r1   r6   r4   r3
  r3
    sA         
3 3 3N N N N Nr6   r3
  c                  0    e Zd ZdZd Zd Zd Zd Zd ZdS )LiteralTestsMixinz
    Shared tests for literal classes.

    @ivar literalFactory: A callable that returns instances of the
        literal under test.
    c                6    t          j                    | _        dS )z
        Shared setup.
        N)r   r   r  rR   s    r4   r  zLiteralTestsMixin.setUpB  s     ((r6   c                    |                      d| j                  }|                     d|                    d                     |                     | j                   dS )ze
        The literal returns L{None} when given less data than the
        literal requires.
        rN	  Ns
   incomplete)literalFactoryr  r  r\   assertNoResult)rE   literals     r4   test_partialWritez#LiteralTestsMixin.test_partialWriteH  sW    
 %%dDM::dGMM-88999DM*****r6   c                   d}|                      t          |          | j                  }|                    |          }|                     |t
                     |                     |           |                     | j                   dS )zz
        The literal returns an empty L{bytes} instance when given
        exactly the data the literal requires.
           completeN)r;
  r   r  r\   r  rL   rS  r<
  rE   datar=
  leftovers       r4   test_exactWritez!LiteralTestsMixin.test_exactWriteQ  s}    
 %%c$ii??==&&h..."""DM*****r6   c                    d}|                      t          d          | j                  }|                    |          }|                     |d           dS )zt
        The literal returns any left over L{bytes} when given more
        data than the literal requires.
        s   completeleftoverr@
     leftoverN)r;
  r   r  r\   rB   rA
  s       r4   test_overlongWritez$LiteralTestsMixin.test_overlongWrite^  sU    
 #%%c+&6&6FF==&&;/////r6   c                    |                      d| j                  }d}|                    |          }|                     ||           dS )zo
        The literal returns an empty L{bytes} instance
        when given an empty L{bytes} instance.
        r   rF
  N)r;
  r  r\   rB   )rE   r=
  rB
  rC
  s       r4   test_emptyLiteralz#LiteralTestsMixin.test_emptyLiteralj  sM    
 %%a77==&&4(((((r6   N)	rs   rt   ru   r2  r  r>
  rD
  rG
  rI
  r1   r6   r4   r8
  r8
  :  si         ) ) )+ + ++ + +
0 
0 
0
) 
) 
) 
) 
)r6   r8
  c                  &    e Zd ZdZej        Zd ZdS )LiteralStringTestsz+
    Tests for L{self.literalFactory}.
    c                8   d}d}t          j        t          |          | j                  }t	          |          D ]}|                    |           |                    d           |                     | j                  }|                     |||f           dS )z
        Calling L{imap4.LiteralString.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the collected data and whose second is the provided line.
           datar6  N)	r   LiteralStringr   r  r'   r\   r  r  rB   )rE   rB
  extrar=
  r   r2   s         r4   test_callbackz LiteralStringTests.test_callback~  s     %c$ii??4 	 	AMM!"""%%dm44$/////r6   N)rs   rt   ru   r2  r   rN
  r;
  rP
  r1   r6   r4   rK
  rK
  w  s7          (N0 0 0 0 0r6   rK
  c                  ,    e Zd ZdZej        Zd Zd ZdS )LiteralFileTestsz)
    Tests for L{imap4.LiteralFile}.
    c                   d}d}t          j        t          |          | j                  }t	          |          D ]}|                    |           |                    d           |                     | j                  }|                     t          |          d           |\  }}|                     |	                                d           dS )z
        Calling L{imap4.LiteralFile.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the file and whose second is the provided line.
        rM
  r6  r   N)
r   LiteralFiler   r  r'   r\   r  r  rB   rW   rE   rB
  rO
  r=
  r   r2   dataFiles          r4   rP
  zLiteralFileTests.test_callback  s     #CIIt}==4 	 	AMM!"""%%dm44Va((( %'22222r6   c                   d}d}|                      t          j        dd           t          j        t          |          | j                  }t          |          D ]}|                    |           |                    d           |                     | j                  }| 	                    t          |          d           |\  }}| 	                    |
                                d           dS )a=  
        A L{imap4.LiteralFile} whose size exceeds the maximum
        in-memory size spools its content to disk, and invoking its
        L{callback} with a line fires the instance's L{Deferred} with
        a 2-L{tuple} whose first element is the spooled file and whose second
        is the provided line.
        rM
  r6  _memoryFileLimitr   r   N)r  r   rT
  r   r  r'   r\   r  r  rB   rW   rU
  s          r4   test_callbackSpooledToDiskz+LiteralFileTests.test_callbackSpooledToDisk  s     

5$&8!<<<#CIIt}==4 	 	AMM!"""%%dm44Va((( %'22222r6   N)	rs   rt   ru   r2  r   rT
  r;
  rP
  rY
  r1   r6   r4   rR
  rR
    sF          &N3 3 3,3 3 3 3 3r6   rR
  c                  6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	WriteBufferTestsz)
    Tests for L{imap4.WriteBuffer}.
    c                ,    t                      | _        d S r0   )r   r  rR   s    r4   r  zWriteBufferTests.setUp  s    (**r6   c                    t          j        | j                  }d|j        z  }|                    |           |                     | j                                                   dS )zd
        L{imap4.WriteBuffer} buffers writes that are smaller than its
        buffer size.
           xN)r   WriteBufferr  
bufferSizer\   rS  r  rE   bufrB
  s      r4   r>
  z"WriteBufferTests.test_partialWrite  sY    
 //cn$		$--//00000r6   c                    t          j        | j                  }d|j        dz   z  }|                    |           |                     | j                                        |           dS )z
        L{imap4.WriteBuffer} writes data without buffering it when
        the size of the data exceeds the size of its buffer.
        r^
  r   N)r   r_
  r  r`
  r\   rB   r  ra
  s      r4   rG
  z#WriteBufferTests.test_overlongWrite  s`    
 //s~)*		$--//66666r6   c                \   t          j        | j                  }d|j        z  }d}|                    |           |                     | j                                                   |                    |           |                     | j                                        ||z              dS )zp
        L{imap4.WriteBuffer} buffers writes until its buffer's size
        exceeds its maximum value.
        r^
     yN)r   r_
  r  r`
  r\   rS  r  rB   )rE   rb
  	firstData
secondDatas       r4   test_writesImplyFlushz&WriteBufferTests.test_writesImplyFlush  s    
 //3>)	
		)--//000		*--//Z1GHHHHHr6   c                P   t          j        | j                  }d|j        z  }|                    |           |                     | j                                                   |                                 |                     | j                                        |           dS )z{
        L{imap4.WriteBuffer.flush} flushes the buffer even when its
        size is smaller than the buffer size.
        r^
  N)	r   r_
  r  r`
  r\   rS  r  flushrB   ra
  s      r4   test_explicitFlushz#WriteBufferTests.test_explicitFlush  s    
 //s~&		$--//000		--//66666r6   c                    t          j        | j                  }|                                 |                     | j                                                   dS )z_
        L{imap4.WriteBuffer.flush} has no effect if when the buffer is
        empty.
        N)r   r_
  r  rj
  rS  r  )rE   rb
  s     r4   test_explicitFlushEmptyBufferz.WriteBufferTests.test_explicitFlushEmptyBuffer  sK    
 //		--//00000r6   N)
rs   rt   ru   r2  r  r>
  rG
  rh
  rk
  rm
  r1   r6   r4   r[
  r[
    s{         + + +
1 
1 
1
7 
7 
7I I I"7 7 7 	1 	1 	1 	1 	1r6   r[
  )r2  
__future__r   r  rU   r-
  r  r  r   collectionsr   ior   	itertoolsr   typingr   r	   unittestr
   zope.interfacer   zope.interface.verifyr   r   twisted.cred.checkersr   twisted.cred.credentialsr   r   r   twisted.cred.errorr   twisted.cred.portalr   r   twisted.internetr   r   r   r   twisted.internet.deferr   twisted.internet.taskr   twisted.internet.testingr   r   twisted.mailr   twisted.mail.imap4r   twisted.mail.interfacesr    r!   r"   twisted.protocolsr#   twisted.pythonr$   r%   r&   twisted.python.compatr'   r(   r)   twisted.trial.unittestr*   r+   twisted.test.ssl_helpersr,   r-   ImportErrorr7   r9   rw   r   r   r4  IMailboxInfoIMailboxICloseableMailboxrW  r  MemoryAccountWithoutNamespacesr  r  r  r  r  r  r  r  r  r  rT  r  r  r  r+  r6  rp  r  r  r  r  r  r  r  r$  r2  r|  r  r  r  IMessageFancyStrMixinr   r  r  rU  r	  ISearchableMailboxr<	  rc	  IMessageFilerh	  IMessageCopierrn	  rs	  IReactorSSLr	  r	  r	  r
  r
  r
  r3
  r8
  rK
  rR
  r[
  r1   r6   r4   <module>r
     sr    # " " " " "        				  # # # # # #             ! ! ! ! ! ! ! !       & & & & & & ; ; ; ; ; ; ; ; I I I I I I         
 1 0 0 0 0 0 . . . . . . . . > > > > > > > > > > > > + + + + + + ' ' ' ' ' ' V V V V V V V V       ) ) ) ) ) )         
 ' & & & & & - - - - - - - - - - H H H H H H H H H H @ @ @ @ @ @ @ @KKKKKKKKK   
# # #b; b; b; b; b;X b; b; b;J       "d) d) d) d) d). d) d) d)NHV HV HV HV HV) HV HV HVV
q+ q+ q+ q+ q+x q+ q+ q+h U1HIIP P P P P P P JIPf U00T T T T T T T 10Tn    uC   "    &(;   3 3 3 3 35$ 3 3 3,( ( ( ( (5$ ( ( (,., ., ., ., ., ., ., .,b_/ _/ _/ _/ _/' _/ _/ _/Da2 a2 a2 a2 a21 a2 a2 a2HdX dX dX dX dX-x dX dX dXN V@ @ @ @ @ @ @ @:" " " " " " " ""h4 h4 h4 h4 h4)8 h4 h4 h4V/
 /
 /
 /
 /
X /
 /
 /
ddT dT dT dT dT/ dT dT dTNL" L" L" L" L"H L" L" L"^
$ 
$ 
$ 
$ 
$* 
$ 
$ 
$L L L L L' L L L^B B B B B B B B6EI EI EI EI EI1 EI EI EIP    13F   (    02E   *+= += += += +=57J += += +=\/= /= /= /= /=46I /= /= /=d\
 \
 \
 \
 \
35H \
 \
 \
~JT JT JT JT JT3X JT JT JTZ,= ,= ,= ,= ,=46I ,= ,= ,=^KS KS KS KS KS24G KS KS KS\    %#    U^$" $" $" $" $"4% $" $" $"N?! ?! ?! ?! ?!H. ?! ?! ?!Da
 a
 a
 a
 a
H a
 a
 a
HK% K% K% K% K%H. K% K% K%\s s s s s)8 s s sl U%&&X X X X XH&6 X X '&Xv# # # # # # # # U                !   U!""       #"N% N% N% N% N%h N% N% N%b 344"J"7D1113PQQU2 U2 U2 U2 U2 U2 U2 RQ 54U2p    -       #X   D	 	 	 	 	 	 	 	. . . . . . . .T
 T
 T
 T
 T
h T
 T
 T
nN N N N NH N N N>:) :) :) :) :) :) :) :)z0 0 0 0 0*,? 0 0 0653 53 53 53 53(( 53 53 53pJ1 J1 J1 J1 J1* J1 J1 J1 J1 J1s   C 	CC