B
    2*™\KŸ  ã               @   sH  d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZmZmZmZmZmZ d dlZd dlmZ d dlmZmZmZ yd dlZW n ek
rÄ   dZY nX ej ej e¡pÜejd¡Z ej ej e¡pøejd¡Z!G d	d
„ d
ej"ƒZ#er0G dd„ dej$ƒZ%ej&Z&nG dd„ dƒZ%dZ&G dd„ dej'ƒZ(G dd„ dƒZ)G dd„ de)ej"ƒZ*e +ed¡G dd„ de)ej"ƒƒZ,G dd„ dej"ƒZ-e +ed¡G dd„ de-ƒƒZ.e +e /d¡d¡G dd„ dej"ƒƒZ0e +ed¡e +e /d¡d¡G dd „ d e0ƒƒƒZ1e +ed¡G d!d"„ d"e0ƒƒZ2e3d#krDe 4¡  dS )$é    )Úsupport)ÚcontextmanagerN)Úreap_threadsÚverboseÚtransient_internetÚrun_with_tzÚrun_with_localeÚcpython_only)Úmock)ÚdatetimeÚtimezoneÚ	timedeltazkeycert3.pemzpycacert.pemc               @   sX   e Zd Zdd„ Zedƒdd„ ƒZdd„ Zedd	d
ƒedƒdd„ ƒƒZdd„ Z	dd„ Z
dS )ÚTestImaplibc             C   sb   t  d¡}t d¡}|  t |¡|¡ t d¡}|  t |¡|¡ t d¡}|  t |¡|¡ d S )N)	iÐ  é   r   r   r   r   éÿÿÿÿr   r   s.   25 (INTERNALDATE "01-Jan-2000 00:00:00 +0000")s.   25 (INTERNALDATE "01-Jan-2000 11:30:00 +1130")s.   25 (INTERNALDATE "31-Dec-1999 12:30:00 -1130"))ÚcalendarZtimegmÚimaplibÚInternaldate2tupleÚassertEqualÚtimeZmktime)ÚselfZt0Útt© r   ú<C:\ALexclude\prg\programme\Python37\Lib\test\test_imaplib.pyÚtest_Internaldate2tuple   s    
z#TestImaplib.test_Internaldate2tuplezMST+07MDT,M4.1.0,M10.5.0c             C   s   |   t d¡t d¡¡ d S )Ns.   25 (INTERNALDATE "02-Apr-2000 02:30:00 +0000")s.   25 (INTERNALDATE "02-Apr-2000 03:30:00 +0000"))ZassertNotEqualr   r   )r   r   r   r   Ú"test_Internaldate2tuple_issue10941)   s    z.TestImaplib.test_Internaldate2tuple_issue10941c             C   s*   ddt  d¡ddt dttddƒƒ¡dgS )Ni ”5wg    eÍÝA)	iñ  é   é   r   é!   é   r   r   r   )	iñ  r   r   r   r   r   r   r   r   r   i   z"18-May-2033 05:33:20 +0200")r   Z	localtimer   Zfromtimestampr   r   )r   r   r   r   Ú
timevalues0   s    zTestImaplib.timevaluesÚLC_ALLÚde_DEÚfr_FRzSTD-1DST,M3.2.0,M11.1.0c             C   s0   d}x&|   ¡ D ]}t |¡}|  ||¡ qW d S )Nz"18-May-2033 05:33:20 +0200")r    r   ÚTime2Internaldater   )r   ZexpectedÚtZinternalr   r   r   Útest_Time2Internaldate8   s    
z"TestImaplib.test_Time2Internaldatec             C   s    x|   ¡ D ]}t |¡ q
W d S )N)r    r   r$   )r   r%   r   r   r   Ú,test_that_Time2Internaldate_returns_a_resultC   s    z8TestImaplib.test_that_Time2Internaldate_returns_a_resultc          	   C   sš   t   ¡ <}y| dtjf¡ |  d¡ W n t jk
r>   Y nX W d Q R X tjg}ttdƒrh| 	tj
¡ |  t¡}t ¡  W d Q R X |  |jj|¡ d S )NÚ z3Cannot run the test with local IMAP server running.ÚEADDRNOTAVAIL)ÚsocketÚconnectr   Z
IMAP4_PORTZskipTestÚerrorÚerrnoZECONNREFUSEDÚhasattrÚappendr)   ÚassertRaisesÚOSErrorÚIMAP4ÚassertInZ	exception)r   ÚsZexpected_errnosÚcmr   r   r   Útest_imap4_host_default_valueJ   s    


z)TestImaplib.test_imap4_host_default_valueN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r    r   r&   r'   r6   r   r   r   r   r      s   
r   c               @   s   e Zd Zdd„ ZdS )ÚSecureTCPServerc             C   s6   | j  ¡ \}}t ¡ }| t¡ |j|dd}||fS )NT)Zserver_side)r*   ZacceptÚsslÚ
SSLContextÚload_cert_chainÚCERTFILEZwrap_socket)r   Z	newsocketZfromaddrÚcontextZ
connstreamr   r   r   Úget_requestd   s
    
zSecureTCPServer.get_requestN)r7   r8   r9   r@   r   r   r   r   r:   b   s   r:   c               @   s   e Zd ZdS )r:   N)r7   r8   r9   r   r   r   r   r:   o   s   c                   sh   e Zd ZdZdZdZ‡ f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‡  ZS )ÚSimpleIMAPHandlerr   Nr(   c                s   t ƒ  ¡  d | j_d S )N)ÚsuperÚsetupÚserverÚlogged)r   )Ú	__class__r   r   rC   z   s    
zSimpleIMAPHandler.setupc             C   s$   t rtd| ¡  ƒ | j |¡ d S )NzSENT: %r)r   ÚprintÚstripÚwfileÚwrite)r   Úmessager   r   r   Ú_send~   s    zSimpleIMAPHandler._sendc             C   s   |   |d ¡ d S )Ns   
)rL   )r   rK   r   r   r   Ú
_send_lineƒ   s    zSimpleIMAPHandler._send_linec             C   s   |   | d¡¡ d S )NÚASCII)rM   Úencode)r   rK   r   r   r   Ú_send_textline†   s    z SimpleIMAPHandler._send_textlinec             C   s   |   d |||f¡¡ d S )Nú )rP   Újoin)r   ÚtagÚcoderK   r   r   r   Ú_send_tagged‰   s    zSimpleIMAPHandler._send_taggedc             C   s$  |   d¡ xd}xJy$| j d¡}|dkr.d S ||7 }W n tk
rL   d S X | d¡rP qW trrtd| ¡  ƒ | jr¦y| j 	|¡ W q t
k
r¢   d | _Y qX q| d¡ ¡ }|d }|d }|dd … }t| d	| ƒr
t| d	| ƒ||ƒ}|r|| _t|ƒ q|  |d
|d ¡ qW d S )Nz* OK IMAP4rev1ó    r   s   
zGOT: %rrN   r   é   Zcmd_ZBADz unknown)rP   ZrfileÚreadr1   Úendswithr   rG   rH   ÚcontinuationÚsendÚStopIterationÚdecodeÚsplitr.   ÚgetattrÚnextrU   )r   ÚlineÚpartZ	splitlinerS   ÚcmdÚargsrZ   r   r   r   ÚhandleŒ   s>    


