a
    äzeû  ã                   @   sT  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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mZ d dlZd dlZzd dlZW n eyê   dZY n0 d dl m!Z! d dl"m#Z#m$Z$ d dl"m%Z% e#d Z&e#d Z'e#d Z(ej) *d	¡Z+ej) *d
¡Z,ej)dd… dkZ-zd dl.Z.d dl/Z/dZ0W n ey†   dZ0Y n0 zd dl1Z1W n ey¬   dZ1Y n0 dd„ Z2dd„ Z3dBdd„Z4dd„ Z5dCdd„Z6dd„ Z7dd„ Z8e8ƒ Z9dd„ Z:G dd „ d ƒZ;G d!d"„ d"e;e j<ƒZ=G d#d$„ d$e;e j<ƒZ>G d%d&„ d&e;e j<ƒZ?G d'd(„ d(e;e j<ƒZ@G d)d*„ d*e;e j<ƒZAG d+d,„ d,e;e j<ƒZBG d-d.„ d.eBƒZCG d/d0„ d0e;e j<ƒZDG d1d2„ d2e j<ƒZEG d3d4„ d4e j<ƒZFG d5d6„ d6eGƒZHe  Ie9 d7¡G d8d9„ d9eHe j<ƒƒZJe  Ie+ d:¡G d;d<„ d<eHe j<ƒƒZKG d=d>„ d>e j<ƒZLG d?d@„ d@e j<ƒZMeNdAkrPe  O¡  dS )Dé    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Ú_GiveupOnFastCopy)Úsupport)ÚTESTFNÚFakePath)Úwarnings_helperÚ2Z_SRCZ_DSTÚdarwinZsunosé   ZaixTFc                  O   s   t ttddƒdƒ‚d S )NZEXDEVé   zInvalid cross-device link)ÚOSErrorÚgetattrÚerrno©ÚargsÚkwargs© r   ú&/usr/lib/python3.9/test/test_shutil.pyÚ_fake_rename6   s    r   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                     s0   z"t j}tt _ˆ | i |¤ŽW |t _S |t _0 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   sV   t | tƒrtjj| Ž } t| |r"dndƒ}| |¡ W d   ƒ n1 sH0    Y  d S )NÚwbÚw)Ú
isinstanceÚtupler    ÚpathÚjoinÚopenÚwrite)r,   ZcontentÚbinaryÚfpr   r   r   Ú
write_fileE   s    
r2   c                 C   sr   dd„ }t |dƒ}d dd„ t|ƒD ƒ¡}t| dƒ*}|||ƒD ]}| |¡ q@W d   ƒ n1 sd0    Y  d S )Nc                 s   s&   | |kr|V  | |8 } q | r"| V  d S r   r   )ÚtotalÚstepr   r   r   ÚchunksS   s
    
zwrite_test_file.<locals>.chunksi    ó    c                 S   s   g | ]}t  tj¡ ¡ ‘qS r   )ÚrandomÚchoiceÚstringÚascii_lettersÚencode)Ú.0Úir   r   r   Ú
<listcomp>\   s   ÿz#write_test_file.<locals>.<listcomp>r(   )Úminr-   Úranger.   r/   )r,   Úsizer5   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileQ   s    

ÿ*rE   c                 C   sT   t | tƒrtjj| Ž } t| |r"dndƒ}| ¡ W  d   ƒ S 1 sF0    Y  d S )NÚrbÚr)r*   r+   r    r,   r-   r.   Úread)r,   r0   r1   r   r   r   Ú	read_filec   s    
rI   c                 C   s|   g }t t | ¡ƒD ]d}tj | |¡}tj |¡rltj |¡sl| |d ¡ t|ƒD ]}| |d | ¡ qRq| |¡ q|S )Nú/)	Úsortedr    Úlistdirr,   r-   ÚisdirÚislinkÚappendÚrlistdir)r,   ÚresÚnameÚpÚnr   r   r   rP   o   s    rP   c               
   C   sâ  t tdƒsdS d } d }zštjdt ¡ dd }|j} | d¡ W d   ƒ n1 sT0    Y  t| dƒ}tjdt ¡ ddÖ}|j}| ¡ }| ¡ }zt 	||dd¡ W nT t
y    Y W d   ƒ W d   ƒ W | d urêt | ¡ |d urüt |¡ dS 0 W d   ƒ W d   ƒ W | d ur0t | ¡ |d urDt |¡ d	S W d   ƒ n1 s^0    Y  W d   ƒ n1 s~0    Y  W | d uržt | ¡ |d urÞt |¡ n*| d urÈt | ¡ |d urÜt |¡ 0 d S )
NÚsendfileFr(   ©ÚdirÚdeletes
   0123456789rF   r   é   T)Úhasattrr    ÚtempfileÚNamedTemporaryFileÚgetcwdrR   r/   r.   ÚfilenorU   r   r   Úunlink)ÚsrcnameÚdstnamerD   ÚsrcÚdstÚinfdÚoutfdr   r   r   Úsupports_file2file_sendfile{   sH    
(

ù



ûF


ý


rf   c                  C   sJ   t rBtjdkrBt dtj ¡} |  d¡d  ¡ d }t|dƒdkS dS d S )	Niÿÿÿz/usr/bin/dump -o %sÚ
éÿÿÿÿé   é   i    T)ÚAIXÚsysÚmaxsizeÚ
subprocessÚ	getoutputÚ
executableÚsplitÚint)ZhdrsZmaxdatar   r   r   Ú
_maxdataOKž   s
    rs   c                   @   s   e Zd Zddd„ZdS )ÚBaseTestNc                 C   s$   t j|t ¡ d}|  tj|¡ |S )N)ÚprefixrW   )r[   Úmkdtempr    r]   Ú
addCleanupr   Úrmtree)Úselfru   Údr   r   r   rv   ©   s    zBaseTest.mkdtemp)N)Ú__name__Ú
__module__Ú__qualname__rv   r   r   r   r   rt   §   s   rt   c                   @   sâ   e Zd Zdd„ Zejdd„ ƒZejdd„ ƒZe 	e
d¡dd	„ ƒZe 	e
d¡d
d„ ƒZdd„ Z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dd„ Zdd„ Zejdd „ ƒZe 	e
d¡d!d"„ ƒZdS )#Ú
TestRmTreec                 C   sX   |   ¡ }tj |d¡}t |¡ ttj |d¡dƒ t |¡}|  |t¡ t	 
|¡ d S )NZkillmeZsomefileÚfoo)rv   r    r,   r-   Úmkdirr2   ÚfsencodeÚassertIsInstanceÚbytesÚshutilrx   )ry   ÚtmpZvictimr   r   r   Útest_rmtree_works_on_bytesµ   s    

z%TestRmTree.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 )	NrW   Úlinkc                     s   ˆ   | ¡ d S r   ©rO   ©r   ©Úerrorsr   r   ÚonerrorÉ   s    z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror©rŒ   ri   r   rY   )rv   r    r,   r-   r€   ÚsymlinkÚassertRaisesr   r„   rx   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsrN   r‚   ©ry   r…   Zdir_r‡   rŒ   r   rŠ   r   Útest_rmtree_fails_on_symlink¾   s    
z'TestRmTree.test_rmtree_fails_on_symlinkc           
      C   sö   |   ¡ }tj |d¡}tj |d¡}tj |d¡}|||fD ]}t |¡ q<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Úfile1r   Úlink1Úlink2Úlink3)rv   r    r,   r-   r€   r2   rŽ   r„   rx   ÚassertFalser‘   r   ©
ry   r…   r™   rš   r›   rz   rœ   r   rž   rŸ   r   r   r   Útest_rmtree_works_on_symlinksÑ   s$    

z(TestRmTree.test_rmtree_works_on_symlinkszonly relevant on Windowsc                    sò   |   ¡ }tj |d¡}t |¡ tj |d¡}t ||¡ |  tj	|¡ |  
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 )	NrW   r‡   c                     s   ˆ   | ¡ d S r   rˆ   r‰   rŠ   r   r   rŒ   ó   s    z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr   ri   r   rY   )rv   r    r,   r-   r€   Ú_winapiÚCreateJunctionrw   r   r_   r   r   r„   rx   r   r‘   r’   r“   r”   r•   rN   r‚   r–   r   rŠ   r   Útest_rmtree_fails_on_junctionsç   s     
z)TestRmTree.test_rmtree_fails_on_junctionsc           
      C   sö   |   ¡ }tj |d¡}tj |d¡}tj |d¡}|||fD ]}t |¡ q<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 r˜   )rv   r    r,   r-   r€   r2   r£   r¤   r„   rx   r    r‘   r   r¡   r   r   r   Útest_rmtree_works_on_junctionsû   s$    

z)TestRmTree.test_rmtree_works_on_junctionsc                    sÄ  t j|  ¡ d}|  ttj|¡ tj|dd |  ¡ }t|dfdƒ tj	 
|d¡}|  t¡}t |¡ W d   ƒ n1 s|0    Y  |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 )N©rW   T©Úignore_errorsZtstfileÚ z*.*c                     s   ˆ   | ¡ d S r   rˆ   r‰   rŠ   r   r   rŒ   '  s    z.TestRmTree.test_rmtree_errors.<locals>.onerrorr   rY   r   ri   )r[   Úmktemprv   r   ÚFileNotFoundErrorr„   rx   r2   r    r,   r-   ÚNotADirectoryErrorÚassertInÚ	exceptionÚfilenamer   r‘   r“   r”   r•   Úscandirr‚   Úrmdir)ry   r°   ÚtmpdirÚcmZpossible_argsrŒ   r   rŠ   r   Útest_rmtree_errors  s2    (zTestRmTree.test_rmtree_errorsNé   Úcygwinz2This 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Úbr   r   z1Expected call to onerror function did not happen.)Ú
errorStater    r€   r   rw   r„   rx   r,   r-   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr“   )ry   Zold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moder   r   r   Útest_on_error5  s*    

ÿzTestRmTree.test_on_errorc                 C   sº   | j dk r‚|tju r$|  || j¡ n:|tju r>|  || j¡ n |  |tj¡ |  	|t
| jg¡ |  t|d tƒ¡ |  j d7  _ n4|  |tj¡ |  |t
¡ |  t|d tƒ¡ d| _ d S )NrY   r   ri   r   )r»   r    r_   r“   r¼   r²   r½   r•   rL   r®   r   r   Ú
issubclassr   )ry   r#   ÚargÚexcr   r   r   rÄ   T  s    


