U
    ]~                     @   s   d Z ddlZddlZddlZzddlZW n ek
r@   dZY nX dZddl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jZedkre  dS )zTests for certbot.lock.    NFT)errors)os)utilc                   @   s$   e Zd ZdZedd Zdd ZdS )LockDirTestz Tests for certbot.lock.lock_dir.c                 O   s   ddl m} |||S )Nr   )lock_dir)certbot.lockr   )clsargskwargsr    r   9/usr/lib/python3/dist-packages/certbot/tests/lock_test.py_call   s    zLockDirTest._callc                 C   s8   t | jtj| j| j}tj	| jd}t
|| d S )Nz.certbot.lock)	functoolspartialassertRaisesr   	LockErrorr   tempdirr   pathjoin	test_utillock_and_call)selfassert_raises	lock_pathr   r   r   test_it   s       zLockDirTest.test_itN)__name__
__module____qualname____doc__classmethodr   r   r   r   r   r   r      s   
r   c                       s~   e Zd ZdZedd Z fddZdd Zdd	 Zd
d Z	dd Z
dd Zeddd Zdd Zdd Zdd Z  ZS )LockFileTestz Tests for certbot.lock.LockFile.c                 O   s   ddl m} |||S )Nr   )LockFile)r   r!   )r   r	   r
   r!   r   r   r   r   #   s    zLockFileTest._callc                    s$   t t|   tj| jd| _d S )Nz	test.lock)superr    setUpr   r   r   r   r   )r   	__class__r   r   r#   (   s    zLockFileTest.setUpc                 C   sR   t j| j| jfd}|  |  | |jd | t	j
| j |   d S )N)targetr	   r   )multiprocessingZProcessr   r   startr   ZassertEqualZexitcode
assertTruer   r   existstest_removed)r   Zchildr   r   r   test_acquire_without_deletion,   s    z*LockFileTest.test_acquire_without_deletionc                 C   s*   t | jtj| j| j}t|| j d S N)	r   r   r   r   r   r   r   r   r   )r   r   r   r   r   test_contention8   s       zLockFileTest.test_contentionc                 C   sB   |  | j}z&t|}| || | d|k W 5 |  X d S )NZacquiredr   r   releaserepr_test_repr_commonr)   )r   	lock_fileZlocked_reprr   r   r   test_locked_repr=   s    zLockFileTest.test_locked_reprc                 C   s:   |  | j}|  t|}| || | d|k d S )NZreleasedr/   )r   r3   Zreleased_reprr   r   r   test_released_reprF   s
    zLockFileTest.test_released_reprc                 C   s&   |  |jj|k |  | j|k d S r-   )r)   r%   r   r   )r   r3   Z	lock_reprr   r   r   r2   M   s    zLockFileTest._test_repr_commonzWRace conditions on lock are specific to the non-blocking file access approach on Linux.c              	      sZ   ddgddl m  fdd}td}||_  j W 5 Q R X   d S )NTFr   )statc                    s&   |  j krdrt|  | S )z-Wrap os.stat and maybe delete the file first.r   )r   popr   remove)r   r   Zshould_deleter6   r   r   delete_and_statZ   s    
z/LockFileTest.test_race.<locals>.delete_and_statcertbot.lock.filesystem.os.stat)r   r6   mockpatchside_effectr   r   assertFalse)r   r:   Z	mock_statr   r9   r   	test_raceQ   s    zLockFileTest.test_racec                 C   s,   |  | j}|  | tj| j d S r-   )r   r   r0   r?   r   r   r*   )r   r3   r   r   r   r+   e   s    zLockFileTest.test_removedc                 C   s   t r
d}nd}d}t|`}t||_z| | j W n4 tk
rl } z| |t|k W 5 d }~X Y nX | 	d W 5 Q R X d S )Nzcertbot.lock.fcntl.lockfcertbot.lock.msvcrt.lockinghi therezIOError not raised)

POSIX_MODEr<   r=   IOErrorr>   r   r   r)   strfail)r   Zmocked_functionmsgZ	mock_lockerrr   r   r   $test_unexpected_lockf_or_locking_errj   s    
$z1LockFileTest.test_unexpected_lockf_or_locking_errc                 C   s   t r
d}nd}d}t|`}t||_z| | j W n4 tk
rl } z| |t|k W 5 d }~X Y nX | 	d W 5 Q R X d S )Nr;   rA   rB   zOSError not raised)
rC   r<   r=   OSErrorr>   r   r   r)   rE   rF   )r   Zmock_functionrG   Zmock_osrH   r   r   r   test_unexpected_os_erry   s    
$z#LockFileTest.test_unexpected_os_err)r   r   r   r   r   r   r#   r,   r.   r4   r5   r2   r   Zskip_on_windowsr@   r+   rI   rK   __classcell__r   r   r$   r   r    !   s    
	
r    __main__)r   r   r'   ZunittestZfcntlImportErrorrC   r<   Zcertbotr   Zcertbot.compatr   Zcertbot.testsr   r   ZTempDirTestCaser   r    r   mainr   r   r   r   <module>   s    
i