zSimpleIMAPHandler.handlec             C   s4   | j rd| j  nd}|  d| ¡ |  |dd¡ d S )Nz
IMAP4rev1 Z	IMAP4rev1z* CAPABILITY ÚOKzCAPABILITY completed)ÚcapabilitiesrP   rU   )r   rS   rd   Zcapsr   r   r   Úcmd_CAPABILITY¶   s    z SimpleIMAPHandler.cmd_CAPABILITYc             C   s$   d | j _|  d¡ |  |dd¡ d S )Nz"* BYE IMAP4ref1 Server logging outrf   zLOGOUT completed)rD   rE   rP   rU   )r   rS   rd   r   r   r   Ú
cmd_LOGOUT½   s    
zSimpleIMAPHandler.cmd_LOGOUTc             C   s   |d | j _|  |dd¡ d S )Nr   rf   zLOGIN completed)rD   rE   rU   )r   rS   rd   r   r   r   Ú	cmd_LOGINÂ   s    zSimpleIMAPHandler.cmd_LOGIN)r7   r8   r9   ZtimeoutrZ   rg   rC   rL   rM   rP   rU   re   rh   ri   rj   Ú__classcell__r   r   )rF   r   rA   u   s   *rA   c               @   sÖ   e Zd ZdZd3d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d „ Zd!d"„ Ze d#d$¡d%d&„ ƒZd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdS )4ÚNewIMAPTestsMixinNTc             C   s„   G dd„ d| j ƒ}|  | j¡ |   tjdf|¡| _tj| jd | jj	ddid| _
d| j
_| j
 ¡  |rx| j| jjŽ | _| j| jfS )	Nc               @   s   e Zd Zdd„ ZdS )z/NewIMAPTestsMixin._setup.<locals>.TestTCPServerc             S   s   |   |¡ |  ¡  ‚ d S )N)Úclose_requestÚserver_close)r   ÚrequestÚclient_addressr   r   r   Úhandle_errorÒ   s    
z<NewIMAPTestsMixin._setup.<locals>.TestTCPServer.handle_errorN)r7   r8   r9   rq   r   r   r   r   ÚTestTCPServerÑ   s   rr   r   z-serverÚpoll_intervalg{®Gáz„?)ÚnameÚtargetÚkwargsT)Úserver_classZ
addCleanupÚ_cleanupr   ÚHOSTrD   Ú	threadingÚThreadZ_testMethodNameÚserve_foreverÚthreadÚdaemonÚstartÚ
imap_classÚserver_addressÚclient)r   Zimap_handlerr+   rr   r   r   r   Ú_setupÊ   s    	
zNewIMAPTestsMixin._setupc             C   sL   | j d k	r | j jdkr | j  ¡  | j ¡  | j ¡  t | jd¡ d | _d S )NÚLOGOUTg      @)r‚   ÚstateÚshutdownrD   rn   r   Zjoin_threadr}   )r   r   r   r   rx   ë   s    


zNewIMAPTestsMixin._cleanupc             C   sB   G dd„ dt jƒ}| j|dd\}}| jtjj| jf|jžŽ  d S )Nc               @   s   e Zd Zdd„ ZdS )zONewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandlerc             S   s   | j  d¡ d S )Ns   * OK)rI   rJ   )r   r   r   r   re   þ   s    zVNewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandler.handleN)r7   r8   r9   re   r   r   r   r   Ú
EOFHandlerý   s   r‡   F)r+   )	ÚsocketserverÚStreamRequestHandlerrƒ   r0   r   r2   Úabortr€   r   )r   r‡   Ú_rD   r   r   r   Ú)test_EOF_without_complete_welcome_messageû   s    z;NewIMAPTestsMixin.test_EOF_without_complete_welcome_messagec             C   s@   G dd„ dt ƒ}| j|dd\}}| jtjj| jf|jžŽ  d S )Nc               @   s   e Zd Zdd„ ZdS )zBNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandlerc             S   s   |   d¡ |  |dd¡ d S )Ns   * CAPABILITY IMAP4rev1 AUTH
rf   zCAPABILITY completed)rL   rU   )r   rS   rd   r   r   r   rh     s    
zQNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYN)r7   r8   r9   rh   r   r   r   r   ÚBadNewlineHandler  s   r   F)r+   )rA   rƒ   r0   r   r2   rŠ   r€   r   )r   r   r‹   rD   r   r   r   Útest_line_termination  s    z'NewIMAPTestsMixin.test_line_terminationc          	   C   s`   G dd„ dt ƒ}|  |¡\}}|  |j¡ |  tjjd¡ | d¡ W d Q R X |  |j¡ d S )Nc               @   s   e Zd ZdZdS )zMNewIMAPTestsMixin.test_enable_raises_error_if_not_AUTH.<locals>.EnableHandlerzAUTH ENABLE UTF8=ACCEPTN)r7   r8   r9   rg   r   r   r   r   ÚEnableHandler  s   r   zENABLE.*NONAUTHÚfoo)	rA   rƒ   ÚassertFalseÚutf8_enabledÚassertRaisesRegexr   r2   r,   Úenable)r   r   r‚   r‹   r   r   r   Ú$test_enable_raises_error_if_not_AUTH  s    z6NewIMAPTestsMixin.test_enable_raises_error_if_not_AUTHc          	   C   s8   |   t¡\}}|  tjjd¡ | d¡ W d Q R X d S )Nzdoes not support ENABLEr   )rƒ   rA   r“   r   r2   r,   r”   )r   r‚   r‹   r   r   r   Ú)test_enable_raises_error_if_no_capability  s    
z;NewIMAPTestsMixin.test_enable_raises_error_if_no_capabilityc          	   C   sT   |   t¡\}}| dd¡\}}|  |d¡ |  tjjd¡ | d¡ W d Q R X d S )NÚuserÚpassrf   zdoes not support ENABLEzUTF8=ACCEPT)	rƒ   rA   Úloginr   r“   r   r2   r,   r”   )r   r‚   r‹   ÚtypÚdatar   r   r   Ú.test_enable_UTF8_raises_error_if_not_supported  s    
z@NewIMAPTestsMixin.test_enable_UTF8_raises_error_if_not_supportedc       	      C   sÈ   G dd„ dt ƒ}|  |¡\}}|  |jd¡ | ddd„ ¡\}}|  |d¡ |  |jd¡ | d	¡\}}|  |d¡ |  |jd
¡ d}| d d d | d
¡¡\}}|  |d¡ |  |jd|  d
¡¡ d S )Nc               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	zHNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServerzENABLE UTF8=ACCEPTc             S   s   |   |dd¡ d S )Nrf   zENABLE successful)rU   )r   rS   rd   r   r   r   Ú
cmd_ENABLE'  s    zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_ENABLEc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nú+rf   zFAKEAUTH successful)rP   rD   ÚresponserU   )r   rS   rd   r   r   r   Úcmd_AUTHENTICATE)  s    

zYNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_AUTHENTICATEc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   Úokay)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   Ú
cmd_APPEND-  s    

zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r7   r8   r9   rg   r   r    r¢   r   r   r   r   ÚUTF8AppendServer%  s   r£   ÚasciiÚMYAUTHc             S   s   dS )Ns   faker   )Úxr   r   r   Ú<lambda>3  rV   z@NewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.<lambda>rf   s
   ZmFrZQ==
zUTF8=ACCEPTzutf-8u   Subject: Ã¼Ã±Ã­Â©Ã¶Ã°Ã©zUTF8 (%s)
)	rA   rƒ   r   Ú	_encodingÚauthenticaterŸ   r”   r/   rO   )	r   r£   r‚   rD   rT   r‹   Ú
msg_stringrš   r›   r   r   r   Útest_enable_UTF8_True_append$  s    z.NewIMAPTestsMixin.test_enable_UTF8_True_appendc          	   C   s   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ | d¡\}}|  |d¡ |  |j¡ |  tj	j
d¡ | d	d
¡ W d Q R X d S )Nc               @   s    e Zd ZdZdd„ Zdd„ ZdS )zPNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8ServerzAUTH ENABLE UTF8=ACCEPTc             S   s   |   |dd¡ d S )Nrf   zENABLE successful)rU   )r   rS   rd   r   r   r   r   B  s    z[NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_ENABLEc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r    D  s    

zaNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_AUTHENTICATEN)r7   r8   r9   rg   r   r    r   r   r   r   Ú
UTF8Server@  s   r¬   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   I  rV   zNNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rf   zUTF8=ACCEPTzcharset.*UTF8r   Úbar)rA   rƒ   r©   r   r”   Ú
assertTruer’   r“   r   r2   r,   Úsearch)r   r¬   r‚   r‹   rš   r   r   r   Ú*test_search_disallows_charset_in_utf8_mode?  s    z<NewIMAPTestsMixin.test_search_disallows_charset_in_utf8_modec          	   C   sN   G dd„ dt ƒ}|  |¡\}}|  tjjd¡ | ddd„ ¡ W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServerc             S   s   |   |dd |d ¡¡ d S )NÚNOz#unrecognized authentication type {}r   )rU   Úformat)r   rS   rd   r   r   r   r    S  s    zGNewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   ÚMyServerR  s   r³   z'unrecognized authentication type METHODÚMETHODc               S   s   dS )Nr   r   r   r   r   r   r§   Y  rV   z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.<lambda>)rA   rƒ   r“   r   r2   r,   r©   )r   r³   r‚   r‹   r   r   r   Útest_bad_auth_nameQ  s
    
z$NewIMAPTestsMixin.test_bad_auth_namec          	   C   sN   G dd„ dt ƒ}|  |¡\}}|  tjjd¡ | ddd„ ¡ W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServerc             s   s$   |   d¡ d V | _|  |dd¡ d S )Nrž   r±   z[AUTHENTICATIONFAILED] invalid)rP   rŸ   rU   )r   rS   rd   r   r   r   r    ]  s    
zPNewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   \  s   r³   z \[AUTHENTICATIONFAILED\] invalidr¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   d  rV   z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.<lambda>)rA   rƒ   r“   r   r2   r,   r©   )r   r³   r‚   r‹   r   r   r   Útest_invalid_authentication[  s
    
z-NewIMAPTestsMixin.test_invalid_authenticationc             C   sP   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ d S )Nc               @   s   e Zd Zdd„ ZdS )zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServerc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r    h  s    

zTNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   g  s   r³   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   m  rV   zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.<lambda>rf   s
   ZmFrZQ==
)rA   rƒ   r©   r   rŸ   )r   r³   r‚   rD   rT   r‹   r   r   r   Útest_valid_authentication_bytesf  s
    z1NewIMAPTestsMixin.test_valid_authentication_bytesc             C   sP   G dd„ dt ƒ}|  |¡\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ d S )Nc               @   s   e Zd Zdd„ ZdS )zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServerc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r    s  s    

zYNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   r  s   r³   r¥   c             S   s   dS )NÚfaker   )r¦   r   r   r   r§   x  rV   zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.<lambda>rf   s
   ZmFrZQ==
)rA   rƒ   r©   r   rŸ   )r   r³   r‚   rD   rT   r‹   r   r   r   Ú$test_valid_authentication_plain_textq  s
    z6NewIMAPTestsMixin.test_valid_authentication_plain_textc             C   sN   G dd„ dt ƒ}|  |¡\}}|  d|jk¡ | dd¡\}}|  |d¡ d S )Nc               @   s   e Zd ZdZdd„ ZdS )z@NewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandlerzLOGINDISABLED AUTH=CRAM-MD5c             s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S )Nz:+ PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ=s2   dGltIGYxY2E2YmU0NjRiOWVmYTFjY2E2ZmZkNmNmMmQ5ZjMy
