
    M/eiB                     `   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mZ ddlZddl	m
Z
 ddlmZ ddlmZ  G d dej                         Z G d	 d
ej                         Zd Zd Zd Zd Zd Zd Zd Zedk(  r4 ej6                   ej8                  ej:                  dd egz                yy)zTest certbot.reverter.    N)mock)errors)os)utilc                   H    e Zd ZdZ fdZd Z ej                  d      d        Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Z ej                  d      d        Zd Zd Zd Zd Zd Z ej                  d      d        Z ej                  d      d        Zd Z xZS )ReverterCheckpointLocalTestzTest the Reverter Class.c                     t         |           ddlm} t	        j
                  t        j                          || j                        | _        t               }|\  | _
        | _        | _        | _        | _        y Nr   )RevertersupersetUpcertbot.reverterr   loggingdisableCRITICALconfigrevertersetup_test_filesconfig1config2dir1dir2setsselfr   tup	__class__s      G/usr/lib/python3/dist-packages/certbot/_internal/tests/reverter_test.pyr   z!ReverterCheckpointLocalTest.setUp   U    - 	(() - FICdlDIty$)    c                    t        j                  | j                  j                         t        j                  | j                         t        j                  | j
                         t        j                  t        j                         y N	shutilrmtreer   work_dirr   r   r   r   NOTSETr   s    r   tearDownz$ReverterCheckpointLocalTest.tearDown   H    dkk**+dii dii 'r!   z*certbot.reverter.Reverter._read_and_appendc                 $   t        d      |_        	 | j                  j                  | j                  d   d       | j                  j                  d       t        j                  | j                  j                  j                        d   }t        j                  j                  | j                  j                  j                  |d      }t        |d      5 }|j                         }d d d        dv sJ y # t         $ r Y w xY w# 1 sw Y   xY w)Nzcannot evenr   save1blahCHANGES_SINCErz
No changes)OSErrorside_effectr   add_to_checkpointr   finalize_checkpointr   listdirr   
backup_dirpathjoinopenread)r   	mock_readr7   	no_changefxs         r   test_no_changez*ReverterCheckpointLocalTest.test_no_change&   s     ' 6		MM++DIIaL'B 	))&1zz$--..99:1=GGLL!5!5!@!@$X	)S! 	QA	q     		
	 	s   )C7 D7	DDDc                    | j                   j                  | j                  d   d       | j                   j                  | j                  d   d       t        j                  j                  | j                  j                        sJ t        | j                  j                        dk(  sJ t        j                  j                  t        j                  j                  | j                  j                  d            rJ t        | j                  j                        dj                  | j                  | j                        k(  sJ y )Nr   r-      save2
save1save2	NEW_FILESz{0}
{1}
)r   add_to_temp_checkpointr   r   r7   isdirr   temp_checkpoint_dirget_save_notesisfiler8   get_filepathsformatr   r   r)   s    r   !test_basic_add_to_temp_checkpointz=ReverterCheckpointLocalTest.test_basic_add_to_temp_checkpoint4   s    ,,TYYq\7C,,TYYq\7Cww}}T[[<<===KK++-0<= 	= =77>>GGLL88+FH 	H H T[[<<=dll;< 	< <r!   c                 :   t        j                  d      5 }t        d      |_        t	        j
                  t        j                        5  | j                  j                  | j                  d   d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Ncertbot.reverter.shutil.copy2bad copyr   r-   )r   patchIOErrorr2   pytestraisesr   ReverterErrorr   r3   r   r   
mock_copy2s     r   #test_add_to_checkpoint_copy_failurez?ReverterCheckpointLocalTest.test_add_to_checkpoint_copy_failureB   s    ZZ78 	GJ%,Z%8J"v334 G//		!gFG	G 	GG G	G 	Gs#   4B
*B4BB	
BBc                 
   t         j                  j                  | j                  d      }| j                  j                  d|       t        |d       | j                  j                  | j                  d   d       | j                  j                  | j                  d   d       t        j                  t        j                        5  | j                  j                  | j                  d   d       d	d	d	       | j                  j                  | j                  d
   d       t        j                  t        j                        5  | j                  j                  |hd       d	d	d	       y	# 1 sw Y   |xY w# 1 sw Y   y	xY w)z:Make sure that checkpoint errors are thrown appropriately.config3.txtTzThis is a new file!   r-   r   rB   save3NrA   save4zinvalid save)r   r7   r8   r   r   register_file_creationupdate_filer3   r   rE   rR   rS   r   rT   r   config3s     r   test_checkpoint_conflictz4ReverterCheckpointLocalTest.test_checkpoint_conflictH   s   '',,tyy-8,,T7;G23''		!g>,,TYYq\7C]]6//0 	CMM++DIIaL'B	C 	''		!g> ]]6//0 	GMM++WI~F	G 	G	C 	C	G 	Gs   *E-E9-E69Fc                 h   | j                   j                  | j                  d   d       t        | j                  d       | j                   j                  | j                  d   d       t        | j                  d       | j                   j                          t        | j                        dk(  sJ y )Nr   r-   zupdated-directivezsave2-updated dirz'new directive change that we won't keepdirective-dir1)r   rE   r   r^   r   revert_temporary_configread_inr)   s    r   #test_multiple_saves_and_temp_revertz?ReverterCheckpointLocalTest.test_multiple_saves_and_temp_revert[   s    ,,TYYq\7CDLL"56,,TYYq\;NODLL"KL--/t||$(8888r!   c                    t         j                  j                  | j                  d      }t	        |d       t         j                  j                  | j
                  d      }t	        |d       | j                  j                  d| j                         | j                  j                  d| j                         | j                  j                  d||       | j                  j                          t         j                  j                  | j                        rJ t         j                  j                  | j                        rJ t         j                  j                  |      rJ t         j                  j                  |      rJ y )NrY   Config3config4.txtConfig4T)r   r7   r8   r   r^   r   r   r]   r   r   recovery_routinerI   r   r`   config4s      r   *test_multiple_registration_fail_and_revertzFReverterCheckpointLocalTest.test_multiple_registration_fail_and_revertd   s   '',,tyy-8GY''',,tyy-8GY' 	,,T4<<@,,T4<<@,,T7GD 	&&(77>>$,,///77>>$,,///77>>'***77>>'****r!   c                    | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j                         t        | j                  j
                        }t        |      dk(  sJ y )NTrA   )r   r]   r   get_new_filesr   rG   len)r   filess     r   $test_multiple_registration_same_filez@ReverterCheckpointLocalTest.test_multiple_registration_same_filex   s    ,,T4<<@,,T4<<@,,T4<<@,,T4<<@dkk==>5zQr!   c                 b   t        j                         }t        j                  d|d      5  t        d      |_        t        j                  t        j                        5  | j                  j                  d| j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Ncertbot.reverter.openTcreatebad open)r   	mock_openrP   r1   r2   rR   rS   r   rT   r   r]   r   r   m_opens     r   'test_register_file_creation_write_errorzCReverterCheckpointLocalTest.test_register_file_creation_write_error   s    !ZZ/E 	I!(!4Fv334 I44T4<<HI	I 	II I	I 	Is#   4B%!'BB%B"	B%%B.c                     t        j                  t        j                        5  | j                  j                  d       d d d        y # 1 sw Y   y xY w)Nfilepath)rR   rS   r   rT   r   r]   r)   s    r   test_bad_registrationz1ReverterCheckpointLocalTest.test_bad_registration   s;    ]]6//0 	=MM00<	= 	= 	=s   A		Ac                     ddgddgdgg}|D ]  }| j                   j                  d|         t        | j                  j                        }t        ||      D ]  \  }}||k(  rJ  y )Na2dismodsslrewrite
cleanslateT)r   register_undo_commandget_undo_commandsr   rG   zip)r   comscomact_comsa_coms        r   test_register_undo_commandz6ReverterCheckpointLocalTest.test_register_undo_command   s    #N

  	;CMM//c:	; %T[[%D%DEh- 	 JE3C<<	 r!   c                 P   t        j                         }t        j                  d|d      5  t        d      |_        t        j                  t        j                        5  | j                  j                  ddg       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nru   Trv   rx   command)r   ry   rP   r1   r2   rR   rS   r   rT   r   r   rz   s     r   test_bad_register_undo_commandz:ReverterCheckpointLocalTest.test_bad_register_undo_command   s    !ZZ/E 	G!(!4Fv334 G33D9+FG	G 	GG G	G 	Gs#   4B!B?BB	BB%zcertbot.util.run_scriptc                     dt         j                  g|_        dgddgg}|D ]  }| j                  j	                  d|         | j                  j                          |j                  dk(  sJ y )N invalid_commandr   r   TrZ   )r   SubprocessErrorr2   r   r   rd   
call_count)r   mock_runr   r   s       r   test_run_undo_commandsz2ReverterCheckpointLocalTest.test_run_undo_commands   su     "F$:$:;
  	;CMM//c:	; 	--/""a'''r!   c                 `   | j                   j                  | j                  d   d       t        j                  t
        j                        | j                   _        t        j                  t
        j                        5  | j                   j                          d d d        y # 1 sw Y   y xY w)Nr   	perm saver2   )r   r3   r   r   	MagicMockr   rT   _recover_checkpointrR   rS   rk   r)   s    r   )test_recovery_routine_in_progress_failurezEReverterCheckpointLocalTest.test_recovery_routine_in_progress_failure   su    ''		!kB -1NN,,-.)]]6//0 	-MM**,	- 	- 	-s    B$$B-c                 n   t        j                  t        j                  d            }|| j                  _        | j                  j                  | j                  d   d       t        j                  t        j                        5  | j                  j                          d d d        y # 1 sw Y   y xY w)Ner   r   config1 save)r   r   r   rT   r   r   rE   r   rR   rS   rd   r   mock_recovers     r   ,test_recover_checkpoint_revert_temp_failureszHReverterCheckpointLocalTest.test_recover_checkpoint_revert_temp_failures   s    ~~,,S13 -9),,TYYq\>J]]6//0 	4MM113	4 	4 	4s   B++B4c                    t        j                  t        j                  d            }|| j                  _        | j                  j                  | j                  d   d       | j                  j                  d       t        j                  t        j                        5  | j                  j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   r   r   TitlerA   )r   r   r   rT   r   r   r3   r   r4   rR   rS   rollback_checkpointsr   s     r   (test_recover_checkpoint_rollback_failurezDReverterCheckpointLocalTest.test_recover_checkpoint_rollback_failure   s    ~~,,S13 -9)''		!nE))'2]]6//0 	2MM..q1	2 	2 	2s   "CCc                 n   | j                   j                  | j                  d   d       t        j                  d      5 }t        d      |_        t        j                  t        j                        5  | j                   j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r-   rN   rO   r   rE   r   r   rP   r1   r2   rR   rS   r   rT   rd   rU   s     r   $test_recover_checkpoint_copy_failurez@ReverterCheckpointLocalTest.test_recover_checkpoint_copy_failure   s    ,,TYYq\7CZZ78 	8J%,Z%8J"v334 85578	8 	88 8	8 	8#   4B+3BB+B(	$B++B4c                 n   | j                   j                  | j                  d   d       t        j                  d      5 }t        d      |_        t        j                  t        j                        5  | j                   j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   z	temp savezcertbot.reverter.shutil.rmtreezCannot remove treer   )r   mock_rmtrees     r   "test_recover_checkpoint_rm_failurez>ReverterCheckpointLocalTest.test_recover_checkpoint_rm_failure   s    ,,TYYq\;GZZ89 	8[&-.B&CK#v334 85578	8 	88 8	8 	8r   zcertbot.reverter.logger.warningc                     | j                   j                  dt        j                  j	                  | j
                  d             | j                   j                          |j                  dk(  sJ y )NTzmissing_file.txtrA   )r   r]   r   r7   r8   r   rd   r   )r   	mock_warns     r   )test_recover_checkpoint_missing_new_fileszEReverterCheckpointLocalTest.test_recover_checkpoint_missing_new_files   sQ    ,,"'',,tyy*<=	?--/##q(((r!   zcertbot.reverter.os.removec                    | j                   j                  d| j                         t        d      |_        t        j                  t        j                        5  | j                   j                          d d d        y # 1 sw Y   y xY w)NTzCan't remove)
r   r]   r   r1   r2   rR   rS   r   rT   rd   )r   mock_removes     r   &test_recover_checkpoint_remove_failurezBReverterCheckpointLocalTest.test_recover_checkpoint_remove_failure   s^    ,,T4<<@")."9]]6//0 	4MM113	4 	4 	4s   A>>Bc                    t         j                  j                  | j                  d      }| j                  j                  d|       t        |d       | j                  j                  | j                  d   d       t        | j                  d       | j                  j                  | j                  d   d       t        | j                  d	       | j                  j                  | j                  d   d
       t        | j                  d       t         j                  j                  | j                  d      }| j                  j                  d|       t        |d       | j                  j                          t         j                  j                  |      rJ t         j                  j                  |      rJ t        | j                        dk(  sJ t        | j                        dk(  sJ y )NrY   FzThis is a new perm file!r   z
perm save1zupdated perm config1rA   z
perm save2zupdated perm config2z
temp save1zsecond update now temp config1ri   TzNew temporary file!rc   directive-dir2)r   r7   r8   r   r   r]   r^   r3   r   r   r   rE   r   rk   rI   re   rl   s      r   #test_recovery_routine_temp_and_permz?ReverterCheckpointLocalTest.test_recovery_routine_temp_and_perm   si   '',,tyy-8,,UG<G78 	''		!lCDLL"89''		!lCDLL"89 	,,TYYq\<HDLL"BC '',,tyy-8,,T7;G23 	&&( 77>>'***77>>'*** t||$(8888t||$(8888r!   )__name__
__module____qualname____doc__r   r*   r   rP   r?   rL   rW   ra   rf   rn   rs   r|   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r      s    "
J( TZZ<=! >!<GG&9+(I=
 G TZZ)*( +(-4
288 TZZ12) 3) TZZ,-4 .49r!   r   c                        e Zd ZdZ fdZd Zd Zd Zd Z e	j                  d      d        Z e	j                  d	      d
        Z e	j                  d      d        Zd Zd Z xZS )TestFullCheckpointsReverterz5Tests functions having to deal with full checkpoints.c                     t         |           ddlm} t	        j
                  t        j                          || j                        | _        t               }|\  | _
        | _        | _        | _        | _        y r
   r   r   s      r   r   z!TestFullCheckpointsReverter.setUp  r    r!   c                    t        j                  | j                  j                         t        j                  | j                         t        j                  | j
                         t        j                  t        j                         y r#   r$   r)   s    r   r*   z$TestFullCheckpointsReverter.tearDown!  r+   r!   c                    t        j                  t        j                        5  | j                  j                  d       d d d        t        j                  t        j                        5  | j                  j                  d       d d d        t        j                  t        j                        5  | j                  j                  d       d d d        y # 1 sw Y   xY w# 1 sw Y   ]xY w# 1 sw Y   y xY w)Nz-1ione)rR   rS   r   rT   r   r   r)   s    r   test_rollback_improper_inputsz9TestFullCheckpointsReverter.test_rollback_improper_inputs(  s    ]]6//0 	5MM..t4	5]]6//0 	6MM..u5	6]]6//0 	6MM..u5	6 	6		5 	5	6 	6	6 	6s#   C+C#2C/C #C,/C8c                    | j                         }t        t        j                  | j                  j
                              dk(  sJ | j                  j                  d       t        | j                        dk(  sJ t        | j                        dk(  sJ t        |      dk(  sJ | j                  j                  d       t        | j                        dk(  sJ t        | j                        dk(  sJ t        j                  j                  |      rJ t        j                  | j                  j
                        }t        |      dk(  sJ dt        t        j                  j                  | j                  j
                  |d               v sJ | j                  j                  d       t        | j                        d	k(  sJ y )
N   rA   update config1update config2Final form config3r   First Checkpointr   rc   )_setup_three_checkpointsrq   r   r5   r   r6   r   r   re   r   r   r7   rI   rH   r8   )r   r`   all_dirss      r   .test_rollback_finalize_checkpoint_valid_inputszJTestFullCheckpointsReverter.test_rollback_finalize_checkpoint_valid_inputs0  s   //1 2::dkk4456!;;; 	**1-t||$(8888t||$(8888w#7777 	**1-t||$(8888t||$(888877>>'*** ::dkk4458}!!!!^T[[33Xa[A&C C 	C C 	**1-t||$(8888r!   c                 :    | j                   j                  d       y )NzNo checkpoint...)r   r4   r)   s    r   'test_finalize_checkpoint_no_in_progresszCTestFullCheckpointsReverter.test_finalize_checkpoint_no_in_progressM  s    ))*<=r!   zcertbot.reverter.shutil.movec                    | j                   j                  | j                  d   d       t        d      |_        t        j                  t        j                        5  | j                   j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   zcannot mover   
r   r3   r   r1   r2   rR   rS   r   rT   r4   )r   	mock_moves     r   %test_finalize_checkpoint_cannot_titlezATestFullCheckpointsReverter.test_finalize_checkpoint_cannot_titleQ  sd    ''		!kB ' 6	]]6//0 	7MM--g6	7 	7 	7s   BBz#certbot.reverter.filesystem.replacec                    | j                   j                  | j                  d   d       t        |_        t        j                  t        j                        5  | j                   j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   r   r   )r   mock_replaces     r   ,test_finalize_checkpoint_no_rename_directoryzHTestFullCheckpointsReverter.test_finalize_checkpoint_no_rename_directoryY  sa     	''		!kB#* ]]6//0 	7MM--g6	7 	7 	7s   A==Bzcertbot.reverter.loggerc                    | j                   j                  d       |j                  j                  dk(  sJ | j	                          d|j                  _        | j                   j                  d       |j                  j                  dk(  sJ y )NrA   r      )r   r   warningr   r   )r   mock_loggers     r   test_rollback_too_manyz2TestFullCheckpointsReverter.test_rollback_too_manyb  sx     	**1-""--222 	%%')*&**1-""--222r!   c                    | j                         }| j                  j                  d       t        | j                        dk(  sJ t        | j
                        dk(  sJ t        j                  j                  |      rJ y )Nr   rc   r   )	r   r   r   re   r   r   r   r7   rI   r_   s     r   test_multi_rollbackz/TestFullCheckpointsReverter.test_multi_rollbackn  sk    //1**1-t||$(8888t||$(888877>>'****r!   c                 "   | j                   j                  | j                  d   d       | j                   j                  d       t	        | j
                  d       t        j                  j                  | j                  d      }| j                   j                  d|       t	        |d       | j                   j                  | j                  d   d	       | j                   j                  d
       t	        | j                  d       t	        |d       | j                   j                  | j                  d   d       | j                   j                  d       t	        | j
                  d       t	        | j                  d       t	        |d       |S )z$Generate some finalized checkpoints.r   z
first saver   r   rY   Fzdirective-config3rA   zsecond savezSecond Checkpointr   zupdate config3rZ   z
third savezThird Checkpoint - Save bothzFinal form config1zFinal form config2r   )r   r3   r   r4   r^   r   r   r7   r8   r   r]   r   r_   s     r   r   z4TestFullCheckpointsReverter._setup_three_checkpointsv  s#    	''		!lC))*<=DLL"23 '',,tyy-8,,UG<G01''		!mD))*=>DLL"23G-. 	''		!lC))*HIDLL"67DLL"67G12r!   )r   r   r   r   r   r*   r   r   r   r   rP   r   r   r   r   r   r   r   s   @r   r   r     s    ?
J(69:> TZZ./7 07 TZZ567 77 TZZ)*	3 +	3+r!   r   c                     t        j                  d      } t        j                  d      }t        j                  j	                  | d      }t        j                  j	                  |d      }t        |d      5 }|j                  d       ddd       t        |d      5 }|j                  d       ddd       |h|h||hg}||| ||fS # 1 sw Y   ?xY w# 1 sw Y   %xY w)z!Setup sample configuration files.r   r   z
config.txtwrc   Nr   )tempfilemkdtempr   r7   r8   r9   write)r   r   r   r   file_fdr   s         r   r   r     s    F#DF#Dggll4.Gggll4.G	gs	 (w&'(	gs	 (w&'( IIg D GT4--( (( (s   7CCCCc                 T    t        t        j                  j                  | d            S )zRead save notesr/   re   r   r7   r8   dires    r   rH   rH     s    277<<o677r!   c                 T    t        t        j                  j                  | d            S )zGet Filepaths	FILEPATHSr   r   s    r   rJ   rJ     s    277<<k233r!   c                 p    t        t        j                  j                  | d            j	                         S )Get new files.rD   )re   r   r7   r8   
splitlinesr   s    r   rp   rp     s%    277<<k23>>@@r!   c                     t        t        j                  j                  | d            5 }t	        t        j                  |            cddd       S # 1 sw Y   yxY w)r   COMMANDSN)r9   r   r7   r8   listcsvreader)r   csvfiles     r   r   r     sA    	bggll4,	- )CJJw'() ) )s   AAc                 f    t        | d      5 }|j                         cddd       S # 1 sw Y   yxY w)zRead in a file, return the strr0   N)r9   r:   )r7   r   s     r   re   re     s+    	dC G||~  s   '0c                 h    t        | d      5 }|j                  |       ddd       y# 1 sw Y   yxY w)zUpdate a file with a new value.r   N)r9   r   )filenamestringr   s      r   r^   r^     s/    	h	 f  s   (1__main__rA   )r   r   r   r%   sysr   unittestr   rR   certbotr   certbot.compatr   certbot.testsr   	test_utilConfigTestCaser   r   r   rH   rJ   rp   r   re   r^   r   exitmainargv__file__ r!   r   <module>r     s     
   
       +9)":": 9D})":": }@.$8
4
A
) zCHH[V[[!"
234 r!   