U
    ÝÁ]K ã                   @   s–  d Z ddlm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
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  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 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( ddl%m)Z) e *d¡Z+e *d¡Z,e *d¡Z-e *d¡Z.ej/ 0e 1d¡¡Z2e *d¡Z3e *d¡Z4G dd„ de
j5ƒZ6G dd„ dej7ƒZ8G d d!„ d!e
j5ƒZ9G d"d#„ d#e
j5ƒZ:G d$d%„ d%ej;ƒZ<G d&d'„ d'ej7ƒZ=G d(d)„ d)ej7ƒZ>G d*d+„ d+ej7ƒZ?G d,d-„ d-e
j5ƒZ@G d.d/„ d/ej7ƒZAG d0d1„ d1ej7ƒZBG d2d3„ d3ej7ƒZCeDd4kr’e
  ¡  dS )5zTests for certbot.main.é    )Úprint_functionN)Úreload_module)ÚList)Úaccount)Úcli)Úconfiguration)Ú	constants)Úcrypto_util©Úerrors)Ú
interfaces)Úmain)Úupdater)Úutil)Úos)Ú
filesystem)Údisco)Úenhancements)Úmanual)Únullúcert_512.pemzcsr_512.derzrsa256_key.pemzrsa512_key.pemzrsa2048_key.pemzcert_2048.pemc                   @   s   e Zd ZdZdd„ ZdS )ÚTestHandleIdenticalCertsz4Test for certbot.main._handle_identical_cert_requestc                 C   s4   t  ¡ }d|j_t t  ¡ |¡}|  |d|f¡ d S )NFÚ	reinstall)ÚmockÚMockZensure_deployedÚreturn_valuer   Z_handle_identical_cert_requestÚassertEqual)ÚselfÚmock_lineageÚret© r    ú9/usr/lib/python3/dist-packages/certbot/tests/main_test.pyÚ*test_handle_identical_cert_request_pending4   s    zCTestHandleIdenticalCerts.test_handle_identical_cert_request_pendingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r    r    r    r!   r   2   s   r   c                       sZ   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
 d¡dd„ ƒZ‡  ZS )ÚRunTestzTests for certbot.main.run.c              	      sÆ   t t| ƒ ¡  d| _t d¡t d¡t d¡t d¡t d¡t d¡t d¡g| _| jd	  ¡ | _| jd
  ¡ | _	| jd  ¡ | _
| jd  ¡ | _| jd  ¡ | _| jd  ¡ | _| jd  ¡ | _d S )Nzexample.orgúcertbot.main._get_and_save_certz-certbot.main.display_ops.success_installationz(certbot.main.display_ops.success_renewalúcertbot.main._init_le_clientú-certbot.main._suggest_donation_if_appropriateúcertbot.main._report_new_certúcertbot.main._find_certr   é   é   é   é   é   é   )Úsuperr'   ÚsetUpÚdomainr   ÚpatchÚpatchesÚstartÚ	mock_authÚmock_success_installationÚmock_success_renewalÚ	mock_initZmock_suggest_donationÚmock_report_certÚmock_find_cert©r   ©Ú	__class__r    r!   r4   ?   s"    ù	zRunTest.setUpc                 C   s   | j D ]}| ¡  qd S ©N)r7   Ústop©r   r6   r    r    r!   ÚtearDownS   s    
zRunTest.tearDownc                 C   sF   d  | j¡ ¡ }tj ¡ }t t 	||¡¡}ddl
m} |||ƒ d S )Nz-a webroot -i null -d {0}r   )Úrun)Úformatr5   Úsplitr   ÚPluginsRegistryÚfind_allr   ÚNamespaceConfigr   Úprepare_and_parse_argsÚcertbot.mainrF   )r   ÚargsÚpluginsÚconfigrF   r    r    r!   Ú_callW   s    

