a
    ¼3j¸ž ã                   @   sH  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$ 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Z/W n eyz   dZ/Y n0 zd dl0Z0W n ey    dZ0Y n0 dd„ Z1dd„ Z2dAdd„Z3dd„ Z4dBdd„Z5dd„ Z6dd„ Z7e7ƒ Z8dd„ Z9G 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;ƒZ@G d*d+„ d+e:e j;ƒZAG d,d-„ d-eAƒZBG d.d/„ d/e:e j;ƒZCG d0d1„ d1e j;ƒZDG d2d3„ d3e j;ƒZEG d4d5„ d5eFƒZGe  He8 d6¡G d7d8„ d8eGe j;ƒƒZIe  He* d9¡G d:d;„ d;eGe j;ƒƒZJG d<d=„ d=e j;ƒZKG d>d?„ d?e j;ƒZLeMd@krDe  N¡  dS )Cé    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Ú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   úL/www/server/python_manager/versions/3.9.10/lib/python3.9/test/test_shutil.pyÚ_fake_rename5   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_rename9   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_fileD   s    
r1   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   ÚchunksR   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+   Úsizer4   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileP   s    

ÿ*rE   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+   r/   r0   r   r   r   Ú	read_fileb   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   n   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_sendfilez   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 )zjCreate a temporary directory that will be cleaned up.

        Returns the path of the directory.
        )Ú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,   Úmkdirr1   Ú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€   r1   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€   r1   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   r1   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_error4  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Ä   S  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   Úraiserq  s    zFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr   )r   Úlstatr€   r   r1   r„   rx   )ry   rË   r   rÊ   r   Ú+test_rmtree_does_not_choke_on_failing_lstatn  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‹  r5   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   Údirnamer1   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   r1   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€   r1   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   Ú_filter0  s    ÿz8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r   r+   r,   r‘   rv   r1   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   Ú_ignoreW  s    
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorerë   r  r   é	   )r   r+   r,   r‘   rv   r€   r1   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_ignoreI  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Ã   r1   r[   r   rñ   r“   r¿   rÀ   rq   )ry   rØ   rô   rõ   Zrestrictive_subdirZrestrictive_subdir_dstr   r   r   Ú!test_copytree_retains_permissionss  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,   r1   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€   r1   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,   r1   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,   Úmakedirsr1   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,   r1   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,   r1   rŽ   rÃ   r¿   r  rM  rü   r  r„   rO  r“   rÌ   rÀ   rN  rP  r   r   r   Ú test_copymode_symlink_to_symlink7  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,   r1   rŽ   r„   rO  rP  r   r   r   Ú*test_copymode_symlink_to_symlink_wo_lchmodU  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,   r1   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_symlinkse  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,   r1   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,   r1   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,   r1   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   r1   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,   r1   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_copy21  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,   r1   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_symlinksB  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,   r1   r{  r„   r‡  r“   r}  rÝ   )ry   rØ   rb   rc   r   r   r   Útest_copy2_xattre  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,   r1   r“   )ry   rÉ   rô   rõ   rb   rA  r   r   r   Útest_copy_return_valuer  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,   r1   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,   r1   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,   r1   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,   r1   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,   r1   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,   r1   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                   @   sv  e Zd Ze ¡ dd„ ƒZdd„ Zd7d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e ¡ d+d,„ ƒZe ¡ d-d.„ ƒZe ¡ e e oJe!ƒ  d/¡d0d1„ ƒƒZ"e ¡ d2d3„ ƒZ#d4d5„ Z$d6S )8Ú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   Ú_tarinfo9  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  r1   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_tarM  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_zipfilen  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>  r5   z;TestArchives.test_register_archive_format.<locals>.<lambda>c                   S   s   t S r   rû  r   r   r   r   rý     r5   )ri   rY   )ri   rY   r   c                   S   s   t S r   rû  r   r   r   r   rý  #  r5   rô  c                 S   s   g | ]\}}|‘qS r   r   ©r;   rR   Úparamsr   r   r   r=   $  r5   z=TestArchives.test_register_archive_format.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r   r   rþ  r   r   r   r=   (  r5   )r   Ú	TypeErrorr   r   r®   r   r;  )ry   Úformatsr   r   r   Útest_register_archive_format  s    ÿÿz)TestArchives.test_register_archive_formatc                 C   s.   |   |dd„ ¡ |   |tj¡ |   |t¡ d S )Nc                 S   s   | S r   r   ©r+   r   r   r   rý  .  r5   z3TestArchives.check_unpack_archive.<locals>.<lambda>)Ú#check_unpack_archive_with_converterr  r  r   )ry   rÜ  r   r   r   Úcheck_unpack_archive-  s    z!TestArchives.check_unpack_archivec           
      C   sÄ   |   ¡ \}}t|ƒ}| d¡ tj |  ¡ d¡}t||||ƒ}|  ¡ }t||ƒ||ƒƒ |  	t|ƒ|¡ |  ¡ }	t||ƒ||	ƒ|d |  	t|	ƒ|¡ |  
