B
    18™\O›  ã               @   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ÚtimeÚmktime)ÚselfÚt0Útt© r   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/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"))Ú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   Ú	localtimer   Ú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   Ú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_PORTÚskipTestÚerrorÚerrnoÚECONNREFUSEDÚhasattrÚappendr/   ÚassertRaisesÚOSErrorÚIMAP4ÚassertInÚ	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-   r?   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)r0   ÚacceptÚsslÚ
SSLContextÚload_cert_chainÚCERTFILEZwrap_socket)r   Z	newsocketÚfromaddrÚcontextZ
connstreamr   r   r   Úget_requestd   s
    
zSecureTCPServer.get_requestN)r@   rA   rB   rK   r   r   r   r   rC   b   s   rC   c               @   s   e Zd ZdS )rC   N)r@   rA   rB   r   r   r   r   rC   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   rN   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   
)rW   )r   rV   r   r   r   Ú
_send_lineƒ   s    zSimpleIMAPHandler._send_linec             C   s   |   | d¡¡ d S )NÚASCII)rX   Úencode)r   rV   r   r   r   Ú_send_textline†   s    z SimpleIMAPHandler._send_textlinec             C   s   |   d |||f¡¡ d S )Nú )r[   Újoin)r   ÚtagÚcoderV   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: %rrY   r   é   Zcmd_ÚBADz unknown)r[   ZrfileÚreadr9   Úendswithr   rR   rS   ÚcontinuationÚsendÚStopIterationÚdecodeÚsplitr6   ÚgetattrÚnextr`   )r   ÚlineÚpartZ	splitliner^   ÚcmdÚargsrf   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)Úcapabilitiesr[   r`   )r   r^   rp   Úcapsr   r   r   Úcmd_CAPABILITY¶   s    z SimpleIMAPHandler.cmd_CAPABILITYc             C   s$   d | j _|  d¡ |  |dd¡ d S )Nz"* BYE IMAP4ref1 Server logging outrr   zLOGOUT completed)rO   rP   r[   r`   )r   r^   rp   r   r   r   Ú
cmd_LOGOUT½   s    
zSimpleIMAPHandler.cmd_LOGOUTc             C   s   |d | j _|  |dd¡ d S )Nr   rr   zLOGIN completed)rO   rP   r`   )r   r^   rp   r   r   r   Ú	cmd_LOGINÂ   s    zSimpleIMAPHandler.cmd_LOGIN)r@   rA   rB   Útimeoutrf   rs   rN   rW   rX   r[   r`   rq   ru   rv   rw   Ú__classcell__r   r   )rQ   r   rL   u   s   *rL   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 )	a  
        Sets up imap_handler for tests. imap_handler should inherit from either:
        - SimpleIMAPHandler - for testing IMAP commands,
        - socketserver.StreamRequestHandler - if raw access to stream is needed.
        Returns (client, server).
        c               @   s   e Zd Zdd„ ZdS )z/NewIMAPTestsMixin._setup.<locals>.TestTCPServerc             S   s   |   |¡ |  ¡  ‚ dS )zP
                End request and raise the error if one occurs.
                N)Úclose_requestÚserver_close)r   ÚrequestÚclient_addressr   r   r   Úhandle_errorÒ   s    
z<NewIMAPTestsMixin._setup.<locals>.TestTCPServer.handle_errorN)r@   rA   rB   r   r   r   r   r   ÚTestTCPServerÑ   s   r€   r   z-serverÚpoll_intervalg{®Gáz„?)ÚnameÚtargetÚkwargsT)Úserver_classÚ
addCleanupÚ_cleanupr   ÚHOSTrO   Ú	threadingÚThreadÚ_testMethodNameÚserve_foreverÚthreadÚdaemonÚstartÚ
imap_classÚserver_addressÚclient)r   Zimap_handlerr1   r€   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 )zž
        Cleans up the test server. This method should not be called manually,
        it is added to the cleanup queue in the _setup method already.
        NÚLOGOUTg      @)r’   ÚstateÚshutdownrO   r|   r   Újoin_threadr   )r   r   r   r   r‡   ë   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)rT   rU   )r   r   r   r   rq   þ   s    zVNewIMAPTestsMixin.test_EOF_without_complete_welcome_message.<locals>.EOFHandler.handleN)r@   rA   rB   rq   r   r   r   r   Ú
