HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //usr/local/lib/python3.10/test/__pycache__/test_shutil.cpython-310.pyc
o

�i��@stddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZzddlZWneyudZYnwddl m!Z!ddl"m#Z#ddl$m%Z%m&Z&ddl"m'Z'e%dZ(e%dZ)e%d	Z*ej+�,d
�Z-ej+�,d�Z.ej+dd�d
kZ/zddl0Z0ddl1Z1dZ2Wney�dZ2Ynwzddl3Z3Wney�dZ3Ynwej4j5de6d�d�Z7dd�Z8dd�Z9dFdd�Z:dd�Z;dFdd�Z<dd�Z=dd �Z>e>�Z?d!d"�Z@Gd#d$�d$�ZAGd%d&�d&eAejB�ZCGd'd(�d(eAejB�ZDGd)d*�d*eAejB�ZEGd+d,�d,eAejB�ZFGd-d.�d.eAejB�ZGGd/d0�d0eAejB�ZHGd1d2�d2eH�ZIGd3d4�d4eAejB�ZJGd5d6�d6ejB�ZKGd7d8�d8ejB�ZLGd9d:�d:eM�ZNe�Oe?d;�Gd<d=�d=eNejB��ZPe�Oe-d>�Gd?d@�d@eNejB��ZQGdAdB�dBejB�ZRGdCdD�dDejB�ZSeTdEk�r�e�U�dSdS)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�darwinZsunos�ZaixTFzos.chdirzshouldn't call os.chdir()��side_effectcOstttdd�d��)NZEXDEV�zInvalid cross-device link)�OSError�getattr�errno��args�kwargs�r�-/usr/local/lib/python3.10/test/test_shutil.py�_fake_rename:sr!cst����fdd��}|S)Ncs,ztj}tt_�|i|��W|t_S|t_w�N)�os�renamer!)rrZbuiltin_rename��funcrr �wrap?s
zmock_rename.<locals>.wrap)�	functools�wraps)r&r'rr%r �mock_rename>sr*cCslt|t�rtjj|�}|rdnd}|rdnd}t|||d��}|�|�Wd�dS1s/wYdS)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)r2Zcontent�binary�moder/�fprrr �
write_fileIs
"�r9cCs�dd�}t|d�}d�dd�t|�D��}t|d��}|||�D]}|�|�q Wd�n1s2wYtj�|�|ksAJ�dS)	zBCreate a test file with an arbitrary size and random text content.css>�||ksJ�||kr|V||8}||ks|r|VdSdSr"r)�total�steprrr �chunksYs��
�zwrite_test_file.<locals>.chunksi �cSsg|]
}t�tj����qSr)�random�choice�string�
ascii_letters�encode)�.0�irrr �
<listcomp>bs�z#write_test_file.<locals>.<listcomp>r+N)�minr3�ranger4r5r#r2�getsize)r2�sizer<�bufsize�chunk�fZcsizerrr �write_test_fileWs

���rMcCsht|t�rtjj|�}|rdnd}|rdnd}t|||d��}|��Wd�S1s-wYdS)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.)r0r1r#r2r3r4�read)r2r6r7r/r8rrr �	read_fileis
$�rQcCs|g}tt�|��D]2}tj�||�}tj�|�r6tj�|�s6|�|d�t|�D]}|�|d|�q)q	|�|�q	|S)N�/)	�sortedr#�listdirr2r3�isdir�islink�append�rlistdir)r2�res�name�p�nrrr rXws�rXc
Cs�ttd�sdSd}d}z�tjdt��dd��}|j}|�d�Wd�n1s)wYt|d���}tjdt��dd��f}|j}|��}|��}z
t�	||dd�Wn+t
yYWd�Wd�W|durrt�|�|dur}t�|�dSdSw	Wd�Wd�W|dur�t�|�|dur�t�|�d	Sd	S1s�wYWd�n1s�wYW|dur�t�|�|dur�t�|�dSdS|dur�t�|�|dur�t�|�ww)
N�sendfileFr+��dir�deletes
0123456789rNr�T)
�hasattrr#�tempfile�NamedTemporaryFile�getcwdrZr5r4�filenor]rr�unlink)�srcname�dstnamerL�src�dst�infd�outfdrrr �supports_file2file_sendfile�s^
���
����
����
��
�rncCsFtr!tjdkr!t�dtj�}|�d�d��d}t|d�dkSdS)	Ni���z/usr/bin/dump -o %s�
�����i T)�AIX�sys�maxsize�
subprocess�	getoutput�
executable�split�int)ZhdrsZmaxdatarrr �
_maxdataOK�s
r{c@seZdZddd�ZdS)�BaseTestNcCs$tj|t��d�}|�tj|�|S)zjCreate a temporary directory that will be cleaned up.

        Returns the path of the directory.
        )�prefixr_)rc�mkdtempr#re�
addCleanupr�rmtree)�selfr}�drrr r~�szBaseTest.mkdtempr")�__name__�
__module__�__qualname__r~rrrr r|�sr|c@s�eZdZdd�Zejdd��Zejdd��Ze�	e
d�dd	��Ze�	e
d�d
d��Zdd
�Z
e�ejdd�dkd�e�eed�oFe��dkd�dd���Zdd�Zdd�Zdd�Zdd�Zejdd ��Ze�	e
d�d!d"��ZdS)#�
TestRmTreecCsX|��}tj�|d�}t�|�ttj�|d�d�t�|�}|�|t�t	�
|�dS)NZkillmeZsomefile�foo)r~r#r2r3�mkdirr9�fsencode�assertIsInstance�bytes�shutilr�)r��tmpZvictimrrr �test_rmtree_works_on_bytes�s

z%TestRmTree.test_rmtree_works_on_bytescs�|��}tj�|d�}t�|�tj�|d�}t�||�|�ttj	|�|�
tj�|��|�
tj�|��g��fdd�}tj	||d�|�
t��d�|��ddtjj�|�
�dd|�|��dddt�dS)	Nr_�linkc���|�dSr"�rW�r��errorsrr �onerror��z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror�r�rqrra)r~r#r2r3r��symlink�assertRaisesrr�r��
assertTrue�exists�lexists�assertEqual�len�assertIsrVr��r�r�Zdir_r�r�rr�r �test_rmtree_fails_on_symlink�s
z'TestRmTree.test_rmtree_fails_on_symlinkc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}|||fD]}t�|�qtj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�|�|�	tj�
|��|�tj�
|��|�tj�
|��dS�	N�dir1�dir2�dir3�file1r��link1�link2�link3)r~r#r2r3r�r9r�r�r��assertFalser�r��
r�r�r�r�r�r�r�r�r�r�rrr �test_rmtree_works_on_symlinks��$

z(TestRmTree.test_rmtree_works_on_symlinkszonly relevant on Windowscs�|��}tj�|d�}t�|�tj�|d�}t�||�|�tj	|�|�
ttj
|�|�tj�|��|�tj�|��g��fdd�}tj
||d�|�t��d�|��ddtjj�|��dd|�|��dddt�dS)	Nr_r�cr�r"r�r�r�rr r��r�z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr�rqrra)r~r#r2r3r��_winapi�CreateJunctionrrrgr�rr�r�r�r�r�r�r�r�rVr�r�rr�r �test_rmtree_fails_on_junctions�s 
z)TestRmTree.test_rmtree_fails_on_junctionsc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}|||fD]}t�|�qtj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�	|�|�
tj�|��|�tj�|��|�tj�|��dSr�)
r~r#r2r3r�r9r�r�r�r�r�r�r�r�rrr �test_rmtree_works_on_junctionsr�z)TestRmTree.test_rmtree_works_on_junctionscs�tj|��d�}|�ttj|�tj|dd�|��}t|dfd�tj	�
|d�}|�t��
}t�|�Wd�n1s>wY|�|j
j|�|�tj	�|��tj|dd�|�tj	�|��g��fdd�}tj||d�|�t��d	�|��d
d
tj�|��d
d|�|��d
d	dt�|��d
d	dj|�|��dd
tj�|��dd|�|��dd	dt�|��dd	dj|�dS)N�r_T��
ignore_errorsZtstfile�cr�r"r�r�r�rr r�,r�z.TestRmTree.test_rmtree_errors.<locals>.onerrorr�rarrq)rc�mktempr~r��FileNotFoundErrorr�r�r9r#r2r3�NotADirectoryErrorr��	exception�filenamer�r�r�r��scandirr��rmdir)r�r��tmpdir�cmr�rr�r �test_rmtree_errorss2�zTestRmTree.test_rmtree_errorsN��cygwinz2This test can't be run on Cygwin (issue #1071513).�geteuidrz9This test can't be run reliably as root (issue #1076467).cCs
d|_t�t�|�tjt�tj�td�|_	tj�td�|_
t�|j	�t�|j
�t�
t�j}t�
|j	�j}t�
|j
�j}t
jt
jB}t�|j	|�t�|j
|�t�t|�|�tjt|�|�tj|j	|�|�tj|j
|�tjt|jd�|�|jdd�dS)Nr�a�br�rz1Expected call to onerror function did not happen.)�
errorStater#r�rrr�r�r2r3�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_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr �
test_on_error:s*

�zTestRmTree.test_on_errorcCs�|jdkrB|tjur|�||j�n|tjur|�||j�n|�|tj�|�	|t
|jg�|�t|dt
��|jd7_dS|�|tj�|�|t
�|�t|dt
��d|_dS)Nrarrqr)r�r#rgr�r�r�r�r�rT�assertInrr��
issubclassr)r�r&�arg�excrrr r�Ys



