o
    ±ó®gu  ã                   @   sT  d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlZzd dlZW n eyu   dZY nw d dl m!Z! 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l0Z0dZ1W n eyÂ   dZ1Y nw zd dl2Z2W n eyÔ   dZ2Y nw dd„ Z3dd„ Z4dBdd„Z5dd„ Z6dBdd„Z7dd„ Z8dd„ Z9e9ƒ Z:dd„ Z;G dd „ d ƒZ<G d!d"„ d"e<e j=ƒZ>G d#d$„ d$e<e j=ƒZ?G d%d&„ d&e<e j=ƒZ@G d'd(„ d(e<e j=ƒZAG d)d*„ d*e<e j=ƒZBG d+d,„ d,e<e j=ƒZCG d-d.„ d.eCƒZDG d/d0„ d0e<e j=ƒZEG d1d2„ d2e j=ƒZFG d3d4„ d4e j=ƒZGG d5d6„ d6eHƒZIe  Je: d7¡G d8d9„ d9eIe j=ƒƒZKe  Je, d:¡G d;d<„ d<eIe j=ƒƒZLG d=d>„ d>e j=ƒZMG d?d@„ d@e j=ƒZNeOdAkr¨e  P¡  dS 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)Ú	os_helper)ÚTESTFNÚFakePathÚ2Z_SRCZ_DSTÚdarwinZsunosé   ZaixTFc                  O   s   t ttddƒdƒ‚)NZEXDEVé   zInvalid cross-device link)ÚOSErrorÚgetattrÚerrno©ÚargsÚkwargs© r   úF/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_shutil.pyÚ_fake_rename6   s   r   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                     s,   zt j}tt _ˆ | i |¤ŽW |t _S |t _w ©N)ÚosÚrenamer   )r   r   Zbuiltin_rename©Úfuncr   r   Úwrap;   s
   zmock_rename.<locals>.wrap)Ú	functoolsÚwraps)r#   r$   r   r"   r   Úmock_rename:   s   r'   c                 C   sl   t | tƒrtjj| Ž } |rdnd}|rdnd}t| ||d}| |¡ W d  ƒ dS 1 s/w   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úutf-8©Úencoding)Ú
isinstanceÚtupler    ÚpathÚjoinÚopenÚwrite)r/   ZcontentÚbinaryÚmoder,   Úfpr   r   r   Ú
write_fileE   s   
"ÿr6   c                 C   s†   dd„ }t |dƒ}d dd„ t|ƒD ƒ¡}t| dƒ}|||ƒD ]}| |¡ q W d  ƒ n1 s2w   Y  tj | ¡|ksAJ ‚dS )	zBCreate a test file with an arbitrary size and random text content.c                 s   s>    | |ksJ ‚| |kr|V  | |8 } | |ks| r| V  d S d S r   r   )ÚtotalÚstepr   r   r   ÚchunksU   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)Úminr0   Úranger1   r2   r    r/   Úgetsize)r/   Úsizer9   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileS   s   

ÿÿÿrJ   c                 C   sh   t | tƒrtjj| Ž } |rdnd}|rdnd}t| ||d}| ¡ W  d  ƒ S 1 s-w   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ÚrNr*   r+   )r-   r.   r    r/   r0   r1   Úread)r/   r3   r4   r,   r5   r   r   r   Ú	read_filee   s   
$ÿrN   c                 C   sz   g }t t | ¡ƒD ]1}tj | |¡}tj |¡r5tj |¡s5| |d ¡ t|ƒD ]}| |d | ¡ q)| |¡ q	|S )Nú/)	Úsortedr    Úlistdirr/   r0   ÚisdirÚislinkÚappendÚrlistdir)r/   ÚresÚnameÚpÚnr   r   r   rU   s   s   
€rU   c               
   C   sÌ  t tdƒsdS d } d }zÆtjdt ¡ dd}|j} | d¡ W d   ƒ n1 s)w   Y  t| dƒ€}tjdt ¡ ddf}|j}| ¡ }| ¡ }z
t 	||dd¡ W n+ t
y   Y W d   ƒ W d   ƒ W | d urrt | ¡ |d ur}t |¡ dS dS w 	 W d   ƒ W d   ƒ W | d ur—t | ¡ |d ur¢t |¡ d	S d	S 1 s§w   Y  W d   ƒ n1 s¶w   Y  W | d urÅt | ¡ |d urÐt |¡ d S d S | d urÛt | ¡ |d uråt |¡ w w )
NÚsendfileFr(   ©ÚdirÚdeletes
   0123456789rK   r   é   T)Úhasattrr    ÚtempfileÚNamedTemporaryFileÚgetcwdrW   r2   r1   ÚfilenorZ   r   r   Úunlink)ÚsrcnameÚdstnamerI   ÚsrcÚdstÚinfdÚoutfdr   r   r   Úsupports_file2file_sendfile   s^   
þùÿ
ÿù÷ÿ
ÿóÿ€
ÿþ
ÿrk   c                  C   sF   t r!tjdkr!t dtj ¡} |  d¡d  ¡ d }t|dƒdk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
   rx   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.
        )Úprefixr\   N)r`   Úmkdtempr    rb   Ú
addCleanupr   Úrmtree)Úselfrz   Údr   r   r   r{   ­   s   zBaseTest.mkdtempr   )Ú__name__Ú
__module__Ú__qualname__r{   r   r   r   r   ry   «   s    ry   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ƒoFe ¡ 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)r{   r    r/   r0   Úmkdirr6   ÚfsencodeÚassertIsInstanceÚbytesÚshutilr}   )r~   Ú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 )	Nr\   Úlinkc                     ó   ˆ   | ¡ d S r   ©rT   ©r   ©Úerrorsr   r   ÚonerrorÍ   ó   z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror©r’   rn   r   r^   )r{   r    r/   r0   r…   ÚsymlinkÚassertRaisesr   r‰   r}   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsrS   r‡   ©r~   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)r{   r    r/   r0   r…   r6   r•   r‰   r}   ÚassertFalser˜   r—   ©
r~   rŠ   r    r¡   r¢   r   r£   r¤   r¥   r¦   r   r   r   Útest_rmtree_works_on_symlinksÕ   ó$   

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 )	Nr\   rŒ   c                     r   r   rŽ   r   r   r   r   r’   ÷   r“   z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr”   rn   r   r^   )r{   r    r/   r0   r…   Ú_winapiÚCreateJunctionr|   r   rd   r–   r   r‰   r}   r—   r˜   r™   rš   r›   rœ   rS   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Ÿ   )r{   r    r/   r0   r…   r6   r«   r¬   r‰   r}   r§   r˜   r—   r¨   r   r   r   Útest_rmtree_works_on_junctionsÿ   rª   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>w   Y  |  |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©r\   T©Úignore_errorsZtstfileÚ c                     r   r   rŽ   r   r   r   r   r’   (  r“   z.TestRmTree.test_rmtree_errors.<locals>.onerrorr”   r^   r   rn   )r`   Úmktempr{   r–   ÚFileNotFoundErrorr‰   r}   r6   r    r/   r0   ÚNotADirectoryErrorrš   Ú	exceptionÚfilenamer—   r˜   r›   rœ   Úscandirr‡   Úrmdir)r~   r·   ÚtmpdirÚcmr’   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   r|   r‰   r}   r/   r0   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorrš   )r~   Zold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moder   r   r   Útest_on_error6  s*   

ÿzTestRmTree.test_on_errorc                 C   s¼   | j dk rB|tju r|  || j¡ n|tju r|  || j¡ n|  |tj¡ |  	|t
| jg¡ |  t|d tƒ¡ |  j d7  _ d S |  |tj¡ |  |t
¡ |  t|d tƒ¡ d| _ d S )Nr^   r   rn   r   )rÂ   r    rd   rš   rÃ   r¹   rÄ   rœ   rQ   ÚassertInr   r—   Ú
issubclassr   )r~   r#   ÚargÚexcr   r   r   rË   U  s   



