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 )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,   ZcontentÚbinaryÚfpr   r   r   Ú
write_fileE   s    
r2   c                 C   s†   dd„ }t |dƒ}d dd„ t|ƒD ƒ¡}t| dƒ*}|||ƒD ]}| |¡ q@W d  ƒ n1 sd0    Y  tj | ¡|ks‚J ‚dS )	zBCreate a test file with an arbitrary size and random text content.c                 s   s2   | |ksJ ‚| |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(   N)Úminr-   Úranger.   r/   r    r,   Úgetsize)r,   Úsizer5   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileQ   s    

ÿ*rF   c                 C   sT   t | tƒrtjj| Ž } t| |r"dndƒ}| ¡ W  d  ƒ S 1 sF0    Y  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,   r0   r1   r   r   r   Ú	read_filec   s    
rJ   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   rQ   o   s    rQ   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
   0123456789rG   r   é   T)Úhasattrr    ÚtempfileÚNamedTemporaryFileÚgetcwdrS   r/   r.   ÚfilenorV   r   r   Úunlink)ÚsrcnameÚdstnamerE   ÚsrcÚdstÚinfdÚoutfdr   r   r   Úsupports_file2file_sendfile{   sH    
(

ù



ûF


ý


rg   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
    rt   c                   @   s   e Zd Zddd„ZdS )ÚBaseTestNc                 C   s$   t j|t ¡ d}|  tj|¡ |S )zjCreate a temporary directory that will be cleaned up.

        Returns the path of the directory.
        )ÚprefixrX   )r\   Úmkdtempr    r^   Ú
