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   sr   dd„ }t |dƒ}d dd„ t|ƒD ƒ¡}t| dƒ*}|||ƒD ]}| |¡ q@W d  ƒ n1 sd0    Y  dS )	zBCreate a test file with an arbitrary size and random text content.c                 s   s&   | |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+   Úsizer4   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileP   s    

ÿ*rD   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    
rH   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   rO   n   s    rO   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
   0123456789rE   r   é   T)Úhasattrr   ÚtempfileÚNamedTemporaryFileÚgetcwdrQ   r.   r-   ÚfilenorT   r   r   Úunlink)ÚsrcnameÚdstnamerC   ÚsrcÚdstÚinfdÚoutfdr   r   r   Úsupports_file2file_sendfilez   sH    
(

ù



ûF


ý


re   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
    rr   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.
        )ÚprefixrV   )rZ   Úmkdtempr   r\   Ú
addCleanupr   Úrmtree)Úselfrt   Údr   r   r   ru   ¨   s    zBaseTest.mkdtemp)N)Ú__name__Ú
__module__Ú__qualname__ru   r   r   r   r   rs   ¦   s   rs   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)ru   r   r+   r,   Úmkdirr1   ÚfsencodeÚassertIsInstanceÚbytesÚshutilrw   )rx   Ú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 )	NrV   Úlinkc                     s   ˆ   | ¡ d S r   ©rN   ©r   ©Úerrorsr   r   ÚonerrorÈ   s    z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror©r‹   rh   r   rX   )ru   r   r+   r,   r   ÚsymlinkÚassertRaisesr   rƒ   rw   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsrM   r   ©rx   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)ru   r   r+   r,   r   r1   r   rƒ   rw   ÚassertFalser   r   ©
rx   r„   r˜   r™   rš   ry   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 )	NrV   r†   c                     s   ˆ   | ¡ d S r   r‡   rˆ   r‰   r   r   r‹   ò   s    z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorrŒ   rh   r   rX   )ru   r   r+   r,   r   Ú_winapiÚCreateJunctionrv   r   r^   rŽ   r   rƒ   rw   r   r   r‘   r’   r“   r”   rM   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—   )ru   r   r+   r,   r   r1   r¢   r£   rƒ   rw   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©rV   T©Úignore_errorsZtstfileÚ z*.*c                     s   ˆ   | ¡ d S r   r‡   rˆ   r‰   r   r   r‹   &  s    z.TestRmTree.test_rmtree_errors.<locals>.onerrorrŒ   rX   r   rh   )rZ   Úmktempru   rŽ   ÚFileNotFoundErrorrƒ   rw   r1   r   r+   r,   ÚNotADirectoryErrorÚassertInÚ	exceptionÚfilenamer   r   r’   r“   r”   Úscandirr   Úrmdir)rx   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   rv   rƒ   rw   r+   r,   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr’   )rx   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 )NrX   r   rh   r   )rº   r   r^   r’   r»   r±   r¼   r”   rK   r­   r   r   Ú
issubclassr   )rx   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ƒ   rw   )rx   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)rz   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_fdrK   Úsupports_fdÚsupports_follow_symlinksr   rƒ   Ú_use_fd_functionsrw   Úavoids_symlink_attacksru   r+   r,   r   Ú_rmtree_safe_fdÚ	ExceptionrŽ   rŸ   )rx   rÓ   Útmp_dirry   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¦   )
rZ   Úmkstempru   r   ÚcloserŽ   r¬   rƒ   rw   Úremove)rx   Ú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ƒ   rw   ©rx   ra   rb   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ƒ   rw   rá   r   r   r   Útest_rmtree_on_junction«  s    

