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_tarfile.cpython-310.pyc
o

�i:`�@s�ddlZddlZddlZddlmZddlmZddlmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZddlmZddlmZddlmZzddlZWneygdZYnwzddlZWneyydZYnwzddlZWney�dZYnwzddlZWney�dZYnwd	d
�Zej�ej�dZ e dZ!e�"d
�Z#ej�$e d�Z%ej�$e d�Z&ej�$e d�Z'ej�$e d�Z(ej�$e d�Z)dZ*dZ+Gdd�d�Z,e�-�Gdd�d��Z.e�/�Gdd�d��Z0e�1�Gdd�d��Z2Gdd�de,�Z3Gdd �d e3ej4�Z5Gd!d"�d"e.e5�Z6Gd#d$�d$e0e5�Z7Gd%d&�d&e2e5�Z8Gd'd(�d(e3ej4�Z9Gd)d*�d*e.e9�Z:Gd+d,�d,e0e9�Z;Gd-d.�d.e2e9�Z<Gd/d0�d0e3�Z=Gd1d2�d2e=�Z>Gd3d4�d4e>ej4�Z?Gd5d6�d6e.e>ej4�Z@Gd7d8�d8e0e>ej4�ZAGd9d:�d:e2e>ej4�ZBGd;d<�d<e=ej4�ZCGd=d>�d>e.eC�ZDGd?d@�d@e0eC�ZEGdAdB�dBe2eC�ZFGdCdD�dDe,ej4�ZGGdEdF�dFe.eG�ZHGdGdH�dHe0eG�ZIGdIdJ�dJe2eG�ZJGdKdL�dLe3ej4�ZKGdMdN�dN�ZLGdOdP�dPeLe3ej4�ZMGdQdR�dReLe3ej4�ZNGdSdT�dTe,�ZOGdUdV�dVeOej4�ZPGdWdX�dXe.eP�ZQGdYdZ�dZe0eP�ZRGd[d\�d\e2eP�ZSGd]d^�d^eOej4�ZTGd_d`�d`e.eT�ZUGdadb�dbe0eT�ZVGdcdd�dde2eT�ZWGdedf�dfej4�ZXGdgdh�dheOej4�ZYGdidj�djeOej4�ZZGdkdl�dle.eZ�Z[Gdmdn�dne0eZ�Z\Gdodp�dpe2eZ�Z]Gdqdr�dreZ�Z^e�_e`eds�dt�Gdudv�dvej4��ZaGdwdx�dxeX�ZbGdydz�dz�ZcGd{d|�d|ecej4�ZdGd}d~�d~ecej4�ZeGdd��d�ecej4�ZfGd�d��d��ZgGd�d��d�egej4�ZhGd�d��d�e.egej4�ZiGd�d��d�e0egej4�ZjGd�d��d�e2egej4�ZkGd�d��d�ej4�ZlGd�d��d�ej4�ZmGd�d��d�ej4�ZnGd�d��d�ej4�Zoe�pe`eds�d��Gd�d��d�e3ej4��ZqGd�d��d�e0ej4�Zrd�d��Zse�_e`ed��d��e�_e`ed��d��Gd�d��d�ej4���ZtGd�d��d�e3ej4�ZuGd�d��d�e3�ZvGd�d��d�evej4�ZwGd�d��d�evej4�ZxGd�d��d�evej4�ZyGd�d��d�evej4�ZzGd�d��d�ej4�Z{d�d��Z|Gd�d��d��Z}Gd�d��d�ej4�Z~d�d��Zd�d��Z�e�d�k�r�e���dSdS)��N)�sha256)�contextmanager)�Random)�support)�	os_helper)�
script_helper)�warnings_helpercCst|���S�N)r�	hexdigest)�data�r�./usr/local/lib/python3.10/test/test_tarfile.py�	sha256sum(srz-tardirz
-extract-testztesttar.tarztesttar.tar.gzztesttar.tar.bz2�testtar.tar.xzztmp.tarZtesttarZ@e09e4bc8b3c9d9177e77256353b36c159f5f040531bbd4b024a8f9b9196c71ceZ@4f05a776071146756345ceee937b33fc5644f5a96b9780d1c7d6a32cdf164d7bc@s.eZdZeZdZejZej	j
Z
edd��ZdS)�TarTest�cCs|j|jSr	)�prefix�suffix��selfrrr
�modeBszTarTest.modeN)
�__name__�
__module__�__qualname__�tarnamer�io�FileIO�open�tarfile�TarFile�taropen�propertyrrrrr
r<src@�*eZdZeZdZer
ejndZe	j
jZdS)�GzipTest�gzN)
rrr�gzipnamerr�gzipZGzipFilerrrZgzopenr rrrr
r#F�
r#c@r")�Bz2Test�bz2N)
rrr�bz2namerrr)�BZ2FilerrrZbz2openr rrrr
r(Mr'r(c@r")�LzmaTest�xzN)
rrr�xznamerr�lzma�LZMAFilerrr�xzopenr rrrr
r,Tr'r,c@s eZdZdZdd�Zdd�ZdS)�ReadTest�r:cCstj|j|jdd�|_dS)N�	iso8859-1�r�encoding�rrrr�tarrrrr
�setUp`s�zReadTest.setUpcCs|j��dSr	)r8�closerrrr
�tearDownd�zReadTest.tearDownN)rrrrr9r;rrrr
r2\sr2c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Ze�eed�o?eed�d�dd��ZdS)�
UstarReadTestcCsl|j�d�}|j�|�� }|��}|�t|�|jd�|�t|�td�Wd�dS1s/wYdS)N�
ustar/regtype�regular file extraction failed)	r8�	getmember�extractfile�read�assertEqual�len�sizer�sha256_regtype�r�tarinfo�fobjrrrr
�test_fileobj_regular_filejs��"�z'UstarReadTest.test_fileobj_regular_filecCs�|jjdtdd�|j�d�}ttj�td�d��}|��}Wd�n1s(wY|j�	|��+}t
�|�}|��}|�||d�|�t
|�dd�|�|ddd�Wd�dS1sawYdS)	Nr>r��filter�rzfileobj.readlines() failed�r�SzOI will gladly admit that Python is not the fastest running scripting language.
)r8�extract�TEMPDIRr@r�os�path�join�	readlinesrAr�
TextIOWrapperrCrD)rrH�fobj1�lines1rI�fobj2�lines2rrr
�test_fileobj_readlinesss&
�
��
�"�z$UstarReadTest.test_fileobj_readlinescCs�|jjdtdd�|j�d�}ttj�td�d��}|��}Wd�n1s(wY|j�	|��}t
t�|��}|�
||d�Wd�dS1sMwYdS)Nr>rrKrMzfileobj.__iter__() failed)r8rPrQr@rrRrSrTrUrA�listrrVrC)rrHrWrXrYrZrrr
�test_fileobj_iter�s
��"�zUstarReadTest.test_fileobj_iterc	Cs.|jjdtdd�ttj�td�d��}|��}Wd�n1s"wY|j�d�}|j�	|���}|��}|�
d�|�d|��d�|�
dd�|�d|��d�|�
d	d
�|�d|��d�|�
dd
�|�d|��d
�|�d�}|�||dd�d�|�
dd�|�|j
|��d�|�|��dd�|�
|j
d�|�d|��d�|�
d�|��}|�
d�|��}|�||d�|�
d�|�t|���|��d�|�
d�|�t|���d|��d�|�
d�|��}|�|��|t|�d�d�Wd�dS1�swYdS)Nr>rrK�rbrzseek() to file's start failediz"seek() to absolute position failedi�����z+seek() to negative relative position failedz+seek() to positive relative position failed�
i
zread() after seek failed�zseek() to file's end failed�z0read() at file's end did not return empty stringz$relative seek() to file's end failed�zreadlines() after seek failedztell() after readline() failedz)tell() after seek() and readline() failedzread() after readline() failed)r8rPrQrrRrSrTrBr@rA�seekrC�tellrErUrD�readline)	rrIrrH�text�s�s1�s2�linerrr
�test_fileobj_seek�sz
�
�
����
����

�
�
�
�$�zUstarReadTest.test_fileobj_seekc	Cs�|j�d��;}t�|�}|���d�}|�t|�t�z|�	d�Wnt
y0|�d�Yn	wWd�dSWd�dS1sDwYdS)Nr>r4�dzseeking failed in text mode)r8rArrVrB�encoderCrrFre�AttributeError�fail�rrIrrrr
�test_fileobj_text�s
���	"�zUstarReadTest.test_fileobj_textc	Cs~|j�|��/}|j�|��}|�|j|j�Wd�n1s wYWd�dSWd�dS1s8wYdSr	)r8rArC�name)rZlnktype�regtype�a�brrr
�_test_fileobj_link�s
�P�z UstarReadTest._test_fileobj_linkcC�|�dd�dS)N�
ustar/lnktyper>�rxrrrr
�test_fileobj_link1��z UstarReadTest.test_fileobj_link1cCry)N�./ustar/linktest2/lnktype�ustar/linktest1/regtyper{rrrr
�test_fileobj_link2���z UstarReadTest.test_fileobj_link2cCry)N�
ustar/symtyper>r{rrrr
�test_fileobj_symlink1�r}z#UstarReadTest.test_fileobj_symlink1cCry)N�./ustar/linktest2/symtyperr{rrrr
�test_fileobj_symlink2�r�z#UstarReadTest.test_fileobj_symlink2cCry)NZsymtype2r>r{rrrr
�test_issue14160�r}zUstarReadTest.test_issue14160cCs|�d�|�d�dS)N�barZeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)�add_dir_and_getmemberrrrr
�test_add_dir_getmember�s
z$UstarReadTest.test_add_dir_getmember�getuid�getgidz'Missing getuid or getgid implementationcCs�dd�}t���ht�td��&}tj|_zt�|�|j	||d�Wt�
|�nt�
|�wWd�n1s8wYt�t��}|�|�|�|�|d��Wd�n1s[wYWd�dSWd�dS1sswYdS)NcSsd|_|_|S)Nrn)�uid�gid�rHrrr
rL�sz3UstarReadTest.add_dir_and_getmember.<locals>.filter�wrK�/)
r�temp_cwdrr�tmpname�USTAR_FORMAT�formatrR�mkdir�add�rmdirrCr@)rrtrLr8rrr
r��s$