ÿzRunTest._callc                 C   s0   t  ¡ | j_d| j_|  ¡  | j | jg¡ d S )N)TN©	r   r   r9   r   r>   rQ   r:   Úassert_called_once_withr5   r?   r    r    r!   Útest_newcert_success`   s    zRunTest.test_newcert_successc                 C   s8   t  ¡ | j_dt  ¡ f| j_|  ¡  | j | jg¡ d S ©NFrR   r?   r    r    r!   Útest_reinstall_successf   s    zRunTest.test_reinstall_successc                 C   s8   t  ¡ | j_dt  ¡ f| j_|  ¡  | j | jg¡ d S )NT)	r   r   r9   r   r>   rQ   r;   rS   r5   r?   r    r    r!   Útest_renewal_successl   s    zRunTest.test_renewal_successú1certbot.main.plug_sel.choose_configurator_pluginsc                 C   s@   t  | jd¡d f|_tj ¡ }d| j_|  t	j
tj| j|¡ d S )Nr   T)r   Ú	InstallerrP   r   r   rI   rJ   Ú	auto_hstsÚassertRaisesr   ÚNotSupportedErrorr   rF   )r   Úmock_chooserO   r    r    r!   Ú"test_run_enhancement_not_supportedr   s    
 þz*RunTest.test_run_enhancement_not_supported)r#   r$   r%   r&   r4   rE   rQ   rT   rV   rW   r   r6   r^   Ú__classcell__r    r    r@   r!   r'   <   s   	r'   c                   @   s¸   e Zd ZdZdd„ Zdd„ Zdd„ Ze d¡e d	¡e d
¡dd„ ƒƒƒZ	ddd„Z
e d¡e d¡e d¡e d
¡dd„ ƒƒƒƒZe d¡e d¡e d¡e d
¡dd„ ƒƒƒƒZdS )ÚCertonlyTestz Tests for certbot.main.certonly.c                 C   s   t  ¡ | _| j ¡ | _d S rB   )Ú	test_utilÚpatch_get_utilityÚget_utility_patchr8   Úmock_get_utilityr?   r    r    r!   r4      s    
zCertonlyTest.setUpc                 C   s   | j  ¡  d S rB   ©rc   rC   r?   r    r    r!   rE   ƒ   s    zCertonlyTest.tearDownc              
   C   sZ   t j ¡ }t t ||¡¡}t d¡(}t d¡ t	 
||¡ W 5 Q R X W 5 Q R X |ƒ S )Nr)   r*   )r   rI   rJ   r   rK   r   rL   r   r6   r   Úcertonly)r   rN   rO   rP   r<   r    r    r!   rQ   †   s    

ÿ zCertonlyTest._callr,   r(   r+   c                 C   s4   |   ¡ j}| j|_t ¡ |_d|_|  d ¡ ¡ d S )N)FNz!certonly --webroot -d example.com)	rd   ÚnotificationÚ_assert_no_pauseÚside_effectr   r   r   rQ   rH   )r   Zunused_reportr9   r>   Zmock_notificationr    r    r!   Útest_no_reinstall_text_pause‘   s
    

z)CertonlyTest.test_no_reinstall_text_pauseTc                 C   s   |   |¡ d S rB   )ÚassertFalse)r   ÚmessageÚpauser    r    r!   rh   œ   s    zCertonlyTest._assert_no_pauseú)certbot.cert_manager.lineage_for_certnameú)certbot.cert_manager.domains_for_certnamezcertbot.renewal.renew_certc                 C   sØ   ddg}||_ ||j_ |  d ¡ ¡ |  |jdk¡ |  |jdk¡ |  |jdk¡ |  |jdk¡ |  d ¡ ¡ |  |jdk¡ |  |jdk¡ |  |jdk¡ |  |jdk¡ d|  ¡ j_ |  t	j
| jd ¡ ¡ d S )Núexample.comztest.orgzEcertonly --webroot -d example.com -d test.org --cert-name example.comr-   úEcertonly --webroot -d example.com -d test.com --cert-name example.comr.   F)r   ÚnamesrQ   rH   Ú
assertTrueÚ
call_countrd   Úyesnor[   r   ÚConfigurationError)r   r=   Úmock_renew_certÚmock_domainsr   Údomainsr    r    r!   Ú*test_find_lineage_for_domains_and_certnameŸ   s"    ÿz7CertonlyTest.test_find_lineage_for_domains_and_certnameú certbot.display.ops.choose_namesc                 C   s`   d |_ |  d ¡ ¡ |  |jdk¡ |  |jdk¡ dg|_ d |_ |  d ¡ ¡ |  |j¡ d S )Nrq   r-   Zsomenamez*certonly --webroot --cert-name example.com)r   rQ   rH   rs   rt   Úcalled)r   r=   r   Úmock_choose_namesZmock_domains_for_certnamer    r    r!   Ú*test_find_lineage_for_domains_new_certname¼   s    z7CertonlyTest.test_find_lineage_for_domains_new_certnameN)T)r#   r$   r%   r&   r4   rE   rQ   r   r6   rj   rh   rz   r~   r    r    r    r!   r`   |   s&   
r`   c                   @   sF   e Zd ZdZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd	„ ƒZd
S )ÚFindDomainsOrCertnameTestz1Tests for certbot.main._find_domains_or_certname.r{   c                 C   s,   t jd d d}d|_|  t |d ¡d¡ d S )N©ry   ÚcertnameÚ
domainname)r‚   N©r   r   r   r   r   Ú_find_domains_or_certname©r   r}   Úmock_configr    r    r!   Útest_display_opsÓ   s
    ÿz*FindDomainsOrCertnameTest.test_display_opsc                 C   s,   t jd d d}g |_|  tjtj|d ¡ d S )Nr€   )r   r   r   r[   r   ÚErrorr   r„   r…   r    r    r!   Útest_no_resultsÛ   s    z)FindDomainsOrCertnameTest.test_no_resultsro   c                 C   s8   t jd dd}ddg|_|  t |d ¡ddgdf¡ d S )Nzone.comr€   ztwo.comrƒ   )r   rx   r†   r    r    r!   Útest_grab_domainsâ   s
    

ÿz+FindDomainsOrCertnameTest.test_grab_domainsN)	r#   r$   r%   r&   r   r6   r‡   r‰   rŠ   r    r    r    r!   r   Ð   s   

r   c                       s¬   e Zd ZdZ‡ fdd„Z‡ fdd„Zddd„Ze d	¡e d
¡dd„ ƒƒZ	e d	¡e d¡dd„ ƒƒZ
e d	¡dd„ ƒZdd„ Ze d	¡e d¡e ¡ dd„ ƒƒƒZ‡  ZS )Ú
RevokeTestzTests for certbot.main.revoke.c                    s"  t t| ƒ ¡  t t| j¡ tj 	tj 
| jd¡¡| _t| jdƒ}| j| ¡ f| _W 5 Q R X t d¡t d¡t d¡t d¡g| _| jd  ¡ | _| jd  ¡  | jd	  ¡ | _| jd
  ¡ | _ddlm} t ¡ | _|jdtjddddddtjdd| _|| jt| jƒ| _ | j d f| j_!d S )Nr   Úrz'acme.client.BackwardsCompatibleClientV2zcertbot.client.Clientúcertbot.main._determine_accountz+certbot.main.display_ops.success_revocationr   r-   r.   r/   )ÚAccountztest.certbot.orgiß  é   r0   é   é
   )Ztzinfo)Zcreation_hostZcreation_dt)"r3   r‹   r4   ÚshutilÚcopyÚ	CERT_PATHZtempdirr   ÚpathÚabspathÚjoinÚtmp_cert_pathÚopenÚreadÚtmp_certr   r6   r7   r8   Úmock_acme_clientÚmock_determine_accountÚmock_success_revokeZcertbot.accountrŽ   Ú	MagicMockÚregrZMetaÚdatetimeÚpytzZUTCÚmetaÚJWKÚaccr   )r   ÚfrŽ   r@   r    r!   r4   î   s@    ÿü
      ÿþzRevokeTest.setUpc                    s&   t t| ƒ ¡  | jD ]}| ¡  qd S rB   )r3   r‹   rE   r7   rC   rD   r@   r    r!   rE     s    
zRevokeTest.tearDownNc                 C   sN   |sd}|  | j¡ ¡ }tj ¡ }t t 	||¡¡}ddl
m} |||ƒ d S )Nzrevoke --cert-path={0} r   )Úrevoke)rG   r˜   rH   r   rI   rJ   r   rK   r   rL   rM   r§   )r   rN   rO   rP   r§   r    r    r!   rQ     s    

ÿzRevokeTest._callú#certbot.main._delete_if_appropriateúcertbot.main.client.acme_clientc                 C   sž   d|_ | ¡ j}g }tj ¡ D ]l\}}d | j|¡ ¡ }|  	|¡ | 
t tj|¡¡ d | j| ¡ ¡ ¡ }|  	|¡ | 
t tj|¡¡ q|  ||j¡ d S )NFz#revoke --cert-path={0} --reason {1})r   ÚBackwardsCompatibleClientV2r§   r   ZREVOCATION_REASONSÚitemsrG   r˜   rH   rQ   Úappendr   ÚcallÚANYÚupperr   Úcall_args_list)r   rœ   Úmock_delete_if_appropriateÚmock_revokeZexpectedÚreasonÚcoderN   r    r    r!   Útest_revoke_with_reason  s    

ÿ
z"RevokeTest.test_revoke_with_reasonz'certbot.storage.cert_path_for_cert_namec                 C   s2   d  ¡ }| j|_d|_|  |¡ | j | j¡ d S )Nzrevoke --cert-name=example.comF)rH   r›   r   rQ   rž   rS   r˜   )r   Zmock_cert_path_for_cert_namer±   rN   r    r    r!   Útest_revoke_by_certname/  s
    
z"RevokeTest.test_revoke_by_certnamec                 C   s    |   ¡  d|_| j | j¡ d S rU   )rQ   r   rž   rS   r˜   )r   r±   r    r    r!   Útest_revocation_success9  s    z"RevokeTest.test_revocation_successc                 C   s6   ddl m} | ¡ | j_|  |j| j¡ | j ¡  d S )Nr   r
   )	Úacmer   ZClientErrorrœ   ri   r[   rQ   rž   Úassert_not_called)r   Zacme_errorsr    r    r!   Útest_revocation_error?  s    z RevokeTest.test_revocation_errorúcertbot.cert_manager.deletec                 C   s(   d|ƒ j _d|_|  ¡  |  |j¡ d S rU   )ru   r   rQ   rk   r|   )r   rd   Úmock_deleter±   r    r    r!   Útest_revocation_with_promptE  s    
z&RevokeTest.test_revocation_with_prompt)N)r#   r$   r%   r&   r4   rE   rQ   r   r6   rµ   r¶   r·   rº   ra   rb   r½   r_   r    r    r@   r!   r‹   ë   s"   

r‹   c                   @   sH  e Zd ZdZdd„ Zdd„ Ze ¡ dd„ ƒZe ¡ dd	„ ƒZ	e
 d
¡e
 d¡e
 d¡e
 d¡e
 d¡e ¡ dd„ ƒƒƒƒƒƒZe
 d
¡e
 d¡e
 d¡e
 d¡e
 d¡e ¡ dd„ ƒƒƒƒƒƒZe
 d
¡e
 d¡e
 d¡e
 d¡e
 d¡e ¡ dd„ ƒƒƒƒƒƒZe
 d
¡e
 d¡e
 d¡e
 d¡e
 d¡e ¡ dd„ ƒƒƒƒƒƒZdS )ÚDeleteIfAppropriateTestz.Tests for certbot.main._delete_if_appropriate c                 C   s   ddl m} ||ƒ d S )Nr   )Ú_delete_if_appropriate)rM   r¿   )r   r†   r¿   r    r    r!   rQ   R  s    zDeleteIfAppropriateTest._callc              	   C   s>   t  d¡}|  | j¡ W 5 Q R X | ¡  |  |ƒ jj¡ d S )Nr»   )r   r6   rQ   rP   r¹   rs   Úadd_messager|   )r   rd   r¼   r    r    r!   Ú_test_delete_opt_out_commonV  s    z3DeleteIfAppropriateTest._test_delete_opt_out_commonc                 C   s   d| j _|  |¡ d S rU   )rP   Údelete_after_revokerÁ   ©r   rd   r    r    r!   Útest_delete_flag_opt_out\  s    z0DeleteIfAppropriateTest.test_delete_flag_opt_outc                 C   s   |ƒ }d|j _|  |¡ d S rU   )ru   r   rÁ   )r   rd   Ú	util_mockr    r    r!   Útest_delete_prompt_opt_outa  s    z2DeleteIfAppropriateTest.test_delete_prompt_opt_outz)certbot.storage.renewal_file_for_certnamer»   z-certbot.cert_manager.match_and_check_overlapsz!certbot.storage.full_archive_pathz)certbot.cert_manager.cert_path_to_lineagec                 C   s8   | j }d|_d|_d|_t ¡ |_|  |¡ | ¡  d S )Nú/some/reasonable/pathÚ rp   )	rP   Ú	cert_pathr   r   r   ZOverlappingMatchFoundri   rQ   r¹   )r   rd   Úmock_cert_path_to_lineageÚmock_archiveÚmock_match_and_check_overlapsr¼   Úmock_renewal_file_for_certnamerP   r    r    r!   Útest_overlapping_archive_dirsh  s    

z5DeleteIfAppropriateTest.test_overlapping_archive_dirsc                 C   s:   | j }d|_d|_d|_d|_|  |¡ |  |jd¡ d S )NrÇ   rÈ   rp   Fr-   )rP   rÉ   r   r   rQ   r   rt   )r   rd   rÊ   r¼   rË   Zmock_overlapping_archive_dirsrÍ   rP   r    r    r!   Útest_cert_path_only|  s    

z+DeleteIfAppropriateTest.test_cert_path_onlyc                 C   sH   | j }d|j_d|_d|_d|_d|_d|_|  |¡ |  |jd¡ d S ©NTrÇ   rÈ   rp   r-   )	rP   Ú	namespaceZnoninteractive_moderÉ   r   r   rQ   r   rt   ©r   rd   r¼   rÊ   Zmock_full_archive_dirrÌ   rÍ   rP   r    r    r!   Útest_noninteractive_deletion  s    

z4DeleteIfAppropriateTest.test_noninteractive_deletionc                 C   sX   | j }d|j_d|_d|_d|_d|_d|_|  |¡ |  |jd¡ |  	|ƒ j
j¡ d S rÐ   )rP   rÑ   rÂ   rÉ   r   r   rQ   r   rt   rk   ru   r|   rÒ   r    r    r!   Útest_opt_in_deletion¤  s    

z,DeleteIfAppropriateTest.test_opt_in_deletionN)r#   r$   r%   r&   rQ   rÁ   ra   rb   rÄ   rÆ   r   r6   rÎ   rÏ   rÓ   rÔ   r    r    r    r!   r¾   O  sF   

r¾   c                       sd   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Ze 	d
¡dd„ ƒZ
e 	d¡dd„ ƒZdd„ Z‡  ZS )ÚDetermineAccountTestz*Tests for certbot.main._determine_account.c                    sb   t t| ƒ ¡  d | j_d | j_d| j_tjddtjddg| _	t 
¡ | _t ¡ | _d| jj_d S )NFÚx)ÚidÚyÚhi)r3   rÕ   r4   rP   r   ÚemailZregister_unsafely_without_emailr   rŸ   ÚaccsZAccountMemoryStorageÚaccount_storageÚmock_clientÚ	directoryZ	new_authzr?   r@   r    r!   r4   ½  s    

zDetermineAccountTest.setUpc              
   C   s@   ddl m} t d¡ }| j|_|| jƒW  5 Q R £ S Q R X d S )Nr   )Ú_determine_accountz'certbot.main.account.AccountFileStorage)rM   rß   r   r6   rÜ   r   rP   )r   rß   Zmock_storager    r    r!   rQ   È  s    zDetermineAccountTest._callc                 C   sn   | j  | jd | j¡ | jd j| j_|  | jd d f|  ¡ ¡ |  | jd j| jj¡ |  	| jj
d k¡ d S )Nr-   )rÜ   ÚsaverÛ   rÝ   r×   rP   r   r   rQ   rs   rÚ   r?   r    r    r!   Útest_args_account_setÏ  s
    z*DetermineAccountTest.test_args_account_setc                 C   s^   | j  | jd | j¡ |  | jd d f|  ¡ ¡ |  | jd j| jj¡ |  	| jj
d k¡ d S )Nr   )rÜ   rà   rÛ   rÝ   r   rQ   r×   rP   r   rs   rÚ   r?   r    r    r!   Útest_single_accountÖ  s    z(DetermineAccountTest.test_single_accountz)certbot.client.display_ops.choose_accountc                 C   s   | j D ]}| j || j¡ q| j d |_|  | j d d f|  ¡ ¡ |  t|jd d ƒt| j ƒ¡ |  | j d j	| j
j¡ |  | j
jd k¡ d S )Nr-   r   )rÛ   rÜ   rà   rÝ   r   r   rQ   ÚsetÚ	call_argsr×   rP   r   rs   rÚ   )r   Zmock_choose_accountsr¥   r    r    r!   Útest_multiple_accountsÜ  s    
 ÿz+DetermineAccountTest.test_multiple_accountsz$certbot.client.display_ops.get_emailc              	   C   s”   d|_ t d¡:}| jd tjjf|j_ |  | jd tjjf|  ¡ ¡ W 5 Q R X |jj	| j
| jtjd |  | jd j| j
j¡ |  d| j
j¡ d S )Nzfoo@bar.bazúcertbot.main.clientr   )Ztos_cb)r   r   r6   rÛ   Úsentinelr¸   Úregisterr   rQ   rS   rP   rÜ   r®   r×   r   rÚ   )r   Zmock_get_emailÚclientr    r    r!   Útest_no_accounts_no_emailç  s     ÿ(  ÿz.DetermineAccountTest.test_no_accounts_no_emailc              	   C   sh   d| j _t d¡$}| jd tjjf|j_|  	¡  W 5 Q R X |  
| jd j| j j¡ |  
d| j j¡ d S )Nzother emailræ   r-   )rP   rÚ   r   r6   rÛ   rç   r¸   rè   r   rQ   r   r×   r   )r   ré   r    r    r!   Útest_no_accounts_emailõ  s    z+DetermineAccountTest.test_no_accounts_email)r#   r$   r%   r&   r4   rQ   rá   râ   r   r6   rå   rê   rë   r_   r    r    r@   r!   rÕ   º  s   


rÕ   c                       sD  e Zd ZdZ‡ fdd„Z‡ fdd„ZdÄdd	„ZdÅd
d„Zdd„ Zdd„ Z	dd„ Z
e d¡dd„ ƒZe d¡e d¡e d¡e d¡e d¡e d¡dd„ ƒƒƒƒƒƒZe d¡e d¡dd„ ƒƒZe d ¡e d¡e d¡d!d"„ ƒƒƒZe d¡e d ¡e d¡e d¡d#d$„ ƒƒƒƒZe d¡e d¡d%d&„ ƒƒZe d¡e d¡e d'¡e d ¡d(d)„ ƒƒƒƒZe d¡e d¡e d*¡d+d,„ ƒƒƒZe d¡d-d.„ ƒZd/d0„ Ze d1¡d2d3„ ƒZe d4¡d5d6„ ƒZe d7¡d8d9„ ƒZe d:¡d;d<„ ƒZe d¡d=d>„ ƒZe d?¡e d@¡dAdB„ ƒƒZe d?¡e d@¡dCdD„ ƒƒZe d?¡e d@¡dEdF„ ƒƒZe d?¡e d@¡dGdH„ ƒƒZdIdJ„ Z dKdL„ Z!dMdN„ Z"dOdP„ Z#dQdR„ Z$dSdT„ Z%dUdV„ Z&dÆdWdX„Z'e( )¡ dYdZ„ ƒZ*e d[¡e( )¡ d\d]„ ƒƒZ+d^d_„ Z,ddd`dde-j- .¡ dfdadb„Z/e d[¡dcdd„ ƒZ0e de¡e d[¡dfdg„ ƒƒZ1dhdi„ Z2djdk„ Z3dldm„ Z4e dn¡dodp„ ƒZ5e dq¡drds„ ƒZ6e dq¡dtdu„ ƒZ7e dv¡dwdx„ ƒZ8e d¡dydz„ ƒZ9d{d|„ Z:d}d~„ Z;dd€„ Z<dd‚„ Z=dƒd„„ Z>d…d†„ Z?dÇd‡dˆ„Z@d‰dŠ„ ZAd‹dŒ„ ZBddŽ„ ZCdd„ ZDd‘d’„ ZEe d“¡d”d•„ ƒZFd–d—„ ZGd˜d™„ ZHdšd›„ ZIdœd„ ZJdždŸ„ ZKd d¡„ ZLe( )¡ e d¢¡e d£¡d¤d¥„ ƒƒƒZMdÈd¦d§„ZNd¨d©„ ZOdªd«„ ZPe d¬¡e d­¡d®d¯„ ƒƒZQd°d±„ ZRe d¬¡e d¡d²d³„ ƒƒZSe d¡d´dµ„ ƒZTd¶d·„ ZUd¸d¹„ ZVdºd»„ ZWe d¼¡e( )¡ d½d¾„ ƒƒZXe d¼¡e( )¡ d¿dÀ„ ƒƒZYe d“¡e dÁ¡dÂdÃ„ ƒƒZZ‡  Z[S )ÉÚMainTestzTests for different commands.c                    sP   t t| ƒ ¡  t | jj¡ d| jjd| jjd| jjdg| _	t
 d¡ ¡ | _d S )Nz--config-dirz
--work-dirz
--logs-dirz--textz
time.sleep)r3   rì   r4   r   ÚmkdirrP   Úlogs_dirÚ
config_dirÚwork_dirÚstandard_argsr   r6   r8   Ú
mock_sleepr?   r@   r    r!   r4     s       þzMainTest.setUpc                    s   t tƒ tt| ƒ ¡  d S rB   )r   r   r3   rì   rE   r?   r@   r    r!   rE     s    zMainTest.tearDownNFc           	         s¾   |r~t jj‰ ‡ fdd„}t d¡T}||_t d¡8}|  ||¡\}}}||||fW  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X n<t d¡,}|  ||¡\}}}||||fW  5 Q R £ S Q R X dS )zaRun the cli with output streams, actual client and optionally
        os.path.isfile() mocked outc                    s*   |   d¡s|   d¡s|   d¡r"dS ˆ | ƒS )zMock os.path.isfile()ÚcertÚchainÚprivkeyT)Úendswith)ÚfnrN   Úkwargs©Z	orig_openr    r!   Úmock_isfile  s    