z TestRmTree.check_args_to_onerrorcsPz#tj��fdd�}|t_t�t�ttdfd�t�t�W�t_dS�t_w)Ncs|tkrt���|�Sr")rr)�fnrr�Z
orig_lstatrr �raiserwszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr�)r#�lstatr�rr9r�r�)r�r�rr�r �+test_rmtree_does_not_choke_on_failing_lstatts
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcs�tjtjtjtjhtjkotjtjvotjtjv}|r_|�	t
j�|�	t
jj
�|��}tj�|d�}t�|�z"t
j}Gdd�dt���fdd�}|t
_|��t
j|�W|t
_dS|t
_w|�t
j�|�t
jj
�dS)Nr�c@seZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)r�r�r�rrrr �Called�sr�cs��r"rr�r�rr �_raiser��zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r#r4r�rgr��supports_dir_fdrT�supports_fd�supports_follow_symlinksr�r��_use_fd_functionsr��avoids_symlink_attacksr~r2r3r��_rmtree_safe_fd�	Exceptionr�r�)r�r��tmp_dirr�Zreal_rmtreer�rr�r �-test_rmtree_uses_safe_fd_version_if_available�s,�
�
�
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|��d�\}}t�|�|�ttj|�t�	|�dS�Nr�)
rc�mkstempr~r#�closer�r�r�r��remove)r��handler2rrr �test_rmtree_dont_delete_file�s
z'TestRmTree.test_rmtree_dont_delete_filec
Cs�t�t�z2tj�td�}tj�td�}t�|�t�||�|�ttj	|�tj	|dd�Wtj	tdd�dStj	tdd�w)N�cheese�shopTr�)
r#r�rr2r3r�r�rr�r��r�rjrkrrr �test_rmtree_on_symlink�s

"z!TestRmTree.test_rmtree_on_symlinkc
Cs�t�t�z>tj�td�}tj�td�}t�|�ttj�|d�d���t�||�|�	t
tj|�tj|dd�Wtjtdd�dStjtdd�w)Nr�r�Zspamr+Tr�)
r#r�rr2r3r4r�r�r�r�rr�r�r�rrr �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�platformrbr#r�r�r�r�r�r�r�r�rrrr r��s4	





!��


r�c@s�eZdZdd�Zdd�Zejdd��Zdd�Zd	d
�Z	dd�Z
ej�
d
�dd��Zdd�Ze�eed�d�eje�ejdkd�dd����Zdd�Zejdd��Zejdd��Zdd�Zd d!�Zd"S)#�TestCopyTreec	Cs|��}tj�|��d�}|�tj|�|�tjtj�|��t|dfd�t�	tj�|d��t|ddfd�t�
||�|�tj�tj�|d���|�tj�
tj�|d���|�tj�tj�|dd���t|df�}|�|d�t|ddf�}|�|d�dS)N�destination�test.txt�123�test_dir�456)r~r#r2r3rr�r��dirnamer9r��copytreer��isfilerUrQr��r��src_dir�dst_dir�actualrrr �test_copytree_simple�s"�z!TestCopyTree.test_copytree_simplec	CsZ|��}|��}|�tj|�|�tj|�t|dfd�t�tj�|d��t�tj�|d��t|ddfd�t|ddfd�tj	||dd�|�
tj�tj�|d���|�
tj�tj�|d���|�
tj�tj�|dd���t
|df�}|�|d�t
|ddf�}|�|d�|�t��tj	||d	d�Wd�dS1s�wYdS)
Nznonexisting.txtr�Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)�
dirs_exist_okF)r~rr�r�r9r#r�r2r3r�r�r�rUrQr�r��FileExistsErrorr�rrr �test_copytree_dirs_exist_ok�s,�"�z(TestCopyTree.test_copytree_dirs_exist_okc
	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t�|�t�|�t|dfd�tj�|d�}tj�|d�}t�tj�|d�|�ttd�rRt�|t	j
t	jB�ttd	�rctt	d
�rct�|t	j
�t�|�}tj||dd�|�tj�tj�|dd���t�tj�|dd��}tjd
kr�|�d�r�|dd�}|�|tj�|d��t�|�}	ttd�r�|�|	j|j�ttd	�r�|�|	j|j�dSdS)Nrjrk�subzfile.txtr�r�zsub/link�lchmod�lchflags�	UF_NODUMPT��symlinks�ntz\\?\�)r~r#r2r3r�r9r�rbrr��S_IRWXU�S_IRWXOr	r
r�r�r�r�rV�readlinkrZ�
startswithr�r��st_flags)
r�r�rrZsub_dir�src_link�dst_link�src_statr�dst_statrrr �test_copytree_symlinks�s:

�




�z#TestCopyTree.test_copytree_symlinkscCs\tjj}tjj}|��}�z||��d�}t|dfd�t|dfd�t�||d��t|ddfd�t�||d��t|ddfd�t�||dd��t�||dd	��t|dddfd�t|dd	d
fd�z3t�dd�}tj	|||d�|�
|||d���|�|||d���|�|||d���Wt�|�nt�|�wz5t�dd
�}tj	|||d�|�|||d���|�|||dd	���|�|||dd���Wt�|�nt�|�wz*dd�}tj	|||d�|�|||dd	d
���|�|||dd���Wt�|�nt�|�wWt�|�t�tj�
|��dSt�|�t�tj�
|��w)Nr�r�r�ztest.tmpr�r�Z	test_dir2�subdirZsubdir2ztest.pyz*.tmp��ignorezsubdir*cSsfg}|D],}tj�||�}tj�|�r!|��ddkr!|�|�qtj�|�ddvr0|�|�q|S)Nrprz.py)r#r2r3rUryrW�splitext)rj�namesrYrZr2rrr �_filter6s
�z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r#r2r3r�r~r9r�r��ignore_patternsr�r�r�r�r�)r�r3r�rr�patternsrrrr �test_copytree_with_excludesR�

�z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}���}||d�}t�||��t�||d��t�tj�|dd��t|dddfd�g���fdd�}|���d�}tj|||d	���	|||ddd���|���d�}tjt
�|�||d	���	|||ddd���|���d�}tt�
|��d
}��|tj�tj|||d	���	|||ddd�����t��d�dS)N�sourcer�rr�r�csT��|���|t���|t���t|�tt|���|D]}��|t�qgSr")rWr��str�listr�r��set)rjrrZ�Zinvokationsr�rr �_ignore]s
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer�rr�	)r#r2r3r�r~r�r9r�r�r��pathlib�Pathr$r�r��DirEntryr�r�)r�r3r�r�rr'rZ
src_dir_entryrr&r �!test_copytree_arg_types_of_ignoreOs8
	���z.TestCopyTree.test_copytree_arg_types_of_ignorec	Csx|��}tj�|d�}t�|�tj�|d�}|�tj|�t�|d�t	|dfd�t�tj�|d�d�t	|dfd�t�tj�|d�d�t
j|d	�}|�tj|�t�|d�t�||�|�
t�|�jt�|�j�|�
t�tj�|d��jt�tj�|d��j�|�
t�tj�|d��jt�tj�|d��j�tj�|tj�|�d
�}|�
t�|�jt�|�j�dS)Nr"r�i�zpermissive.txtr�zrestrictive.txtr�i�r�rq)r~r#r2r3r�rr�r�r�r9rcrr�r�r�r�ry)r�r�rrZrestrictive_subdirZrestrictive_subdir_dstrrr �!test_copytree_retains_permissionsys6
���
�z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs�|��}tj�|��d�}|�tj|�|�tjtj�|��td�|_	|�
tj��t�||�Wd�dS1s<wYdS)Nr�zka-boom)
r~r#r2r3rr�r�r��PermissionErrorrr�rr�)r�Z
mock_patchrrrrr �test_copytree_winerror�s
"�z#TestCopyTree.test_copytree_winerrorcs�����fdd�}g�����tj���d��ttj��d�ddd��}|��Wd�n1s2wYtj	��|d���
t��d	�dS)
NcsR��d���|t���|t���|tj��d����|tj��d��dS�Nr�)rWr�r#r�r#r2r3)r�r��rk�flagr�rjrr �custom_cpfun�s

zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr�r�r,r-r.��
copy_functionrq)r~rcr�r4r#r2r3r�r�r�r�r�)r�r3rLrr1r �"test_copytree_custom_copy_function�s
�z/TestCopyTree.test_copytree_custom_copy_function�mkfifo�requires os.mkfifo()�vxworks�%fifo requires special path on VxWorksc
CsPt�t�z�tj�td�}t�|�tj�|d�}zt�|�Wnty9}z
|�d|�WYd}~nd}~wwzt�	tt
�Wn/tjyq}z"|jd}|�
t|�d�|d\}}}|�
d||�WYd}~nd}~ww|�d�Wtjtdd	�tjt
dd	�dSWtjtdd	�tjt
dd	�dStjtdd	�tjt
dd	�w)
NrZmypipe�os.mkfifo(): %srrqz`%s` is a named pipez$shutil.Error should have been raisedTr�)r#r�rr2r3r7r.�skipTestr�r��TESTFN2rrr�r��failr�)r�r�pipe�er�rjrkZ	error_msgrrr �test_copytree_named_pipe�s8

