a ‚oeº`ã@sôdZddlZddlZddlmZddlZddlZddlZddlm Z ddl Z ddl m Z ddl mZddl mZddlmmZGdd „d ejƒZGd d „d ejƒZGd d „d ejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZ Gdd„dejƒZ!Gd d!„d!ejƒZ"Gd"d#„d#ejƒZ#Gd$d%„d%ejƒZ$Gd&d'„d'ejƒZ%Gd(d)„d)ejƒZ&Gd*d+„d+ejƒZ'e(d,k�rðe )e  *ej+d-d…e,g¡¡dS).zTests for certbot.util.éN)Úreload)Úmock)Úerrors)Ú filesystem)Úosc@s,eZdZdZedd„ƒZdd„Zdd„ZdS) ÚEnvNoSnapForExternalCallsTestz6Tests for certbot.util.env_no_snap_for_external_calls.cCsddlm}|ƒS)Nr)Úenv_no_snap_for_external_calls)Ú certbot.utilr)Úclsr©r úBC:\Program Files\Certbot\pkgs\certbot\_internal\tests\util_test.pyÚ_calls z#EnvNoSnapForExternalCallsTest._callcCsvtjd}tj ¡}d||d<d|d<d|d<tjd|d��$| ¡d|ksTJ‚Wdƒn1sh0YdS) NÚPATHú"RANDOM_NONSENSE_GARBAGE/blah/blah:ÚRANDOM_NONSENSE_GARBAGEÚSNAPÚTrueÚCERTBOT_SNAPPEDúcertbot.compat.os.environ.copy©Ú return_value)rÚenvironÚcopyrÚpatchr )ÚselfZ original_pathÚ env_copy_dictr r r Ú test_removeds   z*EnvNoSnapForExternalCallsTest.test_removedcCsÊtj ¡}d|d|d<| ¡}tjd|d��†| dd¡| dd¡| ¡d|dksbJ‚d|d<| ¡d|dks‚J‚|d=d|d<| ¡d|dks¨J‚Wdƒn1s¼0YdS) Nrrrrrrrr)rrrrrÚpopr )rZenv_copy_dict_unmodifiedrr r r Ú test_noop"s ÿ  z'EnvNoSnapForExternalCallsTest.test_noopN)Ú__name__Ú __module__Ú __qualname__Ú__doc__Ú classmethodr rrr r r r rs   rc@sReZdZdZedd„ƒZe d¡dd„ƒZe d¡dd„ƒZ e d¡d 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@J‚dS)z.These will be changed soon enough with reload.rÚstdoutÚstderrÚtestN)Ú returncoder'r(r )rÚmock_runÚoutÚerrr r r Ú test_default;s  zRunScriptTest.test_defaultcCsBt|_t tj¡�| dg¡Wdƒn1s40YdS)Nr))ÚOSErrorÚ side_effectÚpytestÚraisesrÚSubprocessErrorr ©rr+r r r Útest_bad_processFszRunScriptTest.test_bad_processcCsDd|ƒ_t tj¡�| dg¡Wdƒn1s60YdS)Nér))r*r1r2rr3r r4r r r Ú test_failureMszRunScriptTest.test_failureN) rr r!r"r#r rrr.r5r7r r r r r$4s   r$c@s,eZdZdZedd„ƒZdd„Zdd„ZdS) Ú ExeExistsTestz"Tests for certbot.util.exe_exists.cCsddlm}||ƒS)Nr)Ú exe_exists)r r9)r Zexer9r r r r Xs zExeExistsTest._callcCs@tjddd��| d¡sJ‚Wdƒn1s20YdS)Nú%certbot.util.filesystem.is_executableTrú /path/to/exe©rrr ©rr r r Útest_exe_exists]szExeExistsTest.test_exe_existscCs@tjddd��| d¡rJ‚Wdƒn1s20YdS)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  r8csHeZdZdZedd„ƒZ‡fdd„Ze d¡e d¡dd „ƒƒZ ‡Z S) ÚLockDirUntilExitz+Tests for certbot.util.lock_dir_until_exit.cOsddlm}||i|¤ŽS)Nr)Úlock_dir_until_exit)r rA)r ÚargsÚkwargsrAr r r r hs zLockDirUntilExit._callcs tƒ ¡ddl}t|jƒdS)Nr)ÚsuperÚsetUpr Ú reload_moduleÚutil)rÚcertbot©Ú __class__r r rEms zLockDirUntilExit.setUpzcertbot.util.loggerzcertbot.util.atexit_registercCsŽtj |jd¡}t |¡| |j¡| |¡| |¡|jdksHJ‚|jdd}ddl m }t |j ƒdkstJ‚|ƒ|j jdksŠJ‚dS)NÚsubdirr6r)rGé)rÚpathÚjoinÚtempdirrÚmkdirr Ú call_countÚ call_argsrHrGÚlenZ_LOCKSÚdebug)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<eZdZdZdd„Ze d¡dd„ƒZe d¡dd „ƒ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¡}| |dd¡tj |¡s.J‚|jdkst tj¡�| |jd¡Wdƒn1s00YdS)Né)r1r2rr]r rMr=r r r Útest_existing_wrong_mode_fails»sz2MakeOrVerifyDirTest.test_existing_wrong_mode_failsc Csptj td¡�N}tƒ|_t t¡�| dd¡Wdƒn1sD0YWdƒn1sb0YdS)NÚmakedirsrdiøÞ») rrÚobjectrr/r0r1r2r )rrkr r r Útest_reraises_os_error¿s z*MakeOrVerifyDirTest.test_reraises_os_error) rr r!r"rEr rgrhrjrmrVr r rIr r^Ÿs r^csBeZdZdZ‡fdd„Zd dd„Zdd„Zd d „Zd d „Z‡Z S)ÚUniqueFileTestz#Tests for certbot.util.unique_file.cs tƒ ¡tj |jd¡|_dS©Nzfoo.txt)rDrErrMrNrOÚ default_namer=rIr r rEÉs zUniqueFileTest.setUpr`cCsddlm}||j|ƒS)Nr)Ú unique_file)r rqrp)rrcrqr r r r Îs zUniqueFileTest._callcCsZ| ¡\}}| d¡| ¡t|ƒ� }| ¡dks8J‚Wdƒn1sL0YdS)Nrd)r ÚwriteÚcloseÚopenÚread)rÚfdÚnameÚfr r r Útest_returns_fd_for_writingÒs    z*UniqueFileTest.test_returns_fd_for_writingcCsP| d¡\}}| d¡\}}t |d¡s,J‚t |d¡sJ‚t|tƒsLJ‚d|vsXJ‚|D]\}}| ¡q\dS)Né r‡éÿÿÿÿz wow-0009.conf)ÚrangeÚappendr rˆr‰rŠÚstrrs)rÚitemsÚ_rxrwr r r Ú test_multiples    z#UniqueLineageNameTest.test_multiplec Csltjdttjƒd��Dt t¡�| d¡Wdƒn1s@0YWdƒn1s^0YdS)Nzcertbot.compat.filesystem.open)r0r‡)rrr/ÚerrnoZEIOr1r2r r=r r r r7s z"UniqueLineageNameTest.test_failureN)r„)rr r!r"r r‹r“r7r r r r rƒús   rƒcs@eZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Z‡Z S) ÚSafelyRemoveTestz%Tests for certbot.util.safely_remove.cs tƒ ¡tj |jd¡|_dS)Nr_)rDrErrMrNrOr=rIr r rEs zSafelyRemoveTest.setUpcCsddlm}||jƒS)Nr)Ú safely_remove)r r–rM)rr–r r r r s zSafelyRemoveTest._callcCsJt|jdƒ�Wdƒn1s"0Y| ¡tj |j¡rFJ‚dS)NÚw)rtrMr rr[r=r r r Ú test_exists$szSafelyRemoveTest.test_existscCs| ¡tj |j¡rJ‚dS©N)r rrMr[r=r r r Ú test_missing*szSafelyRemoveTest.test_missingc Csft d¡�H}t|_t t¡�| ¡Wdƒn1s:0YWdƒn1sX0YdS)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 r˜ršr›rVr r rIr r•s  r•c@s,eZdZdZedd„ƒZdd„Zdd„ZdS) Ú SafeEmailTestzTest safe_email.cCsddlm}||ƒS)Nr)Ú safe_email)r r�)r Úaddrr�r 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 ©rZaddrsržr 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.museumrŸr r¡r r r Útest_invalid_emailsFsz!SafeEmailTest.test_invalid_emailsN)rr r!r"r#r r¢r£r r r r rœ6s   rœc@sPeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dS)ÚAddDeprecatedArgumentTestzTest add_deprecated_argument.cCst ¡|_dSr™)ÚargparseÚArgumentParserÚparserr=r r r rERszAddDeprecatedArgumentTest.setUpcCs ddlm}||jj||ƒdS)Nr)Úadd_deprecated_argument)r r¨r§Ú add_argument)rÚ argument_nameÚnargsr¨r r r r Us zAddDeprecatedArgumentTest._callcCs‚| dd¡t d¡�}|j dg¡Wdƒn1s:0Y|jdksRJ‚d|jddvshJ‚d|jddvs~J‚dS)Nú --old-optionrúcertbot.util.logger.warningr6ú is deprecated©r rrr§Ú parse_argsrQrR©rZ mock_warnr r r Útest_warning_no_argYs   ,z-AddDeprecatedArgumentTest.test_warning_no_argcCs„| dd¡t d¡� }|j ddg¡Wdƒn1s<0Y|jdksTJ‚d|jddvsjJ‚d|jddvs€J‚dS)Nr¬r6r­Ú42r®rr¯r±r r r Útest_warning_with_argas   .z/AddDeprecatedArgumentTest.test_warning_with_argc Cs|| dd¡t ¡}tjd|d��6z|j dg¡WntyHYn0Wdƒn1s^0Yd| ¡vsxJ‚dS)Nr¬rLz sys.stdout)rYz-h) r r‰ÚStringIOrrr§r°Ú SystemExitÚgetvalue)rr'r r r Ú test_helpis  $z#AddDeprecatedArgumentTest.test_helpcCs| t¡dS)z†Test 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_commonÚsetr=r r r Útest_set_constantssz+AddDeprecatedArgumentTest.test_set_constantcCs| t¡dS)z‹Test when ACTION_TYPES_THAT_DONT_NEED_A_VALUE is a tuple. This variable is a tuple in configargparse versions >= 0.12.0. N)r¹Útupler=r r r Útest_tuple_constant{sz-AddDeprecatedArgumentTest.test_tuple_constantcCs`t d¡�0}|ƒ|_| dd¡| dd¡Wdƒn1s@0Yt|jƒdks\J‚dS)Nzcertbot.util.configargparser¬r6z --old-option2rL)rrZ#ACTION_TYPES_THAT_DONT_NEED_A_VALUEr rS)rÚtypZmock_configargparser r r r¹ƒs   *z/AddDeprecatedArgumentTest._test_constant_commonN) rr r!r"rEr r²r´r¸r»r½r¹r r r r r¤Ps r¤c@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚEnforceLeValidityzTest enforce_le_validity.cCsddlm}||ƒS)Nr)Úenforce_le_validity)r rÀ)rÚdomainrÀr r r r �s zEnforceLeValidity._callcCs:t tj¡�| d¡Wdƒn1s,0YdS)Nz..©r1r2rÚConfigurationErrorr r=r r r Ú test_sanity‘szEnforceLeValidity.test_sanitycCs:t tj¡�| d¡Wdƒn1s,0YdS)Nzhello_world.example.comrÂr=r r r Útest_invalid_chars•sz$EnforceLeValidity.test_invalid_charscCs:t tj¡�| d¡Wdƒn1s,0YdS)Nz-a.example.comrÂr=r r r Útest_leading_hyphen™sz%EnforceLeValidity.test_leading_hyphencCs:t tj¡�| d¡Wdƒn1s,0YdS)Nza-.example.comrÂr=r r r Útest_trailing_hyphen�sz&EnforceLeValidity.test_trailing_hyphencCs:t tj¡�| d¡Wdƒn1s,0YdS)NZcomrÂr=r r r Útest_one_label¡sz EnforceLeValidity.test_one_labelcCs| d¡dksJ‚dS)Nz example.comr r=r r r Útest_valid_domain¥sz#EnforceLeValidity.test_valid_domaincCspt tj¡�| d¡Wdƒn1s,0Yt tj¡�| d¡Wdƒn1sb0YdS)Nzhttp://example.comzhttps://example.comrÂr=r r r Útest_input_with_scheme¨s(z(EnforceLeValidity.test_input_with_schemecCs| d¡dksJ‚dS)Nzhttp.example.comr r=r r r Ú!test_valid_input_with_scheme_name®sz3EnforceLeValidity.test_valid_input_with_scheme_nameN) rr r!r"r rÄrÅrÆrÇrÈrÉrÊrËr r r r r¿‹sr¿c@speZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)ÚEnforceDomainSanityTestzTest enforce_domain_sanity.cCsddlm}||ƒS)Nr)Úenforce_domain_sanity)r rÍ)rrÁrÍr r r r µs zEnforceDomainSanityTest._callcCs@t tj¡� | d d¡¡Wdƒn1s20YdS)Nõeichhörnchen.example.comzutf-8)r1r2rrÃr Úencoder=r r r Útest_nonascii_str¹sz)EnforceDomainSanityTest.test_nonascii_strcCs:t tj¡�| d¡Wdƒn1s,0YdS)NrÎrÂr=r r r Útest_nonascii_unicode½sz-EnforceDomainSanityTest.test_nonascii_unicodecCs>d}t tj¡�| |¡Wdƒn1s00YdS)NAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarÂ)rZ long_domainr r r Ú test_too_longÁsz%EnforceDomainSanityTest.test_too_longcCsd dddd¡}| |¡dS)Nz{0}.{1}.{2}.{3}Ú?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÚ?bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ?cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ?ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd©Úformatr )rZnot_too_long_domainr r r Útest_not_too_longÆsz)EnforceDomainSanityTest.test_not_too_longcCs>d}t tj¡�| |¡Wdƒn1s00YdS)Nzfizz..example.comrÂ)rZempty_label_domainr r r Útest_empty_labelÊsz(EnforceDomainSanityTest.test_empty_labelcCs>d}t tj¡�| |¡Wdƒn1s00YdS)Nz example.com..rÂ)rZempty_trailing_label_domainr r r Útest_empty_trailing_labelÏsz1EnforceDomainSanityTest.test_empty_trailing_labelcCs>d}t tj¡�| |¡Wdƒn1s00YdS)NÚ@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar©rZlong_label_domainr r r Útest_long_label_1Ôsz)EnforceDomainSanityTest.test_long_label_1cCsFd dd¡}t tj¡�| |¡Wdƒn1s80YdS)Nú {0}.{1}.comrÚrÔ)rÖr1r2rrÃr rÛr r r Útest_long_label_2Ùs z)EnforceDomainSanityTest.test_long_label_2cCsd dd¡}| |¡dS)NrÝrÓrÔrÕ)rZnot_too_long_label_domainr r r Útest_not_long_labelÞs z+EnforceDomainSanityTest.test_not_long_labelcCs>d}t tj¡�| |¡Wdƒn1s00YdS)NÚrÂ)rZ empty_domainr r r Útest_empty_domainâsz)EnforceDomainSanityTest.test_empty_domaincCs| d¡dS)Nzthis.is.xn--ls8h.tldr r=r r r Útest_punycode_okçsz(EnforceDomainSanityTest.test_punycode_okN)rr r!r"r rÐrÑrÒr×rØrÙrÜrÞrßrárâr r r r r̲srÌc@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) ÚIsWildcardDomainTestzTests for is_wildcard_domain.cCsd|_d|_dS)Nz *.example.orgz example.org)ÚwildcardÚ no_wildcardr=r r r rEðszIsWildcardDomainTest.setUpcCsddlm}||ƒS)Nr)Úis_wildcard_domain)r ræ)rrÁrær r r r ôs zIsWildcardDomainTest._callcCs(| |j¡rJ‚| |j ¡¡r$J‚dSr™)r rårÏr=r r r Útest_no_wildcardøsz%IsWildcardDomainTest.test_no_wildcardcCs(| |j¡sJ‚| |j ¡¡s$J‚dSr™)r rärÏr=r r r Ú test_wildcardüsz"IsWildcardDomainTest.test_wildcardN)rr r!r"rEr rçrèr r r r rãís rãc@sÖeZdZdZe d¡e ej   d¡d¡dd„ƒƒZ e d¡e ej   d¡d¡dd„ƒƒZ e d¡e ej   d¡d¡d d „ƒƒZ d d „Ze d¡e ej   d¡d¡d d„ƒƒZe d¡e ej   d¡d¡dd„ƒƒZdS)Ú OsInfoTestz Test OS / distribution detectionzcertbot.util.distroÚlinuxzrequires LinuxcCs<ddlm}d|j_| ¡}t|ƒdks,J‚d|vs8J‚dS)Nrzfirst debian thirdéZdebian)r rGZlikerZget_systemd_os_likerS)rÚm_distroÚcbutilZid_likesr r r Útest_systemd_os_release_likes  z'OsInfoTest.test_systemd_os_release_likecCsŠddlm}tjddd��Bd|j_gd¢|j_| ¡d  |j dd �¡ksNJ‚Wdƒn1sb0Yd g|j_| ¡d ks†J‚dS) Nrúplatform.system_alias)rêr³r³rú1.0)ràÚ somethingrñú T)ZprettyZwhatever) r rGrrÚversionrrwr0Zget_os_info_uarNÚget_python_os_info©rrìrír r r Útest_get_os_info_ua s ÿ ÿ& zOsInfoTest.test_get_os_info_uacCs€ddlm}t d¡�V}d|j_d|j_d|_| ¡dks>J‚d|j_d|j_| ¡d ks^J‚Wdƒn1sr0YdS) Nrzplatform.systemrwrórê)rwrórñÚelse)rñr÷)r rGrrÚidrróZ get_os_info)rrìríZ mock_platformr r r Útest_get_os_infos  zOsInfoTest.test_get_os_infoc Cs¾ddlm}t dd¡��Žtjddd��$| ¡ddks@J‚Wdƒn1sT0Ytjddd��jt d ¡�@}d |ƒ_| ¡dd ks–J‚| ¡d d ksªJ‚Wdƒn1s¾0YWdƒn1sÜ0Ytjdd d��"| ¡dk�sJ‚Wdƒn1�s0Ytjddd��Rtjddd��"| ¡dk�sZJ‚Wdƒn1�sp0YWdƒn1�s�0YWdƒn1�s°0YdS)Nrzcertbot.util._USE_DISTROFrï)Z NonSystemDr³r³rZ nonsystemd)Údarwinràràzsubprocess.runz42.42.42rúr6)Úfreebsdz 9.3-RC3-p1rà)rûÚ9)Úwindowsràràzplatform.win32_ver)Z4242Ú95Ú2rà)rýrþ)r rGrrrôr')rríZrun_mockr r r Útest_non_systemd_os_info*s4 ÿ2ÿ Pÿ2ÿÿÿz#OsInfoTest.test_non_systemd_os_infocCs4ddlm}d|j_d|j_| ¡ddks0J‚dS)Nrràrê©r rGrørrórôrõr r r Útest_python_os_info_notfoundCs z'OsInfoTest.test_python_os_info_notfoundcCs0ddlm}d|j_d|j_| ¡dks,J‚dS)NrÚtestdistr³)rr³rrõr r r Útest_python_os_info_customKs z%OsInfoTest.test_python_os_info_customN)rr r!r"rrÚunittestZ skipUnlessÚsysÚplatformÚ startswithrîrörùrrrr r r r rés"    réc@s<eZdZdZdd„Zedd„ƒZdd„Zdd „Zd d „Z d S) ÚAtexitRegisterTestz'Tests for certbot.util.atexit_register.cCst ¡|_d|_ddi|_dS)N)ÚhiZansweré*)rZ MagicMockÚfuncrBrCr=r r r rEVs zAtexitRegisterTest.setUpcOsddlm}||i|¤ŽS)Nr)Úatexit_register)r r )r rBrCr r r r r [s zAtexitRegisterTest._callcCs(| t ¡¡|jj|ji|j¤ŽdSr™)Ú _test_commonrÚgetpidr Zassert_called_withrBrCr=r r r Ú test_called`szAtexitRegisterTest.test_calledcCs |jdd�|jjdusJ‚dS)Nr�)Ú initial_pidF)rr Úcalledr=r r r Útest_not_calledds z"AtexitRegisterTest.test_not_calledc Cs®t d|¡�Žt d¡�.}|j|jg|j¢Ri|j¤ŽWdƒn1sL0Y|jjsbJ‚|jj\}}|d}||dd…i|¤ŽWdƒn1s 0YdS)Nzcertbot.util._INITIAL_PIDzcertbot.util.atexitrr6) rrr r rBrCÚregisterrrR)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<eZdZdZedd„ƒZdd„Zdd„Zdd „Zd d „Z d S) ÚLooseVersionTestzäTest 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]&\}}| |¡ | |¡¡dksJ‚qdS)N)©z1.5.1z1.5.2b2©z3.4jz 1996.07.12©Z2g6Z11g©z0.960923z 2.2beta29©z1.13++z5.5.kw)ú2.0z2.0.1)ÚaÚbr�©r Útry_risky_comparison©rZ comparisonsZv1Zv2r r r Útest_less_than‚s zLooseVersionTest.test_less_thancCs4d}|D]&\}}| |¡ | |¡¡dksJ‚qdS)N))ú8.02r#)Ú1ar$)rÿú2.0.0)rr%rrr!r r r Ú test_equal�s zLooseVersionTest.test_equalcCs4d}|D]&\}}| |¡ | |¡¡dksJ‚qdS)N©)Z161z3.10a)z3.2.pl0z3.1.1.6r6rr!r r r Útest_greater_than•s z"LooseVersionTest.test_greater_thanc CsZd}|D]L\}}t t¡�*| |¡ | |¡¡s6J‚Wdƒq1sJ0YqdS)N))z bookworm/sidrü)r$rð)r1r2Ú ValueErrorr r r!r r r Útest_incomparible›s  z"LooseVersionTest.test_incomparibleN) rr r!r"r#r r"r&r(r*r r r r rts  rc@s4eZdZdZedd„ƒZdd„Zdd„Zdd „Zd S) ÚParseLooseVersionTestzëTest 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] \}}| |¡| |¡ksJ‚qdS)N)rrrrrr r!r r r r"±s z$ParseLooseVersionTest.test_less_thancCs| d¡| d¡ksJ‚dS)Nr#r r=r r r r&ºsz ParseLooseVersionTest.test_equalcCs.d}|D] \}}| |¡| |¡ksJ‚qdS)Nr'r r!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"r¥r”Ú importlibrrFr‰rrrr1rHrZcertbot.compatrrZcertbot.tests.utilZtestsrGZ test_utilZTestCaserr$r8ZTempDirTestCaser@rWr^rnrƒr•rœr¤r¿rÌrãrér rr+rÚexitÚmainÚargvÚ__file__r r r r Ús@     "!$'4;';S /!