
    7bh                     &   	 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Zd dlm
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ  ej.                  d
       ej0                  ZdZddz  ZdZdZdZd Z G d dej@                        Z! G d dej@                        Z" G d dejF                  ejH                        Z%eejL                  jO                  ejL                  jQ                  e)      dd      Z*ejL                  jO                  ejL                  jQ                  e)      dd      Z+ G d dejF                        Z, G d de,e!      Z- G d d e,e"      Z. G d! d"e%      Z/ G d# d$e
      Z0 eejb                  d%       G d& d'e
             Z2 eed(       G d) d*e0             Z3 eed(       G d+ d,e
             Z4 G d- d.e
      Z5 G d/ d0e
      Z6d1 Z7e8d2k(  r ejr                          yy# e	$ r dZY w xY w)3    N)TestCase
skipUnless)support)threading_helper)socket_helper)warnings_helper)asynchat)asyncore)HOSTHOSTv6T)moduleutf-8u   abcde¹²³¤¦
i  u   foo
bar
 non-ascii char ®
u>  type=cdir;perm=el;unique==keVO1+ZF4; test
type=pdir;perm=e;unique==keVO1+d?3; ..
type=OS.unix=slink:/foobar;perm=;unique==keVO1+4G4; foobar
type=OS.unix=chr-13/29;perm=;unique==keVO1+5G4; device
type=OS.unix=blk-11/108;perm=;unique==keVO1+6G4; block
type=file;perm=awr;unique==keVO1+8G4; writable
type=dir;perm=cpmel;unique==keVO1+7G4; promiscuous
type=dir;perm=;unique==keVO1+1t2; no-exec
type=file;perm=r;unique==keVO1+EG4; two words
type=file;perm=r;unique==keVO1+IH4;  leading space
type=file;perm=r;unique==keVO1+1G4; file1
type=dir;perm=cpmel;unique==keVO1+7G4; incoming
type=file;perm=r;unique==keVO1+1G4; file2
type=file;perm=r;unique==keVO1+1G4; file3
type=file;perm=r;unique==keVO1+1G4; file4
type=dir;perm=cpmel;unique==SGP1; dir ® non-ascii char
type=file;perm=r;unique==SGP2; file ® non-ascii char
c                       y N r       :/opt/python-3.12.12/usr/lib/python3.12/test/test_ftplib.pydefault_error_handlerr   9   s     	r   c                   @     e Zd ZdZd Zd Zd Z fdZd Zd Z	 xZ
S )DummyDTPHandlerFc                     t         j                  j                  | |       || _        t	               | j                  _        |j                  | _        y r   )r	   
async_chat__init__	baseclass	bytearraylast_received_dataencodingselfconnr   s      r   r   zDummyDTPHandler.__init__C   s:    $$T40",5K)!**r   c                 d    | j                  d      }| j                  xj                  |z  c_        y )N   )recvr   r   )r   new_datas     r   handle_readzDummyDTPHandler.handle_readI   s$    99T?))X5)r   c                     | j                   s3| j                  j                  d       | j                          d| _         y y )N226 transfer completeT)dtp_conn_closedr   pushshutdownr   s    r   handle_closezDummyDTPHandler.handle_closeM   s6     ##NN 78MMO#'D  $r   c                     | j                   j                  '| j                   j                  }d | j                   _        |s| j                         S t        t        |   |j                  | j                               y r   )r   	next_dataclose_when_donesuperr   r)   encoder   )r   what	__class__s     r   r)   zDummyDTPHandler.pushV   s\    >>##/>>++D'+DNN$''))ot)$++dmm*DEr   c                     t                y r   r   r+   s    r   handle_errorzDummyDTPHandler.handle_error^       r   c                 $    | j                          y r   )closer+   s    r   r*   zDummyDTPHandler.shutdowna   s    

r   )__name__
__module____qualname__r(   r   r%   r,   r)   r6   r*   __classcell__r3   s   @r   r   r   @   s'    O+6(F r   r   c                       e Zd ZeZefdZd Zd Zd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&y")#DummyFTPHandlerc                    t         j                  j                  | |       | j                  j	                  t        j
                  t        j                  d       | j                  d       g | _        d | _	        d | _
        t               | _        d| _        d | _        d | _        t         | _        | j%                  d       || _        d| _        y )N      
 220 welcomez252.253.254.255)r	   r   r   socket
setsockopt
SOL_SOCKETSO_OOBINLINEset_terminator	in_bufferdtplast_received_cmdr   r   next_responser.   rest	RETR_DATAnext_retr_datar)   r   fake_pasv_server_ipr   r    r   s      r   r   zDummyFTPHandler.__init__i   s    $$T40v00&2E2EqIG$!%"++	'		-   $5 r   c                 :    | j                   j                  |       y r   )rK   appendr   datas     r   collect_incoming_dataz%DummyFTPHandler.collect_incoming_data}   s    d#r   c                    dj                  | j                        j                  | j                        }g | _        | j                  r"| j                  | j                         d| _        |j                  d      d   j                         }|| _        |j                  d      }|dk7  r	||dz   d  }nd}t        | d|z         rt        | d|z         } ||       y | j                  d|z         y )	Nr   rD    r   rB   cmd_z 550 command "%s" not understood.)joinrK   decoder   rN   r)   splitlowerrM   findhasattrgetattr)r   linecmdspaceargmethods         r   found_terminatorz DummyFTPHandler.found_terminator   s    xx'..t}}=IId(()!#Djjoa &&(!$		#B;uqyz"CC4#&T6C<0F3KII8#=>r   c                     t                y r   r5   r+   s    r   r6   zDummyFTPHandler.handle_error   r7   r   c                 |    t         j                  j                  | |j                  | j                        dz          y )NrC   )r	   r   r)   r1   r   rV   s     r   r)   zDummyFTPHandler.push   s*      t{{4=='AG'KLr   c                    t        t        t        |j                  d                  }dt	        |d d       z  }|d   dz  |d   z   }t        j                  ||ft              }| j                  ||       | _	        | j                  d       y )	N,z%d.%d.%d.%d         timeoutr   &200 active data connection established)listmapintr_   tuplerF   create_connectionTIMEOUTdtp_handlerrL   r)   )r   rg   addripportss         r   cmd_portzDummyFTPHandler.cmd_port   s    CSYYs^,-E$r(O+Q#a($$b$ZA##A#6		:;r   c                    t        j                  | j                   j                         d   df      5 }|j                  t               |j                         d   }| j
                  }|j                  dd      }|dz  }|dz  }| j                  d|||fz         |j                         \  }}| j                  ||       | _
        d d d        y # 1 sw Y   y xY w)Nr   rB   .rm   ro   z$227 entering passive mode (%s,%d,%d)rs   )rF   create_servergetsockname
