U
    ÝÁ]cH  ã                   @   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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 G dd„ dejƒZG d	d
„ d
ejƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZedkrØe ¡  dS )zTest certbot.reverter.é    N)Úerrors)Úos)Ú
filesystem)Úutilc                       sð   e Zd ZdZ‡ fdd„Zdd„ Ze d¡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e d¡dd„ ƒZd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Ze d*¡d+d,„ ƒZe d-¡d.d/„ ƒZd0d1„ Z‡  ZS )2ÚReverterCheckpointLocalTestzTest the Reverter Class.c                    sT   t t| ƒ ¡  ddlm} t tj¡ || jƒ| _	t
ƒ }|\| _| _| _| _| _d S ©Nr   )ÚReverter)Úsuperr   ÚsetUpÚcertbot.reverterr   ÚloggingÚdisableÚCRITICALÚconfigÚreverterÚsetup_test_filesÚconfig1Úconfig2Údir1Údir2Úsets©Úselfr   Útup©Ú	__class__© ú=/usr/lib/python3/dist-packages/certbot/tests/reverter_test.pyr
      s    z!ReverterCheckpointLocalTest.setUpc                 C   s6   t  | jj¡ t  | j¡ t  | j¡ t tj¡ d S ©N©	ÚshutilZrmtreer   Zwork_dirr   r   r   r   ZNOTSET©r   r   r   r   ÚtearDown    s    z$ReverterCheckpointLocalTest.tearDownz*certbot.reverter.Reverter._read_and_appendc              	   C   sž   t dƒ|_z| j | jd d¡ W n t k
r6   Y nX | j d¡ t | jjj	¡d }tj
 | jjj	|d¡}t|dƒ}| ¡ }W 5 Q R X |  d|k¡ d S )Nzcannot evenr   Úsave1ZblahÚCHANGES_SINCEÚrz
No changes)ÚOSErrorÚside_effectr   Úadd_to_checkpointr   Úfinalize_checkpointr   Úlistdirr   Ú
backup_dirÚpathÚjoinÚopenÚreadÚ
assertTrue)r   Z	mock_readr,   Z	no_changeÚfÚxr   r   r   Útest_no_change'   s    
z*ReverterCheckpointLocalTest.test_no_changec                 C   s–   | j  | jd d¡ | j  | jd d¡ |  tj | jj¡¡ |  	t
| jjƒd¡ |  tj tj | jjd¡¡¡ |  	t| jjƒd | j| j¡¡ d S )Nr   r#   é   Úsave2Z
save1save2Ú	NEW_FILESz{0}
{1}
)r   Úadd_to_temp_checkpointr   r0   r   r,   Úisdirr   Útemp_checkpoint_dirÚassertEqualÚget_save_notesÚassertFalseÚisfiler-   Úget_filepathsÚformatr   r   r!   r   r   r   Ú!test_basic_add_to_temp_checkpoint5   s    ÿÿ
ÿ
þz=ReverterCheckpointLocalTest.test_basic_add_to_temp_checkpointc              	   C   s@   t  d¡,}tdƒ|_|  tj| jj| j	d d¡ W 5 Q R X d S )Núcertbot.reverter.shutil.copy2úbad copyr   r#   )
ÚmockÚpatchÚIOErrorr'   ÚassertRaisesr   ÚReverterErrorr   r(   r   ©r   Z
mock_copy2r   r   r   Ú#test_add_to_checkpoint_copy_failureD   s    
  þz?ReverterCheckpointLocalTest.test_add_to_checkpoint_copy_failurec                 C   s    t j | jd¡}| j d|¡ t|dƒ | j | jd d¡ | j 	| jd d¡ |  