z TestRmTree.check_args_to_onerrorc                    sP   z#t j‰ ‡ fdd„}|t _t  t¡ ttdfdƒ t t¡ W ˆ t _d S ˆ t _w )Nc                    s   | t krtƒ ‚ˆ | ƒS r   )r   r   )Úfnr   r   ©Z
orig_lstatr   r   Úraisers  s   zFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr„   )r    Úlstatr…   r   r6   r‰   r}   )r~   rÓ   r   rÒ   r   Ú+test_rmtree_does_not_choke_on_failing_lstatp  s   
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatc                    sÜ   t jt jt jt jht jkot jt jv ot jt jv }|r_|  	t
j¡ |  	t
jj¡ |  ¡ }t j |d¡}t  |¡ z"t
j}G dd„ dtƒ‰ ‡ fdd„}|t
_|  ˆ t
j|¡ W |t
_d S |t
_w |  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  s    rÖ   c                     s   ˆ ‚r   r   r   ©rÖ   r   r   Ú_raiserŽ  ó   zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r    r1   rÆ   rd   r¹   Úsupports_dir_fdrQ   Úsupports_fdÚsupports_follow_symlinksr—   r‰   Ú_use_fd_functionsr}   Úavoids_symlink_attacksr{   r/   r0   r…   Ú_rmtree_safe_fdÚ	Exceptionr–   r§   )r~   rÝ   Útmp_dirr   Zreal_rmtreerØ   r   r×   r   Ú-test_rmtree_uses_safe_fd_version_if_available€  s,   ÿ
þ
ý
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablec                 C   s<   t j|  ¡ d\}}t |¡ |  ttj|¡ t 	|¡ d S ©Nr¯   )
r`   Úmkstempr{   r    Úcloser–   rµ   r‰   r}   Úremove)r~   Úhandler/   r   r   r   Útest_rmtree_dont_delete_file˜  s   
z'TestRmTree.test_rmtree_dont_delete_filec              
   C   s€   t  t¡ z2t j td¡}t j td¡}t  |¡ t  ||¡ |  ttj	|¡ tj	|dd W tj	tdd d S tj	tdd w )NÚcheeseÚshopTr°   )
r    r…   r   r/   r0   r•   r–   r   r‰   r}   ©r~   rg   rh   r   r   r   Útest_rmtree_on_symlinkŸ  s   

"z!TestRmTree.test_rmtree_on_symlinkc              
   C   s˜   t  t¡ z>t 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 d S tjtdd w )Nré   rê   Zspamr(   Tr°   )r    r…   r   r/   r0   r1   rå   r«   r¬   r–   r   r‰   r}   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¼   ÚskipIfrq   Úplatformr_   r    r¿   rÌ   rË   rÕ   râ   rè   rì   rí   r   r   r   r   rƒ   ·   s4    	





!ÿÿ

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e ejdkd¡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)r{   r    r/   r0   r|   r‰   r}   Údirnamer6   r…   Úcopytreer—   ÚisfilerR   rN   rš   ©r~   Ú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   ƒ d S 1 s¦w   Y  d S )
Nznonexisting.txtrö   Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)Údirs_exist_okF)r{   r|   r‰   r}   r6   r    r…   r/   r0   rú   r—   rû   rR   rN   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ƒrRt |t	j
t	jB ¡ ttd	ƒrctt	d
ƒrct |t	j¡ t |¡}tj||dd |  tj tj |dd¡¡¡ t tj |dd¡¡}tjdkrš| d¡rš|dd … }|  |tj |d¡¡ t |¡}	ttdƒr·|  |	j|j¡ ttd	ƒrÆ|  |	j|j¡ d S d S )Nrg   rh   Úsubzfile.txtr„   rŒ   zsub/linkÚlchmodÚlchflagsÚ	UF_NODUMPT©ÚsymlinksÚntz\\?\é   )r{   r    r/   r0   r…   r6   r•   r_   r  rÆ   ÚS_IRWXUÚS_IRWXOr  r  rÔ   r‰   rú   r—   rS   ÚreadlinkrW   Ú
startswithrš   rÇ   Úst_flags)
r~   rá   rý   rþ   Zsub_dirÚsrc_linkÚdst_linkÚsrc_statrÿ   Údst_statr   r   r   Útest_copytree_symlinksê  s:   

ÿ




ÿ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ƒ z3t dd¡}tj	|||d |  
|||dƒƒ¡ |  |||dƒƒ¡ |  |||dƒƒ¡ W t |¡ nt |¡ w z5t dd¡}tj	|||d |  |||dƒƒ¡ |  |||dd	ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ w z*dd„ }tj	|||d |  |||dd	d
ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ w W t |¡ t t j |¡¡ d S t |¡ t t j |¡¡ w )Nrô   rõ   rö   ztest.tmpr÷   rø   Z	test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp©Úignorezsubdir*c                 S   sf   g }|D ],}t j | |¡}t j |¡r!| ¡ d dkr!| |¡ qt j |¡d dv r0| |¡ q|S )Nrm   r  z.py)r    r/   r0   rR   rv   rT   Úsplitext)rg   ÚnamesrV   rW   r/   r   r   r   Ú_filter2  s   ÿ
€z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r    r/   r0   r˜   r{   r6   r…   r‰   Úignore_patternsrú   r—   r§   r}   rù   )r~   r0   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   )rT   r‡   ÚstrÚlistrš   r›   Úset)rg   r  rW   ©Zinvokationsr~   r   r   Ú_ignoreY  s   
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorerô   r  r   é	   )r    r/   r0   r˜   r{   r…   r6   r‰   rú   r—   ÚpathlibÚPathr!  r¸   r‡   ÚDirEntryrš   r›   )r~   r0   r˜   rá   rý   r$  rþ   Zsrc_dir_entryr   r#  r   Ú!test_copytree_arg_types_of_ignoreK  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¯   rn   )r{   r    r/   r0   r…   r|   r‰   r}   rÊ   r6   r`   r   rú   rš   rÆ   rÇ   rv   )r~   rá   rý   rþ   Zrestrictive_subdirZrestrictive_subdir_dstr   r   r   Ú!test_copytree_retains_permissionsu  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   ƒ d S 1 s<w   Y  d S )Nrô   zka-boom)r{   r    r/   r0   r|   r‰   r}   rù   ÚPermissionErrorÚside_effectr–   r   rú   )r~   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dd}| ¡  W d   ƒ n1 s2w   Y  tj	ˆˆ |d ˆ 
tˆƒd	¡ d S )
Nc                    sR   ˆ  d ¡ ˆ | t¡ ˆ |t¡ ˆ | tj ˆd¡¡ ˆ |tj ˆ d¡¡ d S ©Nr„   )rT   r‡   r   rš   r    r/   r0   )rÀ   rÁ   ©rh   Úflagr~   rg   r   r   Úcustom_cpfun   s
   
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr¯   r„   r)   r*   r+   ©Úcopy_functionrn   )r{   r`   r³   r1   r    r/   r0   rå   r‰   rú   rš   r›   )r~   r1  rI   r   r/  r   Ú"test_copytree_custom_copy_functionž  s   
ÿz/TestCopyTree.test_copytree_custom_copy_functionÚmkfifoúrequires os.mkfifo()Úvxworksú%fifo requires special path on VxWorksc              
   C   sP  t  t¡ z“t j td¡}t  |¡ t j |d¡}zt  |¡ W n ty9 } z|  d| ¡ W Y d }~nd }~ww zt 	tt
¡ W n/ tjyq } z"|jd }|  t|ƒd¡ |d \}}}|  d| |¡ W Y d }~nd }~ww |  d¡ W tjtdd	 tjt
dd	 d S W tjtdd	 tjt
dd	 d S tjtdd	 tjt
dd	 w )
Nr  Zmypipeúos.mkfifo(): %sr   rn   z`%s` is a named pipez$shutil.Error should have been raisedTr°   )r    r…   r   r/   r0   r5  r+  ÚskipTestr‰   rú   ÚTESTFN2r   r   rš   r›   Úfailr}   )r~   r  ÚpipeÚer‘   rg   rh   Z	error_msgr   r   r   Útest_copytree_named_pipe°  s8   

€ÿ
€üûÿ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                    ó   ˆ   | |f¡ d S r   rŽ   ©rg   rh   ©Zcopiedr   r   Ú_copyÓ  ó   z6TestCopyTree.test_copytree_special_func.<locals>._copyr2  r^   )
r{   r    r/   r0   r6   r…   r‰   rú   rš   r›   )r~   rý   rþ   rC  r   rB  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  )r{   r    r/   r0   r•   r…   r6   r–   r   r‰   rú   ÚassertNotInrQ   rÍ   ©r~   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 s-w   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  rF  )r{   r    r/   r0   r…   r1   r•   r‰   rú   r§   rS   rÍ   rQ   r—   rI  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„   )r{   r|   r‰   r}   r    r/   r0   r6   rú   rš   rQ   )r~   rý   rþ   rg   Ú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)r{   r|   r‰   r}   r    r/   r0   Úmakedirsr6   rú   rš   rQ   )r~   Úbase_dirrý   rþ   rg   rN  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-  r4  rð   r_   r    rñ   rq   rò   r?  rE  rJ  rL  rO  rS  r   r   r   r   ró   ¼  s0    
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ƒoBeedƒoBe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¡e e!j"d9kd:¡d;d<„ ƒƒZ#d=d>„ Z$d?d@„ Z%e e&pãe'pãe(dA¡dBdC„ ƒZ)dDdE„ Z*dFS )GÚ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 d S )Nr„   ÚbarÚbazÚquuxr
  )r{   r    r/   r0   r6   r•   rÊ   rÆ   r  ÚS_IRWXGr  ÚassertNotEqualrÇ   r‰   Úcopymoderš   rW   ©r~   rá   rg   rh   r  r  r   r   r   Útest_copymode_follow_symlinks  s2   


 ô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„   rW  rX  rY  F©Úfollow_symlinks)r{   r    r/   r0   r6   r•   rÊ   rÆ   r  rZ  r  r  r‰   r\  rš   rÔ   rÇ   r[  r]  r   r   r   Ú test_copymode_symlink_to_symlink;  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 r_  )r{   r    r/   r0   r6   r•   r‰   r\  r]  r   r   r   Ú*test_copymode_symlink_to_symlink_wo_lchmodY  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ƒrat |tj¡ ttdƒrrttdƒrrt |tj¡ t |¡}ttdƒrtj||d	d
 |  	|jt |¡j¡ tj||dd
 t |¡}tjtjv rµdD ]}	|  t||	ƒt||	ƒd ¡ q¤ttdƒrÂ|  |j|j¡ ttdƒrÔt|dƒrÔ|  |j|j¡ tj||dd
 |  tt |¡jt |¡j ƒdk ¡ d S )Nr„   rW  rX  Úquxg      E@r  r  r  Tr`  F©Úst_atimeÚst_mtimern   r  gš™™™™™¹?)r{   r    r/   r0   r6   rÆ   Úutimerf  rg  r[  r•   r_   r  r  r  r  rÔ   r‰   ÚcopystatrÇ   rÜ   ÚassertLessEqualr   rš   r  r—   Úabs)
r~   rá   rg   rh   r  r  r  Úsrc_link_statZdst_link_statÚattrr   r   r   Útest_copystat_symlinksi  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}z,tjtjfD ]}||ƒt_t	 
||¡ q*|tjtj ƒt_|  tt	j
||¡ W |t_d S |t_w )Nr£   Úfile2Úxxxc                    s   t ƒ ‰ddœ‡ ‡fdd„
}|S )NTr`  c                   s
   ˆ ˆ_ ˆ‚r   )r   )r/   Úflagsra  ©ÚerrÚexr   r   Ú_chflags_raiser   s   zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser©r   )rv  rx  r   ru  r   Úmake_chflags_raiser  s   zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)r{   r    r/   r0   r6   ro  r   rp  rq  r‰   ri  r–   r   )r~   rº   r£   rr  rz  Zold_chflagsrv  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	„}ztj‰|t_t ˆ|¡ |  dt 
|¡¡ W ˆt_nˆt_w d
dœ‡ ‡fdd„
}ztj
‰ |t_
t ˆ|¡ W ˆ t_
nˆ t_
w 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„   rW  úuser.fooó   42zuser.baró   43ÚEPERMc                    s$   |dkrˆ‚ˆ | ||fi |¤Ž d S )Nr|  r   )Úfnamerm  Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_fooÈ  s   z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTr`  c                   s    | ˆkr
t tjdƒ‚ˆ | |dS )NzOperation not supportedr`  )r   r   rq  )r€  ra  )Úorig_listxattrrg   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)r{   r    r/   r0   r6   r‰   Ú
_copyxattrÚsetxattrrš   rP   Z	listxattrÚgetxattrræ   r   r   r  rÍ   rÊ   ri  )r~   rá   rh   r„  r†  ZsrcroZdstror   )r…  r‚  rƒ  rg   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„   rX  ztrusted.foor}  r~  Fr`  rW  rd  )r{   r    r/   r0   r6   r•   rˆ  r‰   r‡  rš   r‰  r–   r   )r~   rá   rg   r  rh   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õ   rs  )r{   r6   r    r/   r0   )r~   Úmethodr€  rº   r£   Útmpdir2rr  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Ç   )r~   r£   rr  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ƒr3t |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 d S )Nr„   rW  rX  r  Tr`  F)r{   r    r/   r0   r6   r•   r_   r  rÆ   r  r  r‰   r  r§   rS   rš   rN   ræ   r—   r  rÔ   rÇ   )r~   rá   rg   rh   r  r   r   r   Útest_copy_symlinks  s(   




ÿÿzTestCopy.test_copy_symlinksrh  zrequires os.utimec                 C   s¤   |   tj¡\}}|  tj |¡¡ t |¡}t |¡}|  |j	|j	¡ dD ]}|  
t||ƒt||ƒd ¡ q%ttdƒrNt|dƒrP|  t|dƒt|dƒ¡ d S d S d S )Nre  rn   ro  r  )r  r‰   Úcopy2r—   r    r/   r˜   rÆ   rš   rÇ   rj  r   r_   )r~   r£   rr  Z
file1_statZ
file2_statrm  r   r   r   Ú
test_copy25  s   

ÿÿÿzTestCopy.test_copy2c           	      C   s¬  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ ttdƒr3t |tj	tj
B ¡ ttdƒrDttdƒrDt |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 r©d
D ]}|  t||ƒt||ƒd ¡ q˜ttdƒr¾|  |j|j¡ |  |j|j¡ ttdƒrÒt|dƒrÔ|  |j|j¡ d S d S d S )Nr„   rW  rX  r  r  r  Tr`  Fre  rn   r  )r{   r    r/   r0   r6   r•   r_   r  rÆ   r  r  r  r  rÔ   r‰   r“  r§   rS   rš   rN   ræ   r—   r  rh  rÜ   rj  r   rÇ   r[  r  )	r~   rá   rg   rh   r  r  rl  r  rm  r   r   r   Útest_copy2_symlinksF  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„   rW  r|  r}  )r{   r    r/   r0   r6   rˆ  r‰   r“  rš   r‰  ræ   )r~   rá   rg   rh   r   r   r   Útest_copy2_xattri  s   