z"TestRmTree.test_rmtree_on_junction)rz   r{   r|   r…   r   Úskip_unless_symlinkr–   r¡   ÚunittestÚ
skipUnlessr¢   r¤   r¥   r´   ÚskipIfrk   ÚplatformrY   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)ru   r   r+   r,   rv   rƒ   rw   Údirnamer1   r   Úcopytreer   ÚisfilerL   rH   r’   ©rx   Ú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)ru   rv   rƒ   rw   r1   r   r   r+   r,   rð   r   rñ   rL   rH   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 )Nra   rb   Úsubzfile.txtr~   r†   zsub/linkÚlchmodÚlchflagsÚ	UF_NODUMPT©ÚsymlinksÚntz\\?\é   )ru   r   r+   r,   r   r1   r   rY   rû   r¾   ÚS_IRWXUÚS_IRWXOrü   rý   rË   rƒ   rð   r   rM   ÚreadlinkrQ   Ú
startswithr’   r¿   Úst_flags)
rx   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 )Nrg   r  z.py)r   r+   r,   rL   rp   rN   Úsplitext)ra   ÚnamesrP   rQ   r+   r   r   r   Ú_filter0  s    ÿz8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r   r+   r,   r   ru   r1   r   rƒ   Úignore_patternsrð   r   rŸ   rw   rï   )rx   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   )rN   r   ÚstrÚlistr’   r“   Úset)ra   r  rQ   ©Zinvokationsrx   r   r   Ú_ignoreW  s    
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorerê   r  r   é	   )r   r+   r,   r   ru   r   r1   rƒ   rð   r   ÚpathlibÚPathr  r°   r   ÚDirEntryr’   r“   )rx   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¦   rh   )ru   r   r+   r,   r   rv   rƒ   rw   rÂ   r1   rZ   r   rð   r’   r¾   r¿   rp   )rx   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)ru   r   r+   r,   rv   rƒ   rw   rï   ÚPermissionErrorÚside_effectrŽ   r   rð   )rx   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~   )rN   r   r  r’   r   r+   r,   )r¸   r¹   ©rb   Úflagrx   ra   r   r   Úcustom_cpfunž  s
    
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr¦   r~   r(   ©Úcopy_functionrh   )ru   rZ   rª   r-   r   r+   r,   rÛ   rƒ   rð   r’   r“   )rx   r'  rC   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   rh   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“   Úfailrw   )rx   r  ÚpipeÚerŠ   ra   rb   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‡   ©ra   rb   ©Zcopiedr   r   Ú_copyÏ  s    z6TestCopyTree.test_copytree_special_func.<locals>._copyr(  rX   )
ru   r   r+   r,   r1   r   rƒ   rð   r’   r“   )rx   ró   rô   r6  r   r5  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þ   )ru   r   r+   r,   r   r   r1   rŽ   r   rƒ   rð   ÚassertNotInrK   r­   ©rx   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þ   r8  )ru   r   r+   r,   r   r-   r   rƒ   rð   rŸ   rM   r­   rK   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~   )ru   rv   rƒ   rw   r   r+   r,   r1   rð   r’   rK   )rx   ró   rô   ra   Ú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)ru   rv   rƒ   rw   r   r+   r,   Úmakedirsr1   rð   r’   rK   )rx   Úbase_dirró   rô   ra   r@  r   r   r   Útest_copytree_subdirectory  s    

