B
    18™\Ñ- ã               @   s¨  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	Z	d dl
Z
d dlZd dlmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlZd dlmZ d dlmZmZ ed Zyd dlZd dl Z dZ!W n e"k
rø   dZ!Y nX dd	„ Z#d
d„ Z$ddd„Z%d dd„Z&dd„ Z'G dd„ de j(ƒZ)G dd„ de j(ƒZ*G dd„ de j(ƒZ+G dd„ de j(ƒZ,G dd„ de j(ƒZ-G dd„ de j(ƒZ.e/dkr¤e  0¡  dS )!é    N)Úmake_archiveÚregister_archive_formatÚunregister_archive_formatÚget_archive_formatsÚErrorÚunpack_archiveÚregister_unpack_formatÚRegistryErrorÚunregister_unpack_formatÚget_unpack_formatsÚSameFileError)Úsupport)ÚTESTFNÚFakePathÚ2TFc              O   s   t ttddƒdƒ‚d S )NÚEXDEVé   zInvalid cross-device link)ÚOSErrorÚgetattrÚerrno)ÚargsÚkwargs© r   úT/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_shutil.pyÚ_fake_rename$   s    r   c                s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                 s$   zt j}tt _ˆ | |ŽS |t _X d S )N)ÚosÚrenamer   )r   r   Zbuiltin_rename)Úfuncr   r   Úwrap)   s
    
zmock_rename.<locals>.wrap)Ú	functoolsÚwraps)r   r   r   )r   r   Úmock_rename(   s    r!   c          	   C   sB   t | tƒrtjj| Ž } t| |r"dndƒ}| |¡ W dQ R X dS )zÐWrite *content* to a file located at *path*.

    If *path* is a tuple instead of a string, os.path.join will be used to
    make a path.  If *binary* is true, the file will be opened in binary
    mode.
    ÚwbÚwN)Ú
isinstanceÚtupler   ÚpathÚjoinÚopenÚwrite)r&   ÚcontentÚbinaryÚfpr   r   r   Ú
write_file3   s    
r-   c          	   C   s<   t | tƒrtjj| Ž } t| |r"dndƒ
}| ¡ S Q R X dS )zÒReturn contents from a file located at *path*.

    If *path* is a tuple instead of a string, os.path.join will be used to
    make a path.  If *binary* is true, the file will be opened in binary
    mode.
    ÚrbÚrN)r$   r%   r   r&   r'   r(   Úread)r&   r+   r,   r   r   r   Ú	read_file?   s    
r1   c             C   s„   g }xzt t | ¡ƒD ]h}tj | |¡}tj |¡rrtj |¡sr| |d ¡ x.t|ƒD ]}| |d | ¡ qVW q| |¡ qW |S )Nú/)	Úsortedr   Úlistdirr&   r'   ÚisdirÚislinkÚappendÚrlistdir)r&   ÚresÚnameÚpÚnr   r   r   r8   K   s    r8   c                   s²  e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zejd	d
„ ƒZ	ejdd„ ƒZ
dd„ Ze eedƒd¡e ejdd… dkd¡e eedƒo”e ¡ dkd¡dd„ ƒƒƒZdd„ Zdd„ Ze eedƒd¡ejdd „ ƒƒZe eed!ƒd"¡ejd#d$„ ƒƒZe eed!ƒd%¡ejd&d'„ ƒƒZejd(d)„ ƒZe eed*ƒoHeed+ƒoHeed,ƒd-¡d.d/„ ƒZejd0d1„ ƒZejeje eedƒo†e ¡ dkd2¡d3d4„ ƒƒƒZejd5d6„ ƒZ ejd7d8„ ƒZ!ejd9d:„ ƒZ"ejd;d<„ ƒZ#d=d>„ Z$d?d@„ Z%dAdB„ Z&ejdCdD„ ƒZ'dEdF„ Z(dGdH„ Z)ej* +dI¡dJdK„ ƒZ,e ej-dLkdM¡e eedNƒdO¡dPdQ„ ƒƒZ.ejdRdS„ ƒZ/ejdTdU„ ƒZ0e eedVƒdW¡dXdY„ ƒZ1e eedVƒdW¡ejdZd[„ ƒƒZ2d\d]„ Z3ejd^d_„ ƒZ4ejd`da„ ƒZ5dbdc„ Z6e eedƒd¡ddde„ ƒZ7e eedƒd¡e eedfƒdg¡dhdi„ ƒƒZ8ej9djdk„ ƒZ:dldm„ Z;d®dodp„Z<ej9e e= >dq¡dr¡dsdt„ ƒƒZ?ej9dudv„ ƒZ@ej9e e= >dw¡dx¡dydz„ ƒƒZAej9e e= >d{¡d|¡d}d~„ ƒƒZBdd€„ ZCej9dd‚„ ƒZDej9e eEdƒ¡d„d…„ ƒƒZFd†d‡„ ZGdˆd‰„ ZHej9dŠd‹„ ƒZIdŒd„ ZJdŽd„ ZKdd‘„ ZLd’d“„ ZMej9d”d•„ ƒZNejOd–d—„ ƒZPejQd˜d™„ ƒZRej9dšd›„ ƒZSdœd„ ZTe ee=džƒdŸ¡d d¡„ ƒZUe eEdƒ¡e eed¢ƒd£¡d¤d¥„ ƒƒZVd¦d§„ ZWd¨d©„ ZXdªd«„ ZYd¬d­„ ZZ‡  Z[S )¯Ú
TestShutilc                s   t t| ƒ ¡  g | _d S )N)Úsuperr=   ÚsetUpÚtempdirs)Úself)Ú	__class__r   r   r?   Z   s    zTestShutil.setUpc                s:   t t| ƒ ¡  x&| jr4| j ¡ }t |tjdk¡ qW d S )N)ÚntÚcygwin)	r>   r=   ÚtearDownr@   ÚpopÚshutilÚrmtreer   r:   )rA   Úd)rB   r   r   rE   ^   s    
zTestShutil.tearDownc             C   s   t  ¡ }| j |¡ |S )zjCreate a temporary directory that will be cleaned up.

        Returns the path of the directory.
        )ÚtempfileÚmkdtempr@   r7   )rA   rI   r   r   r   rK   e   s    zTestShutil.mkdtempc             C   sX   |   ¡ }tj |d¡}t |¡ ttj |d¡dƒ t |¡}|  |t¡ t	 
|¡ d S )NZkillmeZsomefileÚfoo)rK   r   r&   r'   Úmkdirr-   ÚfsencodeÚassertIsInstanceÚbytesrG   rH   )rA   ÚtmpZvictimr   r   r   Útest_rmtree_works_on_bytesn   s    

z%TestShutil.test_rmtree_works_on_bytesc                sä   |   ¡ }tj |d¡}t |¡ tj |d¡}t ||¡ |  ttj	|¡ |  
tj |¡¡ |  
tj |¡¡ g ‰ ‡ fdd„}tj	||d |  tˆ ƒd¡ |  ˆ d d tjj¡ |  ˆ d d |¡ |  ˆ d d d t¡ d S )	NÚdirÚlinkc                 s   ˆ   | ¡ d S )N)r7   )r   )Úerrorsr   r   Úonerror‚   s    z8TestShutil.test_rmtree_fails_on_symlink.<locals>.onerror)rV   é   r   é   )rK   r   r&   r'   rM   ÚsymlinkÚassertRaisesr   rG   rH   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsr6   rO   )rA   rQ   Zdir_rT   rV   r   )rU   r   Útest_rmtree_fails_on_symlinkw   s    
z'TestShutil.test_rmtree_fails_on_symlinkc       
      C   sú   |   ¡ }tj |d¡}tj |d¡}tj |d¡}x|||fD ]}t |¡ q>W tj |d¡}t|dƒ tj |d¡}t ||¡ tj |d¡}t ||¡ tj |d¡}	t ||	¡ t |¡ |  	tj 
|¡¡ |  tj 
|¡¡ |  tj 
|¡¡ d S )	NÚdir1Údir2Údir3Úfile1rL   Úlink1Úlink2Úlink3)rK   r   r&   r'   rM   r-   rY   rG   rH   ÚassertFalser\   r[   )
rA   rQ   rb   rc   rd   rI   re   rf   rg   rh   r   r   r   Útest_rmtree_works_on_symlinksŠ   s$    