z TestRmTree.check_args_to_onerrorc                    sR   zDt j‰ ‡ fdd„}|t _t  t¡ ttdfdƒ t t¡ W ˆ t _nˆ t _0 d S )Nc                    s   | t krtƒ ‚nˆ | ƒS d S r   )r   r   )Úfnr   r   ©Z
orig_lstatr   r   Úraiserr  s    zFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr   )r    Úlstatr€   r   r2   r„   rx   )ry   rË   r   rÊ   r   Ú+test_rmtree_does_not_choke_on_failing_lstato  s    
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatc                    sÜ   t jt jt jt jht jko0t jt jv o0t jt jv }|r¾|  	t
j¡ |  	t
jj¡ |  ¡ }t j |d¡}t  |¡ zBt
j}G dd„ dtƒ‰ ‡ fdd„}|t
_|  ˆ t
j|¡ W |t
_qØ|t
_0 n|  t
j¡ |  t
jj¡ d S )Nr¹   c                   @   s   e Zd ZdS )zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)r{   r|   r}   r   r   r   r   ÚCalledŒ  r6   rÎ   c                     s   ˆ ‚d S r   r   r   ©rÎ   r   r   Ú_raiser  s    zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r    r.   r¿   r_   r²   Úsupports_dir_fdrL   Úsupports_fdÚsupports_follow_symlinksr   r„   Ú_use_fd_functionsrx   Úavoids_symlink_attacksrv   r,   r-   r€   Ú_rmtree_safe_fdÚ	Exceptionr   r    )ry   rÔ   Útmp_dirrz   Zreal_rmtreerÐ   r   rÏ   r   Ú-test_rmtree_uses_safe_fd_version_if_available  s,    ÿ
þ
ý
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablec                 C   s<   t j|  ¡ d\}}t |¡ |  ttj|¡ t 	|¡ d S ©Nr§   )
r[   Úmkstemprv   r    Úcloser   r­   r„   rx   Úremove)ry   Úhandler,   r   r   r   Útest_rmtree_dont_delete_file—  s    
z'TestRmTree.test_rmtree_dont_delete_filec              
   C   s‚   t  t¡ zbt j td¡}t j td¡}t  |¡ t  ||¡ |  ttj	|¡ tj	|dd W tj	tdd ntj	tdd 0 d S )NÚcheeseÚshopTr¨   )
r    r€   r   r,   r-   rŽ   r   r   r„   rx   ©ry   rb   rc   r   r   r   Útest_rmtree_on_symlinkž  s    

z!TestRmTree.test_rmtree_on_symlinkc              
   C   sš   t  t¡ zzt j td¡}t j td¡}t  |¡ tt j |d¡dƒ ¡  t ||¡ |  	t
tj|¡ tj|dd W tjtdd ntjtdd 0 d S )Nrà   rá   Zspamr(   Tr¨   )r    r€   r   r,   r-   r.   rÜ   r£   r¤   r   r   r„   rx   râ   r   r   r   Útest_rmtree_on_junction¬  s    

z"TestRmTree.test_rmtree_on_junction)r{   r|   r}   r†   r   Úskip_unless_symlinkr—   r¢   ÚunittestÚ
skipUnlessr£   r¥   r¦   rµ   ÚskipIfrl   ÚplatformrZ   r    r¸   rÅ   rÄ   rÍ   rÙ   rß   rã   rä   r   r   r   r   r~   ³   s2   	





$ÿÿ

r~   c                   @   s²   e Zd Zdd„ Zdd„ Zejdd„ ƒZdd„ Zd	d
„ Z	dd„ Z
ej d¡dd„ ƒZdd„ Ze eedƒd¡ejdd„ ƒƒZdd„ Zejdd„ ƒZejdd„ ƒZdd„ Zdd„ Zd S )!ÚTestCopyTreec              	   C   s  |   ¡ }tj |   ¡ 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Údestinationútest.txtÚ123Útest_dirÚ456)rv   r    r,   r-   rw   r„   rx   Údirnamer2   r€   Úcopytreer   ÚisfilerM   rI   r“   ©ry   Úsrc_dirÚdst_dirÚactualr   r   r   Útest_copytree_simple½  s"    ÿz!TestCopyTree.test_copytree_simplec              	   C   sZ  |   ¡ }|   ¡ }|  tj|¡ |  tj|¡ t|dfdƒ t tj |d¡¡ t tj |d¡¡ t|ddfdƒ t|ddfdƒ tj	||dd |  
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¡ |  t¡  tj	||d	d W d   ƒ n1 sL0    Y  d S )
Nznonexisting.txtrí   Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)Údirs_exist_okF)rv   rw   r„   rx   r2   r    r€   r,   r-   rñ   r   rò   rM   rI   r“   r   ÚFileExistsErrorró   r   r   r   Útest_copytree_dirs_exist_okÐ  s*    ÿz(TestCopyTree.test_copytree_dirs_exist_okc           
   	   C   s”  |   ¡ }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kr8| d¡r8|dd … }|  |tj |d¡¡ t |¡}	ttdƒrt|  |	j|j¡ ttd	ƒr|  |	j|j¡ d S )Nrb   rc   Úsubzfile.txtr   r‡   zsub/linkÚlchmodÚlchflagsÚ	UF_NODUMPT©ÚsymlinksÚntz\\?\é   )rv   r    r,   r-   r€   r2   rŽ   rZ   rü   r¿   ÚS_IRWXUÚS_IRWXOrý   rþ   rÌ   r„   rñ   r   rN   ÚreadlinkrR   Ú
startswithr“   rÀ   Úst_flags)
ry   rØ   rô   rõ   Zsub_dirÚsrc_linkÚdst_linkÚsrc_statrö   Údst_statr   r   r   Útest_copytree_symlinksé  s8    

ÿ


z#TestCopyTree.test_copytree_symlinksc                 C   s^  t jj}t jj}|  ¡ }z ||  ¡ 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ƒ zft dd¡}tj	|||d |  
|||dƒƒ¡ |  |||dƒƒ¡ |  |||dƒƒ¡ W t |¡ nt |¡ 0 zjt dd¡}tj	|||d |  |||dƒƒ¡ |  |||dd	ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ 0 zTdd„ }tj	|||d |  |||dd	d
ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ 0 W t |¡ t t j |¡¡ nt |¡ t t j |¡¡ 0 d S )Nrë   rì   rí   ztest.tmprî   rï   Z	test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp©Úignorezsubdir*c                 S   sf   g }|D ]X}t j | |¡}t j |¡rB| ¡ d dkrB| |¡ qt j |¡d dv r| |¡ q|S )Nrh   r  z.py)r    r,   r-   rM   rq   rO   Úsplitext)rb   ÚnamesrQ   rR   r,   r   r   r   Ú_filter1  s    ÿz8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r    r,   r-   r‘   rv   r2   r€   r„   Úignore_patternsrñ   r   r    rx   rð   )ry   r-   r‘   rô   rõ   Úpatternsr  r   r   r   Útest_copytree_with_exclude	  sR    ÿ
ÿ
z'TestCopyTree.test_copytree_with_excludec                    sV  t jj}t jj}ˆ ¡ }||dƒ}t  ||ƒ¡ t  ||dƒ¡ t  t j |dd¡¡ t|dddfdƒ g ‰ ‡ ‡fdd„}|ˆ ¡ dƒ}tj|||d	 ˆ 	|||dddƒƒ¡ |ˆ ¡ dƒ}tjt
 |¡||d	 ˆ 	|||dddƒƒ¡ |ˆ ¡ dƒ}tt  |¡ƒd
 }ˆ |t j¡ tj|||d	 ˆ 	|||dddƒƒ¡ ˆ tˆ ƒd¡ d S )NÚsourcerî   r  rì   rï   c                    sT   ˆ   | ¡ ˆ | t¡ ˆ |t¡ ˆ t|ƒtt|ƒƒ¡ |D ]}ˆ |t¡ q>g S r   )rO   r‚   ÚstrÚlistr“   r”   Úset)rb   r  rR   ©Zinvokationsry   r   r   Ú_ignoreX  s    
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorerë   r  r   é	   )r    r,   r-   r‘   rv   r€   r2   r„   rñ   r   ÚpathlibÚPathr  r±   r‚   ÚDirEntryr“   r”   )ry   r-   r‘   rØ   rô   r  rõ   Zsrc_dir_entryr   r  r   Ú!test_copytree_arg_types_of_ignoreJ  s8    
	ÿÿÿz.TestCopyTree.test_copytree_arg_types_of_ignorec              	   C   sx  |   ¡ }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j|¡ 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 )Nr  rë   iÿ  zpermissive.txtrí   zrestrictive.txtrï   i€  r§   ri   )rv   r    r,   r-   r€   rw   r„   rx   rÃ   r2   r[   r   rñ   r“   r¿   rÀ   rq   )ry   rØ   rô   rõ   Zrestrictive_subdirZrestrictive_subdir_dstr   r   r   Ú!test_copytree_retains_permissionst  s6    
ÿÿÿ
ÿz.TestCopyTree.test_copytree_retains_permissionszos.chmodc                 C   s„   |   ¡ }tj |   ¡ d¡}|  tj|¡ |  tjtj |¡¡ tdƒ|_	|  
tj¡ t ||¡ W d   ƒ n1 sv0    Y  d S )Nrë   zka-boom)rv   r    r,   r-   rw   r„   rx   rð   ÚPermissionErrorÚside_effectr   r   rñ   )ry   Z
mock_patchrô   rõ   r   r   r   Útest_copytree_winerror  s    
z#TestCopyTree.test_copytree_winerrorc                    sŽ   ‡ ‡‡‡fdd„}g ‰ˆ  ¡ ‰tjˆ  ¡ d‰ ttj ˆd¡dƒ}| ¡  W d   ƒ n1 s`0    Y  tj	ˆˆ |d ˆ 
tˆƒd¡ d S )Nc                    sR   ˆ  d ¡ ˆ | t¡ ˆ |t¡ ˆ | tj ˆd¡¡ ˆ |tj ˆ d¡¡ d S ©Nr   )rO   r‚   r  r“   r    r,   r-   )r¹   rº   ©rc   Úflagry   rb   r   r   Úcustom_cpfunŸ  s
    
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr§   r   r)   ©Úcopy_functionri   )rv   r[   r«   r.   r    r,   r-   rÜ   r„   rñ   r“   r”   )ry   r(  rD   r   r&  r   Ú"test_copytree_custom_copy_function  s    &z/TestCopyTree.test_copytree_custom_copy_functionÚmkfifoúrequires os.mkfifo()c              
   C   s2  t  t¡ zt j td¡}t  |¡ t j |d¡}zt  |¡ W n2 tyt } z|  d| ¡ W Y d }~n
d }~0 0 zt 	tt
¡ W n^ tjyä } zD|jd }|  t|ƒd¡ |d \}}}|  d| |¡ W Y d }~nd }~0 0 |  d¡ W tjtdd	 tjt
dd	 ntjtdd	 tjt
dd	 0 d S )
Nr  Zmypipeúos.mkfifo(): %sr   ri   z`%s` is a named pipez$shutil.Error should have been raisedTr¨   )r    r€   r   r,   r-   r,  r"  ÚskipTestr„   rñ   ÚTESTFN2r   r   r“   r”   Úfailrx   )ry   r  ÚpipeÚer‹   rb   rc   Z	error_msgr   r   r   Útest_copytree_named_pipe¯  s*    