z'TestCopyTree.test_copytree_subdirectoryN)rz   r{   r|   rö   rù   r   rä   r  r  r  r   rå   ÚmockÚpatchr#  r*  ræ   rY   r   r3  r7  r<  r>  rA  rE  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   )ru   r   r+   r,   r1   r   rÂ   r¾   r  ÚS_IRWXGr  ÚassertNotEqualr¿   rƒ   Úcopymoder’   rQ   ©rx   r×   ra   rb   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~   rI  rJ  rK  F©Úfollow_symlinks)ru   r   r+   r,   r1   r   rÂ   r¾   r  rL  rû   r  rƒ   rN  r’   rË   r¿   rM  rO  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 rQ  )ru   r   r+   r,   r1   r   rƒ   rN  rO  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~   rI  rJ  Úquxg      E@rû   rü   rý   TrR  F©Úst_atimeÚst_mtimerh   r  gš™™™™™¹?)ru   r   r+   r,   r1   r¾   ÚutimerX  rY  rM  r   rY   rû   r  rü   rý   rË   rƒ   Úcopystatr¿   rÒ   ÚassertLessEqualr   r’   r  r   Úabs)
rx   r×   ra   rb   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 )NTrR  c                   s   ˆ ˆ_ ˆ‚d S r   )r   )r+   ÚflagsrS  ©ÚerrÚexr   r   Ú_chflags_raiserœ  s    zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser©r   )rh  rj  r   rg  r   Úmake_chflags_raiser™  s    zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)ru   r   r+   r,   r1   ra  r   rb  rc  rƒ   r[  rŽ   r   )rx   r²   r›   rd  rl  Zold_chflagsrh  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~   rI  úuser.fooó   42zuser.baró   43ÚEPERMc                    s&   |dkrˆ‚nˆ | ||fi |¤Ž d S )Nrn  r   )Úfnamer_  Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_fooÄ  s    z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrR  c                   s    | ˆkrt tjdƒ‚ˆ | |dS )NzOperation not supportedrR  )r   r   rc  )rr  rS  )Úorig_listxattrra   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)ru   r   r+   r,   r1   rƒ   Ú
_copyxattrÚsetxattrr’   rJ   Ú	listxattrÚgetxattrrÜ   r   r   rq  r­   rÂ   r[  )rx   r×   rb   rv  rx  ZsrcroZdstror   )rw  rt  ru  ra   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~   rJ  ztrusted.fooro  rp  FrR  rI  rV  )ru   r   r+   r,   r1   r   rz  rƒ   ry  r’   r|  rŽ   r   )rx   r×   ra   r  rb   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ë   re  )ru   r1   r   r+   r,   )rx   Úmethodrr  r²   r›   Útmpdir2rd  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¿   )rx   r›   rd  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~   rI  rJ  rû   TrR  F)ru   r   r+   r,   r1   r   rY   rû   r¾   r  r  rƒ   rƒ  rŸ   rM   r’   rH   rÜ   r   r  rË   r¿   )rx   r×   ra   rb   r  r   r   r   Útest_copy_symlinks  s&    



ÿzTestCopy.test_copy_symlinksrZ  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 )NrW  rh   ra  r  )r‚  rƒ   Úcopy2r   r   r+   r   r¾   r’   r¿   r\  r   rY   )rx   r›   rd  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~   rI  rJ  rû   rü   rý   TrR  FrW  rh   r  )ru   r   r+   r,   r1   r   rY   rû   r¾   r  r  rü   rý   rË   rƒ   r†  rŸ   rM   r’   rH   rÜ   r   r  rZ  rÒ   r\  r   r¿   rM  r  )	rx   r×   ra   rb   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~   rI  rn  ro  )ru   r   r+   r,   r1   rz  rƒ   r†  r’   r|  rÜ   )rx   r×   ra   rb   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~   rI  )	rƒ   rƒ  r†  ru   r   r+   r,   r1   r’   )rx   rÈ   ró   rô   ra   r@  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ƒ  ©rx   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)
ru   r   r+   r,   r1   rk   rè   r!  ÚIsADirectoryErrorrŽ   )rx   Z	copy_funcró   Úsrc_filer™   rb   rh  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 )Nra   rb   r  r†   r~   FrR  )ru   r   r+   r,   r1   r   rƒ   Úcopyfiler   rM   r’   r  rŸ   )rx   r×   ra   rb   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(): %srF   Tr§   )r   r   r   r+   r,   r-   r.   r†   r!  r.  rŽ   rƒ   r   r”  r’   rG   rÜ   rw   )rx   ra   rb   rC   r2  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–  rF   Tr§   )r   r   r   r+   r,   r-   r.   r   rŽ   rƒ   r   r”  r’   rG   rÜ   rw   )rx   ra   rb   rC   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”  r/  Ú__file__rÜ   )rx   r2  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 )NrI  r~   )ru   r   r+   r,   r1   rƒ   r”  r   r   r’   rH   )rx   ró   rô   Údst_filer“  r@  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$  )ru   r   r+   r,   r1   rŽ   r   rƒ   r”  r   r’   rH   )rx   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  )	ru   r   r+   r,   r1   rŽ   r«   rƒ   r”  )rx   ró   r“  rb   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  )ru   r   r+   r,   r1   rk   rè   r!  r’  rŽ   rƒ   r”  )rx   ró   r“  r™   rb   rh  r   r   r   Útest_copyfile_copy_dirþ  s    

