o
    +ke                     @   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mZmZ d dl	m
Z
mZ d dlm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 ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZm Z m!Z! ddlm"Z"m#Z#m$Z$m%Z%m&Z& ddlm'Z' ddlm(Z( ddlm)Z)m*Z*m+Z+m,Z, ddlm-Z-m.Z.m/Z/m0Z0 ddlm1Z1m2Z2m3Z3 ddlm4Z4m5Z5 ddlm6Z6 ddlm7Z7 ddlm8Z8m9Z9m:Z: ddlm;Z; ddlm<Z< ddlm=Z= ddlm>Z> ddlm?Z?m@Z@ ddlmAZAmBZB G dd  d eAZCd!d" ZDG d#d$ d$ZEG d%d& d&ZFG d'd( d(eAZGd)d* ZHG d+d, d,eAZIG d-d. d.ZJejKLd/d0d1d2d3d4d5d6d7d g fgd8d9 ZMd:d; ZNd<d= ZOG d>d? d?eAZPG d@dA dAeAZQG dBdC dCeAZRG dDdE dEeAZSdFdG ZTdHdI ZUdJdK ZVdLdM ZWdNdO ZXdPdQ ZYdRdS ZZdTdU Z[dVdW Z\ejKLdXdYdZd[ Z]ejKLd\d]d^d_ Z^d`da Z_G dbdc dcZ`ddde Zadfdg Zbdhdi Zcdjdk Zddldm Zedndo Zfdpdq Zgdrds Zhdtdu Zidvdw Zjdxdy ZkejKjle?dzd{d|d} Zmd~d Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd ZzejKjlez  dd{dd Z{ejKjlez  dd{dd Z|dd Z}dd Z~G dd dZdd Zdd Zdd ZdS )    N)ArgumentTypeError)datetimetimezone	timedelta)StringIOBytesIO)sleep   )platform)MAX_DATA_SIZE)Location)Buffer)partial_formatformat_file_sizeparse_file_sizeformat_timedeltaformat_linePlaceholderErrorreplace_placeholders)make_path_safeclean_lines)intervalprune_withinprune_split)get_base_dirget_cache_dirget_keys_dirget_security_dirget_config_dir)is_slow_msgpack)msgpack)yesTRUISHFALSISH
DEFAULTISH)
StableDictint_to_bigintbigint_to_int
bin_to_hex)parse_timestampChunkIteratorFileWrapperChunkerParams)ProgressIndicatorPercentProgressIndicatorEndlessswidth_slice)chunkit)safe_nssafe_sSUPPORT_32BIT_PLATFORMSpopen_with_error_handling)	dash_open)iter_separatedeval_escapes)is_win32swidth   )BaseTestCase
FakeInputsc                   @      e Zd Zdd ZdS )BigIntTestCasec                 C   s   |  tdd |  tdd |  tdd |  tdd |  tdd |  ttdd	  dd	   |  ttdd	 dd	  d S )
Nr       l l            s	           l         s	          r	   F   )assert_equalr&   r'   self rF   :usr/lib/python3.10/site-packages/borg/testsuite/helpers.pytest_bigint(   s     zBigIntTestCase.test_bigintN)__name__
__module____qualname__rH   rF   rF   rF   rG   r@   &       r@   c                   C   $   t ddksJ t ddksJ d S )N     s    Z0001ff)r(   rF   rF   rF   rG   test_bin_to_hex2      rP   c                   @   s   e Z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dd Zdd Zdd  Zd!d" Zd#d$ Zd%S )&TestLocationWithoutEnvc                 C   s2   t |}|d| |tjjs|tjj7 }|S )NBORG_KEYS_DIR)strsetenvendswithospathsep)rE   ZtmpdirmonkeypatchrF   rF   rG   keys_dir8   s
   zTestLocationWithoutEnv.keys_dirc                 C   s  |j ddd ttddksJ td |d ksJ ttddks'J ttd	d
ks1J ttddks;J ttddksEJ td |d ksQJ ttddks[J ttddkseJ ttddksoJ td |d ks{J ttddksJ ttddksJ ttddksJ ttddksJ ttdd ksJ ttd!d"ksJ ttd#d$ksJ td# |d% ksJ ttd&d'ksJ ttd(d)ksJ d S )*N	BORG_REPOFZraising'ssh://user@host:1234/some/path::archive`Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive='archive')host__some_pathssh://user@host:1234/some/path[Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive=None)ssh://user@host/some/path[Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive=None)z'ssh://user@[::]:1234/some/path::archivez^Location(proto='ssh', user='user', host='::', port=1234, path='/some/path', archive='archive')zssh://user@[::]:1234/some/pathzYLocation(proto='ssh', user='user', host='::', port=1234, path='/some/path', archive=None)Z____some_pathzssh://user@[::]/some/pathYLocation(proto='ssh', user='user', host='::', port=None, path='/some/path', archive=None)z/ssh://user@[2001:db8::]:1234/some/path::archivezfLocation(proto='ssh', user='user', host='2001:db8::', port=1234, path='/some/path', archive='archive')z&ssh://user@[2001:db8::]:1234/some/pathzaLocation(proto='ssh', user='user', host='2001:db8::', port=1234, path='/some/path', archive=None)Z2001_db8____some_pathz!ssh://user@[2001:db8::]/some/pathaLocation(proto='ssh', user='user', host='2001:db8::', port=None, path='/some/path', archive=None)z6ssh://user@[2001:db8::c0:ffee]:1234/some/path::archivezmLocation(proto='ssh', user='user', host='2001:db8::c0:ffee', port=1234, path='/some/path', archive='archive')z-ssh://user@[2001:db8::c0:ffee]:1234/some/pathzhLocation(proto='ssh', user='user', host='2001:db8::c0:ffee', port=1234, path='/some/path', archive=None)z(ssh://user@[2001:db8::c0:ffee]/some/pathhLocation(proto='ssh', user='user', host='2001:db8::c0:ffee', port=None, path='/some/path', archive=None)z8ssh://user@[2001:db8::192.0.2.1]:1234/some/path::archivezoLocation(proto='ssh', user='user', host='2001:db8::192.0.2.1', port=1234, path='/some/path', archive='archive')z/ssh://user@[2001:db8::192.0.2.1]:1234/some/pathzjLocation(proto='ssh', user='user', host='2001:db8::192.0.2.1', port=1234, path='/some/path', archive=None)z*ssh://user@[2001:db8::192.0.2.1]/some/pathjLocation(proto='ssh', user='user', host='2001:db8::192.0.2.1', port=None, path='/some/path', archive=None)2001_db8__192_0_2_1__some_pathz>ssh://user@[2a02:0001:0002:0003:0004:0005:0006:0007]/some/path~Location(proto='ssh', user='user', host='2a02:0001:0002:0003:0004:0005:0006:0007', port=None, path='/some/path', archive=None)zCssh://user@[2a02:0001:0002:0003:0004:0005:0006:0007]:1234/some/pathz~Location(proto='ssh', user='user', host='2a02:0001:0002:0003:0004:0005:0006:0007', port=1234, path='/some/path', archive=None)delenvreprr   to_key_filenamerE   rZ   r[   rF   rF   rG   test_ssh@   sp   
















zTestLocationWithoutEnv.test_sshc                 C   sR   |j ddd ttddksJ ttddksJ td |d ks'J d S )	Nr\   Fr]   zfile:///some/path::archive]Location(proto='file', user=None, host=None, port=None, path='/some/path', archive='archive')file:///some/pathXLocation(proto='file', user=None, host=None, port=None, path='/some/path', archive=None)Z	some_pathrk   ro   rF   rF   rG   	test_filei      

z TestLocationWithoutEnv.test_filec                 C   s  |j ddd ttddksJ ttddksJ ttdd	ks%J ttd
dks/J ttddks9J ttddksCJ ttddksMJ ttddksWJ ttddksaJ ttddkskJ td |d kswJ ttddksJ d S )Nr\   Fr]   zuser@host:/some/path::archive`Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive='archive')user@host:/some/pathrd   zuser@[::]:/some/path::archivez^Location(proto='ssh', user='user', host='::', port=None, path='/some/path', archive='archive')zuser@[::]:/some/pathre   z%user@[2001:db8::]:/some/path::archivezfLocation(proto='ssh', user='user', host='2001:db8::', port=None, path='/some/path', archive='archive')zuser@[2001:db8::]:/some/pathrf   z,user@[2001:db8::c0:ffee]:/some/path::archivezmLocation(proto='ssh', user='user', host='2001:db8::c0:ffee', port=None, path='/some/path', archive='archive')z#user@[2001:db8::c0:ffee]:/some/pathrg   z.user@[2001:db8::192.0.2.1]:/some/path::archivezoLocation(proto='ssh', user='user', host='2001:db8::192.0.2.1', port=None, path='/some/path', archive='archive')z%user@[2001:db8::192.0.2.1]:/some/pathrh   ri   z9user@[2a02:0001:0002:0003:0004:0005:0006:0007]:/some/pathrj   rk   ro   rF   rF   rG   test_scpq   sF   










zTestLocationWithoutEnv.test_scpc                 C   s>   |j ddd ttddksJ td |d ksJ d S )Nr\   Fr]   z#file:////server/share/path::archivezfLocation(proto='file', user=None, host=None, port=None, path='//server/share/path', archive='archive')Zserver_share_pathrk   ro   rF   rF   rG   test_smb   s
   
zTestLocationWithoutEnv.test_smbc                 C   sR   |j ddd ttddksJ ttddksJ td |d ks'J d S )Nr\   Fr]   zpath::archiveWLocation(proto='file', user=None, host=None, port=None, path='path', archive='archive')rX   RLocation(proto='file', user=None, host=None, port=None, path='path', archive=None)rk   ro   rF   rF   rG   test_folder   ru   z"TestLocationWithoutEnv.test_folderc                 C   sH   |j ddd ttjjddg   |dddg  d ks"J d S )Nr\   Fr]   (   rX   _   )rl   r   rW   rX   joinrn   ro   rF   rF   rG   test_long_path   s   :z%TestLocationWithoutEnv.test_long_pathc                 C   s~   |j ddd ttddksJ ttddksJ td |d ks'J ttd	d
ks1J td	 |d ks=J d S )Nr\   Fr]   z/some/absolute/path::archivefLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive='archive')/some/absolute/pathaLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive=None)Zsome_absolute_pathrc   rd   r`   rk   ro   rF   rF   rG   test_abspath   s   


z#TestLocationWithoutEnv.test_abspathc                 C   s   |j ddd ttddksJ ttddksJ td |d ks'J ttd	d
ks1J td	 |d ks=J ttddksGJ td |d ksSJ ttddks]J td |d ksiJ d S )Nr\   Fr]   zsome/relative/path::archiveeLocation(proto='file', user=None, host=None, port=None, path='some/relative/path', archive='archive')some/relative/path`Location(proto='file', user=None, host=None, port=None, path='some/relative/path', archive=None)Zsome_relative_pathzssh://user@host/./some/pathz]Location(proto='ssh', user='user', host='host', port=None, path='/./some/path', archive=None)r`   zssh://user@host/~/some/pathz]Location(proto='ssh', user='user', host='host', port=None, path='/~/some/path', archive=None)zssh://user@host/~user/some/pathzaLocation(proto='ssh', user='user', host='host', port=None, path='/~user/some/path', archive=None)Zhost__user_some_pathrk   ro   rF   rF   rG   test_relpath   s(   




z#TestLocationWithoutEnv.test_relpathc                 C   sf   |j ddd ttddksJ ttddksJ ttdd	ks%J td |d
 ks1J d S )Nr\   Fr]   z/abs/path:w:cols::arch:coldLocation(proto='file', user=None, host=None, port=None, path='/abs/path:w:cols', archive='arch:col')z/abs/path:with:colons::archivezhLocation(proto='file', user=None, host=None, port=None, path='/abs/path:with:colons', archive='archive')z/abs/path:with:colonszcLocation(proto='file', user=None, host=None, port=None, path='/abs/path:with:colons', archive=None)Zabs_path_with_colonsrk   ro   rF   rF   rG   test_with_colons   s   


z'TestLocationWithoutEnv.test_with_colonsc                 C   s,   t tddks
J t tddksJ d S )Nzhost:path::2016-12-31@23:59:59zdLocation(proto='ssh', user=None, host='host', port=None, path='path', archive='2016-12-31@23:59:59')z$ssh://host/path::2016-12-31@23:59:59zeLocation(proto='ssh', user=None, host='host', port=None, path='/path', archive='2016-12-31@23:59:59'))rm   r   rD   rF   rF   rG   test_user_parsing   s   

z(TestLocationWithoutEnv.test_user_parsingc              	   C   s,   t tdtdddtjddksJ d S )Nzpath::archive-{utcnow}i  	      tzinfozkLocation(proto='file', user=None, host=None, port=None, path='path', archive='archive-2002-09-19T00:00:00'))rm   r   Zwith_timestampr   r   utcrD   rF   rF   rG   test_with_timestamp   s   z*TestLocationWithoutEnv.test_with_timestampc                 C   s   |j ddd tt td W d    n1 sw   Y  tt td W d    n1 s4w   Y  tt t  W d    d S 1 sMw   Y  d S )Nr\   Fr]   	::archive::rl   pytestraises
ValueErrorr   rE   rZ   rF   rF   rG   test_underspecified   s   

"z*TestLocationWithoutEnv.test_underspecifiedc                 C   sF   |j ddd tt td W d    d S 1 sw   Y  d S )Nr\   Fr]   z8/some/path/to/repo::archive_name_with/slashes/is_invalidr   r   rF   rF   rG   test_no_slashes   s   
"z&TestLocationWithoutEnv.test_no_slashesc                 C   sP   |j ddd g d}|D ]}t| tt|  ks%J d| qd S )Nr\   Fr]   )zsome/path::archivezfile://some/path::archivezhost:some/path::archivezhost:~user/some/path::archivezssh://host/some/path::archiver^   z
failed: %s)rl   r   Zcanonical_path)rE   rZ   Z	locationslocationrF   rF   rG   test_canonical_path   s   
z*TestLocationWithoutEnv.test_canonical_pathc                 C   s^   |j ddd t }ttdd| dksJ td}td td}|j|jks-J d S )	Nr\   Fr]   z/some/path::archive{pid}z[Location(proto='file', user=None, host=None, port=None, path='/some/path', archive='archivez')z/some/path::archive{now:%s}g?)rl   rW   getpidrm   r   r   archive)rE   rZ   Ztest_pidZlocation_time1Zlocation_time2rF   rF   rG   test_format_path   s   

z'TestLocationWithoutEnv.test_format_pathc                 C   s8   t t td W d    d S 1 sw   Y  d S )Nzssh://user@host:/path)r   r   r   r   rD   rF   rF   rG   test_bad_syntax   s   
"z&TestLocationWithoutEnv.test_bad_syntaxc                 C   sN   ddl m} td}| }|jd u sJ |jdksJ |jd| ks%J d S )Nr   hostnamez.ssh://user@host:1234/repos/{hostname}::archivez%ssh://user@host:1234/repos/{hostname}zssh://user@host:1234/repos/%s)borg.platformr   r   Zomit_archiver   raw	processed)rE   r   locZloc_without_archiverF   rF   rG   test_omit_archive   s   z(TestLocationWithoutEnv.test_omit_archiveN)rI   rJ   rK   r   Zfixturer[   rp   rt   rx   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   rF   rF   rF   rG   rR   7   s(    
)
		
rR   c                   @   sT   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S )TestLocationWithEnvc                 C   J   | dd ttddksJ ttddksJ tt dks#J d S )Nr\   ra   r   r_   r   rb   rU   rm   r   r   rF   rF   rG   rp         

zTestLocationWithEnv.test_sshc                 C   sn   ddl m} |dd ttdd| dksJ ttdd| d	ks(J tt d| d	ks5J d S )
Nr   r   r\   zssh://user@host:1234/{hostname}r   zBLocation(proto='ssh', user='user', host='host', port=1234, path='/z', archive='archive')r   z', archive=None))r   r   rU   rm   r   )rE   rZ   r   rF   rF   rG   test_ssh_placeholder  s   




z(TestLocationWithEnv.test_ssh_placeholderc                 C   r   )Nr\   rr   r   rq   r   rs   r   r   rF   rF   rG   rt     r   zTestLocationWithEnv.test_filec                 C   r   )Nr\   rw   r   rv   r   rd   r   r   rF   rF   rG   rx     r   zTestLocationWithEnv.test_scpc                 C   r   )Nr\   rX   r   rz   r   r{   r   r   rF   rF   rG   r|   #  r   zTestLocationWithEnv.test_folderc                 C   r   )Nr\   r   r   r   r   r   r   r   rF   rF   rG   r   ,  r   z TestLocationWithEnv.test_abspathc                 C   r   )Nr\   r   r   r   r   r   r   r   rF   rF   rG   r   5  r   z TestLocationWithEnv.test_relpathc                 C   r   )Nr\   z/abs/path:w:colsz
::arch:colr   r   z^Location(proto='file', user=None, host=None, port=None, path='/abs/path:w:cols', archive=None)r   r   rF   rF   rG   r   >  r   z$TestLocationWithEnv.test_with_colonsc                 C   sD   | dd tt td W d    d S 1 sw   Y  d S )Nr\   r   z&::archive_name_with/slashes/is_invalid)rU   r   r   r   r   r   rF   rF   rG   r   G  s   
"z#TestLocationWithEnv.test_no_slashesN)rI   rJ   rK   rp   r   rt   rx   r|   r   r   r   r   rF   rF   rF   rG   r      s    	
						r   c                   @   r?   )FormatTimedeltaTestCasec                 C   s@   t ddddddd}t ddddddd	}| t|| d
 d S )Ni  r<   
   r      r         i z2 hours 1.10 seconds)r   rC   r   )rE   t0t1rF   rF   rG   testO  s   
zFormatTimedeltaTestCase.testNrI   rJ   rK   r   rF   rF   rF   rG   r   M  rL   r   c                  C   s  t ddksJ t ddksJ t ddksJ t ddks J t ddks(J t d	d
ks0J d} tt t d W d    n1 sFw   Y  | rftt t d W d    n1 saw   Y  tt t d W d    n1 szw   Y  | rtt t d W d    n1 sw   Y  | rtt t d W d    n1 sw   Y  tt t dtd df  W d    n1 sw   Y  tt t ddtd f  W d    d S 1 sw   Y  d S )Ndefault)buzhashr           z19,23,21,4095zbuzhash,19,23,21,4095z10,23,16,4095)r   r   r      r   z
fixed,4096)fixed   r   zfixed,4096,200)r   r      Fzcrap,1,2,3,4zbuzhash,5,7,6,4095zbuzhash,19,24,21,4095zbuzhash,23,19,21,4095zfixed,63zfixed,%d,%dr<   r   )r+   r   r   r   r   )Zborg2rF   rF   rG   test_chunkerparamsX  s>   




"r   c                   @   r?   )MakePathSafeTestCasec                 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	 d S )
Nz/foo/barfoo/barz/f/barzf/barzfo/barz
../foo/barz../../foo/bar/.)rC   r   rD   rF   rF   rG   r   v  s   zMakePathSafeTestCase.testNr   rF   rF   rF   rG   r   t  rL   r   c                   @   s   e Zd Zdd Zdd ZdS )MockArchivec                 C   s   || _ || _d S N)tsid)rE   r   r   rF   rF   rG   __init__  s   
zMockArchive.__init__c                 C   s   | j  d| j  S )Nz: )r   r   	isoformatrD   rF   rF   rG   __repr__  s   zMockArchive.__repr__N)rI   rJ   rK   r   r   rF   rF   rF   rG   r     s    r   zrule,num_to_keep,expected_ids)yearlyr   )   r	   r<   )Zmonthlyr   )r      r   )Zweeklyr	   )r   r   )dailyr   )r   r      )Zhourlyr   )r   r   r   )Zminutelyr   )r   r   r   )Zsecondlyr   )r   r      r   r   c                 C   s  dd }t tddddddtjddt tddddddtjdd	t td
dddddtjddt td
d	ddddtjddt td
dddddtjddt td
dd	dddtjddt td
dddddtjddt td
dddddtjddt td
dddddtjddt td
dddddtjddt td
dddddtjddt td
dddddtjddt td
dddddtjddg}i }t|| ||}t||||ksJ |D ]}||j d | ksJ qd S )Nc                        fdd| D S )Nc                       h | ]	}|j  v r|qS rF   r   .0iidsrF   rG   	<setcomp>      z3test_prune_split.<locals>.subset.<locals>.<setcomp>rF   lstr   rF   r   rG   subset     z test_prune_split.<locals>.subset  r<   r   r   r   i  r	   i  r   r         r   r   r   -   7   r   r   r   )r   r   r   r   r   setr   )ZruleZnum_to_keepZexpected_idsr   archiveskept_becausekeepitemrF   rF   rG   test_prune_split  s*   r   c                  C   s<  dd } t tddddddtjddt tddd	dddtjdd
t tddddddtjddt tddddddtjddg}i }t|dd|}t|| |g dksTJ |d d dks^J |d d dkshJ |d d dksrJ i }t|dd
|}t|| |ddgksJ |d d dksJ |d d dksJ d S )Nc                    r   )Nc                    r   rF   r   r   r   rF   rG   r     r   z?test_prune_split_keep_oldest.<locals>.subset.<locals>.<setcomp>rF   r   rF   r   rG   r     r   z,test_prune_split_keep_oldest.<locals>.subseti  r<   r   r   r   r      r	      r   i  r   r   )r<   r   r   zyearly[oldest])r   r   r   r   r   r   r   r   r   r   rF   rF   rG   test_prune_split_keep_oldest  s"   r   c                  C   s:   dd } g }i }t |dd|}|g ksJ |i ksJ d S )Nc                    r   )Nc                    r   rF   r   r   r   rF   rG   r     r   z?test_prune_split_no_archives.<locals>.subset.<locals>.<setcomp>rF   r   rF   r   rG   r     r   z,test_prune_split_no_archives.<locals>.subsetr   r   )r   r   rF   rF   rG   test_prune_split_no_archives  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )IntervalTestCasec                 C   sT   |  tdd |  tdd |  tdd |  tdd |  td	d
 d S )N1Hr<   Z1d   1w   1mi  1yi8"  )rC   r   rD   rF   rF   rG   test_interval  s
   zIntervalTestCase.test_intervalc                 C   s   t t}td W d    n1 sw   Y  | |jjd t t}td W d    n1 s5w   Y  | |jjd t t}td W d    n1 sVw   Y  | |jjd d S )NH)zAUnexpected interval number "": expected an integer greater than 0z-1d)zCUnexpected interval number "-1": expected an integer greater than 0Zfood)zDUnexpected interval number "foo": expected an integer greater than 0r   r   r   r   rC   valueargsrE   excrF   rF   rG   test_interval_time_unit  s*   


z(IntervalTestCase.test_interval_time_unitc                 C   sF   t t}td W d    n1 sw   Y  | |jjd d S )N5)zLUnexpected interval time unit "5": expected one of ['H', 'd', 'w', 'm', 'y']r   r   rF   rF   rG   test_interval_number  s   
z%IntervalTestCase.test_interval_numberN)rI   rJ   rK   r   r   r   rF   rF   rF   rG   r     s    r   c                   @   r?   )PruneWithinTestCasec                    s   dd fdd}g d}t tj  fdd|D }dd t|D }||d	d
g ||dd
dg ||dg d ||dg d ||dg d ||dg d ||dg d ||dg d ||dg d ||dg d ||dg d d S )Nc                    s    fdd|D S )Nc                    s   h | ]} | qS rF   rF   r   r   rF   rG   r   	  s    zHPruneWithinTestCase.test_prune_within.<locals>.subset.<locals>.<setcomp>rF   )r   indicesrF   r  rG   r     r   z5PruneWithinTestCase.test_prune_within.<locals>.subsetc                    sZ   | t | fD ]$}i  t|t| }t|| | t fdd|D s*J qd S )Nc                 3   s"    | ]}d  |j  d kV  qdS )withinr   Nr   )r   ar   rF   rG   	<genexpr>  s     zHPruneWithinTestCase.test_prune_within.<locals>.dotest.<locals>.<genexpr>)reversedr   r   rC   r   all)test_archivesr  r  tar   )rE   r   r  rG   dotest  s   
z5PruneWithinTestCase.test_prune_within.<locals>.dotest)<   i  i(#  i81  i_ i c                    s   g | ]	} t |d  qS ))seconds)r   )r   snowrF   rG   
<listcomp>  r   z9PruneWithinTestCase.test_prune_within.<locals>.<listcomp>c                 S   s   g | ]	\}}t ||qS rF   )r   )r   r   daterF   rF   rG   r    s    r   r   Z2Hr<   Z3H)r   r<   r	   Z24H)r   r<   r	   r   Z26H)r   r<   r	   r   r   Z2dZ50H)r   r<   r	   r   r   r   Z3dr   r   r   )r   r  r   r   	enumerate)rE   r  Ztest_offsetsZ
test_datesr
  rF   )r  rE   r   rG   test_prune_within  s&   	z%PruneWithinTestCase.test_prune_withinN)rI   rJ   rK   r  rF   rF   rF   rG   r    s    r  c                   @   r?   )StableDictTestCasec                 C   sH   t ddddd}| t| g d | tt| d d S )Nr<   r	   r   r   )foobarboobaz))r  r	   )r  r   )r  r   )r  r<   Z fc78df42cd60691b3ac3dd2a2b39903f)	r%   rC   listitemshashlibZmd5r    Zpackb	hexdigest)rE   drF   rF   rG   r   *  s    zStableDictTestCase.testNr   rF   rF   rF   rG   r  (  rL   r  c                   @   r?   )TestParseTimestampc                 C   sL   |  tdtdddddddtj |  td	tdddddddtj d S )
Nz2015-04-19T20:25:00.226410r   r   r   r      r   ijt z2015-04-19T20:25:00)rC   r)   r   r   r   rD   rF   rF   rG   r   2  s   $(zTestParseTimestamp.testNr   rF   rF   rF   rG   r   0  rL   r   c                 C   s   | j ddd | j ddd | j ddd t tjdks J | dd t tjdks1J | dd	 t d	ks>J | dd
 t d
ksKJ dS )z+test that get_base_dir respects environmentZBORG_BASE_DIRFr]   HOMEZUSER~rootz~rootz/var/tmp/homez/var/tmp/baseN)rl   r   rW   rX   
expanduserrU   rZ   rF   rF   rG   test_get_base_dir7  s   r'  c                 C      | j ddd | j ddd t tjtjdddksJ | dd t tjddks1J | dd	 t d	ks>J d
S )z-test that get_config_dir respects environmentZBORG_CONFIG_DIRFr]   XDG_CONFIG_HOMEr#  .configborg/var/tmp/.config/var/tmpN)rl   r   rW   rX   r   r%  rU   r&  rF   rF   rG   test_get_config_dirE     "r.  c                 C   r(  )z,test that get_cache_dir respects environmentZBORG_CACHE_DIRFr]   XDG_CACHE_HOMEr#  z.cacher+  z/var/tmp/.cacher-  N)rl   r   rW   rX   r   r%  rU   r&  rF   rF   rG   test_get_cache_dirP  r/  r1  c                 C   s   | j ddd | j ddd t tjtjddddks J | dd	 t tjd	ddks3J | dd
 t d
ks@J dS )z+test that get_keys_dir respects environmentrS   Fr]   r)  r#  r*  r+  keysr,  r-  N)rl   r   rW   rX   r   r%  rU   r&  rF   rF   rG   test_get_keys_dir[  s   $r3  c                 C   s   | j ddd | j ddd t tjtjddddks J td	d
tjtjddddd	ks5J | dd t tjdddksHJ | dd t dksUJ dS )z/test that get_security_dir respects environmentZBORG_SECURITY_DIRFr]   r)  r#  r*  r+  ZsecurityZ1234)Zrepository_idr,  r-  N)rl   r   rW   rX   r   r%  rU   r&  rF   rF   rG   test_get_security_dirf  s   $*r4  c                  C   s   i ddddddddd	d
dd
ddddddddddddddddddddddd d!d"d#d$} |   D ]\}}t||ksLJ q@d%S )&!test the size formatting routinesr   0 Br<   1 B   z142 Bi  z999 B  z1.00 kBi    z1.23 kBi  z1.24 kBi  z1.01 kB;z	999.99 MBi;ix;z1.00 GBi@B z1.00 MB ʚ;l    J)z1.00 TBl     I5 z1.00 PBl     NZoz1.00 EBz1.00 ZBz1.00 YB-1 Bz-1.01 kB)l     @=7M.cl      B3v^!< iNr  r   Zsi_size_mapsizefmtrF   rF   rG   test_file_sizer  sV   	
rC  c                  C   sj   ddddddddd	d
dddddddd ddd dddddddi} |   D ]\}}t|dd|ks2J q$dS )r5  r   r6  r<   r7  i   z1.00 KiBi   z1.00 MiBi   @z1.00 GiBl        z1.00 TiBl           z1.00 PiBl            z1.00 EiBr	   rB   z1.00 ZiBP   z1.00 YiBr>  r=  i z	-1.00 KiBi  z	-1.00 MiBT)ZiecNr?  )Ziec_size_maprA  rB  rF   rF   rG   test_file_size_iec  s"   rE  c                   C   s@   t ddddks
J t ddddksJ t ddddksJ d S )	Nr:  r<   )Z	precisionz1.2 kBi  z1.3 kBr;  z1.0 GB)r   rF   rF   rF   rG   test_file_size_precision  s   rF  c                  C   s:   dddddd} |   D ]\}}t|dd|ksJ qd S )	Nr6  z+1 Bz+1.23 kBr=  z-1.23 kB)r   r<   r:  r>  i.T)signr?  r@  rF   rF   rG   test_file_size_sign  s   rH  zstring,value))1r<   )Z20r   )Z5Ki  )z1.75Mi )z1e+9g    eA)z-1Tg   mc                 C   s   t | t|ks
J d S r   )r   int)stringr   rF   rF   rG   test_parse_file_size  s   	rL  rK  )rO   u   5 ÄpfelZ4Ez2229 bitZ1Bc                 C   s8   t t t|  W d    d S 1 sw   Y  d S r   )r   r   r   r   rK  rF   rF   rG   test_parse_file_size_invalid  s   
"rN  c                  C   sL   dd l } dd l} | j}z| jj| _t sJ W || _n|| _w t r$J d S )Nr   )r    Zmsgpack.fallbackZPackerfallbackr   )r    Zsaved_packerrF   rF   rG   test_is_slow_msgpack  s   
rP  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
TestBufferc                 C   s8   t t}t| tsJ t t}t| tsJ d S r   )r   	bytearray
isinstancegetbytesrE   bufferrF   rF   rG   	test_type  s   zTestBuffer.test_typec                 C   st   t tdd}| }t|t|  krdksJ  J t tdd}| }t|t|  kr5dks8J  J d S )Nr   rA  r:  )r   rR  rT  len)rE   rW  brF   rF   rG   test_len  s   $(zTestBuffer.test_lenc                 C   s   t tdd}t|dksJ | }|d t|dksJ | }||us)J |d t|dks6J | }||u s@J |jddd t|dksOJ | }||usYJ d S )Nd   rY  r   T)init)r   rR  rZ  rT  resize)rE   rW  b1b2b3Zb4rF   rF   rG   test_resize  s   

zTestBuffer.test_resizec                 C   sr   t tddd}|d t|dksJ tt j |d W d    n1 s*w   Y  t|dks7J d S )Nr]  r   rA  limit   )r   rR  r_  rZ  r   r   MemoryLimitExceededrV  rF   rF   rG   
test_limit  s   
zTestBuffer.test_limitc                 C   s   t tddd}|d}t|dksJ |d}t|dks!J ||u s'J |d}t|dks4J ||us:J tt j |d W d    n1 sPw   Y  t|dks]J d S )Nr]  r   rd  2   rf  )r   rR  rT  rZ  r   r   rg  )rE   rW  r`  ra  rb  rF   rF   rG   test_get   s   


zTestBuffer.test_getN)rI   rJ   rK   rX  r\  rc  rh  rj  rF   rF   rF   rG   rQ    s    rQ  c                  C   sT   t t} t| }| D ]	}t|dsJ q
t t} t| }| D ]	}t|dr'J qd S )Ninput)r  r"   r>   r!   r#   inputsrl  r   rF   rF   rG   test_yes_input  s   ro  c                  C   sP   t t} t| }| D ]
}td|dsJ q
t| }| D ]
}td|dr%J qd S )NTr   rl  F)r  r$   r>   r!   rm  rF   rF   rG   test_yes_input_defaults  s   rq  c                  C   s@   t g d} td| dsJ td| dsJ td| drJ d S )N)YESSURENOPE)rr  )Ztruishrl  )rs  )rt  )Zfalsishrl  )r>   r!   rk  rF   rF   rG   test_yes_input_custom$  s   ru  c                 C   sL   t D ]}| d| tddsJ qtD ]}| d| tddr#J qd S )NOVERRIDE_THISenv_var_override)r"   rU   r!   r#   rZ   r   rF   rF   rG   test_yes_env+  s   rz  c                 C   s:   t D ]}| d| tdddsJ tdddrJ qd S )Nrv  T)rx  r   F)r$   rU   r!   ry  rF   rF   rG   test_yes_env_default4  s
   r{  c                  C   s   t g d} t| drJ t| drJ t| drJ t g d} td| ds)J td| ds1J td| ds9J t g } td| dsEJ td| drMJ tt td d W d    d S 1 scw   Y  d S )N)invalidrO    rk  Trp  F)r   )r>   r!   r   r   r   rk  rF   rF   rG   test_yes_defaults;  s   "r~  c                  C   sH   t ddtd g} td| dsJ t ddtd g} td| dr"J d S )Nr  r  r   zRetry: )	retry_msgrl  r>   r"   r!   r#   rk  rF   rF   rG   test_yes_retryK  s   r  c                  C   sL   t ddtd g} tdd| drJ t ddtd g} tdd| ds$J d S )Nr  r  r   F)retryr   rl  Tr  rk  rF   rF   rG   test_yes_no_retryR  s   r  c                 C   s   t g d}tdddd|dsJ |  \}}|dksJ d|v s#J d|v s)J d|v s/J tdddd|dr:J |  \}}|dksFJ d|v sLJ d|vsRJ d|v sXJ d S )N)r|  ynz	intro-msgz	false-msgztrue-msgz	retry-msg)msgZ	false_msgZtrue_msgr  rl  rO   )r>   r!   
readouterr)capfdrl  outerrrF   rF   rG   test_yes_outputY  s   r  c                 C   sR   d}| |d t|dsJ |  \}}|dksJ ||v s!J d|v s'J d S )NZOVERRIDE_SOMETHINGr!   rw  rO   )rU   r!   r  )r  rZ   Zenv_varr  r  rF   rF   rG   test_yes_env_outputi  s   r  c                 C   s   | dd | dd tddddd	}|jd
 |d |  \}}|dks+J |d |d |  \}}|dksAJ |d |  \}}|dksRJ |  |  \}}|dksbJ d S )NCOLUMNS4LINESrI  r9  r   r   %3.0f%%stepstartr  INFO  0%i  i  z
 42% 68%z100%z    )rU   r,   loggersetLevelshowr  finishr  rZ   pir  r  rF   rF   rG   !test_progress_percentage_samelines  s"   



r  z3no working swidth() implementation on this platformreasonc           	      C   s4  d}t |dks
J d}t |dksJ d}tdd t | d t | t | }|dt| |d	d
 tdddd| dd}|jd |jd|gd |  \}}|d| d| | dksgJ |jd|gd |  \}}|d| d| | dksJ |	  |  \}}|d| d ksJ d S )Nu   スター・トレックr   u   /カーク船長です。   z    z100%r<   r  r  rI  r]  r   r   z%3.0f%% z %sr  r  )infoz  0% r}  z100% )
r;   rZ  rU   rT   r,   r  r  r  r  r  )	r  rZ   strX   spaceswidthr  r  r  rF   rF   rG   "test_progress_percentage_widechars  s&   (r  c                 C   s   | dd | dd tddddd	}|jd
 |  |  \}}|dks*J |  |  \}}|dks:J |  |  \}}|dksJJ d S )Nr  r  r  rI  r]  r	   r   r  r  r  r  rO   z  2%)rU   r,   r  r  r  r  r  rF   rF   rG   test_progress_percentage_step  s   r  c                 C   s   t ddddd}|jd |d |  \}}|dksJ |d |  \}}|dks0J |  |  \}}|dks@J d S )Nr9  r   r   r  r  WARNrO   )r,   r  r  r  r  r  r  r  r  r  rF   rF   rG   test_progress_percentage_quiet  s   

r  c                 C   sr   t dtjd}|  |  \}}|dksJ |  |  \}}|dks'J |  |  \}}|dks7J d S )Nr<   r  filer   
)r-   sysstderrr  r  r  r  rF   rF   rG   test_progress_endless  s   r  c                 C   s   t dtjd}|  |  \}}|dksJ |  |  \}}|dks'J |  |  \}}|dks7J |  |  \}}|dksGJ d S )Nr	   r  rO   r   )r-   r  r  r  r  r  rF   rF   rG   test_progress_endless_step  s   r  c                   C   sl   t dddidksJ t dddddksJ t d	i d	ks J t d
i d
ks)J t dddidks4J d S )Nz
{space:10}spacer}  z
          z{foobar}ZwrongZcorrect)r  Zfoobarz{unknown_key}z{key}{{escaped_key}}z{{escaped_key}}Zescaped_keyr:  )r   rF   rF   rF   rG   test_partial_format  s
   r  c                  C   sj   t tddg} | ddksJ | ddksJ | jsJ t tg } | ddks.J | js3J d S )Ns   abcs   defr	   s   abri  s   cdefrN   )r*   iterreadZ	exhausted)ZcfwrF   rF   rG   test_chunk_file_wrapper  s   
r  c                  C   s   t dd} t| g dksJ t| g dksJ t| dgks"J tt t|  W d    n1 s6w   Y  tt t|  W d    n1 sOw   Y  t dd} t| ddggksdJ t d	d} t| g ksqJ d S )
NZabcdefgr   )r  r[  c)r  efgabr  r[  rO   )r0   nextr   r   StopIterationr  )itrF   rF   rG   test_chunkit  s   




r  c                  C   s   dj dd} tt| g dksJ tt| ddg dks J tt| ddg d	ks.J tt| dd
g dks<J tt| ddg dksJJ d S )Nz$#comment
data1 #data1
data2

 data3
T)keepends)data1 #data1data2data3F)lstrip)r  r  z data3)rstrip)zdata1 #data1
zdata2
zdata3
)Zremove_empty)r  r  rO   r  )Zremove_comments)z#commentr  r  r  )
splitlinesr  r   )ZconfrF   rF   rG   test_clean_lines  s    r  c                  C   sD   t dd} td| dksJ td| dksJ td| dks J d S )Nzbar baz)r  rO   z{foo}zfoo{foo}foozfoobar bazfoo)dictr   datarF   rF   rG   test_format_line  s   
r  c                  C   s   t  } tt td| sJ W d    n1 sw   Y  tt td| s,J W d    n1 s6w   Y  tt td| sHJ W d    n1 sRw   Y  tt td| sdJ W d    d S 1 sow   Y  d S )Nz	{invalid}z{}z{now!r}z'{now.__class__.__module__.__builtins__})r  r   r   r   r   r  rF   rF   rG   test_format_line_erroneous  s   "r  c                  C   s2   t  } dtdvsJ ttd| jksJ d S )Nr}  z{now}z{now:%Y})r   r  r   rJ  yearr  rF   rF   rG   test_replace_placeholders!  s   r  c                   C   s   t dddiddksJ d S )Nz{uuid4}Zuuid4Z
overridden)Z	overrides)r   rF   rF   rF   rG   test_override_placeholders'  s   r  c                   C   s   t ddkS )Nu   선r	   )r
   r;   rF   rF   rF   rG   working_swidth+  s   r  z"swidth() is not supported / activec                  C   sP   d} t | ddksJ t | ddksJ t | ddksJ t | ddks&J d S )	Nu-   나윤선나윤선나윤선나윤선나윤선r<   rO   r>  r   u   나윤u   윤선r.   rM  rF   rF   rG   test_swidth_slice/  s
   r  c                  C   s,   d} t | ddksJ t | ddksJ d S )Nu.   나윤a선나윤선나윤선나윤선나윤선r   u   나윤ar   r.   rM  rF   rF   rG   "test_swidth_slice_mixed_characters8  s   r  c                 C   s   t | tjjddS )zPReturns a naive datetime instance representing the timestamp in the UTC timezoneNr   )r   fromtimestampr   r   replace)	timestamprF   rF   rG   utcfromtimestamp?  s   r  c                  C   s|  t r_tddks
J tddksJ tddksJ tddks"J dd } tt t|  W d    n1 s:w   Y  tt| tdd	d	ksMJ tt| d
 tdd	d	ks]J d S tddksgJ tddksoJ tdd
 dksyJ tddksJ dd } tt t|  W d    n1 sw   Y  tt| tdd	d	ksJ tt| d
 tdd	d	ksJ d S )Nl            rA   r>  r   ir	   r]  i  r<   r<  i  )r3   r1   r2   r   r   OverflowErrorr  r   )Zbeyond_y10krF   rF   rG   test_safe_timestampsD  s*   
$
$r  c                   @   sh   e Zd Zejjed dddd Zejjeddddd	 Z	ej
d
ddd Zdd ZdS )TestPopenWithErrorHandlingr   z"test" binary is neededr  c                 C   s   t d}| dksJ d S )Nztest 1r   )r5   waitrE   procrF   rF   rG   test_simpleb  s   z&TestPopenWithErrorHandling.test_simplezborg-foobar-test-notexistz4"borg-foobar-test-notexist" binary exists (somehow?)c                 C   s   t d}|d u s
J d S )Nzborg-foobar-test-notexist 1234r4   r  rF   rF   rG   test_not_foundg  s   z)TestPopenWithErrorHandling.test_not_foundcmd)zmismatched "quotezfoo --bar="bazrO   c                 C   s   t |}|d u s
J d S r   r4   )rE   r  r  rF   rF   rG   r   l  s   z*TestPopenWithErrorHandling.test_bad_syntaxc                 C   s<   t t tddd W d    d S 1 sw   Y  d S )NrO   T)shell)r   r   AssertionErrorr5   rD   rF   rF   rG   
test_shellu  s   "z%TestPopenWithErrorHandling.test_shellN)rI   rJ   rK   r   markskipifshutilwhichr  r  parametrizer   r  rF   rF   rF   rG   r  a  s    


r  c                   C   sX   t ddtju s
J t ddtju sJ t ddtjju sJ t ddtjju s*J d S )N-rwrbwb)r6   r  stdinstdoutrW  rF   rF   rF   rG   test_dash_openz  s   r  c                  C   s   dg d} }t | |}tt||ksJ dg d} }t | |d }tt|| dg dks6J dg d} }t | |}tt|| d|ksPJ dg d} }t| |}tt||kshJ d S )	Nr  )r  zbar/bazu   αáčő )r   r  Zspam)rY   ZSEP   
)s   foos   blop	s   grezi)r   r   r  r7   r   )rY   r  fdrF   rF   rG   test_iter_separated  s   r  c                   C   rM   )Nz\n\0\x23z
 #u   äç\nu   äç
r8   rF   rF   rF   rG   test_eval_escapes  rQ   r  )r  rW   r  r  argparser   r   r   r   ior   r   timer   r   rO   r
   	constantsr   helpersr   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'   r(   r)   r*   r+   r,   r-   r/   r0   r1   r2   r3   r5   r6   r7   r9   r:   r;   r=   r>   r@   rP   rR   r   r   r   r   r   r  r  r   r   r   r   r  r  r   r'  r.  r1  r3  r4  rC  rE  rF  rH  rL  rN  rP  rQ  ro  rq  ru  rz  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  r  r  r  rF   rF   rF   rG   <module>   s    $ GP

  !#

7
	



