a
    äzelE  ã                   @   s˜  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ejZdZdZeedƒrÔddlZd	Zej ej e¡p²ejd
¡Zej ej e¡pÎejd¡Ze
edƒZdZdZG dd„ dej ƒZ!G dd„ dej"ej#ƒZ$G dd„ de	ƒZ%erBddl&m'Z' G dd„ de'e!ƒZ(eG dd„ de%ƒƒZ)eG dd„ de%ƒƒZ*G dd„ de	ƒZ+dd„ Z,e-d kr”e .¡  dS )!zTest script for poplib module.é    N)ÚTestCaseÚ
skipUnless)Úsupport)Úhashlib_helper)Úsocket_helperFÚPOP3_SSLTzkeycert3.pemzpycacert.pemzSSL not supporteds   1 1
2 2
3 3
4 4
5 5
.
st   From: postmaster@python.org
Content-Type: text/plain
MIME-Version: 1.0
Subject: Dummy

line1
line2
line3
.
c                   @   sØ   e Zd Zg dgdœ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eZd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erÔd*d+„ Zd,d-„ Zd.d/„ Zd0S )1ÚDummyPOP3Handlerzpython-testlib-pop-server)ZUIDLÚIMPLEMENTATIONFc                 C   s8   t j | |¡ |  d¡ g | _|  d¡ d| _d| _d S )Nó   
ú(+OK dummy pop3 server ready. <timestamp>F)ÚasynchatÚ
async_chatÚ__init__Úset_terminatorÚ	in_bufferÚpushÚ
tls_activeÚtls_starting©ÚselfÚconn© r   ú&/usr/lib/python3.9/test/test_poplib.pyr   3   s    

zDummyPOP3Handler.__init__c                 C   s   | j  |¡ d S ©N)r   Úappend©r   Údatar   r   r   Úcollect_incoming_data;   s    z&DummyPOP3Handler.collect_incoming_datac                 C   sŽ   d  | j¡}t|dƒ}g | _| d¡d  ¡ }| d¡}|dkrR||d d … }nd}t| d| ƒr|t| d| ƒ}||ƒ n|  d	| ¡ d S )
Nó    ú
ISO-8859-1ú r   éÿÿÿÿé   Ú Zcmd_z$-ERR unrecognized POP3 command "%s".)	Újoinr   ÚstrÚsplitÚlowerÚfindÚhasattrÚgetattrr   )r   ÚlineÚcmdÚspaceÚargÚmethodr   r   r   Úfound_terminator>   s    


z!DummyPOP3Handler.found_terminatorc                  C   s   ‚ d S r   r   ©r   r   r   r   Úhandle_errorN   s    zDummyPOP3Handler.handle_errorc                 C   s   t j | | d¡d ¡ d S )Nr   r
   )r   r   r   Úencoder   r   r   r   r   Q   s    zDummyPOP3Handler.pushc                 C   s   |   |¡ d S r   ©r   ©r   r.   r   r   r   Úcmd_echoT   s    zDummyPOP3Handler.cmd_echoc                 C   s    |dkr|   d¡ |   d¡ d S )NÚguidoz-ERR no such userz+OK password requiredr4   r5   r   r   r   Úcmd_userX   s    