����"�z#UstarReadTest.add_dir_and_getmemberN)rrrrJr[r]rmrsrxr|r�r�r�r�r��unittest�
skipUnless�hasattrrRr�rrrr
r=hs"	
1�r=c@�eZdZdS)�GzipUstarReadTestN�rrrrrrr
r���r�c@r�)�Bz2UstarReadTestNr�rrrr
r�r�r�c@r�)�LzmaUstarReadTestNr�rrrr
r�r�r�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�ListTestcCstj|j|jd�|_dS)N�rr7rrrr
r9szListTest.setUpcs@tjt��ddd�}t�td|���jjdd�Wd�n1s#wY|���	�}��
d|���
d|���
d	|���
d
|���
d|���
d|���
d
|���
d|��fdd�}��
|d�|���
|d�|���
|d�|���
|d�|���
|d�|���|d���d|���d|�dS)N�ascii�
��newline�stdoutF��verbose�ustar/conttype�
ustar/regtypes
ustar/lnktypesustar/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/1234567/longnames./ustar/linktest2/symtypes./ustar/linktest2/lnktypesustar/dirtype/sustar/dirtype-with-size/cs|��jjd�}|�dd�S)N�surrogateescaper��backslashreplace)�decoder8r6ro)rwrirrr
�convsz ListTest.test_list.<locals>.convsustar/umlauts-�����s'misc/regtype-hpux-signed-chksum-�����s)misc/regtype-old-v7-signed-chksum-�����spax/bad-pax-�spax/hdrcharset-�s)ustar/conttype ?\r?\nustar/regtype ?\r?\nslink tos->)
rrV�BytesIOr�	swap_attr�sysr8r\�detach�getvalue�assertIn�assertRegex�assertNotIn)r�tio�outr�rrr
�	test_lists4�
�
�zListTest.test_listcCs�tjt��ddd�}t�td|��|jjdd�Wd�n1s#wY|���	�}|�
|d�|�d|�|�d	|�|�d
|�|�d|�|�d|�dS)
Nr�r�r�r�Tr�s�\?rw-r--r-- tarfile/tarfile\s+7011 \d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d ustar/\w+type ?\r?\n\?rw-r--r-- tarfile/tarfile\s+7011 \d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d ustar/\w+type ?\r?\nsustar/symtype -> regtypes1./ustar/linktest2/symtype -> ../linktest1/regtypes;./ustar/linktest2/lnktype link to ./ustar/linktest1/regtypes	gnu/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longlink link to gnu/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longnames	pax/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longlink link to pax/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longname)rrVr�rr�r�r8r\r�r�r�r�)rr�r�rrr
�test_list_verbose4s"����zListTest.test_list_verbosecCs�tjt��ddd�}dd�}t�td|��|jjd||j�d�Wd�n1s+wY|���	�}|�
d	|�|�d
|�dS)Nr�r�r�css$�|��D]
}d|jvr|VqdS)NZreg)�
getmembersrt)r8rHrrr
�membersNs�
��z+ListTest.test_list_members.<locals>.membersr�F)r�r�r�r�)rrVr�rr�r�r8r\r�r�r�r�)rr�r�r�rrr
�test_list_membersLs�zListTest.test_list_membersN)rrrr9r�r�r�rrrr
r�	s
%r�c@r�)�GzipListTestNr�rrrr
r�Yr�r�c@r�)�Bz2ListTestNr�rrrr
r�]r�r�c@r�)�LzmaListTestNr�rrrr
r�ar�r�c@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�CommonReadTestcCs�ttd��Wd�n1swY|�t�t��|�t�t�t���ttd��}|�t�|��Wd�n1s@wY|�t�t�d���dS)N�wbr^sinvalid)	rr��assertFalser�
is_tarfile�pathlib�Pathrr��rrIrrr
�test_is_tarfile_erroneousgs��z(CommonReadTest.test_is_tarfile_erroneousc	Cs�|�t�|j��|�t�t�|j���t|jd��}|�t�|��Wd�n1s.wYt|jd��}|�t�t�|�	����Wd�dS1sRwYdS)Nr^)
�
assertTruerr�rr�r�rrr�rBr�rrr
�test_is_tarfile_validxs�"�z$CommonReadTest.test_is_tarfile_validcCs�t�t|j�dd���Wd�n1swYz3z
t�t|j�}|��Wntjy8|�d�Ynw|�|�	�g�W|�
�dSW|�
�dS|�
�w)NrMr�z&tarfile.open() failed on empty archive)rrr�r�replace�getnames�	ReadErrorrq�assertListEqualr�r:�rr8rrr
�test_empty_tarfile�s���z!CommonReadTest.test_empty_tarfilecCs@|�td��t�d|j�Wd�dS1swYdS)NZxxx)�assertRaisesRegex�FileNotFoundErrorrrrrrrr
�test_non_existent_tarfile�s"�z(CommonReadTest.test_non_existent_tarfilecCsVttd��Wd�n1swY|�tjtjt|j�|�tjtjt�dS�Nr�)rr��assertRaisesrr�rrrrr
�test_null_tarfile�s
�z CommonReadTest.test_null_tarfilec	Cs�td��d�}dD]T}|�td��%}|�|d�t�d�}t|�|_|�|�	��|�|�Wd�n1s9wYtjtddd	�}z|�
|��dgd
|�W|��q	|��wdS)Nrrd)��ar�r`�foorMT)rZignore_zerosz3ignore_zeros=True should have skipped the %r-blocks)
r�	randbytesrr��writer�TarInforDrE�tobufr�r�r:)rr�charrIrHr8rrr
�test_ignore_zeros�s$

����z CommonReadTest.test_ignore_zerosc
Cs�dD]�}t�td��}t�d�}d|_|�|t�d��Wd�n1s&wYttd��
}|�|�Wd�n1s@wYt�t��$}|�	tj
d��
|D]}qUWd�n1sbwYWd�n1sqwYt�t��I}|��}|�	tj
d��|j|t
dd	�Wd�n1s�wY|�	tj
d��|�|���Wd�n1s�wYWd�n1s�wYqdS)
N)rdiXr`i��w:r�r`saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazr+bzunexpected end of datarrK)rrr�r�rE�addfilerr��truncater�r��nextrPrQrArB)rrEr8�trIrrr
�test_premature_end_of_archive�s:
������������z,CommonReadTest.test_premature_end_of_archivec	Cst|�tjd��)t�t�d���}Wd�n1swYWd�dSWd�dS1s3wYdS)Nz%file could not be opened successfullyz
recursion.tar)r�rr�rr�findfiler�rrr
�test_length_zero_header�s��"�z&CommonReadTest.test_length_zero_headerN)rrrr�r�r�r�r�r�r�r�rrrr
r�es	r�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Ze�eed�d�ejdd ���Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Ze�ed-ud.�d/d0��Z d-S)1�MiscReadTestBasecCsdSr	rrrrr
�requires_name_attribute�sz(MiscReadTestBase.requires_name_attributec	Cs�|��t|jd��C}|�|jt�tj||jd��}|�|jt�|�|jt	j
�|j��Wd�n1s8wYWd�dSWd�dS1sPwYdS�Nr^��fileobjr)r�rr�assertIsInstancert�strrrrCrRrS�abspath�rrIr8rrr
�test_no_name_argument�s��"�z&MiscReadTestBase.test_no_name_argumentcCsnt|jd��}|��}Wd�n1swYt�|�}|�tt|d�tj||j	d�}|�
|j�dS)Nr^rtr�)rrrBrr�r�rp�getattrrr�assertIsNonert�rrIrr8rrr
�test_no_name_attribute�s
�
z'MiscReadTestBase.test_no_name_attributecCs�t|jd��}|��}Wd�n1swYt�|�}d|_tj||jd��}|�|j�Wd�dS1s<wYdS)Nr^rr�)	rrrBrr�rtrrr�r�rrr
�test_empty_name_attribute�s
�
"�z*MiscReadTestBase.test_empty_name_attributec	Cs�t�|jtj�}t|d��6}|�|jt�tj||jd��}|�	|j�Wd�n1s.wYWd�dSWd�dS1sFwYdSr�)
rRrr�O_RDONLYr�rt�intrrr�)r�fdrIr8rrr
�test_int_name_attribute�s��"�z(MiscReadTestBase.test_int_name_attributec	Cs�|��t�|j�}t|d��C}|�|jt�tj||j	d��}|�|jt�|�
|jtj�|j��Wd�n1s=wYWd�dSWd�dS1sUwYdSr�)
r�rR�fsencoderrr�rt�bytesrrrCrSr�)rrrIr8rrr
�test_bytes_name_attributes��"�z*MiscReadTestBase.test_bytes_name_attributec	Cs�t�|j�}tj||jd��}|�|jt�|�	|jt
j�t
�
|���Wd�n1s.wY|�|��}|�|jt�|�	|jt
j�t
�
|���Wd�n1sXwYtjj||jd��}|�|jt�|�	|jt
j�t
�
|���Wd�n1s�wY|jdkr�tj|dd��}|�|jt�|�	|jt
j�t
�
|���Wd�dS1s�wYdSdS)Nr�rrM)r�r�rrrrr�rtr�rCrRrSr��fspathr rr)rrr8rrr
�test_pathlike_name
s&���
"��z#MiscReadTestBase.test_pathlike_namecCs�ttd��Wd�n1swY|�td��|�td�}Wd�n1s,wY|�td��|�td�}Wd�n1sHwY|�td��|�td�}Wd�dS1sewYdS)Nr�z
mode must be �q�rwr)rr�r��
ValueErrorr r�rrr
�test_illegal_mode_args���"�z&MiscReadTestBase.test_illegal_mode_argc	Cs,tj|j|jd�}z-|��|��}|j}|j}|�|��}|��}Wd�n1s,wYW|�	�n|�	�w|�|j��J}|�
|�|j|jd|d��#}|��}|�|j|�|��|�|�|���|d�Wd�n1swwYWd�dSWd�dS1s�wYdS)Nr�r3�rr�zseek back did not work)
rrrrr�rt�offsetrArBr:rerCr�)rr8r�rtr�frrIrrr
�test_fileobj_with_offset$s0
��
���"�z)MiscReadTestBase.test_fileobj_with_offsetcCs^|�tjtjt|j�ttd��}|jtjtj||jd�Wd�dS1s(wYdSr�)r�rr�rrrr�rrr
�test_fail_comp@s�"�zMiscReadTestBase.test_fail_compcCs"|j�d�}|�|jtjd�dS)Nzmisc/dirtype-old-v7zv7 dirtype failed)r8r@rC�typer�DIRTYPE�rrHrrr
�test_v7_dirtypeGs�z MiscReadTestBase.test_v7_dirtypecCs2z	|j�d�WdSty|�d�YdSw)Nzmisc/regtype-xstarz3failed to find misc/regtype-xstar (mangled prefix?))r8r@�KeyErrorrqrrrr
�test_xstar_typeOs
�z MiscReadTestBase.test_xstar_typecCsN|jD]!}|�t|j�dd|j�|j�d�sq|�|jdd|j�qdS)N鏽>zwrong mtime for %szustar/rzwrong uname for %s)r8rCr��mtimert�
startswith�unamerrrr
�test_check_membersXs
�
��z#MiscReadTestBase.test_check_memberscCs|�|j��djdd�dS)N���zmisc/eofzcould not find all members)rCr8r�rtrrrr
�test_find_membersas�z"MiscReadTestBase.test_find_members�link�Missing hardlink implementationc	CsFtjtddd���}|jdtdd�|�tjtj	�
td��|jdtdd�|�tjtj	�
td��ttj	�
td�d��}|��}Wd�n1sJwY|�t
|�t�|jd	tdd�|�tjtj	�
td	��ttj	�
td	�d��}|��}Wd�n1s�wY|�t
|�t�Wd�dS1s�wYdS)
Nr_r4)�
errorlevelr6r>rrKrzr^r�)rrrrPrQ�
addCleanupr�unlinkrRrSrTrBrCrrF)rr8rrrrr
�test_extract_hardlinkes 
�
�"�z&MiscReadTestBase.test_extract_hardlinkc		Cs�tjtdd�}tj�td�}t�|�z\dd�|D�}|j||dd�|D]>}tj�||j	�}t
jdkrE|�|j
d	@t�|�jd	@|j	�d
d�}tj�|�}d�||j�||�|�}|�|j||�q%W|��t�|�dS|��t�|�w)
Nr4�r6�
extractallcS�g|]}|��r|�qSr��isdir��.0r�rrr
�
<listcomp>��z4MiscReadTestBase.test_extractall.<locals>.<listcomp>�
fully_trustedrK�win32�cSs$t|t�r
d�||���Sd�|�S)Nz{} ({})z
{!r} (int))�
isinstance�floatr��hex)rrrr
�format_mtime�s

z6MiscReadTestBase.test_extractall.<locals>.format_mtimez,tar mtime {0} != file time {1} of path {2!a})rrrrRrSrTrQr�rrtr��platformrCr�stat�st_mode�getmtimer�rr:r�rmtree)	rr8�DIR�directoriesrHrSr,Z
file_mtime�errmsgrrr
�test_extractallzs4

����z MiscReadTestBase.test_extractallc	Cs�d}tj�td�}t�|�zWtjtdd��8}|�|�}|j	||dd�tj�||�}|�
tj�|�|j�t
jdkrG|�
t�|�jd@d	�Wd�n1sQwYWt�|�dSWt�|�dSt�|�w)
N�
ustar/dirtypeZ
extractdirr4rr&�rSrLr'r(i�)rRrSrTrQr�rrrr@rPrCr0rr�r-r.r/rr1�rZdirtyper2r8rHZ	extractedrrr
�test_extract_directory�s 


���z'MiscReadTestBase.test_extract_directoryc	Cs�t�t�d}t�|��Ltjtdd��,}dd�|D�}|j||dd�|D]}||j	}|�
tj�
|�|j�q&Wd�n1sCwYWd�dSWd�dS1s[wYdS)Nrr4rcSrrr r"rrr
r$�r%zBMiscReadTestBase.test_extractall_pathlike_name.<locals>.<listcomp>r&rK)r�r�rQr�temp_dirrrrrrtrCrRrSr0r)rr2r8r3rHrSrrr
�test_extractall_pathlike_name�s�
�P�z.MiscReadTestBase.test_extractall_pathlike_namec	Cs�d}t�t�d}t�|��Dtjtdd��$}|�|�}|j	||dd�||}|�
tj�
|�|j�Wd�n1s=wYWd�dSWd�dS1sUwYdS)Nr6rr4rr&r7)r�r�rQrr:rrrr@rPrCrRrSr0rr8rrr
�test_extract_pathlike_name�s�
P�z+MiscReadTestBase.test_extract_pathlike_namec	Cs�tj�td�}t|d��
}|�d�Wd�n1swYz4t�tj	�}z|�
|�Wntjy@|�|j
j�Ynw|�d�Wt�|�dSWt�|�dSt�|�w)N�emptyr�rczReadError not raised)rRrSrTrQrr��object�__new__rr�__init__r�r�r��closedrqrr)rr=rIr8rrr
�test_init_close_fobj�s���z%MiscReadTestBase.test_init_close_fobjcCsjt�|j��%}t||�D]\}}|�|j|j�|�|��|���qWd�dS1s.wYdSr	)rrr�ziprCr�get_info)rr8Zm1Zm2rrr
�test_parallel_iteration�s�"�z(MiscReadTestBase.test_parallel_iterationNz
requires zlibc	Cs�tj�d��1}tj|_|�tj��t�	|j
�Wd�n1s"wYWd�dSWd�dS1s:wYdS)Nztarfile.TarInfo.fromtarfile)r��mock�patch�zlib�error�side_effectr�rr�rr)rrFrrr
�test_zlib_error_does_not_leak�s��"�z.MiscReadTestBase.test_zlib_error_does_not_leak)!rrrr�r�r�r�r�r�rrrr	r
rrrr�r�r�rRr�skip_unless_symlinkrr5r9r;r<rBrE�skipIfrHrKrrrr
r��s8		
		�

r�c@�eZdZdZdS)�MiscReadTestN)rrrr	rrrr
rO��rOc@r�)�GzipMiscReadTestNr�rrrr
rQ�r�rQc@�eZdZdd�ZdS)�Bz2MiscReadTestcC�|�d�dS)NzBZ2File have no name attribute��skipTestrrrr
r��r<z'Bz2MiscReadTest.requires_name_attributeN�rrrr�rrrr
rS��rSc@rR)�LzmaMiscReadTestcCrT)NzLZMAFile have no name attributerUrrrr
r��r<z(LzmaMiscReadTest.requires_name_attributeNrWrrrr
rY�rXrYc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�StreamReadTest�r|c
Cs~|jD]9}|��s
q|j�|��$}	z|�d�}Wntjy(|�d�Ynw|s,nqWd�n1s7wYqdS)NTrdz6simple read-through using TarFile.extractfile() failed)r8�isregrArBr�StreamErrorrq)rrHrI�bufrrr
�test_read_through�s"
�����z StreamReadTest.test_read_throughcCsh|j��}|j�|��}|��}Wd�n1swY|�t|�|jd�|�t|�td�dS)Nr?)	r8r�rArBrCrDrErrFrGrrr
rJs

���z(StreamReadTest.test_fileobj_regular_filecCsP|j��}|j�|d��}|�tj|j�Wd�dS1s!wYdS�Nr)r8r�rAr�rr]rB)rZtarinfosrrrr
�test_provoke_stream_error
s
"�z(StreamReadTest.test_provoke_stream_errorcCs�tjtdd�}zc|j}	|��}|��}|durnK|�|d�|��s'|��rC|�tj	��
|�
|�Wd�n1s=wYq|�
|�}|�
|�}|durRq|�|d�|�|��|��d�qW|�
�dS|�
�w)Nr4rTzstream.next() failed.zstream.extractfile() failedzstream extraction failed)rrrr8r��assertIsNotNoneZislnkZissymr�r]rArCrBr:)rZtar1Ztar2�t1�t2�v1�v2rrr
�test_compare_memberss2�

��z#StreamReadTest.test_compare_membersN)rrrrr_rJrargrrrr
rZ�s	rZc@r�)�GzipStreamReadTestNr�rrrr
rh-r�rhc@r�)�Bz2StreamReadTestNr�rrrr
ri0r�ric@r�)�LzmaStreamReadTestNr�rrrr
rj3r�rjc@�4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�DetectReadTestc
CsNzt�||�}Wntjy }z|��WYd}~dSd}~ww|��dSr	)rrr�rqr:)rrtrr8�errr
�_testfunc_file8s��zDetectReadTest._testfunc_filec
Cs|zt|d��}tj|||d�}Wd�n1swYWntjy7}z|��WYd}~dSd}~ww|��dS)Nr^�r�)rrr�rqr:)rrtrrr8rmrrr
�_testfunc_fileobj@s����z DetectReadTest._testfunc_fileobjcCsJ|jr|�tj��tjtd|jd�Wd�n1swY|�tj��tjtd|jd�Wd�n1s>wY|�tj��tj|jdd�Wd�n1s\wY|�tj��tj|jdd�Wd�n1szwY||jd�||jd|j�||jd�||jd|j�||jd�dS)Nr3r�r[rMzr:*�r|*)rr�rr�rr)rZtestfuncrrr
�_test_modesIs$����zDetectReadTest._test_modescC�|�|j�dSr	)rrrnrrrr
�test_detect_fileYr}zDetectReadTest.test_detect_filecCrsr	)rrrprrrr
�test_detect_fileobj\r}z"DetectReadTest.test_detect_fileobjN)rrrrnrprrrtrurrrr
rl7s	rlc@r�)�GzipDetectReadTestNr�rrrr
rv_r�rvc@rR)�Bz2DetectReadTestcCs|ttd��}|��}Wd�n1swYtjtddd��
}|�|�Wd�n1s1wY|�td�dS)Nr^r�r_��
compresslevelrq)rrrBr)r+r�r�rnrrrrr
�test_detect_stream_bz2cs
��z(Bz2DetectReadTest.test_detect_stream_bz2N)rrrrzrrrr
rwbrXrwc@r�)�LzmaDetectReadTestNr�rrrr
r{qr�r{c@s�eZdZd(dd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�ZdS))�MemberReadTestNcKs�|dur(|j�|��}|�t|���|d|j�Wd�n1s#wYd|d<d|d<d|d<d|jvrAd	|d
<d	|d<|��D]\}}|�t||�|d||jf�qEdS)
N�wrong sha256sum for %srr��r�rnr�zold-v7rr�gnamezwrong value in %s field of %s)r8rArCrrBrt�itemsr�)rrH�chksum�kwargsr�k�vrrr
�_test_memberws"��
��zMemberReadTest._test_membercC� |j�d�}|j|dtd�dS)Nr>�c�rEr��r8r@r�rFrrrr
�test_find_regtype��z MemberReadTest.test_find_regtypecCr�)Nzustar/conttyper�r�r�rrrr
�test_find_conttype�r�z!MemberReadTest.test_find_conttypecC�|j�d�}|j|dd�dS)Nr6r�rE�r8r@r�rrrr
�test_find_dirtype��z MemberReadTest.test_find_dirtypecCr�)Nzustar/dirtype-with-size�r�r�rrrr
�test_find_dirtype_with_size�r�z*MemberReadTest.test_find_dirtype_with_sizecC� |j�d�}|j|ddd�dS)Nrzrr>�rE�linknamer�rrrr
�test_find_lnktype�r�z MemberReadTest.test_find_lnktypecCr�)Nr�rrur�r�rrrr
�test_find_symtype�r�z MemberReadTest.test_find_symtypecCs"|j�d�}|j|dddd�dS)Nz
ustar/blktyper��rE�devmajor�devminorr�rrrr
�test_find_blktype��z MemberReadTest.test_find_blktypecCs"|j�d�}|j|dddd�dS)Nz
ustar/chrtyperr_r�r�r�rrrr
�test_find_chrtype�r�z MemberReadTest.test_find_chrtypecCr�)Nzustar/fifotyperr�r�rrrr
�test_find_fifotype�r�z!MemberReadTest.test_find_fifotypecCr�)Nzustar/sparse�Pr��r8r@r��
sha256_sparserrrr
�test_find_sparse�r�zMemberReadTest.test_find_sparsecCr�)N�
gnu/sparser�r�r�rrrr
�test_find_gnusparse�r�z"MemberReadTest.test_find_gnusparsecCr�)N�gnu/sparse-0.0r�r�r�rrrr
�test_find_gnusparse_00�r�z%MemberReadTest.test_find_gnusparse_00cCr�)N�gnu/sparse-0.1r�r�r�rrrr
�test_find_gnusparse_01�r�z%MemberReadTest.test_find_gnusparse_01cCr�)N�gnu/sparse-1.0r�r�r�rrrr
�test_find_gnusparse_10�r�z%MemberReadTest.test_find_gnusparse_10cCr�)Nuustar/umlauts-ÄÖÜäöüßr�r�r�rrrr
�test_find_umlauts�sz MemberReadTest.test_find_umlautscCsd}|�||j���dS)Naustar/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/12345/1234567/longname)r�r8r�)rrtrrr
�test_find_ustar_longname�sz'MemberReadTest.test_find_ustar_longnamecCr�)Nzmisc/regtype-old-v7r�r�r�rrrr
�test_find_regtype_oldv7�r�z&MemberReadTest.test_find_regtype_oldv7cCs@|j��tj|j|jdd�|_|j�d�}|j|dtd�dS)Nr4r5upax/umlauts-ÄÖÜäöüßr�r�)	r8r:rrrrr@r�rFrrrr
�test_find_pax_umlauts�s
�z$MemberReadTest.test_find_pax_umlautsr	)rrrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr
r|us(
r|c@rk)�LongnameTestcCsV|jddd}z|j�|�}Wnty|�d�Ynw|�|jtjd�dS)Nr���123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/�longnamezlongname not foundzread longname as dirtype)	�subdirr8r@rrq�assertNotEqualr
rr)rr�rHrrr
�test_read_longname�s��zLongnameTest.test_read_longnamecCsf|jddd}|jddd}z|j�|�}Wnty(|�d�Ynw|�|j|d�dS)Nr�r�r��longlinkzlonglink not foundzlinkname wrong)r�r8r@rrqrCr�)rr�r�rHrrr
�test_read_longlink�s�zLongnameTest.test_read_longlinkcCs�|jddd}|j�|�}|j}|jj�|�t�|jj�d��}|�	t
j��t
jd|d�Wd�dS1s<wYdS)Nr�r�r�izfoo.tar)rtr�)
r�r8r@rr�rerr�rBr�rr�r)rr�rHrrIrrr
�test_truncated_longname�s"�z$LongnameTest.test_truncated_longnamecCs�|jddd}|j�|�j}ttd��!}|�|�tj�	|�
d�dd�}|�|j|j
�Wd�dS1s9wYdS)Nr�r�r�r^rdr4�strict)r�r8r@rrrrerr�ZfrombufrBrCr
�longnametype)rr�rrIrHrrr
�test_header_offset�s
�"�zLongnameTest.test_header_offsetcCs�d}t���kt�td��$}|j|_zt�|�|�|�Wt�	|�nt�	|�wWd�n1s4wYt�t��}|�
|�|��|�
|�|�d���Wd�n1s\wYWd�dSWd�dS1stwYdS)Nzfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/r�r�)
rr�rrr�r�rRr�r�r�rbr@�removesuffix)rZlongdirr8rrr
�test_longname_directory�s 

���"�z$LongnameTest.test_longname_directoryN)rrrr�r�r�r�r�rrrr
r��s
		r�c@sPeZdZdZejZejZdd�Z	dd�Z
dd�Zdd	�Zd
d�Z
edd
��ZdS)�GNUReadTestZgnucCs�|jj|tdd�tj�t|�}t|d��}|��}Wd�n1s$wY|�t	|�t
d|�|��rIt�|�}|�
|jd|j�dSdS)NrrKr^r}rd)r8rPrQrRrSrTrrBrCrr��_fs_supports_holesr.Z
assertLess�	st_blocks�st_size)rrt�filenamerIrrirrr
�_test_sparse_files
��
�zGNUReadTest._test_sparse_filecCrT)Nr��r�rrrr
�test_sparse_file_old'r<z GNUReadTest.test_sparse_file_oldcCrT)Nr�r�rrrr
�test_sparse_file_00*r<zGNUReadTest.test_sparse_file_00cCrT)Nr�r�rrrr
�test_sparse_file_01-r<zGNUReadTest.test_sparse_file_01cCrT)Nr�r�rrrr
�test_sparse_file_100r<zGNUReadTest.test_sparse_file_10cCs�tj�d�rBtj�td�}t|d��}|�d�|�	d�|�
�Wd�n1s+wYt�|�}t�
|�|jd|jkSdS)N�linuxzsparse-testr�isxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrdF)r�r-rrRrSrTrQrrer�r�r.rrr�r�)rtrIrirrr
r�3s


�

zGNUReadTest._fs_supports_holesN)rrrr�r�GNUTYPE_LONGNAMEr��
GNU_FORMATr�r�r�r�r�r��staticmethodr�rrrr
r�s	r�c@s,eZdZdZejZejZdd�Z	dd�Z
dS)�PaxReadTestZpaxcCs�tjtdd�}z^|�d�}|�|jd�|�|jd�|�|j�d�d�|�d�}|�|jd	�|�|jd�|�|j�d�d�|�d
�}|�|jd�|�|jd�|�|j�d�d�W|�	�dS|�	�w)Nr4r�pax/regtype1r�r�zVENDOR.umlautsuÄÖÜäöüßzpax/regtype2rzpax/regtype3r)
rrrr@rCrr�pax_headers�getr:�rr8rHrrr
�test_pax_global_headersPs*
�
�
�z#PaxReadTest.test_pax_global_headerscCs�tjtdd�}zG|�d�}|�|jd�|�|jd�|�|jd�|�|jd�|�t	|j�t
�|�t
|jd�d�|�t
|jd�d�W|��dS|��w)	Nr4rzpax/regtype4r��{g��^�AZatime�ctime)
rrrr@rCrEr�r�rr
r*r�r:r�rrr
�test_pax_number_fieldsgs
z"PaxReadTest.test_pax_number_fieldsN)rrrr�r�XHDTYPEr��
PAX_FORMATr�r�r�rrrr
r�Jsr�c@�eZdZdd�Zdd�ZdS)�
WriteTestBasecCs�t��}tj||jd��}|�t�d��Wd�n1swY|�|jd�|�	�}~t
��|�|j�|�||�	��dS)Nr�r�z#external fileobjs must never closed)
rr�rrrr�r�r�rAr�r�
gc_collectrC)rrIr8rrrr
�test_fileobj_no_close{s�z#WriteTestBase.test_fileobj_no_closecCs�t�t|j�� }t�d�}tjtj|_|�|t	�
d|j��Wd�n1s*wY|�td��}|�t|�
��tjd�Wd�dS1sNwYdS)Nr�r�r^rb)rrr�rr��
RECORDSIZE�	BLOCKSIZErEr�rr�rCrDrB)rr8r�rIrrr
�test_eof_marker�s
�"�zWriteTestBase.test_eof_markerN)rrrr�r�rrrr
r�wsr�c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	e
�ee
d�d�dd��Zejdd��Zdd�Zdd�Zd&dd�Zejdd��Zdd�Zd d!�Zd"d#�Zd$d%�ZdS)'�	WriteTestr�cCsxd}t�t|j�}zt�|�}|�|�W|��n|��wt�t�}z|�|��d|d�W|��dS|��w)N�d0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789rz!failed to store 100 char filename)	rrr�rr�r�r:rCr�)rrtr8r�rrr
�test_100_char_name�s

�zWriteTest.test_100_char_namecCs�t�t|j�}z,tj�td�}t|d��
}|�d�Wd�n1s$wY|�	|�W|�
�n|�
�w|�tj�t�dd�dS)N�filer��aaarztarfile is empty)
rrr�rrRrSrTrQr�r�r:Z
assertGreater�getsize)rr8rSrIrrr
�
test_tar_size�s��zWriteTest.test_tar_sizecCs�t�t|j�}zUtj�td�}t|d��Wd�n1swY|�|�}|�	|j
d�t|d��
}|�d�Wd�n1sEwY|�|�}|�	|j
d�W|��dS|��w)Nr�r�rr�r�)
rrr�rrRrSrTrQ�
gettarinforCrEr�r:)rr8rSrHrIrrr
�test_file_size�s�
�
zWriteTest.test_file_sizec	Csttj�td�}t�|�z't�t|j�}z|�	|�}|�
|jd�W|��n|��wWt
�|�dSt
�|�w)N�	directoryr)rRrSrTrQr�rrr�rr�rCrEr:rr��rrSr8rHrrr
�test_directory_size�s

zWriteTest.test_directory_sizecCsVtj�td�}t�|�ttj�|d�d���ttj�|d�d���zlt�t|j	�}zCt
j�d��}ddg|_
|�|�Wd�n1sHwYg}|��D]}|�tj�|j�d�qS|�|gd��W|��n|��wWt�tj�|d��t�tj�|d��t�|�dSt�tj�|d��t�tj�|d��t�|�w)Nr��1rv�2z
os.listdirr)r�r�r�)rRrSrTrQr�rr:rr�rr�rFrG�return_valuer�r��append�splitrtrCrrr�)rrSr8Zmock_listdir�paths�mrrr
�test_ordered_recursion�s,

��z WriteTest.test_ordered_recursionc	Cs�t�t|j��M}t�t�d}t|d��
}|�d�Wd�n1s$wY|�|�}|�t	�
|��}|�|jt
�|�|j|j�|�|jd�Wd�dS1sWwYdS)Nr�r�r�r�)rrr�rr�r�rQr�r�rRr�r�rtr�rCrE)rr8rSrIrHZtarinfo2rrr
�test_gettarinfo_pathlike_name�s�
"�z'WriteTest.test_gettarinfo_pathlike_namerrc
Cstj�td�}tj�td�}t|d��
}|�d�Wd�n1s#wYzt�||�WntyI}z
|�d|�WYd}~nd}~wwz1t	�t
|j�}z|�|�|�|�}|�
|jd�W|��n|��wWt�|�t�|�dSt�|�t�|�w)Nr�link_targetr�r��
os.link(): %sr)rRrSrTrQrr�r�PermissionErrorrVrr�rr�rCrEr:rr)rr�targetrIrmr8rHrrr
�test_link_size�s,���



�zWriteTest.test_link_sizec	Csvtj�td�}t�d|�z't�t|j�}z|�	|�}|�
|jd�W|��n|��wWt
�|�dSt
�|�w)N�symlinkr�r)rRrSrTrQr�rrr�rr�rCrEr:rrr�rrr
�test_symlink_sizes
zWriteTest.test_symlink_sizecCs�tj�t�}t�t|j�}z@|�|j|d�|�	|�|�|�
�gd�t�t
��
|�	|�Wd�n1s9wY|�|�
�gd�W|��dS|��w)Nzarchive name must be absolutezadded the archive to itself)rRrSr�r�rrrrCrtr�r�r�
change_cwdrQr:)r�dstnamer8rrr
�
test_add_self!s"
�
���zWriteTest.test_add_selfc	Cs4tj�td�}t�|�z�dD]}tj�||�}t�|�qdd�}tjt	|j
dd�}z|j|d|d�W|��n|��w|�
t��|�|dd	d|�Wd�n1sXwYt�t	d
�}z#|D]}|�|jd�|�|jd�qf|�t|���d
�W|��n|��wWt�|�dSt�|�w)NrL)r�r�ZbazcSs&tj�|j�dkrdSd|_d|_|S)Nr�r�r�)rRrS�basenamertr�rr�rrr
rL;s
z%WriteTest.test_filter.<locals>.filterr4rZ	empty_dir)�arcnamerLTrMr�r�r�)rRrSrTrQr�r�create_empty_filerrr�rr�r:r��	TypeErrorrCr�rrDr�r1)r�tempdirrtrLr8rHrrr
�test_filter3s,
�zWriteTest.test_filterNFcCs�tj�td�}|st�|�nt�|�t�t	|j
�}z
|j||d�W|��n|��wt�t	d�}z
|�
�}W|��n|��w|sLt�|�nt�|�|�|j|p]|�tjd��dS)Nr��rrMr�)rRrSrTrQrrr�rrr�rr�r:r�rr�rCrtr��sep)rrSZcmp_path�dirr�r8r�rrr
�_test_pathname[s 


 zWriteTest._test_pathnamec	Csttj�td�}tj�td�}t�|�z�tj�|d�}tj�|d�}t|d��
}|�d�Wd�n1s7wYt�||�t�|d��}|j	|dd�|j	|dd�Wd�n1sawYtj|dd	�� }z	|j
|d
d�Wnty�|�d�YnwWd�n1s�wYWt
�|�t
�|�dSWt
�|�t
�|�dSt
�|�t
�|�w)
NZtestsymlinksztestsymlinks.tar�sourcer�r�z
something
rrb�rr&r7z&extractall failed with symlinked files)rRrSrTrQr�rr�r�rr�r�OSErrorrqrrr1)rrZtemparchiveZsource_fileZtarget_filerr8rrr
�test_extractall_symlinksxs>
��
����
�

�z"WriteTest.test_extractall_symlinkscCs<|�d�|�tj�ddd��|�tj�ddd��|�tj�dd��|�tj�ddd��|�tj�dddd��|�tj�dddd��|�tj�dddd��|�tj�dd��|�tj�ddd��|�tj�dddd��|�tj�dddd��|�dtjtjd�|jdtjtjddd�dS)Nr��.r��..T)r)rrRrSrTrrrrr
�test_pathnames�s
 zWriteTest.test_pathnamescCs6tjdkr
|�dd�dS|�dd�|�dd�dS)Nr'zC:\foor�z/fooz///foo)r�r-rrrrr
�test_abs_pathnames�s
zWriteTest.test_abs_pathnamesc	Cs�t�t��Ht�t|j�}z|�d�W|��n|��wt�td�}z|D]}|j	dkr9|�
|j	�d�|j	�q'W|��n|��wWd�dS1sPwYdS)Nr
rMz./)rr�rQrrr�rr�r:rtr�r�rr8r�rrr
�test_cwd�s
��"�zWriteTest.test_cwdc	s�tttfD]9�G�fdd�dtj�}|�}|����tjt|j	|tj
ddid�}Wd�n1s3wY|�|j�qdS)NcseZdZdZ�fdd�ZdS)z8WriteTest.test_open_nonwritable_fileobj.<locals>.BadFileTcs|jrd|_��dS�NF)�first�rr��exctyperr
r��s�z>WriteTest.test_open_nonwritable_fileobj.<locals>.BadFile.writeN)rrrrr�rrrr
�BadFile�srZnonr=)r�r�r�)
r�EOFError�RuntimeErrorrr�r�rrr�rr�r�rA)rrrr8rrr
�test_open_nonwritable_fileobj�s���z'WriteTest.test_open_nonwritable_fileobjr)rrrrr�r�r�r�r�r�r�r�r�rRr�rrLr�r�rrrrrrrrrrr
r��s.�



(
r�c@r�)�
GzipWriteTestNr�rrrr
r�r�rc@r�)�Bz2WriteTestNr�rrrr
r�r�rc@r�)�
LzmaWriteTestNr�rrrr
r�r�rc@s@eZdZdZdZdd�Ze�ej	dkoe
ed�d�dd	��ZdS)
�StreamWriteTestzw|NcCs�t�t|j�}|��|jr8|��}ttd��}|��}Wd�n1s&wY|�|�}|�|j	d�n|�t��}|��}Wd�n1sLwY|�
|�d�tjd�dS)Nr^zfound trailing datar�zincorrect zero padding)
rrr�rr:�decompressorrB�
decompressr��unused_datarC�countr�)rr8ZdecrIrrrr
�test_stream_padding�s
�

��z#StreamWriteTest.test_stream_paddingr'�umaskzMissing umask implementationc	Csrtj�t�rt�t�t�d�}z"t�t|j	�}|�
�t�t�jd@}|�
|dd�Wt�|�dSt�|�w)N�r(i�zwrong file permissions)rRrS�existsr�rrr%rrrr:r.r/rC)rZoriginal_umaskr8rrrr
�test_file_mode�s

zStreamWriteTest.test_file_mode)
rrrrr r$r�r�r�r-r�rRr(rrrr
r�s�rc@rR)�GzipStreamWriteTestcCs<t�t|j���t�t�jdd�}tj	�
t�|vsJ�dS)zf
        Ensure the source directory is not included in the tar header
        per bpo-41316.
        zlatin-1rN)rrr�rr:r�r��	read_textrRrS�dirname)r�payloadrrr
� test_source_directory_not_leakedsz4GzipStreamWriteTest.test_source_directory_not_leakedN)rrrr-rrrr
r)rXr)c@�eZdZerejZdSdZdS)�Bz2StreamWriteTestN)rrrr)�BZ2Decompressorr rrrr
r/�r/c@r.)�LzmaStreamWriteTestN)rrrr/�LZMADecompressorr rrrr
r2r1r2c@speZdZdd�Zddd�Zddd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�GNUWriteTestcCst|�dd}|dS)Nrdr_)rD)rriZblocksrrr
�_lengthszGNUWriteTest._lengthNcCsXd}t|�tjkr|d7}||�|�7}|dur*t|�tjkr*|d7}||�|�7}|S)Nrd)rDr�LENGTH_NAMEr5�LENGTH_LINK)rrtrr#rrr
�
_calc_sizeszGNUWriteTest._calc_sizecCs�t�|�}|r||_tj|_t�td�}ztj|_|�	|�|�
||�}|j}|�||d�W|�
�n|�
�wt�t�}z#|��}|�|d�|�|j|jd�|�|j|jd�W|�
�dS|�
�w)Nr�z%GNU longname/longlink creation failedzunable to read longname member)rr�r��LNKTYPEr
rr�r�r�r�r8rrCr:r�rbrt)rrtrrHr8rerf�memberrrr
�_test(s2


���zGNUWriteTest._testcCrT)N�longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam�r;rrrr
�test_longname_1023Er<zGNUWriteTest.test_longname_1023cCrT)N�longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnamer=rrrr
�test_longname_1024Hr<zGNUWriteTest.test_longname_1024cCrT)N�longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longnam/longname_r=rrrr
�test_longname_1025Kr<zGNUWriteTest.test_longname_1025cCry)Nrt�longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnkr=rrrr
�test_longlink_1023Nr}zGNUWriteTest.test_longlink_1023cCry)Nrt�longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlinkr=rrrr
�test_longlink_1024Qr}zGNUWriteTest.test_longlink_1024cCry)Nrt�longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlink_r=rrrr
�test_longlink_1025Tr}zGNUWriteTest.test_longlink_1025cCry)Nr<rCr=rrrr
�test_longnamelink_1023Wr�z#GNUWriteTest.test_longnamelink_1023cCry)Nr?rEr=rrrr
�test_longnamelink_1024[r�z#GNUWriteTest.test_longnamelink_1024cCry)NrArGr=rrrr
�test_longnamelink_1025_r�z#GNUWriteTest.test_longnamelink_1025r	)rrrr5r8r;r>r@rBrDrFrHrIrJrKrrrr
r4s

r4c@seZdZdZdd�ZdS)�DeviceHeaderTestr�c	Cs�tj�td�}t�|�z�t�t|j�}z$tj	dd�}tj	dd�}tj
|_tj|_|�
|�|�
|�W|��n|��wt�td�}z|�d�}|�d�}W|��n|��w|�|jd�|�|jd�|�|jd�|�|jd�ttd��}|��}Wd�n1s�wY||j|j�}	||j|j�}
tdd	�}|�|	|d
�|�|
|d�Wt�|�dSt�|�w)NZdevice_header_testZmy_block_device�rtZmy_regular_filerMrr^iIiYs00000000000000s)rRrSrTrQr�rrr�rr��BLKTYPEr
�REGTYPEr�r:r@rCr�r�rBrZoffset_data�slicerr1)rrr8Z	input_blkZ	input_regZ
output_blkZ
output_regZinfiler^Zbuf_blkZbuf_regZdevice_headersrrr
�*test_headers_written_only_for_device_fileshs<



�
z;DeviceHeaderTest.test_headers_written_only_for_device_filesN)rrrrrQrrrr
rLdsrLc@sneZdZdZej�ed�Zdd�Z	e
dd��Ze
dd��Zd	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�ZdS)�
CreateTestzx:�
spameggs42cCst�t�dSr	)rrr�rrrr
r9�r<zCreateTest.setUpcCs<t|jd��}|�d�Wd�dS1swYdS)Nr�r�)r�	file_pathr�)�clsrIrrr
�
setUpClass�s"�zCreateTest.setUpClasscC�t�|j�dSr	)rrrT�rUrrr
�
tearDownClass��zCreateTest.tearDownClasscCs�t�t|j��}|�|j�Wd�n1swY|�t��}|��}Wd�n1s1wY|�t	|�d�|�
d|d�dS�Nr_rSr)rrr�rr�rTr r�rCrDr��r�tobj�namesrrr
�test_create�s�
�zCreateTest.test_createcCs�t�t|j��}|�|j�Wd�n1swY|�t��t�t|j�}Wd�n1s4wY|�t��}|�	�}Wd�n1sMwY|�
t|�d�|�d|d�dSr[)
rrr�rr�rTr��FileExistsErrorr r�rCrDr�r\rrr
�test_create_existing�s��
�zCreateTest.test_create_existingcCs�|�td��}|�|j�Wd�n1swY|�t��}|��}Wd�n1s0wY|�t|�d�|�d|d�dS�N�xr_rSr)r r�r�rTr�rCrDr�r\rrr
�test_create_taropen�s�
�zCreateTest.test_create_taropenc	Cs�|�td��}|�|j�Wd�n1swY|�t��|�td��Wd�n1s3wYWd�n1sBwY|�t��}|��}Wd�n1s[wY|�t|�d�|�	d|d�dSrb)
r r�r�rTr�r`r�rCrDr�r\rrr
�test_create_existing_taropen�s����
�z'CreateTest.test_create_existing_taropencCs�t�t�t�|j��'}|�|jt�|�	|jt
j�t��|�
t�|j��|��}Wd�n1s4wY|�	t|�d�|�d|d�|�t��}|��}Wd�n1s]wY|�	t|�d�|�d|d�dSr[)rrr�r�r�rr�rtr�rCrRrSr�r�rTr�rDr�r r\rrr
�test_create_pathlike_name�s
�
�z$CreateTest.test_create_pathlike_namecCs�|�t�t�d��'}|�|jt�|�|jtj	�
t��|�t�|j��|�
�}Wd�n1s3wY|�t|�d�|�d|d�|�t��}|�
�}Wd�n1s\wY|�t|�d�|�d|d�dSrb)r r�r�r�r�rtr�rCrRrSr�r�rTr�rDr�r\rrr
�!test_create_taropen_pathlike_name�s
�
�z,CreateTest.test_create_taropen_pathlike_nameN)rrrrrRrSrTrQrTr9�classmethodrVrYr_rardrerfrgrrrr
rR�s

		
rRc@rR)�GzipCreateTestcC�ttjt|jdd��}|�|j�Wd�n1swYtjtddd��	}Wd�dS1s3wYdS)Nr_rxzr:gz�rrr�rr�rT�rr]rrr
�test_create_with_compresslevel���"�z-GzipCreateTest.test_create_with_compresslevelN�rrrrmrrrr
ri��ric@rR)�
Bz2CreateTestcCrj)Nr_rx�r:bz2rkrlrrr
rm�rnz,Bz2CreateTest.test_create_with_compresslevelNrorrrr
rq�rprqc@rR)�LzmaCreateTestcCsDtjt|jdd��}|�|j�Wd�dS1swYdS)Nr_)�presetrkrlrrr
�test_create_with_presets"�z&LzmaCreateTest.test_create_with_presetN)rrrrurrrr
rs�srsc@seZdZdZdZdZdS)�CreateWithXModeTestrcN)rrrrrdrerrrr
rvsrvrrc@rk)�HardlinkTestc
Cs�tj�td�|_tj�td�|_t|jd��
}|�d�Wd�n1s&wYz
t�|j|j�Wnt	yN}z
|�
d|�WYd}~nd}~wwt�td�|_
|j
�|j�dS)Nr�r�r��foor�r�)rRrSrTrQr�r�rr�rr�rVrr�r8r�)rrIrmrrr
r9s���zHardlinkTest.setUpcCs&|j��t�|j�t�|j�dSr	)r8r:rrr�r�rrrr
r;"s
zHardlinkTest.tearDowncC�$|j�|j�}|�|jtjd�dS)Nzadd file as regular failed)r8r�r�rCr
rrOrrrr
�test_add_twice's�zHardlinkTest.test_add_twicecCry)Nzadd file as hardlink failed)r8r�r�rCr
rr9rrrr
�test_add_hardlink.s�zHardlinkTest.test_add_hardlinkcCs,d|j_|j�|j�}|�|jtjd�dS)NTzdereferencing hardlink failed)r8Zdereferencer�r�rCr
rrOrrrr
�test_dereference_hardlink3s
�z&HardlinkTest.test_dereference_hardlinkN)rrrr9r;rzr{r|rrrr
rwsrwc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�PaxWriteTestNcCs�t�|�}|r||_tj|_tjtdtjd�}z|�|�W|�	�n|�	�wt�t�}z-|r?|�
�dj}|�||d�n|�
�dj}|�||d�W|�	�dSW|�	�dS|�	�w)Nr��r�rzPAX longlink creation failedzPAX longname creation failed)
rr�r�r9r
rr�r�r�r:r�rCrt)rrtrrHr8�l�nrrr
r;<s$

