Sindbad~EG File Manager

Current Path : /usr/local/lib/python3.9/test/__pycache__/
Upload File :
Current File : //usr/local/lib/python3.9/test/__pycache__/test_shutil.cpython-39.pyc

a

��g���@sTddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZzddlZWney�dZYn0ddl m!Z!ddl"m#Z#m$Z$ddl"m%Z%e#dZ&e#dZ'e#dZ(ej)�*d	�Z+ej)�*d
�Z,ej)dd�dkZ-zddl.Z.ddl/Z/d
Z0Wne�y�dZ0Yn0zddl1Z1Wne�y�dZ1Yn0dd�Z2dd�Z3dBdd�Z4dd�Z5dCdd�Z6dd�Z7dd�Z8e8�Z9dd�Z:Gdd �d �Z;Gd!d"�d"e;ej<�Z=Gd#d$�d$e;ej<�Z>Gd%d&�d&e;ej<�Z?Gd'd(�d(e;ej<�Z@Gd)d*�d*e;ej<�ZAGd+d,�d,e;ej<�ZBGd-d.�d.eB�ZCGd/d0�d0e;ej<�ZDGd1d2�d2ej<�ZEGd3d4�d4ej<�ZFGd5d6�d6eG�ZHe�Ie9d7�Gd8d9�d9eHej<��ZJe�Ie+d:�Gd;d<�d<eHej<��ZKGd=d>�d>ej<�ZLGd?d@�d@ej<�ZMeNdAk�rPe�O�dS)D�N)�make_archive�register_archive_format�unregister_archive_format�get_archive_formats�Error�unpack_archive�register_unpack_format�
RegistryError�unregister_unpack_format�get_unpack_formats�
SameFileError�_GiveupOnFastCopy)�support)�TESTFN�FakePath)�warnings_helper�2Z_SRCZ_DST�darwinZsunos�ZaixTFcOstttdd�d��dS)NZEXDEV�zInvalid cross-device link)�OSError�getattr�errno��args�kwargs�r�,/usr/local/lib/python3.9/test/test_shutil.py�_fake_rename6srcst����fdd��}|S)Ncs0z"tj}tt_�|i|��W|t_S|t_0dS�N)�os�renamer)rrZbuiltin_rename��funcrr�wrap;s�zmock_rename.<locals>.wrap)�	functools�wraps)r#r$rr"r�mock_rename:sr'cCsVt|t�rtjj|�}t||r"dnd��}|�|�Wd�n1sH0YdS)z�Write *content* to a file located at *path*.

    If *path* is a tuple instead of a string, os.path.join will be used to
    make a path.  If *binary* is true, the file will be opened in binary
    mode.
    �wb�wN)�
isinstance�tupler �path�join�open�write)r,Zcontent�binary�fprrr�
write_fileEs
r2cCs�dd�}t|d�}d�dd�t|�D��}t|d��*}|||�D]}|�|�q@Wd�n1sd0Ytj�|�|ks�J�dS)	zBCreate a test file with an arbitrary size and random text content.css2||ksJ�||kr$|V||8}q|r.|VdSrr)�total�steprrr�chunksSs
zwrite_test_file.<locals>.chunksi �cSsg|]}t�tj����qSr)�random�choice�string�
ascii_letters�encode)�.0�irrr�
<listcomp>\s�z#write_test_file.<locals>.<listcomp>r(N)�minr-�ranger.r/r r,�getsize)r,�sizer5�bufsize�chunk�fZcsizerrr�write_test_fileQs

�*rFcCsTt|t�rtjj|�}t||r"dnd��}|��Wd�S1sF0YdS)z�Return contents from a file located at *path*.

    If *path* is a tuple instead of a string, os.path.join will be used to
    make a path.  If *binary* is true, the file will be opened in binary
    mode.
    �rb�rN)r*r+r r,r-r.�read)r,r0r1rrr�	read_filecs
rJcCs|g}tt�|��D]d}tj�||�}tj�|�rltj�|�sl|�|d�t|�D]}|�|d|�qRq|�|�q|S)N�/)	�sortedr �listdirr,r-�isdir�islink�append�rlistdir)r,�res�name�p�nrrrrQosrQc
Cs�ttd�sdSd}d}�z�tjdt��dd�� }|j}|�d�Wd�n1sT0Yt|d���}tjdt��dd���}|j}|��}|��}zt�	||dd�WnTt
�yYWd�Wd�W|dur�t�|�|dur�t�|�dS0Wd�Wd�W|du�r0t�|�|du�rDt�|�d	SWd�n1�s^0YWd�n1�s~0YW|du�r�t�|�|du�r�t�|�n*|du�r�t�|�|du�r�t�|�0dS)
N�sendfileFr(��dir�deletes
0123456789rGr�T)
�hasattrr �tempfile�NamedTemporaryFile�getcwdrSr/r.�filenorVrr�unlink)�srcname�dstnamerE�src�dst�infd�outfdrrr�supports_file2file_sendfile{sH
(

�



�F


�


rgcCsJtrBtjdkrBt�dtj�}|�d�d��d}t|d�dkSdSdS)	Ni���z/usr/bin/dump -o %s�
�����i T)�AIX�sys�maxsize�
subprocess�	getoutput�
executable�split�int)ZhdrsZmaxdatarrr�
_maxdataOK�s
rtc@seZdZddd�ZdS)�BaseTestNcCs$tj|t��d�}|�tj|�|S)zjCreate a temporary directory that will be cleaned up.

        Returns the path of the directory.
        )�prefixrX)r\�mkdtempr r^�
addCleanupr�rmtree)�selfrv�drrrrw�szBaseTest.mkdtemp)N)�__name__�
__module__�__qualname__rwrrrrru�sruc@s�eZdZdd�Zejdd��Zejdd��Ze�	e
d�dd	��Ze�	e
d�d
d��Zdd
�Z
e�ejdd�dkd�e�eed�o�e��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)rwr r,r-�mkdirr2�fsencode�assertIsInstance�bytes�shutilry)rz�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)	NrX�linkcs��|�dSr�rP�r��errorsrr�onerror�sz8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror�r�rjrrZ)rwr r,r-r��symlink�assertRaisesrr�ry�
assertTrue�exists�lexists�assertEqual�len�assertIsrOr��rzr�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�|�q<tj�|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)rwr r,r-r�r2r�r�ry�assertFalser�r��
rzr�r�r�r�r{r�r�r�r�rrr�test_rmtree_works_on_symlinks�s$

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)	NrXr�cs��|�dSrr�r�r�rrr��sz:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr�rjrrZ)rwr r,r-r��_winapi�CreateJunctionrxrr`r�rr�ryr�r�r�r�r�r�rOr�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�|�q<tj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�	|�|�
tj�|��|�tj�|��|�tj�|��dSr�)
rwr r,r-r�r2r�r�r�ryr�r�r�r�rrr�test_rmtree_works_on_junctions�s$

z)TestRmTree.test_rmtree_works_on_junctionscs�tj|��d�}|�ttj|�tj|dd�|��}t|dfd�tj	�
|d�}|�t��}t�|�Wd�n1s|0Y|tj	�
|d�g}|�|j
j|�|�tj	�|��tj|dd�|�tj	�|��g��fdd�}tj||d	�|�t��d
�|��ddtj�|��dd|�|��dd
dt�|��dd
dj|�|��ddtj�|��dd|�|��dd
dt�|��dd
dj|�dS)
N�rXT��
ignore_errorsZtstfile�z*.*cs��|�dSrr�r�r�rrr�'sz.TestRmTree.test_rmtree_errors.<locals>.onerrorr�rZrrj)r\�mktemprwr��FileNotFoundErrorr�ryr2r r,r-�NotADirectoryError�assertIn�	exception�filenamer�r�r�r�r��scandirr��rmdir)rzr��tmpdir�cmZ
possible_argsr�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�rrxr�ryr,r-�child_file_path�child_dir_pathr�create_empty_file�stat�st_mode�S_IREAD�S_IEXEC�chmod�check_args_to_onerrorr�)rzZold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr�
test_on_error5s*

�zTestRmTree.test_on_errorcCs�|jdkr�|tjur$|�||j�n:|tjur>|�||j�n |�|tj�|�	|t
|jg�|�t|dt
��|jd7_n4|�|tj�|�|t
�|�t|dt
��d|_dS)NrZrrjr)r�r r`r�r�r�r�r�rMr�rr��
issubclassr)rzr#�arg�excrrrr�Ts


