U
    ]                     @   s   d 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 Zdd Zejd	d
 Zdd ZG dd dejZG dd deZedkre  dS )z Tests for certbot.error_handler.    N)CallableDictUnion)osc                 C   s   t dd | D S )z,Get the handlers for an iterable of signums.c                 s   s   | ]}|t |fV  qd S N)signal	getsignal.0s r   B/usr/lib/python3/dist-packages/certbot/tests/error_handler_test.py	<genexpr>   s     zget_signals.<locals>.<genexpr>)dict)signumsr   r   r   get_signals   s    r   c                 C   s"   |   D ]\}}t|| qdS )zDSet the signal (keys) with the handler (values) from the input dict.N)itemsr   )Zsig_handler_dictr   hr   r   r   set_signals   s    r   c                 #   s8   g  t | }tt fdd| D   V  t| dS )z Context manager to catch signalsc                 3   s   | ]}| fd dfV  qdS )c                    s
     | S r   )append)r   _signalsr   r   <lambda>        z+signal_receiver.<locals>.<genexpr>.<lambda>Nr   r	   r   r   r   r       s     z"signal_receiver.<locals>.<genexpr>N)r   r   r   )r   Zprev_handlersr   r   r   signal_receiver   s
    r   c                 C   s   t t  |  dS )zSend the given signalN)r   killgetpid)signumr   r   r   send_signal%   s    r   c                   @   sH   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d Z
dS )ErrorHandlerTestz-Tests for certbot.error_handler.ErrorHandler.c                 C   sP   ddl m} t | _td| _ddi| _|j| jf| j| j| _	|j
| _d S )Nr   error_handler)*   ZfooZbar)certbotr"   mock	MagicMock	init_funcset	init_argsinit_kwargsZErrorHandlerhandlerZ_SIGNALSr   selfr"   r   r   r   setUp-   s    



zErrorHandlerTest.setUpc              	   C   sX   d}z| j 
 tW 5 Q R X W n tk
r6   d}Y nX | | | jj| j| j d S )NFT)r+   
ValueErrorZ
assertTruer'   assert_called_once_withr)   r*   )r-   Zexception_raisedr   r   r   test_context_manager:   s    


z%ErrorHandlerTest.test_context_managerc              
   C   s   | j s| jdd t| j }t| j 2}| j  d}t| j d  |d9 }W 5 Q R X W 5 Q R X | d| | | j d g| | jj| j	| j
 | j D ]}| || t| qd S )N%Signals cannot be handled on Windows.reasonr#   r   
   )r   skipTestr   r   r+   r   assertEqualr'   r0   r)   r*   r   r   )r-   Zinit_signalssignals_receivedZshould_be_42r   r   r   r    test_context_manager_with_signalF   s    


z1ErrorHandlerTest.test_context_manager_with_signalc              	   C   sh   t jtgd}| j| z| j
 tW 5 Q R X W n tk
rH   Y nX | jj| j| j |  d S )NZside_effect)	r%   r&   r/   r+   registerr'   r0   r)   r*   )r-   bad_funcr   r   r   test_bad_recoveryZ   s    
z"ErrorHandlerTest.test_bad_recoveryc              
      s   | j s| jdd | j d  | j d }tj fddd}| j| t| j  }| j t| W 5 Q R X W 5 Q R X | | g| | j	j
| j| j |
  d S )Nr2   r3   r   c                      s   t  S r   )r   r   Zsig1r   r   r   k   r   z@ErrorHandlerTest.test_bad_recovery_with_signal.<locals>.<lambda>r:   )r   r6   r%   r&   r+   r;   r   r   r7   r'   r0   r)   r*   )r-   Zsig2r<   r8   r   r?   r   test_bad_recovery_with_signalf   s    


z.ErrorHandlerTest.test_bad_recovery_with_signalc              	   C   sH   z | j  td W 5 Q R X W n tk
r4   Y nX | | jj d S )Nr   )r+   sysexit
SystemExitZassertFalser'   Zcalled)r-   r   r   r   test_sysexit_ignoredu   s    z%ErrorHandlerTest.test_sysexit_ignoredc              	   C   s<   t  }| j| | j W 5 Q R X | j  |  d S r   )r%   r&   r+   r;   r'   Zassert_not_calledr-   funcr   r   r   test_regular_exit}   s    

z"ErrorHandlerTest.test_regular_exitN)__name__
__module____qualname____doc__r.   r1   r9   r=   r@   rD   rG   r   r   r   r   r    *   s   r    c                       s(   e Zd ZdZ fddZdd Z  ZS )ExitHandlerTestz,Tests for certbot.error_handler.ExitHandler.c                    s8   ddl m} tt|   |j| jf| j| j| _	d S )Nr   r!   )
r$   r"   superrL   r.   ZExitHandlerr'   r)   r*   r+   r,   	__class__r   r   r.      s    
zExitHandlerTest.setUpc              	   C   sD   t  }| j| | j W 5 Q R X | jj| j| j |  d S r   )r%   r&   r+   r;   r'   r0   r)   r*   rE   r   r   r   rG      s    

z!ExitHandlerTest.test_regular_exit)rH   rI   rJ   rK   r.   rG   __classcell__r   r   rN   r   rL      s   rL   __main__)rK   
contextlibr   rA   Zunittestr%   Zacme.magic_typingr   r   r   Zcertbot.compatr   r   r   contextmanagerr   r   ZTestCaser    rL   rH   mainr   r   r   r   <module>   s    
	\