þzTestCopy.test_copy2_xattrc                 C   sˆ   t jt jfD ];}|  ¡ }|  ¡ }tj |d¡}t|dƒ |||ƒ}|  |tj |d¡¡ ||tj |d¡ƒ}|  |tj |d¡¡ qd S )Nr„   rW  )	r‰   r  r“  r{   r    r/   r0   r6   rš   )r~   rÑ   rý   rþ   rg   rN  r   r   r   Útest_copy_return_valuev  s   

øzTestCopy.test_copy_return_valuec                 C   ó   |   tj¡ d S r   )Ú_test_copy_dirr‰   r  ©r~   r   r   r   Útest_copy_dir‚  ó   zTestCopy.test_copy_dirc                 C   r˜  r   )r™  r‰   r“  rš  r   r   r   Útest_copy2_dir…  rœ  zTestCopy.test_copy2_dirc                 C   sx   |   ¡ }tj |d¡}|   ¡ }tj |d¡}t|dƒ tjdkr#t}nt}|  	||||¡ |  	||||¡ |||ƒ d S ©Nr„   údoes_not_exist/Úwin32)
r{   r    r/   r0   r6   rq   rò   r+  ÚIsADirectoryErrorr–   )r~   Z	copy_funcrý   Úsrc_filer¡   rh   rv  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 )Nrg   rh   r  rŒ   r„   Fr`  )r{   r    r/   r0   r6   r•   r‰   Úcopyfiler—   rS   rš   r  r§   )r~   rá   rg   rh   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¡}zvt|ddd}| d¡ W d   ƒ n1 s+w   Y  zt  ||¡ W n tyQ } z|  	d| ¡ W Y d }~nd }~ww |  
tjtj||¡ t|ddd}|  | ¡ d¡ W d   ƒ n1 svw   Y  t  |¡ W tjtd	d
 d S tjtd	d
 w )Nré   rê   r)   r*   r+   Úcheddarzos.link(): %srL   Tr°   )r    r…   r   r/   r0   r1   r2   rŒ   r+  r:  r–   r‰   r   r£  rš   rM   ræ   r}   )r~   rg   rh   rI   r>  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¡}zZt|ddd}| d¡ W d   ƒ n1 s+w   Y  t  d|¡ |  t	j
t	j||¡ t|ddd}|  | ¡ d¡ W d   ƒ n1 sZw   Y  t  |¡ W t	jtdd	 d S t	jtdd	 w )
Nré   rê   r)   r*   r+   r¥  rL   Tr°   )r    r…   r   r/   r0   r1   r2   r•   r–   r‰   r   r£  rš   rM   ræ   r}   )r~   rg   rh   rI   r   r   r   Ú*test_dont_copy_file_onto_symlink_to_itself¿  s   
ÿÿ"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr5  r6  r7  r8  c              
   C   sˆ   zt  t¡ W n ty  } z|  d| ¡ W Y d }~nd }~ww z|  tjtjtt	¡ |  tjtjt
t¡ W t  t¡ d S t  t¡ w )Nr9  )r    r5  r   r+  r:  r–   r‰   ÚSpecialFileErrorr£  r;  Ú__file__ræ   )r~   r>  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 )NrW  r„   )r{   r    r/   r0   r6   r‰   r£  r—   r˜   rš   rN   )r~   rý   rþ   Údst_filer¢  rN  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.  )r{   r    r/   r0   r6   r–   r   r‰   r£  r   rš   rN   )r~   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Ÿ  )	r{   r    r/   r0   r6   r–   r´   r‰   r£  )r~   rý   r¢  rh   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r#t}nt}|  	|t
j||¡ |  	|t
j||¡ |  	|t
j||¡ d S rž  )r{   r    r/   r0   r6   rq   rò   r+  r¡  r–   r‰   r£  )r~   rý   r¢  r¡   rh   rv  r   r   r   Útest_copyfile_copy_dir  s   

zTestCopy.test_copyfile_copy_dirN)+r€   r   r‚   r   rî   r^  rï   rð   r_   r    rb  rñ   rc  rn  r   r{  Zskip_unless_xattrrŠ  r¿   rŒ  r  r‘  r’  r”  r•  r–  r—  r›  r  r™  r¤  r¦  r§  rq   rò   rª  r¬  r­  ÚMACOSÚSOLARISr«   r®  r¯  r   r   r   r   rV    sp    

(ÿý

?ÿ



"



ÿ
rV  c                   @   st  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 o¤e!ƒ  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>w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |d¡}|  | ¡ g d¢¡ W d   ƒ n1 sww   Y  t 	|¡ t|d|dƒ}W d   ƒ n1 s“w   Y  |  ||d	 ¡ |  tj |¡¡ |  t |¡¡ t |d
¡}|  | ¡ g d¢¡ W d   ƒ d S 1 sÍw   Y  d S )Nr²   ÚarchiveÚgztarÚ.ú.tar.gzzr:gz)rµ  z./subz./sub2z./file1z./file2z./sub/file3Útarú.tarrL   )Ú_create_filesr{   r    r¹   r/   rù   r0   Úbasenamer   Ú
change_cwdÚabspathr   rš   r—   rû   ÚtarfileZ
is_tarfiler1   ÚassertCountEqualÚgetnames)	r~   Úroot_dirrR  rŽ  Úwork_dirÚrel_base_nameÚ	base_nameÚtarballZtfr   r   r   Útest_make_tarball  s8   
þ
ÿÿÿ
ÿ"ÿzTestArchives.test_make_tarballc                 C   sF   t  |¡}| ¡ }| ¡  t|ƒW  d   ƒ S 1 sw   Y  d S r   )r½  r1   r¿  Úsortr.   )r~   r/   r·  r  r   r   r   Ú_tarinfo?  s
   $ýzTestArchives._tarinfoÚdistc                 C   s’   |   ¡ }tj ||¡}tj|dd t|dfdƒ t|dfdƒ t tj |d¡¡ t|ddfdƒ t tj |d¡¡ |rEt|d	fdƒ ||fS )
NT)Úexist_okr£   rs  rr  r  Zfile3Zsub2Úouter)r{   r    r/   r0   rQ  r6   r…   )r~   rR  rÀ  rÈ  r   r   r   r¹  E  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/   r0   r{   r   rš   r—   rû   rs   Ú
check_callÚDEVNULLrÇ  )r~   rÀ  rR  rÃ  rÄ  Ztarball2Ztar_cmdr   r   r   Útest_tarfile_vs_tarS  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 s<w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡}|  | ¡ g d¢¡ W d   ƒ n1 stw   Y  t 	|¡ tj 
|¡}t|d||ƒ}W d   ƒ n1 s–w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡}|  | ¡ g d¢¡ W d   ƒ d S 1 sÏw   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¹  r{   r    r¹   r/   rù   r0   rº  r   r»  r¼  r   rš   r—   rû   ÚzipfileÚ
is_zipfileÚZipFiler¾  Únamelist)	r~   rÀ  rR  rŽ  rÁ  rÂ  rÃ  rV   Úzfr   r   r   Útest_make_zipfilet  s:   
þ
ÿÿþ
ÿ"ÿ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[w   Y  t |¡}| ¡ }	W d   ƒ n1 stw   Y  |  t|ƒt|	ƒ¡ d S )Nr³  rÒ  rÓ  zarchive2.zipz-qz-rrË  )r¹  r    r/   r0   r{   r   rš   r—   rû   rs   rÏ  rÐ  rÚ  rÜ  rÝ  rP   )
r~   rÀ  rR  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	 
|¡J z
tj|tjd W n. tjyj } z!|jjdd}d	|v rU|  d
¡ d}|  | ||¡¡ W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S 1 s~w   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/   r0   r{   r   rš   r—   rû   r   r»  rs   Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder:  r<  Úformat)	r~   rÀ  rR  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³  rs  )r{   r    r/   r0   r–   Ú
ValueErrorr   )r~   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/   r0   r{   r   r—   rû   )r~   rò  rñ  rÀ  rR  rÃ  rV   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 s7w   Y  |  tj |¡¡ t |¡}z| ¡ D ]}|  |jd¡ |  |jd¡ qOW | ¡  d S | ¡  w )Nr³  r   r´  rÈ  rð  )r¹  r    r/   r0   r{   rô  rõ  rö  r÷  r   r»  r   r—   rû   r½  r1   Z
getmembersrš   ÚuidÚgidrå   )	r~   rÀ  rR  rÃ  rò  rñ  Úarchive_namer³  Úmemberr   r   r   Útest_tarfile_root_ownerì  s"   
ÿÿ
þz$TestArchives.test_tarfile_root_ownerc                 C   sr   t  ¡ }dd„ }td|g dƒ z$ztdd|  ¡ d W n	 ty$   Y nw |  t  ¡ |¡ W tdƒ d S tdƒ w )Nc                  _   s   t ƒ ‚r   )ÚRuntimeError)r   Úkwr   r   r   Ú_breaks  s   z3TestArchives.test_make_archive_cwd.<locals>._breaksrs  úxxx file)rÀ  )r    rb   r   r   r{   rà   rš   r   )r~   Zcurrent_dirr  r   r   r   Útest_make_archive_cwd  s   ÿz"TestArchives.test_make_archive_cwdc                 C   ó\   |   ¡ }t |¡ |  tddƒd¡ |  tj d¡¡ W d   ƒ d S 1 s'w   Y  d S )NÚtestr·  ztest.tar©	r{   r   r»  rš   r   r—   r    r/   rû   ©r~   rÀ  r   r   r   Útest_make_tarfile_in_curdir  s
   "þz(TestArchives.test_make_tarfile_in_curdirc                 C   r  )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 )Nrs  rn   c                   S   ó   t S r   ©Úxr   r   r   r   Ú<lambda>$  ó    z;TestArchives.test_register_archive_format.<locals>.<lambda>c                   S   r
  r   r  r   r   r   r   r  &  r  )rn   r^   )rn   r^   r   c                   S   r
  r   r  r   r   r   r   r  )  r  r  c                 S   ó   g | ]\}}|‘qS r   r   ©r@   rW   Úparamsr   r   r   rB   *  ó    z=TestArchives.test_register_archive_format.<locals>.<listcomp>c                 S   r  r   r   r  r   r   r   rB   .  r  )r–   Ú	TypeErrorr   r   rÍ   r   rH  )r~   Ú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  4  r  z3TestArchives.check_unpack_archive.<locals>.<lambda>)Ú#check_unpack_archive_with_converterr&  r'  r   )r~   rê  r   r   r   Úcheck_unpack_archive3  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ê  rs  )r¹  rU   ræ   r    r/   r0   r{   r   r   rš   r–   r‰   Ú	ReadErrorr   rí  )
r~   rê  Ú	converterrÀ  rR  ÚexpectedrÃ  r·   rŽ  Ztmpdir3r   r   r   r  8  s   
z0TestArchives.check_unpack_archive_with_converterc                 C   ó   |   d¡ d S )Nr·  ©r  rš  r   r   r   Útest_unpack_archive_tarM  r“   z$TestArchives.test_unpack_archive_tarc                 C   r  )Nr´  r  rš  r   r   r   Útest_unpack_archive_gztarP  ó   z&TestArchives.test_unpack_archive_gztarc                 C   r  )NÚbztarr  rš  r   r   r   Útest_unpack_archive_bztarT  r   z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largerc                 C   r  )NÚxztarr  rš  r   r   r   Útest_unpack_archive_xztarX  s   z&TestArchives.test_unpack_archive_xztarc                 C   r  )NrÒ  r  rš  r   r   r   Útest_unpack_archive_zip]  r   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 )Nrn   ú	stuff.booÚxx)rš   )r·   Úextract_dirÚextrarš  r   r   Ú_booe  s   z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r)  rn   r&  r'  ZBoo2r²   )	r   r   r   r–   r	   r
   rÍ   rH  rš   )r~   r  r*  r   rš  r   Útest_unpack_registrya  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ñ   rp   rx   r$  r%  r+  r   r   r   r   r²    s\    
#
ÿ
$ÿÿ





r²  c                   @   sL   e Zd Ze eedƒd¡dd„ ƒZe ed¡e ee	dƒd¡dd	„ ƒƒZ
d
S )ÚTestMiscÚ
disk_usagez)disk_usage not available on this platformc                 C   s†   t  tj t¡¡}dD ]}|  t||ƒt¡ q|  	|j
d¡ |  	|jd¡ |  |jd¡ |  |j
|j¡ |  	|j
|j¡ t  t¡ d S )N)r7   ÚusedÚfreer   )r‰   r.  r    r/   rù   r©  r‡   r   rw   ZassertGreaterr7   r/  ÚassertGreaterEqualr0  )r~   Úusagerm  r   r   r   Útest_disk_usage~  s   zTestMisc.test_disk_usagerù  Úchownzrequires os.chownc                    s‚  ˆ  ¡ }tj|d‰ tˆ dƒ ˆ t¡ t ˆ ¡ W d   ƒ n1 s$w   Y  ˆ t¡ tjˆ dd W d   ƒ n1 s@w   Y  ˆ t¡ tjˆ dd W d   ƒ n1 s\w   Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 sww   Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 s’w   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y$   Y d S w 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rˆ ||j¡ d S d S r   )r    rÆ   rš   Úst_uidÚst_gid)r/   rú  rû  Ús©r·   r~   r   r   Úcheck_chown¦  s   
ÿz(TestMisc.test_chown.<locals>.check_chown)rû  r   )NN)r{   r`   r³   r6   r–   rí  r‰   r4  ÚLookupErrorr  r    ÚgetuidÚgetgidrö  r÷  rô  rõ  ÚKeyError)r~   rù   rú  rû  r;  r5  rò  r   r:  r   Ú
test_chown  s^   
ÿÿÿÿÿ