zTestCopy.test_copyfile_copy_dirN))rz   r{   r|   r   rä   rP  rå   ræ   rY   r   rT  rç   rU  r`  r   rm  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   rH    sh   

(ÿý

?ÿ



"





rH  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ú.tarrF   )Ú_create_filesru   r   r±   r+   rï   r,   Úbasenamer   Ú
change_cwdÚabspathr   r’   r   rñ   ÚtarfileZ
is_tarfiler-   ÚassertCountEqualÚgetnames)	rx   Úroot_dirrD  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*   )rx   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›   re  rd  rú   Zfile3Zsub2Úouter)ru   r   r+   r,   rC  r1   r   )rx   rD  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,   ru   r   r’   r   rñ   rm   Ú
check_callÚDEVNULLr¸  )rx   r±  rD  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ª  ru   r   r±   r+   rï   r,   r«  r   r¬  r­  r   r’   r   rñ   ÚzipfileÚ
is_zipfileÚZipFiler¯  Únamelist)	rx   r±  rD  r  r²  r³  r´  rP   Ú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,   ru   r   r’   r   rñ   rm   rÀ  rÁ  rË  rÍ  rÎ  rJ   )
rx   r±  rD  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,   ru   r   r’   r   rñ   r   r¬  rm   Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder.  r0  Úformat)	rx   r±  rD  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¤  re  )ru   r   r+   r,   rŽ   Ú
ValueErrorr   )rx   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,   ru   r   r   rñ   )rx   rã  râ  r±  rD  r´  rP   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,   ru   rå  ræ  rç  rè  r   r¬  r   r   rñ   r®  r-   Z
getmembersr’   ÚuidÚgidrÛ   )	rx   r±  rD  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>._breaksre  úxxx file)r±  )r   r\   r   r   ru   rÖ   r’   r   )rx   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©	ru   r   r¬  r’   r   r   r   r+   rñ   ©rx   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 )Nre  rh   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   )rh   rX   )rh   rX   r   c                   S   s   t S r   rú  r   r   r   r   rü  #  r5   ró  c                 S   s   g | ]\}}|‘qS r   r   ©r;   rQ   Ú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:  )rx   Ú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   )rx   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Û  re  )rª  rO   rÜ   r   r+   r,   ru   r   r   r’   rŽ   rƒ   Ú	ReadErrorr   rÞ  )
rx   rÛ  Ú	converterr±  rD  Ú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 )Nrh   ú	stuff.booÚxx)r’   )r¯   Úextract_dirÚextrarŒ  r   r   Ú_boo_  s    z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r  rh   r  r  ZBoo2r©   )	r   r   r   rŽ   r	   r
   r­   r:  r’   )rx   r   r  r   rŒ  r   Útest_unpack_registry[  s    

ÿz!TestArchives.test_unpack_registryN)r¹  )%rz   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ç   rj   rr   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   rq   ZassertGreaterr2   r  ÚassertGreaterEqualr  )rx   Ú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¯   rx   r   r   Úcheck_chown   s
    
z(TestMisc.test_chown.<locals>.check_chown)rì  r   )NN)ru   rZ   rª   r1   rŽ   rÞ  rƒ   r  ÚLookupErrorrÿ  r   ÚgetuidÚgetgidrç  rè  rå  ræ  ÚKeyError)rx   rï   rë  rì  r%  r  rã  r   r$  r   Ú
test_chown‡  sR    
(,,*,



zTestMisc.test_chownN)rz   r{   r|   rå   ræ   rY   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)rt   z.Exe©rV   rt   Úsuffixz.EXE)ru   Útemp_dirrZ   r[   Ú	temp_filer   rÂ   rQ   r¾   ÚS_IXUSRrv   rÛ   r+   rp   rV   Ú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  r1  rV   r’   r/  rQ   ©rx   r@  r   r   r   Ú
test_basicÖ  s    zTestWhich.test_basicc                 C   s(   t j| jj| jd}|  || jj¡ d S r6  )rƒ   r  r/  rQ   r.  r’   r7  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 r6  )r   r+   rp   rV   r,   r1  r   r¬  rƒ   r  r.  r’   ÚassertIsNone)rx   rD  Útail_dirÚrelpathr@  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ï   rV   r   r¬  rƒ   r  r1  rk   rè   r’   r,   r3  r:  )rx   rD  r@  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Â   r/  rQ   r¾   rÀ   ÚaccessÚW_OKr.  rƒ   r  r1  rV   r:  r7  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 r6  )r   r+   rp   rV   r   r¬  rƒ   r  r1  r’   r,   )rx   rD  r;  r@  r   r   r   Útest_relative_path  s    zTestWhich.test_relative_pathc                 C   s   t jd| jd}|  |¡ d S )Nzfoo.exer  )rƒ   r  rV   r:  r7  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  r1  rV   r’   r/  rQ   r4  r7  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   ÚEnvironmentVarGuardr2  rƒ   r  r1  r’   r/  rQ   ©rx   Úenvr@  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©   rH  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   rI  rå   rF  rG  rV   Ú	swap_attrr   r¬  rƒ   r  r1  r:  rJ  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‘  rH  rM  TrN  rQ  )r   r+   r«  r/  rQ   rk   rè   r3  r)   r‚   r€   r,   r   rI  Úpathseprå   rF  rG  rV   rR  rƒ   r  r1  r:  r¬  r’   )rx   Zexpected_cwdr3  rK  r@  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 )NrH  rM  T)r"  rP  rQ  rN  r©   )r   rI  Úpoprå   rF  rG  rÞ  rR  r   rV   rƒ   r  r1  r’   r/  rQ   rJ  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  rH  r©   )r   r+   rï   rV   r   r¬  rI  r2  rƒ   r  r1  r:  )rx   rD  rK  r@  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 rG  )r   rI  rV  rƒ   r  r1  r:  rJ  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  )rZ   r[   r.  r   rÂ   rQ   r¾   r0  rv   rÛ   r+   r«  r  r   rI  rƒ   r  r’   ©rx   r4  Ztemp_filexyzZprogramrK  r@  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 )NrZ  r[  r,  r   ú;r\  r  )rZ   r[   r.  rv   rÛ   r   r+   r«  rQ   r  r   rI  rƒ   r  r’   r]  r   r   r   Útest_pathext_with_empty_strp  s    ÿ
z%TestWhich.test_pathext_with_empty_strN)rz   r{   r|   r5  r8  r9  r=  r>  rå   rç   rY   r   r·   rB  rC  rD  ræ   rk   rè   rF  rL  rS  rU  rW  rX  rY  r^  r`  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+  r5  r   r€   rV   r1  r/  rQ   r3  r4  rŒ  r   r   r   r5  ‚  s    
zTestWhichBytes.setUpN)rz   r{   r|   r5  r   r   r   r   ra    s   ra  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   )
ru   ró   rô   r   r+   r,   r“  rœ  r-   r.   )rx   r¯   rC   r   r   r   r5    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 ©NrE   )	r-   rG   rƒ   Úmover’   rŸ   r   r+   r   )rx   ra   rb   Úreal_dstrC   Úcontentsr   r   r   Ú_check_move_file–  s    &.zTestMove._check_move_filec                 C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S r   )	rJ   r   rK   rƒ   rd  r’   rŸ   r+   r   )rx   ra   rb   re  rf  r   r   r   Ú_check_move_dirž  s    zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )rg  r“  rœ  rŒ  r   r   r   Útest_move_file¤  s    zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )rg  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“  rg  rô   rœ  )rx   ra   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ô   rg  r“  rœ  ©rx   rb   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   )ri  rŒ  r   r   r   Útest_move_file_other_fs¶  s    z TestMove.test_move_file_other_fsc                 C   s   |   ¡  d S r   )rj  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Ù   )rZ   rª   ru   rh  ró   r   rw   ©rx   rô   r   r   r   Útest_move_dirÀ  s    zTestMove.test_move_dirc                 C   s   |   ¡  d S r   )rq  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   )rh  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   )rs  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   )rh  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   )rh  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   rd  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 ©NrI  )r   r+   r,   ró   rŽ   rƒ   r   rd  rl  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   rw   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   rw   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 rz  )r   r+   r,   ró   r   r“  rƒ   rd  rœ  r   rM   Úsamefilerl  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 rz  )r   r+   r,   ró   r   r“  rƒ   rd  rô   r   rM   r  )rx   r¯   rb   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 ©NrJ  rI  rK  )r   r+   r,   ró   r   rô   rƒ   rd  r   rM   r’   Úrealpath©rx   ra   rb   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ƒ   rd  r   rM   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ƒ   rd  r“  rô   r’   r   r+   r,   r«  r7  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 rz  )rƒ   rd  r“  r   r+   r,   rô   r’   r7  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‡   r4  ©Zmovedr   r   r6  :  s    z7TestMove.test_move_file_special_function.<locals>._copyr(  rh   )rƒ   rd  r“  rô   r’   r“   ©rx   r6  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‡   r4  r‹  r   r   r6  B  s    z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r(  r   )r   r½   r   r+   r,   ró   rƒ   rd  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   )ru   ró   r   r+   r,   rï   r«  ÚupperrM  rƒ   rd  r   rL   r±   rp  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ƒ   rd  Ú
TESTFN_DSTrŸ   rK   r“  Z	os_helperr½   r+   r,   r   rw   rŒ  r   r   r   Útest_move_dir_permission_deniedZ  s,    

û
z(TestMove.test_move_dir_permission_deniedN)+rz   r{   r|   r5  rg  rh  ri  rj  rk  rm  r&   rn  ro  rq  rr  rs  rt  rv  rå   ræ   r   r+   rw  rx  ry  r{  r  r€  r   rä   r‚  rƒ  r‡  rˆ  r‰  rŠ  r  r  r‘  rY   r·   r¾   r–  r   r   r   r   rb  ‹  sh   	




		


	ÿþürb  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)rx   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__ƒ  s    zTestCopyFile.Faux.__init__c                 G   s   dS )Nr©   r   )rx   r   r   r   r   rG   †  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™  )rx   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__Š  s
    zTestCopyFile.Faux.__exit__)FT)
rz   r{   r|   r›  rž  rŸ  rš  rG   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 )NrF   c                 S   s   | dkrt dƒ‚d S )NÚsrcfilezCannot open "srcfile"rk  ©r¯   r?  r   r   r   Ú_open’  s    z4TestCopyFile.test_w_source_open_fails.<locals>._openr-   r¥  Údestfile)rF   )r   rR  rƒ   rŽ   r   r”  ©rx   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 )NrF   c                    s    | dkrˆ S | dkrt dƒ‚d S )Nr¥  r¨  úCannot open "destfile"rk  r¦  ©r¥  r   r   r§  Ÿ  s
    z2TestCopyFile.test_w_dest_open_fails.<locals>._openr-   r¥  r¨  r   rh   )r«  )rF   )r¤  r   rR  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 )NTrF   c                    s   | dkrˆS | dkrˆ S d S ©Nr¥  r¨  r   r¦  ©r¨  r¥  r   r   r§  ²  s
    z3TestCopyFile.test_w_dest_close_fails.<locals>._openr-   r¥  r¨  r   rh   )r  )rF   )r¤  r   rR  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 )