EOFHandlerý   s   r˜   F)r1   )	ÚsocketserverÚStreamRequestHandlerr“   r8   r   r:   Úabortr   r‘   )r   r˜   Ú_rO   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
rr   zCAPABILITY completed)rW   r`   )r   r^   rp   r   r   r   ru     s    
zQNewIMAPTestsMixin.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYN)r@   rA   rB   ru   r   r   r   r   ÚBadNewlineHandler  s   rž   F)r1   )rL   r“   r8   r   r:   r›   r   r‘   )r   rž   rœ   rO   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)r@   rA   rB   rs   r   r   r   r   ÚEnableHandler  s   r    zENABLE.*NONAUTHÚfoo)	rL   r“   ÚassertFalseÚutf8_enabledÚassertRaisesRegexr   r:   r3   Ú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“   rL   r¤   r   r:   r3   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Úpassrr   zdoes not support ENABLEzUTF8=ACCEPT)	r“   rL   Úloginr   r¤   r   r:   r3   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 )Nrr   zENABLE successful)r`   )r   r^   rp   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ú+rr   zFAKEAUTH successful)r[   rO   Úresponser`   )r   r^   rp   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¯   rr   Úokay)r[   rO   r°   r`   )r   r^   rp   r   r   r   Ú
cmd_APPEND-  s    

zSNewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r@   rA   rB   rs   r®   r±   r³   r   r   r   r   ÚUTF8AppendServer%  s   r´   ÚasciiÚMYAUTHc             S   s   dS )Ns   faker   )Úxr   r   r   Ú<lambda>3  ra   z@NewIMAPTestsMixin.test_enable_UTF8_True_append.<locals>.<lambda>rr   s
   ZmFrZQ==
zUTF8=ACCEPTzutf-8u   Subject: Ã¼Ã±Ã­Â©Ã¶Ã°Ã©zUTF8 (%s)
)	rL   r“   r   Ú	_encodingÚauthenticater°   r¥   r7   rZ   )	r   r´   r’   rO   r_   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 )Nrr   zENABLE successful)r`   )r   r^   rp   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¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   r   r   r   r±   D  s    

zaNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.UTF8Server.cmd_AUTHENTICATEN)r@   rA   rB   rs   r®   r±   r   r   r   r   Ú
UTF8Server@  s   r½   r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸   I  ra   zNNewIMAPTestsMixin.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rr   zUTF8=ACCEPTzcharset.*UTF8r¡   Úbar)rL   r“   rº   r   r¥   Ú
assertTruer£   r¤   r   r:   r3   Ú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   )r`   Úformat)r   r^   rp   r   r   r   r±   S  s    zGNewIMAPTestsMixin.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   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  ra   z6NewIMAPTestsMixin.test_bad_auth_name.<locals>.<lambda>)rL   r“   r¤   r   r:   r3   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)r[   r°   r`   )r   r^   rp   r   r   r   r±   ]  s    
zPNewIMAPTestsMixin.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   \  s   rÄ   z \[AUTHENTICATIONFAILED\] invalidr¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸   d  ra   z?NewIMAPTestsMixin.test_invalid_authentication.<locals>.<lambda>)rL   r“   r¤   r   r:   r3   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¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   r   r   r   r±   h  s    

zTNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   g  s   rÄ   r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸   m  ra   zCNewIMAPTestsMixin.test_valid_authentication_bytes.<locals>.<lambda>rr   s
   ZmFrZQ==
)rL   r“   rº   r   r°   )r   rÄ   r’   rO   r_   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¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   r   r   r   r±   s  s    

zYNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   r  s   rÄ   r¶   c             S   s   dS )NÚfaker   )r·   r   r   r   r¸   x  ra   zHNewIMAPTestsMixin.test_valid_authentication_plain_text.<locals>.<lambda>rr   s
   ZmFrZQ==
)rL   r“   rº   r   r°   )r   rÄ   r’   rO   r_   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
rr   zCRAM-MD5 successfulrÂ   z	No access)r[   r`   )r   r^   rp   Úrr   r   r   r±     s
    
zQNewIMAPTestsMixin.test_login_cram_md5_bytes.<locals>.AuthHandler.cmd_AUTHENTICATEN)r@   rA   rB   rs   r±   r   r   r   r   ÚAuthHandler}  s   rÌ   zAUTH=CRAM-MD5Útims   tanstaaftanstaafrr   )rL   r“   r¿   rs   Ú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
rr   zCRAM-MD5 successfulrÂ   z	No access)r[   r`   )r   r^   rp   rË   r   r   r   r±     s
    
zVNewIMAPTestsMixin.test_login_cram_md5_plain_text.<locals>.AuthHandler.cmd_AUTHENTICATEN)r@   rA   rB   rs   r±   r   r   r   r   rÌ   Ž  s   rÌ   zAUTH=CRAM-MD5rÍ   Útanstaaftanstaafrr   )rL   r“   r¿   rs   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] abortedrr   zMYAUTH successful)r[   r°   r`   )r   r^   rp   r   r   r   r±      s    