$
&ÿz%TestCopyTree.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ë   rì   rí   rî   rï   c                    s   ˆ   | |f¡ d S r   rˆ   ©rb   rc   ©Zcopiedr   r   Ú_copyÐ  s    z6TestCopyTree.test_copytree_special_func.<locals>._copyr)  rY   )
rv   r    r,   r-   r2   r€   r„   rñ   r“   r”   )ry   rô   rõ   r7  r   r6  r   Útest_copytree_special_funcÈ  s    z'TestCopyTree.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
IDONTEXISTrì   rî   rï   Údestination2T)Úignore_dangling_symlinksZdestination3rÿ   )rv   r    r,   r-   rŽ   r€   r2   r   r   r„   rñ   ÚassertNotInrL   r®   ©ry   rô   rõ   r   r   r   Útest_copytree_dangling_symlinksÖ  s    z,TestCopyTree.test_copytree_dangling_symlinksc              	   C   s.  |   ¡ }tj |   ¡ d¡}t tj |d¡¡ ttj |dd¡dƒ W d   ƒ n1 sZ0    Y  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_dirrì   r)   Zlink_to_dirT)Útarget_is_directoryFrÿ   r9  )rv   r    r,   r-   r€   r.   rŽ   r„   rñ   r    rN   r®   rL   r   r<  r   r   r   Útest_copytree_symlink_dirê  s     þz&TestCopyTree.test_copytree_symlink_dirc                 C   s\   |   ¡ }|d }|  tj|d¡ tj |d¡}t|dƒ t ||¡}|  	dgt 
|¡¡ d S )NÚdestTr   )rv   rw   r„   rx   r    r,   r-   r2   rñ   r“   rL   )ry   rô   rõ   rb   Úrvr   r   r   Útest_copytree_return_valueþ  s    
z'TestCopyTree.test_copytree_return_valuec                 C   s€   |   ¡ }| jtj|dd tj |dd¡}tj |dd¡}t |¡ tj |d¡}t|dƒ t 	||¡}|  
dgt |¡¡ d S )NTr¨   ÚtZpgZ
somevendorz1.0Zpol)rv   rw   r„   rx   r    r,   r-   Úmakedirsr2   rñ   r“   rL   )ry   Úbase_dirrô   rõ   rb   rA  r   r   r   Útest_copytree_subdirectory  s    

z'TestCopyTree.test_copytree_subdirectoryN)r{   r|   r}   r÷   rú   r   rå   r  r  r   r!  ræ   ÚmockÚpatchr$  r+  rç   rZ   r    r4  r8  r=  r?  rB  rF  r   r   r   r   rê   »  s(   
A*




rê   c                   @   sÒ  e Zd Z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ƒo„eedƒo„eedƒd¡dd„ ƒZejdd„ ƒZejeje ee	dƒoÀe	 ¡ dkd¡dd„ ƒƒƒZdd„ Zdd„ Zejdd„ ƒZe ee	dƒd ¡d!d"„ ƒZejd#d$„ ƒZejd%d&„ ƒZd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zejd/d0„ ƒZe ee	d1ƒd2¡d3d4„ ƒZejd5d6„ ƒZ e ee	d7ƒd8¡d9d:„ ƒZ!d;d<„ Z"d=d>„ Z#e e$p¸e%p¸e&d?¡d@dA„ ƒZ'dBdC„ Z(dDS )EÚTestCopyc                 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 )Nr   ÚbarÚbazÚquuxr  )rv   r    r,   r-   r2   rŽ   rÃ   r¿   r  ÚS_IRWXGr  ÚassertNotEqualrÀ   r„   Úcopymoder“   rR   ©ry   rØ   rb   rc   r  r	  r   r   r   Útest_copymode_follow_symlinks  s0    

z&TestCopy.test_copymode_follow_symlinksrü   z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 ©Nr   rJ  rK  rL  F©Úfollow_symlinks)rv   r    r,   r-   r2   rŽ   rÃ   r¿   r  rM  rü   r  r„   rO  r“   rÌ   rÀ   rN  rP  r   r   r   Ú test_copymode_symlink_to_symlink8  s0    


ÿz)TestCopy.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 rR  )rv   r    r,   r-   r2   rŽ   r„   rO  rP  r   r   r   Ú*test_copymode_symlink_to_symlink_wo_lchmodV  s    

z3TestCopy.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v rpdD ]"}	|  t||	ƒt||	ƒd ¡ qLt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 )Nr   rJ  rK  Úquxg      E@rü   rý   rþ   TrS  F©Úst_atimeÚst_mtimeri   r  gš™™™™™¹?)rv   r    r,   r-   r2   r¿   ÚutimerY  rZ  rN  rŽ   rZ   rü   r  rý   rþ   rÌ   r„   ÚcopystatrÀ   rÓ   ÚassertLessEqualr   r“   r  r   Úabs)
ry   rØ   rb   rc   r  r	  r
  Úsrc_link_statZdst_link_statÚattrr   r   r   Útest_copystat_symlinksf  sJ    


ÿ



ÿÿzTestCopy.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}zVtjtjfD ]}||ƒt_t	 
||¡ qT|tjtj ƒt_|  tt	j
||¡ W |t_n|t_0 d S )Nrœ   Úfile2Úxxxc                    s   t ƒ ‰ddœ‡ ‡fdd„
}|S )NTrS  c                   s   ˆ ˆ_ ˆ‚d S r   )r   )r,   ÚflagsrT  ©ÚerrÚexr   r   Ú_chflags_raiser  s    zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser©r   )ri  rk  r   rh  r   Úmake_chflags_raiserš  s    zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)rv   r    r,   r-   r2   rb  r   rc  rd  r„   r\  r   r   )ry   r³   rœ   re  rm  Zold_chflagsri  r   r   r   Ú-test_copystat_handles_harmless_chflags_errors  s    


z6TestCopy.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	„}z4tj‰|t_t ˆ|¡ |  dt 
|¡¡ W ˆt_nˆt_0 d
dœ‡ ‡fdd„
}z"tj
‰ |t_
t ˆ|¡ W ˆ t_
nˆ t_
0 tj |d¡‰tj |d¡}tˆˆƒ t||ƒ t ˆdd¡ t |dd¡ t |d¡ tj |d¡}tj |d¡}t||ƒ t||ƒ t ˆ|¡ t ||¡ |  t |d¡d¡ |  t |d¡d¡ d S )Nr   rJ  úuser.fooó   42zuser.baró   43ÚEPERMc                    s&   |dkrˆ‚nˆ | ||fi |¤Ž d S )Nro  r   )Úfnamer`  Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_fooÅ  s    z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrS  c                   s    | ˆkrt tjdƒ‚ˆ | |dS )NzOperation not supportedrS  )r   r   rd  )rs  rT  )Úorig_listxattrrb   r   r   Ú_raise_on_srcÒ  s    z.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_values   fiddlyi$  Zthe_copyZthe_copy_ro)rv   r    r,   r-   r2   r„   Ú
_copyxattrÚsetxattrr“   rK   Ú	listxattrÚgetxattrrÝ   r   r   rr  r®   rÃ   r\  )ry   rØ   rc   rw  ry  ZsrcroZdstror   )rx  ru  rv  rb   r   Útest_copyxattr®  sZ    

 

þ





zTestCopy.test_copyxattrr¸   r   ú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 )
Nr   rK  ztrusted.foorp  rq  FrS  rJ  rW  )rv   r    r,   r-   r2   rŽ   r{  r„   rz  r“   r}  r   r   )ry   rØ   rb   r  rc   r	  r   r   r   Útest_copyxattr_symlinksî  s     

z TestCopy.test_copyxattr_symlinksc                 C   sP   d}|   ¡ }t||fdƒ tj ||¡}|   ¡ }|||ƒ tj ||¡}||fS )Nrì   rf  )rv   r2   r    r,   r-   )ry   Úmethodrs  r³   rœ   Útmpdir2re  r   r   r   Ú
_copy_file	  s    
zTestCopy._copy_filec                 C   sB   |   tj¡\}}|  tj |¡¡ |  t |¡j	t |¡j	¡ d S r   )
rƒ  r„   Úcopyr   r    r,   r‘   r“   r¿   rÀ   )ry   rœ   re  r   r   r   Ú	test_copy  s    zTestCopy.test_copyc                 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 )Nr   rJ  rK  rü   TrS  F)rv   r    r,   r-   r2   rŽ   rZ   rü   r¿   r  r  r„   r„  r    rN   r“   rI   rÝ   r   r  rÌ   rÀ   )ry   rØ   rb   rc   r  r   r   r   Útest_copy_symlinks  s&    



ÿzTestCopy.test_copy_symlinksr[  zrequires os.utimec                 C   sœ   |   tj¡\}}|  tj |¡¡ t |¡}t |¡}|  |j	|j	¡ dD ] }|  
t||ƒt||ƒd ¡ qJttdƒr˜t|dƒr˜|  t|dƒt|dƒ¡ d S )NrX  ri   rb  r  )rƒ  r„   Úcopy2r   r    r,   r‘   r¿   r“   rÀ   r]  r   rZ   )ry   rœ   re  Z
file1_statZ
file2_statr`  r   r   r   Ú
test_copy22  s    

