o
    ¯bTU  ã                   @   sò  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Z	d dl
mZmZmZmZ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 d d
lmZ d dlmZ z
d dl m!Z!m"Z" W n e#ym   dZ!dZ"Y nw G dd„ deƒZ$dddddddœZ%d0dd„Z&dd„ Z'G dd„ deƒZ(G dd„ dƒZ)G dd„ dƒZ*G dd„ deƒZ+G dd „ d eƒZ,G d!d"„ d"eƒZ-G d#d$„ d$eƒZ.G d%d&„ d&ƒZ/G d'd(„ d(ej0ƒZ1ee! d)ƒee 2ed¡ d)ƒG d*d+„ d+eƒƒƒZ3G d,d-„ d-e/eƒZ4G d.d/„ d/eƒZ5dS )1é    N)ÚList)ÚskipIf)ÚdirectlyProvides)ÚdeferÚerrorÚ
interfacesÚprotocolÚreactor)ÚAdvancedPOP3ClientÚ InsecureAuthenticationDisallowedÚServerErrorResponse)Úpop3testserver)ÚbasicÚloopback)Úlog)ÚStringTransport)ÚTestCase)ÚClientTLSContextÚServerTLSContextc                   @   ó   e Zd Zdd„ ZdS )Ú#StringTransportWithConnectionLosingc                 C   s   | j  t ¡ ¡ d S ©N)r   ÚconnectionLostr   ÚConnectionDone©Úself© r   úC/usr/lib/python3/dist-packages/twisted/mail/test/test_pop3client.pyÚloseConnection!   ó   z2StringTransportWithConnectionLosing.loseConnectionN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r       ó    r   s   180s   LOGIN)s   TOPs   LOGIN-DELAYs   UIDLó   STLSs   USERs   SASLTc                 C   s8   t ƒ }t|_tƒ }||_| |¡ | r| d¡ ||fS )Ns   +OK Hello!
)Ú
POP3ClientÚcapCacheÚ	_capCacher   r   ÚmakeConnectionÚdataReceived)ÚgreetÚpÚtr   r   r   ÚsetUp/   s   

r-   c                 C   s   | fdd„S )Nc                 S   s   |ƒ S r   r   )ÚresultÚfr   r   r   Ú<lambda>A   s    zstrip.<locals>.<lambda>r   )r/   r   r   r   Ústrip@   s   r1   c                   @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPOP3ClientLoginTestsc                    sD   t dd�\}}d|_| dd¡}| d¡ ˆ  |t¡ ‡ fdd„¡S )	NF©r*   Tó   usernameó   passwords   -ERR Offline for maintenance
c                    ó   ˆ   | jd d¡S )Nr   s   Offline for maintenance©ÚassertEqualÚargs©Úexcr   r   r   r0   K   ó    z;POP3ClientLoginTests.testNegativeGreeting.<locals>.<lambda>)r-   ÚallowInsecureLoginÚloginr)   ÚassertFailurer   ÚaddCallback©r   r+   r,   Údr   r   r   ÚtestNegativeGreetingE   s   

ÿz)POP3ClientLoginTests.testNegativeGreetingc                 C   ó<   t ƒ \}}| d¡}|  | ¡ d¡ | d¡ | | jd¡S )Nr4   ó   USER username
s   +OK send password
s   send password)r-   Úuserr8   Úvaluer)   r@   rA   r   r   r   Ú
testOkUserN   ó
   


zPOP3ClientLoginTests.testOkUserc                    óH   t ƒ \}}| d¡}ˆ  | ¡ d¡ | d¡ ˆ  |t¡ ‡ fdd„¡S )Nr4   rE   s   -ERR account suspended
c                    r6   )Nr   s   account suspendedr7   r:   r   r   r   r0   [   r<   z2POP3ClientLoginTests.testBadUser.<locals>.<lambda>)r-   rF   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestBadUserU   ó   



ÿz POP3ClientLoginTests.testBadUserc                 C   rD   )Nr5   ó   PASS password
s   +OK you're in!
s
   you're in!)r-   Úpasswordr8   rG   r)   r@   rA   r   r   r   Ú