addCleanupr   Úrmtree)Úselfrv   Údr   r   r   rw   ©   s    zBaseTest.mkdtemp)N)Ú__name__Ú
__module__Ú__qualname__rw   r   r   r   r   ru   §   s   ru   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)rw   r    r,   r-   Úmkdirr2   ÚfsencodeÚassertIsInstanceÚbytesÚshutilry   )rz   Ú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 )	NrX   Úlinkc                     s   ˆ   | ¡ d S r   ©rP   ©r   ©Úerrorsr   r   ÚonerrorÉ   s    z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror©r   rj   r   rZ   )rw   r    r,   r-   r   ÚsymlinkÚassertRaisesr   r…   ry   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsrO   rƒ   ©rz   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)rw   r    r,   r-   r   r2   r   r…   ry   ÚassertFalser’   r‘   ©
rz   r†   rš   r›   rœ   r{   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 )	NrX   rˆ   c                     s   ˆ   | ¡ d S r   r‰   rŠ   r‹   r   r   r   ó   s    z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorrŽ   rj   r   rZ   )rw   r    r,   r-   r   Ú_winapiÚCreateJunctionrx   r   r`   r   r   r…   ry   r‘   r’   r“   r”   r•   r–   rO   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™   )rw   r    r,   r-   r   r2   r¤   r¥   r…   ry   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©rX   T©Úignore_errorsZtstfileÚ z*.*c                     s   ˆ   | ¡ d S r   r‰   rŠ   r‹   r   r   r   '  s    z.TestRmTree.test_rmtree_errors.<locals>.onerrorrŽ   rZ   r   rj   )r\   Úmktemprw   r   ÚFileNotFoundErrorr…   ry   r2   r    r,   r-   ÚNotADirectoryErrorÚassertInÚ	exceptionÚfilenamer‘   r’   r”   r•   r–   Úscandirrƒ   Úrmdir)rz   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   rx   r…   ry   r,   r-   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr”   )rz   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 )NrZ   r   rj   r   )r¼   r    r`   r”   r½   r³   r¾   r–   rM   r¯   r   r‘   Ú
issubclassr   )rz   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…   ry   )rz   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_fdrM   Úsupports_fdÚsupports_follow_symlinksr‘   r…   Ú_use_fd_functionsry   Úavoids_symlink_attacksrw   r,   r-   r   Ú_rmtree_safe_fdÚ	Exceptionr   r¡   )rz   rÕ   Útmp_dirr{   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\   Úmkstemprw   r    Úcloser   r®   r…   ry   Úremove)rz   Ú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…   ry   ©rz   rc   rd   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…   ry   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¶   ÚskipIfrm   Úplatformr[   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)rw   r    r,   r-   rx   r…   ry   Údirnamer2   r   Úcopytreer‘   ÚisfilerN   rJ   r”   ©rz   Ú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)rw   rx   r…   ry   r2   r    r   r,   r-   rò   r‘   ró   rN   rJ   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 )Nrc   rd   Úsubzfile.txtr€   rˆ   zsub/linkÚlchmodÚlchflagsÚ	UF_NODUMPT©ÚsymlinksÚntz\\?\é   )rw   r    r,   r-   r   r2   r   r[   rý   rÀ   ÚS_IRWXUÚS_IRWXOrþ   rÿ   rÍ   r…   rò   r‘   rO   ÚreadlinkrS   Ú
startswithr”   rÁ   Úst_flags)
rz   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 )Nri   r  z.py)r    r,   r-   rN   rr   rP   Úsplitext)rc   ÚnamesrR   rS   r,   r   r   r   Ú_filter1  s    ÿz8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r    r,   r-   r’   rw   r2   r   r…   Úignore_patternsrò   r‘   r¡   ry   rñ   )rz   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   )rP   rƒ   ÚstrÚlistr”   r•   Úset)rc   r  rS   ©Zinvokationsrz   r   r   Ú_ignoreX  s    
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorerì   r  r   é	   )r    r,   r-   r’   rw   r   r2   r…   rò   r‘   ÚpathlibÚPathr  r²   rƒ   ÚDirEntryr”   r•   )rz   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¨   rj   )rw   r    r,   r-   r   rx   r…   ry   rÄ   r2   r\   r   rò   r”   rÀ   rÁ   rr   )rz   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)rw   r    r,   r-   rx   r…   ry   rñ   ÚPermissionErrorÚside_effectr   r   rò   )rz   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€   )rP   rƒ   r  r”   r    r,   r-   )rº   r»   ©rd   Úflagrz   rc   r   r   Úcustom_cpfunŸ  s
    
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr¨   r€   r)   ©Úcopy_functionrj   )rw   r\   r¬   r.   r    r,   r-   rÝ   r…   rò   r”   r•   )rz   r)  rE   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   rj   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•   Úfailry   )rz   r  ÚpipeÚerŒ   rc   rd   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‰   ©rc   rd   ©Zcopiedr   r   Ú_copyÐ  s    z6TestCopyTree.test_copytree_special_func.<locals>._copyr*  rZ   )
rw   r    r,   r-   r2   r   r…   rò   r”   r•   )rz   rõ   rö   r8  r   r7  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   )rw   r    r,   r-   r   r   r2   r   r   r…   rò   ÚassertNotInrM   r¯   ©rz   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   r:  )rw   r    r,   r-   r   r.   r   r…   rò   r¡   rO   r¯   rM   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€   )rw   rx   r…   ry   r    r,   r-   r2   rò   r”   rM   )rz   rõ   rö   rc   Ú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)rw   rx   r…   ry   r    r,   r-   Úmakedirsr2   rò   r”   rM   )rz   Úbase_dirrõ   rö   rc   rB  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è   r[   r    r5  r9  r>  r@  rC  rG  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  )rw   r    r,   r-   r2   r   rÄ   rÀ   r  ÚS_IRWXGr  ÚassertNotEqualrÁ   r…   Úcopymoder”   rS   ©rz   rÙ   rc   rd   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€   rK  rL  rM  F©Úfollow_symlinks)rw   r    r,   r-   r2   r   rÄ   rÀ   r  rN  rý   r  r…   rP  r”   rÍ   rÁ   rO  rQ  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 rS  )rw   r    r,   r-   r2   r   r…   rP  rQ  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€   rK  rL  Úquxg      E@rý   rþ   rÿ   TrT  F©Úst_atimeÚst_mtimerj   r  gš™™™™™¹?)rw   r    r,   r-   r2   rÀ   ÚutimerZ  r[  rO  r   r[   rý   r  rþ   rÿ   rÍ   r…   ÚcopystatrÁ   rÔ   ÚassertLessEqualr   r”   r  r‘   Úabs)
rz   rÙ   rc   rd   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 )NTrT  c                   s   ˆ ˆ_ ˆ‚d S r   )r   )r,   ÚflagsrU  ©ÚerrÚexr   r   Ú_chflags_raiser  s    zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser©r   )rj  rl  r   ri  r   Úmake_chflags_raiserš  s    zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)rw   r    r,   r-   r2   rc  r   rd  re  r…   r]  r   r   )rz   r´   r   rf  rn  Zold_chflagsrj  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€   rK  úuser.fooó   42zuser.baró   43ÚEPERMc                    s&   |dkrˆ‚nˆ | ||fi |¤Ž d S )Nrp  r   )Úfnamera  Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_fooÅ  s    z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrT  c                   s    | ˆkrt tjdƒ‚ˆ | |dS )NzOperation not supportedrT  )r   r   re  )rt  rU  )Úorig_listxattrrc   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)rw   r    r,   r-   r2   r…   Ú
_copyxattrÚsetxattrr”   rL   Ú	listxattrÚgetxattrrÞ   r   r   rs  r¯   rÄ   r]  )rz   rÙ   rd   rx  rz  ZsrcroZdstror   )ry  rv  rw  rc   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€   rL  ztrusted.foorq  rr  FrT  rK  rX  )rw   r    r,   r-   r2   r   r|  r…   r{  r”   r~  r   r   )rz   rÙ   rc   r	  rd   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í   rg  )rw   r2   r    r,   r-   )rz   Úmethodrt  r´   r   Útmpdir2rf  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Á   )rz   r   rf  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€   rK  rL  rý   TrT  F)rw   r    r,   r-   r2   r   r[   rý   rÀ   r  r  r…   r…  r¡   rO   r”   rJ   rÞ   r‘   r  rÍ   rÁ   )rz   rÙ   rc   rd   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 )NrY  rj   rc  r  )r„  r…   Úcopy2r‘   r    r,   r’   rÀ   r”   rÁ   r^  r   r[   )rz   r   rf  Z
file1_statZ
file2_statra  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€   rK  rL  rý   rþ   rÿ   TrT  FrY  rj   r  )rw   r    r,   r-   r2   r   r[   rý   rÀ   r  r  rþ   rÿ   rÍ   r…   rˆ  r¡   rO   r”   rJ   rÞ   r‘   r  r\  rÔ   r^  r   rÁ   rO  r  )	rz   rÙ   rc   rd   r	  r  r`  r  ra  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€   rK  rp  rq  )rw   r    r,   r-   r2   r|  r…   rˆ  r”   r~  rÞ   )rz   rÙ   rc   rd   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€   rK  )	r…   r…  rˆ  rw   r    r,   r-   r2   r”   )rz   rÊ   rõ   rö   rc   rB  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…  ©rz   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)
rw   r    r,   r-   r2   rm   rê   r#  ÚIsADirectoryErrorr   )rz   Z	copy_funcrõ   Úsrc_filer›   rd   rj  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 )Nrc   rd   r
  rˆ   r€   FrT  )rw   r    r,   r-   r2   r   r…   Úcopyfiler‘   rO   r”   r  r¡   )rz   rÙ   rc   rd   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(): %srH   Tr©   )r    r   r   r,   r-   r.   r/   rˆ   r#  r0  r   r…   r   r–  r”   rI   rÞ   ry   )rz   rc   rd   rE   r4  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˜  rH   Tr©   )r    r   r   r,   r-   r.   r/   r   r   r…   r   r–  r”   rI   rÞ   ry   )rz   rc   rd   rE   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#  r0  r   r…   ÚSpecialFileErrorr–  r1  Ú__file__rÞ   )rz   r4  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 )NrK  r€   )rw   r    r,   r-   r2   r…   r–  r‘   r’   r”   rJ   )rz   rõ   rö   Údst_filer•  rB  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&  )rw   r    r,   r-   r2   r   r   r…   r–  r   r”   rJ   )rz   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’  )	rw   r    r,   r-   r2   r   r­   r…   r–  )rz   rõ   r•  rd   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‘  )rw   r    r,   r-   r2   rm   rê   r#  r”  r   r…   r–  )rz   rõ   r•  r›   rd   rj  r   r   r   Útest_copyfile_copy_dirÿ  s    

zTestCopy.test_copyfile_copy_dirN))r|   r}   r~   r   ræ   rR  rç   rè   r[   r    rV  ré   rW  rb  r   ro  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   rJ    sh   

(ÿý

?ÿ



"





rJ  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ú.tarrH   )Ú_create_filesrw   r    r³   r,   rñ   r-   Úbasenamer   Ú
change_cwdÚabspathr   r”   r‘   ró   ÚtarfileZ
is_tarfiler.   ÚassertCountEqualÚgetnames)	rz   Úroot_dirrF  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+   )rz   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   rg  rf  rü   Zfile3Zsub2Úouter)rw   r    r,   r-   rE  r2   r   )rz   rF  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-   rw   r   r”   r‘   ró   ro   Ú
check_callÚDEVNULLrº  )rz   r³  rF  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¬  rw   r    r³   r,   rñ   r-   r­  r   r®  r¯  r   r”   r‘   ró   ÚzipfileÚ
is_zipfileÚZipFiler±  Únamelist)	rz   r³  rF  rƒ  r´  rµ  r¶  rR   Ú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-   rw   r   r”   r‘   ró   ro   rÂ  rÃ  rÍ  rÏ  rÐ  rL   )
rz   r³  rF  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-   rw   r   r”   r‘   ró   r   r®  ro   Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder0  r2  Úformat)	rz   r³  rF  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¦  rg  )rw   r    r,   r-   r   Ú
ValueErrorr   )rz   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-   rw   r   r‘   ró   )rz   rå  rä  r³  rF  r¶  rR   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-   rw   rç  rè  ré  rê  r   r®  r   r‘   ró   r°  r.   Z
getmembersr”   ÚuidÚgidrÝ   )	rz   r³  rF  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>._breaksrg  úxxx file)r³  )r    r^   r   r   rw   rØ   r”   r   )rz   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©	rw   r   r®  r”   r   r‘   r    r,   ró   ©rz   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 )Nrg  rj   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   )rj   rZ   )rj   rZ   r   c                   S   s   t S r   rü  r   r   r   r   rþ  $  r6   rõ  c                 S   s   g | ]\}}|‘qS r   r   ©r<   rS   Ú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<  )rz   Ú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   )rz   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Ý  rg  )r¬  rQ   rÞ   r    r,   r-   rw   r   r   r”   r   r…   Ú	ReadErrorr   rà  )rz   rÝ  Ú	converterr   r³  rF  Ú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)rz   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 )Nrj   ú	stuff.booÚxx)r”   )r±   Úextract_dirÚextrarŽ  r   r   Ú_boom  s    z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r  rj   r  r  ZBoo2r«   )	r   r   r   r   r	   r
   r¯   r<  r”   )rz   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é   rl   rt   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   rs   ZassertGreaterr3   r  ÚassertGreaterEqualr   )rz   Úusagera  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±   rz   r   r   Úcheck_chown®  s
    
z(TestMisc.test_chown.<locals>.check_chown)rî  r   )NN)rw   r\   r¬   r2   r   rà  r…   r$  ÚLookupErrorr  r    ÚgetuidÚgetgidré  rê  rç  rè  ÚKeyError)rz   rñ   rí  rî  r+  r%  rå  r   r*  r   Ú
test_chown•  sR    
(,,*,



zTestMisc.test_chownN)r|   r}   r~   rç   rè   r[   r…   r#  ræ  r    r0  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)rv   z.Exe©rX   rv   Úsuffixz.EXE)rw   Útemp_dirr\   r]   Ú	temp_filer    rÄ   rS   rÀ   ÚS_IXUSRrx   rÝ   r,   rr   rX   Ú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  r7  rX   r”   r5  rS   ©rz   rB  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  r5  rS   r4  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,   rr   rX   r-   r7  r   r®  r…   r  r4  r”   ÚassertIsNone)rz   rF  Útail_dirÚrelpathrB  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ñ   rX   r   r®  r…   r  r7  rm   rê   r”   r-   r9  r@  )rz   rF  rB  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Ä   r5  rS   rÀ   rÂ   ÚaccessÚW_OKr0  r…   r  r7  rX   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,   rr   rX   r   r®  r…   r  r7  r”   r-   )rz   rF  rA  rB  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  rX   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  r7  rX   r”   r5  rS   r:  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   ÚEnvironmentVarGuardr8  r…   r  r7  r”   r5  rS   ©rz   ÚenvrB  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«   rN  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   rO  rç   rH  rI  rX   Ú	swap_attrr    r®  r…   r  r7  r@  rP  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“  rN  rS  TrT  rW  )r    r,   r­  r5  rS   rm   rê   r9  r*   r„   r‚   r-   r   rO  Úpathseprç   rH  rI  rX   rX  r…   r  r7  r@  r®  r”   )rz   Zexpected_cwdr9  rQ  rB  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 )NrN  rS  T)r$  rV  rW  rT  r«   )r   rO  Úpoprç   rH  rI  rà  rX  r    rX   r…   r  r7  r”   r5  rS   rP  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  rN  r«   )r    r,   rñ   rX   r   r®  rO  r8  r…   r  r7  r@  )rz   rF  rQ  rB  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 rM  )r   rO  r\  r…   r  r7  r@  rP  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ÚTmp2r2  r   ÚPATHEXTr  )r\   r]   r4  r    rÄ   rS   rÀ   r6  rx   rÝ   r,   r­  r  r   rO  r…   r  r”   ©rz   r:  Ztemp_filexyzZprogramrQ  rB  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`  ra  r2  r   ú;rb  r  )r\   r]   r4  rx   rÝ   r    r,   r­  rS   r  r   rO  r…   r  r”   rc  r   r   r   Útest_pathext_with_empty_str~  s    ÿ
z%TestWhich.test_pathext_with_empty_strN)r|   r}   r~   r;  r>  r?  rC  rD  rç   ré   r[   r    r¹   rH  rI  rJ  rè   rm   rê   rL  rR  rY  r[  r]  r^  r_  rd  rf  r   r   r   r   r1  Ô  s2   ÿ
ÿ

r1  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   )
r1  r;  r    r‚   rX   r7  r5  rS   r9  r:  rŽ  r   r   r   r;    s    
zTestWhichBytes.setUpN)r|   r}   r~   r;  r   r   r   r   rg    s   rg  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&  )
rw   rõ   rö   r    r,   r-   r•  rž  r.   r/   )rz   r±   rE   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 ©NrG   )	r.   rI   r…   Úmover”   r¡   r    r,   r’   )rz   rc   rd   Úreal_dstrE   Úcontentsr   r   r   Ú_check_move_file¤  s    &.zTestMove._check_move_filec                 C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S r   )	rL   r    rM   r…   rj  r”   r¡   r,   r’   )rz   rc   rd   rk  rl  r   r   r   Ú_check_move_dir¬  s    zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )rm  r•  rž  rŽ  r   r   r   Útest_move_file²  s    zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )rm  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•  rm  rö   rž  )rz   rc   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ö   rm  r•  rž  ©rz   rd   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   )ro  rŽ  r   r   r   Útest_move_file_other_fsÄ  s    z TestMove.test_move_file_other_fsc                 C   s   |   ¡  d S r   )rp  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¬   rw   rn  rõ   r   ry   ©rz   rö   r   r   r   Útest_move_dirÎ  s    zTestMove.test_move_dirc                 C   s   |   ¡  d S r   )rw  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   )rn  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   )ry  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   )rn  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   )rn  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   rj  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 ©NrK  )r    r,   r-   rõ   r   r…   r   rj  rr  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   ry   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   ry   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…   rj  rž  r‘   rO   Úsamefilerr  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…   rj  rö   r‘   rO   r‡  )rz   r±   rd   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 ©NrL  rK  rM  )r    r,   r-   rõ   r   rö   r…   rj  r‘   rO   r”   Úrealpath©rz   rc   rd   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…   rj  r‘   rO   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…   rj  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…   rj  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‰   r6  ©Zmovedr   r   r8  H  s    z7TestMove.test_move_file_special_function.<locals>._copyr*  rj   )r…   rj  r•  rö   r”   r•   ©rz   r8  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‰   r6  r‘  r   r   r8  P  s    z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r*  r   )r   r¿   r    r,   r-   rõ   r…   rj  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   )rw   rõ   r    r,   r-   rñ   r­  ÚupperrO  r…   rj  r‘   rN   r³   rv  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…   rj  Ú
TESTFN_DSTr¡   rM   r™  r   r¿   r,   r-   r’   ry   rŽ  r   r   r   Útest_move_dir_permission_deniedh  s,    

