a }|g`@sdZddlZddlZddlmZddlZddlZddlZddlm Z ddl Z ddl m Z ddl mZddl mZddlmmZGdd d ejZGd d d ejZGd d d ejZGdddejZGdddejZGdddejZGdddejZGdddejZGdddejZGdddejZGdddejZ GdddejZ!Gd d!d!ejZ"Gd"d#d#ejZ#Gd$d%d%ejZ$Gd&d'd'ejZ%Gd(d)d)ejZ&Gd*d+d+ejZ'e(d,kre)e *ej+d-de,gdS).zTests for certbot.util.N)reload)mock)errors) filesystem)osc@s,eZdZdZeddZddZddZdS) EnvNoSnapForExternalCallsTestz6Tests for certbot.util.env_no_snap_for_external_calls.cCsddlm}|S)Nr)env_no_snap_for_external_calls) certbot.utilr)clsrr E/usr/lib/python3.9/site-packages/certbot/_internal/tests/util_test.py_calls z#EnvNoSnapForExternalCallsTest._callcCsbtjd}tj}d||d<d|d<d|d<tjd|dWdn1sT0YdS) NPATH"RANDOM_NONSENSE_GARBAGE/blah/blah:RANDOM_NONSENSE_GARBAGESNAPTrueCERTBOT_SNAPPEDcertbot.compat.os.environ.copy return_value)renvironcopyrpatch)selfZ original_path env_copy_dictr r r test_removeds   z*EnvNoSnapForExternalCallsTest.test_removedcCstj}d|d|d<|}tjd|d>|dd|ddd|d<|d=d|d<Wdn1st0YdS) Nrrrrrrrr)rrrrrpop)rZenv_copy_dict_unmodifiedrr r r test_noop"s   z'EnvNoSnapForExternalCallsTest.test_noopN)__name__ __module__ __qualname____doc__ classmethodr rrr r r r rs   rc@sReZdZdZeddZedddZedddZ edd d Z d S) RunScriptTestz"Tests for certbot.util.run_script.cCsddlm}||S)Nr) run_script)r r%)r paramsr%r r r r 6s zRunScriptTest._callzcertbot.util.subprocess.runcCs,d|_d|_d|_|dg\}}dS)z.These will be changed soon enough with reload.rstdoutstderrtestN) returncoder'r(r )rmock_runouterrr r r test_default;s zRunScriptTest.test_defaultcCsBt|_ttj|dgWdn1s40YdS)Nr))OSError side_effectpytestraisesrSubprocessErrorr rr+r r r test_bad_processFszRunScriptTest.test_bad_processcCsDd|_ttj|dgWdn1s60YdS)Nr))r*r1r2rr3r r4r r r test_failureMszRunScriptTest.test_failureN) rr r!r"r#r rrr.r5r7r r r r r$4s   r$c@s,eZdZdZeddZddZddZdS) ExeExistsTestz"Tests for certbot.util.exe_exists.cCsddlm}||S)Nr) exe_exists)r r9)r Zexer9r r r r Xs zExeExistsTest._callcCs2tjdddWdn1s$0YdS)N%certbot.util.filesystem.is_executableTrrrrr r r test_exe_exists]szExeExistsTest.test_exe_existscCs2tjdddWdn1s$0YdS)Nr:Frr;r<r r r test_exe_not_existsasz!ExeExistsTest.test_exe_not_existsN)rr r!r"r#r r=r>r r r r r8Us  r8csHeZdZdZeddZfddZededdd Z Z S) LockDirUntilExitz+Tests for certbot.util.lock_dir_until_exit.cOsddlm}||i|S)Nr)lock_dir_until_exit)r r@)r argskwargsr@r r r r hs zLockDirUntilExit._callcs tddl}t|jdS)Nr)supersetUpr reload_moduleutil)rcertbot __class__r r rDms zLockDirUntilExit.setUpzcertbot.util.loggerzcertbot.util.atexit_registercCs^tj|jd}t|||j|||||jdd}ddlm }|dS)Nsubdirr)rF) rpathjointempdirrmkdirr call_argsrGrF)rZ mock_registerZ mock_loggerrJZregistered_funcrFr r r test_itss     zLockDirUntilExit.test_it) rr r!r"r#r rDrrrP __classcell__r r rHr r?fs  r?c@s<eZdZdZddZedddZeddd Zd S) SetUpCoreDirTestz/Tests for certbot.util.make_or_verify_core_dir.cOsddlm}||i|S)Nr)set_up_core_dir)r rS)rrArBrSr r r r s zSetUpCoreDirTest._callz certbot.util.lock_dir_until_exitcCs"tj|jd}||dddS)NnewFrrKrLrMr )rZ mock_lockZnew_dirr r r test_successszSetUpCoreDirTest.test_successzcertbot.util.make_or_verify_dircCsFt|_ttj ||jddWdn1s80YdS)NrUF)r/r0r1r2rErrorr rM)rZmock_make_or_verifyr r r r7szSetUpCoreDirTest.test_failureN) rr r!r"r rrrWr7r r r r rRs  rRcsHeZdZdZfddZddZddZdd Zd d Zd d Z Z S)MakeOrVerifyDirTestzTests for certbot.util.make_or_verify_dir. Note that it is not possible to test for a wrong directory owner, as this testing script would have to be run as root. cs.ttj|jd|_t|jddS)Nfoo)rCrDrrKrLrMrrNr<rHr r rDs zMakeOrVerifyDirTest.setUpcCsddlm}|||ddS)Nr)make_or_verify_dirT)strict)r r\)rZ directorymoder\r r r r s zMakeOrVerifyDirTest._callcCs tj|jd}||ddS)NbarirV)rrKr r r test_creates_dir_when_missings z1MakeOrVerifyDirTest.test_creates_dir_when_missingcCs||jddS)Nr[)r rKr<r r r (test_existing_correct_mode_does_not_failszttj||jdWdn1s00YdS)N)r1r2rrXr rKr<r r r test_existing_wrong_mode_failssz2MakeOrVerifyDirTest.test_existing_wrong_mode_failsc CsptjtdN}t|_tt|ddWdn1sD0YWdn1sb0YdS)Nmakedirsr_i޻) rrobjectrr/r0r1r2r )rrdr r r test_reraises_os_errors z*MakeOrVerifyDirTest.test_reraises_os_error) rr r!r"rDr r`rarcrfrQr r rHr rYs rYcsBeZdZdZfddZd ddZddZd d Zd d ZZ S)UniqueFileTestz#Tests for certbot.util.unique_file.cs ttj|jd|_dS)Nzfoo.txt)rCrDrrKrLrM default_namer<rHr r rDs zUniqueFileTest.setUpr[cCsddlm}||j|S)Nr) unique_file)r rirh)rr^rir r r r s zUniqueFileTest._callcCsJ|\}}|d|t|}Wdn1s<0YdS)Nr_)r writecloseopen)rfdnamefr r r test_returns_fd_for_writings    z*UniqueFileTest.test_returns_fd_for_writingcCs0|d\}}|d\}}||dS)NrUr[r rk)rfd1name1fd2name2r r r test_right_modeszUniqueFileTest.test_right_modec Csd|\}}|\}}|\}}tj|}tj|}tj|} |||dSN)r rrKbasenamerk) rrrrsrtruZfd3Zname3Z basename1Z basename2Z basename3r r r test_default_existss     z"UniqueFileTest.test_default_exists)r[) rr r!r"rDr rprvryrQr r rHr rgs   rgc@s2eZdZdZd ddZddZddZd d Zd S) UniqueLineageNameTestz+Tests for certbot.util.unique_lineage_name.cCsddlm}||j||S)Nr)unique_lineage_name)r r|rM)rfilenamer^r|r r r r s zUniqueLineageNameTest._callcCs|d\}}|dS)Nwowrq)rrorKr r r test_basicsz UniqueLineageNameTest.test_basiccCsHg}tdD]}||dq |d\}}|D]\}}|q2dS)N r~)rangeappendr rk)ritems_rornr r r test_multiples    z#UniqueLineageNameTest.test_multiplec CsltjdttjdDtt|dWdn1s@0YWdn1s^0YdS)Nzcertbot.compat.filesystem.open)r0r~)rrr/errnoZEIOr1r2r r<r r r r7s z"UniqueLineageNameTest.test_failureN)r{)rr r!r"r rrr7r r r r rzs   rzcs@eZdZdZfddZddZddZdd Zd d ZZ S) SafelyRemoveTestz%Tests for certbot.util.safely_remove.cs ttj|jd|_dS)NrZ)rCrDrrKrLrMr<rHr r rDs zSafelyRemoveTest.setUpcCsddlm}||jS)Nr) safely_remove)r rrK)rrr r r r s zSafelyRemoveTest._callcCs8t|jdWdn1s"0Y|dS)Nw)rlrKr r<r r r test_exists$szSafelyRemoveTest.test_existscCs |dSrwr r<r r r test_missing*szSafelyRemoveTest.test_missingc CsftdH}t|_tt|Wdn1s:0YWdn1sX0YdS)Nzcertbot.util.os.remove)rrr/r0r1r2r )rZ mock_remover r r test_other_error_passthrough/s  z-SafelyRemoveTest.test_other_error_passthrough) rr r!r"rDr rrrrQr r rHr rs  rc@s,eZdZdZeddZddZddZdS) SafeEmailTestzTest safe_email.cCsddlm}||S)Nr) safe_email)r r)r addrrr r r r 8s zSafeEmailTest._callcCsgd}|D]}q dS)N)zcertbot@certbot.orgztbd.ade@gmail.comzabc_def.jdk@hotmail.museumr raddrsrr r r test_valid_emails=szSafeEmailTest.test_valid_emailscCsgd}|D]}q dS)N)zcertbot@certbot..orgz.tbd.ade@gmail.comz~/abc_def.jdk@hotmail.museumr rr r r test_invalid_emailsFsz!SafeEmailTest.test_invalid_emailsN)rr r!r"r#r rrr r r r r6s   rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)AddDeprecatedArgumentTestzTest add_deprecated_argument.cCst|_dSrw)argparseArgumentParserparserr<r r r rDRszAddDeprecatedArgumentTest.setUpcCs ddlm}||jj||dS)Nr)add_deprecated_argument)r rr add_argument)r argument_namenargsrr r r r Us zAddDeprecatedArgumentTest._callcCsH|ddtd}|jdgWdn1s:0YdS)N --old-optionrcertbot.util.logger.warningr rrr parse_argsrZ mock_warnr r r test_warning_no_argYs  ,z-AddDeprecatedArgumentTest.test_warning_no_argcCsJ|ddtd }|jddgWdn1s<0YdS)Nrr6r42rrr r r test_warning_with_argas  .z/AddDeprecatedArgumentTest.test_warning_with_argc Csl|ddt}tjd|d6z|jdgWntyHYn0Wdn1s^0YdS)Nrz sys.stdout)rTz-h)r ioStringIOrrrr SystemExit)rr'r r r test_helpis  $z#AddDeprecatedArgumentTest.test_helpcCs|tdS)zTest when ACTION_TYPES_THAT_DONT_NEED_A_VALUE is a set. This variable is a set in configargparse versions < 0.12.0. N)_test_constant_commonsetr<r r r test_set_constantssz+AddDeprecatedArgumentTest.test_set_constantcCs|tdS)zTest when ACTION_TYPES_THAT_DONT_NEED_A_VALUE is a tuple. This variable is a tuple in configargparse versions >= 0.12.0. N)rtupler<r r r test_tuple_constant{sz-AddDeprecatedArgumentTest.test_tuple_constantcCsNtd0}||_|dd|ddWdn1s@0YdS)Nzcertbot.util.configargparserr6z --old-option2r)rrZ#ACTION_TYPES_THAT_DONT_NEED_A_VALUEr )rtypZmock_configargparser r r rs   *z/AddDeprecatedArgumentTest._test_constant_commonN) rr r!r"rDr rrrrrrr r r r rPs rc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)EnforceLeValidityzTest enforce_le_validity.cCsddlm}||S)Nr)enforce_le_validity)r r)rdomainrr r r r s zEnforceLeValidity._callcCs:ttj|dWdn1s,0YdS)Nz..r1r2rConfigurationErrorr r<r r r test_sanityszEnforceLeValidity.test_sanitycCs:ttj|dWdn1s,0YdS)Nzhello_world.example.comrr<r r r test_invalid_charssz$EnforceLeValidity.test_invalid_charscCs:ttj|dWdn1s,0YdS)Nz-a.example.comrr<r r r test_leading_hyphensz%EnforceLeValidity.test_leading_hyphencCs:ttj|dWdn1s,0YdS)Nza-.example.comrr<r r r test_trailing_hyphensz&EnforceLeValidity.test_trailing_hyphencCs:ttj|dWdn1s,0YdS)NZcomrr<r r r test_one_labelsz EnforceLeValidity.test_one_labelcCsdSrwr r<r r r test_valid_domainsz#EnforceLeValidity.test_valid_domaincCspttj|dWdn1s,0Yttj|dWdn1sb0YdS)Nzhttp://example.comzhttps://example.comrr<r r r test_input_with_schemes(z(EnforceLeValidity.test_input_with_schemecCsdSrwr r<r r r !test_valid_input_with_scheme_namesz3EnforceLeValidity.test_valid_input_with_scheme_nameN) rr r!r"r rrrrrrrrr r r r rsrc@speZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZdS)EnforceDomainSanityTestzTest enforce_domain_sanity.cCsddlm}||S)Nr)enforce_domain_sanity)r r)rrrr r r r s zEnforceDomainSanityTest._callcCs@ttj |ddWdn1s20YdS)Neichhörnchen.example.comzutf-8)r1r2rrr encoder<r r r test_nonascii_strsz)EnforceDomainSanityTest.test_nonascii_strcCs:ttj|dWdn1s,0YdS)Nrrr<r r r test_nonascii_unicodesz-EnforceDomainSanityTest.test_nonascii_unicodecCs>d}ttj||Wdn1s00YdS)NAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar)rZ long_domainr r r test_too_longsz%EnforceDomainSanityTest.test_too_longcCsddddd}||dS)Nz{0}.{1}.{2}.{3}?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ?cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ?dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddformatr )rZnot_too_long_domainr r r test_not_too_longsz)EnforceDomainSanityTest.test_not_too_longcCs>d}ttj||Wdn1s00YdS)Nzfizz..example.comr)rZempty_label_domainr r r test_empty_labelsz(EnforceDomainSanityTest.test_empty_labelcCs>d}ttj||Wdn1s00YdS)Nz example.com..r)rZempty_trailing_label_domainr r r test_empty_trailing_labelsz1EnforceDomainSanityTest.test_empty_trailing_labelcCs>d}ttj||Wdn1s00YdS)N@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrZlong_label_domainr r r test_long_label_1sz)EnforceDomainSanityTest.test_long_label_1cCsFddd}ttj||Wdn1s80YdS)N {0}.{1}.comrr)rr1r2rrr rr r r test_long_label_2s z)EnforceDomainSanityTest.test_long_label_2cCsddd}||dS)Nrrrr)rZnot_too_long_label_domainr r r test_not_long_labels z+EnforceDomainSanityTest.test_not_long_labelcCs>d}ttj||Wdn1s00YdS)Nr)rZ empty_domainr r r test_empty_domainsz)EnforceDomainSanityTest.test_empty_domaincCs|ddS)Nzthis.is.xn--ls8h.tldrr<r r r test_punycode_oksz(EnforceDomainSanityTest.test_punycode_okN)rr r!r"r rrrrrrrrrrrr r r r rsrc@s0eZdZdZddZddZddZdd Zd S) IsWildcardDomainTestzTests for is_wildcard_domain.cCsd|_d|_dS)Nz *.example.orgz example.org)ZwildcardZ no_wildcardr<r r r rDszIsWildcardDomainTest.setUpcCsddlm}||S)Nr)is_wildcard_domain)r r)rrrr r r r s zIsWildcardDomainTest._callcCsdSrwr r<r r r test_no_wildcardsz%IsWildcardDomainTest.test_no_wildcardcCsdSrwr r<r r r test_wildcardsz"IsWildcardDomainTest.test_wildcardN)rr r!r"rDr rrr r r r rs rc@seZdZdZedeej ddddZ edeej ddddZ edeej ddd d Z d d Zedeej ddd dZedeej ddddZdS) OsInfoTestz Test OS / distribution detectionzcertbot.util.distrolinuxzrequires LinuxcCs ddlm}d|j_|}dS)Nrzfirst debian third)r rFZlikerZget_systemd_os_like)rm_distrocbutilZid_likesr r r test_systemd_os_release_likes z'OsInfoTest.test_systemd_os_release_likecCs\ddlm}tjddd$d|j_gd|j_Wdn1sD0Ydg|j_dS)Nrplatform.system_alias)rrrr1.0)r somethingrZwhatever)r rFrrversionrrnr0rrrr r r test_get_os_info_ua s   zOsInfoTest.test_get_os_info_uacCs`ddlm}td6}d|j_d|j_d|_d|j_d|j_Wdn1sR0YdS)Nrzplatform.systemrnrrrelse)r rFrridrr)rrrZ mock_platformr r r test_get_os_infos  zOsInfoTest.test_get_os_infoc Cs\ddlm}tdd,tjdddWdn1s@0YtjdddBtd}d |_Wdn1s0YWdn1s0Ytjdd dWdn1s0Ytjdd d@tjd d dWdn1s0YWdn1s.0YWdn1sN0YdS)Nrzcertbot.util._USE_DISTROFr)Z NonSystemDrrr)darwinrrzsubprocess.runz42.42.42)Zfreebsdz 9.3-RC3-p1r)Zwindowsrrzplatform.win32_ver)Z4242Z952r)r rFrrr')rrZrun_mockr r r test_non_systemd_os_info*s.  <z#OsInfoTest.test_non_systemd_os_infocCs ddlm}d|j_d|j_dS)Nrrr rFrrrrr r r test_python_os_info_notfoundCs z'OsInfoTest.test_python_os_info_notfoundcCs ddlm}d|j_d|j_dS)NrZtestdistrrrr r r test_python_os_info_customKs z%OsInfoTest.test_python_os_info_customN)rr r!r"rrunittestZ skipUnlesssysplatform startswithrrrrrrr r r r rs"    rc@s<eZdZdZddZeddZddZdd Zd d Z d S) AtexitRegisterTestz'Tests for certbot.util.atexit_register.cCst|_d|_ddi|_dS)N)hiZanswer*)rZ MagicMockfuncrArBr<r r r rDVs zAtexitRegisterTest.setUpcOsddlm}||i|S)Nr)atexit_register)r r)r rArBrr r r r [s zAtexitRegisterTest._callcCs(|t|jj|ji|jdSrw) _test_commonrgetpidrZassert_called_withrArBr<r r r test_called`szAtexitRegisterTest.test_calledcCs|jdddS)Nr) initial_pid)rr<r r r test_not_calledds z"AtexitRegisterTest.test_not_calledc Cstd|td.}|j|jg|jRi|jWdn1sL0Y|jj\}}|d}||ddi|Wdn1s0YdS)Nzcertbot.util._INITIAL_PIDzcertbot.util.atexitrr6)rrr rrArBregisterrO)rrZ mock_atexitrArBZ atexit_funcr r r rhs  < zAtexitRegisterTest._test_commonN) rr r!r"rDr#r rrrr r r r rTs rc@s<eZdZdZeddZddZddZdd Zd d Z d S) LooseVersionTestzTest for certbot.util.LooseVersion. These tests are based on the original tests for distutils.version.LooseVersion at https://github.com/python/cpython/blob/v3.10.0/Lib/distutils/tests/test_version.py#L58-L81. cOsddlm}||i|S)Nr) LooseVersion)r r)r rArBrr r r r }s zLooseVersionTest._callcCsd}|D]\}}qdS)N)z1.5.1z1.5.2b2z3.4jz 1996.07.12Z2g6Z11gz0.960923z 2.2beta29z1.13++z5.5.kw)2.0z2.0.1)abr rZ comparisonsZv1Zv2r r r test_less_thans zLooseVersionTest.test_less_thancCsd}|D]\}}qdS)N))8.02r)1ar )r2.0.0)rr r rr r r test_equals zLooseVersionTest.test_equalcCsd}|D]\}}qdSN))Z161z3.10a)z3.2.pl0z3.1.1.6r rr r r test_greater_thans z"LooseVersionTest.test_greater_thanc Cs@d}|D]2\}}ttWdq1s00YqdS)N))z bookworm/sid9)r r)r1r2 ValueErrorrr r r test_incomparibles  z"LooseVersionTest.test_incomparibleN) rr r!r"r#r rr r rr r r r rts  rc@s4eZdZdZeddZddZddZdd Zd S) ParseLooseVersionTestzTest for certbot.util.parse_loose_version. These tests are based on the original tests for distutils.version.LooseVersion at https://github.com/python/cpython/blob/v3.10.0/Lib/distutils/tests/test_version.py#L58-L81. cOsddlm}||i|S)Nr)parse_loose_version)r r)r rArBrr r r r s zParseLooseVersionTest._callcCsd}|D]\}}qdS)N)rrrrrr rr r r rs z$ParseLooseVersionTest.test_less_thancCsdSrwr r<r r r r sz ParseLooseVersionTest.test_equalcCsd}|D]\}}qdSr r rr r r r s z'ParseLooseVersionTest.test_greater_thanN) rr r!r"r#r rr r r r r r rs   r__main__r6)-r"rr importlibrrErrrrr1rGrZcertbot.compatrrZcertbot.tests.utilZtestsrFZ test_utilZTestCaserr$r8ZTempDirTestCaser?rRrYrgrzrrrrrrrrrrrexitmainargv__file__r r r r s@     "!$'4;';S /!