U
    ÓZjcH  ã                   @   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__© ú^/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-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©	ÚshutilÚrmtreer   Zwork_dirr   r   r   r   Ú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   r2   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   r7   Zsave3r6   Zsave4zinvalid saveN)r   r.   r/   r   r   Úregister_file_creationÚupdate_filer*   r   r9   rH   r   rI   Ú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   r9   r   rO   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 )NrL   ZConfig3úconfig4.txtZConfig4T)r   r.   r/   r   rO   r   r   rN   r   r   Úrecovery_routiner>   r?   ©r   rR   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 )NTr6   )r   rN   r   Úget_new_filesr   r;   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©Úcreateúbad open)rE   Ú	mock_openrF   r(   r)   rH   r   rI   r   rN   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)rH   r   rI   r   rN   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   r;   ÚsixÚ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`   Tra   rc   Úcommand)
rE   rd   rF   r(   r)   rH   r   rI   r   rk   re   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_commandri   rj   TrM   )r   ÚSubprocessErrorr)   r   rk   rU   r<   Ú
call_count)r   Zmock_runrp   rq   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   rE   Ú	MagicMockr   rI   Ú_recover_checkpointrH   rY   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Úerz   r   úconfig1 save)
rE   r{   r   rI   r   r|   r9   r   rH   rU   ©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 )Nr~   rz   r   r   ÚTitler6   )rE   r{   r   rI   r   r|   r*   r   r+   rH   Úrollback_checkpointsr€   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%   rC   rD   ©r   r9   r   rE   rF   r(   r)   rH   r   rI   rU   rJ   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.txtr6   )	r   rN   r   r.   r/   r   rU   r<   rw   )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   rN   r   r(   r)   rH   r   rI   rU   )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 )NrL   FzThis is a new perm file!r   z
perm save1zupdated perm config1r6   z
perm save2zupdated perm config2z
temp save1zsecond update now temp config1rX   TzNew temporary file!rT   údirective-dir2)r   r.   r/   r   r   rN   rO   r*   r   r   r   r9   r   rY   r>   r?   r<   rV   rZ   r   r   r   Ú#test_recovery_routine_temp_and_permö   s"    


z?ReverterCheckpointLocalTest.test_recovery_routine_temp_and_perm)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r$   rE   rF   r5   rB   rK   rS   rW   r[   r_   rf   rh   rr   rt   rx   r}   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üÿÿÚone)rH   r   rI   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é   r6   úupdate config1úupdate config2úFinal form config3rŠ   úFirst Checkpointr   rT   )Ú_setup_three_checkpointsr<   r]   r   r,   r   r-   r   rƒ   rV   r   r   r>   r.   r?   r2   r=   r/   )r   rR   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   ry   zcannot mover‚   ©	r   r*   r   r(   r)   rH   r   rI   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   ry   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 )Nr6   r   é   )r   rƒ   r<   Úwarningrw   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”   rT   rŠ   )r™   r   rƒ   r<   rV   r   r   r>   r   r.   r?   rQ   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.r6   N)r™   r   Úview_config_changesr<   Znotificationrw   )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¤   r2   Úinforw   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-   rH   r   rI   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•   rL   Fzdirective-config3r6   zsecond savezSecond Checkpointr–   zupdate config3rM   z
third savezThird Checkpoint - Save bothzFinal form config1zFinal form config2r—   )r   r*   r   r+   rO   r   r   r.   r/   r   rN   r   rQ   r   r   r   r™   ”  s     


z4TestFullCheckpointsReverter._setup_three_checkpoints)rŒ   r�   rŽ   r�   r
   r$   r“   rš   r›   rE   rF   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ÚwrT   rŠ   )ÚtempfileÚmkdtempr   r.   r/   r0   ÚwriterP   )r   r   r   r   Úfile_fdr   r   r   r   r   ±  s    


þr   c                 C   s   t tj | d¡ƒS )zRead save notesr&   ©rV   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.r8   )rV   r   r.   r/   Ú
splitlinesr±   r   r   r   r\   Í  s    r\   c              
   C   s8   t tj | d¡ƒ�}tt |¡ƒW  5 Q R £ S Q R X dS )r³   ZCOMMANDSN)r0   r   r.   r/   ÚlistÚcsvÚreader)r²   Zcsvfiler   r   r   rl   Ò  s    rl   c              
   C   s*   t | dƒ�}| ¡ W  5 Q R £ S Q R X dS )zRead in a file, return the strr'   N)r0   r1   )r.   r¯   r   r   r   rV   Ø  s    rV   c              	   C   s$   t | dƒ�}| |¡ W 5 Q R X dS )zUpdate a file with a new value.r«   N)r0   r®   )ÚfilenameÚstringr¯   r   r   r   rO   Þ  s    rO   Ú__main__)r�   r¶   r   r    r¬   ZunittestrE   rm   Zcertbotr   Zcertbot.compatr   r   Zcertbot.testsr   rª   ZConfigTestCaser   r‘   r   r=   r@   r\   rl   rV   rO   rŒ   Úmainr   r   r   r   Ú<module>   s2     	 