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._callcCsvtjd}tj}d||d<d|d<d|d<tjd|d$|d|ksTJWdn1sh0YdS) NPATH"RANDOM_NONSENSE_GARBAGE/blah/blah:RANDOM_NONSENSE_GARBAGESNAPTrueCERTBOT_SNAPPEDcertbot.compat.os.environ.copy return_value)renvironcopyrpatchr )selfZ original_path env_copy_dictr r r test_removeds   z*EnvNoSnapForExternalCallsTest.test_removedcCstj}d|d|d<|}tjd|d|dd|dd|d|dksbJd|d<|d|dksJ|d=d|d<|d|dksJWdn1s0YdS) Nrrrrrrrr)rrrrrpopr )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.runcCsDd|_d|_d|_|dg\}}|dks4J|dks@JdS)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._callcCs@tjddd|dsJWdn1s20YdS)N%certbot.util.filesystem.is_executableTr /path/to/exerrr rr r r test_exe_exists]szExeExistsTest.test_exe_existscCs@tjddd|drJWdn1s20YdS)Nr:Frr;r<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 rA)r argskwargsrAr r r r hs zLockDirUntilExit._callcs tddl}t|jdS)Nr)supersetUpr reload_moduleutil)rcertbot __class__r r rEms zLockDirUntilExit.setUpzcertbot.util.loggerzcertbot.util.atexit_registercCstj|jd}t|||j|||||jdksHJ|jdd}ddl m }t |j dkstJ||j jdksJdS)Nsubdirr6r)rG)rpathjointempdirrmkdirr call_count call_argsrHrGlenZ_LOCKSdebug)rZ mock_registerZ mock_loggerrKZregistered_funcrGr r r test_itss     zLockDirUntilExit.test_it) rr r!r"r#r rErrrU __classcell__r r rIr 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 rX)rrBrCrXr r r r s zSetUpCoreDirTest._callz certbot.util.lock_dir_until_exitcCs@tj|jd}||ddtj|s.J|jdksttj||jdWdn1s00YdS)N)r1r2rr]r rMr=r r r test_existing_wrong_mode_failssz2MakeOrVerifyDirTest.test_existing_wrong_mode_failsc CsptjtdN}t|_tt|ddWdn1sD0YWdn1sb0YdS)Nmakedirsrdi޻) rrobjectrr/r0r1r2r )rrkr r r test_reraises_os_errors z*MakeOrVerifyDirTest.test_reraises_os_error) rr r!r"rEr rgrhrjrmrVr r rIr r^s r^csBeZdZdZfddZd ddZddZd d Zd d ZZ S)UniqueFileTestz#Tests for certbot.util.unique_file.cs ttj|jd|_dSNzfoo.txt)rDrErrMrNrO default_namer=rIr r rEs zUniqueFileTest.setUpr`cCsddlm}||j|S)Nr) unique_file)r rqrp)rrcrqr r r r s zUniqueFileTest._callcCsZ|\}}|d|t| }|dks8JWdn1sL0YdS)Nrd)r writecloseopenread)rfdnamefr r r test_returns_fd_for_writings    z*UniqueFileTest.test_returns_fd_for_writingcCsP|d\}}|d\}}t|ds,Jt|dsJt|tsLJd|vsXJ|D]\}}|q\dS)N rz wow-0009.conf)rangeappendr rrrstrrs)ritems_rxrwr 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 rs   rcs@eZdZdZfddZddZddZdd Zd d ZZ S) SafelyRemoveTestz%Tests for certbot.util.safely_remove.cs ttj|jd|_dS)Nr_)rDrErrMrNrOr=rIr r rEs zSafelyRemoveTest.setUpcCsddlm}||jS)Nr) safely_remove)r rrM)rrr r r r s zSafelyRemoveTest._callcCsJt|jdWdn1s"0Y|tj|jrFJdS)Nw)rtrMr rr[r=r r r test_exists$szSafelyRemoveTest.test_existscCs|tj|jrJdSN)r rrMr[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"rEr rrrrVr r rIr rs  rc@s,eZdZdZeddZddZddZdS) SafeEmailTestzTest safe_email.cCsddlm}||S)Nr) safe_email)r r)r addrrr r r r 8s zSafeEmailTest._callcCs,gd}|D]}||s Jd|q dS)N)zcertbot@certbot.orgztbd.ade@gmail.comzabc_def.jdk@hotmail.museum %s failed.r raddrsrr r r test_valid_emails=szSafeEmailTest.test_valid_emailscCs,gd}|D]}||r Jd|q dS)N)zcertbot@certbot..orgz.tbd.ade@gmail.comz~/abc_def.jdk@hotmail.museumrrrr 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|_dSr)argparseArgumentParserparserr=r r r rERszAddDeprecatedArgumentTest.setUpcCs ddlm}||jj||dS)Nr)add_deprecated_argument)r rr add_argument)r argument_namenargsrr r r r Us zAddDeprecatedArgumentTest._callcCs|ddtd}|jdgWdn1s:0Y|jdksRJd|jddvshJd|jddvs~JdS)N --old-optionrcertbot.util.logger.warningr6 is deprecatedr rrr parse_argsrQrRrZ mock_warnr r r test_warning_no_argYs   ,z-AddDeprecatedArgumentTest.test_warning_no_argcCs|ddtd }|jddgWdn1s<0Y|jdksTJd|jddvsjJd|jddvsJdS)Nrr6r42rrrrr r r test_warning_with_argas   .z/AddDeprecatedArgumentTest.test_warning_with_argc Cs||ddt}tjd|d6z|jdgWntyHYn0Wdn1s^0Yd|vsxJdS)NrrLz sys.stdout)rYz-h) r rStringIOrrrr SystemExitgetvalue)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_constantcCs`td0}||_|dd|ddWdn1s@0Yt|jdks\JdS)Nzcertbot.util.configargparserr6z --old-option2rL)rrZ#ACTION_TYPES_THAT_DONT_NEED_A_VALUEr rS)rtypZmock_configargparser r r rs   *z/AddDeprecatedArgumentTest._test_constant_commonN) rr r!r"rEr 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_labelcCs|ddksJdS)Nz example.comrr=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_schemecCs|ddksJdS)Nzhttp.example.comrr=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)wildcard no_wildcardr=r r r rEszIsWildcardDomainTest.setUpcCsddlm}||S)Nr)is_wildcard_domain)r r)rrrr r r r s zIsWildcardDomainTest._callcCs(||jrJ||jr$JdSr)r rrr=r r r test_no_wildcardsz%IsWildcardDomainTest.test_no_wildcardcCs(||jsJ||js$JdSr)r rrr=r r r test_wildcardsz"IsWildcardDomainTest.test_wildcardN)rr r!r"rEr 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_|}t|dks,Jd|vs8JdS)Nrzfirst debian thirdZdebian)r rGZlikerZget_systemd_os_likerS)rm_distrocbutilZid_likesr r r test_systemd_os_release_likes  z'OsInfoTest.test_systemd_os_release_likecCsddlm}tjdddBd|j_gd|j_|d |j dd ksNJWdn1sb0Yd g|j_|d ksJdS) Nrplatform.system_alias)rrrr1.0)r somethingr T)ZprettyZwhatever) r rGrrversionrrwr0Zget_os_info_uarNget_python_os_inforrrr r r test_get_os_info_ua s  & zOsInfoTest.test_get_os_info_uacCsddlm}tdV}d|j_d|j_d|_|dks>Jd|j_d|j_|d ks^JWdn1sr0YdS) Nrzplatform.systemrwrr)rwrrelse)rr)r rGrridrrZ get_os_info)rrrZ mock_platformr r r test_get_os_infos  zOsInfoTest.test_get_os_infoc Csddlm}tddtjddd$|ddks@JWdn1sT0Ytjdddjtd @}d |_|dd ksJ|d d ksJWdn1s0YWdn1s0Ytjdd d"|dksJWdn1s0YtjdddRtjddd"|dksZJWdn1sp0YWdn1s0YWdn1s0YdS)Nrzcertbot.util._USE_DISTROFr)Z NonSystemDrrrZ nonsystemd)darwinrrzsubprocess.runz42.42.42rr6)freebsdz 9.3-RC3-p1r)r9)windowsrrzplatform.win32_ver)Z4242952r)rr)r rGrrrr')rrZrun_mockr r r test_non_systemd_os_info*s4 2 P2z#OsInfoTest.test_non_systemd_os_infocCs4ddlm}d|j_d|j_|ddks0JdS)Nrrrr rGrrrrrr r r test_python_os_info_notfoundCs z'OsInfoTest.test_python_os_info_notfoundcCs0ddlm}d|j_d|j_|dks,JdS)Nrtestdistr)rrrrr 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 MagicMockfuncrBrCr=r r r rEVs zAtexitRegisterTest.setUpcOsddlm}||i|S)Nr)atexit_register)r r)r rBrCrr r r r [s zAtexitRegisterTest._callcCs(|t|jj|ji|jdSr) _test_commonrgetpidr Zassert_called_withrBrCr=r r r test_called`szAtexitRegisterTest.test_calledcCs |jdd|jjdusJdS)Nr) initial_pidF)rr calledr=r r r test_not_calledds z"AtexitRegisterTest.test_not_calledc Cstd|td.}|j|jg|jRi|jWdn1sL0Y|jjsbJ|jj\}}|d}||ddi|Wdn1s0YdS)Nzcertbot.util._INITIAL_PIDzcertbot.util.atexitrr6) rrr r rBrCregisterrrR)rrZ mock_atexitrBrCZ atexit_funcr r r rhs <  zAtexitRegisterTest._test_commonN) rr r!r"rEr#r rrrr r r r r Ts r c@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 rBrCrr r r r }s zLooseVersionTest._callcCs4d}|D]&\}}||||dksJqdS)N)z1.5.1z1.5.2b2z3.4jz 1996.07.12Z2g6Z11gz0.960923z 2.2beta29z1.13++z5.5.kw)2.0z2.0.1)abrr try_risky_comparisonrZ comparisonsZv1Zv2r r r test_less_thans zLooseVersionTest.test_less_thancCs4d}|D]&\}}||||dksJqdS)N))8.02r$)1ar%)r2.0.0)rr&rr r"r r r test_equals zLooseVersionTest.test_equalcCs4d}|D]&\}}||||dksJqdS)N)Z161z3.10a)z3.2.pl0z3.1.1.6r6r r"r r r test_greater_thans z"LooseVersionTest.test_greater_thanc CsZd}|D]L\}}tt*||||s6JWdq1sJ0YqdS)N))z bookworm/sidr)r%r)r1r2 ValueErrorr r!r"r r r test_incomparibles  z"LooseVersionTest.test_incomparibleN) rr r!r"r#r r#r'r)r+r 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 rBrCr-r r r r s zParseLooseVersionTest._callcCs.d}|D] \}}||||ksJqdS)N)rrrrrrr"r r r r#s z$ParseLooseVersionTest.test_less_thancCs|d|dksJdS)Nr$rr=r r r r'sz ParseLooseVersionTest.test_equalcCs.d}|D] \}}||||ksJqdS)Nr(rr"r r r r)s z'ParseLooseVersionTest.test_greater_thanN) rr r!r"r#r r#r'r)r r r r r,s   r,__main__r6)-r"rr importlibrrFrrrrr1rHrZcertbot.compatrrZcertbot.tests.utilZtestsrGZ test_utilZTestCaserr$r8ZTempDirTestCaser@rWr^rnrrrrrrrrr rr,rexitmainargv__file__r r r r s@     "!$'4;';S /!