
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
yb%                 @   s  d dl Z d dlmZ d dlmZmZ d dl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mZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZ e	j dd Zdd Z dBddZ!dd Z"dd Z#G dd dZ$G dd deZ%G dd deZ&G d d! d!eZ'e	jd"d# Z(e	j)j*d$d%d&d'gd(d) dd d*d+d,i g f gd-d.d/d'd0d1id0d1gdCg D  d2d3 Z+e,e-eZ.e	j)j*d$d4d) d5d6ied7d8 e.D ed9d8 e.D gD d:d; Z/d<d= Z0d>d? Z1d@dA Z2dS )D    N)OrderedDict)datetimetimezone)StringIO)Mock   )BaseTestCase   )PlaintextKey)ArchiveCacheChunkBufferRobustUnpackervalid_msgpacked_dict	ITEM_KEYS
Statistics)BackupOSError	backup_iobackup_io_iter)Manifest)msgpack)ItemArchiveItemc              C   s   t  } | jdddd | S )N   
   T)unique)r   update)stats r   /usr/lib64/python3.6/archive.pyr      s    r   c             C   sl   | j dkst| j| j  ko$dkn  s.t| jdddd | j dksLt| jdksZt| jdkshtd S )Nr   r   F)r   (   )ZosizeAssertionErrorZcsizeZusizer   )r   r   r   r   test_stats_basic   s     r!   P   c             C   s   |j dt| t }| j|d d}d|t|  }|j || d ksNtt }| jddd	d
 | jtddd	|d d}d|t|  }|j || d kstt }| jtdd dd	|d d}d|t|  }|j || d kstd S )NZCOLUMNS)streamz20 B O 10 B C 10 B D 0 N  r      r   F)r   foo)path)itemfinalr#   z1.02 kB O 10 B C 10 B D 0 N foor   zP1.02 kB O 10 B C 10 B D 0 N foofoofoofoofoofoofoofo...oofoofoofoofoofoofoofoofooi  )	Zsetenvstrr   show_progresslengetvaluer    r   r   )r   ZmonkeypatchcolumnsoutsZbufr   r   r   tests_stats_progress"   s"    r2   c             C   sD   t | dkstdj| }|dks&tt| djt| ks@td S )NzNThis archive:                   20 B                 10 B                 10 Bz{0.osize_fmt}z20 Bz)<Statistics object at {:#x} (20, 10, 10)>)r+   r    formatreprid)r   r1   r   r   r   test_stats_format7   s
    

r6   c             C   sP  d| _ t }| jtdd|d tj|j }|d dks>tt|d t	sPt|d d	ks`t|d
 dkspt|d dkst|d dkst|d dkst|d dkstt }| j|dd tj|j }|d dkstt|d t	st|d dkstd
|kstd|ks"td|ks0td|ks>td|ksLtd S )NTr'   )r(   )r)   r#   typeZarchive_progresstimeZfinishedFr(   Zoriginal_sizer   Zcompressed_sizer   Zdeduplicated_sizeZnfilesr   )r#   r*   )
Zoutput_jsonr   r,   r   jsonloadsr.   r    
isinstancefloat)r   r0   resultr   r   r   test_stats_progress_json@   s.    r>   c               @   s,   e Zd ZG dd dZdd Zd	ddZdS )
	MockCachec               @   s   e Zd ZdddZdS )zMockCache.MockRepoTc             C   s   d S )Nr   )selfwaitr   r   r   async_response_   s    z!MockCache.MockRepo.async_responseN)T)__name__
__module____qualname__rB   r   r   r   r   MockRepo^   s   rF   c             C   s   i | _ | j | _d S )N)objectsrF   
repository)r@   r   r   r   __init__b   s    zMockCache.__init__NTc             C   s   || j |< |t|t|fS )N)rG   r-   )r@   r5   chunkr   rA   r   r   r   	add_chunkf   s    
zMockCache.add_chunk)NT)rC   rD   rE   rF   rI   rK   r   r   r   r   r?   \   s   r?   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ArchiveTimestampTestCasec             C   sH   t  }t|}t||}t|||ddd}t|d|_| j|j| d S )NtestT)Zcreate)r8   )r   r
   r   r   r   Zmetadataassert_equalZts)r@   Z	isoformatZexpectedrH   keyZmanifestar   r   r   _test_timestamp_parsingm   s    
z0ArchiveTimestampTestCase._test_timestamp_parsingc             C   s$   | j dtdddddddtj d S )Nz1970-01-01T00:00:01.000001i  r   r   )rQ   r   r   utc)r@   r   r   r   test_with_microsecondsu   s    z/ArchiveTimestampTestCase.test_with_microsecondsc             C   s$   | j dtdddddddtj d S )Nz1970-01-01T00:00:01i  r   r   )rQ   r   r   rR   )r@   r   r   r   test_without_microsecondsz   s    z2ArchiveTimestampTestCase.test_without_microsecondsN)rC   rD   rE   rQ   rS   rT   r   r   r   r   rL   k   s   rL   c               @   s   e Zd Zdd Zdd ZdS )ChunkBufferTestCasec             C   s   t ddt ddg}t }td }t||d }x|D ]}|j| |j  q4W |jdd | jt|jd t	j
 }x|jD ]}|j|j|  q|W | j|dd |D  d S )	NZp1)r(   Zp2T)flushr	   c             S   s   g | ]}t |d qS ))internal_dict)r   ).0dr   r   r   
<listcomp>   s    z,ChunkBufferTestCase.test.<locals>.<listcomp>)r   r?   r
   r   addrV   rN   r-   chunksr   UnpackerfeedrG   )r@   datacacherO   r\   rY   unpackerr5   r   r   r   rM      s    

zChunkBufferTestCase.testc       	      C   s   dd }t d|dt d|dg}t }td }t||d }x|D ]}|j| q@W |jdd | jt|jd |j	j
 d	kst|jd
d | jt|jd |j	j
 d	ksttj }x|jD ]}|j|j|  qW | j|dd |D  d S )NZ$0123456789abcdefghijklmnopqrstuvwxyzia  Zfull)r(   sourcepartialF)rV   r&   r   T   c             S   s   g | ]}t |d qS ))rW   )r   )rX   rY   r   r   r   rZ      s    z4ChunkBufferTestCase.test_partial.<locals>.<listcomp>)r   r?   r
   r   r[   rV   rN   r-   r\   buffertellr    r   r]   r^   rG   )	r@   Zbigr_   r`   rO   r\   rY   ra   r5   r   r   r   test_partial   s"    
z ChunkBufferTestCase.test_partialN)rC   rD   rE   rM   rg   r   r   r   r   rU      s   rU   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 )RobustUnpackerTestCasec             C   s   dj dd |D S )N    c             s   s   | ]}t jd |iV  qdS )r(   N)r   packb)rX   r)   r   r   r   	<genexpr>   s    z5RobustUnpackerTestCase.make_chunks.<locals>.<genexpr>)join)r@   itemsr   r   r   make_chunks   s    z"RobustUnpackerTestCase.make_chunksc             C   s   t |to|jddkS )Ns   path   foo   bar   boo   baz)ro   rp   rq   rr   )r;   dictget)r@   valuer   r   r   
_validator   s    z!RobustUnpackerTestCase._validatorc             C   sd   t | jtd}g }xL|D ]D\}}|r,|j  x.|D ]&}|j| x|D ]}|j| qFW q2W qW |S )N)Z	validatorZ	item_keys)r   rv   r   Zresyncr^   append)r@   inputra   r=   Zshould_syncr\   r_   r)   r   r   r   process   s    


zRobustUnpackerTestCase.processc             C   sn   d| j ddggfddg| j ddgg fg}| j|}| j|ddiddidd	d
dd	ddddiddig d S )NFs   foos   bars   garbages   boos   bazs   pathg   a   r   b   e   )rn   ry   rN   )r@   r\   r=   r   r   r   test_extra_garbage_no_sync   s    
z1RobustUnpackerTestCase.test_extra_garbage_no_syncc             C   s0   g }x&|r*|j |d |  ||d  }qW |S )N)rw   )r@   leftZlengthpartsr   r   r   split   s
    zRobustUnpackerTestCase.splitc             C   sV   | j | jddddgd}d|fg}| j|}| j|ddiddiddiddig d S )Ns   foos   bars   boos   bazr	   Fs   path)r   rn   ry   rN   )r@   r\   rx   r=   r   r   r   test_correct_stream   s    

z*RobustUnpackerTestCase.test_correct_streamc             C   sf   | j | jddddgd}d|d d fd|dd  fg}| j|}| j|d	did	did	dig d S )
Ns   foos   bars   boos   bazrd   Fr&   Ts   path)r   rn   ry   rN   )r@   r\   rx   r=   r   r   r   test_missing_chunk   s     
z)RobustUnpackerTestCase.test_missing_chunkc             C   sn   | j | jddddgd}d|d d fdd	d
g|dd   fg}| j|}| j|ddiddiddig d S )Ns   foos   bars   boos   bazrd   Fr&   Ts   gars   bages   path)r   rn   ry   rN   )r@   r\   rx   r=   r   r   r   test_corrupt_chunk   s    (
z)RobustUnpackerTestCase.test_corrupt_chunkN)rC   rD   rE   rn   rv   ry   r   r   r   r   r   r   r   r   r   rh      s   
rh   c               C   s   dd t D S )Nc             S   s   g | ]}t j|qS r   )r   rj   )rX   namer   r   r   rZ      s    z(item_keys_serialized.<locals>.<listcomp>)r   r   r   r   r   item_keys_serialized   s    r   packedri      xs   foobarc             C   s   g | ]}t j|qS r   )r   rj   )rX   or   r   r   rZ      s    rZ   g        F *   gQk7@T   foo   barc             C   s   t | | std S )N)r   r    )r   r   r   r   r   test_invalid_msgpacked_item   s    r   c             C   s   g | ]}t j|qS r   )r   rj   )rX   r   r   r   r   rZ      s    s   paths   /a/b/cc             c   s   | ]}|d fV  qdS )ri   Nr   )rX   kr   r   r   rk      s    rk   c             c   s   | ]}|d d fV  qdS )r   i  Nr   )rX   r   r   r   r   rk      s    c             C   s   t | |std S )N)r   r    )r   r   r   r   r   test_valid_msgpacked_items   s    r   c              C   s4   dd } | di}t j| g}tt j||s0td S )Nr       ri   )r   rj   r   r    )rO   r_   r   r   r   r   test_key_length_msgpacked_items   s    r   c               C   s2   t jt t tdW d Q R X W d Q R X d S )N{   )pytestraisesr   r   OSErrorr   r   r   r   test_backup_io  s    r   c           
   C   sh   G dd d} | t }tjt xt|D ]}q,W W d Q R X | t}xt|D ]}dsPtdqPW d S )Nc               @   s   e Zd Zdd Zdd ZdS )z%test_backup_io_iter.<locals>.Iteratorc             S   s
   || _ d S )N)exc)r@   r   r   r   r   rI     s    z.test_backup_io_iter.<locals>.Iterator.__init__c             S   s   | j  d S )N)r   )r@   r   r   r   __next__  s    z.test_backup_io_iter.<locals>.Iterator.__next__N)rC   rD   rE   rI   r   r   r   r   r   Iterator
  s   r   Fz!StopIteration handled incorrectly)r   r   r   r   r   StopIterationr    )r   Zoserror_iterator_Znormal_iteratorr   r   r   test_backup_io_iter	  s    r   )r"   )r   r   )3r9   collectionsr   r   r   ior   Zunittest.mockr   r   r   r   Z
crypto.keyr
   archiver   r   r   r   r   r   r   r   r   Zhelpersr   r   r)   r   r   Zfixturer   r!   r2   r6   r>   r?   rL   rU   rh   r   ZmarkZparametrizer   sortedlistZIKr   r   r   r   r   r   r   r   <module>   sH    	
	'8,"