o
    HXh                    @   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& d dl"m'Z' e%d Z(e%d Z)e%d	 Z*ej+,d
Z-ej+,dZ.ej+dd dkZ/zd dl0Z0d dl1Z1dZ2W n ey   dZ2Y nw zd dl3Z3W n ey   dZ3Y nw e j4j5de6ddZ7dd Z8dd Z9dFddZ:dd Z;dFddZ<dd Z=dd  Z>e> Z?d!d" Z@G d#d$ d$ZAG d%d& d&eAe jBZCG d'd( d(eAe jBZDG d)d* d*eAe jBZEG d+d, d,eAe jBZFG d-d. d.eAe jBZGG d/d0 d0eAe jBZHG d1d2 d2eHZIG d3d4 d4eAe jBZJG d5d6 d6e jBZKG d7d8 d8e jBZLG d9d: d:eMZNe Oe? d;G d<d= d=eNe jBZPe Oe- d>G d?d@ d@eNe jBZQG dAdB dBe jBZRG dCdD dDe jBZSeTdEkre U  dS dS )G    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)warnings_helper2Z_SRCZ_DSTdarwinZsunos   ZaixTFzos.chdirzshouldn't call os.chdir()side_effectc                  O   s   t ttddd)NZEXDEV   zInvalid cross-device link)OSErrorgetattrerrnoargskwargs r   :/opt/python-3.10.19/usr/lib/python3.10/test/test_shutil.py_fake_rename:   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 )zWrite *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)r2   Zcontentbinarymoder/   fpr   r   r    
write_fileI   s   
"r9   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    chunksY   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>b   s    z#write_test_file.<locals>.<listcomp>r+   N)minr3   ranger4   r5   r#   r2   getsize)r2   sizer<   bufsizechunkfZcsizer   r   r    write_test_fileW   s   

rM   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 )zReturn 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.   )r0   r1   r#   r2   r3   r4   read)r2   r6   r7   r/   r8   r   r   r    	read_filei   s   
$rQ   c                 C   s|   g }t t| D ]2}tj| |}tj|r6tj|s6||d  t|D ]}||d |  q)q	|| q	|S )N/)	sortedr#   listdirr2   r3   isdirislinkappendrlistdir)r2   resnamepnr   r   r    rX   w   s   rX   c               
   C   s  t tdsdS d } d }zt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rt|  |d urt| d	S d	S 1 sw   Y  W d    n1 sw   Y  W | d urt|  |d urt| d S d S | d urt|  |d urt| w w )
NsendfileFr+   dirdeletes
   0123456789rN   r      T)hasattrr#   tempfileNamedTemporaryFilegetcwdrZ   r5   r4   filenor]   r   r   unlink)srcnamedstnamerL   srcdstinfdoutfdr   r   r    supports_file2file_sendfile   s^   




rn   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
   r{   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_   )rc   mkdtempr#   re   
