a }|ägiBã@sôdZddlZddlZddlZddlZddlZddlZddlmZddlZddl m Z ddl m Z ddl mZGdd„dejƒZGd d „d ejƒZd d „Zd d„Zdd„Zdd„Zdd„Zdd„Zdd„Zedkrðe e ejdd…eg¡¡dS)zTest certbot.reverter.éN)Úmock)Úerrors)Úos)ÚutilcsðeZdZdZ‡fdd„Zdd„Ze d¡dd„ƒZd d „Z d d „Z d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Ze d¡dd„ƒZd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Ze d*¡d+d,„ƒZe d-¡d.d/„ƒZd0d1„Z‡ZS)2ÚReverterCheckpointLocalTestzTest the Reverter Class.csPtƒ ¡ddlm}t tj¡||jƒ|_t ƒ}|\|_ |_ |_ |_ |_dS©Nr)ÚReverter©ÚsuperÚsetUpZcertbot.reverterrÚloggingÚdisableZCRITICALÚconfigÚreverterÚsetup_test_filesÚconfig1Úconfig2Údir1Údir2Úsets©ÚselfrÚtup©Ú __class__©úI/usr/lib/python3.9/site-packages/certbot/_internal/tests/reverter_test.pyr s     z!ReverterCheckpointLocalTest.setUpcCs6t |jj¡t |j¡t |j¡t tj¡dS©N© ÚshutilÚrmtreerZwork_dirrrr r ZNOTSET©rrrrÚtearDowns  z$ReverterCheckpointLocalTest.tearDownz*certbot.reverter.Reverter._read_and_appendcCs¢tdƒ|_z|j |jdd¡Wnty4Yn0|j d¡t |jjj ¡d}tj   |jjj |d¡}t |dƒ}|  ¡}Wdƒn1s”0YdS)Nz cannot evenrÚsave1ZblahÚ CHANGES_SINCEÚr)ÚOSErrorÚ side_effectrÚadd_to_checkpointrÚfinalize_checkpointrÚlistdirrÚ backup_dirÚpathÚjoinÚopenÚread)rZ mock_readr,Z no_changeÚfÚxrrrÚtest_no_change&s    &z*ReverterCheckpointLocalTest.test_no_changecCs,|j |jdd¡|j |jdd¡dS)Nrr#éÚsave2)rÚadd_to_temp_checkpointrr!rrrÚ!test_basic_add_to_temp_checkpoint4sz=ReverterCheckpointLocalTest.test_basic_add_to_temp_checkpointc Csxt d¡Z}tdƒ|_t tj¡$|j  |j dd¡Wdƒn1sL0YWdƒn1sj0YdS)Núcertbot.reverter.shutil.copy2úbad copyrr#) rÚpatchr&r'ÚpytestÚraisesrÚ ReverterErrorrr(r©rZ mock_copy2rrrÚ#test_add_to_checkpoint_copy_failureBs  z?ReverterCheckpointLocalTest.test_add_to_checkpoint_copy_failurecCsätj |jd¡}|j d|¡t|dƒ|j |jdd¡|j  |jdd¡t   t j ¡$|j |jdd¡Wd ƒn1s†0Y|j |jd d ¡t   t j ¡ |j |hd ¡Wd ƒn1sÖ0Yd S) z:Make sure that checkpoint errors are thrown appropriately.ú config3.txtTzThis is a new file!ér#rr4Zsave3Nr3Zsave4z invalid save)rr,r-rrÚregister_file_creationÚ update_filer(rr5r:r;rr<©rÚconfig3rrrÚtest_checkpoint_conflictHs 2z4ReverterCheckpointLocalTest.test_checkpoint_conflictcCsN|j |jdd¡t|jdƒ|j |jdd¡t|jdƒ|j ¡dS)Nrr#zupdated-directivezsave2-updated dirz'new directive change that we won't keep)rr5rrBrÚrevert_temporary_configr!rrrÚ#test_multiple_saves_and_temp_revert[s    z?ReverterCheckpointLocalTest.test_multiple_saves_and_temp_revertcCsrtj |jd¡}t|dƒtj |jd¡}t|dƒ|j d|j¡|j d|j ¡|j d||¡|j  ¡dS)Nr?ZConfig3ú config4.txtZConfig4T) rr,r-rrBrrrArrÚrecovery_routine©rrDZconfig4rrrÚ*test_multiple_registration_fail_and_revertds   zFReverterCheckpointLocalTest.test_multiple_registration_fail_and_revertcCsP|j d|j¡|j d|j¡|j d|j¡|j d|j¡t|jjƒ}dS)NT)rrArÚ get_new_filesrÚtemp_checkpoint_dir)rÚfilesrrrÚ$test_multiple_registration_same_filexs  z@ReverterCheckpointLocalTest.test_multiple_registration_same_filec Cs‚t ¡}tjd|ddVtdƒ|_t tj¡ |j   d|j ¡Wdƒn1sV0YWdƒn1st0YdS)Núcertbot.reverter.openT©Zcreateúbad open) rÚ mock_openr9r&r'r:r;rr<rrAr©rZm_openrrrÚ'test_register_file_creation_write_error‚s  zCReverterCheckpointLocalTest.test_register_file_creation_write_errorcCs<t tj¡|j d¡Wdƒn1s.0YdS)NÚfilepath)r:r;rr<rrAr!rrrÚtest_bad_registration‰sz1ReverterCheckpointLocalTest.test_bad_registrationcCsPddgddgdgg}|D]}|j d|¡qt|jjƒ}t||ƒD]\}}qBdS)NÚa2dismodÚsslZrewriteZ cleanslateT)rÚregister_undo_commandÚget_undo_commandsrrMÚzip)rÚcomsÚcomZact_comsZa_comrrrÚtest_register_undo_commandŽsý z6ReverterCheckpointLocalTest.test_register_undo_commandc Cs‚t ¡}tjd|ddVtdƒ|_t tj¡ |j   ddg¡Wdƒn1sV0YWdƒn1st0YdS)NrPTrQrRZcommand) rrSr9r&r'r:r;rr<rrZrTrrrÚtest_bad_register_undo_commandœs  z:ReverterCheckpointLocalTest.test_bad_register_undo_commandzcertbot.util.run_scriptcCs@dtjg|_dgddgg}|D]}|j d|¡q|j ¡dS)NÚZinvalid_commandrXrYT)rZSubprocessErrorr'rrZrF)rZmock_runr]r^rrrÚtest_run_undo_commands£s þ z2ReverterCheckpointLocalTest.test_run_undo_commandscCs`|j |jdd¡tjtjd|j_t  tj¡|j  ¡Wdƒn1sR0YdS)Nrú perm save©r') rr(rrÚ MagicMockrr<Ú_recover_checkpointr:r;rIr!rrrÚ)test_recovery_routine_in_progress_failure±s ÿ zEReverterCheckpointLocalTest.test_recovery_routine_in_progress_failurecCshtjt d¡d}||j_|j |jdd¡t  tj¡|j  ¡Wdƒn1sZ0YdS)NÚerdrú config1 save) rrerr<rrfr5rr:r;rF©rZ mock_recoverrrrÚ,test_recover_checkpoint_revert_temp_failuresºsÿzHReverterCheckpointLocalTest.test_recover_checkpoint_revert_temp_failurescCsvtjt d¡d}||j_|j |jdd¡|j d¡t   tj¡|j  d¡Wdƒn1sh0YdS)NrhrdrriÚTitler3) rrerr<rrfr(rr)r:r;Úrollback_checkpointsrjrrrÚ(test_recover_checkpoint_rollback_failureÇsÿ zDReverterCheckpointLocalTest.test_recover_checkpoint_rollback_failurec Cs‚|j |jdd¡t d¡P}tdƒ|_t t j ¡|j  ¡Wdƒn1sV0YWdƒn1st0YdS)Nrr#r7r8© rr5rrr9r&r'r:r;rr<rFr=rrrÚ$test_recover_checkpoint_copy_failureÓs   z@ReverterCheckpointLocalTest.test_recover_checkpoint_copy_failurec Cs‚|j |jdd¡t d¡P}tdƒ|_t t j ¡|j  ¡Wdƒn1sV0YWdƒn1st0YdS)Nrz temp savezcertbot.reverter.shutil.rmtreezCannot remove treero)rZ mock_rmtreerrrÚ"test_recover_checkpoint_rm_failureÛs   z>ReverterCheckpointLocalTest.test_recover_checkpoint_rm_failurezcertbot.reverter.logger.warningcCs(|j dtj |jd¡¡|j ¡dS)NTzmissing_file.txt)rrArr,r-rrF)rZ mock_warnrrrÚ)test_recover_checkpoint_missing_new_filesãs ÿ zEReverterCheckpointLocalTest.test_recover_checkpoint_missing_new_fileszcertbot.reverter.os.removecCsT|j d|j¡tdƒ|_t tj¡|j  ¡Wdƒn1sF0YdS)NTz Can't remove) rrArr&r'r:r;rr<rF)rZ mock_removerrrÚ&test_recover_checkpoint_remove_failureês zBReverterCheckpointLocalTest.test_recover_checkpoint_remove_failurecCs¾tj |jd¡}|j d|¡t|dƒ|j |jdd¡t|j dƒ|j |jdd¡t|j d ƒ|j  |jdd ¡t|j d ƒtj |j d ¡}|j d |¡t|dƒ|j  ¡dS)Nr?FzThis is a new perm file!rz perm save1zupdated perm config1r3z perm save2zupdated perm config2z temp save1zsecond update now temp config1rHTzNew temporary file!)rr,r-rrrArBr(rrrr5rrIrJrrrÚ#test_recovery_routine_temp_and_permñs      z?ReverterCheckpointLocalTest.test_recovery_routine_temp_and_perm)Ú__name__Ú __module__Ú __qualname__Ú__doc__r r"rr9r2r6r>rErGrKrOrUrWr_r`rbrgrkrnrprqrrrsrtÚ __classcell__rrrrrs6          rcs†eZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Ze   d ¡d d„ƒZ e   d¡dd„ƒZ e   d¡dd„ƒZ dd„Zdd„Z‡ZS)ÚTestFullCheckpointsReverterz5Tests functions having to deal with full checkpoints.csPtƒ ¡ddlm}t tj¡||jƒ|_t ƒ}|\|_ |_ |_ |_ |_dSrr rrrrr s     z!TestFullCheckpointsReverter.setUpcCs6t |jj¡t |j¡t |j¡t tj¡dSrrr!rrrr"!s  z$TestFullCheckpointsReverter.tearDowncCs¬t tj¡|j d¡Wdƒn1s.0Yt tj¡|j d¡Wdƒn1sf0Yt tj¡|j d¡Wdƒn1sž0YdS)Nz-1iüÿÿZone)r:r;rr<rrmr!rrrÚtest_rollback_improper_inputs(s **z9TestFullCheckpointsReverter.test_rollback_improper_inputscCs>| ¡}|j d¡|j d¡t |jj¡}|j d¡dS)Nr3)Ú_setup_three_checkpointsrrmrr*rr+)rrDZall_dirsrrrÚ.test_rollback_finalize_checkpoint_valid_inputs0s    zJTestFullCheckpointsReverter.test_rollback_finalize_checkpoint_valid_inputscCs|j d¡dS)NzNo checkpoint...)rr)r!rrrÚ'test_finalize_checkpoint_no_in_progressMszCTestFullCheckpointsReverter.test_finalize_checkpoint_no_in_progresszcertbot.reverter.shutil.movecCsZ|j |jdd¡tdƒ|_t tj¡|j  d¡Wdƒn1sL0YdS)Nrrcz cannot moverl© rr(rr&r'r:r;rr<r))rZ mock_moverrrÚ%test_finalize_checkpoint_cannot_titleQs zATestFullCheckpointsReverter.test_finalize_checkpoint_cannot_titlez#certbot.reverter.filesystem.replacecCsV|j |jdd¡t|_t tj¡|j  d¡Wdƒn1sH0YdS)Nrrcrlr)rZ mock_replacerrrÚ,test_finalize_checkpoint_no_rename_directoryYszHTestFullCheckpointsReverter.test_finalize_checkpoint_no_rename_directoryzcertbot.reverter.loggercCs,|j d¡| ¡d|j_|j d¡dS)Nr3ré)rrmr|ZwarningZ call_count)rZ mock_loggerrrrÚtest_rollback_too_manybs   z2TestFullCheckpointsReverter.test_rollback_too_manycCs| ¡}|j d¡dS)Né)r|rrmrCrrrÚtest_multi_rollbackns z/TestFullCheckpointsReverter.test_multi_rollbackcCsÐ|j |jdd¡|j d¡t|jdƒtj |j d¡}|j  d|¡t|dƒ|j |jdd ¡|j d ¡t|j d ƒt|d ƒ|j |jd d¡|j d¡t|jdƒt|j dƒt|dƒ|S)z$Generate some finalized checkpoints.rz first savezFirst Checkpointzupdate config1r?Fzdirective-config3r3z second savezSecond Checkpointzupdate config2zupdate config3r@z third savezThird Checkpoint - Save bothzFinal form config1zFinal form config2zFinal form config3) rr(rr)rBrrr,r-rrArrCrrrr|vs           z4TestFullCheckpointsReverter._setup_three_checkpoints)rurvrwrxr r"r{r}r~rr9r€rrƒr…r|ryrrrrrzs    rzcCs¸t d¡}t d¡}tj |d¡}tj |d¡}t|dƒ}| d¡Wdƒn1sZ0Yt|dƒ}| d¡Wdƒn1sŽ0Y|h|h||hg}|||||fS)z!Setup sample configuration files.rrz config.txtÚwzdirective-dir1Nzdirective-dir2)ÚtempfileZmkdtemprr,r-r.Úwrite)rrrrÚfile_fdrrrrr“s   ( (þrcCsttj |d¡ƒS)zRead save notesr$©Úread_inrr,r-©ÚdirerrrÚget_save_notes¥srŽcCsttj |d¡ƒS)z Get FilepathsZ FILEPATHSrŠrŒrrrÚ get_filepathsªsrcCsttj |d¡ƒ ¡S)úGet new files.Z NEW_FILES)r‹rr,r-Ú splitlinesrŒrrrrL¯srLcCsDttj |d¡ƒ}tt |¡ƒWdƒS1s60YdS)rZCOMMANDSN)r.rr,r-ÚlistÚcsvÚreader)rZcsvfilerrrr[´sr[cCs6t|dƒ}| ¡WdƒS1s(0YdS)zRead in a file, return the strr%N)r.r/)r,r‰rrrr‹ºs r‹cCs8t|dƒ}| |¡Wdƒn1s*0YdS)zUpdate a file with a new value.r†N)r.rˆ)ÚfilenameÚstringr‰rrrrBÀs rBÚ__main__r3)rxr“r rÚsysr‡Zunittestrr:ZcertbotrZcertbot.compatrZ certbot.testsrZ test_utilZConfigTestCaserrzrrŽrrLr[r‹rBruÚexitÚmainÚargvÚ__file__rrrrÚs2