a ze@s(dZddlZddlZddlZddlZddlZddlZddlZddlZddl 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 e4ydZ1Z2Z3Yn0z ddl5Z5Wne4yYn0Gd d d e!j6Z7Gd d d e7Z8Gddde7Z9dZ:dZ;dZdZ?dZ@dZAdZBdZCeDeCe:dZEe:de;dede?d e@d!eAd"eBd#eCd$i ZFGd%d&d&ejGZHGd'd(d(ejGZIGd)d*d*e7ZJGd+d,d,e7ZKGd-d.d.eLZMGd/d0d0ejNZOGd1d2d2eLZPGd3d4d4e7ZQGd5d6d6e(jRZSGd7d8d8eLZTGd9d:d:eTe&ZUGd;d<dd>eTe-ZWeXed?rNGd@dAdAeVZYGdBdCdCeWZZGdDdEdEe7Z[GdFdGdGe7Z\GdHdIdIej]Z^GdJdKdKe7Z_GdLdMdMe7Z`dNdOZae!beXed?dPGdQdRdRe`ZcGdSdTdTe7Zde!beXed?dPGdUdVdVedZeGdWdXdXe7Zfe!beXed?dPGdYdZdZefZge!bejhd[Gd\d]d]efZiGd^d_d_e7ZjGd`dadae7ZkGdbdcdce7ZlGdddedee7ZmddfdgZnGdhdidiZodjdkZpGdldmdmejNZqGdndodoe7ZrGdpdqdqe7ZsGdrdsdse7ZtGdtduduejuZvGdvdwdwe7ZwGdxdydye7ZxeXejydzrRddlzZzdd{l{m|Z|Gd|d}d}e7Z}e~dZGd~ddejZeZGddde!j6ZGdddejZGddde!j6ZGddde7ZGddde7ZGdddZGdddejZGddde7ZGddde7ZGddde7ZGddde!j6ZGddde!j6ZGddde7ZGddde7ZGdddeZGdddeZGdddeZddZddddddedddffD](\ZZeefddZeedeeqe!be1dGddde7ZGddde!j6ZddZedkr$e!dS)zoTest harness for the logging module. Run all tests. Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. N)assert_python_okassert_python_failure)support) socket_helper) TestHandler) HTTPServerBaseHTTPRequestHandler)urlparseparse_qs)ThreadingUDPServerDatagramRequestHandlerThreadingTCPServerStreamRequestHandlerc@s>eZdZdZdZdZdZddZddZdd d Z d d Z d S)BaseTestzBase class for logging tests.z&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$rcCst|_tjj}tzvtj |_ tj dd|_ | |_ }tj |_tj |_i|_}|D]}t||dd||<qpWtn t0td|_td|_td|_|j|_t|_|jtjt|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.Ndisabledu«×»uĿÖGzUnexpected handlers: %s)*rZthreading_setup_threading_keylogging getLoggermanager loggerDict _acquireLock _handlerscopysaved_handlers _handlerListsaved_handler_list saved_loggers _nameToLevelsaved_name_to_level _levelToNamesaved_level_to_name logger_statesgetattr _releaseLocklogger1logger2 root_loggergetEffectiveLeveloriginal_logging_levelioStringIOstreamsetLevelDEBUG StreamHandler root_hdlr Formatter log_formatroot_formatter setFormatter hasHandlershandlersAssertionError addHandler assertTrue)selfZ logger_dictrr"nameZhlistr<E/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_logging.pysetUpOsB                zBaseTest.setUpcCs8|j|j|j|jjrB|jjd}|j||q|j|jt ztj tj |j tj tj |jtj tj |j|jtjdd<tj}d|_|j}| | |j|j}|jD] }||dur|||j|_qWtn t0|tj|jdS)zJRemove our logging stream, and restore the original logging level.rN) r,closer' removeHandlerr0r6r-r)rrr clearupdater!rrrrrrrrdisablerrr"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)zMatch 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,recompileexpected_log_patgetvalue splitlines assertEquallenzipsearchfailtuplegroupsread) r:Zexpected_valuesr,patZ actual_linesactualexpectedmatchsr<r<r=assert_log_liness   zBaseTest.assert_log_linescCs|jd7_d|jS)zMGenerate a message consisting solely of an auto-incrementing integer.z%d) message_numr:r<r<r= next_messageszBaseTest.next_message)NN) __name__ __module__ __qualname____doc__r2rHrZr>rErXr\r<r<r<r=rGs*" rc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS)BuiltinLevelsTestz*Test builtin levels and their inheritance.cCs"|j}td}|tjttdi}|tjtd}|tj|tj || ||tj || || || ||tj || || || || || || || || ||gddS)NERRINFDEB) )rbCRITICAL1)rbERROR2)rcre3)rcrg4)rcWARNING5)rcINFO6)rdre7)rdrg8)rdrk9)rdrm10)rdr.11)r\rrr-rg LoggerAdapterrmr.logreerrorwarninginfodebugrX)r:mrbrcrdr<r<r= test_flats.                 zBuiltinLevelsTest.test_flatcCs|j}td}|tjtd}|tj|tj|||| || || || ddgdS)NrcINF.ERR)r|rerf)r|rgrh r\rrr-rmrgrurervrwrxryrX)r:rzrcINF_ERRr<r<r=test_nested_explicits        z&BuiltinLevelsTest.test_nested_explicitcCs|j}td}|tjtd}|tjtd}td}td}|tj|||| || ||tj|||| || || || || gddS)Nrcr| INF.UNDEF INF.ERR.UNDEFUNDEF))rrerf)rrgrh)rrkri)rrmrj)rrerl)rrgrnr})r:rzrcr~Z INF_UNDEFZ INF_ERR_UNDEFrr<r<r=test_nested_inheriteds&               z'BuiltinLevelsTest.test_nested_inheritedcCs|j}td}td}td}|tj|tj||||tj|||||||| gddS)NrcINF.BADPARENT.UNDEF INF.BADPARENT))rrerf)rrmrh)rreri)rrmrj) r\rrr-rmruFATALrxryrX)r:rzrcZ GRANDCHILDZCHILDr<r<r=test_nested_with_virtual_parent s        z1BuiltinLevelsTest.test_nested_with_virtual_parentcCs,|tdtj|ttjddS)z&See issue #22386 for more information.rmN)rKr getLevelNamermr[r<r<r=test_regression_22386:sz'BuiltinLevelsTest.test_regression_22386cCstd}||tjdS)Nr)rrrKr)r:fatalr<r<r=test_issue27935?s z!BuiltinLevelsTest.test_issue27935cCs`ttjd|tjtjd|ttjd|ttjd|tdtjdS)z&See issue #29220 for more information.rrmNOTSETN)r addLevelNamerm addCleanuprKrrr[r<r<r=test_regression_29220Cs z'BuiltinLevelsTest.test_regression_29220N) r]r^r_r`r{rrrrrrr<r<r<r=ras/#rac@s(eZdZdZddZddZddZdS) BasicFilterTestzTest the bundled Filter class.c Cstd}|jjd}z||td}td}td}td}|||||||||ddgW| |n | |0dS)N spam.eggsrspamspam.eggs.fishspam.bakedbeansrrmrhrrmri) rFilterr'r6 addFilterrrxr\rX removeFilter)r:Zfilter_handlerr spam_eggsspam_eggs_fishspam_bakedbeansr<r<r= test_filterOs"       zBasicFilterTest.test_filterc Csdd}|jjd}z||td}td}td}td}|||||||||dd gW||n ||0dS) NcSs&|jd}d|dd}|dkS)N.r)r;splitjoin)recordpartsprefixr<r<r= filterfuncks z8BasicFilterTest.test_callable_filter..filterfuncrrrrrrr) r'r6rrrrxr\rXr)r:rrrrrrr<r<r=test_callable_filtergs"      z$BasicFilterTest.test_callable_filtercCs*t}tddi}|||dS)Nr;r)rr makeLogRecordr9filter)r:frr<r<r=test_empty_filtersz!BasicFilterTest.test_empty_filterN)r]r^r_r`rrrr<r<r<r=rKsrxwvutsrqporYSilentTaciturnTerseEffusiveSociableVerbose TalkativeZ Garrulous ChatterboxBoringc@seZdZdZddZdS)GarrulousFilterz)A filter which blocks garrulous messages.cCs |jtkSN)levelno GARRULOUSr:rr<r<r=rszGarrulousFilter.filterNr]r^r_r`rr<r<r<r=rsrc@seZdZdZddZdS)VerySpecificFilterz5A filter which blocks sociable and taciturn messages.cCs|jttfvSr)rSOCIABLETACITURNrr<r<r=rszVerySpecificFilter.filterNrr<r<r<r=rsrc@s<eZdZdZdZddZddZddZd d Zd d Z d S)CustomLevelsAndFiltersTestz@Test various filtering possibilities with custom logging levels.^[\w.]+ -> (\w+): (\d+)$cCs,t|tD]\}}t||qdSr)rr>my_logging_levelsitemsrr)r:kvr<r<r=r>s z CustomLevelsAndFiltersTest.setUpcCstD]}|||qdSr) LEVEL_RANGErur\)r:loggerZlvlr<r<r=log_at_all_levelssz,CustomLevelsAndFiltersTest.log_at_all_levelscCs*|jt||j|gddS)N)rrlrrnrrorrprrqrrr)r'r-VERBOSErrXr[r<r<r=test_logger_filters  z-CustomLevelsAndFiltersTest.test_logger_filterc Cs`|jjdtz2||j|gdW|jjdtjn|jjdtj0dS)Nr)rrrrr)r'r6r-rrrXrrr[r<r<r=test_handler_filters  z.CustomLevelsAndFiltersTest.test_handler_filterc Cs|jjd}d}t}||zl||jgd}||t}|j|||j||gdW|r|j|||n|r|j|||0dS)Nr) )rrf)rrh)rrjrrrrrr))rrs)rZ12)rZ14)rZ15)rZ17)rZ18)rZ20)r'r6rrrrXrr)r:rZspecific_filterZgarrZ first_linesr<r<r=test_specific_filterss$          z0CustomLevelsAndFiltersTest.test_specific_filtersN) r]r^r_r`rHr>rrrrr<r<r<r=rsrc@sZeZdZddZddZddZeej dkdd d Z ee ed  d d dZ dS) HandlerTestcCsDt}d|_||jdd|_||jd|t|jddS)NgenericZanothergeneric)rHandlerr;rK assertRaisesNotImplementedErroremitr:rDr<r<r= test_names zHandlerTest.test_namec CstjdvrXdD]}t\}}t||s8t|tjj |dd}|r|j |j }}| |d| |dt ddi}||t||tj||||tj|n| |j d| |j d||rt|qtjdkr d }nd }z4tj|}| |j|j||j|WntyVYn0d D]@} | d kr|ttjjd d| ntjd d| }|q\tjd}t i}||||tjd}||||dS)Nlinuxdarwin)TFTdelaymsgZTestrz/var/run/syslogz/dev/log)GETPOSTPUTr localhostz/logrrY)sysplatformtempfilemkstemposr?unlinkrr6WatchedFileHandlerdevinorKrhandle assertFalsepathexistsr9 SysLogHandlerZfacilityZLOG_USERZ unixsocketOSErrorr ValueError HTTPHandlerZBufferingHandlerZ shouldFlush) r:ZexistingfdfnrDrrrZsocknamemethodr<r<r=test_builtin_handlers s\                    z!HandlerTest.test_builtin_handlerscCst\}}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. warDrN)rrrr?rpathlibPathr FileHandlerr6RotatingFileHandlerTimedRotatingFileHandlerrrrr9rr)r:rrZpfnZcasesclsargsrDr<r<r=test_path_objectsVs       zHandlerTest.test_path_objectsntz/WatchedFileHandler not appropriate for Windows.c sNfdd}d}d}d_d_dD]"}tdd\}}t|tj|||fd}d|_| t j j ||d }t d } || zt|D]^} td t d d i} zt_|| WqtytdjjfYq0qW||tj|rHt|q$||tj|rFt|0q$dS)Nc sTt|D]F}zt|t_Wnty6Yn0tdtddqdS)NgMbp?r) rangerrtime deletion_timersleeprandomrandint)ZfnameZtries_r[r<r= remove_loopps   z*HandlerTest.test_race..remove_loopiFT.logztest_logging-3-targetr Trz'%(asctime)s: %(levelname)s: %(message)s{Gzt?rZtestingzDeleted at %s, opened at %s)Z handle_timerrrrr? threadingThreaddaemonstartrr6rr1r4rrrrr Exceptionprintrrrr) r:rZ del_countZ log_countrrrZremoverrDrrrr<r[r= test_racemsH           zHandlerTest.test_raceforkzTest requires os.fork().c s&Gdddtj}|ttjd||jjjd_ | ttjd| ttj dt d}| |tjttfdd}tj|d d }|t}|dkrz|d Wtdn td0n(|d |tj|dd dS)z>Ensure child logging locks are not held; bpo-6721 & bpo-36533.cs$eZdZfddZddZZS)zAHandlerTest.test_post_fork_child_no_deadlock.._OurHandlercs"ttjtddd|_dS)Nz /dev/nullZwtr,)super__init__rr/open sub_handlerr[ __class__r<r=r's zJHandlerTest.test_post_fork_child_no_deadlock.._OurHandler.__init__cSs6|jz|j|W|jn |j0dSr)r)acquirerreleaserr<r<r=rs zFHandlerTest.test_post_fork_child_no_deadlock.._OurHandler.emitr]r^r_r'r __classcell__r<r<r*r= _OurHandlers r0rz*because we need at least one for this testrY test_post_fork_child_no_deadlockcsVtz>zdWn 0Wtn t0dS)N?)rrr,setwaitr-r$r<Z+fork_happened__release_locks_and_end_threadZlocks_held__ready_to_forkZrefed_hr<r=lock_holder_thread_fns 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)rrrKrLrrr)r,r?r; assertGreater_at_fork_reinit_lock_weaksetrr8r-r.rEventrr r4rr$rx_exitr3rrZ wait_process)r:r0Z test_loggerr6Zlock_holder_threadpidr<r5r=r1s8      z,HandlerTest.test_post_fork_child_no_deadlockN) r]r^r_rrr unittestZskipIfrr;r#hasattrr1r<r<r<r=rs6 0rc@seZdZddZdS) BadStreamcCs tddS)Ndeliberate mistake) RuntimeErrorr:datar<r<r=writeszBadStream.writeN)r]r^r_rDr<r<r<r=r?sr?c@seZdZddZdS)TestStreamHandlercCs ||_dSr) error_recordrr<r<r= handleErrorszTestStreamHandler.handleErrorN)r]r^r_rGr<r<r<r=rEsrEc@seZdZejZdZdS)StreamWithIntNamerN)r]r^r_rrlevelr;r<r<r<r=rHsrHc@s$eZdZddZddZddZdS)StreamHandlerTestcCstt}ti}tj}z||||j|tt}t .}||d}| || Wdn1s|0Ydt_t *}||| d| Wdn1s0YW|t_n|t_0dS)Nz" RuntimeError: deliberate mistake Fr)rEr?rrraiseExceptionsrassertIsrFr/rcaptured_stderrassertInrIrK)r:rDrZ old_raisestderrrr<r<r=test_error_handlings       .  0z%StreamHandlerTest.test_error_handlingcCsVt}t}||}||tj||}|||||}||dS)z3 Test setting the handler's stream N) rr/r*r+ setStreamrLrrO assertIsNone)r:rDr,oldrTr<r<r=test_stream_setting s    z%StreamHandlerTest.test_stream_settingcCs tt}|t|ddS)Nz)rr/rHrKreprrr<r<r='test_can_represent_stream_with_int_names z9StreamHandlerTest.test_can_represent_stream_with_int_nameN)r]r^r_rPrTrVr<r<r<r=rJsrJc@s8eZdZdZddZddZddZdd 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|jd|_||_d|_d|_||_ dS)NT)mapZ decode_datarYF) smtpd SMTPServerr'socket getsocknameport_handler_thread_quit poll_interval)r:addrrrasockmapr<r<r=r'7szTestSMTPServer.__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:peermailfromrcpttosrCr<r<r=process_message@s zTestSMTPServer.process_messagecCs0tj|j|jfd|_}|d|dS)zG Start the server running on a separate daemon thread. rTNrr 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)rXcountN)r`asyncoreZloop_mapr:rar<r<r=riUszTestSMTPServer.serve_forevercCs4d|_t|jd|_|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     rWcs8eZdZdZddZddZfddZdd ZZS) 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:rrar<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|jtt||dS)z^ Run the server. Set the ready flag before entering the service loop. N)rtr3r&rsrirpr*r<r=ris zControlMixin.serve_forevercCs:||jdur$t|jd|_||jdS)zK Tell the server thread to stop, and wait for it to do so. N)shutdownr_rrq server_closertrAr[r<r<r=rrs   zControlMixin.stop) r]r^r_r`r'r rirrr/r<r<r*r=rsls  rsc@s"eZdZdZd ddZddZdS) 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<Gfdddtt||t|||||_dS)Ncs2eZdZdddZddZfddZZS) z=TestHTTPServer.__init__..DelegatingHTTPRequestHandlerNcSs|dr|jSt|dS)NZdo_) startswithprocess_requestAttributeError)r:r;defaultr<r<r= __getattr__s zITestHTTPServer.__init__..DelegatingHTTPRequestHandler.__getattr__cSs|j|dSrserverr^r[r<r<r=ryszMTestHTTPServer.__init__..DelegatingHTTPRequestHandler.process_requestcs rt|j|g|RdSr)r& log_message)r:formatr )DelegatingHTTPRequestHandlerr+rur<r=rszITestHTTPServer.__init__..DelegatingHTTPRequestHandler.log_message)N)r]r^r_r|ryrr/r<rrur*r=rs r)rrr'rssslctx)r:rbrrarurr<rr=r's zTestHTTPServer.__init__c Cshz(|j\}}|jr&|jj|dd}Wn6ty^}ztjd|WYd}~n d}~00||fS)NT)Z server_sidezGot an error: %s )r[acceptrZ wrap_socketrrrOrD)r:sockrber<r<r= get_requestszTestHTTPServer.get_request)r2FN)r]r^r_r`r'rr<r<r<r=rws   rwcs.eZdZdZdZdddZfddZZS) 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. Tr2cCs2Gdddt}t||||t|||dS)Nc@seZdZddZdS)z;TestTCPServer.__init__..DelegatingTCPRequestHandlercSs|j|dSrr}r[r<r<r=rszBTestTCPServer.__init__..DelegatingTCPRequestHandler.handleN)r]r^r_rr<r<r<r=DelegatingTCPRequestHandlersr)rr r'rs)r:rbrrabind_and_activaterr<r<r=r's  zTestTCPServer.__init__cs"tt||jd|_dSNrY)r&r server_bindr[r\r]r[r*r<r=rszTestTCPServer.server_bind)r2T)r]r^r_r`Zallow_reuse_addressr'rr/r<r<r*r=rs  rcs6eZdZdZd ddZfddZfdd ZZS) 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<Gfdddtt|||t|||d|_dS)Ncs&eZdZddZfddZZS)z;TestUDPServer.__init__..DelegatingUDPRequestHandlercSs|j|dSrr}r[r<r<r=rszBTestUDPServer.__init__..DelegatingUDPRequestHandler.handlecsB|j}|r>zt|Wnty<|jjs8Yn0dSr)ZwfilerIr&finishrr~_closedrB)DelegatingUDPRequestHandlerr+r<r=rs  zBTestUDPServer.__init__..DelegatingUDPRequestHandler.finish)r]r^r_rrr/r<rr*r=rsrF)r r r'rsr)r:rbrrarr<rr=r'szTestUDPServer.__init__cs"tt||jd|_dSr)r&rrr[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'rrvr/r<r<r*r=rs   rAF_UNIXc@seZdZejZdS)TestUnixStreamServerNr]r^r_r[raddress_familyr<r<r<r=rsrc@seZdZejZdS)TestUnixDatagramServerNrr<r<r<r=rsrc@s"eZdZejZddZddZdS)SMTPHandlerTestc Cs i}ttjdf|jd|}|tj|jf}tjj|ddd|j d}| |j dgg|_ t ddi}t|_|||j|j |||j| t|j d |j d\}}}} | |d| |dg|d | || d |dS) NrMbP?meZyouZLog)timeoutru Hello ✓rYz Subject: Log u Hello ✓)rWrZHOSTrgr r]rr6Z SMTPHandlerTIMEOUTrKZtoaddrsmessagesrrr:handledrr4rrr9is_setrLrNendswithr?) r:rcr~rbrDrrdrerfrCr<r<r= test_basic"s0     zSMTPHandlerTest.test_basiccGs|j||jdSr)rappendrr3)r:r r<r<r=rg:s zSMTPHandlerTest.process_messageN)r]r^r_rZ LONG_TIMEOUTrrrgr<r<r<r=rsrc@s<eZdZdZdZddZddZddZd d Zd d Z d S)MemoryHandlerTestzTests for the MemoryHandler.rcCsFt|tjdtj|j|_td|_ d|j _ |j |jdS)N Zmemr) rr>rr6 MemoryHandlerrkr0mem_hdlrr mem_logger propagater8r[r<r<r=r>Es   zMemoryHandlerTest.setUpcCs|jt|dSr)rr?rrEr[r<r<r=rEMs zMemoryHandlerTest.tearDowncCs|j||g|j||g|j|gd}||dD]b}tdD]}|j|qf|||j||ddt||dD}||qZ|j|||dS)N)r.rfrmrh)rkri)r cSsg|]}dt|fqS)r.)str).0ir<r<r= gz0MemoryHandlerTest.test_flush..r)rryr\rXrxrwr)r:linesnrr<r<r= test_flushQs       zMemoryHandlerTest.test_flushcCs|j||g|j||g|j|j|jddg}||tj dtj |j d|_|j |j|j||||j||||j|j|j||dS)zO Test that the flush-on-close configuration works as expected. rrrFN)rryr\rXrxr@rr?rr6rrkr0r8)r:rr<r<r=test_flush_on_closems,        z%MemoryHandlerTest.test_flush_on_closec CsGddd}||j}zV|j|tdD]&}td|jd|jdq.W|jD]}t |q^n|jD]}t |qv0dS)Nc@s$eZdZddZddZddZdS)zZMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandlercSs||_g|_dSr)rthreads)r:rr<r<r=r'szcMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.__init__cSs|jddSr)r setTargetr[r<r<r= removeTargetszgMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.removeTargetcSs&tj|jd}|j||dS)N)r)rrrrrr )r:rthreadr<r<r=rs zaMemoryHandlerTest.test_race_between_set_target_and_flush..MockRaceConditionHandler.handleN)r]r^r_r'rrr<r<r<r=MockRaceConditionHandlersrrrz not flushedZflushed) rrrrrrrxrwrrrq)r:rrrrr<r<r=&test_race_between_set_target_and_flushs       z8MemoryHandlerTest.test_race_between_set_target_and_flushN) r]r^r_r`rHr>rErrrr<r<r<r=r>src@seZdZdZddZdS)ExceptionFormatterzA special exception formatter.cCsd|djS)Nz Got a [%s]r)r])r:eir<r<r=formatExceptionsz"ExceptionFormatter.formatExceptionN)r]r^r_r`rr<r<r<r=rsrc@seZdZdZejZdZdZdZdZ e ddZ e dd Z d ed Z e d d ZdZdZdZdZddZddZddZefddZddZddZddZd 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(tt|}tjj|fi|dSr)r*r+textwrapdedentrconfig fileConfig)r:confkwargsfiler<r<r= apply_configszConfigFileTest.apply_configcCsvtZ}||jt}|||||j dg|d| gWdn1sh0YdSNrgrhr% rcaptured_stdoutrconfig0rrrxr\rvrXr:outputrr<r<r=test_config0_oks  zConfigFileTest.test_config0_okcCst~}tt|j}t}| |t j |t }|||||jdg|d|gWdn1s0YdSr)rrr*r+rrr configparser ConfigParserZ read_filerrrrrxr\rvrX)r:rrZcprr<r<r=test_config0_using_cp_oks   z'ConfigFileTest.test_config0_using_cp_okcCsxt\}||td}|||||jddg|d|gWdn1sj0YdSNcompiler.parserrmrfrr% rrrrrrxr\rvrXr:rrrr<r<r=test_config1_oks   zConfigFileTest.test_config1_okcCs|t|j|jdSrrr!rconfig2r[r<r<r=test_config2_failuresz#ConfigFileTest.test_config2_failurecCs|t|j|jdSrrr!rconfig3r[r<r<r=test_config3_failuresz#ConfigFileTest.test_config3_failurec Cstr}||jt}z tWntyDtdYn0tj d| | d| gWdn1s0YdSNz just testingrz-ERROR:root:just testing Got a [RuntimeError] )rrrconfig4rrrA exceptionrstdoutseekrKrIrXrr<r<r=test_config4_oks      zConfigFileTest.test_config4_okcCs|j|jddSN)rrconfig5r[r<r<r=test_config5_okszConfigFileTest.test_config5_okcCs|j|jddSr)rconfig6r[r<r<r=test_config6_okszConfigFileTest.test_config6_okcCsJtv}||jtd}td}||||| ||j gd|d| gWdn1s0Yt}||j td}| |j ||||td}||||| ||j gd|d| gWdn1s<0YdSNrzcompiler-hyphenated)rr)rerir%compiler.lexer))rmrj)rgrl)rmrn)rgro)rrrconfig1arrrxr\rvcriticalrXconfig7rrr:rrZ hyphenatedr<r<r=test_config7_oks2     (      zConfigFileTest.test_config7_okcCsdd}|btdd\}}t|tjdkrB|dd}|jj|d}| || |Wdn1sx0Yt j j d }| |||dS) NcSs|t|dSrr?rremoveh1rr<r<r=cleanup)sz/ConfigFileTest.test_config8_ok..cleanuprtest_logging-X-r\z\\)rr)check_no_resource_warningrrrr?r;replaceconfig8rrrrootr6r)r:rrrrrr<r<r=test_config8_ok's     ( zConfigFileTest.test_config8_okcCsZ||jtd}||j||j||j|j|jdd||jdS)NZsome_pristine_loggerF)disable_existing_loggers)r disable_testrrrrr9r:rr<r<r=test_logger_disabling>s     z$ConfigFileTest.test_logger_disablingcCs*d}|||tjdjddS)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 rhand1)rrKrrr6r;)r:Z test_configr<r<r=test_config_set_handler_namesGs z,ConfigFileTest.test_config_set_handler_namesc Cstd}tjddd\}}zPt||dt|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.inirsuffixasciirYFrz5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)rdatefmtclass)versionr formatters)defaultsN)rrstriprrrrDencoder?rrrdictr)r:Zinirrr<r<r=!test_defaults_do_no_interpolation_s& z0ConfigFileTest.test_defaults_do_no_interpolationN)!r]r^r_r`rrrHrconfig1rrrrrrrrrrrrrrrrrrrrrrrrr<r<r<r=rs@    *& + rc@s@eZdZdZeZdZddZddZddZ d d Z d d Z d S)SocketHandlerTestzTest for SocketHandler objects.rrc Cst|d|_|_|_z$||j|jd|_}|Wn,t yl}z||_WYd}~dSd}~00|j t j j}t|jtr|d|j|_n||jd|_d|_|j|jj d|j|jtd|_dS)ztSet up a TCP server to receive log messages, and a SocketHandler pointing to that server's address and port.N{Gz?rrr)rr>r~ sock_hdlrserver_exception server_classaddress handle_socketr rrtr4rr6Z SocketHandler isinstanceserver_addressrPr] log_outputr'r@r8r Semaphorerr:r~rZhclsr<r<r=r>s&     zSocketHandlerTest.setUpc CsNz<|jr |j|j|j|jr0|jWt|n t|0dS)zShutdown the TCP server.N)rr'r@r?r~rrrrEr[r<r<r=rEs  zSocketHandlerTest.tearDowncCs|j}|d}t|dkrqtd|d}||}t||kr\|||t|}q8t|}t|}|j |j d7_ |j qdS)Nr>Lr ) connectionrecvrLstructunpackpickleloadsrrrrrr-)r:requestconnchunkslenobjrr<r<r=rs      zSocketHandlerTest.handle_socketcCsV|jr||jtd}|d|j|d|j||j ddS)NZtcpreggs spam eggs ) rskipTestrrrvrr,ryrKrrr<r<r= test_outputs      zSocketHandlerTest.test_outputcCs|jr||jd|j_|jz tdWntyN|jdYn0|j dt }| |jj |t |jj |d|j ddS)Ng@zDeliberate mistakez Never sentzNever sent, eitherrzNor this)rr.rZ retryStartr~rrrAr'rrvrr8Z retryTimer)r:nowr<r<r= test_noservers     zSocketHandlerTest.test_noserverN) r]r^r_r`rrrr>rErr/r1r<r<r<r=rs  rcCs*tjddd\}}t|t||S)Nrz.sockr)rrrr?r)rrr<r<r=_get_temp_domain_sockets  r2zUnix sockets requiredc@s.eZdZdZeedreZddZddZ dS)UnixSocketHandlerTestz)Test for SocketHandler with unix sockets.rcCst|_t|dSr)r2rrr>r[r<r<r=r>szUnixSocketHandlerTest.setUpcCst|t|jdSr)rrErrrr[r<r<r=rEs zUnixSocketHandlerTest.tearDownN) r]r^r_r`r>r[rrr>rEr<r<r<r=r3s  r3c@s8eZdZdZeZdZddZddZddZ d d Z d S) DatagramHandlerTestzTest for DatagramHandler.rc Cst|d|_|_|_z$||j|jd|_}|Wn,t yl}z||_WYd}~dSd}~00|j t j j}t|jtr|d|j|_n||jd|_d|_|j|jj d|j|jt|_dS)zvSet up a UDP server to receive log messages, and a DatagramHandler pointing to that server's address and port.Nrrrr)rr>r~rrrrhandle_datagramr rrtr4rr6ZDatagramHandlerrrrPr]rr'r@r8rr:rrr<r<r=r>s&     zDatagramHandlerTest.setUpc CsNz<|jr|j|jr0|j|j|jWt|n t|0dS)zShutdown the UDP server.N)r~rrrr'r@r?rrEr[r<r<r=rEs  zDatagramHandlerTest.tearDowncCsTtdd}|jt|d}t|}t|}|j|j d7_|j dS)Nrrr ) r#packpacketrLr%r&rrrrrr3)r:r'r*r7r+rr<r<r=r5)s    z#DatagramHandlerTest.handle_datagramcCs`|jr||jtd}|d|j|j|d|j||j ddS)NZudprr,r-) rr.rrrvrr4rArKrrr<r<r=r/1s       zDatagramHandlerTest.test_outputN r]r^r_r`rrrr>rEr5r/r<r<r<r=r4s r4c@s.eZdZdZeedreZddZddZ dS)UnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.rcCst|_t|dSr)r2rr4r>r[r<r<r=r>EszUnixDatagramHandlerTest.setUpcCst|t|jdSr)r4rErrrr[r<r<r=rEJs z UnixDatagramHandlerTest.tearDownN r]r^r_r`r>r[rrr>rEr<r<r<r=r9=s  r9c@s8eZdZdZeZdZddZddZddZ d d Z d S) SysLogHandlerTestz!Test for SysLogHandler using UDP.rc Cst|d|_|_|_z$||j|jd|_}|Wn,t yl}z||_WYd}~dSd}~00|j t j j}t|jtr||jd|jf|_n ||j|_d|_|j|jj d|j|jt|_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 rrtr4rr6rrrrPr]rr'r@r8rr:rrr<r<r=r>Us&      zSysLogHandlerTest.setUpc CsNz<|jr|j|jr0|j|j|jWt|n t|0dS)zShutdown the server.N)r~rrr<r'r@r?rrEr[r<r<r=rEos  zSysLogHandlerTest.tearDowncCs|j|_|jdSr)r7rrr3)r:r'r<r<r=r5zsz!SysLogHandlerTest.handle_datagramcCs|jr||jtd}|d|j||jd|j d|j _ |d|j||jd|j d|j _ |d|j||jddS)NZslhspäms <11>spämFs <11>spämuhäm-s<11>häm-späm) rr.rrrvrr4rKrrAr<Z append_nulidentrr<r<r=r/~s           zSysLogHandlerTest.test_outputNr8r<r<r<r=r;Ns r;c@s.eZdZdZeedreZddZddZ dS)UnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.rcCst|_t|dSr)r2rr;r>r[r<r<r=r>szUnixSysLogHandlerTest.setUpcCst|t|jdSr)r;rErrrr[r<r<r=rEs zUnixSysLogHandlerTest.tearDownNr:r<r<r<r=r?s  r?z$IPv6 support required for this test.cs4eZdZdZeZdZfddZfddZZ S)IPv6SysLogHandlerTestz&Test for SysLogHandler with IPv6 host.)z::1rcstj|j_tt|dSr)r[AF_INET6rrr&r@r>r[r*r<r=r>s zIPv6SysLogHandlerTest.setUpcstj|j_tt|dSr)r[AF_INETrrr&r@rEr[r*r<r=rEs zIPv6SysLogHandlerTest.tearDown) r]r^r_r`rrrr>rEr/r<r<r*r=r@s  r@c@s(eZdZdZddZddZddZdS) 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)NrzContent-Length) commandr rlog_dataintZheadersZrfilerR post_dataZ send_responseZ end_headersrr3)r:r'Zrlenr<r<r=handle_requests    zHTTPHandlerTest.handle_requestc Cstd}|j}||jjddD]}d}|rz ddl}WntyVd}Yq0tj t }tj |d}| |j }|||j|d} nd}d} t||jd|d|_} | | jd | j} |o|} tjj| d | | d d |_d|_||jd D]} | |j_|jd}|||j||jjd ||j | | dkrlt!|jj"}nt!|j#$d}||ddg||ddg||d|gq|j%|j|j|j&q&dS)Nhttprrrz keycert.pem)Zcafiler)rz localhost:%dz/frob)foobar)securecontextZ credentials)rrr=rutf-8r;funcNamer/r)'rrr'r@r6ssl ImportErrorrrdirname__file__rZ SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextrwrIr~r rtr4Z server_portrZh_hdlrrFr8rrrArvrKrEr queryrHdecoderrr?)r:rr'rMrbrQrhereZlocalhost_certrNr~hostZ secure_clientrrdr<r<r=r/s`                  zHTTPHandlerTest.test_outputN)r]r^r_r`r>rIr/r<r<r<r=rCs rCc@s0eZdZdZddZddZddZdd 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)idrUweakrefrefr[)r:r r+keyr<r<r=_watch_for_survival szMemoryTest._watch_for_survivalcCs\tg}|jD] \\}}}|dur||q|rX|dt|d|fdS)z;Assert that all objects watched for survival have survived.Nz;%d objects should have survived but have been destroyed: %sz, )gcZcollectr[rrrOrLr)r:ZdeadZid_repr_r^r<r<r=_assertTruesurvivals  zMemoryTest._assertTruesurvivalcCs|jtjtd}|||tj|j|||| dg~| td}||| ddgdS)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@seZdZddZddZdS) EncodingTestc Cstd}tdd\}}t|d}ztj|dd}||z ||W| ||n| ||0t |dd}z | | |W|n |0Wtj|rt|ntj|rt|0dS)Ntestrztest_logging-1-ufoo€rOencoding)rrrrrr?rr8rwr@r(rKrRrstriprisfiler)r:rurrrCrrr<r<r=test_encoding_plain_file5s*          z%EncodingTest.test_encoding_plain_filec Cstd}d}td}d|_t}||d}t|}||z | |W| || n| || 0| }| |ddS)Nrfuдо свиданияcp1251stricts )rrcodecs getwriterrhr*BytesIOr/r8rwr@r?rIrK)r:rumessageZ writer_classr,writerrrWr<r<r=test_encoding_cyrillic_unicodeOs          z+EncodingTest.test_encoding_cyrillic_unicodeN)r]r^r_rkrsr<r<r<r=re4srec@seZdZddZddZdS) WarningsTestc Csttd|tjdtjdtdt}t |}t d}| |t d| ||}|||ddt}td td d |d |}|||d Wdn1s0YdS)NTFalways)category py.warningszI'm warning you...z UserWarning: I'm warning you... rExplicitdummy.py*z Dummy linez0dummy.py:42: UserWarning: Explicit Dummy line )warningscatch_warningsrcaptureWarningsrfilterwarnings UserWarningr*r+r/rr8warnr@rIr?r8find showwarningrK)r:r,rDrrWZa_filer<r<r= test_warningsgs,        zWarningsTest.test_warningscCstvtd|tjdtd}||jgtdt dd|t |jd| |jdtj Wdn1s0YdS) NTFrwrxryrzrYr) r{r|rr}rrrKr6rrrLassertIsInstance NullHandlerrr<r<r=test_warnings_no_handlerss   z&WarningsTest.test_warnings_no_handlersN)r]r^r_rrr<r<r<r=rtesrtcCs t||Sr)rr1)rrr<r<r= formatFuncsrc@seZdZdddZdS)myCustomFormatterNcCsdSrr<)r:fmtrr<r<r=r'szmyCustomFormatter.__init__)N)r]r^r_r'r<r<r<r=rsrcCstSr)rr/r<r<r<r= handlerFuncsrc@s eZdZdS) CustomHandlerNr]r^r_r<r<r<r=rsrc @seZdZdZejZdZddddiidddd d d id dgd dZddddiidddd d d idddgd idd idZddddiidddd d d idddiid dgd dZ ddddiidddd dd idddgd idd idZ ddddiiddddd d idddgd idd idZ ddddiidddd d d idddgd iddidZ ddddiidddd d d idddgd idd idZ ddedddidddd d d id dgd dZdeddedddedddddd d d deidd dgd dZddddiideddd d d idddgd idd idZddddiideddd d dd idddgd idd idZddddiidddd d d id!ddgd idd idZdd"dddiidddd d d iddgd id#dd id$Zdd%dddiidddd d d iddgd id#dd id$Zddddiidddd d d idd dgd idd idZdd%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 id0Zd1dddiidddd d d id-dd.idddgd idd id/Zddddiidddd d d2d3d4d5id dgd dZdd6d7d8d9iddd6d:d;dd?d@ddAgdBdCidDZ ddeddd"dEidddd d d idFddgdBdCidDZ!ddeddd"dGidddd d d idFddgdBdCidDZ"ddedHdd"dGidddd d d idFddgdBdCidDZ#ddedd"dEidddd d d idFddgdBdCidDZ$dIdJZ%dKdLZ&efdMdNZ'dOdPZ(dQdRZ)dSdTZ*dUdVZ+dWdXZ,dYdZZ-d[d\Z.d]d^Z/d_d`Z0dadbZ1dcddZ2dedfZ3dgdhZ4didjZ5dkdlZ6dmdnZ7dodpZ8dqdrZ9ddtduZ:dvdwZ;dxdyZd~dZ?ddZ@ddZAddZBddZCddZDddZEddZFdsS)ConfigDictTestz)Reading logging config from a dictionary.rrYform1rz%(levelname)s ++ %(message)srzlogging.StreamHandlerrzext://sys.stdout)r  formatterrIr,rkrIr6)r r r6rrr.rI)r r r6loggersrzext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)()rz .formatFunc)rZform2Zform3r)rZhand2z.CustomHandlerzinvalid parameter name)r rrIr,rqrF)compilerr)r rr r6rrTrm)r Z incrementalr6rZfilt1r;)r rrIr,filters)rIr)r r rr6rrzcfg://true_formatterszcfg://handler_configs[hand1])r true_formattershandler_configsr r6rr)rrr r6rrrrL! )rK terminator)r rrIr,rmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)s$)rstyle)r rIrzlogging.handlers.MemoryHandler fileGlobal)r ZcapacityrrrI)r bufferGlobalmymodulertrue)rIr6r)r r r6r)rrvalidatemy_test_logger_custom_formatter)r rrz.myCustomFormattercCstj|dSr)rrZ dictConfig)r:rr<r<r=r szConfigDictTest.apply_configcCsvtZ}||jt}|||||j dg|d| gWdn1sh0YdSrrrr<r<r=r s  zConfigDictTest.test_config0_okcCsxt\}||td}|||||jddg|d|gWdn1sj0YdSrrrr<r<r=r s   zConfigDictTest.test_config1_okcCs|t|j|jdSrrr[r<r<r=r sz#ConfigDictTest.test_config2_failurecCs|t|j|jdSr)rr!rconfig2ar[r<r<r=test_config2a_failure sz$ConfigDictTest.test_config2a_failurecCs|t|j|jdSr)rr!rconfig2br[r<r<r=test_config2b_failure sz$ConfigDictTest.test_config2b_failurecCs|t|j|jdSrrr[r<r<r=r sz#ConfigDictTest.test_config3_failurec Cstj}||jz tWnty<tdYn0tj d| | d| gWdn1sx0YdSr) rrrrrArrrrrrKrIrXr:rr<r<r=r s      zConfigDictTest.test_config4_okc Cstj}||jz tWnty<tdYn0tj d| | d| gWdn1sx0YdSr) rrrconfig4arArrrrrrKrIrXrr<r<r=test_config4a_ok s      zConfigDictTest.test_config4a_okcCs|j|jddSrrr[r<r<r=r szConfigDictTest.test_config5_okcCs|t|j|jdSr)rr!rrr[r<r<r=test_config6_failure sz#ConfigDictTest.test_config6_failurecCst^}||jtd}|||||j ddg|d| gWdn1sl0Ytt}||j td}| |j td}|||||j ddg|d| gWdn1s0YdS)Nrrrr%rrmrirgrj) rrrrrrrxr\rvrXrr9rrr<r<r=r s4   (     zConfigDictTest.test_config7_okcCs$t^}||jtd}|||||j ddg|d| gWdn1sl0Yt}||j td}| |j ||||td}|||||j gd|d| gWdn1s0YdS)Nrrrr%r)rrrmrlrgrn) rrrrrrrxr\rvrXrrrrr<r<r=test_config_8_ok s2   (      zConfigDictTest.test_config_8_okcCsJtv}||jtd}td}||||| ||j gd|d| gWdn1s0Yt}||j td}| |j ||||td}||||| ||j gd|d| gWdn1s<0YdSr)rrrrrrrxr\rvrrXconfig8arrrr<r<r=test_config_8a_ok s2     (      z ConfigDictTest.test_config_8a_okcCst}||jtd}|||jg|d||j |||jg|d||j |||jdg|dWdn1s0YdS)Nrr%r) rrrconfig9rrrxr\rXconfig9aconfig9brr<r<r=test_config_9_ok> s     zConfigDictTest.test_config_9_okcCst}||jtd}||td}||td}||td}|||j ddg|dWdn1s0YdSNrrrzcompiler.parser.codegen)rkrfrr%) rrrconfig10rrrwr\rvrXrr<r<r=test_config_10_okP s       z ConfigDictTest.test_config_10_okcCs||jdSr)rconfig11r[r<r<r=test_config11_okc szConfigDictTest.test_config11_okcCs|t|j|jdSr)rr!rconfig12r[r<r<r=test_config12_failuref sz$ConfigDictTest.test_config12_failurecCs|t|j|jdSr)rr!rconfig13r[r<r<r=test_config13_failurei sz$ConfigDictTest.test_config13_failurecCs|t`}||jtjd}||jd||jdt d| | dWdn1sn0YdS)NrrLrZ Exclamationz Exclamation! ) rrrconfig14rrrKrKrrwr9rIr)r:rrDr<r<r=test_config14_okl s    zConfigDictTest.test_config14_okcCsdd}|Ztdd\}}t|ddd|did dgid }||||Wdn1sp0Ytjjd }| |||dS) NcSs|t|dSrrrr<r<r=rw sz0ConfigDictTest.test_config15_ok..cleanuprrrYrzlogging.FileHandler)r filenamer6r r6rr) rrrrr?rrrr6r)r:rrrrrr<r<r=test_config15_oku s"   ( zConfigDictTest.test_config15_okNc Cs|d}tjd|}||j|j}|jzt t j t j }| d| d|ftdt|}||}d}t|} | dkr|||d} || 7}| | 8} q|W|jdtjt|n"|jdtjt|0dS)NrOrg@rr)rrrlistenr rtr4r]rAr[rB SOCK_STREAM settimeoutconnectr#r6rLsendr?Z stopListeningrrq) r:textZverifyrlr]rr*rWZ sentsofarleftsentr<r<r=setup_via_listener s2          z!ConfigDictTest.setup_via_listenercCst}|t|jtd}|| td}|| td}|| td}| | |j ddg|dWdn1s0YdSr) rrrjsondumpsrrrrwr\rvrXrr<r<r=test_listen_config_10_ok s      z'ConfigDictTest.test_listen_config_10_okcCstd}|ttjtd}| | | | |j ddg|d| gWdn1sr0YdSr) rrrrrrrrrrxr\rvrXrr<r<r=test_listen_config_1_ok s  z&ConfigDictTest.test_listen_config_1_okcCsdd}dd}td}ttj}t8}|||| | | | Wdn1sl0Y|j g|d|j ddgd d t@}||td}| | | | Wdn1s0Y|j d d g|d|j ddgd d tL}||ddd |td}| | | | Wdn1sn0Y|j ddg|d|j ddgd d dS)NcSsdSrr<stuffr<r<r= verify_fail sz6ConfigDictTest.test_listen_verify..verify_failcSs|dddS)Nrr<rr<r<r=verify_reverse sz9ConfigDictTest.test_listen_verify..verify_reverserr%rrr)rSrrrrr) rrrrrrrrrrxr\rvrX)r:rrrZto_sendrr<r<r=test_listen_verify sb    ,   ,  .z!ConfigDictTest.test_listen_verifycCs|t|j|jdSr)rrr out_of_orderr[r<r<r=test_out_of_order sz ConfigDictTest.test_out_of_ordercCs\t|j}d|ddd<||tdjd}||jtj ||j j tj dS)Nz-${asctime} (${name}) ${levelname}: ${message}r rrrr) rdeepcopyrrrrr6rrrr_styleStringTemplateStyler:rrr<r<r=#test_out_of_order_with_dollar_style s   z2ConfigDictTest.test_out_of_order_with_dollar_stylecCs.||jtdjd}||jtdSNrr)rcustom_formatter_class_validaterrr6rrrr:rr<r<r=)test_custom_formatter_class_with_validate s z8ConfigDictTest.test_custom_formatter_class_with_validatecCs.||jtdjd}||jtdSr)r custom_formatter_class_validate2rrr6rrrrr<r<r=*test_custom_formatter_class_with_validate2 s z9ConfigDictTest.test_custom_formatter_class_with_validate2cCsF|j}d|ddd<||tdjd}||jtdS)Nrr rrrr) rrrrrr6rrrrr<r<r=9test_custom_formatter_class_with_validate2_with_wrong_fmt$ s   zHConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmtcCs|t|j|jdSr)rrr custom_formatter_class_validate3r[r<r<r=*test_custom_formatter_class_with_validate3- sz9ConfigDictTest.test_custom_formatter_class_with_validate3cCs|t|j|jdSr)rrrcustom_formatter_with_functionr[r<r<r=,test_custom_formatter_function_with_validate0 sz;ConfigDictTest.test_custom_formatter_function_with_validatecCsdgdddddddd gd ggd d }tj|}||d d||dd||dd||dd ||dd||dd|d}||dgd|t|jd|t|jd|t|jddS)N)rYr)rbcrr)rYr)g)rDrjrlrzr)oz cfg://alistp)ZatupleZalistZadictZnest1Znest2Znest3zcfg://atuple[1]rzcfg://alist[1]rzcfg://nest1[1][0]rDzcfg://nest2[1][1]z cfg://adict.dzcfg://adict[f]z cfg://nest3rYz cfg://nosuchzcfg://!zcfg://adict[2]) rrZBaseConfiguratorrKconvertpoprKeyErrorr)r:rYZbcrr<r<r=test_baseconfig3 s&   zConfigDictTest.test_baseconfigcsddlmGfdddtj}dddg}|dd gd }d d ||d idd gdd}t$}||tdWdn1s0Y|| ddS)Nr namedtuplecs*eZdZfddZfddZZS)z1ConfigDictTest.test_namedtuple..MyHandlercstj|i|||_dSr)r&r'resource)r:rr r)r+rr<r=r'N sz:ConfigDictTest.test_namedtuple..MyHandler.__init__cs$|jd|jj7_t|SN )rrtyper&rrr*r<r=rR sz6ConfigDictTest.test_namedtuple..MyHandler.emitr.r<rr*r= MyHandlerM srResourcerlabelsZmy_typer)rrrYZ myhandler)rrrmrrzsome logzsome log my_type ) collectionsrrr/rrMrrxrKrI)r:rrrrrOr<rr=test_namedtupleI s      (zConfigDictTest.test_namedtuple)N)Gr]r^r_r`rrrHrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr<r<r<r=rs         #         #!  !     !+  >  rc@seZdZddZddZdS) ManagerTestcsngGfdddtj}td}|t|jt|||d}|dtd| dgdS)NcseZdZdfdd ZdS)z6ManagerTest.test_manager_loggerclass..MyLoggerNcs|dSrr)r:rIrr exc_infoextraZloggedr<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) rLoggerManagerr TypeErrorsetLoggerClassrGrrwrK)r:rmanrr<rr=test_manager_loggerclassi s     z$ManagerTest.test_manager_loggerclasscCs,td}t}||||j|dSr)rrobjectsetLogRecordFactoryrKlogRecordFactory)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=rh src@seZdZddZdS)ChildLoggerTestcCst}td}td}|d}|d}||td||td|d}|d}|d}||td||td|||dS) Nabczdef.ghiZxyzzuvw.xyzdefZghiabc.defz abc.def.ghi)rrgetChildrL)r:rl1l2c1c2Zc3r<r<r=test_child_loggers s       z"ChildLoggerTest.test_child_loggersN)r]r^r_rr<r<r<r=r src@s eZdZdS)DerivedLogRecordNrr<r<r<r=r src@s$eZdZddZddZddZdS)LogRecordFactoryTestcCsBGdddtj}t||t|_|j|jt|_ dS)Nc@seZdZddZddZdS)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)rr r)r:rrlrr<r<r=r s z9LogRecordFactoryTest.setUp..CheckingFilter.filterN)r]r^r_r'rr<r<r<r=CheckingFilter sr) rrrr>rrr'rgetLogRecordFactory orig_factory)r:rr<r<r=r> s   zLogRecordFactoryTest.setUpcCs(|j|jt|t|jdSr)r'rrrrErr rr[r<r<r=rE s zLogRecordFactoryTest.tearDowncCs@|t|jj|tt|j|| dgdS)N)rrgrh) rrr'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@seZdZdZddZddZddZdd Ze e e j d d d d Z e e e j d d ddZe e e j d d ddZdS)QueueHandlerTestrcCs`t|td|_tj|j|_d|_t d|_ d|j _ |j tj |j |jdS)NrZqueF)rr>queueQueuerr6 QueueHandlerque_hdlrr;r que_loggerrr-rkr8r[r<r<r=r> s   zQueueHandlerTest.setUpcCs|jt|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|dfdSr)r%ryr\rr!Empty get_nowaitrxrwr9rr LogRecordrKr;rr )r:rrCr<r<r=test_queue_handler s  z#QueueHandlerTest.test_queue_handlercCsx|}ttj}d}|j|j||d}t|j}|j ||j ||j }|||j|||jdS)Nz {name} -> {levelname}: {message})r; levelnamerq)r\rrrkrr;r1r2r$r4r%rwr!r'rKrrq)r:rr*Zlog_format_strZ formatted_msgrZ log_recordr<r<r=test_formatting s     z QueueHandlerTest.test_formatting QueueListenerz5logging.handlers.QueueListener required for this testcCstt}tj|j|}|z<|j | |j | |j | W| n | 0||jtjdd||jtjdd||jtjdd|tt}|tjtjj|j|dd}|z<|j | |j | |j | W| n | 0||jtjdd||jtjdd||jtjd d|dS) Nrf)rrqrhriT)Zrespect_handler_levelrjrlrn)rrZMatcherrr6r,r!r r%rwr\rvrrrr9matchesrkrgrer?r-r)r:rlistenerr<r<r=test_queue_listener s6    z$QueueHandlerTest.test_queue_listenerc Cstj|j|j}|z ddWn<tyb}z$|}|jj| |dWYd}~n d}~00| | |j dddS)NrYrrZ Traceback)rr6r,r!r0r ZeroDivisionErrorr%rr\rrrKr,rIr rm)r:r.rexcr<r<r=&test_queue_listener_with_StreamHandlers *z7QueueHandlerTest.test_queue_listener_with_StreamHandlercCsd|j|j|j|jtj|j |j}| |j d| | |jddS)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@sleZdZdZdZeddZee j j dddZ ee j j ddd Z ed d Zd d ZddZdS)QueueListenerTestz~ Tests based on patch submitted for issue #27930. Ensure that QueueListener handles all log messages. cCstd|}|tjtj|}||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_%sonetwoZthreeZfourZfiveN) rrr-r.r6r#r8r,r rxrrr@r?) log_queuer>rrr.r<r<r= setup_and_log+s          zQueueListenerTest.setup_and_logrcCsJt|jD]$}t}||d||fq ||jd|jddSN%s_%srz&correct number of handled log messages)rrepeatr!r"r<r\rK call_countr:Z mock_handlerr;r<r<r=#test_handle_called_with_queue_queueCs z5QueueListenerTest.test_handle_called_with_queue_queuecCsbtt|jD]4}t}||d||f|| q| |j d|jddSr=) 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_queuecCstt|jD]n}t}||d||ft| |}| | gt j jjgg}|||ddd|DqdS)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|tjr|jn|qSr<)rrr(r)rrzr<r<r=ruszJQueueListenerTest.test_no_messages_in_queue_after_stop..N)rrCrr?rDr"r<r\listrFr?rqrr6r, _sentinelrN)r:rr!rrUr<r<r=$test_no_messages_in_queue_after_stop`s z6QueueListenerTest.test_no_messages_in_queue_after_stopcCsZt}tj|}|||t| Wdn1sL0YdSr) r!r"rr6r,r rrrr 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 eZdZddZeZddZdS)UTCcCstSr)ZEROr:dtr<r<r= utcoffsetsz UTC.utcoffsetcCsdS)NrMr<rOr<r<r=tznamesz UTC.tznameN)r]r^r_rQdstrRr<r<r<r=rMsrMc@s^eZdZddZdddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dS) FormatterTestc Cs0dtjtjddddddddd|_i|_dS) Nzformatter.testrtoz dummy.extrzzMessage with %d %s)rZ placeholders)r;rIpathnamelinenorfuncrr )rr.rrrcommonvariantsr[r<r<r=r>s zFormatterTest.setUpNcCs,t|j}|dur"||j|t|Sr)rrYrBrZrr)r:r;resultr<r<r= get_records zFormatterTest.get_recordc OsTz|j|g|Ri|Wn2|yN}z|||jWYd}~n d}~00dSr)rrKrq)r:rrqr rrr<r<r=assert_error_messagesz"FormatterTest.assert_error_messagecCs|}td}|||dtd}|t|j|||td}| |td}| |td}| |dS)Nz${%(message)s}z${Message with 2 placeholders}z %(random)s %(asctime)sz%(asctime)-15sz%(asctime)#15s r\rr1rKrrrrusesTimer9r:rrr<r<r= test_percents     zFormatterTest.test_percentcCs|}tjddd}|||dtjddd}|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_bracesszFormatterTest.test_bracescCs|}tjddd}|||dtjddd}|||dtjddd}|||dtjddd}|t|j|||tjd dd}| |tjd dd}| |tjddd}||tjd dd}| |dS) N ${message}rrdzMessage with 2 placeholdersz$messagez$$%${message}%$$rez ${random}z ${asctime}z$asctimez ${asctime}--r_rar<r<r= test_dollarss$zFormatterTest.test_dollarscCstd}||jdtd}||jdtd}||jdtd}||jdtjddd}||jdtjddd}||jdtjd dd}||jd tjd dd}||jd tjd dd}||jd tjd dd}||jd tjd dd}||jd tjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||jdtjddd}||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_formatdefault_time_formatr<r<r<r=NoMsecFormattersrrorrprqrrrrz21/04/1993 08:03:00)rr1r\rtrurrvrwrxryr{r|rKr})r:rrrPrr<r<r=test_default_msec_format_nonesz+FormatterTest.test_default_msec_format_none)N) r]r^r_r>r\r]rbrgrirlrnrrr<r<r<r=rTs rTc@seZdZddZddZdS)TestBufferingFormattercCs dt|S)Nz[(%d)rLr:recordsr<r<r= formatHeadersz#TestBufferingFormatter.formatHeadercCs dt|S)Nz(%d)]rrr<r<r= formatFootersz#TestBufferingFormatter.formatFooterN)r]r^r_rrr<r<r<r=rsrc@s$eZdZddZddZddZdS)BufferingFormatterTestcCs"tdditddig|_dS)Nrr9r:)rrrr[r<r<r=r>s  zBufferingFormatterTest.setUpcCs2t}|d|g|d||jdS)NrZonetwo)rBufferingFormatterrKrrrkr<r<r= test_defaultsz#BufferingFormatterTest.test_defaultcCsDt}|d||jtd}t|}|d||jdS)Nz[(2)onetwo(2)]z <%(message)s>z[(2)(2)])rrKrrrr1)r:rZlfr<r<r= test_customs  z"BufferingFormatterTest.test_customN)r]r^r_r>rrr<r<r<r=rsrc@seZdZddZdS) ExceptionTestcCs|j}t}||z tdWntjdddYn0||||jd}| |j d| |j d| |j d| |j d dS) Nr@ZfailedT stack_inforz#Traceback (most recent call last): z! RuntimeError: deliberate mistakeStack (most recent call last): z,logging.exception('failed', stack_info=True))r'RecordingHandlerr8rArrr@r?rr9exc_textrxrr)r:rrDr<r<r=r+s    zExceptionTest.test_formattingN)r]r^r_r+r<r<r<r=rsrc@seZdZddZdS)LastResortTestc Cs|j}||jtj}tj}zZtD}|d| | d| d| | dWdn1st0Ydt_t.}| dd}| | |Wdn1s0Yt*}| d| | dWdn1s0Yd|j _ dt_t*}| d| | dWdn1sV0YW||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 lastResortrKrrMryrKrIrwremittedNoHandlerWarningr8)r:rZold_lastresortZold_raise_exceptionsrOrr<r<r=test_last_resorts:    .  .  0  2  zLastResortTest.test_last_resortN)r]r^r_rr<r<r<r=rsrc@seZdZddZddZdS) FakeHandlerc Cs$dD]}t||||||qdS)N)r,flushr?r-)setattr record_call)r: identifiercalledrr<r<r=r'szFakeHandler.__init__csfdd}|S)NcsddS)Nz{} - {})rrr<rr method_namer<r=innersz&FakeHandler.record_call..innerr<)r:rrrrr<rr=rszFakeHandler.record_callN)r]r^r_r'rr<r<r<r=rsrcs$eZdZfddZddZZS)rcs tt|j|i|g|_dSr)r&rr'r)r:r rr*r<r=r'szRecordingHandler.__init__cCs|j|dS)z&Keep track of all the emitted records.N)rrrr<r<r=rszRecordingHandler.handle)r]r^r_r'rr/r<r<r*r=rs rcseZdZdZfddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!ZZS)" ShutdownTestz#Test suite for the shutdown method.cs.tt|g|_tj}|ttd|dS)NrK)r&rr>rrrKrr)r:Zraise_exceptionsr*r<r=r>szShutdownTest.setUpcsfdd}|S)Ncs dSrr<r<rvr<r=r sz'ShutdownTest.raise_error..innerr<)r:rvrr<rr= raise_error s zShutdownTest.raise_errorcCsbtd|j}td|j}td|j}ttjj|||g}tjt|dgd}|||jdS)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) rrrXrr]r^rurGrK)r:Zhandler0Zhandler1Zhandler2r6rUr<r<r=test_no_failures   zShutdownTest.test_no_failurecCsRtd|j}t||||tj|g}tjt|d| d|jddS)Nrrrr) rrrrrr]r^rurGrK)r:rrvrr6r<r<r=_test_with_failure_in_method!s  z)ShutdownTest._test_with_failure_in_methodcCs|dtdSNr,rrr[r<r<r=test_with_ioerror_in_acquire*sz)ShutdownTest.test_with_ioerror_in_acquirecCs|dtdSNrrr[r<r<r=test_with_ioerror_in_flush-sz'ShutdownTest.test_with_ioerror_in_flushcCs|dtdSNr?rr[r<r<r=test_with_ioerror_in_close0sz'ShutdownTest.test_with_ioerror_in_closecCs|dtdSrrrr[r<r<r=test_with_valueerror_in_acquire3sz,ShutdownTest.test_with_valueerror_in_acquirecCs|dtdSrrr[r<r<r=test_with_valueerror_in_flush6sz*ShutdownTest.test_with_valueerror_in_flushcCs|dtdSrrr[r<r<r=test_with_valueerror_in_close9sz*ShutdownTest.test_with_valueerror_in_closecCsdt_|dtdS)NFr,rrKr IndexErrorr[r<r<r=.test_with_other_error_in_acquire_without_raise<sz;ShutdownTest.test_with_other_error_in_acquire_without_raisecCsdt_|dtdS)NFrrr[r<r<r=,test_with_other_error_in_flush_without_raise@sz9ShutdownTest.test_with_other_error_in_flush_without_raisecCsdt_|dtdS)NFr?rr[r<r<r=,test_with_other_error_in_close_without_raiseDsz9ShutdownTest.test_with_other_error_in_close_without_raisecCsdt_|t|jdtdS)NTr,rrKrrrr[r<r<r=+test_with_other_error_in_acquire_with_raiseHs z8ShutdownTest.test_with_other_error_in_acquire_with_raisecCsdt_|t|jdtdS)NTrrr[r<r<r=)test_with_other_error_in_flush_with_raiseMs z6ShutdownTest.test_with_other_error_in_flush_with_raisecCsdt_|t|jdtdS)NTr?rr[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>rrrrrrrrrrrrrrrr/r<r<r*r=rs"  rc@sreZdZdZddZdddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZdS)ModuleLevelMiscTestz)Test suite for some module level methods.cCstjjj}||d|tj|td|tjjjd|ttjdGddd}|ttj|tdt|tjjjtj dS)NrSZ doesnotexistsc@s eZdZdS)z;ModuleLevelMiscTest.test_disable.._NotAnIntOrStringNrr<r<r<r=_NotAnIntOrStringgsrWARN) rrrrCrKrrrrre)r: old_disablerr<r<r= test_disable\s    z ModuleLevelMiscTest.test_disableNcsgt|tdfddt}tj|tt|}|durN||d|n |d||t|j d|j d}|| d||dur|n tt| }||j ||gdS)N basicConfigcs||fSrr)rkwrr<r=vrz/ModuleLevelMiscTest._test_log..z test me: %rrYr) rr6rrrr8r#rKrLr getMessageupperr)r:rrI recording log_methodrZexpected_levelr<rr= _test_logss       zModuleLevelMiscTest._test_logcCs|dtjdSNru)rrrgr[r<r<r=test_logszModuleLevelMiscTest.test_logcCs|ddSNryrr[r<r<r= test_debugszModuleLevelMiscTest.test_debugcCs|ddSNrxrr[r<r<r= test_infoszModuleLevelMiscTest.test_infocCs|ddSNrwrr[r<r<r= test_warningsz ModuleLevelMiscTest.test_warningcCs|ddSNrvrr[r<r<r= test_errorszModuleLevelMiscTest.test_errorcCs|ddSNrrr[r<r<r= test_criticalsz!ModuleLevelMiscTest.test_criticalcCs^|ttjtGdddtj}t||t|ttj|ttjdS)Nc@s eZdZdS)z;ModuleLevelMiscTest.test_set_logger_class..MyLoggerNrr<r<r<r=rsr)rrrr r rrKgetLoggerClass)r:rr<r<r=test_set_logger_classs   z)ModuleLevelMiscTest.test_set_logger_classc sgGfdddt}t|td}|dgt}t|}||z| tj | d|| d|d|d| tj| d|| dW|||ttjn |||ttj0dS)Ncs&eZdZdejffdd ZZS)z@ModuleLevelMiscTest.test_subclass_logger_cache..MyLoggerrcst||ddS)N initialized)r&r'r)r:r;rI)r+rqr<r=r'szIModuleLevelMiscTest.test_subclass_logger_cache..MyLogger.__init__)r]r^r_rrr'r/r<rqr*r=rsrZjust_some_loggerrZhellorr)rrr rrKr*r+r/r8r-r.ryrIr truncaterrmr@r?r)r:rrr,rDr<rr=test_subclass_logger_caches.            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)rrVrNr:codercouterrr<r<r=test_logging_at_shutdowns   z,ModuleLevelMiscTest.test_logging_at_shutdowncCs8d}td|\}}}|}|d|||ddS)Nzif 1: import logging def rec(): logging.error("foo") rec() rec()rz#Cannot recover from stack overflow.rY)rrVZ assertNotInrKrr<r<r=test_recursion_errors  z(ModuleLevelMiscTest.test_recursion_error)N)r]r^r_r`rrrrrrrrrrrrr<r<r<r=rXs  rc@s,eZdZddZddZddZddZd S) LogRecordTestcCs6ti}t|}||d||ddS)Nz )rrrr9rxr)r:rrWr<r<r= test_str_reps zLogRecordTest.test_str_repcCsjt}t}||ddi}td|||jdj|||jdj d| || dS)NZlessZmorezless is %(less)srz less is more) rrrr8rwrLrr rKrqr@r?)r:rDrrYr<r<r= test_dict_args   zLogRecordTest.test_dict_argcCsZti}||jdz*ddl}ti}||j|jWntyTYn0dS)N MainProcessr)rrrK processNamerDcurrent_processr;rR)r:rmpr<r<r=test_multiprocessings   z"LogRecordTest.test_multiprocessingcCsti}|j}||j||j||j||jtj}tj}tj }z`dt_dt_dt_ ti}|j }||j||j||j||jW|t_|t_|t_ n|t_|t_|t_ 0dS)NF) rrassertIsNotNoner threadNameprocessr logThreads logProcesseslogMultiprocessingrR)r:rZNOT_NONEZ log_threadsZ log_processesZlog_multiprocessingNONEr<r<r= test_optionals2          zLogRecordTest.test_optionalN)r]r^r_rrrrr<r<r<r=rs  rcseZdZdZfddZfddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd9d+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8ZZS):BasicConfigTestz#Test suite for logging.basicConfig.csVtt|tjj|_tj|_tj dd|_ tjj |_ | |jgtj_dSr)r&rr>rrr6rrrrrrIr)rrr[r*r<r=r>#s    zBasicConfigTest.setUpcs<tjjddD]}tj||qtt|dSr)rrr6r@r?r&rrErr*r<r=rE,s  zBasicConfigTest.tearDowncCsJttjd|jtjtj|j|jtj dd<tj |j dS)Nr6) rrrr6rrArBrrrr-r)r[r<r<r=r2s  zBasicConfigTest.cleanupcCst|ttjjdtjjd}||tj||jt j |j }||j j tj||j||j tj|tjj|jdS)NrYr)rrrKrLrr6rr/r,rrOrrrj BASIC_FORMATrRr PercentStylerIr))r:rrr<r<r=test_no_kwargs9s  zBasicConfigTest.test_no_kwargscCsftJ}tjtjddtdtjd|| dWdn1sX0YdS)Nrcr,r Log an errorrERROR:root:Log an error rrrrrrrvrrKrIr rr<r<r=test_strformatstyleMs   z#BasicConfigTest.test_strformatstylecCsftJ}tjtjddtdtjd|| dWdn1sX0YdS)Nrrrrrrrr<r<r=test_stringtemplatestyleUs   z(BasicConfigTest.test_stringtemplatestylecCsdd}tjdd|ttjjdtjjd}||tjtdd}||jj |jj ||jj |jj | |||ddS)NcSs||t|dSrrrZh2rr<r<r=r_sz.BasicConfigTest.test_filename..cleanuptest.log)rrYrr) rrrKrLrr6rrr,moder;rr:rrrUr<r<r= test_filename]s   zBasicConfigTest.test_filenamecCsVdd}tjdddtjjd}tdd}||jj|jj||||ddS)NcSs||t|dSrrrr<r<r=rqsz.BasicConfigTest.test_filemode..cleanuprwbrfilemoder) rrrr6rrKr,rrrr<r<r= test_filemodeos   zBasicConfigTest.test_filemodecCs`t}||jtj|d|ttjj dtjj d}| |tj ||j |dS)Nr%rYr) r*r+rr?rrrKrLrr6rr/r,)r:r,rr<r<r= test_stream}s   zBasicConfigTest.test_streamcCs.tjddtjjdj}||jjddS)Nz%(asctime)s - %(message)s)rr)rrrr6rrKrrjr:rr<r<r= test_formats zBasicConfigTest.test_formatcCs,tjddtjjdj}||jddS)NrL)rr)rrrr6rrKrr r<r<r= test_datefmts zBasicConfigTest.test_datefmtcCs.tjddtjjdj}||jtjdS)Nrrdr)rrrr6rrrrr r<r<r= test_styles zBasicConfigTest.test_stylecCsTtjj}|tjj|tjdd|tjjdtjdd|tjjddS)N9)rI:)rrrIrr-rrK)r: old_levelr<r<r= test_levels   zBasicConfigTest.test_levelcCsp|j}tg}tj}|ttjd|d|ttjd|d|ttj||d|ttjtjdtjddddS)Nr)rr,)rr6)r,r6)Zloglevelrr)rrr/rrOrrrm)r:rr6r,r<r<r=test_incompatibles    z!BasicConfigTest.test_incompatiblecCstttjtg}t}|d|tj|d||dtjj d||dtjj d||dtjj d| |dj | |dj ||dj |||dj |dj dS)Nr)r6rrY) rr/rrr1r4rrLrr6rr)r:r6rr<r<r= test_handlerss  zBasicConfigTest.test_handlerscCst}t}t|g}t|g}tjtj|dtdtdtd| t tj j dtjtj |ddtdtdtd| t tj j d| |d| |d dS) NrrrxryrYT)rIr6forcezWARNING:root:warnz WARNING:root:warn INFO:root:info)r*r+rr/rrkrwrxryrKrLrr6rmrIr )r:Z old_string_ioZ new_string_ioZ old_handlersZ new_handlersr<r<r= test_forces,         zBasicConfigTest.test_forcecCszd}tjd|ddtjd|ttjjdtjjd}||tj||j |t dW| t ddd }| }Wdn1s0Ytd||dnX| t ddd }| }Wdn1s0Ytd||d0dS) NrOrrm %(message)srrherrorsrrIrYr.The Øresund Bridge joins Copenhagen to Malmörgrrr.rKrLrr6rrrhryr?r(rRr rrr:rhrrrCr<r<r= test_encodings2  * * zBasicConfigTest.test_encodingcCszd}tjd|ddtjd|ttjjdtjjd}||tj||j |t dW| t dd d }| }Wdn1s0Ytd||d nX| t dd d }| }Wdn1s0Ytd||d 0dS) NrrignorerrrYrrrOrgz*The resund Bridge joins Copenhagen to Malmrrr<r<r=test_encoding_errorss*  * * z$BasicConfigTest.test_encoding_errorscCs$zd}tjd|dtjd|ttjjdtjjd}||tj||j |||j dt dW| t dd d }|}Wdn1s0Ytd||d nX| t dd d }|}Wdn1s0Ytd||d 0dS) Nrrr)rrhrrIrYrbackslashreplaceu<😂: ☃️: The Øresund Bridge joins Copenhagen to MalmörOrgzL\U0001f602: \u2603\ufe0f: The \xd8resund Bridge joins Copenhagen to Malm\xf6)rrr.rKrLrr6rrrhrryr?r(rRr rrrr<r<r=test_encoding_errors_defaults*  * * z,BasicConfigTest.test_encoding_errors_defaultcsVzd}tjd|ddtjd|ttjjdtjjd}||tj||j || |j gfdd}||_ t d ||d dW|tdd d }|}Wdn1s0Ytd||d nZ|tdd d }|}Wdn1s00Ytd||d 0dS)NrrrrrYrcs t\}}}t|dSr)rrrr)rrrrr<r=dummy_handle_error#szEBasicConfigTest.test_encoding_errors_none..dummy_handle_errorrz:'ascii' codec can't encode character '\xd8' in position 4:rOrgr)rrr.rKrLrr6rrrhrRrrGryr9rNr?r(rRr rr)r:rhrr#rrCr<rr=test_encoding_errors_nones:     * , z)BasicConfigTest.test_encoding_errors_noneNcsfgtjfdd}ttd|tt|}|durH||dn|ddifgdS)Ncs<tjj}tjdtjj|||fdS)Nd)rrrIr-rr)rrrrZold_basic_configr:r<r=my_basic_config:s  z2BasicConfigTest._test_log..my_basic_configrztest mer<)rrrr6r#rK)r:rrIr'rr<r&r=r5s  zBasicConfigTest._test_logcCs|dtjdSr)rrrkr[r<r<r=rLszBasicConfigTest.test_logcCs|ddSrrr[r<r<r=rOszBasicConfigTest.test_debugcCs|ddSrrr[r<r<r=rRszBasicConfigTest.test_infocCs|ddSrrr[r<r<r=rUszBasicConfigTest.test_warningcCs|ddSrrr[r<r<r=rXszBasicConfigTest.test_errorcCs|ddSrrr[r<r<r=r[szBasicConfigTest.test_critical)N) r]r^r_r`r>rErrrrrr r r rrrrrrrr r"r$rrrrrrrr/r<r<r*r=rs8   " rcsLeZdZfddZddZddZddZd d Zd d Zd dZ Z S)LoggerAdapterTestcstt|tjddt|_tj|_|j |j| |jj |j| |jj fdd}| || tj tj|jdd|_dS)Ncstjdd<dSr)rrr<Zold_handler_listr<r=rjsz(LoggerAdapterTest.setUp..cleanuprr)r&r(r>rrrrrrr8rr@r?rurtadapter)r:rr*r)r=r>`s   zLoggerAdapterTest.setUpc Csd}d}z ddWn8tyL}z |}|j||jWYd}~n d}~00|t|jjd|jjd}||jtj ||j |||j |jf||j |j ||jfdSNztesting exception: %rrYr)r1r+rrrKrLrrrrgrr rr+ __traceback__r:rr2rrr<r<r=test_exceptionqs &  z LoggerAdapterTest.test_exceptionc Csz ddWn(ty4}z|}WYd}~n d}~00|jjd|d|t|jjd|jjd}||j|j||j fdS)NrYrz exc_info testr0) r1r+rrKrLrrrr+r-)r:rr2rr<r<r=test_exception_excinfos   z(LoggerAdapterTest.test_exception_excinfocCshd}|j||j|t|jjd|jjd}||jtj||j |||j |jfdS)Nzcritical test! %rrYr) r+rrrKrLrrrrerr )r:rrr<r<r=rs zLoggerAdapterTest.test_criticalcCsD|jjjj}d|jjj_|t|jjjd|||jddS)N!rC )r+rrrCrrr isEnabledForr:rr<r<r=test_is_enabled_fors   z%LoggerAdapterTest.test_is_enabled_forcCsN||j|jjD]}|j|q||j||jdSr)r9r+r5rr6r@rrr<r<r=test_has_handlerss  z#LoggerAdapterTest.test_has_handlerscCsRGdddtj}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@seZdZdZddZdS)z.LoggerAdapterTest.test_nested..AdapterAdaptercSs|jd||fSr)r)r:rrr<r<r=rsz6LoggerAdapterTest.test_nested..Adapter.processN)r]r^r_rrr<r<r<r=r7sr7zAdapters can be nested, yo.r*ZAdapterAdapterrYrzAdapter AdapterAdapter )rrtrrrKrUrurerrLrrrr rrLr )r:r7rr+Zadapter_adapterrZ orig_managerZ temp_managerr<r<r= test_nesteds2  zLoggerAdapterTest.test_nested) r]r^r_r>r/r0rr5r6r8r/r<r<r*r=r(_s    r(cseZdZfddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"ZZS)# LoggerTestcsbtt|t|_tjdd|_|j|j| |jj |j| |jj | tj dS)NZblahr;) r&r9r>rrrrrr8rr@r?rur[r*r<r=r>szLoggerTest.setUpcCs|t|jjtdSr)rrrr-r r[r<r<r=test_set_invalid_levelsz!LoggerTest.test_set_invalid_levelc Csd}d}z ddWn8tyL}z |}|j||jWYd}~n d}~00|t|jjd|jjd}||jtj ||j |||j |jf||j |j ||jfdSr,)r1rrrrKrLrrrrgrr rr+r-r.r<r<r=r/s &  zLoggerTest.test_exceptioncCsFttdd$|t|jjddWdn1s80YdS)NrKTrr test message)r swap_attrrrrrrur[r<r<r=!test_log_invalid_level_with_raisesz,LoggerTest.test_log_invalid_level_with_raisecCs@ttdd|jddWdn1s20YdS)NrKFrrr<)rr=rrrur[r<r<r=test_log_invalid_level_no_raisesz*LoggerTest.test_log_invalid_level_no_raisecsPgt|tjdfdd|jjdd|td|dddS) N print_stackcs|Sr)rrI)rrrr<r=rrz=LoggerTest.test_find_caller_with_stack_info..TrrYrr)rr6r tracebackr findCallerrKrLr[r<rr= test_find_caller_with_stack_infos  z+LoggerTest.test_find_caller_with_stack_infocsdfddfddfdd}jj}||djd |dj}d7||djd |dj||dj}d7||djd |dj||dj}d7||djd |dj|dS) NrYcsjjdddS)Nrf) stacklevel)rrwr<)r: the_levelr<r= innermostsz>LoggerTest.test_find_caller_with_stacklevel..innermostcs dSrr<r<)rFr<r=rsz:LoggerTest.test_find_caller_with_stacklevel..innercs dSrr<r<)rr<r=outersz:LoggerTest.test_find_caller_with_stacklevel..outerrrFrrG test_find_caller_with_stacklevel)rrrKrPrWr8)r:rGrrWr<)rrFr:rEr=rHs,     z+LoggerTest.test_find_caller_with_stacklevelc Csd}d}d}}}}}}} t||||||||| } dt| jD]0} | di} |jt|jj|||||||| | d qPdS)N my record )rqr~ some valuersinfo) r_logRecordFactoryrP__dict__keysrrr makeRecord) r:r;rIrlnorr rrXrMrvr_rr<r<r=%test_make_record_with_extra_overwrites z0LoggerTest.test_make_record_with_extra_overwritec Cs\d}d}d}}}}}}} ddi} |jj|||||||| | d } |d| jdS)NrIrJZ valid_keyrKrL)rrQrNrO) r:r;rIrrRrr rrXrMrr[r<r<r=(test_make_record_with_extra_no_overwrite(sz3LoggerTest.test_make_record_with_extra_no_overwritecCs>||j|jjD]}|j|q||jdSr)r9rr5r6r@rrr<r<r=r61s zLoggerTest.test_has_handlerscCs"td}d|_||dS)Nz blah.childF)rrrrr5)r:Z child_loggerr<r<r=test_has_handlers_no_propagate8s z)LoggerTest.test_has_handlers_no_propagatecCs>|jjj}d|jj_|t|jjd|||jddS)NrC)rrrCrrrr3r4r<r<r=r5=s  zLoggerTest.test_is_enabled_forcCs`|jj}|jjj}d|j_d|jj_|t|jd||t|jjd|||jddS)NTrprrCrX)rrrrCrrrr3)r:Z old_disabledrr<r<r=#test_is_enabled_for_disabled_loggerCs  z.LoggerTest.test_is_enabled_for_disabled_loggercCst}||tj||td||td||td||tdj||tdj||tdj||td||tdjdS)NrrrKfoo.bar)rrrLrparentZ assertIsNot)r:rr<r<r=test_root_logger_aliasesOsz#LoggerTest.test_root_logger_aliasescCs$|ttjt|ttjddS)Nsfoo)rrrranyr[r<r<r=test_invalid_names\szLoggerTest.test_invalid_namescCsNttjdD]:}dD]0}t|}t||}t|}|||qqdS)NrY)rrrKrZzbaz.bar)rr%HIGHEST_PROTOCOLrrrr&rL)r:protor;rrWZ unpickledr<r<r= test_pickling`s    zLoggerTest.test_picklingcCs6|j}td}td}|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 || tjt||tj ||ji||ji||ji| | tj | | tj | | tj dS)NrrTF)r'rrr-rgrKr(_cacher9r3rr.rerrC)r:rr%r&r<r<r= test_cachinghsH     zLoggerTest.test_caching)r]r^r_r>r;r/r>r?rCrHrTrUr6rVr5rYr]r_rbrdr/r<r<r*r=r9s"      r9c@s(eZdZdZddZddZddZdS) BaseFileTestz1Base class for handler tests that write log filescCs0t|tdd\}|_t|g|_dS)Nrztest_logging-2-)rr>rrrrr?rmfiles)r:rr<r<r=r>s  zBaseFileTest.setUpcCs>|jD]}t|qtj|jr0t|jt|dSr)rfrrrrrrrE)r:rr<r<r=rEs    zBaseFileTest.tearDowncCs*|jtj|d|d|j|dS)z7Assert a log file is there and register it for deletionzLog file %r does not existrN)r9rrrrfr)r:rr<r<r= assertLogFileszBaseFileTest.assertLogFileN)r]r^r_r`r>rErhr<r<r<r=resrec@seZdZddZdS)FileHandlerTestcCsxt|jtj|jdd}||j|tj |j| t i| |j| tj |j|dS)NTr)rrrrrrRr,rrrrrrr9r?)r:fhr<r<r= test_delays   zFileHandlerTest.test_delayN)r]r^r_rkr<r<r<r=risric@sLeZdZddZddZddZddZd d Zd d Ze d dZ dS)RotatingFileHandlerTestc Cstdtjdd|dddS)NrrrY)rr(r.r\r[r<r<r=next_recs z RotatingFileHandlerTest.next_reccCs^tjj|jdd}||d|tjjtjddd}||| |dS)NrmaxBytesrOrY)rhro) rr6r rrshouldRolloverr?rdevnullrmr:rhr<r<r=test_should_not_rolloversz0RotatingFileHandlerTest.test_should_not_rollovercCs2tjj|jdd}||||dS)NrYrn)rr6r rr9rprmr?rrr<r<r=test_should_rolloversz,RotatingFileHandlerTest.test_should_rollovercCs4tj|j}||||j|dSr)rr6r rrrmrhr?rrr<r<r=test_file_createds z)RotatingFileHandlerTest.test_file_createdcCsdd}tjj|jddd}||_||||j|||||jd|||||jd|t j ||jd| dS) NcSs|dSN.testr<r:r<r<r=namersz>RotatingFileHandlerTest.test_rollover_filenames..namerrrY backupCountro.1.2.3) rr6r rryrrmrhrrrrr?)r:ryrsr<r<r=test_rollover_filenamess z/RotatingFileHandlerTest.test_rollover_filenamescCsGdddtjj}||jddd}|||j|jd||||j|||||jdd| t j ||jd| dS) Nc@seZdZddZddZdS)zZRotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotatorcSs|dSrwr<)r:r;r<r<r=rysz`RotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotator.namercSs tj|rt||ddS)N.rotated)rrrr)r:sourcedestr<r<r=rotators zbRotatingFileHandlerTest.test_namer_rotator_inheritance..HandlerWithNamerAndRotator.rotatorN)r]r^r_ryrr<r<r<r=HandlerWithNamerAndRotatorsrrrYrzrxr|r)rr6r rrKryrrmrhrrrrr?)r:rrsr<r<r=test_namer_rotator_inheritances z6RotatingFileHandlerTest.test_namer_rotator_inheritancec Csdd}dd}tjj|jddd}||_||_|}||||j|}||||jd}||t j }t |d :}| } t | } || d |j|Wdn1s0Y||||jd }||t |d :}| } t | } || d |j|Wdn1sD0Y||||jd }t |d :}| } t | } || d |j|Wdn1s0Y|t j||jd |dS) NcSs|dS)Nz.gzr<r:r<r<r=rysz3RotatingFileHandlerTest.test_rotator..namerc Sst|dX}|}t|d}t|d}||Wdn1sJ0YWdn1sh0Yt|dS)Nrbrr)r(rRzlibcompressrDrr)rrZsfrC compresseddfr<r<r=r s    Fz5RotatingFileHandlerTest.test_rotator..rotatorrrYrzr|rrr}r~)rr6r rrryrmrrhrlinesepr(rRr decompressrKrVrrrrr?) r:ryrrsZm1Zm2rnewlinerrrCr<r<r= test_rotatorsD      6   8  8z$RotatingFileHandlerTest.test_rotatorN) r]r^r_rmrtrurvrrrZ requires_zlibrr<r<r<r=rls rlc@s4eZdZddZddZddZddZd d Zd S) TimedRotatingFileHandlerTestcCsJtjjtjdddd}tdtddi}|| || dS)NSrOrY)rhr{皙?rztesting - device file) rr6r rrqrrrrrpr?)r:rjrr<r<r=rt2s  z5TimedRotatingFileHandlerTest.test_should_not_rolloverc stjj|jddd}td}||tddi}||||jt dtddi}||| d }t j }d }t|D]D}|t j|d } |j| d tj}|r|jqqd |} |stj|j\} fddt| D} td|dtjdtd| tjd| D]X} td| tj| | }t|d}t|Wdn1s0Yq<|j|| ddS)NrrY)r{rsrztesting - initialrztesting - after delayFi,Zsecondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondscsg|]}|r|qSr<)rx)rrrr<r=r\rz>TimedRotatingFileHandlerTest.test_rollover..z Test time: %sz%Y-%m-%d %H-%M-%SrzThe only matching files are: %szContents of %s:rrg)rr6r rr1r4rrrhrrr?rtr0r timedeltastrftimerrrrfrrlistdirr"rrOrr(rRr9)r:rjrZr1Zr2foundr0GO_BACKsecsprevrZdnfilesrrZtfr<rr= test_rollover<sD             0z*TimedRotatingFileHandlerTest.test_rollovercCsR|j}|ttjj|jddd|ttjj|jddd|ttjj|jddddS)NXTrWZW7)rrrr6r r)r:rr<r<r= test_invalidfs   z)TimedRotatingFileHandlerTest.test_invalidcCsd}tddd}tjj|jdddd|d}zD||}|||d||d}|||d W|n |0dS) Nr MIDNIGHTrYTwhenintervalr{ruatTimeжi@) rtrrr6r rcomputeRolloverrKr?)r: currentTimerrsrTr<r<r="test_compute_rollover_daily_attimeos  z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec Cs:tt}||d}tddd}t|j}tdD]}tjj|j d|ddd|d}z||krtd||}n||}|d9}|d 7}||7}| |}||krt d tj t d t |||||kr|d 7}| |d }||krt d tj t d t |||W|q:|0q:dS)NQrrzW%drYTrrzfailed in timezone: %dzlocal vars: %si: r)rGrrtr{tm_wdayrrr6r rrr"timezonelocalsrKr?) r:rZtodayrZwdayZdayrsrUrTr<r<r=#test_compute_rollover_weekly_attimes:       z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimeN)r]r^r_rtrrrrr<r<r<r=r1s  * rcKstjfi|tjddS)NrYr)rtr)rr<r<r=rsr)rrY)M<)Hi)Dr)rrZW0r)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)rrr{rugrrrrrz t: %s (%s)rzcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz result: %sz exception in diagnostic code: %s)rr6r rrrurr{ localtimeZ _MIDNIGHTr"rrOr!rrKr?) r:rexprsrrTrlZ currentHourZ currentMinuteZ currentSecondrr[r<r<r=test_compute_rollovers@         rztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c@seZdZddZdS)NTEventLogHandlerTestc Cs d}td|}t|}ztjd}Wn<tjyf}z"|jdkrPt dWYd}~n d}~00t ddi}| || ||t|tjtjB}d}d} t||| } | D].}|jdkrqt||} | d krqd }qqd | } |j|| d dS) NZ ApplicationZ test_loggingrz#Insufficient privileges to run testrzTest Log MessageFr%zTest Log Message Tz3Record not found in event log, went back %d recordsrg) win32evtlogZ OpenEventLogZGetNumberOfEventLogRecordsrr6ZNTEventLogHandler pywintypesrvwinerrorr=ZSkipTestrrr?Z assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZ ReadEventLogZ SourceNamewin32evtlogutilZSafeFormatMessager9) r:ZlogtypeZelhZnum_recsrDrrflagsrreventsrr<r<r=rs:       z NTEventLogHandlerTest.test_basicN)r]r^r_rr<r<r<r=rsrc@seZdZddZdS) MiscTestCasecCshd}tj|t|ddS)N> rFiltererStrFormatStyler currentframe RootLoggerrrr PlaceHolderrrr) blacklist)rZ check__all__r)r:rr<r<r= test__all__szMiscTestCase.test__all__N)r]r^r_rr<r<r<r=rsrcCs*tdd}|t|jddddS)NLC_ALLr)rZrun_with_locale __enter__r=ZaddModuleCleanup__exit__)cmr<r<r= setUpModules r__main__)N)r`rZlogging.handlersZlogging.configrnrrrtrr%r*rarrr!rrFr[r#rrZtest.support.script_helperrrrfrZ test.supportrZtest.support.logging_helperrrrrr=r{r]rnZ http.serverrrrY urllib.parser r socketserverr r r rrrrrRrZTestCaserrarZSILENTrZTERSEZEFFUSIVErrZ TALKATIVErZ CHATTERBOXZBORINGrrrrrrrrr r?r/rErHrJrZrWrsrwrrr>rrrrr1rrrr2r5r3r4r9r;r?Z IPV6_ENABLEDr@rCrZrertrrrrrrrr(rrr r6rDZ unittest.mockr6r7rrNZtzinforMrurTrrrrrrrrrrrrr(r9rerirlrrrrrrrrrr]mainr<r<r<r=s`    mF YT,J2)/  hbY@CM41( W#i `  '  W5BlW nw ! #