ÿþz#MainTest._call.<locals>.mock_isfilezcertbot.compat.os.path.isfileræ   N)r   r•   Úisfiler   r6   ri   Ú_call_no_clientmock)	r   rN   ÚstdoutÚ
mockisfilerú   Zmock_ifré   r   Ústderrr    rù   r!   rQ     s    6zMainTest._callc                 C   s|   | j | }|r|nt ¡ }tjd|dD t d¡.}t d¡ t |dd… ¡}W 5 Q R X W 5 Q R X W 5 Q R X |||fS )z-Run the client with output streams mocked outúcertbot.main.sys.stdout©Únewúcertbot.main.sys.stderrzcertbot.util.atexitN)rñ   ÚsixÚStringIOr   r6   r   )r   rN   rý   Z
toy_stdoutrÿ   r   r    r    r!   rü   *  s    
0zMainTest._call_no_clientmockc              	   C   s2   t  d¡}|  g ¡ |  d|j¡ W 5 Q R X d S )Nzcertbot.main.runr-   )r   r6   rQ   r   rt   )r   Úmock_runr    r    r!   Útest_no_flags5  s    
zMainTest.test_no_flagsc                 C   sœ   t  ¡ }t  ¡ }tjd|dt tjd|dZ z*zt dg¡ W n tk
rV   Y nX W 5 | ¡ pj| ¡ }|  d|kd |¡¡ X W 5 Q R X W 5 Q R X d S )Nr   r  r  ÚcertbotzOutput is {0}z	--version)	r  r  r   r6   Úgetvaluers   rG   r   Ú
SystemExit)r   Ztoy_outZtoy_errÚoutputr    r    r!   Ú test_version_string_program_name:  s    
z)MainTest.test_version_string_program_namec              
   C   s„   d}z2t  d¡ t | j|dd…  ¡ W 5 Q R X W n: tjk
rp } z|}|  |t|ƒk¡ W 5 d}~X Y nX |  |dk	¡ dS )zQEnsure that a particular error raises a missing cli flag error containing messageNr  )r   r6   r   rñ   r   ZMissingCommandlineFlagrs   Ústr)r   rN   rl   ÚexcZexc_r    r    r!   Ú_cli_missing_flagG  s    &$zMainTest._cli_missing_flagz certbot.log.post_arg_parse_setupc                 C   s4   ddg}|   |d¡ | dddg¡ |   |d¡ d S )Nz-nrf   zspecify a pluginú--standaloneú-dzeg.iszregister before running)r  Úextend©r   Ú_rN   r    r    r!   Útest_noninteractiveR  s    zMainTest.test_noninteractiver+   z&certbot.main.client.acme_client.Clientr   z8certbot.main.client.Client.obtain_and_enroll_certificater(   c              	   C   sì   dddddddg| j  }t ¡ d f|_t ¡ |_t d¡b}|  |¡ t ¡ }	|jd	 d
 }
|  	|	|
k¡ dd l
}| 
¡ }d| ¡ kr˜|  	t ¡ |
k¡ W 5 Q R X t d¡6}d}
|d|
g7 }|  |¡ |jtjtjd|
d W 5 Q R X d S )Nr  rf   z-mznone@none.comr  rp   z--agree-tosz-certbot.main.client.acme_client.ClientNetworkr-   Ú
user_agentr   ZlinuxZbandersnatchz--user-agentT)r   Z
verify_sslr  )rñ   r   rŸ   r   r6   rü   r   Zget_os_info_uarä   rs   ÚplatformÚlowerrS   r®   )r   ZgscZ_obtZdetZ_clientr  Ú__rN   Zacme_netZos_verZuar  Zplatr    r    r!   Útest_user_agentY  s2    	  ÿÿ