ÿÿzTestCopy.test_copy2c           	      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v rVd
D ]"}|  t||ƒt||ƒd ¡ q2ttdƒr‚|  |j|j¡ |  |j|j¡ ttdƒrªt|dƒrª|  |j|j¡ d S )Nr   rJ  rK  rü   rý   rþ   TrS  FrX  ri   r  )rv   r    r,   r-   r2   rŽ   rZ   rü   r¿   r  r  rý   rþ   rÌ   r„   r‡  r    rN   r“   rI   rÝ   r   r  r[  rÓ   r]  r   rÀ   rN  r  )	ry   rØ   rb   rc   r  r
  r_  r  r`  r   r   r   Útest_copy2_symlinksC  s<    





ÿzTestCopy.test_copy2_symlinksc                 C   sr   |   ¡ }tj |d¡}tj |d¡}t|dƒ t |dd¡ t ||¡ |  t 	|d¡t 	|d¡¡ t 
|¡ d S )Nr   rJ  ro  rp  )rv   r    r,   r-   r2   r{  r„   r‡  r“   r}  rÝ   )ry   rØ   rb   rc   r   r   r   Útest_copy2_xattrf  s    


þzTestCopy.test_copy2_xattrc                 C   sˆ   t jt jfD ]v}|  ¡ }|  ¡ }tj |d¡}t|dƒ |||ƒ}|  |tj |d¡¡ ||tj |d¡ƒ}|  |tj |d¡¡ qd S )Nr   rJ  )	r„   r„  r‡  rv   r    r,   r-   r2   r“   )ry   rÉ   rô   rõ   rb   rA  r   r   r   Útest_copy_return_values  s    

zTestCopy.test_copy_return_valuec                 C   s   |   tj¡ d S r   )Ú_test_copy_dirr„   r„  ©ry   r   r   r   Útest_copy_dir  s    zTestCopy.test_copy_dirc                 C   s   |   tj¡ d S r   )rŒ  r„   r‡  r  r   r   r   Útest_copy2_dir‚  s    zTestCopy.test_copy2_dirc                 C   sx   |   ¡ }tj |d¡}|   ¡ }tj |d¡}t|dƒ tjdkrFt}nt}|  	||||¡ |  	||||¡ |||ƒ d S ©Nr   údoes_not_exist/Úwin32)
rv   r    r,   r-   r2   rl   ré   r"  ÚIsADirectoryErrorr   )ry   Z	copy_funcrô   Úsrc_filerš   rc   ri  r   r   r   rŒ  …  s    

zTestCopy._test_copy_dirc                 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 )Nrb   rc   r	  r‡   r   FrS  )rv   r    r,   r-   r2   rŽ   r„   Úcopyfiler   rN   r“   r  r    )ry   rØ   rb   rc   r	  r‡   r   r   r   Útest_copyfile_symlinks—  s    
zTestCopy.test_copyfile_symlinksr‡   zrequires os.linkc              
   C   s  t  t¡ t j td¡}t j td¡}zât|dƒ}| d¡ W d   ƒ n1 sR0    Y  zt  ||¡ W n2 tyž } z|  	d| ¡ W Y d }~n
d }~0 0 |  
tjtj||¡ t|dƒ }|  | ¡ d¡ W d   ƒ n1 sä0    Y  t  |¡ W tjtdd ntjtdd 0 d S )	Nrà   rá   r)   Úcheddarzos.link(): %srG   Tr¨   )r    r€   r   r,   r-   r.   r/   r‡   r"  r/  r   r„   r   r•  r“   rH   rÝ   rx   )ry   rb   rc   rD   r3  r   r   r   Ú'test_dont_copy_file_onto_link_to_itself¨  s    
($.z0TestCopy.test_dont_copy_file_onto_link_to_itselfc              
   C   sæ   t  t¡ t j td¡}t j td¡}zªt|dƒ}| d¡ W d   ƒ n1 sR0    Y  t  d|¡ |  t	j
t	j||¡ t|dƒ }|  | ¡ d¡ W d   ƒ n1 s¬0    Y  t  |¡ W t	jtdd nt	jtdd 0 d S )Nrà   rá   r)   r—  rG   Tr¨   )r    r€   r   r,   r-   r.   r/   rŽ   r   r„   r   r•  r“   rH   rÝ   rx   )ry   rb   rc   rD   r   r   r   Ú*test_dont_copy_file_onto_symlink_to_itself¼  s    
(.z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr,  r-  c              
   C   sŠ   zt  t¡ W n2 ty@ } z|  d| ¡ W Y d }~n
d }~0 0 z6|  tjtjtt	¡ |  tjtjt
t¡ W t  t¡ nt  t¡ 0 d S )Nr.  )r    r,  r   r"  r/  r   r„   ÚSpecialFileErrorr•  r0  Ú__file__rÝ   )ry   r3  r   r   r   Útest_copyfile_named_pipeÑ  s    $ÿÿz!TestCopy.test_copyfile_named_pipec                 C   sl   |   ¡ }|   ¡ }tj |d¡}tj |d¡}t|dƒ t ||¡}|  tj |¡¡ |  	t
|ƒt
|ƒ¡ d S )NrJ  r   )rv   r    r,   r-   r2   r„   r•  r   r‘   r“   rI   )ry   rô   rõ   Údst_filer”  rA  r   r   r   Útest_copyfile_return_valueß  s    
z#TestCopy.test_copyfile_return_valuec                 C   sX   |   ¡ }tj |d¡}t|dƒ |  ttj||¡ |  t	tj||¡ |  
t|ƒd¡ d S r%  )rv   r    r,   r-   r2   r   r   r„   r•  r   r“   rI   )ry   rô   r”  r   r   r   Útest_copyfile_same_fileê  s    
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)c                 C   sD   |   ¡ }tj |d¡}tj |d¡}t|dƒ |  ttj||¡ d S )Nr   r‘  )	rv   r    r,   r-   r2   r   r¬   r„   r•  )ry   rô   r”  rc   r   r   r   Útest_copyfile_nonexistent_dirö  s
    
z&TestCopy.test_copyfile_nonexistent_dirc                 C   s„   |   ¡ }tj |d¡}|   ¡ }tj |d¡}t|dƒ tjdkrFt}nt}|  	|t
j||¡ |  	|t
j||¡ |  	|t
j||¡ d S r  )rv   r    r,   r-   r2   rl   ré   r"  r“  r   r„   r•  )ry   rô   r”  rš   rc   ri  r   r   r   Útest_copyfile_copy_dirÿ  s    

zTestCopy.test_copyfile_copy_dirN))r{   r|   r}   r   rå   rQ  ræ   rç   rZ   r    rU  rè   rV  ra  r   rn  Zskip_unless_xattrr~  r¸   r€  rƒ  r…  r†  rˆ  r‰  rŠ  r‹  rŽ  r  rŒ  r–  r˜  r™  rœ  rž  rŸ  ÚMACOSÚSOLARISr£   r   r¡  r   r   r   r   rI    sh   

(ÿý

?ÿ



"





rI  c                   @   s~  e Zd Ze ¡ dd„ ƒZdd„ Zd9dd„Ze ¡ e 	e
 d¡d	¡d
d„ ƒƒZe ¡ dd„ ƒZe ¡ e 	e
 d¡d¡dd„ ƒƒZe ¡ e 	e
 d¡d¡dd„ ƒƒZdd„ Ze ¡ dd„ ƒZe ¡ e 	ed¡dd„ ƒƒZdd„ Zdd „ Ze ¡ d!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Ze ¡ d-d.„ ƒZe ¡ d/d0„ ƒZe ¡ e  e!oRe"ƒ  d1¡d2d3„ ƒƒZ#e ¡ d4d5„ ƒZ$d6d7„ Z%d8S ):ÚTestArchivesc           	      C   sª  |   d¡\}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡* tj 
|¡}t|d|dƒ}W d   ƒ n1 s|0    Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |d¡$}|  | ¡ g d¢¡ W d   ƒ n1 sî0    Y  t 	|¡ t|d|dƒ}W d   ƒ n1 s(0    Y  |  ||d	 ¡ |  tj |¡¡ |  t |¡¡ t |d
¡$}|  | ¡ g d¢¡ W d   ƒ n1 sœ0    Y  d S )Nrª   ÚarchiveÚgztarÚ.ú.tar.gzzr:gz)r§  z./subz./sub2z./file1z./file2z./sub/file3Útarú.tarrG   )Ú_create_filesrv   r    r²   r,   rð   r-   Úbasenamer   Ú
change_cwdÚabspathr   r“   r   rò   ÚtarfileZ
is_tarfiler.   ÚassertCountEqualÚgetnames)	ry   Úroot_dirrE  r‚  Úwork_dirÚrel_base_nameÚ	base_nameÚtarballZtfr   r   r   Útest_make_tarball  s0    
,
ÿ".
ÿzTestArchives.test_make_tarballc                 C   sF   t  |¡(}| ¡ }| ¡  t|ƒW  d   ƒ S 1 s80    Y  d S r   )r¯  r.   r±  Úsortr+   )ry   r,   r©  r  r   r   r   Ú_tarinfo:  s    zTestArchives._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_okrœ   rf  re  rû   Zfile3Zsub2Úouter)rv   r    r,   r-   rD  r2   r€   )ry   rE  r²  rº  r   r   r   r«  @  s    zTestArchives._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¦  r¨  zarchive2.tarr©  z-cf©ÚcwdÚstdoutrª  T)Údry_run)r«  r    r,   r-   rv   r   r“   r   rò   rn   Ú
check_callÚDEVNULLr¹  )ry   r²  rE  rµ  r¶  Ztarball2Ztar_cmdr   r   r   Útest_tarfile_vs_tarN  s(    ÿ
ÿz TestArchives.test_tarfile_vs_tarc           	      C   s®  |   ¡ \}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡( tj 
|¡}t|d|ƒ}W d   ƒ n1 sx0    Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡$}|  | ¡ g d¢¡ W d   ƒ n1 sè0    Y  t 	|¡* tj 
|¡}t|d||ƒ}W d   ƒ n1 s.0    Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡$}|  | ¡ g d¢¡ W d   ƒ n1 s 0    Y  d S )Nr¥  Úzipú.zip)údist/ú	dist/sub/ú
dist/sub2/ú
dist/file1ú
dist/file2údist/sub/file3r¼  )rÆ  rÇ  rÈ  rÉ  rÊ  rË  )r«  rv   r    r²   r,   rð   r-   r¬  r   r­  r®  r   r“   r   rò   ÚzipfileÚ
is_zipfileÚZipFiler°  Únamelist)	ry   r²  rE  r‚  r³  r´  rµ  rQ   Úzfr   r   r   Útest_make_zipfileo  s2    
*
ÿ".
ÿzTestArchives.test_make_zipfilerÄ  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   ƒ n1 s¶0    Y  t |¡}| ¡ }	W d   ƒ n1 sè0    Y  |  t|ƒt|	ƒ¡ d S )Nr¥  rÄ  rÅ  zarchive2.zipz-qz-rr½  )r«  r    r,   r-   rv   r   r“   r   rò   rn   rÁ  rÂ  rÌ  rÎ  rÏ  rK   )
ry   r²  rE  rµ  r¥  Zarchive2Úzip_cmdrÐ  r  Znames2r   r   r   Útest_zipfile_vs_zip”  s     ÿ&&z TestArchives.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	 
|¡‚ ztj|tjd W n\ tjyÔ } zB|jjdd}d	|v rª|  d
¡ d}|  | ||¡¡ W Y d }~n
d }~0 0 W d   ƒ n1 sê0    Y  d S )Nr¥  rÄ  rÅ  rÔ  z-t)ÚstderrÚreplacerŠ   zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r«  r    r,   r-   rv   r   r“   r   rò   r   r­  rn   Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder/  r1  Úformat)	ry   r²  rE  rµ  r¥  rÒ  rÈ   ZdetailsÚmsgr   r   r   Útest_unzip_zipfile®  s    

zTestArchives.test_unzip_zipfilec                 C   s*   |   ¡ }tj |d¡}|  tt|d¡ d S )Nr¥  rf  )rv   r    r,   r-   r   Ú
ValueErrorr   )ry   r³   rµ  r   r   r   Útest_make_archiveÆ  s    zTestArchives.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¥  rÄ  ©ÚownerÚgroupr©  Z	kjhkjhkjgZoihohoh)ÚUID_GID_SUPPORTÚgrpÚgetgrgidÚpwdÚgetpwuidr«  r    r,   r-   rv   r   r   rò   )ry   rä  rã  r²  rE  rµ  rQ   r   r   r   Útest_make_archive_owner_groupË  s(    ÿ
ÿ
ÿz*TestArchives.test_make_archive_owner_groupúRequires grp and pwd supportc           	   	   C   sÚ   |   ¡ \}}tj |  ¡ d¡}t d¡d }t d¡d }t	 
|¡$ t|d|d||d}W d   ƒ n1 sn0    Y  |  tj |¡¡ t |¡}z6| ¡ D ] }|  |jd¡ |  |jd¡ qžW | ¡  n
| ¡  0 d S )Nr¥  r   r¦  rº  râ  )r«  r    r,   r-   rv   ræ  rç  rè  ré  r   r­  r   r   rò   r¯  r.   Z
getmembersr“   ÚuidÚgidrÜ   )	ry   r²  rE  rµ  rä  rã  Úarchive_namer¥  Úmemberr   r   r   Útest_tarfile_root_ownerç  s    
ÿ$
z$TestArchives.test_tarfile_root_ownerc                 C   st   t  ¡ }dd„ }td|g dƒ zFztdd|  ¡ d W n tyH   Y n0 |  t  ¡ |¡ W tdƒ n
tdƒ 0 d S )Nc                  _   s
   t ƒ ‚d S r   )ÚRuntimeError)r   Úkwr   r   r   Ú_breaks   s    z3TestArchives.test_make_archive_cwd.<locals>._breaksrf  úxxx file)r²  )r    r]   r   r   rv   r×   r“   r   )ry   Zcurrent_dirró  r   r   r   Útest_make_archive_cwdþ  s    z"TestArchives.test_make_archive_cwdc                 C   sZ   |   ¡ }t |¡4 |  tddƒd¡ |  tj d¡¡ W d   ƒ n1 sL0    Y  d S )NÚtestr©  ztest.tar©	rv   r   r­  r“   r   r   r    r,   rò   ©ry   r²  r   r   r   Útest_make_tarfile_in_curdir  s    z(TestArchives.test_make_tarfile_in_curdirc                 C   sZ   |   ¡ }t |¡4 |  tddƒd¡ |  tj d¡¡ W d   ƒ n1 sL0    Y  d S )Nrö  rÄ  ztest.zipr÷  rø  r   r   r   Útest_make_zipfile_in_curdir  s    z(TestArchives.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 )Nrf  ri   c                   S   s   t S r   ©Úxr   r   r   r   Ú<lambda>  r6   z;TestArchives.test_register_archive_format.<locals>.<lambda>c                   S   s   t S r   rû  r   r   r   r   rý  !  r6   )ri   rY   )ri   rY   r   c                   S   s   t S r   rû  r   r   r   r   rý  $  r6   rô  c                 S   s   g | ]\}}|‘qS r   r   ©r<   rR   Úparamsr   r   r   r>   %  r6   z=TestArchives.test_register_archive_format.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r   r   rþ  r   r   r   r>   )  r6   )r   Ú	TypeErrorr   r   r®   r   r;  )ry   Úformatsr   r   r   Útest_register_archive_format  s    ÿÿz)TestArchives.test_register_archive_formatc                 K   sF   | j |dd„ fi |¤Ž | j |tjfi |¤Ž | j |tfi |¤Ž d S )Nc                 S   s   | S r   r   ©r,   r   r   r   rý  0  r6   z3TestArchives.check_unpack_archive.<locals>.<lambda>)Ú#check_unpack_archive_with_converterr  r  r   )ry   rÜ  r   r   r   r   Úcheck_unpack_archive.  s    ÿÿÿÿz!TestArchives.check_unpack_archivec                 K   s.  |   ¡ \}}t|ƒ}| d¡ tj |  ¡ d¡}t||||ƒ}|  ¡ }	t||ƒ||	ƒfi |¤Ž |  	t|	ƒ|¡ |  ¡ }
t||ƒ||
ƒfd|i|¤Ž |  	t|
ƒ|¡ |  
tj¡$ t|tƒfi |¤Ž W d   ƒ n1 sÜ0    Y  |  
t¡( t|tƒfddi|¤Ž W d   ƒ n1 s 0    Y  d S )Nr¼  r¥  rÜ  rf  )r«  rP   rÝ   r    r,   r-   rv   r   r   r“   r   r„   Ú	ReadErrorr   rß  )ry   rÜ  Ú	converterr   r²  rE  Úexpectedrµ  r°   r‚  Ztmpdir3r   r   r   r  5  s"    
ÿ2z0TestArchives.check_unpack_archive_with_converterc                 C   sT   | j |dd | j |dd t | ¡ |   |¡ W d   ƒ n1 sF0    Y  d S )NZfully_trusted©ÚfilterÚdata)r  r   Zcheck_no_warnings)ry   rÜ  r   r   r   Úcheck_unpack_tarballM  s    z!TestArchives.check_unpack_tarballc                 C   s   |   d¡ d S )Nr©  ©r  r  r   r   r   Útest_unpack_archive_tarS  s    z$TestArchives.test_unpack_archive_tarc                 C   s   |   d¡ d S )Nr¦  r  r  r   r   r   Útest_unpack_archive_gztarV  s    z&TestArchives.test_unpack_archive_gztarc                 C   s   |   d¡ d S )NÚbztarr  r  r   r   r   Útest_unpack_archive_bztarZ  s    z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largerc                 C   s   |   d¡ d S )NÚxztarr  r  r   r   r   Útest_unpack_archive_xztar^  s    z&TestArchives.test_unpack_archive_xztarc                 C   sF   |   d¡ |  t¡ | j ddd W d   ƒ n1 s80    Y  d S )NrÄ  r  r	  )r  r   r   r  r   r   r   Útest_unpack_archive_zipc  s    
z$TestArchives.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 )Nri   ú	stuff.booÚxx)r“   )r°   Úextract_dirÚextrar  r   r   Ú_boom  s    z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r  ri   r  r  ZBoo2rª   )	r   r   r   r   r	   r
   r®   r;  r“   )ry   r  r  r   r  r   Útest_unpack_registryi  s    

ÿz!TestArchives.test_unpack_registryN)rº  )&r{   r|   r}   r   Zrequires_zlibr·  r¹  r«  ræ   rç   r„   ÚwhichrÃ  rÑ  rÓ  rÞ  rà  rê  rå  rð  rõ  rù  rú  r  r  r  r  r  r  Zrequires_bz2r  Zrequires_lzmarè   rk   rs   r  r  r  r   r   r   r   r¤    s\   
#
ÿ
$ÿÿ





r¤  c                   @   sL   e Zd Ze eedƒd¡dd„ ƒZe ed¡e ee	dƒd¡dd	„ ƒƒZ
d
S )ÚTestMiscÚ
disk_usagez)disk_usage not available on this platformc                 C   s†   t  tj t¡¡}dD ]}|  t||ƒt¡ q|  	|j
d¡ |  	|jd¡ |  |jd¡ |  |j
|j¡ |  	|j
|j¡ t  t¡ d S )N)r3   ÚusedÚfreer   )r„   r  r    r,   rð   r›  r‚   r   rr   ZassertGreaterr3   r  ÚassertGreaterEqualr  )ry   Úusager`  r   r   r   Útest_disk_usage†  s    zTestMisc.test_disk_usagerë  Úchownzrequires os.chownc                    s‚  ˆ  ¡ }tj|d‰ tˆ dƒ ˆ t¡ t ˆ ¡ W d   ƒ n1 sH0    Y  ˆ t¡ tjˆ dd W d   ƒ n1 s€0    Y  ˆ t¡ tjˆ dd W d   ƒ n1 s¸0    Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 sî0    Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 s&0    Y  t
 ¡ }t
 ¡ }d‡ ‡fd	d