settimeoutrz   rR   replacer)   acceptr{   rL   )	r   rg   sockr~   r}   p1p2r    r|   s	            r   cmd_pasvzDummyFTPHandler.cmd_pasv   s    !!4;;#:#:#<Q#?"CDOOG$##%a(D))BC%BD3JrTCZII<r2rlJKJD$'''=DH EDDs   BCCc                     |j                  |d         dd \  }}}t        |      }t        j                  ||ft              }| j                  ||       | _        | j                  d       y )Nr   rB   r[   rq   rs   rt   )r_   rw   rF   ry   rz   r{   rL   r)   )r   rg   afr}   r~   r   s         r   cmd_eprtzDummyFTPHandler.cmd_eprt   sd    yyQ(2.B4y$$b$ZA##A#6		:;r   c                    t        j                  | j                   j                         d   dft         j                        5 }|j	                  t
               |j                         d   }| j                  d|z         |j                         \  }}| j                  ||       | _	        d d d        y # 1 sw Y   y xY w)Nr   )familyrB   z+229 entering extended passive mode (|||%d|)rs   )
rF   r   r   AF_INET6r   rz   r)   r   r{   rL   )r   rg   r   r~   r    r|   s         r   cmd_epsvzDummyFTPHandler.cmd_epsv   s    !!4;;#:#:#<Q#?"C)/:=AOOG$##%a(DIICTIJJD$'''=DH: : :s   A(B44B=c                 &    | j                  |       y r   r)   r   rg   s     r   cmd_echozDummyFTPHandler.cmd_echo   s    		#r   c                 &    | j                  d       y )Nz200 noop okr   r   s     r   cmd_noopzDummyFTPHandler.cmd_noop       		- r   c                 &    | j                  d       y )Nz331 username okr   r   s     r   cmd_userzDummyFTPHandler.cmd_user       		#$r   c                 &    | j                  d       y )Nz230 password okr   r   s     r   cmd_passzDummyFTPHandler.cmd_pass   r   r   c                 &    | j                  d       y )Nz230 acct okr   r   s     r   cmd_acctzDummyFTPHandler.cmd_acct   r   r   c                 &    | j                  d       y )Nz350 rnfr okr   r   s     r   cmd_rnfrzDummyFTPHandler.cmd_rnfr   r   r   c                 &    | j                  d       y )Nz250 rnto okr   r   s     r   cmd_rntozDummyFTPHandler.cmd_rnto   r   r   c                 &    | j                  d       y )Nz250 dele okr   r   s     r   cmd_delezDummyFTPHandler.cmd_dele   r   r   c                 &    | j                  d       y )N
250 cwd okr   r   s     r   cmd_cwdzDummyFTPHandler.cmd_cwd       		,r   c                 &    | j                  d       y )Nz250 1000r   r   s     r   cmd_sizezDummyFTPHandler.cmd_size   s    		*r   c                 ,    | j                  d|z         y )Nz257 "%s"r   r   s     r   cmd_mkdzDummyFTPHandler.cmd_mkd   s    		*c/"r   c                 &    | j                  d       y )Nz
250 rmd okr   r   s     r   cmd_rmdzDummyFTPHandler.cmd_rmd   r   r   c                 &    | j                  d       y )Nz257 "pwd ok"r   r   s     r   cmd_pwdzDummyFTPHandler.cmd_pwd   s    		.!r   c                 &    | j                  d       y )Nz200 type okr   r   s     r   cmd_typezDummyFTPHandler.cmd_type   r   r   c                 F    | j                  d       | j                          y Nz221 quit ok)r)   r*   r   s     r   cmd_quitzDummyFTPHandler.cmd_quit   s    		- r   c                 &    | j                  d       y )Nz226 abor okr   r   s     r   cmd_aborzDummyFTPHandler.cmd_abor   r   r   c                 &    | j                  d       y )Nz125 stor okr   r   s     r   cmd_storzDummyFTPHandler.cmd_stor   r   r   c                 4    || _         | j                  d       y )Nz350 rest ok)rO   r)   r   s     r   cmd_restzDummyFTPHandler.cmd_rest   s    			- r   c                     | j                  d       | j                  t        | j                        }nd}| j                  j                  | j                  |d         | j                  j                          d | _        y )Nz125 retr okr   )r)   rO   rw   rL   rQ   r/   )r   rg   offsets      r   cmd_retrzDummyFTPHandler.cmd_retr   s^    		- 99 ^FFd))&'23  "	r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 list ok)r)   rL   	LIST_DATAr/   r   s     r   cmd_listzDummyFTPHandler.cmd_list   .    		- i   "r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 nlst ok)r)   rL   	NLST_DATAr/   r   s     r   cmd_nlstzDummyFTPHandler.cmd_nlst  r   r   c                 &    | j                  d       y )Nz200 opts okr   r   s     r   cmd_optszDummyFTPHandler.cmd_opts  r   r   c                     | j                  d       | j                  j                  t               | j                  j                          y )Nz125 mlsd ok)r)   rL   	MLSD_DATAr/   r   s     r   cmd_mlsdzDummyFTPHandler.cmd_mlsd  r   r   c                 L    dt        |      z  | _        | j                  d       y )Nxz125 setlongretr ok)rw   rQ   r)   r   s     r   cmd_setlongretrzDummyFTPHandler.cmd_setlongretr  s    !CHn		&'r   N)'r:   r;   r<   r   r{   DEFAULT_ENCODINGr   rX   ri   r6   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r@   e   s    !K&6 5($?& M<><>!%%!!!! # "!!!!#
#
!#
(r   r@   c                   ^    e Zd ZeZej                  efdZd Z	d Z
d Zd Zd ZeZd Zd Zy	)
DummyFTPServerc                    t         j                  j                  |        t        j                  j                  |        d| _        | j                  |t        j                         | j                  |       | j                  d       d| _        t        j                         | _        | j                  j                         d d \  | _        | _        d | _        || _        y )NTrp   F   )	threadingThreadr   r
   
dispatcherdaemoncreate_socketrF   SOCK_STREAMbindlistenactiveLockactive_lockr   hostr~   handler_instancer   )r   addressr   r   s       r   r   zDummyFTPServer.__init__  s    !!$'$$T*2v112		'A$>>+#{{668!<	49 $ r   c                     t        j                         | _        t         j                  j	                  |        | j                  j                          y r   )r   Event_DummyFTPServer__flagr   startwaitr+   s    r   r   zDummyFTPServer.start'  s4    oo't$r   c                 z   d| _         | j                  j                          | j                   rxt        j                  rh| j
                  j                          t        j                  dd       | j
                  j                          | j                   rt        j                  rht        j                  d       y )NT皙?rB   )rr   count
