
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
ybpP                 @   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mZm	Z	 ddl
mZ ddlmZmZ ddl
mZ dd	 Zd
d ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )     N   )NSIndex
ChunkIndexChunkIndexEntry)	hashindex)IntegrityCheckedFileFileIntegrityError   )BaseTestCasec             C   s   t d|  dS )Nz%-0.32dascii)bytes)x r   !/usr/lib64/python3.6/hashindex.pyH   s    r   c             C   s   t jt| j S )N)hashlibsha256r   digest)r   r   r   r   H2   s    r   c               @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )HashIndexTestCasec             C   sZ  | }| j t|d x tdD ]}|||t|< q W | j t|d x(tdD ]}| j |t| || qRW x$tdD ]}||d |t|< q|W | j t|d x,tdD ] }| j |t| ||d  qW xtdD ]}|t|= qW xtddD ]}qW xtdD ]}qW x&tdD ]}| jt|jt| q$W | j t|d tj }|j	|j
 ~t|j
d }| j tj|j j | W d Q R X |j|j
}| j t|d x0tddD ]"}| j |t| ||d  qW |j  | j t|d |j	|j
 ~| j t|j|j
d | }|jtd|d |jtd|d ~d S )Nr   d   r   2   rb*      )assert_equallenranger   assert_raisesKeyError__delitem__tempfileNamedTemporaryFilewritenameopenr   r   readZ	hexdigestclear
setdefault)selfclsZ
make_valueZshaidxr   idx_namefdr   r   r   _generic_test   sN     $"zHashIndexTestCase._generic_testc             C   s   | j tdd d d S )Nc             S   s   | | fS )Nr   )r   r   r   r   <lambda>[   s    z0HashIndexTestCase.test_nsindex.<locals>.<lambda>Z@85f72b036c692c8266e4f51ccf0cff2147204282b5e316ae508d30a448d88fef)r.   r   )r)   r   r   r   test_nsindexZ   s    zHashIndexTestCase.test_nsindexc             C   s   | j tdd d d S )Nc             S   s
   | | | fS )Nr   )r   r   r   r   r/   _   s    z3HashIndexTestCase.test_chunkindex.<locals>.<lambda>Z@c83fdf33755fc37879285f2ecfc5d1f63b97577494902126b6fb6f3e4d852488)r.   r   )r)   r   r   r   test_chunkindex^   s    z!HashIndexTestCase.test_chunkindexc             C   s   d}t j }t }|j|j tjj|j}| jt	|d x t
|D ]}||f|t|< qFW |j|j xt
|D ]}|t|= qtW | jt	|d |j|j | j|tjj|j d S )Ni  r   )r!   r"   r   r#   r$   ospathgetsizer   r   r   r   )r)   nr,   r+   Zinitial_sizer   r   r   r   test_resizeb   s    zHashIndexTestCase.test_resizec             C   s   t  }x tdD ]}||f|t|< qW |j }t|}| jt|d | jtt	| t|j|d d d}| jt|d | j||dd   d S )Nr   1   r   )Zmarkerr   )
r   r   r   Z	iteritemslistr   r   r   StopIterationnext)r)   r+   r   iteratorallZsecond_halfr   r   r   test_iteritemss   s    z HashIndexTestCase.test_iteritemsc             C   sb   t  }d|td< d|td< d|td< t  }d|td< d|td< d|td< |j| d S )Nr	   r   r         ,             )r	   r   r   )r   r>   r>   )r?   r@   r@   )rA   r   r   )rB   r>   r>   )rC   rD   rD   )r   r   merge)r)   idx1idx2r   r   r   test_chunkindex_merge   s    
z'HashIndexTestCase.test_chunkindex_mergec             C   sB   t  }d
|td< d|td< d|td< |j \}}}}}}d S )Nr	     r   r     r>   r?     ,  )r	   rI   r   )r   rJ   r>   )r?   rK   rL   )r   r   Z	summarize)r)   r+   sizeZcsizeZunique_sizeZunique_csizeZunique_chunksZchunksr   r   r   test_chunkindex_summarize   s    z+HashIndexTestCase.test_chunkindex_summarizeN)
__name__
__module____qualname__r.   r0   r1   r6   r=   rH   rN   r   r   r   r   r      s   =r   c               @   s   e Zd ZdZdd ZdS )HashIndexExtraTestCasezRThese tests are separate because they should not become part of the selftest.
    c             C   s   t dtj d }t|}dd t|D }|dd| d  |d| d d   }}x"t|D ]\}}|||f||< q`W x"t|D ]\}}|||f||< qW x|D ]
}||= qW xt|D ]\}}qW x|D ]}qW x|D ]
}||= qW d S )Ni  
   c             S   s   g | ]}t jt|j qS r   )r   r   r   r   ).0kr   r   r   
<listcomp>   s    z=HashIndexExtraTestCase.test_chunk_indexer.<locals>.<listcomp>r   r   r?   )intr   ZMAX_LOAD_FACTORr   	enumerate)r)   Z	key_countindexZall_keyskeysZto_delete_keysikeyr   r   r   test_chunk_indexer   s"    *




z)HashIndexExtraTestCase.test_chunk_indexerN)rO   rP   rQ   __doc__r]   r   r   r   r   rR      s   rR   c               @   s   e Zd Zdd Zdd ZdS )HashIndexSizeTestCasec             C   s
   t  }d S )N)r   )r)   r+   r   r   r   test_size_on_disk   s    z'HashIndexSizeTestCase.test_size_on_diskc          	   C   sd   t  }x*tdD ]}||d |d f|t|< qW tj  }|j|j tjj	|j}W d Q R X d S )Ni  r   r?   )
r   r   r   r!   r"   r#   r$   r2   r3   r4   )r)   r+   r[   filerM   r   r   r   test_size_on_disk_accurate   s    
z0HashIndexSizeTestCase.test_size_on_disk_accurateN)rO   rP   rQ   r`   rb   r   r   r   r   r_      s   r_   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d Zdd Zdd Zdd ZdS )HashIndexRefcountingTestCasec             C   sj   t  }t jd ddf|td< x"tdD ]}|jtd^}}q(W x"tdD ]}|jtd^}}qLW d S )Nr	   r   rB   )r   	MAX_VALUEr   r   increfdecref)r)   r+   r[   refcount_r   r   r   test_chunkindex_limit   s    z2HashIndexRefcountingTestCase.test_chunkindex_limitc             C   s   dd }|||}|S )Nc             S   sN   t  }| ddf|td< t  }|ddf|td< |j| |td ^}}|S )Nr	   r   )r   r   rE   )Z	refcount1Z	refcount2rF   rG   rg   rh   r   r   r   rE      s    
z2HashIndexRefcountingTestCase._merge.<locals>.merger   )r)   Z	refcountaZ	refcountbrE   resultr   r   r   _merge   s    
z#HashIndexRefcountingTestCase._mergec             C   s   t jd }d S )Nr   )r   rd   )r)   halfr   r   r   test_chunkindex_merge_limit1   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit1c             C   s   d S )Nr   )r)   r   r   r   test_chunkindex_merge_limit2   s    z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit2c             C   s   t jd }d S )Nr   )r   rd   )r)   rl   r   r   r   test_chunkindex_merge_limit3   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit3c             C   s   t jd }d S )Nr   )r   rd   )r)   rl   r   r   r   test_chunkindex_merge_limit4   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit4c             C   s2   t  }|jtdddd |jtdddd d S )Nr	   rB   rC      r   r?   )r   addr   )r)   rF   r   r   r   test_chunkindex_add   s    z0HashIndexRefcountingTestCase.test_chunkindex_addc             C   s<   t  }t jddf|td< |jtd |td ^}}d S )NrC   rq   r	   )r   rd   r   re   )r)   rF   rg   rh   r   r   r   test_incref_limit  s
    z.HashIndexRefcountingTestCase.test_incref_limitc             C   s<   t  }t jddf|td< |jtd |td ^}}d S )NrC   rq   r	   )r   rd   r   rf   )r)   rF   rg   rh   r   r   r   test_decref_limit  s
    z.HashIndexRefcountingTestCase.test_decref_limitc          
   C   s:   t  }d|td< | jt |jtd W d Q R X d S )Nr   r	   )r   r   r   )r   r   r   AssertionErrorrf   )r)   rF   r   r   r   test_decref_zero  s    z-HashIndexRefcountingTestCase.test_decref_zeroc             C   s:   t  }|jtdddd |jtd |jtd d S )Nr	   rB   rC   rq   )r   rr   r   re   rf   )r)   rF   r   r   r   test_incref_decref  s
    z/HashIndexRefcountingTestCase.test_incref_decrefc             C   s8   t  }| jt t jd ddf|td< W d Q R X d S )Nr	   r   )r   r   rv   rd   r   )r)   rF   r   r   r   test_setitem_raises#  s    z0HashIndexRefcountingTestCase.test_setitem_raisesc          !   C   s   t  }| jt |jtd W d Q R X | jt |jtd W d Q R X | jt |td  W d Q R X | jt |jtdddd W d Q R X d S )Nr	   r   )r   r   r   re   r   rf   OverflowErrorrr   )r)   r+   r   r   r   test_keyerror(  s    z*HashIndexRefcountingTestCase.test_keyerrorN)rO   rP   rQ   ri   rk   rm   rn   ro   rp   rs   rt   ru   rw   rx   ry   r|   r   r   r   r   rc      s   	rc   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )HashIndexDataTestCases(  eJzt0L0NgmAUhtHLT0LDEI6AuAEhMVYmVnSuYefC7AB3Aj9KNedJbnfyFne6P67P27w0EdG1Eac+Cm1ZybAsy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7LsL9nhc+cqTZ3XlO2Ys++Du5fX+l1/YFmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVn2/+0O2rYccw==c             C   sP   t j >}tjj|d}|j| t|d}| j|j S Q R X W d Q R X d S )Nr+   r   )	r!   TemporaryDirectoryr2   r3   joinr#   r%   _packr&   )r)   r+   tempdirra   fr   r   r   _serialize_hashindex:  s
    

z*HashIndexDataTestCase._serialize_hashindexc             C   sR   t j @}tjj|d}t|d}|j| j| W d Q R X tj	|S Q R X d S )Nr+   wb)
r!   r~   r2   r3   r   r%   r#   _unpackr   r&   )r)   
bytestringr   ra   r   r   r   r   _deserialize_hashindexA  s
    
z,HashIndexDataTestCase._deserialize_hashindexc             C   s   t jtj|S )N)base64Z	b64encodezlibcompress)r)   r   r   r   r   r   H  s    zHashIndexDataTestCase._packc             C   s   t jtj|S )N)r   Z
decompressr   Z	b64decode)r)   r   r   r   r   r   K  s    zHashIndexDataTestCase._unpackc             C   s8   t  }d|td< d
|td< d|td< | j|}d S )Nr	   r   r?      r      xl )r	   r   r?   l        )r   r   r   )r   r   r   )r   r   r   )r)   rF   Z
serializedr   r   r   test_identical_creationN  s    
z-HashIndexDataTestCase.test_identical_creationc             C   s,   | j | j}t }d	|td< |j| d S )
Nr       i@ rC   rq   r?   l            )r   rC   rq   )r   	HASHINDEXr   r   rE   )r)   rF   rG   r   r   r   test_read_known_goodW  s
    
z*HashIndexDataTestCase.test_read_known_goodN)
rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   r}   4  s   	r}   c               @   s   e Zd Zdd Zdd ZdS )HashIndexIntegrityTestCasec          	   C   sJ   | j | j}tjj|d}t|dd}|j| W d Q R X |j}||fS )Nr+   T)r3   r#   )r   r   r2   r3   r   r   r#   integrity_data)r)   r   r+   ra   r-   r   r   r   r   write_integrity_checked_indexd  s    z8HashIndexIntegrityTestCase.write_integrity_checked_indexc             C   s   t j n}| j|\}}t|d}|jd W d Q R X | jt* t|d|d}tj	| W d Q R X W d Q R X W d Q R X d S )Nzr+bs   FooF)r3   r#   r   )
r!   r~   r   r%   r#   r   r   r   r   r&   )r)   r   ra   r   r-   r   r   r   test_integrity_checked_filen  s    
z6HashIndexIntegrityTestCase.test_integrity_checked_fileN)rO   rP   rQ   r   r   r   r   r   r   r   c  s   
r   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d Zdd Zdd Zdd ZdS )HashIndexCompactTestCasec             C   sd   t j }|jd |j|jdd |j|jdd |jdjdd |jdjdd || _d S )Ns   BORG_IDXrA   littler   r	   r?      )ioBytesIOr#   to_bytes
index_data)r)   num_entriesnum_bucketsr   r   r   r   rY   y  s    
zHashIndexCompactTestCase.indexc             C   s   | j jd tj| j }|S )Nr   )r   seekr   r&   )r)   rY   r   r   r   index_from_data  s    z(HashIndexCompactTestCase.index_from_datac             C   s   t j }|j| |j S )N)r   r   r#   getvalue)r)   rY   datar   r   r   index_to_data  s    
z&HashIndexCompactTestCase.index_to_datac             C   s   | j  }|j  | j|}|S )N)r   compactr   )r)   rY   compact_indexr   r   r   index_from_data_compact_to_data  s    
z8HashIndexCompactTestCase.index_from_data_compact_to_datac             G   s2   | j j| x |D ]}| j j|jdd qW d S )NrA   r   )r   r#   r   )r)   r\   valuesvaluer   r   r   write_entry  s    
z$HashIndexCompactTestCase.write_entryc             C   s   | j |ddd d S )Nl    r   )r   )r)   r\   r   r   r   write_empty  s    z$HashIndexCompactTestCase.write_emptyc             C   s   | j |ddd d S )Nl    r   )r   )r)   r\   r   r   r   write_deleted  s    z&HashIndexCompactTestCase.write_deletedc             C   s   | j ddd | jtdddd | jtd | jtd | jtdddd | jtd	d
dd | jtd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd d S )Nr?   rC   )r   r   r   r	   r   rB   rq   rA      	   rS   )rY   r   r   r   r   r   )r)   r   r   r   r   test_simple  s    z$HashIndexCompactTestCase.test_simplec             C   s   | j ddd | jtd | jtdddd | jtd | jtdddd | jtd	d
dd | jtd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd d S )Nr?   rC   )r   r   r	   r   r   rB   rq   rA   r   r   rS   )rY   r   r   r   r   r   )r)   r   r   r   r   test_first_empty  s    z)HashIndexCompactTestCase.test_first_emptyc             C   s   | j ddd | jtd | jtdddd | jtd | jtdddd | jtd | jtd	d
dd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd d S )Nr?   rC   )r   r   r	   r   r   rB   rq   rA   r   r   rS   )rY   r   r   r   r   r   )r)   r   r   r   r   test_last_used  s    z'HashIndexCompactTestCase.test_last_usedc             C   s   | j ddd | jtd | jtdddd | jtdddd | jtd | jtd | jtd	d
dd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd d S )Nr?   rC   )r   r   r	   r   r   rB   rq   rA   r   r   rS   )rY   r   r   r   r   r   )r)   r   r   r   r   test_too_few_empty_slots  s    z1HashIndexCompactTestCase.test_too_few_empty_slotsc             C   s|   | j ddd | jtd | jtd | jtd | jtd | jtd | jtd | j }| j ddd d S )	Nr   rC   )r   r   r	   r?   r   rB   rA   )rY   r   r   r   r   )r)   r   r   r   r   
test_empty  s    z#HashIndexCompactTestCase.test_emptyc             C   sF   t  }t  }d|td< d|td< d	|td< |j  |j| d S )
Nr	   r   r   r>   r?   ,  )r	   r   r   )r   r>   r>   )r?   r   r   )r   r   r   rE   )r)   ZmasterrF   r   r   r   
test_merge  s    
z#HashIndexCompactTestCase.test_mergeN)rO   rP   rQ   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   x  s   r   c               @   s   e Zd Zdd ZdS )NSIndexTestCasec             C   sH   t  }| jt t jd df|td< W d Q R X t jdf|td< d S )Nr	   r   r   )r   r   rv   rd   r   )r)   r+   r   r   r   test_nsindex_segment_limit  s
     z*NSIndexTestCase.test_nsindex_segment_limitN)rO   rP   rQ   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )AllIndexTestCasec             C   s   d S )Nr   )r)   r   r   r   test_max_load_factor  s    z%AllIndexTestCase.test_max_load_factorN)rO   rP   rQ   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )IndexCorruptionTestCasec                s   ddl m fdd t x"tdD ]}d|f d|< q(W xtdD ]} d|= qLW x"tdD ]}d|f d|< qjW d S )	Nr   )packc                s    d| |dddS )Nz<IIQQQr   r   )r   y)r   r   r   HH  s    z1IndexCorruptionTestCase.test_bug_4829.<locals>.HHi  i  iJ  iX  )structr   r   r   )r)   r   r   )r   r+   r   r   test_bug_4829  s    	z%IndexCorruptionTestCase.test_bug_4829N)rO   rP   rQ   r   r   r   r   r   r     s   r   )r   r   r   r2   r!   r   r   r   r   r    Zcrypto.file_integrityr   r   r
   r   r   r   rR   r_   rc   r}   r   r   r   r   r   r   r   r   r   <module>   s.    f/ 