z(TestShutil.test_rmtree_works_on_symlinksc          	      s¨  t  ¡ }|  ttj|¡ tj|dd |  ¡ }t|dfdƒ tj	 
|d¡}|  t¡}t |¡ W d Q R X |tj	 
|d¡g}|  |jj|¡ |  tj	 |¡¡ tj|dd |  tj	 |¡¡ g ‰ ‡ fdd„}tj||d |  tˆ ƒd	¡ |  ˆ d
 d
 tj¡ |  ˆ d
 d |¡ |  ˆ d
 d	 d t¡ |  ˆ d
 d	 d j|¡ |  ˆ d d
 tj¡ |  ˆ d d |¡ |  ˆ d d	 d t¡ |  ˆ d d	 d j|¡ d S )NT)Úignore_errorsZtstfileÚ z*.*c                 s   ˆ   | ¡ d S )N)r7   )r   )rU   r   r   rV   ¶   s    z.TestShutil.test_rmtree_errors.<locals>.onerror)rV   rX   r   rW   )rJ   ÚmktemprZ   ÚFileNotFoundErrorrG   rH   rK   r-   r   r&   r'   ÚNotADirectoryErrorÚassertInÚ	exceptionÚfilenamer[   r\   r^   r_   r`   ÚscandirrO   Úrmdir)rA   rr   ÚtmpdirÚcmZpossible_argsrV   r   )rU   r   Útest_rmtree_errors    s2    zTestShutil.test_rmtree_errorsÚchmodzrequires os.chmod()Né   rD   z2This test can't be run on Cygwin (issue #1071513).Úgeteuidr   z9This test can't be run reliably as root (issue #1076467).c             C   s
  d| _ t t¡ |  tjt¡ tj td¡| _	tj td¡| _
t | j	¡ t | j
¡ t t¡j}t | j	¡j}t | j
¡j}tjtjB }t | j	|¡ t | j
|¡ t t|¡ |  tjt|¡ |  tj| j	|¡ |  tj| j
|¡ tjt| jd |  | j dd¡ d S )Nr   ÚaÚb)rV   é   z1Expected call to onerror function did not happen.)Ú
errorStater   rM   r   Ú
addCleanuprG   rH   r&   r'   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECrx   Úcheck_args_to_onerrorr^   )rA   Zold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moder   r   r   Útest_on_errorÄ   s(    