z TestRmTree.check_args_to_onerrorcsRzDtj��fdd�}|t_t�t�ttdfd�t�t�W�t_n�t_0dS)Ncs|tkrt��n�|�SdSr)rr)�fnrr�Z
orig_lstatrr�raiserrszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr�)r �lstatr�rr2r�ry)rzr�rr�r�+test_rmtree_does_not_choke_on_failing_lstatos
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcs�tjtjtjtjhtjko0tjtjvo0tjtjv}|r�|�	t
j�|�	t
jj
�|��}tj�|d�}t�|�zBt
j}Gdd�dt���fdd�}|t
_|��t
j|�W|t
_q�|t
_0n|�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�r6r�cs��dSrrr�r�rr�_raiser�szITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r r.r�r`r��supports_dir_fdrM�supports_fd�supports_follow_symlinksr�r��_use_fd_functionsry�avoids_symlink_attacksrwr,r-r��_rmtree_safe_fd�	Exceptionr�r�)rzr��tmp_dirr{Zreal_rmtreer�rr�r�-test_rmtree_uses_safe_fd_version_if_availables,�
�
�
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|��d�\}}t�|�|�ttj|�t�	|�dS�Nr�)
r\�mkstemprwr �closer�r�r�ry�remove)rz�handler,rrr�test_rmtree_dont_delete_file�s
z'TestRmTree.test_rmtree_dont_delete_filec
Cs�t�t�zbtj�td�}tj�td�}t�|�t�||�|�ttj	|�tj	|dd�Wtj	tdd�ntj	tdd�0dS)N�cheese�shopTr�)
r r�rr,r-r�r�rr�ry�rzrcrdrrr�test_rmtree_on_symlink�s

z!TestRmTree.test_rmtree_on_symlinkc
Cs�t�t�zztj�td�}tj�td�}t�|�ttj�|d�d���t�||�|�	t
tj|�tj|dd�Wtjtdd�ntjtdd�0dS)Nr�r�Zspamr(Tr�)
r r�rr,r-r.r�r�r�r�rr�ryr�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��skipIfrm�platformr[r r�r�r�r�r�r�r�r�rrrrr�s2	





$��

rc@s�eZdZdd�Zdd�Zejdd��Zdd�Zd	d
�Z	dd�Z
ej�
d
�dd��Zdd�Ze�eed�d�ejdd���Zdd�Zejdd��Zejdd��Zdd�Zdd�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)rwr r,r-rxr�ry�dirnamer2r��copytreer��isfilerNrJr��rz�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�n1�sL0YdS)
Nznonexisting.txtr�Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)�
dirs_exist_okF)rwrxr�ryr2r r�r,r-r�r�r�rNrJr�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�r�t�|t	j
t	jB�ttd	�r�tt	d
�r�t�|t	j
�t�|�}tj||dd�|�tj�tj�|dd���t�tj�|dd��}tjd
k�r8|�d��r8|dd�}|�|tj�|d��t�|�}	ttd��rt|�|	j|j�ttd	��r�|�|	j|j�dS)Nrcrd�subzfile.txtr�r�zsub/link�lchmod�lchflags�	UF_NODUMPT��symlinks�ntz\\?\�)rwr r,r-r�r2r�r[r�r��S_IRWXU�S_IRWXOr�r�r�r�r�r�rO�readlinkrS�
startswithr�r��st_flags)
rzr�r�r�Zsub_dir�src_link�dst_link�src_statr��dst_statrrr�test_copytree_symlinks�s8

�


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�zft�dd�}tj	|||d�|�
|||d���|�|||d���|�|||d���Wt�|�nt�|�0zjt�dd
�}tj	|||d�|�|||d���|�|||dd	���|�|||dd���Wt�|�nt�|�0zTdd�}tj	|||d�|�|||dd	d
���|�|||dd���Wt�|�nt�|�0Wt�|�t�tj�
|��nt�|�t�tj�
|��0dS)Nr�r�r�ztest.tmpr�r�Z	test_dir2�subdirZsubdir2ztest.pyz*.tmp��ignorezsubdir*cSsfg}|D]X}tj�||�}tj�|�rB|��ddkrB|�|�qtj�|�ddvr|�|�q|S)Nrirz.py)r r,r-rNrrrP�splitext)rc�namesrRrSr,rrr�_filter1s�z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r r,r-r�rwr2r�r��ignore_patternsr�r�r�ryr�)rzr-r�r�r��patternsrrrr�test_copytree_with_exclude	sR�
�
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�q>gSr)rPr��str�listr�r��set)rcrrS�Zinvokationsrzrr�_ignoreXs
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer�rr�	)r r,r-r�rwr�r2r�r�r��pathlib�Pathrr�r��DirEntryr�r�)rzr-r�r�r�rr�Z
src_dir_entryrrr�!test_copytree_arg_types_of_ignoreJs8
	���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)Nrr�i�zpermissive.txtr�zrestrictive.txtr�i�r�rj)rwr r,r-r�rxr�ryr�r2r\rr�r�r�r�rr)rzr�r�r�Zrestrictive_subdirZrestrictive_subdir_dstrrr�!test_copytree_retains_permissionsts6
���
�z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs�|��}tj�|��d�}|�tj|�|�tjtj�|��td�|_	|�
tj��t�||�Wd�n1sv0YdS)Nr�zka-boom)
rwr r,r-rxr�ryr��PermissionError�side_effectr�rr�)rzZ
mock_patchr�r�rrr�test_copytree_winerror�s
z#TestCopyTree.test_copytree_winerrorcs�����fdd�}g�����tj���d��ttj��d�d��}|��Wd�n1s`0Ytj	��|d���
t��d�dS)NcsR��d���|t���|t���|tj��d����|tj��d��dS�Nr�)rPr�rr�r r,r-)r�r��rd�flagrzrcrr�custom_cpfun�s

zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr�r�r)��
copy_functionrj)rwr\r�r.r r,r-r�r�r�r�r�)rzr)rErr'r�"test_copytree_custom_copy_function�s&z/TestCopyTree.test_copytree_custom_copy_function�mkfifo�requires os.mkfifo()c
Cs2t�t��ztj�td�}t�|�tj�|d�}zt�|�Wn2tyt}z|�d|�WYd}~n
d}~00zt�	tt
�Wn^tjy�}zD|jd}|�
t|�d�|d\}}}|�
d||�WYd}~nd}~00|�d�Wtjtdd	�tjt
dd	�ntjtdd	�tjt
dd	�0dS)
NrZmypipe�os.mkfifo(): %srrjz`%s` is a named pipez$shutil.Error should have been raisedTr�)r r�rr,r-r-r#�skipTestr�r��TESTFN2rrr�r��failry)rzr�pipe�er�rcrdZ	error_msgrrr�test_copytree_named_pipe�s*

$
&�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�cs��||f�dSrr��rcrd�Zcopiedrr�_copy�sz6TestCopyTree.test_copytree_special_func.<locals>._copyr*rZ)
rwr r,r-r2r�r�r�r�r�)rzr�r�r8rr7r�test_copytree_special_func�sz'TestCopyTree.test_copytree_special_funccCs�|��}tj�|��d�}t�dtj�|d��t�tj�|d��t|ddfd�|�tt	j
||�tj�|��d�}t	j
||dd�|�dt�|��tj�|��d	�}t	j
||dd
�|�
dt�|��dS)Nr�Z
IDONTEXISTr�r�r��destination2T)�ignore_dangling_symlinksZdestination3r)rwr r,r-r�r�r2r�rr�r��assertNotInrMr��rzr�r�rrr�test_copytree_dangling_symlinks�sz,TestCopyTree.test_copytree_dangling_symlinksc	Cs.|��}tj�|��d�}t�tj�|d��ttj�|dd�d��Wd�n1sZ0Ytjtj�|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_directoryFrr:)rwr r,r-r�r.r�r�r�r�rOr�rMr�r=rrr�test_copytree_symlink_dir�s �z&TestCopyTree.test_copytree_symlink_dircCs\|��}|d}|�tj|d�tj�|d�}t|d�t�||�}|�	dgt�
|��dS)N�destTr�)rwrxr�ryr r,r-r2r�r�rM)rzr�r�rc�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)rwrxr�ryr r,r-�makedirsr2r�r�rM)rz�base_dirr�r�rcrBrrr�test_copytree_subdirectorys