ignore_all)
r   r   setr
   
socket_mapr   acquirelooprelease	close_allr+   s    r   runzDummyFTPServer.run-  sy    kkh11$$&MM#Q/$$& kkh11 	d+r   c                 2    d| _         | j                          y )NF)r   r]   r+   s    r   stopzDummyFTPServer.stop6  s    		r   c                 H    | j                  || j                        | _        y )Nr   )handlerr   r   r   r    r|   s      r   handle_acceptedzDummyFTPServer.handle_accepted;  s     $TDMM Jr   c                 $    | j                          y r   )r*   r+   s    r   handle_connectzDummyFTPServer.handle_connect>  s    r   c                      yNr   r   r+   s    r   writablezDummyFTPServer.writableB  s    r   c                     t                y r   r5   r+   s    r   r6   zDummyFTPServer.handle_errorE  r7   r   N)r:   r;   r<   r@   r   rF   AF_INETr   r   r   r   r   r   r   r%   r   r6   r   r   r   r   r     s?    G#)>><L !,
K K r   r   certdatazkeycert3.pemzpycacert.pemc                   h     e Zd Z	 dZdZd Zd Z fdZ fdZ fdZ	 fdZ
 fdZd	 Zd
 Z xZS )SSLConnectionFc                    t        j                  t         j                        }|j                  t               |j                  | j                  ddd      }| j                          | j                  |       d| _	        y )NFT)suppress_ragged_eofsserver_sidedo_handshake_on_connect)
ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainCERTFILEwrap_socketrF   del_channel
set_socket_ssl_accepting)r   contextrF   s      r   secure_connectionzSSLConnection.secure_connectionT  sk    nnS%<%<=G##H-((>C59AF ) HF OOF#"&Dr   c                 *   	 | j                   j                          d| _        y # t        j                  $ r}|j
                  d   t        j                  t        j                  fv rY d }~y |j
                  d   t        j                  k(  r| j                         cY d }~S d|j
                  d   v r| j                         cY d }~S  d }~wt        $ r?}|j
                  d   t        j                  k(  r| j                         cY d }~S Y d }~y d }~ww xY w)NFr   SSLV3_ALERT_BAD_CERTIFICATErB   )rF   do_handshaker  r	  SSLErrorargsSSL_ERROR_WANT_READSSL_ERROR_WANT_WRITESSL_ERROR_EOFr,   OSErrorerrnoECONNABORTED)r   errs     r   _do_ssl_handshakezSSLConnection._do_ssl_handshake_  s    ,((* ',# << 	88A;3#:#:#&#;#;#= =XXa[C$5$55,,..2chhqkA,,.. /88A;%"4"44,,.. 5/sD   $ D/C+/CD  C DCD/DDDc                 b   d| _         	 | j                  j                         | _        d| _         t        | dd      du rt        t        | 3          y y # t        j                  $ r>}|j
                  d   t        j                  t        j                  fv rY d }~y Y d }~vd }~wt        $ r Y w xY w)NTr   F_ccc)_ssl_closingrF   unwrapr	  r  r  r  r  r  rc   r0   r  r9   )r   r  r3   s     r   _do_ssl_shutdownzSSLConnection._do_ssl_shutdownr  s     $D"kk002 !&DtVU+u4mT02 << 88A;3#:#:#&#;#;#= ==  
 s   A B.&/BB.-B.c                     | j                   r| j                          y | j                  r| j                          y t        t
        |           y r   )r  r   r#  r%  r0   r  handle_read_eventr   r3   s    r   r'  zSSLConnection.handle_read_event  s:    ""&&(""%%'mT<>r   c                     | j                   r| j                          y | j                  r| j                          y t        t
        |           y r   )r  r   r#  r%  r0   r  handle_write_eventr(  s    r   r*  z SSLConnection.handle_write_event  s:    ""&&(""%%'mT=?r   c                    	 t         t        |   |      S # t        j                  $ rX}|j
                  d   t        j                  t        j                  t        j                  t        j                  fv rY d }~y d }~ww xY wr   )
r0   r  sendr	  r  r  r  SSL_ERROR_ZERO_RETURNr  r  )r   rW   r  r3   s      r   r,  zSSLConnection.send  sm    ]D6t<<<< 88A;3#4#4c6O6O#&#:#:#&#;#;#= = s    BAA<;A<<Bc                 T   	 t         t        |   |      S # t        j                  $ r~}|j
                  d   t        j                  t        j                  fv rY d }~y|j
                  d   t        j                  t        j                  fv r| j                          Y d }~y d }~ww xY w)Nr   r   )r0   r  r#   r	  r  r  r  r  r  r-  r,   )r   buffer_sizer  r3   s      r   r#   zSSLConnection.recv  s    	]D6{CC<< 88A;3#:#:#&#;#;#= =88A;3#4#4c6O6O"PP%%'s     B'/B"?B"!B""B'c                     t                y r   r5   r+   s    r   r6   zSSLConnection.handle_error  s    !#r   c                     t        | j                  t        j                        r'| j                  j                  | j                          y | j                          y r   )
isinstancerF   r	  	SSLSocket_sslobjr%  r9   r+   s    r   r*   zSSLConnection.shutdown  s9    4;;6KK''3%%'

r   )r:   r;   r<   r  r#  r  r   r%  r'  r*  r,  r#   r6   r*   r=   r>   s   @r   r  r  N  s>    A		'	,&	(	?	@	
		$	r   r  c                       e Zd Z	 d Zy)DummyTLS_DTPHandlerc                     t         j                  | ||       | j                  j                  r| j	                          y y r   )r   r   r   secure_data_channelr  r   s      r   r   zDummyTLS_DTPHandler.__init__  s2    $$T4;~~11&&( 2r   N)r:   r;   r<   r   r   r   r   r6  r6    s
    <	)r   r6  c                   4    e Zd Z	 eZefdZd Zd Zd Z	d Z
