a }|ägm­ã@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úH/usr/lib/python3.9/site-packages/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)rrDZ 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é é )rri©rr rrrÚ_write_out_ex_kinds©s z)BaseRenewableCertTest._write_out_ex_kinds)N)r=r>r?r@rrirmÚ __classcell__rrrZrrBos & 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-dQS)RÚRenewableCertTestsrc CsH|jjdksJ‚tD].}t|j|ƒtj |jjdd|d¡ksJ‚qdS)NrrErG) rWÚ lineagenamerr rrMrNrOrPrlrrrÚ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:rDrQrRrrMrNrOrPrSrrrrsrrtrV)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:rDrmrTrrArVrSrOÚ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:rDrmrTrrrArVrSrOÚinfor~Ú call_argsrrrrÚ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)rWrwÚ _consistentrrrrrarMrNr rOrPr ryrr)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)NrwérFrz cert17.pemr)rirrMÚsamefilerWÚcurrent_targetrNrOrPr rwrarr)rrrrrÚtest_current_targets* þÿÿÿ(þÿz&RenewableCertTests.test_current_targetc Cs\dD]}| d|¡qt |jj¡t tj ddddd¡|jj¡|j d¡dksXJ‚dS)N)ééé érwr…rFrz cert10.pemrŽ) rirr rWrwrarMrNÚcurrent_version)rrfrrrÚtest_current_version'sÿÿz'RenewableCertTests.test_current_versioncCs|j d¡dusJ‚dS)Nrw)rWrrrrrÚ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Œérr^éérwryrˆé)ÚrangerrirWÚlatest_common_versionZnext_free_version©rrfr 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})rr€Z 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) NrŒr“rwér^érrxryi¸ z chain3000.pem) r—rrirWrÚ_update_link_torrMÚbasenamerÚreadlinkrxr™rrrÚtest_update_link_toZs ÿz&RenewableCertTests.test_update_link_tocCs.| dd¡dtj |j dd¡¡ks*J‚dS)Nrwrjz cert8.pemr•)rirrMr¢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©NrŒr“r)r—rrirWrr˜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)NryÚ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.unlinkrj© rr rmrrAÚ side_effectrrrsrª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)Nry)rrMr¢rª)rMr«rrrr¬“szQRenewableCertTests.test_update_all_links_to_full_failure..unlink_or_raiser­rjrkr®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—rrirWrr›rœr™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)Nrwrjzcert-san_512.pemú example.comzwww.example.com) riÚ test_utilÚ load_vectorrWÚnamesrr rwrrrsrrtrrrrÚ 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.rŒr“rŸsnew certó new chainrwznew certrxz new chainryznew certnew chainr^r”sagains newer chainr•shellos other chain)r“r”r•z privkey3.pemé slastsattemptrŽZ lastattemptz .conf.newrz)We previously crashed while writing me :(swithóaskey)r¯r—rrirWr›Úsave_successorrOrr{ÚreadrrMÚislinkr¢rr£Úavailable_versionsÚlistrrNÚrenewal_configs_dirrprÚexists)rÚmock_rvrfr 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..rŒr^r_i$ónewcertrÑr ó new_privkeyrŸi¤éé) r¯rrirWr›rÚ check_moder{rerÔ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..rŒrÞrÑFr rß)r¯rrirWr›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_pathrryrÕÚmkdirÚdefault_archive_dirÚshutilÚcopytreerrrsrrt)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µrwr^rx) r:rDr$rrrsrrtrVrë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ˆ) rrrsrrtrWrŠrr{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) NrŒrwrxTrFz(certbot._internal.storage.logger.warningz-An error occurred determining the OCSP status) rrirWr˜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Órkré;é)ZtzinfoiÜrŽr–éé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:rDrrrsrrtrVrTrSrOrrar©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})rrMrNrOrPrrrrerr:rDZwrite_renewal_configrÕrcÚ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àtD]}| |d¡qt d¡"}|j ¡| ¡Wdƒn1sH0YtD] }tddƒD]}| ||¡qdqVt d¡J}|j ¡|jdt tƒks¤J‚d|j dddvs¾J‚Wdƒn1sÒ0YdS)NrŒzcertbot.compat.os.unlinkr r•z1.pemr) rrirrArWÚtruncateZassert_not_calledr—rÚlenZcall_args_list)rr r±rÜrrrÚ test_truncateIs  &  z RenewableCertTests.test_truncateN).r=r>r?r@rqrvrzrr„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÷rrr r rrrrrrro¯sd  *    +   9   5   * !rocs`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 rXrZrrr\s" ÿ    ÿ  ÿ   ÿzDeleteFilesTest.setUpcCsHddlm}t d¡| |jd¡Wdƒn1s:0YdS)NrrCr|r)r:rDrrAZ delete_filesrOr rrrr%ls  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_filesqs ÿ  ÿ   ÿ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)rrTrSrrrrsrrtr%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ÚremoverTrSrrrsrrtr%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© rrrMrNrOrìr%rÚrTrSrPrrrrÚtest_no_cert_fileŽs  ÿ ÿ   ÿ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%rrr r"r#r$r&rnrrrZrrZs      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) rKrrTrrmrrMrNrOrPryZ cert_pathrrZrrr¸s  ÿzCertPathForCertNameTest.setUpcCsddlm}|||ƒS)Nr)Úcert_path_for_cert_name)r"r()rZ cli_configZcertnamer(rrrr%Às zCertPathForCertNameTest._callcCs| |jd¡|jksJ‚dSr)r%rOryrrrrÚtest_simple_cert_nameÄsz-CertPathForCertNameTest.test_simple_cert_namecCs>t tj¡| |jd¡Wdƒn1s00YdS)Nzfake-example.org)rrrsrrtr%rOrrrrÚtest_no_such_cert_nameÇsz.CertPathForCertNameTest.test_no_such_cert_name) r=r>r?r@rr%r)r*rnrrrZrr'¶s  r'Ú__main__rŒ)&r@r¿rïrÚsysZunittestrrQrrrÁrrrr"rZcertbot.compatrrZcertbot.tests.utilZtestsÚutilr¶Z load_certZCERTrrZTestCaserZConfigTestCaserBrorr'r=ÚexitÚmainÚargvÚ__file__rrrrÚs>       I@0\