z'TestCopyTree.test_copytree_subdirectoryN)r|r}r~r�r�rr�r
rr!r"r��mock�patchr%r,r�r[r r5r9r>r@rCrGrrrrr��s(
A*





r�c@s�eZdZejdd��Ze�ee	d�d�ejdd���Z
e�ee	d�d�ejdd	���Zejd
d��Z
e�ee	d�o�eed
�o�eed�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�d9d:��Z!d;d<�Z"d=d>�Z#e�e$�p�e%�p�e&d?�d@dA��Z'dBdC�Z(dDS)E�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�tjdk�r�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�dS)Nr��bar�baz�quuxr)rwr r,r-r2r�r�r�r�S_IRWXGr�assertNotEqualr�r��copymoder�rS�rzr�rcrdr	r
rrr�test_copymode_follow_symlinkss0

z&TestCopy.test_copymode_follow_symlinksr�zrequires 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�rKrLrMF��follow_symlinks)rwr r,r-r2r�r�r�rrNr�rr�rPr�r�r�rOrQrrr� test_copymode_symlink_to_symlink8s0


�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�dSrS)rwr r,r-r2r�r�rPrQrrr�*test_copymode_symlink_to_symlink_wo_lchmodVs

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�r�t�|tj
�ttd�r�ttd�r�t�|tj�t�|�}ttd��r tj||d	d
�|�	|jt�|�j�tj||dd
�t�|�}tjtjv�rpdD]"}	|�t||	�t||	�d
��qLttd��r�|�|j|j�ttd��r�t|d��r�|�|j|j�tj||dd
�|�tt�|�jt�|�j�dk�dS)Nr�rKrL�quxgE@r�r�r�TrTF��st_atime�st_mtimerjrg�������?)rwr r,r-r2r��utimerZr[rOr�r[r�rr�r�r�r��copystatr�r��assertLessEqualrr�rr��abs)
rzr�rcrdr	r
r�
src_link_statZ
dst_link_stat�attrrrr�test_copystat_symlinksfsJ


�



��zTestCopy.test_copystat_symlinks�chflags�
EOPNOTSUPP�ENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs�|��}tj�|d�}tj�|d�}t|d�t|d�dd�}tj}zVtjtjfD]}||�t_t	�
||�qT|tjtj�t_|�tt	j
||�W|t_n|t_0dS)Nr��file2�xxxcst��dd���fdd�
}|S)NTrTcs��_��dSr)r)r,�flagsrU��err�exrr�_chflags_raiser�szlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser�r)rjrlrrir�make_chflags_raiser�szSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)
rwr r,r-r2rcrrdrer�r]r�r)rzr�r�rfrnZold_chflagsrjrrr�-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	�}z4tj�|t_t��|�|�dt�
|��W�t_n�t_0d
d���fdd
�
}z"tj
�|t_
t��|�W�t_
n�t_
0tj�|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�rK�user.foo�42zuser.bar�43�EPERMcs&|dkr��n�|||fi|��dS)Nrpr)�fnamera�valr)�
orig_setxattr�os_errorrr�_raise_on_user_foo�sz3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrTcs |�krttjd���||d�S)NzOperation not supportedrT)rrre)rtrU)�orig_listxattrrcrr�
_raise_on_src�sz.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZthe_copy_ro)rwr r,r-r2r��
_copyxattr�setxattrr�rLZ	listxattr�getxattrr�rrrsr�r�r])rzr�rdrxrzZsrcroZdstror)ryrvrwrcr�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�rLztrusted.foorqrrFrTrKrX)
rwr r,r-r2r�r|r�r{r�r}r�r)rzr�rcr	rdr
rrr�test_copyxattr_symlinks�s 

z TestCopy.test_copyxattr_symlinkscCsPd}|��}t||fd�tj�||�}|��}|||�tj�||�}||fS)Nr�rg)rwr2r r,r-)rz�methodrtr�r��tmpdir2rfrrr�
_copy_file	s
zTestCopy._copy_filecCsB|�tj�\}}|�tj�|��|�t�|�j	t�|�j	�dSr)
r�r��copyr�r r,r�r�r�r�)rzr�rfrrr�	test_copyszTestCopy.test_copycCs|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�rft�|tj	tj
B�tj||dd�|�
tj�|��|�t|�t|��t�|�tj||dd�|�tj�|��|�t�|�t�|��ttd��r|�t�|�jt�|�j�dS)Nr�rKrLr�TrTF)rwr r,r-r2r�r[r�r�rrr�r�r�rOr�rJr�r�rr�r�)rzr�rcrdr	rrr�test_copy_symlinkss&



�zTestCopy.test_copy_symlinksr\zrequires os.utimecCs�|�tj�\}}|�tj�|��t�|�}t�|�}|�|j	|j	�dD] }|�
t||�t||�d�qJttd�r�t|d�r�|�t|d�t|d��dS)NrYrjrcr)
r�r��copy2r�r r,r�r�r�r�r^rr[)rzr�rfZ
file1_statZ
file2_statrarrr�
test_copy22s