y)DummyTLS_FTPHandlerc                 P    t         j                  | ||       d| _        d| _        y )Nr   F)r@   r   r8  r"  rS   s      r   r   zDummyTLS_FTPHandler.__init__  s&    $$T4($C',D$DIr   c                 H    	 | j                  d       | j                          y )Nz234 AUTH TLS successful)r)   r  r   rd   s     r   cmd_authzDummyTLS_FTPHandler.cmd_auth  s    0II/0""$r   c                 T    | j                  d       d| _        | j                          y )Nz 220 Reverting back to clear-textT)r)   r"  r%  r=  s     r   cmd_ccczDummyTLS_FTPHandler.cmd_ccc  s"    II89DI!!#r   c                 (    	 | j                  d       y )Nz200 PBSZ=0 successful.r   r=  s     r   cmd_pbszzDummyTLS_FTPHandler.cmd_pbsz  s     II./r   c                     	 |j                         }|dk(  r| j                  d       d| _        y |dk(  r| j                  d       d| _        y | j                  d       y )NCz200 Protection set to ClearFPz200 Protection set to PrivateTz(502 Unrecognized PROT type (use C or P).)upperr)   r8  )r   rd   rg   s      r   cmd_protzDummyTLS_FTPHandler.cmd_prot  sU    /**,Ccz		78+0(		9:+/(		DEr   N)r:   r;   r<   r6  r{   r   r   r>  r@  rB  rG  r   r   r   r:  r:    s'    <)*: 	
	%
	$
	0
	Fr   r:  c                       e Zd ZeZy)DummyTLS_FTPServerN)r:   r;   r<   r:  r   r   r   r   rI  rI    s    %r   rI  c                      e Zd ZefdZd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,y*)+TestFTPClassc                 0   t        t        df|      | _        | j                  j                          t	        j
                  t        |      | _        | j                  j                  | j                  j                  | j                  j                         y Nr   r   rr   r   )r   r   serverr   ftplibFTPrz   clientconnectr   r~   r   r   s     r   setUpzTestFTPClass.setUp  s^    $dAYBjj8DDKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y NTr   rR  r9   rO  r   r
   r   r+   s    r   tearDownzTestFTPClass.tearDown  7    d+r   c                 p    | j                  t        |      t        |             | j                  ||       y r   )assertEquallen)r   receivedexpecteds      r   
check_datazTestFTPClass.check_data  s*    XH68,r   c                 X    | j                  | j                  j                         d       y )NrE   )r\  rR  
getwelcomer+   s    r   test_getwelcomezTestFTPClass.test_getwelcome  s    //1=Ar   c                 <   | j                  | j                  j                  d      t        d             | j                  | j                  j                  d      t        d             | j                  | j                  j                  d      t        d             y )Nfooz
pass 12345z
pass *****z
PASS 12345z
PASS *****)r\  rR  sanitizereprr+   s    r   test_sanitizezTestFTPClass.test_sanitize  sm    --e4d5kB--l;T,=OP--l;T,=OPr   c                    | j                  t        | j                  j                  d       | j                  t        | j                  j                  d       | j                  t        | j                  j                  d       | j                  t        j
                  | j                  j                  d       | j                  t        j
                  | j                  j                  d       | j                  t        j                  | j                  j                  d       | j                  t        j                  | j                  j                  d       | j                  t        j                  | j                  j                  d       y )	Nz
echo 40
0z	echo 40
0z	echo 400zecho 400zecho 499zecho 500zecho 599zecho 999)assertRaises
ValueErrorrR  sendcmdrP  
error_temp
error_permerror_protor+   s    r   test_exceptionszTestFTPClass.test_exceptions  s    *dkk&9&9>J*dkk&9&9<H*dkk&9&9<H&++T[[-@-@*M&++T[[-@-@*M&++T[[-@-@*M&++T[[-@-@*M&,,dkk.A.A:Nr   c                    t         j                  t         j                  t         j                  t         j                  t         j
                  t        t        f}|D ]
  }	  |d       y # t         j                  $ r Y #w xY w)Nz(exception not included in all_errors set)	rP  error_replyrm  rn  ro  Errorr  EOFError
all_errors)r   
exceptionsr   s      r   test_all_errorszTestFTPClass.test_all_errors  sm    ((&*;*;V=N=N((&,, 
 ABCC  $$ s   A((A>=A>c                 N   | j                  | j                  j                         | j                  j                  d       | j                  | j                  j                         | j                  j                  d       | j	                  | j                  j                         y )NTF)
assertTruerR  passiveserverset_pasvassertFalser+   s    r   test_set_pasvzTestFTPClass.test_set_pasv  sj    112T"112U#223r   c                    | j                  | j                  j                  d      d       | j                  | j                  j                  d      d       | j                  t        j
                  | j                  j                  d       | j                  t        j
                  | j                  j                  d       y )Nzecho 200200zecho 299299zecho 199zecho 300)r\  rR  voidcmdrj  rP  rr  r+   s    r   test_voidcmdzTestFTPClass.test_voidcmd#  s    ,,Z8%@,,Z8%@&,,dkk.A.A:N&,,dkk.A.A:Nr   c                 8    | j                   j                          y r   )rR  loginr+   s    r   
test_loginzTestFTPClass.test_login)      r   c                 :    | j                   j                  d       y )Npasswd)rR  acctr+   s    r   	test_acctzTestFTPClass.test_acct,  s    "r   c                     | j                   j                  dd       d| j                  j                  _        | j                  t        j                  | j                   j                  dd       y )Nabr  )rR  renamerO  r   rN   rj  rP  rr  r+   s    r   test_renamezTestFTPClass.test_rename/  sL    3$5:$$2&,,dkk.@.@#sKr   c                     | j                   j                  d       d| j                  j                  _        | j                  t        j                  | j                   j                  d       y )Nre  199)rR  deleterO  r   rN   rj  rP  rr  r+   s    r   test_deletezTestFTPClass.test_delete4  sH    5!5:$$2&,,dkk.@.@%Hr   c                 :    | j                   j                  d       y Nre  )rR  sizer+   s    r   	test_sizezTestFTPClass.test_size9  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )N/foo)rR  mkdr\  r   dirs     r   test_mkdzTestFTPClass.test_mkd<  s$    kkoof%f%r   c                 :    | j                   j                  d       y r  )rR  rmdr+   s    r   test_rmdzTestFTPClass.test_rmd@  s    r   c                 ^    | j                   j                  d      }| j                  |d       y )Nr  r   )rR  cwdr\  r  s     r   test_cwdzTestFTPClass.test_cwdC  s$    kkoof%l+r   c                 \    | j                   j                         }| j                  |d       y )Nzpwd ok)rR  pwdr\  r  s     r   test_pwdzTestFTPClass.test_pwdG  s"    kkooh'r   c                     | j                  | j                  j                         d       | j                  | j                  j                  d        y r   )r\  rR  quitr   r+   s    r   	test_quitzTestFTPClass.test_quitK  s9    ))+];))40r   c                 8    | j                   j                          y r   )rR  abortr+   s    r   
test_abortzTestFTPClass.test_abortP  r  r   c                     g }| j                   j                  d|j                         | j                  dj	                  |      t
        j                  | j                   j                               y Nretrr   rR  
retrbinaryrU   r`  r]   rP   r1   r   r   r^  s     r   test_retrbinaryzTestFTPClass.test_retrbinaryS  sO    vx7*!(()=)=>	@r   c                     dD ]w  }g }| j                   j                  d|j                  |       | j                  dj	                  |      t
        |d  j                  | j                   j                               y y )N)r   
      r  rO   r   r  )r   rO   r^  s      r   test_retrbinary_restz!TestFTPClass.test_retrbinary_restY  se    DHKK""68??"FOOCHHX.%de,33DKK4H4HIK  r   c                     g }| j                   j                  d|j                         | j                  dj	                  |      t
        j                  dd             y )Nr  rD   
)rR  	retrlinesrU   r`  r]   rP   r   r  s     r   test_retrlineszTestFTPClass.test_retrlines`  sC    fhoo6)9+<+<VR+HIr   c                    t        j                  t        j                  | j                  j
                              }| j                  j                  d|       | j                  | j                  j                  j                  t        j                  | j                  j
                               g |j                  d       | j                  j                  d|fd       | j                         y )Nstorr   c                 &    j                  d       S r   rU   r   flags    r   <lambda>z.TestFTPClass.test_storbinary.<locals>.<lambda>m  s    T[[=Nr   callback)ioBytesIOrP   r1   rR  r   
storbinaryr`  rO  r   r   seekry  )r   fr  s     @r   test_storbinaryzTestFTPClass.test_storbinarye  s    JJy''(<(<=>vq)44GG!(()=)=>	@ 	q	vq3NOr   c                 ~   t         j                  dd      j                  | j                  j                        }t        j                  |      }dD ]j  }|j                  d       | j                  j                  d||       | j                  | j                  j                  j                  t        |             l y )Nr  
)   30r   r  r  )rP   r   r1   rR  r   r  r  r  r  r\  rO  r   rO   str)r   rW   r  rs       r   test_storbinary_restz!TestFTPClass.test_storbinary_restp  s      .55dkk6J6JKJJtAFF1IKK""611"5T[[99>>AG r   c                     t         j                  dd      j                  | j                  j                        }t        j                  |      }| j                  j                  d|       | j                  | j                  j                  j                  t         j                  | j                  j                               g |j                  d       | j                  j                  d|fd       | j                         t        j                  t         j                  dd            }t        j                   dt"        fd	
      5  | j%                  t&        | j                  j                  d|       d d d        y # 1 sw Y   y xY w)Nr  r  r  r   zstor fooc                 &    j                  d       S r   r  r  s    r   r  z-TestFTPClass.test_storlines.<locals>.<lambda>  s    D@Qr   r  rD   T)quiet)rP   r   r1   rR  r   r  r  	storlinesr`  rO  r   r   r  ry  StringIOr   check_warningsBytesWarningrj  	TypeError)r   rW   r  r  s      @r   test_storlineszTestFTPClass.test_storlinesx  s     .55dkk6J6JKJJtfa(44GG!(()=)=>	@ 	q	j!6QRKK	))&$78++R,>dKi)>)>