û
z(TestMove.test_move_dir_permission_deniedN)+r|   r}   r~   r;  rm  rn  ro  rp  rq  rs  r'   rt  ru  rw  rx  ry  rz  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   rh  ™  sh   	




		


	ÿþürh  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)rz   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__‘  s    zTestCopyFile.Faux.__init__c                 G   s   dS )Nr«   r   )rz   r   r   r   r   rI   ”  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Ÿ  )rz   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__˜  s
    zTestCopyFile.Faux.__exit__)FT)
r|   r}   r~   r¡  r¤  r¥  r   rI   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 )NrH   c                 S   s   | dkrt dƒ‚dsJ ‚d S )NÚsrcfilezCannot open "srcfile"r   rm  ©r±   rE  r   r   r   Ú_open   s    z4TestCopyFile.test_w_source_open_fails.<locals>._openr.   r«  Údestfile)rH   )r   rX  r…   r   r   r–  ©rz   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 )NrH   c                    s(   | dkrˆ S | dkrt dƒ‚ds$J ‚d S )Nr«  r®  úCannot open "destfile"r   rm  r¬  ©r«  r   r   r­  ­  s
    z2TestCopyFile.test_w_dest_open_fails.<locals>._openr.   r«  r®  r   rj   )r±  )rH   )rª  r   rX  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 )NTrH   c                    s$   | dkrˆS | dkrˆ S ds J ‚d S ©Nr«  r®  r   r   r¬  ©r®  r«  r   r   r­  À  s
    z3TestCopyFile.test_w_dest_close_fails.<locals>._openr.   r«  r®  r   rj   )r£  )rH   )rª  r   rX  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 )