��zTestCopy.test_copy2c	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�rft�|tj	tj
B�ttd�r�ttd�r�t�|tj�t�|�}t�
|�}tj||dd�|�tj�|��|�t|�t|��t�|�tj||d	d�|�tj�|��|�t�|�t�|��t�
|�}tjtjv�rVd
D]"}|�t||�t||�d��q2ttd��r�|�|j|j�|�|j|j�ttd��r�t|d��r�|�|j|j�dS)
Nr�rKrLr�r�r�TrTFrYrjr)rwr r,r-r2r�r[r�r�rrr�r�r�r�r�r�rOr�rJr�r�rr\r�r^rr�rOr)	rzr�rcrdr	rr`rrarrr�test_copy2_symlinksCs<





�zTestCopy.test_copy2_symlinkscCsr|��}tj�|d�}tj�|d�}t|d�t�|dd�t�||�|�t�	|d�t�	|d��t�
|�dS)Nr�rKrprq)rwr r,r-r2r|r�r�r�r}r�)rzr�rcrdrrr�test_copy2_xattrfs


�zTestCopy.test_copy2_xattrcCs�tjtjfD]v}|��}|��}tj�|d�}t|d�|||�}|�|tj�|d��||tj�|d��}|�|tj�|d��qdS)Nr�rK)	r�r�r�rwr r,r-r2r�)rzr�r�r�rcrBrrr�test_copy_return_valuess

zTestCopy.test_copy_return_valuecCs|�tj�dSr)�_test_copy_dirr�r��rzrrr�
test_copy_dirszTestCopy.test_copy_dircCs|�tj�dSr)r�r�r�r�rrr�test_copy2_dir�szTestCopy.test_copy2_dircCsx|��}tj�|d�}|��}tj�|d�}t|d�tjdkrFt}nt}|�	||||�|�	||||�|||�dS�Nr��does_not_exist/�win32)
rwr r,r-r2rmr�r#�IsADirectoryErrorr�)rzZ	copy_funcr��src_filer�rdrjrrrr��s

zTestCopy._test_copy_dircCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�tj||dd�|�tj�	|��|�
t�|�t�|��t�||�|�tj�	|��dS)Nrcrdr
r�r�FrT)
rwr r,r-r2r�r��copyfiler�rOr�rr�)rzr�rcrdr
r�rrr�test_copyfile_symlinks�s
zTestCopy.test_copyfile_symlinksr�zrequires os.linkc
Cst�t�tj�td�}tj�td�}z�t|d��}|�d�Wd�n1sR0Yzt�||�Wn2ty�}z|�	d|�WYd}~n
d}~00|�
tjtj
||�t|d�� }|�|��d�Wd�n1s�0Yt�|�Wtjtdd�ntjtdd�0dS)	Nr�r�r)�cheddarz
os.link(): %srHTr�)r r�rr,r-r.r/r�r#r0r�r�rr�r�rIr�ry)rzrcrdrEr4rrr�'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�}z�t|d��}|�d�Wd�n1sR0Yt�d|�|�t	j
t	j||�t|d�� }|�|�
�d�Wd�n1s�0Yt�|�Wt	jtdd�nt	jtdd�0dS)Nr�r�r)r�rHTr�)r r�rr,r-r.r/r�r�r�rr�r�rIr�ry)rzrcrdrErrr�*test_dont_copy_file_onto_symlink_to_itself�s
(.z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr-r.c
Cs�zt�t�Wn2ty@}z|�d|�WYd}~n
d}~00z6|�tjtjtt	�|�tjtjt
t�Wt�t�nt�t�0dS)Nr/)r r-rr#r0r�r��SpecialFileErrorr�r1�__file__r�)rzr4rrr�test_copyfile_named_pipe�s$��z!TestCopy.test_copyfile_named_pipecCsl|��}|��}tj�|d�}tj�|d�}t|d�t�||�}|�tj�|��|�	t
|�t
|��dS)NrKr�)rwr r,r-r2r�r�r�r�r�rJ)rzr�r��dst_filer�rBrrr�test_copyfile_return_value�s
z#TestCopy.test_copyfile_return_valuecCsX|��}tj�|d�}t|d�|�ttj||�|�t	tj||�|�
t|�d�dSr&)rwr r,r-r2r�rr�r�rr�rJ)rzr�r�rrr�test_copyfile_same_file�s
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)cCsD|��}tj�|d�}tj�|d�}t|d�|�ttj||�dS)Nr�r�)	rwr r,r-r2r�r�r�r�)rzr�r�rdrrr�test_copyfile_nonexistent_dir�s

z&TestCopy.test_copyfile_nonexistent_dircCs�|��}tj�|d�}|��}tj�|d�}t|d�tjdkrFt}nt}|�	|t
j||�|�	|t
j||�|�	|t
j||�dSr�)rwr r,r-r2rmr�r#r�r�r�r�)rzr�r�r�rdrjrrr�test_copyfile_copy_dir�s

zTestCopy.test_copyfile_copy_dirN))r|r}r~rr�rRr�r�r[r rVr�rWrbrroZskip_unless_xattrr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��MACOS�SOLARISr�r�r�rrrrrJsh

(��

?�



"






rJc@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!�oRe"�d1�d2d3���Z#e��d4d5��Z$d6d7�Z%d8S):�TestArchivesc	Cs�|�d�\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��*tj�
|�}t|d|d�}Wd�n1s|0Y|�||d�|�
tj�|��|�
t�|��t�|d��$}|�|��gd��Wd�n1s�0Yt�	|��t|d|d�}Wd�n1�s(0Y|�||d	�|�
tj�|��|�
t�|��t�|d
��$}|�|��gd��Wd�n1�s�0YdS)Nr��archive�gztar�.�.tar.gzzr:gz)r�z./subz./sub2z./file1z./file2z./sub/file3�tar�.tarrH)�
_create_filesrwr r�r,r�r-�basenamer�
change_cwd�abspathrr�r�r��tarfileZ
is_tarfiler.�assertCountEqual�getnames)	rz�root_dirrFr��work_dir�
rel_base_name�	base_name�tarballZtfrrr�test_make_tarballs0
,
�".
�zTestArchives.test_make_tarballcCsFt�|��(}|��}|��t|�Wd�S1s80YdSr)r�r.r��sortr+)rzr,r�rrrr�_tarinfo:szTestArchives._tarinfo�distcCs�|��}tj�||�}tj|dd�t|dfd�t|dfd�t�tj�|d��t|ddfd�t�tj�|d��|r�t|d	fd�||fS)
NT)�exist_okr�rgrfr�Zfile3Zsub2�outer)rwr r,r-rEr2r�)rzrFr�r�rrrr�@szTestArchives._create_filesr�zNeed the tar command to runcCs|��\}}tj�|��d�}t|d||�}|�||d�|�tj�|��tj�|d�}ddd|g}t	j
||t	jd�|�tj�|��|�|�|�|�|��t|d||�}|�||d�|�tj�|��t|d||d	d
�}|�||d�|�tj�|��dS)Nr�r�r�zarchive2.tarr�z-cf��cwd�stdoutr�T)�dry_run)
r�r r,r-rwrr�r�r�ro�
check_call�DEVNULLr�)rzr�rFr�r�Ztarball2Ztar_cmdrrr�test_tarfile_vs_tarNs(�
�z TestArchives.test_tarfile_vs_tarc	Cs�|��\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��(tj�
|�}t|d|�}Wd�n1sx0Y|�||d�|�
tj�|��|�
t�|��t�|��$}|�|��gd��Wd�n1s�0Yt�	|��*tj�
|�}t|d||�}Wd�n1�s.0Y|�||d�|�
tj�|��|�
t�|��t�|��$}|�|��gd��Wd�n1�s�0YdS)Nr��zip�.zip)�dist/�	dist/sub/�
dist/sub2/�
dist/file1�
dist/file2�dist/sub/file3r�)r�r�r�r�r�r�)r�rwr r�r,r�r-r�rr�r�rr�r�r��zipfile�
is_zipfile�ZipFiler��namelist)	rzr�rFr�r�r�r�rR�zfrrr�test_make_zipfileos2
*
�".
�zTestArchives.test_make_zipfiler�zNeed the zip command to runc
Cs
|��\}}tj�|��d�}t|d||�}|�||d�|�tj�|��tj�|d�}dddd|g}t	j
||t	jd�|�tj�|��t�
|��}|��}Wd�n1s�0Yt�
|��}|��}	Wd�n1s�0Y|�t|�t|	��dS)Nr�r�r�zarchive2.zipz-qz-rr�)r�r r,r-rwrr�r�r�ror�r�r�r�r�rL)
rzr�rFr�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|d||�}|�||d�|�tj�|��dd|g}t	�
|���ztj|tj
d�Wn\tjy�}zB|jjdd�}d	|vr�|�d
�d}|�|�||��WYd}~n
d}~00Wd�n1s�0YdS)Nr�r�r�r�z-t)�stderr�replacer�zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r�r r,r-rwrr�r�r�rr�ro�check_output�STDOUT�CalledProcessError�output�decoder0r2�format)	rzr�rFr�r�r�r��details�msgrrr�test_unzip_zipfile�s

zTestArchives.test_unzip_zipfilecCs*|��}tj�|d�}|�tt|d�dS)Nr�rg)rwr r,r-r��
ValueErrorr)rzr�r�rrr�test_make_archive�szTestArchives.test_make_archivecCs�tr"t�d�d}t�d�d}nd}}|��\}}tj�|�	�d�}t
|d||||d�}|�tj�|��t
|d||�}|�tj�|��t
|d||||d�}|�tj�|��t
|d||ddd�}|�tj�|��dS)	Nr�rootr�r���owner�groupr�Z	kjhkjhkjgZoihohoh)
�UID_GID_SUPPORT�grp�getgrgid�pwd�getpwuidr�r r,r-rwrr�r�)rzr�r�r�rFr�rRrrr�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|d|d||d�}Wd�n1sn0Y|�tj�
|��t�|�}z6|��D] }|�|jd�|�|jd�q�W|��n
|��0dS)Nr�rr�r�r�)r�r r,r-rwr�r�r�r�rr�rr�r�r�r.Z
getmembersr��uid�gidr�)	rzr�rFr�r�r��archive_namer��memberrrr�test_tarfile_root_owner�s
�$
z$TestArchives.test_tarfile_root_ownercCstt��}dd�}td|gd�zFztdd|��d�WntyHYn0|�t��|�Wtd�n
td�0dS)Nc_s
t��dSr)�RuntimeError)r�kwrrr�_breakssz3TestArchives.test_make_archive_cwd.<locals>._breaksrg�xxx file)r�)r r^rrrwr�r�r)rzZcurrent_dirr�rrr�test_make_archive_cwd�sz"TestArchives.test_make_archive_cwdcCsZ|��}t�|��4|�tdd�d�|�tj�d��Wd�n1sL0YdS)N�testr�ztest.tar�	rwrr�r�rr�r r,r��rzr�rrr�test_make_tarfile_in_curdir
sz(TestArchives.test_make_tarfile_in_curdircCsZ|��}t�|��4|�tdd�d�|�tj�d��Wd�n1sL0YdS)Nr�r�ztest.zipr�r�rrr�test_make_zipfile_in_curdirs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)
NrgrjcSstSr��xrrrr�<lambda>r6z;TestArchives.test_register_archive_format.<locals>.<lambda>cSstSrr�rrrrr�!r6)rjrZ)rjrZrcSstSrr�rrrrr�$r6r�cSsg|]\}}|�qSrr�r<rS�paramsrrrr>%r6z=TestArchives.test_register_archive_format.<locals>.<listcomp>cSsg|]\}}|�qSrrr�rrrr>)r6)r��	TypeErrorrrr�rr<)rz�formatsrrr�test_register_archive_formats��z)TestArchives.test_register_archive_formatcKsF|j|dd�fi|��|j|tjfi|��|j|tfi|��dS)NcSs|Srr�r,rrrr�0r6z3TestArchives.check_unpack_archive.<locals>.<lambda>)�#check_unpack_archive_with_converterrrr)rzr�rrrr�check_unpack_archive.s����z!TestArchives.check_unpack_archivecKs.|��\}}t|�}|�d�tj�|��d�}t||||�}|��}	t||�||	�fi|��|�	t|	�|�|��}
t||�||
�fd|i|��|�	t|
�|�|�
tj��$t|t
�fi|��Wd�n1s�0Y|�
t��(t|t
�fddi|��Wd�n1�s 0YdS)Nr�r�r�rg)r�rQr�r r,r-rwrrr�r�r��	ReadErrorrr�)rzr��	converterrr�rF�expectedr�r�r�Ztmpdir3rrrr5s"
�2z0TestArchives.check_unpack_archive_with_convertercCsT|j|dd�|j|dd�t�|��|�|�Wd�n1sF0YdS)NZ
fully_trusted��filter�data)rrZcheck_no_warnings)rzr�rrr�check_unpack_tarballMsz!TestArchives.check_unpack_tarballcCs|�d�dS)Nr��r
r�rrr�test_unpack_archive_tarSsz$TestArchives.test_unpack_archive_tarcCs|�d�dS)Nr�rr�rrr�test_unpack_archive_gztarVsz&TestArchives.test_unpack_archive_gztarcCs|�d�dS)N�bztarrr�rrr�test_unpack_archive_bztarZsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs|�d�dS)N�xztarrr�rrr�test_unpack_archive_xztar^sz&TestArchives.test_unpack_archive_xztarcCsF|�d�|�t��|jddd�Wd�n1s80YdS)Nr�rr
)rr�rr�rrr�test_unpack_archive_zipcs
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)Nrj�	stuff.boo�xx)r�)r��extract_dir�extrar�rr�_boomsz/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)rrjrrZBoo2r�)	rrrr�r	r
r�r<r�)rzrrrr�r�test_unpack_registryis

�z!TestArchives.test_unpack_registryN)r�)&r|r}r~rZ
requires_zlibr�r�r�r�r�r��whichr�r�r�r�r�r�r�r�r�r�r�rrrr
rrZrequires_bz2rZ
requires_lzmar�rlrtrrrrrrrr�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)r3�used�freer)r�rr r,r�r�r�rrsZ
assertGreaterr3r�assertGreaterEqualr )rz�usagerarrr�test_disk_usage�szTestMisc.test_disk_usager��chownzrequires os.chowncs����}tj|d��t�d���t��t���Wd�n1sH0Y��t��tj�dd�Wd�n1s�0Y��t��tj�dd�Wd�n1s�0Y��t	��t��d�Wd�n1s�0Y��t	��t��d�Wd�n1�s&0Yt
��}t
��}d
��fd	d
�	}t��||�|�||�t��|�|�|�tj�|d�|�|�tj�|d�|�|d�t�|||�||||�t�||�|||�tj||d�|||�tj||d�|||d�z t
�|�d}t�|�d}Wnt�yHYn60t��||�|�||�t�|||�||||�dS)Nr�ztesting chown functionznon-existing username)�userznon-existing groupname)r��spamg��Q�	@cs:t���}|dur ��||j�|dur6��||j�dSr)r r�r��st_uid�st_gid)r,r�r��s�r�rzrr�check_chown�s

z(TestMisc.test_chown.<locals>.check_chown)r�r)NN)rwr\r�r2r�r�r�r$�LookupErrorrr �getuid�getgidr�r�r�r��KeyError)rzr�r�r�r+r%r�rr*r�
test_chown�sR
(,,*,



zTestMisc.test_chownN)r|r}r~r�r�r[r�r#r�r r0rrrrr�s�

rc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	e
ed�oHe��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)rvz.Exe�rXrv�suffixz.EXE)rw�temp_dirr\r]�	temp_filer r�rSr��S_IXUSRrxr�r,rrrX�file�env_path�curdir�extr�rrr�setUp�s�zTestWhich.setUpcCs&tj|j|jd�}|�||jj�dS�Nr)r�rr7rXr�r5rS�rzrBrrr�
test_basic�szTestWhich.test_basiccCs(tj|jj|jd�}|�||jj�dSr<)r�rr5rSr4r�r=rrr�test_absolute_cmd�szTestWhich.test_absolute_cmdcCs�tj�|j�\}}tj�||j�}tj|d��,tj	||j
d�}|�||�Wd�n1s`0Ytj|jd��(tj	||d�}|�|�Wd�n1s�0YdSr<)
r r,rrrXr-r7rr�r�rr4r��assertIsNone)rzrF�tail_dir�relpathrBrrr�test_relative_cmd�s*zTestWhich.test_relative_cmdcCs�tj�|j�}tj|jd��Ptj|j|d�}t	j
dkrT|�|tj�|j
|j��n
|�|�Wd�n1sr0YdS)Nrr�)r r,r�rXrr�r�rr7rmr�r�r-r9r@)rzrFrBrrr�test_cwd�s
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)r,�mode)r r�r5rSr�r��access�W_OKr0r�rr7rXr@r=rrr�test_non_matching_modes