„	}t ˆ ||¡ |ˆ ||ƒ t ˆ |¡ |ˆ |ƒ tjˆ |d |ˆ |ƒ tjˆ |d |ˆ |d t |||¡ ||||ƒ t ||¡ |||ƒ tj||d |||ƒ tj||d |||d z t |¡d }t |¡d }W n tyH   Y n60 t ˆ ||¡ |ˆ ||ƒ t |||¡ ||||ƒ d S )Nr§   ztesting chown functionznon-existing username)Úuserznon-existing groupname)rä  ó   spamg…ëQ¸	@c                    s:   t  ˆ ¡}|d ur ˆ ||j¡ |d ur6ˆ ||j¡ d S r   )r    r¿   r“   Úst_uidÚst_gid)r,   rì  rí  Ús©r°   ry   r   r   Úcheck_chown®  s
    
z(TestMisc.test_chown.<locals>.check_chown)rí  r   )NN)rv   r[   r«   r2   r   rß  r„   r#  ÚLookupErrorr   r    ÚgetuidÚgetgidrè  ré  ræ  rç  ÚKeyError)ry   rð   rì  rí  r*  r$  rä  r   r)  r   Ú
test_chown•  sR    
(,,*,



zTestMisc.test_chownN)r{   r|   r}   ræ   rç   rZ   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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d„ Zd d!„ Zd"d#„ Ze ejdkd$¡d%d&„ ƒZe ejdkd$¡d'd(„ ƒZd)S )*Ú	TestWhichc                 C   st   | j dd| _tj| jddd| _t | jjtj	¡ |  
| jj¡ tj | jj¡\| _| _| j| _tj| _d| _d S )NZTmp)ru   z.Exe©rW   ru   Úsuffixz.EXE)rv   Útemp_dirr[   r\   Ú	temp_filer    rÃ   rR   r¿   ÚS_IXUSRrw   rÜ   r,   rq   rW   ÚfileÚenv_pathÚcurdirÚextr  r   r   r   ÚsetUpÖ  s    þzTestWhich.setUpc                 C   s&   t j| j| jd}|  || jj¡ d S ©Nr  )r„   r  r6  rW   r“   r4  rR   ©ry   rA  r   r   r   Ú
test_basicä  s    zTestWhich.test_basicc                 C   s(   t j| jj| jd}|  || jj¡ d S r;  )r„   r  r4  rR   r3  r“   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   ƒ n1 s`0    Y  tj| jd( tj	||d}|  |¡ W d   ƒ n1 s¦0    Y  d S r;  )r    r,   rq   rW   r-   r6  r   r­  r„   r  r3  r“   ÚassertIsNone)ry   rE  Útail_dirÚrelpathrA  r   r   r   Útest_relative_cmdï  s    *zTestWhich.test_relative_cmdc                 C   s€   t j | j¡}tj| jdP tj| j|d}t	j
dkrT|  |t j | j| j¡¡ n
|  |¡ W d   ƒ n1 sr0    Y  d S )Nr  r’  )r    r,   rð   rW   r   r­  r„   r  r6  rl   ré   r“   r-   r8  r?  )ry   rE  rA  r   r   r   Útest_cwdü  s    
zTestWhich.test_cwdr¸   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    rÃ   r4  rR   r¿   rÁ   ÚaccessÚW_OKr/  r„   r  r6  rW   r?  r<  r   r   r   Útest_non_matching_mode  s
    
z TestWhich.test_non_matching_modec                 C   sj   t j | j¡\}}tj|d8 tj| j|d}|  	|t j 
|| j¡¡ W d   ƒ n1 s\0    Y  d S r;  )r    r,   rq   rW   r   r­  r„   r  r6  r“   r-   )ry   rE  r@  rA  r   r   r   Útest_relative_path  s    zTestWhich.test_relative_pathc                 C   s   t jd| jd}|  |¡ d S )Nzfoo.exer  )r„   r  rW   r?  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… | j ¡ d S )Néüÿÿÿr  )r„   r  r6  rW   r“   r4  rR   r9  r<  r   r   r   Útest_pathext_checking  s    zTestWhich.test_pathext_checkingc                 C   sR   t  ¡ 6}| j|d< t | j¡}|  || jj¡ W d   ƒ n1 sD0    Y  d S ©NÚPATH)	r   ÚEnvironmentVarGuardr7  r„   r  r6  r“   r4  rR   ©ry   ÚenvrA  r   r   r   Útest_environ_path%  s    

zTestWhich.test_environ_pathc                 C   sÚ   t  ¡ ¾}d|d< tjjd| jdd‚ t  td| j¡R t  | j¡& t	 
| j¡}|  |¡ W d   ƒ n1 sr0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s®0    Y  W d   ƒ n1 sÌ0    Y  d S )Nrª   rM  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   rN  ræ   rG  rH  rW   Ú	swap_attrr    r­  r„   r  r6  r?  rO  r   r   r   Útest_environ_path_empty+  s    
ÿþ
ýz!TestWhich.test_environ_path_emptyc                 C   s:  t j | jj¡}tjdkrBt j}t|t	ƒr4t  
|¡}t j ||¡}t ¡ Ú}t j|d< tjjd| jddš t t d| j¡j t | j¡}|  |¡ t | j¡( t | j¡}|  ||¡ W d   ƒ n1 sÎ0    Y  W d   ƒ n1 sì0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s,0    Y  d S )Nr’  rM  rR  TrS  rV  )r    r,   r¬  r4  rR   rl   ré   r8  r*   rƒ   r   r-   r   rN  Úpathsepræ   rG  rH  rW   rW  r„   r  r6  r?  r­  r“   )ry   Zexpected_cwdr8  rP  rA  r   r   r   Útest_environ_path_cwd6  s$    




ÿþ
zTestWhich.test_environ_path_cwdc              
   C   s8  t  ¡ }| dd ¡ tjjdtddL t  td| j	¡ t
 | j¡}W d   ƒ n1 s^0    Y  W d   ƒ n1 s|0    Y  |  || jj¡ tjjd| j	ddJ t  tdd¡ t
 | j¡}W d   ƒ n1 sÜ0    Y  W d   ƒ n1 sú0    Y  |  || jj¡ W d   ƒ n1 s*0    Y  d S )NrM  rR  T)r#  rU  rV  rS  rª   )r   rN  Úpopræ   rG  rH  rß  rW  r    rW   r„   r  r6  r“   r4  rR   rO  r   r   r   Útest_environ_path_missingL  s     
ÿþHÿþHz#TestWhich.test_environ_path_missingc              	   C   sŒ   t j | j¡}tj| jd\ t ¡ 4}| j|d< tj	| j
dd}|  |¡ W d   ƒ n1 s`0    Y  W d   ƒ n1 s~0    Y  d S )Nr  rM  rª   )r    r,   rð   rW   r   r­  rN  r7  r„   r  r6  r?  )ry   rE  rP  rA  r   r   r   Útest_empty_path^  s    ÿ
zTestWhich.test_empty_pathc                 C   sN   t  ¡ 2}| dd ¡ t | j¡}|  |¡ W d   ƒ n1 s@0    Y  d S rL  )r   rN  r[  r„   r  r6  r?  rO  r   r   r   Útest_empty_path_no_PATHf  s    
z!TestWhich.test_empty_path_no_PATHztest specific to Windowsc                 C   s¢   d}t j| jd|d}t |jtj¡ |  |j	¡ tj
 |j¡}tj
 |¡d }t ¡ 6}||d< tj|| jd}|  ||j¡ W d   ƒ n1 s”0    Y  d S )Nú.xyzÚTmp2r1  r   ÚPATHEXTr  )r[   r\   r3  r    rÃ   rR   r¿   r5  rw   rÜ   r,   r¬  r  r   rN  r„   r  r“   ©ry   r9  Ztemp_filexyzZprogramrP  rA  r   r   r   Útest_pathextl  s    ÿ
zTestWhich.test_pathextc                 C   s˜   d}t j| jd|d}|  |j¡ tj |j¡}tj 	|¡d }t
 ¡ <}|› d|d< tj|| jd}|  ||j¡ W d   ƒ n1 sŠ0    Y  d S )Nr_  r`  r1  r   ú;ra  r  )r[   r\   r3  rw   rÜ   r    r,   r¬  rR   r  r   rN  r„   r  r“   rb  r   r   r   Útest_pathext_with_empty_str~  s    ÿ
z%TestWhich.test_pathext_with_empty_strN)r{   r|   r}   r:  r=  r>  rB  rC  ræ   rè   rZ   r    r¸   rG  rH  rI  rç   rl   ré   rK  rQ  rX  rZ  r\  r]  r^  rc  re  r   r   r   r   r0  Ô  s2   ÿ
ÿ

r0  c                   @   s   e Zd Zdd„ ZdS )ÚTestWhichBytesc                 C   sX   t  | ¡ t | j¡| _t | j¡| _t | jj¡| j_t | j¡| _t | j	¡| _	d S r   )
r0  r:  r    r   rW   r6  r4  rR   r8  r9  r  r   r   r   r:    s    
zTestWhichBytes.setUpN)r{   r|   r}   r:  r   r   r   r   rf    s   rf  c                   @   sˆ  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	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!d0d1„ Z"d2d3„ Z#e
d4d5„ ƒZ$e
d6d7„ ƒZ%d8d9„ Z&e e'ed:ƒove (¡ d;kove'ed<ƒove'e)d=ƒove'e)d>ƒd?¡d@dA„ ƒZ*dBS )CÚTestMovec                 C   sv   d}|   ¡ | _|   ¡ | _tj | j|¡| _tj | j|¡| _t| jdƒ}| 	d¡ W d   ƒ n1 sh0    Y  d S )Nr   r(   r%  )
rv   rô   rõ   r    r,   r-   r”  r  r.   r/   )ry   r°   rD   r   r   r   r:  ›  s    

zTestMove.setUpc                 C   sŽ   t |dƒ}| ¡ }W d   ƒ n1 s(0    Y  t ||¡ t |dƒ }|  || ¡ ¡ W d   ƒ n1 sn0    Y  |  tj |¡¡ d S ©NrF   )	r.   rH   r„   Úmover“   r    r    r,   r‘   )ry   rb   rc   Úreal_dstrD   Úcontentsr   r   r   Ú_check_move_file¤  s    &.zTestMove._check_move_filec                 C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S r   )	rK   r    rL   r„   ri  r“   r    r,   r‘   )ry   rb   rc   rj  rk  r   r   r   Ú_check_move_dir¬  s    zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )rl  r”  r  r  r   r   r   Útest_move_file²  s    zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )rl  r”  rõ   r  r  r   r   r   Útest_move_file_to_dir¶  s    zTestMove.test_move_file_to_dirc                 C   s"   t  | j¡}|  || j| j¡ d S r   )r  r  r”  rl  rõ   r  )ry   rb   r   r   r   Ú"test_move_file_to_dir_pathlike_srcº  s    z+TestMove.test_move_file_to_dir_pathlike_srcc                 C   s"   t  | j¡}|  | j|| j¡ d S r   )r  r  rõ   rl  r”  r  ©ry   rc   r   r   r   Ú"test_move_file_to_dir_pathlike_dst¿  s    z+TestMove.test_move_file_to_dir_pathlike_dstc                 C   s   |   ¡  d S r   )rn  r  r   r   r   Útest_move_file_other_fsÄ  s    z TestMove.test_move_file_other_fsc                 C   s   |   ¡  d S r   )ro  r  r   r   r   Útest_move_file_to_dir_other_fsÉ  s    z'TestMove.test_move_file_to_dir_other_fsc              	   C   s@   t j|  ¡ d}z|  | j||¡ W t |¡ nt |¡ 0 d S rÚ   )r[   r«   rv   rm  rô   r   rx   ©ry   rõ   r   r   r   Útest_move_dirÎ  s    zTestMove.test_move_dirc                 C   s   |   ¡  d S r   )rv  r  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 r   )rm  rô   rõ   r    r,   r-   r¬  r  r   r   r   Útest_move_dir_to_dirÛ  s    ÿzTestMove.test_move_dir_to_dirc                 C   s   |   ¡  d S r   )rx  r  r   r   r   Útest_move_dir_to_dir_other_fsà  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 r   )rm  rô   r    r,   Úseprõ   r-   r¬  r  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 r   )rm  rô   r    r,   Úaltseprõ   r-   r¬  r  r   r   r   Útest_move_dir_altsep_to_diré  s    ÿz$TestMove.test_move_dir_altsep_to_dirc                 C   sH   t | jdƒ W d   ƒ n1 s"0    Y  |  tjtj| j| j¡ d S )Nr(   )r.   r  r   r„   r   ri  r”  rõ   r  r   r   r   Ú"test_existing_file_inside_dest_dirî  s    z+TestMove.test_existing_file_inside_dest_dirc                 C   s*   t j | jd¡}|  tjtj| j|¡ d S ©NrJ  )r    r,   r-   rô   r   r„   r   ri  rq  r   r   r   Útest_dont_move_dir_in_itselfô  s    z%TestMove.test_dont_move_dir_in_itselfc              	   C   sr   t  t¡ zVdD ]B\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW t 	t¡ nt 	t¡ 0 d S )N))Úsrcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)©rÝ  )
r    r€   r   r,   r-   r   r„   Ú
_destinsrcr   rx   râ   r   r   r   Útest_destinsrc_false_negativeù  s    
ÿÿ
z&TestMove.test_destinsrc_false_negativec              	   C   sr   t  t¡ zVdD ]B\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW t 	t¡ nt 	t¡ 0 d S )N))r  zsrc/dest)r  z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r‚  )
r    r€   r   r,   r-   r    r„   rƒ  r   rx   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 r  )r    r,   r-   rô   rŽ   r”  r„   ri  r  r   rN   Úsamefilerq  r   r   r   Útest_move_file_symlink  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 r  )r    r,   r-   rô   rŽ   r”  r„   ri  rõ   r   rN   r†  )ry   r°   rc   Z
final_linkr   r   r   Útest_move_file_symlink_to_dir  s    z&TestMove.test_move_file_symlink_to_dirc                 C   sz   t j | jd¡}t j | jd¡}t  ||¡ t j | jd¡}t ||¡ |  t j 	|¡¡ |  
t j |¡t j |¡¡ d S ©NrK  rJ  rL  )r    r,   r-   rô   rŽ   rõ   r„   ri  r   rN   r“   Úrealpath©ry   rb   rc   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 r‰  )r    r,   r-   rô   r€   rŽ   rõ   r„   ri  r   rN   r†  r‹  r   r   r   Útest_move_dir_symlink0  s    
zTestMove.test_move_dir_symlinkc              	   C   s6   t  | j| j¡}|  |tj | jtj | j¡¡¡ d S r   )	r„   ri  r”  rõ   r“   r    r,   r-   r¬  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 r  )r„   ri  r”  r    r,   r-   rõ   r“   r<  r   r   r   Ú test_move_as_rename_return_valueA  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 r   rˆ   r5  ©Zmovedr   r   r7  H  s    z7TestMove.test_move_file_special_function.<locals>._copyr)  ri   )r„   ri  r”  rõ   r“   r”   ©ry   r7  r   r  r   Útest_move_file_special_functionE  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 r   rˆ   r5  r  r   r   r7  P  s    z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r)  r   )r   r¾   r    r,   r-   rô   r„   ri  rõ   r“   r”   r‘  r   r  r   Útest_move_dir_special_functionM  s    z'TestMove.test_move_dir_special_functionc              	   C   s~   |   ¡ | _tj tj | j¡tj | j¡ ¡ ¡}|  | j|¡ z.t	 
| j|¡ |  tj |¡¡ W t |¡ nt |¡ 0 d S r   )rv   rô   r    r,   r-   rð   r¬  ÚupperrN  r„   ri  r   rM   r²   ru  r   r   r   Útest_move_dir_caseinsensitiveW  s    
þz&TestMove.test_move_dir_caseinsensitiver¸   r   rý   ÚSF_IMMUTABLEÚ	UF_OPAQUEr  c              
   C   s0  zÜt  t¡ t  ttj¡ |  ttj	tt
¡ |  t
t  ¡ v ¡ t  ttj¡ t t j td¡¡ t  ttj¡ |  ttj	tt
¡ |  t
t  ¡ v ¡ W t j t¡r¸t  ttj¡ t t¡ t j t
¡rÜt  t
tj¡ t t
¡ nNt j t¡rt  ttj¡ t t¡ t j t
¡r*t  t
tj¡ t t
¡ 0 d S )Nr“  )r    r€   Ú
TESTFN_SRCrý   r¿   r—  r   r"  r„   ri  Ú
TESTFN_DSTr    rL   r˜  r   r¾   r,   r-   r‘   rx   r  r   r   r   Útest_move_dir_permission_deniedh  s,    

û
z(TestMove.test_move_dir_permission_deniedN)+r{   r|   r}   r:  rl  rm  rn  ro  rp  rr  r'   rs  rt  rv  rw  rx  ry  r{  ræ   rç   r    r,   r|  r}  r~  r€  r„  r…  r   rå   r‡  rˆ  rŒ  r  rŽ  r  r’  r”  r–  rZ   r¸   r¿   r›  r   r   r   r   rg  ™  sh   	




		


	ÿþürg  c                   @   s`   e Zd ZG dd„ deƒZdd„ Ze ed¡dd„ ƒZ	e ed¡dd	„ ƒZ
