U
    P|j¬  ã                   @   sv   d 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 G dd	„ d	ejƒZG d
d„ deƒZeegZdS )z
Test cases for dirdbm module.
é    N)Ú	b64decode)Údirdbm)Úrebuild)ÚFilePath)Úunittestc                   @   sŠ   e Zd Zddœdd„Zddœdd„Zddœdd„Zddœd	d
„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„ZdS )ÚDirDbmTestsN©Úreturnc                 C   s(   t |  ¡ ƒ| _t | jj¡| _d| _d S )N)©s   abcs   foo©s   /lalals    ©s    
s   baz)r   ÚmktempÚpathr   ÚopenÚdbmÚitems©Úself© r   ú</tmp/pip-unpacked-wheel-audpp6lv/twisted/test/test_dirdbm.pyÚsetUp   s    zDirDbmTests.setUpc                 C   s2   t dƒ}d| j|< d| j|< |  | j| d¡ d S )Nz//==ó   a)r   r   ÚassertEqual)r   Úkr   r   r   Útest_all   s    

zDirDbmTests.test_allc                 C   s0   | j  dddœ¡ |  t| j  ¡ ƒddh¡ dS )zb
        L{DirDBM.update} updates the DBM with values from a bytes:bytes
        mapping.
        ó   bó   d)r   ó   c)r   r   )r   r   N)r   Úupdater   Úsetr   r   r   r   r   Útest_update!   s    zDirDbmTests.test_updatec                 C   s    t  d¡}d|d< t t ¡ d S )Ns   dirdbm.rebuild.testó   values   key)r   ÚShelfr   )r   Úsr   r   r   Útest_rebuildInteraction)   s    
z#DirDbmTests.test_rebuildInteractionc              	   C   sÀ  | j }g }tƒ }| jD ]$\}}|||< | |¡ | |¡ q| ¡  | jD ]$\}}|  ||¡ |  || |¡ qJz|d  W n tk
r�   Y nX dsžt	dƒ‚| 
¡ }t| ¡ ƒ}t| ¡ ƒ}| ¡  t| jƒ}	|  ||dt|ƒ› dt|ƒ› �¡ |  ||d t|ƒt|ƒ¡¡ |  |	|dt|	ƒ› dt|ƒ› �¡ |  ¡ }
| |
¡}| 
¡ }t| ¡ ƒ}t| ¡ ƒ}| ¡  |  ||d t|ƒt|ƒ¡¡ |  ||d	t|ƒt|ƒf ¡ |  ||d
t|ƒt|ƒf ¡ | ¡  |  t| 
¡ ƒt| ¡ ƒ  k�ot| ¡ ƒ  k�ot|ƒ  k�odkn  d¡ |  t|ƒt|ƒ¡ t |
¡ | jD ]\}}||= |  ||d¡ �qH|  t| 
¡ ƒdd¡ |  t| ¡ ƒdd¡ |  t| ¡ ƒdd¡ |  t|ƒdd¡ d S )Ns   XXXr   z)didn't raise KeyError on non-existent keyz.keys() output didn't match: z != z'.values() output didn't match: {} != {}zitems() didn't match: z'.copyTo().keys() didn't match: {} != {}z).copyTo().values() didn't match: %s != %sz(.copyTo().items() didn't match: %s != %sz.clear() failedz3key is still in database, even though we deleted itzdatabase has keyszdatabase has valueszdatabase has items)r   r   r   ÚappendÚaddÚsortZassertInr   ÚKeyErrorÚAssertionErrorÚkeysÚvaluesÚreprÚformatr   ZcopyToÚclearÚ
assertTrueÚlenZassertNotEqualÚshutilÚrmtreeZassertNotIn)r   Údr*   r+   r   ÚvZdbkeysZdbvaluesZdbitemsr   ZcopyPathZd2ZcopykeysZ
copyvaluesZ	copyitemsr   r   r   Útest_dbm.   sª    

ý ÿýý
 ÿýÿýÿýLþ
  ÿzDirDbmTests.test_dbmc                 C   sJ   dd l }d| jd< |  t|  ¡ | j d¡ ƒdk¡ |  t| jjd¡ d S )Nr   ó   vó   ké   s   nokey)Útimer   r/   ÚabsÚgetModificationTimeÚassertRaisesr(   )r   r9   r   r   r   Útest_modificationTimeŽ   s    
"z!DirDbmTests.test_modificationTimec              	   C   s  | j  d¡}| j |d ¡jdd��}| d¡ W 5 Q R X | j  d¡}| j |¡jdd��}| d¡ W 5 Q R X | j |d ¡jdd��}| d¡ W 5 Q R X | j d	¡jdd��}| d
¡ W 5 Q R X t | jj¡}|  |d d¡ |  |d d¡ |  	| j 
d¡¡ |  	| j 
d¡¡ dS )zJ
        DirDBM: test recovery from directory after a faked crash
        s   key1s   .rplÚw)Úmoder!   s   key2s   corrects   wrongzaa.news   deletedz*.newz*.rplN)r   Ú_encoder   Úchildr   Úwriter   ZDirDBMr   ZassertFalseZglobChildren)r   r   ÚfZk2r   r   r   r   Útest_recoveryž   s    zDirDbmTests.test_recoveryc                 C   s²   |   t| jjdd¡ z|   t| jjdd¡ W n& tjk
rR   |  | jtj¡ Y nX |   t| jj	d¡ |   t| jj
d¡ |   t| jjd¡ |   t| jjd¡ |   t| jjd¡ dS )zx
        L{dirdbm.DirDBM} operations only support string keys: other types
        should raise a L{TypeError}.
        é   Ú3Ú2r8   N)r<   Ú	TypeErrorr   Ú__setitem__r   ZFailTestZassertIsInstancer   r"   Ú__getitem__Ú__delitem__Zhas_keyÚ__contains__r;   r   r   r   r   Útest_nonStringKeysµ   s    zDirDbmTests.test_nonStringKeysc                 C   sH   t t tddœdd„}d| jd< |  | jd|¡ |  t| jjdd¡ dS )	z4
        Failure path when setting an item.
        N)r   Údatar	   c                 S   s   |   |¡ tdƒ‚d S )Nzfail to write)Z
setContentÚOSError)r   rN   r   r   r   Ú
_writeFailË   s    
z,DirDbmTests.test_failSet.<locals>._writeFails   tests   failkeyZ
_writeFiles   test2)r   ÚstrÚbytesr   Úpatchr<   ÚIOErrorrI   )r   rP   r   r   r   Útest_failSetÆ   s    
zDirDbmTests.test_failSet)Ú__name__Ú
__module__Ú__qualname__r   r   r    r$   r5   r=   rD   rM   rU   r   r   r   r   r      s   	`r   c                   @   s   e Zd Zddœdd„ZdS )Ú
ShelfTestsNr   c                 C   s(   t |  ¡ ƒ| _t | jj¡| _d| _d S )N)r
   r   r   )s   inté   )s   floatg      (@)s   tuple)NrZ   )r   r   r   r   r"   r   r   r   r   r   r   r   Õ   s    zShelfTests.setUp)rV   rW   rX   r   r   r   r   r   rY   Ô   s   rY   )Ú__doc__r1   Úbase64r   Ztwisted.persistedr   Ztwisted.pythonr   Ztwisted.python.filepathr   Ztwisted.trialr   ZTestCaser   rY   Z	testCasesr   r   r   r   Ú<module>   s    D