tjt|tƒ¡ | j
tt|tƒdd d S )Nr¼  r¥  )rÜ  rf  )r«  rP   rÝ   r   r+   r,   rv   r   r   r“   r   r„   Ú	ReadErrorr   rß  )
ry   rÜ  Ú	converterr²  rE  Úexpectedrµ  r°   r‚  Ztmpdir3r   r   r   r  2  s    
z0TestArchives.check_unpack_archive_with_converterc                 C   s   |   d¡ d S )Nr©  ©r  r  r   r   r   Útest_unpack_archive_tarG  s    z$TestArchives.test_unpack_archive_tarc                 C   s   |   d¡ d S )Nr¦  r	  r  r   r   r   Útest_unpack_archive_gztarJ  s    z&TestArchives.test_unpack_archive_gztarc                 C   s   |   d¡ d S )NÚbztarr	  r  r   r   r   Útest_unpack_archive_bztarN  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_xztarR  s    z&TestArchives.test_unpack_archive_xztarc                 C   s   |   d¡ d S )NrÄ  r	  r  r   r   r   Útest_unpack_archive_zipW  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   Ú_boo_  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_registry[  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  Zrequires_bz2r  Zrequires_lzmarè   rk   rs   r  r  r  r   r   r   r   r¤    sZ   
#
ÿ
$ÿÿ





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)r2   ÚusedÚfreer   )r„   r  r   r+   rð   r›  r‚   r   rr   ZassertGreaterr2   r  ÚassertGreaterEqualr  )ry   Úusager`  r   r   r   Útest_disk_usagex  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«   r1   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  v  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  r2  rW   r“   r0  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 r7  )r„   r  r0  rR   r/  r“   r8  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 r7  )r   r+   rq   rW   r,   r2  r   r­  r„   r  r/  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  r2  rl   ré   r“   r,   r4  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Ã   r0  rR   r¿   rÁ   ÚaccessÚW_OKr/  r„   r  r2  rW   r;  r8  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 r7  )r   r+   rq   rW   r   r­  r„   r  r2  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;  r8  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  r2  rW   r“   r0  rR   r5  r8  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   ÚEnvironmentVarGuardr3  r„   r  r2  r“   r0  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ª   rI  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   rJ  ræ   rG  rH  rW   Ú	swap_attrr   r­  r„   r  r2  r;  rK  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’  rI  rN  TrO  rR  )r   r+   r¬  r0  rR   rl   ré   r4  r)   rƒ   r   r,   r   rJ  Úpathsepræ   rG  rH  rW   rS  r„   r  r2  r;  r­  r“   )ry   Zexpected_cwdr4  rL  rA  r   r   r   Útest_environ_path_cwd(  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 )NrI  rN  T)r#  rQ  rR  rO  rª   )r   rJ  Úpopræ   rG  rH  rß  rS  r   rW   r„   r  r2  r“   r0  rR   rK  r   r   r   Útest_environ_path_missing>  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  rI  rª   )r   r+   rð   rW   r   r­  rJ  r3  r„   r  r2  r;  )ry   rE  rL  rA  r   r   r   Útest_empty_pathP  s    ÿ
zTestWhich.test_empty_pathc                 C   sN   t  ¡ 2}| dd ¡ t | j¡}|  |¡ W d   ƒ n1 s@0    Y  d S rH  )r   rJ  rW  r„   r  r2  r;  rK  r   r   r   Útest_empty_path_no_PATHX  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ÚTmp2r-  r   ÚPATHEXTr  )r[   r\   r/  r   rÃ   rR   r¿   r1  rw   rÜ   r+   r¬  r  r   rJ  r„   r  r“   ©ry   r5  Ztemp_filexyzZprogramrL  rA  r   r   r   Útest_pathext^  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\  r-  r   ú;r]  r  )r[   r\   r/  rw   rÜ   r   r+   r¬  rR   r  r   rJ  r„   r  r“   r^  r   r   r   Útest_pathext_with_empty_strp  s    ÿ
z%TestWhich.test_pathext_with_empty_strN)r{   r|   r}   r6  r9  r:  r>  r?  ræ   rè   rZ   r   r¸   rC  rD  rE  rç   rl   ré   rG  rM  rT  rV  rX  rY  rZ  r_  ra  r   r   r   r   r,  Æ  s2   ÿ
ÿ

r,  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   )
r,  r6  r   r   rW   r2  r0  rR   r4  r5  r  r   r   r   r6  ‚  s    
zTestWhichBytes.setUpN)r{   r|   r}   r6  r   r   r   r   rb    s   rb  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   r6    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„   re  r“   r    r+   r‘   )ry   rb   rc   rf  rg  r   r   r   Ú_check_move_dirž  s    zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )rh  r”  r  r  r   r   r   Útest_move_file¤  s    zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )rh  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”  rh  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õ   rh  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   )rj  r  r   r   r   Útest_move_file_other_fs¶  s    z TestMove.test_move_file_other_fsc                 C   s   |   ¡  d S r   )rk  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   ri  rô   r   rx   ©ry   rõ   r   r   r   Útest_move_dirÀ  s    zTestMove.test_move_dirc                 C   s   |   ¡  d S r   )rr  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   )ri  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   )rt  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   )ri  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   )ri  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   re  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   re  rm  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„   re  r  r   rN   Úsamefilerm  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„   re  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„   re  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„   re  r   rN   r‚  r‡  r   r   r   Útest_move_dir_symlink"  s    
zTestMove.test_move_dir_symlinkc              	   C   s6   t  | j| j¡}|  |tj | jtj | j¡¡¡ d S r   )	r„   re  r”  rõ   r“   r   r+   r,   r¬  r8  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„   re  r”  r   r+   r,   rõ   r“   r8  r   r   r   Ú test_move_as_rename_return_value3  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  :  s    z7TestMove.test_move_file_special_function.<locals>._copyr)  ri   )r„   re  r”  rõ   r“   r”   ©ry   r7  r   rŒ  r   Útest_move_file_special_function7  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  B  s    z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r)  r   )r   r¾   r   r+   r,   rô   r„   re  rõ   r“   r”   r  r   rŒ  r   Útest_move_dir_special_function?  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„   re  r   rM   r²   rq  r   r   r   Útest_move_dir_caseinsensitiveI  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„   re  Ú
TESTFN_DSTr    rL   r”  Z	os_helperr¾   r+   r,   r‘   rx   r  r   r   r   Útest_move_dir_permission_deniedZ  s,    

û
z(TestMove.test_move_dir_permission_deniedN)+r{   r|   r}   r6  rh  ri  rj  rk  rl  rn  r&   ro  rp  rr  rs  rt  ru  rw  ræ   rç   r   r+   rx  ry  rz  r|  r€  r  r   rå   rƒ  r„  rˆ  r‰  rŠ  r‹  rŽ  r  r’  rZ   r¸   r¿   r—  r   r   r   r   rc  ‹  sh   	




		


	ÿþürc  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J ‚d S )NÚsrcfilezCannot open "srcfile"r   rl  ©r°   r@  r   r   r   Ú_open’  s    z4TestCopyFile.test_w_source_open_fails.<locals>._openr-   r¦  Údestfile)rG   )r   rS  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$J ‚d S )Nr¦  r©  úCannot open "destfile"r   rl  r§  ©r¦  r   r   r¨  Ÿ  s
    z2TestCopyFile.test_w_dest_open_fails.<locals>._openr-   r¦  r©  r   ri   )r¬  )rG   )r¥  r   rS  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 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   ri   )rž  )rG   )r¥  r   rS  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 J ‚d S r¯  r   r§  r°  r   r   r¨  È  s
    z5TestCopyFile.test_w_source_close_fails.<locals>._openr-   r¦  r©  r   )rG   )r¥  r   rS  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 rd  )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   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   rY   i   FrV   s   foor   )ræ   rG  rH  r„   r•  r   r0  Úcalledr“   Ú	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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    r5   rª   c                 C   sX   t t| jƒ ttdƒ.}| ¡ | _t| jƒ| jks6J ‚W d   ƒ n1 sJ0    Y  d S rd  )rE   r   rµ  r-   rH   ÚFILEDATAr”   )r·  rD   r   r   r   r¸  )	  s    
z_ZeroCopyFileTest.setUpClassc                 C   s   t  t¡ d S r   )r   r_   r   r¶  r   r   r   r¹  0	  s    z_ZeroCopyFileTest.tearDownClassc                 C   s   t  t¡ d S r   rº  r  r   r   r   r»  4	  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¾  7	  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_fun=	  s    z_ZeroCopyFileTest.zerocopy_func                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  d S r   )r»  r¹  r¸  r6  r  r   r   r   Úreset@	  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©r/   zshutil.copyfileobj)r¾  rÒ  r“   rI   r0  rÐ  ræ   rG  rH  r„   r•  r   rÈ  )ry   rb   rc   rÊ  r   r   r   Útest_regular_copyH	  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_fileR	  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_srcZ	  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ý  c	  r5   z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      s
   t  ˆ ¡S r   rÙ  r   )ra   r   r   rý  d	  r5   r'   rF   TrÔ  r5   )r   rw   r-   rÒ  r“   rI   râ   r   )ra   r`   r   Útest_empty_file`	  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_exceptionn	  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_callt	  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}   Ú__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Ï  #	  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  ˆ s´J ‚|  
|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)rQ  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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æ   rG  rH  r   r¾  r„   rè  rÈ  r“   rI   r0  rÐ  ©ry   rÊ  rb   rc   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ñ  ©rP  TrÔ  )ræ   rG  ÚMockÚst_sizerH  r¾  r„   rè  rÈ  r“   rI   r0  rÐ  ©ry   rG  rÊ  rb   rc   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æ   rG  rõ  rµ  rö  rH  r¾  r„   rè  rÈ  r“   rI   r0  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æ   rG  rH  rÝ  r   r„   r•  r   r0  rÉ  r“   r   r+   r@   r   r_   r1   rw   )ry   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æ   rG  rH  rÜ  r   r   ÚENOTSOCKr¾  r   r   rè  rÈ  r•  r   r0  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)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 )z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi	  Z888ix  )r   rJ  r„   r  r“   r  r  ©ry   rL  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   rJ  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sttyrA   zstty invocation failedri   r   r
  r	  N)rn   r×  rÛ  rq   r¬   r"  rÙ  r/  rr   r   rJ  r„   r  r“   )ry   rA   r  rL  rö   r   r   r   Útest_stty_match(
  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   rJ  rS  rl   r„   r  r“   r  r  r-   r   Údevnull)ry   rL  rA   rD   r   r   r   Útest_fallback@
  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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•  rO  r\  r„  r‡  rñ   re  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_attributeW
  s
    
z(PublicAPITests.test_module_all_attributeN)r{   r|   r}   rå  r  r   r   r   r   r  T
  s   r  Ú__main__)F)F)Oræ   Zunittest.mockr„   r[   rl   r¿   r   Zos.pathr   r$   r  rn   r6   r8   rÍ  ré  r   r   r   r   r   r   r   r	   r
   r   r   r   r¯  rÌ  r  ÚImportErrorrö  r   Ztest.supportr   r   r0  r•  r–  ré   r  r¢  r£  rk   ræ  rè  rå  r£   r   r&   r1   rE   rI   rP   rf   ZSUPPORTS_SENDFILErs   rt   ZTestCaser~   rê   rI  r¤  r  r,  rb  rc  r˜  r´  r³  rÏ  rè   ræ  r   r  r  r{   Úmainr   r   r   r   Ú<module>   s¢   8




	  
  [      gP <
 s\JdvN
