a ‚oeP°ã@sBdZddlZddlZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl m Z ddl m Z ddl mZddlmZddlmZddlmmZe d ¡Zd d „Zd d „ZGdd„dejƒZGdd„dejƒZGdd„deƒZGdd„deƒZGdd„deƒZ e!dkr>e "e #ej$dd…e%g¡¡dS)ú$Tests for certbot._internal.storage.éN)Úmock)Ú configuration)Úerrors)ÚALL_FOUR)Ú filesystem)Úosú cert_512.pemcCstD]}t t||ƒ¡qdS)z9Unlink all four items associated with this RenewableCert.N)rrÚunlinkÚgetattr)Ú rc_objectÚkind©rúEC:\Program Files\Certbot\pkgs\certbot\_internal\tests\storage_test.pyÚ unlink_allsrc CsHtD]>}tt||ƒdƒ}| |¡Wdƒq1s80YqdS)z9Put dummy data into all four files of this RenewableCert.ÚwN)rÚopenr Úwrite)r r ÚfrrrÚfill_with_sample_datasrc@sReZdZdZdd„Zdd„Ze d¡dd„ƒZd d „Z d d „Z d d„Z dd„Z dS)ÚRelevantValuesTestz4Tests for certbot._internal.storage.relevant_values.cCs&dddœ|_t ¡|_t ¡|j_dS)Nú example.orgZrsa)ÚserverÚkey_type)ÚvaluesrZ MagicMockÚ mock_configÚ set_by_user©ÚselfrrrÚsetUp)s  zRelevantValuesTest.setUpcCs ddlm}||jj_||jƒS)Nr©Úrelevant_values)Úcertbot._internal.storager!rÚto_dictÚ return_value)rrr!rrrÚ_call.s  zRelevantValuesTest._callz8certbot._internal.plugins.disco.PluginsRegistry.find_allcCs:dg|_d|jj_d|jd<| |j ¡¡|jks6J‚dS)Nzcertbot-foo:barTé*zcertbot_foo:bar_baz)r$rrrr%Úcopy)rZ mock_find_allrrrÚtest_namespace3s  z!RelevantValuesTest.test_namespacecCsTd|jj_d|jd<d|jd<d|jd<|j ¡}d|jd<| |j¡|ksPJ‚dS) NTÚallow_subset_of_namesÚapacheÚ authenticatori9Ú rsa_key_sizeZthereZhello©rrr$rr'r%©rÚexpected_relevant_valuesrrrÚtest_option_set;s      z"RelevantValuesTest.test_option_setcCs6d|jj_|j ¡}d|jd<| |j¡|ks2J‚dS)NFir,r-r.rrrÚtest_option_unsetFs   z$RelevantValuesTest.test_option_unsetcs|d‰‡fdd„|j_|j ¡}d|jˆ<| |j¡|ksPóz9RelevantValuesTest.test_deprecated_item..TF)rrrr'r%r.rr3rÚtest_deprecated_itemNs    z'RelevantValuesTest.test_deprecated_itemcCsrddlm}ddlm}ddlm}ddlm}|j ¡}|  |gd¢¡}|j ddd d d œ}||ƒ|ksnJ‚dS) Nrr )Údisco)Úcli)Ú constants)z--allow-subset-of-namesz--authenticatorr*rZecdsaTr*)rrr)r+) r"r!Zcertbot._internal.pluginsr7Úcertbot._internalr8r9ZPluginsRegistryZfind_allZprepare_and_parse_argsZ CLI_DEFAULTS)rr!r7r8r9ZPLUGINSÚ namespacer/rrrÚtest_with_real_parserZs     üz(RelevantValuesTest.test_with_real_parserN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr%rÚpatchr(r0r1r6r<rrrrr&s   rcs2eZdZdZ‡fdd„Zd dd„Zdd„Z‡ZS) ÚBaseRenewableCertTestz¿Base class for setting up Renewable Cert tests. .. note:: It may be required to write out self.config for your test. Check :class:`.cli_test.DuplicateCertTest` for an example. csšddlm}tƒ ¡t tj |j j dd¡¡tj |j j dd¡}t |¡t tj |j j d¡¡t   ¡}t D]&}tj |j j dd|d¡}|||<qrttj |j j ddd¡d ƒWdƒn1sÌ0Y||d<tj |j j dd ¡|_| ¡||_ttj |j j dd ¡d ƒ}| d ¡Wdƒn1s>0Yt   ¡|_t d¡(}d|_| |j|j ¡|_Wdƒn1sŒ0YdS)Nr©ÚstorageÚliverÚarchiveZrenewalú.pemÚREADMEÚaúexample.org.confz IGNORE.THISrzThis file should be ignored!z7certbot._internal.storage.RenewableCert._check_symlinksT)r:rDÚsuperrrÚmakedirsrÚpathÚjoinÚconfigÚ config_dirÚ configobjÚ ConfigObjrrÚfilenamerÚ config_fileÚdefaultsrrAr$Ú RenewableCertÚtest_rc)rrDÚ archive_pathrTr Ú kind_pathZjunkÚcheck©Ú __class__rrrws<   ÿ ÿÿÿ*  zBaseRenewableCertTest.setUpNc Cs¬t|j|ƒ}tj |¡r"t |¡t tj tjjtjjddd  ||¡¡|¡t |dƒ,}|  |durp|  d¡n|¡Wdƒn1sŠ0Y|dkr¨t  |d¡dS)NrFrz {0}{1}.pemÚwbÚasciiÚprivkeyé€)r rWrrMÚlexistsr ÚsymlinkrNÚpardirÚformatrrÚencoderÚchmod)rr ÚverÚvalueÚlinkrrrrÚ_write_out_kinds    ÿþ :z%BaseRenewableCertTest._write_out_kindcCs&tD]}| |d¡| |d¡qdS)Né é )rrj©rr rrrÚ_write_out_ex_kinds©s z)BaseRenewableCertTest._write_out_ex_kinds)N)r=r>r?r@rrjrnÚ __classcell__rrr[rrBos & rBc@sÈeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z e d¡dd„ƒZdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zej ejd'¡e d(¡d)d*„ƒƒZd+d,„Zej ejd'¡e d-¡d.d/„ƒƒZe d0¡d1d2„ƒZe  d3¡e d0¡d4d5„ƒƒZ!e d0¡e d6¡d7d8„ƒƒZ"e d0¡d9d:„ƒZ#e d0¡d;d<„ƒZ$e d=¡d>d?„ƒZ%d@dA„Z&e dB¡dCdD„ƒZ'dEdF„Z(dGdH„Z)dIdJ„Z*dKdL„Z+dMdN„Z,dOdP„Z-dQdR„Z.dSS)TÚRenewableCertTestsrc CsH|jjdksJ‚tD].}t|j|ƒtj |jjdd|d¡ksJ‚qdS)NrrErG) rWÚ lineagenamerr rrMrNrOrPrmrrrÚtest_initialization²s ÿz&RenewableCertTests.test_initializationcCsÔddlm}tj |jjd¡}t|dƒ}| d¡Wdƒn1sH0Yt   t j ¡|  ||j¡Wdƒn1s‚0Yt |¡t   t j ¡|  d|j¡Wdƒn1sÆ0YdS)z€Test that the RenewableCert constructor will complain if the renewal configuration file doesn't end in ".conf" rrCz broken.confrz[No closing bracket for you!NZfun)r:rDrrMrNrOrPrrÚpytestÚraisesrÚCertStorageErrorrVr )rrDÚbrokenrrrrÚtest_renewal_bad_config¸s  (, z*RenewableCertTests.test_renewal_bad_configcCsˆddlm}t ¡}d|d<d|d<d|d<tj |jjd ¡|_ |  ¡t   t j¡ | |j |j¡Wd ƒn1sz0Yd S) zƒTest that the RenewableCert constructor will complain if the renewal configuration file is missing a required file element.rrCzimaginary_cert.pemÚcertzimaginary_chain.pemÚchainzimaginary_fullchain.pemÚ fullchainzimaginary_config.confN)r:rDrQrRrrMrNrOrPrSrrsrtrrurV)rrDrOrrrÚtest_renewal_incomplete_configÇs z1RenewableCertTests.test_renewal_incomplete_configcCsrddlm}| ¡d|jvs"J‚t d¡"}| |jj|j¡Wdƒn1sT0Y|j j dusnJ‚dS)NrrCÚversionú certbot._internal.storage.loggerF) r:rDrnrTrrArVrSrOÚwarningÚcalled©rrDÚ mock_loggerrrrÚtest_no_renewal_versionÕs   0z*RenewableCertTests.test_no_renewal_versioncCsŒddlm}| ¡d|jd<|j ¡t d¡"}| |jj|j ¡Wdƒn1sZ0Y|j j spJ‚d|j j ddvsˆJ‚dS)NrrCz99.99.99r|r}) r:rDrnrTrrrArVrSrOÚinforÚ call_argsr€rrrÚtest_renewal_newer_versionßs    0 z-RenewableCertTests.test_renewal_newer_versionc Csº|jj}d|j_|j ¡rJ‚||j_|j ¡r4J‚t|jƒ|j ¡rLJ‚t|jƒtD]&}t tj  d|d¡t |j|ƒ¡qZ|j ¡rJ‚t|jƒtD]*}t tj  |j j |d¡t |j|ƒ¡qž|j ¡rØJ‚t|jƒtD],}t tj  dddd|d¡t |j|ƒ¡qæ|j ¡r$J‚t|jƒ|j ¡s>J‚t  |jj¡t tj  ddddd¡|jj¡t|jjdƒ}| d¡Wdƒn1sœ0Y|j ¡r¶J‚dS) Nz relative/pathú..z17.pemrFrzfullchain_17.pemrzwrongly-named fullchain)rWrxÚ _consistentrrrrrbrMrNr rOrPr rzrr)rZoldcertr rrrrÚtest_consistentësL   ÿ  ÿ ÿ þ ÿÿ*z"RenewableCertTests.test_consistentc CsÐ| dd¡tj |j d¡tj |jjddd¡¡s8J‚t  |jj ¡t  tj |jjddd¡|jj ¡t |jj dƒ}|  d¡Wdƒn1s–0Ytj |j d¡tj |jjddd¡¡sÌJ‚dS)NrxérFrz cert17.pemr)rjrrMÚsamefilerWÚcurrent_targetrNrOrPr rxrbrr)rrrrrÚtest_current_targets* þÿÿÿ(þÿz&RenewableCertTests.test_current_targetc Cs\dD]}| d|¡qt |jj¡t tj ddddd¡|jj¡|j d¡dksXJ‚dS)N)ééé érxr†rFrz cert10.pemr) rjrr rWrxrbrMrNÚcurrent_version)rrgrrrÚtest_current_version'sÿÿz'RenewableCertTests.test_current_versioncCs|j d¡dusJ‚dS)Nrx)rWr‘rrrrÚtest_no_current_version/sz*RenewableCertTests.test_no_current_versioncCsâtddƒD]}tD]}| ||¡qq |j ¡dks8J‚|j ¡dksJJ‚| dd¡|j ¡dkshJ‚|j ¡dkszJ‚| dd¡| dd¡|j ¡dks¤J‚tD]}| |d ¡q¨|j ¡d ksÌJ‚|j ¡d ksÞJ‚dS) NrérŽr_éérxrzr‰é)ÚrangerrjrWÚlatest_common_versionZnext_free_version©rrgr rrrÚtest_latest_and_next_versions2s   z0RenewableCertTests.test_latest_and_next_versionsr}cCsœt ¡}|j_t ¡}|j_t ¡|j_d|_|j ¡dusDJ‚|jdksRJ‚|j jdksbJ‚d|_|j ¡duszJ‚|jdksˆJ‚|j jdks˜J‚dS)NFTrr) rZMockrWÚupdate_all_links_toÚhas_pending_deploymentr™r$Zensure_deployedÚ call_countr~)rrZ mock_updateZmock_has_pendingrrrÚtest_ensure_deployedIs z'RenewableCertTests.test_ensure_deployedcCsÖtddƒD].}tD]$}| ||¡||j |¡ksJ‚qq |j dd¡|j dd¡d|j d¡ksjJ‚d|j d¡ks~J‚d|j d¡ks’J‚d|j d ¡ks¦J‚|j dd ¡tj t   |jj ¡¡d ksÒJ‚dS) Nrr”rxér_érŽryrzi¸ z chain3000.pem) r˜rrjrWr‘Ú_update_link_torrMÚbasenamerÚreadlinkryršrrrÚtest_update_link_toZs ÿz&RenewableCertTests.test_update_link_tocCs.| dd¡dtj |j dd¡¡ks*J‚dS)Nrxrkz cert8.pemr–)rjrrMr£rWr|rrrrÚ test_versionms ÿzRenewableCertTests.test_versioncCsœtddƒD].}tD]$}| ||¡||j |¡ksJ‚qq |j ¡dksLJ‚tddƒD]@}|j |¡tD]}||j |¡ksjJ‚qj|j ¡dksVJ‚qVdS©Nrr”rŽ)r˜rrjrWr‘r™rœršrrrÚ test_update_all_links_to_successus  z3RenewableCertTests.test_update_all_links_to_successc Csžtjfdd„}| ¡t d¡L}||_t t¡|j   d¡Wdƒn1sT0YWdƒn1sr0Yt D]}|j   |¡dks€J‚q€dS)NcSs.tj |¡}d|vr"| d¡r"t‚||ƒdS)NrzÚprev)rrMr£Ú startswithÚ ValueError)rMÚ real_unlinkr£rrrÚunlink_or_raise‚s zTRenewableCertTests.test_update_all_links_to_partial_failure..unlink_or_raiseú#certbot._internal.storage.os.unlinkrk© rr rnrrAÚ side_effectrsrtr«rWrœrr‘©rr­Ú mock_unlinkr rrrÚ(test_update_all_links_to_partial_failures  Hz;RenewableCertTests.test_update_all_links_to_partial_failurec Csžtjfdd„}| ¡t d¡L}||_t t¡|j   d¡Wdƒn1sT0YWdƒn1sr0Yt D]}|j   |¡dks€J‚q€dS)NcSs dtj |¡vrt‚||ƒdS)Nrz)rrMr£r«)rMr¬rrrr­“szQRenewableCertTests.test_update_all_links_to_full_failure..unlink_or_raiser®rkrlr¯r±rrrÚ%test_update_all_links_to_full_failure’s  Hz8RenewableCertTests.test_update_all_links_to_full_failurecCsžtddƒD].}tD]$}| ||¡||j |¡ksJ‚qq tddƒD]T}|j |¡tD]}||j |¡ksXJ‚qX|dkrŠ|j ¡s˜J‚qD|j ¡rDJ‚qDdSr§)r˜rrjrWr‘rœrršrrrÚtest_has_pending_deployment¢s  z.RenewableCertTests.test_has_pending_deploymentcCsr| ddt d¡¡|j ¡ddgks*J‚t |jj¡t  t j ¡|j ¡Wdƒn1sd0YdS)Nrxrkzcert-san_512.pemú example.comzwww.example.com) rjÚ test_utilÚ load_vectorrWÚnamesrr rxrsrtrrurrrrÚ test_names°sÿzRenewableCertTests.test_namesrz"certbot._internal.storage.datetimec Cst d¡}| ¡|j d¡t|jjdƒ}| |¡Wdƒn1sL0Y|j d¡t|jjdƒ}| |¡Wdƒn1s0Ytj |_ d|_ i|jj d<dD]B\}}}tj  |t j¡}||jj_ ||jj d <|j ¡|ks¸J‚q¸dS) z.rr”r snew certó new chainrxznew certryz new chainrzznew certnew chainr_r•sagains newer chainr–shellos other chain)r”r•r–z privkey3.pemé slastsattemptrZ lastattemptz .conf.newrz)We previously crashed while writing me :(swithóaskey)r°r˜rrjrWrœÚsave_successorrOrr|ÚreadrrMÚislinkr£rr¤Úavailable_versionsÚlistr‘rNÚrenewal_configs_dirrqrÚexists)rÚmock_rvrgr rÚiZtemp_config_filerrrÚtest_save_successorsl  ÿ ..2ÿ ÿ   ÿ  ÿ   ÿ 2 ÿÿ *ÿ z&RenewableCertTests.test_save_successorz:Group/everybody permissions are not maintained on Windows.cCsdd„|_tD]}| |d¡q|j d¡t |j dd¡d¡sFJ‚t |j dd¡d¡|j  dddd|j ¡t |j dd ¡d¡sŒJ‚|j  d dd d|j ¡t |j dd ¡d ¡s¼J‚t |j dd ¡d ¡|j  d dd d|j ¡t |j dd¡d¡sJ‚dS)NcSs| ¡SrÎrÏrÐrrrr4Br5zMRenewableCertTests.test_save_successor_maintains_group_mode..rr_r`i$ónewcertrÒr¡ó new_privkeyr i¤éé) r°rrjrWrœrÚ check_moder|rfrÕrO)rrÜr rrrÚ(test_save_successor_maintains_group_mode=s  z;RenewableCertTests.test_save_successor_maintains_group_modezBcertbot._internal.storage.filesystem.copy_ownership_and_apply_modecCstdd„|_tD]}| |d¡q|j d¡|j dddd|j¡|jdusPJ‚|j dddd|j¡|jspJ‚dS) NcSs| ¡SrÎrÏrÐrrrr4Xr5zFRenewableCertTests.test_save_successor_maintains_gid..rrßrÒFr¡rà)r°rrjrWrœrÕrOr)rZmock_ownershiprÜr rrrÚ!test_save_successor_maintains_gidSs  z4RenewableCertTests.test_save_successor_maintains_gidcCsdd„|_ddlm}|j dddd|j¡}| ¡s8J‚tj  tj  |jj d ¡¡sVJ‚tj  tj  |jj d ¡¡stJ‚tj  tj  |jj dd ¡¡s”J‚t  |jd ¡s¦J‚t|jd ƒ }| ¡d ksÄJ‚Wdƒn1sØ0Y|j dddd|j¡}tj  tj  |jj d¡¡sJ‚tj  tj  |jj dd ¡¡s:J‚t  tj  |jjd¡¡|j dddd|j¡}tj  tj  |jj dd ¡¡sŠJ‚t  |jd ¡sžJ‚t tj  |jj d¡tj  |jj d¡¡t tj¡&|j dddd|j¡Wdƒn1s0Yt tj  |jj d¡tj  |jj d¡¡t tj¡&|j dddd|j¡Wdƒn1sl0Y|j dddd|j¡}dS) z$Test for new_lineage() class method.cSs| ¡SrÎrÏrÐrrrr4fr5z5RenewableCertTests.test_new_lineage..rrCúthe-lineage.comscertsprivkeyschainúthe-lineage.com.confrHr`Úrbs certchainNócert2óprivkey2óchain2zthe-lineage.com-0001.confzthe-lineage.com-0001zthe-lineage.com-0002scert3sprivkey3schain3zthe-lineage.com-0003scert4sprivkey4schain4zother-example.comscert5sprivkey5schain5)r°r:rDrVÚ new_lineagerOr‡rrMrÛrNrÚÚlive_dirrrãZkey_pathrrzrÖÚmkdirÚdefault_archive_dirÚshutilÚcopytreersrtrru)rrÜrDrÇrrrrÚtest_new_lineageash   ÿ  ÿ  ÿ   ÿ . ÿ ÿ   ÿ  ÿ  ÿ ÿ ÿ$ÿ ÿ$ ÿz#RenewableCertTests.test_new_lineagecCs¸dd„|_ddlm}t |jj¡t |jj¡t |jj¡|j   dddd|j¡t j   t j  |jjd ¡¡stJ‚t j   t j  |jjdd ¡¡s”J‚t j   t j  |jjdd ¡¡s´J‚d S) z9Test that directories can be created if they don't exist.cSs| ¡SrÎrÏrÐrrrr4œr5zFRenewableCertTests.test_new_lineage_nonexistent_dirs..rrCrærérêrërçz privkey.pemz privkey1.pemN)r°r:rDrðÚrmtreerOrÚrïrírVrìrrMrÛrN)rrÜrDrrrÚ!test_new_lineage_nonexistent_dirs—s&   ÿÿÿ  ÿ   ÿz4RenewableCertTests.test_new_lineage_nonexistent_dirsz2certbot._internal.storage.util.unique_lineage_namecCsXddlm}d|_t tj¡&|j dddd|j ¡Wdƒn1sJ0YdS)NrrC)Zthis_does_not_end_with_dot_confZyikesr¶rxr_ry) r:rDr$rsrtrrurVrìrO)rZmock_ulnrDrrrÚtest_invalid_config_filename­s   ÿz/RenewableCertTests.test_invalid_config_filenamecCs\t tj¡|j d¡Wdƒn1s.0Yt tj¡|j d¡Wdƒn1sf0Yt tj¡|j dd¡Wdƒn1s 0Yt tj¡|j d¡Wdƒn1sØ0Yt tj¡|j  d¡Wdƒn1s0Yt tj¡|j  dd¡Wdƒn1sN0YdS)NZelephantr‰) rsrtrrurWr‹r‘r|rØZnewest_available_versionr¢rrrrÚ test_bad_kindµs**,*,z RenewableCertTests.test_bad_kindz4certbot.ocsp.RevocationChecker.ocsp_revoked_by_pathscCsPtD]}| |d¡q|j ¡}|j d|¡}|j d|¡}d|_|j |¡sRJ‚|jdd|kshJ‚|jdd|ks~J‚d|_|j |¡r”J‚|jdd|ksªJ‚|jdd|ksÀJ‚t|_ t   d¡ }|j |¡râJ‚Wdƒn1sö0Y|jdd|ksJ‚|jdd|ks0J‚|jdd}d|vsLJ‚dS) NrrxryTrFz(certbot._internal.storage.logger.warningz-An error occurred determining the OCSP status) rrjrWr™r|r$Z ocsp_revokedr„r«r°rrA)rZ mock_checkerr r|Zexpected_cert_pathZexpected_chain_pathÚloggerZlog_msgrrrÚtest_ocsp_revokedÄs(  .z$RenewableCertTests.test_ocsp_revokedc )CsÒddlm}tjddddddtjd}tjd d d dd d tjd}t d¡ t dd dddd¡¡}|df||df||df||df|t d¡|df|t d¡|df|t d¡|df|t d¡|df|t d¡|df|t d¡|df|t d¡|df|t d ¡|df|t d¡|df|t d¡|df|t d ¡|df|t d¡|d!f|t d¡|d!f|t d"¡|d#f|t d$¡|d#f|t d$¡i}| ¡D](\}}|\}} |  || ¡|ks¤J‚q¤dS)%NrrCiÓrlré;é)ZtzinfoiÜrr—ééz Asia/Shanghaiißéééé)Úz17 daysr‰Z30éz7 weeksé1z1 monthz1 yearinimz 1 year 1 dayioz 1 year-1 dayilz4 yearsiµ) r:rDrÀrÂrÃÚtimezoneZfromutcrÁÚitemsZadd_time_interval) rrDZtime_1Ztime_2Ztime_3ZintendedÚ parametersZexceptedZ base_timerÆrrrÚtest_add_time_intervalâs>  ÿë ÿz)RenewableCertTests.test_add_time_intervalcCsDi|jjd<|jjdusJ‚|jjd}d|d<|jjdks@J‚dS)Nr»zhttps://acme.example/dirr)rWrr©rZrprrrÚ test_server s   zRenewableCertTests.test_servercCsŒi|jjd<|jjd}|jjdus(J‚d|d<|jjdus@J‚d|d<|jjdusXJ‚d|d<|jjduspJ‚d|d<|jjdusˆJ‚dS) Nr»Fz6https://acme-staging-v02.api.letsencrypt.org/directoryrTz)https://staging.someotherca.com/directoryz.https://acme-v01.api.letsencrypt.org/directoryz.https://acme-v02.api.letsencrypt.org/directory)rWrZ is_test_certrrrrÚtest_is_test_certs  z$RenewableCertTests.test_is_test_certcCs¢ddlm}t tj¡"| |jj|j ¡Wdƒn1s@0Yt   d|jt d¡t tj¡"| |jj|j ¡Wdƒn1s”0YdS)NrrCÚmissing) r:rDrsrtrrurVrTrSrOrrbr©rrDrrrÚtest_missing_cert s  0z$RenewableCertTests.test_missing_certc Cs>tj |jjd¡}tj |jjd¡}t|dƒ}| d¡Wdƒn1sN0Yt |d¡i}t D] }d||<qld}dd i}d d l m }|  |||||¡t|d ƒ}|  ¡} Wdƒn1sÌ0Yd | vsâJ‚d| vsîJ‚d| vsúJ‚d tj¡| vsJ‚t t |¡j¡t t |¡j¡ks:J‚dS)Nz sample-filezsample-file.newrzM[renewalparams] useful = value # A useful value useless = value # Not needed i Z somewhereZ the_archiveZusefulZ new_valuerrCÚrzuseful = new_valuezA useful valueZuselessz version = {0})rrMrNrOrPrrrrfrr:rDZwrite_renewal_configrÖrdÚcertbotÚ __version__ÚstatÚS_IMODEÚlstatÚst_mode) rZtempZtemp2rÚtargetrÑÚ archive_dirZ relevant_datarDZcontentrrrÚtest_write_renewal_config(s* (    &   ÿz,RenewableCertTests.test_write_renewal_configcCsÊddlm}tj |jjdd¡}tD]L}|j|}|d}tj ||¡}t |dƒ  ¡t  tj |jj|¡|¡q$t   tj¡"| |jj|j¡Wdƒn1s¦0Y|j|jj|jdddS) NrrCrFrú1.pemrIT)Zupdate_symlinks)r:rDrrMrNrOrPrrTrÚcloserbrsrtrrurVrS)rrDZarchive_dir_pathr Z live_pathr£rXrrrÚtest_update_symlinksIs   ÿ"ÿz'RenewableCertTests.test_update_symlinkscCsàtD]}| |d¡qt d¡"}|j ¡| ¡Wdƒn1sH0YtD] }tddƒD]}| ||¡qdqVt d¡J}|j ¡|jdt tƒks¤J‚d|j dddvs¾J‚Wdƒn1sÒ0YdS)Nrzcertbot.compat.os.unlinkr¡r–rr) rrjrrArWÚtruncateZassert_not_calledr˜ržÚlenZcall_args_list)rr r²rÝrrrÚ test_truncateXs  &  z RenewableCertTests.test_truncateN)/r=r>r?r@rrrwr{r‚r…rˆrŒr’r“r›rrArŸr¥r¦r¨r³r´rµrºÚobjectrZNamespaceConfigrÈrÌrÍrÞr·Zskip_on_windowsräråròrôrõrörørr r r rrrrrrrrp¯sf  *    +   9   5   * !rpcs`eZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z ‡Z S)ÚDeleteFilesTestz0Tests for certbot._internal.storage.delete_filesc sÂtƒ ¡tD]H}tj |jjdd|d¡}t|dƒWdƒq1sL0Yq|j   ¡tj  tj |jj d¡¡s€J‚tj  tj |jj d¡¡sžJ‚tj  tj |jjdd¡¡s¾J‚dS)NrErrGrIrJrF)rKrrrrMrNrOrPrrTrrÛrÚrí)rr rYr[rrrks" ÿ    ÿ  ÿ   ÿzDeleteFilesTest.setUpcCsHddlm}t d¡| |jd¡Wdƒn1s:0YdS)NrrCr}r)r:rDrrAZ delete_filesrOr rrrr%{s  zDeleteFilesTest._callcCsh| ¡tj tj |jjd¡¡r&J‚tj tj |jjd¡¡rDJ‚tj tj |jjdd¡¡rdJ‚dS)NrJrrF) r%rrMrÛrNrOrÚrírPrrrrÚtest_delete_all_files€s ÿ  ÿ   ÿz%DeleteFilesTest.test_delete_all_filescCs¬t|jjdƒ}| d¡Wdƒn1s.0Yt tj¡| ¡Wdƒn1sb0Yt j   t j   |j jd¡¡sŠJ‚t j   t j   |j jd¡¡r¨J‚dS)NrIZasdfasfasdfasdfrrJ)rrTrSrrsrtrrur%rrMrÛrNrOrírÚ)rrTrrrÚtest_bad_renewal_configŠs(& ÿ  ÿz'DeleteFilesTest.test_bad_renewal_configcCsxt |jj¡t tj¡| ¡Wdƒn1s80Ytj   tj   |j j d¡¡s`J‚tj   |jj¡rtJ‚dS©Nr)rÚremoverTrSrsrtrrur%rMrÛrNrOrírrrrÚtest_no_renewal_config•s& ÿ z&DeleteFilesTest.test_no_renewal_configcCsxt tj |jjdd¡¡| ¡tj |jj ¡r6J‚tj tj |jjd¡¡rTJ‚tj tj |jj dd¡¡rtJ‚dS)Nrzcert.pemrF© rr#rMrNrOrír%rÛrTrSrPrrrrÚtest_no_cert_files  ÿ ÿ   ÿz!DeleteFilesTest.test_no_cert_filecCsxt tj |jjdd¡¡| ¡tj |jj ¡r6J‚tj tj |jjd¡¡rTJ‚tj tj |jj dd¡¡rtJ‚dS)NrrHrFr%rrrrÚtest_no_readme_file§s  ÿ ÿ   ÿz#DeleteFilesTest.test_no_readme_filecCs˜ttj |jjdd¡dƒWdƒn1s00Y| ¡tj |jj ¡rVJ‚tj tj |jjd¡¡stJ‚tj tj |jj dd¡¡r”J‚dS)NrZ other_filerIrF) rrrMrNrOrír%rÛrTrSrPrrrrÚtest_livedir_not_empty±s ÿÿ ÿ   ÿz&DeleteFilesTest.test_livedir_not_emptycCsltj |jjdd¡}t |¡| ¡tj |jj ¡r:J‚tj tj |jj d¡¡rXJ‚tj |¡rhJ‚dS)NrFr) rrMrNrOrPÚrmdirr%rÛrTrSrí)rrrrrÚtest_no_archive¼s  ÿ zDeleteFilesTest.test_no_archive)r=r>r?r@rr%r r!r$r&r'r(r*rorrr[rris      rcs8eZdZdZ‡fdd„Zdd„Zdd„Zdd „Z‡ZS) ÚCertPathForCertNameTestz:Test for certbot._internal.storage.cert_path_for_cert_namecsBtƒ ¡|j ¡| ¡tj |jj ddd¡|_ |j |j_ dS)NrErz fullchain.pem) rKrrTrrnrrMrNrOrPrzZ cert_pathrr[rrrÇs  ÿzCertPathForCertNameTest.setUpcCsddlm}|||ƒS)Nr)Úcert_path_for_cert_name)r"r,)rZ cli_configZcertnamer,rrrr%Ïs zCertPathForCertNameTest._callcCs| |jd¡|jksJ‚dSr")r%rOrzrrrrÚtest_simple_cert_nameÓsz-CertPathForCertNameTest.test_simple_cert_namecCs>t tj¡| |jd¡Wdƒn1s00YdS)Nzfake-example.org)rsrtrrur%rOrrrrÚtest_no_such_cert_nameÖsz.CertPathForCertNameTest.test_no_such_cert_name) r=r>r?r@rr%r-r.rorrr[rr+Ås  r+Ú__main__r)&r@rÀrðrÚsysZunittestrrQrsrÂrrrr"rZcertbot.compatrrZcertbot.tests.utilZtestsÚutilr·Z load_certZCERTrrZTestCaserZConfigTestCaserBrprr+r=ÚexitÚmainÚargvÚ__file__rrrrÚs>       I@?\