zTestShutil.test_on_errorc             C   sº   | j dk r‚|tjkr$|  || j¡ n:|tjkr>|  || j¡ n |  |tj¡ |  	|t
| jg¡ |  t|d tƒ¡ |  j d7  _ n4|  |tj¡ |  |t
¡ |  t|d tƒ¡ d| _ d S )NrX   r   rW   r}   )r~   r   Úunlinkr^   r€   rt   r   r`   r4   rp   r   r[   Ú
issubclassr   )rA   r   ÚargÚexcr   r   r   r‡   ä   s    


z TestShutil.check_args_to_onerrorc                sL   z>t j‰ ‡ fdd„}|t _t  t¡ ttdfdƒ t t¡ W d ˆ t _X d S )Nc                s   | t krtƒ ‚nˆ | ƒS d S )N)r   r   )Úfnr   r   )Ú
orig_lstatr   r   Úraiser  s    zFTestShutil.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserrL   )r   ÚlstatrM   r   r-   rG   rH   )rA   r   r   )rŽ   r   Ú+test_rmtree_does_not_choke_on_failing_lstatÿ   s    
z6TestShutil.test_rmtree_does_not_choke_on_failing_lstatzrequires os.chmodc             C   s„  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ t |tjtj	B ¡ t |tj
¡ |  t |¡jt |¡j¡ t ||¡ |  t |¡jt |¡j¡ tjdkr€t |tj
¡ t ||¡ |  t |¡jt |¡j¡ t |tj
¡ t ||¡ |  t |¡jt |¡j¡ t |tj
¡ t ||¡ |  t |¡jt |¡j¡ d S )NrL   ÚbarÚbazÚquuxrC   )rK   r   r&   r'   r-   rY   rx   rƒ   ÚS_IRWXUÚS_IRWXGÚS_IRWXOÚassertNotEqualr„   rG   Úcopymoder^   r:   )rA   Útmp_dirÚsrcÚdstÚsrc_linkÚdst_linkr   r   r   Útest_copymode_follow_symlinks  s0    

z(TestShutil.test_copymode_follow_symlinksÚlchmodzrequires os.lchmodc             C   sp  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ t |tjtj	B ¡ t |tj¡ t 
|tjtj	B ¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ |  t |¡jt |¡j¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ d S )NrL   r’   r“   r”   F)Úfollow_symlinks)rK   r   r&   r'   r-   rY   rx   rƒ   r•   r–   r    r—   rG   r™   r^   r   r„   r˜   )rA   rš   r›   rœ   r   rž   r   r   r   Ú test_copymode_symlink_to_symlink0  s.    

z+TestShutil.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingc             C   s€   |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ tj||dd d S )NrL   r’   r“   r”   F)r¡   )rK   r   r&   r'   r-   rY   rG   r™   )rA   rš   r›   rœ   r   rž   r   r   r   Ú*test_copymode_symlink_to_symlink_wo_lchmodN  s    

z5TestShutil.test_copymode_symlink_to_symlink_wo_lchmodc       
      C   sò  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t |¡}t ||j|jd f¡ t|dƒ |  	t |¡jt |¡j¡ t 
||¡ t 
||¡ ttdƒrÂt |tj¡ ttdƒrättdƒrät |tj¡ t |¡}ttdƒr tj||d	d
 |  	|jt |¡j¡ tj||dd
 t |¡}tjtjkrtx*dD ]"}	|  t||	ƒt||	ƒd ¡ qNW ttdƒr|  |j|j¡ ttdƒr¸t|dƒr¸|  |j|j¡ tj||dd
 |  tt |¡jt |¡j ƒdk ¡ d S )NrL   r’   r“   Úquxg      E@r    ÚlchflagsÚ	UF_NODUMPT)r¡   F)Úst_atimeÚst_mtimerW   Úst_flagsgš™™™™™¹?)rK   r   r&   r'   r-   rƒ   Úutimer§   r¨   r˜   rY   Úhasattrr    r—   r¥   r¦   r   rG   Úcopystatr„   Úsupports_follow_symlinksÚassertLessEqualr   r^   r©   r[   Úabs)
rA   rš   r›   rœ   r   rž   Úsrc_statÚsrc_link_statZdst_link_statÚattrr   r   r   Útest_copystat_symlinks\  sD    







z!TestShutil.test_copystat_symlinksÚchflagsÚ
EOPNOTSUPPÚENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPc             C   s¨   |   ¡ }tj |d¡}tj |d¡}t|dƒ t|dƒ dd„ }tj}zTx*tjtjfD ]}||ƒt_t	 
||¡ qVW |tjtj ƒt_|  tt	j
||¡ W d |t_X d S )Nre   Úfile2Úxxxc                s   t ƒ ‰ddœ‡ ‡fdd„
}|S )NT)r¡   c               s   ˆ ˆ_ ˆ‚d S )N)r   )r&   Úflagsr¡   )ÚerrÚexr   r   Ú_chflags_raiser“  s    znTestShutil.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser)r   )rº   r¼   r   )rº   r»   r   Úmake_chflags_raiser  s    zUTestShutil.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)rK   r   r&   r'   r-   r´   r   rµ   r¶   rG   r¬   rZ   r   )rA   ru   re   r·   r½   Zold_chflagsrº   r   r   r   Ú-test_copystat_handles_harmless_chflags_errors…  s    


z8TestShutil.test_copystat_handles_harmless_chflags_errorsc                sª  |   ¡ }tj |d¡‰tˆdƒ tj |d¡}t|dƒ t ˆ|¡ t ˆdd¡ t ˆdd¡ t ˆ|¡ |  t	t 
ˆ¡ƒt	t 
|¡ƒ¡ |  t ˆd¡t |d¡¡ t |¡ t|dƒ ttjdƒ‰‡‡fdd	„}z.tj‰|t_t ˆ|¡ |  dt 
|¡¡ W d ˆt_X d
dœ‡ ‡fdd„
}ztj
‰ |t_
t ˆ|¡ W d ˆ t_
X tj |d¡‰tˆˆƒ t ˆdd¡ tj |d¡}t||ƒ t ˆ|¡ |  t |d¡d¡ d S )NrL   r’   zuser.foos   42zuser.bars   43ÚEPERMc                s"   |dkrˆ‚nˆ | ||f|Ž d S )Nzuser.foor   )Úfnamer²   Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_foo¹  s    z5TestShutil.test_copyxattr.<locals>._raise_on_user_fooT)r¡   c               s    | ˆkrt tjdƒ‚ˆ | |dS )NzOperation not supported)r¡   )r   r   r¶   )rÀ   r¡   )Úorig_listxattrr›   r   r   Ú_raise_on_srcÆ  s    z0TestShutil.test_copyxattr.<locals>._raise_on_srcZthe_originalzuser.the_values   fiddlyZthe_copy)rK   r   r&   r'   r-   rG   Ú
_copyxattrÚsetxattrr^   r3   Ú	listxattrÚgetxattrÚremover   r   r¿   rp   r¬   )rA   rš   rœ   rÄ   rÆ   r   )rÅ   rÂ   rÃ   r›   r   Útest_copyxattr¢  sH    

 




zTestShutil.test_copyxattrzroot privileges requiredc             C   sî   |   ¡ }tj |d¡}tj |d¡}t|dƒ t ||¡ t |dd¡ tj|dddd tj |d¡}tj |d	¡}t|dƒ t ||¡ tj||dd |  	tj
|dddd¡ |  ttj
|d¡ tj||dd |  	t 
|d¡d¡ d S )
NrL   r“   ztrusted.foos   42s   43F)r¡   r’   r¤   )rK   r   r&   r'   r-   rY   rÈ   rG   rÇ   r^   rÊ   rZ   r   )rA   rš   r›   r   rœ   rž   r   r   r   Útest_copyxattr_symlinksÚ  s     

z"TestShutil.test_copyxattr_symlinksc             C   s  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ ttdƒrft |tj	tj
B ¡ tj||dd |  tj |¡¡ |  t|ƒt|ƒ¡ t |¡ tj||dd |  tj |¡¡ |  t |¡t |¡¡ ttdƒr|  t |¡jt |¡j¡ d S )NrL   r’   r“   r    T)r¡   F)rK   r   r&   r'   r-   rY   r«   r    rƒ   r•   r—   rG   Úcopyri   r6   r^   r1   rË   r[   Úreadlinkr   r„   )rA   rš   r›   rœ   r   r   r   r   Útest_copy_symlinksó  s$    


zTestShutil.test_copy_symlinksc       	      C   s²  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ ttdƒrft |tj	tj
B ¡ ttdƒrˆttdƒrˆt |tj¡ t |¡}t |¡}tj||dd |  tj |¡¡ |  t|ƒt|ƒ¡ t |¡ tj||d	d |  tj |¡¡ |  t |¡t |¡¡ t |¡}tjtjkrZx*d
D ]"}|  t||ƒt||ƒd ¡ q4W ttdƒr†|  |j|j¡ |  |j|j¡ ttdƒr®t|dƒr®|  |j|j¡ d S )NrL   r’   r“   r    r¥   r¦   T)r¡   F)r§   r¨   rW   r©   )rK   r   r&   r'   r-   rY   r«   r    rƒ   r•   r—   r¥   r¦   r   rG   Úcopy2ri   r6   r^   r1   rË   r[   rÏ   rª   r­   r®   r   r„   r˜   r©   )	rA   rš   r›   rœ   r   r°   r±   Údst_statr²   r   r   r   Útest_copy2_symlinks
  s:    






zTestShutil.test_copy2_symlinksc             C   sr   |   ¡ }tj |d¡}tj |d¡}t|dƒ t |dd¡ t ||¡ |  t 	|d¡t 	|d¡¡ t 
|¡ d S )NrL   r’   zuser.foos   42)rK   r   r&   r'   r-   rÈ   rG   rÑ   r^   rÊ   rË   )rA   rš   r›   rœ   r   r   r   Útest_copy2_xattr-  s    

zTestShutil.test_copy2_xattrc             C   s²   |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ tj||dd |  tj 	|¡¡ |  
t |¡t |¡¡ t ||¡ |  tj 	|¡¡ d S )Nr›   rœ   rž   rT   rL   F)r¡   )rK   r   r&   r'   r-   rY   rG   Úcopyfiler[   r6   r^   rÏ   ri   )rA   rš   r›   rœ   rž   rT   r   r   r   Útest_copyfile_symlinks:  s    
z!TestShutil.test_copyfile_symlinksc                sÖ   t jt jt jt jht jko0t jt jko0t jt jk}|r¸|  	t
j¡ |  	t
jj¡ |  ¡ }t j |d¡}t  |¡ z<t
j}G dd„ dtƒ‰ ‡ fdd„}|t
_|  ˆ t
j|¡ W d |t
_X n|  t
j¡ |  t
jj¡ d S )Nr{   c               @   s   e Zd ZdS )zHTestShutil.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚCalledX  s    rÚ   c                 s   ˆ ‚d S )Nr   )r   r   )rÚ   r   r   Ú_raiserY  s    zITestShutil.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r   r(   rƒ   r‰   rt   Úsupports_dir_fdr4   Úsupports_fdr­   r[   rG   Ú_use_fd_functionsrH   Úavoids_symlink_attacksrK   r&   r'   rM   Ú_rmtree_safe_fdÚ	ExceptionrZ   ri   )rA   rÞ   rš   rI   Zreal_rmtreerÛ   r   )rÚ   r   Ú-test_rmtree_uses_safe_fd_version_if_availableK  s&    

z8TestShutil.test_rmtree_uses_safe_fd_version_if_availablec             C   s4   t  ¡ \}}t |¡ |  ttj|¡ t |¡ d S )N)	rJ   Úmkstempr   ÚcloserZ   ro   rG   rH   rË   )rA   Úhandler&   r   r   r   Útest_rmtree_dont_delete_filec  s    
z'TestShutil.test_rmtree_dont_delete_filec          	   C   s  t  ¡ }tj t  ¡ d¡}|  tj|¡ |  tjtj |¡¡ t	|dfdƒ t 
tj |d¡¡ t	|ddfdƒ t ||¡ |  tj tj |d¡¡¡ |  tj tj |d¡¡¡ |  tj tj |dd¡¡¡ t|dfƒ}|  |d¡ t|ddfƒ}|  |d¡ d S )NÚdestinationztest.txtÚ123Útest_dirÚ456)rJ   rK   r   r&   r'   r   rG   rH   Údirnamer-   rM   Úcopytreer[   Úisfiler5   r1   r^   )rA   Úsrc_dirÚdst_dirÚactualr   r   r   Útest_copytree_simplej  s     
zTestShutil.test_copytree_simplec       	   	   C   sl  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t |¡ t |¡ t|dfdƒ tj |d¡}tj |d¡}t tj |d¡|¡ ttdƒr¤t |t	j
t	jB ¡ ttd	ƒrÆtt	d
ƒrÆt |t	j¡ t |¡}tj||dd |  tj tj |dd¡¡¡ |  t tj |dd¡¡tj |d¡¡ t |¡}ttdƒrL|  |j|j¡ ttd	ƒrh|  |j|j¡ d S )Nr›   rœ   Úsubzfile.txtrL   rT   zsub/linkr    r¥   r¦   T)Úsymlinks)rK   r   r&   r'   rM   r-   rY   r«   r    rƒ   r•   r—   r¥   r¦   r   rG   rì   r[   r6   r^   rÏ   r„   r©   )	rA   rš   rî   rï   Zsub_dirr   rž   r°   rÒ   r   r   r   Útest_copytree_symlinks}  s2    




z!TestShutil.test_copytree_symlinksc             C   s$  t jj}t jj}t ¡ }zæ|t ¡ dƒ}t|dfdƒ t|dfdƒ t  ||dƒ¡ t|ddfdƒ t  ||dƒ¡ t|ddfdƒ t  ||ddƒ¡ t  ||dd	ƒ¡ t|dddfdƒ t|dd	d
fdƒ z\t 	dd¡}tj
|||d |  |||dƒƒ¡ |  |||dƒƒ¡ |  |||dƒƒ¡ W d t |¡ X z`t 	dd¡}tj
|||d |  |||dƒƒ¡ |  |||dd	ƒƒ¡ |  |||ddƒƒ¡ W d t |¡ X zJdd„ }tj
|||d |  |||dd	d
ƒƒ¡ |  |||ddƒƒ¡ W d t |¡ X W d t |¡ t t j |¡¡ X d S )Nrç   ztest.txtrè   ztest.tmpré   rê   Z	test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp)Úignorezsubdir*c             S   sj   g }x`|D ]X}t j | |¡}t j |¡rD| ¡ d dkrD| |¡ q
t j |¡d dkr
| |¡ q
W |S )Néÿÿÿÿrõ   z.py)r   r&   r'   r5   Úsplitr7   Úsplitext)r›   Únamesr9   r:   r&   r   r   r   Ú_filterÁ  s    
z6TestShutil.test_copytree_with_exclude.<locals>._filter)r   r&   r'   r\   rJ   rK   r-   rM   rG   Úignore_patternsrì   r[   ri   rH   rë   )rA   r'   r\   rî   rï   Úpatternsrû   r   r   r   Útest_copytree_with_exclude™  sL    

z%TestShutil.test_copytree_with_excludec          	   C   sj  t  ¡ }tj |d¡}t |¡ tj |d¡}|  tj|¡ t 	|d¡ t
|dfdƒ t 	tj |d¡d¡ t
|dfdƒ t 	tj |d¡d¡ t j|d	}t 	|d¡ t ||¡ |  t |¡jt |¡j¡ |  t tj |d¡¡jt tj |d¡¡j¡ |  t tj |d¡¡jt tj |d¡¡j¡ tj |tj |¡d
 ¡}|  t |¡jt |¡j¡ d S )NÚsourcerç   iÿ  zpermissive.txtrè   zrestrictive.txtrê   i€  )rS   rW   )rJ   rK   r   r&   r'   rM   r   rG   rH   rx   r-   rì   r^   rƒ   r„   rø   )rA   rš   rî   rï   Zrestrictive_subdirZrestrictive_subdir_dstr   r   r   Ú!test_copytree_retains_permissionsÚ  s,    
z,TestShutil.test_copytree_retains_permissionszos.chmodc          	   C   sp   t  ¡ }tj t  ¡ d¡}|  tj|¡ |  tjtj |¡¡ t	dƒ|_
|  tj¡ t ||¡ W d Q R X d S )Nrç   zka-boom)rJ   rK   r   r&   r'   r   rG   rH   rë   ÚPermissionErrorÚside_effectrZ   r   rì   )rA   Z
mock_patchrî   rï   r   r   r   Útest_copytree_winerrorô  s    
z!TestShutil.test_copytree_winerrorrC   ztemporarily disabled on WindowsrT   zrequires os.linkc          
   C   sæ   t  t¡ t j td¡}t j td¡}zªt|dƒ}| d¡ W d Q R X yt  ||¡ W n0 tk
rˆ } z|  	d| ¡ W d d }~X Y nX |  
tjtj||¡ t|dƒ}|  | ¡ d¡ W d Q R X t  |¡ W d tjtdd X d S )	NÚcheeseÚshopr#   Úcheddarzos.link(): %sr/   T)rk   )r   rM   r   r&   r'   r(   r)   rT   r  ÚskipTestrZ   rG   r   rÕ   r^   r0   rË   rH   )rA   r›   rœ   ÚfÚer   r   r   Ú'test_dont_copy_file_onto_link_to_itself  s    
 z2TestShutil.test_dont_copy_file_onto_link_to_itselfc          
   C   s°   t  t¡ t j td¡}t j td¡}ztt|dƒ}| d¡ W d Q R X t  d|¡ |  t	j
t	j||¡ t|dƒ}|  | ¡ d¡ W d Q R X t  |¡ W d t	jtdd X d S )Nr  r  r#   r  r/   T)rk   )r   rM   r   r&   r'   r(   r)   rY   rZ   rG   r   rÕ   r^   r0   rË   rH   )rA   r›   rœ   r  r   r   r   Ú*test_dont_copy_file_onto_symlink_to_itself  s    
z5TestShutil.test_dont_copy_file_onto_symlink_to_itselfc          
   C   st   t  t¡ zTt j td¡}t j td¡}t  |¡ t  ||¡ |  ttj	|¡ tj	|dd W d tj	tdd X d S )Nr  r  T)rk   )
r   rM   r   r&   r'   rY   rZ   r   rG   rH   )rA   r›   rœ   r   r   r   Útest_rmtree_on_symlink+  s    

z!TestShutil.test_rmtree_on_symlinkÚmkfifozrequires os.mkfifo()c          
   C   s~   yt  t¡ W n0 tk
r> } z|  d| ¡ W d d }~X Y nX z,|  tjtjtt	¡ |  tjtjt
t¡ W d t  t¡ X d S )Nzos.mkfifo(): %s)r   r  r   r  r  rZ   rG   ÚSpecialFileErrorrÕ   ÚTESTFN2Ú__file__rË   )rA   r	  r   r   r   Útest_copyfile_named_pipe:  s     z#TestShutil.test_copyfile_named_pipec          
   C   s  t  t¡ zât j td¡}t  |¡ t j |d¡}yt  |¡ W n0 tk
rp } z|  d| ¡ W d d }~X Y nX yt 	tt
¡ W n\ tjk
rÞ } z<|jd }|  t|ƒd¡ |d \}}}|  d| |¡ W d d }~X Y nX |  d¡ W d tjtdd	 tjt
dd	 X d S )
Nrõ   Zmypipezos.mkfifo(): %sr   rW   z`%s` is a named pipez$shutil.Error should have been raisedT)rk   )r   rM   r   r&   r'   r  r  r  rG   rì   r  r   r   r^   r_   ÚfailrH   )rA   rõ   Úpiper	  rU   r›   rœ   Z	error_msgr   r   r   Útest_copytree_named_pipeH  s&    

 
"z#TestShutil.test_copytree_named_pipec                s€   |   ¡ }tj |   ¡ d¡}t|dfdƒ t tj |d¡¡ t|ddfdƒ g ‰ ‡ fdd„}tj|||d |  t	ˆ ƒd	¡ d S )
Nrç   ztest.txtrè   ré   rê   c                s   ˆ   | |f¡ d S )N)r7   )r›   rœ   )Úcopiedr   r   Ú_copyj  s    z4TestShutil.test_copytree_special_func.<locals>._copy)Úcopy_functionrX   )
rK   r   r&   r'   r-   rM   rG   rì   r^   r_   )rA   rî   rï   r  r   )r  r   Útest_copytree_special_funca  s    z%TestShutil.test_copytree_special_funcc             C   sÒ   |   ¡ }tj |   ¡ d¡}t dtj |d¡¡ t tj |d¡¡ t|ddfdƒ |  tt	j
||¡ tj |   ¡ d¡}t	j
||dd |  dt |¡¡ tj |   ¡ d	¡}t	j
||dd
 |  dt |¡¡ d S )Nrç   Z
IDONTEXISTztest.txtré   rê   Údestination2T)Úignore_dangling_symlinksZdestination3)ró   )rK   r   r&   r'   rY   rM   r-   rZ   r   rG   rì   ÚassertNotInr4   rp   )rA   rî   rï   r   r   r   Útest_copytree_dangling_symlinksp  s    z*TestShutil.test_copytree_dangling_symlinksc          	   C   s  |   ¡ }tj |   ¡ d¡}t tj |d¡¡ ttj |dd¡dƒ W d Q R X tjtj |d¡tj |d¡dd tj||dd	 |  	tj 
tj |d¡¡¡ |  dt tj |d¡¡¡ tj |   ¡ d
¡}tj||dd	 |  tj 
tj |d¡¡¡ |  dt tj |d¡¡¡ d S )Nrç   Zreal_dirztest.txtr#   Zlink_to_dirT)Útarget_is_directoryF)ró   r  )rK   r   r&   r'   rM   r(   rY   rG   rì   ri   r6   rp   r4   r[   )rA   rî   rï   r   r   r   Útest_copytree_symlink_dir…  s    
z$TestShutil.test_copytree_symlink_dirc             C   sP   d}|   ¡ }t||fdƒ tj ||¡}|   ¡ }|||ƒ tj ||¡}||fS )Nztest.txtr¸   )rK   r-   r   r&   r'   )rA   ÚmethodrÀ   ru   re   Útmpdir2r·   r   r   r   Ú
_copy_file™  s    
zTestShutil._copy_filec             C   sB   |   tj¡\}}|  tj |¡¡ |  t |¡j	t |¡j	¡ d S )N)
r!  rG   rÎ   r[   r   r&   r\   r^   rƒ   r„   )rA   re   r·   r   r   r   Ú	test_copy£  s    zTestShutil.test_copyrª   zrequires os.utimec             C   s    |   tj¡\}}|  tj |¡¡ t |¡}t |¡}|  |j	|j	¡ x(dD ] }|  
t||ƒt||ƒd ¡ qLW ttdƒrœt|dƒrœ|  t|dƒt|dƒ¡ d S )N)r§   r¨   rW   r´   r©   )r!  rG   rÑ   r[   r   r&   r\   rƒ   r^   r„   r®   r   r«   )rA   re   r·   Z
file1_statZ
file2_statr²   r   r   r   Ú
test_copy2ª  s    


zTestShutil.test_copy2c       	   
   C   sf  |   d¡\}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡  tj 
|¡}t|d|dƒ}W d Q R X |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |d¡"}|  | ¡ dddd	d
dg¡ W d Q R X t 	|¡ t|d|dƒ}W d Q R X |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |d¡"}|  | ¡ dddd	d
dg¡ W d Q R X d S )Nrl   ÚarchiveÚgztarÚ.z.tar.gzzr:gzz./subz./sub2z./file1z./file2z./sub/file3Útarz.tarr/   )Ú_create_filesrK   r   rt   r&   rë   r'   Úbasenamer   Ú
change_cwdÚabspathr   r^   r[   rí   ÚtarfileÚ
is_tarfiler(   ÚassertCountEqualÚgetnames)	rA   Úroot_dirÚbase_dirr   Úwork_dirÚrel_base_nameÚ	base_nameÚtarballÚtfr   r   r   Útest_make_tarball¼  s0    


zTestShutil.test_make_tarballc          	   C   s.   t  |¡}| ¡ }| ¡  t|ƒS Q R X d S )N)r,  r(   r/  Úsortr%   )rA   r&   r'  rú   r   r   r   Ú_tarinfoà  s    zTestShutil._tarinfoÚdistc             C   s’   |   ¡ }tj ||¡}tj|dd t|dfdƒ t|dfdƒ t tj |d¡¡ t|ddfdƒ t tj |d¡¡ |rŠt|d	fdƒ ||fS )
NT)Úexist_okre   r¸   r·   rò   Úfile3Zsub2Úouter)rK   r   r&   r'   Úmakedirsr-   rM   )rA   r1  r0  r:  r   r   r   r(  æ  s    zTestShutil._create_filesr'  zNeed the tar command to runc             C   s  |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ tj |d¡}ddd|g}t	j
||t	jd |  tj |¡¡ |  |  |¡|  |¡¡ t|d||ƒ}|  ||d ¡ |  tj |¡¡ t|d||d	d
}|  ||d ¡ |  tj |¡¡ d S )Nr$  r%  z.tar.gzzarchive2.tarr'  z-cf)ÚcwdÚstdoutz.tarT)Údry_run)r(  r   r&   r'   rK   r   r^   r[   rí   Ú
subprocessÚ
check_callÚDEVNULLr9  )rA   r0  r1  r4  r5  Ztarball2Ztar_cmdr   r   r   Útest_tarfile_vs_tarô  s$    

zTestShutil.test_tarfile_vs_tarc       	      C   sl  |   ¡ \}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡ tj 
|¡}t|d|ƒ}W d Q R X |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡$}|  | ¡ dddddd	d
g¡ W d Q R X t 	|¡  tj 
|¡}t|d||ƒ}W d Q R X |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡"}|  | ¡ dddddd	g¡ W d Q R X d S )Nr$  Úzipz.zipzdist/z	dist/sub/z
dist/sub2/z
dist/file1z
dist/file2zdist/sub/file3r=  )r(  rK   r   rt   r&   rë   r'   r)  r   r*  r+  r   r^   r[   rí   ÚzipfileÚ
is_zipfileÚZipFiler.  Únamelist)	rA   r0  r1  r   r2  r3  r4  r9   Úzfr   r   r   Útest_make_zipfile  s4    


zTestShutil.test_make_zipfilerF  zNeed the zip command to runc       
   	   C   sâ   |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ tj |d¡}dddd|g}t	j
||t	jd |  tj |¡¡ t |¡}| ¡ }W d Q R X t |¡}| ¡ }	W d Q R X |  t|ƒt|	ƒ¡ d S )Nr$  rF  z.zipzarchive2.zipz-qz-r)r?  r@  )r(  r   r&   r'   rK   r   r^   r[   rí   rB  rC  rD  rG  rI  rJ  r3   )
rA   r0  r1  r4  r$  Zarchive2Úzip_cmdrK  rú   Znames2r   r   r   Útest_zipfile_vs_zip:  s    
zTestShutil.test_zipfile_vs_zipÚunzipzNeed the unzip command to runc       	      C   sâ   |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ dd|g}t	 
|¡v ytj|tjd W nZ tjk
rÒ } z:|jjdd}d	|kr¬|  d
¡ d}|  | ||¡¡ W d d }~X Y nX W d Q R X d S )Nr$  rF  z.ziprO  z-t)ÚstderrÚreplace)rU   zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r(  r   r&   r'   rK   r   r^   r[   rí   r   r*  rB  Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder  r  Úformat)	rA   r0  r1  r4  r$  rM  rŒ   ÚdetailsÚmsgr   r   r   Útest_unzip_zipfileT  s    

zTestShutil.test_unzip_zipfilec             C   s*   |   ¡ }tj |d¡}|  tt|d¡ d S )Nr$  r¸   )rK   r   r&   r'   rZ   Ú
ValueErrorr   )rA   ru   r4  r   r   r   Útest_make_archivel  s    zTestShutil.test_make_archivec             C   sÞ   t r"t d¡d }t d¡d }nd }}|  ¡ \}}tj |  	¡ d¡}t
|d||||d}|  tj |¡¡ t
|d||ƒ}|  tj |¡¡ t
|d||||d}|  tj |¡¡ t
|d||ddd}|  tj |¡¡ d S )	Nr   Úrootr$  rF  )ÚownerÚgroupr'  Z	kjhkjhkjgZoihohoh)ÚUID_GID_SUPPORTÚgrpÚgetgrgidÚpwdÚgetpwuidr(  r   r&   r'   rK   r   r[   rí   )rA   r_  r^  r0  r1  r4  r9   r   r   r   Útest_make_archive_owner_groupq  s"    



z(TestShutil.test_make_archive_owner_groupzRequires grp and pwd supportc       	   	   C   sÂ   |   ¡ \}}tj |  ¡ d¡}t d¡d }t d¡d }t	 
|¡ t|d|d||d}W d Q R X |  tj |¡¡ t |¡}z2x,| ¡ D ] }|  |jd¡ |  |jd¡ qŒW W d | ¡  X d S )Nr$  r   r%  r:  )r^  r_  )r(  r   r&   r'   rK   ra  rb  rc  rd  r   r*  r   r[   rí   r,  r(   Ú
getmembersr^   ÚuidÚgidrä   )	rA   r0  r1  r4  r_  r^  Úarchive_namer$  Úmemberr   r   r   Útest_tarfile_root_owner  s    

z"TestShutil.test_tarfile_root_ownerc             C   sn   t  ¡ }dd„ }td|g dƒ z@ytdd|  ¡ d W n tk
rJ   Y nX |  t  ¡ |¡ W d tdƒ X d S )Nc              _   s
   t ƒ ‚d S )N)ÚRuntimeError)r   Úkwr   r   r   Ú_breaks¦  s    z1TestShutil.test_make_archive_cwd.<locals>._breaksr¸   zxxx file)r0  )r   Úgetcwdr   r   rK   rá   r^   r   )rA   Zcurrent_dirrn  r   r   r   Útest_make_archive_cwd¤  s    z TestShutil.test_make_archive_cwdc          	   C   sF   |   ¡ }t |¡* |  tddƒd¡ |  tj d¡¡ W d Q R X d S )NÚtestr'  ztest.tar)	rK   r   r*  r^   r   r[   r   r&   rí   )rA   r0  r   r   r   Útest_make_tarfile_in_curdir³  s    z&TestShutil.test_make_tarfile_in_curdirc          	   C   sF   |   ¡ }t |¡* |  tddƒd¡ |  tj d¡¡ W d Q R X d S )Nrq  rF  ztest.zip)	rK   r   r*  r^   r   r[   r   r&   rí   )rA   r0  r   r   r   Útest_make_zipfile_in_curdirº  s    z&TestShutil.test_make_zipfile_in_curdirc             C   s˜   |   ttdd¡ |   ttddd„ d¡ |   ttddd„ ddg¡ tddd„ dgd	ƒ d
d„ tƒ D ƒ}|  d|¡ tdƒ dd„ tƒ D ƒ}|  d|¡ d S )Nr¸   rW   c               S   s   t S )N)Úxr   r   r   r   Ú<lambda>Å  ó    z9TestShutil.test_register_archive_format.<locals>.<lambda>c               S   s   t S )N)rt  r   r   r   r   ru  Ç  rv  )rW   rX   )rW   rX   r}   c               S   s   t S )N)rt  r   r   r   r   ru  Ê  rv  zxxx filec             S   s   g | ]\}}|‘qS r   r   )Ú.0r:   Úparamsr   r   r   ú
<listcomp>Ë  s    z;TestShutil.test_register_archive_format.<locals>.<listcomp>c             S   s   g | ]\}}|‘qS r   r   )rw  r:   rx  r   r   r   ry  Ï  s    )rZ   Ú	TypeErrorr   r   rp   r   r  )rA   Úformatsr   r   r   Útest_register_archive_formatÂ  s    
z'TestShutil.test_register_archive_formatc             C   s.   |   |dd„ ¡ |   |tj¡ |   |t¡ d S )Nc             S   s   | S )Nr   )r&   r   r   r   ru  Ó  rv  z1TestShutil.check_unpack_archive.<locals>.<lambda>)Ú#check_unpack_archive_with_converterÚpathlibÚPathr   )rA   rW  r   r   r   Úcheck_unpack_archiveÒ  s    zTestShutil.check_unpack_archivec       
      C   sÄ   |   ¡ \}}t|ƒ}| d¡ tj |  ¡ d¡}t||||ƒ}|  ¡ }t||ƒ||ƒƒ |  	t|ƒ|¡ |  ¡ }	t||ƒ||	ƒ|d |  	t|	ƒ|¡ |  
tjt|tƒ¡ | j
tt|tƒdd d S )Nr=  r$  )rW  r¸   )r(  r8   rË   r   r&   r'   rK   r   r   r^   rZ   rG   Ú	ReadErrorr   r[  )
rA   rW  Ú	converterr0  r1  Úexpectedr4  rr   r   Ztmpdir3r   r   r   r}  ×  s    
z.TestShutil.check_unpack_archive_with_converterc             C   s   |   d¡ d S )Nr'  )r€  )rA   r   r   r   Útest_unpack_archive_tarì  s    z"TestShutil.test_unpack_archive_tarc             C   s   |   d¡ d S )Nr%  )r€  )rA   r   r   r   Útest_unpack_archive_gztarï  s    z$TestShutil.test_unpack_archive_gztarc             C   s   |   d¡ d S )NÚbztar)r€  )rA   r   r   r   Útest_unpack_archive_bztaró  s    z$TestShutil.test_unpack_archive_bztarc             C   s   |   d¡ d S )NÚxztar)r€  )rA   r   r   r   Útest_unpack_archive_xztar÷  s    z$TestShutil.test_unpack_archive_xztarc             C   s   |   d¡ d S )NrF  )r€  )rA   r   r   r   Útest_unpack_archive_zipû  s    z"TestShutil.test_unpack_archive_zipc                s    t ƒ }‡ fdd„}tdddg|dgƒ tddƒ ˆ  ttd	dg|¡ tdƒ td	dg|ƒ ˆ  d	dgd
ft ƒ ¡ ˆ  ddgd
ft ƒ ¡ td	ƒ ˆ  t ƒ |¡ d S )Nc                s(   ˆ   |d¡ ˆ   | d¡ ˆ   |d¡ d S )NrW   z	stuff.booÚxx)r^   )rr   Úextract_dirÚextra)rA   r   r   Ú_boo  s    z-TestShutil.test_unpack_registry.<locals>._booZBooz.booz.b2)r  rW   z	stuff.boor‹  ZBoo2rl   )	r   r   r   rZ   r	   r
   rp   r  r^   )rA   r{  rŽ  r   )rA   r   Útest_unpack_registryÿ  s    


zTestShutil.test_unpack_registryÚ
disk_usagez)disk_usage not available on this platformc             C   s`   t  tj t¡¡}|  |jd¡ |  |jd¡ |  	|j
d¡ |  	|j|j¡ |  |j|j
¡ d S )Nr   )rG   r  r   r&   rë   r  ÚassertGreaterÚtotalÚusedÚassertGreaterEqualÚfree)rA   Úusager   r   r   Útest_disk_usage  s    zTestShutil.test_disk_usageÚchownzrequires os.chownc          	      s  ˆ  ¡ }tj|d‰ tˆ dƒ ˆ t¡ t ˆ ¡ W d Q R X ˆ t¡ tjˆ dd W d Q R X ˆ t¡ tjˆ dd W d Q R X ˆ t	¡ t ˆ d¡ W d Q R X ˆ t	¡ t ˆ d¡ W d Q R X t
 ¡ }t
 ¡ }d‡ ‡fd	d