�zPaxWriteTest._testc
Cs
dddddd�}tjtdtj|d�}z|�t�d��W|��n|��wtjtd	d
�}zR|�|j|�|�|�	�dj|�|j�
�D]3\}}|�t|�t
�|�t|�t
�|tjvrxz	tj||�WqEttfyw|�d�YqEwqEW|��dS|��w)
Nr��0z1.23�äöü�test)r�r�rr�r�r�)r�r�r4rrz"unable to convert pax header field)rrr�r�r�r�r:rCr�r�r�ZassertIsNotr
r��PAX_NUMBER_FIELDSrrrq)rr�r8�key�valrrr
�test_pax_global_headerTs8��
���	z#PaxWriteTest.test_pax_global_headercCs�ddd�}tjtdtjdd�}zt��}d|_d|_||_|�|�W|�	�n|�	�wtjtdd	�}z"|�
�d
}|�|j|�|�|jd�|�|jd�W|�	�dS|�	�w)Nr�Z123)rSr�r�r4�r�r6r��rrr�)rrr�r�r�rtr�r�r�r:r�rC)rr�r8r�rrr
�test_pax_extended_headerts$
�z%PaxWriteTest.test_pax_extended_headercCs�t��}d|_d|_d|_d|_d|_|��}|j|dd�}|�	|dd�|�
|d	t�|�	|d	d
�|�	|dd�|�	|dd�|�	|d
d�|�	|dtd�dtd�dtd�dtd�dtd�dtd�dtd��t��}d|_d|_d|_d|_d|_|��}|j|dd�}|�	|dd�|�	|d	d�|�	|dd�|�	|dd�|�	|d
d�|�	|dtd�dtd�dtd�ddd td!�d"td#�d$td�dtd��dS)%Nr�g�����@�@rnr��|r4rrtrr~rEr�r�s././@PaxHeader�Vs90000000000000000000000000000002000000000000010205 xsustar00�s16 mtime=1000.1
i�rx�as90000644000017300001740000000014400000001750006516 0ufoo㍴ld(	r�irs90000000000000000000000000000013000000000000010207 xs15 path=foo㍴
16 uid=16777216
s$16 gid=16777217
20 size=10000000000
s21 mtime=10000000000
i�sfoo?�`s90000644000000000000000000000000000000000000006540 0)
rr�rtrrEr�r�rDZcreate_pax_headerrCr�r�r�)rr��info�headerrrr
�test_create_pax_header�s�
�������������	
���������������z#PaxWriteTest.test_create_pax_headerr	)rrrr;r�r�r�rrrr
r}:s

 r}c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�UnicodeTestcCrT)Nr4��_test_unicode_filenamerrrr
�test_iso8859_1_filename�r<z#UnicodeTest.test_iso8859_1_filenamecCrT)N�utf7r�rrrr
�test_utf7_filename�r<zUnicodeTest.test_utf7_filenamecCrT)N�utf-8r�rrrr
�test_utf8_filename�r<zUnicodeTest.test_utf8_filenamecCs�tjtd|j|dd�}zd}|�t�|��W|��n|��wtjt|d�}z|�|��dj	|�W|��dS|��w)Nr�r��r�r6�errorsr�rr)
rrr�r�r�r�r:rCr�rt)rr6r8rtrrr
r��s�z"UnicodeTest._test_unicode_filenamecCsjtjtd|jddd�}z$t��}d|_|�t|j|�d|_d|_	|�t|j|�W|�
�dS|�
�w)Nr�r�r�r�r�r�)rrr�r�r�rtr��UnicodeErrorr�rr:r�rrr
�test_unicode_filename_error�s�z'UnicodeTest.test_unicode_filename_errorcCs~tjtdddd�}z0|D]&}|�t|j�t�|�t|j�t�|�t|j�t�|�t|j	�t�qW|�
�dS|�
�w)NrMr4r��r6r�)rrr�assertIsr
rtr�r�rrr:rrrr
�test_unicode_argument�s��z!UnicodeTest.test_unicode_argumentcCs�t�d�}d|_d|_tjtd|jdd�}z|�|�W|��n|��wtjtdd�}zE|�	d�}|�
|jd�|�
|jd�|jtjkrl|��tjtdd�}|�	d�}|�
|jd�|�
|jd�W|��dSW|��dS|��w)	Nr�r�r�r4)rr�r6rr�u	���)rr�rrrr�r�r�r:r@rCr�)rr�r8rrr
�test_uname_unicode�s.
�

�zUnicodeTest.test_uname_unicodeN)
rrrr�r�r�r�r�r�r�rrrr
r��sr�c@sfeZdZejZdd�Zdd�Zdd�Zdd�Z	d	d
�Z
dd�Zddd�Zdd�Z
dd�Zddd�Zd
S)�UstarUnicodeTestcC�0|�d�|�dt�|�d�|�dt�dS�Nr��e01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890ud01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567ÿue012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678ÿ��_test_ustar_namerrrrr
�test_unicode_name1�

z#UstarUnicodeTest.test_unicode_name1cC�|�d�|�dt�dS�Nud012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345ÿÿue0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456ÿÿr�rrrr
�test_unicode_name2#�
z#UstarUnicodeTest.test_unicode_name2cCr�)Na01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789a0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123/40123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012ÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123ÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789r�rrrr
�test_unicode_longname1)r�z'UstarUnicodeTest.test_unicode_longname1cCs|�dt�|�dt�dS)Nu01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿ/20123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789r�rrrr
�test_unicode_longname2/sz'UstarUnicodeTest.test_unicode_longname2cCs&|�dt�|�d�|�dt�dS)Nu01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿÿ/20123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567ÿu01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678ÿr�rrrr
�test_unicode_longname33s
z'UstarUnicodeTest.test_unicode_longname3cCr�)Nu01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345ÿÿu01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456ÿÿr�rrrr
�test_unicode_longname48r�z'UstarUnicodeTest.test_unicode_longname4NcCs�tjtd|jdd��}t�|�}|dur|�|�n|�||j|�Wd�n1s,wY|durdtjtddd��}|D]}|�||j�Wd�dSWd�dS1s]wYdSdS)Nr�r�r�rMr)	rrr�r�r�r�r�rCrt�rrt�excr8r�rrr
r�<s 
���"��z!UstarUnicodeTest._test_ustar_namecCr�r���_test_ustar_linkrrrrr
�test_unicode_link1Kr�z#UstarUnicodeTest.test_unicode_link1cCr�r�r�rrrr
�test_unicode_link2Qr�z#UstarUnicodeTest.test_unicode_link2cCs�tjtd|jdd��"}t�d�}||_|dur|�|�n|�||j|�Wd�n1s/wY|durgtjtddd��}|D]}|�||j�Wd�dSWd�dS1s`wYdSdS)Nr�r�r�r�rMr)	rrr�r�r�r�r�r�rCr�rrr
r�Us"
���"��z!UstarUnicodeTest._test_ustar_linkr	)rrrrr�r�r�r�r�r�r�r�r�r�r�r�rrrr
r�s
r�c@seZdZejZdd�ZdS)�GNUUnicodeTestc
C�ndD]2\}}tjt|dd��}z|�|�}Wnty$|�d�YnwWd�n1s/wYqdS)N))r�upax/bad-pax-���)r4upax/bad-pax-äöür�r�z%unable to read bad GNU tar pax header�rrrr@rrq�rr6rtr8r�rrr
�test_bad_pax_headeris������z"GNUUnicodeTest.test_bad_pax_headerN)rrrrr�r�r�rrrr
r�esr�c@seZdZejZdZdd�ZdS)�PAXUnicodeTestNc
Cr�)N))r�upax/hdrcharset-���)r4upax/hdrcharset-äöür�r�z)unable to read POSIX.1-2008 binary headerr�r�rrr
�test_binary_header~s������z!PAXUnicodeTest.test_binary_header)rrrrr�r�r�r�rrrr
r�wsr�c@s&eZdZdd�Zd	dd�Zdd�ZdS)
�AppendTestBasecCs(t|_tj�|j�rt�|j�dSdSr	)r�rrRrSr'rrrrrr
r9�s�zAppendTestBase.setUpr�c
Cs�tjtdd��K}|�d�}d|_|�|��%}t�|j|��}|�||�Wd�n1s.wYWd�n1s=wYWd�dSWd�dS1sUwYdS)Nr4rr>r�)rrrr@rtrAr�)rr�srcr�rr8rrr
�_create_testtar�s
����"�zAppendTestBase._create_testtarcCs(|�d|j�|�tjtjtd�dS)Nr�rv)r�rr�rr�rr�rrrr
�test_append_compressed�sz%AppendTestBase.test_append_compressedN)r�)rrrr9r�r�rrrr
r��s
r�c@s�eZdZdZddd�Zdgdfdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�
AppendTestNcCsHtj|jd|d��}|�t�d��Wd�dS1swYdS)Nrvror�)rrrr�r�)rr�r8rrr
�
_add_testfile�s"�zAppendTest._add_testfiler�cCsFtj|j|d��}|�|��|�Wd�dS1swYdS)Nro)rrrrCr�)rr^r�r8rrr
r;�s"�zAppendTest._testcCs|��|��dSr	)r�r;rrrr
�test_non_existing�szAppendTest.test_non_existingcCs&t�|jd���|��|��dS)Nr�)rrrr:r�r;rrrr
�
test_empty�szAppendTest.test_emptycCs.t�d�}|�|�|�d�|j|d�dS)Nsrro)rr�r�rer;r�rrr
�test_empty_fileobj�s