zPNewIMAPTestsMixin.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   Ÿ  s   rÄ   z \[AUTHENTICATIONFAILED\] abortedr¶   c             S   s   d S )Nr   )r·   r   r   r   r¸   ­  ra   z?NewIMAPTestsMixin.test_aborted_authentication.<locals>.<lambda>)rL   r“   r¤   r   r:   r3   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
)rT   rU   )r   r   r   r   rq   ²  s    zANewIMAPTestsMixin.test_linetoolong.<locals>.TooLongHandler.handleN)r@   rA   rB   rq   r   r   r   r   ÚTooLongHandler±  s   rÕ   F)r1   zgot more than 10 bytes)rL   r“   r¤   r   r:   r3   r   r‘   )r   rÕ   rœ   rO   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)r1   )r“   rL   r   r‘   )r   rœ   rO   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)r1   r¨   r©   )r“   rL   r   r‘   rª   r   rP   ÚassertIsNone)r   rœ   rO   Ú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)r1   r¨   r©   )	r“   rL   r   r‘   rª   r   rP   ÚlogoutrØ   )r   rœ   rO   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©   rr   r   s   LOGIN completedÚAUTH)r“   rL   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©   rr   r   s   LOGIN completedÚBYEs   IMAP4ref1 Server logging outr”   )r“   rL   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 () "." directoryArr   zLSUB completed)r[   r`   )r   r^   rp   r   r   r   Úcmd_LSUBå  s    
z5NewIMAPTestsMixin.test_lsub.<locals>.LsubCmd.cmd_LSUBN)r@   rA   rB   rá   r   r   r   r   ÚLsubCmdä  s   râ   r¨   r©   rr   r   s   () "." directoryA)rL   r“   rª   Zlsubr   )r   râ   r’   rœ   r«   r¬   r   r   r   Ú	test_lsubã  s    zNewIMAPTestsMixin.test_lsub)T)r@   rA   rB   r’   r“   r‡   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   rz   Ç   s0   
!			

rz   c               @   s   e Zd ZejZejZdS )ÚNewIMAPTestsN)	r@   rA   rB   r   r:   r   r™   Ú	TCPServerr…   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)rE   rF   ÚPROTOCOL_TLS_CLIENTr   Úverify_modeZCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚCAFILEr¤   ÚCertificateErrorr“   rL   r   r‘   r–   )r   rè   rœ   rO   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è   )
rE   rF   ré   rì   rí   r“   rL   r   r‘   r–   )r   rè   rœ   rO   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   Úcheck_warningsÚDeprecationWarningr
   rä   Úobjectr   rH   )r   r   r   r   Útest_certfile_arg_warn  s    z&NewIMAPSSLTests.test_certfile_arg_warnN)r@   rA   rB   Ú	IMAP4_SSLr   rC   r…   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)r{   r|   )r   r}   r~   r   r   r   r      s    
zAThreadedNetworkedTests.make_server.<locals>.MyServer.handle_errorN)r@   rA   rB   r   r   r   r   r   rÄ     s   rÄ   zcreating serverzserver createdzADDR =zCLASS =zHDLR =z
%s servingr   g{®Gáz„?)r‚   rƒ   r„   Tzserver running)r…   r   rR   r   r‘   r0   ÚgetsocknameZRequestHandlerClassr‰   rŠ   rŒ   rŽ   r   )r   ÚaddrÚhdlrrÄ   rO   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 serverÚdone)r   rR   r–   r|   r]   )r   rO   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   rˆ   r   )r   rý   rO   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ý   rO   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  rL   r   r‘   r–   )r   rO   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)ÚflagsrM   rq   )r   )rQ   r   r   rq   h  s    zLThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.handlec             s   s&   |   d¡ d V | j_|  |dd¡ d S )Nr¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   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.rr   z[READ-WRITE] SELECT completed.)r]   r  rX   rZ   r`   )r   r^   rp   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 )Nrb   ú(ú)z(FLAGS (%s))z \z* %s FETCH %sr   rµ   rr   zSTORE completed.)rS   rj   r  Úextendr]   rX   rZ   r`   )r   r^   rp   Z	new_flagsZ	flags_msgr  r   r   r   Ú	cmd_STORE{  s    zOThreadedNetworkedTests.test_bracket_flags.<locals>.BracketFlagHandler.cmd_STORE)r@   rA   rB   rq   r±   r  r
  ry   r   r   )rQ   r   ÚBracketFlagHandlerf  s   
r  r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸   „  ra   z;ThreadedNetworkedTests.test_bracket_flags.<locals>.<lambda>rr   s
   ZmFrZQ==
Útestó   1z+FLAGSz[test]s   [test]ZPERMANENTFLAGS)rL   r  rº   r   r°   ÚselectÚstorer;   )r   r  rO   r’   r_   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)rT   rU   )r   r   r   r   rq   ’  s    z@ThreadedNetworkedTests.test_issue5949.<locals>.EOFHandler.handleN)r@   rA   rB   rq   r   r   r   r   r˜   ‘  s   r˜   )	r™   rš   r  r8   r   r:   r›   r   r‘   )r   r˜   rO   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
rr   zCAPABILITY completed)rW   r`   )r   r^   rp   r   r   r   ru   Ÿ  s    
zVThreadedNetworkedTests.test_line_termination.<locals>.BadNewlineHandler.cmd_CAPABILITYN)r@   rA   rB   ru   r   r   r   r   rž     s   rž   )rL   r  r8   r   r:   r›   r   r‘   )r   rž   rO   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 )Nrr   zENABLE successful)r`   )r   r^   rp   r   r   r   r®   ª  s    z,ThreadedNetworkedTests.UTF8Server.cmd_ENABLEc             c   s&   |   d¡ d V | j_|  |dd¡ d S )Nr¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   r   r   r   r±   ­  s    

z2ThreadedNetworkedTests.UTF8Server.cmd_AUTHENTICATEN)r@   rA   rB   rs   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£   r8   r   r:   r3   r¥   )r   rO   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)r@   rA   rB   rs   r   r   r   r   ÚNoEnableServer½  s   r  r¡   )r½   r  r8   r   r:   r3   r¥   )r   r  rO   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)r@   rA   rB   r   r   r   r   ÚNonUTF8ServerÄ  s   r  r¨   r©   rr   zUTF8=ACCEPT)	rL   r8   r   r:   r3   r  rª   r   r¥   )r   r  rO   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¯   rr   r²   )r[   rO   r°   r`   )r   r^   rp   r   r   r   r³   Ñ  s    

zXThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.UTF8AppendServer.cmd_APPENDN)r@   rA   rB   r³   r   r   r   r   r´   Ð  s   r´   rµ   r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸   Ø  ra   zEThreadedNetworkedTests.test_enable_UTF8_True_append.<locals>.<lambda>rr   s
   ZmFrZQ==
zUTF8=ACCEPTzutf-8u   Subject: Ã¼Ã±Ã­Â©Ã¶Ã°Ã©zUTF8 (%s)
)	r½   r  r   r¹   rº   r°   r¥   r7   rZ   )	r   r´   rO   r’   r_   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¸   î  ra   zSThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode.<locals>.<lambda>rr   zUTF8=ACCEPTr¡   r¾   )r  r½   rº   r   r¥   r¿   r£   r8   r   r:   r3   rÀ   )r   rO   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   )r`   rÃ   )r   r^   rp   r   r   r   r±   ú  s    zLThreadedNetworkedTests.test_bad_auth_name.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   ø  s   rÄ   rÅ   c               S   s   dS )Nr   r   r   r   r   r   r¸      ra   z;ThreadedNetworkedTests.test_bad_auth_name.<locals>.<lambda>)rL   r  r8   r   r:   r3   rº   )r   rÄ   rO   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)r[   r°   r`   )r   r^   rp   r   r   r   r±     s    
zUThreadedNetworkedTests.test_invalid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ     s   rÄ   r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸     ra   zDThreadedNetworkedTests.test_invalid_authentication.<locals>.<lambda>)rL   r  r8   r   r:   r3   rº   )r   rÄ   rO   r’   r_   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¯   rr   zFAKEAUTH successful)r[   rO   r°   r`   )r   r^   rp   r   r   r   r±     s    

zSThreadedNetworkedTests.test_valid_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ     s   rÄ   r¶   c             S   s   dS )Ns   faker   )r·   r   r   r   r¸     ra   zBThreadedNetworkedTests.test_valid_authentication.<locals>.<lambda>rr   s
   ZmFrZQ==
c             S   s   dS )NrÉ   r   )r·   r   r   r   r¸   !  ra   )rL   r  rº   r   r°   )r   rÄ   rO   r’   r_   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
rr   zCRAM-MD5 successfulrÂ   z	No access)r[   r`   )r   r^   rp   rË   r   r   r   r±   -  s
    