z TestWhich.test_non_matching_modecCsjtj�|j�\}}tj|d��8tj|j|d�}|�	|tj�
||j��Wd�n1s\0YdSr<)r r,rrrXrr�r�rr7r�r-)rzrFrArBrrr�test_relative_pathszTestWhich.test_relative_pathcCstjd|jd�}|�|�dS)Nzfoo.exer)r�rrXr@r=rrr�test_nonexistent_fileszTestWhich.test_nonexistent_filer�zpathext check is Windows-onlycCs<tj|jdd�|jd�}|�||jjdd�|j�dS)N���r)r�rr7rXr�r5rSr:r=rrr�test_pathext_checkingszTestWhich.test_pathext_checkingcCsRt���6}|j|d<t�|j�}|�||jj�Wd�n1sD0YdS�N�PATH)	r�EnvironmentVarGuardr8r�rr7r�r5rS�rz�envrBrrr�test_environ_path%s

zTestWhich.test_environ_pathcCs�t����}d|d<tjjd|jdd���t�td|j��Rt�|j��&t	�
|j�}|�|�Wd�n1sr0YWd�n1s�0YWd�n1s�0YWd�n1s�0YdS)Nr�rN�
os.confstrT��return_value�create�defpath)
rrOr�rHrIrX�	swap_attrr r�r�rr7r@rPrrr�test_environ_path_empty+s
��
�z!TestWhich.test_environ_path_emptycCs:tj�|jj�}tjdkrBtj}t|t	�r4t�
|�}tj�||�}t�
���}tj|d<tjjd|jdd���t�td|j��jt�|j�}|�|�t�|j��(t�|j�}|�||�Wd�n1s�0YWd�n1s�0YWd�n1�s0YWd�n1�s,0YdS)Nr�rNrSTrTrW)r r,r�r5rSrmr�r9r*r�r�r-rrO�pathsepr�rHrIrXrXr�rr7r@r�r�)rzZexpected_cwdr9rQrBrrr�test_environ_path_cwd6s$