AN LKKs   -FFc                     | j                   j                          | j                  | j                   j                         t        j	                  d      d d        y )Nr  r[   )rR  nlstr\  r   r_   r+   s    r   	test_nlstzTestFTPClass.test_nlst  s?    ))+Y__V-DSb-IJr   c                     g }| j                   j                  |j                         | j                  dj	                  |      t
        j                  dd             y )NrD   r  )rR  r  rU   r\  r]   r   r   )r   ls     r   test_dirzTestFTPClass.test_dir  s@    !Y%6%6vr%BCr   c                     t         j                  j                                t         j                  j                  d             t         j                  j                  dddg             t         j                  j                               }|D ]x  \  }} j                  |t                j                  |t
                j                  |        j                  d|        j                  d|        j                  d|       z  fdd( fd		} |d
        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd         |d!d"        |d#d$        d%       t         j                  j                               \  }}|D ]!  } j                  |j                                #  d&        j                  t        t         j                  j                                 d&        j                  j                         D ]  } j                  d'|z          y ))N/)pathr  type)r  factspermuniquec                 <    | j                   j                  _        y r   )rO  r   r.   )rW   r   s    r   set_dataz(TestFTPClass.test_mlsd.<locals>.set_data  s    59DKK((2r   c                 4   |dn|}|dn|}|dn|}|dn|} |        t        j                  j                               \  }}j                  ||       j                  |d   |       j                  |d   |       j                  |d   |       y )Nr  r  r  name)nextrR  mlsdr\  )	rd   r  r  r  r  _namer  r   r  s	          r   