NTrF   c                    s   | dkrˆS | dkrˆ S d S r®  r   r¦  r¯  r   r   r§  È  s
    z5TestCopyFile.test_w_source_close_fails.<locals>._openr-   r¥  r¨  r   )rF   )r¤  r   rR  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)rz   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   )rD   r   ÚFILESIZE©Úclsr   r   r   Ú
setUpClassÜ  s    zTestCopyFileObj.setUpClassc                 C   s   t  t¡ t  t¡ d S r   )r   r^   r   r/  rµ  r   r   r   ÚtearDownClassà  s    
zTestCopyFileObj.tearDownClassc                 C   s   t  t¡ d S r   ©r   r^   r/  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 ©NrE   r'   ©r-   r   r/  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 rc  )r-   r’   rG   )rx   ra   rb   Ú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   r/  rá   r   r   r   Útest_contentó  s    *zTestCopyFileObj.test_contentc                 C   s<   |   ¡  \}}t ||¡ W d   ƒ n1 s.0    Y  d S r   )r½  rƒ   rÁ  rá   r   r   r   Útest_file_not_closedø  s    z$TestCopyFileObj.test_file_not_closedc                 C   s`   |   ¡ D\}}t ||¡ |  | ¡ | j¡ |  | ¡ | j¡ W d   ƒ n1 sR0    Y  d S r   )r½  rƒ   rÁ  r’   Útellr´  rá   r   r   r   Útest_file_offsetþ  s    z TestCopyFileObj.test_file_offsetr   zWindows onlyc                 C   s~  t j d¡}t tt¡ W d   ƒ n1 s.0    Y  |  |jd d d¡ t	j
t ¡ dd}| d¡ W d   ƒ n1 s€0    Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sÌ0    Y  |  |jd d d¡ t	j
t ¡ dd}W d   ƒ n1 s0    Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sd0    Y  |  |t¡ d S )	Nzshutil._copyfileobj_readintor   rX   i   FrU   s   foor   )rå   rF  rG  rƒ   r”  r   r/  r’   Ú	call_argsrZ   r[   r   r\   r.   rQ   rv   r   r^   rÀ  )rx   ÚmrC   rr  r   r   r   Útest_win_impl	  s"    *(* ,zTestCopyFileObj.test_win_implN)rz   r{   r|   r´  Úclassmethodr·  r¸  rº  Ú
contextlibÚcontextmanagerr½  rÀ  rÂ  rÃ  rÅ  rå   rç   r   rQ   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   sD   t t| jƒ ttdƒ}| ¡ | _W d   ƒ n1 s60    Y  d S rc  )rD   r   r´  r-   rG   ÚFILEDATA)r¶  rC   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)rx   r   r   r   r   r   Úzerocopy_fun=	  s    z_ZeroCopyFileTest.zerocopy_func                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  d S r   )rº  r¸  r·  r5  rŒ  r   r   r   Úreset@	  s    z_ZeroCopyFileTest.resetc              	   C   s¶   |   ¡  \}}|  ||¡ W d   ƒ n1 s.0    Y  |  ttdd| j¡ |   ¡ L\}}tj d¡}t	 
tt¡ W d   ƒ n1 sŠ0    Y  W d   ƒ n1 s¨0    Y  d S )NT©r/   zshutil.copyfileobj)r½  rÏ  r’   rH   r/  rÍ  rå   rF  rG  rƒ   r”  r   )rx   ra   rb   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Ñ  )
rv   rÐ  r½  rŽ   rÖ   rÏ  r’   rH   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)rZ   rª   r   r\   rŽ   r«   rƒ   r”  r’   r®   r¯   )rx   rQ   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 )Nra   rb   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   )r`   r   r   rü  d	  r5   r'   rE   TrÑ  r5   )r   rv   r-   rÏ  r’   rH   rá   r   )r`   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å   rF  rG  Ú
PATCHPOINTÚZeroDivisionErrorrŽ   rƒ   r”  r   r/  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å   rF  rG  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å   rF  rG  rÙ  r   r   ÚENOSPCr½  rŽ   rÏ  rá   r   r   r   Útest_filesystem_full~	  s
    