��
zTestWhich.test_environ_path_cwdc
Cs8t����}|�dd�tjjdtdd��Lt�td|j	��t
�|j�}Wd�n1s^0YWd�n1s|0Y|�
||jj�tjjd|j	dd��Jt�tdd��t
�|j�}Wd�n1s�0YWd�n1s�0Y|�
||jj�Wd�n1�s*0YdS)NrNrST)r$rVrWrTr�)rrO�popr�rHrIr�rXr rXr�rr7r�r5rSrPrrr�test_environ_path_missingLs 
��H��Hz#TestWhich.test_environ_path_missingc	Cs�tj�|j�}tj|jd��\t���4}|j|d<tj	|j
dd�}|�|�Wd�n1s`0YWd�n1s~0YdS)NrrNr�)r r,r�rXrr�rOr8r�rr7r@)rzrFrQrBrrr�test_empty_path^s�
zTestWhich.test_empty_pathcCsNt���2}|�dd�t�|j�}|�|�Wd�n1s@0YdSrM)rrOr\r�rr7r@rPrrr�test_empty_path_no_PATHfs
z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs�d}tj|jd|d�}t�|jtj�|�|j	�tj
�|j�}tj
�|�d}t
���6}||d<tj||jd�}|�||j�Wd�n1s�0YdS)N�.xyz�Tmp2r2r�PATHEXTr)r\r]r4r r�rSr�r6rxr�r,r�rrrOr�rr��rzr:Ztemp_filexyzZprogramrQrBrrr�test_pathextls�
zTestWhich.test_pathextcCs�d}tj|jd|d�}|�|j�tj�|j�}tj�	|�d}t
���<}|�d�|d<tj
||jd�}|�||j�Wd�n1s�0YdS)Nr`rar2r�;rbr)r\r]r4rxr�r r,r�rSrrrOr�rr�rcrrr�test_pathext_with_empty_str~s�
z%TestWhich.test_pathext_with_empty_strN)r|r}r~r;r>r?rCrDr�r�r[r r�rHrIrJr�rmr�rLrRrYr[r]r^r_rdrfrrrrr1�s2
�
�

r1c@seZdZdd�ZdS)�TestWhichBytescCsXt�|�t�|j�|_t�|j�|_t�|jj�|j_t�|j�|_t�|j	�|_	dSr)
r1r;r r�rXr7r5rSr9r:r�rrrr;�s
zTestWhichBytes.setUpN)r|r}r~r;rrrrrg�srgc@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:��ove�(�d;k�ove'ed<��ove'e)d=��ove'e)d>�d?�d@dA��Z*dBS)C�TestMovecCsvd}|��|_|��|_tj�|j|�|_tj�|j|�|_t|jd��}|�	d�Wd�n1sh0YdS)Nr�r(r&)
rwr�r�r r,r-r�r�r.r/)rzr�rErrrr;�s

zTestMove.setUpcCs�t|d��}|��}Wd�n1s(0Yt�||�t|d�� }|�||���Wd�n1sn0Y|�tj�|��dS�NrG)	r.rIr��mover�r�r r,r�)rzrcrd�real_dstrE�contentsrrr�_check_move_file�s&.zTestMove._check_move_filecCsFtt�|��}t�||�|�|tt�|���|�tj�|��dSr)	rLr rMr�rjr�r�r,r�)rzrcrdrkrlrrr�_check_move_dir�szTestMove._check_move_dircCs|�|j|j|j�dSr)rmr�r�r�rrr�test_move_file�szTestMove.test_move_filecCs|�|j|j|j�dSr)rmr�r�r�r�rrr�test_move_file_to_dir�szTestMove.test_move_file_to_dircCs"t�|j�}|�||j|j�dSr)rrr�rmr�r�)rzrcrrr�"test_move_file_to_dir_pathlike_src�sz+TestMove.test_move_file_to_dir_pathlike_srccCs"t�|j�}|�|j||j�dSr)rrr�rmr�r��rzrdrrr�"test_move_file_to_dir_pathlike_dst�sz+TestMove.test_move_file_to_dir_pathlike_dstcCs|��dSr)ror�rrr�test_move_file_other_fs�sz TestMove.test_move_file_other_fscCs|��dSr)rpr�rrr�test_move_file_to_dir_other_fs�sz'TestMove.test_move_file_to_dir_other_fsc	Cs@tj|��d�}z|�|j||�Wt�|�nt�|�0dSr�)r\r�rwrnr�rry�rzr�rrr�
test_move_dir�szTestMove.test_move_dircCs|��dSr)rwr�rrr�test_move_dir_other_fs�szTestMove.test_move_dir_other_fsc
Cs,|�|j|jtj�|jtj�|j���dSr)rnr�r�r r,r-r�r�rrr�test_move_dir_to_dir�s�zTestMove.test_move_dir_to_dircCs|��dSr)ryr�rrr�test_move_dir_to_dir_other_fs�sz&TestMove.test_move_dir_to_dir_other_fsc
Cs4|�|jtjj|jtj�|jtj�|j���dSr)rnr�r r,�sepr�r-r�r�rrr�test_move_dir_sep_to_dir�s�z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc
Cs4|�|jtjj|jtj�|jtj�|j���dSr)rnr�r r,�altsepr�r-r�r�rrr�test_move_dir_altsep_to_dir�s�z$TestMove.test_move_dir_altsep_to_dircCsHt|jd��Wd�n1s"0Y|�tjtj|j|j�dS)Nr()r.r�r�r�rrjr�r�r�rrr�"test_existing_file_inside_dest_dir�sz+TestMove.test_existing_file_inside_dest_dircCs*tj�|jd�}|�tjtj|j|�dS�NrK)r r,r-r�r�r�rrjrrrrr�test_dont_move_dir_in_itself�sz%TestMove.test_dont_move_dir_in_itselfc	Csrt�t�zVdD]B\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�nt�	t�0dS)N))�srcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)�r�)
r r�rr,r-r�r��
_destinsrcrryr�rrr�test_destinsrc_false_negative�s
��
z&TestMove.test_destinsrc_false_negativec	Csrt�t�zVdD]B\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�nt�	t�0dS)N))r�zsrc/dest)r�z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r�)
r r�rr,r-r�r�r�rryr�rrr�test_destinsrc_false_positives
��
z&TestMove.test_destinsrc_false_positivecCs\tj�|jd�}t�|j|�t�||j�|�	tj�
|j��|�	tj�|j|j��dSr�)r r,r-r�r�r�r�rjr�r�rO�samefilerrrrr�test_move_file_symlinks
zTestMove.test_move_file_symlinkcCsld}tj�|j|�}t�|j|�t�||j�tj�|j|�}|�	tj�
|��|�	tj�|j|��dSr�)r r,r-r�r�r�r�rjr�r�rOr�)rzr�rdZ
final_linkrrr�test_move_file_symlink_to_dirsz&TestMove.test_move_file_symlink_to_dircCsztj�|jd�}tj�|jd�}t�||�tj�|jd�}t�||�|�tj�	|��|�
tj�|�tj�|��dS�NrLrKrM)r r,r-r�r�r�r�rjr�rOr��realpath�rzrcrdr
rrr�test_move_dangling_symlink%sz#TestMove.test_move_dangling_symlinkcCs|tj�|jd�}tj�|jd�}t�|�t�||�tj�|jd�}t�||�|�	tj�
|��|�	tj�||��dSr�)r r,r-r�r�r�r�r�rjr�rOr�r�rrr�test_move_dir_symlink0s
zTestMove.test_move_dir_symlinkc	Cs6t�|j|j�}|�|tj�|jtj�|j���dSr)	r�rjr�r�r�r r,r-r�r=rrr�test_move_return_value<s�zTestMove.test_move_return_valuecCs6t�|jtj�|jd��}|�|tj�|jd��dSr�)r�rjr�r r,r-r�r�r=rrr� test_move_as_rename_return_valueAsz)TestMove.test_move_as_rename_return_valuecs8g��fdd�}tj|j|j|d�|�t��d�dS)Ncs��||f�dSrr�r6�Zmovedrrr8Hsz7TestMove.test_move_file_special_function.<locals>._copyr*rj)r�rjr�r�r�r��rzr8rr�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)Ncs��||f�dSrr�r6r�rrr8Psz6TestMove.test_move_dir_special_function.<locals>._copy�childZchild1r*r)rr�r r,r-r�r�rjr�r�r�r�rr�r�test_move_dir_special_functionMsz'TestMove.test_move_dir_special_functionc	Cs~|��|_tj�tj�|j�tj�|j����}|�|j|�z.t	�
|j|�|�tj�|��Wt�
|�nt�
|�0dSr)rwr�r r,r-r�r��upperrOr�rjr�rNr�rvrrr�test_move_dir_caseinsensitiveWs
�z&TestMove.test_move_dir_caseinsensitiver�rr��SF_IMMUTABLE�	UF_OPAQUErc
Cs0z�t�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
�r�t�t
tj
�t�t
�nNtj�t��rt�ttj
�t�t�tj�t
��r*t�t
tj
�t�t
�0dS)Nr�)r r��
TESTFN_SRCr�r�r�r�r#r�rj�
TESTFN_DSTr�rMr�rr�r,r-r�ryr�rrr�test_move_dir_permission_deniedhs,