zPThreadedNetworkedTests.test_login_cram_md5.<locals>.AuthHandler.cmd_AUTHENTICATEN)r@   rA   rB   rs   r±   r   r   r   r   rÌ   )  s   rÌ   zAUTH=CRAM-MD5rÍ   rÑ   rr   s   tanstaaftanstaaf)rL   r  r¿   rs   rÎ   r   )r   rÌ   rO   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] abortedrr   zMYAUTH successful)r[   r°   r`   )r   r^   rp   r   r   r   r±   G  s
    

zUThreadedNetworkedTests.test_aborted_authentication.<locals>.MyServer.cmd_AUTHENTICATEN)r@   rA   rB   r±   r   r   r   r   rÄ   E  s   rÄ   r¶   c             S   s   d S )Nr   )r·   r   r   r   r¸   R  ra   zDThreadedNetworkedTests.test_aborted_authentication.<locals>.<lambda>)rL   r  r8   r   r:   r3   rº   )r   rÄ   rO   r’   r_   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   
)rT   rU   r   Ú_MAXLINE)r   r   r   r   rq   W  s    zFThreadedNetworkedTests.test_linetoolong.<locals>.TooLongHandler.handleN)r@   rA   rB   rq   r   r   r   r   rÕ   V  s   rÕ   )rL   r  r8   r   r:   r3   r   r‘   )r   rÕ   rO   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  rL   r   r‘   )r   rO   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  rL   r   r‘   rª   r   rP   rØ   )r   rO   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  rL   r   r‘   rª   r   rP   rÛ   rØ   )r   rO   rÙ   r   r   r   rÜ   n  s    z1ThreadedNetworkedTests.test_with_statement_logoutN)#r@   rA   rB   r™   ræ   r…   r   r:   r   rþ   r   r   r  r  r   r  r  r  rŸ   rL   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è   )rE   rF   ré   rì   rí   r¤   rî   r  rL   r   r‘   r–   )r   rè   rO   r’   r   r   r   rñ     s    

z+ThreadedNetworkedTestsSSL.test_ssl_verifiedN)	r@   rA   rB   rC   r…   rù   r   r   rñ   r   r   r   r   r  z  s   r  Ú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   ÚportrO   )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)rO   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   rr   )r   r  rO   rs   ÚassertIsInstanceÚstrr;   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  rO   rÛ   r   )r   r%  r   r   r   rà   ®  s    
zRemoteIMAPTest.test_logoutN)r@   rA   rB   r  r  r"  r#  r   r:   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   rr   )rM   r  r   r  rO   Ústarttlsr   )r   r%  )rQ   r   r   r  º  s    

zRemoteIMAP_STARTTLSTest.setUpc             C   s2   x| j jD ]}|  |t¡ q
W |  d| j j¡ d S )Nr  )rO   rs   r   r!  ÚassertNotIn)r   r$  r   r   r   r&  À  s    z&RemoteIMAP_STARTTLSTest.test_logincapa)r@   rA   rB   r  r&  ry   r   r   )rQ   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)rE   rF   ré   rë   Z	CERT_NONErê   rG   rH   )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   rr   )
rs   r   r!  r)  r;   rª   r"  r#  r   rÛ   )r   rO   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  r8   Ú
ValueErrorr   r  rH   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  r8   r.  r   r  rH   r+  )r   r   r   r   Ú"test_ssl_context_keyfile_exclusiveô  s    z5RemoteIMAP_SSLTest.test_ssl_context_keyfile_exclusiveN)r@   rA   rB   r  rù   r   r  r  r+  r,  r&  rà   r/  r0  r   r   r   r   r*  Æ  s   r*  Ú__main__)5r  r   Ú
contextlibr   r4   r   Úos.pathÚosr™   r   r   r‰   r0   Ztest.supportr   r   r   r   r   r	   Úunittestr
   r   r   r   rE   ÚImportErrorÚpathr]   ÚdirnameÚ__file__ÚcurdirrH   rí   ÚTestCaser   ræ   rC   rù   rš   rL   rz   rå   Ú
skipUnlessrç   rú   r  Úis_resource_enabledr  r'  r*  r@   Úmainr   r   r   r   Ú<module>   s`    
F	R  *$  c
 

4