addCleanupr   rmtree)selfr}   dr   r   r    r~      s   zBaseTest.mkdtempr"   )__name__
__module____qualname__r~   r   r   r   r    r|      s    r|   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#   r2   r3   mkdirr9   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"   rW   r   errorsr   r    onerror      z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerrorr   rq   r   ra   )r~   r#   r2   r3   r   symlinkassertRaisesr   r   r   
assertTrueexistslexistsassertEquallenassertIsrV   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#   r2   r3   r   r9   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   rq   r   ra   )r~   r#   r2   r3   r   _winapiCreateJunctionr   r   rg   r   r   r   r   r   r   r   r   r   r   rV   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#   r2   r3   r   r9   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   ra   r   rq   )rc   mktempr~   r   FileNotFoundErrorr   r   r9   r#   r2   r3   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   r2   r3   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_error:  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 )Nra   r   rq   r   )r   r#   rg   r   r   r   r   r   rT   assertInr   r   
issubclassr   )r   r&   argexcr   r   r    r   Y  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    raiserw  s   zFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr   )r#   lstatr   r   r9   r   r   )r   r   r   r   r    +test_rmtree_does_not_choke_on_failing_lstatt  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#   r4   r   rg   r   supports_dir_fdrT   supports_fdsupports_follow_symlinksr   r   _use_fd_functionsr   avoids_symlink_attacksr~   r2   r3   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   )
rc   mkstempr~   r#   closer   r   r   r   remove)r   handler2   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   r2   r3   r   r   r   r   r   r   rj   rk   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   r2   r3   r4   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   skipIfrt   platformrb   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#   r2   r3   r   r   r   dirnamer9   r   copytreer   isfilerU   rQ   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 sw   Y  d S )
Nznonexisting.txtr   Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)dirs_exist_okF)r~   r   r   r   r9   r#   r   r2   r3   r   r   r   rU   rQ   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 )Nrj   rk   subzfile.txtr   r   zsub/linklchmodlchflags	UF_NODUMPTsymlinksntz\\?\   )r~   r#   r2   r3   r   r9   r   rb   r  r   S_IRWXUS_IRWXOr	  r
  r   r   r   r   rV   readlinkrZ   
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 )Nrp   r  z.py)r#   r2   r3   rU   ry   rW   splitext)rj   namesrY   rZ   r2   r   r   r    _filter6  s   
z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r#   r2   r3   r   r~   r9   r   r   ignore_patternsr   r   r   r   r   )r   r3   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"   )rW   r   strlistr   r   set)rj   r  rZ   Zinvokationsr   r   r    _ignore]  s   
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer   r  r   	   )r#   r2   r3   r   r~   r   r9   r   r   r   pathlibPathr$  r   r   DirEntryr   r   )r   r3   r   r   r   r'  r  Zsrc_dir_entryr   r&  r    !test_copytree_arg_types_of_ignoreO  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   rq   )r~   r#   r2   r3   r   r   r   r   r   r9   rc   r   r   r   r   r   ry   )r   r   r   r  Zrestrictive_subdirZrestrictive_subdir_dstr   r   r    !test_copytree_retains_permissionsy  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#   r2   r3   r   r   r   r   PermissionErrorr   r   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   )rW   r   r#  r   r#   r2   r3   )r   r   rk   flagr   rj   r   r    custom_cpfun  s
   
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr   r   r,   r-   r.   copy_functionrq   )r~   rc   r   r4   r#   r2   r3   r   r   r   r   r   )r   r3  rL   r   r1  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 zt 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   rq   z`%s` is a named pipez$shutil.Error should have been raisedTr   )r#   r   r   r2   r3   r7  r.  skipTestr   r   TESTFN2r   r   r   r   failr   )r   r  pipeer   rj   rk   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   rj   rk   Zcopiedr   r    _copy     z6TestCopyTree.test_copytree_special_func.<locals>._copyr4  ra   )
r~   r#   r2   r3   r9   r   r   r   r   r   )r   r   r  rE  r   rD  r    test_copytree_special_func  s   z'TestCopyTree.test_copytree_special_funcc           	      C   s  |   }tj|d}t|d tj|d}t| ||fD ]}tdtj|d t|tj|d q tj|   d}| tt	j
|| tj|   d}t	j
||d	d
 t|D ]\}}}| d| | d| qatj|   d}t	j
||d	d | dt| d S )Nr   abcdir_aZ
IDONTEXISTbrokenZvalidr   destination2T)ignore_dangling_symlinksZdestination3r  )r~   r#   r2   r3   r9   r   r   r   r   r   r   walkassertNotInr   rT   )	r   r   Z
valid_filerI  r   r  rootdirsfilesr   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  rK  )r~   r#   r2   r3   r   r4   r   r   r   r   rV   r   rT   r   )r   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   )r~   r   r   r   r#   r2   r3   r9   r   r   rT   )r   r   r  rj   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#   r2   r3   makedirsr9   r   r   rT   )r   base_dirr   r  rj   rV  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/  r6  r   rb   r#   r   rt   r   rA  rG  rR  rT  rW  r[  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&pe'pe(dAee)dBdCdD Z*dEdF Z+dGS )H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rt|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#   r2   r3   r9   r   r   r   r  S_IRWXGr  assertNotEqualr   r   copymoder   rZ   r   r   rj   rk   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   r_  r`  ra  Ffollow_symlinks)r~   r#   r2   r3   r9   r   r   r   r  rb  r  r  r   rd  r   r   r   rc  re  r   r   r     test_copymode_symlink_to_symlinkF  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 rg  )r~   r#   r2   r3   r9   r   r   rd  re  r   r   r    *test_copymode_symlink_to_symlink_wo_lchmodd  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 rdD ]}	| t||	t||	d  qttdr| |j|j ttdrt|dr| |j|j tj||dd
 | tt|jt|j dk  d S )Nr   r_  r`  quxg      E@r  r	  r
  Trh  Fst_atimest_mtimerq   r  g?)r~   r#   r2   r3   r9   r   utimern  ro  rc  r   rb   r  r  r	  r
  r   r   copystatr   r   assertLessEqualr   r   r  r   abs)
r   r   rj   rk   r  r  r  src_link_statZdst_link_statattrr   r   r    test_copystat_symlinkst  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 )NTrh  c                   s
    _ r"   )r   )r2   flagsri  errexr   r    _chflags_raiser  s   zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiserr   )r~  r  r   r}  r    make_chflags_raiser  s   zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)r~   r#   r2   r3   r9   rw  r   rx  ry  r   rq  r   r   )r   r   r   rz  r  Zold_chflagsr~  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   r_  user.foo   42zuser.bar   43EPERMc                    s$   |dkr | ||fi | d S )Nr  r   )fnameru  valr   )orig_setxattros_errorr   r    _raise_on_user_foo  s   z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrh  c                   s    | kr
t tjd | |dS )NzOperation not supportedrh  )r   r   ry  )r  ri  )orig_listxattrrj   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#   r2   r3   r9   r   
_copyxattrsetxattrr   rS   	listxattrgetxattrr   r   r   r  r   r   rq  )r   r   rk   r  r  ZsrcroZdstror   )r  r  r  rj   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   r`  ztrusted.foor  r  Frh  r_  rl  )r~   r#   r2   r3   r9   r   r  r   r  r   r  r   r   )r   r   rj   r  rk   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   r{  )r~   r9   r#   r2   r3   )r   methodr  r   r   tmpdir2rz  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#   r2   r   r   r   r   )r   r   rz  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   r_  r`  r  Trh  F)r~   r#   r2   r3   r9   r   rb   r  r   r  r  r   r  r   rV   r   rQ   r   r   r  r   r   )r   r   rj   rk   r  r   r   r    test_copy_symlinks'  s(   




zTestCopy.test_copy_symlinksrp  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 )Nrm  rq   rw  r  )r  r   copy2r   r#   r2   r   r   r   r   rr  r   rb   )r   r   rz  Z
file1_statZ
file2_statru  r   r   r    
test_copy2@  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 rd
D ]}| t||t||d  qttdr| |j|j | |j|j ttdrt|dr| |j|j d S d S d S )Nr   r_  r`  r  r	  r
  Trh  Frm  rq   r  )r~   r#   r2   r3   r9   r   rb   r  r   r  r  r	  r
  r   r   r  r   rV   r   rQ   r   r   r  rp  r   rr  r   r   rc  r  )	r   r   rj   rk   r  r  rt  r  ru  r   r   r    test_copy2_symlinksQ  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   r_  r  r  )r~   r#   r2   r3   r9   r  r   r  r   r  r   )r   r   rj   rk   r   r   r    test_copy2_xattrt  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   r_  )	r   r  r  r~   r#   r2   r3   r9   r   )r   r   r   r  rj   rV  r   r   r    test_copy_return_value  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#   r2   r3   r9   rt   r   r.  IsADirectoryErrorr   )r   Z	copy_funcr   src_filer   rk   r~  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 )Nrj   rk   r  r   r   Frh  )r~   r#   r2   r3   r9   r   r   copyfiler   rV   r   r  r   )r   r   rj   rk   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(): %srO   Tr   )r#   r   r   r2   r3   r4   r5   r   r.  r<  r   r   r   r  r   rP   r   r   )r   rj   rk   rL   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  rO   Tr   )r#   r   r   r2   r3   r4   r5   r   r   r   r   r  r   rP   r   r   )r   rj   rk   rL   r   r   r    *test_dont_copy_file_onto_symlink_to_itself  s   
"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr7  r8  r9  r:  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 )Nr;  )r#   r7  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 )Nr_  r   )r~   r#   r2   r3   r9   r   r  r   r   r   rQ   )r   r   r  dst_filer  rV  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 r0  )r~   r#   r2   r3   r9   r   r   r   r  r   r   rQ   )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)zNot valid on AIX, see gh-92670c                 C   sD   |   }tj|d}tj|d}t|d | ttj|| d S )Nr   r  )	r~   r#   r2   r3   r9   r   r   r   r  )r   r   r  rk   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#   r2   r3   r9   rt   r   r.  r  r   r   r  )r   r   r  r   rk   r~  r   r   r    test_copyfile_copy_dir  s   

zTestCopy.test_copyfile_copy_dirN),r   r   r   r   r   rf  r   r   rb   r#   rj  r   rk  rv  r   r  Zskip_unless_xattrr  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rt   r   r  r  r  MACOSSOLARISr   rs   r  r  r   r   r   r    r^  "  sr    

(

?



"




r^  c                   @   s|  e Zd Ze dd Zdd Zd9ddZe e	e
dd	d
d Ze dd Ze e	e
dddd Ze e	e
dddd Zdd Ze dd Ze e	eddd Zdd Zdd  Ze d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Ze d-d. Ze d/d0 Ze e e!oe"  d1d2d3 Z#e d4d5 Z$d6d7 Z%d8S ):TestArchivesc           	   	   C   s  |  d\}}|  }t| tj|}tjtj|d}t	|' t
 tj|}t|d|d}W d    n1 sAw   Y  W d    n1 sPw   Y  | ||d  | tj| | t| t|d}| | g d W d    n1 sw   Y  t	|! t
 t|d|d}W d    n1 sw   Y  W d    n1 sw   Y  | ||d	  | tj| | t| t|d
}| | g d W d    d S 1 sw   Y  d S )Nr   archivegztar..tar.gzzr:gz)r  z./subz./sub2z./file1z./file2z./sub/file3tar.tarrO   )_create_filesr~   r#   r   r2   r   r3   basenamer   
change_cwdno_chdirabspathr   r   r   r   tarfileZ
is_tarfiler4   assertCountEqualgetnames)	r   root_dirrZ  r  work_dirrel_base_name	base_nametarballZtfr   r   r    test_make_tarball*  s@   
 
 
"zTestArchives.test_make_tarballc                 C   sF   t |}| }|  t|W  d    S 1 sw   Y  d S r"   )r  r4   r  sortr1   )r   r2   r  r  r   r   r    _tarinfoN  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   r{  rz  r  Zfile3Zsub2outer)r~   r#   r2   r3   rY  r9   r   )r   rZ  r  r  r   r   r    r  T  s   zTestArchives._create_filesr  zNeed the tar command to runc                 C   sx  |   \}}tj|  d}t t|d||}W d    n1 s#w   Y  | ||d  | tj	| tj|d}ddd|g}t
j||t
jd | tj	| | | || | t t|d||}W d    n1 sxw   Y  | ||d  | tj	| t t|d||d	d
}W d    n1 sw   Y  | ||d  | tj	| d S )Nr  r  r  zarchive2.tarr  z-cfcwdstdoutr  T)dry_run)r  r#   r2   r3   r~   r  r   r   r   r   rv   
check_callDEVNULLr  )r   r  rZ  r  r  Ztarball2Ztar_cmdr   r   r    test_tarfile_vs_tarb  s4   
z TestArchives.test_tarfile_vs_tarc           	   	   C   s  |   \}}|  }t| tj|}tjtj|d}t	|& t
 tj|}t|d|}W d    n1 s?w   Y  W d    n1 sNw   Y  | ||d  | tj| | t| t|}| | g d W d    n1 sw   Y  t	|' t
 tj|}t|d||}W d    n1 sw   Y  W d    n1 sw   Y  | ||d  | tj| | t| t|}| | g d W d    d S 1 sw   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   r2   r   r3   r  r   r  r  r  r   r   r   r   zipfile
is_zipfileZipFiler  namelist)	r   r  rZ  r  r  r  r  rY   zfr   r   r    test_make_zipfile  sB   
 
 
"zTestArchives.test_make_zipfiler  zNeed the zip command to runc           
      C   s.  |   \}}tj|  d}t t|d||}W d    n1 s#w   Y  | ||d  | tj	| tj|d}dddd|g}t
j||t
jd | tj	| t|}| }W d    n1 smw   Y  t|}| }	W d    n1 sw   Y  | t|t|	 d S )Nr  r  r  zarchive2.zipz-qz-rr  )r  r#   r2   r3   r~   r  r   r   r   r   rv   r  r  r  r  r  rS   )
r   r  rZ  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 t|d||}W d    n1 s#w   Y  | ||d  | tj	| dd|g}t
|J z
tj|tjd W n. tjy| } z!|jjdd}d	|v rg| d
 d}| ||| W Y d }~nd }~ww W d    d S W d    d S 1 sw   Y  d S )Nr  r  r  r  z-t)stderrreplacer   zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r  r#   r2   r3   r~   r  r   r   r   r   r   r  rv   check_outputSTDOUTCalledProcessErroroutputdecoder<  r>  format)	r   r  rZ  r  r  r  r   detailsmsgr   r   r    test_unzip_zipfile  s.   

"zTestArchives.test_unzip_zipfilec                 C   s*   |   }tj|d}| tt|d d S )Nr  r{  )r~   r#   r2   r3   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   rO  r  r  ownergroupr  Z	kjhkjhkjgZoihohoh)UID_GID_SUPPORTgrpgetgrgidpwdgetpwuidr  r#   r2   r3   r~   r   r   r   )r   r  r  r  rZ  r  rY   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 t|d|d||d}W d    n1 s:w   Y  W d    n1 sIw   Y  | tj| t|}z| D ]}| |jd | |jd qaW |  d S |  w )Nr  r   r  r  r  )r  r#   r2   r3   r~   r  r  r   r  r   r  r  r   r   r   r  r4   Z
getmembersr   uidgidr   )	r   r  rZ  r  r  r  archive_namer  memberr   r   r    test_tarfile_root_owner   s&   
 
z$TestArchives.test_tarfile_root_ownerc              	      s   t  }|  }dd }g   fdd}td|g d zAtt d|z	tdd|d W n	 ty7   Y nw W d    n1 sBw   Y  | t  | |  ||g 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>._breaksc                    s     |  |  d S r"   r   r2   rP  Z
orig_chdirr   r    _chdir  s   
z2TestArchives.test_make_archive_cwd.<locals>._chdirr{  xxx filechdir)r  )
r#   re   r~   r   r   	swap_attrr   r   r   r   )r   Zcurrent_dirr  r  r  r   r  r    test_make_archive_cwd  s$   z"TestArchives.test_make_archive_cwdc              	   C      |   }t|5 t | tddd | tj	d W d    n1 s)w   Y  W d    d S W d    d S 1 sAw   Y  d S )Ntestr  ztest.tar
r~   r   r  r  r   r   r   r#   r2   r   r   r  r   r   r    test_make_tarfile_in_curdir-  s
   Pz(TestArchives.test_make_tarfile_in_curdirc              	   C   r  )Nr  r  ztest.zipr  r  r   r   r    test_make_zipfile_in_curdir4  s
   Pz(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 )Nr{  rq   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  A  r  )rq   ra   )rq   ra   r   c                   S   r  r"   r  r   r   r   r    r  D  r  r  c                 S      g | ]\}}|qS r   r   rC   rZ   paramsr   r   r    rE   E      z=TestArchives.test_register_archive_format.<locals>.<listcomp>c                 S   r  r   r   r  r   r   r    rE   I  r!  )r   	TypeErrorr   r   r   r   rN  )r   formatsr   r   r    test_register_archive_format<  s   z)TestArchives.test_register_archive_formatc                 K   sF   | j |dd fi | | j |tjfi | | j |tfi | d S )Nc                 S   s   | S r"   r   r  r   r   r    r  P  r  z3TestArchives.check_unpack_archive.<locals>.<lambda>)#check_unpack_archive_with_converterr)  r*  r   )r   r  r   r   r   r    check_unpack_archiveN  s   z!TestArchives.check_unpack_archivec                 K   s.  |   \}}t|}|d tj|  d}t||||}|  }	t||||	fi | | 	t|	| |  }
t||||
fd|i| | 	t|
| | 
tj t|tfi | W d    n1 snw   Y  | 
t t|tfddi| W d    d S 1 sw   Y  d S )Nr  r  r  r{  )r  rX   r   r#   r2   r3   r~   r   r   r   r   r   	ReadErrorr   r  )r   r  	converterr   r  rZ  expectedr  r   r  Ztmpdir3r   r   r    r%  U  s&   
"z0TestArchives.check_unpack_archive_with_converterc                 C   sV   | j |dd | j |dd t|  |  | W d    d S 1 s$w   Y  d S )NZfully_trustedfilterdata)r&  r   Zcheck_no_warnings)r   r  r   r   r    check_unpack_tarballm  s
   "z!TestArchives.check_unpack_tarballc                 C      |  d d S )Nr  r-  r  r   r   r    test_unpack_archive_tars  r   z$TestArchives.test_unpack_archive_tarc                 C   r.  )Nr  r/  r  r   r   r    test_unpack_archive_gztarv     z&TestArchives.test_unpack_archive_gztarc                 C   r.  )Nbztarr/  r  r   r   r    test_unpack_archive_bztarz  r2  z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largerc                 C   r.  )Nxztarr/  r  r   r   r    test_unpack_archive_xztar~  s   z&TestArchives.test_unpack_archive_xztarc                 C   sH   |  d | t | j ddd W d    d S 1 sw   Y  d S )Nr  r,  r*  )r&  r   r"  r  r   r   r    test_unpack_archive_zip  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 )Nrq   	stuff.booxx)r   )r   extract_dirextrar  r   r    _boo  s   z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r;  rq   r8  r9  ZBoo2r   )	r   r   r   r   r	   r
   r   rN  r   )r   r#  r<  r   r  r    test_unpack_registry  s   

z!TestArchives.test_unpack_registryN)r  )&r   r   r   r   Zrequires_zlibr  r  r  r   r   r   whichr  r  r  r  r  r  r  r  r  r  r  r$  r&  r%  r-  r0  r1  Zrequires_bz2r4  Zrequires_lzmar   rs   r{   r6  r7  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)r:   usedfreer   )r   r@  r#   r2   r   r  r   r   rz   ZassertGreaterr:   rA  assertGreaterEqualrB  )r   usageru  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 sw   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)r2   r  r  sr   r   r   r    check_chown  s   
z(TestMisc.test_chown.<locals>.check_chown)r  r   )NN)r~   rc   r   r9   r   r  r   rF  LookupErrorr"  r#   getuidgetgidr   r  r  r  KeyError)r   r   r  r  rM  rG  r  r   rL  r    
test_chown  s^   




zTestMisc.test_chownN)r   r   r   r   r   rb   r   rE  r  r#   rR  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)r}   z.Exer_   r}   suffixz.EXE)r~   temp_dirrc   rd   	temp_filer#   r   rZ   r   S_IXUSRr   r   r2   ry   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>  rY  r_   r   rW  rZ   r   rV  r   r   r    
test_basic  s   zTestWhich.test_basicc                 C   s(   t j| jj| jd}| || jj d S r^  )r   r>  rW  rZ   rV  r   r_  r   r   r    test_absolute_cmd	  s   zTestWhich.test_absolute_cmdc                 C   s   t j| j\}}t j|| j}tj|d tj	|| j
d}| || W d    n1 s0w   Y  tj| jd tj	||d}| | W d    d S 1 sTw   Y  d S r^  )r#   r2   ry   r_   r3   rY  r   r  r   r>  rV  r   assertIsNone)r   rZ  tail_dirrelpathrV  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#   r2   r   r_   r   r  r   r>  rY  rt   r   r   r3   r[  rb  )r   rZ  rV  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)r2   r7   )r#   r   rW  rZ   r   r   accessW_OKr<  r   r>  rY  r_   rb  r_  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 r^  )r#   r2   ry   r_   r   r  r   r>  rY  r   r3   )r   rZ  rc  rV  r   r   r    test_relative_path2  s
   "zTestWhich.test_relative_pathc                 C   s   t jd| jd}| | d S )Nzfoo.exer  )r   r>  r_   rb  r_  r   r   r    test_nonexistent_file8  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 )Nr  )r   r>  rY  r_   r   rW  rZ   r\  r_  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   EnvironmentVarGuardrZ  r   r>  rY  r   rW  rZ   r   envrV  r   r   r    test_environ_pathE  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   ro  
os.confstrTreturn_valuecreatedefpath)r   rp  r   r\  r]  r_   r   r  r#   r  r   r>  rY  rb  rq  r   r   r    test_environ_path_emptyK  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 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr  ro  rt  Tru  rx  )r#   r2   r  rW  rZ   rt   r   r[  r0   r   r   r3   r   rp  pathsepr   r\  r]  r_   r   r  r   r>  rY  rb  r  r   )r   Zexpected_cwdr[  rr  rV  r   r   r    test_environ_path_cwdV  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 sw   Y  d S )Nro  rt  T)r   rw  rx  ru  r   )r   rp  popr   r\  r]  r  r   r  r#   r_   r   r>  rY  r   rW  rZ   rq  r   r   r    test_environ_path_missingl  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  ro  r   )r#   r2   r   r_   r   r  rp  rZ  r   r>  rY  rb  )r   rZ  rr  rV  r   r   r    test_empty_path~  s   
PzTestWhich.test_empty_pathc                 C   sP   t  }|dd  t| j}| | W d    d S 1 s!w   Y  d S rn  )r   rp  r|  r   r>  rY  rb  rq  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Tmp2rT  r   PATHEXTr  )rc   rd   rV  r#   r   rZ   r   rX  r   r   r2   r  r  r   rp  r   r>  r   r   r\  Ztemp_filexyzZprogramrr  rV  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    d S 1 sFw   Y  d S )Nr  r  rT  r   ;r  r  )rc   rd   rV  r   r   r#   r2   r  rZ   r  r   rp  r   r>  r   r  r   r   r    test_pathext_with_empty_str  s   
"z%TestWhich.test_pathext_with_empty_strN)r   r   r   r]  r`  ra  re  rf  r   r   rb   r#   r   ri  rj  rk  r   rt   r   rm  rs  ry  r{  r}  r~  r  r  r  r   r   r   r    rS    s4    


rS  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"   )
rS  r]  r#   r   r_   rY  rW  rZ   r[  r\  r  r   r   r    r]    s   
zTestWhichBytes.setUpN)r   r   r   r]  r   r   r   r    r    s    r  c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Z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:oe( d;koe'ed<oe'e)d=oe'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+   rH  )
r~   r   r  r#   r2   r3   r  r  r4   r5   )r   r   rL   r   r   r    r]    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 NrN   )	r4   rP   r   mover   r   r#   r2   r   )r   rj   rk   real_dstrL   contentsr   r   r    _check_move_file  s   
zTestMove._check_move_filec                 C   sF   t t|}t|| | |t t| | tj| d S r"   )	rS   r#   rT   r   r  r   r   r2   r   )r   rj   rk   r  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   rj   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   rk   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   )rc   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#   r2   r3   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#   r2   sepr  r3   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#   r2   altsepr  r3   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+   )r4   r  r   r   r   r  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 Nr_  )r#   r2   r3   r   r   r   r   r  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   r2   r3   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   r2   r3   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#   r2   r3   r   r   r  r   r  r  r   rV   samefiler  r   r   r    test_move_file_symlink1  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#   r2   r3   r   r   r  r   r  r  r   rV   r  )r   r   rk   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 Nr`  r_  ra  )r#   r2   r3   r   r   r  r   r  r   rV   r   realpathr   rj   rk   r  r   r   r    test_move_dangling_symlinkE  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#   r2   r3   r   r   r   r  r   r  r   rV   r  r  r   r   r    test_move_dir_symlinkP  s   
zTestMove.test_move_dir_symlinkc              	   C   s6   t | j| j}| |tj| jtj| j d S r"   )	r   r  r  r  r   r#   r2   r3   r  r_  r   r   r    test_move_return_value\  s   zTestMove.test_move_return_valuec                 C   s6   t | jtj| jd}| |tj| jd d S r  )r   r  r  r#   r2   r3   r  r   r_  r   r   r     test_move_as_rename_return_valuea  s   z)TestMove.test_move_as_rename_return_valuec                    s8   g   fdd}t j| j| j|d | t d d S )Nc                    rB  r"   r   rC  Zmovedr   r    rE  h  rF  z7TestMove.test_move_file_special_function.<locals>._copyr4  rq   )r   r  r  r  r   r   r   rE  r   r  r    test_move_file_special_functione  s   z(TestMove.test_move_file_special_functionc                    sd   g   fdd}t tj| jd t tj| jd tj| j| j|d | 	t
 d d S )Nc                    rB  r"   r   rC  r  r   r    rE  p  rF  z6TestMove.test_move_dir_special_function.<locals>._copychildZchild1r4  r   )r   r   r#   r2   r3   r   r   r  r  r   r   r  r   r  r    test_move_dir_special_functionm  s   z'TestMove.test_move_dir_special_functionc              	   C   s|   |   | _tjtj| jtj| j }| | j| zt	
| j| | tj| W t| d S t| w r"   )r~   r   r#   r2   r3   r   r  upperrc  r   r  r   rU   r   r  r   r   r    test_move_dir_caseinsensitivew  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rt ttj tt t jt
rt t
tj tt
 w w )Nr  )r#   r   
TESTFN_SRCr	  r   r  r   r.  r   r  
TESTFN_DSTr   rT   r  r   r   r2   r3   r   r   r  r   r   r    test_move_dir_permission_denied  s0   


z(TestMove.test_move_dir_permission_deniedN)+r   r   r   r]  r  r  r  r  r  r  r*   r  r  r  r  r  r  r  r   r   r#   r2   r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  rb   r   r   r  r   r   r   r    r    sj    	




		


	r  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    rP     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  rP   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 )NrO   c                 S   s   | dkrt dJ )NsrcfilezCannot open "srcfile"r  r   r7   r   r   r    _open  s   z4TestCopyFile.test_w_source_open_fails.<locals>._openr4   r  destfilerO   )r   r  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 )NrO   c                    s    | dkr S | dkrt dJ )Nr  r  Cannot open "destfile"r  r  r  r   r    r    s
   z2TestCopyFile.test_w_dest_open_fails.<locals>._openr4   r  r  r   rq   )r  r  )r  r   r  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 )NTrO   c                       | dkrS | dkr S J Nr  r  r   r  r  r  r   r    r    
   z3TestCopyFile.test_w_dest_close_fails.<locals>._openr4   r  r  r   rq   )r  r  )r  r   r  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 )
NTrO   c                    r  r  r   r  r  r   r    r    r  z5TestCopyFile.test_w_source_close_fails.<locals>._openr4   r  r  r   r  )r  r   r  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"   )rM   r   FILESIZEclsr   r   r    
setUpClass
	  s   zTestCopyFileObj.setUpClassc                 C   s   t t t t d S r"   )r   rg   r   r=  r  r   r   r    tearDownClass	  s   
zTestCopyFileObj.tearDownClassc                 C      t t d S r"   r   rg   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 NrN   r+   r4   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 r  )r4   r   rP   )r   rj   rk   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 sw   Y  |jrJ | |t d S )	Nzshutil._copyfileobj_readintor   ra   i   Fr^   s   foor   )r   r\  r]  r   r  r   r=  calledr   	call_argsrc   rd   r#   re   r5   rZ   r   r   rg   r  )r   mrL   r  r   r   r    test_win_impl2	  s0   

zTestCopyFileObj.test_win_implN)r   r   r   r  classmethodr  r  r  
contextlibcontextmanagerr  r  r  r  r  r   r   r#   rZ   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 r  )rM   r   r  r4   rP   FILEDATAr   )r  rL   r   r   r    r  W	  s
   
"z_ZeroCopyFileTest.setUpClassc                 C   r  r"   )r   rg   r   r  r   r   r    r  ^	  r2  z_ZeroCopyFileTest.tearDownClassc                 C   r  r"   r  r  r   r   r    r  b	  r   z_ZeroCopyFileTest.tearDownc              	   c   r  r  r  r   r   r   r    r  e	  r  z_ZeroCopyFileTest.get_filesc                 O   s   t d)Nzmust be implemented in subclass)NotImplementedError)r   r   r   r   r   r    zerocopy_funk	  s   z_ZeroCopyFileTest.zerocopy_func                 C   s$   |    |   |   |   d S r"   )r  r  r  r]  r  r   r   r    resetn	  s   z_ZeroCopyFileTest.resetc              	   C   s   |   \}}| || W d    n1 s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r6   zshutil.copyfileobj)r  r  r   rQ   r=  r  r   r\  r]  r   r  r   r  )r   rj   rk   r  r   r   r    test_regular_copyv	  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   rQ   r   r  r   r   r   r    test_same_file	  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)rc   r   r#   re   r   r   r   r  r   r   r   )r   rZ   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 )Nrj   rk   c                      
   t  S r"   r   rg   r   )rh   r   r    r  	     
 z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      r  r"   r  r   )ri   r   r    r  	  r  r+   rN   Tr  r=   )r   r   r4   r  r   rQ   r   r   )ri   rh   r    test_empty_file	  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 )Nr   )
r   r\  r]  
PATCHPOINTZeroDivisionErrorr   r   r  r   r=  r  r   r   r    test_unhandled_exception	  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   r\  r]  r  r   r   EINVALr  r   r   r  r   r   r   r    test_exception_on_first_call	  s   

"z._ZeroCopyFileTest.test_exception_on_first_callc              	   C   s   t jj| jttjdd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   r\  r]  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  Q	  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  r4   r=  r   r   r  r   r  r   rQ   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 )NrN   r   )r4   r   r  r  r   r   r  r   r  seekr   rP   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  )rW   r   r   EBADFr   r2  Zorig_sendfiler   r    r]   	  s   
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler  T)rw  r   )r#   r]   r   r\  r]  r  r   r   r   r  r   r   r   r!  )r   r]   rj   rk   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   r\  r]  r   r  r   r  r  r   rQ   r=  r  r   r  rj   rk   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$  rv  Tr  )r   r\  Mockst_sizer]  r  r   r  r  r   rQ   r=  r  r   r\  r  rj   rk   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   r\  r(  r  r)  r]  r  r   r  r  r   rQ   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   r\  r]  r  r   r   r  r   r=  r  r   r#   r2   rH   r   rg   r9   r   )r   r  	blocksizer   r   r    test_blocksize_arg
  s$   
"z'TestZeroCopySendfile.test_blocksize_argc              
   C   s   t jsJ zt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   r\  r]  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/  r2  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  0
  r  zTestZeroCopyMACOS.zerocopy_funN)r   r   r   r  r  r   r   r   r    r4  ,
  s    r4  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 )zCheck 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_sizerC  columnslines)r   rI   r   r   r    test_does_not_crash5
  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   rp  r   r9  r   r:  r;  r   rr  rI   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 )Nr{  r=  Zyyyr>  r   )r   rp  r   r9  rC  r:  r;  r?  r   r   r    test_bad_environN
  s   

z$TestGetTerminalSize.test_bad_environz
not on ttyr9  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 )	zCheck 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sttyrI   zstty invocation failedrq   r   r>  r=  N)rv   r  r  ry   r   r.  r  r<  rz   r   rp  r   r9  r   )r   rI   r)  rr  r  r   r   r    test_stty_matchV
  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 sw   Y  d S )Nr>  r=  
__stdout__)
      )fallbackrD  rE  r,   r-   r.   )   (   rG  rH  )r   rp  r   r  rt   r   r9  r   r:  r;  r4   r#   devnull)r   rr  rI   rL   r   r   r    test_fallbackn
  s$   
 "z!TestGetTerminalSize.test_fallbackN)r   r   r   r<  r@  rA  r   r   r#   isattyrt   rC  rf   rb   rB  rJ  r   r   r   r    r8  4
  s    
r8  c                   @   r3  )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  rd  rq  r  r  r   r  r   r   r  	ExecErrorr   r   r   r   r   r   r
   r   r  rF  r>  r9  r   statvfsr  r@  )	r   rb   r   r#   rZ   rW   r   r%  rM  )r   Z
target_apir   r   r    test_module_all_attribute
  s
   
z(PublicAPITests.test_module_all_attributeN)r   r   r   r  rP  r   r   r   r    rL  
  s    rL  __main__)F)Vr   Zunittest.mockr   rc   rt   r   r#   Zos.pathr   r(   r)  rv   r>   r@   r  r  r   r   r   r   r   r   r   r	   r
   r   r   r   r  r  r6  ImportErrorr  r   Ztest.supportr   Ztest.support.os_helperr   r   r   r=  r  r  r   r  r  r  rs   r  r   r  r   r\  r]  AssertionErrorr  r!   r*   r9   rM   rQ   rX   rn   ZSUPPORTS_SENDFILEr{   r|   ZTestCaser   r   r^  r  r?  rS  r  r  r  r  r  r  r   r  r4  r8  rL  r   mainr   r   r   r    <module>   s   8

	    d       P <
 s\JdvN