e ed¡d
d„ ƒZdS )ÚTestCopyFilec                   @   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 r   )Ú_raise_in_exitÚ_suppress_at_exit)ry   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__‘  s    zTestCopyFile.Faux.__init__c                 G   s   dS )Nrª   r   )ry   r   r   r   r   rH   ”  s    zTestCopyFile.Faux.readc                 C   s
   d| _ d S )NT)Ú_enteredr  r   r   r   Ú	__enter__–  s    zTestCopyFile.Faux.__enter__c                 C   s&   |||f| _ | jr d| _tdƒ‚| jS )NTúCannot close)Ú_exited_withr  Ú_raisedr   rž  )ry   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__˜  s
    zTestCopyFile.Faux.__exit__)FT)
r{   r|   r}   r   r£  r¤  rŸ  rH   r¡  r¨  r   r   r   r   ÚFaux  s   
r©  c              	   C   sr   ddd„}t  td|¡F |  t¡ t dd¡ W d   ƒ n1 sF0    Y  W d   ƒ n1 sd0    Y  d S )NrG   c                 S   s   | dkrt dƒ‚d S )NÚsrcfilezCannot open "srcfile"rl  ©r°   rD  r   r   r   Ú_open   s    z4TestCopyFile.test_w_source_open_fails.<locals>._openr.   rª  Údestfile)rG   )r   rW  r„   r   r   r•  ©ry   r¬  r   r   r   Útest_w_source_open_failsŸ  s    
z%TestCopyFile.test_w_source_open_failszskipped on macOSc                    sˆ   |   ¡ ‰ d
‡ fdd„	}t td|¡ t dd¡ W d   ƒ n1 sF0    Y  |  ˆ j¡ |  ˆ jd tu ¡ |  	ˆ jd j
d	¡ d S )NrG   c                    s    | dkrˆ S | dkrt dƒ‚d S )Nrª  r­  úCannot open "destfile"rl  r«  ©rª  r   r   r¬  ­  s
    z2TestCopyFile.test_w_dest_open_fails.<locals>._openr.   rª  r­  r   ri   )r°  )rG   )r©  r   rW  r„   r•  r   r   r£  r   r“   r   r®  r   r±  r   Útest_w_dest_open_fails©  s    *ÿz#TestCopyFile.test_w_dest_open_failsc                    s¬   |   ¡ ‰|   d¡‰ d‡ ‡fdd„	}t td|¡ t dd¡ W d   ƒ n1 sR0    Y  |  ˆj¡ |  ˆ j¡ |  ˆ j¡ |  ˆjd t	u ¡ |  