ÿzMainTest.test_user_agentú+certbot.main.plug_sel.record_chosen_pluginsú$certbot.main.plug_sel.pick_installerc              
   C   s2   | j ddddddddd	g	d
d |  |jd¡ d S )NÚinstallz	--domainsúfoo.barú--cert-pathró   ú
--key-pathrõ   ú--chain-pathrô   T©rþ   r-   )rQ   r   rt   )r   Zmock_pick_installerÚ_recr    r    r!   Útest_installer_selectionx  s       ÿÿz!MainTest.test_installer_selectionzcertbot.main._install_certc              	   C   s¨   t jt d¡t d¡t d¡t d¡d}t  d¡j}||_| jdddgd	d
 |jd d }|  |j	t d¡¡ |  |j
t d¡¡ |  |jt d¡¡ W 5 Q R X d S )Nró   rô   rõ   ©rÉ   Ú
chain_pathÚfullchain_pathÚkey_pathrn   r  ú--cert-nameÚwhateverTr"  r   )r   rŸ   ra   Ú	temp_joinr6   r   rQ   rä   r   rÉ   r'  r(  )r   Ú_instr#  Úmock_installr   Úmock_getlinÚcall_configr    r    r!   Útest_installer_certname  s    ýz MainTest.test_installer_certnamec              	   C   s6  t jt d¡t d¡t d¡t d¡d}t  d¡ø}||_| jdddd	t d
¡gdd |jd d }|  |j	t d¡¡ |  |j
t d¡¡ |  |jt d¡¡ |  |jt d
¡¡ | ¡  | jddddt d¡gdd |jd d }|  |j	t d¡¡ |  |j
t d¡¡ |  |jt d¡¡ W 5 Q R X d S )Nró   rô   rõ   r%  rn   r  r)  r*  r   Zoverriding_privkeyTr"  r   r  Zoverriding_cert)r   rŸ   ra   r+  r6   r   rQ   rä   r   rÉ   r'  r&  r(  Úreset)r   r,  r#  r-  r  r   r.  r/  r    r    r!   Útest_installer_param_override  s:    ý
 ÿÿ
 ÿÿz&MainTest.test_installer_param_overridec              	   C   s    |   tj| jdddddg¡ d S )Nr  r)  Znotfoundr   Zinvalid©r[   r   rv   rQ   )r   r,  r#  r    r    r!   Útest_installer_param_error¬  s     ÿþz#MainTest.test_installer_param_errorú"certbot.cert_manager.get_certnamesc              	   C   sr   t jt d¡t d¡t d¡t d¡d}t  d¡}||_| jdgdd W 5 Q R X |  |j¡ |  |j¡ d S )	Nró   rô   rõ   r%  rn   r  Tr"  )	r   rŸ   ra   r+  r6   r   rQ   rs   r|   )r   Ú	mock_instZmock_getcertr,  r#  r   r.  r    r    r!   Útest_installer_select_cert´  s    ýz#MainTest.test_installer_select_certzcertbot.util.exe_existsc                 C   s$  d|_ tj ¡ }dddg}dddt d¡d	t d¡d
ddddg}d|krv|  |¡\}}}}|  d|k¡ |  d|k¡ |  dgd¡ t	 
d¡Z}t	 
d¡D}t	 ¡ |_ |  ddddg¡ |jd \}	}
}|  t|
tjƒ¡ W 5 Q R X W 5 Q R X t	 
d¡"}|  ddg¡ |  d|j¡ W 5 Q R X d S )NTz--apachez--authenticatorÚ
standaloner  z--nginxr  Zblahr   z--nginx-server-rootz/nonexistent/thingr  rp   ú--debugZnginxzThe nginx plugin is not workingÚMisconfigurationErrorr  z(With the standalone plugin, you probablyr)   r(   rf   z--manualr  r   úcertbot.main.certonlyÚauthr-   )r   r   rI   rJ   ra   r+  rQ   rs   r  r   r6   rŸ   rä   Ú
isinstancer   ZAuthenticatorr   rt   )r   Zmock_exe_existsr  r  Zreal_pluginsrN   r   r<   Zmock_gscZunused_configr<  Zunused_installerÚmock_certonlyr    r    r!   Útest_configurator_selectionÃ  s6    


     ý
&z$MainTest.test_configurator_selectionc                 C   sX   |   dg¡\}}}}|  d|jj¡ |   dddg¡\}}}}|j tjdtjtj¡ d S )NÚrollbackr-   z--checkpointsZ123é{   )rQ   r   r@  rt   rS   r   r®   ©r   r  ré   r    r    r!   Útest_rollbackë  s       ÿzMainTest.test_rollbackc                 C   s(   |   dg¡\}}}}|  d|jj¡ d S )NÚconfig_changesr-   )rQ   r   Zview_config_changesrt   rB  r    r    r!   Útest_config_changesô  s    zMainTest.test_config_changeszcertbot.main.logger.warningc                 C   s6   |   dg¡ |  |j¡ |jd d }|  d|¡ d S )NrD  r   z-config_changes subcommand has been deprecated)rQ   rs   r|   rä   ZassertIn)r   Zmock_warningÚmsgr    r    r!   Útest_config_changes_deprecationø  s    z(MainTest.test_config_changes_deprecationz)certbot.cert_manager.update_live_symlinksc                 C   s   |   dg¡ |  d|j¡ d S )NZupdate_symlinksr-   ©rü   r   rt   ©r   Zmock_cert_managerr    r    r!   Útest_update_symlinksÿ  s    zMainTest.test_update_symlinksz!certbot.cert_manager.certificatesc                 C   s   |   dg¡ |  d|j¡ d S )NZcertificatesr-   rH  rI  r    r    r!   Útest_certificates  s    zMainTest.test_certificatesr»   c                 C   s   |   dg¡ |  d|j¡ d S )NÚdeleter-   rH  rI  r    r    r!   Útest_delete	  s    zMainTest.test_deletec                    sN   ddddg‰ t j‡ fdd„tj tˆ ƒ¡D ƒŽ D ]}|  dgt|ƒ ¡ q0d S )Nú--initú	--preparez--authenticatorsz--installersc                 3   s   | ]}t  ˆ |¡V  qd S rB   )Ú	itertoolsÚcombinations)Ú.0rŒ   ©Úflagsr    r!   Ú	<genexpr>  s   ÿz(MainTest.test_plugins.<locals>.<genexpr>rO   )rP  rô   r  ZmovesÚrangeÚlenrQ   Úlistr  r    rS  r!   Útest_plugins  s    
ÿÿzMainTest.test_pluginszcertbot.main.plugins_discoz<certbot.main.cli.HelpfulArgumentParser.determine_help_topicsc              	   C   s†   g }|j  ¡ }t ¡ }tj|d |  dg|¡\}}}}W 5 Q R X |j ¡  | ¡ j	 |¡ | ¡  	¡ }|  
| ¡  ¡ t|ƒ¡ d S )N©rý   rO   )rI   rJ   r  r  ra   Úpatch_get_utility_with_stdoutrQ   ÚvisiblerS   Úifacesr   r	  Ústripr  )r   Ú_detÚ
mock_discor]  rO   rý   r  Úfilteredr    r    r!   Útest_plugins_no_args  s    
 
zMainTest.test_plugins_no_argsc           
   
   C   sª   g }|j  ¡ }dd„ }t ¡ }t d¡:}tj|d" ||_|  	dg|¡\}}}}W 5 Q R X W 5 Q R X |j
 ¡  | 
¡ j |¡ | 
¡  ¡ }	|  | ¡  ¡ t|	ƒ¡ d S )Nc                 S   s   | ||  }}}t  ¡ ‚dS )zRaises error.Error.N)r   rˆ   )rÞ   ÚmodeÚstrictr  r    r    r!   Úthrow_error+  s    z?MainTest.test_plugins_no_args_unprivileged.<locals>.throw_errorzcertbot.util.set_up_core_dirrZ  rO   )rI   rJ   r  r  r   r6   ra   r[  ri   rQ   r\  rS   r]  r   r	  r^  r  )
r   r_  r`  r]  rO   re  rý   Zmock_set_up_core_dirr  ra  r    r    r!   Ú!test_plugins_no_args_unprivileged%  s    
*
z*MainTest.test_plugins_no_args_unprivilegedc           	   	   C   s¬   g }|j  ¡ }t ¡ }tj|d |  ddg|¡\}}}}W 5 Q R X |j ¡  | ¡ j	 |¡ | ¡  	¡ }|  
|jjd¡ |j |¡ | ¡ }|  
| ¡  ¡ t|ƒ¡ d S )NrZ  rO   rN  r-   )rI   rJ   r  r  ra   r[  rQ   r\  rS   r]  r   Úinitrt   Úverifyr	  r^  r  )	r   r_  r`  r]  rO   rý   r  ra  Úverifiedr    r    r!   Útest_plugins_init;  s    
"
zMainTest.test_plugins_initc           
   	   C   sÊ   g }|j  ¡ }t ¡ }tj|d  |  dddg|¡\}}}}W 5 Q R X |j ¡  | ¡ j	 |¡ | ¡  	¡ }|  