þzTestMisc.test_chownN)r€   r   r‚   rï   rð   r_   r‰   r3  ró  r    r@  r   r   r   r   r-  |  s    ÿ

r-  c                   @   sè   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	e
edƒo$e ¡ 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)rz   z.Exe©r\   rz   Úsuffixz.EXE)r{   Útemp_dirr`   ra   Ú	temp_filer    rÊ   rW   rÆ   ÚS_IXUSRr|   rå   r/   rv   r\   Ú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,  rG  r\   rš   rE  rW   ©r~   rN  r   r   r   Ú
test_basicÜ  s   zTestWhich.test_basicc                 C   s(   t j| jj| jd}|  || jj¡ d S rL  )r‰   r,  rE  rW   rD  rš   rM  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 s0w   Y  tj| jd tj	||d}|  |¡ W d   ƒ d S 1 sTw   Y  d S rL  )r    r/   rv   r\   r0   rG  r   r»  r‰   r,  rD  rš   ÚassertIsNone)r~   rR  Útail_dirÚrelpathrN  r   r   r   Útest_relative_cmdç  s   þ"þzTestWhich.test_relative_cmdc                 C   s’   t j | j¡}tj| jd1 tj| j|d}t	j
dkr*|  |t j | j| j¡¡ n|  |¡ W d   ƒ d S W d   ƒ d S 1 sBw   Y  d S )Nr  r   )r    r/   rù   r\   r   r»  r‰   r,  rG  rq   rò   rš   r0   rI  rP  )r~   rR  rN  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/   r4   )r    rÊ   rE  rW   rÆ   rÈ   ÚaccessÚW_OKr:  r‰   r,  rG  r\   rP  rM  r   r   r   Útest_non_matching_mode   s
   
z TestWhich.test_non_matching_modec                 C   sl   t j | j¡\}}tj|d tj| j|d}|  	|t j 
|| j¡¡ W d   ƒ d S 1 s/w   Y  d S rL  )r    r/   rv   r\   r   r»  r‰   r,  rG  rš   r0   )r~   rR  rQ  rN  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,  r\   rP  rM  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,  rG  r\   rš   rE  rW   rJ  rM  r   r   r   Útest_pathext_checking  s   "zTestWhich.test_pathext_checkingc                 C   sT   t  ¡ }| j|d< t | j¡}|  || jj¡ W d   ƒ d S 1 s#w   Y  d S ©NÚPATH)	r   ÚEnvironmentVarGuardrH  r‰   r,  rG  rš   rE  rW   ©r~   ÚenvrN  r   r   r   Útest_environ_path  s
   

"ýzTestWhich.test_environ_pathc                 C   sì   t  ¡ h}d|d< tjjd| jddA t td| j¡) t  	| j¡ t
 | j¡}|  |¡ W d   ƒ n1 s9w   Y  W d   ƒ n1 sHw   Y  W d   ƒ n1 sWw   Y  W d   ƒ d S W d   ƒ d S 1 sow   Y  d S )Nr²   r]  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   r^  rï   rT  rU  r\   r   Ú	swap_attrr    r»  r‰   r,  rG  rP  r_  r   r   r   Útest_environ_path_empty#  s&   
ÿþ
ýû€ € þ"þz!TestWhich.test_environ_path_emptyc                 C   sH  t j | jj¡}tjdkr!t j}t|t	ƒrt  
|¡}t j ||¡}t ¡ u}t j|d< tjjd| jddM t t d| j¡5 t | j¡}|  |¡ t | j¡ t | j¡}|  ||¡ W d   ƒ n1 sgw   Y  W d   ƒ n1 svw   Y  W d   ƒ n1 s…w   Y  W d   ƒ d S W d   ƒ d S 1 sw   Y  d S )Nr   r]  rb  Trc  rf  )r    r/   rº  rE  rW   rq   rò   rI  r-   rˆ   r†   r0   r   r^  Úpathseprï   rT  rU  r\   r   rg  r‰   r,  rG  rP  r»  rš   )r~   Zexpected_cwdrI  r`  rN  r   r   r   Útest_environ_path_cwd.  s4   




ÿþ
þ€ù€ þ"þzTestWhich.test_environ_path_cwdc              
   C   s6  t  ¡ }| dd ¡ tjjdtdd& t t	d| j