ˆjd	 jd
¡ d S )NTrG   c                    s   | dkrˆS | dkrˆ S d S ©Nrª  r­  r   r«  ©r­  rª  r   r   r¬  À  s
    z3TestCopyFile.test_w_dest_close_fails.<locals>._openr.   rª  r­  r   ri   )r¢  )rG   )r©  r   rW  r„   r•  r   r   r¤  r£  r   r“   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d|¡F |  t¡ t dd¡ W d   ƒ n1 s^0    Y  W d   ƒ n1 s|0    Y  |  ˆj¡ |  ˆ j¡ |  	ˆ j
¡ |  ˆjd d u ¡ |  ˆj
¡ d S )
NTrG   c                    s   | dkrˆS | dkrˆ S d S r³  r   r«  r´  r   r   r¬  Ö  s
    z5TestCopyFile.test_w_source_close_fails.<locals>._openr.   rª  r­  r   )rG   )r©  r   rW  r„   r   r   r•  r   r   r    r¤  r£  r®  r   r´  r   Útest_w_source_close_failsÐ  s    
Hz&TestCopyFile.test_w_source_close_failsN)r{   r|   r}   Úobjectr©  r¯  ræ   rè   r¢  r²  rµ  r¶  r   r   r   r   rœ  ‹  s   





rœ  c                   @   sx   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zej	dd	„ ƒZ
d
d„ Zdd„ Zdd„ Zdd„ Ze ejdkd¡dd„ ƒZdS )ÚTestCopyFileObji    c                 C   s   t t| jƒ d S r   )rE   r   ÚFILESIZE©Úclsr   r   r   Ú
setUpClassê  s    zTestCopyFileObj.setUpClassc                 C   s   t  t¡ t  t¡ d S r   )r   r_   r   r0  rº  r   r   r   ÚtearDownClassî  s    
zTestCopyFileObj.tearDownClassc                 C   s   t  t¡ d S r   ©r   r_   r0  r  r   r   r   ÚtearDownó  s    zTestCopyFileObj.tearDownc              	   c   sb   t tdƒD}t tdƒ}||fV  W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  d S ©NrF   r(   ©r.   r   r0  râ   r   r   r   Ú	get_filesö  s    zTestCopyFileObj.get_filesc              	   C   sl   t |dƒN}t |dƒ$}|  | ¡ | ¡ ¡ W d   ƒ n1 s@0    Y  W d   ƒ n1 s^0    Y  d S rh  )r.   r“   rH   )ry   rb   rc   ÚfsrcÚfdstr   r   r   Úassert_files_eqü  s    zTestCopyFileObj.assert_files_eqc                 C   sH   |   ¡  \}}t ||¡ W d   ƒ n1 s.0    Y  |  tt¡ d S r   )rÂ  r„   ÚcopyfileobjrÅ  r   r0  râ   r   r   r   Útest_content	  s    *zTestCopyFileObj.test_contentc                 C   s<   |   ¡  \}}t ||¡ W d   ƒ n1 s.0    Y  d S r   )rÂ  r„   rÆ  râ   r   r   r   Útest_file_not_closed	  s    z$TestCopyFileObj.test_file_not_closedc                 C   s`   |   ¡ D\}}t ||¡ |  | ¡ | j¡ |  | ¡ | j¡ W d   ƒ n1 sR0    Y  d S r   )rÂ  r„   rÆ  r“   Útellr¹  râ   r   r   r   Útest_file_offset	  s    z TestCopyFileObj.test_file_offsetr  zWindows onlyc                 C   s~  t j d¡}t tt¡ W d   ƒ n1 s.0    Y  |  |jd d d¡ t	j
t ¡ dd}| d¡ W d   ƒ n1 s€0    Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sÌ0    Y  |  |jd d d¡ t	j
t ¡ dd}W d   ƒ n1 s0    Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sd0    Y  |  |t¡ d S )	Nzshutil._copyfileobj_readintor   rY   i   FrV   s   foor   )ræ   rG  rH  r„   r•  r   r0  r“   Ú	call_argsr[   r\   r    r]   r/   rR   rw   r   r_   rÅ  )ry   ÚmrD   rs  r   r   r   Útest_win_impl	  s"    *(* ,zTestCopyFileObj.test_win_implN)r{   r|   r}   r¹  Úclassmethodr¼  r½  r¿  Ú
contextlibÚcontextmanagerrÂ  rÅ  rÇ  rÈ  rÊ  ræ   rè   r    rR   rÍ  r   r   r   r   r¸  ç  s   


r¸  c                   @   sŽ   e Zd ZdZdZdZedd„ ƒZedd„ ƒZdd	„ Z	e
jd
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú_ZeroCopyFileTesti    r6   rª   c                 C   sD   t t| jƒ ttdƒ}| ¡ | _W d   ƒ n1 s60    Y  d S rh  )rE   r   r¹  r.   rH   ÚFILEDATA)r»  rD   r   r   r   r¼  7	  s    
z_ZeroCopyFileTest.setUpClassc                 C   s   t  t¡ d S r   )r   r_   r   rº  r   r   r   r½  >	  s    z_ZeroCopyFileTest.tearDownClassc                 C   s   t  t¡ d S r   r¾  r  r   r   r   r¿  B	  s    z_ZeroCopyFileTest.tearDownc              	   c   sb   t tdƒD}t tdƒ}||fV  W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  d S rÀ  rÁ  râ   r   r   r   rÂ  E	  s    z_ZeroCopyFileTest.get_filesc                 O   s   t dƒ‚d S )Nzmust be implemented in subclass)ÚNotImplementedError)ry   r   r   r   r   r   Úzerocopy_funK	  s    z_ZeroCopyFileTest.zerocopy_func                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  d S r   )r¿  r½  r¼  r:  r  r   r   r   ÚresetN	  s    z_ZeroCopyFileTest.resetc              	   C   s¶   |   ¡  \}}|  ||¡ W d   ƒ n1 s.0    Y  |  ttdd| j¡ |   ¡ L\}}tj d¡}t	 
tt¡ W d   ƒ n1 sŠ0    Y  W d   ƒ n1 s¨0    Y  d S )NT©r0   zshutil.copyfileobj)rÂ  rÔ  r“   rI   r0  rÒ  ræ   rG  rH  r„   r•  r   )ry   rb   rc   rÌ  r   r   r   Útest_regular_copyV	  s    **z#_ZeroCopyFileTest.test_regular_copyc              	   C   sˆ   |   | j¡ |  ¡ J\}}|  t¡ |  ||¡ W d   ƒ n1 sF0    Y  W d   ƒ n1 sd0    Y  |  ttdd| j	¡ d S )NTrÖ  )
rw   rÕ  rÂ  r   r×   rÔ  r“   rI   r   rÒ  râ   r   r   r   Útest_same_file`	  s
    Hz _ZeroCopyFileTest.test_same_filec                 C   sZ   t jt ¡ d}|  t¡}t |d¡ W d   ƒ n1 s<0    Y  |  |j	j
|¡ d S )Nr§   Únew)r[   r«   r    r]   r   r¬   r„   r•  r“   r¯   r°   )ry   rR   r´   r   r   r   Útest_non_existent_srch	  s    *z'_ZeroCopyFileTest.test_non_existent_srcc              	      sÖ   t d ‰t d ‰ |  ‡fdd„¡ |  ‡ fdd„¡ tˆdƒ W d   ƒ n1 sT0    Y  tˆdƒF}tˆ dƒ}|  ||¡ W d   ƒ n1 s–0    Y  W d   ƒ n1 s´0    Y  |  tˆ dd	d
¡ d S )Nrb   rc   c                      s
   t  ˆ ¡S r   ©r   r_   r   )r`   r   r   rý  q	  r6   z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      s
   t  ˆ ¡S r   rÛ  r   )ra   r   r   rý  r	  r6   r(   rF   TrÖ  r6   )r   rw   r.   rÔ  r“   rI   râ   r   )ra   r`   r   Útest_empty_filen	  s    Hz!_ZeroCopyFileTest.test_empty_filec                 C   sH   t jj| jtd" |  ttjtt	¡ W d   ƒ n1 s:0    Y  d S )N©r#  )