NTrH   c                    s$   | dkrˆS | dkrˆ S ds J ‚d S r´  r   r¬  rµ  r   r   r­  Ö  s
    z5TestCopyFile.test_w_source_close_fails.<locals>._openr.   r«  r®  r   )rH   )rª  r   rX  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   )rF   r   ÚFILESIZE©Úclsr   r   r   Ú
setUpClassê  s    zTestCopyFileObj.setUpClassc                 C   s   t  t¡ t  t¡ d S r   )r   r`   r   r1  r»  r   r   r   ÚtearDownClassî  s    
zTestCopyFileObj.tearDownClassc                 C   s   t  t¡ d S r   ©r   r`   r1  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 ©NrG   r(   ©r.   r   r1  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 ri  )r.   r”   rI   )rz   rc   rd   Ú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   r1  rã   r   r   r   Útest_content	  s    *zTestCopyFileObj.test_contentc                 C   sP   |   ¡ 4\}}t ||¡ |jr$J ‚|jr.J ‚W d   ƒ n1 sB0    Y  d S r   )rÃ  r…   rÇ  Úclosedrã   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sBJ ‚|  |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 sn0    Y  |jr„J ‚|  |t¡ d S )	Nzshutil._copyfileobj_readintor   rZ   i   FrW   s   foor   )rç   rH  rI  r…   r–  r   r1  Úcalledr”   Ú	call_argsr\   r]   r    r^   r/   rS   rx   r   r`   rÆ  )rz   ÚmrE   rt  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    rS   rÐ  r   r   r   r   r¹  ç  s   


r¹  c                   @   s’   e Zd 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 ) Ú_ZeroCopyFileTestz#Tests common to all zero-copy APIs.i    r6   r«   c                 C   sX   t t| jƒ ttdƒ.}| ¡ | _t| jƒ| jks6J ‚W d   ƒ n1 sJ0    Y  d S ri  )rF   r   rº  r.   rI   ÚFILEDATAr•   )r¼  rE   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)rz   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¡ |   ¡ V\}}tj d¡}t	 
tt¡ W d   ƒ n1 sŠ0    Y  |jržJ ‚W d   ƒ n1 s²0    Y  d S )NT©r0   zshutil.copyfileobj)rÃ  r×  r”   rJ   r1  rÕ  rç   rH  rI  r…   r–  r   rÍ  )rz   rc   rd   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Ù  )
rx   rØ  rÃ  r   rØ   r×  r”   rJ   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±   )rz   rS   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 )Nrc   rd   c                      s
   t  ˆ ¡S r   ©r   r`   r   )ra   r   r   rþ  q	  r6   z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      s
   t  ˆ ¡S r   rÞ  r   )rb   r   r   rþ  r	  r6   r(   rG   TrÙ  r6   )r   rx   r.   r×  r”   rJ   rã   r   )rb   ra   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ç   rH  rI  Ú