rf   zCRAM-MD5 successfulr±   z	No access)rP   rU   )r   rS   rd   Úrr   r   r   r      s
    
zQNewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandler.cmd_AUTHENTICATEN)r7   r8   r9   rg   r    r   r   r   r   ÚAuthHandler}  s   r»   zAUTH=CRAM-MD5Útims   tanstaaftanstaafrf   )rA   rƒ   r®   rg   Úlogin_cram_md5r   )r   r»   r‚   r‹   Úretr   r   r   Útest_login_cram_md5_bytes|  s
    z+NewIMAPTestsMixin.test_login_cram_md5_bytesc             C   sN   G dd„ dt ƒ}|  |¡\}}|  d|jk¡ | dd¡\}}|  |d¡ d S )Nc               @   s   e Zd ZdZdd„ ZdS )zENewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandlerzLOGINDISABLED AUTH=CRAM-MD5c             s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S )Nz:+ PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ=s2   dGltIGYxY2E2YmU0NjRiOWVmYTFjY2E2ZmZkNmNmMmQ5ZjMy
rf   zCRAM-MD5 successfulr±   z	No access)rP   rU   )r   rS   rd   rº   r   r   r   r      s
    
zVNewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandler.cmd_AUTHENTICATEN)r7   r8   r9   rg   r    r   r   r   r   r»   Ž  s   r»   zAUTH=CRAM-MD5r¼   Útanstaaftanstaafrf   )rA   rƒ   r®   rg   r½   r   )r   r»   r‚   r‹   r¾   r   r   r   Útest_login_cram_md5_plain_text  s
    z0NewIMAPTestsMixin.test_login_cram_md5_plain_textc          	   C   sN   G dd„ dt ƒ}|  |¡\}}|  tjjd¡ | ddd„ ¡ W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServerc             s   s>   |   d¡ d V | _| jdkr,|  |dd¡ n|  |dd¡ d S )Nrž   s   *
r±   z[AUTHENTICATIONFAILED] abortedrf   zMYAUTH successful)rP   rŸ   rU   )r   rS   rd   r   r   r   r       s    

zPNewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   Ÿ  s   r³   z \[AUTHENTICATIONFAILED\] abortedr¥   c             S   s   d S )Nr   )r¦   r   r   r   r§   ­  rV   z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.<lambda>)rA   rƒ   r“   r   r2   r,   r©   )r   r³   r‚   r‹   r   r   r   Útest_aborted_authenticationž  s
    
z-NewIMAPTestsMixin.test_aborted_authenticationzimaplib._MAXLINEé
   c          	   C   sN   G dd„ dt ƒ}| j|dd\}}|  tjjd¡ | j|jŽ  W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z:NewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandlerc             S   s   | j  d¡ d S )Ns   * OK xxxxxxxxxxx
)rI   rJ   )r   r   r   r   re   ²  s    zANewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandler.handleN)r7   r8   r9   re   r   r   r   r   ÚTooLongHandler±  s   rÄ   F)r+   zgot more than 10 bytes)rA   rƒ   r“   r   r2   r,   r€   r   )r   rÄ   r‹   rD   r   r   r   Útest_linetoolong¯  s
    
z"NewIMAPTestsMixin.test_linetoolongc          	   C   s.   | j tdd\}}| j|jŽ  W d Q R X d S )NF)r+   )rƒ   rA   r€   r   )r   r‹   rD   r   r   r   Útest_simple_with_statementº  s    z,NewIMAPTestsMixin.test_simple_with_statementc          	   C   sT   | j tdd\}}| j|jŽ  }| dd¡ |  |jd¡ W d Q R X |  |j¡ d S )NF)r+   r—   r˜   )rƒ   rA   r€   r   r™   r   rE   ÚassertIsNone)r   r‹   rD   Úimapr   r   r   Útest_with_statement¿  s
    z%NewIMAPTestsMixin.test_with_statementc          	   C   sh   | j tdd\}}| j|jŽ 4}| dd¡ |  |jd¡ | ¡  |  |j¡ W d Q R X |  |j¡ d S )NF)r+   r—   r˜   )	rƒ   rA   r€   r   r™   r   rE   ÚlogoutrÇ   )r   r‹   rD   rÈ   r   r   r   Útest_with_statement_logoutÆ  s    z,NewIMAPTestsMixin.test_with_statement_logoutc             C   sL   |   t¡\}}| dd¡\}}|  |d¡ |  |d d¡ |  |jd¡ d S )Nr—   r˜   rf   r   s   LOGIN completedÚAUTH)rƒ   rA   r™   r   r…   )r   r‚   r‹   rš   r›   r   r   r   Ú
test_loginÒ  s
    zNewIMAPTestsMixin.test_loginc             C   st   |   t¡\}}| dd¡\}}|  |d¡ |  |d d¡ | ¡ \}}|  |d¡ |  |d d¡ |  |jd¡ d S )	Nr—   r˜   rf   r   s   LOGIN completedÚBYEs   IMAP4ref1 Server logging outr„   )rƒ   rA   r™   r   rÊ   r…   )r   r‚   r‹   rš   r›   r   r   r   Útest_logoutÙ  s    zNewIMAPTestsMixin.test_logoutc             C   sV   G dd„ dt ƒ}|  |¡\}}| dd¡ | ¡ \}}|  |d¡ |  |d d¡ d S )Nc               @   s   e Zd Zdd„ ZdS )z,NewIMAPTestsMixin.test_lsub.<locals>.LsubCmdc             S   s   |   d¡ |  |dd¡S )Nz* LSUB () "." directoryArf   zLSUB completed)rP   rU   )r   rS   rd   r   r   r   Úcmd_LSUBå  s    