|jjd¡ |j |¡ | ¡ }|j ¡  |j ¡  | ¡ }	|  
| ¡  ¡ t|	ƒ¡ d S )NrZ  rO   rN  rO  r-   )rI   rJ   r  r  ra   r[  rQ   r\  rS   r]  r   rg  rt   rh  ZprepareÚ	availabler	  r^  r  )
r   r_  r`  r]  rO   rý   r  ra  ri  rk  r    r    r!   Útest_plugins_prepareM  s    
$


zMainTest.test_plugins_preparec                 C   s¬   d}d}d}d}t  d¡"}|  dd|ddd	dd
dg	¡ W 5 Q R X |jd \}}|  |jtj |¡¡ |  |j	tj |¡¡ |  |j
tj |¡¡ |  |jtj |¡¡ d S )Nró   Úkeyrô   Ú	fullchainr;  rf   r  r   r!  z--fullchain-pathr   )r   r6   rQ   rä   r   rÉ   r   r•   r–   r(  r&  r'  )r   ró   rm  rô   rn  r>  rP   Úunused_pluginsr    r    r!   Útest_certonly_abspathb  s       þzMainTest.test_certonly_abspathc              
   C   s\   z |   dddg¡ dstdƒ‚W n6 tjk
rV } z|  dt|ƒk¡ W 5 d }~X Y nX d S )Nú-aZbad_authrf   Fz!Exception should have been raisedz-The requested bad_auth plugin does not appear)rQ   ÚAssertionErrorr   ÚPluginSelectionErrorrs   r  ©r   Úer    r    r!   Útest_certonly_bad_argss  s
    zMainTest.test_certonly_bad_argsc                 C   sF   |   tj| jddg¡ |   tj| jddg¡ |   tj| jddg¡ d S )Nr  Z@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaþ  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.z204.11.231.35r3  r?   r    r    r!   Útest_check_config_sanity_domainz  s    þþþz(MainTest.test_check_config_sanity_domainc                 C   s    |   tj| jd t¡ ¡ ¡ d S )Nz*certonly --csr {0} --allow-subset-of-names©r[   r   rˆ   rQ   rG   ÚCSRrH   r?   r    r    r!   Útest_csr_with_besteffortˆ  s
     þz!MainTest.test_csr_with_besteffortc              
   C   s^   z|   dtg¡ W n: tjk
rL } zdt|ƒks6t‚W Y ¢d S d }~X Y nX dsZtdƒ‚d S )Nz--csrzPlease try the certonlyFz2Expected supplying --csr to fail with default verb)rQ   ry  r   rˆ   Úreprrr  rt  r    r    r!   Útest_run_with_csr  s    zMainTest.test_run_with_csrc              	   C   s&   |   tj| jd t d¡¡ ¡ ¡ d S )Nzcertonly --csr {0}zcsr-nonames_512.pem)r[   r   rˆ   rQ   rG   ra   Úvector_pathrH   r?   r    r    r!   Útest_csr_with_no_domains–  s     ÿþz!MainTest.test_csr_with_no_domainsc                 C   s    |   tj| jd t¡ ¡ ¡ d S )Nz!certonly -d example.org --csr {0}rx  r?   r    r    r!   Ú"test_csr_with_inconsistent_domainsœ  s
     þz+MainTest.test_csr_with_inconsistent_domainsc              
   C   s^   t  d¡J}d|_t  d¡.}||_|d kr0g }|d ¡ 7 }|  |¡ W 5 Q R X W 5 Q R X d S )Nú3certbot.main._find_lineage_for_domains_and_certname)ZnewcertNr)   z!-d foo.bar -a standalone certonly)r   r6   r   rH   rQ   )r   rÝ   rN   Úmock_renewalr<   r    r    r!   Ú_certonly_new_request_common¡  s    z%MainTest._certonly_new_request_commonc                 C   s`   t  ¡ }d |j_|  |dg¡ |  |jjd¡ |  d|ƒ jj	d d k¡ |  |ƒ jjd¡ d S ©Nú	--dry-runr-   údry runr   )
r   rŸ   Úobtain_and_enroll_certificater   r‚  r   rt   rs   rÀ   rä   )r   rd   rÝ   r    r    r!   Ú)test_certonly_dry_run_new_request_success«  s     ÿÿz2MainTest.test_certonly_dry_run_new_request_successzcertbot.crypto_util.notAfterc           	      C   sÞ   t j t j | jjd¡¡}t j t j | jjd¡¡}d}||ƒ j_tj	||||d}t 	¡ }||j
_|  |¡ |  |j
jd¡ |ƒ jjd d d }|  ||k¡ |  ||k¡ |  ||k¡ |  d|ƒ jjd d k¡ d S )Nzlive/foo.barzlive/baz.quxz
1970-01-01)ró   rn  r'  r(  r-   r   Údonate)r   r•   Únormpathr—   rP   rï   Údater   r   rŸ   r†  r‚  r   rt   rÀ   r°   rs   rä   )	r   rd   Zmock_notAfterrÉ   r(  rŠ  r   rÝ   Úcert_msgr    r    r!   Ú!test_certonly_new_request_success·  s,    
 ÿ
 ÿÿz*MainTest.test_certonly_new_request_successc                 C   s&   t  ¡ }d|j_|  tj| j|¡ d S rU   )r   rŸ   r†  r   r[   r   rˆ   r‚  )r   rÝ   r    r    r!   Ú!test_certonly_new_request_failureÍ  s     ÿz*MainTest.test_certonly_new_request_failureTc
                    s†  t  d¡}
tj tj | jjd¡¡}tj	|
||
|d}||j
_d|j_dg|j_t 	¡ }tj	dd}t 	¡ }t ¡ ‰ |d|d	f|j_‡ fd
d„}z¬zŽt d¡"}|d f|_t d¡ }||_t  ¡ æ}|sÜ||ƒ j_t d¡Â}t 	¡ }d|j_||jj_t d¡’}||j_|s*dddddg}|r8||7 }z>|  |ˆ ¡\}‰ }}|rftd|ƒ t|ƒ‚|rttdƒ‚W n"   |s”tdt  !¡  ƒ‚Y nX W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X |r|	r |j "dgtj tj | jjd¡¡¡ n|j "dgd ¡ n|  #|jj$d¡ W n   |  %¡  ‚ Y nX W 5 |rzttj | jjd¡ƒ}|  || ¡ k¡ W 5 Q R X X ||ˆ fS )Nr   zlive/foo.bar/fullchain.pem)ró   rn  rÉ   r'  Fz	isnot.orgZpem_key)Zpemrô   Zcsrc                    s   ˆ   | ¡ dS )zWrite message to stdout.N)Úwrite)rl   rN   rø   rZ  r    r!   Ú	write_msgç  s    z0MainTest._test_renewal_common.<locals>.write_msgúletsencrypt.logz+certbot.cert_manager.find_duplicative_certsr)   zcertbot.main.renewal.OpenSSLz	Fake fakez certbot.main.renewal.crypto_utilr  rq  r8  rf   ZReturnedzrenewal should have erroredzUnexpected renewal error:
zlive/sample-renewal/privkey.pemr   )&ra   r}  r   r•   r‰  r—   rP   rï   r   rŸ   Zshould_autorenewr   Zhas_pending_deploymentrr   r  r  Úobtain_certificater™   rî   rs   rš   r6   rb   rg   ri   Z
get_issuerZcryptoZload_certificateZnotAfterrQ   Úprintrr  Ú	tracebackÚ
format_excrS   r   rt   Ú	_dump_log)r   Údue_for_renewalÚ
extra_argsÚlog_outrN   Úshould_renewÚerror_expectedÚ
quiet_modeÚexpiry_dateÚ	reuse_keyrÉ   r&  r   Z
mock_certrZmock_keyrÝ   r  ÚlfZmock_fdcr<   rd   Zmock_sslZmock_latestZmock_crypto_utilr   r  r    rZ  r!   Ú_test_renewal_commonÓ  sˆ    
ÿ ÿ
 ÿ




ÿÿ<
 ÿÿzMainTest._test_renewal_commonc                 C   sv   |   dg ¡\}}}|  |jjd¡ |j | ¡ ¡ |ƒ jjd d d }|  	d|k¡ |  	d|ƒ jj