zAppendTest.test_empty_fileobjcCsp|��t|jd��}|��}Wd�n1swYt�|�}|�|�|�d�|jddg|d�dS)Nr^rr�r�)r^r�)	r�rrrBrr�r�rer;rrrrr
�test_fileobj�s
�


zAppendTest.test_fileobjcCs$|��|��|jddgd�dS)Nr�r�)r^)r�r�r;rrrr
�
test_existing�szAppendTest.test_existingcCsJt|jd��
}|�|�Wd�n1swY|�tj|j�dSr�)rrr�r�rr�r�)rrrIrrr
�_test_error�s�zAppendTest._test_errorcCrT)Nrc�r�rrrr
�	test_null�r<zAppendTest.test_nullcCrT)N�
r�rrrr
�test_incomplete�r<zAppendTest.test_incompletecCst�d���}|�|�dS)Nr��rr�r�r�rrrr
�test_premature_eof�szAppendTest.test_premature_eofcCs t�d���}|�|d�dS)Nr�r�r�rrrr
�test_trailing_garbage�sz AppendTest.test_trailing_garbagecCrT)Nsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar�rrrr
�test_invalid�r<zAppendTest.test_invalidr	)rrrr�r�r;r�r�r�r�r�r�r�r�r�r�r�rrrr
r��s
	r�c@r�)�GzipAppendTestNr�rrrr
