o
    µ+ke/  ã                   @   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mZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z! e	 "¡ dd„ ƒZ#dd„ Z$dHd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- .d%g d&¢d'd(„ dd d)d*d+i g d,gd-d.d/d0d1d2id1d2gd3g D ƒ ¡d4d5„ ƒZ/e0e1eƒƒZ2e	j-j.d%d6d(„ d7d8ied9d:„ e2D ƒƒed;d:„ e2D ƒƒfD ƒg d<¢d=d>d?„ ƒZ3d@dA„ Z4dBdC„ Z5dDdE„ Z6dFdG„ Z7dS )Ié    N)ÚOrderedDict)ÚdatetimeÚtimezone)ÚStringIO)ÚMocké   )ÚBaseTestCaseé   )ÚPlaintextKey)ÚArchiveÚCacheChunkBufferÚRobustUnpackerÚvalid_msgpacked_dictÚ	ITEM_KEYSÚ
Statistics)ÚBackupOSErrorÚ	backup_ioÚbackup_io_iterÚget_item_uid_gid)ÚManifest)Úmsgpack)ÚItemÚArchiveItem)Úuid2userÚ	gid2groupc                  C   s   t ƒ } | jdddd | S )Né   é
   T©Úunique)r   Úupdate©Ústats© r"   ú:usr/lib/python3.10/site-packages/borg/testsuite/archive.pyr!      s   r!   c                 C   sl   | j dksJ ‚| j| j  krdksJ ‚ J ‚| jdddd | j dks&J ‚| jdks-J ‚| jdks4J ‚d S )Nr   r   Fr   é(   )ZosizeZcsizeZusizer   r    r"   r"   r#   Útest_stats_basic   s    r%   éP   c                 C   sò   |  dt|ƒ¡ tƒ }| j|d d}d|t|ƒ  }| ¡ || d ks'J ‚tƒ }| jdddd	 | jtd
dd|d d}d|t|ƒ  }| ¡ || d ksSJ ‚tƒ }| jtddd|d d}d|t|ƒ  }| ¡ || d kswJ ‚d S )NÚCOLUMNS)Ústreamz20 B O 10 B C 10 B D 0 N ú úiè  r   Fr   Úfoo©Úpath)ÚitemÚfinalr(   z1.02 kB O 10 B C 10 B D 0 N fooZxfoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoozP1.02 kB O 10 B C 10 B D 0 N foofoofoofoofoofoofoofo...oofoofoofoofoofoofoofoofoo)ZsetenvÚstrr   Úshow_progressÚlenÚgetvaluer   r   )r!   ZmonkeypatchÚcolumnsÚoutÚsÚbufr"   r"   r#   Útests_stats_progress#   s"   r8   c                 C   sF   t | ƒdksJ ‚| j› }|dksJ ‚t| ƒdt| ƒd›dks!J ‚d S )NzNThis archive:                   20 B                 10 B                 10 Bz20 Bz<Statistics object at z#xz (20, 10, 10)>)r0   Z	osize_fmtÚreprÚid)r!   r6   r"   r"   r#   Útest_stats_format8   s   "r;   c                 C   sD  d| _ tƒ }| jtdd|d t | ¡ ¡}|d dksJ ‚t|d tƒs(J ‚|d d	u s0J ‚|d
 dks8J ‚|d dks@J ‚|d dksHJ ‚|d dksPJ ‚|d dksXJ ‚tƒ }| j|dd t | ¡ ¡}|d dksqJ ‚t|d tƒszJ ‚|d du s‚J ‚d
|vsˆJ ‚d|vsŽJ ‚d|vs”J ‚d|vsšJ ‚d|vs J ‚d S )NTr+   r,   )r.   r(   ÚtypeZarchive_progressÚtimeÚfinishedFr-   Zoriginal_sizer   Zcompressed_sizer   Zdeduplicated_sizeZnfilesr   )r(   r/   )	Zoutput_jsonr   r1   r   ÚjsonÚloadsr3   Ú
isinstanceÚfloat)r!   r5   Úresultr"   r"   r#   Útest_stats_progress_jsonA   s.   rD   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__rI   r"   r"   r"   r#   ÚMockRepo_   s    rM   c                 C   s   i | _ |  ¡ | _d S rF   )ÚobjectsrM   Ú
repository©rG   r"   r"   r#   Ú__init__c   s   zMockCache.__init__NTc                 C   s   || j |< |t|ƒt|ƒfS rF   )rN   r2   )rG   r:   Úchunkr!   rH   r"   r"   r#   Ú	add_chunkg   s   
zMockCache.add_chunk)NT)rJ   rK   rL   rM   rQ   rS   r"   r"   r"   r#   rE   ]   s    rE   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|¡ d S )NÚtestT)Úcreate)r=   )r   r
   r   r   r   ÚmetadataÚassert_equalÚts)rG   Ú	isoformatÚexpectedrO   ÚkeyÚmanifestÚar"   r"   r#   Ú_test_timestamp_parsingn   s   
z0ArchiveTimestampTestCase._test_timestamp_parsingc                 C   s$   |   dtdddddddtjƒ¡ d S )Nz1970-01-01T00:00:01.000001é²  r   r   ©r_   r   r   ÚutcrP   r"   r"   r#   Útest_with_microsecondsv   ó   þz/ArchiveTimestampTestCase.test_with_microsecondsc                 C   s$   |   dtdddddddtjƒ¡ d S )Nz1970-01-01T00:00:01r`   r   r   ra   rP   r"   r"   r#   Útest_without_microseconds{   rd   z2ArchiveTimestampTestCase.test_without_microsecondsN)rJ   rK   rL   r_   rc   re   r"   r"   r"   r#   rT   l   s    rT   c                   @   ó   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 ƒ}|D ]}| |¡ | ¡  q|jdd |  t|jƒd¡ t	 
¡ }|jD ]
}| |j| ¡ q;|  |dd„ |D ƒ¡ d S )	NÚp1r,   Úp2T©Úflushr	   c                 S   ó   g | ]}t |d ‘qS ©)Zinternal_dict©r   ©Ú.0Údr"   r"   r#   Ú
<listcomp>   ó    z,ChunkBufferTestCase.test.<locals>.<listcomp>)r   rE   r
   r   Úaddrk   rX   r2   Úchunksr   ÚUnpackerÚfeedrN   )rG   ÚdataÚcacher\   ru   rq   Úunpackerr:   r"   r"   r#   rU   ƒ   s   


zChunkBufferTestCase.testc           	      C   sì   dd }t d|dt d|dg}tƒ }td ƒ}t||d ƒ}|D ]}| |¡ q|jdd |  t|jƒd¡ |j	 
¡ d	ks?J ‚|jd
d |  t|jƒd¡ |j	 
¡ d	ksWJ ‚t ¡ }|jD ]
}| |j| ¡ q^|  |dd„ |D ƒ¡ d S )NZ$0123456789abcdefghijklmnopqrstuvwxyzi¨a  Úfull)r-   ÚsourceÚpartialFrj   é   r   Té   c                 S   rl   rm   rn   ro   r"   r"   r#   rr   ¥   rs   z4ChunkBufferTestCase.test_partial.<locals>.<listcomp>)r   rE   r
   r   rt   rk   rX   r2   ru   ÚbufferÚtellr   rv   rw   rN   )	rG   Úbigrx   ry   r\   ru   rq   rz   r:   r"   r"   r#   Útest_partial’   s"   
z ChunkBufferTestCase.test_partialN)rJ   rK   rL   rU   rƒ   r"   r"   r"   r#   rg      s    rg   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  dd„ |D ƒ¡S )Nó    c                 s   s    | ]
}t  d |i¡V  qdS )r-   N©r   Úpackb)rp   r.   r"   r"   r#   Ú	<genexpr>«   s   € z5RobustUnpackerTestCase.make_chunks.<locals>.<genexpr>)Újoin)rG   Úitemsr"   r"   r#   Úmake_chunksª   s   z"RobustUnpackerTestCase.make_chunksc                 C   s   t |tƒo| d¡dv S )Nó   path©ó   fooó   baró   booó   baz)rA   ÚdictÚget)rG   Úvaluer"   r"   r#   Ú
_validator­   s   z!RobustUnpackerTestCase._validatorc                 C   sX   t | jtd}g }|D ]\}}|r| ¡  |D ]}| |¡ |D ]}| |¡ q qq|S )N)Ú	validatorZ	item_keys)r   r•   r   Zresyncrw   Úappend)rG   Úinputrz   rC   Zshould_syncru   rx   r.   r"   r"   r#   Úprocess°   s   
ÿþzRobustUnpackerTestCase.processc                 C   sn   d|   ddg¡gfddg|   ddg¡g fg}|  |¡}|  |ddiddidd	d
dd	ddddiddig¡ d S )NFrŽ   r   s   garbager   r‘   rŒ   ég   éa   ér   éb   ée   )r‹   r™   rX   )rG   ru   rC   r"   r"   r#   Útest_extra_garbage_no_sync¼   s   ÿ

üz1RobustUnpackerTestCase.test_extra_garbage_no_syncc                 C   s.   g }|r|  |d |… ¡ ||d … }|s|S rF   )r—   )rG   ÚleftÚlengthÚpartsr"   r"   r#   ÚsplitÆ   s   þzRobustUnpackerTestCase.splitc                 C   sR   |   |  g d¢¡d¡}d|fg}|  |¡}|  |ddiddiddiddig¡ d S )	Nr   r	   FrŒ   rŽ   r   r   r‘   ©r£   r‹   r™   rX   ©rG   ru   r˜   rC   r"   r"   r#   Útest_correct_streamÍ   s   

(z*RobustUnpackerTestCase.test_correct_streamc                 C   sb   |   |  g d¢¡d¡}d|d d… fd|dd … fg}|  |¡}|  |ddiddidd	ig¡ d S )
Nr   r   Fr~   TrŒ   rŽ   r   r‘   r¤   r¥   r"   r"   r#   Útest_missing_chunkÓ   s    
"z)RobustUnpackerTestCase.test_missing_chunkc                 C   sj   |   |  g d¢¡d¡}d|d d… fdddg|dd …  fg}|  |¡}|  |dd	idd
iddig¡ d S )Nr   r   Fr~   Ts   gars   bagerŒ   rŽ   r   r‘   r¤   r¥   r"   r"   r#   Útest_corrupt_chunkÙ   s   (
"z)RobustUnpackerTestCase.test_corrupt_chunkN)rJ   rK   rL   r‹   r•   r™   rŸ   r£   r¦   r§   r¨   r"   r"   r"   r#   r„   ¨   s    
r„   c                   C   s   dd„ t D ƒS )Nc                 S   ó   g | ]}t  |¡‘qS r"   r†   )rp   Únamer"   r"   r#   rr   â   rs   z(item_keys_serialized.<locals>.<listcomp>)r   r"   r"   r"   r#   Úitem_keys_serializedà   s   r«   Úpacked)r…   ó   xó   foobarc                 C   r©   r"   r†   ©rp   Úor"   r"   r#   rr   ç   rs   rr   g        FÚ r"   é*   gìQ¸…k7@Tr®   rŽ   r   )rŽ   r   c                 C   s   t | |ƒrJ ‚d S rF   ©r   ©r¬   r«   r"   r"   r#   Útest_invalid_msgpacked_itemå   s   rµ   c                 C   r©   r"   r†   r¯   r"   r"   r#   rr   ô   rs   rŒ   s   /a/b/cc                 c   ó    | ]}|d fV  qdS )r…   Nr"   ©rp   Úkr"   r"   r#   rˆ   ö   ó   € rˆ   c                 c   r¶   )sè  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNr"   r·   r"   r"   r#   rˆ   ÷   r¹   )Zminimalzempty-valueszlong-values)Zidsc                 C   s   t | |ƒsJ ‚d S rF   r³   r´   r"   r"   r#   Útest_valid_msgpacked_itemsó   s   rº   c                  C   s0   d} | di}t  | ¡g}tt  |¡|ƒsJ ‚d S )Ns    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr…   )r   r‡   r   )r\   rx   r«   r"   r"   r#   Útest_key_length_msgpacked_itemsþ   s   r»   c                	   C   sN   t  t¡ t tdƒ‚1 sw   Y  W d   ƒ d S 1 s w   Y  d S )Né{   )ÚpytestÚraisesr   r   ÚOSErrorr"   r"   r"   r#   Útest_backup_io  s
   ÿ"ÿrÀ   c                  C   sn   G dd„ dƒ} | t ƒ}t t¡ t|ƒD ]}qW d   ƒ n1 s"w   Y  | tƒ}t|ƒD ]}J dƒ‚d S )Nc                   @   rf   )z%test_backup_io_iter.<locals>.Iteratorc                 S   s
   || _ d S rF   ©Úexc)rG   rÂ   r"   r"   r#   rQ     s   
z.test_backup_io_iter.<locals>.Iterator.__init__c                 S   s   |   ¡ ‚rF   rÁ   rP   r"   r"   r#   Ú__next__  s   z.test_backup_io_iter.<locals>.Iterator.__next__N)rJ   rK   rL   rQ   rÃ   r"   r"   r"   r#   ÚIterator  s    rÄ   Fz!StopIteration handled incorrectly)r¿   r½   r¾   r   r   ÚStopIteration)rÄ   Zoserror_iteratorÚ_Znormal_iteratorr"   r"   r#   Útest_backup_io_iter  s   ÿÿÿrÇ   c                  C   sÖ  t dƒtdƒ} }tddd| |d}t|dd\}}|dks J ‚|dks&J ‚t|dd\}}|dks4J ‚|dks:J ‚t|dd	d
d\}}|d	ksJJ ‚|d
ksPJ ‚tddd| |d}t|dd\}}|dksgJ ‚|dksmJ ‚t|dddd\}}|dks}J ‚|dksƒJ ‚tdddddd}t|dd\}}|dksšJ ‚|dks J ‚t|dddd\}}|dks°J ‚|dks¶J ‚tdddddd}t|dd\}}|dksÍJ ‚|dksÓJ ‚t|dddd\}}|dksãJ ‚|dkséJ ‚d S )Nr   Úfilenamer   r	   )r-   ÚuidÚgidÚuserÚgroupF)ÚnumericTr~   r   )rÍ   Z
uid_forcedZ
gid_forcedéÿÿÿÿéþÿÿÿé   é   )rÍ   Zuid_defaultZgid_defaultéýÿÿÿéüÿÿÿZudoesnotexistZgdoesnotexisté   é   é	   r   é   é   )r   r   r   r   )Zuser0Zgroup0r.   rÉ   rÊ   r"   r"   r#   Útest_get_item_uid_gid  s@   rÙ   )r&   )8r?   Úcollectionsr   r   r   Úior   Zunittest.mockr   r½   r±   r   Z
crypto.keyr
   Úarchiver   r   r   r   r   r   r   r   r   r   Úhelpersr   r   r.   r   r   Úplatformr   r   Zfixturer!   r%   r8   r;   rD   rE   rT   rg   r„   r«   ZmarkZparametrizerµ   ÚsortedÚlistZIKrº   r»   rÀ   rÇ   rÙ   r"   r"   r"   r#   Ú<module>   sd     

		'8
ÿÿÿÿ
ýú