ÿz&_ZeroCopyFileTest.test_filesystem_fullN)rz   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)rx   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-   r/  rŽ   r   rÏ  rƒ   rÁ  r’   rH   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 )NrE   r   )r-   r   ræ  rç  rŽ   r   rÏ  rƒ   rÁ  Úseekr’   rG   rÍ  rá   r   r   r   Útest_non_regular_file_dst—	  s    
*
z.TestZeroCopySendfile.test_non_regular_file_dstc              
      sÂ   ‡ ‡fdd„}g ‰ t j‰tjjdd|dr |  ¡ J\}}|  t¡}t 	||¡ W d   ƒ n1 sf0    Y  W d   ƒ n1 s„0    Y  W d   ƒ n1 s¢0    Y  |  
|jjtj¡ d S )Nc                     s,   ˆ sˆ   d ¡ ˆ| i |¤ŽS ttjdƒ‚d S )NrÝ  )rN   r   r   ÚEBADFr   ©r&  Zorig_sendfiler   r   rT   ¡	  s    
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfilerä  T)rP  r"  )r   rT   rå   rF  rG  r½  rŽ   r   rƒ   rå  r’   r®   r   rë  )rx   rT   ra   rb   r³   r   rì  r   Útest_exception_on_second_call 	  s    
ÿfz2TestZeroCopySendfile.test_exception_on_second_callc              	   C   s‚   t jjdtdH}|  ¡  \}}t ||¡ W d   ƒ n1 s@0    Y  W d   ƒ n1 s^0    Y  |  tt	dd| j
¡ d S )Núos.fstatrØ  TrÑ  )rå   rF  rG  r   r½  rƒ   rå  r’   rH   r/  rÍ  ©rx   rÇ  ra   rb   r   r   r   Útest_cant_get_size²	  s
    <z'TestZeroCopySendfile.test_cant_get_sizec              	   C   s’   t j ¡ }d|_t jjd|dH}|  ¡  \}}t ||¡ W d   ƒ n1 sP0    Y  W d   ƒ n1 sn0    Y  |  t	t