zDummyPOP3Handler.cmd_userc                 C   s    |dkr|   d¡ |   d¡ d S )NÚpythonz-ERR wrong passwordz+OK 10 messagesr4   r5   r   r   r   Úcmd_pass]   s    
zDummyPOP3Handler.cmd_passc                 C   s   |   d¡ d S )Nz
+OK 10 100r4   r5   r   r   r   Úcmd_statb   s    zDummyPOP3Handler.cmd_statc                 C   s4   |r|   d||f ¡ n|   d¡ tj  | t¡ d S )Nz	+OK %s %sz+OK)r   r   r   Ú	LIST_RESPr5   r   r   r   Úcmd_liste   s    
zDummyPOP3Handler.cmd_listc                 C   s$   |   dttƒ ¡ tj  | t¡ d S )Nz+OK %s bytes)r   ÚlenÚ	RETR_RESPr   r   r5   r   r   r   Úcmd_retrn   s    zDummyPOP3Handler.cmd_retrc                 C   s   |   d¡ d S )Nz +OK message marked for deletion.r4   r5   r   r   r   Úcmd_delet   s    zDummyPOP3Handler.cmd_delec                 C   s   |   d¡ d S ©Nz+OK done nothing.r4   r5   r   r   r   Úcmd_noopw   s    zDummyPOP3Handler.cmd_noopc                 C   s   |   d¡ d S rB   r4   r5   r   r   r   Úcmd_rpopz   s    zDummyPOP3Handler.cmd_rpopc                 C   s   |   d¡ d S rB   r4   r5   r   r   r   Úcmd_apop}   s    zDummyPOP3Handler.cmd_apopc                 C   s   |   d¡ |  ¡  d S )Nz+OK closing.)r   Zclose_when_doner5   r   r   r   Úcmd_quit€   s    
zDummyPOP3Handler.cmd_quitc                 C   s    t | jƒ}| jstrg |d< |S ©NZSTLS)ÚdictÚCAPASr   ÚSUPPORTS_SSL)r   Z_capasr   r   r   Ú
_get_capas„   s    

zDummyPOP3Handler._get_capasc                 C   sZ   |   d¡ |  ¡ rL|  ¡  ¡ D ],\}}|g}|r:| |¡ |   d |¡¡ q|   d¡ d S )Nz+OK Capability list followsr    Ú.)r   rK   ÚitemsÚextendr$   )r   r.   ZcapÚparamsZ_lnr   r   r   Úcmd_capaŠ   s    

zDummyPOP3Handler.cmd_capac                 C   s   |   | jrdnd¡ d S )Nz+OK I know RFC6856z-ERR What is UTF8?!)r   Úenable_UTF8r5   r   r   r   Úcmd_utf8”   s
    ÿþzDummyPOP3Handler.cmd_utf8c                 C   sv   | j du rh|  d¡ t ¡ }| t¡ |j| jdddd}|  ¡  |  	|¡ d| _ d| _
g | _|  ¡  n
|  d¡ d S )NFz+OK Begin TLS negotiationT)Zserver_sideZdo_handshake_on_connectZsuppress_ragged_eofsz*-ERR Command not permitted when TLS active)r   r   ÚsslÚ
SSLContextZload_cert_chainÚCERTFILEZwrap_socketÚsocketZdel_channelZ
set_socketr   r   Ú_do_tls_handshake)r   r.   ÚcontextZtls_sockr   r   r   Úcmd_stls›   s     


ý

zDummyPOP3Handler.cmd_stlsc              
   C   s  z| j  ¡  W næ tjy® } z†|jd tjtjfv rDW Y d }~d S |jd tjkrh|  ¡ W  Y d }~S d|jd v s„d|jd v r˜|  ¡ W  Y d }~S ‚ W Y d }~n\d }~0  t	yô } z0|jd t
jkrà|  ¡ W  Y d }~S W Y d }~nd }~0 0 d| _d| _d S )Nr   ZSSLV3_ALERT_BAD_CERTIFICATEr"   ZSSLV3_ALERT_CERTIFICATE_UNKNOWNTF)rV   Zdo_handshakerS   ZSSLErrorÚargsZSSL_ERROR_WANT_READZSSL_ERROR_WANT_WRITEZSSL_ERROR_EOFÚhandle_closeÚOSErrorÚerrnoZECONNABORTEDr   r   )r   Úerrr   r   r   rW   ­   s&    ÿÿ*z"DummyPOP3Handler._do_tls_handshakec                 C   sB   | j r|  ¡  n.ztj | ¡ W n tjy<   |  ¡  Y n0 d S r   )r   rW   r   r   Úhandle_readrS   ZSSLEOFErrorr[   r1   r   r   r   r_   Â   s    
zDummyPOP3Handler.handle_readN)Ú__name__Ú
__module__Ú__qualname__rI   rQ   r   r   r0   r2   r   r6   r8   r:   r;   r=   Zcmd_uidlr@   Zcmd_toprA   rC   rD   rE   rF   rK   rP   rR   rJ   rY   rW   r_   r   r   r   r   r   .   s6   
r   c                   @   sZ   e Zd ZeZejfdd„Zdd„ Zdd„ Z	dd„ Z
d	d
„ Zdd„ ZeZdd„ Zdd„ ZdS )ÚDummyPOP3Serverc                 C   st   t j | ¡ tj | ¡ d| _|  |tj¡ |  	|¡ |  
d¡ d| _t  ¡ | _| j ¡ d d… \| _| _d | _d S )NTé   Fé   )Ú	threadingÚThreadr   ÚasyncoreÚ
dispatcherÚdaemonZcreate_socketrV   ÚSOCK_STREAMÚbindÚlistenÚactiveÚLockÚactive_lockÚgetsocknameÚhostÚportÚhandler_instance)r   ÚaddressÚafr   r   r   r   Ï   s    