z5NewIMAPTestsMixin.test_lsub.<locals>.LsubCmd.cmd_LSUBN)r7   r8   r9   rÐ   r   r   r   r   ÚLsubCmdä  s   rÑ   r—   r˜   rf   r   s   () "." directoryA)rA   rƒ   r™   Zlsubr   )r   rÑ   r‚   r‹   rš   r›   r   r   r   Ú	test_lsubã  s    zNewIMAPTestsMixin.test_lsub)T)r7   r8   r9   r‚   rƒ   rx   rŒ   rŽ   r•   r–   rœ   r«   r°   rµ   r¶   r·   r¹   r¿   rÁ   rÂ   r
   ÚpatchrÅ   rÆ   rÉ   rË   rÍ   rÏ   rÒ   r   r   r   r   rl   Ç   s0   
!			

rl   c               @   s   e Zd ZejZejZdS )ÚNewIMAPTestsN)	r7   r8   r9   r   r2   r€   rˆ   Ú	TCPServerrw   r   r   r   r   rÔ   ï  s   rÔ   zSSL not availablec               @   s0   e Zd ZeZeZdd„ Zdd„ Ze	dd„ ƒZ
dS )ÚNewIMAPSSLTestsc          	   C   sz   t  t j¡}|  |jt j¡ |  |jd¡ | t¡ |  	t j
d¡. |  t¡\}}| j|jd|iŽ}| ¡  W d Q R X d S )NTz=IP address mismatch, certificate is not valid for '127.0.0.1'Ússl_context)r;   r<   ÚPROTOCOL_TLS_CLIENTr   Úverify_modeZCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚCAFILEr“   ÚCertificateErrorrƒ   rA   r€   r   r†   )r   r×   r‹   rD   r‚   r   r   r   Útest_ssl_raisesù  s    

zNewIMAPSSLTests.test_ssl_raisesc             C   sF   t  t j¡}| t¡ |  t¡\}}| jd|jd |d}| 	¡  d S )NÚ	localhostr   )r×   )
r;   r<   rØ   rÛ   rÜ   rƒ   rA   r€   r   r†   )r   r×   r‹   rD   r‚   r   r   r   Útest_ssl_verified  s    
z!NewIMAPSSLTests.test_ssl_verifiedc             C   sf   t  dtf¡N tj | jd¡2 tj | jd¡ | jddtd W d Q R X W d Q R X W d Q R X d S )Nr(   ÚopenZ_connectrß   é   )Úcertfile)r   Zcheck_warningsÚDeprecationWarningr
   rÓ   Úobjectr€   r>   )r   r   r   r   Útest_certfile_arg_warn  s    z&NewIMAPSSLTests.test_certfile_arg_warnN)r7   r8   r9   Ú	IMAP4_SSLr€   r:   rw   rÞ   rà   r	   ræ   r   r   r   r   rÖ   ô  s
   rÖ   c               @   s$  e Zd ZejZejZdd„ Z	dd„ Z
edd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZG dd„ deƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZd'd(„ Zed)d*„ ƒZ ed+d,„ ƒZ!ed-d.„ ƒZ"d/S )0ÚThreadedNetworkedTestsc             C   s¨   G dd„ d| j ƒ}trtdƒ |||ƒ}|  |j|j ¡ ¡ trjtdƒ td|ƒ td| j ƒ td|jƒ tj	d| j  |j
d	d
id}d|_| ¡  tr tdƒ ||fS )Nc               @   s   e Zd Zdd„ ZdS )z4ThreadedNetworkedTests.make_server.<locals>.MyServerc             S   s   |   |¡ |  ¡  ‚ d S )N)rm   rn   )r   ro   rp   r   r   r   rq      s    
zAThreadedNetworkedTests.make_server.<locals>.MyServer.handle_errorN)r7   r8   r9   rq   r   r   r   r   r³     s   r³   zcreating serverzserver createdzADDR =zCLASS =zHDLR =z
%s servingrs   g{®Gáz„?)rt   ru   rv   Tzserver running)rw   r   rG   r   r   r*   ZgetsocknameZRequestHandlerClassrz   r{   r|   r~   r   )r   ZaddrÚhdlrr³   rD   r%   r   r   r   Úmake_server  s&    

z"ThreadedNetworkedTests.make_serverc             C   s4   t rtdƒ | ¡  | ¡  | ¡  t r0tdƒ d S )Nzwaiting for serverZdone)r   rG   r†   rn   rR   )r   rD   r}   r   r   r   Úreap_server=  s    z"ThreadedNetworkedTests.reap_serverc          
   c   s4   |   tjdf|¡\}}z
|V  W d |  ||¡ X d S )Nr   )rê   r   ry   rë   )r   ré   rD   r}   r   r   r   Úreaped_serverF  s    
z$ThreadedNetworkedTests.reaped_serverc          	   c   s@   |   |¡,}| j|jŽ }z||fV  W d | ¡  X W d Q R X d S )N)rì   r€   r   rÊ   )r   ré   rD   r‚   r   r   r   Úreaped_pairN  s
    z"ThreadedNetworkedTests.reaped_pairc          	   C   s.   |   t¡}| j|jŽ }| ¡  W d Q R X d S )N)rì   rA   r€   r   r†   )r   rD   r‚   r   r   r   Útest_connectW  s    z#ThreadedNetworkedTests.test_connectc          	   C   s¬   G dd„ dt ƒ}|  |¡ˆ\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ | d¡ | d	d
d¡\}\}|  d|¡ | d¡ | d¡\}\}|  d|¡ W d Q R X d S )Nc                   s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	zEThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandlerc                s   dddddg| _ tƒ  ¡  d S )NZAnsweredZFlaggedZDeletedZSeenZDraft)ÚflagsrB   re   )r   )rF   r   r   re   h  s    zLThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.handlec             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r    l  s    

zVThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_AUTHENTICATEc             S   s^   d  | j¡}|  d|  d¡¡ |  d¡ |  d¡ d| }|  | d¡¡ |  |dd¡ d S )	Nz \z* FLAGS (%s)r¤   s
   * 2 EXISTSs
   * 0 RECENTz-* OK [PERMANENTFLAGS %s \*)] Flags permitted.rf   z[READ-WRITE] SELECT completed.)rR   rï   rM   rO   rU   )r   rS   rd   Zflag_msgÚmsgr   r   r   Ú
cmd_SELECTq  s    

zPThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_SELECTc             S   sf   |d   d¡  d¡ ¡ }| j |¡ dd | j¡ }d|d |f }|  | d¡¡ |  |d	d
¡ d S )NrW   ú(ú)z(FLAGS (%s))z \z* %s FETCH %sr   r¤   rf   zSTORE completed.)rH   r^   rï   ÚextendrR   rM   rO   rU   )r   rS   rd   Z	new_flagsZ	flags_msgrð   r   r   r   Ú	cmd_STORE{  s    zOThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_STORE)r7   r8   r9   re   r    rñ   rõ   rk   r   r   )rF   r   ÚBracketFlagHandlerf  s   
rö   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   „  rV   z;ThreadedNetworkedTests.test_bracket_flags.<locals>.<lambda>rf   s
   ZmFrZQ==
Útestó   1z+FLAGSz[test]s   [test]ZPERMANENTFLAGS)rA   rí   r©   r   rŸ   ZselectÚstorer3   )r   rö   rD   r‚   rT   r›   rš   r   r   r   Útest_bracket_flags]  s    	

z)ThreadedNetworkedTests.test_bracket_flagsc          	   C   sF   G dd„ dt jƒ}|  |¡ }| jtjj| jf|jžŽ  W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z9ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandlerc             S   s   | j  d¡ d S )Ns   * OK)rI   rJ   )r   r   r   r   re   ’  s    z@ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandler.handleN)r7   r8   r9   re   r   r   r   r   r‡   ‘  s   r‡   )	rˆ   r‰   rì   r0   r   r2   rŠ   r€   r   )r   r‡   rD   r   r   r   Útest_issue5949Ž  s    
z%ThreadedNetworkedTests.test_issue5949c          	   C   sD   G dd„ dt ƒ}|  |¡ }| jtjj| jf|jžŽ  W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )zGThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandlerc             S   s   |   d¡ |  |dd¡ d S )Ns   * CAPABILITY IMAP4rev1 AUTH
rf   zCAPABILITY completed)rL   rU   )r   rS   rd   r   r   r   rh   Ÿ  s    
zVThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYN)r7   r8   r9   rh   r   r   r   r   r     s   r   )rA   rì   r0   r   r2   rŠ   r€   r   )r   r   rD   r   r   r   rŽ   š  s    
z,ThreadedNetworkedTests.test_line_terminationc               @   s    e Zd ZdZdd„ Zdd„ ZdS )z!ThreadedNetworkedTests.UTF8ServerzAUTH ENABLE UTF8=ACCEPTc             C   s   |   |dd¡ d S )Nrf   zENABLE successful)rU   )r   rS   rd   r   r   r   r   ª  s    z,ThreadedNetworkedTests.UTF8Server.cmd_ENABLEc             c   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r    ­  s    

z2ThreadedNetworkedTests.UTF8Server.cmd_AUTHENTICATEN)r7   r8   r9   rg   r   r    r   r   r   r   r¬   §  s   r¬   c          	   C   sL   |   | j¡6\}}|  |j¡ |  tjj|jd¡ |  |j¡ W d Q R X d S )Nr   )	rí   r¬   r‘   r’   r0   r   r2   r,   r”   )r   rD   r‚   r   r   r   r•   ²  s    z;ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTHc          	   C   sD   G dd„ d| j ƒ}|  |¡\}}|  tjj|jd¡ W d Q R X d S )Nc               @   s   e Zd ZdZdS )zXThreadedNetworkedTests.test_enable_raises_error_if_no_capability.<locals>.NoEnableServerrÌ   N)r7   r8   r9   rg   r   r   r   r   ÚNoEnableServer½  s   rü   r   )r¬   rí   r0   r   r2   r,   r”   )r   rü   rD   r‚   r   r   r   r–   »  s    z@ThreadedNetworkedTests.test_enable_raises_error_if_no_capabilityc          
   C   sn   G dd„ dt ƒ}|  tjj¡F |  |¡0\}}| dd¡\}}|  |d¡ | d¡ W d Q R X W d Q R X d S )Nc               @   s   e Zd ZdS )z\ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported.<locals>.NonUTF8ServerN)r7   r8   r9   r   r   r   r   ÚNonUTF8ServerÄ  s   rý   r—   r˜   rf   zUTF8=ACCEPT)	rA   r0   r   r2   r,   rí   r™   r   r”   )r   rý   rD   r‚   rš   r›   r   r   r   rœ   Â  s    
zEThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supportedc       	   	   C   sÖ   G dd„ d| j ƒ}|  |¡°\}}|  |jd¡ | ddd„ ¡\}}|  |d¡ |  |jd¡ | d	¡\}}|  |d¡ |  |jd
¡ d}| d d d | d
¡¡\}}|  |d¡ |  |jd|  d
¡¡ W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )zMThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServerc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   r¡   )rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r¢   Ñ  s    

zXThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r7   r8   r9   r¢   r   r   r   r   r£   Ð  s   r£   r¤   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   Ø  rV   zEThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.<lambda>rf   s
   ZmFrZQ==
zUTF8=ACCEPTzutf-8u   Subject: Ã¼Ã±Ã­Â©Ã¶Ã°Ã©zUTF8 (%s)
)	r¬   rí   r   r¨   r©   rŸ   r”   r/   rO   )	r   r£   rD   r‚   rT   r‹   rª   rš   r›   r   r   r   r«   Í  s"    z3ThreadedNetworkedTests.test_enable_UTF8_True_appendc          	   C   s|   |   | j¡f\}}| ddd„ ¡\}}|  |d¡ | d¡\}}|  |d¡ |  |j¡ |  tj	j
|jdd¡ W d Q R X d S )Nr¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§   î  rV   zSThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rf   zUTF8=ACCEPTr   r­   )rí   r¬   r©   r   r”   r®   r’   r0   r   r2   r,   r¯   )r   rD   r‚   rš   r‹   r   r   r   r°   ë  s    zAThreadedNetworkedTests.test_search_disallows_charset_in_utf8_modec          
   C   sX   G dd„ dt ƒ}|  |¡4\}}|  tjj¡ | ddd„ ¡ W d Q R X W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServerc             S   s   |   |dd |d ¡¡ d S )Nr±   z#unrecognized authentication type {}r   )rU   r²   )r   rS   rd   r   r   r   r    ú  s    zLThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   ø  s   r³   r´   c               S   s   dS )Nr   r   r   r   r   r   r§      rV   z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.<lambda>)rA   rí   r0   r   r2   r,   r©   )r   r³   rD   r‚   r   r   r   rµ   õ  s    z)ThreadedNetworkedTests.test_bad_auth_namec          
   C   s\   G dd„ dt ƒ}|  |¡8\}}|  tjj¡ | ddd„ ¡\}}W d Q R X W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )zDThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServerc             s   s$   |   d¡ d V | _|  |dd¡ d S )Nrž   r±   z[AUTHENTICATIONFAILED] invalid)rP   rŸ   rU   )r   rS   rd   r   r   r   r      s    
zUThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³     s   r³   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§     rV   zDThreadedNetworkedTests.test_invalid_authentication.<locals>.<lambda>)rA   rí   r0   r   r2   r,   r©   )r   r³   rD   r‚   rT   r›   r   r   r   r¶     s    z2ThreadedNetworkedTests.test_invalid_authenticationc          	   C   s¤   G dd„ dt ƒ}|  |¡8\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ W d Q R X |  |¡8\}}| ddd„ ¡\}}|  |d¡ |  |jd¡ W d Q R X d S )	Nc               @   s   e Zd Zdd„ ZdS )zBThreadedNetworkedTests.test_valid_authentication.<locals>.MyServerc             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nrž   rf   zFAKEAUTH successful)rP   rD   rŸ   rU   )r   rS   rd   r   r   r   r      s    

zSThreadedNetworkedTests.test_valid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³     s   r³   r¥   c             S   s   dS )Ns   faker   )r¦   r   r   r   r§     rV   zBThreadedNetworkedTests.test_valid_authentication.<locals>.<lambda>rf   s
   ZmFrZQ==
c             S   s   dS )Nr¸   r   )r¦   r   r   r   r§   !  rV   )rA   rí   r©   r   rŸ   )r   r³   rD   r‚   rT   r›   r   r   r   Útest_valid_authentication  s    z0ThreadedNetworkedTests.test_valid_authenticationc          	   C   s    G dd„ dt ƒ}|  |¡6\}}|  d|jk¡ | dd¡\}}|  |d¡ W d Q R X |  |¡6\}}|  d|jk¡ | dd¡\}}|  |d¡ W d Q R X d S )Nc               @   s   e Zd ZdZdd„ ZdS )z?ThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandlerzLOGINDISABLED AUTH=CRAM-MD5c             s   s:   |   d¡ d V }|dkr(|  |dd¡ n|  |dd¡ d S )Nz:+ PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ=s2   dGltIGYxY2E2YmU0NjRiOWVmYTFjY2E2ZmZkNmNmMmQ5ZjMy
rf   zCRAM-MD5 successfulr±   z	No access)rP   rU   )r   rS   rd   rº   r   r   r   r    -  s
    
zPThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandler.cmd_AUTHENTICATEN)r7   r8   r9   rg   r    r   r   r   r   r»   )  s   r»   zAUTH=CRAM-MD5r¼   rÀ   rf   s   tanstaaftanstaaf)rA   rí   r®   rg   r½   r   )r   r»   rD   r‚   r¾   r›   r   r   r   Útest_login_cram_md5&  s    z*ThreadedNetworkedTests.test_login_cram_md5c          
   C   s\   G dd„ dt ƒ}|  |¡8\}}|  tjj¡ | ddd„ ¡\}}W d Q R X W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )zDThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServerc             s   s>   |   d¡ d V | _| jdkr,|  |dd¡ n|  |dd¡ d S )Nrž   s   *
r±   z[AUTHENTICATIONFAILED] abortedrf   zMYAUTH successful)rP   rŸ   rU   )r   rS   rd   r   r   r   r    G  s
    

zUThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r7   r8   r9   r    r   r   r   r   r³   E  s   r³   r¥   c             S   s   d S )Nr   )r¦   r   r   r   r§   R  rV   zDThreadedNetworkedTests.test_aborted_authentication.<locals>.<lambda>)rA   rí   r0   r   r2   r,   r©   )r   r³   rD   r‚   rT   r›   r   r   r   rÂ   B  s    z2ThreadedNetworkedTests.test_aborted_authenticationc          	   C   sD   G dd„ dt ƒ}|  |¡ }| jtjj| jf|jžŽ  W d Q R X d S )Nc               @   s   e Zd Zdd„ ZdS )z?ThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandlerc             S   s   | j  dtjd  d ¡ d S )Ns   * OK ó   xs   
)rI   rJ   r   Z_MAXLINE)r   r   r   r   re   W  s    zFThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandler.handleN)r7   r8   r9   re   r   r   r   r   rÄ   V  s   rÄ   )rA   rì   r0   r   r2   r,   r€   r   )r   rÄ   rD   r   r   r   rÅ   U  s    
z'ThreadedNetworkedTests.test_linetoolongc          
   C   s2   |   t¡}| j|jŽ  W d Q R X W d Q R X d S )N)rì   rA   r€   r   )r   rD   r   r   r   rÆ   _  s    z1ThreadedNetworkedTests.test_simple_with_statementc          
   C   sX   |   t¡D}| j|jŽ  }| dd¡ |  |jd¡ W d Q R X |  |j¡ W d Q R X d S )Nr—   r˜   )rì   rA   r€   r   r™   r   rE   rÇ   )r   rD   rÈ   r   r   r   rÉ   f  s
    z*ThreadedNetworkedTests.test_with_statementc          
   C   sl   |   t¡X}| j|jŽ 4}| dd¡ |  |jd¡ | ¡  |  |j¡ W d Q R X |  |j¡ W d Q R X d S )Nr—   r˜   )	rì   rA   r€   r   r™   r   rE   rÊ   rÇ   )r   rD   rÈ   r   r   r   rË   n  s    z1ThreadedNetworkedTests.test_with_statement_logoutN)#r7   r8   r9   rˆ   rÕ   rw   r   r2   r€   rê   rë   r   rì   rí   r   rî   rú   rû   rŽ   rA   r¬   r•   r–   rœ   r«   r°   rµ   r¶   rþ   rÿ   rÂ   rÅ   rÆ   rÉ   rË   r   r   r   r   rè     s2    		1	