„	}t ˆ ||¡ |ˆ ||ƒ t ˆ |¡ |ˆ |ƒ tjˆ |d |ˆ |ƒ tjˆ |d |ˆ |d t |||¡ ||||ƒ t ||¡ |||ƒ tj||d |||ƒ tj||d |||d t |¡d }t |¡d }t ˆ ||¡ |ˆ ||ƒ t |||¡ ||||ƒ d S )N)rS   ztesting chown functionznon-existing username)Úuserznon-existing groupname)r_  s   spamg…ëQ¸	@c                s:   t  ˆ ¡}|d k	r ˆ ||j¡ |d k	r6ˆ ||j¡ d S )N)r   rƒ   r^   Úst_uidÚst_gid)r&   rg  rh  Ús)rr   rA   r   r   Úcheck_chown>  s
    
z*TestShutil.test_chown.<locals>.check_chown)rh  r   )NN)rK   rJ   rm   r-   rZ   r[  rG   r˜  ÚLookupErrorrz  r   ÚgetuidÚgetgidrc  rd  ra  rb  )rA   rë   rg  rh  r  r™  r_  r   )rr   rA   r   Ú
test_chown#  sL    




zTestShutil.test_chownc             C   sŒ   x†t jt jfD ]v}|  ¡ }|  ¡ }tj |d¡}t|dƒ |||ƒ}|  |tj |d¡¡ ||tj |d¡ƒ}|  |tj |d¡¡ qW d S )NrL   r’   )	rG   rÎ   rÑ   rK   r   r&   r'   r-   r^   )rA   r   rî   rï   r›   Úrvr   r   r   Útest_copy_return_value^  s    

z!TestShutil.test_copy_return_valuec             C   sl   |   ¡ }|   ¡ }tj |d¡}tj |d¡}t|dƒ t ||¡}|  tj |¡¡ |  	t
|ƒt
|ƒ¡ d S )Nr’   rL   )rK   r   r&   r'   r-   rG   rÕ   r[   r\   r^   r1   )rA   rî   rï   Údst_fileÚsrc_filer¢  r   r   r   Útest_copyfile_return_valuej  s    
z%TestShutil.test_copyfile_return_valuec             C   sH   |   ¡ }tj |d¡}t|dƒ |  ttj||¡ |  t	tj||¡ d S )NrL   )
rK   r   r&   r'   r-   rZ   r   rG   rÕ   r   )rA   rî   r¥  r   r   r   Útest_copyfile_same_fileu  s
    
z"TestShutil.test_copyfile_same_filec             C   s\   |   ¡ }|d }|  tj|d¡ tj |d¡}t|dƒ t ||¡}|  	dgt 
|¡¡ d S )NÚdestTrL   )rK   r   rG   rH   r   r&   r'   r-   rì   r^   r4   )rA   rî   rï   r›   r¢  r   r   r   Útest_copytree_return_value  s    
z%TestShutil.test_copytree_return_value)r:  )\r×   rØ   rÙ   r?   rE   rK   rR   r   Úskip_unless_symlinkra   rj   rw   ÚunittestÚ
skipUnlessr«   r   ÚskipIfÚsysÚplatformrz   rˆ   r‡   r‘   rŸ   r¢   r£   r³   r   r¾   Úskip_unless_xattrrÌ   rÍ   rÐ   rÓ   rÔ   rÖ   râ   ræ   rñ   rô   rþ   r   ÚmockÚpatchr  r:   r
  r  r  r  r  r  r  r  r!  r"  r#  Úrequires_zlibr7  r9  r(  rG   ÚwhichrE  rL  rN  rZ  r\  re  r`  rk  rp  rr  rs  r|  r€  r}  r„  r…  Úrequires_bz2r‡  Úrequires_lzmar‰  rŠ  r  r—  r¡  r£  r¦  r§  r©  Ú__classcell__r   r   )rB   r   r=   X   s¸   		$ )8#A
$
%	
:
r=   c               @   sœ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	e
edƒoHe ¡ dkd¡dd„ ƒZdd„ Zdd„ Ze ejdkd¡dd„ ƒZdd„ Zdd„ Zdd„ ZdS )Ú	TestWhichc             C   sp   t jdd| _|  tj| jd¡ t j| jddd| _t 	| jj
tj¡ |  | jj¡ tj | jj
¡\| _| _d S )NZTmp)ÚprefixTz.Exe)rS   r¹  Úsuffix)rJ   rK   Útemp_dirr   rG   rH   ÚNamedTemporaryFileÚ	temp_filer   rx   r:   rƒ   ÚS_IXUSRrä   r&   rø   rS   Úfile)rA   r   r   r   r?   Œ  s    
zTestWhich.setUpc             C   s&   t j| j| jd}|  || jj¡ d S )N)r&   )rG   r´  r¿  rS   r^   r½  r:   )rA   r¢  r   r   r   Ú
test_basic˜  s    zTestWhich.test_basicc             C   s(   t j| jj| jd}|  || jj¡ d S )N)r&   )rG   r´  r½  r:   r»  r^   )rA   r¢  r   r   r   Útest_absolute_cmd  s    zTestWhich.test_absolute_cmdc          	   C   sŒ   t j | j¡\}}t j || j¡}tj|d" tj	|| j
d}|  ||¡ W d Q R X tj| jd tj	||d}|  |¡ W d Q R X d S )N)r&   )r   r&   rø   rS   r'   r¿  r   r*  rG   r´  r»  r^   ÚassertIsNone)rA   r1  Útail_dirÚrelpathr¢  r   r   r   Útest_relative_cmd£  s    zTestWhich.test_relative_cmdc          	   C   sl   t j | j¡}tj| jdF tj| j|d}t	j
dkrT|  |t j t j| j¡¡ n
|  |¡ W d Q R X d S )N)r&   Úwin32)r   r&   rë   rS   r   r*  rG   r´  r¿  r®  r¯  r^   r'   ÚcurdirrÂ  )rA   r1  r¢  r   r   r   Útest_cwd°  s    
zTestWhich.test_cwdrz   r   znon-root user requiredc             C   sR   t  | jjtj¡ t  | jjt j¡r.|  d¡ t	j
| j| jt jd}|  |¡ d S )Nzcan't set the file read-only)r&   Úmode)r   rx   r½  r:   rƒ   r…   ÚaccessÚW_OKr  rG   r´  r¿  rS   rÂ  )rA   r¢  r   r   r   Útest_non_matching_mode¼  s
    
z TestWhich.test_non_matching_modec          	   C   sV   t j | j¡\}}tj|d. tj| j|d}|  	|t j 
|| j¡¡ W d Q R X d S )N)r&   )r   r&   rø   rS   r   r*  rG   r´  r¿  r^   r'   )rA   r1  rÃ  r¢  r   r   r   Útest_relative_pathÆ  s    zTestWhich.test_relative_pathc             C   s   t jd| jd}|  |¡ d S )Nzfoo.exe)r&   )rG   r´  rS   rÂ  )rA   r¢  r   r   r   Útest_nonexistent_fileÌ  s    zTestWhich.test_nonexistent_filerÆ  zpathext check is Windows-onlyc             C   s:   t j| jd d… | jd}|  || jjd d… d ¡ d S )Néüÿÿÿ)r&   z.EXE)rG   r´  r¿  rS   r^   r½  r:   )rA   r¢  r   r   r   Útest_pathext_checkingÑ  s    zTestWhich.test_pathext_checkingc          	   C   s>   t  ¡ ,}| j|d< t | j¡}|  || jj¡ W d Q R X d S )NÚPATH)	r   ÚEnvironmentVarGuardrS   rG   r´  r¿  r^   r½  r:   )rA   Úenvr¢  r   r   r   Útest_environ_pathÙ  s    

zTestWhich.test_environ_pathc          
   C   sd   t j | j¡}tj| jd> t ¡ *}| j|d< tj| j	dd}|  
|¡ W d Q R X W d Q R X d S )N)r&   rÑ  rl   )r   r&   rë   rS   r   r*  rÒ  rG   r´  r¿  rÂ  )rA   r1  rÓ  r¢  r   r   r   Útest_empty_pathß  s    

zTestWhich.test_empty_pathc          	   C   s:   t  ¡ (}| dd ¡ t | j¡}|  |¡ W d Q R X d S )NrÑ  )r   rÒ  rF   rG   r´  r¿  rÂ  )rA   rÓ  r¢  r   r   r   Útest_empty_path_no_PATHç  s    
z!TestWhich.test_empty_path_no_PATHN)r×   rØ   rÙ   r?   rÀ  rÁ  rÅ  rÈ  r«  r­  r«   r   rz   rÌ  rÍ  rÎ  r¬  r®  r¯  rÐ  rÔ  rÕ  rÖ  r   r   r   r   r¸  Š  s   	r¸  c               @   s,  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	dd„ ƒZ
e	dd„ ƒZdd„ Ze	dd„ ƒZdd„ Ze	dd„ ƒZdd„ Ze ejjd¡dd„ ƒZdd„ Zd d!„ Zd"d#„ Zd$d%„ Zeje	d&d'„ ƒƒZeje	d(d)„ ƒƒZeje	d*d+„ ƒƒZeje	d,d-„ ƒƒZ d.d/„ Z!d0d1„ Z"e	d2d3„ ƒZ#e	d4d5„ ƒZ$d6S )7ÚTestMovec          	   C   sb   d}t  ¡ | _t  ¡ | _tj | j|¡| _tj | j|¡| _t	| jdƒ}| 
d¡ W d Q R X d S )NrL   r"   s   spam)rJ   rK   rî   rï   r   r&   r'   r¥  r¤  r(   r)   )rA   rr   r  r   r   r   r?   ð  s    

zTestMove.setUpc             C   s:   x4| j | jfD ]$}y|r"t |¡ W q   Y qX qW d S )N)rî   rï   rG   rH   )rA   rI   r   r   r   rE   ù  s    zTestMove.tearDownc          	   C   sf   t |dƒ}| ¡ }W d Q R X t ||¡ t |dƒ}|  || ¡ ¡ W d Q R X |  tj |¡¡ d S )Nr.   )	r(   r0   rG   Úmover^   ri   r   r&   r\   )rA   r›   rœ   Úreal_dstr  Úcontentsr   r   r   Ú_check_move_file  s    zTestMove._check_move_filec             C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S )N)	r3   r   r4   rG   rØ  r^   ri   r&   r\   )rA   r›   rœ   rÙ  rÚ  r   r   r   Ú_check_move_dir	  s    zTestMove._check_move_dirc             C   s   |   | j| j| j¡ d S )N)rÛ  r¥  r¤  )rA   r   r   r   Útest_move_file  s    zTestMove.test_move_filec             C   s   |   | j| j| j¡ d S )N)rÛ  r¥  rï   r¤  )rA   r   r   r   Útest_move_file_to_dir  s    zTestMove.test_move_file_to_dirc             C   s   |   ¡  d S )N)rÝ  )rA   r   r   r   Útest_move_file_other_fs  s    z TestMove.test_move_file_other_fsc             C   s   |   ¡  d S )N)rÞ  )rA   r   r   r   Útest_move_file_to_dir_other_fs  s    z'TestMove.test_move_file_to_dir_other_fsc             C   s@   t  ¡ }z|  | j||¡ W d yt |¡ W n   Y nX X d S )N)rJ   rm   rÜ  rî   rG   rH   )rA   rï   r   r   r   Útest_move_dir!  s    zTestMove.test_move_dirc             C   s   |   ¡  d S )N)rá  )rA   r   r   r   Útest_move_dir_other_fs,  s    zTestMove.test_move_dir_other_fsc          
   C   s,   |   | j| jtj | jtj | j¡¡¡ d S )N)rÜ  rî   rï   r   r&   r'   r)  )rA   r   r   r   Útest_move_dir_to_dir1  s    zTestMove.test_move_dir_to_dirc             C   s   |   ¡  d S )N)rã  )rA   r   r   r   Útest_move_dir_to_dir_other_fs6  s    z&TestMove.test_move_dir_to_dir_other_fsc          
   C   s4   |   | jtjj | jtj | jtj | j¡¡¡ d S )N)rÜ  rî   r   r&   Úseprï   r'   r)  )rA   r   r   r   Útest_move_dir_sep_to_dir;  s    z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc          
   C   s4   |   | jtjj | jtj | jtj | j¡¡¡ d S )N)rÜ  rî   r   r&   Úaltseprï   r'   r)  )rA   r   r   r   Útest_move_dir_altsep_to_dir?  s    z$TestMove.test_move_dir_altsep_to_dirc          	   C   s4   t | jdƒ W d Q R X |  tjtj| j| j¡ d S )Nr"   )r(   r¤  rZ   rG   r   rØ  r¥  rï   )rA   r   r   r   Ú"test_existing_file_inside_dest_dirD  s    
z+TestMove.test_existing_file_inside_dest_dirc             C   s*   t j | jd¡}|  tjtj| j|¡ d S )Nr’   )r   r&   r'   rî   rZ   rG   r   rØ  )rA   rœ   r   r   r   Útest_dont_move_dir_in_itselfJ  s    z%TestMove.test_dont_move_dir_in_itselfc          
   C   sp   t  t¡ zPxJdD ]B\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW W d tjtdd X d S )N))Úsrcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s))rY  T)rk   )	r   rM   r   r&   r'   r[   rG   Ú
_destinsrcrH   )rA   r›   rœ   r   r   r   Útest_destinsrc_false_negativeO  s    
z&TestMove.test_destinsrc_false_negativec          
   C   sp   t  t¡ zPxJdD ]B\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW W d tjtdd X d S )N))rë  zsrc/dest)rë  z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s))rY  T)rk   )	r   rM   r   r&   r'   ri   rG   rì  rH   )rA   r›   rœ   r   r   r   Útest_destinsrc_false_positive[  s    
z&TestMove.test_destinsrc_false_positivec             C   s\   t j | jd¡}t  | j|¡ t || j¡ |  	t j 
| j¡¡ |  	t j | j| j¡¡ d S )Nr’   )r   r&   r'   rî   rY   r¥  rG   rØ  r¤  r[   r6   Úsamefile)rA   rœ   r   r   r   Útest_move_file_symlinkg  s
    zTestMove.test_move_file_symlinkc             C   sl   d}t j | j|¡}t  | j|¡ t || j¡ t j | j|¡}|  	t j 
|¡¡ |  	t j | j|¡¡ d S )Nr’   )r   r&   r'   rî   rY   r¥  rG   rØ  rï   r[   r6   rï  )rA   rr   rœ   Z
final_linkr   r   r   Útest_move_file_symlink_to_dirp  s    z&TestMove.test_move_file_symlink_to_dirc             C   s    t j | jd¡}t j | jd¡}t  ||¡ t j | jd¡}t ||¡ |  t j 	|¡¡ t j
dkr€|  t j |¡t  |¡¡ n|  t j |¡t j |¡¡ d S )Nr“   r’   r”   rC   )r   r&   r'   rî   rY   rï   rG   rØ  r[   r6   r:   r^   ÚrealpathrÏ   )rA   r›   rœ   rž   r   r   r   Útest_move_dangling_symlink{  s    
z#TestMove.test_move_dangling_symlinkc             C   s|   t j | jd¡}t j | jd¡}t  |¡ t  ||¡ t j | jd¡}t ||¡ |  	t j 
|¡¡ |  	t j ||¡¡ d S )Nr“   r’   r”   )r   r&   r'   rî   rM   rY   rï   rG   rØ  r[   r6   rï  )rA   r›   rœ   rž   r   r   r   Útest_move_dir_symlinkŠ  s    
zTestMove.test_move_dir_symlinkc          	   C   s6   t  | j| j¡}|  |tj | jtj | j¡¡¡ d S )N)	rG   rØ  r¥  rï   r^   r   r&   r'   r)  )rA   r¢  r   r   r   Útest_move_return_value–  s    zTestMove.test_move_return_valuec             C   s6   t  | jtj | jd¡¡}|  |tj | jd¡¡ d S )Nr’   )rG   rØ  r¥  r   r&   r'   rï   r^   )rA   r¢  r   r   r   Ú test_move_as_rename_return_value›  s    z)TestMove.test_move_as_rename_return_valuec                s8   g ‰ ‡ fdd„}t j| j| j|d |  tˆ ƒd¡ d S )Nc                s   ˆ   | |f¡ d S )N)r7   )r›   rœ   )Úmovedr   r   r  ¢  s    z7TestMove.test_move_file_special_function.<locals>._copy)r  rW   )rG   rØ  r¥  rï   r^   r_   )rA   r  r   )r÷  r   Útest_move_file_special_functionŸ  s    z(TestMove.test_move_file_special_functionc                sd   g ‰ ‡ fdd„}t  tj | jd¡¡ t  tj | jd¡¡ tj| j| j|d |  	t
ˆ ƒd¡ d S )Nc                s   ˆ   | |f¡ d S )N)r7   )r›   rœ   )r÷  r   r   r  ª  s    z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1)r  r}   )r   r‚   r   r&   r'   rî   rG   rØ  rï   r^   r_   )rA   r  r   )r÷  r   Útest_move_dir_special_function§  s    z'TestMove.test_move_dir_special_functionN)%r×   rØ   rÙ   r?   rE   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×  î  s<   	
r×  c               @   sX   e Zd ZdZG dd„ deƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestCopyFileFc               @   s:   e Zd ZdZdZdZddd„Zdd„ Zdd	„ Zd
d„ Z	dS )zTestCopyFile.FauxFNTc             C   s   || _ || _d S )N)Ú_raise_in_exitÚ_suppress_at_exit)rA   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__º  s    zTestCopyFile.Faux.__init__c             G   s   dS )Nrl   r   )rA   r   r   r   r   r0   ½  s    zTestCopyFile.Faux.readc             C   s
   d| _ d S )NT)Ú_entered)rA   r   r   r   Ú	__enter__¿  s    zTestCopyFile.Faux.__enter__c             C   s&   |||f| _ | jr d| _tdƒ‚| jS )NTzCannot close)Ú_exited_withrü  Ú_raisedr   rý  )rA   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__Á  s
    zTestCopyFile.Faux.__exit__)FT)
r×   rØ   rÙ   rÿ  r  r  rþ  r0   r   r  r   r   r   r   ÚFaux¶  s   
r  c             C   s   | j r
t`d S )N)Ú_deleterG   r(   )rA   r   r   r   rE   È  s    zTestCopyFile.tearDownc             C   s   |t _d| _d S )NT)rG   r(   r  )rA   r   r   r   r   Ú_set_shutil_openÌ  s    zTestCopyFile._set_shutil_openc             C   s*   ddd„}|   |¡ |  ttjdd¡ d S )Nr/   c             S   s   | dkrt dƒ‚dst‚d S )NÚsrcfilezCannot open "srcfile"r   )r   ÚAssertionError)rr   rÉ  r   r   r   Ú_openÑ  s    z4TestCopyFile.test_w_source_open_fails.<locals>._openr
  Údestfile)r/   )r	  rZ   r   rG   rÕ   )rA   r  r   r   r   Útest_w_source_open_failsÐ  s    

z%TestCopyFile.test_w_source_open_failsc                sd   |   ¡ ‰ d	‡ fdd„	}|  |¡ t dd¡ |  ˆ j¡ |  ˆ jd tk¡ |  ˆ jd j	d¡ d S )
Nr/   c                s(   | dkrˆ S | dkrt dƒ‚ds$t‚d S )Nr
  r  zCannot open "destfile"r   )r   r  )rr   rÉ  )r
  r   r   r  Þ  s
    z2TestCopyFile.test_w_dest_open_fails.<locals>._openr
  r  r   rW   )zCannot open "destfile")r/   )
r  r	  rG   rÕ   r[   rÿ  r  r   r^   r   )rA   r  r   )r
  r   Útest_w_dest_open_failsÚ  s    
z#TestCopyFile.test_w_dest_open_failsc                sˆ   |   ¡ ‰|   d¡‰ d
‡ ‡fdd„	}|  |¡ t dd¡ |  ˆj¡ |  ˆ j¡ |  ˆ j¡ |  ˆjd tk¡ |  	ˆjd j
d	¡ d S )NTr/   c                s$   | dkrˆS | dkrˆ S ds t ‚d S )Nr
  r  r   )r  )rr   rÉ  )r  r
  r   r   r  ò  s
    z3TestCopyFile.test_w_dest_close_fails.<locals>._openr
  r  r   rW   )zCannot close)r/   )r  r	  rG   rÕ   r[   rÿ  r  r  r   r^   r   )rA   r  r   )r  r
  r   Útest_w_dest_close_failsí  s    

z$TestCopyFile.test_w_dest_close_failsc                s†   |   d¡‰|   ¡ ‰ d‡ ‡fdd„	}|  |¡ |  ttjdd¡ |  ˆj¡ |  ˆ j¡ |  ˆ j	¡ |  ˆj
d d k¡ |  ˆj	¡ d S )	NTr/   c                s$   | dkrˆS | dkrˆ S ds t ‚d S )Nr
  r  r   )r  )rr   rÉ  )r  r
  r   r   r    s
    z5TestCopyFile.test_w_source_close_fails.<locals>._openr
  r  r   )r/   )r  r	  rZ   r   rG   rÕ   r[   rÿ  ri   r  r  )rA   r  r   )r  r
  r   Útest_w_source_close_fails  s    

z&TestCopyFile.test_w_source_close_failsc          	   C   s†   t  ¡ | _|  tj| jd¡ tj tj 	| j¡tj 
| j¡ ¡ ¡}|  | j|¡ z$t | j|¡ |  tj |¡¡ W d t |¡ X d S )NT)rJ   rK   rî   r   rG   rH   r   r&   r'   rë   r)  Úupperr˜   rØ  r[   r5   rt   )rA   rï   r   r   r   Útest_move_dir_caseinsensitive  s    
z*TestCopyFile.test_move_dir_caseinsensitiveN)r×   rØ   rÙ   r  Úobjectr  rE   r	  r  r  r  r  r  r   r   r   r   rû  ²  s   
rû  c               @   s^   e Zd Zdd„ Zdd„ Zdd„ Ze e 	e
j ¡ ¡d¡e eedƒd	¡d
d„ ƒƒZdd„ ZdS )ÚTermsizeTestsc             C   s(   t  ¡ }|  |jd¡ |  |jd¡ dS )zÔCheck if get_terminal_size() returns a meaningful value.

        There's no easy portable way to actually check the size of the
        terminal, so let's check if it returns something sensible instead.
        r   N)rG   Úget_terminal_sizer”  ÚcolumnsÚlines)rA   Úsizer   r   r   Útest_does_not_crash+  s    z!TermsizeTests.test_does_not_crashc          	   C   st   t  ¡ }d|d< |d= t ¡ }W dQ R X |  |jd¡ t  ¡ }|d= d|d< t ¡ }W dQ R X |  |jd¡ dS )z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi	  Z888ix  )r   rÒ  rG   r  r^   r  r  )rA   rÓ  r  r   r   r   Útest_os_environ_first5  s    

z#TermsizeTests.test_os_environ_firstc          	   C   sL   t  ¡ }d|d< d|d< t ¡ }W d Q R X |  |jd¡ |  |jd¡ d S )Nr¸   r  Úyyyr  r   )r   rÒ  rG   r  r”  r  r  )rA   rÓ  r  r   r   r   Útest_bad_environD  s    
zTermsizeTests.test_bad_environz
not on ttyr  zneed os.get_terminal_size()c          
   C   s’   yt  ddg¡ ¡  ¡ }W n& ttt jfk
r@   |  d¡ Y nX t|d ƒt|d ƒf}t	 
¡ }|d= |d= t ¡ }W dQ R X |  ||¡ dS )	zíCheck if stty returns the same results ignoring env

        This test will fail if stdin and stdout are connected to
        different terminals with different sizes. Nevertheless, such
        situations should be pretty rare.
        Ústtyr  zstty invocation failedrW   r   r  r  N)rB  rR  rV  rø   rn   r  rT  r  Úintr   rÒ  rG   r  r^   )rA   r  rƒ  rÓ  rð   r   r   r   Útest_stty_matchL  s    

zTermsizeTests.test_stty_matchc             C   sÀ   t  ¡ ®}|d= |d= t  tdd ¡ tjdd}W d Q R X |  |jd¡ |  |jd¡ t	t
jdƒ,}t  td|¡ tjd	d}W d Q R X W d Q R X |  |jd
¡ |  |jd¡ W d Q R X d S )Nr  r  Ú
__stdout__)é
   é   )Úfallbackr$  r%  r#   )é   é(   r'  r(  )r   rÒ  Ú	swap_attrr®  rG   r  r^   r  r  r(   r   Údevnull)rA   rÓ  r  r  r   r   r   Útest_fallbackd  s    
 zTermsizeTests.test_fallbackN)r×   rØ   rÙ   r  r  r  r«  r¬  r   Úisattyr®  r#  Úfilenor«   r"  r+  r   r   r   r   r  *  s   
r  c               @   s   e Zd ZdZdd„ ZdS )ÚPublicAPITestsz>Ensures that the correct values are exposed in the public API.c             C   s~   |   tt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g}ttdƒsZtjdkrd| d¡ |  ttjƒt|ƒ¡ d S )NÚ__all__ÚcopyfileobjrÕ   r™   r¬   rÎ   rÑ   rì   rØ  rH   r   r  Ú	ExecErrorr   r   r   r   r   r   r
   r   rü   r˜  r´  r  r   ÚstatvfsrC   r  )	r[   r«   rG   r   r:   r7   r^   Úsetr/  )rA   Ú
target_apir   r   r   Útest_module_all_attribute{  s    
z(PublicAPITests.test_module_all_attributeN)r×   rØ   rÙ   Ú__doc__r5  r   r   r   r   r.  x  s   r.  Ú__main__)F)F)1r«  Zunittest.mockrG   rJ   r®  rƒ   r   Úos.pathr   r   r~  rB  r   r   r   r   r   r   r   r	   r
   r   r   r,  rG  rq  r   Ztest.supportr   r   r  ra  rc  r`  ÚImportErrorr   r!   r-   r1   r8   ÚTestCaser=   r¸  r×  rû  r  r.  r×   Úmainr   r   r   r   Ú<module>   s^   4


          <d ExN
