o
    HXhq                    @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ zd dlZW n eyk   dZY nw zd dlZW n ey}   dZY nw zd dlZW n ey   dZY nw zd dlZW n ey   dZY nw d	d
 Zejej d Z!e!d Z"e#dZ$ej%e!dZ&ej%e!dZ'ej%e!dZ(ej%e!dZ)ej%e!dZ*dZ+dZ,dZ-G dd dZ.e/ G dd dZ0e1 G dd dZ2e3 G dd dZ4G dd de.Z5G d d! d!e5ej6Z7G d"d# d#e0e7Z8G d$d% d%e2e7Z9G d&d' d'e4e7Z:G d(d) d)e5ej6Z;G d*d+ d+e0e;Z<G d,d- d-e2e;Z=G d.d/ d/e4e;Z>G d0d1 d1e5Z?G d2d3 d3e?Z@G d4d5 d5e@ej6ZAG d6d7 d7e0e@ej6ZBG d8d9 d9e2e@ej6ZCG d:d; d;e4e@ej6ZDG d<d= d=e?ej6ZEG d>d? d?e0eEZFG d@dA dAe2eEZGG dBdC dCe4eEZHG dDdE dEe.ej6ZIG dFdG dGe0eIZJG dHdI dIe2eIZKG dJdK dKe4eIZLG dLdM dMe5ej6ZMG dNdO dOZNG dPdQ dQeNe5ej6ZOG dRdS dSeNe5ej6ZPG dTdU dUe.ZQG dVdW dWeQej6ZRG dXdY dYe0eRZSG dZd[ d[e2eRZTG d\d] d]e4eRZUG d^d_ d_eQej6ZVG d`da dae0eVZWG dbdc dce2eVZXG ddde dee4eVZYG dfdg dgej6ZZG dhdi dieQej6Z[G djdk dkeQej6Z\G dldm dme0e\Z]G dndo doe2e\Z^G dpdq dqe4e\Z_G drds dse\Z`eaebedtduG dvdw dwej6ZcG dxdy dyeZZdG dzd{ d{ZeG d|d} d}eeej6ZfG d~d deeej6ZgG dd deeej6ZhG dd dZiG dd deiej6ZjG dd de0eiej6ZkG dd de2eiej6ZlG dd de4eiej6ZmG dd dej6ZnG dd dej6ZoG dd dej6ZpG dd dej6ZqerebedtdG dd de5ej6ZsG dd de2ej6Ztdd ZueaebeddeaebeddG dd dej6ZvG dd de5ej6ZwG dd de5ZxG dd dexej6ZyG dd dexej6ZzG dd dexej6Z{G dd dexej6Z|G dd dej6Z}dd Z~G dd dZG dd dej6ZG dd dej6Zdd Zdd Zedkre  dS dS )    N)sha256)contextmanager)Random)support)	os_helper)script_helper)warnings_helperc                 C   s   t |  S N)r   	hexdigest)data r   ;/opt/python-3.10.19/usr/lib/python3.10/test/test_tarfile.py	sha256sum)   s   r   z-tardirz-extract-testztesttar.tarztesttar.tar.gzztesttar.tar.bz2testtar.tar.xzztmp.tarZtesttar    Z@e09e4bc8b3c9d9177e77256353b36c159f5f040531bbd4b024a8f9b9196c71ceZ@4f05a776071146756345ceee937b33fc5644f5a96b9780d1c7d6a32cdf164d7bc                   @   s.   e Zd ZeZdZejZej	j
Z
edd ZdS )TarTest c                 C   s   | j | j S r	   )prefixsuffixselfr   r   r   modeD   s   zTarTest.modeN)__name__
__module____qualname__tarnamer   ioFileIOopentarfileTarFiletaropenpropertyr   r   r   r   r   r   >   s    r   c                   @   *   e Zd ZeZdZerejndZe	j
jZdS )GzipTestgzN)r   r   r   gzipnamer   r   gzipZGzipFiler   r   r    Zgzopenr!   r   r   r   r   r$   H   
    r$   c                   @   r#   )Bz2Testbz2N)r   r   r   bz2namer   r   r*   BZ2Filer   r   r    Zbz2openr!   r   r   r   r   r)   O   r(   r)   c                   @   r#   )LzmaTestxzN)r   r   r   xznamer   r   lzmaLZMAFiler   r   r    xzopenr!   r   r   r   r   r-   V   r(   r-   c                   @   s    e Zd ZdZdd Zdd ZdS )ReadTestr:c                 C   s   t j| j| jdd| _d S )N	iso8859-1r   encodingr   r   r   r   tarr   r   r   r   setUpb   s   zReadTest.setUpc                 C   s   | j   d S r	   )r9   closer   r   r   r   tearDownf      zReadTest.tearDownN)r   r   r   r   r:   r<   r   r   r   r   r3   ^   s    r3   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zeeedo?eedddd ZdS )UstarReadTestc                 C   sl   | j d}| j | }| }| t||jd | t|td W d    d S 1 s/w   Y  d S )Nustar/regtyperegular file extraction failed)	r9   	getmemberextractfilereadassertEquallensizer   sha256_regtyper   tarinfofobjr   r   r   r   test_fileobj_regular_filel   s   "z'UstarReadTest.test_fileobj_regular_filec                 C   s   | j jdtdd | j d}ttjtdd}| }W d    n1 s(w   Y  | j 	|+}t
|}| }| ||d | t|dd | |d dd W d    d S 1 saw   Y  d S )	Nr?   r   filterrzfileobj.readlines() failedr   S   zOI will gladly admit that Python is not the fastest running scripting language.
)r9   extractTEMPDIRrA   r   ospathjoin	readlinesrB   r   TextIOWrapperrD   rE   )r   rI   fobj1lines1rJ   fobj2lines2r   r   r   test_fileobj_readlinesu   s&   


"z$UstarReadTest.test_fileobj_readlinesc                 C   s   | j jdtdd | j d}ttjtdd}| }W d    n1 s(w   Y  | j 	|}t
t|}| ||d W d    d S 1 sMw   Y  d S )Nr?   r   rL   rN   zfileobj.__iter__() failed)r9   rQ   rR   rA   r   rS   rT   rU   rV   rB   listr   rW   rD   )r   rI   rX   rY   rZ   r[   r   r   r   test_fileobj_iter   s   
"zUstarReadTest.test_fileobj_iterc           	      C   s.  | j jdtdd ttjtdd}| }W d    n1 s"w   Y  | j d}| j 	|}| }|
d | d| d |
dd | d| d |
d	d
 | d| d |
dd
 | d| d |d}| ||dd d |
dd | |j| d | | dd |
|j d | d| d |
d | }|
d | }| ||d |
d | t| | d |
d | t| d | d |
d | }| | |t|d  d W d    d S 1 sw   Y  d S )Nr?   r   rL   rbr   zseek() to file's start failedi   z"seek() to absolute position failedi       z+seek() to negative relative position failedz+seek() to positive relative position failed
   i
  zread() after seek failed   zseek() to file's end failed    z0read() at file's end did not return empty stringz$relative seek() to file's end failed   zreadlines() after seek failedztell() after readline() failedz)tell() after seek() and readline() failedzread() after readline() failed)r9   rQ   rR   r   rS   rT   rU   rC   rA   rB   seekrD   tellrF   rV   rE   readline)	r   rJ   r   rI   textss1s2liner   r   r   test_fileobj_seek   sz   








$zUstarReadTest.test_fileobj_seekc              	   C   s   | j d;}t|}| d}| t|t z|	d W n t
y0   | d Y n	w W d    d S W d    d S 1 sDw   Y  d S )Nr?   r5   d   zseeking failed in text mode)r9   rB   r   rW   rC   encoderD   r   rG   rf   AttributeErrorfailr   rJ   r   r   r   r   test_fileobj_text   s   
	"zUstarReadTest.test_fileobj_textc              	   C   s~   | j |/}| j |}| |j|j W d    n1 s w   Y  W d    d S W d    d S 1 s8w   Y  d S r	   )r9   rB   rD   name)r   Zlnktyperegtypeabr   r   r   _test_fileobj_link   s   
Pz UstarReadTest._test_fileobj_linkc                 C      |  dd d S )Nustar/lnktyper?   ry   r   r   r   r   test_fileobj_link1      z UstarReadTest.test_fileobj_link1c                 C   rz   )N./ustar/linktest2/lnktypeustar/linktest1/regtyper|   r   r   r   r   test_fileobj_link2      z UstarReadTest.test_fileobj_link2c                 C   rz   )Nustar/symtyper?   r|   r   r   r   r   test_fileobj_symlink1   r~   z#UstarReadTest.test_fileobj_symlink1c                 C   rz   )N./ustar/linktest2/symtyper   r|   r   r   r   r   test_fileobj_symlink2   r   z#UstarReadTest.test_fileobj_symlink2c                 C   rz   )NZsymtype2r?   r|   r   r   r   r   test_issue14160   r~   zUstarReadTest.test_issue14160c                 C   s   |  d |  d d S )NbarZeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)add_dir_and_getmemberr   r   r   r   test_add_dir_getmember   s   
z$UstarReadTest.test_add_dir_getmembergetuidgetgidz'Missing getuid or getgid implementationc                 C   s   dd }t  h ttd&}tj|_zt| |j	||d W t
| nt
| w W d    n1 s8w   Y  tt}| ||||d  W d    n1 s[w   Y  W d    d S W d    d S 1 ssw   Y  d S )Nc                 S   s   d | _ | _| S )Nro   )uidgidrI   r   r   r   rM      s   z3UstarReadTest.add_dir_and_getmember.<locals>.filterwrL   /)r   temp_cwdr   r   tmpnameUSTAR_FORMATformatrS   mkdiraddrmdirrD   rA   )r   ru   rM   r9   r   r   r   r      s$   

"z#UstarReadTest.add_dir_and_getmemberN)r   r   r   rK   r\   r^   rn   rt   ry   r}   r   r   r   r   r   unittest
skipUnlesshasattrrS   r   r   r   r   r   r>   j   s"    	
1r>   c                   @      e Zd ZdS )GzipUstarReadTestNr   r   r   r   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,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ListTestc                 C   s   t j| j| jd| _d S )Nr   r8   r   r   r   r   r:     s   zListTest.setUpc                    s@  t jt  ddd}ttd|  jjdd W d    n1 s#w   Y  | 	 } 
d|  
d|  
d	|  
d
|  
d|  
d|  
d|  
d|  fdd} 
|d|  
|d|  
|d|  
|d|  
|d|  |d  d|  d| d S )Nascii
newlinestdoutFverbose   ustar/conttype   ustar/regtypes   ustar/lnktypes   ustar/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/lnktypes   ustar/dirtype/s   ustar/dirtype-with-size/c                    s   |   jjd}|ddS )Nsurrogateescaper   backslashreplace)decoder9   r7   rp   )rx   rj   r   r   r   conv   s   z ListTest.test_list.<locals>.convs   ustar/umlauts-s'   misc/regtype-hpux-signed-chksum-s)   misc/regtype-old-v7-signed-chksum-s   pax/bad-pax-s   pax/hdrcharset-s)   ustar/conttype ?\r?\nustar/regtype ?\r?\ns   link tos   ->)r   rW   BytesIOr   	swap_attrsysr9   r]   detachgetvalueassertInassertRegexassertNotIn)r   tiooutr   r   r   r   	test_list  s4   

zListTest.test_listc                 C   s   t jt  ddd}ttd| | jjdd W d    n1 s#w   Y  | 	 }| 
|d | d| | d	| | d
| | d| | d| d S )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?\ns   ustar/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)r   rW   r   r   r   r   r9   r]   r   r   r   r   )r   r   r   r   r   r   test_list_verbose6  s"   zListTest.test_list_verbosec                 C   s   t jt  ddd}dd }ttd| | jjd|| jd W d    n1 s+w   Y  | 	 }| 
d	| | d
| d S )Nr   r   r   c                 s   s$    |   D ]
}d|jv r|V  qd S )NZreg)
getmembersru   )r9   rI   r   r   r   membersP  s   
z+ListTest.test_list_members.<locals>.membersr   F)r   r   r   r   )r   rW   r   r   r   r   r9   r]   r   r   r   r   )r   r   r   r   r   r   r   test_list_membersN  s   zListTest.test_list_membersN)r   r   r   r:   r   r   r   r   r   r   r   r     s
    %r   c                   @   r   )GzipListTestNr   r   r   r   r   r   [  r   r   c                   @   r   )Bz2ListTestNr   r   r   r   r   r   _  r   r   c                   @   r   )LzmaListTestNr   r   r   r   r   r   c  r   r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )CommonReadTestc                 C   s   t td W d    n1 sw   Y  | tt | ttt t td}| t| W d    n1 s@w   Y  | ttd d S )Nwbr_   s   invalid)	r   r   assertFalser   
is_tarfilepathlibPathr   r   r   rJ   r   r   r   test_is_tarfile_erroneousi  s   z(CommonReadTest.test_is_tarfile_erroneousc              	   C   s   |  t| j |  tt| j t| jd}|  t| W d    n1 s.w   Y  t| jd}|  tt|	  W d    d S 1 sRw   Y  d S )Nr_   )

assertTruer   r   r   r   r   r   r   r   rC   r   r   r   r   test_is_tarfile_validz  s   "z$CommonReadTest.test_is_tarfile_validc                 C   s   t t| jdd W d    n1 sw   Y  z3zt t| j}|  W n t jy8   | d Y nw | |	 g  W |
  d S W |
  d S |
  w )NrN   r   z&tarfile.open() failed on empty archive)r   r   r   r   replacegetnames	ReadErrorrr   assertListEqualr   r;   r   r9   r   r   r   test_empty_tarfile  s   z!CommonReadTest.test_empty_tarfilec                 C   s@   |  td td| j W d    d S 1 sw   Y  d S )NZxxx)assertRaisesRegexFileNotFoundErrorr   r   r   r   r   r   r   test_non_existent_tarfile  s   "z(CommonReadTest.test_non_existent_tarfilec                 C   sV   t td W d    n1 sw   Y  | tjtj t| j | tjtj t d S Nr   )r   r   assertRaisesr   r   r   r   r   r   r   test_null_tarfile  s
   z CommonReadTest.test_null_tarfilec              	   C   s   t dd}dD ]T}| td%}||d  td}t||_||	  || W d    n1 s9w   Y  tjtddd	}z| 
| dgd
|  W |  q	|  w d S )Nr   re   )       ar   ra   foorN   T)r   ignore_zerosz3ignore_zeros=True should have skipped the %r-blocks)r   	randbytesr   r   writer   TarInforE   rF   tobufr   r   r;   )r   r   charrJ   rI   r9   r   r   r   test_ignore_zeros  s$   

z CommonReadTest.test_ignore_zerosc              
   C   s  dD ]}t td}t d}d|_||td W d    n1 s&w   Y  ttd}|| W d    n1 s@w   Y  t t$}| 	t j
d |D ]}qUW d    n1 sbw   Y  W d    n1 sqw   Y  t tI}| }| 	t j
d |j|tdd	 W d    n1 sw   Y  | 	t j
d ||  W d    n1 sw   Y  W d    n1 sw   Y  qd S )
N)re   iX  ra   i  w:r   ra   s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazr+bzunexpected end of datar   rL   )r   r   r   r   rF   addfiler   r   truncater   r   nextrQ   rR   rB   rC   )r   rF   r9   trJ   r   r   r   test_premature_end_of_archive  s:   
z,CommonReadTest.test_premature_end_of_archivec              	   C   st   |  tjd) ttd}W d    n1 sw   Y  W d    d S W d    d S 1 s3w   Y  d S )N%file could not be opened successfullyzrecursion.tar)r   r   r   r   r   findfiler   r   r   r   test_length_zero_header  s   "z&CommonReadTest.test_length_zero_headerN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   g  s    	r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zeeeddejdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zeed-u d.d/d0 Z d-S )1MiscReadTestBasec                 C   s   d S r	   r   r   r   r   r   requires_name_attribute  s   z(MiscReadTestBase.requires_name_attributec              	   C   s   |    t| jdC}| |jt tj|| jd}| |jt | |jt	j
|j W d    n1 s8w   Y  W d    d S W d    d S 1 sPw   Y  d S Nr_   fileobjr   )r   r   r   assertIsInstanceru   strr   r   rD   rS   rT   abspathr   rJ   r9   r   r   r   test_no_name_argument  s   "z&MiscReadTestBase.test_no_name_argumentc                 C   sn   t | jd}| }W d    n1 sw   Y  t|}| tt|d tj || j	d}| 
|j d S )Nr_   ru   r   )r   r   rC   r   r   r   rq   getattrr   r   assertIsNoneru   r   rJ   r   r9   r   r   r   test_no_name_attribute  s   

z'MiscReadTestBase.test_no_name_attributec                 C   s   t | jd}| }W d    n1 sw   Y  t|}d|_tj || jd}| |j W d    d S 1 s<w   Y  d S )Nr_   r   r   )	r   r   rC   r   r   ru   r   r   r   r   r   r   r   test_empty_name_attribute  s   

"z*MiscReadTestBase.test_empty_name_attributec              	   C   s   t | jt j}t|d6}| |jt tj|| jd}| 	|j W d    n1 s.w   Y  W d    d S W d    d S 1 sFw   Y  d S r   )
rS   r   r   O_RDONLYr   ru   intr   r   r   )r   fdrJ   r9   r   r   r   test_int_name_attribute  s   "z(MiscReadTestBase.test_int_name_attributec              	   C   s   |    t| j}t|dC}| |jt tj|| j	d}| |jt | 
|jtj|j W d    n1 s=w   Y  W d    d S W d    d S 1 sUw   Y  d S r   )r   rS   fsencoder   r   r   ru   bytesr   r   rD   rT   r   )r   r   rJ   r9   r   r   r   test_bytes_name_attribute  s   "z*MiscReadTestBase.test_bytes_name_attributec              	   C   s  t | j}tj|| jd}| |jt | 	|jt
jt
| W d    n1 s.w   Y  | |}| |jt | 	|jt
jt
| W d    n1 sXw   Y  tjj|| jd}| |jt | 	|jt
jt
| W d    n1 sw   Y  | jdkrtj|dd}| |jt | 	|jt
jt
| W d    d S 1 sw   Y  d S d S )Nr   r   rN   )r   r   r   r   r   r   r   ru   r   rD   rS   rT   r   fspathr!   r    r   )r   r   r9   r   r   r   test_pathlike_name  s&   
"z#MiscReadTestBase.test_pathlike_namec                 C   s   t td W d    n1 sw   Y  | td | td}W d    n1 s,w   Y  | td | td}W d    n1 sHw   Y  | td | td}W d    d S 1 sew   Y  d S )Nr   zmode must be qrwr   )r   r   r   
ValueErrorr!   r   r   r   r   test_illegal_mode_arg  s   "z&MiscReadTestBase.test_illegal_mode_argc              	   C   s,  t j| j| jd}z-|  | }|j}|j}||}| }W d    n1 s,w   Y  W |	  n|	  w | | jJ}|
| |j| jd|d#}| }| |j| |  | || |d W d    n1 sww   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   r4   r   r   zseek back did not work)r   r   r   r   r   ru   offsetrB   rC   r;   rf   rD   r   )r   r9   r   ru   r	  fr   rJ   r   r   r   test_fileobj_with_offset&  s0   

"z)MiscReadTestBase.test_fileobj_with_offsetc                 C   s^   |  tjtjt| j ttd}| j tjtj|| jd W d    d S 1 s(w   Y  d S r   )r   r   r   r   r   r   r   r   r   r   test_fail_compB  s   "zMiscReadTestBase.test_fail_compc                 C   s"   | j d}| |jtjd d S )Nzmisc/dirtype-old-v7zv7 dirtype failed)r9   rA   rD   typer   DIRTYPEr   rI   r   r   r   test_v7_dirtypeI  s   z MiscReadTestBase.test_v7_dirtypec                 C   s2   z	| j d W d S  ty   | d Y d S w )Nzmisc/regtype-xstarz3failed to find misc/regtype-xstar (mangled prefix?))r9   rA   KeyErrorrr   r   r   r   r   test_xstar_typeQ  s
   z MiscReadTestBase.test_xstar_typec                 C   sN   | j D ]!}| t|jdd|j  |jdsq| |jdd|j  qd S )N鏽>zwrong mtime for %szustar/r   zwrong uname for %s)r9   rD   r   mtimeru   
startswithunamer  r   r   r   test_check_membersZ  s   

z#MiscReadTestBase.test_check_membersc                 C   s   |  | j d jdd d S )Nzmisc/eofzcould not find all members)rD   r9   r   ru   r   r   r   r   test_find_membersc  s   z"MiscReadTestBase.test_find_memberslinkMissing hardlink implementationc              	   C   sF  t jtddd}|jdtdd | tjtj	
td |jdtdd | tjtj	
td ttj	
tdd}| }W d    n1 sJw   Y  | t|t |jd	tdd | tjtj	
td	 ttj	
td	d}| }W d    n1 sw   Y  | t|t W d    d S 1 sw   Y  d S )
Nr`   r5   )
errorlevelr7   r?   r   rL   r{   r_   r   )r   r   r   rQ   rR   
addCleanupr   unlinkrS   rT   rU   rC   rD   r   rG   )r   r9   r
  r   r   r   r   test_extract_hardlinkg  s    

"z&MiscReadTestBase.test_extract_hardlinkc           	   	   C   s   t jtdd}tjtd}t| z\dd |D }|j||dd |D ]>}tj||j	}t
jdkrE| |jd	@ t|jd	@ |j	 d
d }tj|}d||j|||}| |j|| q%W |  t| d S |  t| w )Nr5   r7   
extractallc                 S      g | ]}|  r|qS r   isdir.0r   r   r   r   
<listcomp>      z4MiscReadTestBase.test_extractall.<locals>.<listcomp>fully_trustedrL   win32  c                 S   s$   t | trd| |  S d| S )Nz{} ({})z
{!r} (int))
isinstancefloatr   hex)r  r   r   r   format_mtime  s   

z6MiscReadTestBase.test_extractall.<locals>.format_mtimez,tar mtime {0} != file time {1} of path {2!a})r   r   r   rS   rT   rU   rR   r   r!  ru   r   platformrD   r   statst_modegetmtimer   r  r;   r   rmtree)	r   r9   DIRdirectoriesrI   rT   r/  Z
file_mtimeerrmsgr   r   r   test_extractall|  s4   

z MiscReadTestBase.test_extractallc              	   C   s   d}t jtd}t | zWtjtdd8}||}|j	||dd t j||}| 
t j||j tjdkrG| 
t |jd@ d	 W d    n1 sQw   Y  W t| d S W t| d S t| w )
Nustar/dirtypeZ
extractdirr5   r   r)  rT   rM   r*  r+  i  )rS   rT   rU   rR   r   r   r   r   rA   rQ   rD   r3  r  r   r0  r1  r2  r   r4  r   Zdirtyper5  r9   rI   Z	extractedr   r   r   test_extract_directory  s    


z'MiscReadTestBase.test_extract_directoryc              	   C   s   t td }t|L tjtdd,}dd |D }|j||dd |D ]}||j	 }| 
tj||j q&W d    n1 sCw   Y  W d    d S W d    d S 1 s[w   Y  d S )Nr!  r5   r   c                 S   r"  r   r#  r%  r   r   r   r'    r(  zBMiscReadTestBase.test_extractall_pathlike_name.<locals>.<listcomp>r)  rL   )r   r   rR   r   temp_dirr   r   r   r!  ru   rD   rS   rT   r3  r  )r   r5  r9   r6  rI   rT   r   r   r   test_extractall_pathlike_name  s   
Pz.MiscReadTestBase.test_extractall_pathlike_namec              	   C   s   d}t td }t|D tjtdd$}||}|j	||dd || }| 
tj||j W d    n1 s=w   Y  W d    d S W d    d S 1 sUw   Y  d S )Nr9  r!  r5   r   r)  r:  )r   r   rR   r   r=  r   r   r   rA   rQ   rD   rS   rT   r3  r  r;  r   r   r   test_extract_pathlike_name  s   
Pz+MiscReadTestBase.test_extract_pathlike_namec              	   C   s   t jtd}t|d}|d W d    n1 sw   Y  z4ttj	}z|
| W n tjy@   | |jj Y nw | d W t| d S W t| d S t| w )Nemptyr   rd   zReadError not raised)rS   rT   rU   rR   r   r   object__new__r   r    __init__r   r   r   closedrr   r   r  )r   r@  rJ   r9   r   r   r   test_init_close_fobj  s   z%MiscReadTestBase.test_init_close_fobjc                 C   sj   t | j%}t||D ]\}}| |j|j | | |  qW d    d S 1 s.w   Y  d S r	   )r   r   r   ziprD   r	  get_info)r   r9   Zm1Zm2r   r   r   test_parallel_iteration  s   "z(MiscReadTestBase.test_parallel_iterationNzrequires zlibc              	   C   s   t jd1}tj|_| tj t	| j
 W d    n1 s"w   Y  W d    d S W d    d S 1 s:w   Y  d S )Nztarfile.TarInfo.fromtarfile)r   mockpatchzliberrorside_effectr   r   r   r   r   )r   rI  r   r   r   test_zlib_error_does_not_leak  s   "z.MiscReadTestBase.test_zlib_error_does_not_leak)!r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r   r   r   rS   r   skip_unless_symlinkr  r8  r<  r>  r?  rE  rH  skipIfrK  rN  r   r   r   r   r     s8    		
		

r   c                   @      e Zd ZdZdS )MiscReadTestN)r   r   r   r  r   r   r   r   rR        rR  c                   @   r   )GzipMiscReadTestNr   r   r   r   r   rT    r   rT  c                   @      e Zd Zdd ZdS )Bz2MiscReadTestc                 C      |  d d S )NzBZ2File have no name attributeskipTestr   r   r   r   r     r=   z'Bz2MiscReadTest.requires_name_attributeNr   r   r   r   r   r   r   r   rV        rV  c                   @   rU  )LzmaMiscReadTestc                 C   rW  )NzLZMAFile have no name attributerX  r   r   r   r   r     r=   z(LzmaMiscReadTest.requires_name_attributeNrZ  r   r   r   r   r\    r[  r\  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )StreamReadTestr|c              
   C   s~   | j D ]9}| s
q| j |$}	 z|d}W n tjy(   | d Y nw |s,nqW d    n1 s7w   Y  qd S )NTre   z6simple read-through using TarFile.extractfile() failed)r9   isregrB   rC   r   StreamErrorrr   )r   rI   rJ   bufr   r   r   test_read_through  s"   
z StreamReadTest.test_read_throughc                 C   sh   | j  }| j |}| }W d    n1 sw   Y  | t||jd | t|td d S )Nr@   )	r9   r   rB   rC   rD   rE   rF   r   rG   rH   r   r   r   rK     s   

z(StreamReadTest.test_fileobj_regular_filec                 C   sP   | j  }| j |d }| tj|j W d    d S 1 s!w   Y  d S Nr   )r9   r   rB   r   r   r`  rC   )r   Ztarinfosr
  r   r   r   test_provoke_stream_error  s   
"z(StreamReadTest.test_provoke_stream_errorc                 C   s   t jtdd}zc| j}	 | }| }|d u rnK| |d | s'| rC| t j	 |
| W d    n1 s=w   Y  q|
|}|
|}|d u rRq| |d | | | d qW |  d S |  w )Nr5   r   Tzstream.next() failed.zstream.extractfile() failedzstream extraction failed)r   r   r   r9   r   assertIsNotNoneZislnkZissymr   r`  rB   rD   rC   r;   )r   Ztar1Ztar2t1t2v1v2r   r   r   test_compare_members  s2   

z#StreamReadTest.test_compare_membersN)r   r   r   r   rb  rK   rd  rj  r   r   r   r   r]    s    	r]  c                   @   r   )GzipStreamReadTestNr   r   r   r   r   rk  /  r   rk  c                   @   r   )Bz2StreamReadTestNr   r   r   r   r   rl  2  r   rl  c                   @   r   )LzmaStreamReadTestNr   r   r   r   r   rm  5  r   rm  c                   @   4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )DetectReadTestc              
   C   sN   zt ||}W n t jy  } z|   W Y d }~d S d }~ww |  d S r	   )r   r   r   rr   r;   )r   ru   r   r9   er   r   r   _testfunc_file:  s   zDetectReadTest._testfunc_filec              
   C   s|   zt |d}tj |||d}W d    n1 sw   Y  W n tjy7 } z|   W Y d }~d S d }~ww |  d S )Nr_   r   )r   r   r   rr   r;   )r   ru   r   r
  r9   rp  r   r   r   _testfunc_fileobjB  s   z DetectReadTest._testfunc_fileobjc                 C   sJ  | j r| tj tjtd| j  d W d    n1 sw   Y  | tj tjtd| j  d W d    n1 s>w   Y  | tj tj| jdd W d    n1 s\w   Y  | tj tj| jdd W d    n1 szw   Y  || jd || jd| j   || jd || jd| j   || jd d S )Nr4   r   r^  rN   zr:*r|*)r   r   r   r   r   r   )r   Ztestfuncr   r   r   _test_modesK  s$   zDetectReadTest._test_modesc                 C      |  | j d S r	   )ru  rq  r   r   r   r   test_detect_file[  r~   zDetectReadTest.test_detect_filec                 C   rv  r	   )ru  rs  r   r   r   r   test_detect_fileobj^  r~   z"DetectReadTest.test_detect_fileobjN)r   r   r   rq  rs  ru  rw  rx  r   r   r   r   ro  9  s    	ro  c                   @   r   )GzipDetectReadTestNr   r   r   r   r   ry  a  r   ry  c                   @   rU  )Bz2DetectReadTestc                 C   s|   t td}| }W d    n1 sw   Y  tjtddd}|| W d    n1 s1w   Y  | td d S )Nr_   r   r`   compresslevelrt  )r   r   rC   r*   r,   r   r   rq  rs   r   r   r   test_detect_stream_bz2e  s   
z(Bz2DetectReadTest.test_detect_stream_bz2N)r   r   r   r}  r   r   r   r   rz  d  r[  rz  c                   @   r   )LzmaDetectReadTestNr   r   r   r   r   r~  s  r   r~  c                   @   s   e Zd Zd(ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS ))MemberReadTestNc                 K   s   |d ur(| j |}| t| |d|j  W d    n1 s#w   Y  d|d< d|d< d|d< d|jvrAd	|d
< d	|d< | D ]\}}| t|||d||jf  qEd S )Nwrong sha256sum for %sr  r    r   ro   r   zold-v7r   r  gnamezwrong value in %s field of %s)r9   rB   rD   r   rC   ru   itemsr   )r   rI   chksumkwargsr
  kvr   r   r   _test_membery  s"   
zMemberReadTest._test_memberc                 C       | j d}| j|dtd d S )Nr?   c  rF   r  r9   rA   r  rG   r  r   r   r   test_find_regtype     z MemberReadTest.test_find_regtypec                 C   r  )Nzustar/conttyper  r  r  r  r   r   r   test_find_conttype  r  z!MemberReadTest.test_find_conttypec                 C      | j d}| j|dd d S )Nr9  r   rF   r9   rA   r  r  r   r   r   test_find_dirtype     z MemberReadTest.test_find_dirtypec                 C   r  )Nzustar/dirtype-with-size   r  r  r  r   r   r   test_find_dirtype_with_size  r  z*MemberReadTest.test_find_dirtype_with_sizec                 C       | j d}| j|ddd d S )Nr{   r   r?   rF   linknamer  r  r   r   r   test_find_lnktype  r  z MemberReadTest.test_find_lnktypec                 C   r  )Nr   r   rv   r  r  r  r   r   r   test_find_symtype  r  z MemberReadTest.test_find_symtypec                 C   s"   | j d}| j|dddd d S )Nustar/blktyper      rF   devmajordevminorr  r  r   r   r   test_find_blktype     z MemberReadTest.test_find_blktypec                 C   s"   | j d}| j|dddd d S )Nustar/chrtyper   r`   r  r  r  r  r   r   r   test_find_chrtype  r  z MemberReadTest.test_find_chrtypec                 C   r  )Nustar/fifotyper   r  r  r  r   r   r   test_find_fifotype  r  z!MemberReadTest.test_find_fifotypec                 C   r  )Nzustar/sparse P r  r9   rA   r  sha256_sparser  r   r   r   test_find_sparse  r  zMemberReadTest.test_find_sparsec                 C   r  )N
gnu/sparser  r  r  r  r   r   r   test_find_gnusparse  r  z"MemberReadTest.test_find_gnusparsec                 C   r  )Ngnu/sparse-0.0r  r  r  r  r   r   r   test_find_gnusparse_00  r  z%MemberReadTest.test_find_gnusparse_00c                 C   r  )Ngnu/sparse-0.1r  r  r  r  r   r   r   test_find_gnusparse_01  r  z%MemberReadTest.test_find_gnusparse_01c                 C   r  )Ngnu/sparse-1.0r  r  r  r  r   r   r   test_find_gnusparse_10  r  z%MemberReadTest.test_find_gnusparse_10c                 C   r  )Nu   ustar/umlauts-ÄÖÜäöüßr  r  r  r  r   r   r   test_find_umlauts  s   z MemberReadTest.test_find_umlautsc                 C   s   d}|  || j  d S )Na   ustar/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   r9   r   r   ru   r   r   r   test_find_ustar_longname  s   z'MemberReadTest.test_find_ustar_longnamec                 C   r  )Nzmisc/regtype-old-v7r  r  r  r  r   r   r   test_find_regtype_oldv7  r  z&MemberReadTest.test_find_regtype_oldv7c                 C   s@   | j   tj| j| jdd| _ | j d}| j|dtd d S )Nr5   r6   u   pax/umlauts-ÄÖÜäöüßr  r  )	r9   r;   r   r   r   r   rA   r  rG   r  r   r   r   test_find_pax_umlauts  s   
z$MemberReadTest.test_find_pax_umlautsr	   )r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  w  s(    
r  c                   @   rn  )LongnameTestc                 C   sV   | j d d d }z| j|}W n ty   | d Y nw | |jtjd d S )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/longnamezlongname not foundzread longname as dirtype)	subdirr9   rA   r  rr   assertNotEqualr  r   r  )r   r  rI   r   r   r   test_read_longname  s   zLongnameTest.test_read_longnamec                 C   sf   | j d d d }| j d d d }z| j|}W n ty(   | d Y nw | |j|d d S )Nr   r  r  longlinkzlonglink not foundzlinkname wrong)r  r9   rA   r  rr   rD   r  )r   r  r  rI   r   r   r   test_read_longlink  s   zLongnameTest.test_read_longlinkc                 C   s   | j d d d }| j|}|j}| jj| t| jjd}| 	t
j t
jd|d W d    d S 1 s<w   Y  d S )Nr   r  r  i   zfoo.tar)ru   r   )r  r9   rA   r	  r   rf   r   r   rC   r   r   r   r   )r   r  rI   r	  rJ   r   r   r   test_truncated_longname  s   "z$LongnameTest.test_truncated_longnamec                 C   s   | j d d d }| j|j}ttd!}|| tj	|
ddd}| |j| j W d    d S 1 s9w   Y  d S )Nr   r  r  r_   re   r5   strict)r  r9   rA   r	  r   r   rf   r   r   ZfrombufrC   rD   r  longnametype)r   r  r	  rJ   rI   r   r   r   test_header_offset  s   
"zLongnameTest.test_header_offsetc                 C   s   d}t  k ttd$}| j|_zt| || W t	| nt	| w W d    n1 s4w   Y  tt}| 
|| | 
||d W d    n1 s\w   Y  W d    d S W d    d S 1 stw   Y  d S )Nzfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/r   r   )r   r   r   r   r   r   rS   r   r   r   re  rA   removesuffix)r   Zlongdirr9   r   r   r   test_longname_directory  s    

"z$LongnameTest.test_longname_directoryN)r   r   r   r  r  r  r  r  r   r   r   r   r    s    
		r  c                   @   sP   e Zd ZdZejZejZdd Z	dd Z
dd Zdd	 Zd
d Zedd ZdS )GNUReadTestgnuc                 C   s   | j j|tdd tjt|}t|d}| }W d    n1 s$w   Y  | t	|t
d|  |  rIt|}| |jd |j d S d S )Nr   rL   r_   r  re   )r9   rQ   rR   rS   rT   rU   r   rC   rD   r   r  _fs_supports_holesr1  Z
assertLess	st_blocksst_size)r   ru   filenamerJ   r   rj   r   r   r   _test_sparse_file  s   

zGNUReadTest._test_sparse_filec                 C   rW  )Nr  r  r   r   r   r   test_sparse_file_old)  r=   z GNUReadTest.test_sparse_file_oldc                 C   rW  )Nr  r  r   r   r   r   test_sparse_file_00,  r=   zGNUReadTest.test_sparse_file_00c                 C   rW  )Nr  r  r   r   r   r   test_sparse_file_01/  r=   zGNUReadTest.test_sparse_file_01c                 C   rW  )Nr  r  r   r   r   r   test_sparse_file_102  r=   zGNUReadTest.test_sparse_file_10c                  C   s   t jdrBtjtd} t| d}|d |	d |
  W d    n1 s+w   Y  t| }t|  |jd |jk S dS )Nlinuxzsparse-testr   i   s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxre   F)r   r0  r  rS   rT   rU   rR   r   rf   r   r   r1  r   r  r  r  )ru   rJ   rj   r   r   r   r  5  s   




zGNUReadTest._fs_supports_holesN)r   r   r   r  r   GNUTYPE_LONGNAMEr  
GNU_FORMATr   r  r  r  r  r  staticmethodr  r   r   r   r   r    s    	r  c                   @   s4   e Zd ZdZejZejZdd Z	dd Z
dd ZdS )	PaxReadTestpaxc                 C   s   t jtdd}z^|d}| |jd | |jd | |jdd |d}| |jd	 | |jd | |jdd |d
}| |jd | |jd | |jdd W |	  d S |	  w )Nr5   r   pax/regtype1r   r   zVENDOR.umlautsu   ÄÖÜäöüßzpax/regtype2r   zpax/regtype3r   )
r   r   r   rA   rD   r  r  pax_headersgetr;   r   r9   rI   r   r   r   test_pax_global_headersR  s*   


z#PaxReadTest.test_pax_global_headersc                 C   s   t jtdd}zG|d}| |jd | |jd | |jd | |jd | t	|jt
 | t
|jd d | t
|jd d W |  d S |  w )	Nr5   r   zpax/regtype4r  {   g  ^AZatimectime)r   r   r   rA   rD   rF   r   r   r  r  r-  r  r;   r  r   r   r   test_pax_number_fieldsi  s   
z"PaxReadTest.test_pax_number_fieldsc              
   C   sX  d}ddi}|D ]}| j |d tjtdtjdd}zt }d|_d	|_||_|	| W |
  n|
  w ttd
}| }| d| |d|}W d    n1 sYw   Y  ttd}|  || W d    n1 sww   Y  | tjd tjtdd W d    n1 sw   Y  W d    n1 sw   Y  qd S )N)
s	    foo=bar
s   0 
s   1 
s   2 
s   3 =
s   4 =a
s   1000000 foo=bar
s
   0 foo=bar
s   -12 foo=bar
s$   000000000000000000000000036 foo=bar
r   r   )headerr   r5   r   r7   r  r`   r_   s   11 foo=bar
r   z)method tar: ReadError\('invalid header'\)r   )subTestr   r   r   
PAX_FORMATr   ru   r   r  r   r;   rC   r   r   r   r   r   r   )r   Zpax_header_replacementsr  Zreplacementr9   r   r
  r   r   r   r   test_pax_header_bad_formatsx  s<   z'PaxReadTest.test_pax_header_bad_formatsN)r   r   r   r  r   XHDTYPEr  r  r   r  r  r  r   r   r   r   r  L  s    r  c                   @      e Zd Zdd Zdd ZdS )WriteTestBasec                 C   s   t  }tj|| jd}|td W d    n1 sw   Y  | |jd |	 }~t
  | |j | ||	  d S )Nr   r   z#external fileobjs must never closed)r   r   r   r   r   r   r   r   rD  r   r   
gc_collectrD   )r   rJ   r9   r   r   r   r   test_fileobj_no_close  s   z#WriteTestBase.test_fileobj_no_closec                 C   s   t t| j }t d}t jt j |_||t	
d|j  W d    n1 s*w   Y  | td}| t| t jd  W d    d S 1 sNw   Y  d S )Nr   r   r_   rc   )r   r   r   r   r   
RECORDSIZE	BLOCKSIZErF   r   r   r   rD   rE   rC   )r   r9   r   rJ   r   r   r   test_eof_marker  s   
"zWriteTestBase.test_eof_markerN)r   r   r   r  r  r   r   r   r   r    s    r  c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
eedddd Zejdd Zdd Zdd Zd&ddZejdd Zdd Zd d! Zd"d# Zd$d% ZdS )'	WriteTestr   c                 C   sx   d}t t| j}zt |}|| W |  n|  w t t}z| | d |d W |  d S |  w )Nd0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789r   z!failed to store 100 char filename)	r   r   r   r   r   r   r;   rD   r   )r   ru   r9   r   r   r   r   test_100_char_name  s   

zWriteTest.test_100_char_namec                 C   s   t t| j}z,tjtd}t|d}|d W d    n1 s$w   Y  |	| W |
  n|
  w | tjtdd d S )Nfiler      aaar   ztarfile is empty)r   r   r   r   rS   rT   rU   rR   r   r   r;   ZassertGreatergetsize)r   r9   rT   rJ   r   r   r   test_tar_size  s   zWriteTest.test_tar_sizec                 C   s   t t| j}zUtjtd}t|d W d    n1 sw   Y  ||}| 	|j
d t|d}|d W d    n1 sEw   Y  ||}| 	|j
d W |  d S |  w )Nr  r   r   r  r  )r   r   r   r   rS   rT   rU   rR   
gettarinforD   rF   r   r;   )r   r9   rT   rI   rJ   r   r   r   test_file_size  s   

zWriteTest.test_file_sizec              	   C   st   t jtd}t | z'tt| j}z|	|}| 
|jd W |  n|  w W t| d S t| w )N	directoryr   )rS   rT   rU   rR   r   r   r   r   r   r  rD   rF   r;   r   r   r   rT   r9   rI   r   r   r   test_directory_size  s   

zWriteTest.test_directory_sizec                 C   sV  t jtd}t | tt j|dd  tt j|dd  zltt| j	}zCt
jd}ddg|_|| W d    n1 sHw   Y  g }| D ]}|t j|jd  qS| |g d W |  n|  w W tt j|d tt j|d t| d S tt j|d tt j|d t| w )Nr  1rw   2z
os.listdirr  )r  r  r  )rS   rT   rU   rR   r   r   r;   r   r   r   r   rI  rJ  return_valuer   r   appendsplitru   rD   r   r  r   )r   rT   r9   Zmock_listdirpathsmr   r   r   test_ordered_recursion  s,   

z WriteTest.test_ordered_recursionc              	   C   s   t t| jM}ttd }t|d}|d W d    n1 s$w   Y  ||}|t	
|}| |jt | |j|j | |jd W d    d S 1 sWw   Y  d S )Nr  r   r  r  )r   r   r   r   r   r   rR   r   r  rS   r  r   ru   r   rD   rF   )r   r9   rT   rJ   rI   Ztarinfo2r   r   r   test_gettarinfo_pathlike_name  s   
"z'WriteTest.test_gettarinfo_pathlike_namer  r  c              
   C   s  t jtd}t jtd}t|d}|d W d    n1 s#w   Y  zt || W n tyI } z| d|  W Y d }~nd }~ww z1t	t
| j}z|| ||}| |jd W |  n|  w W t| t| d S t| t| w )Nr  link_targetr   r  os.link(): %sr   )rS   rT   rU   rR   r   r   r  PermissionErrorrY  r   r   r   r  rD   rF   r;   r   r  )r   r  targetrJ   rp  r9   rI   r   r   r   test_link_size'  s,   



zWriteTest.test_link_sizec              	   C   sv   t jtd}t d| z'tt| j}z|	|}| 
|jd W |  n|  w W t| d S t| w )Nsymlinkr  r   )rS   rT   rU   rR   r  r   r   r   r   r  rD   rF   r;   r   r  r  r   r   r   test_symlink_size?  s   
zWriteTest.test_symlink_sizec                 C   s   t jt}tt| j}z@| |j|d |	| | |
 g d tt |	| W d    n1 s9w   Y  | |
 g d W |  d S |  w )Nzarchive name must be absolutezadded the archive to itself)rS   rT   r   r   r   r   r   rD   ru   r   r   r   
change_cwdrR   r;   )r   dstnamer9   r   r   r   test_add_selfM  s"   

zWriteTest.test_add_selfc              	   C   s4  t jtd}t | zdD ]}t j||}t| qdd }tjt	| j
dd}z|j|d|d W |  n|  w | t ||dd	d | W d    n1 sXw   Y  tt	d
}z#|D ]}| |jd | |jd qf| t| d W |  n|  w W t| d S t| w )NrM   )r   r   Zbazc                 S   s&   t j| jdkrd S d| _d| _| S )Nr   r  r   )rS   rT   basenameru   r   r  r   r   r   r   rM   g  s
   z%WriteTest.test_filter.<locals>.filterr5   r   Z	empty_dir)arcnamerM   TrN   r  r   r  )rS   rT   rU   rR   r   r   create_empty_filer   r   r   r   r   r;   r   	TypeErrorrD   r   r  rE   r   r4  )r   tempdirru   rM   r9   rI   r   r   r   test_filter_  s,   
zWriteTest.test_filterNFc                 C   s   t jtd}|st| nt | tt	| j
}z|j||d W |  n|  w tt	d}z
| }W |  n|  w |sLt| nt| | |j|p]|t jd d S )Nr   r  rN   r   )rS   rT   rU   rR   r   r  r   r   r   r   r   r   r;   r   r  r   rD   ru   r   sep)r   rT   Zcmp_pathdirr   r9   r   r   r   r   _test_pathname  s    


 zWriteTest._test_pathnamec              	   C   st  t jtd}t jtd}t | zt j|d}t j|d}t|d}|d W d    n1 s7w   Y  t || t|d}|j	|dd |j	|dd W d    n1 saw   Y  tj|dd	 }z	|j
|d
d W n ty   | d Y nw W d    n1 sw   Y  W t| t| d S W t| t| d S t| t| w )NZtestsymlinksztestsymlinks.tarsourcer  r   z
something
r  rc   r  r)  r:  z&extractall failed with symlinked files)rS   rT   rU   rR   r   r   r   r  r   r   r!  OSErrorrr   r   r  r4  )r   r  ZtemparchiveZsource_fileZtarget_filer
  r9   r   r   r   test_extractall_symlinks  s>   




z"WriteTest.test_extractall_symlinksc                 C   s<  |  d |  tjddd |  tjddd |  tjdd |  tjddd |  tjdddd |  tjdddd |  tjdddd |  tjdd |  tjddd |  tjdddd |  tjdddd |  dtj tj d  | j dtj tj ddd d S )Nr   .r   ..T)r  )r  rS   rT   rU   r  r   r   r   r   test_pathnames  s   
 zWriteTest.test_pathnamesc                 C   s6   t jdkr| dd d S | dd | dd d S )Nr*  zC:\foor   z/fooz///foo)r   r0  r  r   r   r   r   test_abs_pathnames  s   
zWriteTest.test_abs_pathnamesc              	   C   s   t tH tt| j}z|d W |  n|  w ttd}z|D ]}|j	dkr9| 
|j	d|j	 q'W |  n|  w W d    d S 1 sPw   Y  d S )Nr  rN   ./)r   r	  rR   r   r   r   r   r   r;   ru   r   r  r   r9   r   r   r   r   test_cwd  s   
"zWriteTest.test_cwdc              	      s   t ttfD ]9 G  fdddtj}| }|   tjt| j	|tj
ddid}W d    n1 s3w   Y  | |j qd S )Nc                       s   e Zd ZdZ fddZdS )z8WriteTest.test_open_nonwritable_fileobj.<locals>.BadFileTc                    s   | j rd| _  d S NF)firstr   r   exctyper   r   r     s   z>WriteTest.test_open_nonwritable_fileobj.<locals>.BadFile.writeN)r   r   r   r"  r   r   r$  r   r   BadFile  s    r&  Znonr@  )r   r   r  )r  EOFErrorRuntimeErrorr   r   r   r   r   r   r   r  r   rD  )r   r&  r
  r9   r   r$  r   test_open_nonwritable_fileobj  s   z'WriteTest.test_open_nonwritable_fileobjr!  )r   r   r   r   r  r  r  r  r   r  r   r   r   rS   r  r   rO  r  r  r  r  r  r  r  r   r)  r   r   r   r   r    s.    


(
r  c                   @   r   )GzipWriteTestNr   r   r   r   r   r*    r   r*  c                   @   r   )Bz2WriteTestNr   r   r   r   r   r+    r   r+  c                   @   r   )LzmaWriteTestNr   r   r   r   r   r,    r   r,  c                   @   s@   e Zd ZdZdZdd Zeej	dkoe
edddd	 ZdS )
StreamWriteTestzw|Nc                 C   s   t t| j}|  | jr8|  }ttd}| }W d    n1 s&w   Y  ||}| |j	d n| t}| }W d    n1 sLw   Y  | 
|dt jd d S )Nr_   zfound trailing datar   zincorrect zero padding)r   r   r   r   r;   decompressorrC   
decompressr   unused_datarD   countr  )r   r9   ZdecrJ   r   r   r   r   test_stream_padding
  s   


z#StreamWriteTest.test_stream_paddingr*  umaskzMissing umask implementationc              	   C   sr   t jtrtt t d}z"tt| j	}|
  t tjd@ }| |dd W t | d S t | w )N   r+  i  zwrong file permissions)rS   rT   existsr   r   r  r3  r   r   r   r;   r1  r2  rD   )r   Zoriginal_umaskr9   r   r   r   r   test_file_mode  s   

zStreamWriteTest.test_file_mode)r   r   r   r   r.  r2  r   r   r   r0  r   rS   r6  r   r   r   r   r-    s    r-  c                   @   rU  )GzipStreamWriteTestc                 C   s(   t t| j  ttjdd}dS )zf
        Ensure the source directory is not included in the tar header
        per bpo-41316.
        zlatin-1r   N)r   r   r   r   r;   r   r   	read_text)r   payloadr   r   r    test_source_directory_not_leaked-  s   z4GzipStreamWriteTest.test_source_directory_not_leakedN)r   r   r   r:  r   r   r   r   r7  ,  r[  r7  c                   @      e Zd ZerejZdS dZdS )Bz2StreamWriteTestN)r   r   r   r*   BZ2Decompressorr.  r   r   r   r   r<  7      r<  c                   @   r;  )LzmaStreamWriteTestN)r   r   r   r0   LZMADecompressorr.  r   r   r   r   r?  :  r>  r?  c                   @   sp   e Zd Zdd ZdddZdddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )GNUWriteTestc                 C   s   t |d d }|d S )Nre   r`   )rE   )r   rj   Zblocksr   r   r   _lengthB  s   zGNUWriteTest._lengthNc                 C   sX   d}t |tjkr|d7 }|| |7 }|d ur*t |tjkr*|d7 }|| |7 }|S )Nre   )rE   r   LENGTH_NAMErB  LENGTH_LINK)r   ru   r  r1  r   r   r   
_calc_sizeF  s   zGNUWriteTest._calc_sizec                 C   s   t |}|r||_t j|_t td}zt j|_|	| | 
||}|j}| ||d W |  n|  w t t}z#| }| |d | |j|jd | |j|jd W |  d S |  w )Nr   z%GNU longname/longlink creation failedzunable to read longname member)r   r   r  LNKTYPEr  r   r   r  r   r   rE  r	  rD   r;   r   re  ru   )r   ru   r  rI   r9   rh  ri  memberr   r   r   _testT  s2   


zGNUWriteTest._testc                 C   rW  )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rH  r   r   r   r   test_longname_1023q  r=   zGNUWriteTest.test_longname_1023c                 C   rW  )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/longnamerJ  r   r   r   r   test_longname_1024t  r=   zGNUWriteTest.test_longname_1024c                 C   rW  )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_rJ  r   r   r   r   test_longname_1025w  r=   zGNUWriteTest.test_longname_1025c                 C   rz   )Nru     longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnkrJ  r   r   r   r   test_longlink_1023z  r~   zGNUWriteTest.test_longlink_1023c                 C   rz   )Nru      longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlinkrJ  r   r   r   r   test_longlink_1024}  r~   zGNUWriteTest.test_longlink_1024c                 C   rz   )Nru     longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/longlnk/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_rJ  r   r   r   r   test_longlink_1025  r~   zGNUWriteTest.test_longlink_1025c                 C   rz   )NrI  rP  rJ  r   r   r   r   test_longnamelink_1023  r   z#GNUWriteTest.test_longnamelink_1023c                 C   rz   )NrL  rR  rJ  r   r   r   r   test_longnamelink_1024  r   z#GNUWriteTest.test_longnamelink_1024c                 C   rz   )NrN  rT  rJ  r   r   r   r   test_longnamelink_1025  r   z#GNUWriteTest.test_longnamelink_1025r	   )r   r   r   rB  rE  rH  rK  rM  rO  rQ  rS  rU  rV  rW  rX  r   r   r   r   rA  >  s    

rA  c                   @   s   e Zd ZdZdd ZdS )DeviceHeaderTestr   c              	   C   s  t jtd}t | ztt| j}z$tj	dd}tj	dd}tj
|_tj|_|| || W |  n|  w ttd}z|d}|d}W |  n|  w | |jd | |jd | |jd | |jd ttd}| }W d    n1 sw   Y  ||j|j }	||j|j }
tdd	}| |	| d
 | |
| d W t| d S t| w )NZdevice_header_testZmy_block_deviceru   Zmy_regular_filerN   r   r_   iI  iY  s   0000000 0000000 s                   )rS   rT   rU   rR   r   r   r   r   r   r   BLKTYPEr  REGTYPEr   r;   rA   rD   r  r  rC   r	  Zoffset_dataslicer   r4  )r   r  r9   Z	input_blkZ	input_regZ
output_blkZ
output_regZinfilera  Zbuf_blkZbuf_regZdevice_headersr   r   r   *test_headers_written_only_for_device_files  s<   




z;DeviceHeaderTest.test_headers_written_only_for_device_filesN)r   r   r   r   r^  r   r   r   r   rY    s    rY  c                   @   sn   e Zd ZdZejedZdd Z	e
dd Ze
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd ZdS )
CreateTestzx:
spameggs42c                 C   s   t t d S r	   )r   r  r   r   r   r   r   r:     r=   zCreateTest.setUpc                 C   s<   t | jd}|d W d    d S 1 sw   Y  d S )Nr   r  )r   	file_pathr   )clsrJ   r   r   r   
setUpClass  s   "zCreateTest.setUpClassc                 C      t | j d S r	   )r   r  ra  rb  r   r   r   tearDownClass     zCreateTest.tearDownClassc                 C   s   t t| j}|| j W d    n1 sw   Y  | t}| }W d    n1 s1w   Y  | t	|d | 
d|d  d S Nr`   r`  r   )r   r   r   r   r   ra  r!   r   rD   rE   r   r   tobjnamesr   r   r   test_create  s   
zCreateTest.test_createc                 C   s   t t| j}|| j W d    n1 sw   Y  | t t t| j}W d    n1 s4w   Y  | t}|	 }W d    n1 sMw   Y  | 
t|d | d|d  d S rh  )r   r   r   r   r   ra  r   FileExistsErrorr!   r   rD   rE   r   ri  r   r   r   test_create_existing  s   
zCreateTest.test_create_existingc                 C   s   |  td}|| j W d    n1 sw   Y  |  t}| }W d    n1 s0w   Y  | t|d | d|d  d S Nxr`   r`  r   )r!   r   r   ra  r   rD   rE   r   ri  r   r   r   test_create_taropen  s   
zCreateTest.test_create_taropenc              	   C   s   |  td}|| j W d    n1 sw   Y  | t |  td W d    n1 s3w   Y  W d    n1 sBw   Y  |  t}| }W d    n1 s[w   Y  | t|d | 	d|d  d S ro  )
r!   r   r   ra  r   rm  r   rD   rE   r   ri  r   r   r   test_create_existing_taropen  s   
z'CreateTest.test_create_existing_taropenc                 C   s   t tt| j'}| |jt | 	|jt
jt |t| j | }W d    n1 s4w   Y  | 	t|d | d|d  | t}| }W d    n1 s]w   Y  | 	t|d | d|d  d S rh  )r   r   r   r   r   r   r   ru   r   rD   rS   rT   r   r   ra  r   rE   r   r!   ri  r   r   r   test_create_pathlike_name  s   

z$CreateTest.test_create_pathlike_namec                 C   s   |  ttd'}| |jt | |jtj	
t |t| j | }W d    n1 s3w   Y  | t|d | d|d  |  t}| }W d    n1 s\w   Y  | t|d | d|d  d S ro  )r!   r   r   r   r   ru   r   rD   rS   rT   r   r   ra  r   rE   r   ri  r   r   r   !test_create_taropen_pathlike_name	  s   

z,CreateTest.test_create_taropen_pathlike_nameN)r   r   r   r   rS   rT   rU   rR   ra  r:   classmethodrc  rf  rl  rn  rq  rr  rs  rt  r   r   r   r   r_    s    

		r_  c                   @   rU  )GzipCreateTestc                 C   t   t jt| jdd}|| j W d    n1 sw   Y  t jtddd	}W d    d S 1 s3w   Y  d S )Nr`   r{  zr:gzr   r   r   r   r   ra  r   rj  r   r   r   test_create_with_compresslevel     "z-GzipCreateTest.test_create_with_compresslevelNr   r   r   rz  r   r   r   r   rv        rv  c                   @   rU  )Bz2CreateTestc                 C   rw  )Nr`   r{  r:bz2rx  ry  r   r   r   rz  #  r{  z,Bz2CreateTest.test_create_with_compresslevelNr|  r   r   r   r   r~  !  r}  r~  c                   @   rU  )LzmaCreateTestc                 C   sD   t jt| jdd}|| j W d    d S 1 sw   Y  d S )Nr`   )presetrx  ry  r   r   r   test_create_with_preset.  s   "z&LzmaCreateTest.test_create_with_presetN)r   r   r   r  r   r   r   r   r  *  s    r  c                   @   s   e Zd ZdZdZdZdS )CreateWithXModeTestrp  N)r   r   r   r   rq  rr  r   r   r   r   r  3  s    r  r  r  c                   @   rn  )HardlinkTestc              
   C   s   t jtd| _t jtd| _t| jd}|d W d    n1 s&w   Y  z
t | j| j W n t	yN } z| 
d|  W Y d }~nd }~ww ttd| _| j| j d S )Nr   r   r      foor  r   )rS   rT   rU   rR   r   r   r   r   r  r  rY  r   r   r9   r   )r   rJ   rp  r   r   r   r:   ?  s   zHardlinkTest.setUpc                 C   s&   | j   t| j t| j d S r	   )r9   r;   r   r  r   r   r   r   r   r   r<   N  s   
zHardlinkTest.tearDownc                 C   $   | j | j}| |jtjd d S )Nzadd file as regular failed)r9   r  r   rD   r  r   r\  r  r   r   r   test_add_twiceS  s   zHardlinkTest.test_add_twicec                 C   r  )Nzadd file as hardlink failed)r9   r  r   rD   r  r   rF  r  r   r   r   test_add_hardlinkZ  s   zHardlinkTest.test_add_hardlinkc                 C   s,   d| j _| j | j}| |jtjd d S )NTzdereferencing hardlink failed)r9   Zdereferencer  r   rD   r  r   r\  r  r   r   r   test_dereference_hardlink_  s
   z&HardlinkTest.test_dereference_hardlinkN)r   r   r   r:   r<   r  r  r  r   r   r   r   r  ;  s    r  c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )PaxWriteTestNc                 C   s   t |}|r||_t j|_t jtdt jd}z|| W |	  n|	  w t t}z-|r?|
 d j}| ||d n|
 d j}| ||d W |	  d S W |	  d S |	  w )Nr   r   r   zPAX longlink creation failedzPAX longname creation failed)r   r   r  rF  r  r   r   r  r   r;   r   rD   ru   )r   ru   r  rI   r9   lnr   r   r   rH  h  s$   

zPaxWriteTest._testc              
   C   s
  dddddd}t jtdt j|d}z|t d W |  n|  w t jtd	d
}zR| |j| | |	 d j| |j
 D ]3\}}| t|t | t|t |t jv rxz	t j| | W qE ttfyw   | d Y qEw qEW |  d S |  w )Nr   0z1.23   äöütest)r   r   r  r  r  r   )r   r  r5   r   r   z"unable to convert pax header field)r   r   r   r  r   r   r;   rD   r  r   r  ZassertIsNotr  r   PAX_NUMBER_FIELDSr  r  rr   )r   r  r9   keyvalr   r   r   test_pax_global_header  s8   
	z#PaxWriteTest.test_pax_global_headerc                 C   s   ddd}t jtdt jdd}zt  }d|_d|_||_|| W |	  n|	  w t jtdd	}z"|
 d
 }| |j| | |jd | |jd W |	  d S |	  w )Nr   Z123)rT   r   r   r5   r  r     r   r   r  )r   r   r   r  r   ru   r   r  r   r;   r   rD   )r   r  r9   r   r   r   r   test_pax_extended_header  s$   
z%PaxWriteTest.test_pax_extended_headerc                 C   s  t  }d|_d|_d|_d|_d|_| }|j|dd}| 	|d d | 
|d	 t | 	|d	 d
 | 	|d d | 	|d d | 	|d d | 	|dtd d td d td d td d td d td d td  t  }d|_d|_d|_d|_d|_| }|j|dd}| 	|d d | 	|d	 d | 	|d d | 	|d d | 	|d d | 	|dtd d td d td d d d  td! d" td# d$ td d td  d S )%Nr   g@@ro   r  |   r5   r   ru   r  r  rF   r   r   s   ././@PaxHeaderV   s9   0000000 0000000 0000000 00000000020 00000000000 010205  xs   ustar 00   s   16 mtime=1000.1
i  r  a   s9   0000644 0000173 0000174 00000000144 00000001750 006516  0u   foo㍴l    d(	 r  i  r   s9   0000000 0000000 0000000 00000000130 00000000000 010207  xs   15 path=foo㍴
16 uid=16777216
s$   16 gid=16777217
20 size=10000000000
s   21 mtime=10000000000
i  s   foo?`   s9   0000644 0000000 0000000 00000000000 00000000000 006540  0)r   r   ru   r  rF   r   r   rG  Zcreate_pax_headerrD   r   r   r   )r   r   infor  r   r   r   test_create_pax_header  s   
	
z#PaxWriteTest.test_create_pax_headerr	   )r   r   r   rH  r  r  r  r   r   r   r   r  f  s
    
 r  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )UnicodeTestc                 C   rW  )Nr5   _test_unicode_filenamer   r   r   r   test_iso8859_1_filename  r=   z#UnicodeTest.test_iso8859_1_filenamec                 C   rW  )Nutf7r  r   r   r   r   test_utf7_filename  r=   zUnicodeTest.test_utf7_filenamec                 C   rW  )Nutf-8r  r   r   r   r   test_utf8_filename  r=   zUnicodeTest.test_utf8_filenamec                 C   s   t jtd| j|dd}zd}|t | W |  n|  w t jt|d}z| | d j	| W |  d S |  w )Nr   r  r   r7   errorsr  r   r   )
r   r   r   r   r   r   r;   rD   r   ru   )r   r7   r9   ru   r   r   r   r    s   z"UnicodeTest._test_unicode_filenamec                 C   sj   t jtd| jddd}z$t  }d|_| t|j| d|_d|_	| t|j| W |
  d S |
  w )Nr   r   r  r  r  r   )r   r   r   r   r   ru   r   UnicodeErrorr   r  r;   r  r   r   r   test_unicode_filename_error  s   z'UnicodeTest.test_unicode_filename_errorc                 C   s~   t jtdddd}z0|D ]&}| t|jt | t|jt | t|jt | t|j	t qW |
  d S |
  w )NrN   r5   r  r7   r  )r   r   r   assertIsr  ru   r   r  r  r  r;   r  r   r   r   test_unicode_argument  s   z!UnicodeTest.test_unicode_argumentc                 C   s   t d}d|_d|_t jtd| jdd}z|| W |  n|  w t jtdd}zE|	d}| 
|jd | 
|jd | jt jkrl|  t jtdd}|	d}| 
|jd | 
|jd W |  d S W |  d S |  w )	Nr   r  r   r5   )r   r   r7   r   r   u	   )r   r   r  r  r   r   r   r   r;   rA   rD   r  )r   r   r9   r   r   r   test_uname_unicode&  s.   


zUnicodeTest.test_uname_unicodeN)
r   r   r   r  r  r  r  r  r  r  r   r   r   r   r    s    r  c                   @   sf   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd ZdddZdd Zdd ZdddZdS )UstarUnicodeTestc                 C   0   |  d |  dt |  d |  dt d S Nr  e01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890ud   01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567ÿue   012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678ÿ_test_ustar_namer  r   r   r   r   test_unicode_name1I     

z#UstarUnicodeTest.test_unicode_name1c                 C      |  d |  dt d S Nud   012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345ÿÿue   0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456ÿÿr  r   r   r   r   test_unicode_name2O     
z#UstarUnicodeTest.test_unicode_name2c                 C   r  )Na   01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789a   0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123/40123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u   012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012ÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u  0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123ÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789r  r   r   r   r   test_unicode_longname1U  r  z'UstarUnicodeTest.test_unicode_longname1c                 C   s   |  dt |  dt d S )Nu   01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿ/20123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿÿ/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789r  r   r   r   r   test_unicode_longname2[  s   z'UstarUnicodeTest.test_unicode_longname2c                 C   s&   |  dt |  d |  dt d S )Nu  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901ÿÿ/20123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789u   01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567ÿu  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678ÿr  r   r   r   r   test_unicode_longname3_  s   
z'UstarUnicodeTest.test_unicode_longname3c                 C   r  )Nu   01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345ÿÿu  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456ÿÿr  r   r   r   r   test_unicode_longname4d  r  z'UstarUnicodeTest.test_unicode_longname4Nc                 C   s   t jtd| jdd}t |}|d u r|| n| ||j| W d    n1 s,w   Y  |d u rdt jtddd}|D ]}| ||j  W d    d S W d    d S 1 s]w   Y  d S d S )Nr   r  r  rN   r   )	r   r   r   r   r   r   r   rD   ru   r   ru   excr9   r   r   r   r   r  h  s    
"z!UstarUnicodeTest._test_ustar_namec                 C   r  r  _test_ustar_linkr  r   r   r   r   test_unicode_link1w  r  z#UstarUnicodeTest.test_unicode_link1c                 C   r  r  r  r   r   r   r   test_unicode_link2}  r  z#UstarUnicodeTest.test_unicode_link2c                 C   s   t jtd| jdd"}t d}||_|d u r|| n| ||j| W d    n1 s/w   Y  |d u rgt jtddd}|D ]}| ||j  W d    d S W d    d S 1 s`w   Y  d S d S )Nr   r  r  r   rN   r   )	r   r   r   r   r   r  r   r   rD   r  r   r   r   r    s"   
"z!UstarUnicodeTest._test_ustar_linkr	   )r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  B  s    
r  c                   @   s   e Zd ZejZdd ZdS )GNUUnicodeTestc              
   C   n   dD ]2\}}t jt|dd}z||}W n ty$   | d Y nw W d    n1 s/w   Y  qd S )N))r  u   pax/bad-pax-)r5   u   pax/bad-pax-äöür   r  z%unable to read bad GNU tar pax headerr   r   r   rA   r  rr   r   r7   ru   r9   r   r   r   r   test_bad_pax_header  s   z"GNUUnicodeTest.test_bad_pax_headerN)r   r   r   r   r  r   r  r   r   r   r   r    s    r  c                   @   s   e Zd ZejZdZdd ZdS )PAXUnicodeTestNc              
   C   r  )N))r  u   pax/hdrcharset-)r5   u   pax/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)r   r   r   r   r  r   r  r  r   r   r   r   r    s    r  c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
AppendTestBasec                 C   s(   t | _tj| jrt| j d S d S r	   )r   r   rS   rT   r5  r   r  r   r   r   r   r:     s   zAppendTestBase.setUpr   c              
   C   s   t jtddK}|d}d|_||%}t | j|}||| W d    n1 s.w   Y  W d    n1 s=w   Y  W d    d S W d    d S 1 sUw   Y  d S )Nr5   r   r?   r   )r   r   r   rA   ru   rB   r   )r   r   srcr   r
  r9   r   r   r   _create_testtar  s   
"zAppendTestBase._create_testtarc                 C   s(   |  d| j  | tjtjtd d S )Nr   rw   )r  r   r   r   r   r   r   r   r   r   r   test_append_compressed  s   z%AppendTestBase.test_append_compressedN)r   )r   r   r   r:   r  r  r   r   r   r   r    s    
r  c                   @   s   e Zd ZdZdddZdgdfddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )
AppendTestNc                 C   sH   t j| jd|d}|t d W d    d S 1 sw   Y  d S )Nrw   rr  r   )r   r   r   r   r   )r   r   r9   r   r   r   _add_testfile  s   "zAppendTest._add_testfiler   c                 C   sF   t j| j|d}| | | W d    d S 1 sw   Y  d S )Nrr  )r   r   r   rD   r   )r   rk  r   r9   r   r   r   rH    s   "zAppendTest._testc                 C   s   |    |   d S r	   )r  rH  r   r   r   r   test_non_existing  s   zAppendTest.test_non_existingc                 C   s&   t | jd  |   |   d S )Nr   )r   r   r   r;   r  rH  r   r   r   r   
test_empty  s   zAppendTest.test_emptyc                 C   s.   t d}| | |d | j|d d S )Ns                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   r   rr  )r   r   r  rf   rH  r   r   r   r   test_empty_fileobj  s   


zAppendTest.test_empty_fileobjc                 C   sp   |    t| jd}| }W d    n1 sw   Y  t|}| | |d | jddg|d d S )Nr_   r   r   r   )rk  r   )	r  r   r   rC   r   r   r  rf   rH  rs   r   r   r   test_fileobj  s   



zAppendTest.test_fileobjc                 C   s$   |    |   | jddgd d S )Nr   r   )rk  )r  r  rH  r   r   r   r   test_existing  s   zAppendTest.test_existingc                 C   sJ   t | jd}|| W d    n1 sw   Y  | tj| j d S r   )r   r   r   r   r   r   r  )r   r   rJ   r   r   r   _test_error  s   zAppendTest._test_errorc                 C   rW  )Nrd   r  r   r   r   r   	test_null  r=   zAppendTest.test_nullc                 C   rW  )N                r  r   r   r   r   test_incomplete  r=   zAppendTest.test_incompletec                 C   s   t d }| | d S )Nr   r   r   r   r  r#  r   r   r   test_premature_eof 	  s   zAppendTest.test_premature_eofc                 C   s    t d }| |d  d S )Nr   r  r  r#  r   r   r   test_trailing_garbage	  s   z AppendTest.test_trailing_garbagec                 C   rW  )Ns   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  r   r   r   r   test_invalid	  r=   zAppendTest.test_invalidr	   )r   r   r   r  r  rH  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                   @   $   e Zd Zdd Zdd Zdd ZdS )
LimitsTestc                 C   s   t d}|t j t d}| t|jt j t d}|t j t d}| t|jt j t d}| t|jt j t d}d|_| t|jt j t d}d|_| t|jt j d S )	Nr  r  a   123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/123/longnamea   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/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  ru       )r   r   r   r   r   r  r  r   r  r   r   r   test_ustar_limits	  s    






zLimitsTest.test_ustar_limitsc                 C   sX   t d}|t j t d}d|_|t j t d}d|_| t|jt j d S Nr  r  ru   l          )r   r   r   r  r  r   r   r  r  r   r   r   test_gnu_limits6	  s   


zLimitsTest.test_gnu_limitsc                 C   sR   t d}|t j t d}d|_|t j t d}d|_|t j d S r  )r   r   r   r  r  r   r  r   r   r   test_pax_limitsC	  s   


zLimitsTest.test_pax_limitsN)r   r   r   r  r  r  r   r   r   r   r  	  s    r  c                   @   sr   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	
e de	
eedde	jddd ZdS )MiscTestc                 C   s`   |  tddddd |  tddddd |  tdddd |  td	ddd d S )
Nr      r   r  s   foo     Zfoobarr  r  s   foo bar )rD   r   stnntsr   r   r   r   test_char_fieldsR	  s   zMiscTest.test_char_fieldsc                 C   s   |  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 d S )N   0000001 r`      7777777            r               r                      r   r   s           )rD   r   ntir   r   r   r   test_read_number_fields\	  s&   z MiscTest.test_read_number_fieldsc                 C   s   |  tdd |  tdd |  tjdtjdd |  tjdtjdd	 |  tjd
tjdd |  tjdtjdd |  tjdtjdd |  tjdtjdd |  tjdtjdd |  ttjdtjdd d S )Nr`   r  r  r  r  r  r  r  r  r  r  r  r  r  r  g      Yg      0Bs         gr   )rD   r   itnr  r  r   r   r   r   test_write_number_fieldsp	  s4   
"z!MiscTest.test_write_number_fieldsc                 C   s   |  t tddtj W d    n1 sw   Y  |  t tddtj W d    n1 s5w   Y  |  t tddtj W d    n1 sRw   Y  |  t tddtj W d    d S 1 spw   Y  d S )Nr  r  r  l       l        )r   r  r   r  r   r  r   r   r   r   test_number_field_limits	  s   "z!MiscTest.test_number_field_limitsc                 C   s   h d}t j| t|d d S )N>9   ZSOLARIS_XHDTYPEZEmptyHeaderErrorr  Zcalc_chksumsOutsideDestinationErrorZsymlink_exceptionZEOFHeaderErrorLinkOutsideDestinationErrorversion
tar_filterZSubsequentHeaderErrorpwdFIFOTYPEcopyfileobjr  grpfilemodeZGNUTYPE_SPARSESpecialFileErrorr  r  ZGNUTYPE_LONGLINK	GNU_MAGICrD  ZAREGTYPErC  ZSUPPORTED_TYPESAbsoluteLinkErrormainAbsolutePathErrorZPAX_NAME_FIELDSr  LENGTH_PREFIXr[  r\  SYMTYPEZ
PAX_FIELDSr  CHRTYPEZInvalidHeaderErrorZTruncatedHeaderErrorZExFileObjectZ	GNU_TYPESZREGULAR_TYPESfully_trusted_filterFilterErrorNULr  r  ZXGLTYPEr  rF  ZCONTTYPEdata_filterLinkFallbackErrorr  POSIX_MAGIC)not_exported)r   Zcheck__all__r   )r   r  r   r   r   test__all__	  s   zMiscTest.test__all__c              	   C   s   t jt jtd}| tj.}tdf}t	j
jjtjd|d t| W d    n1 s3w   Y  W d    n1 sBw   Y  | dt|j d S )Nr   zlzma module is not availabler2   )rM  z?
- method xz: CompressionError('lzma module is not available')
)rS   rT   rU   dirname__file__r   r   r   ZCompressionErrorr   rI  rJ  rA  r    r   r   r   	exception)r   fnameexcinforL  r   r   r   .test_useful_error_message_when_modules_missing	  s   z7MiscTest.test_useful_error_message_when_modules_missingzrequires symlink supportchmodzmissing os.chmodos.chmodc              	      s   t jtd  fdd}||_t jtd}t }|jddd |jdtjdd	 |jd|d W d    n1 s<w   Y  t 	| z|
 j d
d W t| t  d S t| t  w )NZ
test127987c                    s.   t j| }t j| g krtd|d S )Nz8should not try to chmod anything outside the destination)rS   rT   realpath
commonpath	Exception)rT   r   r  Ztarget_pathr  r   r   mock_chmod_side_effect	  s   
zRMiscTest.test_deferred_directory_attributes_update.<locals>.mock_chmod_side_effectoutside_tree_dirrp  r  
symlink_to
?rwsrwsrwtr  r   r9   r:  )rS   rT   rU   rR   rM  ArchiveMakerr   r   r  makedirsr   r!  r   r4  )r   
mock_chmodr%  r&  arcr   r$  r   )test_deferred_directory_attributes_update	  s    


z2MiscTest.test_deferred_directory_attributes_updateN)r   r   r   r  r  r  r  r  r  r   r   r   can_symlinkr   rS   rI  rJ  r/  r   r   r   r   r  P	  s    


r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ),CommandLineTestc                 O   s2   t jddg|R i |\}}}|tj dS )N-mr      
)r   Zassert_python_okr   rS   lineseprp   )r   argsr  rcr   errr   r   r   
tarfilecmd	  s   zCommandLineTest.tarfilecmdc                 G   s   t jddg|R  S )Nr2  r   )r   Zassert_python_failurer   r5  r   r   r   tarfilecmd_failure	  s   z"CommandLineTest.tarfilecmd_failurec                 C   st   t dt dg}| tj| t|d}|D ]}|j|tj	
|d qW d    d S 1 s3w   Y  d S )Ntokenize_tests.txt9tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txtr   r  )r   r   r  r   r  r   r   r   rS   rT   r  )r   tar_namefilestfZtardatar   r   r   make_simple_tarfile	  s   "z#CommandLineTest.make_simple_tarfilec                 C   s   t dg}| tj| t|d'}td}|j|t	
dd td}|j|t	
dd W d    d S 1 s=w   Y  d S )Nr;  r   benignrd   rr  ../evil)r   r   r  r   r  r   r   r   r   r   r   )r   r=  r>  r?  rA  Zevilr   r   r   make_evil_tarfile	  s   

"z!CommandLineTest.make_evil_tarfilec                 C   s|   |   \}}}| |d | d|  | d|  | d|  |  dd\}}}| |d | | d d S )Nrd   s   usages   errors   required-lr   )r:  rD   r   lowerr  strip)r   r6  r   r7  r   r   r   test_bad_use	  s   zCommandLineTest.test_bad_usec                 C   s0   t D ]}dD ]}| ||}| |d qqd S )N)-tz--testrd   )testtarnamesr8  rD   r   r=  optr   r   r   r   test_test_command	  s   z!CommandLineTest.test_test_commandc                 C   s6   t D ]}dD ]}| j|d|dd}| d| qqd S )N-vz	--verboserH  r  PYTHONIOENCODINGs   is a tar archive.
)rI  r8  r   rJ  r   r   r   test_test_command_verbose	  s   
z)CommandLineTest.test_test_command_verbosec                 C   s.  t d}| d|\}}}| d| | |d | |d tD ]r}| j|db t|d}| }W d    n1 s?w   Y  z:tt	d}|
|d d	  W d    n1 s^w   Y  | dt	\}}}| |d | |d W tt	 ntt	 w W d    n1 sw   Y  q"d S )
N
zipdir.ziprH      is not a tar archive.rd   r`   )r=  r_   r   r+  )r   r   r:  r   rD   rI  r  r   rC   r   r   r   r  )r   zipnamer6  r   r7  r=  r
  r   r   r   r   test_test_command_invalid_file	  s*   

z.CommandLineTest.test_test_command_invalid_filec              
   C   s   t D ]M}t $}t|d}|jdd W d    n1 s w   Y  W d    n1 s/w   Y  | dd}dD ]}| j||dd}| 	|| q>qd S )NrN   Fr   r   r   )rD  z--listrO  
rI  r   Zcaptured_stdoutr   r   r]   r   rp   r8  rD   r   r=  r   r?  expectedrK  r   r   r   r   test_list_command
  s   
z!CommandLineTest.test_list_commandc              
   C   s   t D ]N}t $}t|d}|jdd W d    n1 s w   Y  W d    n1 s/w   Y  | dd}dD ]}| j|d|dd}| 	|| q>qd S )	NrN   Tr   r   r   rM  rD  rO  rV  rW  r   r   r   test_list_command_verbose
  s   

z)CommandLineTest.test_list_command_verbosec                 C   sD   t d}| d|\}}}| d| | |d | |d d S )NrR  rD  rS  rd   r`   )r   r   r:  r   rD   r   rT  r6  r   r7  r   r   r   test_list_command_invalid_file(
  s
   
z.CommandLineTest.test_list_command_invalid_filec              
   C   s   t dt dg}dD ]8}z0| j|tg|R  }| |d tt}|  W d    n1 s3w   Y  W t	t qt	t w d S )Nr;  r<  )-cz--createrd   )
r   r   r8  r   rD   r   r   r   r   r  r   r>  rK  r   r9   r   r   r   test_create_command/
  s   
z#CommandLineTest.test_create_commandc              
   C   s   t dt dg}dD ]<}z4| j|dtg|R ddi}| d| tt}|  W d    n1 s7w   Y  W t	t qt	t w d S )Nr;  r<  rM  r]  rP  r  s    file created.)
r   r   r8  r   r   r   r   r   r   r  r^  r   r   r   test_create_command_verbose<
  s   
z+CommandLineTest.test_create_command_verbosec              	   C   s   t dg}z9| jdtg|R  }| |d tt}|  W d    n1 s+w   Y  W t	t d S W t	t d S t	t w )Nr;  r]  rd   )
r   r   r8  dotlessnamerD   r   r   r   r   r  )r   r>  r   r9   r   r   r   $test_create_command_dotless_filenameJ
  s   
z4CommandLineTest.test_create_command_dotless_filenamec              	   C   s   t jtd}tdg}z9| jd|g|R  }| |d t	|}|
  W d    n1 s2w   Y  W t| d S W t| d S t| w )Nz.testtarr;  r]  rd   )rS   rT   rU   rR   r   r   r8  rD   r   r   r   r   r  )r   r=  r>  r   r9   r   r   r   (test_create_command_dot_started_filenameT
  s   
z8CommandLineTest.test_create_command_dot_started_filenamec              
   C   s   t dt dg}tttfD ]=}|jsqz1td |j }| jd|g|R  }|	|}|
  W d    n1 s;w   Y  W t| qt| w d S )Nr;  r<  r  r]  )r   r   r$   r)   r-   r   r   r   r8  r!   r   r   r  )r   r>  Zfiletyper=  r   r9   r   r   r   test_create_command_compressed_
  s   
z.CommandLineTest.test_create_command_compressedc              
   C   st   |  t dD ]0}z(tt | |t}W d    n1 s w   Y  | |d W tt qtt w d S )N)-ez	--extractrd   r@  r   r   r   	tarextdirr8  rD   r4  r   rK  r   r   r   r   test_extract_commandn
  s   
z$CommandLineTest.test_extract_commandc              
   C   sz   |  t dD ]3}z+tt | j|dtdd}W d    n1 s#w   Y  | d| W tt qtt w d S )NrM  re  r  rO      file is extracted.)r@  r   r   r   rg  r8  r   r4  rh  r   r   r   test_extract_command_verbosex
  s   

z,CommandLineTest.test_extract_command_verbosec              	   C   s   |  t tjtd}tt z?t|" | 	dtddd | j
dtddddd}| d	| W d    n1 s<w   Y  W tt d S W tt d S tt w )
Ndestre  rN  z--filterr   r)  r  rO  rj  )rC  r   rS   rT   rU   rg  r   r   r   r:  r8  r   r4  )r   destdirr   r   r   r   test_extract_command_filter
  s&   



z+CommandLineTest.test_extract_command_filterc              	   C   sl   |  t z*tt | dtd}W d    n1 sw   Y  | |d W tt d S tt w )Nre  Zspamdirrd   rf  )r   r   r   r   r   (test_extract_command_different_directory
  s   
z8CommandLineTest.test_extract_command_different_directoryc                 C   sn   t d}tt | d|\}}}W d    n1 sw   Y  | d| | |d | |d d S )NrR  re  rS  rd   r`   )r   r   r   r   rg  r:  r   rD   r[  r   r   r   !test_extract_command_invalid_file
  s   
z1CommandLineTest.test_extract_command_invalid_fileN)r   r   r   r8  r:  r@  rC  rG  rL  rQ  rU  rY  rZ  r\  r_  r`  rb  rc  rd  ri  rk  rn  ro  rp  r   r   r   r   r1  	  s,    		


	r1  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ContextManagerTestc                 C   sJ   t t}| |jd W d    n1 sw   Y  | |jd d S )Nzclosed inside runtime contextcontext manager failed)r   r   r   r   rD  r   r   r   r   r   
test_basic
  s   zContextManagerTest.test_basicc              	   C   sv   t t}|  | t# | W d    n1 sw   Y  W d    d S W d    d S 1 s4w   Y  d S r	   )r   r   r   r;   r   r  r   r   r   r   test_closed
  s   
"zContextManagerTest.test_closedc              	   C   sl   |  t}tt}t1 sw   Y  W d    n1 s w   Y  | |jtd | |j	d d S )Nz)wrong exception raised in context managerrr  )
r   r#  r   r   r   r  r   r  r   rD  )r   r  r9   r   r   r   test_exception
  s   
z!ContextManagerTest.test_exceptionc                 C   sX   zt td}t1 sw   Y  W n   Y | tjtdd | |j	d d S )Nr   r   z-context manager wrote an end-of-archive blockrr  )
r   r   r   r#  rD   rS   rT   r  r   rD  r   r   r   r   test_no_eof
  s   zContextManagerTest.test_no_eofc                 C   sF   t td W d    n1 sw   Y  | tjtdd d S )Nr   r   z-context manager wrote no end-of-archive block)r   r   r   r  rS   rT   r  r   r   r   r   test_eof
  s   zContextManagerTest.test_eofc              	   C   s~   t td0}ztj |dd}t1 sw   Y  W n   Y | |jd | |jd W d    d S 1 s8w   Y  d S )Nr   r   r   zexternal file object was closedrr  )r   r   r   r#  r   rD  r   r   r   r   r   r  
  s   "zContextManagerTest.test_fileobjN)	r   r   r   rs  rt  ru  rv  rw  r  r   r   r   r   rq  
  s    		rq  zrequires os.link to be missingc                   @   s   e Zd Zdd Zeeejdddd Z	eeejdddd Z
eeed	d
dd Zeeed	d
dd ZdS )LinkEmulationTestc                 C   sb   | j j|tdd ttjt|d}| }W d    n1 s"w   Y  | t	|t
 d S )Nr)  rL   r_   )r9   rQ   rR   r   rS   rT   rU   rC   rD   r   rG   )r   ru   r
  r   r   r   r   _test_link_extraction
  s
   
z'LinkEmulationTest._test_link_extractionislinkz3Skip emulation - has os.path.islink but not os.linkc                 C   rW  )Nr{   ry  r   r   r   r   test_hardlink_extraction1
     z+LinkEmulationTest.test_hardlink_extraction1c                 C   rW  )Nr   r{  r   r   r   r   test_hardlink_extraction2
  r}  z+LinkEmulationTest.test_hardlink_extraction2r  z Skip emulation if symlink existsc                 C   rW  )Nr   r{  r   r   r   r   test_symlink_extraction1
  r}  z*LinkEmulationTest.test_symlink_extraction1c                 C   rW  )Nr   r{  r   r   r   r   test_symlink_extraction2
  r}  z*LinkEmulationTest.test_symlink_extraction2N)r   r   r   ry  r   rP  r   rS   rT   r|  r~  r  r  r   r   r   r   rx  
  s$    


rx  c                   @   r  )Bz2PartialReadTestc              	      sv   G  fdddt j ttd }tt|d D ]}ztj	 |d | |d W q tj
y8   Y qw d S )Nc                       s0   e Zd ZdZ fddZ fddZ  ZS )z9Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIOFc                    s4   | j rtd|  t|  k| _ t | |S )Nz(infinite loop detected in tarfile.open())hit_eofAssertionErrorrg   rE   r   superrC   )r   r  	MyBytesIO	__class__r   r   rC     s   z>Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIO.readc                    s   d| _ t | j| S r!  )r  r  rf   r9  r  r   r   rf     s   z>Bz2PartialReadTest._test_partial_input.<locals>.MyBytesIO.seek)r   r   r   r  rC   rf   __classcell__r   r  )r  r   r  	  s    r  r   r`   r   )r   r   r*   compressr   r   r   rangerE   r   r   )r   r   r   rp  r   r  r   _test_partial_input  s   z&Bz2PartialReadTest._test_partial_inputc                 C   rW  )NrN   r  r   r   r   r   test_partial_input  r=   z%Bz2PartialReadTest.test_partial_inputc                 C   rW  )Nr  r  r   r   r   r   test_partial_input_bz2  r=   z)Bz2PartialReadTest.test_partial_input_bz2N)r   r   r   r  r  r  r   r   r   r   r    s    r  c                  C   sZ   z
dd l } dd l}W n
 ty   Y dS w | dd dkr dS |dd dkr+dS dS )Nr   FrootT)r  r  ImportErrorgetpwuidgetgrgid)r  r  r   r   r   root_is_uid_gid_0#  s   r  chownzmissing os.chowngeteuidzmissing os.geteuidc                   @   s   e Zd Zedd Zeedd Zej	dej	dej	ddd	 Z
ej	dej	dej	dd
d Zee dej	dej	dej	ddd Zej	ddd ZdS )NumericOwnerTestc                 C   s   t d}| ddtj|f|ddtjd f|ddtj|fg}ttd-}|D ]!\}}}}	}
t|}||_||_	d	|_
d	|_|	|_|||
 q%W d    tS 1 sRw   Y  tS )
Ns   contentc   b   M   L   X   W   r   r  )r   r   r   r\  r  r   r   r   r   r   r  r  r  r   )
filename_1	dirname_1
filename_2rJ   r  tarflru   r   r   typcontentsr   r   r   r   _make_test_archive8  s&   


z#NumericOwnerTest._make_test_archivec                 c   sr    d| _ d}d}|}|}tj||}t|||}t|}||||fV  W d    d S 1 s2w   Y  d S )Nr   znumeric-owner-testfiler  )r  rS   rT   rU   r  r  r   r   )mock_geteuidr  r  r  r  r  Ztar_filenamer  r   r   r   _setup_testP  s   "zNumericOwnerTest._setup_testzos.chownr   z
os.geteuidc           
      C   s   |  |\}}}}|j|tddd |j|tddd W d    n1 s&w   Y  tjt|}tjt|}	|jtj	|ddtj	|	ddgdd d S )	NTr)  Znumeric_ownerrM   r  r  r  r  Z	any_order)
r  rQ   rR   rS   rT   rU   assert_has_callsr   rI  call)
r   r  r-  
mock_chownr  r  _r  f_filename_1f_filename_2r   r   r   test_extract_with_numeric_ownerf  s    


z0NumericOwnerTest.test_extract_with_numeric_ownerc                 C   s   |  |\}}}}|jtddd W d    n1 sw   Y  tjt|}tjt|}	tjt|}
|jtj	|ddtj	|	ddtj	|
dd	gdd
 d S )NTr)  r  r  r  r  r  r  r  r  )
r  r!  rR   rS   rT   rU   r  r   rI  r  )r   r  r-  r  r  r  r  r  r  Zf_dirname_1r  r   r   r   "test_extractall_with_numeric_owner{  s   
z3NumericOwnerTest.test_extractall_with_numeric_ownerz uid=0,gid=0 must be named "root"c                 C   sd   |  |\}}}}|j|tddd W d    n1 sw   Y  tjt|}||dd d S )NFr)  r  r   )r  rQ   rR   rS   rT   rU   Zassert_called_with)r   r  r-  r  r  r  r  r  r   r   r   "test_extract_without_numeric_owner  s   
z3NumericOwnerTest.test_extract_without_numeric_ownerc              	   C   sN   |  |\}}}}| t|j|tdd W d    d S 1 s w   Y  d S )NFT)r  r   r  rQ   rR   )r   r  r  r  r  r   r   r   test_keyword_only  s
   "z"NumericOwnerTest.test_keyword_onlyN)r   r   r   r  r  r   r  r   rI  rJ  r  r  r   r  r  r  r   r   r   r   r  /  s.    	










r  c                   @   rn  )ReplaceTestsc                 C   sN   | j d}|jdd}| |jd | |jd | | j djd d S )Nr?   z
misc/otherrZ  )r9   rA   r   rD   ru   r   rG  replacedr   r   r   test_replace_name  s   zReplaceTests.test_replace_namec                 C   sN   | j d}| }d|jd< | |jd d | | j djd d d S )Nr  not-barr  r   r9   rA   r   r  rD   r  r   r   r   test_replace_deep  s   
zReplaceTests.test_replace_deepc                 C   sR   | j d}|jdd}d|jd< | |jd d | | j djd d d S )Nr  F)Zdeepr  r  r  r  r   r   r   test_replace_shallow  s   
z!ReplaceTests.test_replace_shallowc              	   C   s~   | j d}dD ]4}| j|d$ |jdi |d i}| t||d  | t||d  W d    n1 s7w   Y  qd S )Nr?   )ru   r  r   r  r   r   r  r  	attr_namer   )r9   rA   r  r   rD   r   r  )r   rG  r  r  r   r   r   test_replace_all  s   zReplaceTests.test_replace_allc                 C   sH   | j d}| t |jdd W d    d S 1 sw   Y  d S )Nr?   i[)r	  )r9   rA   r   r  r   )r   rG  r   r   r   test_replace_internal  s   "z"ReplaceTests.test_replace_internalN)r   r   r   r  r  r  r  r  r   r   r   r   r    s    	r  c                   @   st   e Zd ZdZedd Zedd Zdd Zedd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )NoneInfoExtractTestsNc                    sj   t jtddd}ttd  _d|_|j j j	d |
  t fddt jd	D  _d S )
NrN   r5   r6   Zextractall_ctrlr   rL   c                 3   s    | ]	}|  jV  qd S r	   )relative_tocontrol_dirr&  pre  r   r   	<genexpr>  s
    

z2NoneInfoExtractTests.setUpClass.<locals>.<genexpr>**/*)r   r   r   r   r   rR   r  r  r!  extraction_filterr;   setglobcontrol_paths)rb  r9   r   re  r   rc    s   zNoneInfoExtractTests.setUpClassc                 C   rd  r	   )shutilr4  r  re  r   r   r   rf    rg  z"NoneInfoExtractTests.tearDownClassc                    sX   t  fddt dD }| jdkr#dD ]
}|t| q| | j| d S )Nc                 3   s    | ]}|  V  qd S r	   )r  r  r  r   r   r    s
    
z;NoneInfoExtractTests.check_files_present.<locals>.<genexpr>r  r   )r  r  r  )r  r   r   r  r  discardrD   r  )r   r  Z	got_pathsrT   r   r  r   check_files_present  s   
z(NoneInfoExtractTests.check_files_presentc                 g   s    t td }d| j_| j D ]}|D ]}t||d  qqt| | jj	|dd | 
| |V  W d    d S 1 s@w   Y  d S )NZextractall_noner   r)  rL   )r   r   rR   r9   r  r   setattrr   r=  r!  r  )r   
attr_namesr5  rG  r  r   r   r   extract_with_none  s   
"z&NoneInfoExtractTests.extract_with_nonec                 C   s   t t j}| dI}t |dD ]7}| j|d' z| j}W n ty4   |	 s2 Y n
w | 
| j| W d    n1 sHw   Y  qW d    d S 1 sYw   Y  d S )Nr  r  rT   )r   r   rR   r1  st_mtimer  r  r  r  
is_symlinkZassertGreaterEqual)r   Znowr5  rT   r  r   r   r   test_extractall_none_mtime  s"   "z/NoneInfoExtractTests.test_extractall_none_mtimec              
   C   s   t t j}t td }|d | j}| dE}t |dD ]3}| j|d# |	 r>| 
| j| n| rK| 
| j| W d    n1 sUw   Y  q'W d    d S 1 sfw   Y  d S )Nregular_filer   r   r  r  )r   r   rR   r1  r2  
write_textr  r  r  is_dirrD   is_file)r   Zdir_moder  Zregular_file_moder5  rT   r   r   r   test_extractall_none_mode  s$   

"z.NoneInfoExtractTests.test_extractall_none_modec                 C   0   |  d	 W d    d S 1 sw   Y  d S )Nr   r  r   r   r   r   test_extractall_none_uid!     "z-NoneInfoExtractTests.test_extractall_none_uidc                 C   r  )Nr   r  r   r   r   r   test_extractall_none_gid%  r  z-NoneInfoExtractTests.test_extractall_none_gidc                 C   r  )Nr  r  r   r   r   r   test_extractall_none_uname)  r  z/NoneInfoExtractTests.test_extractall_none_unamec                 C   r  )Nr  r  r   r   r   r   test_extractall_none_gname-  r  z/NoneInfoExtractTests.test_extractall_none_gnamec                 C   s6   |  dddd	 W d    d S 1 sw   Y  d S )Nr   r   r  r  r  r   r   r   r   test_extractall_none_ownership1  s   "z3NoneInfoExtractTests.test_extractall_none_ownership)r   r   r   r  ru  rc  rf  r  r   r  r  r  r  r  r  r  r  r   r   r   r   r    s     




r  c                   @      e Zd ZdZdS )NoneInfoExtractTests_Datar   Nr   r   r   r  r   r   r   r   r  5  rS  r  c                   @   r  )!NoneInfoExtractTests_FullyTrustedr)  Nr  r   r   r   r   r  8      r  c                   @   r  )NoneInfoExtractTests_Tarr9   Nr  r   r   r   r   r  <  rS  r  c                   @   rQ  )NoneInfoExtractTests_DefaultNr  r   r   r   r   r  ?  r  r  c                   @   r  )NoneInfoTests_Miscc                 C   s  t  }tjtjtjfD ]~}| j|dn tj|d|d}|t	}z|
| W n ty9   |tjkr6n Y nBw dD ]>}| j|d. |jdi |d i}| t|  |
| W d    n1 sfw   Y  W d    n1 suw   Y  q<W d    n1 sw   Y  qd S )N)	tarformatr   )r   r   r   )r  r   r   r   r  r  r  r   )r   r   r   r   r  r  r  r   r  r   r   r#  r   r   r  )r   bior  r9   rI   r  r  r   r   r   test_addD  s:   

zNoneInfoTests_Misc.test_addc                 C   s  dhdhdhdhdhdhddhddhfD ]}| j |d tjtdd	}tjt d
dd}tt	d| |
  W d    n1 sHw   Y  | D ]}|D ]}t||d  qUqQtjt d
dd}tt	d| |
  W d    n1 sw   Y  t|   |   D ]*\}}|dhkrtd|r| |d q|dhkrtd|r| |d q|dhkrtd|r| |d q|dhkr|dr|d\}	}
|d\}}| ||
 | |d q|dhkr|dr|d\}	}
|d\}}| ||	 | |d q|dhkrC|drC|d\}	}
|d\}}| ||
 | |d q|dhkrj|drj|d\}	}
|d\}}| ||	 | |d q|ddhkr|dr|d\}	}
|d\}}| ||
 | |d q|ddhkr|dr|d\}	}
|d\}}| ||	 | |d q| || qW d    n	1 sw   Y  W d    n	1 sw   Y  qd S )Nr  r   r   r   r  r  )r  r5   r   r   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/s   None   /100)r  r  r  r  )r  r  r  r  )r  r   r   r   r   rW   r   r   r   r   r]   r   r  rF  r   r   r  rematchrD   r  r   endswith)r   r  r9   Ztio_prevrG  r  Ztio_newrX  gotZexp_userZ	exp_groupZgot_userZ	got_groupr   r   r   r   ^  s   


 zNoneInfoTests_Misc.test_listN)r   r   r   r  r   r   r   r   r   r  C  s    r  c                 C   s   | dd }t jdd|d  t jdd|d  B t jdt jt jB t jd|d  B t jdd|d  B t jdd|d	  B t jdt jt jB t jd|d
  B t j	dd|d  B t j
dd|d  B t jdt jt jB t jd|d  B }|S )zInverse of `stat.filemode` (for permission bits)

    Using mode strings rather than numbers makes the later tests more readable.
    r`   Nr   )rN   -)r   r  )rp  r  rj   Src   r        r     )rp  r  r   Tr  )r1  S_IRUSRS_IWUSRS_IXUSRS_ISUIDS_IRGRPS_IWGRPS_IXGRPS_ISGIDS_IROTHS_IWOTHS_IXOTHS_ISVTX)r   Zstr_moderesultr   r   r   _filemode_to_int  sF   



r  c                   @   sH   e Zd ZdZdd Zdd Zdd Zddddddd	d
dZdd ZdS )r+  zHelper 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!
    c                 C   s   t  | _d S r	   )r   r   r  r   r   r   r   rC    r=   zArchiveMaker.__init__c                 C   s   t jd| jd| _| S )Nr   r  )r   r    r  tar_wr   r   r   r   	__enter__  s   zArchiveMaker.__enter__c                 G   s    | j   | j | _d | _d S r	   )r  r;   r  r   r  )r   r  r   r   r   __exit__  s   

zArchiveMaker.__exit__N)r  r(  hardlink_tor   rF   contentc                K   s   t |}t|jdi |}	|dur t|t r| }t|}|dur0||	_|du r0t|	j}|r7t	||	_
|durCtj}t ||	_|durOtj}t ||	_|dr[|du r[tj}|durb||	_|	 rlt|}
nd}
| j|	|
 dS )a  Add a member to the test archive. Call within `with`.

        Provides many shortcuts:
        - default `type` is based on symlink_to, hardlink_to, and trailing `/`
          in name (which is stripped)
        - size & content defaults are based on each other
        - content can be str or bytes
        - mode should be textual ('-rwxrwxrwx')

        (add more! this is unstable internal test-only API)
        Nr   r   )r   r   r   r   r,  rp   rE   rF   r   r  r   r  r  rF  r  r  r  r_  r   r   r  r   )r   ru   r  r(  r  r   rF   r  r  rI   r   r   r   r   r     s4   




zArchiveMaker.addc                 K   s    t | j}tjdd|i|S )z9Open the resulting archive as TarFile. Call after `with`.r   Nr   )r   r   r  r   r   )r   r  r  r   r   r   r     s   zArchiveMaker.open)	r   r   r   __doc__rC  r  r  r   r   r   r   r   r   r+    s    
)r+  c                   @   sL  e Zd Zeed Zed ZedddddZ			dLd	d
Z
dd ZdMddZdd Zdd Zdd Zejdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+dJdK Z,dS )NTestExtractionFiltersouterdirrl  Tr   )
check_flagignored_treesc                c   sJ   t | j | jd }|d z
|j| j|d W n ty8 } z|| _d| _t	 | _
W Y d}~n0d}~ww |D ]}t | j|   q;d| _d| _t	| jd| _
| j
| j | j
| z	| V  W |  n|  w | jry| j| | j
t	  |r| | d W d   dS W d   dS 1 sw   Y  dS )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.

        A file called 'flag' is made in outerdir (i.e. outside destdir)
        before extraction; it should not be altered nor should its contents
        be read/copied.

        *ignored_trees* is a set of directories to remove (including their
        contents) right after the archive is extracted. It is a workaround
        for Path.glob() failing to get all files in Python 3.10 and below.
        flagz
capture merL   TNFr  )r   r=  r  r  r!  rm  r#  raised_exceptionreraise_exceptionr  expected_pathsr4  resolver  r  r;   rD   r8  )r   r9   rM   r  r  Z	flag_pathr  Zignored_treer   r   r   check_context  s<   

"z#TestExtractionFilters.check_contextNc              
   C   s  | j r| j ttj| j| }| || j | j	| |dur9t
jdkr9tt| j}| || |du rJt|trJ|drJtj}|dur| j|  }t|}	z|	|krg| ||	 W nT ty }
 z|
d|	d|  d}
~
ww |tjks|du r| |  n+|tjkr| |  n|tjkr| |  n|tj kr| |!  nt"||dur| | j#| |dur| |$ | |j%D ]}| j&| qdS )z'Check a single file. See check_context.Nr*  r   z	expected=z, got=)'r  r   r   rS   rT   normpathrm  r   r  remover   r0  r1  r  S_IMODEr2  rD   r,  r   r  r   r  readlinkr   samefiler#  Zadd_noter\  r  r  r  is_fifor  r  NotImplementedErrorr  r8  parentsr  )r   ru   r  r(  r   rF   r  rT   r  rX  rp  parentr   r   r   expect_file=  sL   




z!TestExtractionFilters.expect_filec                    s8   | j |   | j tjd  fdd| jD | _dS )z-Check a directory; forget about its contents.r  c                    s   h | ]	} |j vr|qS r   )r%  r  Z	tree_pathr   r   	<setcomp>r  s
    
z8TestExtractionFilters.expect_any_tree.<locals>.<setcomp>N)rm  r  r'  r   r  r  r  r   r)  r   expect_any_treen  s
   
z%TestExtractionFilters.expect_any_treer  c                 C   sH   |  || | jd ur| jW d    n1 sw   Y  d| _| jS r!  )r   r  r  )r   exc_typeZ
message_rer   r   r   expect_exceptionw  s   
z&TestExtractionFilters.expect_exceptionc              	   C   sx   t  }|d W d    n1 sw   Y  dD ]}| | | | d W d    n1 s4w   Y  qd S )Nz
benign.txt)r)  r9   r   r+  r   r  r   r'  r   r.  rM   r   r   r   test_benign_file~  s   z&TestExtractionFilters.test_benign_filec              	   C   s   t  }|| jd  W d    n1 sw   Y  | | d | d W d    n1 s3w   Y  dD ]:}| | |( t| jdr^t| jd}| | d n| 	t
jd W d    n1 sow   Y  q:d S )Nzescaped.evilr)  z../escaped.evilr9   r   r   z/escaped.evilz+['"].*escaped.evil['"] has an absolute path)r+  r   r  r  r   r'  r   r  lstripr-  r   r  )r   r.  rM   Zouterdir_strippedr   r   r   test_absolute  s&   z#TestExtractionFilters.test_absolutec                 C   s  t  }|jddd |jddd |d W d    n1 s!w   Y  t r| | d. | jd urF| t 	 W d    d S | j	ddd | j	ddd | 	d W d    n1 scw   Y  | | d	 | t
jd
 W d    n1 sw   Y  | | d | t
jd W d    d S 1 sw   Y  d S | | d | 	d W d    n1 sw   Y  | | d	 | 	d W d    n1 sw   Y  | | d | 	d W d    d S 1 sw   Y  d S )Ncurrentr  r'  r&  z
current/..parent/evilr)  rB  r9   T'parent/evil' would be extracted to ['"].*evil['"], which is outside the destinationr   zK'parent' would link to ['"].*outerdir['"], which is outside the destination)r+  r   r   r0  r  r   r  r-  rm  r'  r   r   r  r   r.  r   r   r   test_parent_symlink  sH   

	""z)TestExtractionFilters.test_parent_symlinkc              
   C   s  t  }d}tjdkrd}n+dtjv r5t| jjd}d}tt	| j
| }|| t||  }d| }ntdd}d}	|D ]*}
|jtj||tjd	d
 |jtj||
|d tj||}tj|	|
}	q?tjjg |dR  }dgt| }|j|tjj| d |jdtj|dd |jdtjddd |jddd |jddd W d    n1 sw   Y  | dX | j| dd|hd; tjdkr| ttf n&| jr| t n| jddd | jddd | jdtjd | jd|d W d    n	1 sw   Y  W d    n	1 sw   Y  dD ]V}| |E | j| |d+ | ttf}t|trYtjdkrQ| |jd n| |j t j! W d    n	1 sdw   Y  W d    n	1 stw   Y  q$d S )NZabcdefghijklmnopr*  ZdddddddddddddddddddddddddPC_PATH_MAXr`   dz1Need to guess component length for {sys.platform}r   
drwxrwxrwxr*  r'  Zllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllr  escapeZflaglinkr  r  Z	overwrite)r  zescape/newfilenewr)  F)rM   r  r  z
../newfiler(  rw   r1  rL   )r  r     )"r+  r   r0  rS   pathconf_namespathconfr  r&  rE   r   rm  r$  r   rT   rU   r   r  r  r  r   r-  r   rm  r  r  r'  r  r  r,  r   winerrorrD   errnoZENAMETOOLONG)r   r.  ZstepsZ	componentZmax_path_lenZpath_sep_lenZdest_lenZcomponent_lenrT   Z	step_pathiZlinkpathZparent_segmentsrM   r  r   r   r   test_realpath_limit_attack  st   


)
   z0TestExtractionFilters.test_realpath_limit_attackc                 C   sf  t  rXtjtd}t| tdtj|d ttj|dddd W d    n1 s2w   Y  tj	tj|drEd}ntj	tj|ddrTd}nt
d	t }|jddd
 |jddd
 |d W d    n1 syw   Y  | | d* t  r| jddd
 | jddd
 | d n
| d | d W d    n1 sw   Y  | | d t  r| tjd n
| d | d W d    n1 sw   Y  | | d: t  r|r| tjd n"| tjd n| d | d W d    d S W d    d S W d    d S 1 s,w   Y  d S )NZresolution_testr  r4  r  r  r   TFz#Could not determine link resolutionr'  zcurrent/parentr5  r)  r&  rB  zcurrent/r9   r6  r   zS'current/parent' would link to ['"].*outerdir['"], which is outside the destination)r   r0  rS   rT   rU   rR   r   r  r   r5  r  r+  r   r  r'  r-  r   r   r  )r   ZtestpathZdotdot_resolves_earlyr.  r   r   r   test_parent_symlink2  sl   


	



$z*TestExtractionFilters.test_parent_symlink2c                 C   s4  t  }|jd| jd |d W d    n1 sw   Y  | | d t r;| jd| jd | d n| d W d    n1 sJw   Y  | | d t rd| t	j
d n| d W d    n1 ssw   Y  | | d | t	jd	 W d    d S 1 sw   Y  d S )
Nr&  r'  r5  r)  rB  r9   r6  r   &'parent' is a link to an absolute path)r+  r   r  r  r   r   r0  r'  r-  r   r   r  r7  r   r   r   test_absolute_symlinkn  s4   


"z+TestExtractionFilters.test_absolute_symlinkc                 C   s   t  }|jd| jd d W d    n1 sw   Y  | | d | td W d    n1 s6w   Y  | | d | td W d    n1 sTw   Y  | | d | tjd W d    d S 1 stw   Y  d S )	Nr&  r   r=  r)  z.*foo. not foundr9   r   rG  )	r+  r   r  r  r   r-  r  r   r  r7  r   r   r   test_absolute_hardlink  s   "z,TestExtractionFilters.test_absolute_hardlinkc              	   C   s   t  }|jddd W d    n1 sw   Y  z4| j| dd! t r=t| jtr5| 	t n	| j
ddd n	 W d    n1 sHw   Y  W n	 tyW   Y nw dD ]!}| | | | 	tjd W d    n1 svw   Y  qZd S )N../mooz..//tmp/moor'  r)  rL   r1  zH'../moo' would be extracted to '.*moo', which is outside the destination)r+  r   r  r   r   r0  r,  r  rm  r-  r'  r   r   r/  r   r   r   test_sly_relative0  s2   z(TestExtractionFilters.test_sly_relative0c              	   C   s   t  }|d |jddd W d    n1 sw   Y  | | d | jdtjd t r;| jdd	d W d    n1 sEw   Y  d
D ]!}| | | | 	tj
d W d    n1 shw   Y  qLd S )Nztmp/ztmp/../../mooztmp/../..//tmp/moor'  r)  tmpr(  rJ  ztmp/../../tmp/moor1  zU'tmp/../../moo' would be extracted to ['"].*moo['"], which is outside the destination)r+  r   r  r   r'  r   r  r   r0  r-  r   r/  r   r   r   test_sly_relative2  s&   
z(TestExtractionFilters.test_sly_relative2c              	   C   s   t  (}|jddd |jdtjddd |jdtjd	ddd
 W d    n1 s.w   Y  dD ]<}| | |* | jddd | jddd t	 r[| jdddd n| jddd W d    n1 slw   Y  q5d S )Ntargetdir/targetr  r  linkdir/hardlink	targetdirr  r=  linkdir/symlinkr  r'  r9   r   r)  z../targetdir/targetrF   r(  
r+  r   rS   rT   rU   r  r   r'  r   r0  r/  r   r   r   test_deep_symlink  s,   
	z'TestExtractionFilters.test_deep_symlinkc              	   C   s8  t  :}|jddd |jdtjddd |jddd	 |jd
tjddd |jdtjddd W d    n1 s@w   Y  dD ]R}| | |@ | jddd	 | jd
dd	 | jddd	 t	 r|| jdddd | jdddd n| jddd	 | jddd	 W d    n1 sw   Y  qGd S )NrQ  Zhardlinkr'  Zsymlink2ZlinkdirZ	hardlink2rN  r  r  rO  rP  r  r=  zlinkdir/hardlink2r  rR  rS  rT  r/  r   r   r   test_chains  s6   z!TestExtractionFilters.test_chainsc              
   C   s  t  >}|d |d |jdtjddd |jdtjddd	d |jdd
d |jdtjddd W d    n1 sDw   Y  | | d. t s]| 	t
j ntjdkri| 	t
j n| 	t
jd}| |jt
j W d    n1 sw   Y  dD ]b}| |S | | |; t s| d | d | d n| d | d | jddd | jddd | jdd
d W d    n1 sw   Y  W d    n1 sw   Y  qd S )Nz	a/t/dummyzb/crw   r   r'  zc/escaper  Z	link_hererx   Zboomr<  r=  r   r*  zJlink 'boom' would be extracted as a copy of 'c/escape', which was rejected)r9   r)  zc/z
a/t/escapez../../link_here)r+  r   rS   rT   rU   r  r   r   r0  r-  r   r  r   r0  r  r   	__cause__r  r'  )r   r.  rp  rM   r   r   r   test_sneaky_hardlink_fallback  sV   






 z3TestExtractionFilters.test_sneaky_hardlink_fallbackc              
   C   s   t  }|jdtjdddddd |jddd W d    n1 s$w   Y  dD ]:}| | |( t rU| j	ddd |dkrM| j	ddd n	| j	dd	d n	 W d    n1 s`w   Y  q+d S )
Nr<  r  r  z	link-herer'  r  rR  r   zlink/link/../../link-here)
r+  r   rS   rT   rU   r  r   r   r0  r'  r/  r   r   r   test_exfiltration_via_symlink4  s$   z3TestExtractionFilters.test_exfiltration_via_symlinkc              	   C   s  t  $}|jddd |jddd |jddd |jdd	d W d    n1 s*w   Y  d
D ]X}| | |F}t sF| d n!|dkrY| jdd	d | jddd n| jdd	d | jddd tjdkrz|j	
 j}| |d@ d W d    n1 sw   Y  q1d S )Nza/pwnr  r'  za/pwn/r;  r   zx/../za/xz../rR  r   r*  r+  )r+  r   r  r   r   r0  r'  r   r0  r  r1  r2  r  )r   r.  rM   ccr2  r   r   r   test_chmod_outside_dirJ  s,   
z,TestExtractionFilters.test_chmod_outside_dirc              	   C   s   t   }|d |d |jddd |jddd W d    n1 s&w   Y  dD ].}| | |}| d | d | d | d W d    n1 sVw   Y  q-d S )	Ndir/zdir/../afileZlink1r=  Zlink2zdir/../dir/../afilerR  Zafiler.  )r   r.  rM   r[  r   r   r   test_link_fallback_normalizesi  s   




z3TestExtractionFilters.test_link_fallback_normalizesc              
   C   s  t  9}|jddd |jddd |jddd |jdd	d |jd
dd |jddd |jddd W d    n1 s?w   Y  tjtd}t|d W d    n1 s[w   Y  zbt|jtj	B tj
B tjB }zt|| W n" ty } z|jttddkr| d n W Y d }~nd }~ww t|j}|tj	@ rdnd}|tj@ rdnd}|tj
@ rdnd}W t| nt| w t| t|jtj	B tj
B tjB }t|| t|j}|tj	@ rdnd}	|tj@ rdnd}
|tj
@ rdnd}t| | | dQ | jdd| d| d| d | jddd | jddd | jdd	d | jd
dd | jdd| d|	 d | jdd|
 d| d|	 d W d    n	1 sgw   Y  | | d9 | jddd | jddd | jddd | jdd	d | jd
dd | jddd | jddd W d    n	1 sw   Y  | | dF tt| j j}| jddd | jddd | jdd d | jdd!d | jd
d"d | jd|d | jd|d W d    d S 1 sw   Y  d S )#NZall_bitsr)  r   Z	perm_bitsz
?rwxrwxrwxZexec_group_otherz
?rw-rwxrwxZread_group_onlyz
?---r-----Zno_bitsz
?---------r]  z
?---rwsrwtzdir_all_bits/ztmp.filer   ZEFTYPEr   z?chmod() failed with EFTYPE: regular users cannot set sticky bitr   rp  rj   r)  z?rwr  z?---rwr9   z
?rwxr-xr-xz
?rw-r-xr-xz
?---r-xr-xr   z
?rw-r--r--z
?rw-r-----z
?rw-------)r+  r   rS   rT   rU   rR   r   r1  r2  r  r  r  r  r  rC  r   rY  r  r   r   r  r'  r  r   r  )r   r.  Ztmp_filenameZnew_moder  Zgot_modeZ_t_fileZ
_suid_fileZ
_sgid_fileZ_t_dirZ	_suid_dirZ	_sgid_dirZnormal_dir_moder   r   r   
test_modesy  s   
	


	
$z TestExtractionFilters.test_modesc              	   C   s   t  }|jdtjd W d    n1 sw   Y  dD ])}| | | ttdr6| jdtjd n	 W d    n1 sAw   Y  q| | d | 	tj
d W d    d S 1 sbw   Y  d S )Nr   r(  )r)  r9   mkfifor   z'foo' is a special file)r+  r   r   r  r  r   r   rS   r'  r-  r	  r/  r   r   r   	test_pipe  s"   
"zTestExtractionFilters.test_pipec              	   C   s   t jt jt jfD ]Q}t d}||_t |d}| || t |d}| 	|j| | 
t j}t |d W d    n1 sBw   Y  | |jjt j | 	|jjjd qd S )Nr   r   )r   r  r  r[  r   r  r  r  r  rD   r   r	  r  r   r  rI   ru   )r   Zspecial_typerI   Ztrustedr9   cmr   r   r   test_special_files  s   
z(TestExtractionFilters.test_special_filesc                 C   sX   t jt}| D ]}t |d}| || qW d    d S 1 s%w   Y  d S )Nr   )r   r    r   r   r   r  r  r   r9   rI   Zfilteredr   r   r   test_fully_trusted_filter  s   "z/TestExtractionFilters.test_fully_trusted_filterc                 C   sp   t jjtdd&}| D ]}t |d}| |j|j | |j|j qW d    d S 1 s1w   Y  d S Nr5   r   r   )	r   r    r   r   r   r  r  ru   r  rd  r   r   r   test_tar_filter  s   "z%TestExtractionFilters.test_tar_filterc              
   C   s   t jjtdd3}| D ]%}zt |d}W n
 t jy!   Y qw | |j|j | |j	|j	 qW d    d S 1 s>w   Y  d S rf  )
r   r    r   r   r   r  r  r  ru   r  rd  r   r   r   test_data_filter  s   "z&TestExtractionFilters.test_data_filterc              	   C   s   t  }|d W d   n1 sw   Y  t| . | | d | d W d   n1 s6w   Y  W d   dS W d   dS 1 sNw   Y  dS )z6Ensure the default filter does not warn (like in 3.12)r   N)r+  r   r   Zcheck_no_warningsr  r   r'  r7  r   r   r   test_default_filter_warns_not  s   "z3TestExtractionFilters.test_default_filter_warns_notc                 C   sV   t td}dd }||_| |d  | d W d    d S 1 s$w   Y  d S )NrN   c                 S      | j dkr| S d S Nr?   rZ  rI   rT   r   r   r   strict_filter     
zSTestExtractionFilters.test_change_default_filter_on_instance.<locals>.strict_filterr?   )r   r    r   r  r  r'  )r   r9   rm  r   r   r   &test_change_default_filter_on_instance  s   "z<TestExtractionFilters.test_change_default_filter_on_instancec              	   C   s   dd }t td}tt jdt|, | |d  | d W d    n1 s+w   Y  W d    d S W d    d S 1 sCw   Y  d S )Nc                 S   rj  rk  rZ  rl  r   r   r   rm    rn  zPTestExtractionFilters.test_change_default_filter_on_class.<locals>.strict_filterrN   r  r?   )r   r    r   r   r   r  r  r'  )r   rm  r9   r   r   r   #test_change_default_filter_on_class  s   
"z9TestExtractionFilters.test_change_default_filter_on_classc                 C   sX   G dd dt j}|td}| |d  | d W d    d S 1 s%w   Y  d S )Nc                   @   rU  )zQTestExtractionFilters.test_change_default_filter_on_subclass.<locals>.TarSubclassc                 S   s   |j dkr|S d S rk  rZ  r   rI   rT   r   r   r   r  (  rn  zcTestExtractionFilters.test_change_default_filter_on_subclass.<locals>.TarSubclass.extraction_filterNr  r   r   r   r   TarSubclass'  r[  rr  rN   r?   )r   r    r   r  r'  )r   rr  r9   r   r   r   &test_change_default_filter_on_subclass&  s
   
"z<TestExtractionFilters.test_change_default_filter_on_subclassc                 C   sN   t td}d|_| |d  | t W d    d S 1 s w   Y  d S )NrN   r   )r   r    r   r  r  r-  r  r   r   r   r   $test_change_default_filter_to_string2  s
   "z:TestExtractionFilters.test_change_default_filter_to_stringc                    s    fdd}t  }|d |d |d W d    n1 s#w   Y   | |  d  d W d    d S 1 sFw   Y  d S )Nc                    s6     | j | jdkr| jddS | jdkrd S | S )N	move_thismovedrZ  ignore_this)r  rm  ru   r   rl  r   r   r   custom_filter9  s   

z?TestExtractionFilters.test_custom_filter.<locals>.custom_filterru  rw  Zkeeprv  r.  )r   rx  r.  r   r   r   test_custom_filter8  s   


"z(TestExtractionFilters.test_custom_filterc                 C   sp   t  }|d W d    n1 sw   Y  | | d | t W d    d S 1 s1w   Y  d S )Nr   zbad filter name)r+  r   r  r   r-  r  r7  r   r   r   test_bad_filter_nameI  s   "z*TestExtractionFilters.test_bad_filter_namec              	   C   s   G dd d}t  }|d |jddd |d W d    n1 s&w   Y  | %}| | | | d W d    n1 sGw   Y  W d    n1 sVw   Y  | |jd | |jd d S )	Nc                   @   r  )zBTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilterc                 S   s
   d| _ | S rc  )num_files_processedr   r   r   r   r  T  s   zLTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__enter__c                 S   s:   zt ||}W n t jy   Y d S w |  jd7  _|S )Nr`   )r   r  r  r{  rq  r   r   r   __call__X  s   zKTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__call__c                 W   s
   d| _ d S )NT)done)r   exc_infor   r   r   r  `     
zKTestExtractionFilters.test_stateful_filter.<locals>.StatefulFilter.__exit__N)r   r   r   r  r|  r  r   r   r   r   StatefulFilterS  s    r  ZgoodZbadr   r'  rc   T)r+  r   r  r   r'  rD   r{  r}  )r   r  r.  rx  r   r   r   test_stateful_filterO  s   
z*TestExtractionFilters.test_stateful_filterc                 C   s4  dd }dd }dd }dd }d	d
 }t  }|d W d    n1 s'w   Y  | |jdd| W d    n1 sAw   Y  | |jdd| W d    n1 s[w   Y  | |jdd| W d    n1 suw   Y  | |jdd| | tj W d    n1 sw   Y  | |jdd| | t W d    n1 sw   Y  | |jdd| W d    n1 sw   Y  | |jdd| | tj W d    n1 sw   Y  | |jdd| | t	 W d    n	1 sw   Y  | |jdd| | tj W d    n	1 s/w   Y  | |jdd| | t W d    n	1 sOw   Y  | |jdd| | tj
 W d    n	1 spw   Y  | |jdd| | tj W d    n	1 sw   Y  | |jdd| | t	 W d    n	1 sw   Y  | |jdd| | tj W d    n	1 sw   Y  | |jdd| | t W d    n	1 sw   Y  | |jdd| | t W d    d S 1 sw   Y  d S )Nc                 S   
   t d)Nzfailed with ExtractError)r   ExtractErrorrl  r   r   r   extracterror_filtern  r  zBTestExtractionFilters.test_errorlevel.<locals>.extracterror_filterc                 S   r  )Nzfailed with FilterError)r   r  rl  r   r   r   filtererror_filterp  r  zATestExtractionFilters.test_errorlevel.<locals>.filtererror_filterc                 S      t d)Nzfailed with OSError)r  rl  r   r   r   oserror_filterr     z=TestExtractionFilters.test_errorlevel.<locals>.oserror_filterc                 S   r  )Nzfailed with base TarError)r   TarErrorrl  r   r   r   tarerror_filtert  r  z>TestExtractionFilters.test_errorlevel.<locals>.tarerror_filterc                 S   r  )Nzfailed with ValueError)r  rl  r   r   r   valueerror_filterv  r  z@TestExtractionFilters.test_errorlevel.<locals>.valueerror_filterr  r   r  r`   rc   zboo!)r+  r   r  r   r-  r   r  r  r  r  r  r  )r   r  r  r  r  r  r.  r   r   r   test_errorlevelm  sp   $z%TestExtractionFilters.test_errorlevel)NNNNN)r  )-r   r   r   r   r   rR   r  rm  r   r  r'  r+  r-  r0  r3  r8  r   rO  rE  rF  rH  rI  rK  rM  rU  rV  rY  rZ  r\  r^  r_  ra  rc  re  rg  rh  ri  ro  rp  rs  rt  ry  rz  r  r  r   r   r   r   r    sR    /
1
	2
GV"3P
r  c                   @   s,  e Zd ZeZejej d e ej d e ej d e ej d e ejd  e d ej ej	 ejej
  ej ejd  ejd  ejd  e ej ejd  e ej ejej  ejd  Zejej d	 ej d
 ej d
 ej d e ejd  e d ej ej	 ejej
  ej ejd  ejd  ejd  ejd  ejd  Zejej d e ej d e ej d e ej d e ejd  e d ej ej	 ejej
  ejd  ZedejZdej Zdd Zd!ddZdd Zdd Zdd Zdd Zdd  ZdS )"OffsetValidationTestss   000755s   000001s      s   0011407    r     s   0000755s   0000001s   0011327r     s   0010070r  r     c                 C   s<   t | jd}|| W d    d S 1 sw   Y  d S r   )r   r   r   )r   bufferr
  r   r   r   _write_buffer  s   "z#OffsetValidationTests._write_bufferNc              	   C   sx   t | jd,}tj d||d}| W  d    W  d    S 1 s%w   Y  W d    d S 1 s5w   Y  d S )Nr_   rN   )r   r   r   )r   r   r   r   )r   r   r
  r9   r   r   r   _get_members  s   "z"OffsetValidationTests._get_membersc                 C   s<   |  tjd |   W d    d S 1 sw   Y  d S )Nr   )r   r   r   r  r   r   r   r   #_assert_raises_read_error_exception  s
   
"z9OffsetValidationTests._assert_raises_read_error_exceptionc              	   C   sh   d| j fd| jfd| jffD ]#\}}| j|d | | |   W d    n1 s,w   Y  qd S )Nposixr  Zv7r  )invalid_posix_headerinvalid_gnu_headerinvalid_v7_headerr  r  r  )r   Z
tar_formatZinvalid_headerr   r   r   &test_invalid_offset_header_validations#  s   

z<OffsetValidationTests.test_invalid_offset_header_validationsc                 C   s\   | j | j | j  }| | |  }| t|d | |d jd | |d jd d S )Nr`   r   r  )valid_gnu_headerr  r  r  rD   rE   ru   r	  r   r  r   r   r   r   (test_early_stop_at_invalid_offset_header-  s   
z>OffsetValidationTests.test_early_stop_at_invalid_offset_headerc                 C   s:   | j | j d }| | | jdd}| t|d d S )Nr  Tr   r   )r  
data_blockr  r  rD   rE   r  r   r   r   test_ignore_invalid_archive5  s   
z1OffsetValidationTests.test_ignore_invalid_archivec                 C   s   | j | j| j df| j| j | j dffD ],\}}}| ||  | jdd}| t|d | |d jd | |d j| qd S )Nr   ra   Tr  r`   r  )	r  r  r  r  r  rD   rE   ru   r	  )r   Zfirst_blockZsecond_blockZexpected_offsetr   r   r   r   "test_ignore_invalid_offset_headers<  s   

z8OffsetValidationTests.test_ignore_invalid_offset_headersr	   )r   r   r   r   r   r   r  rC  SPACEr\  rD  r  r  r  r
  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s*   





$



"





r  c               	   C   s   t t tt tgattd} |  }W d    n1 s!w   Y  t	t
tfD ]-}|jrXt |j t|j ||jd}|| W d    n1 sSw   Y  q+d S )Nr_   r   )r   r  rR   rS   r,  r   rI  r   rC   r$   r)   r-   r  r   )rJ   r   rW  r9   r   r   r   setUpModuleP  s   


r  c                   C   s   t jtrtt d S d S r	   )rS   rT   r5  rR   r   r4  r   r   r   r   tearDownModulea  s   r  __main__)rC  r   rS   r   Zhashlibr   
contextlibr   randomr   r   r  r  warningsr1  r   Zunittest.mockr   r  r   Ztest.supportr   r   r   r'   r  rK  r*   r0   r   rT   r   ZTESTFNrR   rg  r   r   rU   r&   r+   r/   r   ra  r  rG   r  r   Zrequires_gzipr$   Zrequires_bz2r)   Zrequires_lzmar-   r3   ZTestCaser>   r   r   r   r   r   r   r   r   r   rR  rT  rV  r\  r]  rk  rl  rm  ro  ry  rz  r~  r  r  r  r  r  r  r*  r+  r,  r-  r7  r<  r?  rA  rY  r_  rv  r~  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r1  rq  rP  rx  r  r  r  r  r  r  r  r  r  r  r  r+  r  r  r  r  r   r  r   r   r   r   <module>   sB   

 Pw  =(a8<W  :'R.Z			* QO@;{ ^:!z(b^F       9 