r��r�r�c@r�)�
Bz2AppendTestNr�rrrr
r��r�r�c@r�)�LzmaAppendTestNr�rrrr
r��r�r�c@�$eZdZdd�Zdd�Zdd�ZdS)�
LimitsTestcCs�t�d�}|�tj�t�d�}|�t|jtj�t�d�}|�tj�t�d�}|�t|jtj�t�d�}|�t|jtj�t�d�}d|_|�t|jtj�t�d�}d|_|�t|jtj�dS)	Nr�r�a123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longnamea1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/1234567/longname�123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longnamer�rt� )rr�r�r�r�rr�r�rrrr
�test_ustar_limits�s 






zLimitsTest.test_ustar_limitscCsXt�d�}|�tj�t�d�}d|_|�tj�t�d�}d|_|�t|jtj�dS�Nr�r�rtl)rr�r�r�r�r�r�rrrrr
�test_gnu_limits
	s


zLimitsTest.test_gnu_limitscCsRt�d�}|�tj�t�d�}d|_|�tj�t�d�}d|_|�tj�dSr�)rr�r�r�r�r�rrrr
�test_pax_limits	s


zLimitsTest.test_pax_limitsN)rrrr�r�r�rrrr
r��s
r�c@�<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�MiscTestcCs`|�t�dddd�d�|�t�dddd�d�|�t�ddd�d�|�t�d	dd�d�dS)
Nr��r�r�sfooZfoobarr�rxsfoobar)rCr�stn�ntsrrrr
�test_char_fields&	s����zMiscTest.test_char_fieldscCs�|�t�d�d�|�t�d�d�|�t�d�d�|�t�d�d�|�t�d	�d
�|�t�d�d�|�t�d
�d�|�t�d�d�|�t�d�d�dS)N�0000001r_�7777777��� r�������������������r�����������������r�rs       )rCr�ntirrrr
�test_read_number_fields0	s&�����z MiscTest.test_read_number_fieldscCs�|�t�d�d�|�t�d�d�|�tjdtjd�d�|�tjdtjd�d	�|�tjd
tjd�d�|�tjdtjd�d
�|�tjdtjd�d�|�tjdtjd�d
�|�tjdtjd�d�|�t�tjdtjd��d�dS)Nr_r�r�r�r�r~r�r�r�rr�r�r�r�r�gY�g0Bs�g��������r)rCr�itnr�r�rrrr
�test_write_number_fieldsD	s4����
����"z!MiscTest.test_write_number_fieldscCs�|�t��t�ddtj�Wd�n1swY|�t��t�ddtj�Wd�n1s5wY|�t��t�ddtj�Wd�n1sRwY|�t��t�ddtj�Wd�dS1spwYdS)Nrr�r�l�����l)r�rrr�r�r�rrrr
�test_number_field_limits[	s���"�z!MiscTest.test_number_field_limitscCshd�}tj|t|d�dS)N>8�FIFOTYPEZXGLTYPEZPAX_NAME_FIELDSZExFileObject�mainrr��fully_trusted_filterZSOLARIS_XHDTYPEZ	GNU_TYPESZSubsequentHeaderErrorr��
tar_filterr�ZSUPPORTED_TYPES�SpecialFileError�version�pwd�AbsolutePathErrorr��copyfileobjr9�filemodeZCONTTYPEZTruncatedHeaderErrorr6ZGNUTYPE_LONGLINKZ
REGULAR_TYPES�AbsoluteLinkErrorZEmptyHeaderErrorZInvalidHeaderErrorZcalc_chksums�LinkOutsideDestinationError�FilterErrorr7rNr�Zsymlink_exceptionr��CHRTYPEZ
PAX_FIELDS�grpZ
LENGTH_PREFIXZPOSIX_MAGIC�NUL�OutsideDestinationErrorZGNUTYPE_SPARSErOr�r�Z	GNU_MAGICZAREGTYPEZEOFHeaderError�data_filter�SYMTYPEr�)�not_exported)rZcheck__all__r)rr	rrr
�test__all__e	szMiscTest.test__all__c	Cs�tj�tj�t�d�}|�tj��.}t�d�f}t	j
jjtj
d|d��
t�|�Wd�n1s3wYWd�n1sBwY|�dt|j��dS)Nrzlzma module is not availabler1)rJz?
- method xz: CompressionError('lzma module is not available')
)rRrSrTr+�__file__r�rr�ZCompressionErrorr�rFrGr>rrr�r��	exception)r�fname�excinforIrrr
�.test_useful_error_message_when_modules_missingy	s����z7MiscTest.test_useful_error_message_when_modules_missingN)	rrrr�r�r�r�r
rrrrr
r�$	s

r�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+S),�CommandLineTestcOs2tjddg|�Ri|��\}}}|�tj��d�S)N�-mr�
)rZassert_python_okr�rR�linesepro)r�argsr��rcr��errrrr
�
tarfilecmd�	s�zCommandLineTest.tarfilecmdcGstjddg|�R�S)Nrr)rZassert_python_failure�rrrrr
�tarfilecmd_failure�	sz"CommandLineTest.tarfilecmd_failurecCstt�d�t�d�g}|�tj|�t�|d��}|D]
}|j|tj	�
|�d�qWd�dS1s3wYdS)N�tokenize_tests.txt�9tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txtr�r)rr�rrrrrr�rRrSr�)r�tar_name�files�tfZtardatarrr
�make_simple_tarfile�	s��"�z#CommandLineTest.make_simple_tarfilecCs�t�d�g}|�tj|�t�|d��'}t�d�}|j|t	�
d�d�t�d�}|j|t	�
d�d�Wd�dS1s=wYdS)Nrr��benignrcro�../evil)rr�rrrrrr�r�rr�)rrrrr Zevilrrr
�make_evil_tarfile�	s

"�z!CommandLineTest.make_evil_tarfilecCs||��\}}}|�|d�|�d|���|�d|���|�d|���|�dd�\}}}|�|d�|�|��d�dS)Nrcsusageserrorsrequired�-lr)rrCr��lowerr��strip)rrr�rrrr
�test_bad_use�	szCommandLineTest.test_bad_usecCs0tD]}dD]}|�||�}|�|d�qqdS)N)�-tz--testrc)�testtarnamesrrC�rr�optr�rrr
�test_test_command�	s��z!CommandLineTest.test_test_commandcCs6tD]}dD]}|j|d|dd�}|�d|�qqdS)N��-vz	--verboser'r���PYTHONIOENCODINGsis a tar archive.
)r(rr�r)rrr
�test_test_command_verbose�	s
���z)CommandLineTest.test_test_command_verbosecCs.t�d�}|�d|�\}}}|�d|�|�|d�|�|d�tD]r}|j|d��bt|d��}|��}Wd�n1s?wYz:tt	d��}|�
|dd	��Wd�n1s^wY|�dt	�\}}}|�|d�|�|d�Wt�t	�nt�t	�wWd�n1s�wYq"dS)
N�
zipdir.zipr'� is not a tar archive.rcr_)rr^r�r()
rr�rr�rCr(�subTestrrBr�r�rr)r�zipnamerr�rrrrrrr
�test_test_command_invalid_file�	s*

�����z.CommandLineTest.test_test_command_invalid_filec
Cs�tD]M}t���$}t�|d��}|jdd�Wd�n1s wYWd�n1s/wY|���dd�}dD]}|j||dd�}|�	||�q>qdS)NrMFr�r�r�)r#z--listr.�
r(rZcaptured_stdoutrrr\r�rorrC�rrr�r�expectedr*r�rrr
�test_list_command�	s
������z!CommandLineTest.test_list_commandc
Cs�tD]N}t���$}t�|d��}|jdd�Wd�n1s wYWd�n1s/wY|���dd�}dD]}|j|d|dd�}|�	||�q>qdS)	NrMTr�r�r�r,r#r.r6r7rrr
�test_list_command_verbose�	s
���
���z)CommandLineTest.test_list_command_verbosecCsDt�d�}|�d|�\}}}|�d|�|�|d�|�|d�dS)Nr1r#r2rcr_)rr�rr�rC�rr4rr�rrrr
�test_list_command_invalid_file�	s

z.CommandLineTest.test_list_command_invalid_filec
Cs�t�d�t�d�g}dD]8}z0|j|tg|�R�}|�|d�t�t��}|��Wd�n1s3wYWt�	t�qt�	t�wdS)Nrr)�-cz--createrc)
rr�rr�rCrrr�rr�rrr*r�r8rrr
�test_create_command�	s�
���z#CommandLineTest.test_create_commandc
Cs�t�d�t�d�g}dD]<}z4|j|dtg|�Rddi�}|�d|�t�t��}|��Wd�n1s7wYWt�	t�qt�	t�wdS)Nrrr,r=r/r�s file created.)
rr�rr�r�rrr�rrr>rrr
�test_create_command_verbose�	s��
���z+CommandLineTest.test_create_command_verbosec	Cs�t�d�g}z9|jdtg|�R�}|�|d�t�t��}|��Wd�n1s+wYWt�	t�dSWt�	t�dSt�	t�w)Nrr=rc)
rr�r�dotlessnamerCrrr�rr)rrr�r8rrr
�$test_create_command_dotless_filename
s
��z4CommandLineTest.test_create_command_dotless_filenamec	Cs�tj�td�}t�d�g}z9|jd|g|�R�}|�|d�t�	|��}|�
�Wd�n1s2wYWt�|�dSWt�|�dSt�|�w)Nz.testtarrr=rc)
rRrSrTrQrr�rrCrrr�rr)rrrr�r8rrr
�(test_create_command_dot_started_filename
s
��z8CommandLineTest.test_create_command_dot_started_filenamec
Cs�t�d�t�d�g}tttfD]=}|jsqz1td|j}|jd|g|�R�}|�	|��}|�
�Wd�n1s;wYWt�|�qt�|�wdS)Nrrr
r=)
rr�r#r(r,rr�rrr r�rr)rrZfiletyperr�r8rrr
�test_create_command_compressed
s�
���z.CommandLineTest.test_create_command_compressedc
Cst|�t�dD]0}z(t�t��|�|t�}Wd�n1s wY|�|d�Wt�t�qt�t�wdS)N)�-ez	--extractrc�rr�rr��	tarextdirrrCr1�rr*r�rrr
�test_extract_command)
s
��z$CommandLineTest.test_extract_commandc
Csz|�t�dD]3}z+t�t��|j|dtdd�}Wd�n1s#wY|�d|�Wt�t�qt�t�wdS)Nr,rEr�r.� file is extracted.)rr�rr�rGrr�r1rHrrr
�test_extract_command_verbose3
s

���z,CommandLineTest.test_extract_command_verbosec	Cs�|�t�tj�td�}t�t�z?t�|��"|�	dtddd�|j
dtddddd�}|�d	|�Wd�n1s<wYWt�t�dSWt�t�dSt�t�w)
N�destrEr-z--filterrr&r�r.rJ)
r"r�rRrSrTrGr�rr�rrr�r1)r�destdirr�rrr
�test_extract_command_filter>
s&

���
�
z+CommandLineTest.test_extract_command_filterc	Csl|�t�z*t�t��|�dtd�}Wd�n1swY|�|d�Wt�t�dSt�t�w)NrEZspamdirrcrF)rr�rrr
�(test_extract_command_different_directoryQ
s
�z8CommandLineTest.test_extract_command_different_directorycCsnt�d�}t�t��|�d|�\}}}Wd�n1swY|�d|�|�|d�|�|d�dS)Nr1rEr2rcr_)rr�rr�rGrr�rCr;rrr
�!test_extract_command_invalid_fileZ
s
�z1CommandLineTest.test_extract_command_invalid_fileN)rrrrrrr"r&r+r0r5r9r:r<r?r@rBrCrDrIrKrNrOrPrrrr
r�	s,		



	rc@r�)�ContextManagerTestcCsJt�t��}|�|jd�Wd�n1swY|�|jd�dS)Nzclosed inside runtime context�context manager failed)rrrr�rAr�r�rrr
�
test_basice
s�zContextManagerTest.test_basicc	Csvt�t�}|��|�t��#|�Wd�n1swYWd�dSWd�dS1s4wYdSr	)rrrr:r�rr�rrr
�test_closedj
s
��"�zContextManagerTest.test_closedc	Csl|�t��}t�t��}t�1swYWd�n1s wY|�|jtd�|�|j	d�dS)Nz)wrong exception raised in context managerrR)
r��	Exceptionrrrrr�rr�rA)rr�r8rrr
�test_exceptions
s��
�z!ContextManagerTest.test_exceptioncCsXzt�td��}t�1s
wYWnY|�tj�t�dd�|�|j	d�dS)Nr�rz-context manager wrote an end-of-archive blockrR)
rrr�rUrCrRrSr�r�rAr�rrr
�test_no_eof|
s��zContextManagerTest.test_no_eofcCsFt�td��Wd�n1swY|�tj�t�dd�dS)Nr�rz-context manager wrote no end-of-archive block)rrr�r�rRrSr�rrrr
�test_eof�
s��zContextManagerTest.test_eofc	Cs~ttd��0}ztj|dd��}t�1swYWnY|�|jd�|�|jd�Wd�dS1s8wYdS)Nr�r�r�zexternal file object was closedrR)rr�rrUr�rAr�r�rrr
r��
s�"�zContextManagerTest.test_fileobjN)	rrrrSrTrVrWrXr�rrrr
rQc
s		rQzrequires os.link to be missingc@s�eZdZdd�Ze�eejd�d�dd��Z	e�eejd�d�dd��Z
e�eed	�d
�dd��Ze�eed	�d
�d
d��ZdS)�LinkEmulationTestcCsb|jj|tdd�ttj�t|�d��}|��}Wd�n1s"wY|�t	|�t
�dS)Nr&rKr^)r8rPrQrrRrSrTrBrCrrF)rrtrrrrr
�_test_link_extraction�
s

�z'LinkEmulationTest._test_link_extraction�islinkz3Skip emulation - has os.path.islink but not os.linkcCrT)Nrz�rZrrrr
�test_hardlink_extraction1�
�z+LinkEmulationTest.test_hardlink_extraction1cCrT)Nr~r\rrrr
�test_hardlink_extraction2�
r^z+LinkEmulationTest.test_hardlink_extraction2r�z Skip emulation if symlink existscCrT)Nr�r\rrrr
�test_symlink_extraction1�
r^z*LinkEmulationTest.test_symlink_extraction1cCrT)Nr�r\rrrr
�test_symlink_extraction2�
r^z*LinkEmulationTest.test_symlink_extraction2N)
rrrrZr�rMr�rRrSr]r_r`rarrrr
rY�
s$�
�
�
�rYc@r�)�Bz2PartialReadTestc	svG�fdd�dtj��t�t�d����}tt|�d�D]}ztj	�|d|��|d�Wqtj
y8YqwdS)Ncs0eZdZdZ��fdd�Z��fdd�Z�ZS)z9Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIOFcs4|jrtd��|��t|���k|_t�|��|�S)Nz(infinite loop detected in tarfile.open())�hit_eof�AssertionErrorrfrDr��superrB)rr���	MyBytesIO�	__class__rr
rB�
sz>Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIO.readcsd|_t�|�j|�Sr)rcrererrfrr
re�
sz>Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIO.seek)rrrrcrBre�
__classcell__r�rg)rhr
rg�
srgr�r_r�)rr�r)�compressrr�r��rangerDrr�)rrrrcrrjr
�_test_partial_input�
s��z&Bz2PartialReadTest._test_partial_inputcCrT)NrM�rmrrrr
�test_partial_input�
r<z%Bz2PartialReadTest.test_partial_inputcCrT)Nrrrnrrrr
�test_partial_input_bz2�
r<z)Bz2PartialReadTest.test_partial_input_bz2N)rrrrmrorprrrr
rb�
srbcCsZz
ddl}ddl}Wn
tyYdSw|�d�ddkr dS|�d�ddkr+dSdS)NrF�rootT)r�r�ImportError�getpwuid�getgrgid)r�rrrr
�root_is_uid_gid_0�
s�ru�chownzmissing os.chown�geteuidzmissing os.geteuidc@s�eZdZedd��Zeedd���Zej�	d�ej�	d�ej�	d�dd	����Z
ej�	d�ej�	d�ej�	d�d
d����Ze�e
�d�ej�	d�ej�	d�ej�	d�d
d�����Zej�	d�dd��ZdS)�NumericOwnerTestcCs�t�d�}|ddtj|f|ddtjdf|ddtj|fg}t�td��-}|D]!\}}}}	}
t�|�}||_||_	d	|_
d	|_|	|_|�
||
�q%Wd�tS1sRwYtS)
Nscontent�c�b�M�L�X�Wr�rq)rr�rrOrrr�r�r�r�rrr
r�)�
filename_1�	dirname_1�
filename_2rIr��tarflrtr�r��typ�contentsr�rrr
�_make_test_archive�
s&
�
�
��z#NumericOwnerTest._make_test_archiveccsr�d|_d}d}|}|}tj�||�}t�|||�}t�|��}||||fVWd�dS1s2wYdS)Nrznumeric-owner-testfiler)r�rRrSrTrxr�rr)�mock_geteuidr
r+rr�r�Ztar_filenamer�rrr
�_setup_tests��"�zNumericOwnerTest._setup_testzos.chownzos.chmodz
os.geteuidc
Cs�|�|��\}}}}|j|tddd�|j|tddd�Wd�n1s&wYtj�t|�}tj�t|�}	|jtj�	|dd�tj�	|	dd�gdd�dS)	NTr&�Z
numeric_ownerrLryrzr}r~�Z	any_order)
r�rPrQrRrSrT�assert_has_callsr�rF�call)
rr��
mock_chmod�
mock_chownr�r�_r��f_filename_1�f_filename_2rrr
�test_extract_with_numeric_owner!s 
�
���
�z0NumericOwnerTest.test_extract_with_numeric_ownercCs�|�|��\}}}}|jtddd�Wd�n1swYtj�t|�}tj�t|�}	tj�t|�}
|jtj�	|dd�tj�	|	dd�tj�	|
dd	�gdd
�dS)NTr&r�ryrzr{r|r}r~r�)
r�rrQrRrSrTr�r�rFr�)rr�r�r�r�rr�r�r�Zf_dirname_1r�rrr
�"test_extractall_with_numeric_owner6s���
�z3NumericOwnerTest.test_extractall_with_numeric_ownerz uid=0,gid=0 must be named "root"cCsd|�|��\}}}}|j|tddd�Wd�n1swYtj�t|�}|�|dd�dS)NFr&r�r)r�rPrQrRrSrTZassert_called_with)rr�r�r�r�rr�r�rrr
�"test_extract_without_numeric_ownerOs
��z3NumericOwnerTest.test_extract_without_numeric_ownerc	CsN|�|��\}}}}|�t|j|tdd�Wd�dS1s wYdS)NFT)r�r�rrPrQ)rr�r�rr�rrr
�test_keyword_only_s
�"�z"NumericOwnerTest.test_keyword_onlyN)rrrr�r�rr�r�rFrGr�r�r�rur�r�rrrr
rx�
s.	