�
z(TestMove.test_move_dir_permission_deniedN)+r|r}r~r;rmrnrorprqrsr'rtrurwrxryrzr|r�r�r r,r}r~rr�r�r�rr�r�r�r�r�r�r�r�r�r�r[r�r�r�rrrrrh�sh	




		


	���rhc@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)rzZ
raise_in_exitZsuppress_at_exitrrr�__init__�szTestCopyFile.Faux.__init__cGsdS)Nr�r)rzrrrrrI�szTestCopyFile.Faux.readcCs
d|_dS)NT)�_enteredr�rrr�	__enter__�szTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_td��|jS)NT�Cannot close)�_exited_withr��_raisedrr�)rz�exc_type�exc_val�exc_tbrrr�__exit__�s
zTestCopyFile.Faux.__exit__)FT)
r|r}r~r�r�r�r�rIr�r�rrrr�Faux�s
r�c	Csrddd�}t�td|��F|�t��t�dd�Wd�n1sF0YWd�n1sd0YdS)NrHcSs|dkrtd��dsJ�dS)N�srcfilezCannot open "srcfile"rrm�r�rErrr�_open�sz4TestCopyFile.test_w_source_open_fails.<locals>._openr.r��destfile)rH)rrXr�r�rr��rzr�rrr�test_w_source_open_fails�s
z%TestCopyFile.test_w_source_open_failszskipped on macOScs�|���d
�fdd�	}t�td|��t�dd�Wd�n1sF0Y|��j�|��jdtu�|�	�jdj
d	�dS)NrHcs(|dkr�S|dkrtd��ds$J�dS)Nr�r��Cannot open "destfile"rrmr��r�rrr��s
z2TestCopyFile.test_w_dest_open_fails.<locals>._openr.r�r�rrj)r�)rH)r�rrXr�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�n1sR0Y|��j�|��j�|��j�|��jdt	u�|�
�jd	jd
�dS)NTrHcs$|dkr�S|dkr�Sds J�dS�Nr�r�rrr��r�r�rrr��s
z3TestCopyFile.test_w_dest_close_fails.<locals>._openr.r�r�rrj)r�)rH)r�rrXr�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|��F|�t��t�dd�Wd�n1s^0YWd�n1s|0Y|��j�|��j�|�	�j
�|��jddu�|��j
�dS)
NTrHcs$|dkr�S|dkr�Sds J�dSr�rr�r�rrr��s
z5TestCopyFile.test_w_source_close_fails.<locals>._openr.r�r�r)rH)r�rrXr�r�rr�r�r�r�r�r�r�rr�r�test_w_source_close_fails�s
Hz&TestCopyFile.test_w_source_close_failsN)r|r}r~�objectr�r�r�r�r�r�r�r�rrrrr��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)rFr�FILESIZE��clsrrr�
setUpClass�szTestCopyFileObj.setUpClasscCst�t�t�t�dSr)rr`rr1r�rrr�
tearDownClass�s
zTestCopyFileObj.tearDownClasscCst�t�dSr�rr`r1r�rrr�tearDown�szTestCopyFileObj.tearDownc	csbttd��D}ttd��}||fVWd�n1s60YWd�n1sT0YdS�NrGr(�r.rr1r�rrr�	get_files�szTestCopyFileObj.get_filesc	Cslt|d��N}t|d��$}|�|��|���Wd�n1s@0YWd�n1s^0YdSri)r.r�rI)rzrcrd�fsrc�fdstrrr�assert_files_eq�szTestCopyFileObj.assert_files_eqcCsH|��� \}}t�||�Wd�n1s.0Y|�tt�dSr)r�r��copyfileobjr�rr1r�rrr�test_content	s*zTestCopyFileObj.test_contentcCsP|���4\}}t�||�|jr$J�|jr.J�Wd�n1sB0YdSr)r�r�r��closedr�rrr�test_file_not_closed	s
z$TestCopyFileObj.test_file_not_closedcCs`|���D\}}t�||�|�|��|j�|�|��|j�Wd�n1sR0YdSr)r�r�r�r��tellr�r�rrr�test_file_offset	sz TestCopyFileObj.test_file_offsetrzWindows onlycCs�tj�d��}t�tt�Wd�n1s.0Y|jsBJ�|�|j	ddd�t
jt�
�dd��}|�d�Wd�n1s�0Y|j}|�tj|�tj�d��}t�|t�Wd�n1s�0Y|�|j	ddd�t
jt�
�dd��}Wd�n1�s 0Y|j}|�tj|�tj�d��}t�|t�Wd�n1�sn0Y|j�r�J�|�|t�dS)	Nzshutil._copyfileobj_readintorrZiFrWsfoor)r�rHrIr�r�rr1�calledr��	call_argsr\r]r r^r/rSrxrr`r�)rz�mrErtrrr�
test_win_impl	s&*
(* ,zTestCopyFileObj.test_win_implN)r|r}r~r��classmethodr�r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r rSr�rrrrr��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�r6r�cCsXtt|j�ttd��.}|��|_t|j�|jks6J�Wd�n1sJ0YdSri)rFrr�r.rI�FILEDATAr�)r�rErrrr�7	s
z_ZeroCopyFileTest.setUpClasscCst�t�dSr)rr`rr�rrrr�>	sz_ZeroCopyFileTest.tearDownClasscCst�t�dSrr�r�rrrr�B	sz_ZeroCopyFileTest.tearDownc	csbttd��D}ttd��}||fVWd�n1s60YWd�n1sT0YdSr�r�r�rrrr�E	sz_ZeroCopyFileTest.get_filescOstd��dS)Nzmust be implemented in subclass)�NotImplementedError)rzrrrrr�zerocopy_funK	sz_ZeroCopyFileTest.zerocopy_funcCs$|��|��|��|��dSr)r�r�r�r;r�rrr�resetN	sz_ZeroCopyFileTest.resetc	Cs�|��� \}}|�||�Wd�n1s.0Y|�ttdd�|j�|���V\}}tj�d��}t	�
tt�Wd�n1s�0Y|jr�J�Wd�n1s�0YdS)NT�r0zshutil.copyfileobj)
r�r�r�rJr1r�r�rHrIr�r�rr�)rzrcrdr�rrr�test_regular_copyV	s**z#_ZeroCopyFileTest.test_regular_copyc	Cs�|�|j�|���J\}}|�t��|�||�Wd�n1sF0YWd�n1sd0Y|�ttdd�|j	�dS)NTr�)
rxr�r�r�r�r�r�rJrr�r�rrr�test_same_file`	s
Hz _ZeroCopyFileTest.test_same_filecCsZtjt��d�}|�t��}t�|d�Wd�n1s<0Y|�|j	j
|�dS)Nr��new)r\r�r r^r�r�r�r�r�r�r�)rzrSr�rrr�test_non_existent_srch	s*z'_ZeroCopyFileTest.test_non_existent_srcc	s�td�td�|��fdd��|��fdd��t�d��Wd�n1sT0Yt�d��F}t�d��}|�||�Wd�n1s�0YWd�n1s�0Y|�t�dd	�d
�dS)Nrcrdcs
t���Sr�rr`r)rarrr�q	r6z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>cs
t���Srr�r)rbrrr�r	r6r(rGTr�r6)rrxr.r�r�rJr�r)rbrar�test_empty_filen	sHz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd��"|�ttjtt	�Wd�n1s:0YdS)N�r$)
r�rHrI�
PATCHPOINT�ZeroDivisionErrorr�r�r�rr1r�rrr�test_unhandled_exception|	s
��z*_ZeroCopyFileTest.test_unhandled_exceptionc
Cs�tjj|jttjd�d��r|���J\}}|�t	��|�
||�Wd�n1sV0YWd�n1st0YWd�n1s�0YdS�N�yor�)r�rHrIr�rr�EINVALr�r�r
r�r�rrr�test_exception_on_first_call�	s

�z._ZeroCopyFileTest.test_exception_on_first_callc	Cs|tjj|jttjd�d��N|���&\}}|�t|j	||�Wd�n1sP0YWd�n1sn0YdSr�)
r�rHrIr�rr�ENOSPCr�r�r�r�rrr�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�rrrrr�1	s(




r�zos.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)rzr�r�rrrr��	sz!TestZeroCopySendfile.zerocopy_func
Cs�t�|j��|}ttd��R}|�t��|�||�Wd�n1sF0Yt�	||�Wd�n1sp0YWd�n1s�0Y|�
ttdd�|j�dS)Nr(Tr�)�io�BytesIOr�r.r1r�r
r�r�r�r�rJr�rrr�test_non_regular_file_src�	s*Hz.TestZeroCopySendfile.test_non_regular_file_srcc
Cs�ttd���}t���n}|�t��|�||�Wd�n1sB0Yt�||�|�	d�|�
|��|j�Wd�n1s�0YWd�n1s�0YdS)NrGr)
r.rr�r�r�r
r�r�r��seekr�rIr�r�rrr�test_non_regular_file_dst�	s
*
z.TestZeroCopySendfile.test_non_regular_file_dstc
s���fdd�}g�tj�tjjdd|d��r|���J\}}|�t��}t�	||�Wd�n1sf0YWd�n1s�0YWd�n1s�0Y�s�J�|�
|jjtj
�dS)Ncs,�s��d��|i|��Sttjd��dS)Nr�)rPrr�EBADFr�r(Z
orig_sendfilerrrV�	s
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler�T)rVr$)r rVr�rHrIr�r�rr�r�r�r�rr�)rzrVrcrdr�rr�r�test_exception_on_second_call�	s
�fz2TestZeroCopySendfile.test_exception_on_second_callc	Cs�tjjdtd��R}|���*\}}t�||�|js6J�Wd�n1sJ0YWd�n1sh0Y|�t	t
dd�|j�dS)N�os.fstatr�Tr�)r�rHrIrr�r�r�r�r�rJr1r��rzr�rcrdrrr�test_cant_get_size�	s
Fz'TestZeroCopySendfile.test_cant_get_sizec	Cs�tj��}d|_tjjd|d��R}|���*\}}t�||�|jsFJ�Wd�n1sZ0YWd�n1sx0Y|�	t
tdd�|j�dS)Nir��rUTr�)
r�rH�Mock�st_sizerIr�r�r�r�r�rJr1r��rzrHr�rcrdrrr�test_small_chunks�	s
Fz&TestZeroCopySendfile.test_small_chunksc	Cs�tj��}|jd|_tjjd|d��R}|���*\}}t�||�|j	sLJ�Wd�n1s`0YWd�n1s~0Y|�
ttdd�|j
�dS)Ni@r�r�Tr�)r�rHr�r�r�rIr�r�r�r�r�rJr1r�r�rrr�test_big_chunk�	s
Fz#TestZeroCopySendfile.test_big_chunkcCs�tjjdtd���}|�ttjtt�|j	dd}|�
|tj�
t��t�t�ttddd�|�tjtd�|�ttjttd�|j	dd}|�
|d	�Wd�n1s�0YdS)
Nr�r�rrshelloTr��3i�)r�rHrIr�r�r�r�rr1r�r�r r,rArr`r2rx)rzr��	blocksizerrr�test_blocksize_arg�	s"��
�z'TestZeroCopySendfile.test_blocksize_argc
Cstjs
J�z�tjj|jttjd�d��|}|�	��J\}}|�
t��t�||�Wd�n1sb0YWd�n1s�0Y|j
s�J�Wd�n1s�0Ytjr�J�tj�|j��&}t�tt�|j
r�J�Wd�n1s�0YWdt_ndt_0dS)Nr�r�T)r��_USE_CP_SENDFILEr�rHrIr�rr�ENOTSOCKr�r�r
r�r�r�rr1r�rrr�test_file2file_not_supported�	s 

�H(
*z1TestZeroCopySendfile.test_file2file_not_supportedN)
r|r}r~r�r�r�r�r�r�r�r�rrrrrrr��	s		


r�z
macOS onlyc@seZdZdZdd�ZdS)�TestZeroCopyMACOSzposix._fcopyfilecCst�||tj�Sr)r��_fastcopy_fcopyfile�posix�_COPYFILE_DATAr�rrrr�
szTestZeroCopyMACOS.zerocopy_funN)r|r}r~r�r�rrrrr
src@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_sizer!�columns�lines)rzrBrrr�test_does_not_crash
sz'TestGetTerminalSize.test_does_not_crashcCs�t���&}d|d<|d=t��}Wd�n1s40Y|�|jd�t���&}|d=d|d<t��}Wd�n1s�0Y|�|jd�dS)z.Check if environment variables have precedenceZ777�COLUMNS�LINESNi	Z888ix)rrOr�r
r�rr�rzrQrBrrr�test_os_environ_first
s
&
&z)TestGetTerminalSize.test_os_environ_firstcCs`t���(}d|d<d|d<t��}Wd�n1s60Y|�|jd�|�|jd�dS)NrgrZyyyrr)rrOr�r
r!rrrrrr�test_bad_environ.
s
&z$TestGetTerminalSize.test_bad_environz
not on ttyr
zneed os.get_terminal_size()c
Cs�zt�ddg�����}Wn$tttjfy>|�d�Yn0t|d�t|d�f}t	�
��$}|d=|d=t��}Wd�n1s�0Y|�
||�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.
        ZsttyrBzstty invocation failedrjrrrN)ror�r�rrr�r#r�r0rsrrOr�r