PATCHPOINTÚZeroDivisionErrorr   r…   r–  r   r1  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ç   rH  rI  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ç   rH  rI  rá  r   r   ÚENOSPCrÃ  r   r×  rã   r   r   r   Útest_filesystem_fullŒ	  s
    

ÿz&_ZeroCopyFileTest.test_filesystem_fullN)r|   r}   r~   Ú__doc__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)rz   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.   r1  r   r   r×  r…   rÇ  r”   rJ   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 )NrG   r   )r.   r   rî  rï  r   r   r×  r…   rÇ  Úseekr”   rI   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  ˆ s´J ‚|  
|jjtj¡ d S )Nc                     s,   ˆ sˆ   d ¡ ˆ| i |¤ŽS ttjdƒ‚d S )Nrå  )rP   r   r   ÚEBADFr   ©r(  Zorig_sendfiler   r   rV   ¯	  s    
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfilerì  T)rV  r$  )r    rV   rç   rH  rI  rÃ  r   r   r…   rí  r”   r°   r   ró  )rz   rV   rc   rd   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R}|  ¡ *\}}t ||¡ |js6J ‚W d   ƒ n1 sJ0    Y  W d   ƒ n1 sh0    Y  |  t	t
dd| j¡ d S )Núos.fstatrà  TrÙ  )rç   rH  rI  r   rÃ  r…   rí  rÍ  r”   rJ   r1  rÕ  ©rz   rÏ  rc   rd   r   r   r   Útest_cant_get_sizeÀ	  s
    Fz'TestZeroCopySendfile.test_cant_get_sizec              	   C   sœ   t j ¡ }d|_t jjd|dR}|  ¡ *\}}t ||¡ |jsFJ ‚W d   ƒ n1 sZ0    Y  W d   ƒ n1 sx0    Y  |  	t