zDummyPOP3Server.__init__c                 C   s.   | j r
J ‚t ¡ | _tj | ¡ | j ¡  d S r   )rn   rf   ÚEventÚ_DummyPOP3Server__flagrg   ÚstartÚwaitr1   r   r   r   ry   Û   s    

zDummyPOP3Server.startc              	   C   sv   d| _ | j ¡  zR| j rTtjrT| j tjddd W d   ƒ q1 sH0    Y  qW tjdd ntjdd 0 d S )NTgš™™™™™¹?r"   )ÚtimeoutÚcount)Z
ignore_all)rn   rx   Úsetrh   Z
socket_maprp   ZloopZ	close_allr1   r   r   r   Úruná   s    
0zDummyPOP3Server.runc                 C   s   | j s
J ‚d| _ |  ¡  d S ©NF)rn   r$   r1   r   r   r   Ústopë   s    
zDummyPOP3Server.stopc                 C   s   |   |¡| _d S r   )Úhandlerrt   )r   r   Úaddrr   r   r   Úhandle_acceptedð   s    zDummyPOP3Server.handle_acceptedc                 C   s   |   ¡  d S r   )Úcloser1   r   r   r   Úhandle_connectó   s    zDummyPOP3Server.handle_connectc                 C   s   dS )Nr   r   r1   r   r   r   Úwritable÷   s    zDummyPOP3Server.writablec                  C   s   ‚ d S r   r   r1   r   r   r   r2   ú   s    zDummyPOP3Server.handle_errorN)r`   ra   rb   r   r   rV   ÚAF_INETr   ry   r~   r€   rƒ   r…   r_   r†   r2   r   r   r   r   rc   Ë   s   
rc   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d„ Zdd„ Zdd„ Zdd„ Zejdddd d!„ ƒZejdddd"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zed0d1„ ƒZed2d3„ ƒZed4d5„ ƒZd6S )7ÚTestPOP3Classc                 C   s   |   | d¡¡ d S )Nó   +OK)Ú
assertTrueÚ
startswith©r   Úrespr   r   r   ÚassertOKÿ   s    zTestPOP3Class.assertOKc                 C   s8   t ttfƒ| _| j ¡  tj| jj| jjt	j
d| _d S ©N©r{   )rc   ÚHOSTÚPORTÚserverry   ÚpoplibÚPOP3rr   rs   Útest_supportÚLOOPBACK_TIMEOUTÚclientr1   r   r   r   ÚsetUp  s
    
ÿzTestPOP3Class.setUpc                 C   s   | j  ¡  | j ¡  d | _d S r   )r˜   r„   r“   r€   r1   r   r   r   ÚtearDown  s    

zTestPOP3Class.tearDownc                 C   s   |   | j ¡ d¡ d S )Ns(   +OK dummy pop3 server ready. <timestamp>)ÚassertEqualr˜   Z
getwelcomer1   r   r   r   Útest_getwelcome  s    ÿzTestPOP3Class.test_getwelcomec                 C   s   |   tj| jjd¡ d S )Nz	echo -err)ÚassertRaisesr”   Úerror_protor˜   Ú	_shortcmdr1   r   r   r   Útest_exceptions  s    zTestPOP3Class.test_exceptionsc                 C   s*   |   | j d¡¡ |  tj| jjd¡ d S )Nr7   Úinvalid)rŽ   r˜   Úuserr   r”   rž   r1   r   r   r   Ú	test_user  s    zTestPOP3Class.test_userc                 C   s*   |   | j d¡¡ |  tj| jjd¡ d S )Nr9   r¡   )rŽ   r˜   Zpass_r   r”   rž   r¢   r1   r   r   r   Ú
test_pass_  s    zTestPOP3Class.test_pass_c                 C   s   |   | j ¡ d¡ d S )N)é
   éd   )r›   r˜   Ústatr1   r   r   r   Ú	test_stat  s    zTestPOP3Class.test_statc                 C   s>   |   | j ¡ dd … g d¢df¡ |  | j d¡ d¡¡ d S )Nr"   )s   1 1s   2 2s   3 3s   4 4s   5 5é   Ú1s   OK 1 1)r›   r˜   ÚlistrŠ   Úendswithr1   r   r   r   Ú	test_list   s    ÿÿzTestPOP3Class.test_listc                 C   s*   dg d¢df}| j  d¡}|  ||¡ d S )Nó   +OK 116 bytes©s   From: postmaster@python.orgs   Content-Type: text/plains   MIME-Version: 1.0s   Subject: Dummyr   s   line1s   line2s   line3éq   Úfoo)r˜   Zretrr›   )r   Úexpectedr±   r   r   r   Ú	test_retr&  s    üzTestPOP3Class.test_retrc                 C   s&   |   tj| jjdtjd d  ¡ d S )Nzecho +%sr¥   Úa)r   r”   rž   r˜   rŸ   Z_MAXLINEr1   r   r   r   Útest_too_long_lines/  s    ÿz!TestPOP3Class.test_too_long_linesc                 C   s   |   | j d¡¡ d S ©Nr±   )rŽ   r˜   Zdeler1   r   r   r   Ú	test_dele3  s    zTestPOP3Class.test_delec                 C   s   |   | j ¡ ¡ d S r   )rŽ   r˜   Únoopr1   r   r   r   Ú	test_noop6  s    zTestPOP3Class.test_noopc                 C   s   |   | j d¡¡ d S r¶   )rŽ   r˜   Zrpopr1   r   r   r   Ú	test_rpop9  s    zTestPOP3Class.test_rpopÚmd5T)Zopensslc                 C   s   |   | j dd¡¡ d S )Nr±   Zdummypassword)rŽ   r˜   Úapopr1   r   r   r   Útest_apop_normal<  s    zTestPOP3Class.test_apop_normalc                 C   sV   ddd  }t  | jd|¡& |  tj| jjdd¡ W d   ƒ n1 sH0    Y  d S )Nr‰   ó   <i@B Zwelcomer´   Zkb)r–   Z	swap_attrr˜   r   r”   rž   r¼   )r   Zevil_welcomer   r   r   Útest_apop_REDOS@  s    zTestPOP3Class.test_apop_REDOSc                 C   s(   dg d¢df}|   | j dd¡|¡ d S )Nr®   r¯   r°   r"   )r›   r˜   Útop)r   r²   r   r   r   Útest_topK  s
    üzTestPOP3Class.test_topc                 C   s   | j  ¡  | j  d¡ d S r¶   )r˜   Zuidlr1   r   r   r   Ú	test_uidlS  s    
zTestPOP3Class.test_uidlc                 C   s    d| j j_|  tj| jj¡ d S r   )r“   r   rQ   r   r”   rž   r˜   Úutf8r1   r   r   r   Útest_utf8_raises_if_unsupportedW  s    
z-TestPOP3Class.test_utf8_raises_if_unsupportedc                 C   s(   d| j j_d}| j ¡ }|  ||¡ d S )NTs   +OK I know RFC6856)r“   r   rQ   r˜   rÃ   r›   )r   r²   Úresultr   r   r   Ú	test_utf8[  s    

zTestPOP3Class.test_utf8c                 C   s    | j  ¡ }|  d| ¡ v ¡ d S )Nr	   ©r˜   ÚcaparŠ   Úkeys©r   rÈ   r   r   r   Ú	test_capaa  s    
zTestPOP3Class.test_capac                 C   s4   | j  ¡ }|  |¡ |  | j j¡ |  | j j¡ d S r   )r˜   ÚquitrŠ   ÚassertIsNoneÚsockÚfilerŒ   r   r   r   Ú	test_quite  s    

zTestPOP3Class.test_quitc                 C   s    | j  ¡ }|  d| ¡ v ¡ d S rG   rÇ   rÊ   r   r   r   Útest_stls_capak  s    
zTestPOP3Class.test_stls_capac                 C   s   d}| j  ¡ }|  ||¡ d S )Nó   +OK Begin TLS negotiation)r˜   Ústlsr›   )r   r²   r   r   r   r   Ú	test_stlsp  s    
zTestPOP3Class.test_stlsc                 C   s¨   d}t  t j¡}| t¡ |  |jt j¡ |  |jd¡ |  	t j
¡ | jj|d}W d   ƒ n1 sh0    Y  tjd| jjtjd| _| jj|d}|  ||¡ d S )NrÒ   T©rX   Ú	localhostr   )rS   rT   ÚPROTOCOL_TLS_CLIENTZload_verify_locationsÚCAFILEr›   Úverify_modeZCERT_REQUIREDÚcheck_hostnamer   ZCertificateErrorr˜   rÓ   r”   r•   r“   rs   r–   r—   )r   r²   Úctxr   r   r   r   Útest_stls_contextv  s    
,ÿzTestPOP3Class.test_stls_contextN)r`   ra   rb   rŽ   r™   rš   rœ   r    r£   r¤   r¨   r­   r³   rµ   r·   r¹   rº   r   Zrequires_hashdigestr½   r¿   rÁ   rÂ   rÄ   rÆ   rË   rÐ   Úrequires_sslrÑ   rÔ   rÜ   r   r   r   r   rˆ   þ   s<   	




rˆ   )ÚSSLConnectionc                   @   s   e Zd Zdd„ ZdS )ÚDummyPOP3_SSLHandlerc                 C   s@   t j | |¡ |  ¡  |  d¡ g | _|  d¡ d| _d| _d S )Nr
   r   TF)	r   r   r   Zsecure_connectionr   r   r   r   r   r   r   r   r   r   Š  s    

zDummyPOP3_SSLHandler.__init__N)r`   ra   rb   r   r   r   r   r   rß   ˆ  s   rß   c                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zdd„ ZeZd	d
„ ZdS )ÚTestPOP3_SSLClassc                 C   s:   t ttfƒ| _t| j_| j ¡  t | jj	| jj
¡| _d S r   )rc   r‘   r’   r“   rß   r   ry   r”   r   rr   rs   r˜   r1   r   r   r   r™   ˜  s    
zTestPOP3_SSLClass.setUpc                 C   s   |   dtj¡ d S )Nr   )ZassertInr”   Ú__all__r1   r   r   r   Útest__all__ž  s    zTestPOP3_SSLClass.test__all__c              	   C   sÞ   t  t j¡}d|_t j|_| jttj	| j
j| j
jt|d | jttj	| j
j| j
jt|d | jttj	| j
j| j
jtt|d | j ¡  tj	| j
j| j
j|d| _|  | jjt j¡ |  | jjj|¡ |  | j ¡  d¡¡ d S )NF)ÚkeyfilerX   )ÚcertfilerX   )rã   rä   rX   rÕ   r‰   )rS   rT   r×   rÚ   Z	CERT_NONErÙ   r   Ú
ValueErrorr”   r   r“   rr   rs   rU   r˜   rÌ   ZassertIsInstancerÎ   Z	SSLSocketZassertIsrX   rŠ   r¸   r‹   )r   rÛ   r   r   r   Útest_context¡  s(    
ÿ
ÿþ
ÿzTestPOP3_SSLClass.test_contextc                 C   s   |   tj| jj¡ d S r   ©r   r”   rž   r˜   rÓ   r1   r   r   r   rÔ   ´  s    zTestPOP3_SSLClass.test_stlsc                 C   s    | j  ¡ }|  d| ¡ v ¡ d S rG   ©r˜   rÈ   ZassertFalserÉ   rÊ   r   r   r   rÑ   ¹  s    
z TestPOP3_SSLClass.test_stls_capaN)	r`   ra   rb   r™   râ   ræ   rÔ   rÜ   rÑ   r   r   r   r   rà   ”  s   rà   c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ ZeZdd„ Zd	S )
ÚTestPOP3_TLSClassc                 C   sB   t ttfƒ| _| j ¡  tj| jj| jjt	j
d| _| j ¡  d S r   )rc   r‘   r’   r“   ry   r”   r•   rr   rs   r–   r—   r˜   rÓ   r1   r   r   r   r™   Â  s    
ÿzTestPOP3_TLSClass.setUpc                 C   sZ   | j jd urF| j jd urFz| j  ¡  W n tjyD   | j  ¡  Y n0 | j ¡  d | _d S r   )	r˜   rÏ   rÎ   rÌ   r”   rž   r„   r“   r€   r1   r   r   r   rš   É  s    
zTestPOP3_TLSClass.tearDownc                 C   s   |   tj| jj¡ d S r   rç   r1   r   r   r   rÔ   Ö  s    zTestPOP3_TLSClass.test_stlsc                 C   s    | j  ¡ }|  d| ¡ v ¡ d S )Ns   STLSrè   rÊ   r   r   r   rÑ   Û  s    
z TestPOP3_TLSClass.test_stls_capaN)r`   ra   rb   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S )ÚTestTimeoutsc                 C   sp   t  ¡ | _t tjtj¡| _| j d¡ t 	| j¡| _
t j| j| j| jfd| _d| j_| j ¡  | j ¡  d S )Né<   )ÚtargetrZ   T)rf   rw   ÚevtrV   r‡   rk   rÎ   Ú
settimeoutr   Z	bind_portrs   rg   r“   Úthreadrj   ry   rz   r1   r   r   r   r™   â  s    

zTestTimeouts.setUpc                 C   s   | j  ¡  d | _ d S r   )rï   r$   r1   r   r   r   rš   ì  s    
zTestTimeouts.tearDownc                 C   sd   |  ¡  | ¡  zDz"| ¡ \}}| d¡ | ¡  W n tjyH   Y n0 W | ¡  n
| ¡  0 d S )Ns   + Hola mundo
)rm   r}   ÚacceptÚsendr„   rV   r{   )r   rí   Zservr   r‚   r   r   r   r“   ñ  s    
zTestTimeouts.serverc              	   C   sd   |   t ¡ ¡ t tj¡ zt t| j	¡}W t d ¡ nt d ¡ 0 |  
|j ¡ tj¡ | ¡  d S r   )rÍ   rV   ÚgetdefaulttimeoutÚsetdefaulttimeoutr–   r—   r”   r•   r‘   rs   r›   rÎ   Ú
gettimeoutr„   ©r   Úpopr   r   r   ÚtestTimeoutDefaultý  s    zTestTimeouts.testTimeoutDefaultc              	   C   sb   |   t ¡ ¡ t d¡ z tjt| jd d}W t d ¡ nt d ¡ 0 |   |j 	¡ ¡ | 
¡  d S )Né   r   )rÍ   rV   rò   ró   r”   r•   r‘   rs   rÎ   rô   r„   rõ   r   r   r   ÚtestTimeoutNone  s    
zTestTimeouts.testTimeoutNonec                 C   sp   t jt| jtjd}|  |j ¡ tj¡ | 	¡  |  
t¡" t jt| jdd W d   ƒ n1 sb0    Y  d S )Nr   r   )r”   r•   r‘   rs   r–   r—   r›   rÎ   rô   r„   r   rå   rõ   r   r   r   ÚtestTimeoutValue  s
    zTestTimeouts.testTimeoutValueN)	r`   ra   rb   r™   rš   r“   r÷   rù   rú   r   r   r   r   rê   à  s   


rê   c                  C   s    t  ¡ } tjt jg| ¢R Ž  d S r   )r–   Zthreading_setupÚunittestZaddModuleCleanupZthreading_cleanup)Úthread_infor   r   r   ÚsetUpModule  s    rý   Ú__main__)/Ú__doc__r”   rh   r   rV   Úosr]   rf   rû   r   r   Útestr   r–   Ztest.supportr   r   r‘   r’   rJ   r)   rS   Úpathr$   ÚdirnameÚ__file__ÚcurdirrU   rØ   rÝ   r<   r?   r   r   ri   rg   rc   rˆ   Ztest.test_ftplibrÞ   rß   rà   ré   rê   rý   r`   Úmainr   r   r   r   Ú<module>   sN   

 3 )!9