ræ   rG  rH  Ú
PATCHPOINTÚZeroDivisionErrorr   r„   r•  r   r0  r  r   r   r   Útest_unhandled_exception|	  s    
ÿÿz*_ZeroCopyFileTest.test_unhandled_exceptionc              
   C   s    t jj| jttjdƒdr |  ¡ J\}}|  t	¡ |  
||¡ W d   ƒ n1 sV0    Y  W d   ƒ n1 st0    Y  W d   ƒ n1 s’0    Y  d S ©NÚyorÝ  )ræ   rG  rH  rÞ  r   r   ÚEINVALrÂ  r   r   rÔ  râ   r   r   r   Útest_exception_on_first_call‚	  s    

ÿz._ZeroCopyFileTest.test_exception_on_first_callc              	   C   s|   t jj| jttjdƒdN |  ¡ &\}}|  t| j	||¡ W d   ƒ n1 sP0    Y  W d   ƒ n1 sn0    Y  d S rá  )
ræ   rG  rH  rÞ  r   r   ÚENOSPCrÂ  r   rÔ  râ   r   r   r   Útest_filesystem_fullŒ	  s
    

ÿz&_ZeroCopyFileTest.test_filesystem_fullN)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Ñ  1	  s&   




rÑ  zos.sendfile() not supportedc                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestZeroCopySendfileúos.sendfilec                 C   s   t  ||¡S r   )r„   Ú_fastcopy_sendfile)ry   rÃ  rÄ  r   r   r   rÔ  ™	  s    z!TestZeroCopySendfile.zerocopy_func              
   C   s²   t  | j¡|}ttdƒR}|  t¡ |  ||¡ W d   ƒ n1 sF0    Y  t 	||¡ W d   ƒ n1 sp0    Y  W d   ƒ n1 sŽ0    Y  |  
ttdd| j¡ d S )Nr(   TrÖ  )ÚioÚBytesIOrÒ  r.   r0  r   r   rÔ  r„   rÆ  r“   rI   râ   r   r   r   Útest_non_regular_file_srcœ	  s    *Hz.TestZeroCopySendfile.test_non_regular_file_srcc              
   C   s´   t tdƒ–}t ¡ n}|  t¡ |  ||¡ W d   ƒ n1 sB0    Y  t ||¡ | 	d¡ |  
| ¡ | j¡ W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  d S )NrF   r   )r.   r   rê  rë  r   r   rÔ  r„   rÆ  Úseekr“   rH   rÒ  râ   r   r   r   Útest_non_regular_file_dst¥	  s    
*
z.TestZeroCopySendfile.test_non_regular_file_dstc              
      sÂ   ‡ ‡fdd„}g ‰ t j‰tjjdd|dr |  ¡ J\}}|  t¡}t 	||¡ W d   ƒ n1 sf0    Y  W d   ƒ n1 s„0    Y  W d   ƒ n1 s¢0    Y  |  
|jjtj¡ d S )Nc                     s,   ˆ sˆ   d ¡ ˆ| i |¤ŽS ttjdƒ‚d S )Nrâ  )rO   r   r   ÚEBADFr   ©r'  Zorig_sendfiler   r   rU   ¯	  s    
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfilerè  T)rU  r#  )r    rU   ræ   rG  rH  rÂ  r   r   r„   ré  r“   r¯   r   rï  )ry   rU   rb   rc   r´   r   rð  r   Útest_exception_on_second_call®	  s    
ÿfz2TestZeroCopySendfile.test_exception_on_second_callc              	   C   s‚   t jjdtdH}|  ¡  \}}t ||¡ W d   ƒ n1 s@0    Y  W d   ƒ n1 s^0    Y  |  tt	dd| j
¡ d S )Núos.fstatrÝ  TrÖ  )ræ   rG  rH  r   rÂ  r„   ré  r“   rI   r0  rÒ  ©ry   rÌ  rb   rc   r   r   r   Útest_cant_get_sizeÀ	  s
    <z'TestZeroCopySendfile.test_cant_get_sizec              	   C   s’   t j ¡ }d|_t jjd|dH}|  ¡  \}}t ||¡ W d   ƒ n1 sP0    Y  W d   ƒ n1 sn0    Y  |  t	t
dd| j¡ d S )Ni  rò  ©rT  TrÖ  )ræ   rG  ÚMockÚst_sizerH  rÂ  r„   ré  r“   rI   r0  rÒ  ©ry   rG  rÌ  rb   rc   r   r   r   Útest_small_chunksÊ	  s    
<z&TestZeroCopySendfile.test_small_chunksc              	   C   s˜   t j ¡ }| jd |_t jjd|dH}|  ¡  \}}t ||¡ W d   ƒ n1 sV0    Y  W d   ƒ n1 st0    Y  |  	t
tdd| j¡ d S )Ni  @rò  rõ  TrÖ  )ræ   rG  rö  r¹  r÷  rH  rÂ  r„   ré  r“   rI   r0  rÒ  rø  r   r   r   Útest_big_chunk×	  s    
<z#TestZeroCopySendfile.test_big_chunkc                 C   sÂ   t jjdtdž}|  ttjtt¡ |j	d d }|  
|tj t¡¡ t t¡ ttddd |  tjtd ¡ |  ttjttd ¡ |j	d d }|  
|d	¡ W d   ƒ n1 s´0    Y  d S )
Nrè  rÝ  r   r   s   helloTrÖ  Ú3i  € )ræ   rG  rH  rß  r   r„   r•  r   r0  rË  r“   r    r,   Úgetsizer   r_   r2   rw   )ry   rÌ  Ú	blocksizer   r   r   Útest_blocksize_argä	  s"    ÿÿ
ÿz'TestZeroCopySendfile.test_blocksize_argc              
   C   sî   zàt jj| jttjdƒdr}|  ¡ J\}}|  t	¡ t
 ||¡ W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  W d   ƒ n1 s”0    Y  t j | j¡}t
 tt¡ W d   ƒ n1 sÎ0    Y  W dt
_ndt
_0 d S )Nrâ  rÝ  T)ræ   rG  rH  rÞ  r   r   ÚENOTSOCKrÂ  r   r   r„   ré  r•  r   r0  Ú_USE_CP_SENDFILEró  r   r   r   Útest_file2file_not_supportedö	  s    
þH z1TestZeroCopySendfile.test_file2file_not_supportedN)r{   r|   r}   rÞ  rÔ  rì  rî  rñ  rô  rù  rú  rþ  r  r   r   r   r   rç  •	  s   		
rç  z
macOS onlyc                   @   s   e Zd ZdZdd„ ZdS )ÚTestZeroCopyMACOSzposix._fcopyfilec                 C   s   t  ||tj¡S r   )r„   Ú_fastcopy_fcopyfileÚposixÚ_COPYFILE_DATArâ   r   r   r   rÔ  
  s    zTestZeroCopyMACOS.zerocopy_funN)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 )ÚTestGetTerminalSizec                 C   s(   t  ¡ }|  |jd¡ |  |jd¡ d S )Nr   )r„   Úget_terminal_sizer   ÚcolumnsÚlines)ry   rA   r   r   r   Útest_does_not_crash
  s    z'TestGetTerminalSize.test_does_not_crashc                 C   sœ   t  ¡ &}d|d< |d= t ¡ }W d   ƒ n1 s40    Y  |  |jd¡ t  ¡ &}|d= d|d< t ¡ }W d   ƒ n1 s€0    Y  |  |jd¡ d S )NZ777ÚCOLUMNSÚLINESi	  Z888ix  )r   rN  r„   r  r“   r  r	  ©ry   rP  rA   r   r   r   Útest_os_environ_first
  s    
&
&z)TestGetTerminalSize.test_os_environ_firstc                 C   s`   t  ¡ (}d|d< d|d< t ¡ }W d   ƒ n1 s60    Y  |  |jd¡ |  |jd¡ d S )Nrf  r  Zyyyr  r   )r   rN  r„   r  r   r  r	  r  r   r   r   Útest_bad_environ.
  s    
&z$TestGetTerminalSize.test_bad_environz
not on ttyr  zneed os.get_terminal_size()c              
   C   s¤   zt  ddg¡ ¡  ¡ }W n$ ttt jfy>   |  d¡ Y n0 t|d ƒt|d ƒf}t	 
¡ $}|d= |d= t ¡ }W d   ƒ n1 sŠ0    Y  |  ||¡ d S )NZsttyrA   zstty invocation failedri   r   r  r  )rn   r×  rÛ  rq   r¬   r"  rÙ  r/  rr   r   rN  r„   r  r“   )ry   rA   r  rP  rö   r   r   r   Útest_stty_match6
  s    
ÿ

&z#TestGetTerminalSize.test_stty_matchc              
   C   s  t  ¡ ô}|d= |d= t  tdd ¡ tjdd}W d   ƒ n1 sF0    Y  |  |jd¡ |  |jd¡ t	t
jdƒJ}t  td|¡ tjd	d}W d   ƒ n1 sª0    Y  W d   ƒ n1 sÈ0    Y  |  |jd
¡ |  |jd¡ W d   ƒ n1 s0    Y  d S )Nr  r  Ú
__stdout__)é
   é   )Úfallbackr  r  r)   )é   é(   r  r  )r   rN  rW  rl   r„   r  r“   r  r	  r.   r    Údevnull)ry   rP  rA   rD   r   r   r   Útest_fallbackN
  s    
*ÿHz!TestGetTerminalSize.test_fallbackN)r{   r|   r}   r
  r  r  ræ   rç   r    Úisattyrl   r  r^   rZ   r  r  r   r   r   r   r  
  s   
ÿr  c                   @   s   e Zd Zdd„ ZdS )ÚPublicAPITestsc                 C   sP   |   ttdƒ¡ g d¢}ttdƒs,tjdkr6| d¡ |  ttjƒt|ƒ¡ d S )NÚ__all__)rÆ  r•  rO  r\  r„  r‡  rñ   ri  rx   r   rš  Ú	ExecErrorr   r   r   r   r   r   r
   r   r  r#  r  r  r   Ústatvfsr  r  )	r   rZ   r„   r    rR   rO   r“   r  r  )ry   Z
target_apir   r   r   Útest_module_all_attributee
  s
    
z(PublicAPITests.test_module_all_attributeN)r{   r|   r}   r  r   r   r   r   r  b
  s   r  Ú__main__)F)F)Præ   Zunittest.mockr„   r[   rl   r¿   r    Zos.pathr   r%   r  rn   r7   r9   rÏ  rê  r   r   r   r   r   r   r   r	   r
   r   r   r   r¯  rÌ  r  ÚImportErrorrö  r   Ztest.supportr   r   r   r0  r™  rš  ré   r  r¢  r£  rk   ræ  rè  rå  r£   r   r'   r2   rE   rI   rP   rf   ZSUPPORTS_SENDFILErs   rt   ZTestCaser~   rê   rI  r¤  r  r0  rf  rg  rœ  r¸  r·  rÑ  rè   rç  r  r  r  r{   Úmainr   r   r   r   Ú<module>   s¤   8




	  
  [      tP <
 s\JdvN