��
����z%TestCopyTree.test_copytree_named_pipecs�|��}tj�|��d�}t|dfd�t�tj�|d��t|ddfd�g��fdd�}tj|||d�|�t	��d	�dS)
Nr�r�r�r�r�c���||f�dSr"r��rjrk�Zcopiedrr �_copy��z6TestCopyTree.test_copytree_special_func.<locals>._copyr4ra)
r~r#r2r3r9r�r�r�r�r�)r�rrrErrDr �test_copytree_special_func�sz'TestCopyTree.test_copytree_special_funcc	Cs|��}tj�|d�}t|d�tj�|d�}t�|�||fD]}t�dtj�|d��t�|tj�|d��q tj�|��d�}|�tt	j
||�tj�|��d�}t	j
||d	d
�t�|�D]\}}}|�d|�|�
d|�qatj�|��d�}t	j
||d	d�|�
dt�|��dS)
Nr��abc�dir_aZ
IDONTEXIST�brokenZvalidr��destination2T)�ignore_dangling_symlinksZdestination3r)r~r#r2r3r9r�r�r�rr�r��walk�assertNotInr�rT)	r�rZ
valid_filerIr�r�root�dirs�filesrrr �test_copytree_dangling_symlinks�s$

z,TestCopyTree.test_copytree_dangling_symlinksc	Cs.|��}tj�|��d�}t�tj�|d��ttj�|dd�d��Wd�n1s-wYtjtj�|d�tj�|d�dd�tj||dd	�|�	tj�
tj�|d���|�dt�tj�|d���tj�|��d
�}tj||dd	�|�
tj�
tj�|d���|�dt�tj�|d���dS)Nr�Zreal_dirr�r+Zlink_to_dirT)�target_is_directoryFrrK)r~r#r2r3r�r4r�r�r�r�rVr�rTr�)r�rrrrr �test_copytree_symlink_dir�s"�� z&TestCopyTree.test_copytree_symlink_dircCs\|��}|d}|�tj|d�tj�|d�}t|d�t�||�}|�	dgt�
|��dS)N�destTr�)r~rr�r�r#r2r3r9r�r�rT)r�rrrj�rvrrr �test_copytree_return_values
z'TestCopyTree.test_copytree_return_valuecCs�|��}|jtj|dd�tj�|dd�}tj�|dd�}t�|�tj�|d�}t|d�t�	||�}|�
dgt�|��dS)NTr��tZpgZ
somevendorz1.0Zpol)r~rr�r�r#r2r3�makedirsr9r�r�rT)r��base_dirrrrjrVrrr �test_copytree_subdirectorys

z'TestCopyTree.test_copytree_subdirectoryN)r�r�r�rrrr�rr!r,r-r��mock�patchr/r6r�rbr#r�rtr�rArGrRrTrWr[rrrr r��s0
A*


�


r�c@s�eZdZejdd��Ze�ee	d�d�ejdd���Z
e�ee	d�d�ejdd	���Zejd
d��Z
e�ee	d�oBeed
�oBeed�d�dd��Zejdd��Zejeje�ee	d�o`e	��dkd�dd����Zdd�Zdd�Zejdd��Ze�ee	d�d �d!d"��Zejd#d$��Zejd%d&��Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zejd/d0��Ze�ee	d1�d2�d3d4��Zejd5d6��Z e�ee	d7�d8�e�e!j"d9kd:�d;d<���Z#d=d>�Z$d?d@�Z%e�e&p�e'p�e(dA�e�e)dB�dCdD���Z*dEdF�Z+dGS)H�TestCopycCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�t�|tjtj	B�t�|tj
�|�t�|�jt�|�j�t
�||�|�t�|�jt�|�j�tjdkr�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�dSdS)Nr��bar�baz�quuxr
)r~r#r2r3r9r�r�r�r�S_IRWXGr�assertNotEqualr�r��copymoder�rZ�r�r�rjrkrrrrr �test_copymode_follow_symlinks&s2


 �z&TestCopy.test_copymode_follow_symlinksrzrequires os.lchmodcCsp|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�t�|tjtj	B�t�|tj�t�
|tjtj	B�t�
|tj�tj
||dd�|�t�|�jt�|�j�|�t�|�jt�|�j�t�
|tj�tj
||dd�|�t�|�jt�|�j�t�
|tj�tj
||dd�|�t�|�jt�|�j�dS�Nr�r_r`raF��follow_symlinks)r~r#r2r3r9r�r�r�rrbrrr�rdr�r�r�rcrerrr � test_copymode_symlink_to_symlinkFs0


� z)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�tj||dd�dSrg)r~r#r2r3r9r�r�rdrerrr �*test_copymode_symlink_to_symlink_wo_lchmodds

z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�|�}t�||j|jdf�t|d�|�	t�|�jt�|�j�t�
||�t�
||�ttd�rat�|tj
�ttd�rrttd�rrt�|tj�t�|�}ttd�r�tj||d	d
�|�	|jt�|�j�tj||dd
�t�|�}tjtjvr�dD]}	|�t||	�t||	�d
�q�ttd�r�|�|j|j�ttd�r�t|d�r�|�|j|j�tj||dd
�|�tt�|�jt�|�j�dk�dS)Nr�r_r`�quxgE@rr	r
TrhF��st_atime�st_mtimerqrg�������?)r~r#r2r3r9r��utimernrorcr�rbrrr	r
r�r��copystatr�r��assertLessEqualrr�rr��abs)
r�r�rjrkrrr�
src_link_statZ
dst_link_stat�attrrrr �test_copystat_symlinkstsJ


�




�

�zTestCopy.test_copystat_symlinks�chflags�
EOPNOTSUPP�ENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs�|��}tj�|d�}tj�|d�}t|d�t|d�dd�}tj}z,tjtjfD]
}||�t_t	�
||�q*|tjtj�t_|�tt	j
||�W|t_dS|t_w)Nr��file2�xxxcst��dd���fdd�
}|S)NTrhcs
��_��r")r)r2�flagsri��err�exrr �_chflags_raiser�szlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser�r)r~r�rr}r �make_chflags_raiser�szSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)
r~r#r2r3r9rwrrxryr�rqr�r)r�r�r�rzr�Zold_chflagsr~rrr �-test_copystat_handles_harmless_chflags_errors�s


z6TestCopy.test_copystat_handles_harmless_chflags_errorscs |��}tj�|d��t�d�tj�|d�}t|d�t��|�t��dd�t��dd�t��|�|�t	t�
���t	t�
|���|�t��d�t�|d��t�|�t|d�t
tjd����fdd	�}ztj�|t_t��|�|�dt�
|��W�t_n�t_wd
d���fdd
�
}ztj
�|t_
t��|�W�t_
n�t_
wtj�|d��tj�|d�}t���t||�t��dd�t�|dd�t�|d�tj�|d�}tj�|d�}t||�t||�t��|�t�||�|�t�|d�d�|�t�|d�d�dS)Nr�r_�user.foo�42zuser.bar�43�EPERMcs$|dkr���|||fi|��dS)Nr�r)�fnameru�valr)�
orig_setxattr�os_errorrr �_raise_on_user_foo�sz3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrhcs |�kr
ttjd���||d�S)NzOperation not supportedrh)rrry)r�ri)�orig_listxattrrjrr �
_raise_on_src�sz.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZthe_copy_ro)r~r#r2r3r9r��
_copyxattr�setxattrr�rS�	listxattr�getxattrr�rrr�r�r�rq)r�r�rkr�r�ZsrcroZdstror)r�r�r�rjr �test_copyxattr�sZ

 

�





zTestCopy.test_copyxattrr�r�root privileges requiredcCs�|��}tj�|d�}tj�|d�}t|d�t�||�t�|dd�tj|dddd�tj�|d�}tj�|d	�}t|d�t�||�tj||dd�|�	tj
|ddd�d�|�ttj
|d�tj||dd�|�	t�
|d�d�dS)
Nr�r`ztrusted.foor�r�Frhr_rl)
r~r#r2r3r9r�r�r�r�r�r�r�r)r�r�rjrrkrrrr �test_copyxattr_symlinks�s 

z TestCopy.test_copyxattr_symlinkscCsPd}|��}t||fd�tj�||�}|��}|||�tj�||�}||fS)Nr�r{)r~r9r#r2r3)r��methodr�r�r��tmpdir2rzrrr �
_copy_files
zTestCopy._copy_filecCsB|�tj�\}}|�tj�|��|�t�|�j	t�|�j	�dSr")
r�r��copyr�r#r2r�r�r�r�)r�r�rzrrr �	test_copy!s zTestCopy.test_copycCs|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�r3t�|tj	tj
B�tj||dd�|�
tj�|��|�t|�t|��t�|�tj||dd�|�tj�|��|�t�|�t�|��ttd�r�|�t�|�jt�|�j�dSdS)Nr�r_r`rTrhF)r~r#r2r3r9r�rbrr�rrr�r�r�rVr�rQr�r�rr�r�)r�r�rjrkrrrr �test_copy_symlinks's(




��zTestCopy.test_copy_symlinksrpzrequires os.utimecCs�|�tj�\}}|�tj�|��t�|�}t�|�}|�|j	|j	�dD]}|�
t||�t||�d�q%ttd�rNt|d�rP|�t|d�t|d��dSdSdS)Nrmrqrwr)
r�r��copy2r�r#r2r�r�r�r�rrrrb)r�r�rzZ
file1_statZ
file2_statrurrr �
test_copy2@s

���zTestCopy.test_copy2c	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�r3t�|tj	tj
B�ttd�rDttd�rDt�|tj�t�|�}t�
|�}tj||dd�|�tj�|��|�t|�t|��t�|�tj||d	d�|�tj�|��|�t�|�t�|��t�
|�}tjtjvr�d
D]}|�t||�t||�d�q�ttd�r�|�|j|j�|�|j|j�ttd�r�t|d�r�|�|j|j�dSdSdS)
Nr�r_r`rr	r
TrhFrmrqr)r~r#r2r3r9r�rbrr�rrr	r
r�r�r�r�rVr�rQr�r�rrpr�rrrr�rcr)	r�r�rjrkrrrtrrurrr �test_copy2_symlinksQs>