�



rxc@rk)�ReplaceTestscCsN|j�d�}|jdd�}|�|jd�|�|jd�|�|j�d�jd�dS)Nr>z
misc/otherrM)r8r@r�rCrt�rr:�replacedrrr
�test_replace_namegs�zReplaceTests.test_replace_namecCsN|j�d�}|��}d|jd<|�|jdd�|�|j�d�jdd�dS)Nr��not-barrr��r8r@r�r�rCr�rrr
�test_replace_deepos
�zReplaceTests.test_replace_deepcCsR|j�d�}|jdd�}d|jd<|�|jdd�|�|j�d�jdd�dS)Nr�F)Zdeepr�rr�r�rrr
�test_replace_shallowws
�z!ReplaceTests.test_replace_shallowc	Cs~|j�d�}dD]4}|j|d��$|jdi|di��}|�t||�d�|�t||�d�Wd�n1s7wYqdS)Nr>)rtrrr�r�r�rr��	attr_namer)r8r@r3r�rCr�r�)rr:r�r�rrr
�test_replace_alls���zReplaceTests.test_replace_allcCsH|j�d�}|�t��|jdd�Wd�dS1swYdS)Nr>i�[)r)r8r@r�rr�)rr:rrr
�test_replace_internal�s"�z"ReplaceTests.test_replace_internalN)rrrr�r�r�r�r�rrrr
r�fs	r�c@steZdZdZedd��Zedd��Zdd�Zedd	��Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�NoneInfoExtractTestsNcsjtjtddd�}t�t�d�_d|_|j�j�j	d�|�
�t�fdd�t��j��d	�D���_
dS)
NrMr4r5Zextractall_ctrlrrKc3s�|]	}|��j�VqdSr	)�relative_to�control_dir�r#�prXrr
�	<genexpr>�s
�
�
�z2NoneInfoExtractTests.setUpClass.<locals>.<genexpr>�**/*)rrrr�r�rQr�rr�extraction_filterr:�set�glob�
control_paths)rUr8rrXr
rV�s�zNoneInfoExtractTests.setUpClasscCrWr	)�shutilr1r�rXrrr
rY�rZz"NoneInfoExtractTests.tearDownClasscs4t�fdd�t����d�D��}|�|j|�dS)Nc3s�|]}|���VqdSr	)r�r��r�rr
r��s
��
�z;NoneInfoExtractTests.check_files_present.<locals>.<genexpr>r�)r�r�r�r�rCr�)rr�Z	got_pathsrr�r
�check_files_present�s�z(NoneInfoExtractTests.check_files_presentcgs��t�t�d}d|j_|j��D]
}|D]}t||d�qqt�|��|jj	|dd�|�
|�|VWd�dS1s@wYdS)NZextractall_nonerr&rK)r�r�rQr8rr��setattrrr:rr�)r�
attr_namesr2r:r�rrr
�extract_with_none�s��
"�z&NoneInfoExtractTests.extract_with_nonecCs�t�t���j}|�d��I}t�|��d�D]7}|j|d��'z|��j}Wnty4|�	�s2�Yn
w|�
|��j|�Wd�n1sHwYqWd�dS1sYwYdS)Nrr��rS)r�r�rQr.�st_mtimer�r�r3r�
is_symlinkZassertGreaterEqual)rZnowr2rSrrrr
�test_extractall_none_mtime�s"������"�z/NoneInfoExtractTests.test_extractall_none_mtimec
Cs�t�t���j}t�t�d}|�d�|��j}|�d��E}t�|��d�D]3}|j|d��#|�	�r>|�
|��j|�n
|��rK|�
|��j|�Wd�n1sUwYq'Wd�dS1sfwYdS)N�regular_filerrr�r�)r�r�rQr.r/�
write_textr�r�r3�is_dirrC�is_file)rZdir_moder�Zregular_file_moder2rSrrr
�test_extractall_none_mode�s$

�����"�z.NoneInfoExtractTests.test_extractall_none_modecC�0|�d��	Wd�dS1swYdS)Nr��r�rrrr
�test_extractall_none_uid��"�z-NoneInfoExtractTests.test_extractall_none_uidcCr�)Nr�r�rrrr
�test_extractall_none_gid�r�z-NoneInfoExtractTests.test_extractall_none_gidcCr�)Nrr�rrrr
�test_extractall_none_uname�r�z/NoneInfoExtractTests.test_extractall_none_unamecCr�)Nrr�rrrr
�test_extractall_none_gname�r�z/NoneInfoExtractTests.test_extractall_none_gnamecCs6|�dddd��	Wd�dS1swYdS)Nr�r�rrr�rrrr
�test_extractall_none_ownership�s"�z3NoneInfoExtractTests.test_extractall_none_ownership)rrrr�rhrVrYr�rr�r�r�r�r�r�r�r�rrrr
r��s 



r�c@�eZdZdZdS)�NoneInfoExtractTests_DatarN�rrrr�rrrr
r��rPr�c@r�)�!NoneInfoExtractTests_FullyTrustedr&Nr�rrrr
r���r�c@r�)�NoneInfoExtractTests_Tarr8Nr�rrrr
r��rPr�c@rN)�NoneInfoExtractTests_DefaultNr�rrrr
r��r�r�c@r�)�NoneInfoTests_MisccCst��}tjtjtjfD]~}|j|d��ntj|d|d�}|�t	�}z|�
|�Wnty9|tjkr6n�YnBwdD]>}|j|d��.|jdi|di��}|�
t|���
|�
|�Wd�n1sfwYWd�n1suwYq<Wd�n1s�wYqdS)N)�	tarformatr�)r�rr�)rrr�r�rrr�r)rr�rr�r�r�r3rr�rr�rUr�r�r)r�bior�r8rHr�r�rrr
�test_add�s:�

����������zNoneInfoTests_Misc.test_addc
Cs�dhdhdhdhdhdhddhddhfD�]�}|j|d����tjtdd	����}tjt��d
dd�}t�t	d
|��|�
�Wd�n1sHwY|��D]
}|D]}t||d�qUqQtjt��d
dd�}t�t	d
|��|�
�Wd�n1swYt
|������|�������D�]*\}}|dhkr�t�d|�r�|�|d�q�|dhkr�t�d|�r�|�|d�q�|dhkr�t�d|�r�|�|d�q�|dhkr�|�d�r�|�d�\}	}
|�d�\}}|�||
�|�|d�q�|dhk�r|�d��r|�d�\}	}
|�d�\}}|�||	�|�|d�q�|dhk�rC|�d��rC|�d�\}	}
|�d�\}}|�||
�|�|d�q�|dhk�rj|�d��rj|�d�\}	}
|�d�\}}|�||	�|�|d�q�|ddhk�r�|�d��r�|�d�\}	}
|�d�\}}|�||
�|�|d�q�|ddhk�r�|�d��r�|�d�\}	}
|�d�\}}|�||	�|�|d�q�|�||�q�Wd�n	1�s�wYWd�n	1�s�wYqdS)Nrrr�r�rr)r�r4rr�r�r�r�s2003-01-\d\ds
????-??-??s\d\d:\d\d:\d\ds??:??:??s.([r-][w-][x-]){3}s
??????????)�tarfile/�lars/�foo/�/s[0-9]+)�/tarfile�/users�/bar�1000/sNone�/100)r�r�r�r�)r�r�r�r�)r3rrrrrVr�rr�r�r\r�r�rCr�r�r��re�matchrCrr��endswith)
rr�r8Ztio_prevr:r�Ztio_newr8�gotZexp_userZ	exp_groupZgot_userZ	got_grouprrr
r�s�
��
��
�������������zNoneInfoTests_Misc.test_listN)rrrr�r�rrrr
r��sr�cCs|dd�}tjdd�|dtjdd�|dBtjdtjtjBtjd�|dBtjdd�|dBtjdd�|d	BtjdtjtjBtjd�|d
Btj	dd�|dBtj
dd�|dBtjdtjtjBtjd
�|dB}t�
|�dd�|dd�ks�J�|S)z�Inverse of `stat.filemode` (for permission bits)

    Using mode strings rather than numbers makes the later tests more readable.
    r_Nr)rM�-)r�r�)rcr�ri�Srbr���r��)rcr�r��Tr�)r.�S_IRUSR�S_IWUSR�S_IXUSR�S_ISUID�S_IRGRP�S_IWGRP�S_IXGRP�S_ISGID�S_IROTH�S_IWOTH�S_IXOTH�S_ISVTXr�)rZstr_mode�resultrrr
�_filemode_to_intXsH�
�����
���
��
����"r�c@sFeZdZdZdd�Zdd�Zdd�Zdddddd	�d
d�Zdd
�ZdS)�ArchiveMakerz�Helper to create a tar file with specific contents

    Usage:

        with ArchiveMaker() as t:
            t.add('filename', ...)

        with t.open() as tar:
            ... # `tar` is now a TarFile with 'filename' in it!
    cCst��|_dSr	)rr�r�rrrr
r@r<zArchiveMaker.__init__cCstjd|jd�|_|S)Nr�r)rrr��tar_wrrrr
�	__enter__�szArchiveMaker.__enter__cGs |j��|j��|_d|_dSr	)r�r:r�r�r�)rr�rrr
�__exit__�s

zArchiveMaker.__exit__N)r
�
symlink_to�hardlink_torrEc
Ks�t|�}t�|�jdi|��}|dur||_|rt|�|_|dur)tj}t|�|_|dur5tj	}t|�|_|�
d�rA|durAtj}|durH||_|�
�rUt�t|j��}	nd}	|j�||	�dS)z5Add a member to the test archive. Call within `with`.Nr�r)r�rr�r�rEr�rrr�r9r�rr
r\rr�r�r�r�)
rrtr
r�r�rrEr�rHr�rrr
r��s(


zArchiveMaker.addcKs t�|j�}tjdd|i|��S)z9Open the resulting archive as TarFile. Call after `with`.r�Nr)rr�r�rr)rr�r�rrr
r�szArchiveMaker.open)	rrr�__doc__r@r�r�r�rrrrr
r�ts
�r�c@seZdZe�e�dZedZedd��Z			d=dd�Z
d>d	d
�Zdd�Zd
d�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Z d5d6�Z!d7d8�Z"d9d:�Z#d;d<�Z$dS)?�TestExtractionFilters�outerdirrLccs��t�|j��]z
|j|j|d�Wnty+}z
||_t�|_WYd}~nd}~wwd|_t|j�	d��|_|j�
|j�z	dVW|��n|��w|jrT|j�|�|jt��Wd�dS1sgwYdS)a}Extracts `tar` to `self.destdir` and allows checking the result

        If an error occurs, it must be checked using `expect_exception`

        Otherwise, all resulting files must be checked using `expect_file`,
        except the destination directory itself and parent directories of
        other files.
        When checking directories, do so before their contents.
        rKNr�)
rr:r�rrMrU�raised_exceptionr��expected_pathsr��discardr:rC)rr8rLr�rrr
�
check_context�s&���"�z#TestExtractionFilters.check_contextNc
Csb|jr|j�t�tj�|j|��}|�||j�|j�	|�|dur9t
jdkr9t�
t�|��j��}|�||�|durJt|t�rJ|�d�rJtj}|durg|j|��}t�|�}||krf|�|�|��n/|tjksp|durx|�|���n|tjkr�|�|���n|tjkr�|�|���nt|��|dur�|�|��j|�|j D]}	|j�!|	�q�dS)z'Check a single file. See check_context.Nr'r�)"r�r�r�rRrS�normpathrMr�r��remover�r-r.r��S_IMODEr/rCr)r�r�rr�readlinkr��samefilerOr�r�r��is_fifo�NotImplementedErrorr��parentsr�)
rrtr
r�rrErSr�r8�parentrrr
�expect_file�s8
�


�z!TestExtractionFilters.expect_filer
cCsF|�||��|jdur|j�Wd�n1swYd|_dSr	)r�r�)r�exc_typeZ
message_rerrr
�expect_exception�s
��
z&TestExtractionFilters.expect_exceptionc	Csxt��
}|�d�Wd�n1swYdD]}|�|��|��
|�d�Wd�n1s4wYqdS)Nz
benign.txt)r&r8r�r�r�r�rr�r�arcrLrrr
�test_benign_file�s����z&TestExtractionFilters.test_benign_filec	Cs�t��}|�|jd�Wd�n1swY|�|��d��
|�d�Wd�n1s3wYdD]:}|�|��|��(t|j��d�r^t|j��d�}|�|�d��n|�	t
jd�Wd�n1sowYq:dS)Nzescaped.evilr&z../escaped.evil�r8rr�z
/escaped.evilz+['"].*escaped.evil['"] has an absolute path)r�r�r�r�rrr�r�lstriprrr�)rr
rLZouterdir_strippedrrr
�
test_absolute
s&�������z#TestExtractionFilters.test_absolutecCst��}|jddd�|jddd�|�d�Wd�n1s!wYt��r�|�|��d��.|jdurF|�t�	Wd�dS|j	ddd�|j	ddd�|�	d�Wd�n1scwY|�|��d	��|�t
jd
�Wd�n1s�wY|�|��d��|�t
jd�Wd�dS1s�wYdS|�|��d��
|�	d�Wd�n1s�wY|�|��d	��
|�	d�Wd�n1s�wY|�|��d��|�	d�Wd�dS1s�wYdS)
N�currentr
�r�rz
current/..�parent/evilr&r!r8�T'parent/evil' would be extracted to ['"].*evil['"], which is outside the destinationrzK'parent' would link to ['"].*outerdir['"], which is outside the destination)
r�r�r�can_symlinkr�rr�rr`rrrr�rr
rrr
�test_parent_symlink
sH�

�	�
���"���"�z)TestExtractionFilters.test_parent_symlinkcCsft��rXtj�td�}t�|�t�dtj�|d��ttj�|ddd�d��Wd�n1s2wYtj�	tj�|d��rEd}ntj�	tj�|dd��rTd}nt
d	��t��}|jddd
�|jddd
�|�d�Wd�n1sywY|�
|��d
��*t��r�|jddd
�|jddd
�|�d�n
|�d�|�d�Wd�n1s�wY|�
|��d��t��r�|�tjd�n
|�d�|�d�Wd�n1s�wY|�
|��d��:t���r|r�|�tjd�n"|�tjd�n|�d�|�d�Wd�dSWd�dSWd�dS1�s,wYdS)NZresolution_testr
rrr�r�TFz#Could not determine link resolutionrzcurrent/parentrr&rr!zcurrent/r8rrzS'current/parent' would link to ['"].*outerdir['"], which is outside the destination)rrrRrSrTrQr�r�rr'rdr�r�r�rrrrr)rZtestpathZdotdot_resolves_earlyr
rrr
�test_parent_symlink2Q
sl
��

��	�

��
��
��$�z*TestExtractionFilters.test_parent_symlink2cCs4t��}|jd|jd�|�d�Wd�n1swY|�|��d��t��r;|jd|jd�|�d�n|�d�Wd�n1sJwY|�|��d��t��rd|�t	j
d�n|�d�Wd�n1sswY|�|��d��|�t	jd	�Wd�dS1s�wYdS)
Nrrrr&r!r8rr�&'parent' is a link to an absolute path)r�r�r�r�rrrrrrrrrrrr
�test_absolute_symlink�
s4�
���
��
�"�z+TestExtractionFilters.test_absolute_symlinkcCs�t��}|jd|jdd�Wd�n1swY|�|��d��|�td�Wd�n1s6wY|�|��d��|�td�Wd�n1sTwY|�|��d��|�tjd�Wd�dS1stwYdS)	Nrr��r�r&z.*foo. not foundr8rr)	r�r�r�r�rrrrrrrrr
�test_absolute_hardlink�
s����"�z,TestExtractionFilters.test_absolute_hardlinkc	Cs�t��}|jddd�Wd�n1swYz4|j|��dd��!t��r=t|jt�r5|�	t�n	|j
ddd�n	Wd�n1sHwYWn	tyWYnwdD]!}|�|��|��|�	tjd�Wd�n1svwYqZdS)N�../mooz..//tmp/moorr&rKrzH'../moo' would be extracted to '.*moo', which is outside the destination)
r�r�r�rrrr)r�r`rrrrr	rrr
�test_sly_relative0�
s2���������z(TestExtractionFilters.test_sly_relative0c	Cs�t��}|�d�|jddd�Wd�n1swY|�|��d��|jdtjd�t��r;|jdd	d�Wd�n1sEwYd
D]!}|�|��|��|�	tj
d�Wd�n1shwYqLdS)Nztmp/z
tmp/../../mooztmp/../..//tmp/moorr&�tmp�r
rztmp/../../tmp/moorzU'tmp/../../moo' would be extracted to ['"].*moo['"], which is outside the destination)r�r�r�rrrrrrrrr	rrr
�test_sly_relative2�
s&
�������z(TestExtractionFilters.test_sly_relative2c	Cs�t��(}|jddd�|jdtj�dd�d�|jdtj�d	dd�d
�Wd�n1s.wYdD]<}|�|��|��*|jddd�|jddd�t�	�r[|jdddd
�n|jddd�Wd�n1slwYq5dS)N�targetdir/targetr�r��linkdir/hardlinkZ	targetdirr�r�linkdir/symlinkrr�r8rr&z../targetdir/target�rEr��
r�r�rRrSrTr�rrrrr	rrr
�test_deep_symlink
s,�
��	�����z'TestExtractionFilters.test_deep_symlinkc	Cs$t��0}|jddd�|jdtj�dd�d�|jddd	�|jd
dd�|jddd�Wd�n1s6wYd
D]R}|�|��|��@|jddd	�|jd
dd	�|jddd	�t�	�rr|jdddd�|jdddd�n|jddd	�|jddd	�Wd�n1s�wYq=dS)Nr"ZhardlinkrZsymlink2ZlinkdirZ	hardlink2r r�r�r!rzlinkdir/hardlink2r#r$r%r	rrr
�test_chains!s6��������z!TestExtractionFilters.test_chainscCs�t��2}|jddd�|jddd�|jddd�|jdd	d�|jd
dd�|jdd
d�Wd�n1s8wYtj�td�}t|d��Wd�n1sTwYt�|t�|�j	tj
B�t�|�j	tj
@}t�|�t�|�t�|t�|�j	tj
B�t�|�j	tj
@}t�
|�|�|��d��F|r�|jddd�n|jddd�|jddd�|jddd�|jdd	d�|jd
dd�|r�|jdd
d�n|jddd�Wd�n1s�wY|�|��d��2|jddd�|jddd�|jddd�|jdd	d�|jd
dd�|jddd�Wd�n	1�s(wY|�|��d��?t�t�|j��j	��}|jddd�|jddd�|jddd�|jddd�|jd
dd�|jd|d�Wd�dS1�sxwYdS)NZall_bitsz
?rwsrwsrwtr�Z	perm_bitsz
?rwxrwxrwxZexec_group_otherz
?rw-rwxrwxZread_group_onlyz
?---r-----Zno_bitsz
?---------zdir/z
?---rwsrwtztmp.filer�r&z
?rwsrwsrwxz
?---rwsrwxr8z
?rwxr-xr-xz
?rw-r-xr-xz
?---r-xr-xrz
?rw-r--r--z
?rw-r-----z
?rw-------)r�r�rRrSrTrQr�chmodr.r/r�rr�r�r�rr�r�r�)rr
Ztmp_filenameZhave_sticky_filesZhave_sticky_dirsZnormal_dir_moderrr
�
test_modes:sf�
�


���
�$�z TestExtractionFilters.test_modesc	Cs�t��}|jdtjd�Wd�n1swYdD])}|�|��|��ttd�r6|jdtjd�n	Wd�n1sAwYq|�|��d��|�	tj
d�Wd�dS1sbwYdS)Nr�r)r&r8�mkfiforz'foo' is a special file)r�r�rr�r�rr�rRrrr�r	rrr
�	test_pipess"�
����"�zTestExtractionFilters.test_pipec	Cs�tjtjtjfD]Q}t�d�}||_t�|d�}|�||�t�|d�}|�	|j|�|�
tj��}t�|d�Wd�n1sBwY|�
|jjtj�|�	|jjjd�qdS)Nr�r)rr�rrNr�r
r�r�r�rCr�r�rr�rrHrt)rZspecial_typerHZtrustedr8�cmrrr
�test_special_files�s
��z(TestExtractionFilters.test_special_filescCsXtj�t��}|��D]}t�|d�}|�||�qWd�dS1s%wYdS�Nr)rrrrr�r�r��rr8rHZfilteredrrr
�test_fully_trusted_filter�s�"�z/TestExtractionFilters.test_fully_trusted_filtercCsltj�t��&}|��D]}t�|d�}|�|j|j�|�|j|j�qWd�dS1s/wYdSr.)	rrrrr�r�r�rtr
r/rrr
�test_tar_filter�s�"�z%TestExtractionFilters.test_tar_filterc
Cs�tj�t��3}|��D]%}zt�|d�}Wn
tjyYqw|�|j|j�|�|j	|j	�qWd�dS1s<wYdSr.)
rrrrr�rrr�rtr
r/rrr
�test_data_filter�s��"�z&TestExtractionFilters.test_data_filterc	Cs�t��
}|�d�Wd�n1swYt�|��.|�|��d��
|�d�Wd�n1s6wYWd�dSWd�dS1sNwYdS)z6Ensure the default filter does not warn (like in 3.12)r�N)r�r�rZcheck_no_warningsr�rrrrrr
�test_default_filter_warns_not�s���"�z3TestExtractionFilters.test_default_filter_warns_notcCsVt�td�}dd�}||_|�|d��|�d�Wd�dS1s$wYdS)NrMcS�|jdkr|SdS�Nr>rM�rHrSrrr
�
strict_filter��
zSTestExtractionFilters.test_change_default_filter_on_instance.<locals>.strict_filterr>)rrrr�r�r)rr8r7rrr
�&test_change_default_filter_on_instance�s"�z<TestExtractionFilters.test_change_default_filter_on_instancec	Cs�dd�}t�td�}t�tjdt|���,|�|d��
|�d�Wd�n1s+wYWd�dSWd�dS1sCwYdS)NcSr4r5rMr6rrr
r7�r8zPTestExtractionFilters.test_change_default_filter_on_class.<locals>.strict_filterrMr�r>)rrrrr�r�r�r)rr7r8rrr
�#test_change_default_filter_on_class�s
���"�z9TestExtractionFilters.test_change_default_filter_on_classcCsXGdd�dtj�}|td�}|�|d��|�d�Wd�dS1s%wYdS)Nc@rR)zQTestExtractionFilters.test_change_default_filter_on_subclass.<locals>.TarSubclasscSs|jdkr|SdSr5rM�rrHrSrrr
r��r8zcTestExtractionFilters.test_change_default_filter_on_subclass.<locals>.TarSubclass.extraction_filterNr�rrrr
�TarSubclass�rXr<rMr>)rrrr�r)rr<r8rrr
�&test_change_default_filter_on_subclass�s

"�z<TestExtractionFilters.test_change_default_filter_on_subclasscCsNt�td�}d|_|�|d��|�t�Wd�dS1s wYdS)NrMr)rrrr�r�rrr�rrr
�$test_change_default_filter_to_string�s
"�z:TestExtractionFilters.test_change_default_filter_to_stringcs��fdd�}t��}|�d�|�d�|�d�Wd�n1s#wY��|��|����d���d�Wd�dS1sFwYdS)Ncs6��|�j�|jdkr|jdd�S|jdkrdS|S)N�	move_this�movedrM�ignore_this)r�rMrtr�r6rrr
�
custom_filter�s

z?TestExtractionFilters.test_custom_filter.<locals>.custom_filterr?rAZkeepr@r)rrBr
rrr
�test_custom_filter�s

�
"�z(TestExtractionFilters.test_custom_filtercCspt��
}|�d�Wd�n1swY|�|��d��|�t�Wd�dS1s1wYdS)Nr�zbad filter name)r�r�r�rrrrrrr
�test_bad_filter_name�s�"�z*TestExtractionFilters.test_bad_filter_namec	Cs�Gdd�d�}t��}|�d�|jddd�|�d�Wd�n1s&wY|��%}|�|��|��
|�d�Wd�n1sGwYWd�n1sVwY|�|jd�|�|jd�dS)	Nc@r�)zBTestExtractionFilters.test_stateful_filter.<locals>.StatefulFiltercSs
d|_|Sr`)�num_files_processedrrrr
r��szLTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__enter__cSs:zt�||�}WntjyYdSw|jd7_|S)Nr_)rrrrEr;rrr
�__call__s�zKTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__call__cWs
d|_dS)NT)�done)r�exc_inforrr
r�
�
zKTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__exit__N)rrrr�rFr�rrrr
�StatefulFilter�srJZgoodZbadr�rrbT)r�r�r�rrrCrErG)rrJr
rBrrr
�test_stateful_filter�s
����z*TestExtractionFilters.test_stateful_filtercCs^dd�}dd�}dd�}dd�}d	d
�}t��
}|�d�Wd�n1s'wY|�|jdd
�|��
|�d�Wd�n1sFwY|�|jdd
�|��
|�d�Wd�n1sewY|�|jdd
�|��
|�d�Wd�n1s�wY|�|jdd
�|��|�tj�Wd�n1s�wY|�|jdd
�|��
|�t�Wd�n1s�wY|�|jdd
�|��
|�d�Wd�n1s�wY|�|jdd
�|��|�tj	�Wd�n	1�swY|�|jdd
�|��
|�t
�Wd�n	1�s#wY|�|jdd
�|��|�tj�Wd�n	1�sDwY|�|jdd
�|��
|�t�Wd�n	1�sdwY|�|jdd
�|��|�tj�Wd�n	1�s�wY|�|jdd
�|��|�tj	�Wd�n	1�s�wY|�|jdd
�|��
|�t
�Wd�n	1�s�wY|�|jdd
�|��|�tj�Wd�n	1�s�wY|�|jdd
�|��
|�t�Wd�n	1�swY|�|jdd
�|��|�t�Wd�dS1�s(wYdS)NcS�
t�d��)Nzfailed with ExtractError)r�ExtractErrorr6rrr
�extracterror_filterrIzBTestExtractionFilters.test_errorlevel.<locals>.extracterror_filtercSrL)Nzfailed with FilterError)rrr6rrr
�filtererror_filterrIzATestExtractionFilters.test_errorlevel.<locals>.filtererror_filtercS�td��)Nzfailed with OSError)rr6rrr
�oserror_filter�z=TestExtractionFilters.test_errorlevel.<locals>.oserror_filtercSrL)Nzfailed with base TarError)r�TarErrorr6rrr
�tarerror_filterrIz>TestExtractionFilters.test_errorlevel.<locals>.tarerror_filtercSrP)Nzfailed with ValueError)rr6rrr
�valueerror_filter rRz@TestExtractionFilters.test_errorlevel.<locals>.valueerror_filterr�rr
r_rbzboo!)
r�r�r�rrrrrSrrrrMr)rrNrOrQrTrUr
rrr
�test_errorlevelsp����������������$�z%TestExtractionFilters.test_errorlevel)NNNN)r
)%rrrr�r�rQr�rMrr�rrrrrrrrrrr&r'r)r+r-r0r1r2r3r9r:r=r>rCrDrKrVrrrr
r��sD

�
(2V"9
r�c	Cs�t�t�t�t�tgattd��}|��}Wd�n1s!wYt	t
tfD]-}|jrXt�|j�t�|j�|�|jd��
}|�
|�Wd�n1sSwYq+dS)Nr^r�)rrrQrR�makedirsrr(rrBr#r(r,r�r�)rIr�cr8rrr
�setUpModule_s


����rYcCstj�t�r
t�t�dSdSr	)rRrSr'rQrr1rrrr
�tearDownModuleps�rZ�__main__)�r�rRrZhashlibr�
contextlibr�randomrr�r�r��warningsr.r�Z
unittest.mockrr�rZtest.supportrrrr&rrrHr)r/rrSr�ZTESTFNrQrGr�rrTr%r*r.r�rArFr�rZ
requires_gzipr#Zrequires_bz2r(Z
requires_lzmar,r2ZTestCaser=r�r�r�r�r�r�r�r�r�rOrQrSrYrZrhrirjrlrvrwr{r|r�r�r�r�r�rrrrr)r/r2r4rLrRrirqrsrvr�r�rwr}r�r�r�r�r�r�r�r�r�r�r�rrQrMrYrbrurxr�r�r�r�r�r�r�r�r�r�rYrZrr�rrrr
�<module>s6����
��
Pw=(a8<-:'R.Z			*QO@;b^:!z(^��^6:
