
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
ybα              	   @   s*  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m	Z	m
Z
 d dlmZmZ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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'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>m?Z? G dd de>Z@dd ZAG dd  d ZBG d!d" d"ZCG d#d$ d$e>ZDd%d& ZEG d'd( d(e>ZFG d)d* d*ZGG d+d, d,e>ZHG d-d. d.e>ZIG d/d0 d0e>ZJG d1d2 d2e>ZKG d3d4 d4e>ZLd5d6 ZMd7d8 ZNd9d: ZOd;d< ZPd=d> ZQd?d@ ZRdAdB ZSdCdD ZTejUjVdEddQdR ZWejUjVdSddYdZ ZXd[d\ ZYG d]d^ d^ZZd_d` Z[dadb Z\dcdd Z]dedf Z^dgdh Z_didj Z`dkdl Zadmdn Zbdodp Zcdqdr Zddsdt Zedudv Zfdwdx Zgdydz Zhd{d| Zid}d~ Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd ZrejUjser  dddd ZtejUjser  dddd Zudd ZvG dd dZwdd Zxdd Zydd ZzdS )    N)ArgumentTypeError)datetimetimezone	timedelta)mktimestrptimesleep   )platform)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msgpack_fallback)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)safe_unlink   )BaseTestCase
FakeInputsc               @   s   e Zd Zdd ZdS )BigIntTestCasec             C   s   | j tdd | j td	d | j tdd | j tdd | j tdd | j ttdd  dd   | j ttdd dd  d S )Nr   r	   ?   r6   s	           s	          F   l            l    l            l    l            l         l l            l         l l            l            l         )assert_equalr&   r'   )self r>   /usr/lib64/python3.6/helpers.pytest_bigint&   s     zBigIntTestCase.test_bigintN)__name__
__module____qualname__r@   r>   r>   r>   r?   r9   $   s   r9   c               C   s$   t ddkstt ddks td S )N     s    Z0001ff)r(   AssertionErrorr>   r>   r>   r?   test_bin_to_hex0   s    rG   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 |}|jd| |jtjjs.|tjj7 }|S )NBORG_KEYS_DIR)strsetenvendswithospathsep)r=   tmpdirmonkeypatchr>   r>   r?   keys_dir6   s
    zTestLocationWithoutEnv.keys_dirc             C   s  |j ddd ttddks"ttdj |d ks:tttddksNtttd	d
ksbtttddksvtttddksttdj |d kstttddkstttddkstttddksttdj |d kstttddkstttddks"tttddks8tttddksNtttdd ksdtttd!d"ksztttd#d$ksttd#j |d% kstttd&d'kstttd(d)kstd S )*N	BORG_REPOF)raisingz'ssh://user@host:1234/some/path::archivez`Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive='archive')host__some_pathzssh://user@host:1234/some/pathz[Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive=None)zssh://user@host/some/pathz[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/pathzYLocation(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/pathzaLocation(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/pathzhLocation(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/pathzjLocation(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/pathz~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   rF   to_key_filename)r=   rQ   rR   r>   r>   r?   test_ssh>   sN    
























zTestLocationWithoutEnv.test_sshc             C   sR   |j ddd ttddks"tttddks6ttdj |d ksNtd S )	NrS   F)rT   zfile:///some/path::archivez]Location(proto='file', user=None, host=None, port=None, path='/some/path', archive='archive')zfile:///some/pathzXLocation(proto='file', user=None, host=None, port=None, path='/some/path', archive=None)Z	some_path)rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   	test_fileg   s    



z TestLocationWithoutEnv.test_filec             C   s  |j ddd ttddks"tttddks6tttdd	ksJtttd
dks^tttddksrtttddkstttddkstttddkstttddkstttddksttdj |d kstttddkstd S )NrS   F)rT   zuser@host:/some/path::archivez`Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive='archive')zuser@host:/some/pathz[Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive=None)zuser@[::]:/some/path::archivez^Location(proto='ssh', user='user', host='::', port=None, path='/some/path', archive='archive')zuser@[::]:/some/pathzYLocation(proto='ssh', user='user', host='::', port=None, path='/some/path', archive=None)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/pathzaLocation(proto='ssh', user='user', host='2001:db8::', port=None, path='/some/path', archive=None)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/pathzhLocation(proto='ssh', user='user', host='2001:db8::c0:ffee', port=None, path='/some/path', archive=None)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/pathzjLocation(proto='ssh', user='user', host='2001:db8::192.0.2.1', port=None, path='/some/path', archive=None)rV   z9user@[2a02:0001:0002:0003:0004:0005:0006:0007]:/some/pathz~Location(proto='ssh', user='user', host='2a02:0001:0002:0003:0004:0005:0006:0007', port=None, path='/some/path', archive=None))rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_scpo   s0    




















zTestLocationWithoutEnv.test_scpc             C   s>   |j ddd ttddks"ttdj |d ks:td S )NrS   F)rT   z#file:////server/share/path::archivezfLocation(proto='file', user=None, host=None, port=None, path='//server/share/path', archive='archive')Zserver_share_path)rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_smb   s    

zTestLocationWithoutEnv.test_smbc             C   sR   |j ddd ttddks"tttddks6ttdj |d ksNtd S )NrS   F)rT   zpath::archivezWLocation(proto='file', user=None, host=None, port=None, path='path', archive='archive')rN   zRLocation(proto='file', user=None, host=None, port=None, path='path', archive=None))rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_folder   s    



z"TestLocationWithoutEnv.test_folderc             C   sH   |j ddd ttjjddg  j |djddg  d ksDtd S )NrS   F)rT   (   rN   _   )rW   r   rM   rN   joinrY   rF   )r=   rQ   rR   r>   r>   r?   test_long_path   s    z%TestLocationWithoutEnv.test_long_pathc             C   s~   |j ddd ttddks"tttddks6ttdj |d ksNtttd	d
ksbttd	j |d ksztd S )NrS   F)rT   z/some/absolute/path::archivezfLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive='archive')z/some/absolute/pathzaLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive=None)Zsome_absolute_pathzssh://user@host/some/pathz[Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive=None)rU   )rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_abspath   s    





z#TestLocationWithoutEnv.test_abspathc             C   s   |j ddd ttddks"tttddks6ttdj |d ksNtttd	d
ksbttd	j |d ksztttddksttdj |d kstttddksttdj |d kstd S )NrS   F)rT   zsome/relative/path::archivezeLocation(proto='file', user=None, host=None, port=None, path='some/relative/path', archive='archive')zsome/relative/pathz`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)rU   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_path)rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_relpath   s    









z#TestLocationWithoutEnv.test_relpathc             C   sf   |j ddd ttddks"tttddks6tttdd	ksJttdj |d
 ksbtd S )NrS   F)rT   z/abs/path:w:cols::arch:colzdLocation(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_colons)rW   rX   r   rF   rY   )r=   rQ   rR   r>   r>   r?   test_with_colons   s    





z'TestLocationWithoutEnv.test_with_colonsc             C   s,   t tddkstt tddks(t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'))rX   r   rF   )r=   r>   r>   r?   test_user_parsing   s    


z(TestLocationWithoutEnv.test_user_parsingc             C   s,   t tdjtdddtjddks(td S )Nzpath::archive-{utcnow}i  	      )ZtzinfozkLocation(proto='file', user=None, host=None, port=None, path='path', archive='archive-2002-09-19T00:00:00'))rX   r   Zwith_timestampr   r   utcrF   )r=   r>   r>   r?   test_with_timestamp   s    z*TestLocationWithoutEnv.test_with_timestampc             C   sj   |j ddd tjt td W d Q R X tjt td W d Q R X tjt t  W d Q R X d S )NrS   F)rT   z	::archivez::)rW   pytestraises
ValueErrorr   )r=   rQ   r>   r>   r?   test_underspecified   s    z*TestLocationWithoutEnv.test_underspecifiedc          	   C   s0   |j ddd tjt td W d Q R X d S )NrS   F)rT   z8/some/path/to/repo::archive_name_with/slashes/is_invalid)rW   rl   rm   rn   r   )r=   rQ   r>   r>   r?   test_no_slashes   s    z&TestLocationWithoutEnv.test_no_slashesc             C   s\   |j ddd dddddd	g}x8|D ]0}t|j tt|j j ks$td
| q$W d S )NrS   F)rT   zsome/path::archivezfile://some/path::archivezhost:some/path::archivezhost:~user/some/path::archivezssh://host/some/path::archivez'ssh://user@host:1234/some/path::archivez
failed: %s)rW   r   Zcanonical_pathrF   )r=   rQ   Z	locationslocationr>   r>   r?   test_canonical_path   s    

z*TestLocationWithoutEnv.test_canonical_pathc             C   s\   |j ddd tj }ttddj|ks0ttd}td td}|j|jksXtd S )NrS   F)rT   z/some/path::archive{pid}z_Location(proto='file', user=None, host=None, port=None, path='/some/path', archive='archive{}')z/some/path::archive{now:%s}g?)	rW   rM   getpidrX   r   formatrF   r   archive)r=   rQ   Ztest_pidZlocation_time1Zlocation_time2r>   r>   r?   test_format_path   s    
z'TestLocationWithoutEnv.test_format_pathc          	   C   s"   t jt td W d Q R X d S )Nzssh://user@host:/path)rl   rm   rn   r   )r=   r>   r>   r?   test_bad_syntax   s    z&TestLocationWithoutEnv.test_bad_syntaxc             C   sN   ddl m} td}|j }|jd ks*t|jdks8t|jd| ksJt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.platformrx   r   Zomit_archiveru   rF   rawZ	processed)r=   rx   locZloc_without_archiver>   r>   r?   test_omit_archive   s    z(TestLocationWithoutEnv.test_omit_archiveN)rA   rB   rC   rl   ZfixturerR   rZ   r[   r\   r]   r^   rc   rd   re   rf   rg   rk   ro   rp   rr   rv   rw   r|   r>   r>   r>   r?   rH   5   s$   )
		
rH   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   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   zssh://user@host:1234/some/pathz	::archivez`Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive='archive')z::z[Location(proto='ssh', user='user', host='host', port=1234, path='/some/path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   rZ      s    



zTestLocationWithEnv.test_sshc             C   sh   ddl m} |jdd ttddj|ks2tttddj|ksLttt dj|ksdtd S )	Nr   )rx   rS   zssh://user@host:1234/{hostname}z	::archivezYLocation(proto='ssh', user='user', host='host', port=1234, path='/{}', archive='archive')z::zTLocation(proto='ssh', user='user', host='host', port=1234, path='/{}', archive=None))ry   rx   rK   rX   r   rt   rF   )r=   rQ   rx   r>   r>   r?   test_ssh_placeholder  s    

z(TestLocationWithEnv.test_ssh_placeholderc             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   zfile:///some/pathz	::archivez]Location(proto='file', user=None, host=None, port=None, path='/some/path', archive='archive')z::zXLocation(proto='file', user=None, host=None, port=None, path='/some/path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   r[     s    



zTestLocationWithEnv.test_filec             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   zuser@host:/some/pathz	::archivez`Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive='archive')z::z[Location(proto='ssh', user='user', host='host', port=None, path='/some/path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   r\     s    



zTestLocationWithEnv.test_scpc             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   rN   z	::archivezWLocation(proto='file', user=None, host=None, port=None, path='path', archive='archive')z::zRLocation(proto='file', user=None, host=None, port=None, path='path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   r^   !  s    



zTestLocationWithEnv.test_folderc             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   z/some/absolute/pathz	::archivezfLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive='archive')z::zaLocation(proto='file', user=None, host=None, port=None, path='/some/absolute/path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   rd   *  s    



z TestLocationWithEnv.test_abspathc             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   zsome/relative/pathz	::archivezeLocation(proto='file', user=None, host=None, port=None, path='some/relative/path', archive='archive')z::z`Location(proto='file', user=None, host=None, port=None, path='some/relative/path', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   re   3  s    



z TestLocationWithEnv.test_relpathc             C   sJ   |j dd ttddks tttddks4ttt dksFtd S )NrS   z/abs/path:w:colsz
::arch:colzdLocation(proto='file', user=None, host=None, port=None, path='/abs/path:w:cols', archive='arch:col')z::z^Location(proto='file', user=None, host=None, port=None, path='/abs/path:w:cols', archive=None))rK   rX   r   rF   )r=   rQ   r>   r>   r?   rf   <  s    



z$TestLocationWithEnv.test_with_colonsc          	   C   s.   |j dd tjt td W d Q R X d S )NrS   z/some/absolute/pathz&::archive_name_with/slashes/is_invalid)rK   rl   rm   rn   r   )r=   rQ   r>   r>   r?   rp   E  s    z#TestLocationWithEnv.test_no_slashesN)rA   rB   rC   rZ   r~   r[   r\   r^   rd   re   rf   rp   r>   r>   r>   r?   r}      s   	
						r}   c               @   s   e Zd Zdd ZdS )FormatTimedeltaTestCasec             C   s@   t ddddddd}t ddddddd	}| jt|| d
 d S )Ni  r6   
   ra      r         i z2 hours 1.10 seconds)r   r<   r   )r=   Zt0Zt1r>   r>   r?   testM  s
    
zFormatTimedeltaTestCase.testN)rA   rB   rC   r   r>   r>   r>   r?   r   K  s   r   c            	   C   sB   t dd
kstt ddks ttjt t d	 W d Q R X d S )Nz19,23,21,4095ri           z10,23,16,4095r      z19,24,21,4095)ri   r   r   r   )r   r   r   r   )r+   rF   rl   rm   rn   r>   r>   r>   r?   test_chunkerparamsV  s    r   c               @   s   e Zd Zdd ZdS )MakePathSafeTestCasec             C   s   | j tdd | j tdd | j tdd | j tdd | j tdd | j tdd | j tdd	 | j tdd	 d S )
Nz/foo/barzfoo/barz/f/barzf/barzfo/barz
../foo/barz../../foo/bar/.)r<   r   )r=   r>   r>   r?   r   _  s    zMakePathSafeTestCase.testN)rA   rB   rC   r   r>   r>   r>   r?   r   ]  s   r   c               @   s   e Zd Zdd Zdd ZdS )MockArchivec             C   s
   || _ d S )N)ts)r=   r   r>   r>   r?   __init__l  s    zMockArchive.__init__c             C   s
   t | jS )N)rX   r   )r=   r>   r>   r?   __repr__o  s    zMockArchive.__repr__N)rA   rB   rC   r   r   r>   r>   r>   r?   r   j  s   r   c               @   s   e Zd Zdd ZdS )PruneSplitTestCasec                s   dd  dd fdd}dddddddg} fdd|D }dd |D }||d
g dddg ||dg ddddg ||d
|d gdddg ||d
|d gdddg ||d
|d gdddg ||dg g  d S )Nc             S   s&   t td| |f d}tj|tjdS )z1Convert noon on the month and day in 2013 to UTC.z2013-%02d-%02d 12:00z%Y-%m-%d %H:%M)Ztz)r   r   r   Zfromtimestampr   rj   )monthdaysecondsr>   r>   r?   local_to_UTCw  s    z-PruneSplitTestCase.test.<locals>.local_to_UTCc                s    fdd|D S )Nc                s   h | ]} | qS r>   r>   ).0i)lstr>   r?   	<setcomp>}  s    z:PruneSplitTestCase.test.<locals>.subset.<locals>.<setcomp>r>   )r   indicesr>   )r   r?   subset|  s    z'PruneSplitTestCase.test.<locals>.subsetc                s:   x4| t | fD ]$} jtt|d||| | qW d S )Nz%Y-%m)reversedr<   setr   )test_archivesnskipr   ta)r=   r   r>   r?   dotest  s    z'PruneSplitTestCase.test.<locals>.dotestr6   r	      r         c                s   g | ]\}} ||qS r>   r>   )r   r   r   )r   r>   r?   
<listcomp>  s    z+PruneSplitTestCase.test.<locals>.<listcomp>c             S   s   g | ]}t |qS r>   )r   )r   dater>   r>   r?   r     s       r   r   )r6   r6   )r	   r6   )r	   r   )r   r6   )r   r	   )r   r   )r   r6   r>   )r=   r   Z
test_pairs
test_datesr   r>   )r   r=   r   r?   r   u  s    zPruneSplitTestCase.testN)rA   rB   rC   r   r>   r>   r>   r?   r   s  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )IntervalTestCasec             C   sT   | j tdd | j tdd | j tdd | j tdd | j td	d
 d S )N1Hr6   Z1d   1w   1mi  1yi8"  )r<   r   )r=   r>   r>   r?   test_interval  s
    zIntervalTestCase.test_intervalc             C   s   t jt}td W d Q R X | j|jjd t jt}td W d Q R X | j|jjd t jt}td W d Q R X | j|jjd	 d S )
NHAUnexpected interval number "": expected an integer greater than 0z-1dCUnexpected interval number "-1": expected an integer greater than 0ZfoodDUnexpected interval number "foo": expected an integer greater than 0)r   )r   )r   )rl   rm   r   r   r<   valueargs)r=   excr>   r>   r?   test_interval_time_unit  s    z(IntervalTestCase.test_interval_time_unitc          
   C   s2   t jt}td W d Q R X | j|jjd d S )N5LUnexpected interval time unit "5": expected one of ['H', 'd', 'w', 'm', 'y'])r   )rl   rm   r   r   r<   r   r   )r=   r   r>   r>   r?   test_interval_number  s
    z%IntervalTestCase.test_interval_numberN)rA   rB   rC   r   r   r   r>   r>   r>   r?   r     s   r   c               @   s   e Zd Zdd ZdS )PruneWithinTestCasec          	      s>  dd fdd}ddd d!d#d%g}t jtj  fdd|D }dd |D }||ddg ||dddg ||ddddg ||dddddg ||ddddddg ||ddddddg ||dddddddg ||dddddddg ||dddddddg ||dddddddg ||dddddddg d S )&Nc                s    fdd|D S )Nc                s   h | ]} | qS r>   r>   )r   r   )r   r>   r?   r     s    zHPruneWithinTestCase.test_prune_within.<locals>.subset.<locals>.<setcomp>r>   )r   r   r>   )r   r?   r     s    z5PruneWithinTestCase.test_prune_within.<locals>.subsetc                s:   x4| t | fD ]$} jtt|t|| | qW d S )N)r   r<   r   r   r   )r   Zwithinr   r   )r=   r   r>   r?   r     s    z5PruneWithinTestCase.test_prune_within.<locals>.dotest<   Z            1   c                s   g | ]} t |d  qS ))r   )r   )r   s)nowr>   r?   r     s    z9PruneWithinTestCase.test_prune_within.<locals>.<listcomp>c             S   s   g | ]}t |qS r>   )r   )r   r   r>   r>   r?   r     s    r   r   Z2Hr6   Z3Hr	   Z24Hr   Z26Hr   Z2dZ50Hr   Z3dr   r   r   i  i(#  i81  i  i_ i|  i )r   r   r   rj   )r=   r   Ztest_offsetsr   r   r>   )r   r=   r   r?   test_prune_within  s"    z%PruneWithinTestCase.test_prune_withinN)rA   rB   rC   r   r>   r>   r>   r?   r     s   r   c               @   s   e Zd Zdd ZdS )StableDictTestCasec             C   sL   t ddddd}| jt|j ddddg | jtjtj|j d
 d S )Nr6   r	   r   r   )foobarboobazr   r   r   r   Z fc78df42cd60691b3ac3dd2a2b39903f)r   r	   )r   r   )r   r   )r   r6   )	r%   r<   listitemshashlibZmd5r   ZpackbZ	hexdigest)r=   dr>   r>   r?   r     s    zStableDictTestCase.testN)rA   rB   rC   r   r>   r>   r>   r?   r     s   r   c               @   s   e Zd Zdd ZdS )TestParseTimestampc             C   sL   | j tdtdddddddtj | j td	tdddddddtj d S )
Nz2015-04-19T20:25:00.226410i  r   ri   ra   r   r   ijt z2015-04-19T20:25:00)r<   r)   r   r   rj   )r=   r>   r>   r?   r     s    $zTestParseTimestamp.testN)rA   rB   rC   r   r>   r>   r>   r?   r     s   r   c             C   s   | j ddd | j ddd | j ddd t tjjdks@t| jdd t tjjdksbt| jdd	 t d	ks|t| jdd
 t d
kstdS )z+test that get_base_dir respects environmentZBORG_BASE_DIRF)rT   HOMEZUSER~rootz~rootz/var/tmp/homez/var/tmp/baseN)rW   r   rM   rN   
expanduserrF   rK   )rQ   r>   r>   r?   test_get_base_dir  s    r   c             C   s   | j ddd | j ddd t tjjtjjdddks>t| jdd t tjjddksbt| jdd	 t d	ks|td
S )z-test that get_config_dir respects environmentZBORG_CONFIG_DIRF)rT   XDG_CONFIG_HOMEr   z.configborgz/var/tmp/.configz/var/tmpN)rW   r   rM   rN   rb   r   rF   rK   )rQ   r>   r>   r?   test_get_config_dir  s    "r   c             C   s   | j ddd | j ddd t tjjtjjdddks>t| jdd t tjjddksbt| jdd	 t d	ks|td
S )z,test that get_cache_dir respects environmentZBORG_CACHE_DIRF)rT   ZXDG_CACHE_HOMEr   z.cacher   z/var/tmp/.cachez/var/tmpN)rW   r   rM   rN   rb   r   rF   rK   )rQ   r>   r>   r?   test_get_cache_dir  s    "r   c             C   s   | j ddd | j ddd t tjjtjjddddks@t| jdd	 t tjjd	ddksft| jdd
 t d
kstdS )z+test that get_keys_dir respects environmentrI   F)rT   r   r   z.configr   keysz/var/tmp/.configz/var/tmpN)rW   r   rM   rN   rb   r   rF   rK   )rQ   r>   r>   r?   test_get_keys_dir  s    $r   c             C   s   | j ddd | j ddd t tjjtjjddddks@ttd	d
tjjtjjddddd	ksjt| jdd t tjjdddkst| jdd t dkstdS )z/test that get_security_dir respects environmentZBORG_SECURITY_DIRF)rT   r   r   z.configr   ZsecurityZ1234)Zrepository_idz/var/tmp/.configz/var/tmpN)rW   r   rM   rN   rb   r   rF   rK   )rQ   r>   r>   r?   test_get_security_dir  s    $*r   c           *   C   s   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%d0d&i} x$| j  D ]\}}t||ksbtqbW d'S )1z!test the size formatting routinesr   z0 Br6   z1 B   z142 Bi  z999 Bi  z1.00 kBi  i  z1.23 kBi  z1.24 kBi  z1.01 kBi;z	999.99 MBi;ix;z1.00 GBr   r   z1.00 MBrh   r   z1.00 TB   z1.00 PB   z1.00 EBr   z1.00 ZBr   z1.00 YBz-1 Bz-1.01 kBNi@B i ʚ;l    J)l     I5 l     NZol     @=7M.cl      B3v^!< r   i)r   r   rF   )si_size_mapsizefmtr>   r>   r?   test_file_size  s.    r   c               C   s@   t ddddkstt ddddks(tt ddddks<td S )	Ni  r6   )Z	precisionz1.2 kBi  z1.3 kBi;z1.0 GB)r   rF   r>   r>   r>   r?   test_file_size_precision6  s    r   c           
   C   sF   ddddddddddi} x(| j  D ]\}}t|d	d
|ks"tq"W d S )Nr   z0 Br6   z+1 Bi  z+1.23 kBz-1 Bz-1.23 kBT)Zsignr   i.)r   r   rF   )r   r   r   r>   r>   r?   test_file_size_sign<  s    r   zstring,value120ra   5K  1.75M 1e+9    eA-1Tg   mBc             C   s   t | t|kstd S )N)r   intrF   )stringr   r>   r>   r?   test_parse_file_sizeH  s    	r   r   rE      5 Äpfel4E2229 bit1Bc          	   C   s"   t jt t|  W d Q R X d S )N)rl   rm   rn   r   )r   r>   r>   r?   test_parse_file_size_invalidT  s    r   c              C   s6   t j} ztjt _t stW d | t _X t  s2td S )N)r   ZPackerr    r   rF   )Zsaved_packerr>   r>   r?   test_is_slow_msgpack\  s    r   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|j tstt t}t|j ts4td S )N)r   	bytearray
isinstancegetrF   bytes)r=   bufferr>   r>   r?   	test_typeh  s    zTestBuffer.test_typec             C   st   t tdd}|j }t|t|  ko.dkn  s8tt tdd}|j }t|t|  kofdkn  sptd S )Nr   )r   i  )r   r   r   lenrF   )r=   r   br>   r>   r?   test_lenn  s    $zTestBuffer.test_lenc             C   s   t tdd}t|dkst|j }|jd t|dks>t|j }||k	sRt|jd t|dkslt|j }||kst|jddd t|dkst|j }||k	std S )Nd   )r      T)Zinit)r   r   r   rF   r   resize)r=   r   b1b2b3Zb4r>   r>   r?   test_resizev  s    

zTestBuffer.test_resizec          	   C   s^   t tddd}|jd t|dks(ttjt j |jd W d Q R X t|dksZtd S )Nr  r  )r   limit   )r   r   r  r   rF   rl   rm   MemoryLimitExceeded)r=   r   r>   r>   r?   
test_limit  s    
zTestBuffer.test_limitc          	   C   s   t tddd}|jd}t|dks(t|jd}t|dksBt||ksNt|jd}t|dksht||k	stttjt j |jd W d Q R X t|dkstd S )Nr  r  )r   r
  2   r  )r   r   r   r   rF   rl   rm   r  )r=   r   r  r  r  r>   r>   r?   test_get  s    


zTestBuffer.test_getN)rA   rB   rC   r   r  r	  r  r  r>   r>   r>   r?   r   g  s
   r   c              C   s^   t t} t| }x| D ]}t|dstqW t t} t| }x| D ]}t|d sBtqBW d S )N)input)r   r"   r8   r!   rF   r#   )inputsr  r   r>   r>   r?   test_yes_input  s    

r  c              C   sZ   t t} t| }x| D ]}td|dstqW t| }x| D ]}td|d s<tq<W d S )NT)defaultr  F)r   r$   r8   r!   rF   )r  r  r   r>   r>   r?   test_yes_input_defaults  s    

r  c              C   sD   t dddg} td| dsttd| ds.ttd| d s@td S )	NYESSURENOPE)Ztruishr  )Zfalsishr  )r  )r  )r  )r8   r!   rF   )r  r>   r>   r?   test_yes_input_custom  s    r  c             C   sV   x&t D ]}| jd| tddstqW x(tD ] }| jd| tdd s.tq.W d S )NOVERRIDE_THIS)env_var_override)r"   rK   r!   rF   r#   )rQ   r   r>   r>   r?   test_yes_env  s    

r  c             C   s@   x:t D ]2}| jd| tddds&ttddd stqW d S )Nr  T)r  r  F)r$   rK   r!   rF   )rQ   r   r>   r>   r?   test_yes_env_default  s    
r  c           
   C   s   t dddg} t| d stt| d s.tt| d s>tt dddg} td| ds\ttd| dslttd| ds|tt g } td| dsttd| d sttjt td d W d Q R X d S )	NinvalidrE    )r  T)r  r  F)r  )r8   r!   rF   rl   rm   rn   )r  r>   r>   r?   test_yes_defaults  s    r  c              C   sJ   t ddtd g} td| ds"tt ddtd g} td| d sFtd S )Nr   r   r   zRetry: )	retry_msgr  )r8   r"   r!   rF   r#   )r  r>   r>   r?   test_yes_retry  s    r!  c              C   sN   t ddtd g} tdd| d s&tt ddtd g} tdd| dsJtd S )Nr   r   r   F)Zretryr  r  T)r8   r"   r!   rF   r#   )r  r>   r>   r?   test_yes_no_retry  s    r"  c             C   s   t dddg}tdddd|ds$t| j \}}|d	ks<td|ksHtd|ksTtd|ks`ttdddd|d sxt| j \}}|d	kstd|kstd|kstd|kstd S )
Nr  yr   z	intro-msgz	false-msgztrue-msgz	retry-msg)msgZ	false_msgZtrue_msgr   r  rE   )r8   r!   rF   
readouterr)capfdr  outerrr>   r>   r?   test_yes_output  s    r)  c             C   sR   d}|j |d t|dst| j \}}|dks6t||ksBtd|ksNtd S )NZOVERRIDE_SOMETHINGr!   )r  rE   )rK   r!   rF   r%  )r&  rQ   Zenv_varr'  r(  r>   r>   r?   test_yes_env_output  s    r*  c             C   s   |j dd |j dd tddddd	}|jjd
 |jd | j \}}|dksVt|jd |jd | j \}}|dkst|jd | j \}}|dkst|j  | j \}}|dkstd S )NCOLUMNS4LINESr   i  r   r   z%3.0f%%)stepstartr$  INFOz  0%i  i  z
 42% 68%z100%r  r   z    z    )rK   r,   loggersetLevelshowr%  rF   finish)r&  rQ   pir'  r(  r>   r>   r?   !test_progress_percentage_sameline  s"    



r7  c             C   s   |j dd |j dd tddddd	}|jjd
 |j  | j \}}|dksTt|j  | j \}}|dkstt|j  | j \}}|dkstd S )Nr+  r,  r-  r   r  r	   r   z%3.0f%%)r.  r/  r$  r0  z  0%rE   z  2%)rK   r,   r2  r3  r4  r%  rF   )r&  rQ   r6  r'  r(  r>   r>   r?   test_progress_percentage_step  s    r8  c             C   s   t ddddd}|jjd |jd | j \}}|dks>t|jd | j \}}|dks`t|j  | j \}}|dkstd S )Ni  r   r   z%3.0f%%)r.  r/  r$  ZWARNrE   )r,   r2  r3  r4  r%  rF   r5  )r&  r6  r'  r(  r>   r>   r?   test_progress_percentage_quiet(  s    

r9  c             C   sr   t dtjd}|j  | j \}}|dks.t|j  | j \}}|dksNt|j  | j \}}|dksntd S )Nr6   )r.  filer   
)r-   sysstderrr4  r%  rF   r5  )r&  r6  r'  r(  r>   r>   r?   test_progress_endless6  s    r>  c             C   s   t dtjd}|j  | j \}}|dks.t|j  | j \}}|dksNt|j  | j \}}|dksnt|j  | j \}}|dkstd S )Nr	   )r.  r:  rE   r   )r-   r<  r=  r4  r%  rF   )r&  r6  r'  r(  r>   r>   r?   test_progress_endless_stepC  s    r?  c               C   sl   t dddidkstt dddddks.tt d	i d	ks@tt d
i d
ksRtt dddidkshtd S )Nz
{space:10}Zspacer  r   z{foobar}ZwrongZcorrect)r   Zfoobarz{unknown_key}z{key}{{escaped_key}}z{{escaped_key}}Zescaped_keyi  z
          )r   rF   r>   r>   r>   r?   test_partial_formatS  s
    r@  c              C   sj   t tddg} | jddks"t| jddks4t| js>tt tg } | jddks\t| jsftd S )Ns   abcs   defr	   s   abr  s   cdefrD   )r*   iterreadrF   Z	exhausted)Zcfwr>   r>   r?   test_chunk_file_wrapper[  s    
rC  c              C   s   t dd} t| dddgks tt| dddgks6tt| d	gksHttjt t|  W d Q R X tjt t|  W d Q R X t d
d} t| ddggkstt dd} t| g kstd S )NZabcdefgr   ar  cr   efgZabrE   )r/   nextrF   rl   rm   StopIterationr   )itr>   r>   r?   test_chunkitf  s    


rL  c              C   s   dj dd} tt| dddgks&ttt| ddddd	gksDttt| dd
dddgksbttt| ddddddgksttt| ddddddgkstd S )Nz$#comment
data1 #data1
data2

 data3
T)keependszdata1 #data1Zdata2Zdata3F)lstripz data3)rstripzdata1 #data1
zdata2
zdata3
)Zremove_emptyrE   )Zremove_commentsz#comment)
splitlinesr   r   rF   )Zconfr>   r>   r?   test_clean_linesw  s     rQ  c              C   sD   t dd} td| dksttd| dks.ttd| dks@td S )Nzbar baz)r   rE   z{foo}zfoo{foo}foozfoobar bazfoo)dictr   rF   )datar>   r>   r?   test_format_line  s    
rT  c              C   s   t  } tjt td| s tW d Q R X tjt td| sDtW d Q R X tjt td| shtW d Q R X tjt td| stW d Q R X d S )Nz	{invalid}z{}z{now!r}z'{now.__class__.__module__.__builtins__})rR  rl   rm   r   r   rF   )rS  r>   r>   r?   test_format_line_erroneous  s    rU  c              C   s2   t j } dtdkstttd| jks.td S )Nr  z{now}z{now:%Y})r   r   r   rF   r   Zyear)r   r>   r>   r?   test_replace_placeholders  s    rV  c               C   s   t dddiddkstd S )Nz{uuid4}Zuuid4Z
overridden)Z	overrides)r   rF   r>   r>   r>   r?   test_override_placeholders  s    rW  c               C   s   t jddkS )Nu   선r	   )r
   Zswidthr>   r>   r>   r?   working_swidth  s    rX  z"swidth() is not supported / active)reasonc              C   sP   d} t | ddkstt | ddks(tt | ddks:tt | ddksLtd S )	Nu-   나윤선나윤선나윤선나윤선나윤선r6   rE   r   u   나윤u   윤선r   )r.   rF   )r   r>   r>   r?   test_swidth_slice  s
    r[  c              C   s,   d} t | ddkstt | ddks(td S )Nu.   나윤a선나윤선나윤선나윤선나윤선r   u   나윤ar   )r.   rF   )r   r>   r>   r?   "test_swidth_slice_mixed_characters  s    r\  c              C   sf  t rtddksttddks$ttddks4ttddksDtdd } tjt tj|  W d Q R X tjt| tdddksttjt| d	 tdddkstntddksttddksttdd	 dk sttddk stdd } tjt tj|  W d Q R X tjt| td
ddks>ttjt| d	 td
ddksbtd S )Nr	   @   r:   r6   r   r   r  i  i ʚ;i  l            l            l    r   l            l        ir   l            l            l    r   l            l            l    r   )	r2   r0   rF   r1   rl   rm   OverflowErrorr   Zutcfromtimestamp)Zbeyond_y10kr>   r>   r?   test_safe_timestamps  s&    $ r_  c               @   sh   e Zd Zejjejd dddd Zejjejddddd	 Z	ejj
d
ddd Zdd ZdS )TestPopenWithErrorHandlingr   z"test" binary is needed)rY  c             C   s   t d}|j dkstd S )Nztest 1r   )r3   waitrF   )r=   procr>   r>   r?   test_simple  s    z&TestPopenWithErrorHandling.test_simplezborg-foobar-test-notexistz4"borg-foobar-test-notexist" binary exists (somehow?)c             C   s   t d}|d kstd S )Nzborg-foobar-test-notexist 1234)r3   rF   )r=   rb  r>   r>   r?   test_not_found  s    z)TestPopenWithErrorHandling.test_not_foundcmdmismatched "quotefoo --bar="bazrE   c             C   s   t |}|d kstd S )N)r3   rF   )r=   re  rb  r>   r>   r?   rw     s    z*TestPopenWithErrorHandling.test_bad_syntaxc             C   s&   t jt tddd W d Q R X d S )NrE   T)shell)rl   rm   rF   r3   )r=   r>   r>   r?   
test_shell  s    z%TestPopenWithErrorHandling.test_shellN)rf  rg  rE   )rA   rB   rC   rl   markskipifshutilZwhichrc  rd  parametrizerw   ri  r>   r>   r>   r?   r`    s      r`  c               C   sX   t ddtjkstt ddtjks(tt ddtjjks>tt ddtjjksTtd S )N-rwrbwb)r4   r<  stdinrF   stdoutr   r>   r>   r>   r?   test_dash_open  s    ru  c             C   sH   d}| d }|j | | d }|j| tt| |j |ksDtd S )Ns   Hello, world
victimhardlink)write_binarymklinktor5   rJ   read_binaryrF   )rP   contentsrv  	hard_linkr>   r>   r?   test_safe_unlink_is_safe  s    

r}  c          
   C   st   d}| d }|j | | d }|j| dd }|jtd| tjt tt| W d Q R X |j	 |kspt
d S )Ns   Hello, world
rv  rw  c             S   s   t tjdd S )Nz Pretend that we ran out of space)OSErrorerrnoZENOSPC)r`   r>   r>   r?   	os_unlink  s    z2test_safe_unlink_is_safe_ENOSPC.<locals>.os_unlinkunlink)rx  ry  setattrrM   rl   rm   r~  r5   rJ   rz  rF   )rP   rQ   r{  rv  r|  r  r>   r>   r?   test_safe_unlink_is_safe_ENOSPC   s    

r  r   r6   r   ra   r   r   r   r   r   r      m©r   r  )r  r  r  r  r  r  )rE   r   r   r   r   ){r  r   iorM   rl  r<  argparser   r   r   r   Ztimer   r   r   rl   rE   r
   Z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-   r.   r/   r0   r1   r2   r3   r4   r5   r7   r8   r9   rG   rH   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj  rm  r   r   r   r   r  r  r  r  r  r  r!  r"  r)  r*  r7  r8  r9  r>  r?  r@  rC  rL  rQ  rT  rU  rV  rW  rX  rk  r[  r\  r_  r`  ru  r}  r  r>   r>   r>   r?   <module>   s   $ GP	!     7
	
	