�
�zTestCopy.test_copy2_symlinkscCsr|��}tj�|d�}tj�|d�}t|d�t�|dd�t�||�|�t�	|d�t�	|d��t�
|�dS)Nr�r_r�r�)r~r#r2r3r9r�r�r�r�r�r�)r�r�rjrkrrr �test_copy2_xattrts


�zTestCopy.test_copy2_xattrcCs�tjtjfD];}|��}|��}tj�|d�}t|d�|||�}|�|tj�|d��||tj�|d��}|�|tj�|d��qdS)Nr�r_)	r�r�r�r~r#r2r3r9r�)r�r�rrrjrVrrr �test_copy_return_value�s

�zTestCopy.test_copy_return_valuecC�|�tj�dSr")�_test_copy_dirr�r��r�rrr �
test_copy_dir��zTestCopy.test_copy_dircCr�r")r�r�r�r�rrr �test_copy2_dir�r�zTestCopy.test_copy2_dircCsx|��}tj�|d�}|��}tj�|d�}t|d�tjdkr#t}nt}|�	||||�|�	||||�|||�dS�Nr��does_not_exist/�win32)
r~r#r2r3r9rtr�r.�IsADirectoryErrorr�)r�Z	copy_funcr�src_filer�rkr~rrr r��s

zTestCopy._test_copy_dircCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�tj||dd�|�tj�	|��|�
t�|�t�|��t�||�|�tj�	|��dS)Nrjrkrr�r�Frh)
r~r#r2r3r9r�r��copyfiler�rVr�rr�)r�r�rjrkrr�rrr �test_copyfile_symlinks�s
zTestCopy.test_copyfile_symlinksr�zrequires os.linkc
Cs$t�t�tj�td�}tj�td�}zvt|ddd��
}|�d�Wd�n1s+wYzt�||�WntyQ}z
|�	d|�WYd}~nd}~ww|�
tjtj
||�t|ddd��}|�|��d�Wd�n1svwYt�|�Wtjtd	d
�dStjtd	d
�w)Nr�r�r,r-r.�cheddarz
os.link(): %srOTr�)r#r�rr2r3r4r5r�r.r<r�r�rr�r�rPr�r�)r�rjrkrLr@rrr �'test_dont_copy_file_onto_link_to_itself�s&
����"z0TestCopy.test_dont_copy_file_onto_link_to_itselfc
Cs�t�t�tj�td�}tj�td�}zZt|ddd��
}|�d�Wd�n1s+wYt�d|�|�t	j
t	j||�t|ddd��}|�|�
�d�Wd�n1sZwYt�|�Wt	jtdd	�dSt	jtdd	�w)
Nr�r�r,r-r.r�rOTr�)r#r�rr2r3r4r5r�r�r�rr�r�rPr�r�)r�rjrkrLrrr �*test_dont_copy_file_onto_symlink_to_itself�s
��"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr7r8r9r:c
Cs�zt�t�Wnty }z
|�d|�WYd}~nd}~wwz|�tjtjtt	�|�tjtjt
t�Wt�t�dSt�t�w)Nr;)r#r7rr.r<r�r��SpecialFileErrorr�r=�__file__r�)r�r@rrr �test_copyfile_named_pipe�s����z!TestCopy.test_copyfile_named_pipecCsl|��}|��}tj�|d�}tj�|d�}t|d�t�||�}|�tj�|��|�	t
|�t
|��dS)Nr_r�)r~r#r2r3r9r�r�r�r�r�rQ)r�rr�dst_filer�rVrrr �test_copyfile_return_value�s
z#TestCopy.test_copyfile_return_valuecCsX|��}tj�|d�}t|d�|�ttj||�|�t	tj||�|�
t|�d�dSr0)r~r#r2r3r9r�rr�r�rr�rQ)r�rr�rrr �test_copyfile_same_file�s
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)zNot valid on AIX, see gh-92670cCsD|��}tj�|d�}tj�|d�}t|d�|�ttj||�dS)Nr�r�)	r~r#r2r3r9r�r�r�r�)r�rr�rkrrr �test_copyfile_nonexistent_dirs

z&TestCopy.test_copyfile_nonexistent_dircCs�|��}tj�|d�}|��}tj�|d�}t|d�tjdkr#t}nt}|�	|t
j||�|�	|t
j||�|�	|t
j||�dSr�)r~r#r2r3r9rtr�r.r�r�r�r�)r�rr�r�rkr~rrr �test_copyfile_copy_dirs

zTestCopy.test_copyfile_copy_dirN),r�r�r�rr�rfr�r�rbr#rjr�rkrvrr�Zskip_unless_xattrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rtr�r�r�r��MACOS�SOLARISr�rsr�r�rrrr r^"sr

(��

?�



"



�

r^c@s|eZdZe��dd��Zdd�Zd9dd�Ze��e�	e
�d�d	�d
d���Ze��dd
��Z
e��e�	e
�d�d�dd���Ze��e�	e
�d�d�dd���Zdd�Ze��dd��Ze��e�	ed�dd���Zdd�Zdd �Ze��d!d"��Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Ze��d-d.��Ze��d/d0��Ze��e� e!o�e"�d1�d2d3���Z#e��d4d5��Z$d6d7�Z%d8S):�TestArchivesc		Cs�|�d�\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��'t
�tj�|�}t|d|d�}Wd�n1sAwYWd�n1sPwY|�
||d�|�tj�|��|�t�|��t�|d��}|�|��gd��Wd�n1s�wYt�	|��!t
�t|d|d�}Wd�n1s�wYWd�n1s�wY|�
||d	�|�tj�|��|�t�|��t�|d
��}|�|��gd��Wd�dS1s�wYdS)Nr��archive�gztar�.�.tar.gzzr:gz)r�z./subz./sub2z./file1z./file2z./sub/file3�tar�.tarrO)�
_create_filesr~r#r�r2r�r3�basenamer�
change_cwd�no_chdir�abspathrr�r�r��tarfileZ
is_tarfiler4�assertCountEqual�getnames)	r��root_dirrZr��work_dir�
rel_base_name�	base_name�tarballZtfrrr �test_make_tarball*s@
��
����
�"�zTestArchives.test_make_tarballcCsFt�|��}|��}|��t|�Wd�S1swYdSr")r�r4r��sortr1)r�r2r�rrrr �_tarinfoNs
$�zTestArchives._tarinfo�distcCs�|��}tj�||�}tj|dd�t|dfd�t|dfd�t�tj�|d��t|ddfd�t�tj�|d��|rEt|d	fd�||fS)
NT)�exist_okr�r{rzrZfile3Zsub2�outer)r~r#r2r3rYr9r�)r�rZr�r�rrr r�TszTestArchives._create_filesr�zNeed the tar command to runcCsx|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��tj�|d�}ddd|g}t
j||t
jd�|�tj�	|��|�|�
|�|�
|��t�t|d||�}Wd�n1sxwY|�||d�|�tj�	|��t�t|d||d	d
�}Wd�n1s�wY|�||d�|�tj�	|��dS)Nr�r�r�zarchive2.tarr�z-cf��cwd�stdoutr�T)�dry_run)r�r#r2r3r~r�rr�r�r�rv�
check_call�DEVNULLr�)r�r�rZr�r�Ztarball2Ztar_cmdrrr �test_tarfile_vs_tarbs4���
��z TestArchives.test_tarfile_vs_tarc		Cs�|��\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��&t
�tj�|�}t|d|�}Wd�n1s?wYWd�n1sNwY|�
||d�|�tj�|��|�t�|��t�|��}|�|��gd��Wd�n1s�wYt�	|��'t
�tj�|�}t|d||�}Wd�n1s�wYWd�n1s�wY|�
||d�|�tj�|��|�t�|��t�|��}|�|��gd��Wd�dS1s�wYdS)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�r2r�r3r�rr�r�r�rr�r�r��zipfile�
is_zipfile�ZipFiler��namelist)	r�r�rZr�r�r�r�rY�zfrrr �test_make_zipfile�sB
��
����
�"�zTestArchives.test_make_zipfiler�zNeed the zip command to runc
Cs.|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��tj�|d�}dddd|g}t
j||t
jd�|�tj�	|��t
�|��}|��}Wd�n1smwYt
�|��}|��}	Wd�n1s�wY|�t|�t|	��dS)Nr�r�r�zarchive2.zipz-qz-rr�)r�r#r2r3r~r�rr�r�r�rvr�r�r�r�r�rS)
r�r�rZr�r�Zarchive2�zip_cmdr�rZnames2rrr �test_zipfile_vs_zip�s(��
�
�z TestArchives.test_zipfile_vs_zip�unzipzNeed the unzip command to runc	Cs.|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��dd|g}t
�|��Jz
tj
|tjd�Wn.tjy|}z!|jjdd�}d	|vrg|�d
�d}|�|�||��WYd}~n
d}~wwWd�dSWd�dS1s�wYdS)Nr�r�r�r�z-t)�stderr�replacer�zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r�r#r2r3r~r�rr�r�r�rr�rv�check_output�STDOUT�CalledProcessError�output�decoder<r>�format)	r�r�rZr�r�r�r�Zdetails�msgrrr �test_unzip_zipfile�s.�

����"�zTestArchives.test_unzip_zipfilecCs*|��}tj�|d�}|�tt|d�dS)Nr�r{)r~r#r2r3r��
ValueErrorr)r�r�r�rrr �test_make_archive�szTestArchives.test_make_archivecCs�trt�d�d}t�d�d}nd}}|��\}}tj�|�	�d�}t
|d||||d�}|�tj�|��t
|d||�}|�tj�|��t
|d||||d�}|�tj�|��t
|d||ddd�}|�tj�|��dS)	NrrOr�r���owner�groupr�Z	kjhkjhkjgZoihohoh)
�UID_GID_SUPPORT�grp�getgrgid�pwd�getpwuidr�r#r2r3r~rr�r�)r�r�r�r�rZr�rYrrr �test_make_archive_owner_group�s(�
�
�z*TestArchives.test_make_archive_owner_group�Requires grp and pwd supportc	
Cs�|��\}}tj�|��d�}t�d�d}t�d�d}t	�
|��$t�t|d|d||d�}Wd�n1s:wYWd�n1sIwY|�
tj�|��t�|�}z|��D]}|�|jd�|�|jd�qaW|��dS|��w)Nr�rr�r�r�)r�r#r2r3r~r�r�r�rrr�r�rr�r�r�r4Z
getmembersr��uid�gidr�)	r�r�rZr�r�r��archive_namer��memberrrr �test_tarfile_root_owners&
���
�z$TestArchives.test_tarfile_root_ownerc	s�t��}|��}dd�}g���fdd�}td|gd�zAt�td|���z	tdd|d�Wn	ty7YnwWd�n1sBwY|�t��|�|��||g�Wt	d�dSt	d�w)	Nc_st��r")�RuntimeError)r�kwrrr �_breakssz3TestArchives.test_make_archive_cwd.<locals>._breakscs��|��|�dSr"r��r2�rPZ
orig_chdirrr �_chdirs
z2TestArchives.test_make_archive_cwd.<locals>._chdirr{�xxx file�chdir)r�)
r#rer~rr�	swap_attrrr�r�r)r�Zcurrent_dirr�r
r
rrr �test_make_archive_cwds$���z"TestArchives.test_make_archive_cwdc	C�|��}t�|��5t�|�tdd�d�|�tj�	d��Wd�n1s)wYWd�dSWd�dS1sAwYdS)N�testr�ztest.tar�
r~rr�r�r�rr�r#r2r��r�r�rrr �test_make_tarfile_in_curdir-s
P�z(TestArchives.test_make_tarfile_in_curdirc	Cr)Nrr�ztest.ziprrrrr �test_make_zipfile_in_curdir4s
P�z(TestArchives.test_make_zipfile_in_curdircCs�|�ttdd�|�ttddd�d�|�ttddd�ddg�tddd�dgd	�d
d�t�D�}|�d|�td�dd�t�D�}|�d|�dS)
Nr{rqcS�tSr"��xrrrr �<lambda>?�z;TestArchives.test_register_archive_format.<locals>.<lambda>cSrr"rrrrr rAr)rqra)rqrarcSrr"rrrrr rDrrcS�g|]\}}|�qSrr�rCrZ�paramsrrr rEE�z=TestArchives.test_register_archive_format.<locals>.<listcomp>cSrrrrrrr rEIr )r��	TypeErrorrrr�rrN)r��formatsrrr �test_register_archive_format<s��z)TestArchives.test_register_archive_formatcKsF|j|dd�fi|��|j|tjfi|��|j|tfi|��dS)NcSs|Sr"rrrrr rPrz3TestArchives.check_unpack_archive.<locals>.<lambda>)�#check_unpack_archive_with_converterr)r*r)r�r�rrrr �check_unpack_archiveNs����z!TestArchives.check_unpack_archivecKs.|��\}}t|�}|�d�tj�|��d�}t||||�}|��}	t||�||	�fi|��|�	t|	�|�|��}
t||�||
�fd|i|��|�	t|
�|�|�
tj��t|t
�fi|��Wd�n1snwY|�
t��t|t
�fddi|��Wd�dS1s�wYdS)Nr�r�r�r{)r�rXr�r#r2r3r~rrr�r�r��	ReadErrorrr�)r�r��	converterrr�rZ�expectedr�r�r�Ztmpdir3rrr r$Us&
��"�z0TestArchives.check_unpack_archive_with_convertercCsV|j|dd�|j|dd�t�|��|�|�Wd�dS1s$wYdS)NZ
fully_trusted��filter�data)r%rZcheck_no_warnings)r�r�rrr �check_unpack_tarballms
"�z!TestArchives.check_unpack_tarballcC�|�d�dS)Nr��r,r�rrr �test_unpack_archive_tarsr�z$TestArchives.test_unpack_archive_tarcCr-)Nr�r.r�rrr �test_unpack_archive_gztarv�z&TestArchives.test_unpack_archive_gztarcCr-)N�bztarr.r�rrr �test_unpack_archive_bztarzr1z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCr-)N�xztarr.r�rrr �test_unpack_archive_xztar~sz&TestArchives.test_unpack_archive_xztarcCsH|�d�|�t��|jddd�Wd�dS1swYdS)Nr�r+r))r%r�r!r�rrr �test_unpack_archive_zip�s
"�z$TestArchives.test_unpack_archive_zipcs�t�}�fdd�}tdddg|dg�tdd���ttd	dg|�td�td	dg|���d	dgd
ft����ddgd
ft��td	���t�|�dS)Ncs(��|d���|d���|d�dS)Nrq�	stuff.boo�xx)r�)r��extract_dir�extrar�rr �_boo�sz/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r:rqr7r8ZBoo2r�)	rrrr�r	r
r�rNr�)r�r"r;rr�r �test_unpack_registry�s

�z!TestArchives.test_unpack_registryN)r�)&r�r�r�rZ
requires_zlibr�r�r�r�r�r��whichr�r�r�r�r�rr�rrrrr#r%r$r,r/r0Zrequires_bz2r3Z
requires_lzmar�rsr{r5r6r<rrrr r�&s^
#
�!
$��





r�c@sLeZdZe�eed�d�dd��Ze�ed�e�ee	d�d�dd	���Z
d
S)�TestMisc�
disk_usagez)disk_usage not available on this platformcCs�t�tj�t��}dD]}|�t||�t�q|�	|j
d�|�	|jd�|�|j
d�|�|j
|j�|�	|j
|j
�t�t�dS)N)r:�used�freer)r�r?r#r2r�r�r�rrzZ
assertGreaterr:r@�assertGreaterEqualrA)r��usagerurrr �test_disk_usage�szTestMisc.test_disk_usager�chownzrequires os.chowncs����}tj|d��t�d���t��
t���Wd�n1s$wY��t��tj�dd�Wd�n1s@wY��t��tj�dd�Wd�n1s\wY��t	��t��d�Wd�n1swwY��t	��t��d�Wd�n1s�wYt
��}t
��}d
��fd	d
�	}t��||�|�||�t��|�|�|�tj�|d�|�|�tj�|d�|�|d�t�|||�||||�t�||�|||�tj||d�|||�tj||d�|||d�zt
�|�d}t�|�d}Wnt�y$YdSwt��||�|�||�t�|||�||||�dS)Nr�ztesting chown functionznon-existing username)�userznon-existing groupname)r��spamg��Q�	@cs>t���}|dur��||j�|dur��||j�dSdSr")r#r�r��st_uid�st_gid)r2rr�s�r�r�rr �check_chown�s
�z(TestMisc.test_chown.<locals>.check_chown)rr)NN)r~rcr�r9r�r�r�rE�LookupErrorr!r#�getuid�getgidr�rr�r��KeyError)r�r�rrrLrFr�rrKr �
test_chown�s^
�����



�zTestMisc.test_chownN)r�r�r�r�r�rbr�rDr�r#rQrrrr r>�s�


r>c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	e
ed�o$e��dkd
�dd��Z
dd�Zdd�Ze�ejdkd�dd��Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Ze�ejdkd$�d%d&��Ze�ejdkd$�d'd(��Zd)S)*�	TestWhichcCst|jdd�|_tj|jddd�|_t�|jjtj	�|�
|jj�tj�
|jj�\|_|_|j|_tj|_d|_dS)NZTmp)r}z.Exe�r_r}�suffixz.EXE)r~�temp_dirrcrd�	temp_filer#r�rZr��S_IXUSRrr�r2ryr_�file�env_path�curdir�extr�rrr �setUp�s�
zTestWhich.setUpcCs&tj|j|jd�}|�||jj�dS�Nr)r�r=rXr_r�rVrZ�r�rVrrr �
test_basicszTestWhich.test_basiccCs(tj|jj|jd�}|�||jj�dSr])r�r=rVrZrUr�r^rrr �test_absolute_cmd	szTestWhich.test_absolute_cmdcCs�tj�|j�\}}tj�||j�}tj|d��tj	||j
d�}|�||�Wd�n1s0wYtj|jd��tj	||d�}|�|�Wd�dS1sTwYdSr])
r#r2ryr_r3rXrr�r�r=rUr��assertIsNone)r�rZ�tail_dir�relpathrVrrr �test_relative_cmds�"�zTestWhich.test_relative_cmdcCs�tj�|j�}tj|jd��1tj|j|d�}t	j
dkr*|�|tj�|j
|j��n
|�|�Wd�dSWd�dS1sBwYdS)Nrr�)r#r2r�r_rr�r�r=rXrtr�r�r3rZra)r�rZrVrrr �test_cwds
�"�zTestWhich.test_cwdr�rznon-root user requiredcCsRt�|jjtj�t�|jjtj�r|�d�t	j
|j|jtjd�}|�
|�dS)Nzcan't set the file read-only)r2r7)r#r�rVrZr�r��access�W_OKr<r�r=rXr_rar^rrr �test_non_matching_mode(s