test_entryz*TestFTPClass.test_mlsd.<locals>.test_entry  s    !\6tD!\6tD!'XVF!\6tDTN 0 0 23LE5UD)U6]D1U6]D1U8_f5r   z)type=type;perm=perm;unique=unique; name
z*type=ty=pe;perm=perm;unique=unique; name
zty=pe)r  z*type==type;perm=perm;unique=unique; name
z=typez+type=t=y=pe;perm=perm;unique=unique; name
zt=y=pez)type=====;perm=perm;unique=unique; name
z====z*type=type;perm=perm;unique=unique; na me
zna me)r  z*type=type;perm=perm;unique=unique; name 
zname z*type=type;perm=perm;unique=unique;  name
z namez,type=type;perm=perm;unique=unique; n am  e
zn am  ez*type=type;perm=perm;unique=unique; na;me
zna;mez*type=type;perm=perm;unique=unique; ;name
z;namez+type=type;perm=perm;unique=unique; ;name;
z;name;z)type=type;perm=perm;unique=unique; ;;;;
z;;;;z)Type=type;TyPe=perm;UNIQUE=unique; name
rD   zunexpected data %s)NNNN)ru   rR  r  assertIsInstancer  dictry  assertInr  islowerrj  StopIterationfail)r   lsr  r  r  r  r   r  s   `      @r   	test_mlsdzTestFTPClass.test_mlsd  s   T[[ T[[3'(T[[3vv.>?@$++""$%KD%!!$,!!%.OOD!MM&%(MM&%(MM(E* 	:
	6 	@AAPAPBR@vNAPAPAPC)TAPAPBR@vN>?DKK,,./uAOOAIIK(  	-t{{/?/?/AB!!#AII*Q./ $r   c                     | j                   j                         5  | j                  | j                  j                  j
                  d       d d d        y # 1 sw Y   y xY w)Nr~   rR  makeportr\  rO  r   rM   r+   s    r   test_makeportzTestFTPClass.test_makeport  sA    [[!!#T[[99KK &( $##   1AAc                     | j                   j                         \  }}t        j                  ||ft              }|j                          | j                  | j                  j                  j                  d       y )Nrq   pasv
rR  makepasvrF   ry   rz   r9   r\  rO  r   rM   r   r   r~   r    s       r   test_makepasvzTestFTPClass.test_makepasv  sW    [[))+
d''tgF

55GGPr   c                 b   	 d| j                   _        | j                   j                         \  }}| j                  || j                  j
                  j                         t        j                  | j                   j                  j                         d   |ft              j                          y )NTr   rq   )rR  trust_server_pasv_ipv4_addressr  r\  rO  r   rR   rF   ry   r   getpeernamerz   r9   )r   bad_hostr~   s      r   *test_makepasv_issue43285_security_disabledz7TestFTPClass.test_makepasv_issue43285_security_disabled  s    =592--/$$++66JJ	L 	  $++"2"2">">"@"CT!J)0	227%'r   c                 >   | j                  | j                  j                         | j                  j                         \  }}| j	                  || j
                  j                  j                         t        j                  ||ft              j                          y )Nrq   )r|  rR  r  r  assertNotEqualrO  r   rR   rF   ry   rz   r9   )r   trusted_hostr~   s      r   1test_makepasv_issue43285_security_enabled_defaultz>TestFTPClass.test_makepasv_issue43285_security_enabled_default  su    CCD![[113ddkk::NN	P 	  ,!5wGMMOr   c                      j                   j                           fd}t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d        j                   |              d d d         j                   j                  j                  j                  d        j                   |              t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d        j                   j                          d d d         j                   j                  j                  j                  d        j                   |              	 t        j                  t              5  _          j                   j                   j                  j                   j                  j                          j                   j                  d       d j                  j                  _        d d d         j!                  d       t'        j(                  d        j                   j                  j                  j                  d        j                   |              y # 1 sw Y   GxY w# 1 sw Y   mxY w# 1 sw Y   xY w# t        j"                  $ r%} j                  t%        |      d       Y d }~d }~ww xY w)Nc                       j                   j                  y	  j                   j                  d       y# t        t        f$ r Y yw xY w)NFnoopT)rR  r   rl  r  rt  r+   s   r   is_client_connectedz=TestFTPClass.test_with_statement.<locals>.is_client_connected  sK    {{'##F+  X& s   6 AArq   r  r  z550 error on quitzException not raisedr   )rR  r  rP  rQ  rz   rS  rO  r   r~   rl  ry  r\  r   rM   r|  rN   r  rn  r  timesleep)r   r  r  s   `  r   test_with_statementz TestFTPClass.test_with_statement  s@   	 ZZ(DKKK 0 0$++2B2BCKK'OO/12 ) 	55GGP,./ ZZ(DKKK 0 0$++2B2BCKK'KK ) 	55GGP,./	.G,##DKK$4$4dkk6F6FG##F+=P,,: - II,- 	

355GGP,./= )( )( -,    	<SX':;;	<sJ   A;K;A?L,L! B LL! ;LLLL! !M4MMc                 "   | j                   j                          t        j                         }	 | j                   j	                  | j
                  j                  | j
                  j                  t        |f       | j                  | j                   j                  j                         d   |       | j                   j                          y # t        $ r7}|j                  t        j                  k(  r| j                  d|z          d }~ww xY w)N)source_addressrB   couldn't bind to port %d)rR  r  r   find_unused_portrS  rO  r   r~   r   r\  r   r   r  r  
EADDRINUSEskipTest)r   r~   es      r   test_source_addressz TestFTPClass.test_source_address  s    --/	KK 0 0$++2B2B04d|   =T[[--99;A>EKK 	ww%***84?@	s   BC 	D2D		Dc                    t        j                         }t        |f| j                  _        	 | j                  j                  d      5 }| j                  |j                         d   |       d d d        y # 1 sw Y   y xY w# t        $ r7}|j                  t        j                  k(  r| j                  d|z          d }~ww xY w)Nru   rB   r  )r   r  r   rR  r  transfercmdr\  r   r  r  r  r  )r   r~   r   r  s       r   &test_source_address_passive_connectionz3TestFTPClass.test_source_address_passive_connection'  s    --/&*D\"	((0D  !1!1!3A!6= 100 	ww%***84?@	s5   B $A5,B 5A>:B >B 	C
2B<<Cc                    | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  d      d       | j                  t        j                  t        j                  d       | j                  t        j                  d      d	       | j                  t        j                  d
      d	       y )Nz257 "/foo/bar"z/foo/barz257 "/foo/bar" createdz257 ""rD   z257 "" createdz250 "/foo/bar"z257 "/foo/b""ar"z	/foo/b"arz257 "/foo/b""ar" created)r\  rP  parse257rj  rr  r+   s    r   test_parse257zTestFTPClass.test_parse2572  s    )9:JG)ABJO2B7)9:B?&,,foo?OP 	);<kJ)CDkRr   c                     | j                  t        j                  | j                  j                  d| j                  j
                  z  dz         y )Nr   r   )rj  rP  rs  rR  rl  maxliner+   s    r   test_line_too_longzTestFTPClass.test_line_too_long>  s9    &,,(;(; 3 33a7	9r   c                     | j                   j                  d| j                   j                  dz  z         g }| j                  t        j
                  | j                   j                  d|j                         y )NzSETLONGRETR %dr   r  )rR  rl  r#  rj  rP  rs  r  rU   r  s     r   test_retrlines_too_longz$TestFTPClass.test_retrlines_too_longB  sX    ,0C0Ca0GHI&,,++//	Jr   c                     t        j                  d| j                  j                  z  dz        }| j	                  t
        j                  | j                  j                  d|       y )N   xr   r  )r  r  rR  r#  rj  rP  rs  r  )r   r  s     r   test_storlines_too_longz$TestFTPClass.test_storlines_too_longH  sF    JJtdkk111A56&,,(=(=vqIr   c                 (   ddg}|D ]  }| j                  |      5  | j                          | j                  |       | j                  || j                  j
                         | j                          | j                          | j                          | j                  j                  d      }| j                  |d       d d d         t        j                  t              }| j                  t        |j
                         y # 1 sw Y   