tj| jj| jd d¡ | j | jd	 d
¡ |  
tj| jjt|gƒd¡ dS )z:Make sure that checkpoint errors are thrown appropriately.úconfig3.txtTzThis is a new file!é   r#   r   r5   Zsave3r4   Zsave4zinvalid saveN)r   r,   r-   r   r   Úregister_file_creationÚupdate_filer(   r   r7   rF   r   rG   Úset©r   Úconfig3r   r   r   Útest_checkpoint_conflictK   s    
 ÿ ÿz4ReverterCheckpointLocalTest.test_checkpoint_conflictc                 C   s`   | j  | jd d¡ t| jdƒ | j  | jd d¡ t| jdƒ | j  ¡  |  t| jƒd¡ d S )Nr   r#   zupdated-directivezsave2-updated dirz'new directive change that we won't keepúdirective-dir1)r   r7   r   rM   r   Úrevert_temporary_configr:   Úread_inr!   r   r   r   Ú#test_multiple_saves_and_temp_revert^   s    
z?ReverterCheckpointLocalTest.test_multiple_saves_and_temp_revertc                 C   s¾   t j | jd¡}t|dƒ t j | jd¡}t|dƒ | j d| j¡ | j d| j	¡ | j d||¡ | j 
¡  |  t j | j¡¡ |  t j | j	¡¡ |  t j |¡¡ |  t j |¡¡ d S )NrJ   ZConfig3úconfig4.txtZConfig4T)r   r,   r-   r   rM   r   r   rL   r   r   Úrecovery_routiner<   r=   ©r   rP   Zconfig4r   r   r   Ú*test_multiple_registration_fail_and_revertg   s    


zFReverterCheckpointLocalTest.test_multiple_registration_fail_and_revertc                 C   s`   | j  d| j¡ | j  d| j¡ | j  d| j¡ | j  d| j¡ t| jjƒ}|  t|ƒd¡ d S )NTr4   )r   rL   r   Úget_new_filesr   r9   r:   Úlen)r   Úfilesr   r   r   Ú$test_multiple_registration_same_file{   s    z@ReverterCheckpointLocalTest.test_multiple_registration_same_filec              	   C   sJ   t  ¡ }t jd|dd( tdƒ|_|  tj| jj	d| j
¡ W 5 Q R X d S )Núcertbot.reverter.openT©Zcreateúbad open)rC   Ú	mock_openrD   r&   r'   rF   r   rG   r   rL   r   ©r   Zm_openr   r   r   Ú'test_register_file_creation_write_error…   s    
  þzCReverterCheckpointLocalTest.test_register_file_creation_write_errorc                 C   s   |   tj| jjd¡ d S )NÚfilepath)rF   r   rG   r   rL   r!   r   r   r   Útest_bad_registration   s
     þz1ReverterCheckpointLocalTest.test_bad_registrationc                 C   s`   ddgddgdgg}|D ]}| j  d|¡ qt| jjƒ}tj ||¡D ]\}}|  ||¡ qFd S )NÚa2dismodÚsslZrewriteZ
cleanslateT)	r   Úregister_undo_commandÚget_undo_commandsr   r9   ÚsixZmovesÚzipr:   )r   ÚcomsÚcomZact_comsZa_comr   r   r   Útest_register_undo_command“   s    ýz6ReverterCheckpointLocalTest.test_register_undo_commandc              	   C   sJ   t  ¡ }t jd|dd( tdƒ|_|  tj| jj	ddg¡ W 5 Q R X d S )Nr^   Tr_   r`   Zcommand)
rC   ra   rD   r&   r'   rF   r   rG   r   rh   rb   r   r   r   Útest_bad_register_undo_command¡   s    
  þz:ReverterCheckpointLocalTest.test_bad_register_undo_commandzcertbot.util.run_scriptc                 C   sN   dt jg|_dgddgg}|D ]}| j d|¡ q| j ¡  |  |jd¡ d S )NÚ Zinvalid_commandrf   rg   TrK   )r   ZSubprocessErrorr'   r   rh   rS   r:   Ú
call_count)r   Zmock_runrl   rm   r   r   r   Útest_run_undo_commands©   s    þ
z2ReverterCheckpointLocalTest.test_run_undo_commandsc                 C   s<   | j  | jd d¡ tjtjd| j _|  tj| j j	¡ d S )Nr   ú	perm save©r'   )
r   r(   r   rC   Ú	MagicMockr   rG   Ú_recover_checkpointrF   rW   r!   r   r   r   Ú)test_recovery_routine_in_progress_failure·   s
    ÿ
zEReverterCheckpointLocalTest.test_recovery_routine_in_progress_failurec                 C   sD   t jt d¡d}|| j_| j | jd d¡ |  tj| jj	¡ d S )NÚert   r   úconfig1 save)
rC   ru   r   rG   r   rv   r7   r   rF   rS   ©r   Zmock_recoverr   r   r   Ú,test_recover_checkpoint_revert_temp_failures¿   s    ÿ ÿzHReverterCheckpointLocalTest.test_recover_checkpoint_revert_temp_failuresc                 C   sR   t jt d¡d}|| j_| j | jd d¡ | j d¡ |  	tj| jj
d¡ d S )Nrx   rt   r   ry   ÚTitler4   )rC   ru   r   rG   r   rv   r(   r   r)   rF   Úrollback_checkpointsrz   r   r   r   Ú(test_recover_checkpoint_rollback_failureÌ   s    ÿ  ÿzDReverterCheckpointLocalTest.test_recover_checkpoint_rollback_failurec              	   C   sJ   | j  | jd d¡ t d¡"}tdƒ|_|  tj	| j j
¡ W 5 Q R X d S )Nr   r#   rA   rB   ©r   r7   r   rC   rD   r&   r'   rF   r   rG   rS   rH   r   r   r   Ú$test_recover_checkpoint_copy_failureØ   s    
 ÿz@ReverterCheckpointLocalTest.test_recover_checkpoint_copy_failurec              	   C   sJ   | j  | jd d¡ t d¡"}tdƒ|_|  tj	| j j
¡ W 5 Q R X d S )Nr   z	temp savezcertbot.reverter.shutil.rmtreezCannot remove treer   )r   Zmock_rmtreer   r   r   Ú"test_recover_checkpoint_rm_failureà   s    
 ÿz>ReverterCheckpointLocalTest.test_recover_checkpoint_rm_failurezcertbot.reverter.logger.warningc                 C   s6   | j  dtj | jd¡¡ | j  ¡  |  |jd¡ d S )NTzmissing_file.txtr4   )	r   rL   r   r,   r-   r   rS   r:   rq   )r   Z	mock_warnr   r   r   Ú)test_recover_checkpoint_missing_new_filesè   s     ÿ
zEReverterCheckpointLocalTest.test_recover_checkpoint_missing_new_fileszcertbot.reverter.os.removec                 C   s0   | j  d| j¡ tdƒ|_|  tj| j j¡ d S )NTzCan't remove)	r   rL   r   r&   r'   rF   r   rG   rS   )r   Zmock_remover   r   r   Ú&test_recover_checkpoint_remove_failureï   s    
 ÿzBReverterCheckpointLocalTest.test_recover_checkpoint_remove_failurec                 C   s  t j | jd¡}| j d|¡ t|dƒ | j | jd d¡ t| j	dƒ | j | jd d¡ t| j
d	ƒ | j | jd d
¡ t| j	dƒ t j | jd¡}| j d|¡ t|dƒ | j ¡  |  t j |¡¡ |  t j |¡¡ |  t| j	ƒd¡ |  t| j
ƒd¡ d S )NrJ   FzThis is a new perm file!r   z
perm save1zupdated perm config1r4   z
perm save2zupdated perm config2z
temp save1zsecond update now temp config1rV   TzNew temporary file!rR   údirective-dir2)r   r,   r-   r   r   rL   rM   r(   r   r   r   r7   r   rW   r<   r=   r:   rT   rX   r   r   r   Ú#test_recovery_routine_temp_and_permö   s"    


z?ReverterCheckpointLocalTest.test_recovery_routine_temp_and_perm)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r"   rC   rD   r3   r@   rI   rQ   rU   rY   r]   rc   re   rn   ro   rr   rw   r{   r~   r€   r   r‚   rƒ   r…   Ú__classcell__r   r   r   r   r      s6   
	



r   c                       s°   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	 
d¡dd„ ƒZe	 
d¡dd„ ƒZe	 
d¡dd„ ƒZdd„ Ze ¡ dd„ ƒZe	 
d¡dd„ ƒZdd„ Zdd„ Z‡  ZS )ÚTestFullCheckpointsReverterz5Tests functions having to deal with full checkpoints.c                    sT   t t| ƒ ¡  ddlm} t tj¡ || jƒ| _	t
ƒ }|\| _| _| _| _| _d S r   )r	   r‹   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
     s    z!TestFullCheckpointsReverter.setUpc                 C   s6   t  | jj¡ t  | j¡ t  | j¡ t tj¡ d S r   r   r!   r   r   r   r"   &  s    z$TestFullCheckpointsReverter.tearDownc                 C   s@   |   tj| jjd¡ |   tj| jjd¡ |   tj| jjd¡ d S )Nz-1iüÿÿZone)rF   r   rG   r   r}   r!   r   r   r   Útest_rollback_improper_inputs-  s      ÿ  ÿ  ÿz9TestFullCheckpointsReverter.test_rollback_improper_inputsc              	   C   s  |   ¡ }|  tt | jj¡ƒd¡ | j d¡ |  t	| j
ƒd¡ |  t	| jƒd¡ |  t	|ƒd¡ | j d¡ |  t	| j
ƒd¡ |  t	| jƒd¡ |  tj |¡¡ t | jj¡}|  t|ƒd¡ |  dttj | jj|d ¡ƒk¡ | j d¡ |  t	| j
ƒd	¡ d S )
Né   r4   úupdate config1úupdate config2úFinal form config3r„   úFirst Checkpointr   rR   )Ú_setup_three_checkpointsr:   r[   r   r*   r   r+   r   r}   rT   r   r   r<   r,   r=   r0   r;   r-   )r   rP   Zall_dirsr   r   r   Ú.test_rollback_finalize_checkpoint_valid_inputs5  s&    ÿÿzJTestFullCheckpointsReverter.test_rollback_finalize_checkpoint_valid_inputsc                 C   s   | j  d¡ d S )NzNo checkpoint...)r   r)   r!   r   r   r   Ú'test_finalize_checkpoint_no_in_progressS  s    zCTestFullCheckpointsReverter.test_finalize_checkpoint_no_in_progresszcertbot.reverter.shutil.movec                 C   s6   | j  | jd d¡ tdƒ|_|  tj| j jd¡ d S )Nr   rs   zcannot mover|   ©	r   r(   r   r&   r'   rF   r   rG   r)   )r   Z	mock_mover   r   r   Ú%test_finalize_checkpoint_cannot_titleW  s    
  ÿzATestFullCheckpointsReverter.test_finalize_checkpoint_cannot_titlez#certbot.reverter.filesystem.replacec                 C   s2   | j  | jd d¡ t|_|  tj| j jd¡ d S )Nr   rs   r|   r•   )r   Zmock_replacer   r   r   Ú,test_finalize_checkpoint_no_rename_directory_  s      ÿzHTestFullCheckpointsReverter.test_finalize_checkpoint_no_rename_directoryzcertbot.reverter.loggerc                 C   sL   | j  d¡ |  |jjd¡ |  ¡  d|j_| j  d¡ |  |jjd¡ d S )Nr4   r   é   )r   r}   r:   Zwarningrq   r’   ©r   Zmock_loggerr   r   r   Útest_rollback_too_manyh  s    z2TestFullCheckpointsReverter.test_rollback_too_manyc                 C   sN   |   ¡ }| j d¡ |  t| jƒd¡ |  t| jƒd¡ |  tj	 
|¡¡ d S )Nr   rR   r„   )r’   r   r}   r:   rT   r   r   r<   r   r,   r=   rO   r   r   r   Útest_multi_rollbackt  s
    z/TestFullCheckpointsReverter.test_multi_rollbackc                 C   s(   |   ¡  | j ¡  |  |ƒ jjd¡ dS )z0This is not strict as this is subject to change.r4   N)r’   r   Úview_config_changesr:   Znotificationrq   )r   Zmock_outputr   r   r   Útest_view_config_changes|  s    
z4TestFullCheckpointsReverter.test_view_config_changesc                 C   s    | j  ¡  |  |jjdk¡ d S )Nr   )r   rœ   r0   Úinforq   r™   r   r   r   Ú#test_view_config_changes_no_backups‡  s    
z?TestFullCheckpointsReverter.test_view_config_changes_no_backupsc                 C   s.   t  tj | jjd¡¡ |  tj	| j
j¡ d S )NZin_progress)r   Úmakedirsr   r,   r-   r   r+   rF   r   rG   r   rœ   r!   r   r   r   Ú(test_view_config_changes_bad_backups_dirŒ  s
     ÿzDTestFullCheckpointsReverter.test_view_config_changes_bad_backups_dirc                 C   sÐ   | j  | jd d¡ | j  d¡ t| jdƒ tj | j	d¡}| j  
d|¡ t|dƒ | j  | jd d	¡ | j  d
¡ t| jdƒ t|dƒ | j  | jd d¡ | j  d¡ t| jdƒ t| jdƒ t|dƒ |S )z$Generate some finalized checkpoints.r   z
first saver‘   rŽ   rJ   Fzdirective-config3r4   zsecond savezSecond Checkpointr   zupdate config3rK   z
third savezThird Checkpoint - Save bothzFinal form config1zFinal form config2r   )r   r(   r   r)   rM   r   r   r,   r-   r   rL   r   rO   r   r   r   r’   ”  s     


z4TestFullCheckpointsReverter._setup_three_checkpoints)r†   r‡   rˆ   r‰   r
   r"   rŒ   r“   r”   rC   rD   r–   r—   rš   r›   Ú	test_utilZpatch_get_utilityr   rŸ   r¡   r’   rŠ   r   r   r   r   r‹     s&   





r‹   c               	   C   sœ   t  d¡} t  d¡}tj | d¡}tj |d¡}t|dƒ}| d¡ W 5 Q R X t|dƒ}| d¡ W 5 Q R X t|gƒt|gƒt||gƒg}||| ||fS )z!Setup sample configuration files.r   r   z
config.txtÚwrR   r„   )ÚtempfileZmkdtempr   r,   r-   r.   ÚwriterN   )r   r   r   r   Úfile_fdr   r   r   r   r   ±  s    


þr   c                 C   s   t tj | d¡ƒS )zRead save notesr$   ©rT   r   r,   r-   ©Údirer   r   r   r;   Ã  s    r;   c                 C   s   t tj | d¡ƒS )zGet FilepathsZ	FILEPATHSr§   r¨   r   r   r   r>   È  s    r>   c                 C   s   t tj | d¡ƒ ¡ S )úGet new files.r6   )rT   r   r,   r-   Ú
splitlinesr¨   r   r   r   rZ   Í  s    rZ   c              
   C   s8   t tj | d¡ƒ}tt |¡ƒW  5 Q R £ S Q R X dS )rª   ZCOMMANDSN)r.   r   r,   r-   ÚlistÚcsvÚreader)r©   Zcsvfiler   r   r   ri   Ò  s    ri   c              
   C   s*   t | dƒ}| ¡ W  5 Q R £ S Q R X dS )zRead in a file, return the strr%   N)r.   r/   )r,   r¦   r   r   r   rT   Ø  s    rT   c              	   C   s$   t | dƒ}| |¡ W 5 Q R X dS )zUpdate a file with a new value.r£   N)r.   r¥   )ÚfilenameÚstringr¦   r   r   r   rM   Þ  s    rM   Ú__main__)r‰   r­   r   r    r¤   ZunittestrC   rj   Zcertbotr   Zcertbot.compatr   r   Zcertbot.testsr   r¢   ZConfigTestCaser   r‹   r   r;   r>   rZ   ri   rT   rM   r†   Úmainr   r   r   r   Ú<module>   s2     	 