z TestWhich.test_non_matching_modecCsltj�|j�\}}tj|d��tj|j|d�}|�	|tj�
||j��Wd�dS1s/wYdSr])r#r2ryr_rr�r�r=rXr�r3)r�rZrbrVrrr �test_relative_path2s
"�zTestWhich.test_relative_pathcCstjd|jd�}|�|�dS)Nzfoo.exer)r�r=r_rar^rrr �test_nonexistent_file8szTestWhich.test_nonexistent_filer�zpathext check is Windows-onlycCs<tj|jdd�|jd�}|�||jjdd�|j�dS)N���r)r�r=rXr_r�rVrZr[r^rrr �test_pathext_checking=s"zTestWhich.test_pathext_checkingcCsTt���}|j|d<t�|j�}|�||jj�Wd�dS1s#wYdS�N�PATH)	r�EnvironmentVarGuardrYr�r=rXr�rVrZ�r��envrVrrr �test_environ_pathEs


"�zTestWhich.test_environ_pathcCs�t���h}d|d<tjjd|jdd��At�td|j��)t�	|j��t
�|j�}|�
|�Wd�n1s9wYWd�n1sHwYWd�n1sWwYWd�dSWd�dS1sowYdS)Nr�rn�
os.confstrT��return_value�create�defpath)rror�r\r]r_rrr#r�r�r=rXrarprrr �test_environ_path_emptyKs&
��
�����"�z!TestWhich.test_environ_path_emptycCsHtj�|jj�}tjdkr!tj}t|t	�rt�
|�}tj�||�}t�
��u}tj|d<tjjd|jdd��Mt�td|j��5t�|j�}|�|�t�|j��t�|j�}|�||�Wd�n1sgwYWd�n1svwYWd�n1s�wYWd�dSWd�dS1s�wYdS)Nr�rnrsTrtrw)r#r2r�rVrZrtr�rZr0r�r�r3rro�pathsepr�r\r]r_rrr�r=rXrar�r�)r�Zexpected_cwdrZrqrVrrr �test_environ_path_cwdVs4




��
�����"�zTestWhich.test_environ_path_cwdc
Cs6t����}|�dd�tjjdtdd��&t�t	d|j
��t�|j
�}Wd�n1s.wYWd�n1s=wY|�||jj�tjjd|j
dd��%t�t	dd��t�|j
�}Wd�n1smwYWd�n1s|wY|�||jj�Wd�dS1s�wYdS)NrnrsT)rrvrwrtr�)rro�popr�r\r]r�rrr#r_r�r=rXr�rVrZrprrr �test_environ_path_missingls.

��������"�z#TestWhich.test_environ_path_missingc	Cs�tj�|j�}tj|jd��7t���}|j|d<tj	|j
dd�}|�|�Wd�n1s0wYWd�dSWd�dS1sHwYdS)Nrrnr�)r#r2r�r_rr�rorYr�r=rXra)r�rZrqrVrrr �test_empty_path~s�
P�zTestWhich.test_empty_pathcCsPt���}|�dd�t�|j�}|�|�Wd�dS1s!wYdSrm)rror{r�r=rXrarprrr �test_empty_path_no_PATH�s

"�z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs�d}tj|jd|d�}t�|jtj�|�|j	�tj
�|j�}tj
�|�d}t
���}||d<tj||jd�}|�||j�Wd�dS1sKwYdS)N�.xyz�Tmp2rSr�PATHEXTr)rcrdrUr#r�rZr�rWrr�r2r�rrror�r=r��r�r[Ztemp_filexyzZprogramrqrVrrr �test_pathext�s�
"�zTestWhich.test_pathextcCs�d}tj|jd|d�}|�|j�tj�|j�}tj�	|�d}t
���}|�d�|d<tj
||jd�}|�||j�Wd�dS1sFwYdS)Nrr�rSr�;r�r)rcrdrUrr�r#r2r�rZrrror�r=r�r�rrr �test_pathext_with_empty_str�s�
"�z%TestWhich.test_pathext_with_empty_strN)r�r�r�r\r_r`rdrer�r�rbr#r�rhrirjr�rtr�rlrrrxrzr|r}r~r�r�rrrr rR�s4
�
�

rRc@seZdZdd�ZdS)�TestWhichBytescCsXt�|�t�|j�|_t�|j�|_t�|jj�|j_t�|j�|_t�|j	�|_	dSr")
rRr\r#r�r_rXrVrZrZr[r�rrr r\�s
zTestWhichBytes.setUpN)r�r�r�r\rrrr r��sr�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	e
dd��Ze
dd��Zdd�Z
e
dd��Zdd�Ze
dd��Zdd�Ze�ejjd�dd��Zd d!�Zd"d#�Zd$d%�Zd&d'�Zeje
d(d)���Zeje
d*d+���Zeje
d,d-���Z eje
d.d/���Z!d0d1�Z"d2d3�Z#e
d4d5��Z$e
d6d7��Z%d8d9�Z&e�e'ed:�o�e�(�d;ko�e'ed<�o�e'e)d=�o�e'e)d>�d?�d@dA��Z*dBS)C�TestMovecCsxd}|��|_|��|_tj�|j|�|_tj�|j|�|_t|jd��}|�	d�Wd�dS1s5wYdS)Nr�r+rG)
r~rrr#r2r3r�r�r4r5)r�r�rLrrr r\�s

"�zTestMove.setUpcCs�t|d��}|��}Wd�n1swYt�||�t|d��}|�||���Wd�n1s7wY|�tj�|��dS�NrN)	r4rPr��mover�r�r#r2r�)r�rjrk�real_dstrL�contentsrrr �_check_move_file�s
��zTestMove._check_move_filecCsFtt�|��}t�||�|�|tt�|���|�tj�|��dSr")	rSr#rTr�r�r�r�r2r�)r�rjrkr�r�rrr �_check_move_dir�szTestMove._check_move_dircCs|�|j|j|j�dSr")r�r�r�r�rrr �test_move_file��zTestMove.test_move_filecCs|�|j|j|j�dSr")r�r�rr�r�rrr �test_move_file_to_dir�r�zTestMove.test_move_file_to_dircCs"t�|j�}|�||j|j�dSr")r)r*r�r�rr�)r�rjrrr �"test_move_file_to_dir_pathlike_src��z+TestMove.test_move_file_to_dir_pathlike_srccCs"t�|j�}|�|j||j�dSr")r)r*rr�r�r��r�rkrrr �"test_move_file_to_dir_pathlike_dst�r�z+TestMove.test_move_file_to_dir_pathlike_dstcC�|��dSr")r�r�rrr �test_move_file_other_fs��z TestMove.test_move_file_other_fscCr�r")r�r�rrr �test_move_file_to_dir_other_fs�r�z'TestMove.test_move_file_to_dir_other_fsc	Cs>tj|��d�}z|�|j||�Wt�|�dSt�|�wr�)rcr�r~r�rrr��r�rrrr �
test_move_dir�szTestMove.test_move_dircCr�r")r�r�rrr �test_move_dir_other_fs�r�zTestMove.test_move_dir_other_fsc
Cs,|�|j|jtj�|jtj�|j���dSr")r�rrr#r2r3r�r�rrr �test_move_dir_to_dir�s�zTestMove.test_move_dir_to_dircCr�r")r�r�rrr �test_move_dir_to_dir_other_fsr�z&TestMove.test_move_dir_to_dir_other_fsc
C�4|�|jtjj|jtj�|jtj�|j���dSr")r�rr#r2�seprr3r�r�rrr �test_move_dir_sep_to_dirs�z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc
Cr�r")r�rr#r2�altseprr3r�r�rrr �test_move_dir_altsep_to_dir	s�z$TestMove.test_move_dir_altsep_to_dircCsHt|jd��Wd�n1swY|�tjtj|j|j�dS)Nr+)r4r�r�r�rr�r�rr�rrr �"test_existing_file_inside_dest_dirs�z+TestMove.test_existing_file_inside_dest_dircCs*tj�|jd�}|�tjtj|j|�dS�Nr_)r#r2r3rr�r�rr�r�rrr �test_dont_move_dir_in_itselfsz%TestMove.test_dont_move_dir_in_itselfc	C�pt�t�z,dD]!\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�dSt�	t�w)N))�srcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)�r�)
r#r�rr2r3r�r��
_destinsrcrr�r�rrr �test_destinsrc_false_negative�
���z&TestMove.test_destinsrc_false_negativec	Cr�)N))r�zsrc/dest)r�z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r�)
r#r�rr2r3r�r�r�rr�r�rrr �test_destinsrc_false_positive%r�z&TestMove.test_destinsrc_false_positivecCs\tj�|jd�}t�|j|�t�||j�|�	tj�
|j��|�	tj�|j|j��dSr�)r#r2r3rr�r�r�r�r�r�rV�samefiler�rrr �test_move_file_symlink1s
zTestMove.test_move_file_symlinkcCsld}tj�|j|�}t�|j|�t�||j�tj�|j|�}|�	tj�
|��|�	tj�|j|��dSr�)r#r2r3rr�r�r�r�rr�rVr�)r�r�rkZ
final_linkrrr �test_move_file_symlink_to_dir:sz&TestMove.test_move_file_symlink_to_dircCsztj�|jd�}tj�|jd�}t�||�tj�|jd�}t�||�|�tj�	|��|�
tj�|�tj�|��dS�Nr`r_ra)r#r2r3rr�rr�r�r�rVr��realpath�r�rjrkrrrr �test_move_dangling_symlinkEs z#TestMove.test_move_dangling_symlinkcCs|tj�|jd�}tj�|jd�}t�|�t�||�tj�|jd�}t�||�|�	tj�
|��|�	tj�||��dSr�)r#r2r3rr�r�rr�r�r�rVr�r�rrr �test_move_dir_symlinkPs
zTestMove.test_move_dir_symlinkc	Cs6t�|j|j�}|�|tj�|jtj�|j���dSr")	r�r�r�rr�r#r2r3r�r^rrr �test_move_return_value\s�zTestMove.test_move_return_valuecCs6t�|jtj�|jd��}|�|tj�|jd��dSr�)r�r�r�r#r2r3rr�r^rrr � test_move_as_rename_return_valueasz)TestMove.test_move_as_rename_return_valuecs8g��fdd�}tj|j|j|d�|�t��d�dS)NcrBr"r�rC�Zmovedrr rEhrFz7TestMove.test_move_file_special_function.<locals>._copyr4rq)r�r�r�rr�r��r�rErr�r �test_move_file_special_functionesz(TestMove.test_move_file_special_functioncsdg��fdd�}t�tj�|jd��t�tj�|jd��tj|j|j|d�|�	t
��d�dS)NcrBr"r�rCr�rr rEprFz6TestMove.test_move_dir_special_function.<locals>._copy�childZchild1r4r)rr�r#r2r3rr�r�rr�r�r�rr�r �test_move_dir_special_functionmsz'TestMove.test_move_dir_special_functionc	Cs||��|_tj�tj�|j�tj�|j����}|�|j|�zt	�
|j|�|�tj�|��Wt�
|�dSt�
|�wr")r~rr#r2r3r�r��upperrcr�r�r�rUr�r�rrr �test_move_dir_caseinsensitivews
�z&TestMove.test_move_dir_caseinsensitiver�rr	�SF_IMMUTABLE�	UF_OPAQUEr�c
Cs0zqt�t�t�ttj�|�ttj	tt
�|�t
t��v�t�ttj
�t�tj�td��t�ttj�|�ttj	tt
�|�t
t��v�Wtj�t�r\t�ttj
�t�t�tj�t
�rpt�t
tj
�t�t
�dSdStj�t�r�t�ttj
�t�t�tj�t
�r�t�t
tj
�t�t
�ww)Nr�)r#r��
TESTFN_SRCr	r�r�r�r.r�r��
TESTFN_DSTr�rTr�rr�r2r3r�r�r�rrr �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#r2r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rbr�r�r�rrrr r��sj	




		


	���r�c@s`eZdZGdd�de�Zdd�Ze�ed�dd��Z	e�ed�dd	��Z
e�ed�d
d��ZdS)
�TestCopyFilec@s:eZdZdZdZdZddd�Zdd�Zdd	�Zd
d�Z	dS)
zTestCopyFile.FauxFNTcCs||_||_dSr")�_raise_in_exit�_suppress_at_exit)r�Z
raise_in_exitZsuppress_at_exitrrr �__init__�s
zTestCopyFile.Faux.__init__cGsdS)Nr�r)r�rrrr rP�r�zTestCopyFile.Faux.readcCs
d|_dS)NT)�_enteredr�rrr �	__enter__�s
zTestCopyFile.Faux.__enter__cCs&|||f|_|jrd|_td��|jS)NT�Cannot close)�_exited_withr��_raisedrr�)r��exc_type�exc_val�exc_tbrrr �__exit__�s
zTestCopyFile.Faux.__exit__)FT)
r�r�r�r�r�r�r�rPr�r�rrrr �Faux�s
r�c	Cs�ddd�}t�td|��,|�t��t�dd�Wd�n1s#wYWd�dSWd�dS1s;wYdS)NrOcSs|dkrtd��J�)N�srcfilezCannot open "srcfile"r��r�r7rrr �_open�sz4TestCopyFile.test_w_source_open_fails.<locals>._openr4r��destfile�rO)rrr�r�rr��r�r�rrr �test_w_source_open_fails�s
��"�z%TestCopyFile.test_w_source_open_failszskipped on macOScs�|���d
�fdd�	}t�td|��t�dd�Wd�n1s#wY|��j�|��jdtu�|�	�jdj
d	�dS)NrOcs |dkr�S|dkrtd��J�)Nr�r��Cannot open "destfile"r�r��r�rr r��s
z2TestCopyFile.test_w_dest_open_fails.<locals>._openr4r�r�rrq)r�r�)r�rrr�r�r�r�r�rr�rr�rr�r �test_w_dest_open_fails�s��z#TestCopyFile.test_w_dest_open_failscs�|���|�d��d��fdd�	}t�td|��t�dd�Wd�n1s)wY|��j�|��j�|��j�|��jdt	u�|�
�jd	jd
�dS)NTrOc�|dkr�S|dkr�SJ��Nr�r�rr��r�r�rr r���
z3TestCopyFile.test_w_dest_close_fails.<locals>._openr4r�r�rrq)r�r�)r�rrr�r�r�r�r�r�rr�rr�rr�r �test_w_dest_close_fails�s
��z$TestCopyFile.test_w_dest_close_failsc	s�|�d��|���d	��fdd�	}t�td|��#|�t��t�dd�Wd�n1s/wYWd�n1s>wY|��j�|��j�|�	�j
�|��jddu�|��j
�dS)
NTrOcr�r�rr�r�rr r��r�z5TestCopyFile.test_w_source_close_fails.<locals>._openr4r�r�rr�)r�rrr�r�rr�r�r�r�r�r�r�rr�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�rrrr r��s





r�c@sxeZdZdZedd��Zedd��Zdd�Zej	dd	��Z
d
d�Zdd
�Zdd�Z
dd�Ze�ejdkd�dd��ZdS)�TestCopyFileObji cCstt|j�dSr")rMr�FILESIZE��clsrrr �
setUpClass
	szTestCopyFileObj.setUpClasscCst�t�t�t�dSr")rrgrr=r�rrr �
tearDownClass	s
zTestCopyFileObj.tearDownClasscC�t�t�dSr"�rrgr=r�rrr �tearDown	r�zTestCopyFileObj.tearDownc	c�v�ttd��+}ttd��
}||fVWd�n1swYWd�dSWd�dS1s4wYdS�NrNr+�r4rr=r�rrr �	get_files	����"�zTestCopyFileObj.get_filesc	Cs~t|d��0}t|d��}|�|��|���Wd�n1s wYWd�dSWd�dS1s8wYdSr�)r4r�rP)r�rjrk�fsrc�fdstrrr �assert_files_eq	s��"�zTestCopyFileObj.assert_files_eqcCsH|���\}}t�||�Wd�n1swY|�tt�dSr")r�r��copyfileobjr�rr=r�rrr �test_content!	s�zTestCopyFileObj.test_contentcCsR|���\}}t�||�|jrJ�|jrJ�Wd�dS1s"wYdSr")r�r�r��closedr�rrr �test_file_not_closed&	s

"�z$TestCopyFileObj.test_file_not_closedcCsb|���#\}}t�||�|�|��|j�|�|��|j�Wd�dS1s*wYdSr")r�r�r�r��tellr�r�rrr �test_file_offset,	s
"�z TestCopyFileObj.test_file_offsetr
zWindows onlycCs�tj�d��}t�tt�Wd�n1swY|js!J�|�|j	ddd�t
jt�
�dd��
}|�d�Wd�n1sEwY|j}|�tj|�tj�d��}t�|t�Wd�n1skwY|�|j	ddd�t
jt�
�dd��}Wd�n1s�wY|j}|�tj|�tj�d��}t�|t�Wd�n1s�wY|jr�J�|�|t�dS)	Nzshutil._copyfileobj_readintorraiFr^sfoor)r�r\r]r�r�rr=�calledr��	call_argsrcrdr#rer5rZrrrgr�)r��mrLr�rrr �
test_win_impl2	s0�
����
zTestCopyFileObj.test_win_implN)r�r�r�r��classmethodr�r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r#rZr�rrrr r�	s


r�c@s�eZdZdZdZdZdZedd��Zedd��Z	d	d
�Z
ejdd��Z
d
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS) �_ZeroCopyFileTestz#Tests common to all zero-copy APIs.i�r=r�cCsZtt|j�ttd��}|��|_t|j�|jksJ�Wd�dS1s&wYdSr�)rMrr�r4rP�FILEDATAr�)r�rLrrr r�W	s

"�z_ZeroCopyFileTest.setUpClasscCr�r")rrgrr�rrr r�^	r1z_ZeroCopyFileTest.tearDownClasscCr�r"r�r�rrr r�b	r�z_ZeroCopyFileTest.tearDownc	cr�r�r�r�rrr r�e	r�z_ZeroCopyFileTest.get_filescOstd��)Nzmust be implemented in subclass)�NotImplementedError)r�rrrrr �zerocopy_funk	sz_ZeroCopyFileTest.zerocopy_funcCs$|��|��|��|��dSr")r�r�r�r\r�rrr �resetn	sz_ZeroCopyFileTest.resetc	Cs�|���\}}|�||�Wd�n1swY|�ttdd�|j�|���,\}}tj�d��}t	�
tt�Wd�n1sEwY|jrOJ�Wd�dS1sZwYdS)NT�r6zshutil.copyfileobj)
r�rr�rQr=rr�r\r]r�r�rr�)r�rjrkr�rrr �test_regular_copyv	s��"�z#_ZeroCopyFileTest.test_regular_copyc	Cs�|�|j�|���%\}}|�t��|�||�Wd�n1s#wYWd�n1s2wY|�ttdd�|j	�dS)NTr)
rrr�r�r�rr�rQrrr�rrr �test_same_file�	s���z _ZeroCopyFileTest.test_same_filecCsZtjt��d�}|�t��}t�|d�Wd�n1swY|�|j	j
|�dS)Nr��new)rcr�r#rer�r�r�r�r�r�r�)r�rZr�rrr �test_non_existent_src�	s
�z'_ZeroCopyFileTest.test_non_existent_srcc	s�td�td�|��fdd��|��fdd��t�d��Wd�n1s*wYt�d��#}t�d��}|�||�Wd�n1sKwYWd�n1sZwY|�t�dd	�d
�dS)Nrjrkc�
t���Sr"�rrgr)rhrr r�	�
z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>cr
r"rr)rirr r�	rr+rNTrr=)rrr4rr�rQr�r)rirhr �test_empty_file�	s����z!_ZeroCopyFileTest.test_empty_filecCsJtjj|jtd��|�ttjtt	�Wd�dS1swYdS)Nr)
r�r\r]�
PATCHPOINT�ZeroDivisionErrorr�r�r�rr=r�rrr �test_unhandled_exception�	s
��"�z*_ZeroCopyFileTest.test_unhandled_exceptionc
Cs�tjj|jttjd�d��B|���%\}}|�t	��|�
||�Wd�n1s+wYWd�n1s:wYWd�dSWd�dS1sRwYdS�N�yor)r�r\r]rrr�EINVALr�r�r
rr�rrr �test_exception_on_first_call�	s

�����"�z._ZeroCopyFileTest.test_exception_on_first_callc	Cs�tjj|jttjd�d��0|���\}}|�t|j	||�Wd�n1s(wYWd�dSWd�dS1s@wYdSr)
r�r\r]rrr�ENOSPCr�r�rr�rrr �test_filesystem_full�	s

���"�z&_ZeroCopyFileTest.test_filesystem_fullN)r�r�r��__doc__r�rrr�r�r�r�r�r�r�rrrrr	r
rrrrrrr rQ	s*




rzos.sendfile() not supportedc@sXeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS)�TestZeroCopySendfile�os.sendfilecCst�||�Sr")r��_fastcopy_sendfile)r�r�r�rrr r�	sz!TestZeroCopySendfile.zerocopy_func
Cs�t�|j��>}ttd��)}|�t��|�||�Wd�n1s#wYt�	||�Wd�n1s8wYWd�n1sGwY|�
ttdd�|j�dS)Nr+Tr)�io�BytesIOrr4r=r�r
rr�r�r�rQr�rrr �test_non_regular_file_src�	s����z.TestZeroCopySendfile.test_non_regular_file_srcc
Cs�ttd��T}t���7}|�t��|�||�Wd�n1s!wYt�||�|�	d�|�
|��|j�Wd�n1sDwYWd�dSWd�dS1s\wYdS)NrNr)
r4rrrr�r
rr�r��seekr�rPrr�rrr �test_non_regular_file_dst�	s
�
��"�z.TestZeroCopySendfile.test_non_regular_file_dstc
s���fdd�}g�tj�tjjdd|d��9|���%\}}|�t��}t�	||�Wd�n1s3wYWd�n1sBwYWd�n1sQwY�sZJ�|�
|jjtj
�dS)Ncs(�s��d��|i|��Sttjd��)Nr)rWrr�EBADFr�r2Z
orig_sendfilerr r]�	s
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfilerT)rvr)r#r]r�r\r]r�r�rr�rr�r�rr )r�r]rjrkr�rr!r �test_exception_on_second_call�	s 
������z2TestZeroCopySendfile.test_exception_on_second_callc	Cs�tjjdtd��)}|���\}}t�||�|jsJ�Wd�n1s%wYWd�n1s4wY|�t	t
dd�|j�dS)N�os.fstatrTr)r�r\r]rr�r�rr�r�rQr=r�r�r�rjrkrrr �test_cant_get_size�	s���z'TestZeroCopySendfile.test_cant_get_sizec	Cs�tj��}d|_tjjd|d��)}|���\}}t�||�|js#J�Wd�n1s-wYWd�n1s<wY|�	t
tdd�|j�dS)Nir#�ruTr)
r�r\�Mock�st_sizer]r�r�rr�r�rQr=r�r�r\r�rjrkrrr �test_small_chunks�	s
���z&TestZeroCopySendfile.test_small_chunksc	Cs�tj��}|jd|_tjjd|d��)}|���\}}t�||�|j	s&J�Wd�n1s0wYWd�n1s?wY|�
ttdd�|j
�dS)Ni@r#r&Tr)r�r\r'r�r(r]r�r�rr�r�rQr=rr)rrr �test_big_chunk�	s
���z#TestZeroCopySendfile.test_big_chunkcCs�tjjdtd��P}|�ttjtt�|j	dd}|�
|tj�
t��t�t�ttddd�|�tjtd�|�ttjttd�|j	dd}|�
|d	�Wd�dS1s[wYdS)
NrrrrshelloTr�3i�)r�r\r]rr�r�r�rr=r�r�r#r2rHrrgr9r)r�r��	blocksizerrr �test_blocksize_arg
s$��
�"�z'TestZeroCopySendfile.test_blocksize_argc
Cs tjsJ�z�tjj|jttjd�d��>}|�	��%\}}|�
t��t�||�Wd�n1s1wYWd�n1s@wY|j
sJJ�Wd�n1sTwYtjr^J�tj�|j��}t�tt�|j
rqJ�Wd�n1s{wYWdt_dSWdt_dSdt_w)NrrT)r��_USE_CP_SENDFILEr�r\r]rrr�ENOTSOCKr�r�r
rr�r�rr=r$rrr �test_file2file_not_supported
s.

�����
�
�z1TestZeroCopySendfile.test_file2file_not_supportedN)
r�r�r�rrrrr"r%r*r+r.r1rrrr r�	s		


rz
macOS onlyc@�eZdZdZdd�ZdS)�TestZeroCopyMACOSzposix._fcopyfilecCst�||tj�Sr")r��_fastcopy_fcopyfile�posix�_COPYFILE_DATAr�rrr r0
r�zTestZeroCopyMACOS.zerocopy_funN)r�r�r�rrrrrr r3,
sr3c@s^eZdZdd�Zdd�Zdd�Ze�e�	e
j���d�e�e
ed�d	�d
d���Zdd
�ZdS)�TestGetTerminalSizecCs(t��}|�|jd�|�|jd�dS)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.
        rN)r��get_terminal_sizerB�columns�lines)r�rIrrr �test_does_not_crash5
sz'TestGetTerminalSize.test_does_not_crashcCs�t���}d|d<|d=t��}Wd�n1swY|�|jd�t���}|d=d|d<t��}Wd�n1s@wY|�|jd�dS)z.Check if environment variables have precedenceZ777�COLUMNS�LINESNi	Z888ix)rror�r8r�r9r:�r�rqrIrrr �test_os_environ_first?
s

�

�z)TestGetTerminalSize.test_os_environ_firstcCs`t���}d|d<d|d<t��}Wd�n1swY|�|jd�|�|jd�dS)Nr{r<Zyyyr=r)rror�r8rBr9r:r>rrr �test_bad_environN
s

�z$TestGetTerminalSize.test_bad_environz
not on ttyr8zneed os.get_terminal_size()c
Cs�z
t�ddg�����}Wntttjfy|�d�Ynwt|d�t|d�f}t	�
��}|d=|d=t��}Wd�n1sEwY|�
||�dS)	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.
        ZsttyrIzstty invocation failedrqrr=r<N)rvr�r�ryr�r.r�r<rzrror�r8r�)r�rIr(rqrrrr �test_stty_matchV
s

��

�z#TestGetTerminalSize.test_stty_matchc
Cst���}}|d=|d=t�tdd��tjdd�}Wd�n1s#wY|�|jd�|�|j	d�t
tjdd	d
��%}t�td|��tjdd�}Wd�n1sWwYWd�n1sfwY|�|jd�|�|j	d
�Wd�dS1s�wYdS)Nr=r<�
__stdout__)�
�)�fallbackrCrDr,r-r.)��(rFrG)
rrorrrtr�r8r�r9r:r4r#�devnull)r�rqrIrLrrr �
test_fallbackn
s$
����"�z!TestGetTerminalSize.test_fallbackN)r�r�r�r;r?r@r�r�r#�isattyrtrBrfrbrArIrrrr r74
s
�r7c@r2)�PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|�ttd��gd�}ttd�stjdkr|�d�|�ttj�t|��dS)N�__all__)r�r�rdrqr�r�r�r�r�rr��	ExecErrorrrrrrrr
rrrEr=r8r�statvfsr
r?)	r�rbr�r#rZrWr�r%rL)r�Z
target_apirrr �test_module_all_attribute�
s

z(PublicAPITests.test_module_all_attributeN)r�r�r�rrOrrrr rK�
srK�__main__)F)Vr�Z
unittest.mockr�rcrtr�r#Zos.pathrr(r)rvr>r@r�rrrrrrrrr	r
rrr
r�r�r5�ImportErrorrrZtest.supportrZtest.support.os_helperrrrr=r�r�r�rr�r�rsr�r�r�r�r\r]�AssertionErrorr�r!r*r9rMrQrXrnZSUPPORTS_SENDFILEr{r|ZTestCaser�r�r^r�r>rRr�r�r�r�r�rr�rr3r7rKr��mainrrrr �<module>s�8����

	dP<
s\JdvN