d d k¡ d S )NTr-   r   úfullchain.pemrˆ  )rŸ  r   Zsave_successorrt   Zupdate_all_links_torS   Zlatest_common_versionrÀ   r°   rs   rä   )r   r  ZlineageÚget_utilityr‹  r    r    r!   Útest_certonly_renewal  s    ÿzMainTest.test_certonly_renewalz;certbot.log.logging.handlers.RotatingFileHandler.doRolloverc                 C   sŒ   | j dddgdd\}}}|  |ƒ jjd¡ |  d|ƒ jjd d k¡ | j dd	d
dgdd |  |ƒ jjd¡ | j dd
ddgddd d S )NFr„  z--keepzsimulating renewal)r˜  r-   r…  r   z--renew-by-defaultú-tvvr9  zAuto-renewal forcedznot yet due)r˜  r™  )rŸ  r   rÀ   rt   rs   rä   )r   r  r  r¡  r    r    r!   Útest_certonly_renewal_triggers(  s    ÿÿ ÿz'MainTest.test_certonly_renewal_triggersc              	   C   sJ   t dƒ tj | jjd¡}tj |¡rFt|ƒ}t | ¡ ƒ W 5 Q R X d S )NzLogs:r  )	r’  r   r•   r—   rP   rî   Úexistsr™   rš   )r   Zlog_pathrž  r    r    r!   r•  8  s
    
zMainTest._dump_logc                 C   s0   t  | jjd¡ dddg}| jdg |dd d S )Núsample-renewal.confÚrenewr„  r£  T©rN   r™  ©ra   Úmake_lineagerP   rï   rŸ  ©r   rN   r    r    r!   Útest_renew_verb?  s    
zMainTest.test_renew_verbc                 C   s2   t  | jjd¡ dddg}| jdg |ddd d S )Nr¦  r§  r„  ú--reuse-keyT©rN   r™  r  r©  r«  r    r    r!   Útest_reuse_keyD  s    
zMainTest.test_reuse_keyz,certbot.storage.RenewableCert.save_successorc                 C   s0   t  | jjd¡ ddg}| jdg |ddd d S )Nr¦  r§  r­  Tr®  r©  )r   Zunused_save_successorrN   r    r    r!   Útest_reuse_key_no_dry_runI  s    z"MainTest.test_reuse_key_no_dry_runz	sys.stdinc                 C   sv   d|j _t | jjd¡ dddg}| jdg |dd |  | jj	d¡ | jj
d	 d	 }|  d|  kojd
kn  ¡ d S )NFr¦  r§  r„  r£  Tr¨  r-   r   ià  )Úisattyr   ra   rª  rP   rï   rŸ  r   rò   rt   rä   rs   )r   ÚstdinrN   Zsleep_call_argr    r    r!   Ú!test_noninteractive_renewal_delayO  s    
z*MainTest.test_noninteractive_renewal_delayc                 C   sH   d|j _t | jjd¡ dddg}| jdg |dd |  | jj	d¡ d S )NTr¦  r§  r„  r£  r¨  r   )
r±  r   ra   rª  rP   rï   rŸ  r   rò   rt   )r   r²  rN   r    r    r!   Ú!test_interactive_no_renewal_delay[  s
    
z*MainTest.test_interactive_no_renewal_delayzcertbot.renewal.should_renewc                 C   sp   d|_ t | jjd¡ tj ¡ tjdd }| jdd ddg|d\}}}|  	d| 
¡ k¡ |  	d| 
¡ k¡ d S )	NFr¦  éZ   )Zdaysr§  )r—  r™  rN   rœ  zNo renewals were attempted.z0The following certs are not due for renewal yet:)r   ra   rª  rP   rï   r¡   ÚnowZ	timedeltarŸ  rs   r	  )r   r™  Zexpiryr  rý   r    r    r!   Útest_renew_skips_recent_certsc  s    
 ÿz&MainTest.test_renew_skips_recent_certsc                 C   s‚   t  | jjd¡ ddg}| jdg |dd\}}}| ¡ }|  d|k¡ dddg}| jdg |ddd\}}}| ¡ }|  d|¡ d S )	Nr¦  r§  r„  Tr¨  z-q)rN   r™  r›  rÈ   )ra   rª  rP   rï   rŸ  r	  rs   r   )r   r  rN   rý   Úoutr    r    r!   Útest_quiet_renewm  s    

 ÿzMainTest.test_quiet_renewc                 C   s2   t  | jjd¡ dddg}| jdg |ddd d S )Nr¦  r§  r„  ú--post-hook=no-such-commandTF©rN   r™  rš  r©  r«  r    r    r!   Útest_renew_hook_validation{  s
    
ÿz#MainTest.test_renew_hook_validationc              	   C   sJ   t  | jjd¡ ddddg}t d¡ | jdg |ddd	 W 5 Q R X d S )
Nr¦  r§  r„  rº  z--disable-hook-validationzcertbot.hooks.post_hookTFr»  )ra   rª  rP   rï   r   r6   rŸ  r«  r    r    r!   Útest_renew_no_hook_validation  s    ÿÿz&MainTest.test_renew_no_hook_validationc              	   C   sj   t j | jjd¡}t j |¡s(t |¡ tt j |d¡dƒ W 5 Q R X dddg}| j	dg |ddd	 d S )
NÚrenewalz
empty.confÚwr§  r„  r£  FTr»  )
r   r•   r—   rP   rï   r¥  r   Úmakedirsr™   rŸ  )r   ZrdrN   r    r    r!   Útest_renew_verb_empty_config‰  s    


z%MainTest.test_renew_verb_empty_configc                 C   s.   t  | jjd¡ | jdg dddddgd d S )Nr¦  Tr§  r„  r)  úsample-renewal)r™  rN   r©  r?   r    r    r!   Útest_renew_with_certname’  s    

ÿz!MainTest.test_renew_with_certnamec                 C   s    | j dg dddddgdd d S )NTFr§  r„  r)  rÂ  )r™  rN   rš  )rŸ  r?   r    r    r!   Útest_renew_with_bad_certname—  s    

þz%MainTest.test_renew_with_bad_certnamec              	   C   sJ   t j | jjd¡}t |¡ tt j |d¡dƒ}| d¡ W 5 Q R X d S )Nr¾  z	test.confr¿  zMy contents don't matter)	r   r•   r—   rP   rï   r   rÀ  r™   rŽ  )r   Zrenewer_configs_dirr¦   r    r    r!   Ú_make_dummy_renewal_configœ  s    
z#MainTest._make_dummy_renewal_configc              
   K   s¶   |   ¡  t d¡š}t ¡ }d|_|d k	r4d|i|_|d k	rD||j_||_t d¡(}| ddg¡ | j	d
dd	i|—Ž W 5 Q R X |d k	r¨|rœ|  
|j¡ n|  |j¡ W 5 Q R X d S )Núcertbot.storage.RenewableCertzsomepath/fullchain.pemÚrenewalparamsúcertbot.main.renew_certrN   r§  Tr™  F)TN)rÅ  r   r6   rŸ   rn  r   rr   r   Ú
setdefaultrŸ  rs   r|   rk   )r   rÇ  rr   Úassert_oc_calledrø   Úmock_rcr   rw   r    r    r!   Ú_test_renew_common¢  s     
zMainTest._test_renew_commonc                 C   s   | j ddd d S )NFT©rÊ  rš  ©rÌ  r?   r    r    r!   Útest_renew_no_renewalparams·  s    z$MainTest.test_renew_no_renewalparamsc                 C   s   | j i ddd d S )NFT)rÇ  rÊ  rš  rÎ  r?   r    r    r!   Útest_renew_no_authenticatorº  s    ÿz$MainTest.test_renew_no_authenticatorc                 C   s   dddœ}| j |ddd d S )NÚwebrootz	over 9000)ÚauthenticatorZrsa_key_sizeTF)rÇ  rš  rÊ  rÎ  ©r   rÇ  r    r    r!   Útest_renew_with_bad_int¾  s    ÿÿz MainTest.test_renew_with_bad_intc                 C   s   dddœ}| j |dd d S )NrÑ  ÚNone)rÒ  Zhttp01_portT©rÇ  rÊ  rÎ  rÓ  r    r    r!   Útest_renew_with_nonetype_http01Ä  s    ÿÿz(MainTest.test_renew_with_nonetype_http01c                 C   s$   ddi}dg}| j |d|dd d S )NrÒ  rÑ  u   uniÃ§odÃ©.comTF)rÇ  rš  rr   rÊ  rÎ  )r   rÇ  rr   r    r    r!   Útest_renew_with_bad_domainÊ  s     ÿz#MainTest.test_renew_with_bad_domainz5certbot.plugins.selection.choose_configurator_pluginsc                 C   s2   t  ¡ t  ¡ f|_ddi}| j|dd ¡ d d S )NrÒ  rÑ  Tzrenew --configurator apache©rÇ  rÊ  rN   )r   rŸ   r   rÌ  rH   )r   Zmock_selrÇ  r    r    r!   Útest_renew_with_configuratorÐ  s     þz%MainTest.test_renew_with_configuratorc                 C   s   ddddœ}| j |dd d S )NrÑ  rÕ  Z42)rÒ  Zwebroot_pathZwebroot_imaginary_flagTrÖ  rÎ  rÓ  r    r    r!   Ú$test_renew_plugin_config_restorationØ  s    þÿz-MainTest.test_renew_plugin_config_restorationc              
   C   s0   ddi}| j |dddt dt ¡ i¡gd d S )NrÒ  rÑ  Tr§  z--webroot-maprp   rÙ  )rÌ  ÚjsonÚdumpsÚtempfileZ
gettempdirrÓ  r    r    r!   Útest_renew_with_webroot_mapß  s     þz$MainTest.test_renew_with_webroot_mapc              	   C   s.   t  d¡}t|_| jddd W 5 Q R X d S )Nz"certbot.main.renewal._reconstituteFTrÍ  )r   r6   Ú	Exceptionri   rÌ  )r   Zmock_reconstituter    r    r!   Útest_renew_reconstitute_errorå  s    z&MainTest.test_renew_reconstitute_errorc              
   C   sv   |   ¡  t d¡Z}t ¡ }d|_||_dddii|_t d¡"}t|_| j	dd ddgd	d
 W 5 Q R X W 5 Q R X d S )NrÆ  zsomewhere/fullchain.pemrÇ  rÒ  rÑ  rÈ  Tr§  F)rš  rN   r™  )
rÅ  r   r6   rŸ   rn  r   r   rà  ri   rŸ  )r   rË  r   rw   r    r    r!   Útest_renew_obtain_cert_errorë  s     ÿ
 ÿz%MainTest.test_renew_obtain_cert_errorc                 C   s:   | j dd d ¡ ddd | j dd d t¡ ¡ ddd d S )NTzrenew -d example.comFr»  zrenew --csr {0})rŸ  rH   rG   ry  r?   r    r    r!   Útest_renew_with_bad_cli_argsø  s     ÿ ÿz%MainTest.test_renew_with_bad_cli_argsc              	   C   s<   | j dd dddd tj¡gd\}}}|  d| ¡ k¡ d S )NFr§  z--post-hookzE{0} -c "from __future__ import print_function; print('hello world');")r–  r—  r™  rN   zNo hooks were run.)rŸ  rG   ÚsysÚ
executablers   r	  )r   r  rý   r    r    r!   Útest_no_renewal_with_hooksþ  s      ÿÿþz#MainTest.test_no_renewal_with_hooksr€  r)   c                 C   sb   dt  ¡ f|_t  ¡  |_}|  dddddg¡ |  |jj¡ |  |jj¡ |  |ƒ j	j
d¡ d S )Nr   r  r  rq  r8  rf   r   )r   rŸ   r   rQ   rk   r‘  r|   r†  r   rÀ   rt   )r   r<   r  rd   rÝ   r    r    r!   Útest_certonly_reinstall  s    z MainTest.test_certonly_reinstallc                 C   s  d}d}t  ¡ }||f|j_tj tj | jj	d¡¡}tj tj | jj	d¡¡}|d |f|j
_t  d¡z}||_t ¡ `}tj tj | jj	d¡¡}	d t||	|¡ ¡ }
|r´|
|7 }
t  d¡ |  |
¡ W 5 Q R X W 5 Q R X W 5 Q R X d	|
kr|  |j
j¡ n|j
 ||||	|¡ |S )
NÚcertrrô   zlive/example.com/cert_512.pemzlive/example.com/fullchain.pemr)   zlive/example.com/chain.pemzV-a standalone certonly --csr {0} --cert-path {1} --chain-path {2} --fullchain-path {3}zcertbot.main.crypto_utilr„  )r   rŸ   Zobtain_certificate_from_csrr   r   r•   r‰  r—   rP   rï   Zsave_certificater6   ra   rb   rG   ry  rH   rQ   rk   r|   rS   )r   r—  rè  rô   rÝ   rÉ   Ú	full_pathr<   rd   r&  rN   r    r    r!   Ú_test_certonly_csr_common  sP    þþ
þ   þ(
    ÿz"MainTest._test_certonly_csr_commonc                 C   sZ   |   ¡ }|ƒ jjd d d }|  d|k¡ |  d|k¡ |  d|ƒ jjd d k¡ d S )Nr   r   zYour key file has been saved atrˆ  )rê  rÀ   r°   rs   rk   rä   )r   rd   r‹  r    r    r!   Útest_certonly_csr4  s    ÿzMainTest.test_certonly_csrc                 C   s>   |   dg¡}|  |ƒ jjd¡ |  d|ƒ jjd d k¡ d S rƒ  )rê  r   rÀ   rt   rs   rä   rÃ   r    r    r!   Útest_certonly_csr_dry_run<  s
    ÿz"MainTest.test_certonly_csr_dry_runr¨   r©   c              	   C   s    d|_ d}|  dtdtd|dg¡ ttdƒ$}|j tjt	j
 | ¡ ¡|¡ W 5 Q R X ttdƒ6}t | ¡ ¡d }| ¡ j}| t	 |¡tj¡ W 5 Q R X d S )	NFr  r  r   ú--serverr§   Úrbr   )r   rü   ÚSS_CERT_PATHÚRSA2048_KEY_PATHr™   rª   rS   r   r®   Újoser¤   Úloadrš   r	   Úpyopenssl_load_certificater§   ÚComparableX509)r   rœ   r±   Úserverr¦   ró   r²   r    r    r!   Útest_revoke_with_keyB  s(      ÿ  ÿ
þzMainTest.test_revoke_with_keyc                 C   s(   d}|   tj| jdtdtd|dg¡ d S )Nr  r  r   rí  r§   )r[   r   rˆ   rü   ÚCERTÚKEY)r   rõ  r    r    r!   Útest_revoke_with_key_mismatchT  s      ÿÿz&MainTest.test_revoke_with_key_mismatchc              	   C   st   d|_ t ¡ d f|_ |  dtdg¡\}}}}ttƒ6}t | ¡ ¡d }| 	¡ j
}| t |¡tj¡ W 5 Q R X d S )NFr  r§   r   )r   r   rŸ   rQ   r÷  r™   r	   ró  rš   Zacme_from_config_keyr§   rS   rñ  rô  r®   )r   r   r±   r  ré   r¦   ró   r²   r    r    r!   Útest_revoke_without_keyZ  s    

þz MainTest.test_revoke_without_keyc              
   C   s–   t  d¡‚}t  ¡ }d|_|df|j_|  dddg¡ t  d¡B}t  ¡ }||j_dg|j_|  dddg¡}|  	d	|d
 k¡ W 5 Q R X W 5 Q R X d S )Nræ   Zimaginary_accountZworkedrè   ú--emailúuser@example.orgúcertbot.main.accountú
an accountzThere is an existing accountr   )
r   r6   rŸ   r×   rè   r   rü   ÚAccountFileStoragerJ   rs   )r   r  Úmocked_clientr¥   Úmocked_accountÚmocked_storagerÖ   r    r    r!   Útest_registerh  s    
zMainTest.test_registerc              	   C   sT   t  d¡@}t  ¡ }||j_g |j_|  dddg¡}|  d|d k¡ W 5 Q R X d S )Nrý  Úupdate_accountrû  rü  ú"Could not find an existing accountr   ©r   r6   rŸ   rÿ  r   rJ   rü   rs   ©r   r  r  rÖ   r    r    r!   Ú(test_update_account_no_existing_accountsy  s    ÿÿz1MainTest.test_update_account_no_existing_accountsc              	   C   sV   t  d¡B}t  ¡ }||j_g |j_|  ddddg¡}|  d|d k¡ W 5 Q R X d S )Nrý  rè   ú--update-registrationrû  rü  r  r   r  r  r    r    r!   Ú8test_update_registration_no_existing_accounts_deprecated†  s    ÿÿzAMainTest.test_update_registration_no_existing_accounts_deprecatedc              	   C   sT   t  d¡@}t  ¡ }||j_dg|j_|  d ¡ ¡}|  d|d k¡ W 5 Q R X d S )Nrý  rþ  z@register --update-registration --register-unsafely-without-emailz!--register-unsafely-without-emailr   )	r   r6   rŸ   rÿ  r   rJ   rü   rH   rs   r  r    r    r!   Ú,test_update_registration_unsafely_deprecated“  s    
ÿz5MainTest.test_update_registration_unsafely_deprecatedz"certbot.main.display_ops.get_emailc                 C   s  d}||_ t d¡ä}t d¡Î}t d¡¸}t d¡¢}t ¡ }||j_ dg|j_ t ¡ df|_ t ¡ }	|	|j_ |  dg¡}
|  |
d	 d k¡ |  |	j	j
j¡ |  |jj¡ |  ||ƒ jjd	 d	 k¡ |  |j¡ W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X d S )
Núuser@example.comúcertbot.eff.handle_subscriptionr   rý  ræ   rþ  Úfoor  r   )r   r   r6   rŸ   rÿ  rJ   ÚClientrü   rs   r¸   Úupdate_registrationr|   Ú	save_regrrÀ   rä   )r   Úmock_utilityÚ
mock_emailrÚ   Úmock_handleÚ
mocked_detr  r   r  Ú	cb_clientrÖ   r    r    r!   Útest_update_account_with_emailŸ  s0    
ÿÿÿz'MainTest.test_update_account_with_emailc                 C   s"  d}||_ t d¡}t d¡ì}t d¡Ö}t d¡À}t ¡ }||j_ dg|j_ t ¡ }	|	j}
|	df|_ t ¡ }||j_ |  dd	g¡}|  	|d
 d k¡ |j
jjd
 d
 }|  ||
 ¡ ¡ |  	|jj¡ |  	||ƒ jjd
 d
 k¡ |  	|j¡ W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr  r  r   rý  ræ   rþ  r  rè   r	  r   )r   r   r6   rŸ   rÿ  rJ   r    r  rü   rs   r¸   r  rä   r   Úupdater  r|   rÀ   )r   r  r  rÚ   r  r  r  r   r  Zmock_accZ	mock_regrr  rÖ   Zreg_argr    r    r!   Ú.test_update_registration_with_email_deprecated¿  s2    

ÿÿz7MainTest.test_update_registration_with_email_deprecatedzcertbot.updater._run_updatersc                 C   sF   t j|_|  t jtjd d d ¡ d| j_t 	| jd d ¡ |  
|j¡ d S rU   )r   rs  ri   r[   r   Z
renew_certrP   Zdry_runr   Zrun_generic_updatersrk   r|   )r   r  r]   r    r    r!   Útest_plugin_selection_errorá  s      ÿz$MainTest.test_plugin_selection_error)NF)N)N)NNN)N)\r#   r$   r%   r&   r4   rE   rQ   rü   r  r  r  r   r6   r  r  r$  r0  r2  r4  r7  r?  rC  rE  rG  rJ  rK  rM  rY  rb  rf  rj  rl  rp  rv  rw  rz  r|  r~  r  r‚  ra   rb   r‡  rŒ  r  r¡   r¶  rŸ  r¢  r¤  r•  r¬  r¯  r°  r³  r´  r·  r¹  r¼  r½  rÁ  rÃ  rÄ  rÅ  rÌ  rÏ  rÐ  rÔ  r×  rØ  rÚ  rÛ  rß  rá  râ  rã  ræ  rç  rê  rë  rì  rö  rù  rú  r  r  r
  r  r  r  r  r_   r    r    r@   r!   rì   þ  s8  



%





	


   ý
K
	



	
	  ÿ

	
"
 rì   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚUnregisterTestc                 C   sD   t  d¡t  d¡t  d¡t ¡ dœ| _tdd„ | j ¡ D ƒƒ| _d S )Nr   rý  ræ   )rß   r   ré   r¡  c                 s   s   | ]\}}||  ¡ fV  qd S rB   )r8   )rR  ÚkÚvr    r    r!   rU  ö  s     z'UnregisterTest.setUp.<locals>.<genexpr>)r   r6   ra   rb   ÚpatchersÚdictr«   Úmocksr?   r    r    r!   r4   ð  s    üzUnregisterTest.setUpc                 C   s   | j  ¡ D ]}| ¡  q
d S rB   )r  ÚvaluesrC   rD   r    r    r!   rE   ø  s    zUnregisterTest.tearDownc                 C   sR   t  ¡ | jd j_| jd ƒ }d|j_t  ¡ }t  ¡ }t ||¡}|  |d¡ d S )Nr   r¡  FzDeactivation aborted.)	r   r   r   rÿ  r   ru   r   Ú
unregisterr   )r   rÅ   rP   ro  Úresr    r    r!   Útest_abort_unregisterü  s    z$UnregisterTest.test_abort_unregisterc                 C   s®   t  ¡ }dg|j_|| jd j_t  ¡ df| jd _t  ¡ }|| jd j_t  ¡ }t  ¡ }t ||¡}|  	|d k¡ |  	|j
jj¡ d}|  	|| jd ƒ jjd d k¡ d S )	Nrþ  r   r  rß   ré   zAccount deactivated.r¡  r   )r   rŸ   rJ   r   r   rÿ  r  r   r"  rs   r¸   Údeactivate_registrationr|   rÀ   rä   ©r   r  r  rP   ro  r#  Úmr    r    r!   Útest_unregister  s    
zUnregisterTest.test_unregisterc                 C   st   t  ¡ }g |j_|| jd j_t  ¡ }|| jd j_t  ¡ }t  ¡ }t ||¡}d}|  	||¡ |  
|jjj¡ d S )Nr   ré   z.Could not find existing account to deactivate.)r   rŸ   rJ   r   r   rÿ  r  r   r"  r   rk   r¸   r%  r|   r&  r    r    r!   Útest_unregister_no_account  s    z)UnregisterTest.test_unregister_no_accountN)r#   r$   r%   r4   rE   r$  r(  r)  r    r    r    r!   r  ï  s
   r  c                   @   s"   e Zd ZdZe d¡dd„ ƒZdS )ÚMakeOrVerifyNeededDirsz2Tests for certbot.main.make_or_verify_needed_dirs.zcertbot.main.utilc                 C   sp   t  | j¡ | jj| jjfD ]}|j |tj| jj	¡ q| jj
| jj| jjf}|D ]}|jj|| jj	d qRd S )N)rd  )r   Zmake_or_verify_needed_dirsrP   rï   rð   Zset_up_core_dirZassert_any_callr   ZCONFIG_DIRS_MODEZstrict_permissionsZrenewal_pre_hooks_dirZrenewal_deploy_hooks_dirZrenewal_post_hooks_dirZmake_or_verify_dir)r   Z	mock_utilZcore_dirZ	hook_dirsZhook_dirr    r    r!   Útest_it0  s      þþ ÿzMakeOrVerifyNeededDirs.test_itN)r#   r$   r%   r&   r   r6   r+  r    r    r    r!   r*  -  s   r*  c                       sž  e Zd ZdZ‡ fdd„Zdd„ Zdd„ Ze d¡e d	¡e d
¡e d¡dd„ ƒƒƒƒZ	e d¡e d	¡e d
¡e d¡dd„ ƒƒƒƒZ
e d	¡e d
¡e d¡dd„ ƒƒƒZe d	¡e d
¡e d¡dd„ ƒƒƒZe d
¡e d¡dd„ ƒƒZdd„ Ze d¡e d
¡e d¡dd„ ƒƒƒZe d	¡e d
¡e d¡e d¡e ¡ dd„ ƒƒƒƒƒZe d	¡e d
¡e d¡e d¡e ¡ dd„ ƒƒƒƒƒZd d!„ Z‡  ZS )"ÚEnhanceTestzTests for certbot.main.enhance.c                    s8   t t| ƒ ¡  t ¡ | _| j ¡ | _tj	t
jd| _d S ©N)Úspec)r3   r,  r4   ra   rb   rc   r8   rd   r   rŸ   r   ÚAutoHSTSEnhancementÚmockinstallerr?   r@   r    r!   r4   E  s    
zEnhanceTest.setUpc                 C   s   | j  ¡  d S rB   re   r?   r    r    r!   rE   K  s    zEnhanceTest.tearDownc                 C   s¶   t j ¡ }t t ||¡¡}t d¡†}dg|_	t d¡h}dg|_	t d¡J}t 
¡ }||_||_	t ||¡ |W  5 Q R £ W  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X W 5 Q R X d S )Nr5  rp   ro   r)   )r   rI   rJ   r   rK   r   rL   r   r6   r   rŸ   rP   r   Úenhance)r   rN   rO   rP   Z
mock_certsZmock_domr<   rÝ   r    r    r!   rQ   N  s    

ÿzEnhanceTest._callr  rn   z&certbot.main.display_ops.choose_valuesz&certbot.main._find_domains_or_certnamec              	   C   sh   t jdd|_dg|_d|_t  d¡8}|  ddg¡ |  |j¡ |  d|jd	 d
 k¡ W 5 Q R X d S )Nú/tmp/nonexistent©r&  rp   ©NNr  r1  ú
--redirectr   r   r/   )r   rŸ   r   r6   rQ   rs   r|   rä   )r   Ú	mock_findr]   r   r#  Ú	mock_pickr    r    r!   Útest_selection_question^  s    z#EnhanceTest.test_selection_questionc              
   C   s   t jdd|_dg|_d|_t  d¡` t  d¡J}|  ddd	d
g¡}|  |j¡ |  d|jd d k¡ |  |jj¡ W 5 Q R X W 5 Q R X d S )Nr2  r3  rp   r4  r  z$certbot.main.plug_sel.logger.warningr1  rq  rÑ  r5  z
make senser   )	r   rŸ   r   r6   rQ   rs   r|   rä   Úenhance_config)r   r6  r]   r   r#  Zmock_logrÝ   r    r    r!   Útest_selection_auth_warningl  s    z'EnhanceTest.test_selection_auth_warningc              	      s®   t jdd|_dg|_t  d¡„ |  dddg¡‰ dd	g}d
g}|  ˆ jj¡ |  t‡ fdd„|D ƒƒ¡ |  	t
‡ fdd„|D ƒƒ¡ |  dˆ jjd d k¡ W 5 Q R X d S )Nr2  r3  rp   r  r1  r5  ú--hstsZredirectZhstsZuirc                    s   g | ]}t ˆ j|ƒ‘qS r    ©ÚgetattrrP   ©rR  ru  ©rÝ   r    r!   Ú
<listcomp>‡  s     z8EnhanceTest.test_enhance_config_call.<locals>.<listcomp>c                    s   g | ]}t ˆ j|ƒ‘qS r    r<  r>  r?  r    r!   r@  ‰  s     r   )r   rŸ   r   r6   rQ   rs   r9  r|   Úallrk   Úanyrä   )r   r#  r]   r   Zreq_enhZnot_req_enhr    r?  r!   Útest_enhance_config_call{  s     ÿÿÿz$EnhanceTest.test_enhance_config_callc              	   C   s\   t jdd|_dg|_t  d¡2 |  ddddg¡}|  |jj¡ |  |j¡ W 5 Q R X d S )	Nr2  r3  rp   r  r1  r5  r;  z--non-interactive)	r   rŸ   r   r6   rQ   rs   r9  r|   rk   )r   r#  r]   r   rÝ   r    r    r!   Útest_enhance_noninteractive  s    ÿ ÿz'EnhanceTest.test_enhance_noninteractivec              	   C   s8   g |_ t d¡ |  tj| jdddg¡ W 5 Q R X d S )Nr  r1  r5  r;  )r   r   r6   r[   r   rˆ   rQ   )r   r#  r]   r    r    r!   Útest_user_abort_domainsš  s    þz#EnhanceTest.test_user_abort_domainsc                 C   s   |   tj| jdddg¡ d S )Nr1  rq  r   )r[   r   r:  rQ   r?   r    r    r!   Útest_no_enhancements_defined£  s     ÿz(EnhanceTest.test_no_enhancements_definedrX   c                 C   s8   dg|_ d|_ t ¡ |_|  ddg¡}|  |jj¡ d S )Nrp   r4  r1  r;  )r   r   rs  ri   rQ   rk   r9  r|   )r   r#  r]   r7  rÝ   r    r    r!   r  §  s
    
z'EnhanceTest.test_plugin_selection_errorr  c                 C   s`   | j |_ddg|_tjdd|_|  ddg¡ |  | j jj¡ |  | j jj	d d ddg¡ d S )	Nrp   úanother.tldr2  r3  r1  ú--auto-hstsr   r-   )
r0  r   r   rŸ   rQ   rs   Zenable_autohstsr|   r   rä   ©r   r  r#  r6  r]   r   r    r    r!   Útest_enhancement_enable±  s    
ÿz#EnhanceTest.test_enhancement_enablec                 C   sB   t  | jd¡|_ddg|_tjdd|_|  tj| j	ddg¡ d S )Nr   rp   rG  r2  r3  r1  rH  )
r   rY   rP   r   r   rŸ   r[   r   r\   rQ   rI  r    r    r!   Ú%test_enhancement_enable_not_supported¿  s    
 þz1EnhanceTest.test_enhancement_enable_not_supportedc                 C   s   |   tj| jdddg¡ d S )Nr1  rH  r;  )r[   r   rˆ   rQ   r?   r    r    r!   Ú test_enhancement_enable_conflictÌ  s
     þz,EnhanceTest.test_enhancement_enable_conflict)r#   r$   r%   r&   r4   rE   rQ   r   r6   r8  r:  rC  rD  rE  rF  r  ra   rb   rJ  rK  rL  r_   r    r    r@   r!   r,  B  sV   

	r,  c                       sX   e Zd ZdZ‡ fdd„Ze d¡e d¡dd„ ƒƒZe d¡e d¡dd	„ ƒƒZ‡  Z	S )
ÚInstallTestzTests for certbot.main.install.c                    s"   t t| ƒ ¡  tjtjd| _d S r-  )r3   rM  r4   r   rŸ   r   r/  r0  r?   r@   r    r!   r4   Õ  s    zInstallTest.setUpr  r  c                 C   sD   t  | jd¡|_tj ¡ }d| j_d| j_|  	t
jtj| j|¡ d S )Nr   TZnonexistent)r   rY   rP   r   r   rI   rJ   rZ   r   r[   r   r\   r   r  ©r   r6  r#  rO   r    r    r!   Ú&test_install_enhancement_not_supportedÙ  s    
 þz2InstallTest.test_install_enhancement_not_supportedc                 C   sL   | j |_tj ¡ }d| j_d | j_d| j_d| j_	|  
tjtj| j|¡ d S )NTr2  )r0  r   r   rI   rJ   rP   rZ   r   r(  rÉ   r[   r   rv   r   r  rN  r    r    r!   Ú$test_install_enhancement_no_certnameä  s    
 þz0InstallTest.test_install_enhancement_no_certname)
r#   r$   r%   r&   r4   r   r6   rO  rP  r_   r    r    r@   r!   rM  Ò  s   	rM  Ú__main__)Er&   Z
__future__r   r¡   rP  rÜ  r’   rä  rÞ  r“  ZunittestZjosepyrñ  r   r¢   r  Z	six.movesr   Zacme.magic_typingr   Zcertbot.tests.utilZtestsr   ra   r  r   r   r   r   r	   r   r   r   r   Zcertbot.compatr   r   Zcertbot.pluginsr   r   r   r   r}  r”   r÷  ry  rø  ZJWKRSArò  Zload_vectorr¤   rð  rï  ZTestCaser   ZConfigTestCaser'   r`   r   ZTempDirTestCaser‹   r¾   rÕ   rì   r  r*  r,  rM  r#   r    r    r    r!   Ú<module>   sz   






@TdkD       x>  