tdd| j¡ d S )Ni  rö  ©rU  TrÙ  )rç   rH  ÚMockÚst_sizerI  rÃ  r…   rí  rÍ  r”   rJ   r1  rÕ  ©rz   rH  rÏ  rc   rd   r   r   r   Útest_small_chunksÊ	  s    
Fz&TestZeroCopySendfile.test_small_chunksc              	   C   s¢   t j ¡ }| jd |_t jjd|dR}|  ¡ *\}}t ||¡ |j	sLJ ‚W d   ƒ n1 s`0    Y  W d   ƒ n1 s~0    Y  |  
ttdd| j¡ d S )Ni  @rö  rù  TrÙ  )rç   rH  rú  rº  rû  rI  rÃ  r…   rí  rÍ  r”   rJ   r1  rÕ  rü  r   r   r   Útest_big_chunk×	  s    
F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ç   rH  rI  râ  r   r…   r–  r   r1  rÎ  r”   r    r,   rA   r   r`   r2   rx   )rz   rÏ  Ú	blocksizer   r   r   Útest_blocksize_argä	  s"    ÿÿ
ÿz'TestZeroCopySendfile.test_blocksize_argc              
   C   s  t js
J ‚zþtjj| jttjdƒd|}|  	¡ J\}}|  
t¡ t  ||¡ W d   ƒ n1 sb0    Y  W d   ƒ n1 s€0    Y  |js”J ‚W d   ƒ n1 s¨0    Y  t jr¼J ‚tj | j¡&}t  tt¡ |jrâJ ‚W d   ƒ n1 sö0    Y  W dt _ndt _0 d S )Nrå  rà  T)r…   Ú_USE_CP_SENDFILErç   rH  rI  rá  r   r   ÚENOTSOCKrÃ  r   r   rí  rÍ  r–  r   r1  r÷  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 )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)r…   Úget_terminal_sizer!  ÚcolumnsÚlines)rz   rB   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 )z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi	  Z888ix  )r   rO  r…   r
  r”   r  r  ©rz   rQ  rB   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 )Nrg  r  Zyyyr  r   )r   rO  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 )	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.
        ZsttyrB   zstty invocation failedrj   r   r  r  N)ro   rØ  rÜ  rr   r­   r#  rÚ  r0  rs   r   rO  r…   r
  r”   )rz   rB   r	  rQ  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   rO  rX  rm   r…   r
  r”   r  r  r.   r    Údevnull)rz   rQ  rB   rE   r   r   r   Útest_fallbackN
  s    
*ÿHz!TestGetTerminalSize.test_fallbackN)r|   r}   r~   r  r  r  rç   rè   r    Úisattyrm   r  r_   r[   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   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–  rP  r]  r…  rˆ  rò   rj  ry   r   r›  Ú	ExecErrorr   r   r   r   r   r   r
   r   r  r$  r  r
  r   Ústatvfsr  r  )	r‘   r[   r…   r    rS   rP   r”   r  r  )rz   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   r  b
  s   r  Ú__main__)F)F)Prç   Zunittest.mockr…   r\   rm   rÀ   r    Zos.pathr   r%   r  ro   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   r1  rš  r›  rê   r  r£  r¤  rl   rç  ré  ræ  r¤   r   r'   r2   rF   rJ   rQ   rg   ZSUPPORTS_SENDFILErt   ru   ZTestCaser   rë   rJ  r¥  r  r1  rg  rh  r  r¹  r¸  rÔ  ré   rë  r  r	  r  r|   Úmainr   r   r   r   Ú<module>   s¤   8




	  
  [      tP <
 s\JdvN
