a 5êdgíã@s2dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZddlZddlZddl Z ddl!Z!ddl"Z"ddl#Z#ddl$Z$ddl%m&Z&m'Z'ddl(Z(ddl)m*Z*m+Z+dd l,m-Z-m.Z.m/Z/m0Z0zddl1Z1ddl2Z2ddl3Z3Wn e4yŒdZ1Z2Z3Yn0z ddl5Z5Wne4y®Yn0Gd d „d e!j6ƒZ7Gd d „d e7ƒZ8Gdd„de7ƒZ9dZ:dZ;dZdZ?dZ@dZAdZBdZCeDeCe:dƒZEe:de;dede?d e@d!eAd"eBd#eCd$i ZFGd%d&„d&ejGƒZHGd'd(„d(ejGƒZIGd)d*„d*e7ƒZJGd+d,„d,e7ƒZKGd-d.„d.eLƒZMGd/d0„d0ejNƒZOGd1d2„d2eLƒZPGd3d4„d4e7ƒZQGd5d6„d6e(jRƒZSGd7d8„d8eLƒZTGd9d:„d:eTe&ƒZUGd;d<„d„d>eTe-ƒZWeXed?ƒrNGd@dA„dAeVƒZYGdBdC„dCeWƒZZGdDdE„dEe7ƒZ[GdFdG„dGe7ƒZ\GdHdI„dIej]ƒZ^GdJdK„dKe7ƒZ_GdLdM„dMe7ƒZ`dNdO„Zae! beXed?ƒdP¡GdQdR„dRe`ƒƒZcGdSdT„dTe7ƒZde! beXed?ƒdP¡GdUdV„dVedƒƒZeGdWdX„dXe7ƒZfe! beXed?ƒdP¡GdYdZ„dZefƒƒZge! bejhd[¡Gd\d]„d]efƒƒZiGd^d_„d_e7ƒZjGd`da„dae7ƒZkGdbdc„dce7ƒZlGddde„dee7ƒZmdºdfdg„ZnGdhdi„diƒZodjdk„ZpGdldm„dmejNƒZqGdndo„doe7ƒZrGdpdq„dqe7ƒZsGdrds„dse7ƒZtGdtdu„duejuƒZvGdvdw„dwe7ƒZwGdxdy„dye7ƒZxeXejydzƒrRddlzZzdd{l{m|Z|Gd|d}„d}e7ƒZ}e ~d¡ZGd~d„dej€ƒZeƒZ‚Gd€d„de!j6ƒZƒGd‚dƒ„dƒej„ƒZ…Gd„d…„d…e!j6ƒZ†Gd†d‡„d‡e7ƒZ‡Gdˆd‰„d‰e7ƒZˆGdŠd‹„d‹ƒZ‰GdŒd„dejŠƒZ‹GdŽd„de7ƒZŒGdd‘„d‘e7ƒZGd’d“„d“e7ƒZŽGd”d•„d•e!j6ƒZGd–d—„d—e!j6ƒZGd˜d™„d™e7ƒZ‘Gdšd›„d›e7ƒZ’Gdœd„de’ƒZ“GdždŸ„dŸe’ƒZ”Gd d¡„d¡e’ƒZ•d¢d£„Z–d¤d¥d¦d§d¨d©e–dªd«d¬ffD](\Z—Z˜e—e˜fd­d®„Z™eše•d¯e—e™ƒq²e! be1d°¡Gd±d²„d²e7ƒƒZ›Gd³d´„d´e!j6ƒZœe dµd¶¡d·d¸„ƒZžeŸd¹kr.ežƒdS)»zoTest harness for the logging module. Run all tests. Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. éN)Úassert_python_okÚassert_python_failure)Úsupport)Ú socket_helper)Ú TestHandler)Ú HTTPServerÚBaseHTTPRequestHandler)ÚurlparseÚparse_qs)ÚThreadingUDPServerÚDatagramRequestHandlerÚThreadingTCPServerÚStreamRequestHandlerc@s>eZdZdZdZdZdZdd„Zdd„Zdd d „Z d d „Z d S)ÚBaseTestzBase class for logging tests.z&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$rcCs”t ¡|_t ¡jj}t ¡zvtj  ¡|_ tj dd…|_ |  ¡|_ }tj  ¡|_tj  ¡|_i|_}|D]}t||ddƒ||<qpWt ¡n t ¡0t d¡|_t d¡|_t d¡|_|j ¡|_t ¡|_|j tj¡t |j¡|_ t !|j"¡|_#|j  $|j#¡|j %¡r:|jj&|jj&}t'd|ƒ‚|j %¡rb|jj&|jj&}t'd|ƒ‚|j (|j ¡| )|j %¡¡| )|j %¡¡dS)zxSetup the default logging stream to an internal StringIO instance, so that we can examine log output as we want.NÚdisabledu«×»uĿÖGÚzUnexpected handlers: %s)*rZthreading_setupÚ_threading_keyÚloggingÚ getLoggerÚmanagerÚ loggerDictÚ _acquireLockÚ _handlersÚcopyÚsaved_handlersÚ _handlerListÚsaved_handler_listÚ saved_loggersÚ _nameToLevelÚsaved_name_to_levelÚ _levelToNameÚsaved_level_to_nameÚ logger_statesÚgetattrÚ _releaseLockÚlogger1Úlogger2Ú root_loggerÚgetEffectiveLevelÚoriginal_logging_levelÚioÚStringIOÚstreamÚsetLevelÚDEBUGÚ StreamHandlerÚ root_hdlrÚ FormatterÚ log_formatÚroot_formatterÚ setFormatterÚ hasHandlersÚhandlersÚAssertionErrorÚ addHandlerÚ assertTrue)ÚselfZ logger_dictrr"ÚnameZhlist©r<ú-/usr/local/lib/python3.9/test/test_logging.pyÚsetUpOsB      ÿ          zBaseTest.setUpcCs8|j ¡|j |j¡|jjrB|jjd}|j |¡| ¡q|j |j¡t  ¡z¼tj   ¡tj   |j ¡tj  ¡tj  |j¡tj  ¡tj  |j¡|jtjdd…<t ¡j}d|_|j}|  ¡|  |j¡|j}|jD] }||durè|||j|_qèWt ¡n t ¡0| ¡tj|jŽdS)zJRemove our logging stream, and restore the original logging level.rN) r,Úcloser'Ú removeHandlerr0r6r-r)rrr ÚclearÚupdater!rrrrrrrrÚdisablerrr"rr$Z doCleanupsrZthreading_cleanupr)r:Úhrrr"r;r<r<r=ÚtearDownys8           zBaseTest.tearDownNc Csœ|p|j}t |p|j¡}| ¡ ¡}| t|ƒt|ƒ¡t||ƒD]8\}}|  |¡}|sh|  d|¡| t |  ¡ƒ|¡qD|  ¡}|r˜|  d|¡dS)z±Match the collected log lines against the regular expression self.expected_log_pat, and compare the extracted group values to the expected_values list of tuples.z*Log line does not match expected pattern: z'Remaining output at end of log stream: N)r,ÚreÚcompileÚexpected_log_patÚgetvalueÚ splitlinesÚ assertEqualÚlenÚzipÚsearchÚfailÚtupleÚgroupsÚread) r:Zexpected_valuesr,ÚpatZ actual_linesÚactualÚexpectedÚmatchÚsr<r<r=Úassert_log_lines›s   ÿzBaseTest.assert_log_linescCs|jd7_d|jS)zMGenerate a message consisting solely of an auto-incrementing integer.éz%d)Ú message_num©r:r<r<r=Ú next_message­szBaseTest.next_message)NN) Ú__name__Ú __module__Ú __qualname__Ú__doc__r2rHrZr>rErXr\r<r<r<r=rGs*" rc@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)ÚBuiltinLevelsTestz*Test builtin levels and their inheritance.cCs"|j}t d¡}| tj¡t t d¡i¡}| tj¡t d¡}| tj¡| tj |ƒ¡|  |ƒ¡| tj |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡| tj |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡| gd¢¡dS)NÚERRÚINFÚDEB) )rbÚCRITICALÚ1)rbÚERRORÚ2)rcreÚ3)rcrgÚ4)rcÚWARNINGÚ5)rcÚINFOÚ6)rdreÚ7)rdrgÚ8)rdrkÚ9)rdrmÚ10)rdr.Ú11)r\rrr-rgÚ LoggerAdapterrmr.ÚlogreÚerrorÚwarningÚinfoÚdebugrX)r:Úmrbrcrdr<r<r=Ú test_flat·s.                 zBuiltinLevelsTest.test_flatcCs„|j}t d¡}| tj¡t d¡}| tj¡| tj|ƒ¡| |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  ddg¡dS)NrcúINF.ERR)r|rerf)r|rgrh© r\rrr-rmrgrurervrwrxryrX)r:rzrcÚINF_ERRr<r<r=Útest_nested_explicitæs        þz&BuiltinLevelsTest.test_nested_explicitcCsâ|j}t d¡}| tj¡t d¡}| tj¡t d¡}t d¡}t d¡}| tj|ƒ¡| |ƒ¡|  |ƒ¡|  |ƒ¡| tj|ƒ¡| |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  |ƒ¡|  gd¢¡dS)Nrcr|ú INF.UNDEFú INF.ERR.UNDEFÚUNDEF))r€rerf)r€rgrh)r€rkri)r€rmrj)rrerl)rrgrnr})r:rzrcr~Z INF_UNDEFZ INF_ERR_UNDEFr‚r<r<r=Útest_nested_inheritedýs&               z'BuiltinLevelsTest.test_nested_inheritedcCs’|j}t d¡}t d¡}t d¡}| tj¡| tj|ƒ¡| |ƒ¡| tj|ƒ¡| |ƒ¡| |ƒ¡| |ƒ¡|  gd¢¡dS)NrcúINF.BADPARENT.UNDEFú INF.BADPARENT))r„rerf)r„rmrh)r…reri)r…rmrj) r\rrr-rmruÚFATALrxryrX)r:rzrcZ GRANDCHILDZCHILDr<r<r=Útest_nested_with_virtual_parent s        z1BuiltinLevelsTest.test_nested_with_virtual_parentcCs,| t d¡tj¡| t tj¡d¡dS)z&See issue #22386 for more information.rmN)rKrÚ getLevelNamermr[r<r<r=Útest_regression_22386:sz'BuiltinLevelsTest.test_regression_22386cCst d¡}| |tj¡dS)Nr†)rrˆrKr†)r:Úfatalr<r<r=Útest_issue27935?s z!BuiltinLevelsTest.test_issue27935cCs`t tjd¡| tjtjd¡| t tj¡d¡| t tj¡d¡| t d¡tj¡dS)z&See issue #29220 for more information.rrmÚNOTSETN)rÚ addLevelNamermÚ addCleanuprKrˆrŒr[r<r<r=Útest_regression_29220Cs z'BuiltinLevelsTest.test_regression_29220N) r]r^r_r`r{rrƒr‡r‰r‹rr<r<r<r=ra´s/#rac@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚBasicFilterTestzTest the bundled Filter class.c Cs®t d¡}|jjd}z†| |¡t d¡}t d¡}t d¡}t d¡}| | ¡¡| | ¡¡| | ¡¡| | ¡¡| ddg¡W|  |¡n |  |¡0dS)Nú spam.eggsrÚspamúspam.eggs.fishúspam.bakedbeans©r‘rmrh©r“rmri) rÚFilterr'r6Ú addFilterrrxr\rXÚ removeFilter)r:Zfilter_Úhandlerr’Ú spam_eggsÚspam_eggs_fishÚspam_bakedbeansr<r<r=Ú test_filterOs"       þzBasicFilterTest.test_filterc Cs¬dd„}|jjd}z†| |¡t d¡}t d¡}t d¡}t d¡}| | ¡¡| | ¡¡| | ¡¡| | ¡¡| dd g¡W| |¡n | |¡0dS) NcSs&|j d¡}d |dd…¡}|dkS)NÚ.ér‘)r;ÚsplitÚjoin)ÚrecordÚpartsÚprefixr<r<r=Ú filterfuncks z8BasicFilterTest.test_callable_filter..filterfuncrr’r‘r“r”r•r–) r'r6r˜rrrxr\rXr™)r:r¦ršr’r›rœrr<r<r=Útest_callable_filtergs"      þz$BasicFilterTest.test_callable_filtercCs*t ¡}t ddi¡}| | |¡¡dS)Nr;r‘)rr—Ú makeLogRecordr9Úfilter)r:ÚfÚrr<r<r=Útest_empty_filter„sz!BasicFilterTest.test_empty_filterN)r]r^r_r`ržr§r¬r<r<r<r=rKsréxéwévéuétéséréqépéorYÚSilentÚTaciturnÚTerseÚEffusiveÚSociableÚVerboseÚ TalkativeZ GarrulousÚ ChatterboxÚBoringc@seZdZdZdd„ZdS)ÚGarrulousFilterz)A filter which blocks garrulous messages.cCs |jtkS©N)ÚlevelnoÚ GARRULOUS©r:r£r<r<r=r©³szGarrulousFilter.filterN©r]r^r_r`r©r<r<r<r=rÀ¯srÀc@seZdZdZdd„ZdS)ÚVerySpecificFilterz5A filter which blocks sociable and taciturn messages.cCs|jttfvSrÁ)rÂÚSOCIABLEÚTACITURNrÄr<r<r=r©ºszVerySpecificFilter.filterNrÅr<r<r<r=rƶsrÆc@s<eZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d S)ÚCustomLevelsAndFiltersTestz@Test various filtering possibilities with custom logging levels.ú^[\w.]+ -> (\w+): (\d+)$cCs,t |¡t ¡D]\}}t ||¡qdSrÁ)rr>Úmy_logging_levelsÚitemsrr)r:ÚkÚvr<r<r=r>Ås z CustomLevelsAndFiltersTest.setUpcCstD]}| || ¡¡qdSrÁ)Ú LEVEL_RANGErur\)r:ÚloggerZlvlr<r<r=Úlog_at_all_levelsÊsz,CustomLevelsAndFiltersTest.log_at_all_levelscCs*|j t¡| |j¡| gd¢¡dS)N)©r¼rl©r»rn©rºro©r¹rp©r¸rq©r·rr)r'r-ÚVERBOSErÑrXr[r<r<r=Útest_logger_filterÎs  z-CustomLevelsAndFiltersTest.test_logger_filterc Cs`|jjd t¡z2| |j¡| gd¢¡W|jjd tj¡n|jjd tj¡0dS)Nr)rÓrÔrÕrÖr×)r'r6r-rÇrÑrXrrŒr[r<r<r=Útest_handler_filterÜs  z.CustomLevelsAndFiltersTest.test_handler_filterc Cs®|jjd}d}tƒ}| |¡zl| |j¡gd¢}| |¡tƒ}|j |¡| |j¡| |gd¢¡W|r‚|j |¡| |¡n|rž|j |¡| |¡0dS)Nr) )r¿rf)r¾rh)r½rjrÒrÓrÔrÕrÖr×))r¿rs)r¾Z12)r½Z14)r¼Z15)rºZ17)r¹Z18)r·Z20)r'r6rÀr˜rÑrXrÆr™)r:ršZspecific_filterZgarrZ first_linesr<r<r=Útest_specific_filtersìs$         þ z0CustomLevelsAndFiltersTest.test_specific_filtersN) r]r^r_r`rHr>rÑrÙrÚrÛr<r<r<r=rɾsrÉc@sZeZdZdd„Zdd„Zdd„Ze ej dkd¡d d „ƒZ e e ed ƒ d ¡d d„ƒZ dS)Ú HandlerTestcCsDt ¡}d|_| |jd¡d|_| |jd¡| t|jd¡dS)NÚgenericZanothergeneric)rÚHandlerr;rKÚ assertRaisesÚNotImplementedErrorÚemit©r:rDr<r<r=Ú test_names zHandlerTest.test_namec CsôtjdvrXdD]æ}t ¡\}}t |¡|s8t |¡tjj |dd}|rÄ|j |j }}|  |d¡|  |d¡t  ddi¡}| |¡t |¡| tj |¡¡| |¡| tj |¡¡n|  |j d¡|  |j d¡| ¡|rt |¡qtjdkr d }nd }z4tj |¡}|  |j|j¡| |j¡| ¡WntyVYn0d D]@} | d kr‚| ttjjd d| ¡ntj d d| ¡}| ¡q\tj d¡}t  i¡}| | |¡¡| ¡tj d¡}| | |¡¡| ¡dS)N©ÚlinuxÚdarwin)TFT©ÚdelayéÿÿÿÿÚmsgZTestræz/var/run/syslogz/dev/log)ÚGETÚPOSTÚPUTríÚ localhostz/logrrY)ÚsysÚplatformÚtempfileÚmkstempÚosr?Úunlinkrr6ÚWatchedFileHandlerÚdevÚinorKr¨ÚhandleÚ assertFalseÚpathÚexistsr9Ú SysLogHandlerZfacilityZLOG_USERZ unixsocketÚOSErrorrßÚ ValueErrorÚ HTTPHandlerZBufferingHandlerZ shouldFlush) r:ZexistingÚfdÚfnrDrör÷r«ZsocknameÚmethodr<r<r=Útest_builtin_handlers s\                ÿ    z!HandlerTest.test_builtin_handlerscCs´t ¡\}}t |¡t |¡t |¡}tj|dfftj j |dfftj j |dfff}t j dvrv|tj j|dfff7}|D]4\}}||Ž}| tj |¡¡| ¡t |¡qzdS)zs Test that Path objects are accepted as filename arguments to handlers. See Issue #27493. ÚwÚarDräN)rñròrór?rôÚpathlibÚPathrÚ FileHandlerr6ÚRotatingFileHandlerÚTimedRotatingFileHandlerrïrðrõr9rúrû)r:rrZpfnZcasesÚclsÚargsrDr<r<r=Útest_path_objectsVs     ý  zHandlerTest.test_path_objectsÚntz/WatchedFileHandler not appropriate for Windows.c sN‡fdd„}d}d}dˆ_dˆ_dD]"}t dd¡\}}t |¡tj|||fd}d|_|  ¡t j j ||d }t   d ¡} | | ¡z”t|ƒD]^} t d ¡t  d d i¡} zt ¡ˆ_| | ¡Wq’tyîtdˆjˆjfƒ‚Yq’0q’W| ¡| ¡tj |¡rHt |¡q$| ¡| ¡tj |¡rFt |¡0q$dS)Nc sTt|ƒD]F}zt |¡t ¡ˆ_Wnty6Yn0t dt dd¡¡qdS)Ngü©ñÒMbp?ré) ÚrangerórôÚtimeÚ deletion_timerýÚsleepÚrandomÚrandint)ZfnameZtriesÚ_r[r<r=Ú remove_loopps   z*HandlerTest.test_race..remove_loopiô©FTú.logztest_logging-3-©Útargetr Trçz'%(asctime)s: %(levelname)s: %(message)sç{®Gázt?rêZtestingzDeleted at %s, opened at %s)Z handle_timerrñròrór?Ú threadingÚThreadÚdaemonÚstartrr6rõr1r4rrrr¨røÚ ExceptionÚprintr¢rúrûrô) r:rZ del_countZ log_countrèrrZremoverrDrªrr«r<r[r=Ú test_racemsH         ÿÿ  ýzHandlerTest.test_raceÚforkzTest requires os.fork().c s&Gdd„dtjƒ}| ttjƒd¡|ƒ‰| ˆjjj¡dˆ_ |  ttjƒd¡|  ttj ƒd¡t  d¡}|  ˆ¡| tj¡t ¡‰t ¡‰‡‡‡fdd„}tj|d d }| ¡ˆ ¡t ¡}|dkrúz| d ¡Wt d¡n t d¡0n(| d ¡ˆ ¡| ¡tj|dd dS)z>Ensure child logging locks are not held; bpo-6721 & bpo-36533.cs$eZdZ‡fdd„Zdd„Z‡ZS)zAHandlerTest.test_post_fork_child_no_deadlock.._OurHandlercs"tƒ ¡tjtddƒd|_dS)Nz /dev/nullZwt©r,)ÚsuperÚ__init__rr/ÚopenÚ sub_handlerr[©Ú __class__r<r=r'¢s ÿzJHandlerTest.test_post_fork_child_no_deadlock.._OurHandler.__init__cSs6|j ¡z|j |¡W|j ¡n |j ¡0dSrÁ)r)ÚacquireráÚreleaserÄr<r<r=rá§s zFHandlerTest.test_post_fork_child_no_deadlock.._OurHandler.emit©r]r^r_r'ráÚ __classcell__r<r<r*r=Ú _OurHandler¡s r0rz*because we need at least one for this testrYÚ test_post_fork_child_no_deadlockcsVt ¡z>ˆ ¡zˆ ¡ˆ d¡Wˆ ¡n ˆ ¡0Wt ¡n t ¡0dS)Nçà?)rrr,ÚsetÚwaitr-r$r<©Z+fork_happened__release_locks_and_end_threadZlocks_held__ready_to_forkZrefed_hr<r=Úlock_holder_thread_fn»s zKHandlerTest.test_post_fork_child_no_deadlock..lock_holder_thread_fnz,test_post_fork_child_no_deadlock lock holder)rr;z#Child process did not deadlock. \o/z&Parent process returned from fork. \o/)ÚexitcodeN)rrÞrKrLrrŽr)r,r?r;Ú assertGreaterÚ_at_fork_reinit_lock_weaksetrr8r-r.rÚEventrr r4rór$rxÚ_exitr3r¢rZ wait_process)r:r0Z test_loggerr6Zlock_holder_threadÚpidr<r5r=r1žs8    þ  z,HandlerTest.test_post_fork_child_no_deadlockN) r]r^r_rãrr ÚunittestZskipIfrór;r#Úhasattrr1r<r<r<r=rÜs6 0rÜc@seZdZdd„ZdS)Ú BadStreamcCs tdƒ‚dS)Núdeliberate mistake)Ú RuntimeError©r:Údatar<r<r=ÚwriteëszBadStream.writeN)r]r^r_rDr<r<r<r=r?êsr?c@seZdZdd„ZdS)ÚTestStreamHandlercCs ||_dSrÁ)Ú error_recordrÄr<r<r=Ú handleErrorïszTestStreamHandler.handleErrorN)r]r^r_rGr<r<r<r=rEîsrEc@seZdZejZdZdS)ÚStreamWithIntNamer N)r]r^r_rrŒÚlevelr;r<r<r<r=rHòsrHc@s$eZdZdd„Zdd„Zdd„ZdS)ÚStreamHandlerTestcCsättƒƒ}t i¡}tj}z¼| |¡| |j|¡t tƒ¡}t   ¡.}| |¡d}|  ||  ¡¡Wdƒn1s|0Ydt_t   ¡*}| |¡|  d|  ¡¡Wdƒn1sÄ0YW|t_n|t_0dS)Nz" RuntimeError: deliberate mistake Fr)rEr?rr¨ÚraiseExceptionsrøÚassertIsrFr/rÚcaptured_stderrÚassertInrIrK)r:rDr«Z old_raiseÚstderrrêr<r<r=Útest_error_handling÷s       .  0z%StreamHandlerTest.test_error_handlingcCsVt ¡}t ¡}| |¡}| |tj¡| |¡}| ||¡| |¡}| |¡dS)z3 Test setting the handler's stream N) rr/r*r+Ú setStreamrLrïrOÚ assertIsNone)r:rDr,ÚoldrTr<r<r=Útest_stream_setting s    z%StreamHandlerTest.test_stream_settingcCs t tƒ¡}| t|ƒd¡dS)Nz)rr/rHrKÚreprrâr<r<r=Ú'test_can_represent_stream_with_int_names z9StreamHandlerTest.test_can_represent_stream_with_int_nameN)r]r^r_rPrTrVr<r<r<r=rJösrJc@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd S) ÚTestSMTPServera This class implements a test SMTP server. :param addr: A (host, port) tuple which the server listens on. You can specify a port value of zero: the server's *port* attribute will hold the actual port number used, which can be used in client connections. :param handler: A callable which will be called to process incoming messages. The handler will be passed the client address tuple, who the message is from, a list of recipients and the message data. :param poll_interval: The interval, in seconds, used in the underlying :func:`select` or :func:`poll` call by :func:`asyncore.loop`. :param sockmap: A dictionary which will be used to hold :class:`asyncore.dispatcher` instances used by :func:`asyncore.loop`. This avoids changing the :mod:`asyncore` module's global state. cCsBtjj||d|dd|j ¡d|_||_d|_d|_||_ dS)NT)ÚmapZ decode_datarYF) ÚsmtpdÚ SMTPServerr'ÚsocketÚ getsocknameÚportÚ_handlerÚ_threadÚ_quitÚ poll_interval)r:ÚaddrršraÚsockmapr<r<r=r'7sÿzTestSMTPServer.__init__cCs| ||||¡dS)aI Delegates to the handler passed in to the server's constructor. Typically, this will be a test case method. :param peer: The client (host, port) tuple. :param mailfrom: The address of the sender. :param rcpttos: The addresses of the recipients. :param data: The message. N)r^)r:ÚpeerÚmailfromÚrcpttosrCr<r<r=Úprocess_message@s zTestSMTPServer.process_messagecCs0tj|j|jfd|_}| d¡| ¡dS)zG Start the server running on a separate daemon thread. rTN©rrÚ serve_foreverrar_Ú setDaemonr ©r:Útr<r<r=r Ls ÿ  zTestSMTPServer.startcCs|jstj||jddqdS)a* Run the :mod:`asyncore` loop until normal termination conditions arise. :param poll_interval: The interval, in seconds, used in the underlying :func:`select` or :func:`poll` call by :func:`asyncore.loop`. rY)rXÚcountN)r`ÚasyncoreZloopÚ_map©r:rar<r<r=riUszTestSMTPServer.serve_forevercCs4d|_t |j¡d|_| ¡tj|jdddS)zr Stop the thread by closing the server instance. Wait for the server thread to terminate. TN)rXZ ignore_all)r`rÚ join_threadr_r?rnZ close_allror[r<r<r=Ústop`s  zTestSMTPServer.stopN) r]r^r_r`r'rgr rirrr<r<r<r=rW"s     rWcs8eZdZdZdd„Zdd„Z‡fdd„Zdd „Z‡ZS) Ú ControlMixina  This mixin is used to start a server on a separate thread, and shut it down programmatically. Request handling is simplified - instead of needing to derive a suitable RequestHandler subclass, you just provide a callable which will be passed each received request to be processed. :param handler: A handler callable which will be called with a single parameter - the request - in order to process the request. This handler is called on the server thread, effectively meaning that requests are processed serially. While not quite Web scale ;-), this should be fine for testing applications. :param poll_interval: The polling interval in seconds. cCs d|_||_||_t ¡|_dSrÁ)r_rar^rr:Úready)r:ršrar<r<r=r'|szControlMixin.__init__cCs0tj|j|jfd|_}| d¡| ¡dS)zI Create a daemon thread to run the server, and start it. rTNrhrkr<r<r=r ‚s ÿ  zControlMixin.startcs|j ¡tt|ƒ |¡dS)z^ Run the server. Set the ready flag before entering the service loop. N)rtr3r&rsrirpr*r<r=ri‹s zControlMixin.serve_forevercCs:| ¡|jdur$t |j¡d|_| ¡|j ¡dS)zK Tell the server thread to stop, and wait for it to do so. N)Úshutdownr_rrqÚ server_closertrAr[r<r<r=rr“s   zControlMixin.stop) r]r^r_r`r'r rirrr/r<r<r*r=rsls  rsc@s"eZdZdZd dd„Zdd„ZdS) ÚTestHTTPServera® An HTTP server which is controllable using :class:`ControlMixin`. :param addr: A tuple with the IP address and port to listen on. :param handler: A handler callable which will be called with a single parameter - the request - in order to process the request. :param poll_interval: The polling interval in seconds. :param log: Pass ``True`` to enable log messages. r2FNcs<G‡‡fdd„dtƒ‰t ||ˆ¡t |||¡||_dS)Ncs2eZdZddd„Zdd„Z‡‡‡fdd„Z‡ZS) z=TestHTTPServer.__init__..DelegatingHTTPRequestHandlerNcSs| d¡r|jSt|ƒ‚dS)NZdo_)Ú startswithÚprocess_requestÚAttributeError)r:r;Údefaultr<r<r=Ú __getattr__¬s zITestHTTPServer.__init__..DelegatingHTTPRequestHandler.__getattr__cSs|j |¡dSrÁ©Úserverr^r[r<r<r=ry±szMTestHTTPServer.__init__..DelegatingHTTPRequestHandler.process_requestcs ˆrtˆ|ƒj|g|¢RŽdSrÁ)r&Ú log_message)r:Úformatr )ÚDelegatingHTTPRequestHandlerr+rur<r=r´sÿÿÿzITestHTTPServer.__init__..DelegatingHTTPRequestHandler.log_message)N)r]r^r_r|ryrr/r<©rrur*r=r«s r)rrr'rsÚsslctx)r:rbršrarurƒr<r‚r=r'©s zTestHTTPServer.__init__c Cshz(|j ¡\}}|jr&|jj|dd}Wn6ty^}ztj d|¡‚WYd}~n d}~00||fS)NT)Z server_sidezGot an error: %s )r[ÚacceptrƒZ wrap_socketrýrïrOrD)r:ÚsockrbÚer<r<r=Ú get_request¼szTestHTTPServer.get_request)r2FN)r]r^r_r`r'r‡r<r<r<r=rwžs  ÿ rwcs.eZdZdZdZddd„Z‡fdd„Z‡ZS) Ú TestTCPServeraÓ A TCP server which is controllable using :class:`ControlMixin`. :param addr: A tuple with the IP address and port to listen on. :param handler: A handler callable which will be called with a single parameter - the request - in order to process the request. :param poll_interval: The polling interval in seconds. :bind_and_activate: If True (the default), binds the server and starts it listening. If False, you need to call :meth:`server_bind` and :meth:`server_activate` at some later time before calling :meth:`start`, so that the server will set up the socket and listen on it. Tr2cCs2Gdd„dtƒ}t ||||¡t |||¡dS)Nc@seZdZdd„ZdS)z;TestTCPServer.__init__..DelegatingTCPRequestHandlercSs|j |¡dSrÁr}r[r<r<r=røÜszBTestTCPServer.__init__..DelegatingTCPRequestHandler.handleN)r]r^r_rør<r<r<r=ÚDelegatingTCPRequestHandlerÚsr‰)rr r'rs)r:rbršraÚbind_and_activater‰r<r<r=r'Øs  ÿzTestTCPServer.__init__cs"tt|ƒ ¡|j ¡d|_dS©NrY)r&rˆÚ server_bindr[r\r]r[r*r<r=rŒâszTestTCPServer.server_bind)r2T)r]r^r_r`Zallow_reuse_addressr'rŒr/r<r<r*r=rˆÇs ÿ rˆcs6eZdZdZd dd„Z‡fdd„Z‡fdd „Z‡ZS) Ú TestUDPServera0 A UDP server which is controllable using :class:`ControlMixin`. :param addr: A tuple with the IP address and port to listen on. :param handler: A handler callable which will be called with a single parameter - the request - in order to process the request. :param poll_interval: The polling interval for shutdown requests, in seconds. :bind_and_activate: If True (the default), binds the server and starts it listening. If False, you need to call :meth:`server_bind` and :meth:`server_activate` at some later time before calling :meth:`start`, so that the server will set up the socket and listen on it. r2Tcs<G‡fdd„dtƒ‰t ||ˆ|¡t |||¡d|_dS)Ncs&eZdZdd„Z‡‡fdd„Z‡ZS)z;TestUDPServer.__init__..DelegatingUDPRequestHandlercSs|j |¡dSrÁr}r[r<r<r=røûszBTestUDPServer.__init__..DelegatingUDPRequestHandler.handlecsB|j ¡}|r>ztˆ|ƒ ¡Wnty<|jjs8‚Yn0dSrÁ)ZwfilerIr&Úfinishrýr~Ú_closedrB)ÚDelegatingUDPRequestHandlerr+r<r=rŽþs  zBTestUDPServer.__init__..DelegatingUDPRequestHandler.finish)r]r^r_rørŽr/r<©rr*r=rùsrF)r r r'rsr)r:rbršrarŠr<r‘r=r'÷sþzTestUDPServer.__init__cs"tt|ƒ ¡|j ¡d|_dSr‹)r&rrŒr[r\r]r[r*r<r=rŒ szTestUDPServer.server_bindcstt|ƒ ¡d|_dS)NT)r&rrvrr[r*r<r=rvszTestUDPServer.server_close)r2T)r]r^r_r`r'rŒrvr/r<r<r*r=ræs ÿ  rÚAF_UNIXc@seZdZejZdS)ÚTestUnixStreamServerN©r]r^r_r[r’Úaddress_familyr<r<r<r=r“sr“c@seZdZejZdS)ÚTestUnixDatagramServerNr”r<r<r<r=r–sr–c@s"eZdZejZdd„Zdd„ZdS)ÚSMTPHandlerTestc Cs i}ttjdf|jd|ƒ}| ¡tj|jf}tjj|ddd|j d}|  |j dg¡g|_ t  ddi¡}t ¡|_| |¡|j |j ¡| ¡| |j ¡¡|  t|j ƒd ¡|j d\}}}} |  |d¡|  |dg¡| d | ¡| |  d ¡¡| ¡dS) Nrçü©ñÒMbP?ÚmeZyouZLog)Útimeoutrêu Hello ✓rYz Subject: Log u Hello ✓)rWrZHOSTrgr r]rr6Z SMTPHandlerÚTIMEOUTrKZtoaddrsÚmessagesr¨rr:Úhandledrør4rrr9Úis_setrLrNÚendswithr?) r:rcr~rbrDr«rdrerfrCr<r<r=Ú test_basic"s0ÿ ÿ    zSMTPHandlerTest.test_basiccGs|j |¡|j ¡dSrÁ)rœÚappendrr3)r:r r<r<r=rg:s zSMTPHandlerTest.process_messageN)r]r^r_rZ LONG_TIMEOUTr›r rgr<r<r<r=r—sr—c@s<eZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d S)ÚMemoryHandlerTestzTests for the MemoryHandler.rÊcCsFt |¡tj dtj|j¡|_t d¡|_ d|j _ |j   |j¡dS)Né Zmemr) rr>rr6Ú MemoryHandlerrkr0Úmem_hdlrrÚ mem_loggerÚ propagater8r[r<r<r=r>Es  ÿ zMemoryHandlerTest.setUpcCs|j ¡t |¡dSrÁ)r¥r?rrEr[r<r<r=rEMs zMemoryHandlerTest.tearDowncCsÜ|j | ¡¡| g¡|j | ¡¡| g¡|j | ¡¡gd¢}| |¡dD]b}tdƒD]}|j | ¡¡qf| |¡|j | ¡¡|dd„t||dƒDƒ}| |¡qZ|j | ¡¡| |¡dS)N)©r.rf©rmrh)rkri)réé cSsg|]}dt|ƒf‘qS)r.)Ústr)Ú.0Úir<r<r=Ú góz0MemoryHandlerTest.test_flush..r£)r¦ryr\rXrxrwr)r:ÚlinesÚnr®r<r<r=Ú test_flushQs       zMemoryHandlerTest.test_flushcCsÞ|j | ¡¡| g¡|j | ¡¡| g¡|j |j¡|j ¡ddg}| |¡tj   dtj |j d¡|_|j  |j¡|j | ¡¡| |¡|j | ¡¡| |¡|j |j¡|j ¡| |¡dS)zO Test that the flush-on-close configuration works as expected. r¨r©r£FN)r¦ryr\rXrxr@r¥r?rr6r¤rkr0r8)r:r±r<r<r=Útest_flush_on_closems,   þ  þ   z%MemoryHandlerTest.test_flush_on_closec CsŒGdd„dƒ}||jƒ}zV|j |¡tdƒD]&}t d¡|j d¡|j d¡q.W|jD]}t   |¡q^n|jD]}t   |¡qv0dS)Nc@s$eZdZdd„Zdd„Zdd„ZdS)zZMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandlercSs||_g|_dSrÁ)r¥Úthreads)r:r¥r<r<r=r'szcMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.__init__cSs|j d¡dSrÁ)r¥Ú setTargetr[r<r<r=Ú removeTarget‘szgMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.removeTargetcSs&tj|jd}|j |¡| ¡dS)N)r)rrr·rµr¡r )r:rêÚthreadr<r<r=rø”s zaMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.handleN)r]r^r_r'r·rør<r<r<r=ÚMockRaceConditionHandlerŒsr¹r£rz not flushedZflushed) r¥r¶rrrr¦rxrwrµrrq)r:r¹rrr¸r<r<r=Ú&test_race_between_set_target_and_flush‹s      ÿ z8MemoryHandlerTest.test_race_between_set_target_and_flushN) r]r^r_r`rHr>rEr³r´rºr<r<r<r=r¢>sr¢c@seZdZdZdd„ZdS)ÚExceptionFormatterzA special exception formatter.cCsd|djS)Nz Got a [%s]r)r])r:Úeir<r<r=ÚformatException¨sz"ExceptionFormatter.formatExceptionN)r]r^r_r`r½r<r<r<r=r»¦sr»c@sÚeZdZdZejZdZdZdZdZ e  dd¡Z e  dd ¡Z d ed Z e  d d ¡ZdZdZdZdZdd„Zdd„Zdd„Zefdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Z d.S)/ÚConfigFileTestz5Reading logging config from a .ini-style config file.ú^(\w+) \+\+ (\w+)$aN [loggers] keys=root [handlers] keys=hand1 [formatters] keys=form1 [logger_root] level=WARNING handlers=hand1 [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stdout,) [formatter_form1] format=%(levelname)s ++ %(message)s datefmt= aµ [loggers] keys=root,parser [handlers] keys=hand1 [formatters] keys=form1 [logger_root] level=WARNING handlers= [logger_parser] level=DEBUG handlers=hand1 propagate=1 qualname=compiler.parser [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stdout,) [formatter_form1] format=%(levelname)s ++ %(message)s datefmt= aµ [loggers] keys=root,parser [handlers] keys=hand1 [formatters] keys=form1 [logger_root] level=WARNING handlers=hand1 [logger_parser] level=DEBUG handlers= propagate=1 qualname=compiler.parser [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stdout,) [formatter_form1] format=%(levelname)s ++ %(message)s datefmt= z sys.stdoutz sys.stboutzformatter=form1zformatter=misspelled_namea [loggers] keys=root [handlers] keys=hand1 [formatters] keys=form1 [logger_root] level=NOTSET handlers=hand1 [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stdout,) [formatter_form1] class=zS.ExceptionFormatter format=%(levelname)s:%(name)s:%(message)s datefmt= zclass=StreamHandlerzclass=logging.StreamHandlerag [loggers] keys=root,parser [handlers] keys=hand1, hand2 [formatters] keys=form1, form2 [logger_root] level=WARNING handlers= [logger_parser] level=DEBUG handlers=hand1 propagate=1 qualname=compiler.parser [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stdout,) [handler_hand2] class=StreamHandler level=NOTSET formatter=form1 args=(sys.stderr,) [formatter_form1] format=%(levelname)s ++ %(message)s datefmt= [formatter_form2] format=%(message)s datefmt= a% [loggers] keys=root,parser,compiler [handlers] keys=hand1 [formatters] keys=form1 [logger_root] level=WARNING handlers=hand1 [logger_compiler] level=DEBUG handlers= propagate=1 qualname=compiler [logger_parser] level=DEBUG handlers= propagate=1 qualname=compiler.parser [handler_hand1] class=StreamHandler level=NOTSET formatter=form1 kwargs={'stream': sys.stdout,} [formatter_form1] format=%(levelname)s ++ %(message)s datefmt= zã [loggers] keys=root [handlers] keys=file [formatters] keys= [logger_root] level=DEBUG handlers=file [handler_file] class=FileHandler level=DEBUG args=("{tempfile}",) zø [loggers] keys=root [handlers] keys=screen [formatters] keys= [logger_root] level=DEBUG handlers=screen [handler_screen] level=DEBUG class=StreamHandler args=(sys.stdout,) formatter= cKs(t t |¡¡}tjj|fi|¤ŽdSrÁ)r*r+ÚtextwrapÚdedentrÚconfigÚ fileConfig)r:ÚconfÚkwargsÚfiler<r<r=Ú apply_config«szConfigFileTest.apply_configcCsvt ¡Z}| |j¡t ¡}| | ¡¡| | ¡¡|j dg|d|  g¡Wdƒn1sh0YdS©N©rgrhr%© rÚcaptured_stdoutrÇÚconfig0rrrxr\rvrX©r:ÚoutputrÐr<r<r=Útest_config0_ok¯s  ÿþzConfigFileTest.test_config0_okcCsšt ¡~}t t |j¡¡}t ¡}|  |¡t j   |¡t   ¡}| | ¡¡| | ¡¡|jdg|d| g¡Wdƒn1sŒ0YdSrÈ)rrËr*r+rÀrÁrÌÚ configparserÚ ConfigParserZ read_filerrÂrÃrrxr\rvrX)r:rÎrÆZcprÐr<r<r=Útest_config0_using_cp_ok¾s   ÿþz'ConfigFileTest.test_config0_using_cp_okcCsxt ¡\}| |¡t d¡}| | ¡¡| | ¡¡|jddg|d| g¡Wdƒn1sj0YdS©Núcompiler.parser©rmrfrÉr%© rrËrÇrrrxr\rvrX©r:rÂrÎrÐr<r<r=Útest_config1_okÐs   þýzConfigFileTest.test_config1_okcCs| t|j|j¡dSrÁ©rßr!rÇÚconfig2r[r<r<r=Útest_config2_failureßsz#ConfigFileTest.test_config2_failurecCs| t|j|j¡dSrÁ©rßr!rÇÚconfig3r[r<r<r=Útest_config3_failureãsz#ConfigFileTest.test_config3_failurec CsŽt ¡r}| |j¡t ¡}z tƒ‚WntyDt d¡Yn0tj   d¡|  |  ¡d¡|  g¡Wdƒn1s€0YdS©Nz just testingrz-ERROR:root:just testing Got a [RuntimeError] )rrËrÇÚconfig4rrrAÚ exceptionrïÚstdoutÚseekrKrIrXrÍr<r<r=Útest_config4_okçs      ÿzConfigFileTest.test_config4_okcCs|j|jddS©N)r©rØÚconfig5r[r<r<r=Útest_config5_oköszConfigFileTest.test_config5_okcCs|j|jddSrå)rØÚconfig6r[r<r<r=Útest_config6_okùszConfigFileTest.test_config6_okcCsJt ¡v}| |j¡t d¡}t d¡}| | ¡¡| | ¡¡|  | ¡¡|j gd¢|d|  g¡Wdƒn1s„0Yt ¡ž}| |j ¡t d¡}|  |j ¡| | ¡¡| | ¡¡t d¡}| | ¡¡| | ¡¡|  | ¡¡|j gd¢|d|  g¡Wdƒn1s<0YdS©NrÔzcompiler-hyphenated)rÕrÉ)rerir%úcompiler.lexer))rmrj)rgrl)rmrn)rgro)rrËrÇÚconfig1arrrxr\rvÚcriticalrXÚconfig7rùr©r:rÎrÐZ hyphenatedr<r<r=Útest_config7_oküs2     ü(      ûzConfigFileTest.test_config7_okcCs dd„}| ¡bt dd¡\}}t |¡tjdkrB| dd¡}|jj|d}|  |¡|  |¡Wdƒn1sx0Yt j j d }|  |||¡dS) NcSs| ¡t |¡dSrÁ©r?róÚremove©Úh1rr<r<r=Úcleanup)sz/ConfigFileTest.test_config8_ok..cleanuprútest_logging-X-rú\z\\)rñr)Úcheck_no_resource_warningrñròrór?r;ÚreplaceÚconfig8r€rÇrÚrootr6rŽ)r:rörrrûršr<r<r=Útest_config8_ok's     ( zConfigFileTest.test_config8_okcCsZ| |j¡t d¡}| |j¡| |j¡| |j¡|j|jdd| |j¡dS)NZsome_pristine_loggerF)Údisable_existing_loggers)rÇÚ disable_testrrrùrr9©r:rÐr<r<r=Útest_logger_disabling>s     z$ConfigFileTest.test_logger_disablingcCs*d}| |¡| t ¡jdjd¡dS)Naw [loggers] keys=root [handlers] keys=hand1 [formatters] keys=form1 [logger_root] handlers=hand1 [handler_hand1] class=StreamHandler formatter=form1 [formatter_form1] format=%(levelname)s ++ %(message)s rÚhand1)rÇrKrrr6r;)r:Z test_configr<r<r=Útest_config_set_handler_namesGs z,ConfigFileTest.test_config_set_handler_namesc Cs‚t d¡ ¡}tjddd\}}zPt || d¡¡t |¡t j j |t dddd d d d œid dWt  |¡n t  |¡0dS)z.bpo-33802 defaults should not get interpolatedat [formatters] keys=default [formatter_default] [handlers] keys=console [handler_console] class=logging.StreamHandler args=tuple() [loggers] keys=root [logger_root] formatter=default handlers=console Ú test_logging_z.ini©r¥ÚsuffixÚasciirYFrÝz5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)r€ÚdatefmtÚclass)ÚversionrþÚ formatters)ÚdefaultsN)rÀrÁÚstriprñròrórDÚencoder?rrÂrÃÚdictrô)r:Zinirrr<r<r=Ú!test_defaults_do_no_interpolation_s& ýÿýþz0ConfigFileTest.test_defaults_do_no_interpolationN)!r]r^r_r`rrùrHrÌÚconfig1rírúrÚrÝràrçrérïrûrÿrÇrÏrÒrØrÛrÞrärèrêrñrýrrrr<r<r<r=r¾¬s@   ëë *& + r¾c@s@eZdZdZeZdZdd„Zdd„Zdd„Z d d „Z d d „Z d S)ÚSocketHandlerTestzTest for SocketHandler objects.©rîrc Csât |¡d|_|_|_z$| |j|jd¡|_}| ¡Wn,t yl}z||_WYd}~dSd}~00|j   ¡t j j}t|jtƒrœ|d|jƒ|_n||jdƒ|_d|_|j |jj d¡|j |j¡t d¡|_dS)ztSet up a TCP server to receive log messages, and a SocketHandler pointing to that server's address and port.Nç{®Gáz„?rîrr)rr>r~Ú sock_hdlrÚserver_exceptionÚ server_classÚaddressÚ handle_socketr rýrtr4rr6Z SocketHandlerÚ isinstanceÚserver_addressrPr]Ú log_outputr'r@r8rÚ Semaphorer©r:r~r†Zhclsr<r<r=r>’s& ÿ    zSocketHandlerTest.setUpc CsNz<|jr |j |j¡|j ¡|jr0|j ¡Wt |¡n t |¡0dS)zShutdown the TCP server.N)rr'r@r?r~rrrrEr[r<r<r=rE¬s  zSocketHandlerTest.tearDowncCs”|j}| d¡}t|ƒdkrqt d|¡d}| |¡}t|ƒ|kr\|| |t|ƒ¡}q8t |¡}t |¡}|j |j d7_ |j   ¡qdS)Nrú>LrÚ ) Ú connectionÚrecvrLÚstructÚunpackÚpickleÚloadsrr¨rrêrr-)r:ÚrequestÚconnÚchunkÚslenÚobjr£r<r<r=r·s      zSocketHandlerTest.handle_socketcCsV|jr| |j¡t d¡}| d¡|j ¡| d¡|j ¡| |j d¡dS)NZtcpr’Úeggsú spam eggs ) rÚskipTestrrrvrr,ryrKrrr<r<r=Ú test_outputÆs      zSocketHandlerTest.test_outputcCsš|jr| |j¡d|j_|j ¡z tdƒ‚WntyN|j d¡Yn0|j  d¡t   ¡}|  |jj |¡t   |jj |d¡|j  d¡dS)Ng@zDeliberate mistakez Never sentzNever sent, eitherr˜zNor this)rr.rZ retryStartr~rrrAr'rárvrr8Z retryTimer)r:Únowr<r<r=Ú test_noserverÑs     zSocketHandlerTest.test_noserverN) r]r^r_r`rˆrrr>rErr/r1r<r<r<r=r‹s  rcCs*tjddd\}}t |¡t |¡|S)Nrz.sockr)rñròrór?ró)rrr<r<r=Ú_get_temp_domain_socketäs  r2zUnix sockets requiredc@s.eZdZdZeedƒreZdd„Zdd„Z dS)ÚUnixSocketHandlerTestz)Test for SocketHandler with unix sockets.r’cCstƒ|_t |¡dSrÁ)r2rrr>r[r<r<r=r>ôszUnixSocketHandlerTest.setUpcCst |¡t |j¡dSrÁ)rrErrôrr[r<r<r=rEùs zUnixSocketHandlerTest.tearDownN) r]r^r_r`r>r[r“rr>rEr<r<r<r=r3ìs  r3c@s8eZdZdZeZdZdd„Zdd„Zdd„Z d d „Z d S) ÚDatagramHandlerTestzTest for DatagramHandler.rc Csàt |¡d|_|_|_z$| |j|jd¡|_}| ¡Wn,t yl}z||_WYd}~dSd}~00|j   ¡t j j}t|jtƒrœ|d|jƒ|_n||jdƒ|_d|_|j |jj d¡|j |j¡t ¡|_dS)zvSet up a UDP server to receive log messages, and a DatagramHandler pointing to that server's address and port.Nrrîrr)rr>r~rrrrÚhandle_datagramr rýrtr4rr6ZDatagramHandlerrrrPr]rr'r@r8rr:rrr<r<r=r>s& ÿ    zDatagramHandlerTest.setUpc CsNz<|jr|j ¡|jr0|j |j¡|j ¡Wt |¡n t |¡0dS)zShutdown the UDP server.N)r~rrrr'r@r?rrEr[r<r<r=rEs  zDatagramHandlerTest.tearDowncCsTt dd¡}|jt|ƒd…}t |¡}t |¡}|j|j d7_|j   ¡dS)Nrrr ) r#ÚpackÚpacketrLr%r&rr¨rrêrr3)r:r'r*r7r+r£r<r<r=r5)s    z#DatagramHandlerTest.handle_datagramcCs`|jr| |j¡t d¡}| d¡|j ¡|j ¡| d¡|j ¡| |j d¡dS)NZudpr’r,r-) rr.rrrvrr4rArKrrr<r<r=r/1s       zDatagramHandlerTest.test_outputN© r]r^r_r`rrrr>rEr5r/r<r<r<r=r4ýs r4c@s.eZdZdZeedƒreZdd„Zdd„Z dS)ÚUnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.r’cCstƒ|_t |¡dSrÁ)r2rr4r>r[r<r<r=r>EszUnixDatagramHandlerTest.setUpcCst |¡t |j¡dSrÁ)r4rErrôrr[r<r<r=rEJs z UnixDatagramHandlerTest.tearDownN© r]r^r_r`r>r[r–rr>rEr<r<r<r=r9=s  r9c@s8eZdZdZeZdZdd„Zdd„Zdd„Z d d „Z d S) ÚSysLogHandlerTestz!Test for SysLogHandler using UDP.rc Csæt |¡d|_|_|_z$| |j|jd¡|_}| ¡Wn,t yl}z||_WYd}~dSd}~00|j   ¡t j j}t|jtƒr¤||jd|jfƒ|_n ||jƒ|_d|_|j |jj d¡|j |j¡t ¡|_dS)ztSet up a UDP server to receive log messages, and a SysLogHandler pointing to that server's address and port.Nrrr)rr>r~Úsl_hdlrrrrr5r rýrtr4rr6rürrrPr]rr'r@r8rr:rrr<r<r=r>Us& ÿ     zSysLogHandlerTest.setUpc CsNz<|jr|j ¡|jr0|j |j¡|j ¡Wt |¡n t |¡0dS)zShutdown the server.N)r~rrr<r'r@r?rrEr[r<r<r=rEos  zSysLogHandlerTest.tearDowncCs|j|_|j ¡dSrÁ)r7rrr3)r:r'r<r<r=r5zsz!SysLogHandlerTest.handle_datagramcCsª|jr| |j¡t d¡}| d¡|j ¡| |jd¡|j  ¡d|j _ | d¡|j ¡| |jd¡|j  ¡d|j _ | d¡|j ¡| |jd¡dS)NZslhõspäms <11>spämFs <11>spämuhäm-s<11>häm-späm) rr.rrrvrr4rKrrAr<Z append_nulÚidentrr<r<r=r/~s           zSysLogHandlerTest.test_outputNr8r<r<r<r=r;Ns r;c@s.eZdZdZeedƒreZdd„Zdd„Z dS)ÚUnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.r’cCstƒ|_t |¡dSrÁ)r2rr;r>r[r<r<r=r>™szUnixSysLogHandlerTest.setUpcCst |¡t |j¡dSrÁ)r;rErrôrr[r<r<r=rEžs zUnixSysLogHandlerTest.tearDownNr:r<r<r<r=r?‘s  r?z$IPv6 support required for this test.cs4eZdZdZeZdZ‡fdd„Z‡fdd„Z‡Z S)ÚIPv6SysLogHandlerTestz&Test for SysLogHandler with IPv6 host.)z::1rcstj|j_tt|ƒ ¡dSrÁ)r[ÚAF_INET6rr•r&r@r>r[r*r<r=r>«s zIPv6SysLogHandlerTest.setUpcstj|j_tt|ƒ ¡dSrÁ)r[ÚAF_INETrr•r&r@rEr[r*r<r=rE¯s zIPv6SysLogHandlerTest.tearDown) r]r^r_r`rrrr>rEr/r<r<r*r=r@¢s  r@c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚHTTPHandlerTestzTest for HTTPHandler.cCst |¡t ¡|_dS)ztSet up an HTTP server to receive log messages, and a HTTPHandler pointing to that server's address and port.N)rr>rr:rr[r<r<r=r>¶s zHTTPHandlerTest.setUpcCsr|j|_t|jƒ|_|jdkrRz t|jdƒ}|j |¡|_Wnd|_Yn0|  d¡|  ¡|j   ¡dS)NrìzContent-LengthéÈ) Úcommandr rúÚlog_dataÚintZheadersZrfilerRÚ post_dataZ send_responseZ end_headersrr3)r:r'Zrlenr<r<r=Úhandle_request¼s    zHTTPHandlerTest.handle_requestc CsÞt d¡}|j}| |jjd¡dD]°}d}|r–z ddl}WntyVd}Yqž0tj  t ¡}tj  |d¡}|  |j ¡}| |¡|j|d} nd}d} t||jd|d|_} |  ¡| j ¡d | j} |oØ|} tjj| d | | d d |_d|_| |j¡d D]¬} | |j_|j ¡d}| |¡|j ¡| |jjd ¡| |j | ¡| dkrlt!|jj"ƒ}nt!|j# $d¡ƒ}| |ddg¡| |ddg¡| |d|g¡q|j %¡|j |j¡|j &¡q&dS)NÚhttprrrz keycert.pem)Zcafiler)rƒz localhost:%dz/frob)ÚfooÚbar)ÚsecureÚcontextZ credentials)rërìr=rëúutf-8r;ÚfuncNamer/rê)'rrr'r@r6ÚsslÚ ImportErrorrórúÚdirnameÚ__file__r¢Z SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextrwrIr~r rtr4Z server_portrÿZh_hdlrrFr8rrrArvrKrEr ÚqueryrHÚdecoderrr?)r:rÐr'rMrbrQrƒÚhereZlocalhost_certrNr~ÚhostZ secure_clientrrêÚdr<r<r=r/És`        ÿ    ý      zHTTPHandlerTest.test_outputN)r]r^r_r`r>rIr/r<r<r<r=rC³s rCc@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) Ú MemoryTestz*Test memory persistence of logger objects.cCst |¡i|_dS)z8Create a dict to remember potentially destroyed objects.N)rr>Ú _survivorsr[r<r<r=r>s zMemoryTest.setUpcGs.|D]$}t|ƒt|ƒf}t |¡|j|<qdS)zKWatch the given objects for survival, by creating weakrefs to them.N)ÚidrUÚweakrefÚrefr[)r:r r+Úkeyr<r<r=Ú_watch_for_survival szMemoryTest._watch_for_survivalcCs\t ¡g}|j ¡D] \\}}}|ƒdur| |¡q|rX| dt|ƒd |¡f¡dS)z;Assert that all objects watched for survival have survived.Nz;%d objects should have survived but have been destroyed: %sz, )ÚgcZcollectr[rÌr¡rOrLr¢)r:ZdeadZid_Úrepr_r^r<r<r=Ú_assertTruesurvivals  ÿzMemoryTest._assertTruesurvivalcCsŒ|j tj¡t d¡}| |¡| tj¡|j | ¡¡| | ¡¡|  dg¡~|  ¡t d¡}| | ¡¡|  ddg¡dS)NrK)rKr.rh)rKr.ri) r'r-rrmrr`r.ryr\rXrc)r:rKrLr<r<r=Útest_persistent_loggerss"   ÿ þz"MemoryTest.test_persistent_loggersN)r]r^r_r`r>r`rcrdr<r<r<r=rZs  rZc@seZdZdd„Zdd„ZdS)Ú EncodingTestc Csæt d¡}t dd¡\}}t |¡d}z tj|dd}| |¡z | |¡W|  |¡| ¡n|  |¡| ¡0t |dd}z |  |  ¡  ¡|¡W| ¡n | ¡0Wtj |¡rât |¡ntj |¡ràt |¡0dS)NÚtestrztest_logging-1-ufoo€rO©Úencoding)rrrñròrór?rr8rwr@r(rKrRÚrstriprúÚisfileró)r:rurrrCršrªr<r<r=Útest_encoding_plain_file5s*      ÿ     ÿ z%EncodingTest.test_encoding_plain_filec Cs’t d¡}d}t d¡}d|_t ¡}||dƒ}t |¡}| |¡z |  |¡W|  |¡|  ¡n|  |¡|  ¡0|  ¡}|  |d¡dS)Nrfuдо ÑвиданиÑÚcp1251Ústricts äî ñâèäàíèÿ )rrÚcodecsÚ getwriterrhr*ÚBytesIOr/r8rwr@r?rIrK)r:ruÚmessageZ writer_classr,ÚwriterršrWr<r<r=Útest_encoding_cyrillic_unicodeOs         ÿ  z+EncodingTest.test_encoding_cyrillic_unicodeN)r]r^r_rkrsr<r<r<r=re4srec@seZdZdd„Zdd„ZdS)Ú WarningsTestc Csæt ¡Êt d¡| tjd¡tjdtdt ¡}t  |¡}t  d¡}|  |¡t  d¡|  |¡| ¡}| ¡| | d¡d¡t ¡}t d td d |d ¡| ¡}| ¡| |d ¡Wdƒn1sØ0YdS)NTFÚalways)Úcategoryú py.warningszI'm warning you...z UserWarning: I'm warning you... rÚExplicitúdummy.pyé*z Dummy linez0dummy.py:42: UserWarning: Explicit Dummy line )ÚwarningsÚcatch_warningsrÚcaptureWarningsrŽÚfilterwarningsÚ UserWarningr*r+r/rr8Úwarnr@rIr?r8ÚfindÚ showwarningrK)r:r,rDrÐrWZa_filer<r<r=Ú test_warningsgs,        ÿÿzWarningsTest.test_warningscCs’t ¡vt d¡| tjd¡t d¡}| |jg¡t dt dd¡| t |jƒd¡|  |jdtj ¡Wdƒn1s„0YdS) NTFrwrxryrzrYr) r{r|rr}rŽrrKr6r‚rrLÚassertIsInstanceÚ NullHandlerrr<r<r=Útest_warnings_no_handlerss   z&WarningsTest.test_warnings_no_handlersN)r]r^r_rƒr†r<r<r<r=rtesrtcCs t ||¡SrÁ)rr1)r€rr<r<r=Ú formatFuncsr‡c@seZdZddd„ZdS)ÚmyCustomFormatterNcCsdSrÁr<)r:Úfmtrr<r<r=r'‘szmyCustomFormatter.__init__)N)r]r^r_r'r<r<r<r=rˆsrˆcCst ¡SrÁ)rr/r<r<r<r=Ú handlerFunc”srŠc@s eZdZdS)Ú CustomHandlerN©r]r^r_r<r<r<r=r‹—sr‹c @seZdZdZejZdZddddiidddd d d œid dgd œdœZddddiidddd d d œidddgd œidd idœZddddiidddd d d œidddiid dgd œdœZ ddddiidddd dd œidddgd œidd idœZ ddddiiddddd d œidddgd œidd idœZ ddddiidddd d d œidddgd œiddidœZ ddddiidddd d d œidddgd œidd idœZ ddedddœidddd d d œid dgd œdœZdeddœedddœeddœdœddd d d œdeidœd dgd œdœZddddiideddd d d œidddgd œidd idœZddddiideddd d dd œidddgd œidd idœZddddiidddd d d œid!ddgd œidd idœZdd"dddiidddd d d œiddgd œid#œdd id$œZdd%dddiidddd d d œiddgd œid#œdd id$œZddddiidddd d d œidd dgd œidd idœZdd%ddd iiddd&iid'œZdd%ddd&iiddd&iid'œZddddiid(d)diidddd d d(gd*œiddd(gd+œid dgd œd,œZddddiidddd d d œid-dd.idddgd œidd id/œZdddiidddd d d œid-dd.idddgd œidd id0œZd1dddiidddd d d œid-dd.idddgd œidd id/œZddddiidddd d d2d3d4œd5œid dgd œdœZdd6d7d8d9œiddd6d:œd;dœd?œd@ddAgdBdCœidDœZ ddeddd"dEœidddd d d œidFddgdBdCœidDœZ!ddeddd"dGœidddd d d œidFddgdBdCœidDœZ"ddedHdd"dGœidddd d d œidFddgdBdCœidDœZ#ddedd"dEœidddd d d œidFddgdBdCœidDœZ$dIdJ„Z%dKdL„Z&efdMdN„Z'dOdP„Z(dQdR„Z)dSdT„Z*dUdV„Z+dWdX„Z,dYdZ„Z-d[d\„Z.d]d^„Z/d_d`„Z0dadb„Z1dcdd„Z2dedf„Z3dgdh„Z4didj„Z5dkdl„Z6dmdn„Z7dodp„Z8dqdr„Z9dŽdtdu„Z:dvdw„Z;dxdy„Zd~d„Z?d€d„Z@d‚dƒ„ZAd„d…„ZBd†d‡„ZCdˆd‰„ZDdŠd‹„ZEdŒd„ZFdsS)ÚConfigDictTestz)Reading logging config from a dictionary.r¿rYÚform1r€z%(levelname)s ++ %(message)srzlogging.StreamHandlerrŒzext://sys.stdout)r Ú formatterrIr,rk©rIr6)r r r6rürÔr.rI)r r r6Úloggersrüzext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)ú()r€z .formatFunc)rŽZform2Zform3r’)rZhand2z.CustomHandlerzinvalid parameter name)r rrIr,rqrìF)Úcompilerrì)r rþr r6r‘rüTrm)r Z incrementalr6r‘Zfilt1r;)r rrIr,Úfilters)rIr”)r r r”r6r‘rüzcfg://true_formatterszcfg://handler_configs[hand1])r Útrue_formattersÚhandler_configsr r6r‘rü)r•r–r r6r‘rür rLú! )rKÚ terminator)r rrIr,rŸÚmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)sú$)r€Ústyle)r rIrzlogging.handlers.MemoryHandleréÚ fileGlobal)r ZcapacityrrrI)rÚ bufferGlobalÚmymoduleržÚtrue)rIr6r§)r r r6r‘)r’r€ÚvalidateÚmy_test_logger_custom_formatter)r r€r¡z.myCustomFormattercCstj |¡dSrÁ)rrÂZ dictConfig)r:rÄr<r<r=rÇ€ szConfigDictTest.apply_configcCsvt ¡Z}| |j¡t ¡}| | ¡¡| | ¡¡|j dg|d|  g¡Wdƒn1sh0YdSrÈrÊrÍr<r<r=rσ s  ÿþzConfigDictTest.test_config0_okcCsxt ¡\}| |¡t d¡}| | ¡¡| | ¡¡|jddg|d| g¡Wdƒn1sj0YdSrÓrÖr×r<r<r=rØ’ s   þýzConfigDictTest.test_config1_okcCs| t|j|j¡dSrÁrÙr[r<r<r=rÛ¡ sz#ConfigDictTest.test_config2_failurecCs| t|j|j¡dSrÁ)rßr!rÇÚconfig2ar[r<r<r=Útest_config2a_failure¥ sz$ConfigDictTest.test_config2a_failurecCs| t|j|j¡dSrÁ)rßr!rÇÚconfig2br[r<r<r=Útest_config2b_failure© sz$ConfigDictTest.test_config2b_failurecCs| t|j|j¡dSrÁrÜr[r<r<r=rÞ­ sz#ConfigDictTest.test_config3_failurec Cs†t ¡j}| |j¡z tƒ‚Wnty<t d¡Yn0tj  d¡|  |  ¡d¡|  g¡Wdƒn1sx0YdSrß) rrËrÇràrArrárïrârãrKrIrX©r:rÎr<r<r=rä± s      ÿzConfigDictTest.test_config4_okc Cs†t ¡j}| |j¡z tƒ‚Wnty<t d¡Yn0tj  d¡|  |  ¡d¡|  g¡Wdƒn1sx0YdSrß) rrËrÇÚconfig4arArrárïrârãrKrIrXr§r<r<r=Útest_config4a_okÀ s      ÿzConfigDictTest.test_config4a_okcCs|j|jddSrårær[r<r<r=rèÏ szConfigDictTest.test_config5_okcCs| t|j|j¡dSrÁ)rßr!rÇrér[r<r<r=Útest_config6_failureÒ sz#ConfigDictTest.test_config6_failurecCst ¡^}| |j¡t d¡}| | ¡¡| | ¡¡|j ddg|d|  g¡Wdƒn1sl0Yt ¡t}| |j ¡t d¡}|  |j ¡t d¡}| | ¡¡| | ¡¡|j ddg|d|  g¡Wdƒn1sø0YdS)NrÔrÕrÉr%rì©rmri©rgrj) rrËrÇrrrrxr\rvrXrïr9rrÍr<r<r=rñÕ s4   þý(     þýzConfigDictTest.test_config7_okcCs$t ¡^}| |j¡t d¡}| | ¡¡| | ¡¡|j ddg|d|  g¡Wdƒn1sl0Yt ¡}| |j ¡t d¡}|  |j ¡| | ¡¡| | ¡¡t d¡}| | ¡¡| | ¡¡|j gd¢|d|  g¡Wdƒn1s0YdS)NrÔrÕrÉr%rì)r«r¬©rmrl©rgrn) rrËrÇrrrrxr\rvrXrûrùrrÍr<r<r=Útest_config_8_okò s2   þý(      ûzConfigDictTest.test_config_8_okcCsJt ¡v}| |j¡t d¡}t d¡}| | ¡¡| | ¡¡|  | ¡¡|j gd¢|d|  g¡Wdƒn1s„0Yt ¡ž}| |j ¡t d¡}|  |j ¡| | ¡¡| | ¡¡t d¡}| | ¡¡| | ¡¡|  | ¡¡|j gd¢|d|  g¡Wdƒn1s<0YdSrë)rrËrÇrírrrxr\rvrîrXÚconfig8arùrrðr<r<r=Útest_config_8a_ok s2     ü(      ûz ConfigDictTest.test_config_8a_okcCs°t ¡”}| |j¡t d¡}| | ¡¡|jg|d| |j ¡| | ¡¡|jg|d| |j ¡| | ¡¡|jdg|dWdƒn1s¢0YdS)NrÔr%r«) rrËrÇÚconfig9rrrxr\rXÚconfig9aÚconfig9brÍr<r<r=Útest_config_9_ok> s     ÿþzConfigDictTest.test_config_9_okcCsªt ¡Ž}| |j¡t d¡}| | ¡¡t d¡}| | ¡¡t d¡}| | ¡¡t d¡}| | ¡¡|j ddg|dWdƒn1sœ0YdS©NrÔr“rìzcompiler.parser.codegen)rkrfr¬r%) rrËrÇÚconfig10rrrwr\rvrXrÍr<r<r=Útest_config_10_okP s       þýz ConfigDictTest.test_config_10_okcCs| |j¡dSrÁ)rØÚconfig11r[r<r<r=Útest_config11_okc szConfigDictTest.test_config11_okcCs| t|j|j¡dSrÁ)rßr!rÇÚconfig12r[r<r<r=Útest_config12_failuref sz$ConfigDictTest.test_config12_failurecCs| t|j|j¡dSrÁ)rßr!rÇÚconfig13r[r<r<r=Útest_config13_failurei sz$ConfigDictTest.test_config13_failurecCs|t ¡`}| |j¡tjd}| |jd¡| |jd¡t  d¡|  |  ¡  d¡¡Wdƒn1sn0YdS)NrrLr—Z Exclamationz Exclamation! ) rrËrÇÚconfig14rrrKrKr˜rwr9rIrŸ)r:rÎrDr<r<r=Útest_config14_okl s    zConfigDictTest.test_config14_okcCs˜dd„}| ¡Zt dd¡\}}t |¡ddd|dœid dgid œ}| |¡| |¡Wdƒn1sp0Ytjjd }|  |||¡dS) NcSs| ¡t |¡dSrÁròrôr<r<r=röw sz0ConfigDictTest.test_config15_ok..cleanuprr÷rYrÆzlogging.FileHandler)r Úfilenamer6©r r6rür) rùrñròrór?rÇrrür6rŽ)r:rörrrÂršr<r<r=Útest_config15_oku s"  þÿÿø ( zConfigDictTest.test_config15_okNc Cs| d¡}tj d|¡}| ¡|j ¡|j}|j ¡z¤t   t j t j ¡}|  d¡|  d|f¡t dt|ƒ¡}||}d}t|ƒ} | dkr´| ||d…¡} || 7}| | 8} qˆ| ¡W|j d¡tj ¡t |¡n"|j d¡tj ¡t |¡0dS)NrOrg@rîr)rrrÂÚlistenr rtr4r]rAr[rBÚ SOCK_STREAMÚ settimeoutÚconnectr#r6rLÚsendr?Z stopListeningrrq) r:ÚtextZverifyrlr]r…r*rWZ sentsofarÚleftÚsentr<r<r=Úsetup_via_listener’ s2         þ  z!ConfigDictTest.setup_via_listenercCs°t ¡”}| t |j¡¡t d¡}| |  ¡¡t d¡}| |  ¡¡t d¡}| |  ¡¡t d¡}|  |  ¡¡|j ddg|dWdƒn1s¢0YdSr¶) rrËrÌÚjsonÚdumpsr·rrrwr\rvrXrÍr<r<r=Útest_listen_config_10_ok® s      þýz'ConfigDictTest.test_listen_config_10_okcCs€t ¡d}| t tj¡¡t d¡}|  |  ¡¡|  |  ¡¡|j ddg|d|  g¡Wdƒn1sr0YdSrÓ) rrËrÌrÀrÁr¾rrrrxr\rvrXrÍr<r<r=Útest_listen_config_1_okÁ s  þýz&ConfigDictTest.test_listen_config_1_okcCs dd„}dd„}t d¡}t tj¡}t ¡8}| ||¡|  |  ¡¡|  |  ¡¡Wdƒn1sl0Y|j g|d|j ddgd d t ¡@}| |¡t d¡}|  |  ¡¡|  |  ¡¡Wdƒn1sä0Y|j d d g|d|j ddgd d t ¡L}| |ddd …|¡t d¡}|  |  ¡¡|  |  ¡¡Wdƒn1sn0Y|j ddg|d|j ddgd d dS)NcSsdSrÁr<©Ústuffr<r<r=Ú verify_failÑ sz6ConfigDictTest.test_listen_verify..verify_failcSs|ddd…S)Nrér<rÑr<r<r=Úverify_reverseÔ sz9ConfigDictTest.test_listen_verify..verify_reverserÔr%rÕrÉrÊ)rSr«r¬rér­r®) rrrÀrÁr¾rrrËrÌrxr\rvrX)r:rÓrÔrÐZto_sendrÎr<r<r=Útest_listen_verifyÏ sb    ,þý   ,þýþý  .þýþýz!ConfigDictTest.test_listen_verifycCs| t|j|j¡dSrÁ)rßrþrÇÚ out_of_orderr[r<r<r=Útest_out_of_order sz ConfigDictTest.test_out_of_ordercCs\t |j¡}d|ddd<| |¡t d¡jd}| |jtj ¡| |j j tj ¡dS)Nz-${asctime} (${name}) ${levelname}: ${message}r r™r€rŸr) rÚdeepcopyrÖrÇrrr6r„rrÞrÚ_styleÚStringTemplateStyle©r:rÂršr<r<r=Ú#test_out_of_order_with_dollar_style s   ÿz2ConfigDictTest.test_out_of_order_with_dollar_stylecCs.| |j¡t d¡jd}| |jt¡dS©Nr¢r)rÇÚcustom_formatter_class_validaterrr6r„rr»©r:ršr<r<r=Ú)test_custom_formatter_class_with_validate s z8ConfigDictTest.test_custom_formatter_class_with_validatecCs.| |j¡t d¡jd}| |jt¡dSrÝ)rÇÚ custom_formatter_class_validate2rrr6r„rr»rßr<r<r=Ú*test_custom_formatter_class_with_validate2 s z9ConfigDictTest.test_custom_formatter_class_with_validate2cCsF|j ¡}d|ddd<| |¡t d¡jd}| |jt¡dS)Nršr rŽr›r¢r) rÞrrÇrrr6r„rr»rÛr<r<r=Ú9test_custom_formatter_class_with_validate2_with_wrong_fmt$ s   zHConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmtcCs| t|j|j¡dSrÁ)rßrþrÇÚ custom_formatter_class_validate3r[r<r<r=Ú*test_custom_formatter_class_with_validate3- sz9ConfigDictTest.test_custom_formatter_class_with_validate3cCs| t|j|j¡dSrÁ)rßrþrÇÚcustom_formatter_with_functionr[r<r<r=Ú,test_custom_formatter_function_with_validate0 sz;ConfigDictTest.test_custom_formatter_function_with_validatecCsödgd¢dddœdddd gd ggd ¢d œ}tj |¡}| | d ¡d¡| | d¡d¡| | d¡d¡| | d¡d ¡| | d¡d¡| | d¡d¡| d¡}| | d¡gd¢¡| t|jd¡| t|jd¡| t|jd¡dS)N)rYr é)rÚbÚcr†rè)rYrª)Úg)rDr®ÚjrÍÚlrzr²)Úoz cfg://alistÚp)ZatupleZalistZadictZnest1Znest2Znest3zcfg://atuple[1]r zcfg://alist[1]rézcfg://nest1[1][0]rDzcfg://nest2[1][1]z cfg://adict.dzcfg://adict[f]z cfg://nest3rYz cfg://nosuchzcfg://!zcfg://adict[2]) rrÂZBaseConfiguratorrKÚconvertÚpoprßÚKeyErrorrþ)r:rYZbcrÎr<r<r=Útest_baseconfig3 s& ú  zConfigDictTest.test_baseconfigcs¬ddlm‰G‡fdd„dtjƒ}ˆdddgƒ}|dd gd }d d ||d œidd gdœdœ}t ¡$}| |¡t d¡Wdƒn1sŽ0Y| |  ¡d¡dS)Nr©Ú namedtuplecs*eZdZ‡‡fdd„Z‡fdd„Z‡ZS)z1ConfigDictTest.test_namedtuple..MyHandlercstƒj|i|¤Ž||_dSrÁ)r&r'Úresource)r:rör rÅ)r+rõr<r=r'N sz:ConfigDictTest.test_namedtuple..MyHandler.__init__cs$|jd|jj›7_tƒ |¡S©Nú )rêröÚtyper&rárÄr*r<r=ráR sz6ConfigDictTest.test_namedtuple..MyHandler.emitr.r<rôr*r=Ú MyHandlerM srúÚResourcerùÚlabelsZmy_typer)rùrürYZ myhandler)r’rörmrrÂzsome logzsome log my_type ) Ú collectionsrõrr/rrMrÇrxrKrI)r:rúrûrörÂrOr<rôr=Útest_namedtupleI s   þÿ ø  (zConfigDictTest.test_namedtuple)N)Gr]r^r_r`rrùrHrÌrrírÚr£r¥rÝràr»r‡rŠr¨rçrérïrûr°r²r³r´r·r¹r»r½r¿rÖrÞrárärærÇrÏrØrÛr¤r¦rÞrär©rèrªrñr¯r±rµr¸rºr¼r¾rÀrÃrÌrÏrÐrÕr×rÜràrârãrårçrórþr<r<r<r=ršs†ÿÿüÿ þñÿÿüÿ þÿÿëÿÿüÿ ÿÿþìÿÿüÿ þÿÿëÿÿüÿ þÿÿëÿÿüÿ þÿÿëÿÿüÿ þÿÿëþÿüÿ þðþþþ÷üÿù þå#ÿÿüÿ þÿÿëÿÿûÿ þÿÿêÿÿüÿ þÿÿëÿÿüÿ þû ÿèÿÿüÿ þû ÿèÿÿüÿ þÿÿëÿÿÿÿøÿÿÿÿøÿÿÿÿûÿ þÿþå#ÿÿüÿÿþÿÿç!ÿÿüÿÿþÿÿèÿÿüÿÿþÿÿç ÿÿþûÿ þíþÿýûúýÿê!ýÿüÿ ýÿïýÿüÿ ýÿïýÿüÿ ýÿïýÿüÿ ýÿï !+  >  rc@seZdZdd„Zdd„ZdS)Ú ManagerTestcsng‰G‡fdd„dtjƒ}t d¡}| t|jt¡| |¡| d¡}| d¡t d¡|  ˆdg¡dS)NcseZdZd‡fdd„ ZdS)z6ManagerTest.test_manager_loggerclass..MyLoggerNcsˆ |¡dSrÁ©r¡)r:rIrêr Úexc_infoÚextra©Zloggedr<r=Ú_logm sz;ManagerTest.test_manager_loggerclass..MyLogger._log)NN)r]r^r_rr<rr<r=ÚMyLoggerl srrfzshould appear in loggedzshould not appear in logged) rÚLoggerÚManagerrßÚ TypeErrorÚsetLoggerClassrGrrwrK)r:rÚmanrÐr<rr=Útest_manager_loggerclassi s     z$ManagerTest.test_manager_loggerclasscCs,t d¡}tƒ}| |¡| |j|¡dSrÁ)rrÚobjectÚsetLogRecordFactoryrKÚlogRecordFactory)r:r rUr<r<r=Útest_set_log_record_factoryy s  z'ManagerTest.test_set_log_record_factoryN)r]r^r_r rr<r<r<r=rÿh srÿc@seZdZdd„ZdS)ÚChildLoggerTestcCs¦t ¡}t d¡}t d¡}| d¡}| d¡}| |t d¡¡| |t d¡¡| d¡}| d¡}| d¡}| |t d¡¡| |t d¡¡| ||¡dS) NÚabczdef.ghiZxyzzuvw.xyzÚdefZghiúabc.defz abc.def.ghi)rrÚgetChildrL)r:r«Úl1Úl2Úc1Úc2Zc3r<r<r=Útest_child_loggers€ s       z"ChildLoggerTest.test_child_loggersN)r]r^r_rr<r<r<r=r src@s eZdZdS)ÚDerivedLogRecordNrŒr<r<r<r=r src@s$eZdZdd„Zdd„Zdd„ZdS)ÚLogRecordFactoryTestcCsBGdd„dtjƒ}t |¡|tƒ|_|j |j¡t ¡|_ dS)Nc@seZdZdd„Zdd„ZdS)z2LogRecordFactoryTest.setUp..CheckingFiltercSs ||_dSrÁ)r )r:r r<r<r=r'— sz;LogRecordFactoryTest.setUp..CheckingFilter.__init__cSs,t|ƒ}||jur(d||jf}t|ƒ‚dS)Nz)Unexpected LogRecord type %s, expected %sT)rùr r)r:r£rlrêr<r<r=r©š s ÿz9LogRecordFactoryTest.setUp..CheckingFilter.filterN)r]r^r_r'r©r<r<r<r=ÚCheckingFilter– sr) rr—rr>rr©r'r˜ÚgetLogRecordFactoryÚ orig_factory)r:rr<r<r=r>• s   zLogRecordFactoryTest.setUpcCs(|j |j¡t |¡t |j¡dSrÁ)r'r™r©rrErr rr[r<r<r=rE§ s zLogRecordFactoryTest.tearDowncCs@| t|jj| ¡¡t t¡|j | ¡¡|  dg¡dS)N)rürgrh) rßrr'rwr\rr rrvrXr[r<r<r=Útest_logrecord_class¬ s ÿ ÿz)LogRecordFactoryTest.test_logrecord_classN)r]r^r_r>rErr<r<r<r=r“ src@s„eZdZdZdd„Zdd„Zdd„Zdd „Ze  e e j d ƒd ¡d d „ƒZ e  e e j d ƒd ¡dd„ƒZe  e e j d ƒd ¡dd„ƒZdS)ÚQueueHandlerTestrÊcCs`t |¡t d¡|_tj |j¡|_d|_t  d¡|_ d|j _ |j   tj ¡|j  |j¡dS)NréZqueF)rr>ÚqueueÚQueuerr6Ú QueueHandlerÚque_hdlrr;rÚ que_loggerr§r-rkr8r[r<r<r=r>º s   zQueueHandlerTest.setUpcCs|j ¡t |¡dSrÁ)r$r?rrEr[r<r<r=rEÄ s zQueueHandlerTest.tearDowncCs¢|j | ¡¡| tj|jj¡|j | ¡¡| tj|jj¡| ¡}|j |¡|j ¡}|  t |t j ƒ¡|  |j|jj¡|  |j|jf|df¡dSrÁ)r%ryr\rßr!ÚEmptyÚ get_nowaitrxrwr9rrÚ LogRecordrKr;rêr )r:rêrCr<r<r=Útest_queue_handlerÈ s  z#QueueHandlerTest.test_queue_handlercCsx| ¡}t tj¡}d}|j|j||d}t |j¡}|j  |¡|j   |¡|j   ¡}| ||j¡| ||j¡dS)Nz {name} -> {levelname}: {message})r;Ú levelnamerq)r\rrˆrkr€r;r1r2r$r4r%rwr!r'rKrêrq)r:rêr*Zlog_format_strZ formatted_msgrZ log_recordr<r<r=Útest_formattingÔ s ÿ    z QueueHandlerTest.test_formattingÚ QueueListenerz5logging.handlers.QueueListener required for this testcCs€tt ¡ƒ}tj |j|¡}| ¡z<|j  |  ¡¡|j  |  ¡¡|j  |  ¡¡W|  ¡n |  ¡0| |jtjdd¡| |jtjdd¡| |jtjdd¡| ¡tt ¡ƒ}| tj¡tjj|j|dd}| ¡z<|j  |  ¡¡|j  |  ¡¡|j  |  ¡¡W|  ¡n |  ¡0| |jtjdd¡| |jtjdd¡| |jtjd d¡| ¡dS) Nrf)rÂrqrhriT)Zrespect_handler_levelrjrlrn)rrZMatcherrr6r,r!r r%rwr\rvrîrrr9Úmatchesrkrgrer?r-rù)r:ršÚlistenerr<r<r=Útest_queue_listenerá s6    ÿz$QueueHandlerTest.test_queue_listenerc CsŒtj |j|j¡}| ¡z ddWn<tyb}z$|}|jj|  ¡|dWYd}~n d}~00|  ¡|  |j   ¡ ¡ d¡d¡dS)NrYr©rZ Traceback)rr6r,r!r0r ÚZeroDivisionErrorr%rár\rrrKr,rIr rm)r:r.r†Úexcr<r<r=Ú&test_queue_listener_with_StreamHandlers *z7QueueHandlerTest.test_queue_listener_with_StreamHandlercCsd|j |j¡|j |j¡tj |j |j¡}|  ¡|j  d¡|  ¡|  |j ¡ ¡d¡dS)Nrvzque -> ERROR: error)r$r4r3r%r8r0rr6r,r!r rvrrrKr,rIr )r:r.r<r<r=Ú*test_queue_listener_with_multiple_handlerss z;QueueHandlerTest.test_queue_listener_with_multiple_handlersN)r]r^r_rHr>rEr)r+r=Ú skipUnlessr>rr6r/r3r4r<r<r<r=r ¶ s"   ÿ !ÿ ÿr r,)Úpatchc@sleZdZdZdZedd„ƒZe e j j d¡dd„ƒZ e e j j d¡dd „ƒZ ed d „ƒZd d „Zdd„ZdS)ÚQueueListenerTestz~ Tests based on patch submitted for issue #27930. Ensure that QueueListener handles all log messages. écCs”t d|¡}| tj¡tj |¡}| |¡tj |¡}| ¡|  d¡|  d¡|  d¡|  d¡|  d¡|  ¡|  |¡|  ¡dS)zÅ Creates a logger with a QueueHandler that logs to a queue read by a QueueListener. Starts the listener, logs five messages, and stops the listener. ztest_logger_with_id_%sÚoneÚtwoZthreeZfourZfiveN) rrr-r.r6r#r8r,r rxrrr@r?)Ú log_queuer>rÐršr.r<r<r=Ú setup_and_log+s          zQueueListenerTest.setup_and_logrøcCsJt|jƒD]$}t ¡}| |d| ¡|f¡q | |jd|jd¡dS©Nú%s_%srœz&correct number of handled log messages)rÚrepeatr!r"r<r\rKÚ call_count©r:Z mock_handler®r;r<r<r=Ú#test_handle_called_with_queue_queueCs ÿz5QueueListenerTest.test_handle_called_with_queue_queuecCsbt ¡t|jƒD]4}t ¡}| |d| ¡|f¡| ¡|  ¡q|  |j d|jd¡dSr=) rÚ*skip_if_broken_multiprocessing_synchronizerr?Úmultiprocessingr"r<r\r?rqrKr@rAr<r<r=Ú test_handle_called_with_mp_queueKs ÿz2QueueListenerTest.test_handle_called_with_mp_queueccs.z| ¡VqWntjy(gYS0dSrÁ)r'r!r&)r;r<r<r=Úget_all_from_queueXsz$QueueListenerTest.get_all_from_queuecCs†t ¡t|jƒD]n}t ¡}| |d| ¡|f¡t|  |¡ƒ}|  ¡|  ¡gt j jjgg}| ||ddd„|Dƒ¡qdS)a Five messages are logged then the QueueListener is stopped. This test then gets everything off the queue. Failure of this test indicates that messages were not registered on the queue until _after_ the QueueListener stopped. r>z&Found unexpected messages in queue: %scSs"g|]}t|tjƒr|jn|‘qSr<)rrr(rê)r­rzr<r<r=r¯usÿzJQueueListenerTest.test_no_messages_in_queue_after_stop..N)rrCrr?rDr"r<r\ÚlistrFr?rqrr6r,Ú _sentinelrN)r:r®r!rÌrUr<r<r=Ú$test_no_messages_in_queue_after_stop`s ÿÿÿz6QueueListenerTest.test_no_messages_in_queue_after_stopcCsZt ¡}tj |¡}| ¡| ¡| t¡|  ¡Wdƒn1sL0YdSrÁ) r!r"rr6r,r rrrßrþÚ task_done)r:r;r.r<r<r=Útest_calls_task_done_after_stopxs   z1QueueListenerTest.test_calls_task_done_after_stopN)r]r^r_r`r?Ú staticmethodr<r6r rr6r,rBrErFrIrKr<r<r<r=r7#s    r7c@s eZdZdd„ZeZdd„ZdS)ÚUTCcCstSrÁ)ÚZERO©r:Údtr<r<r=Ú utcoffset†sz UTC.utcoffsetcCsdS)NrMr<rOr<r<r=Útzname‹sz UTC.tznameN)r]r^r_rQÚdstrRr<r<r<r=rM…srMc@s^eZdZdd„Zddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dS)Ú FormatterTestc Cs0dtjtj ddd¡ddddddœ|_i|_dS) Nzformatter.testrúÚtoz dummy.extrzzMessage with %d %s)r Z placeholders)r;rIÚpathnameÚlinenorÚfuncrêr )rr.rórúr¢ÚcommonÚvariantsr[r<r<r=r>‘sø zFormatterTest.setUpNcCs,t|jƒ}|dur"| |j|¡t |¡SrÁ)rrYrBrZrr¨)r:r;Úresultr<r<r=Ú get_recordŸs zFormatterTest.get_recordc OsTz|j|g|¢Ri|¤ŽWn2|yN}z| ||j¡WYd}~n d}~00dSrÁ)rßrKrq)r:rárqr rÅr†r<r<r=Úassert_error_message¥sz"FormatterTest.assert_error_messagecCs˜| ¡}t d¡}| | |¡d¡t d¡}| t|j|¡| | ¡¡t d¡}|  | ¡¡t d¡}|  | ¡¡t d¡}|  | ¡¡dS)Nz${%(message)s}z${Message with 2 placeholders}z %(random)sú %(asctime)sz%(asctime)-15sz%(asctime)#15s© r\rr1rKr€rßrþrùÚusesTimer9©r:r«rªr<r<r=Ú test_percent«s     zFormatterTest.test_percentcCsº| ¡}tjddd}| | |¡d¡tjddd}| t|j|¡tjddd}| | ¡¡tjddd}|  | ¡¡tjddd}|  | ¡¡tjd dd}|  | ¡¡dS) Nz $%{message}%$ú{©r›ú$%Message with 2 placeholders%$z{random}z {message}ú {asctime}z{asctime!s:15}z {asctime:15}r_rar<r<r=Ú test_bracesºszFormatterTest.test_bracescCs| ¡}tjddd}| | |¡d¡tjddd}| | |¡d¡tjddd}| | |¡d¡tjddd}| t|j|¡| | ¡¡tjd dd}|  | ¡¡tjd dd}|  | ¡¡tjddd}| | ¡¡tjd dd}|  | ¡¡dS) Nú ${message}ršrdzMessage with 2 placeholdersz$messagez$$%${message}%$$rez ${random}z ${asctime}z$asctimez ${asctime}--r_rar<r<r=Ú test_dollarsÊs$zFormatterTest.test_dollarscCst d¡}| |jd¡t d¡}| |jd¡t d¡}| |jd¡t d¡}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjd dd}| |jd ¡tjd dd}| |jd ¡tjd dd}| |jd ¡tjd dd}| |jd ¡tjd dd}| |jd ¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡tjddd}| |jd¡| ttjd¡| ttjd¡| ttjd¡| ttjd¡| ttjd¡| ttjd¡| ttjd¡| ttjd ¡| ttjd!¡|jtd"tjd#dd|jtd$tjd%dd| td&¡|jttjd'dd|jtd(tjd)dd|jtd*tjd+dd|jttjd,dd|jttjd-dd|jttjd.dd|jttjd/dd|jtd0tjd1dd|jtd0tjd2dd|jttjd3dd|jttjd4dd|jttjd5dd|jttjd6dd|jttjd7dd|jttjd8dd|jttjd9dd|jttjd:dd|jttjd;dd|jtddd|jtd.NoMsecFormatterNz%d/%m/%Y %H:%M:%S)r]r^r_Údefault_msec_formatÚdefault_time_formatr<r<r<r=ÚNoMsecFormatter‡sr‚rorrprqrèrrrz21/04/1993 08:03:00)rr1r\rtrurrvrwrxryr{r|rKr})r:r‚r«rPrªr<r<r=Útest_default_msec_format_none†sz+FormatterTest.test_default_msec_format_none)N) r]r^r_r>r\r]rbrgrirlrnrrƒr<r<r<r=rTs rTc@seZdZdd„Zdd„ZdS)ÚTestBufferingFormattercCs dt|ƒS)Nz[(%d)©rL©r:Úrecordsr<r<r=Ú formatHeader”sz#TestBufferingFormatter.formatHeadercCs dt|ƒS)Nz(%d)]r…r†r<r<r=Ú formatFooter—sz#TestBufferingFormatter.formatFooterN)r]r^r_rˆr‰r<r<r<r=r„“sr„c@s$eZdZdd„Zdd„Zdd„ZdS)ÚBufferingFormatterTestcCs"t ddi¡t ddi¡g|_dS)Nrêr9r:)rr¨r‡r[r<r<r=r>›s  þzBufferingFormatterTest.setUpcCs2t ¡}| d| g¡¡| d| |j¡¡dS)NrZonetwo)rÚBufferingFormatterrKr€r‡rkr<r<r=Ú test_default¡sz#BufferingFormatterTest.test_defaultcCsDtƒ}| d| |j¡¡t d¡}t|ƒ}| d| |j¡¡dS)Nz[(2)onetwo(2)]z <%(message)s>z[(2)(2)])r„rKr€r‡rr1)r:rªZlfr<r<r=Ú test_custom¦s  z"BufferingFormatterTest.test_customN)r]r^r_r>rŒrr<r<r<r=rŠšsrŠc@seZdZdd„ZdS)Ú ExceptionTestcCs¦|j}tƒ}| |¡z tdƒ‚WntjdddYn0| |¡| ¡|jd}|  |j   d¡¡|  |j   d¡¡|  |j   d¡¡|  |j   d ¡¡dS) Nr@ZfailedT©Ú stack_inforz#Traceback (most recent call last): z! RuntimeError: deliberate mistakeúStack (most recent call last): z,logging.exception('failed', stack_info=True))r'ÚRecordingHandlerr8rArrár@r?r‡r9Úexc_textrxrŸr)r:r«rDr<r<r=r+®s    zExceptionTest.test_formattingN)r]r^r_r+r<r<r<r=rŽ­srŽc@seZdZdd„ZdS)ÚLastResortTestc Csš|j}| |j¡tj}tj}zZt ¡D}| d¡|  |  ¡d¡|  d¡|  |  ¡d¡Wdƒn1st0Ydt_t ¡.}|  d¡d}|  |  ¡|¡Wdƒn1sÀ0Yt ¡*}|  d¡|  |  ¡d¡Wdƒn1s0Yd|j _ dt_t ¡*}|  d¡|  |  ¡d¡Wdƒn1sV0YW| |j¡|t_|t_n| |j¡|t_|t_0dS)NzThis should not appearrz Final chance!zFinal chance! z-No handlers could be found for logger "root" F)r'r@r0rÚ lastResortrKrrMryrKrIrwrÚemittedNoHandlerWarningr8)r:rüZold_lastresortZold_raise_exceptionsrOrêr<r<r=Útest_last_resortÄs:    .  .  0  2 þ zLastResortTest.test_last_resortN)r]r^r_r—r<r<r<r=r”Ãsr”c@seZdZdd„Zdd„ZdS)Ú FakeHandlerc Cs$dD]}t||| |||¡ƒqdS)N)r,Úflushr?r-)ÚsetattrÚ record_call)r:Ú identifierÚcalledrr<r<r=r'ìszFakeHandler.__init__cs‡‡‡fdd„}|S)Ncsˆ d ˆˆ¡¡dS)Nz{} - {})r¡r€r<©rrœÚ method_namer<r=Úinnerñsz&FakeHandler.record_call..innerr<)r:rœrŸrr r<ržr=r›ðszFakeHandler.record_callN)r]r^r_r'r›r<r<r<r=r˜êsr˜cs$eZdZ‡fdd„Zdd„Z‡ZS)r’cs tt|ƒj|i|¤Žg|_dSrÁ)r&r’r'r‡)r:r rÅr*r<r=r'øszRecordingHandler.__init__cCs|j |¡dS)z&Keep track of all the emitted records.N)r‡r¡rÄr<r<r=røüszRecordingHandler.handle)r]r^r_r'rør/r<r<r*r=r’ös r’cs˜eZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Z‡ZS)"Ú ShutdownTestz#Test suite for the shutdown method.cs.tt|ƒ ¡g|_tj}| ttd|¡dS)NrK)r&r¡r>rrrKrŽrš)r:Zraise_exceptionsr*r<r=r>szShutdownTest.setUpcs‡fdd„}|S)Ncs ˆƒ‚dSrÁr<r<©rvr<r=r  sz'ShutdownTest.raise_error..innerr<)r:rvr r<r¢r=Ú raise_error s zShutdownTest.raise_errorcCsbtd|jƒ}td|jƒ}td|jƒ}ttjj|||gƒ}tjt|ƒdgd¢}| ||j¡dS)NrrYr ©Ú handlerList) z 2 - acquirez 2 - flushz 2 - closez 2 - releasez 1 - acquirez 1 - flushz 1 - closez 1 - releasez 0 - acquirez 0 - flushz 0 - closeú 0 - release) r˜rrXrr]r^rurGrK)r:Zhandler0Zhandler1Zhandler2r6rUr<r<r=Útest_no_failures   zShutdownTest.test_no_failurecCsRtd|jƒ}t||| |¡ƒtj |¡g}tjt|ƒd|  d|jd¡dS)Nrr¤r¦ré) r˜rršr£rr]r^rurGrK)r:rrvršr6r<r<r=Ú_test_with_failure_in_method!s  z)ShutdownTest._test_with_failure_in_methodcCs| dt¡dS©Nr,©r¨rýr[r<r<r=Útest_with_ioerror_in_acquire*sz)ShutdownTest.test_with_ioerror_in_acquirecCs| dt¡dS©Nr™rªr[r<r<r=Útest_with_ioerror_in_flush-sz'ShutdownTest.test_with_ioerror_in_flushcCs| dt¡dS©Nr?rªr[r<r<r=Útest_with_ioerror_in_close0sz'ShutdownTest.test_with_ioerror_in_closecCs| dt¡dSr©©r¨rþr[r<r<r=Útest_with_valueerror_in_acquire3sz,ShutdownTest.test_with_valueerror_in_acquirecCs| dt¡dSr¬r°r[r<r<r=Útest_with_valueerror_in_flush6sz*ShutdownTest.test_with_valueerror_in_flushcCs| dt¡dSr®r°r[r<r<r=Útest_with_valueerror_in_close9sz*ShutdownTest.test_with_valueerror_in_closecCsdt_| dt¡dS)NFr,©rrKr¨Ú IndexErrorr[r<r<r=Ú.test_with_other_error_in_acquire_without_raise<sz;ShutdownTest.test_with_other_error_in_acquire_without_raisecCsdt_| dt¡dS)NFr™r´r[r<r<r=Ú,test_with_other_error_in_flush_without_raise@sz9ShutdownTest.test_with_other_error_in_flush_without_raisecCsdt_| dt¡dS)NFr?r´r[r<r<r=Ú,test_with_other_error_in_close_without_raiseDsz9ShutdownTest.test_with_other_error_in_close_without_raisecCsdt_| t|jdt¡dS)NTr,©rrKrßrµr¨r[r<r<r=Ú+test_with_other_error_in_acquire_with_raiseHs ÿz8ShutdownTest.test_with_other_error_in_acquire_with_raisecCsdt_| t|jdt¡dS)NTr™r¹r[r<r<r=Ú)test_with_other_error_in_flush_with_raiseMs ÿz6ShutdownTest.test_with_other_error_in_flush_with_raisecCsdt_| t|jdt¡dS)NTr?r¹r[r<r<r=Ú)test_with_other_error_in_close_with_raiseRs ÿz6ShutdownTest.test_with_other_error_in_close_with_raise)r]r^r_r`r>r£r§r¨r«r­r¯r±r²r³r¶r·r¸rºr»r¼r/r<r<r*r=r¡s"  r¡c@sreZdZdZdd„Zddd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)ÚModuleLevelMiscTestz)Test suite for some module level methods.cCsštjjj}| |d¡| tj|¡t d¡| tjjjd¡| ttjd¡Gdd„dƒ}| ttj|ƒ¡t d¡t ¡| tjjjtj ¡dS)NréSZ doesnotexistsc@s eZdZdS)z;ModuleLevelMiscTest.test_disable.._NotAnIntOrStringNrŒr<r<r<r=Ú_NotAnIntOrStringgsr¿ÚWARN) rrürrCrKrŽrßrþrre)r:Ú old_disabler¿r<r<r=Ú test_disable\s    z ModuleLevelMiscTest.test_disableNcsÀg‰t |td‡fdd„¡tƒ}tj |¡tt|ƒ}|durN||d|ƒn |d|ƒ| t|j ƒd¡|j d}| |  ¡d|¡|dur”|n tt|  ¡ƒ}| |j |¡| ˆg¡dS)NÚ basicConfigcsˆ ||f¡SrÁr)rÚkw©rr<r=Úvr°z/ModuleLevelMiscTest._test_log..z test me: %rrYr) rr6rr’rür8r#rKrLr‡Ú getMessageÚupperrÂ)r:rrIÚ recordingÚ log_methodr£Zexpected_levelr<rÅr=Ú _test_logss   ÿ    zModuleLevelMiscTest._test_logcCs| dtj¡dS©Nru)rËrrgr[r<r<r=Útest_log‹szModuleLevelMiscTest.test_logcCs| d¡dS©Nry©rËr[r<r<r=Ú test_debugŽszModuleLevelMiscTest.test_debugcCs| d¡dS©NrxrÏr[r<r<r=Ú test_info‘szModuleLevelMiscTest.test_infocCs| d¡dS©NrwrÏr[r<r<r=Ú test_warning”sz ModuleLevelMiscTest.test_warningcCs| d¡dS©NrvrÏr[r<r<r=Ú test_error—szModuleLevelMiscTest.test_errorcCs| d¡dS©NrîrÏr[r<r<r=Ú test_criticalšsz!ModuleLevelMiscTest.test_criticalcCs^| ttjt¡Gdd„dtjƒ}t |¡| t ¡|¡t tj¡| t ¡tj¡dS)Nc@s eZdZdS)z;ModuleLevelMiscTest.test_set_logger_class..MyLoggerNrŒr<r<r<r=r sr)rßrrr r rrKÚgetLoggerClass)r:rr<r<r=Útest_set_logger_classs   z)ModuleLevelMiscTest.test_set_logger_classc sg‰G‡fdd„dt ¡ƒ}t |¡t d¡}| ˆdg¡t ¡}t |¡}| |¡z†|  tj ¡|  d¡| |  ¡  ¡d¡| d¡| d¡|  tj¡|  d¡| |  ¡d¡W| |¡| ¡t tj¡n | |¡| ¡t tj¡0dS)Ncs&eZdZdejf‡‡fdd„ Z‡ZS)z@ModuleLevelMiscTest.test_subclass_logger_cache..MyLoggerrcstƒ ||¡ˆ d¡dS)NÚ initialized)r&r'r¡)r:r;rI)r+rqr<r=r'®szIModuleLevelMiscTest.test_subclass_logger_cache..MyLogger.__init__)r]r^r_rrŒr'r/r<©rqr*r=r­srZjust_some_loggerrÛZhellorr)rrÙr rrKr*r+r/r8r-r.ryrIr Útruncaterãrmr@r?r)r:rrÐr,rDr<rÜr=Útest_subclass_logger_cache©s.           þ z.ModuleLevelMiscTest.test_subclass_logger_cachecCs8d}td|ƒ\}}}| ¡}| d|¡| d|¡dS)Na&if 1: import logging class A: def __del__(self): try: raise ValueError("some error") except Exception: logging.exception("exception in __del__") a = A()ú-czexception in __del__zValueError: some error)rrVrN©r:ÚcodeÚrcÚoutÚerrr<r<r=Útest_logging_at_shutdownÈs   z,ModuleLevelMiscTest.test_logging_at_shutdowncCs8d}td|ƒ\}}}| ¡}| d|¡| |d¡dS)Nz†if 1: import logging def rec(): logging.error("foo") rec() rec()rßz#Cannot recover from stack overflow.rY)rrVZ assertNotInrKràr<r<r=Útest_recursion_errorÚs  z(ModuleLevelMiscTest.test_recursion_error)N)r]r^r_r`rÂrËrÍrÐrÒrÔrÖrØrÚrÞrårær<r<r<r=r½Xs  r½c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú LogRecordTestcCs6t i¡}t|ƒ}| | d¡¡| | d¡¡dS)Nz )rr¨r¬r9rxrŸ)r:r«rWr<r<r=Ú test_str_repës zLogRecordTest.test_str_repcCsjtƒ}t ¡}| |¡ddi}t d|¡| |jdj|¡| |jdj d¡|  |¡|  ¡dS)NZlessZmorezless is %(less)srz less is more) r’rrr8rwrLr‡r rKrqr@r?)r:rDr«rYr<r<r=Ú test_dict_argñs   zLogRecordTest.test_dict_argcCsZt i¡}| |jd¡z*ddl}t i¡}| |j| ¡j¡WntyTYn0dS)NÚ MainProcessr)rr¨rKÚ processNamerDÚcurrent_processr;rR)r:r«Úmpr<r<r=Útest_multiprocessingüs   z"LogRecordTest.test_multiprocessingcCsÄt i¡}|j}||jƒ||jƒ||jƒ||jƒtj}tj}tj }z`dt_dt_dt_ t i¡}|j }||jƒ||jƒ||jƒ||jƒW|t_|t_|t_ n|t_|t_|t_ 0dS)NF) rr¨ÚassertIsNotNoner¸Ú threadNameÚprocessrìÚ logThreadsÚ logProcessesÚlogMultiprocessingrR)r:r«ZNOT_NONEZ log_threadsZ log_processesZlog_multiprocessingÚNONEr<r<r=Ú test_optionals2          þzLogRecordTest.test_optionalN)r]r^r_rérêrïr÷r<r<r<r=rçês  rçcsöeZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd9d+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Z‡ZS):ÚBasicConfigTestz#Test suite for logging.basicConfig.csVtt|ƒ ¡tjj|_tj ¡|_tj dd…|_ tjj |_ |  |j¡gtj_dSrÁ)r&rør>rrür6rrrrrrIr)rŽrör[r*r<r=r>#s    zBasicConfigTest.setUpcs<tjjdd…D]}tj |¡| ¡qtt|ƒ ¡dSrÁ)rrür6r@r?r&rørErâr*r<r=rE,s  zBasicConfigTest.tearDowncCsJttjd|jƒtj ¡tj |j¡|jtj dd…<tj  |j ¡dS)Nr6) ršrrür6rrArBrrrr-r)r[r<r<r=rö2s  zBasicConfigTest.cleanupcCst ¡| ttjjƒd¡tjjd}| |tj¡| |jt j ¡|j }| |j j tj¡| |j¡| |j tj¡| tjj|j¡dS)NrYr)rrÃrKrLrür6r„r/r,rïrOrrÙrjÚ BASIC_FORMATrRrÚ PercentStylerIr))r:ršrr<r<r=Útest_no_kwargs9s  zBasicConfigTest.test_no_kwargscCsft ¡J}tjtjddt d¡tj d¡| |  ¡  ¡d¡Wdƒn1sX0YdS)Nrc©r,r›ú Log an errorrúERROR:root:Log an error© rrËrrÃrïrârvrãrKrIr r§r<r<r=Útest_strformatstyleMs   ÿz#BasicConfigTest.test_strformatstylecCsft ¡J}tjtjddt d¡tj d¡| |  ¡  ¡d¡Wdƒn1sX0YdS)Nršrürýrrþrÿr§r<r<r=Útest_stringtemplatestyleUs   ÿz(BasicConfigTest.test_stringtemplatestylecCsŠdd„}tjdd| ttjjƒd¡tjjd}| |tj¡t dd¡}| |jj |jj ¡| |jj |jj ¡|  |||d¡dS)NcSs| ¡| ¡t |¡dSrÁrò©rõZh2rr<r<r=rö_sz.BasicConfigTest.test_filename..cleanupútest.log)rÁrYrr) rrÃrKrLrür6r„rr,Úmoder;rŽ©r:röršrUr<r<r=Ú test_filename]s   zBasicConfigTest.test_filenamecCsVdd„}tjdddtjjd}t dd¡}| |jj|jj¡| |||d¡dS)NcSs| ¡| ¡t |¡dSrÁròrr<r<r=röqsz.BasicConfigTest.test_filemode..cleanuprÚwb©rÁÚfilemoder) rrÃrür6rrKr,rrŽrr<r<r=Ú test_filemodeos   zBasicConfigTest.test_filemodecCs`t ¡}| |j¡tj|d| ttjj ƒd¡tjj d}|  |tj ¡| |j |¡dS)Nr%rYr) r*r+rŽr?rrÃrKrLrür6r„r/r,)r:r,ršr<r<r=Ú test_stream}s   zBasicConfigTest.test_streamcCs.tjddtjjdj}| |jjd¡dS)Nz%(asctime)s - %(message)s)r€r)rrÃrür6rrKrÙrj©r:rr<r<r=Ú test_format‡s zBasicConfigTest.test_formatcCs,tjddtjjdj}| |jd¡dS)NrL)rr)rrÃrür6rrKrr r<r<r=Ú test_datefmts zBasicConfigTest.test_datefmtcCs.tjddtjjdj}| |jtj¡dS)Nršrdr)rrÃrür6rr„rÙrÚr r<r<r=Ú test_style“s zBasicConfigTest.test_stylecCsTtjj}| tjj|¡tjdd| tjjd¡tjdd| tjjd¡dS)Né9)rIé:)rrürIrŽr-rÃrK)r:Ú old_levelr<r<r=Ú test_level™s   zBasicConfigTest.test_levelcCsp|j}t ¡g}tj}|ttjd|d|ttjd|d|ttj||d|ttjtjdtjddddS)Nr)rÁr,)rÁr6)r,r6)Zloglevelrr)rßrr/rïrOrþrÃrm)r:rßr6r,r<r<r=Útest_incompatible£s  ÿ ÿ ÿz!BasicConfigTest.test_incompatiblecCsÒt ¡t tj¡t ¡g}t ¡}|d |¡tj|d| |dtjj d¡| |dtjj d¡| |dtjj d¡|  |dj ¡|  |dj ¡| |dj |¡| |dj |dj ¡dS)Nr )r6rrY) rr/rïrâr1r4rÃrLrür6rðr)r:r6rªr<r<r=Ú test_handlers²s ý zBasicConfigTest.test_handlerscCsÚt ¡}t ¡}t |¡g}t |¡g}tjtj|dt d¡t d¡t d¡|  t tj j ƒd¡tjtj |ddt d¡t d¡t d¡|  t tj j ƒd¡|  | ¡ ¡d¡|  | ¡ ¡d ¡dS) Nrr€rxryrYT)rIr6ÚforcezWARNING:root:warnz WARNING:root:warn INFO:root:info)r*r+rr/rÃrkrwrxryrKrLrür6rmrIr )r:Z old_string_ioZ new_string_ioZ old_handlersZ new_handlersr<r<r=Ú test_forceÃs,      ÿ   ÿÿzBasicConfigTest.test_forcecCszºd}tjd|ddtjd| ttjjƒd¡tjjd}| |tj¡| |j |¡t  d¡W|  ¡t ddd }|  ¡ ¡}Wdƒn1sš0Yt d¡| |d¡nX|  ¡t ddd }|  ¡ ¡}Wdƒn1sò0Yt d¡| |d¡0dS) NrOrrmú %(message)s©rÁrhÚerrorsr€rIrYrõ.The Øresund Bridge joins Copenhagen to Malmörg©rrÃr.rKrLrür6r„rrhryr?r(rRr róró©r:rhršrªrCr<r<r=Ú test_encodingØs2þ  * ÿü* ÿzBasicConfigTest.test_encodingcCszºd}tjd|ddtjd| ttjjƒd¡tjjd}| |tj¡| |j |¡t  d¡W|  ¡t dd d }|  ¡ ¡}Wdƒn1sš0Yt d¡| |d ¡nX|  ¡t dd d }|  ¡ ¡}Wdƒn1sò0Yt d¡| |d ¡0dS) NrrÚignorerrrYrrrOrgz*The resund Bridge joins Copenhagen to Malmrrr<r<r=Útest_encoding_errorsìs*þ  * ü* z$BasicConfigTest.test_encoding_errorscCs$zÆd}tjd|dtjd| ttjjƒd¡tjjd}| |tj¡| |j |¡| |j d¡t  d¡W|  ¡t dd d }| ¡ ¡}Wdƒn1s¦0Yt d¡| |d ¡nX|  ¡t dd d }| ¡ ¡}Wdƒn1sþ0Yt d¡| |d ¡0dS) Nrrr)rÁrhr€rIrYrÚbackslashreplaceu<😂: ☃ï¸: The Øresund Bridge joins Copenhagen to MalmörOrgzL\U0001f602: \u2603\ufe0f: The \xd8resund Bridge joins Copenhagen to Malm\xf6)rrÃr.rKrLrür6r„rrhrryr?r(rRr rórórr<r<r=Útest_encoding_errors_defaultÿs*ÿ  * ü* z,BasicConfigTest.test_encoding_errors_defaultcsVzöd}tjd|ddtjd| ttjjƒd¡tjjd}| |tj¡| |j |¡|  |j ¡g‰‡fdd„}||_ t  d ¡| ˆ¡| d ˆd¡W| ¡tdd d }| ¡ ¡}Wdƒn1sÖ0Yt d¡| |d ¡nZ| ¡tdd d }| ¡ ¡}Wdƒn1s00Yt d¡| |d ¡0dS)NrrrrrYrcs t ¡\}}}ˆ t|ƒ¡dSrÁ)rïrr¡r¬)r£rrÎrÜr<r=Údummy_handle_error#szEBasicConfigTest.test_encoding_errors_none..dummy_handle_errorrz:'ascii' codec can't encode character '\xd8' in position 4:rOrgr)rrÃr.rKrLrür6r„rrhrRrrGryr9rNr?r(rRr róró)r:rhršr#rªrCr<rÜr=Útest_encoding_errors_nones:þ     ÿ* û, z)BasicConfigTest.test_encoding_errors_noneNcsfg‰tj‰‡‡‡fdd„}t ˆtd|¡tt|ƒ}|durH||dƒn|dƒˆ ˆdifg¡dS)Ncs<ˆƒtjj}tj d¡ˆ tjj|¡ˆ ||f¡dS)Néd)rrürIr-rŽr¡)rrÄr©rZold_basic_configr:r<r=Úmy_basic_config:s  z2BasicConfigTest._test_log..my_basic_configrÃztest mer<)rrÃrr6r#rK)r:rrIr'rÊr<r&r=rË5s  zBasicConfigTest._test_logcCs| dtj¡dSrÌ)rËrrkr[r<r<r=rÍLszBasicConfigTest.test_logcCs| d¡dSrÎrÏr[r<r<r=rÐOszBasicConfigTest.test_debugcCs| d¡dSrÑrÏr[r<r<r=rÒRszBasicConfigTest.test_infocCs| d¡dSrÓrÏr[r<r<r=rÔUszBasicConfigTest.test_warningcCs| d¡dSrÕrÏr[r<r<r=rÖXszBasicConfigTest.test_errorcCs| d¡dSr×rÏr[r<r<r=rØ[szBasicConfigTest.test_critical)N) r]r^r_r`r>rErörûrrrr r r rrrrrrrr r"r$rËrÍrÐrÒrÔrÖrØr/r<r<r*r=røs8   " røcsLeZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z ‡Z S)ÚLoggerAdapterTestcs’tt|ƒ ¡tjdd…‰tƒ|_tj|_|j  |j¡|  |jj |j¡|  |jj ¡‡fdd„}|  |¡|  tj ¡tj|jdd|_dS)Ncsˆtjdd…<dSrÁ)rrr<©Zold_handler_listr<r=röjsz(LoggerAdapterTest.setUp..cleanup©rÐr)r&r(r>rrr’rÉrürÐr8rŽr@r?rurtÚadapter)r:rör*r)r=r>`s   zLoggerAdapterTest.setUpc Csºd}d}z ddWn8tyL}z |}|j ||j¡WYd}~n d}~00| t|jjƒd¡|jjd}| |jtj ¡| |j |¡| |j |jf¡| |j |j ||jf¡dS©Nztesting exception: %rrYr)r1r+rárÉrKrLr‡rÂrrgrêr rr+Ú __traceback__©r:rêr2r†r£r<r<r=Útest_exceptionqs &  ÿz LoggerAdapterTest.test_exceptionc Cs‚z ddWn(ty4}z|}WYd}~n d}~00|jjd|d| t|jjƒd¡|jjd}| |j|j||j f¡dS)NrYrz exc_info testr0) r1r+rárKrLrÉr‡rr+r-)r:r†r2r£r<r<r=Útest_exception_excinfo‚s   ÿz(LoggerAdapterTest.test_exception_excinfocCshd}|j ||j¡| t|jjƒd¡|jjd}| |jtj¡| |j |¡| |j |jf¡dS)Nzcritical test! %rrYr) r+rîrÉrKrLr‡rÂrrerêr )r:rêr£r<r<r=rØs zLoggerAdapterTest.test_criticalcCsD|jjjj}d|jjj_| t|jjjd|¡| |j d¡¡dS)Né!rCé )r+rÐrrCrŽršrùÚ isEnabledFor©r:rÁr<r<r=Útest_is_enabled_for™s   ÿz%LoggerAdapterTest.test_is_enabled_forcCsN| |j ¡¡|jjD]}|j |¡q| |j ¡¡| |j ¡¡dSrÁ)r9r+r5rÐr6r@rùrßr<r<r=Útest_has_handlers s  z#LoggerAdapterTest.test_has_handlerscCsRGdd„dtjƒ}d}||jdd}||dd}d|_| t|ƒt|ƒ¡| tj||j¡| t |jj ƒd¡|jj d}| |j tj¡| |j d|›¡| |j |jf¡|j}| |j|¡| |jj|¡tƒ}z<||_| |j|¡| |j|¡| |jj|¡W||_n||_0| |j|¡| |j|¡| |jj|¡dS) Nc@seZdZdZdd„ZdS)z.LoggerAdapterTest.test_nested..AdapterÚAdaptercSs|j›d|›|fSr÷)r¥)r:rêrÅr<r<r=rò­sz6LoggerAdapterTest.test_nested..Adapter.processN)r]r^r_r¥ròr<r<r<r=r7ªsr7zAdapters can be nested, yo.r*ZAdapterAdapterrYrzAdapter AdapterAdapter )rrtrÐr¥rKrUrurerÉrLr‡rÂrêr rrLr )r:r7rêr+Zadapter_adapterr£Z orig_managerZ temp_managerr<r<r=Ú test_nested©s2  zLoggerAdapterTest.test_nested) r]r^r_r>r/r0rØr5r6r8r/r<r<r*r=r(_s    r(csœeZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Z‡ZS)#Ú LoggerTestcsbtt|ƒ ¡tƒ|_tjdd|_|j |j¡|  |jj |j¡|  |jj ¡|  tj ¡dS)NZblah©r;) r&r9r>r’rÉrrrÐr8rŽr@r?rur[r*r<r=r>ÍszLoggerTest.setUpcCs| t|jjtƒ¡dSrÁ)rßrrÐr-r r[r<r<r=Útest_set_invalid_levelÖsz!LoggerTest.test_set_invalid_levelc Csºd}d}z ddWn8tyL}z |}|j ||j¡WYd}~n d}~00| t|jjƒd¡|jjd}| |jtj ¡| |j |¡| |j |jf¡| |j |j ||jf¡dSr,)r1rÐrárÉrKrLr‡rÂrrgrêr rr+r-r.r<r<r=r/Ùs &  ÿzLoggerTest.test_exceptioncCsFt tdd¡$| t|jjdd¡Wdƒn1s80YdS)NrKTrrú test message)rÚ swap_attrrrßrrÐrur[r<r<r=Ú!test_log_invalid_level_with_raiseêsz,LoggerTest.test_log_invalid_level_with_raisecCs@t tdd¡|j dd¡Wdƒn1s20YdS)NrKFrrr<)rr=rrÐrur[r<r<r=Útest_log_invalid_level_no_raiseîsz*LoggerTest.test_log_invalid_level_no_raisecsPg‰t |tjd‡fdd„¡|jjdd| tˆƒd¡| dˆd¡dS) NÚ print_stackcsˆ | ¡¡SrÁ)r¡rI)rªrÆrÅr<r=rÆõr°z=LoggerTest.test_find_caller_with_stack_info..TrrYr‘r)rr6rÚ tracebackrÐÚ findCallerrKrLr[r<rÅr=Ú test_find_caller_with_stack_infoòs  ÿz+LoggerTest.test_find_caller_with_stack_infocsd‰‡‡fdd„‰‡fdd„‰‡fdd„}ˆjj}|ƒˆ |djd ¡|dj}ˆd7‰|ƒˆ |djd ¡ˆ |dj|¡|dj}ˆd7‰|ƒˆ |djd ¡ˆ |dj|¡|dj}ˆd7‰|ƒˆ |djd ¡ˆ |dj|¡dS) NrYcsˆjjdˆddS)Nrf)Ú stacklevel)rÐrwr<)r:Ú the_levelr<r=Ú innermostÿsz>LoggerTest.test_find_caller_with_stacklevel..innermostcs ˆƒdSrÁr<r<)rFr<r=r sz:LoggerTest.test_find_caller_with_stacklevel..innercs ˆƒdSrÁr<r<)r r<r=Úoutersz:LoggerTest.test_find_caller_with_stacklevel..outerrérFr rGÚ test_find_caller_with_stacklevel)rÉr‡rKrPrWr8)r:rGr‡rWr<)r rFr:rEr=rHüs,     z+LoggerTest.test_find_caller_with_stacklevelc Cs†d}d}d}}}}}}} t ||||||||| ¡ } dt| j ¡ƒD]0} | di} |jt|jj|||||||| | d qPdS)Nú my recordé )rqr~ú some value©rÚsinfo) rÚ_logRecordFactoryrPÚ__dict__ÚkeysrßròrÐÚ makeRecord) r:r;rIrÚlnorêr rrXrMÚrvr_rr<r<r=Ú%test_make_record_with_extra_overwritesÿ þz0LoggerTest.test_make_record_with_extra_overwritec Cs\d}d}d}}}}}}} ddi} |jj|||||||| | d } | d| j¡dS)NrIrJZ valid_keyrKrL)rÐrQrNrO) r:r;rIrrRrêr rrXrMrr[r<r<r=Ú(test_make_record_with_extra_no_overwrite(sÿz3LoggerTest.test_make_record_with_extra_no_overwritecCs>| |j ¡¡|jjD]}|j |¡q| |j ¡¡dSrÁ)r9rÐr5r6r@rùrßr<r<r=r61s zLoggerTest.test_has_handlerscCs"t d¡}d|_| | ¡¡dS)Nz blah.childF)rrr§rùr5)r:Z child_loggerr<r<r=Útest_has_handlers_no_propagate8s z)LoggerTest.test_has_handlers_no_propagatecCs>|jjj}d|jj_| t|jjd|¡| |j d¡¡dS)NérCé)rÐrrCrŽršrùr3r4r<r<r=r5=s  zLoggerTest.test_is_enabled_forcCs`|jj}|jjj}d|j_d|jj_| t|jd|¡| t|jjd|¡| |j d¡¡dS)NTrprrCrX)rÐrrrCrŽršrùr3)r:Z old_disabledrÁr<r<r=Ú#test_is_enabled_for_disabled_loggerCs  z.LoggerTest.test_is_enabled_for_disabled_loggercCs²t ¡}| |tj¡| |t d¡¡| |t d¡¡| |t d¡¡| |t d¡j¡| |t d¡j¡| |t d¡j¡| |t d¡¡| |t d¡j¡dS)NrrürKúfoo.barú)rrrLrüÚparentZ assertIsNot)r:rür<r<r=Útest_root_logger_aliasesOsz#LoggerTest.test_root_logger_aliasescCs$| ttjt¡| ttjd¡dS)Nsfoo)rßrrrÚanyr[r<r<r=Útest_invalid_names\szLoggerTest.test_invalid_namescCsNttjdƒD]:}dD]0}t |¡}t ||¡}t |¡}| ||¡qqdS)NrY)rrürKrZzbaz.bar)rr%ÚHIGHEST_PROTOCOLrrrÎr&rL)r:Úprotor;rÐrWZ unpickledr<r<r=Ú test_pickling`s    zLoggerTest.test_picklingcCs6|j}t d¡}t d¡}| tj¡| | ¡tj¡| |ji¡| |  tj¡¡|  |  tj ¡¡| |jtjdtj di¡| |ji¡| |  tj¡¡| |ji¡| |  tj¡¡| |jtjdi¡| tj ¡| | ¡tj ¡| |ji¡|  |  tj¡¡| tj ¡| | ¡tj ¡| |ji¡| |ji¡| |ji¡|  |  tj¡¡| |  tj ¡¡|  |  tj¡¡| |  tj ¡¡| |  tj¡¡t ¡| | ¡tj ¡| |ji¡| |ji¡| |ji¡|  |  tj ¡¡|  |  tj ¡¡|  |  tj ¡¡dS)NrrTF)r'rrr-rgrKr(Ú_cacher9r3rùr.rerŒrC)r:rür%r&r<r<r=Ú test_cachinghsH     zLoggerTest.test_caching)r]r^r_r>r;r/r>r?rCrHrTrUr6rVr5rYr]r_rbrdr/r<r<r*r=r9Ës"      r9c@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú BaseFileTestz1Base class for handler tests that write log filescCs0t |¡t dd¡\}|_t |¡g|_dS)Nrztest_logging-2-)rr>rñròrrór?Úrmfiles)r:rr<r<r=r>¤s  zBaseFileTest.setUpcCs>|jD]}t |¡qtj |j¡r0t |j¡t |¡dSrÁ)rfrórôrúrûrrrE)r:rr<r<r=rEªs    zBaseFileTest.tearDowncCs*|jtj |¡d|d|j |¡dS)z7Assert a log file is there and register it for deletionzLog file %r does not exist©rêN)r9rórúrûrfr¡)r:rÁr<r<r=Ú assertLogFile±sÿzBaseFileTest.assertLogFileN)r]r^r_r`r>rErhr<r<r<r=re¡srec@seZdZdd„ZdS)ÚFileHandlerTestcCsxt |j¡tj|jdd}| |j¡| tj  |j¡¡|  t  i¡¡|  |j¡|  tj  |j¡¡| ¡dS)NTrç)rórôrrrrRr,rùrúrûrør¨rðr9r?)r:Úfhr<r<r=Ú test_delay¹s   zFileHandlerTest.test_delayN)r]r^r_rkr<r<r<r=ri¸sric@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Ze   ¡d d„ƒZ dS)ÚRotatingFileHandlerTestc Cst dtjdd| ¡ddd¡S)Nr²rïrY)rr(r.r\r[r<r<r=Únext_recÄs ÿz RotatingFileHandlerTest.next_reccCs.tjj|jdd}| | d¡¡| ¡dS)Nr©ÚmaxBytes)rr6r rrùÚshouldRolloverr?©r:Úrhr<r<r=Útest_should_not_rolloverÈsz0RotatingFileHandlerTest.test_should_not_rollovercCs2tjj|jdd}| | | ¡¡¡| ¡dS)NrYrn)rr6r rr9rprmr?rqr<r<r=Útest_should_rolloverÎsz,RotatingFileHandlerTest.test_should_rollovercCs4tj |j¡}| | ¡¡| |j¡| ¡dSrÁ)rr6r rrármrhr?rqr<r<r=Útest_file_createdÓs z)RotatingFileHandlerTest.test_file_createdcCs¨dd„}tjj|jddd}||_| | ¡¡| |j¡| | ¡¡| ||jdƒ¡| | ¡¡| ||jdƒ¡| t j   ||jdƒ¡¡|  ¡dS) NcSs|dS©Nú.testr<r:r<r<r=ÚnamerÜsz>RotatingFileHandlerTest.test_rollover_filenames..namerr rY©Ú backupCountroú.1ú.2ú.3) rr6r rrxrármrhrùrórúrûr?)r:rxrrr<r<r=Útest_rollover_filenamesÛsÿ z/RotatingFileHandlerTest.test_rollover_filenamescCsªGdd„dtjjƒ}||jddd}| | |j¡|jd¡| | ¡¡| |j¡| | ¡¡| | |jd¡d¡|  t j   | |jd¡¡¡|  ¡dS) Nc@seZdZdd„Zdd„ZdS)zZRotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotatorcSs|dSrvr<)r:r;r<r<r=rxìsz`RotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotator.namercSs tj |¡rt ||d¡dS)Nú.rotated)rórúrûrú)r:ÚsourceÚdestr<r<r=Úrotatorïs zbRotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotator.rotatorN)r]r^r_rxr‚r<r<r<r=ÚHandlerWithNamerAndRotatorësrƒr rYryrwr{r)rr6r rrKrxrármrhrùrórúrûr?)r:rƒrrr<r<r=Útest_namer_rotator_inheritanceêsÿ z6RotatingFileHandlerTest.test_namer_rotator_inheritancec Csèdd„}dd„}tjj|jddd}||_||_| ¡}| |¡| |j¡| ¡}| |¡||jdƒ}| |¡t j }t |d ƒ:}|  ¡} t  | ¡} | |  d ¡|j|¡Wdƒn1sÈ0Y| | ¡¡||jd ƒ}| |¡t |d ƒ:}|  ¡} t  | ¡} | |  d ¡|j|¡Wdƒn1sD0Y| | ¡¡||jd ƒ}t |d ƒ:}|  ¡} t  | ¡} | |  d ¡|j|¡Wdƒn1s¶0Y| t j ||jd ƒ¡¡| ¡dS) NcSs|dS)Nz.gzr<r:r<r<r=rxÿsz3RotatingFileHandlerTest.test_rotator..namerc Ss€t|dƒX}| ¡}t |d¡}t|dƒ}| |¡Wdƒn1sJ0YWdƒn1sh0Yt |¡dS)NÚrbr«r)r(rRÚzlibÚcompressrDróró)r€rZsfrCÚ compressedÚdfr<r<r=r‚s    Fz5RotatingFileHandlerTest.test_rotator..rotatorr rYryr{r…rr|r})rr6r rr‚rxrmrárhróÚlinesepr(rRr†Ú decompressrKrVrêrùrúrûr?) r:rxr‚rrZm1Zm2rÚnewlinerªrˆrCr<r<r=Ú test_rotatorýsDÿ      6   8  8z$RotatingFileHandlerTest.test_rotatorN) r]r^r_rmrsrtrur~r„rZ requires_zlibrr<r<r<r=rlÃsrlc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚTimedRotatingFileHandlerTestc s¨tjj|jddd}t d¡}| |¡t ddi¡}| |¡| |j¡t   d¡t ddi¡}| |¡|  ¡d }t j   ¡}d }t|ƒD]D}|t j|d } |j|  d ¡‰tj ˆ¡}|r|j ˆ¡qÖqd |} |s–tj |j¡\} ‰‡fdd„t | ¡Dƒ} td| d¡tjdtd| tjd| D]X} td| ƒtj | | ¡}t|dƒ}t| ¡ƒWdƒn1sˆ0Yq<|j|| ddS)NÚSrY)rzrsrêztesting - initialgš™™™™™ñ?ztesting - after delayFi,©Zsecondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondscsg|]}| ˆ¡r|‘qSr<)rx)r­rª©rr<r=r¯Lr°z>TimedRotatingFileHandlerTest.test_rollover..z Test time: %sz%Y-%m-%d %H-%M-%S©rÆzThe only matching files are: %szContents of %s:r«rg)rr6r rr1r4r¨rárhrrr?rtr0rÚ timedeltaÚstrftimerórúrûrfr¡r¡Úlistdirr"rïrOr¢r(rRr9)r:rjr‰Zr1Zr2Úfoundr0ÚGO_BACKÚsecsÚprevrêZdnÚfilesrªrúZtfr<r‘r=Ú test_rollover,sD ÿ            0z*TimedRotatingFileHandlerTest.test_rollovercCsR|j}|ttjj|jddd|ttjj|jddd|ttjj|jddddS)NÚXTrçÚWZW7)rßrþrr6r r)r:rßr<r<r=Ú test_invalidVs ÿ ÿ ÿz)TimedRotatingFileHandlerTest.test_invalidcCs€d}t ddd¡}tjj|jdddd|d}zD| |¡}| ||d¡| |d¡}| ||d ¡W| ¡n | ¡0dS) Nré ÚMIDNIGHTrYT©ÚwhenÚintervalrzruÚatTimeéÀ¨éжi@ú) rtrrr6r rÚcomputeRolloverrKr?)r:Ú currentTimer¤rrrTr<r<r=Ú"test_compute_rollover_daily_attime_s þ z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec Cs:tt ¡ƒ}||d}t ddd¡}t |¡j}tdƒD]ú}tjj|j d|ddd|d}zÌ||krtd||}n||}|d9}|d 7}||7}|  |¡}||krÂt d tj ƒt d t ƒƒ| ||¡||krÞ|d 7}|  |d ¡}||krt d tj ƒt d t ƒƒ| ||¡W| ¡q:| ¡0q:dS)Né€QrŸrézW%drYTr¡r¥zfailed in timezone: %dzlocal vars: %si€: r¦)rGrrtr{Útm_wdayrrr6r rr§r"ÚtimezoneÚlocalsrKr?) r:r¨Ztodayr¤ZwdayZdayrrrUrTr<r<r=Ú#test_compute_rollover_weekly_attimeos:    þ   z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimeN)r]r^r_r›ržr©r¯r<r<r<r=rŽ*s* rŽcKstjfi|¤ŽtjddS)NrYr)rtr“)rÄr<r<r=r˜˜sr˜)rrY)ÚMé<)ÚHi)ÚDrª)r rªZW0ré)ZdaysZhoursc CsPtjj|j|dddd}d}| |¡}||kr8|dkr8zÎ|jrNt |¡}n t |¡}|d}|d}|d } tjj |d |d | } || } t d ||jft j d t d |t j d t d|t j d t d| t j d t d| t j d t d| t j d Wn.t y6t dt  ¡dt j d Yn0| ||¡| ¡dS)NrYrT)r¢r£rzrugr rèrrœr±z t: %s (%s)r’zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz result: %sz exception in diagnostic code: %s)rr6r rr§rurr{Ú localtimeZ _MIDNIGHTr"rïrOr!rrKr?) r:r¢Úexprrr¨rTrlZ currentHourZ currentMinuteZ currentSecondr«r[r<r<r=Útest_compute_rollover£s@ ÿ      ÿÿþ  r·ztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c@seZdZdd„ZdS)ÚNTEventLogHandlerTestc Cs d}t d|¡}t |¡}ztj d¡}Wn<tjyf}z"|jdkrPt   d¡‚‚WYd}~n d}~00t  ddi¡}|  |¡|  ¡| |t |¡¡tjtjB}d}d} t ||| ¡} | D].}|jdkrÐqÀt ||¡} | d kræqÀd }qðqÀd | } |j|| d dS) NZ ApplicationZ test_loggingrœz#Insufficient privileges to run testrêzTest Log MessageFr%zTest Log Message Tz3Record not found in event log, went back %d recordsrg)Ú win32evtlogZ OpenEventLogZGetNumberOfEventLogRecordsrr6ZNTEventLogHandlerÚ pywintypesrvÚwinerrorr=ZSkipTestr¨rør?Z assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZ ReadEventLogZ SourceNameÚwin32evtlogutilZSafeFormatMessager9) r:ZlogtypeZelhZnum_recsrDr†r«Úflagsr–r—Úeventsrêr<r<r=r És:     ÿ  z NTEventLogHandlerTest.test_basicN)r]r^r_r r<r<r<r=r¸Çsr¸c@seZdZdd„ZdS)Ú MiscTestCasecCshd£}tj|t|ddS)N> Ú RootLoggerÚFiltererrÚÚ PlaceHolderrrôrrüÚStrFormatStylerõróÚ currentframerú)Ú blacklist)rZ check__all__r)r:rÅr<r<r=Ú test__all__ìszMiscTestCase.test__all__N)r]r^r_rÆr<r<r<r=r¿ësr¿ÚLC_ALLrc'Csvtttttttttt t t t t ttttttttttttttttttt t!t"t#t$t%t&g'}t't(j)dƒrh| *t+¡t,j-|ŽdS)Nr,).rarrÉrÜr¢r¾rr4rZrertrrÿrTrŠrJrrr r¡r½rør(r9r—rirlr”rçrŽr;r@rCr¸rŽr3r9r?r¿r>rr6r¡r7rZ run_unittest)Ztestsr<r<r=Ú test_mainøs ô  rÈÚ__main__)N) r`rZlogging.handlersZlogging.configrnrÐrrtrr%r*rarÍrór!rrFr[r#rïrñZtest.support.script_helperrrrfrZ test.supportrZtest.support.logging_helperrrÀrrr=r{r]rnZ http.serverrrrYÚ urllib.parser r Ú socketserverr r r rr¹r¼rºrRr†ZTestCaserrarZSILENTrÈZTERSEZEFFUSIVErÇrØZ TALKATIVErÃZ CHATTERBOXZBORINGrrÏrËr—rÀrÆrÉrÜr r?r/rErHrJrZrWrsrwrˆrr>r“r–r—r¢r1r»r¾rr2r5r3r4r9r;r?Z IPV6_ENABLEDr@rCrZrertr‡rˆrŠr‹rrÿrr(rrr r6rDZ unittest.mockr6r7r“rNZtzinforMrurTr‹r„rŠrŽr”r˜r…r’r¡r½rçrør(r9rerirlrŽr˜r¢r¶r·ršr¸r¿Zrun_with_localerÈr]r<r<r<r=Úsb    mFö YT,J2)/  hbY@CÿM41( W#i `  '  W5BlW gnú ! #