testOkPass^   rI   zPOP3ClientLoginTests.testOkPassc                    rJ   )Nr5   rM   s   -ERR go away
c                    r6   )Nr   s   go awayr7   r:   r   r   r   r0   k   r<   z2POP3ClientLoginTests.testBadPass.<locals>.<lambda>)r-   rN   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestBadPasse   rL   z POP3ClientLoginTests.testBadPassc                 C   s^   t ƒ \}}d|_| dd¡}|  | ¡ d¡ | d¡ |  | ¡ d¡ | d¡ | | jd¡S )	NTr4   r5   rE   s   +OK go ahead
ó   USER username
PASS password
s   +OK password accepted
s   password accepted)r-   r=   r>   r8   rG   r)   r@   rA   r   r   r   ÚtestOkLoginn   s   


z POP3ClientLoginTests.testOkLoginc                    sj   t ƒ \}}d|_| dd¡}ˆ  | ¡ d¡ | d¡ ˆ  | ¡ d¡ | d¡ ˆ  |t¡ ‡ fdd	„¡S )
NTr4   r5   rE   s   +OK waiting on you
rQ   ó   -ERR bogus login
c                    r6   ©Nr   s   bogus loginr7   r:   r   r   r   r0   �   r<   z;POP3ClientLoginTests.testBadPasswordLogin.<locals>.<lambda>©	r-   r=   r>   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestBadPasswordLoginx   s   



ÿz)POP3ClientLoginTests.testBadPasswordLoginc                    sP   t ƒ \}}d|_| dd¡}ˆ  | ¡ d¡ | d¡ ˆ  |t¡ ‡ fdd„¡S )NTr4   r5   rE   rS   c                    r6   rT   r7   r:   r   r   r   r0   ‹   r<   z;POP3ClientLoginTests.testBadUsernameLogin.<locals>.<lambda>rU   rA   r   r   r   ÚtestBadUsernameLogin„   s   


ÿz)POP3ClientLoginTests.testBadUsernameLoginc                 C   s*   t dd�\}}| d¡ |  |jd ¡ d S )NFr3   s"   +OK lalala this has no challenge
©r-   r)   r8   ÚserverChallenge©r   r+   r,   r   r   r   ÚtestServerGreetingŽ   ó   
z'POP3ClientLoginTests.testServerGreetingc                 C   s*   t dd�\}}| d¡ |  |jd¡ d S )NFr3   s   +OK <here is the challenge>
s   <here is the challenge>rX   rZ   r   r   r   ÚtestServerGreetingWithChallenge“   r\   z4POP3ClientLoginTests.testServerGreetingWithChallengec                 C   sL   t dd�\}}| d¡ | dd¡}|  | ¡ d¡ | d¡ | | jd¡S )	NFr3   s"   +OK <challenge string goes here>
r4   r5   s0   APOP username f34f1e464d0d7927607753129cabe39a
s   +OK Welcome!
s   Welcome!)r-   r)   r>   r8   rG   r@   rA   r   r   r   ÚtestAPOP˜   s   
ÿ
zPOP3ClientLoginTests.testAPOPc                 C   s>   t dd�\}}| d¡ | dd¡}|  | ¡ ¡ |  |t¡S )NFr3   ó   +OK Howdy
r4   r5   )r-   r)   r>   ÚassertFalserG   r?   r   rA   r   r   r   Ú testInsecureLoginRaisesException¢   s
   
z5POP3ClientLoginTests.testInsecureLoginRaisesExceptionc                 C   sp   t dd�\}}t|tjƒ | d¡ | dd¡}|  | ¡ d¡ | ¡  | d¡ |  | ¡ d¡ | d¡ |S )	zÕ
        If a server doesn't offer APOP but the transport is secured using
        SSL or TLS, a plaintext login should be allowed, not rejected with
        an InsecureAuthenticationDisallowed exception.
        Fr3   r_   r4   r5   rE   s   +OK
rM   )	r-   r   r   ÚISSLTransportr)   r>   r8   rG   ÚclearrA   r   r   r   Ú testSSLTransportConsideredSecure©   s   


z5POP3ClientLoginTests.testSSLTransportConsideredSecureN)r    r!   r"   rC   rH   rK   rO   rP   rR   rV   rW   r[   r]   r^   ra   rd   r   r   r   r   r2   D   s    			


r2   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚListConsumerc                 C   s
   i | _ d S r   ©Údatar   r   r   r   Ú__init__¼   ó   