r�)rzrBr	rQr�rrr�test_stty_match6
s
�

&z#TestGetTerminalSize.test_stty_matchc
Cst����}|d=|d=t�tdd��tjdd�}Wd�n1sF0Y|�|jd�|�|jd�t	t
jd��J}t�td|��tjd	d�}Wd�n1s�0YWd�n1s�0Y|�|jd
�|�|jd�Wd�n1�s0YdS)Nrr�
__stdout__)�
�)�fallbackrrr))��(rr)rrOrXrmr�r
r�rrr.r �devnull)rzrQrBrErrr�
test_fallbackN
s
*�Hz!TestGetTerminalSize.test_fallbackN)r|r}r~r
rrr�r�r �isattyrmrr_r[rrrrrrr	
s
�r	c@seZdZdZdd�ZdS)�PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|�ttd��gd�}ttd�s,tjdkr6|�d�|�ttj�t|��dS)N�__all__)r�r�rPr]r�r�r�rjryrr��	ExecErrorrrrrrrr
rrr$rr
r�statvfsrr)	r�r[r�r rSrPr�rr)rzZ
target_apirrr�test_module_all_attributee
s

z(PublicAPITests.test_module_all_attributeN)r|r}r~r�r!rrrrrb
sr�__main__)F)F)Pr�Z
unittest.mockr�r\rmr�r Zos.pathrr%rror7r9r�r�rrrrrrrr	r
rrr
r�r�r�ImportErrorr�rZtest.supportrrrr1r�r�r�rr�r�rlr�r�r�r�rr'r2rFrJrQrgZSUPPORTS_SENDFILErtruZTestCaserr�rJr�rr1rgrhr�r�r�r�r�r�rr	rr|�mainrrrr�<module>s�8




	
[tP<
s\JdvN


Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists