U
    ÝÁ]ž;  ã                   @   sT  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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 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G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZ e!dkrPe "¡  dS )zTests for certbot.log.é    N)Úmessages)ÚOptional)Ú	constants)Úerrors)Úutil)Ú
filesystem)Úosc                   @   sL   e Zd ZdZedd„ ƒZe d¡e d¡e d¡e d¡dd	„ ƒƒƒƒZd
S )ÚPreArgParseSetupTestz*Tests for certbot.log.pre_arg_parse_setup.c                 O   s   ddl m} |ƒ S )Nr   )Úpre_arg_parse_setup)Úcertbot.logr
   )ÚclsÚargsÚkwargsr
   © r   ú8/usr/lib/python3/dist-packages/certbot/tests/log_test.pyÚ_call   s    zPreArgParseSetupTest._callúcertbot.log.sysz%certbot.log.pre_arg_parse_except_hookúcertbot.log.logging.getLoggerz certbot.log.util.atexit_registerc           
      C   sÖ   dg|_ tj|_|  ¡  |ƒ }|j tj¡ |  |j	j
d¡ d }|j	jD ]D}|d d }|d krzt|tjjƒrz|}|j}	qH|  t|tjƒ¡ qH|  t|	tjƒ¡ | tj¡ | ddd¡ |j|ddddtjd d S )Nz--debugé   r   é   é   T©ÚdebugÚlog_path)ÚargvÚsysÚversion_infor   ÚsetLevelÚassert_called_once_withÚloggingÚDEBUGÚassertEqualÚ
addHandlerZ
call_countZcall_args_listÚ
isinstanceÚhandlersÚMemoryHandlerÚtargetÚ
assertTrueÚStreamHandlerZshutdownÚ
excepthookÚmockÚANY)
ÚselfZmock_registerZmock_getÚmock_except_hookÚmock_sysZmock_root_loggerÚmemory_handlerÚcallÚhandlerr&   r   r   r   Útest_it   s4    
ÿ     ÿzPreArgParseSetupTest.test_itN©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r*   Úpatchr2   r   r   r   r   r	      s   
r	   c                       sP   e Zd ZdZedd„ ƒZ‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Z	dd„ Z
‡  ZS )ÚPostArgParseSetupTestz+Tests for certbot.log.post_arg_parse_setup.c                 O   s   ddl m} |||ŽS )Nr   )Úpost_arg_parse_setup)r   r;   )r   r   r   r;   r   r   r   r   ?   s    zPostArgParseSetupTest._callc                    s¤   t t| ƒ ¡  d| j_d| j_d| j_tjd | j_	t
tjdƒ| _ddlm} |t ¡ ƒ| _ddlm}m} |ƒ | _| jj| _|| jƒ| _tj| j| jgd| _d S )	NFiè  Úverbose_countÚwr   ©ÚColoredStreamHandler)r%   ÚTempHandler)r$   )Úsuperr:   ÚsetUpÚconfigr   Úmax_log_backupsÚquietr   ZCLI_DEFAULTSr<   Úopenr   Údevnullr   r?   ÚsixÚStringIOÚstream_handlerr%   r@   Útemp_handlerÚpathÚ	temp_pathr/   r*   Ú	MagicMockÚroot_logger)r,   r?   r%   r@   ©Ú	__class__r   r   rB   D   s    

ÿzPostArgParseSetupTest.setUpc                    s:   | j  ¡  | j ¡  | j ¡  | j ¡  tt| ƒ ¡  d S ©N)r/   ÚcloserJ   rK   rG   rA   r:   ÚtearDown©r,   rP   r   r   rT   U   s
    



zPostArgParseSetupTest.tearDownc                 C   s  t  d¡R}| j|_d}t  |¡0}t  d¡}tj|_|  | j¡ W 5 Q R X W 5 Q R X W 5 Q R X | jj 	| j
¡ |  | jjj¡ |  tj tj | jjd¡¡¡ |  tj | j¡¡ | ddd¡ |j	ddd| jj| jjd | jj}| jjr|  |tj¡ n|  || jj d	 ¡ d S )
Nr   ú&certbot.log.post_arg_parse_except_hookr   zletsencrypt.logr   r   r   r   é
   )r*   r9   rO   Zreturn_valuer   r   r   rC   ZremoveHandlerr   r/   r'   r"   Úcalledr   rL   ÚexistsÚjoinÚlogs_dirÚassertFalserM   r)   r   rJ   ÚlevelrE   r!   r   ZQUIET_LOGGING_LEVELr<   )r,   Zmock_get_loggerZexcept_hook_pathr-   r.   r]   r   r   r   Útest_common\   s8    *ÿ ÿ    ÿ
z!PostArgParseSetupTest.test_commonc                 C   s   d| j _|  ¡  d S ©NT)rC   r   r^   rU   r   r   r   Ú
test_debugu   s    z PostArgParseSetupTest.test_debugc                 C   s   d| j _|  ¡  d S r_   )rC   rE   r^   rU   r   r   r   Ú
test_quiety   s    z PostArgParseSetupTest.test_quiet)r4   r5   r6   r7   r8   r   rB   rT   r^   r`   ra   Ú__classcell__r   r   rP   r   r:   <   s   
r:   c                       sh   e Zd ZdZedd„ ƒZ‡ fdd„Ze d¡dd„ ƒZ	d	d
„ Z
dd„ Zdd„ Ze d¡dd„ ƒZ‡  ZS )ÚSetupLogFileHandlerTestz-Tests for certbot.log.setup_log_file_handler.c                 O   s   ddl m} |||ŽS )Nr   )Úsetup_log_file_handler)r   rd   )r   r   r   rd   r   r   r   r      s    zSetupLogFileHandlerTest._callc                    s   t t| ƒ ¡  d| j_d S )Né*   )rA   rc   rB   rC   rD   rU   rP   r   r   rB   †   s    zSetupLogFileHandlerTest.setUpz1certbot.main.logging.handlers.RotatingFileHandlerc              
   C   s`   t |_z|  | jdd¡ W n6 tjk
rP } z|  dt|ƒk¡ W 5 d }~X Y nX |  d¡ d S )Nútest.logú%(message)sz
--logs-dirzError not raised.)	ÚIOErrorÚside_effectr   rC   r   ÚErrorr'   ÚstrÚfail)r,   Úmock_handlerÚerrr   r   r   Útest_failureŠ   s    $z$SetupLogFileHandlerTest.test_failurec                 C   s   | j dd d S )NT©Úshould_rollover)Ú_test_success_commonrU   r   r   r   Útest_success_with_rollover•   s    z2SetupLogFileHandlerTest.test_success_with_rolloverc                 C   s   d| j _| jdd d S )Nr   Frp   )rC   rD   rr   rU   r   r   r   Útest_success_without_rollover˜   s    z5SetupLogFileHandlerTest.test_success_without_rolloverc                 C   sŽ   d}|   | j|d¡\}}| ¡  |  |jtj¡ |  |jjt	j
¡ tj | jj|¡}|  ||¡ tj | jj|d ¡}|  tj |¡|¡ d S )Nrf   rg   z.1)r   rC   rS   r!   r]   r   r    Z	formatterZ	converterÚtimeÚ	localtimer   rL   rZ   r[   rY   )r,   rq   Úlog_filer1   r   Zexpected_pathZbackup_pathr   r   r   rr   œ   s    z,SetupLogFileHandlerTest._test_success_commonz0certbot.log.logging.handlers.RotatingFileHandlerc                 C   s2   |   | jdd¡ |jd d }|  | jj|¡ d S )Nrf   rg   r   ZbackupCount)r   rC   Ú	call_argsr!   rD   )r,   rm   Zbackup_countr   r   r   Útest_max_log_backups_usedª   s    z1SetupLogFileHandlerTest.test_max_log_backups_used)r4   r5   r6   r7   r8   r   rB   r*   r9   ro   rs   rt   rr   ry   rb   r   r   rP   r   rc   ~   s   


rc   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚColoredStreamHandlerTestz*Tests for certbot.log.ColoredStreamHandlerc                 C   sX   t  ¡ | _dd„ | j_t ¡ | _| j tj¡ ddl	m
} || jƒ| _| j | j¡ d S )Nc                   S   s   dS r_   r   r   r   r   r   Ú<lambda>¶   ó    z0ColoredStreamHandlerTest.setUp.<locals>.<lambda>r   r>   )rH   rI   ÚstreamÚisattyr   Ú	getLoggerÚloggerr   r    r   r?   r1   r"   )r,   r?   r   r   r   rB   ´   s    

zColoredStreamHandlerTest.setUpc                 C   s   | j  ¡  d S rR   ©r1   rS   rU   r   r   r   rT   ¾   s    z!ColoredStreamHandlerTest.tearDownc                 C   s,   d}| j  |¡ |  | j ¡ d |¡¡ d S )NzI did a thingz{0}
)r€   r   r!   r}   ÚgetvalueÚformat©r,   Úmsgr   r   r   Útest_formatÁ   s    z$ColoredStreamHandlerTest.test_formatc                 C   s>   d}t j| j_| j |¡ |  | j ¡ d 	t
j|t
j¡¡ d S )NzI did another thingz
{0}{1}{2}
)r   r    r1   Z	red_levelr€   r   r!   r}   r‚   rƒ   r   ZANSI_SGR_REDZANSI_SGR_RESETr„   r   r   r   Útest_format_and_red_levelÆ   s    
þÿz2ColoredStreamHandlerTest.test_format_and_red_levelN)r4   r5   r6   r7   rB   rT   r†   r‡   r   r   r   r   rz   ±   s
   
rz   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 )ÚMemoryHandlerTestz#Tests for certbot.log.MemoryHandlerc                 C   sb   t  t¡| _| j t j¡ d| _t ¡ | _	t  
| j	¡| _ddlm} || jƒ| _| j | j¡ d S )Nzhi therer   )r%   )r   r   r4   r€   r   r    r…   rH   rI   r}   r(   rJ   r   r%   r1   r"   )r,   r%   r   r   r   rB   Ó   s    
zMemoryHandlerTest.setUpc                 C   s   | j  ¡  | j ¡  d S rR   )r1   rS   rJ   rU   r   r   r   rT   Þ   s    
zMemoryHandlerTest.tearDownc                 C   s2   |   ¡  | jjdd |  | j ¡ | jd ¡ d S )NT©ZforceÚ
)Ú_test_log_debugr1   Úflushr!   r}   r‚   r…   rU   r   r   r   Ú
test_flushâ   s    zMemoryHandlerTest.test_flushc                 C   s.   | j  | j¡ | j ¡  |  | j ¡ d¡ d S )NÚ )r€   Zcriticalr…   r1   rŒ   r!   r}   r‚   rU   r   r   r   Útest_not_flushedç   s    
z"MemoryHandlerTest.test_not_flushedc                 C   sh   |   ¡  t ¡ }t |¡}| j |¡ | jjdd |  | j	 
¡ d¡ |  | 
¡ | jd ¡ | ¡  d S )NTr‰   rŽ   rŠ   )r‹   rH   rI   r   r(   r1   Z	setTargetrŒ   r!   r}   r‚   r…   rS   )r,   Z
new_streamZnew_stream_handlerr   r   r   Útest_target_resetí   s    
z#MemoryHandlerTest.test_target_resetc                 C   s   | j  | j¡ d S rR   )r€   r   r…   rU   r   r   r   r‹   ø   s    z!MemoryHandlerTest._test_log_debugN)
r4   r5   r6   r7   rB   rT   r   r   r   r‹   r   r   r   r   rˆ   Ñ   s   rˆ   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTempHandlerTestz"Tests for certbot.log.TempHandler.c                 C   s   d| _ ddlm} |ƒ | _d S )NFr   )r@   )Úclosedr   r@   r1   )r,   r@   r   r   r   rB   þ   s    zTempHandlerTest.setUpc                 C   s   | j  ¡  d S rR   r   rU   r   r   r   rT     s    zTempHandlerTest.tearDownc                 C   s   |   t | jjd¡¡ d S )Ni€  )r'   r   Zcheck_permissionsr1   rL   rU   r   r   r   Útest_permissions  s    z TempHandlerTest.test_permissionsc                 C   s$   | j  ¡  |  tj | j j¡¡ d S rR   )r1   rS   r\   r   rL   rY   rU   r   r   r   Útest_delete	  s    
zTempHandlerTest.test_deletec                 C   sB   | j  t ¡ ¡ | j  ¡  |  tj | j j¡¡ t 	| j j¡ d S rR   )
r1   Úemitr*   rN   rS   r'   r   rL   rY   ÚremoverU   r   r   r   Útest_no_delete  s    
zTempHandlerTest.test_no_deleteN)	r4   r5   r6   r7   rB   rT   r“   r”   r—   r   r   r   r   r‘   ü   s   r‘   c                   @   s.   e Zd ZdZedd„ ƒZe d¡dd„ ƒZdS )ÚPreArgParseExceptHookTestz0Tests for certbot.log.pre_arg_parse_except_hook.c                 O   s   ddl m} |||ŽS )Nr   )Úpre_arg_parse_except_hook)r   r™   )r   r   r   r™   r   r   r   r     s    zPreArgParseExceptHookTest._callrV   c                 C   sD   t  ¡ }d}ddi}| j|f|ž|Ž |j||Ž |jjdd d S )N)Úsomer   rš   r   Tr‰   )r*   rN   r   r   rŒ   )r,   Zmock_post_arg_parse_except_hookr/   r   r   r   r   r   r2     s     ÿz!PreArgParseExceptHookTest.test_itNr3   r   r   r   r   r˜     s
   
r˜   c                   @   sl   e Zd ZdZe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 )ÚPostArgParseExceptHookTestz1Tests for certbot.log.post_arg_parse_except_hook.c                 O   s   ddl m} |||ŽS )Nr   )Úpost_arg_parse_except_hook)r   rœ   )r   r   r   rœ   r   r   r   r   *  s    z PostArgParseExceptHookTest._callc                 C   s   d| _ d| _d S )Nztest error messagezfoo.log)Ú	error_msgr   rU   r   r   r   rB   /  s    z PostArgParseExceptHookTest.setUpc                 C   s2   t }| j|dd\}}|  |j|¡ |  |¡ d S ©NF©r   )ÚKeyboardInterruptÚ_test_commonÚ_assert_exception_loggedÚerrorÚ_assert_logfile_output©r,   Úexc_typeÚmock_loggerÚoutputr   r   r   Útest_base_exception3  s    z.PostArgParseExceptHookTest.test_base_exceptionc                 C   s2   t }| j|dd\}}|  |j|¡ |  |¡ d S )NTrŸ   )Ú
ValueErrorr¡   r¢   r£   r¤   r¥   r   r   r   r`   9  s    z%PostArgParseExceptHookTest.test_debugc                 C   s6   t j}| j|dd\}}|  |j|¡ |  ||¡ d S rž   )r   ZPluginErrorr¡   r¢   r   Ú_assert_quiet_outputr¥   r   r   r   Útest_custom_error?  s    z,PostArgParseExceptHookTest.test_custom_errorc                    s^   t t tj¡ƒ‰ ‡ fdd„}| j|dd\}}|  |jtj¡ |  	||¡ |  
tj|k¡ d S )Nc                    s   t jjˆ | dS )z6Wraps ACME errors so the constructor takes only a msg.)Zdetail)r   rj   Z	with_code)r…   ©Z	acme_coder   r   Úget_acme_errorI  s    zBPostArgParseExceptHookTest.test_acme_error.<locals>.get_acme_errorFrŸ   )ÚnextrH   Ziterkeysr   ZERROR_CODESr¡   r¢   r   rj   r«   r\   ZERROR_PREFIX)r,   r®   r§   r¨   r   r­   r   Útest_acme_errorE  s    z*PostArgParseExceptHookTest.test_acme_errorc                 C   s4   t }| j|dd\}}|  |j|¡ |  ||¡ d S rž   )rª   r¡   r¢   r   r«   r¥   r   r   r   Útest_other_errorR  s    z+PostArgParseExceptHookTest.test_other_errorc                    sÚ   t  ¡ ‰ ‡ fdd„}z|| jƒ‚W n¦ tk
rÈ   t ¡ }t d¡z}||j_	t dˆ ¡Z z| j
||| jdœŽ W n0 tk
r¤ } zˆ  t|ƒ¡ W 5 d}~X Y nX |  d¡ W 5 Q R X W 5 Q R X Y nX ˆ  ¡ }||fS )z,Returns the mocked logger and stderr output.c                     s   ˆ   | d ¡ dS )zWrite error to mock_err.r   N)Úwrite)r   Zunused_kwargs©Zmock_errr   r   Ú	write_err\  s    z:PostArgParseExceptHookTest._test_common.<locals>.write_errzcertbot.log.loggerzcertbot.log.sys.stderrr   NzSystemExit not raised.)rH   rI   r   ÚBaseExceptionr   Úexc_infor*   r9   r£   ri   r   r   Ú
SystemExitr²   rk   rl   r‚   )r,   Z
error_typer   r´   r¶   r§   Zexit_errr¨   r   r³   r   r¡   X  s(      ÿ $z'PostArgParseExceptHookTest._test_commonc                 C   sJ   |   |j¡ |jd }|   d|k¡ |d }|tjtjf}|  ||¡ d S )Nr   r¶   )r'   rX   rx   r*   r+   r!   )r,   Zlog_funcr¦   Zcall_kwargsZactual_exc_infoZexpected_exc_infor   r   r   r¢   r  s    
z3PostArgParseExceptHookTest._assert_exception_loggedc                 C   s"   |   d|k¡ |   | j|k¡ d S )NzPlease see the logfile)r'   r   )r,   r¨   r   r   r   r¤   {  s    z1PostArgParseExceptHookTest._assert_logfile_outputc                 C   s0   |   |jj¡ |  |jj¡ |  | j|k¡ d S rR   )r\   Z	exceptionrX   r'   r   r   )r,   r§   r¨   r   r   r   r«     s    z/PostArgParseExceptHookTest._assert_quiet_outputN)r4   r5   r6   r7   r8   r   rB   r©   r`   r¬   r°   r±   r¡   r¢   r¤   r«   r   r   r   r   r›   (  s   
	r›   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )ÚExitWithLogPathTestz)Tests for certbot.log.exit_with_log_path.c                 O   s   ddl m} |||ŽS )Nr   )Úexit_with_log_path)r   r¹   )r   r   r   r¹   r   r   r   r   ‡  s    zExitWithLogPathTest._callc                 C   sH   t j | jd¡}t|dƒ ¡  |  |¡}|  d|k¡ |  ||k¡ d S )Nrf   r=   Úlogfiles)r   rL   rZ   ÚtempdirrF   rS   r¡   r'   )r,   rw   Úerr_strr   r   r   Útest_log_fileŒ  s
    
z!ExitWithLogPathTest.test_log_filec                 C   s.   |   | j¡}|  d|k¡ |  | j|k¡ d S )Nrº   )r¡   r»   r'   )r,   r¼   r   r   r   Útest_log_dir”  s    z ExitWithLogPathTest.test_log_dirc              
   O   sN   z| j ||Ž W n. tk
r> } zt|ƒ W Y ¢S d }~X Y nX |  d¡ d S )NzSystemExit was not raised.)r   r·   rk   rl   )r,   r   r   rn   r   r   r   r¡   š  s
    z ExitWithLogPathTest._test_commonN)	r4   r5   r6   r7   r8   r   r½   r¾   r¡   r   r   r   r   r¸   …  s   
r¸   Ú__main__)#r7   r   Zlogging.handlersr   ru   Zunittestr*   rH   Zacmer   Zacme.magic_typingr   Zcertbotr   r   r   Zcertbot.compatr   r   Zcertbot.testsZ	test_utilZTestCaser	   ZConfigTestCaser:   rc   rz   rˆ   r‘   r˜   r›   ZTempDirTestCaser¸   r4   Úmainr   r   r   r   Ú<module>   s4   &B3 +]