zListConsumer.__init__c                 C   s    |\}}| j  |g ¡ |¡ d S r   )rh   Ú
setdefaultÚappend)r   r.   ÚitemrG   r   r   r   Úconsume¿   s   zListConsumer.consumeN©r    r!   r"   ri   rn   r   r   r   r   rf   »   ó    rf   c                   @   re   )ÚMessageConsumerc                 C   s
   g | _ d S r   rg   r   r   r   r   ri   Å   rj   zMessageConsumer.__init__c                 C   s   | j  |¡ d S r   )rh   rl   ©r   Úliner   r   r   rn   È   ó   zMessageConsumer.consumeNro   r   r   r   r   rq   Ä   rp   rq   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚPOP3ClientListTestsc                 C   óH   t ƒ \}}| ¡ }|  | ¡ d¡ | d¡ | d¡ | | jg d¢¡S )Nó   LIST
ó   +OK Here it comes
s   1 3
2 2
3 1
.
)é   é   é   )r-   ÚlistSizer8   rG   r)   r@   rA   r   r   r   ÚtestListSizeÍ   ó   


z POP3ClientListTests.testListSizec              
   C   sª   t ƒ \}}tƒ }|j}| |¡}|  | ¡ d¡ | d¡ | d¡ |  |jdgdgdgdœ¡ | d¡ |  |jdgdgdgdgdgdgd	œ¡ | d
¡ | | j	|¡S )Nrw   rx   s   1 3
2 2
3 1
ry   rz   r{   )r   r{   rz   s   5 3
6 2
7 1
)r   r{   rz   é   é   é   ó   .
)
r-   rf   rn   r|   r8   rG   r)   rh   r@   ÚassertIdentical©r   r+   r,   Úcr/   rB   r   r   r   ÚtestListSizeWithConsumerÕ   s   




(
z,POP3ClientListTests.testListSizeWithConsumerc                    óF   t ƒ \}}| ¡ }ˆ  | ¡ d¡ | d¡ ˆ  |t¡ ‡ fdd„¡S )Nrw   ó!   -ERR Fatal doom server exploded
c                    r6   ©Nr   s   Fatal doom server explodedr7   r:   r   r   r   r0   é   r<   z8POP3ClientListTests.testFailedListSize.<locals>.<lambda>)r-   r|   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestFailedListSizeã   ó   


ÿz&POP3ClientListTests.testFailedListSizec                 C   rv   )Nó   UIDL
rx   s   1 abc
2 def
3 ghi
.
)ó   abcs   defs   ghi)r-   ÚlistUIDr8   rG   r)   r@   rA   r   r   r   ÚtestListUIDì   r~   zPOP3ClientListTests.testListUIDc                 C   sx   t ƒ \}}tƒ }|j}| |¡}|  | ¡ d¡ | d¡ | d¡ |  |jdgdgdgdœ¡ | d¡ | | j	|¡S )	NrŒ   rx   s   1 xyz
2 abc
5 mno
s   xyzr�   s   mno)r   r{   r   r‚   )
r-   rf   rn   rŽ   r8   rG   r)   rh   r@   rƒ   r„   r   r   r   ÚtestListUIDWithConsumerô   s   




z+POP3ClientListTests.testListUIDWithConsumerc                    r‡   )NrŒ   rˆ   c                    r6   r‰   r7   r:   r   r   r   r0     r<   z7POP3ClientListTests.testFailedListUID.<locals>.<lambda>)r-   rŽ   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestFailedListUID   r‹   z%POP3ClientListTests.testFailedListUIDN)	r    r!   r"   r}   r†   rŠ   r�   r�   r‘   r   r   r   r   ru   Ì   s    	ru   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚPOP3ClientMessageTestsc                 C   s^   t ƒ \}}| d¡}|  | ¡ d¡ | d¡ | d¡ | d¡ | d¡ | | jddg¡S )	Né   ó   RETR 8
ó   +OK Message incoming
ó   La la la here is message text
s"   ..Further message text tra la la
r‚   ó   La la la here is message texts   .Further message text tra la la©r-   Úretriever8   rG   r)   r@   rA   r   r   r   ÚtestRetrieve  s   





þz#POP3ClientMessageTests.testRetrievec                 C   s`   t ƒ \}}tƒ }|j}| d|¡}|  | ¡ d¡ | d¡ | d¡ | d¡ | | j||¡S )Nr“   r”   r•   r–   s   ..Further message text
.
)	r-   rq   rn   r™   r8   rG   r)   r@   Ú_cbTestRetrieveWithConsumerr„   r   r   r   ÚtestRetrieveWithConsumer  s   



z/POP3ClientMessageTests.testRetrieveWithConsumerc                 C   ó"   |   ||¡ |  |jddg¡ d S )Nr—   s   .Further message text©rƒ   r8   rh   ©r   r.   r/   r…   r   r   r   r›   #  s   
ÿz2POP3ClientMessageTests._cbTestRetrieveWithConsumerc                 C   sb   t ƒ \}}|jddd�}|  | ¡ d¡ | d¡ | d¡ | d¡ | d¡ | | jd	d
g¡S )Nr“   rz   ©Úlinesó	   TOP 8 2
ó   +OK 2 lines on the way
ó   Line the first!  Woop
ó   Line the last!  Bye
r‚   ó   Line the first!  Woopó   Line the last!  Byer˜   rA   r   r   r   ÚtestPartialRetrieve)  s   





ÿz*POP3ClientMessageTests.testPartialRetrievec                 C   sn   t ƒ \}}tƒ }|j}|jd|dd�}|  | ¡ d¡ | d¡ | d¡ | d¡ | d¡ | | j||¡S )	Nr“   rz   r    r¢   r£   r¤   r¥   r‚   )	r-   rq   rn   r™   r8   rG   r)   r@   Ú"_cbTestPartialRetrieveWithConsumerr„   r   r   r   ÚtestPartialRetrieveWithConsumer5  s   




z6POP3ClientMessageTests.testPartialRetrieveWithConsumerc                 C   r�   )Nr¦   r§   rž   rŸ   r   r   r   r©   A  s   z9POP3ClientMessageTests._cbTestPartialRetrieveWithConsumerc                    rJ   )Nr   s   RETR 1
rˆ   c                    r6   r‰   r7   r:   r   r   r   r0   K  r<   z;POP3ClientMessageTests.testFailedRetrieve.<locals>.<lambda>)r-   r™   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestFailedRetrieveE  rL   z)POP3ClientMessageTests.testFailedRetrievec                    s¢   t ƒ \‰ }‡ ‡fdd„tdƒD ƒ}tddƒD ]3}ˆ | ¡ d|f ¡ | ¡  ˆ  d¡ ˆ  d|f ¡ ˆ  d	|f ¡ ˆ | ¡ d
¡ ˆ  d¡ qtj|dd�S )z‘
        Issue three retrieve calls immediately without waiting for any to
        succeed and make sure they all do succeed eventually.
        c              	      s8   g | ]}ˆ   |¡ ˆjd |d f d|d f g¡‘qS )s   First line of %d.r{   s   Second line of %d.)r™   r@   r8   )Ú.0Úi©r+   r   r   r   Ú
<listcomp>T  s    
üþÿzCPOP3ClientMessageTests.test_concurrentRetrieves.<locals>.<listcomp>ry   r{   r   s	   RETR %d
r£   s   First line of %d.
s   Second line of %d.
ó    r‚   T)ÚfireOnOneErrback)r-   Úranger8   rG   rc   r)   r   ÚDeferredList)r   r,   Úmessagesr­   r   r®   r   Útest_concurrentRetrievesN  s   
û
z/POP3ClientMessageTests.test_concurrentRetrievesN)r    r!   r"   rš   rœ   r›   r¨   rª   r©   r«   rµ   r   r   r   r   r’   
  s    	r’   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚPOP3ClientMiscTestsc              
   C   s`   t ƒ \}}|jdd�}|  | ¡ d¡ | d¡ | d¡ | | jd d d g d¢ddgdgd	œ¡S )
Nr   ©ÚuseCacheó   CAPA
s   +OK Capabilities on the way
s!   X
Y
Z
A 1 2 3
B 1 2
C 1
.
)ó   1ó   2ó   3rº   r»   )ó   Xó   Yó   Zó   Aó   Bó   C©r-   Úcapabilitiesr8   rG   r)   r@   rA   r   r   r   ÚtestCapabilityi  s   


úþz"POP3ClientMiscTests.testCapabilityc                 C   s>   t ƒ \}}|jdd�}|  | ¡ d¡ | d¡ | | ji ¡S )Nr   r·   r¹   ó   -ERR This server is lame!
rÃ   rA   r   r   r   ÚtestCapabilityError{  s
   

z'POP3ClientMiscTests.testCapabilityErrorc                 C   ó:   t ƒ \}}| ¡ }|  | ¡ d¡ | d¡ | | jd¡S )Nó   STAT
s   +OK 1 1212
)r{   i¼  )r-   Ústatr8   rG   r)   r@   rA   r   r   r   ÚtestStat‚  ó
   

zPOP3ClientMiscTests.testStatc                    r‡   )NrÉ   rÆ   c                    r6   ©Nr   s   This server is lame!r7   r:   r   r   r   r0   �  r<   z3POP3ClientMiscTests.testStatError.<locals>.<lambda>)r-   rÊ   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestStatError‰  r‹   z!POP3ClientMiscTests.testStatErrorc                 C   rÈ   )Nó   NOOP
s   +OK No-op to you too!
s   No-op to you too!)r-   Únoopr8   rG   r)   r@   rA   r   r   r   ÚtestNoop’  rÌ   zPOP3ClientMiscTests.testNoopc                    r‡   )NrÏ   rÆ   c                    r6   rÍ   r7   r:   r   r   r   r0   Ÿ  r<   z3POP3ClientMiscTests.testNoopError.<locals>.<lambda>)r-   rÐ   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestNoopError™  r‹   z!POP3ClientMiscTests.testNoopErrorc                 C   rÈ   )Nó   RSET
s   +OK Reset state
s   Reset state)r-   Úresetr8   rG   r)   r@   rA   r   r   r   ÚtestRset¢  rÌ   zPOP3ClientMiscTests.testRsetc                    r‡   )NrÓ   rÆ   c                    r6   rÍ   r7   r:   r   r   r   r0   ¯  r<   z3POP3ClientMiscTests.testRsetError.<locals>.<lambda>)r-   rÔ   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestRsetError©  r‹   z!POP3ClientMiscTests.testRsetErrorc                 C   rD   )Nry   ó   DELE 4
s   +OK Hasta la vista
s   Hasta la vista)r-   Údeleter8   rG   r)   r@   rA   r   r   r   Ú
testDelete²  rI   zPOP3ClientMiscTests.testDeletec                    rJ   )Nry   r×   s   -ERR Winner is not you.
c                    r6   )Nr   s   Winner is not you.r7   r:   r   r   r   r0   ¿  r<   z5POP3ClientMiscTests.testDeleteError.<locals>.<lambda>)r-   rØ   r8   rG   r)   r?   r   r@   rA   r   r   r   ÚtestDeleteError¹  rL   z#POP3ClientMiscTests.testDeleteErrorN)r    r!   r"   rÅ   rÇ   rË   rÎ   rÑ   rÒ   rÕ   rÖ   rÙ   rÚ   r   r   r   r   r¶   h  s    			r¶   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚSimpleClientNc                 C   s   || _ d| _d S )NT)Údeferredr=   )r   rÜ   ÚcontextFactoryr   r   r   ri   Ä  s   
zSimpleClient.__init__c                 C   s   | j  d ¡ d S r   )rÜ   Úcallback)r   Ú	challenger   r   r   ÚserverGreetingÈ  rt   zSimpleClient.serverGreetingr   )r    r!   r"   ri   rà   r   r   r   r   rÛ   Ã  s    
rÛ   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚPOP3HelperMixinNc                 C   s:   t  ¡ }tj| jd�| _t|| jd�| _d| j_	|| _
d S )N)rÝ   é   )r   ÚDeferredr   ÚPOP3TestServerÚ	serverCTXÚserverrÛ   Ú	clientCTXÚclientÚtimeoutÚ	connected)r   rB   r   r   r   r-   Ð  s
   
zPOP3HelperMixin.setUpc                 C   s   | ` | `| `d S r   )ræ   rè   rê   r   r   r   r   ÚtearDown×  s   zPOP3HelperMixin.tearDownc                 C   s   | j j ¡  d S r   )rè   Ú	transportr   )r   Úignorer   r   r   Ú_cbStopClientÜ  rt   zPOP3HelperMixin._cbStopClientc                 C   s   | j j ¡  | jj ¡  |S r   )rè   rì   r   ræ   )r   Úfailurer   r   r   Ú
_ebGeneralß  s   zPOP3HelperMixin._ebGeneralc                 C   s   t j| j| jdd�S )NF)Únoisy)r   ÚloopbackTCPræ   rè   r   r   r   r   r   ä  r   zPOP3HelperMixin.loopback)
r    r!   r"   rå   rç   r-   rë   rî   rð   r   r   r   r   r   rá   Ì  s    rá   c                   @   s   e Zd ZG dd„ dejƒZdS )ÚTLSServerFactoryc                   @   s2   e Zd ZU dZg Zee ed< dd„ Zdd„ Z	dS )zTLSServerFactory.protocolNÚoutputc                 C   s8   g | j _| jd d … | _| j d¡D ]}|  |¡ qd S )Nr   )ÚfactoryÚinputrô   ÚpopÚsendLinerr   r   r   r   ÚconnectionMadeí  s
   ÿz(TLSServerFactory.protocol.connectionMadec                    sF   ˆ j j |¡ ‡ fdd„ˆ j d¡D ƒ |dkr!ˆ j ˆ j¡ d S d S )Nc                    s   g | ]}ˆ   |¡‘qS r   )rø   )r¬   Úlr   r   r   r¯   õ  s    z:TLSServerFactory.protocol.lineReceived.<locals>.<listcomp>r   r$   )rõ   rö   rl   rô   r÷   rì   ÚstartTLSÚcontextrr   r   r   r   ÚlineReceivedó  s
   ÿz&TLSServerFactory.protocol.lineReceived)