¡ t | j¡}W d   ƒ n1 s.w   Y  W d   ƒ n1 s=w   Y  |  || jj¡ tjjd| j
dd% t t	dd¡ t | j¡}W d   ƒ n1 smw   Y  W d   ƒ n1 s|w   Y  |  || jj¡ W d   ƒ d S 1 s”w   Y  d S )Nr]  rb  T)r,  re  rf  rc  r²   )r   r^  Úpoprï   rT  rU  rí  r   rg  r    r\   r‰   r,  rG  rš   rE  rW   r_  r   r   r   Útest_environ_path_missingD  s.   

ÿþý€ ÿþý€ "ñz#TestWhich.test_environ_path_missingc              	   C   sž   t j | j¡}tj| jd7 t ¡ }| j|d< tj	| j
dd}|  |¡ W d   ƒ n1 s0w   Y  W d   ƒ d S W d   ƒ d S 1 sHw   Y  d S )Nr  r]  r²   )r    r/   rù   r\   r   r»  r^  rH  r‰   r,  rG  rP  )r~   rR  r`  rN  r   r   r   Útest_empty_pathV  s   ÿ
PüzTestWhich.test_empty_pathc                 C   sP   t  ¡ }| dd ¡ t | j¡}|  |¡ W d   ƒ d S 1 s!w   Y  d S r\  )r   r^  rk  r‰   r,  rG  rP  r_  r   r   r   Útest_empty_path_no_PATH^  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 ¡ }||d< tj|| jd}|  ||j¡ W d   ƒ d S 1 sKw   Y  d S )Nú.xyzÚTmp2rB  r   ÚPATHEXTr  )r`   ra   rD  r    rÊ   rW   rÆ   rF  r|   rå   r/   rº  r  r   r^  r‰   r,  rš   ©r~   rJ  Ztemp_filexyzZprogramr`  rN  r   r   r   Útest_pathextd  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   ƒ d S 1 sFw   Y  d S )Nro  rp  rB  r   ú;rq  r  )r`   ra   rD  r|   rå   r    r/   rº  rW   r  r   r^  r‰   r,  rš   rr  r   r   r   Útest_pathext_with_empty_strv  s   ÿ
"ýz%TestWhich.test_pathext_with_empty_strN)r€   r   r‚   rK  rN  rO  rS  rT  rï   rñ   r_   r    r¿   rW  rX  rY  rð   rq   rò   r[  ra  rh  rj  rl  rm  rn  rs  ru  r   r   r   r   rA  Ì  s4    ÿ
ÿ