rè   c               @   s    e Zd ZeZeZedd„ ƒZdS )ÚThreadedNetworkedTestsSSLc          
   C   s˜   t  t j¡}| t¡ |  t jd¡6 |  t¡ }| j	|j
d|iŽ}| ¡  W d Q R X W d Q R X |  t¡$}| j	d|j
d |d}| ¡  W d Q R X d S )Nz=IP address mismatch, certificate is not valid for '127.0.0.1'r×   rß   r   )r×   )r;   r<   rØ   rÛ   rÜ   r“   rÝ   rì   rA   r€   r   r†   )r   r×   rD   r‚   r   r   r   rà     s    

z+ThreadedNetworkedTestsSSL.test_ssl_verifiedN)	r7   r8   r9   r:   rw   rç   r€   r   rà   r   r   r   r   r  z  s   r  Znetworkznetwork resource disabledc               @   sB   e Zd ZdZdZdZdZejZ	dd„ Z
dd„ Zd	d
„ Zdd„ ZdS )ÚRemoteIMAPTestzcyrus.andrew.cmu.edurâ   Z	anonymousr˜   c          	   C   s,   t | jƒ |  | j| j¡| _W d Q R X d S )N)r   Úhostr€   ÚportrD   )r   r   r   r   ÚsetUpœ  s    zRemoteIMAPTest.setUpc          	   C   s.   | j d k	r*t| jƒ | j  ¡  W d Q R X d S )N)rD   r   r  rÊ   )r   r   r   r   ÚtearDown   s    
zRemoteIMAPTest.tearDownc          	   C   sz   t | jƒf x| jjD ]}|  |t¡ qW |  d| jj¡ |  d| jj¡ | j | j| j	¡}|  
|d d¡ W d Q R X d S )NÚLOGINDISABLEDzAUTH=ANONYMOUSr   rf   )r   r  rD   rg   ÚassertIsInstanceÚstrr3   r™   ÚusernameÚpasswordr   )r   ÚcapÚrsr   r   r   Útest_logincapa¥  s    zRemoteIMAPTest.test_logincapac          	   C   s:   t | jƒ& | j ¡ }d | _|  |d d¡ W d Q R X d S )Nr   rÎ   )r   r  rD   rÊ   r   )r   r  r   r   r   rÏ   ®  s    
zRemoteIMAPTest.test_logoutN)r7   r8   r9   r  r  r
  r  r   r2   r€   r  r  r  rÏ   r   r   r   r   r  “  s   	r  c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚRemoteIMAP_STARTTLSTestc          	      s>   t ƒ  ¡  t| jƒ  | j ¡ }|  |d d¡ W d Q R X d S )Nr   rf   )rB   r  r   r  rD   Zstarttlsr   )r   r  )rF   r   r   r  º  s    

zRemoteIMAP_STARTTLSTest.setUpc             C   s2   x| j jD ]}|  |t¡ q
W |  d| j j¡ d S )Nr  )rD   rg   r  r	  ÚassertNotIn)r   r  r   r   r   r  À  s    z&RemoteIMAP_STARTTLSTest.test_logincapa)r7   r8   r9   r  r  rk   r   r   )rF   r   r  µ  s   r  c               @   sT   e Zd ZdZe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 )ÚRemoteIMAP_SSLTestiá  c             C   s   d S )Nr   )r   r   r   r   r  Ë  s    zRemoteIMAP_SSLTest.setUpc             C   s   d S )Nr   )r   r   r   r   r  Î  s    zRemoteIMAP_SSLTest.tearDownc             C   s(   t  t j¡}d|_t j|_| t¡ |S )NF)r;   r<   rØ   rÚ   Z	CERT_NONErÙ   r=   r>   )r   r×   r   r   r   Úcreate_ssl_contextÑ  s
    
z%RemoteIMAP_SSLTest.create_ssl_contextc             C   sl   z\x|j D ]}|  |t¡ q
W |  d|j ¡ |  d|j ¡ | | j| j¡}|  |d d¡ W d | 	¡  X d S )Nr  z
AUTH=PLAINr   rf   )
rg   r  r	  r  r3   r™   r
  r  r   rÊ   )r   rD   r  r  r   r   r   Úcheck_logincapaØ  s    z"RemoteIMAP_SSLTest.check_logincapac          	   C   s4   t | jƒ  |  | j| j¡}|  |¡ W d Q R X d S )N)r   r  r€   r  r  )r   Ú_serverr   r   r   r  ã  s    z!RemoteIMAP_SSLTest.test_logincapac          	   C   sB   t | jƒ. |  | j| j¡}| ¡ }|  |d d¡ W d Q R X d S )Nr   rÎ   )r   r  r€   r  rÊ   r   )r   r  r  r   r   r   rÏ   è  s    zRemoteIMAP_SSLTest.test_logoutc          	   C   s:   t | jƒ& | jt| j| j| jt|  ¡ d W d Q R X d S )N)rã   r×   )r   r  r0   Ú
ValueErrorr€   r  r>   r  )r   r   r   r   Ú#test_ssl_context_certfile_exclusiveî  s    z6RemoteIMAP_SSLTest.test_ssl_context_certfile_exclusivec          	   C   s:   t | jƒ& | jt| j| j| jt|  ¡ d W d Q R X d S )N)Zkeyfiler×   )r   r  r0   r  r€   r  r>   r  )r   r   r   r   Ú"test_ssl_context_keyfile_exclusiveô  s    z5RemoteIMAP_SSLTest.test_ssl_context_keyfile_exclusiveN)r7   r8   r9   r  rç   r€   r  r  r  r  r  rÏ   r  r  r   r   r   r   r  Æ  s   r  Ú__main__)5r÷   r   Ú
contextlibr   r-   r   Zos.pathÚosrˆ   r   r   rz   r*   Ztest.supportr   r   r   r   r   r	   Zunittestr
   r   r   r   r;   ÚImportErrorÚpathrR   ÚdirnameÚ__file__Úcurdirr>   rÜ   ZTestCaser   rÕ   r:   rç   r‰   rA   rl   rÔ   Z
skipUnlessrÖ   rè   r  Zis_resource_enabledr  r  r  r7   Úmainr   r   r   r   Ú<module>   s`    
F	R  *$  c
 

4