xY w)Nzlatin-1r   r   u   /non-ascii dir ®rq   )subTestrY  rU  r\  rR  r   r  r  r  r  r`  rP  rQ  rz   r   )r   	encodingsr   new_dirrR  s        r   test_encoding_paramz TestFTPClass.test_encoding_paramL  s    (	!Hx0

H
-  4;;+?+?@$$&$$&##%++//*?@)>? 10 " G,)6??; 10s   B&DD	N)-r:   r;   r<   r   rU  rY  r`  rc  rh  rp  rw  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r&  r)  r.  r   r   r   rK  rK    s    - @,-BQ
O4O#L
I
 &,(1
@KJ
	HO"KD
80t(Q	:P+0Z	
S9JJ<r   rK  zIPv6 not enabledc                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestIPv6Environmentc                 ^   t        t        dft        j                  t              | _        | j
                  j                          t        j                  t        t              | _
        | j                  j                  | j
                  j                  | j
                  j                         y )Nr   )r   r   rN  )r   r   rF   r   r   rO  r   rP  rQ  rz   rR  rS  r   r~   r+   s    r   rU  zTestIPv6Environment.setUp`  sl    $fa[(..>@ 	jj;KLDKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rW  rX  r+   s    r   rY  zTestIPv6Environment.tearDownh  rZ  r   c                 l    | j                  | j                  j                  t        j                         y r   )r\  rR  r   rF   r   r+   s    r   test_afzTestIPv6Environment.test_afo  s    9r   c                     | j                   j                         5  | j                  | j                  j                  j
                  d       d d d        y # 1 sw Y   y xY w)Neprtr  r+   s    r   r  z!TestIPv6Environment.test_makeportr  sA    [[!!#T[[99KK &( $##r  c                     | j                   j                         \  }}t        j                  ||ft              }|j                          | j                  | j                  j                  j                  d       y )Nrq   epsvr   r  s       r   r  z!TestIPv6Environment.test_makepasvw  sW    [[))+
d''tgF

55GGPr   c                       fd} j                   j                  d        |         j                   j                  d        |        y )Nc                      g } j                   j                  d| j                         j                  dj	                  |       t
        j                  j                   j                               y r  )rR  r  rU   r\  r]   rP   r1   r   )r^  r   s    r   r  z/TestIPv6Environment.test_transfer.<locals>.retr~  sR    HKK""68??;SXXh/&--dkk.B.BCEr   TF)rR  r{  )r   r  s   ` r   test_transferz!TestIPv6Environment.test_transfer}  s9    	E
 	T"U#r   N)	r:   r;   r<   rU  rY  r4  r  r  r;  r   r   r   r0  r0  ]  s"    @,:(
Q	r   r0  zSSL not availablec                       e Zd Z	 efdZy)TestTLS_FTPClassMixinc                    t        t        df|      | _        | j                  j                          t	        j
                  t        |      | _        | j                  j                  | j                  j                  | j                  j                         | j                  j                          | j                  j                          y rM  )rI  r   rO  r   rP  FTP_TLSrz   rR  rS  r   r~   authprot_prT  s     r   rU  zTestTLS_FTPClassMixin.setUp  s~    ($XFnnWxHDKK,,dkk.>.>?r   N)r:   r;   r<   r   rU  r   r   r   r=  r=    s     . r   r=  c                   `    e Zd Z	 efdZd Zd Zd Zd Zd Z	d Z
d Z ed	d
      d        Zy)TestTLS_FTPClassc                 .   t        t        df|      | _        | j                  j                          t	        j
                  t              | _        | j                  j                  | j                  j                  | j                  j                         y )Nr   r   rq   )rI  r   rO  r   rP  r?  rz   rR  rS  r   r~   rT  s     r   rU  zTestTLS_FTPClass.setUp  s\    ($XFnnW5DKK,,dkk.>.>?r   c                     | j                   j                          | j                  j                          d | _        t	        j
                  d       y rW  rX  r+   s    r   rY  zTestTLS_FTPClass.tearDown  rZ  r   c                    | j                  | j                  j                  t        j                         | j                  j                          | j                  | j                  j                  t        j                         y r   )assertNotIsInstancerR  r   r	  r3  r@  r  r+   s    r   test_control_connectionz(TestTLS_FTPClass.test_control_connection  sN      !1!13==Adkk..>r   c                    | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       | j                   j                          | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       | j                   j                          | j                   j                  d      5 }| j                  |t        j                         | j                  |j                  d      t        j                  | j                   j                               d d d        | j                  | j                   j                         d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   NxY w)Nru   r"   r'   )rR  r  rG  r	  r3  r\  r#   r   r1   r   voidresprA  r  prot_c)r   r   s     r   test_data_connectionz%TestTLS_FTPClass.test_data_connection  s   [[$$V,$$T3==9TYYt_&--dkk.B.BCE - 	--/1HI 	[[$$V,!!$6 TYYt_&--dkk.B.BCE	 - 	--/1HI 	[[$$V,$$T3==9TYYt_&--dkk.B.BCE - 	--/1HI- -, -, -,s&   A)I,A)I%<A)I2I"%I/2I;c                 <   | j                  | j                  j                  t        j                         | j                  j                          | j                  | j                  j                  t        j                         | j                  j                          y r   )rG  rR  r   r	  r3  r  r  r+   s    r   r  zTestTLS_FTPClass.test_login  s^      !1!13==Adkk..>r   c                     | j                   j                          | j                  t        | j                   j                         y r   )rR  r@  rj  rk  r+   s    r   test_auth_issued_twicez'TestTLS_FTPClass.test_auth_issued_twice  s,    *dkk&6&67r   c                    | j                   j                          t        j                  t        j                        }d|_        t        j                  |_        | j                  t        t        j                  t        |       | j                  t        t        j                  t        |       | j                  t        t        j                  t        t        |       t        j                  |t              | _         | j                   j                  | j                  j                   | j                  j"                         | j%                  | j                   j&                  t        j(                         | j                   j+                          | j-                  | j                   j&                  j.                  |       | j1                  | j                   j&                  t        j(                         | j                   j3                          | j                   j5                  d      5 }| j-                  |j.                  |       | j1                  |t        j(                         d d d        y # 1 sw Y   y xY w)NF)keyfiler  )certfiler  )rR  rQ  r  r  rr   ru   )rR  r  r	  r
  PROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_moderj  r  rP  r?  r  rz   rS  rO  r   r~   rG  r   r3  r@  assertIsr  r  rA  r  r   ctxr   s      r   test_contextzTestTLS_FTPClass.test_context  s   nnS445"--)V^^X"% 	 	')V^^h"% 	 	')V^^h"*C 	 	9 nnS'BDKK,,dkk.>.>?  !1!13==Adkk&&..4dkk..>[[$$V,MM$,,,!!$6 -,,s   +=I11I:c                    | j                  t        | j                  j                         | j                  j	                  d       | j                  | j                  j                  t        j                         | j                  j                          | j                  t        | j                  j                  j                         y )NT)secure)
rj  rk  rR  cccr  r  r   r	  r3  r$  r+   s    r   test_ccczTestTLS_FTPClass.test_ccc  s{    *dkkoo6&dkk..>*dkk&6&6&=&=>r   FzFIXME: bpo-32706c                    | j                   j                          t        j                  t        j                        }| j                  |j                  t        j                         | j                  |j                  d       |j                  t               t        j                  |t              | _         | j                   j                  | j                  j                   | j                  j"                         | j%                  t        j&                        5  | j                   j)                          d d d        | j                   j                  | j                  j                   | j                  j"                         | j                   j+                          | j%                  t        j&                        5  | j                   j-                  d      5 }	 d d d        d d d        | j                   j                          | j                   j                  d| j                  j"                         | j                   j)                          | j                   j                          | j                   j                  d| j                  j"                         | j                   j+                          | j                   j-                  d      5 }	 d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)NTrS  ru   	localhost)rR  r  r	  r
  rT  r\  rW  CERT_REQUIREDrU  load_verify_locationsCAFILErP  r?  rz   rS  rO  r   r~   rj  CertificateErrorr@  rA  r  rY  s      r   test_check_hostnamez$TestTLS_FTPClass.test_check_hostname  s   nnS445#*;*;<++T2!!&)nnS'B 	DKK,,dkk.>.>?s334KK 5 	DKK,,dkk.>.>?s334((0D 1 5 	K)9)9:K)9)9:[[$$V, -,# 54 10 54 -,s<   K<K2K%K2K?K"%K/	*K22K<?LN)r:   r;   r<   r   rU  rY  rH  rL  r  rO  r[  r_  r   rf  r   r   r   rC  rC    sN    '- @,?
J4870? )* +r   rC  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestTimeoutsc                    t        j                         | _        t        j                  t        j                  t        j
                        | _        | j                  j                  d       t        j                  | j                        | _
        t        j                  | j                        | _        d| j                  _        | j                  j                          | j                  j!                          | j                  j#                          t$        j&                  j                  | _        | j                  t$        j&                  _
        y )Nr  )targetT)r   r   evtrF   r  r   r   r   r   	bind_portr~   r   rO  server_threadr   r   r   clearrP  rQ  old_portr+   s    r   rU  zTestTimeouts.setUp  s    ??$MM&..&2D2DE			R !++DII6	&--T[[A$(!  "

))

r   c                     | j                   t        j                  _        | j                  j                          d | _        y r   )ro  rP  rQ  r~   rm  r]   r+   s    r   rY  zTestTimeouts.tearDown$  s+    --

!!r   c                    | j                   j                          | j                  j                          	 | j                   j	                         \  }}|j                  d       |j                  t        j                         | j                  j                          |j                          | j                   j                          y # t        $ r Y &w xY w# | j                   j                          w xY w)Ns   1 Hola mundo
)r   r   rk  r   r   sendallr*   rF   SHUT_WRr9   TimeoutErrorr   s      r   rO  zTestTimeouts.server*  s    
 				))+JD$ LL*+MM&..)HHLLNJJLIIOO  		 IIOOs*   C AC 	CC CC C3c                    | j                  t        j                                t        j                  d       	 t	        j
                  t              }t        j                  d        | j                  |j                  j                         d       | j                  j                          |j                          y # t        j                  d        w xY wNr  )assertIsNonerF   getdefaulttimeoutsetdefaulttimeoutrP  rQ  r   r\  r   
gettimeoutrk  r   r9   r   ftps     r   testTimeoutDefaultzTestTimeouts.testTimeoutDefault?  s    &2245  $	+**T"C$$T*,,.3		 $$T*s   B= =Cc                    | j                  t        j                                t        j                  d       	 t	        j
                  t        d       }t        j                  d        | j                  |j                  j                                | j                  j                          |j                          y # t        j                  d        w xY wNr  rq   )rw  rF   rx  ry  rP  rQ  r   r   rz  rk  r   r9   r{  s     r   testTimeoutNonezTestTimeouts.testTimeoutNoneK  s    &2245  $	+**T40C$$T*#((--/0		 $$T*s   B> >Cc                 l   t        j                  t        d      }| j                  |j                  j                         d       | j                  j                          |j                          | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)Nr  rq   r   )rP  rQ  r   r\  r   rz  rk  r   r9   rj  rk  r{  s     r   testTimeoutValuezTestTimeouts.testTimeoutValueW  so    jjr*,,.3		 z*JJtQ' +**s   B**B3c                    t        j                         }|j                  t        d       | j	                  |j
                  j                         d       | j                  j                          |j                          y r  
rP  rQ  rS  r   r\  r   rz  rk  r   r9   r{  s     r   testTimeoutConnectzTestTimeouts.testTimeoutConnectb  sP    jjlD"%,,.3		r   c                    t        j                  d      }|j                  t               | j	                  |j
                  j                         d       | j                  j                          |j                          y r  r  r{  s     r   testTimeoutDifferentOrderz&TestTimeouts.testTimeoutDifferentOrderi  sO    jj$D,,.3		r   c                    t        j                         }d|_        |j                  t               | j                  |j                  j                         d       | j                  j                          |j                          y rv  )rP  rQ  rr   rS  r   r\  r   rz  rk  r   r9   r{  s     r   testTimeoutDirectAccessz$TestTimeouts.testTimeoutDirectAccessp  sS    jjlD,,.3		r   N)r:   r;   r<   rU  rY  rO  r}  r  r  r  r  r  r   r   r   rh  rh    s/    $"*

	(r   rh  c                       e Zd Zd Zy)MiscTestCasec                 D    h d}t        j                  | t        |       y )N>   CRLFtestrs  ftpcpB_CRLFMAXLINEMSG_OOBFTP_PORTparse150parse227parse229r   
print_line)not_exported)r   check__all__rP  )r   r  s     r   test__all__zMiscTestCase.test__all__z  s     	T6Er   N)r:   r;   r<   r  r   r   r   r  r  y  s    Fr   r  c                  t    t        j                         } t        j                  t         j                  g|   y r   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s*    "224K.@@O;Or   __main__):rP  rF   r  r  osr   r  r  r	  ImportErrorr   r   r  r   test.supportr   r   r   r	   r
   test.support.socket_helperr   r   requires_working_socketLOOPBACK_TIMEOUTrz   r   rP   r   r   r   r   r   r   r@   r   r   r   r  r]   dirname__file__r  rd  r  r6  r:  rI  rK  IPV6_ENABLEDr0  r=  rC  rh  r  r  r:   mainr   r   r   <module>r     s1   $
   	  	    *  ) & ( ! ! 3    t ,

"
"  ,d2	4	4	K	&	"h)) "Jn(h)) n(b0 X(()*:*: 0 f ?ww||BGGOOH5z>RHWW\\"''//(3ZPFf++ fR)m_ )%Fm_ %FP&^ &n<8 n<b M&&(:;(( ( <(V C$%L  & C$%wx w &wtb8 bJF8 FP
 zHMMO o#  
Cs   H HH