rA  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   )
rA  rK  r    r†   r\   rG  rE  rW   rI  rJ  rš  r   r   r   rK  ˆ  s   
zTestWhichBytes.setUpN)r€   r   r‚   rK  r   r   r   r   rv  ‡  s    rv  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:ƒo·e (¡ d;ko·e'ed<ƒo·e'e)d=ƒo·e'e)d>ƒd?¡d@dA„ ƒZ*dBS )CÚTestMovec                 C   sx   d}|   ¡ | _|   ¡ | _tj | j|¡| _tj | j|¡| _t| jdƒ}| 	d¡ W d   ƒ d S 1 s5w   Y  d S )Nr„   r(   r6  )
r{   rý   rþ   r    r/   r0   r¢  r«  r1   r2   )r~   r·   rI   r   r   r   rK  “  s   

"ÿzTestMove.setUpc                 C   sŽ   t |dƒ}| ¡ }W d   ƒ n1 sw   Y  t ||¡ t |dƒ}|  || ¡ ¡ W d   ƒ n1 s7w   Y  |  tj |¡¡ d S ©NrK   )	r1   rM   r‰   Úmoverš   r§   r    r/   r˜   )r~   rg   rh   Úreal_dstrI   Úcontentsr   r   r   Ú_check_move_fileœ  s   
ÿÿzTestMove._check_move_filec                 C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S r   )	rP   r    rQ   r‰   ry  rš   r§   r/   r˜   )r~   rg   rh   rz  r{  r   r   r   Ú_check_move_dir¤  s   zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )r|  r¢  r«  rš  r   r   r   Útest_move_fileª  ó   zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )r|  r¢  rþ   r«  rš  r   r   r   Útest_move_file_to_dir®  r  zTestMove.test_move_file_to_dirc                 C   s"   t  | j¡}|  || j| j¡ d S r   )r&  r'  r¢  r|  rþ   r«  )r~   rg   r   r   r   Ú"test_move_file_to_dir_pathlike_src²  ó   z+TestMove.test_move_file_to_dir_pathlike_srcc                 C   s"   t  | j¡}|  | j|| j¡ d S r   )r&  r'  rþ   r|  r¢  r«  ©r~   rh   r   r   r   Ú"test_move_file_to_dir_pathlike_dst·  r‚  z+TestMove.test_move_file_to_dir_pathlike_dstc                 C   ó   |   ¡  d S r   )r~  rš  r   r   r   Útest_move_file_other_fs¼  ó   z TestMove.test_move_file_other_fsc                 C   r…  r   )r€  rš  r   r   r   Útest_move_file_to_dir_other_fsÁ  r‡  z'TestMove.test_move_file_to_dir_other_fsc              	   C   s>   t j|  ¡ d}z|  | j||¡ W t |¡ d S t |¡ w rã   )r`   r³   r{   r}  rý   r   r}   ©r~   rþ   r   r   r   Útest_move_dirÆ  s   zTestMove.test_move_dirc                 C   r…  r   )rŠ  rš  r   r   r   Útest_move_dir_other_fsÎ  r‡  zTestMove.test_move_dir_other_fsc              
   C   s,   |   | j| jtj | jtj | j¡¡¡ d S r   )r}  rý   rþ   r    r/   r0   rº  rš  r   r   r   Útest_move_dir_to_dirÓ  s   ÿzTestMove.test_move_dir_to_dirc                 C   r…  r   )rŒ  rš  r   r   r   Útest_move_dir_to_dir_other_fsØ  r‡  z&TestMove.test_move_dir_to_dir_other_fsc              
   C   ó4   |   | jtjj | jtj | jtj | j¡¡¡ d S r   )r}  rý   r    r/   Úseprþ   r0   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   rŽ  r   )r}  rý   r    r/   Úaltseprþ   r0   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w   Y  |  tjtj| j| j¡ d S )Nr(   )r1   r«  r–   r‰   r   ry  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 ©NrW  )r    r/   r0   rý   r–   r‰   r   ry  rƒ  r   r   r   Útest_dont_move_dir_in_itselfì  s   z%TestMove.test_dont_move_dir_in_itselfc              	   C   óp   t  t¡ z,dD ]!\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW t 	t¡ d S t 	t¡ w )N))Úsrcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)©rë  )