dd| j¡ d S )Ni  rî  ©rO  TrÑ  )rå   rF  ÚMockÚst_sizerG  r½  rƒ   rå  r’   rH   r/  rÍ  ©rx   rF  rÇ  ra   rb   r   r   r   Útest_small_chunks¼	  s    
<z&TestZeroCopySendfile.test_small_chunksc              	   C   s˜   t j ¡ }| jd |_t jjd|dH}|  ¡  \}}t ||¡ W d   ƒ n1 sV0    Y  W d   ƒ n1 st0    Y  |  	t
tdd| j¡ d S )Ni  @rî  rñ  TrÑ  )rå   rF  rò  r´  ró  rG  r½  rƒ   rå  r’   rH   r/  rÍ  rô  r   r   r   Útest_big_chunkÉ	  s    
<z#TestZeroCopySendfile.test_big_chunkc                 C   sÂ   t jjdtdž}|  ttjtt¡ |j	d d }|  
|tj t¡¡ t t¡ ttddd |  tjtd ¡ |  ttjttd ¡ |j	d d }|  
|d	¡ W d   ƒ n1 s´0    Y  d S )
Nrä  rØ  r   r   s   helloTrÑ  Ú3i  € )rå   rF  rG  rÚ  rŽ   rƒ   r”  r   r/  rÆ  r’   r   r+   Úgetsizer   r^   r1   rv   )rx   rÇ  Ú	blocksizer   r   r   Útest_blocksize_argÖ	  s"    ÿÿ
ÿz'TestZeroCopySendfile.test_blocksize_argc              
   C   sî   zàt jj| jttjdƒdr}|  ¡ J\}}|  t	¡ t
 ||¡ W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  W d   ƒ n1 s”0    Y  t j | j¡}t
 tt¡ W d   ƒ n1 sÎ0    Y  W dt
_ndt
_0 d S )NrÝ  rØ  T)rå   rF  rG  rÙ  r   r   ÚENOTSOCKr½  rŽ   r   rƒ   rå  r”  r   r/  Ú_USE_CP_SENDFILErï  r   r   r   Útest_file2file_not_supportedè	  s    
þH z1TestZeroCopySendfile.test_file2file_not_supportedN)rz   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)rz   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)rx   r@   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   rI  rƒ   r  r’   r  r  ©rx   rK  r@   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 )Nre  r  Zyyyr  r   )r   rI  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sttyr@   zstty invocation failedrh   r   r  r  N)rm   rÖ  rÚ  rp   r«   r!  rØ  r.  rq   r   rI  rƒ   r  r’   )rx   r@   r  rK  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   rI  rR  rk   rƒ   r  r’   r  r  r-   r   Údevnull)rx   rK  r@   rC   r   r   r   Útest_fallback@
  s    
*ÿHz!TestGetTerminalSize.test_fallbackN)rz   r{   r|   r  r
  r  rå   ræ   r   Úisattyrk   r  r]   rY   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”  rN  r[  rƒ  r†  rð   rd  rw   r   r™  Ú	ExecErrorr   r   r   r   r   r   r
   r   r  r  r  r  r   Ústatvfsr   r  )	r   rY   rƒ   r   rQ   rN   r’   r  r  )rx   Z
target_apir   r   r   Útest_module_all_attributeW
  s
    
z(PublicAPITests.test_module_all_attributeN)rz   r{   r|   râ  r  r   r   r   r   r  T
  s   r  Ú__main__)F)F)Orå   Zunittest.mockrƒ   rZ   rk   r¾   r   Zos.pathr   r$   r  rm   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   r/  r”  r•  rè   r  r¡  r¢  rj   rå  rç  rä  r¢   r   r&   r1   rD   rH   rO   re   ZSUPPORTS_SENDFILErr   rs   ZTestCaser}   ré   rH  r£  r  r+  ra  rb  r—  r³  r²  rÌ  rç   rã  rþ  r  r  rz   Úmainr   r   r   r   Ú<module>   s¢   8




	  
  [      gP <
 s\JdvN