r    r!   r"   rü   rô   r   ÚbytesÚ__annotations__rù   rý   r   r   r   r   r   é  s
   
 r   N)r    r!   r"   r   ÚLineReceiverr   r   r   r   r   ró   è  s    ró   zOpenSSL not presentc                   @   s   e Zd ZdZdd„ ZdS )ÚPOP3TLSTestsz=
    Tests for POP3Client's support for TLS connections.
    c           
         s  t ƒ ‰dgg d¢dgddgdggˆj_tƒ ˆj_tjdˆdd�}ˆ |j¡ | 	¡ j
}| 	¡ j}t ¡ ‰tt ¡ tƒ ƒ‰‡‡fdd„}|ˆ_t ¡ }‡fd	d
„|_t |||¡‰ ‡fdd„}‡fdd„}‡‡fdd„}‡ ‡fdd„}	ˆj |¡ ˆj |¡ ˆj |¡ ˆj |	¡ ˆjS )zd
        POP3Client.startTLS starts a TLS session over its existing TCP
        connection.
        ó   +OK)r  r$   ó   .r  r   z	127.0.0.1)Ú	interfacec                    s   t  ˆ| ¡ ˆ  d ¡ d S r   )rÛ   r   rÞ   )Úreason)ÚconnLostDeferredÚcpr   r   r     ó   z2POP3TLSTests.test_startTLS.<locals>.connectionLostc                      s   ˆ S r   r   r   ©r  r   r   r0     s    z,POP3TLSTests.test_startTLS.<locals>.<lambda>c                    ó   t  d¡ ˆ  ¡ S )Nz!Connected to server; starting TLS)r   Úmsgrû   ©Úignoredr	  r   r   ÚcbConnected!  ó   
z/POP3TLSTests.test_startTLS.<locals>.cbConnectedc                    r
  )NzStarted TLS; disconnecting)r   r  Úquitr  r	  r   r   ÚcbStartedTLS%  r  z0POP3TLSTests.test_startTLS.<locals>.cbStartedTLSc                    s    t  d¡ ˆ  ˆjg d¢¡ d S )Nz.Disconnected; asserting correct input received)ó   CAPAr$   r  s   QUIT)r   r  r8   rö   )Úign)r   Úsfr   r   ÚcbDisconnected)  s   
z2POP3TLSTests.test_startTLS.<locals>.cbDisconnectedc                    s   t  d¡ ˆ  ¡  ˆS )NzEAsserted correct input; disconnecting client and shutting down server)r   r  Ú
disconnect©r.   )Úconnr  r   r   Úcleanup-  s
   ÿz+POP3TLSTests.test_startTLS.<locals>.cleanup)ró   r   rô   r   rü   r	   Ú	listenTCPÚ
addCleanupÚstopListeningÚgetHostÚhostÚportr   rã   rÛ   r   r   ÚClientFactoryÚ
connectTCPrÜ   r@   ÚaddBoth)
r   r  ÚHÚPr   Úcfr  r  r  r  r   )r  r  r  r   r  r   Útest_startTLS  s8   û


zPOP3TLSTests.test_startTLSN)r    r!   r"   Ú__doc__r&  r   r   r   r   r  ú  s    r  c                   @   r   )ÚPOP3TimeoutTestsc                    s‚   ‡ ‡‡fdd„}‡fdd„‰ ‡fdd„‰‡fdd„}d	ˆj _d
t_||g}tˆjjtt|ƒƒ ˆj ˆj¡ ˆj 	ˆj
¡ ˆ ¡ S )Nc                     s&   ˆj  dd¡} |  ˆ ¡ |  ˆ¡ | S )NÚtestÚtwisted)rè   r>   r@   Ú
addErrback)rB   ©ÚloggedInr   ÚtimedOutr   r   r>   ?  s   

z+POP3TimeoutTests.testTimeout.<locals>.loginc                    s   ˆ   d¡ d S )Nz%Successfully logged in!?  Impossible!)Úfailr  r   r   r   r-  E  s   z.POP3TimeoutTests.testTimeout.<locals>.loggedInc                    s   |   tj¡ ˆ  d ¡ d S r   )Útrapr   ÚTimeoutErrorrî   )rï   r   r   r   r.  H  r  z.POP3TimeoutTests.testTimeout.<locals>.timedOutc                      s
   ˆ j  ¡ S r   )rè   r  r   r   r   r   r  L  rj   z*POP3TimeoutTests.testTimeout.<locals>.quitg{®Gáz„?T)rè   ré   r   ÚTIMEOUT_RESPONSEÚmaprê   r@   r1   rî   r+  rð   r   )r   r>   r  Úmethodsr   r,  r   ÚtestTimeout>  s   zPOP3TimeoutTests.testTimeoutN)r    r!   r"   r5  r   r   r   r   r(  =  r#   r(  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚPOP3ClientModuleStructureTestszt
    Miscellaneous tests more to do with module/package structure than
    anything to do with the POP3 client.
    c                 C   s   |   tjjjg ¡ dS )zŒ
        twisted.mail._pop3client.__all__ should be empty because all classes
        should be imported through twisted.mail.pop3.
        N)r8   r*  ÚmailÚ_pop3clientÚ__all__r   r   r   r   Útest_allb  s   z'POP3ClientModuleStructureTests.test_allc                 C   s‚   dd„ t  tjd t j¡D ƒ}|D ]-}tjdk r|dkrq|dks4|  ttj	j
|ƒ|› dtj	j
› �¡ q|  ttj	j
dƒ¡ qd	S )
a  
        Every public class in twisted.mail._pop3client should be available as
        a member of twisted.mail.pop3 with the exception of
        twisted.mail._pop3client.POP3Client which should be available as
        twisted.mail.pop3.AdvancedClient.
        c                 S   s$   g | ]}|d  d  dks|d  ‘qS )r   Ú_r   )r¬   r…   r   r   r   r¯   p  s
    üz>POP3ClientModuleStructureTests.test_import.<locals>.<listcomp>ztwisted.mail._pop3client)ry   r“   r   r%   z not in r
   N)ÚinspectÚ
getmembersÚsysÚmodulesÚisclassÚversion_infoÚ
assertTrueÚhasattrr*  r7  Úpop3)r   ÚpublicClassesÚpcr   r   r   Útest_importi  s   ÿþþõz*POP3ClientModuleStructureTests.test_importN)r    r!   r"   r'  r:  rG  r   r   r   r   r6  \  s    r6  )T)6r<  r>  Útypingr   Úunittestr   Úzope.interfacer   Útwisted.mail._pop3clientr*  Útwisted.internetr   r   r   r   r	   Útwisted.mail.pop3r
   r%   r   r   Útwisted.mail.testr   Útwisted.protocolsr   r   Útwisted.pythonr   Útwisted.test.proto_helpersr   Útwisted.trial.unittestr   Útwisted.test.ssl_helpersr   r   ÚImportErrorr   r&   r-   r1   r2   rf   rq   ru   r’   r¶   rÛ   rá   ÚServerFactoryró   ÚIReactorSSLr  r(  r6  r   r   r   r   Ú<module>   sV   þú

w	>^[	
A