r    r…   r   r/   r0   r—   r‰   Ú
_destinsrcr   r}   rë   r   r   r   Útest_destinsrc_false_negativeñ  ó   
ÿÿýz&TestMove.test_destinsrc_false_negativec              	   C   r–  )N))r—  zsrc/dest)r—  z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r˜  )
r    r…   r   r/   r0   r§   r‰   r™  r   r}   rë   r   r   r   Útest_destinsrc_false_positiveý  r›  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/   r0   rý   r•   r¢  r‰   ry  r«  r—   rS   Úsamefilerƒ  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/   r0   rý   r•   r¢  r‰   ry  rþ   r—   rS   r  )r~   r·   rh   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 ©NrX  rW  rY  )r    r/   r0   rý   r•   rþ   r‰   ry  r—   rS   rš   Úrealpath©r~   rg   rh   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/   r0   rý   r…   r•   rþ   r‰   ry  r—   rS   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‰   ry  r¢  rþ   rš   r    r/   r0   rº  rM  r   r   r   Útest_move_return_value4  s   ÿzTestMove.test_move_return_valuec                 C   s6   t  | jtj | jd¡¡}|  |tj | jd¡¡ d S r”  )r‰   ry  r¢  r    r/   r0   rþ   rš   rM  r   r   r   Ú test_move_as_rename_return_value9  s   z)TestMove.test_move_as_rename_return_valuec                    s8   g ‰ ‡ fdd„}t j| j| j|d |  tˆ ƒd¡ d S )Nc                    r@  r   rŽ   rA  ©Zmovedr   r   rC  @  rD  z7TestMove.test_move_file_special_function.<locals>._copyr2  rn   )r‰   ry  r¢  rþ   rš   r›   ©r~   rC  r   r§  r   Útest_move_file_special_function=  s   z(TestMove.test_move_file_special_functionc                    sd   g ‰ ‡ fdd„}t  tj | jd¡¡ t  tj | jd¡¡ tj| j| j|d |  	t
ˆ ƒd¡ d S )Nc                    r@  r   rŽ   rA  r§  r   r   rC  H  rD  z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r2  r   )r   rÅ   r    r/   r0   rý   r‰   ry  rþ   rš   r›   r¨  r   r§  r   Útest_move_dir_special_functionE  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 |¡ d S t |¡ w r   )r{   rý   r    r/   r0   rù   rº  Úupperr[  r‰   ry  r—   rR   r¹   r‰  r   r   r   Útest_move_dir_caseinsensitiveO  s   
þz&TestMove.test_move_dir_caseinsensitiver¿   r   r  ÚSF_IMMUTABLEÚ	UF_OPAQUEr‹  c              
   C   s0  zqt  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
¡rpt  t
tj¡ t t
¡ d S d S t j t¡r„t  ttj¡ t t¡ t j t
¡r—t  t
tj¡ t t
¡ w w )Nrª  )r    r…   Ú
TESTFN_SRCr  rÆ   r®  r–   r+  r‰   ry  Ú
TESTFN_DSTr§   rQ   r¯  r   rÅ   r/   r0   r˜   r}   rš  r   r   r   Útest_move_dir_permission_denied`  s0   

þý
þz(TestMove.test_move_dir_permission_deniedN)+r€   r   r‚   rK  r|  r}  r~  r€  r  r„  r'   r†  rˆ  rŠ  r‹  rŒ  r  r  rï   rð   r    r/   r‘  r’  r“  r•  rš  rœ  r   rî   rž  rŸ  r£  r¤  r¥  r¦  r©  r«  r­  r_   r¿   rÆ   r²  r   r   r   r   rw  ‘  sj    	




		


	ÿþürw  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)r~   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__‰  s   
zTestCopyFile.Faux.__init__c                 G   s   dS )Nr²   r   )r~   r   r   r   r   rM   Œ  rÙ   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µ  )r~   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__  s
   zTestCopyFile.Faux.__exit__)FT)
r€   r   r‚   r·  rº  r»  r¶  rM   r¸  r¿  r   r   r   r   ÚFaux…  s    
rÀ  c              	   C   s„   ddd„}t  td|¡, |  t¡ t dd¡ W d   ƒ n1 s#w   Y  W d   ƒ d S W d   ƒ d S 1 s;w   Y  d S )NrL   c                 S   s   | dkrt dƒ‚J ‚)NÚsrcfilezCannot open "srcfile"r   ry  ©r·   r4   r   r   r   Ú_open˜  s   z4TestCopyFile.test_w_source_open_fails.<locals>._openr1   rÁ  Údestfile©rL   )r   rg  r‰   r–   r   r£  ©r~   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 s#w   Y  |  ˆ j¡ |  ˆ jd tu ¡ |  	ˆ jd j
d	¡ d S )NrL   c                    s    | dkrˆ S | dkrt dƒ‚J ‚)NrÁ  rÄ  úCannot open "destfile"r   ry  rÂ  ©rÁ  r   r   rÃ  ¥  s
   z2TestCopyFile.test_w_dest_open_fails.<locals>._openr1   rÁ  rÄ  r   rn   )rÈ  rÅ  )rÀ  r   rg  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 s)w   Y  |  ˆj¡ |  ˆ j¡ |  ˆ j¡ |  ˆjd t	u ¡ |  
ˆjd	 jd
¡ d S )NTrL   c                    ó   | dkrˆS | dkrˆ S J ‚©NrÁ  rÄ  r   r   rÂ  ©rÄ  rÁ  r   r   rÃ  ¸  ó
   z3TestCopyFile.test_w_dest_close_fails.<locals>._openr1   rÁ  rÄ  r   rn   )r¹  rÅ  )rÀ  r   rg  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|¡# |  t¡ t dd¡ W d   ƒ n1 s/w   Y  W d   ƒ n1 s>w   Y  |  ˆj¡ |  ˆ j¡ |  	ˆ j
¡ |  ˆjd d u ¡ |  ˆj
¡ d S )
NTrL   c                    rË  rÌ  r   rÂ  rÍ  r   r   rÃ  Î  rÎ  z5TestCopyFile.test_w_source_close_fails.<locals>._openr1   rÁ  rÄ  r   rÅ  )rÀ  r   rg  r‰   r–   r   r£  r—   r·  r§   r»  rº  rÆ  r   rÍ  r   Útest_w_source_close_failsÈ  s   
ÿ€ÿ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   )rJ   r   ÚFILESIZE©Úclsr   r   r   Ú
setUpClassâ  s   zTestCopyFileObj.setUpClassc                 C   s   t  t¡ t  t¡ d S r   )r   rd   r   r;  rÔ  r   r   r   ÚtearDownClassæ  s   
zTestCopyFileObj.tearDownClassc                 C   ó   t  t¡ d S r   ©r   rd   r;  rš  r   r   r   ÚtearDownë  r“   zTestCopyFileObj.tearDownc              	   c   óv    t tdƒ+}t tdƒ}||fV  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s4w   Y  d S ©NrK   r(   ©r1   r   r;  rë   r   r   r   Ú	get_filesî  ó   €ÿÿ"ÿzTestCopyFileObj.get_filesc              	   C   s~   t |dƒ0}t |dƒ}|  | ¡ | ¡ ¡ W d   ƒ n1 s w   Y  W d   ƒ d S W d   ƒ d S 1 s8w   Y  d S rx  )r1   rš   rM   )r~   rg   rh   ÚfsrcÚfdstr   r   r   Úassert_files_eqô  s   ÿÿ"ÿzTestCopyFileObj.assert_files_eqc                 C   sH   |   ¡ \}}t ||¡ W d   ƒ n1 sw   Y  |  tt¡ d S r   )rÞ  r‰   Úcopyfileobjrâ  r   r;  rë   r   r   r   Útest_contentù  s   ÿzTestCopyFileObj.test_contentc                 C   sR   |   ¡ \}}t ||¡ |jrJ ‚|jrJ ‚W d   ƒ d S 1 s"w   Y  d S r   )rÞ  r‰   rã  Úclosedrë   r   r   r   Útest_file_not_closedþ  s
   
"ýz$TestCopyFileObj.test_file_not_closedc                 C   sb   |   ¡ #\}}t ||¡ |  | ¡ | j¡ |  | ¡ | j¡ W d   ƒ d S 1 s*w   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w   Y  |js!J ‚|  |j	d d d¡ t
jt ¡ dd}| d¡ W d   ƒ n1 sEw   Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 skw   Y  |  |j	d d d¡ t
jt ¡ dd}W d   ƒ n1 sw   Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sµw   Y  |jr¿J ‚|  |t¡ d S )	Nzshutil._copyfileobj_readintor   r^   i   Fr[   s   foor   )rï   rT  rU  r‰   r£  r   r;  Úcalledrš   Ú	call_argsr`   ra   r    rb   r2   rW   r|   r   rd   râ  )r~   ÚmrI   r€  r   r   r   Útest_win_impl
	  s0   ÿ
ÿÿÿÿ
zTestCopyFileObj.test_win_implN)r€   r   r‚   rÓ  ÚclassmethodrÖ  r×  rÚ  Ú
contextlibÚcontextmanagerrÞ  râ  rä  ræ  rè  rï   rñ   r    rW   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    r:   r²   c                 C   sZ   t t| jƒ ttdƒ}| ¡ | _t| jƒ| jksJ ‚W d   ƒ d S 1 s&w   Y  d S rx  )rJ   r   rÓ  r1   rM   ÚFILEDATAr›   )rÕ  rI   r   r   r   rÖ  /	  s
   
"þz_ZeroCopyFileTest.setUpClassc                 C   rØ  r   )r   rd   r   rÔ  r   r   r   r×  6	  r   z_ZeroCopyFileTest.tearDownClassc                 C   rØ  r   rÙ  rš  r   r   r   rÚ  :	  r“   z_ZeroCopyFileTest.tearDownc              	   c   rÛ  rÜ  rÝ  rë   r   r   r   rÞ  =	  rß  z_ZeroCopyFileTest.get_filesc                 O   s   t dƒ‚)Nzmust be implemented in subclass)ÚNotImplementedError)r~   r   r   r   r   r   Úzerocopy_funC	  s   z_ZeroCopyFileTest.zerocopy_func                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  d S r   )rÚ  r×  rÖ  rK  rš  r   r   r   ÚresetF	  s   z_ZeroCopyFileTest.resetc              	   C   sÂ   |   ¡ \}}|  ||¡ W d   ƒ n1 sw   Y  |  ttdd| j¡ |   ¡ ,\}}tj d¡}t	 
tt¡ W d   ƒ n1 sEw   Y  |jrOJ ‚W d   ƒ d S 1 sZw   Y  d S )NT©r3   zshutil.copyfileobj)rÞ  ró  rš   rN   r;  rñ  rï   rT  rU  r‰   r£  r   ré  )r~   rg   rh   rë  r   r   r   Útest_regular_copyN	  s   ÿÿ"ýz#_ZeroCopyFileTest.test_regular_copyc              	   C   sˆ   |   | j¡ |  ¡ %\}}|  t¡ |  ||¡ W d   ƒ n1 s#w   Y  W d   ƒ n1 s2w   Y  |  ttdd| j	¡ d S )NTrõ  )
r|   rô  rÞ  r–   rà   ró  rš   rN   r   rñ  rë   r   r   r   Útest_same_fileX	  s   ÿ€ÿz _ZeroCopyFileTest.test_same_filec                 C   sZ   t jt ¡ d}|  t¡}t |d¡ W d   ƒ n1 sw   Y  |  |j	j
|¡ d S )Nr¯   Únew)r`   r³   r    rb   r–   r´   r‰   r£  rš   r¶   r·   )r~   rW   r»   r   r   r   Útest_non_existent_src`	  s
   ÿz'_ZeroCopyFileTest.test_non_existent_srcc              	      sÖ   t d ‰t d ‰ |  ‡fdd„¡ |  ‡ fdd„¡ tˆdƒ W d   ƒ n1 s*w   Y  tˆdƒ#}tˆ dƒ}|  ||¡ W d   ƒ n1 sKw   Y  W d   ƒ n1 sZw   Y  |  tˆ dd	d
¡ d S )Nrg   rh   c                      ó
   t  ˆ ¡S r   ©r   rd   r   )re   r   r   r  i	  ó   
 z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      rú  r   rû  r   )rf   r   r   r  j	  rü  r(   rK   Trõ  r:   )r   r|   r1   ró  rš   rN   rë   r   )rf   re   r   Útest_empty_filef	  s   ÿÿ€ÿz!_ZeroCopyFileTest.test_empty_filec                 C   sJ   t jj| jtd |  ttjtt	¡ W d   ƒ d S 1 sw   Y  d S )N©r,  )
rï   rT  rU  Ú
PATCHPOINTÚZeroDivisionErrorr–   r‰   r£  r   r;  rš  r   r   r   Útest_unhandled_exceptiont	  s   
ÿÿ"þz*_ZeroCopyFileTest.test_unhandled_exceptionc              
   C   s²   t jj| jttjdƒdB |  ¡ %\}}|  t	¡ |  
||¡ W d   ƒ n1 s+w   Y  W d   ƒ n1 s:w   Y  W d   ƒ d S W d   ƒ d S 1 sRw   Y  d S ©NÚyorþ  )rï   rT  rU  rÿ  r   r   ÚEINVALrÞ  r–   r   ró  rë   r   r   r   Útest_exception_on_first_callz	  s   

ÿÿ€ÿþ"þz._ZeroCopyFileTest.test_exception_on_first_callc              	   C   sŽ   t jj| jttjdƒd0 |  ¡ \}}|  t| j	||¡ W d   ƒ n1 s(w   Y  W d   ƒ d S W d   ƒ d S 1 s@w   Y  d S r  )
rï   rT  rU  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)r~   rà  rá  r   r   r   ró  ‘	  s   z!TestZeroCopySendfile.zerocopy_func              
   C   s²   t  | j¡>}ttdƒ)}|  t¡ |  ||¡ W d   ƒ n1 s#w   Y  t 	||¡ W d   ƒ n1 s8w   Y  W d   ƒ n1 sGw   Y  |  
ttdd| j¡ d S )Nr(   Trõ  )ÚioÚBytesIOrñ  r1   r;  r–   r   ró  r‰   rã  rš   rN   rë   r   r   r   Útest_non_regular_file_src”	  s   ÿý€ÿz.TestZeroCopySendfile.test_non_regular_file_srcc              
   C   sÆ   t tdƒT}t ¡ 7}|  t¡ |  ||¡ W d   ƒ n1 s!w   Y  t ||¡ | 	d¡ |  
| ¡ | j¡ W d   ƒ n1 sDw   Y  W d   ƒ d S W d   ƒ d S 1 s\w   Y  d S )NrK   r   )r1   r   r  r  r–   r   ró  r‰   rã  Úseekrš   rM   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9 |  ¡ %\}}|  t¡}t 	||¡ W d   ƒ n1 s3w   Y  W d   ƒ n1 sBw   Y  W d   ƒ n1 sQw   Y  ˆ sZJ ‚|  
|jjtj¡ d S )Nc                     s(   ˆ sˆ   d ¡ ˆ| i |¤ŽS ttjdƒ‚)Nr  )rT   r   r   ÚEBADFr   ©r0  Zorig_sendfiler   r   rZ   §	  s   
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler
  T)re  r,  )r    rZ   rï   rT  rU  rÞ  r–   r   r‰   r  rš   r¶   r   r  )r~   rZ   rg   rh   r»   r   r  r   Útest_exception_on_second_call¦	  s    
ÿÿ€ÿ€þz2TestZeroCopySendfile.test_exception_on_second_callc              	   C   sŒ   t jjdtd)}|  ¡ \}}t ||¡ |jsJ ‚W d   ƒ n1 s%w   Y  W d   ƒ n1 s4w   Y  |  t	t
dd| j¡ d S )Núos.fstatrþ  Trõ  )rï   rT  rU  r   rÞ  r‰   r  ré  rš   rN   r;  rñ  ©r~   rë  rg   rh   r   r   r   Útest_cant_get_size¸	  s   þ€ÿz'TestZeroCopySendfile.test_cant_get_sizec              	   C   sœ   t j ¡ }d|_t jjd|d)}|  ¡ \}}t ||¡ |js#J ‚W d   ƒ n1 s-w   Y  W d   ƒ n1 s<w   Y  |  	t
tdd| j¡ d S )Ni  r  ©rd  Trõ  )rï   rT  ÚMockÚst_sizerU  rÞ  r‰   r  ré  rš   rN   r;  rñ  ©r~   rT  rë  rg   rh   r   r   r   Útest_small_chunksÂ	  s   
þ€ÿz&TestZeroCopySendfile.test_small_chunksc              	   C   s¢   t j ¡ }| jd |_t jjd|d)}|  ¡ \}}t ||¡ |j	s&J ‚W d   ƒ n1 s0w   Y  W d   ƒ n1 s?w   Y  |  
ttdd| j¡ d S )Ni  @r  r  Trõ  )rï   rT  r  rÓ  r  rU  rÞ  r‰   r  ré  rš   rN   r;  rñ  r  r   r   r   Útest_big_chunkÏ	  s   
þ€ÿz#TestZeroCopySendfile.test_big_chunkc                 C   sÄ   t jjdtdP}|  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   ƒ d S 1 s[w   Y  d S )
Nr
  rþ  r   r   s   helloTrõ  Ú3i  € )rï   rT  rU  r   r–   r‰   r£  r   r;  rê  rš   r    r/   rE   r   rd   r6   r|   )r~   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>}|  	¡ %\}}|  
t¡ t  ||¡ W d   ƒ n1 s1w   Y  W d   ƒ n1 s@w   Y  |jsJJ ‚W d   ƒ n1 sTw   Y  t jr^J ‚tj | j¡}t  tt¡ |jrqJ ‚W d   ƒ n1 s{w   Y  W dt _d S W dt _d S dt _w )Nr  rþ  T)r‰   Ú_USE_CP_SENDFILErï   rT  rU  rÿ  r   r   ÚENOTSOCKrÞ  r–   r   r  ré  r£  r   r;  r  r   r   r   Útest_file2file_not_supportedî	  s.   

þÿ€ÿú
þ
ü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                   @   ó   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ó  
  rœ  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_sizer1  ÚcolumnsÚlines)r~   rF   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 sw   Y  |  |jd¡ t  ¡ }|d= d|d< t ¡ }W d  ƒ n1 s@w   Y  |  |jd¡ dS )z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi	  Z888ix  )r   r^  r‰   r)  rš   r*  r+  ©r~   r`  rF   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 sw   Y  |  |jd¡ |  |jd¡ d S )Nrs  r-  Zyyyr.  r   )r   r^  r‰   r)  r1  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w t|d ƒt|d ƒf}t	 
¡ }|d= |d= t ¡ }W d  ƒ n1 sEw   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sttyrF   zstty invocation failedrn   r   r.  r-  N)rs   rå  ré  rv   r´   r+  rç  r:  rw   r   r^  r‰   r)  rš   )r~   rF   r  r`  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 s#w   Y  |  |jd¡ |  |j	d¡ t
tjdd	d
%}t td|¡ tjdd}W d   ƒ n1 sWw   Y  W d   ƒ n1 sfw   Y  |  |jd¡ |  |j	d¡ W d   ƒ d S 1 s„w   Y  d S )Nr.  r-  Ú
__stdout__)é
   é   )Úfallbackr4  r5  r)   r*   r+   )é   é(   r7  r8  )r   r^  r   rg  rq   r‰   r)  rš   r*  r+  r1   r    Údevnull)r~   r`  rF   rI   r   r   r   Útest_fallbackF
  s$   
ÿÿþ€ "ðz!TestGetTerminalSize.test_fallbackN)r€   r   r‚   r,  r0  r1  rï   rð   r    Úisattyrq   r3  rc   r_   r2  r:  r   r   r   r   r(  
  s    
ÿr(  c                   @   r#  )Ú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r| d¡ |  ttjƒt|ƒ¡ d S )NÚ__all__)rã  r£  r\  ri  r  r“  rú   ry  r}   r   r¨  Ú	ExecErrorr   r   r   r   r   r   r
   r   r  r4  r,  r)  r   Ústatvfsr
  r.  )	r—   r_   r‰   r    rW   rT   rš   r"  r=  )r~   Z
target_apir   r   r   Útest_module_all_attribute]
  s
   
z(PublicAPITests.test_module_all_attributeN)r€   r   r‚   r  r@  r   r   r   r   r<  Z
  s    r<  Ú__main__)F)Qrï   Zunittest.mockr‰   r`   rq   rÆ   r    Zos.pathr   r%   r&  rs   r;   r=   rî  r  r   r   r   r   r   r   r   r	   r
   r   r   r   r½  rÚ  r&  ÚImportErrorr  r   Ztest.supportr   Ztest.support.os_helperr   r   r;  r°  r±  rò   r  r°  r±  rp   rô  rö  ró  r«   r   r'   r6   rJ   rN   rU   rk   ZSUPPORTS_SENDFILErx   ry   ZTestCaserƒ   ró   rV  r²  r-  rA  rv  rw  r³  rÒ  rÑ  rð  rñ   r	  r$  r(  r<  r€   Úmainr   r   r   r   Ú<module>   s®   8ÿÿÿ

	    ]      gP <
 s\JdvN
ÿ