o
    HXîhQ ã                   @   sœ  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	l m!Z! ddl"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'dd
l(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2 e& 3¡  e& 4de5¡ ddl6Z6ddl7Z7W d  ƒ n1 sÓw   Y  zddl8Z8ddl9Z9ddl:Z:W n e;yõ   d Z8 Z9Z:Y nw zddl<Z<W n
 e;y   Y nw G dd„ de%j=ƒZ>G dd„ de>ƒZ?G dd„ de>ƒZ@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJeKeJeAd ƒZLeAdeBd eCd!eDd"eEd#eFd$eGd%eHd&eId'eJd(i
ZMG d)d*„ d*ejNƒZOG d+d,„ d,ejNƒZPG d-d.„ d.e>ƒZQG d/d0„ d0e>ƒZRG d1d2„ d2eSƒZTG d3d4„ d4ejUƒZVG d5d6„ d6eSƒZWG d7d8„ d8e>ƒZXG d9d:„ d:e7jYƒZZG d;d<„ d<eSƒZ[G d=d>„ d>e[e)ƒZ\G d?d@„ d@e[e1ƒZ]G dAdB„ dBe[e/ƒZ^e_edCƒrÖG dDdE„ dEe]ƒZ`G dFdG„ dGe^ƒZaG dHdI„ dIe>ƒZbG dJdK„ dKe>ƒZcG dLdM„ dMejdƒZeG dNdO„ dOe>ƒZfG dPdQ„ dQe>ƒZgdRdS„ Zhe% ie_edCƒdT¡G dUdV„ dVegƒƒZjG dWdX„ dXe>ƒZke% ie_edCƒdT¡G dYdZ„ dZekƒƒZlG d[d\„ d\e>ƒZme% ie_edCƒdT¡G d]d^„ d^emƒƒZne% iejod_¡G d`da„ daemƒƒZpG dbdc„ dce>ƒZqG ddde„ dee>ƒZrG dfdg„ dge>ƒZsG dhdi„ die>ƒZtd¾djdk„ZuG dldm„ dmƒZvdndo„ ZwG dpdq„ dqejUƒZxG drds„ dse>ƒZyG dtdu„ due>ƒZzG dvdw„ dwe>ƒZ{G dxdy„ dyej|ƒZ}G dzd{„ d{e>ƒZ~G d|d}„ d}e>ƒZe_ej€d~ƒrØddlZddl‚mƒZƒ G d€d„ de>ƒZ„e …d¡Z†G d‚dƒ„ dƒej‡ƒZˆeˆƒ Z‰G d„d…„ d…ƒZŠG d†d‡„ d‡e%j=eŠƒZ‹G dˆd‰„ d‰ejŒƒZG dŠd‹„ d‹e%j=ƒZŽG dŒd„ de>ƒZG dŽd„ de>ƒZG dd‘„ d‘ƒZ‘G d’d“„ d“ej’ƒZ“G d”d•„ d•e>ƒZ”G d–d—„ d—e>ƒZ•G d˜d™„ d™e>ƒZ–G dšd›„ d›e%j=ƒZ—G dœd„ de%j=ƒZ˜G dždŸ„ dŸe>eŠƒZ™G d d¡„ d¡e>ƒZšG d¢d£„ d£ešƒZ›G d¤d¥„ d¥ešƒZœG d¦d§„ d§ešƒZd¨d©„ Zždªd«d¬d­d®d¯ežd°d±d²ffD ]\ZŸZ eŸe fd³d´„Z¡e¢edµeŸ e¡ƒ q‘e% ie8d¶¡G d·d¸„ d¸e>ƒƒZ£G d¹dº„ dºe%j=ƒZ¤d»d¼„ Z¥e¦d½krÌe% §¡  dS dS )¿zoTest harness for the logging module. Run all tests.

Copyright (C) 2001-2022 Vinay Sajip. All Rights Reserved.
é    N)Úassert_python_okÚassert_python_failure)Úsupport)Ú	os_helper)Úsocket_helper)Úthreading_helper)Úwarnings_helper)ÚTestHandler)Ú
HTTPServerÚBaseHTTPRequestHandler)ÚurlparseÚparse_qs)ÚThreadingUDPServerÚDatagramRequestHandlerÚThreadingTCPServerÚStreamRequestHandlerÚignorec                   @   s>   e Zd ZdZdZdZdZdd„ Zdd„ Zdd
d„Z	dd„ Z
d	S )ÚBaseTestzBase class for logging tests.z&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$r   c                 C   s  t  ¡ | _t ¡ jj}t ¡  z;tj 	¡ | _
tjdd… | _| 	¡  | _}tj 	¡ | _tj 	¡ | _i  | _}|D ]}t|| ddƒ||< q8W t ¡  nt ¡  w t d¡| _t d¡| _t d¡| _| j ¡ | _t ¡ | _| j tj¡ t | j¡| _ t !| j"¡| _#| j  $| j#¡ | j %¡ rœ| jj&| jj& }t'd| ƒ‚| j %¡ r¯| jj&| jj& }t'd| ƒ‚| j (| j ¡ |  )| j %¡ ¡ |  )| j %¡ ¡ dS )zxSetup the default logging stream to an internal StringIO instance,
        so that we can examine log output as we want.NÚdisabledu   Â«Ã—Â»u   Ä¿Ã–GÚ zUnexpected handlers: %s)*r   Zthreading_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_dictr!   r&   ÚnameZhlist© r@   ú;/opt/python-3.10.19/usr/lib/python3.10/test/test_logging.pyÚsetUpV   sD   


ÿÿ


zBaseTest.setUpc                 C   s>  | j  ¡  | j | j¡ | jjr$| jjd }| j |¡ | ¡  | jjs| j | j¡ t 	¡  z^tj
 ¡  tj
 | j¡ tj ¡  tj | j¡ tj ¡  tj | j¡ | jtjdd…< t ¡ j}d|_|j}| ¡  | | j¡ | j}| jD ]}|| dur‡|| | j| _qwW t ¡  nt ¡  w |  ¡  tj| jŽ  dS )zJRemove our logging stream, and restore the original logging
        level.r   N) r0   Úcloser+   ÚremoveHandlerr4   r:   r1   r-   r   r   r$   ÚclearÚupdater%   r"   r#   r   r   r    r   r   r   Údisabler   r!   r&   r   r(   Z
doCleanupsr   Zthreading_cleanupr   )r>   Úhr   r   r&   r?   r@   r@   rA   ÚtearDown€   s>   
ý




€þzBaseTest.tearDownNc           	      C   s    |p| j }t |p| j¡}| ¡  ¡ }|  t|ƒt|ƒ¡ t||ƒD ]\}}| 	|¡}|s4|  
d| ¡ |  t| ¡ ƒ|¡ q"| ¡ }|rN|  
d| ¡ dS dS )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)r0   ÚreÚcompileÚexpected_log_patÚgetvalueÚ
splitlinesÚassertEqualÚlenÚzipÚsearchÚfailÚtupleÚgroupsÚread)	r>   Zexpected_valuesr0   ÚpatZactual_linesÚactualÚexpectedÚmatchÚsr@   r@   rA   Úassert_log_lines¢   s   

ÿÿzBaseTest.assert_log_linesc                 C   s   |  j d7  _ d| j  S )zMGenerate a message consisting solely of an auto-incrementing
        integer.é   z%d)Úmessage_num©r>   r@   r@   rA   Únext_message´   s   
zBaseTest.next_message©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   rL   r^   rB   rI   r\   r`   r@   r@   r@   rA   r   N   s    *
"r   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚBuiltinLevelsTestz*Test builtin levels and their inheritance.c                 C   s"  | j }t d¡}| tj¡ t t d¡i ¡}| tj¡ t d¡}| tj¡ | tj	|ƒ ¡ | 
|ƒ ¡ | tj	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | tj	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ |  g d¢¡ d S )NÚERRÚINFÚDEB))rg   ÚCRITICALÚ1)rg   ÚERRORÚ2)rh   rj   Ú3)rh   rl   Ú4)rh   ÚWARNINGÚ5)rh   ÚINFOÚ6)ri   rj   Ú7)ri   rl   Ú8)ri   rp   Ú9)ri   rr   Ú10)ri   r2   Ú11)r`   r   r   r1   rl   ÚLoggerAdapterrr   r2   Úlogrj   ÚerrorÚwarningÚinfoÚdebugr\   )r>   Úmrg   rh   ri   r@   r@   rA   Ú	test_flat¾   s.   

zBuiltinLevelsTest.test_flatc                 C   s„   | j }t d¡}| tj¡ t d¡}| tj¡ | tj|ƒ ¡ | |ƒ ¡ | 	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ |  ddg¡ d S )Nrh   úINF.ERR)r   rj   rk   )r   rl   rm   ©r`   r   r   r1   rr   rl   rz   rj   r{   r|   r}   r~   r\   )r>   r   rh   ÚINF_ERRr@   r@   rA   Útest_nested_explicití   s   


þz&BuiltinLevelsTest.test_nested_explicitc                 C   sâ   | j }t d¡}| tj¡ t d¡}| tj¡ t d¡}t d¡}t d¡}| tj|ƒ ¡ | |ƒ ¡ | 	|ƒ ¡ | 
|ƒ ¡ | tj|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | 	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ |  g d¢¡ d S )Nrh   r   ú	INF.UNDEFúINF.ERR.UNDEFÚUNDEF))r…   rj   rk   )r…   rl   rm   )r…   rp   rn   )r…   rr   ro   )r†   rj   rq   )r†   rl   rs   r‚   )r>   r   rh   rƒ   Z	INF_UNDEFZINF_ERR_UNDEFr‡   r@   r@   rA   Útest_nested_inherited  s&   




z'BuiltinLevelsTest.test_nested_inheritedc                 C   s’   | j }t d¡}t d¡}t d¡}| tj¡ | tj|ƒ ¡ | |ƒ ¡ | tj|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ |  	g d¢¡ d S )Nrh   úINF.BADPARENT.UNDEFúINF.BADPARENT))r‰   rj   rk   )r‰   rr   rm   )rŠ   rj   rn   )rŠ   rr   ro   )
r`   r   r   r1   rr   rz   ÚFATALr}   r~   r\   )r>   r   rh   Z
GRANDCHILDZCHILDr@   r@   rA   Útest_nested_with_virtual_parent'  s   


z1BuiltinLevelsTest.test_nested_with_virtual_parentc                 C   s,   |   t d¡tj¡ |   t tj¡d¡ dS )z&See issue #22386 for more information.rr   N)rO   r   ÚgetLevelNamerr   r_   r@   r@   rA   Útest_regression_22386A  s   z'BuiltinLevelsTest.test_regression_22386c                 C   s   t  d¡}|  |t j¡ d S )Nr‹   )r   r   rO   r‹   )r>   Úfatalr@   r@   rA   Útest_issue27935F  ó   
z!BuiltinLevelsTest.test_issue27935c                 C   s`   t  t jd¡ |  t jt jd¡ |  t  t j¡d¡ |  t  t j¡d¡ |  t  d¡t j¡ dS )z&See issue #29220 for more information.r   rr   ÚNOTSETN)r   ÚaddLevelNamerr   Ú
addCleanuprO   r   r’   r_   r@   r@   rA   Útest_regression_29220J  s
   z'BuiltinLevelsTest.test_regression_29220N)rb   rc   rd   re   r€   r„   rˆ   rŒ   rŽ   r   r•   r@   r@   r@   rA   rf   »   s    /#rf   c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚBasicFilterTestzTest the bundled Filter class.c              	   C   s¬   t  d¡}| jjd }zD| |¡ t  d¡}t  d¡}t  d¡}t  d¡}| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ |  ddg¡ W | 	|¡ d S | 	|¡ w )Nú	spam.eggsr   Úspamúspam.eggs.fishúspam.bakedbeans©r˜   rr   rm   ©rš   rr   rn   )
r   ÚFilterr+   r:   Ú	addFilterr   r}   r`   r\   ÚremoveFilter)r>   Zfilter_Úhandlerr™   Ú	spam_eggsÚspam_eggs_fishÚspam_bakedbeansr@   r@   rA   Útest_filterV  s"   





þzBasicFilterTest.test_filterc              	   C   sª   dd„ }| j jd }zD| |¡ t d¡}t d¡}t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ |  dd	g¡ W | |¡ d S | |¡ w )
Nc                 S   s&   | j  d¡}d |d d… ¡}|dkS )NÚ.é   r˜   )r?   ÚsplitÚjoin)ÚrecordÚpartsÚprefixr@   r@   rA   Ú
filterfuncr  s   z8BasicFilterTest.test_callable_filter.<locals>.filterfuncr   r™   r˜   rš   r›   rœ   r   )	r+   r:   rŸ   r   r   r}   r`   r\   r    )r>   r­   r¡   r™   r¢   r£   r¤   r@   r@   rA   Útest_callable_filtern  s"   




þz$BasicFilterTest.test_callable_filterc                 C   s*   t  ¡ }t  ddi¡}|  | |¡¡ d S )Nr?   r˜   )r   rž   ÚmakeLogRecordr=   Úfilter)r>   ÚfÚrr@   r@   rA   Útest_empty_filter‹  s   z!BasicFilterTest.test_empty_filterN)rb   rc   rd   re   r¥   r®   r³   r@   r@   r@   rA   r—   R  s
    r—   éx   éw   év   éu   ét   és   ér   éq   ép   éo   r]   ÚSilentÚTaciturnÚTerseÚEffusiveÚSociableÚVerboseÚ	TalkativeZ	GarrulousÚ
ChatterboxÚBoringc                   @   ó   e Zd ZdZdd„ ZdS )ÚGarrulousFilterz)A filter which blocks garrulous messages.c                 C   s
   |j tkS ©N)ÚlevelnoÚ	GARRULOUS©r>   rª   r@   r@   rA   r°   º  ó   
zGarrulousFilter.filterN©rb   rc   rd   re   r°   r@   r@   r@   rA   rÈ   ¶  ó    rÈ   c                   @   rÇ   )ÚVerySpecificFilterz5A filter which blocks sociable and taciturn messages.c                 C   s   |j ttfvS rÉ   )rÊ   ÚSOCIABLEÚTACITURNrÌ   r@   r@   rA   r°   Á  ó   zVerySpecificFilter.filterNrÎ   r@   r@   r@   rA   rÐ   ½  rÏ   rÐ   c                   @   ó<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚCustomLevelsAndFiltersTestz@Test various filtering possibilities with custom logging levels.ú^[\w.]+ -> (\w+): (\d+)$c                 C   s,   t  | ¡ t ¡ D ]
\}}t ||¡ q	d S rÉ   )r   rB   Úmy_logging_levelsÚitemsr   r“   )r>   ÚkÚvr@   r@   rA   rB   Ì  s   
ÿz CustomLevelsAndFiltersTest.setUpc                 C   s   t D ]
}| ||  ¡ ¡ qd S rÉ   )ÚLEVEL_RANGErz   r`   )r>   ÚloggerZlvlr@   r@   rA   Úlog_at_all_levelsÑ  s   ÿz,CustomLevelsAndFiltersTest.log_at_all_levelsc                 C   s*   | j  t¡ |  | j ¡ |  g d¢¡ d S )N)©rÃ   rq   ©rÂ   rs   ©rÁ   rt   ©rÀ   ru   ©r¿   rv   ©r¾   rw   )r+   r1   ÚVERBOSErÝ   r\   r_   r@   r@   rA   Útest_logger_filterÕ  s   z-CustomLevelsAndFiltersTest.test_logger_filterc              	   C   s^   | j jd  t¡ z|  | j ¡ |  g d¢¡ W | j jd  tj¡ d S | j jd  tj¡ w )Nr   )rß   rà   rá   râ   rã   )r+   r:   r1   rÑ   rÝ   r\   r   r’   r_   r@   r@   rA   Útest_handler_filterã  s
   .z.CustomLevelsAndFiltersTest.test_handler_filterc              	   C   s¬   | j jd }d }tƒ }| |¡ z7|  | j ¡ g d¢}|  |¡ tƒ }| j  |¡ |  | j ¡ |  |g d¢ ¡ W |rA| j  |¡ | |¡ d S |rP| j  |¡ | |¡ w )Nr   )	)rÆ   rk   )rÅ   rm   )rÄ   ro   rÞ   rß   rà   rá   râ   rã   ))rÆ   rx   )rÅ   Z12)rÄ   Z14)rÃ   Z15)rÁ   Z17)rÀ   Z18)r¾   Z20)r+   r:   rÈ   rŸ   rÝ   r\   rÐ   r    )r>   r¡   Zspecific_filterZgarrZfirst_linesr@   r@   rA   Útest_specific_filtersó  s$   

þz0CustomLevelsAndFiltersTest.test_specific_filtersN)
rb   rc   rd   re   rL   rB   rÝ   rå   ræ   rç   r@   r@   r@   rA   rÕ   Å  s    rÕ   c                   @   sZ   e Zd Zdd„ Zdd„ Zdd„ Ze ej	dkd¡d	d
„ ƒZ
e eedƒ d¡dd„ ƒZdS )ÚHandlerTestc                 C   sD   t  ¡ }d|_|  |jd¡ d|_|  |jd¡ |  t|jd ¡ d S )NÚgenericZanothergeneric)r   ÚHandlerr?   rO   ÚassertRaisesÚNotImplementedErrorÚemit©r>   rH   r@   r@   rA   Ú	test_name  s   zHandlerTest.test_namec           
      C   sì  t jdv rªdD ]t}t ¡ \}}t |¡ |st |¡ tjj	|ddd}|rb|j
|j}}|  |d¡ |  |d¡ t ddi¡}| |¡ t |¡ |  tj |¡¡ | |¡ |  tj |¡¡ n|  |j
d¡ |  |jd¡ | ¡  |r{t |¡ qt jd	kr„d
}nd}ztj |¡}|  |j|j¡ |  |j¡ | ¡  W n	 ty©   Y nw dD ]}	|	dkr¾|  ttjjdd|	¡ q¬tj dd|	¡}| ¡  q¬tj d¡}t i ¡}|  | |¡¡ | ¡  tj d¡}|  | |¡¡ | ¡  d S )N©ÚlinuxÚdarwin)TFúutf-8T©ÚencodingÚdelayéÿÿÿÿÚmsgZTestrò   z/var/run/syslogz/dev/log)ÚGETÚPOSTÚPUTrû   Ú	localhostz/logr   r]   )ÚsysÚplatformÚtempfileÚmkstempÚosrC   Úunlinkr   r:   ÚWatchedFileHandlerÚdevÚinorO   r¯   ÚhandleÚassertFalseÚpathÚexistsr=   ÚSysLogHandlerZfacilityZLOG_USERZ
unixsocketÚOSErrorrë   Ú
ValueErrorÚHTTPHandlerZBufferingHandlerZshouldFlush)
r>   ÚexistingÚfdÚfnrH   r  r  r²   ZsocknameÚmethodr@   r@   rA   Útest_builtin_handlers'  s`   






€
ÿÿ

z!HandlerTest.test_builtin_handlersc                 C   sº   t  ¡ \}}t |¡ t |¡ t |¡}tj|dfftj	j
|dfftj	j|dfff}tjdv r;|tj	j|dfff7 }|D ]\}}||ddiŽ}|  tj |¡¡ | ¡  t |¡ q=dS )zs
        Test that Path objects are accepted as filename arguments to handlers.

        See Issue #27493.
        ÚwÚarH   rð   rõ   ró   N)rÿ   r   r  rC   r  ÚpathlibÚPathr   ÚFileHandlerr:   ÚRotatingFileHandlerÚTimedRotatingFileHandlerrý   rþ   r  r=   r  r	  )r>   r  r  ZpfnÚcasesÚclsÚargsrH   r@   r@   rA   Útest_path_objects]  s    


ý
üzHandlerTest.test_path_objectsÚntz/WatchedFileHandler not appropriate for Windows.c              
      sD  ‡ fdd„}d}d}d ˆ _ d ˆ _dD ]}t dd¡\}}t |¡ tj|||fd}d|_| 	¡  t
jj|d	|d
}t
 d¡}	| |	¡ zFt|ƒD ],}
t d¡ t
 ddi¡}zt ¡ ˆ _ | |¡ W qI tyu   tdˆ jˆ j f ƒ ‚ w W | ¡  | ¡  tj |¡rŠt |¡ q| ¡  | ¡  tj |¡rŸt |¡ w w d S )Nc              	      sT   t |ƒD ]#}zt | ¡ t ¡ ˆ _W n	 ty   Y nw t dt dd¡ ¡ qd S )Ngü©ñÒMbp?r   é   )	Úranger  r  ÚtimeÚdeletion_timer  ÚsleepÚrandomÚrandint)ZfnameZtriesÚ_r_   r@   rA   Úremove_loopw  s   
ÿúz*HandlerTest.test_race.<locals>.remove_loopiô  ©FTú.logztest_logging-3-©Útargetr  Tró   rô   z'%(asctime)s: %(levelname)s: %(message)sç{®Gázt?rø   ZtestingzDeleted at %s, opened at %s)Zhandle_timer"  rÿ   r   r  rC   Ú	threadingÚThreadÚdaemonÚstartr   r:   r  r5   r8   r   r!  r#  r¯   r  Ú	ExceptionÚprintr©   r  r	  r  )r>   r'  Z	del_countZ	log_countrö   r  r  ZremoverrH   r±   r&  r²   r@   r_   rA   Ú	test_racet  sR   	




ÿÿüú
€ýÿèzHandlerTest.test_raceÚforkzTest requires os.fork().c              	      s&  G dd„ dt jƒ}|  tt jƒd¡ |ƒ ‰|  ˆjjj¡ dˆ_	|  
tt jƒd¡ |  
tt jƒd¡ t  d¡}| ˆ¡ | t j¡ t ¡ ‰t ¡ ‰ ‡ ‡‡fdd„}tj|d	d
}| ¡  ˆ ¡  t ¡ }|dkr}z| d¡ W t d¡ dS t d¡ w | d¡ ˆ  ¡  | ¡  tj|dd dS )z>Ensure child logging locks are not held; bpo-6721 & bpo-36533.c                       ó$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )zAHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandlerc                    s&   t ƒ  ¡  tjtddddd| _d S )Nz	/dev/nullZwtró   ©rõ   ©r0   )ÚsuperÚ__init__r   r3   ÚopenÚsub_handlerr_   ©Ú	__class__r@   rA   r9  ©  s   
ÿzJHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.__init__c                 S   s4   | j  ¡  z| j  |¡ W | j  ¡  d S | j  ¡  w rÉ   )r;  Úacquirerí   ÚreleaserÌ   r@   r@   rA   rí   ®  s   
zFHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.emit©rb   rc   rd   r9  rí   Ú__classcell__r@   r@   r<  rA   Ú_OurHandler¨  s    rB  r   z*because we need at least one for this testr]   Ú test_post_fork_child_no_deadlockc                      sT   t  ¡  z ˆ ¡  zˆ ¡  ˆ  d¡ W ˆ ¡  nˆ ¡  w W t  ¡  d S t  ¡  w )Nç      à?)r   r   r>  ÚsetÚwaitr?  r(   r@   ©Z+fork_happened__release_locks_and_end_threadZlocks_held__ready_to_forkZrefed_hr@   rA   Úlock_holder_thread_fnÂ  s   zKHandlerTest.test_post_fork_child_no_deadlock.<locals>.lock_holder_thread_fnz,test_post_fork_child_no_deadlock lock holder)r+  r?   z#Child process did not deadlock. \o/z&Parent process returned from fork. \o/)ÚexitcodeN)r   rê   rO   rP   r   r”   r;  r0   rC   r?   ÚassertGreaterÚ_at_fork_reinit_lock_weaksetr   r<   r1   r2   r-  ÚEventr.  r0  rF  r  r4  r}   Ú_exitrE  r©   r   Zwait_process)r>   rB  Ztest_loggerrH  Zlock_holder_threadÚpidr@   rG  rA   rC  ¥  s8   

þ
z,HandlerTest.test_post_fork_child_no_deadlockN)rb   rc   rd   rï   r  r  ÚunittestZskipIfr  r?   r3  ÚhasattrrC  r@   r@   r@   rA   rè     s    6
0rè   c                   @   ó   e Zd Zdd„ ZdS )Ú	BadStreamc                 C   s   t dƒ‚)Núdeliberate mistake)ÚRuntimeError©r>   Údatar@   r@   rA   Úwriteò  ó   zBadStream.writeN)rb   rc   rd   rW  r@   r@   r@   rA   rR  ñ  ó    rR  c                   @   rQ  )ÚTestStreamHandlerc                 C   ó
   || _ d S rÉ   )Úerror_recordrÌ   r@   r@   rA   ÚhandleErrorö  rÍ   zTestStreamHandler.handleErrorN)rb   rc   rd   r]  r@   r@   r@   rA   rZ  õ  rY  rZ  c                   @   s   e Zd ZejZdZdS )ÚStreamWithIntNamer§   N)rb   rc   rd   r   r’   Úlevelr?   r@   r@   r@   rA   r^  ù  s    r^  c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStreamHandlerTestc                 C   sî   t tƒ ƒ}t i ¡}tj}ze| |¡ |  |j|¡ t tƒ ¡}t	 
¡ }| |¡ d}|  || ¡ ¡ W d   ƒ n1 s>w   Y  dt_t	 
¡ }| |¡ |  d| ¡ ¡ W d   ƒ n1 sbw   Y  W |t_d S W |t_d S |t_w )Nz"
RuntimeError: deliberate mistake
Fr   )rZ  rR  r   r¯   ÚraiseExceptionsr  ÚassertIsr\  r3   r   Úcaptured_stderrÚassertInrM   rO   )r>   rH   r²   Z	old_raiseÚstderrrø   r@   r@   rA   Útest_error_handlingþ  s(   




ý

þ
üz%StreamHandlerTest.test_error_handlingc                 C   sV   t  ¡ }t ¡ }| |¡}|  |tj¡ | |¡}|  ||¡ | |¡}|  |¡ dS )z3
        Test setting the handler's stream
        N)	r   r3   r.   r/   Ú	setStreamrc  rý   rf  ÚassertIsNone)r>   rH   r0   ÚoldrX   r@   r@   rA   Útest_stream_setting  s   


z%StreamHandlerTest.test_stream_settingc                 C   s    t  tƒ ¡}|  t|ƒd¡ d S )Nz<StreamHandler 2 (NOTSET)>)r   r3   r^  rO   Úreprrî   r@   r@   rA   Ú'test_can_represent_stream_with_int_name"  s   z9StreamHandlerTest.test_can_represent_stream_with_int_nameN)rb   rc   rd   rg  rk  rm  r@   r@   r@   rA   ra  ý  s    ra  c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zd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.
    c                 C   sB   t jj| |d |dd | j ¡ d | _|| _d | _d| _|| _	d S )NT)ÚmapZdecode_datar]   F)
ÚsmtpdÚ
SMTPServerr9  ÚsocketÚgetsocknameÚportÚ_handlerÚ_threadÚ_quitÚpoll_interval)r>   Úaddrr¡   rx  Úsockmapr@   r@   rA   r9  >  s   ÿ
zTestSMTPServer.__init__c                 C   s   |   ||||¡ dS )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)ru  )r>   ÚpeerÚmailfromÚrcpttosrV  r@   r@   rA   Úprocess_messageG  s   
zTestSMTPServer.process_messagec                 C   ó,   t j| j| jfd | _}d|_| ¡  dS )zG
        Start the server running on a separate daemon thread.
        r*  TN©r-  r.  Úserve_foreverrx  rv  r/  r0  ©r>   Útr@   r@   rA   r0  S  ó
   ÿzTestSMTPServer.startc                 C   s&   | j stj|| jdd | j rdS dS )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`.
        r]   )ro  ÚcountN)rw  ÚasyncoreZloopÚ_map©r>   rx  r@   r@   rA   r  \  s   ÿzTestSMTPServer.serve_foreverc                 C   s4   d| _ t | j¡ d| _|  ¡  tj| jdd dS )zr
        Stop the thread by closing the server instance.
        Wait for the server thread to terminate.
        TN)ro  Z
ignore_all)rw  r   Újoin_threadrv  rC   r†  Z	close_allr‡  r_   r@   r@   rA   Ústopg  s
   zTestSMTPServer.stopN)	rb   rc   rd   re   r9  r~  r0  r  rŠ  r@   r@   r@   rA   rn  )  s    		rn  c                       s8   e Zd ZdZdd„ Zdd„ Z‡ fdd„Zdd	„ Z‡  ZS )
Ú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.
    c                 C   s    d | _ || _|| _t ¡ | _d S rÉ   )rv  rx  ru  r-  rL  Úready)r>   r¡   rx  r@   r@   rA   r9  ƒ  s   zControlMixin.__init__c                 C   r  )zI
        Create a daemon thread to run the server, and start it.
        r*  TNr€  r‚  r@   r@   rA   r0  ‰  r„  zControlMixin.startc                    s   | j  ¡  tt| ƒ |¡ dS )z^
        Run the server. Set the ready flag before entering the
        service loop.
        N)rŒ  rE  r8  r‹  r  rˆ  r<  r@   rA   r  ’  s   
zControlMixin.serve_foreverc                 C   s:   |   ¡  | jdurt | j¡ d| _|  ¡  | j ¡  dS )zK
        Tell the server thread to stop, and wait for it to do so.
        N)Úshutdownrv  r   r‰  Úserver_closerŒ  rE   r_   r@   r@   rA   rŠ  š  s   
zControlMixin.stop)	rb   rc   rd   re   r9  r0  r  rŠ  rA  r@   r@   r<  rA   r‹  s  s    	r‹  c                   @   s&   e Zd ZdZ		d	dd„Zdd„ ZdS )
Ú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.
    rD  FNc                    s<   G ‡ ‡fdd„dt ƒ‰ t | |ˆ ¡ t | ||¡ || _d S )Nc                       s2   e Zd Zddd„Zdd„ Z‡‡ ‡fdd„Z‡  ZS )	z=TestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandlerNc                 S   s   |  d¡r| jS t|ƒ‚)NZdo_)Ú
startswithÚprocess_requestÚAttributeError)r>   r?   Údefaultr@   r@   rA   Ú__getattr__³  s   
zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__c                 S   ó   | j  | ¡ d S rÉ   ©Úserverru  r_   r@   r@   rA   r‘  ¸  ó   zMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestc                    s$   ˆrt ˆ | ƒj|g|¢R Ž  d S d S rÉ   )r8  Úlog_message)r>   Úformatr  )ÚDelegatingHTTPRequestHandlerr=  rz   r@   rA   r™  »  s   ÿÿÿÿzITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_messagerÉ   )rb   rc   rd   r”  r‘  r™  rA  r@   ©r›  rz   r<  rA   r›  ²  s    
r›  )r   r
   r9  r‹  Ússlctx)r>   ry  r¡   rx  rz   r  r@   rœ  rA   r9  °  s   
zTestHTTPServer.__init__c              
   C   sd   z| j  ¡ \}}| jr| jj|dd}W ||fS W ||fS  ty1 } z	tj d| ¡ ‚ d }~ww )NT)Zserver_sidezGot an error:
%s
)rr  Úacceptr  Zwrap_socketr  rý   rf  rW  )r>   Úsockry  Úer@   r@   rA   Úget_requestÃ  s   úü€ýzTestHTTPServer.get_request)rD  FN)rb   rc   rd   re   r9  r¡  r@   r@   r@   rA   r  ¥  s    

ÿr  c                       s2   e Zd ZdZdZ		ddd„Z‡ fdd„Z‡  ZS )	Ú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.
    TrD  c                 C   s2   G dd„ dt ƒ}t | |||¡ t | ||¡ d S )Nc                   @   rQ  )z;TestTCPServer.__init__.<locals>.DelegatingTCPRequestHandlerc                 S   r•  rÉ   r–  r_   r@   r@   rA   r  ã  r˜  zBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)rb   rc   rd   r  r@   r@   r@   rA   ÚDelegatingTCPRequestHandlerá  ó    r£  )r   r   r9  r‹  )r>   ry  r¡   rx  Úbind_and_activater£  r@   r@   rA   r9  ß  s
   
ÿzTestTCPServer.__init__c                    ó"   t t| ƒ ¡  | j ¡ d | _d S ©Nr]   )r8  r¢  Úserver_bindrr  rs  rt  r_   r<  r@   rA   r¨  é  ó   zTestTCPServer.server_bind©rD  T)rb   rc   rd   re   Zallow_reuse_addressr9  r¨  rA  r@   r@   r<  rA   r¢  Î  s    
ÿ
r¢  c                       s:   e Zd ZdZ		d
dd„Z‡ fdd„Z‡ fdd	„Z‡  ZS )Ú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.
    rD  Tc                    s<   G ‡ fdd„dt ƒ‰ t | |ˆ |¡ t | ||¡ d| _d S )Nc                       s&   e Zd Zdd„ Z‡‡ fdd„Z‡  ZS )z;TestUDPServer.__init__.<locals>.DelegatingUDPRequestHandlerc                 S   r•  rÉ   r–  r_   r@   r@   rA   r    r˜  zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlec                    sF   | j  ¡ }|r!z
tˆ | ƒ ¡  W d S  ty    | jjs‚ Y d S w d S rÉ   )ZwfilerM   r8  Úfinishr  r—  Ú_closedrU  )ÚDelegatingUDPRequestHandlerr=  r@   rA   r¬    s   
ÿÿýzBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)rb   rc   rd   r  r¬  rA  r@   ©r®  r<  rA   r®     s    r®  F)r   r   r9  r‹  r­  )r>   ry  r¡   rx  r¥  r@   r¯  rA   r9  þ  s   þ
zTestUDPServer.__init__c                    r¦  r§  )r8  r«  r¨  rr  rs  rt  r_   r<  r@   rA   r¨    r©  zTestUDPServer.server_bindc                    s   t t| ƒ ¡  d| _d S )NT)r8  r«  rŽ  r­  r_   r<  r@   rA   rŽ    s   
zTestUDPServer.server_closerª  )rb   rc   rd   re   r9  r¨  rŽ  rA  r@   r@   r<  rA   r«  í  s    
ÿr«  ÚAF_UNIXc                   @   ó   e Zd ZejZdS )ÚTestUnixStreamServerN©rb   rc   rd   rr  r°  Úaddress_familyr@   r@   r@   rA   r²    ó    
r²  c                   @   r±  )ÚTestUnixDatagramServerNr³  r@   r@   r@   rA   r¶     rµ  r¶  c                   @   s"   e Zd ZejZdd„ Zdd„ ZdS )ÚSMTPHandlerTestc           
      C   s
  i }t tjdf| jd|ƒ}| ¡  tj|jf}tjj|ddd| j	d}|  
|jdg¡ g | _t ddi¡}t ¡ | _| |¡ | j | j	¡ | ¡  |  | j ¡ ¡ |  
t| jƒd	¡ | jd \}}}}	|  
|d¡ |  
|dg¡ |  d
|	¡ |  |	 d¡¡ | ¡  d S )Nr   çü©ñÒMbP?ÚmeZyouZLog)Útimeoutrø   u	   Hello âœ“r]   z
Subject: Log
u   

Hello âœ“)rn  r   ZHOSTr~  r0  rt  r   r:   ZSMTPHandlerÚTIMEOUTrO   ZtoaddrsÚmessagesr¯   r-  rL  Úhandledr  rF  rŠ  r=   Úis_setrP   re  ÚendswithrC   )
r>   rz  r—  ry  rH   r²   r{  r|  r}  rV  r@   r@   rA   Ú
test_basic)  s0   ÿÿ

zSMTPHandlerTest.test_basicc                 G   s   | j  |¡ | j ¡  d S rÉ   )r¼  Úappendr½  rE  )r>   r  r@   r@   rA   r~  A  s   zSMTPHandlerTest.process_messageN)rb   rc   rd   r   ZLONG_TIMEOUTr»  rÀ  r~  r@   r@   r@   rA   r·  %  s    r·  c                   @   rÔ   )ÚMemoryHandlerTestzTests for the MemoryHandler.rÖ   c                 C   sF   t  | ¡ tj dtj| j¡| _t d¡| _	d| j	_
| j	 | j¡ d S )Né
   Zmemr   )r   rB   r   r:   ÚMemoryHandlerrp   r4   Úmem_hdlrr   Ú
mem_loggerÚ	propagater<   r_   r@   r@   rA   rB   L  s   
ÿzMemoryHandlerTest.setUpc                 C   ó   | j  ¡  t | ¡ d S rÉ   )rÅ  rC   r   rI   r_   r@   r@   rA   rI   T  ó   
zMemoryHandlerTest.tearDownc                 C   sÜ   | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ g d¢}|  |¡ dD ]1}tdƒD ]
}| j  |  ¡ ¡ q3|  |¡ | j  |  ¡ ¡ |dd„ t||d ƒD ƒ }|  |¡ q-| j  |  ¡ ¡ |  |¡ d S )N)©r2   rk   ©rr   rm   )rp   rn   )r  é   é	   c                 S   s   g | ]}d t |ƒf‘qS )r2   )Ústr)Ú.0Úir@   r@   rA   Ú
<listcomp>n  s    z0MemoryHandlerTest.test_flush.<locals>.<listcomp>rÃ  )rÆ  r~   r`   r\   r}   r|   r   )r>   ÚlinesÚnrÐ  r@   r@   rA   Ú
test_flushX  s    



zMemoryHandlerTest.test_flushc                 C   sÞ   | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ |  g ¡ | j  | j¡ | j ¡  ddg}|  |¡ tj	 
dtj| jd¡| _| j  | j¡ | j  |  ¡ ¡ |  |¡ | j  |  ¡ ¡ |  |¡ | j  | j¡ | j ¡  |  |¡ dS )zO
        Test that the flush-on-close configuration works as expected.
        rÊ  rË  rÃ  FN)rÆ  r~   r`   r\   r}   rD   rÅ  rC   r   r:   rÄ  rp   r4   r<   )r>   rÒ  r@   r@   rA   Útest_flush_on_closet  s,   


þ
þ


z%MemoryHandlerTest.test_flush_on_closec              
   C   sŠ   G dd„ dƒ}|| j ƒ}z,| j  |¡ tdƒD ]}t d¡ | j d¡ | j d¡ qW |jD ]}t	 
|¡ q/d S |jD ]}t	 
|¡ q<w )Nc                   @   r`  )zZMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandlerc                 S   s   || _ g | _d S rÉ   )rÅ  Úthreads)r>   rÅ  r@   r@   rA   r9  ”  s   
zcMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.__init__c                 S   s   | j  d ¡ d S rÉ   )rÅ  Ú	setTargetr_   r@   r@   rA   ÚremoveTarget˜  r˜  zgMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.removeTargetc                 S   s&   t j| jd}| j |¡ | ¡  d S )N)r+  )r-  r.  rØ  rÖ  rÁ  r0  )r>   rø   Úthreadr@   r@   rA   r  ›  s   zaMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.handleN)rb   rc   rd   r9  rØ  r  r@   r@   r@   rA   ÚMockRaceConditionHandler“  s    rÚ  rÃ  r,  znot flushedZflushed)rÅ  r×  r   r!  r#  rÆ  r}   r|   rÖ  r   r‰  )r>   rÚ  r+  r&  rÙ  r@   r@   rA   Ú&test_race_between_set_target_and_flush’  s   

ý
ÿÿz8MemoryHandlerTest.test_race_between_set_target_and_flushN)
rb   rc   rd   re   rL   rB   rI   rÔ  rÕ  rÛ  r@   r@   r@   rA   rÂ  E  s    rÂ  c                   @   rÇ   )ÚExceptionFormatterzA special exception formatter.c                 C   s   d|d j  S )Nz
Got a [%s]r   )rb   )r>   Úeir@   r@   rA   ÚformatException¯  rÓ   z"ExceptionFormatter.formatExceptionN)rb   rc   rd   re   rÞ  r@   r@   r@   rA   rÜ  ­  s    rÜ  c                   @   sÚ   e Zd ZdZejZdZdZdZdZ	e 
dd¡Ze 
dd	¡Zd
e  d Ze 
dd¡ZdZdZdZdZdd„ Zdd„ Zdd„ Zefdd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,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.stboutzformatter=form1zformatter=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=
    zclass=StreamHandlerzclass=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=
    a  
    [loggers]
    keys=root

    [handlers]
    keys=file

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=file

    [handler_file]
    class=FileHandler
    level=DEBUG
    args=("{tempfile}",)
    kwargs={{"encoding": "utf-8"}}
    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=
    c                 K   s,   t  t |¡¡}tjj|fddi|¤Ž d S )Nrõ   ró   )r.   r/   ÚtextwrapÚdedentr   ÚconfigÚ
fileConfig)r>   ÚconfÚkwargsÚfiler@   r@   rA   Úapply_config³  s   zConfigFileTest.apply_configc                 C   óx   t  ¡ .}|  | j¡ t ¡ }| |  ¡ ¡ | |  ¡ ¡ | j	dg|d |  	g ¡ W d   ƒ d S 1 s5w   Y  d S ©N©rl   rm   r7  ©
r   Úcaptured_stdoutrè  Úconfig0r   r   r}   r`   r{   r\   ©r>   ÚoutputrÜ   r@   r@   rA   Útest_config0_ok·  ó   
ÿþ"õzConfigFileTest.test_config0_okc                 C   sœ   t  ¡ @}t t | j¡¡}t ¡ }| 	|¡ t
j |¡ t
 ¡ }| |  ¡ ¡ | |  ¡ ¡ | jdg|d |  g ¡ W d   ƒ d S 1 sGw   Y  d S rê  )r   rí  r.   r/   rá  râ  rî  ÚconfigparserÚConfigParserZ	read_filer   rã  rä  r   r}   r`   r{   r\   )r>   rð  rç  ZcprÜ   r@   r@   rA   Útest_config0_using_cp_okÆ  s   

ÿþ"òz'ConfigFileTest.test_config0_using_cp_okc                 C   óz   t  ¡ /}|  |¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | jddg|d |  g ¡ W d   ƒ d S 1 s6w   Y  d S ©Núcompiler.parser©rr   rk   rë  r7  ©	r   rí  rè  r   r   r}   r`   r{   r\   ©r>   rã  rð  rÜ   r@   r@   rA   Útest_config1_okØ  ó   


þý"õzConfigFileTest.test_config1_okc                 C   ó   |   t| j| j¡ d S rÉ   ©rë   r1  rè  Úconfig2r_   r@   r@   rA   Útest_config2_failureç  ó   z#ConfigFileTest.test_config2_failurec                 C   rþ  rÉ   ©rë   r1  rè  Úconfig3r_   r@   r@   rA   Útest_config3_failureë  r  z#ConfigFileTest.test_config3_failurec              	   C   sŒ   t  ¡ 8}|  | j¡ t ¡ }ztƒ ‚ ty    t d¡ Y nw tj	 
d¡ |  | ¡ d¡ |  g ¡ W d   ƒ d S 1 s?w   Y  d S ©Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   rí  rè  Úconfig4r   r   rT  Ú	exceptionrý   ÚstdoutÚseekrO   rM   r\   rï  r@   r@   rA   Útest_config4_okï  s   
ÿ
ÿ"õzConfigFileTest.test_config4_okc                 C   ó   | j | jd d S ©N)rã  ©rü  Úconfig5r_   r@   r@   rA   Útest_config5_okþ  ó   zConfigFileTest.test_config5_okc                 C   r  r  )rü  Úconfig6r_   r@   r@   rA   Útest_config6_ok  r  zConfigFileTest.test_config6_okc                 C   óJ  t  ¡ ;}|  | j¡ t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ n1 sBw   Y  t  ¡ P}|  | j¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ d S 1 sžw   Y  d S ©Nrø  zcompiler-hyphenated)rù  rë  )rj   rn   r7  úcompiler.lexer))rr   ro   )rl   rq   )rr   rs   )rl   rt   )r   rí  rè  Úconfig1ar   r   r}   r`   r{   Úcriticalr\   Úconfig7r  r   ©r>   rð  rÜ   Z
hyphenatedr@   r@   rA   Útest_config7_ok  ó6   



üí



û"ìzConfigFileTest.test_config7_okc                 C   s    dd„ }|   ¡ 1 t dd¡\}}t |¡ tjdkr!| dd¡}| jj|d}|  	|¡ |  	|¡ W d   ƒ n1 s<w   Y  t
jjd	 }|  |||¡ d S )
Nc                 S   ó   |   ¡  t |¡ d S rÉ   ©rC   r  Úremove©Úh1r  r@   r@   rA   Úcleanup1  ó   z/ConfigFileTest.test_config8_ok.<locals>.cleanupr)  útest_logging-X-r  ú\z\\)rÿ   r   )Úcheck_no_resource_warningrÿ   r   r  rC   r?   ÚreplaceÚconfig8rš  rè  r   Úrootr:   r”   )r>   r"  r  r  r(  r¡   r@   r@   rA   Útest_config8_ok/  s   



ôzConfigFileTest.test_config8_okc                 C   sZ   |   | j¡ t d¡}|  |j¡ |   | j¡ |  |j¡ | j | jdd |  |j¡ d S )NZsome_pristine_loggerF)Údisable_existing_loggers)rè  Údisable_testr   r   r  r   r=   ©r>   rÜ   r@   r@   rA   Útest_logger_disablingF  s   
z$ConfigFileTest.test_logger_disablingc                 C   s*   d}|   |¡ |  t ¡ jd jd¡ d S )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è  rO   r   r   r:   r?   )r>   Ztest_configr@   r@   rA   Útest_config_set_handler_namesO  s   
z,ConfigFileTest.test_config_set_handler_namesc                 C   s‚   t  d¡ ¡ }tjddd\}}z*t || d¡¡ t |¡ t	j
j|dtddd	d
dddœidd W t |¡ dS t |¡ w )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Úasciiró   r]   Fré   z5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)rš  ÚdatefmtÚclass)Úversionr+  Ú
formatters)rõ   ÚdefaultsN)rá  râ  Ústriprÿ   r   r  rW  ÚencoderC   r   rã  rä  Údictr  )r>   Zinir  r  r@   r@   rA   Ú!test_defaults_do_no_interpolationg  s,   í
ýÿýýz0ConfigFileTest.test_defaults_do_no_interpolationN)!rb   rc   rd   re   r   r&  rL   rî  Úconfig1r  r'  r   r  r  r  r  r  r(  r,  rè  rñ  rõ  rü  r  r  r  r  r  r  r*  r.  r0  r=  r@   r@   r@   rA   rß  ³  sB      ëë*&+	rß  c                   @   s@   e Zd ZdZeZdZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ ZdS )ÚSocketHandlerTestzTest for SocketHandler objects.©rü   r   c              
   C   sâ   t  | ¡ d | _ | _| _z|  | j| jd¡ | _}| ¡  W n t	y6 } z
|| _W Y d}~dS d}~ww |j
 ¡  tjj}t|jtƒrN|d|jƒ| _n||jdƒ| _d| _| j | jjd ¡ | j | j¡ t d¡| _dS )ztSet up a TCP server to receive log messages, and a SocketHandler
        pointing to that server's address and port.Nç{®Gáz„?rü   r   r   )r   rB   r—  Ú	sock_hdlrÚserver_exceptionÚserver_classÚaddressÚhandle_socketr0  r  rŒ  rF  r   r:   ZSocketHandlerÚ
isinstanceÚserver_addressrT   rt  Ú
log_outputr+   rD   r<   r-  Ú	Semaphorer½  ©r>   r—  r   Zhclsr@   r@   rA   rB   ›  s*   

ÿ€þ
zSocketHandlerTest.setUpc              	   C   s\   z'| j r| j | j ¡ | j  ¡  | jr | j ¡  W t | ¡ dS W t | ¡ dS t | ¡ w )zShutdown the TCP server.N)rB  r+   rD   rC   r—  rŠ  r   rI   r_   r@   r@   rA   rI   µ  s   
ýzSocketHandlerTest.tearDownc                 C   sž   |j }	 | d¡}t|ƒdk rd S t d|¡d }| |¡}t|ƒ|k r5|| |t|ƒ ¡ }t|ƒ|k s$t |¡}t |¡}|  j	|j
d 7  _	| j ¡  q)NTr  ú>Lr   Ú
)Ú
connectionÚrecvrP   ÚstructÚunpackÚpickleÚloadsr   r¯   rI  rø   r½  r?  )r>   ÚrequestÚconnÚchunkÚslenÚobjrª   r@   r@   rA   rF  À  s   

ÿ


õzSocketHandlerTest.handle_socketc                 C   sV   | j r	|  | j ¡ t d¡}| d¡ | j ¡  | d¡ | j ¡  |  | j	d¡ d S )NZtcpr™   Úeggsú
spam
eggs
)
rC  ÚskipTestr   r   r{   r½  r>  r~   rO   rI  r-  r@   r@   rA   Útest_outputÏ  s   




zSocketHandlerTest.test_outputc                 C   s–   | j r	|  | j ¡ d| j_| j ¡  ztdƒ‚ ty%   | j d¡ Y nw | j 	d¡ t
 
¡ }|  | jj|¡ t
 | jj| d ¡ | j 	d¡ d S )Ng      @zDeliberate mistakez
Never sentzNever sent, eitherr¸  zNor this)rC  r[  rB  Z
retryStartr—  rŠ  rT  r+   r  r{   r!  rJ  Z	retryTimer#  )r>   Únowr@   r@   rA   Útest_noserverÚ  s   
ÿzSocketHandlerTest.test_noserverN)rb   rc   rd   re   r¢  rD  rE  rB   rI   rF  r\  r^  r@   r@   r@   rA   r?  ”  s    r?  c                  C   s*   t jddd\} }t | ¡ t |¡ |S )Nr1  z.sockr2  )rÿ   r   r  rC   r  )r  r  r@   r@   rA   Ú_get_temp_domain_socketí  s   

r_  zUnix sockets requiredc                   @   ó.   e Zd ZdZeedƒreZdd„ Zdd„ Z	dS )ÚUnixSocketHandlerTestz)Test for SocketHandler with unix sockets.r°  c                 C   ó   t ƒ | _t | ¡ d S rÉ   )r_  rE  r?  rB   r_   r@   r@   rA   rB   ý  ó   zUnixSocketHandlerTest.setUpc                 C   ó   t  | ¡ t | j¡ d S rÉ   )r?  rI   r   r  rE  r_   r@   r@   rA   rI     ó   
zUnixSocketHandlerTest.tearDownN)
rb   rc   rd   re   rP  rr  r²  rD  rB   rI   r@   r@   r@   rA   ra  õ  ó    
ra  c                   @   ó8   e Zd ZdZeZdZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dS )ÚDatagramHandlerTestzTest for DatagramHandler.r@  c              
   C   sà   t  | ¡ d | _ | _| _z|  | j| jd¡ | _}| ¡  W n t	y6 } z
|| _W Y d}~dS d}~ww |j
 ¡  tjj}t|jtƒrN|d|jƒ| _n||jdƒ| _d| _| j | jjd ¡ | j | j¡ t ¡ | _dS )zvSet up a UDP server to receive log messages, and a DatagramHandler
        pointing to that server's address and port.NrA  rü   r   r   )r   rB   r—  rB  rC  rD  rE  Úhandle_datagramr0  r  rŒ  rF  r   r:   ZDatagramHandlerrG  rH  rT   rt  rI  r+   rD   r<   r-  rL  r½  rK  r@   r@   rA   rB     s*   

ÿ€þ
zDatagramHandlerTest.setUpc              	   C   ó\   z'| j r	| j  ¡  | jr | j | j¡ | j ¡  W t | ¡ dS W t | ¡ dS t | ¡ w )zShutdown the UDP server.N)r—  rŠ  rB  r+   rD   rC   r   rI   r_   r@   r@   rA   rI   '  ó   
üzDatagramHandlerTest.tearDownc                 C   sT   t  dd¡}|jt|ƒd … }t |¡}t |¡}|  j|j	d 7  _| j
 ¡  d S )NrL  r   rM  )rP  ÚpackÚpacketrP   rR  rS  r   r¯   rI  rø   r½  rE  )r>   rT  rW  rm  rX  rª   r@   r@   rA   ri  2  s   

z#DatagramHandlerTest.handle_datagramc                 C   s`   | j r	|  | j ¡ t d¡}| d¡ | j ¡  | j ¡  | d¡ | j ¡  |  | j	d¡ d S )NZudpr™   rY  rZ  )
rC  r[  r   r   r{   r½  rF  rE   rO   rI  r-  r@   r@   rA   r\  :  s   





zDatagramHandlerTest.test_outputN©rb   rc   rd   re   r«  rD  rE  rB   rI   ri  r\  r@   r@   r@   rA   rh    s    rh  c                   @   r`  )ÚUnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.r°  c                 C   rb  rÉ   )r_  rE  rh  rB   r_   r@   r@   rA   rB   N  rc  zUnixDatagramHandlerTest.setUpc                 C   rd  rÉ   )rh  rI   r   r  rE  r_   r@   r@   rA   rI   S  re  z UnixDatagramHandlerTest.tearDownN©
rb   rc   rd   re   rP  rr  r¶  rD  rB   rI   r@   r@   r@   rA   ro  F  rf  ro  c                   @   rg  )ÚSysLogHandlerTestz!Test for SysLogHandler using UDP.r@  c              
   C   sæ   t  | ¡ d | _ | _| _z|  | j| jd¡ | _}| ¡  W n t	y6 } z
|| _W Y d}~dS d}~ww |j
 ¡  tjj}t|jtƒrR||jd |jfƒ| _n||jƒ| _d| _| j | jjd ¡ | j | j¡ t ¡ | _dS )ztSet up a UDP server to receive log messages, and a SysLogHandler
        pointing to that server's address and port.NrA  r   ó    )r   rB   r—  Úsl_hdlrrC  rD  rE  ri  r0  r  rŒ  rF  r   r:   r
  rG  rH  rT   rt  rI  r+   rD   r<   r-  rL  r½  rK  r@   r@   rA   rB   ^  s*   

ÿ€þ
zSysLogHandlerTest.setUpc              	   C   rj  )zShutdown the server.N)r—  rŠ  rs  r+   rD   rC   r   rI   r_   r@   r@   rA   rI   x  rk  zSysLogHandlerTest.tearDownc                 C   s   |j | _| j ¡  d S rÉ   )rm  rI  r½  rE  )r>   rT  r@   r@   rA   ri  ƒ  r#  z!SysLogHandlerTest.handle_datagramc                 C   sª   | j r	|  | j ¡ t d¡}| d¡ | j ¡  |  | jd¡ | j 	¡  d| j
_| d¡ | j ¡  |  | jd¡ | j 	¡  d| j
_| d¡ | j ¡  |  | jd¡ d S )NZslhõ   spÃ¤ms
   <11>spÃ¤m Fs	   <11>spÃ¤mu   hÃ¤m-s   <11>hÃ¤m-spÃ¤m)rC  r[  r   r   r{   r½  rF  rO   rI  rE   rs  Z
append_nulÚidentr-  r@   r@   rA   r\  ‡  s    








zSysLogHandlerTest.test_outputNrn  r@   r@   r@   rA   rq  W  s    rq  c                   @   r`  )ÚUnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.r°  c                 C   rb  rÉ   )r_  rE  rq  rB   r_   r@   r@   rA   rB   ¢  rc  zUnixSysLogHandlerTest.setUpc                 C   rd  rÉ   )rq  rI   r   r  rE  r_   r@   r@   rA   rI   §  re  zUnixSysLogHandlerTest.tearDownNrp  r@   r@   r@   rA   rv  š  rf  rv  z$IPv6 support required for this test.c                       s4   e Zd ZdZeZdZ‡ fdd„Z‡ fdd„Z‡  Z	S )ÚIPv6SysLogHandlerTestz&Test for SysLogHandler with IPv6 host.)z::1r   c                    ó   t j| j_tt| ƒ ¡  d S rÉ   )rr  ÚAF_INET6rD  r´  r8  rw  rB   r_   r<  r@   rA   rB   ´  r‘   zIPv6SysLogHandlerTest.setUpc                    rx  rÉ   )rr  ÚAF_INETrD  r´  r8  rw  rI   r_   r<  r@   rA   rI   ¸  r‘   zIPv6SysLogHandlerTest.tearDown)
rb   rc   rd   re   r«  rD  rE  rB   rI   rA  r@   r@   r<  rA   rw  «  s    rw  c                   @   r–   )	ÚHTTPHandlerTestzTest for HTTPHandler.c                 C   s   t  | ¡ t ¡ | _dS )ztSet up an HTTP server to receive log messages, and a HTTPHandler
        pointing to that server's address and port.N)r   rB   r-  rL  r½  r_   r@   r@   rA   rB   ¿  s   
zHTTPHandlerTest.setUpc                 C   sn   |j | _ t|jƒ| _| j dkr'zt|jd ƒ}|j |¡| _W n   d | _Y | 	d¡ | 
¡  | j ¡  d S )Nrú   zContent-LengthéÈ   )Úcommandr   r  Úlog_dataÚintZheadersZrfilerV   Ú	post_dataZsend_responseZend_headersr½  rE  )r>   rT  Zrlenr@   r@   rA   Úhandle_requestÅ  s   

zHTTPHandlerTest.handle_requestc              	   C   sØ  t  d¡}| j}| | jjd ¡ dD ]Ö}d}|rJzdd l}W n ty*   d }Y n$w tj 	t
¡}tj |d¡}| |j¡}| |¡ |j|d}	nd }d }	t|| jd|d | _}
|
 ¡  |
j ¡  d	|
j }|ok|}t jj|d
||	dd| _d | _| | j¡ dD ]T}|| j_| j ¡  d}| |¡ | j ¡  |  | jjd
¡ |  | j |¡ |dkr´t!| jj"ƒ}nt!| j# $d¡ƒ}|  |d dg¡ |  |d dg¡ |  |d |g¡ qƒ| j %¡  | j | j¡ | j &¡  qd S )NÚhttpr   r(  r@  zkeycert.pem)ZcafilerA  )r  zlocalhost:%dz/frob)ÚfooÚbar)ÚsecureÚcontextZcredentials)rù   rú   rt  rù   ró   r?   ÚfuncNamer\  rø   )'r   r   r+   rD   r:   ÚsslÚImportErrorr  r  ÚdirnameÚ__file__r©   Z
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextr  r  r—  r0  rŒ  rF  Zserver_portr  Zh_hdlrr~  r<   r  r½  rE   r{   rO   r}  r   Úqueryr€  ÚdecoderŠ  rC   )r>   rÜ   r+   r…  ry  rˆ  r  ÚhereZlocalhost_certr†  r—  ÚhostZsecure_clientr  rø   Údr@   r@   rA   r\  Ò  sd   
ÿ
ÿ


ý



ÐzHTTPHandlerTest.test_outputN)rb   rc   rd   re   rB   r  r\  r@   r@   r@   rA   r{  ¼  s
    r{  c                   @   ó0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú
MemoryTestz*Test memory persistence of logger objects.c                 C   s   t  | ¡ i | _dS )z8Create a dict to remember potentially destroyed objects.N)r   rB   Ú
_survivorsr_   r@   r@   rA   rB     s   

zMemoryTest.setUpc                 G   s.   |D ]}t |ƒt|ƒf}t |¡| j|< qdS )zKWatch the given objects for survival, by creating weakrefs to
        them.N)Úidrl  ÚweakrefÚrefr“  )r>   r  rX  Úkeyr@   r@   rA   Ú_watch_for_survival  s   þzMemoryTest._watch_for_survivalc                 C   s`   t  ¡  g }| j ¡ D ]\\}}}|ƒ du r| |¡ q|r.|  dt|ƒd |¡f ¡ dS dS )z;Assert that all objects watched for survival have survived.Nz;%d objects should have survived but have been destroyed: %sz, )ÚgcZcollectr“  rØ   rÁ  rS   rP   r©   )r>   ZdeadZid_Úrepr_r–  r@   r@   rA   Ú_assertTruesurvival  s   

€
ÿÿzMemoryTest._assertTruesurvivalc                 C   sŒ   | j  tj¡ t d¡}|  |¡ | tj¡ | j  |  ¡ ¡ | |  ¡ ¡ |  	dg¡ ~|  
¡  t d¡}| |  ¡ ¡ |  	ddg¡ d S )Nrƒ  )rƒ  r2   rm   )rƒ  r2   rn   )r+   r1   r   rr   r   r˜  r2   r~   r`   r\   r›  )r>   rƒ  r„  r@   r@   rA   Útest_persistent_loggers%  s"   

ÿ

þz"MemoryTest.test_persistent_loggersN)rb   rc   rd   re   rB   r˜  r›  rœ  r@   r@   r@   rA   r’  	  s    r’  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚEncodingTestc              	   C   sê   t  d¡}t dd¡\}}t |¡ d}zSt j|dd}| |¡ z| |¡ W | 	|¡ | ¡  n
| 	|¡ | ¡  w t
|dd}z|  | ¡  ¡ |¡ W | ¡  n| ¡  w W tj |¡rft |¡ d S d S tj |¡rtt |¡ w w )NÚtestr)  ztest_logging-1-u   fooÂ€ró   r6  )r   r   rÿ   r   r  rC   r  r<   r|   rD   r:  rO   rV   Úrstripr  Úisfiler  )r>   rz   r  r  rV  r¡   r±   r@   r@   rA   Útest_encoding_plain_file>  s,   





ÿ
ÿÿz%EncodingTest.test_encoding_plain_filec              	   C   s’   t  d¡}d}t d¡}d|_t ¡ }||dƒ}t  |¡}| |¡ z| 	|¡ W | 
|¡ | ¡  n
| 
|¡ | ¡  w | ¡ }|  |d¡ d S )NrŸ  u   Ð´Ð¾ ÑÐ²Ð¸Ð´Ð°Ð½Ð¸ÑÚcp1251Ústricts   äî ñâèäàíèÿ
)r   r   ÚcodecsÚ	getwriterrõ   r.   ÚBytesIOr3   r<   r|   rD   rC   rM   rO   )r>   rz   ÚmessageZwriter_classr0   Úwriterr¡   r[   r@   r@   rA   Útest_encoding_cyrillic_unicodeX  s    







ÿ
z+EncodingTest.test_encoding_cyrillic_unicodeN)rb   rc   rd   r¢  rª  r@   r@   r@   rA   rž  =  s    rž  c                   @   r  )ÚWarningsTestc              	   C   sè   t  ¡ f t d¡ |  tjd¡ t jdtd t ¡ }t 	|¡}t 
d¡}| |¡ t  d¡ | |¡ | ¡ }| ¡  |  | d¡d¡ t ¡ }t  d	td
d|d¡ | ¡ }| ¡  |  |d¡ W d   ƒ d S 1 smw   Y  d S )NTFÚalways)Úcategoryúpy.warningszI'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/   r3   r   r<   ÚwarnrD   rM   rC   rJ  ÚfindÚshowwarningrO   )r>   r0   rH   rÜ   r[   Za_filer@   r@   rA   Útest_warningsp  s.   






ÿÿ"ìzWarningsTest.test_warningsc                 C   s”   t  ¡ < t d¡ |  tjd¡ t d¡}|  |jg ¡ t  dt	dd¡ |  t
|jƒd¡ |  |jd tj¡ W d   ƒ d S 1 sCw   Y  d S )	NTFr®  r¯  r°  r±  r]   r   )r²  r³  r   r´  r”   r   rO   r:   r¹  r¶  rP   ÚassertIsInstanceÚNullHandlerr-  r@   r@   rA   Útest_warnings_no_handlersˆ  s   


"öz&WarningsTest.test_warnings_no_handlersN)rb   rc   rd   rº  r½  r@   r@   r@   rA   r«  n  s    r«  c                 C   s   t  | |¡S rÉ   )r   r5   )rš  r5  r@   r@   rA   Ú
formatFunc–  ó   r¾  c                   @   s   e Zd Zddd„ZdS )ÚmyCustomFormatterNc                 C   ó   d S rÉ   r@   )r>   Úfmtr5  r@   r@   rA   r9  š  ó   zmyCustomFormatter.__init__rÉ   )rb   rc   rd   r9  r@   r@   r@   rA   rÀ  ™  s    rÀ  c                   C   s   t  ¡ S rÉ   )r   r3   r@   r@   r@   rA   ÚhandlerFunc  rX  rÄ  c                   @   ó   e Zd ZdS )ÚCustomHandlerN©rb   rc   rd   r@   r@   r@   rA   rÆ     ó    rÆ  c                
   @   s  e Zd ZdZejZdZddddiidddd	d
dœiddgdœdœZddddiidddd	d
dœidddgdœiddidœZddddiidddd	d
dœidddiiddgdœdœZ	ddddiidddd	ddœidddgdœiddidœZ
ddddiiddddd
dœidddgdœiddidœZddddiidddd	d
dœidddgdœiddidœZddddiidddd	d
dœidddgdœiddidœZdde d ddœidddd	d
dœid	dgdœdœZdeddœe d ddœeddœdœddd	d
dœdeidœd	dgdœdœZddddiide d dd	d
dœidddgdœiddidœZddddiide d dd	d
dd œidddgdœiddidœZddddiidddd	d
dœid!ddgdœiddidœZdd"dddiidddd	d
dœiddgdœi d#œddid$œZdd%dddiidddd	d
dœiddgdœi d#œddid$œZddddiiddddd
dœidddgdœidd	idœZdd%dddiiddd&iid'œZdd%ddd&iiddd&iid'œZddddiid(d)diidddd	d
d(gd*œiddd(gd+œiddgdœd,œZddddiidddd	d
dœid-dd.idddgdœiddid/œZdddiidddd	d
dœid-dd.idddgdœiddid0œZd1dddiidddd	d
dœid-dd.idddgdœiddid/œZddddiidddd	d
d2d3d4œd5œiddgdœdœZdd6d7d8d9œiddd6d:œd;d<d6d=dd>œd?œd@ddAgdBdCœidDœZ dde d dd"dEœidddd	d
dœidFddgdBdCœidDœZ!dde d dd"dGœidddd	d
dœidFddgdBdCœidDœZ"dde dH dd"dGœidddd	d
dœidFddgdBdCœidDœZ#ddedd"dEœidddd	d
dœidFddgdBdCœidDœZ$dIdJ„ Z%dKdL„ Z&efdMdN„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„ Z9ddtdu„Z:dvdw„ Z;dxdy„ Z<dzd{„ Z=d|d}„ Z>d~d„ Z?d€d„ Z@d‚dƒ„ ZAd„d…„ ZBd†d‡„ ZCdˆd‰„ ZDdŠd‹„ ZEdŒd„ ZFdŽd„ ZGdsS )‘ÚConfigDictTestz)Reading logging config from a dictionary.rà  r]   Úform1rš  z%(levelname)s ++ %(message)sr/  úlogging.StreamHandlerr’   zext://sys.stdout)r6  Ú	formatterr_  r0   rp   ©r_  r:   )r7  r8  r:   r)  rø  r2   r_  )r7  r8  r:   Úloggersr)  zext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)ú()rš  z.formatFunc)rÊ  Zform2Zform3rÏ  )r/  Zhand2z.CustomHandlerzinvalid parameter name)r6  rÌ  r_  r0   rv   r  F)Úcompilerr  )r7  r+  r8  r:   rÎ  r)  Trr   )r7  Zincrementalr:   rÎ  Zfilt1r?   )r6  rÌ  r_  r0   Úfilters)r_  rÑ  )r7  r8  rÑ  r:   rÎ  r)  zcfg://true_formatterszcfg://handler_configs[hand1])r7  Útrue_formattersÚhandler_configsr8  r:   rÎ  r)  )rÒ  rÓ  r8  r:   rÎ  r)  r§   r„  ú!
)rƒ  Ú
terminator)r6  rÌ  r_  r0   r¦   ÚmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)sú$)rš  Ústyle)r6  r_  rÌ  zlogging.handlers.MemoryHandleré   Ú
fileGlobal)r6  ZcapacityrÌ  r+  r_  )rÚ  ÚbufferGlobalÚmymodulerÛ  Útrue)r_  r:   rÇ  )r7  r8  r:   rÎ  )rÏ  rš  ÚvalidateÚmy_test_logger_custom_formatter)r6  rš  rÞ  z.myCustomFormatterc                 C   s   t j |¡ d S rÉ   )r   rã  Z
dictConfig)r>   rå  r@   r@   rA   rè  ‰  r˜  zConfigDictTest.apply_configc                 C   ré  rê  rì  rï  r@   r@   rA   rñ  Œ  rò  zConfigDictTest.test_config0_okc                 C   rö  r÷  rú  rû  r@   r@   rA   rü  ›  rý  zConfigDictTest.test_config1_okc                 C   rþ  rÉ   rÿ  r_   r@   r@   rA   r  ª  r  z#ConfigDictTest.test_config2_failurec                 C   rþ  rÉ   )rë   r1  rè  Úconfig2ar_   r@   r@   rA   Útest_config2a_failure®  r  z$ConfigDictTest.test_config2a_failurec                 C   rþ  rÉ   )rë   r1  rè  Úconfig2br_   r@   r@   rA   Útest_config2b_failure²  r  z$ConfigDictTest.test_config2b_failurec                 C   rþ  rÉ   r  r_   r@   r@   rA   r  ¶  r  z#ConfigDictTest.test_config3_failurec              	   C   ó„   t  ¡ 4}|  | j¡ ztƒ ‚ ty   t d¡ Y nw tj 	d¡ |  
| ¡ d¡ |  g ¡ W d   ƒ d S 1 s;w   Y  d S r  )r   rí  rè  r  rT  r   r  rý   r	  r
  rO   rM   r\   ©r>   rð  r@   r@   rA   r  º  ó   
ÿ
ÿ"õzConfigDictTest.test_config4_okc              	   C   rä  r  )r   rí  rè  Úconfig4arT  r   r  rý   r	  r
  rO   rM   r\   rå  r@   r@   rA   Útest_config4a_okÉ  ræ  zConfigDictTest.test_config4a_okc                 C   r  r  r  r_   r@   r@   rA   r  Ø  r  zConfigDictTest.test_config5_okc                 C   rþ  rÉ   )rë   r1  rè  r  r_   r@   r@   rA   Útest_config6_failureÛ  ó   z#ConfigDictTest.test_config6_failurec                 C   s  t  ¡ /}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ n1 s6w   Y  t  ¡ ;}|  | j
¡ t d¡}|  |j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ d S 1 s}w   Y  d S )Nrø  rù  rë  r7  r  ©rr   rn   ©rl   ro   )r   rí  rè  r>  r   r   r}   r`   r{   r\   r  r=   r   rï  r@   r@   rA   r  Þ  s8   

þýõ


þý"ózConfigDictTest.test_config7_okc                 C   s$  t  ¡ /}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ n1 s6w   Y  t  ¡ I}|  | j
¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	g d¢|d |  	g ¡ W d   ƒ d S 1 s‹w   Y  d S )Nrø  rù  rë  r7  r  )rë  rì  ©rr   rq   ©rl   rs   )r   rí  rè  r>  r   r   r}   r`   r{   r\   r(  r  r   rï  r@   r@   rA   Útest_config_8_okû  s6   

þýõ



û"îzConfigDictTest.test_config_8_okc                 C   r  r  )r   rí  rè  r  r   r   r}   r`   r{   r  r\   Úconfig8ar  r   r  r@   r@   rA   Útest_config_8a_ok  r  z ConfigDictTest.test_config_8a_okc                 C   s²   t  ¡ K}|  | j¡ t d¡}| |  ¡ ¡ | jg |d |  | j	¡ | |  ¡ ¡ | jg |d |  | j
¡ | |  ¡ ¡ | jdg|d W d   ƒ d S 1 sRw   Y  d S )Nrø  r7  rë  )r   rí  rè  Úconfig9r   r   r}   r`   r\   Úconfig9aÚconfig9brï  r@   r@   rA   Útest_config_9_okG  s    

ÿþ"ózConfigDictTest.test_config_9_okc                 C   s¬   t  ¡ H}|  | j¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ | j	ddg|d W d   ƒ d S 1 sOw   Y  d S ©Nrø  rÐ  r  zcompiler.parser.codegen)rp   rk   rì  r7  )
r   rí  rè  Úconfig10r   r   r|   r`   r{   r\   rï  r@   r@   rA   Útest_config_10_okY  s"   




þý"óz ConfigDictTest.test_config_10_okc                 C   s   |   | j¡ d S rÉ   )rü  Úconfig11r_   r@   r@   rA   Útest_config11_okl  r˜  zConfigDictTest.test_config11_okc                 C   rþ  rÉ   )rë   r1  rè  Úconfig12r_   r@   r@   rA   Útest_config12_failureo  rê  z$ConfigDictTest.test_config12_failurec                 C   rþ  rÉ   )rë   r1  rè  Úconfig13r_   r@   r@   rA   Útest_config13_failurer  rê  z$ConfigDictTest.test_config13_failurec                 C   s~   t  ¡ 1}|  | j¡ tjd }|  |jd¡ |  |jd¡ t 	d¡ |  
| ¡  d¡¡ W d   ƒ d S 1 s8w   Y  d S )Nr/  r„  rÔ  ZExclamationzExclamation!
)r   rí  rè  Úconfig14r   r   rO   rƒ  rÕ  r|   r=   rM   r¿  )r>   rð  rH   r@   r@   rA   Útest_config14_oku  s   


"úzConfigDictTest.test_config14_okc                 C   sš   dd„ }|   ¡ . t dd¡\}}t |¡ ddd|dd	œid
dgidœ}|  |¡ |  |¡ W d   ƒ n1 s9w   Y  tjjd }|  	|||¡ d S )Nc                 S   r  rÉ   r  r   r@   r@   rA   r"  €  r#  z0ConfigDictTest.test_config15_ok.<locals>.cleanupr)  r$  r]   rç  zlogging.FileHandlerró   )r6  Úfilenamerõ   r:   ©r7  r:   r)  r   )
r&  rÿ   r   r  rC   rè  r   r)  r:   r”   )r>   r"  r  r  rã  r¡   r@   r@   rA   Útest_config15_ok~  s&   

ýÿÿ÷
ízConfigDictTest.test_config15_okNc              	   C   s
  |  d¡}tj d|¡}| ¡  |j ¡  |j}|j ¡  zVt	 	t	j
t	j¡}| d¡ | d|f¡ t dt|ƒ¡}|| }d}t|ƒ}	|	dkr]| ||d … ¡}
||
7 }|	|
8 }	|	dksH| ¡  W |j d¡ tj ¡  t |¡ d S |j d¡ tj ¡  t |¡ w )Nró   r   g       @rü   rL  )r;  r   rã  Úlistenr0  rŒ  rF  rt  rE   rr  rz  ÚSOCK_STREAMÚ
settimeoutÚconnectrP  rl  rP   ÚsendrC   ZstopListeningr   r‰  )r>   ÚtextZverifyrƒ  rt  rŸ  rW  r[   Z	sentsofarÚleftÚsentr@   r@   rA   Úsetup_via_listenerœ  s4   



ý

þ
z!ConfigDictTest.setup_via_listenerc                 C   s²   t  ¡ K}|  t | j¡¡ t d¡}| |  	¡ ¡ t d¡}| |  	¡ ¡ t d¡}| |  	¡ ¡ t d¡}| 
|  	¡ ¡ | jddg|d W d   ƒ d S 1 sRw   Y  d S rö  )r   rí  r  ÚjsonÚdumpsr÷  r   r   r|   r`   r{   r\   rï  r@   r@   rA   Útest_listen_config_10_ok¸  s"   




þý"óz'ConfigDictTest.test_listen_config_10_okc                 C   s‚   t  ¡ 3}|  t tj¡¡ t d¡}| 	|  
¡ ¡ | |  
¡ ¡ | jddg|d |  g ¡ W d   ƒ d S 1 s:w   Y  d S r÷  )r   rí  r  rá  râ  rß  r>  r   r   r}   r`   r{   r\   rï  r@   r@   rA   Útest_listen_config_1_okË  s   

þý"õz&ConfigDictTest.test_listen_config_1_okc                 C   sž  dd„ }dd„ }t  d¡}t tj¡}t ¡ }|  ||¡ | 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 s6w   Y  | jg |d | jddgd	d
 t ¡  }|  |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 srw   Y  | jddg|d | jddgd	d
 t ¡ &}|  |d d d… |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 s¶w   Y  | jddg|d | jddgd	d
 d S )Nc                 S   rÁ  rÉ   r@   ©Ústuffr@   r@   rA   Úverify_failÛ  rÃ  z6ConfigDictTest.test_listen_verify.<locals>.verify_failc                 S   s   | d d d… S )Nr÷   r@   r  r@   r@   rA   Úverify_reverseÞ  rÓ   z9ConfigDictTest.test_listen_verify.<locals>.verify_reverserø  r7  rù  rë  rÖ   )rW   rë  rì  r÷   rí  rî  )r   r   rá  râ  rß  r>  r   rí  r  r}   r`   r{   r\   )r>   r  r  rÜ   Zto_sendrð  r@   r@   rA   Útest_listen_verifyÙ  sh   

üþý


ûþýþý

ûþýþ
ýz!ConfigDictTest.test_listen_verifyc                 C   rþ  rÉ   )rë   r  rè  Úout_of_orderr_   r@   r@   rA   Útest_out_of_order  rê  z ConfigDictTest.test_out_of_orderc                 C   s\   t  | j¡}d|d d d< |  |¡ t d¡jd }|  |jtj	¡ |  |j
jtj¡ d S )Nz-${asctime} (${name}) ${levelname}: ${message}r8  rÖ  rš  rÜ  r   )r   Údeepcopyr  rè  r   r   r:   r»  r+  rê   rÌ  Ú_styleÚStringTemplateStyle©r>   rã  r¡   r@   r@   rA   Ú#test_out_of_order_with_dollar_style  s   

ÿz2ConfigDictTest.test_out_of_order_with_dollar_stylec                 C   ó.   |   | j¡ t d¡jd }|  |jt¡ d S ©Nrß  r   )rè  Úcustom_formatter_class_validater   r   r:   r»  rÌ  rÜ  ©r>   r¡   r@   r@   rA   Ú)test_custom_formatter_class_with_validate$  ó   z8ConfigDictTest.test_custom_formatter_class_with_validatec                 C   r  r  )rè  Ú custom_formatter_class_validate2r   r   r:   r»  rÌ  rÜ  r   r@   r@   rA   Ú*test_custom_formatter_class_with_validate2)  r"  z9ConfigDictTest.test_custom_formatter_class_with_validate2c                 C   sF   | j  ¡ }d|d d d< |  |¡ t d¡jd }|  |jt¡ d S )Nr×  r8  rÊ  rØ  rß  r   )	r  r   rè  r   r   r:   r»  rÌ  rÜ  r  r@   r@   rA   Ú9test_custom_formatter_class_with_validate2_with_wrong_fmt.  s
   

zHConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmtc                 C   rþ  rÉ   )rë   r  rè  Ú custom_formatter_class_validate3r_   r@   r@   rA   Ú*test_custom_formatter_class_with_validate37  rê  z9ConfigDictTest.test_custom_formatter_class_with_validate3c                 C   rþ  rÉ   )rë   r  rè  Úcustom_formatter_with_functionr_   r@   r@   rA   Ú,test_custom_formatter_function_with_validate:  rê  z;ConfigDictTest.test_custom_formatter_function_with_validatec                 C   sö   dg d¢dddœdddd	gd
gg d¢dœ}t j |¡}|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d	¡ |  | d¡d¡ |  | d¡d¡ | d¡}|  | d¡g d¢¡ |  t|jd¡ |  t|jd¡ |  t|jd¡ d S )N)r]   r§   é   )r  ÚbÚcr   r*  )r  r±   )Úg)rH   rÐ  ÚjrÙ   Úlr   rÓ  )Úozcfg://alistÚp)ZatupleZalistZadictZnest1Znest2Znest3zcfg://atuple[1]r§   zcfg://alist[1]r+  zcfg://nest1[1][0]rH   zcfg://nest2[1][1]zcfg://adict.dzcfg://adict[f]zcfg://nest3r]   zcfg://nosuchzcfg://!zcfg://adict[2])	r   rã  ZBaseConfiguratorrO   ÚconvertÚpoprë   ÚKeyErrorr  )r>   r  ZbcrÚ   r@   r@   rA   Útest_baseconfig=  s&   ú
zConfigDictTest.test_baseconfigc                    s¬   ddl m‰  G ‡ fdd„dtjƒ}ˆ dddgƒ}|dd	gd
}dd||dœiddgdœdœ}t ¡ }|  |¡ t d¡ W d   ƒ n1 sGw   Y  |  | 	¡ d¡ d S )Nr   ©Ú
namedtuplec                       s*   e Zd Z‡ ‡fdd„Z‡ fdd„Z‡  ZS )z1ConfigDictTest.test_namedtuple.<locals>.MyHandlerc                    s   t ƒ j|i |¤Ž || _d S rÉ   )r8  r9  Úresource)r>   r8  r  ræ  )r=  r7  r@   rA   r9  X  s   
z:ConfigDictTest.test_namedtuple.<locals>.MyHandler.__init__c                    s$   | j d| jj› 7  _ tƒ  |¡S ©Nú )rø   r8  Útyper8  rí   rÌ   r<  r@   rA   rí   \  s   z6ConfigDictTest.test_namedtuple.<locals>.MyHandler.emitr@  r@   r6  r<  rA   Ú	MyHandlerW  s    r<  ÚResourcer;  ÚlabelsZmy_typer  )r;  r>  r]   Z	myhandler)rÏ  r8  rr   rÍ  r  zsome logzsome log my_type
)
Úcollectionsr7  r   r3   r   rd  rè  r}   rO   rM   )r>   r<  r=  r8  rã  rf  r@   r6  rA   Útest_namedtupleS  s"   	þÿ
ø


þzConfigDictTest.test_namedtuplec                 C   sŠ   ddddddœidddgdœid	œ}t  d¡}|  |j¡ |  |¡ |  |j¡ |  d
di¡ |  |j¡ |d= |  |¡ |  |j¡ d S )Nr]   FZconsoler2   rË  )r_  r6  r  rÍ  )r7  r+  r:   rÎ  r7  r+  )r   r   r  r   rè  r=   )r>   rã  rÜ   r@   r@   rA   Ú
test_90195r  s,   þÿþÿ÷


zConfigDictTest.test_90195rÉ   )Hrb   rc   rd   re   r   r&  rL   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)  r5  r@  rA  r@   r@   r@   rA   rÉ  £  sŠ   ÿÿüÿ	þñÿÿüÿ	þÿÿëÿÿüÿ	ÿÿþìÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëþÿüÿ	þðþþþ÷üÿùþå#ÿÿüÿ	þÿÿëÿÿûÿ
þÿÿêÿÿüÿ	þÿÿëÿÿüÿ
þû	ÿèÿÿüÿ
þû	ÿèÿÿüÿ	þÿÿëÿÿÿÿøÿÿÿÿøÿÿÿÿûÿ
þÿþå#ÿÿüÿÿþÿÿç!ÿÿüÿÿþÿÿèÿÿüÿÿþÿÿç ÿÿþûÿþíþÿýûúýÿê!ýÿüÿ	ýÿïýÿüÿ	ýÿïýÿüÿ	ýÿïýÿüÿ	ýÿï!+	
>
	rÉ  c                   @   r  )ÚManagerTestc                    sn   g ‰ G ‡ fdd„dt jƒ}t  d ¡}|  t|jt¡ | |¡ | d¡}| d¡ t  d¡ |  	ˆ dg¡ d S )Nc                       s   e Zd Zd‡ fdd„	ZdS )z6ManagerTest.test_manager_loggerclass.<locals>.MyLoggerNc                    s   ˆ   |¡ d S rÉ   ©rÁ  )r>   r_  rø   r  Úexc_infoÚextra©Zloggedr@   rA   Ú_log•  rÓ   z;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._logra   )rb   rc   rd   rG  r@   rF  r@   rA   ÚMyLogger”  s    rH  rŸ  zshould appear in loggedzshould not appear in logged)
r   ÚLoggerÚManagerrë   Ú	TypeErrorÚsetLoggerClassr  r   r|   rO   )r>   rH  ÚmanrÜ   r@   rF  rA   Útest_manager_loggerclass‘  s   




z$ManagerTest.test_manager_loggerclassc                 C   s,   t  d ¡}tƒ }| |¡ |  |j|¡ d S rÉ   )r   rJ  ÚobjectÚsetLogRecordFactoryrO   ÚlogRecordFactory)r>   rM  rY   r@   r@   rA   Útest_set_log_record_factory¡  s   

z'ManagerTest.test_set_log_record_factoryN)rb   rc   rd   rN  rR  r@   r@   r@   rA   rB    s    rB  c                   @   rQ  )ÚChildLoggerTestc                 C   s¦   t  ¡ }t  d¡}t  d¡}| d¡}| d¡}|  |t  d¡¡ |  |t  d¡¡ | d¡}| d¡}| d¡}|  |t  d¡¡ |  |t  d¡¡ |  ||¡ d S )	NÚabczdef.ghiZxyzzuvw.xyzÚdefZghiúabc.defzabc.def.ghi)r   r   ÚgetChildrc  )r>   r²   Úl1Úl2Úc1Úc2Zc3r@   r@   rA   Útest_child_loggers¨  s   






z"ChildLoggerTest.test_child_loggersN)rb   rc   rd   r\  r@   r@   r@   rA   rS  §  rY  rS  c                   @   rÅ  )ÚDerivedLogRecordNrÇ  r@   r@   r@   rA   r]  ¸  rÈ  r]  c                   @   r`  )ÚLogRecordFactoryTestc                 C   sB   G dd„ dt jƒ}t | ¡ |tƒ| _| j | j¡ t  ¡ | _	d S )Nc                   @   r  )z2LogRecordFactoryTest.setUp.<locals>.CheckingFilterc                 S   r[  rÉ   )r  )r>   r  r@   r@   rA   r9  ¿  rÍ   z;LogRecordFactoryTest.setUp.<locals>.CheckingFilter.__init__c                 S   s,   t |ƒ}|| jurd|| jf }t|ƒ‚dS )Nz)Unexpected LogRecord type %s, expected %sT)r;  r  rK  )r>   rª   rƒ  rø   r@   r@   rA   r°   Â  s   
ÿz9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)rb   rc   rd   r9  r°   r@   r@   r@   rA   ÚCheckingFilter¾  ó    r_  )
r   rž   r   rB   r]  r°   r+   rŸ   ÚgetLogRecordFactoryÚorig_factory)r>   r_  r@   r@   rA   rB   ½  s
   

zLogRecordFactoryTest.setUpc                 C   s(   | j  | j¡ t | ¡ t | j¡ d S rÉ   )r+   r    r°   r   rI   r   rP  rb  r_   r@   r@   rA   rI   Ï  s   
zLogRecordFactoryTest.tearDownc                 C   s@   |   t| jj|  ¡ ¡ t t¡ | j |  ¡ ¡ |  	dg¡ d S )N)r)  rl   rm   )
rë   rK  r+   r|   r`   r   rP  r]  r{   r\   r_   r@   r@   rA   Útest_logrecord_classÔ  s   ÿ

ÿz)LogRecordFactoryTest.test_logrecord_classN)rb   rc   rd   rB   rI   rc  r@   r@   r@   rA   r^  »  s    r^  c                   @   s„   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Ze 	e
ejd
ƒd¡dd„ ƒZe 	e
ejd
ƒd¡dd„ ƒZe 	e
ejd
ƒd¡dd„ ƒZdS )ÚQueueHandlerTestrÖ   c                 C   s`   t  | ¡ t d¡| _tj | j¡| _d| _t 	d¡| _
d| j
_| j
 tj¡ | j
 | j¡ d S )Nr÷   ZqueF)r   rB   ÚqueueÚQueuer   r:   ÚQueueHandlerÚque_hdlrr?   r   Ú
que_loggerrÇ  r1   rp   r<   r_   r@   r@   rA   rB   â  s   
zQueueHandlerTest.setUpc                 C   rÈ  rÉ   )rh  rC   r   rI   r_   r@   r@   rA   rI   ì  rÉ  zQueueHandlerTest.tearDownc                 C   s¢   | j  |  ¡ ¡ |  tj| jj¡ | j  |  ¡ ¡ |  tj| jj¡ |  ¡ }| j  |¡ | j ¡ }|  	t
|tjƒ¡ |  |j| j j¡ |  |j|jf|d f¡ d S rÉ   )ri  r~   r`   rë   re  ÚEmptyÚ
get_nowaitr}   r|   r=   rG  r   Ú	LogRecordrO   r?   rø   r  )r>   rø   rV  r@   r@   rA   Útest_queue_handlerð  s   
z#QueueHandlerTest.test_queue_handlerc                 C   sx   |   ¡ }t tj¡}d}|j| j||d}t | j¡}| j 	|¡ | j
 |¡ | j ¡ }|  ||j¡ |  ||j¡ d S )Nz {name} -> {levelname}: {message})r?   Ú	levelnamer¨  )r`   r   r   rp   rš  r?   r5   r6   rh  r8   ri  r|   re  rk  rO   rø   r¨  )r>   rø   rn  Zlog_format_strZformatted_msgrÌ  Z
log_recordr@   r@   rA   Útest_formattingü  s   ÿ
z QueueHandlerTest.test_formattingÚQueueListenerz5logging.handlers.QueueListener required for this testc                 C   s€  t t ¡ ƒ}tj | j|¡}| ¡  z| j 	|  
¡ ¡ | j |  
¡ ¡ | j |  
¡ ¡ W | ¡  n| ¡  w |  |jtjdd¡ |  |jtjdd¡ |  |jtjdd¡ | ¡  t t ¡ ƒ}| tj¡ tjj| j|dd}| ¡  z| j 	|  
¡ ¡ | j |  
¡ ¡ | j |  
¡ ¡ W | ¡  n| ¡  w |  |jtjdd¡ |  |jtjdd¡ |  |jtjd	d¡ | ¡  d S )
Nrk   )rÊ   r¨  rm   rn   T)Zrespect_handler_levelro   rq   rs   )r	   r   ZMatcherr   r:   rp  re  r0  ri  r|   r`   r{   r  rŠ  r=   Úmatchesrp   rl   rj   rC   r1   r  )r>   r¡   Úlistenerr@   r@   rA   Útest_queue_listener	  s6   ÿz$QueueHandlerTest.test_queue_listenerc              
   C   s¼   t j | j| j¡}| ¡  zdd  W n ty1 } z|}| jj|  	¡ |d W Y d }~nd }~ww | jj
|  	¡ dd | ¡  |  | j ¡  ¡  d¡d¡ |  | j ¡  ¡  d¡d¡ d S )Nr]   r   ©rD  T©Ú
stack_infoZ	TracebackZStack)r   r:   rp  re  r4   r0  ÚZeroDivisionErrorri  r  r`   r{   rŠ  rO   r0   rM   r:  r…  )r>   rr  r   Úexcr@   r@   rA   Ú&test_queue_listener_with_StreamHandler,  s    €þ z7QueueHandlerTest.test_queue_listener_with_StreamHandlerc                 C   sd   | j  | j¡ | j | j¡ tj | j	| j ¡}| 
¡  | j d¡ | ¡  |  | j ¡  ¡ d¡ d S )Nr{   zque -> ERROR: error)rh  r8   r7   ri  r<   r4   r   r:   rp  re  r0  r{   rŠ  rO   r0   rM   r:  )r>   rr  r@   r@   rA   Ú*test_queue_listener_with_multiple_handlers<  s   z;QueueHandlerTest.test_queue_listener_with_multiple_handlersN)rb   rc   rd   rL   rB   rI   rm  ro  rO  Ú
skipUnlessrP  r   r:   rs  ry  rz  r@   r@   r@   rA   rd  Þ  s$    
ÿ
!ÿ
ÿrd  rp  )Úpatchc                   @   sl   e Zd ZdZdZedd„ ƒZe e	j
jd¡dd„ ƒZe e	j
jd¡dd	„ ƒZed
d„ ƒZdd„ Zdd„ ZdS )ÚQueueListenerTestz~
        Tests based on patch submitted for issue #27930. Ensure that
        QueueListener handles all log messages.
        é   c                 C   s”   t  d| ¡}| t j¡ t j | ¡}| |¡ t j | ¡}| ¡  | 	d¡ | 	d¡ | 	d¡ | 	d¡ | 	d¡ | 
¡  | |¡ | ¡  dS )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.
            ztest_logger_with_id_%sÚoneÚtwoZthreeZfourZfiveN)r   r   r1   r2   r:   rg  r<   rp  r0  r}   rŠ  rD   rC   )Ú	log_queueru  rÜ   r¡   rr  r@   r@   rA   Úsetup_and_logU  s   






zQueueListenerTest.setup_and_logr  c                 C   sJ   t | jƒD ]}t ¡ }|  |d|  ¡ |f ¡ q|  |jd| j d¡ d S ©Nú%s_%srÙ  z&correct number of handled log messages)r   Úrepeatre  rf  r‚  r”  rO   Ú
call_count©r>   Zmock_handlerÐ  r  r@   r@   rA   Ú#test_handle_called_with_queue_queuem  s   ÿz5QueueListenerTest.test_handle_called_with_queue_queuec                 C   sb   t  ¡  t| jƒD ]}t ¡ }|  |d|  ¡ |f ¡ | ¡  | 	¡  q	|  
|jd| j d¡ d S rƒ  )r   Ú*skip_if_broken_multiprocessing_synchronizer   r…  Úmultiprocessingrf  r‚  r”  rC   r‰  rO   r†  r‡  r@   r@   rA   Ú test_handle_called_with_mp_queueu  s   
ÿz2QueueListenerTest.test_handle_called_with_mp_queuec                 c   s*    z	 |   ¡ V  q tjy   g  Y S w rÉ   )rk  re  rj  )r  r@   r@   rA   Úget_all_from_queue‚  s   €
ÿÿz$QueueListenerTest.get_all_from_queuec                 C   s†   t  ¡  t| jƒD ]7}t ¡ }|  |d|  ¡ |f ¡ t|  	|¡ƒ}| 
¡  | ¡  g tjjjgg}|  ||ddd„ |D ƒ ¡ q	dS )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: %sc                 S   s"   g | ]}t |tjƒr|jn|‘qS r@   )rG  r   rl  rø   )rÏ  r   r@   r@   rA   rÑ  Ÿ  s
    ÿÿzJQueueListenerTest.test_no_messages_in_queue_after_stop.<locals>.<listcomp>N)r   r‰  r   r…  rŠ  rf  r‚  r”  ÚlistrŒ  rC   r‰  r   r:   rp  Ú	_sentinelre  )r>   rÐ  re  rØ   rY   r@   r@   rA   Ú$test_no_messages_in_queue_after_stopŠ  s    	ÿÿÿ÷z6QueueListenerTest.test_no_messages_in_queue_after_stopc                 C   s\   t  ¡ }tj |¡}| ¡  | ¡  |  t¡ | 	¡  W d   ƒ d S 1 s'w   Y  d S rÉ   )
re  rf  r   r:   rp  r0  rŠ  rë   r  Ú	task_done)r>   r  rr  r@   r@   rA   Útest_calls_task_done_after_stop¢  s   
"þz1QueueListenerTest.test_calls_task_done_after_stopN)rb   rc   rd   re   r…  Ústaticmethodr‚  r|  rO  r   r:   rp  rˆ  r‹  rŒ  r  r‘  r@   r@   r@   rA   r}  M  s    



r}  c                   @   s    e Zd Zdd„ ZeZdd„ ZdS )ÚUTCc                 C   s   t S rÉ   )ÚZERO©r>   Údtr@   r@   rA   Ú	utcoffset°  rÃ  zUTC.utcoffsetc                 C   s   dS )Nr“  r@   r•  r@   r@   rA   Útznameµ  rÃ  z
UTC.tznameN)rb   rc   rd   r—  Údstr˜  r@   r@   r@   rA   r“  ¯  s    r“  c                   @   rQ  )ÚAssertErrorMessagec              
   O   sV   z| j dg|¢R i |¤Ž W d S  |y* } z|  |t|ƒ¡ W Y d }~d S d }~ww )Nr@   )rë   rO   rÎ  )r>   r  r¨  r  ræ  r   r@   r@   rA   Úassert_error_message¼  s   €ÿz'AssertErrorMessage.assert_error_messageN)rb   rc   rd   r›  r@   r@   r@   rA   rš  º  r¤  rš  c                   @   sf   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚFormatterTestc              	   C   s8   dt jtj ddd¡dd d dddœ| _d	d	d
ii| _d S )Nzformatter.testr  Útoz	dummy.extr±  zMessage with %d %s)r§   Zplaceholders)r?   r_  ÚpathnameÚlinenorD  Úfuncrø   r  ÚcustomiÒ  )r   r2   r  r  r©   ÚcommonÚvariantsr_   r@   r@   rA   rB   Ã  s   øÿ
ÿzFormatterTest.setUpNc                 C   s,   t | jƒ}|d ur| | j| ¡ t |¡S rÉ   )r<  r¢  rF   r£  r   r¯   )r>   r?   Úresultr@   r@   rA   Ú
get_recordÔ  s   

zFormatterTest.get_recordc                 C   s˜   |   ¡ }t d¡}|  | |¡d¡ t d¡}|  t|j|¡ |  | ¡ ¡ t d¡}|  	| ¡ ¡ t d¡}|  	| ¡ ¡ t d¡}|  	| ¡ ¡ d S )Nz${%(message)s}z${Message with 2 placeholders}z
%(random)sú%(asctime)sz%(asctime)-15sz%(asctime)#15s©
r¥  r   r5   rO   rš  rë   r  r  ÚusesTimer=   ©r>   r²   r±   r@   r@   rA   Útest_percentÚ  s   




zFormatterTest.test_percentc                 C   sº   |   ¡ }tjddd}|  | |¡d¡ tjddd}|  t|j|¡ tjddd}|  | ¡ ¡ tjddd}|  	| ¡ ¡ tjddd}|  	| ¡ ¡ tjd	dd}|  	| ¡ ¡ d S )
Nz$%{message}%$ú{©rØ  ú$%Message with 2 placeholders%$z{random}z	{message}ú	{asctime}z{asctime!s:15}z{asctime:15}r§  r©  r@   r@   rA   Útest_bracesé  s   zFormatterTest.test_bracesc                 C   s  |   ¡ }tjddd}|  | |¡d¡ tjddd}|  | |¡d¡ tjddd}|  | |¡d¡ tjddd}|  t|j|¡ |  | ¡ ¡ tjd	dd}|  	| ¡ ¡ tjd
dd}|  	| ¡ ¡ tjddd}|  | ¡ ¡ tjddd}|  	| ¡ ¡ d S )Nú
${message}r×  r¬  zMessage with 2 placeholdersz$messagez$$%${message}%$$r­  z	${random}z
${asctime}z$asctimez${asctime}--r§  r©  r@   r@   rA   Útest_dollarsù  s$   zFormatterTest.test_dollarsc                 C   s  t  d¡}|  |jd¡ t  d¡}|  |jd¡ t  d¡}|  |jd¡ t  d¡}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jd	dd}|  |jd	¡ t jd
dd}|  |jd
¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ t jddd}|  |jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd ¡ |  tt jd!¡ | jtd"t jd#dd | jtd$t jd%dd |  td&¡ | jtt jd'dd | jtd(t jd)dd | jtd*t jd+dd | jtt jd,dd | jtt jd-dd | jtt jd.dd | jtt jd/dd | jtd0t jd1dd | jtd2t jd3dd | jtt jd4dd | jtt jd5dd | jtt jd6dd | jtt jd7dd | jtt jd8dd | jtt jd9dd | jtt jd:dd | jtt jd;dd | jtt jd<dd | jtd=t jd>dd | jtd=t jd?dd | jtd=t jd@dd | jtd$t jddd | jtt jd%dd | jtd$t jdAdd | jtt jdBdd d S )CNzM%(levelname)-15s - %(message) 5s - %(process)03d - %(module) - %(asctime)*.3sz1%(asctime)*s - %(asctime)*.3s - %(process)-34.33oz%(process)#+027.23Xz
%(foo)#.*gz5$%{message}%$ - {asctime!a:15} - {customfield['key']}r«  r¬  z{process:.2f} - {custom.f:.4f}z{customfield!s:#<30}z{message!r}z{message!s}z{message!a}z{process!r:4.2}z8{process!s:<#30,.12f}- {custom:=+#30,.1d} - {module:^30}z{process!s:{w},.{p}}z{foo:12.{p}}z{foo:{w}.6}z{foo[0].bar[1].baz}z{foo[k1].bar[k2].baz}z{12[k1].bar[k2].baz}z${asctime} - $messager×  z$bar $$z	$bar $$$$z%(asctime)Zz%(asctime)bz%(asctime)*z%(asctime)*3sz%(asctime)_r®  r°  z%(foo)#12.3*fz%(foo)0*.8*fz;invalid format: invalid field name/expression: 'name-thing'z{name-thing}zinvalid format: no fieldsr¦  zinvalid conversion: 'Z'z{asctime!s:#30,15f}z7invalid format: expected ':' after conversion specifierz{asctime!aa:15}z%invalid format: bad specifier: '.2ff'z{process:.2ff}z{process:.2Z}z{process!s:<##30,12g}z{process!s:<#30#,12g}z{process!s:{{w}},{{p}}}z1invalid format: expected '}' before end of stringz{processz7invalid format: Single '}' encountered in format stringzprocess}z{{foo!r:4.2}z{{foo!r:4.2}}z	{foo/bar}z{foo:{{w}}.{{p}}}}z{foo!X:{{w}}.{{p}}}z{foo!a:random}z{foo!a:ran{dom}z{foo!a:ran{d}om}z
{foo.!a:d}z$invalid format: bare '$' not allowedz$bar $$$zbar $zfoo $.rƒ  z	${asctime)r   r5   rO   Ú_fmtrë   r  r›  ©r>   r±   r@   r@   rA   Útest_format_validate  sü   



ýýþýýýýýýýýýz"FormatterTest.test_format_validatec                 C   sÈ   g d¢}g d¢}t ||ƒD ]T\}}tj||ddid}|  ¡ }|  | |¡d¡ |  d¡}|  | |¡d¡ tj||d}|  ¡ }|  t|j|¡ tj||d	did}|  d¡}|  | |¡d¡ qd S )
N)z%(custom)s %(message)sz{custom} {message}z$custom $message)ú%r«  r×  r¡  ZDefault)rØ  r9  z#Default Message with 2 placeholdersz 1234 Message with 2 placeholdersr¬  zNon-existing)rQ   r   r5   r¥  rO   rš  rë   r  )r>   ZfmtsZstylesrÂ  rØ  r±   r²   r@   r@   rA   Útest_defaults_parameter¤  s   

ñz%FormatterTest.test_defaults_parameterc                 C   s   |   ttjd d d¡ d S )NÚx)rë   r  r   r5   r_   r@   r@   rA   Útest_invalid_style¸  s   z FormatterTest.test_invalid_stylec              
   C   s   |   ¡ }t dddddddt¡}t | d ¡ ¡ ¡|_d|_t	 
d¡}tj|_|  | |¡d	¡ |  | |d
¡d¡ | |¡ |  |jd	¡ d S )NéÉ  r  é   é   r*  r   é{   ú%(asctime)s %(message)sz1993-04-21 08:03:00,123z%Y:%dz1993:21)r¥  ÚdatetimeÚutcr!  ÚmktimeÚ
astimezoneÚ	timetupleÚcreatedÚmsecsr   r5   ÚgmtimeÚ	converterrO   Ú
formatTimerš  Úasctime)r>   r²   r–  r±   r@   r@   rA   Ú	test_time»  s   

zFormatterTest.test_timec              
   C   sl   G dd„ dt jƒ}|  ¡ }t ddddddd	t¡}t | d ¡ ¡ ¡|_	|ƒ }tj
|_|  | |¡d
¡ d S )Nc                   @   s   e Zd ZdZdZdS )zDFormatterTest.test_default_msec_format_none.<locals>.NoMsecFormatterNz%d/%m/%Y %H:%M:%S)rb   rc   rd   Údefault_msec_formatÚdefault_time_formatr@   r@   r@   rA   ÚNoMsecFormatterÊ  s    rÌ  r¹  r  rº  r»  r*  r   r¼  z21/04/1993 08:03:00)r   r5   r¥  r¾  r¿  r!  rÀ  rÁ  rÂ  rÃ  rÅ  rÆ  rO   rÇ  )r>   rÌ  r²   r–  r±   r@   r@   rA   Útest_default_msec_format_noneÉ  s   z+FormatterTest.test_default_msec_format_nonec                 C   sX   t jdddd}tdƒD ]}t d¡ t  dd|d	  i¡}| |¡}|  d
|¡ qd S )Nz!{asctime}.{msecs:03.0f} {message}r«  z%Y-%m-%d %H:%M:%S)rÂ  rØ  r5  iÄ	  g-Cëâ6:?rø   z
Message %dr]   z.1000)r   r5   r   r!  r#  r¯   rš  ÚassertNotIn)r>   r±   rÐ  r²   r[   r@   r@   rA   Útest_issue_89047Õ  s   

üzFormatterTest.test_issue_89047rÉ   )rb   rc   rd   rB   r¥  rª  r¯  r±  r´  r¶  r¸  rÉ  rÍ  rÏ  r@   r@   r@   rA   rœ  Â  s    
 rœ  c                   @   r  )ÚTestBufferingFormatterc                 C   ó   dt |ƒ S )Nz[(%d)©rP   ©r>   Úrecordsr@   r@   rA   ÚformatHeaderß  r¿  z#TestBufferingFormatter.formatHeaderc                 C   rÑ  )Nz(%d)]rÒ  rÓ  r@   r@   rA   ÚformatFooterâ  r¿  z#TestBufferingFormatter.formatFooterN)rb   rc   rd   rÕ  rÖ  r@   r@   r@   rA   rÐ  Þ  r`  rÐ  c                   @   r`  )ÚBufferingFormatterTestc                 C   s"   t  ddi¡t  ddi¡g| _d S )Nrø   r  r€  )r   r¯   rÔ  r_   r@   r@   rA   rB   æ  s   
þzBufferingFormatterTest.setUpc                 C   s2   t  ¡ }|  d| g ¡¡ |  d| | j¡¡ d S )Nr   Zonetwo)r   ÚBufferingFormatterrO   rš  rÔ  r³  r@   r@   rA   Útest_defaultì  s   z#BufferingFormatterTest.test_defaultc                 C   sD   t ƒ }|  d| | j¡¡ t d¡}t |ƒ}|  d| | j¡¡ d S )Nz[(2)onetwo(2)]z<%(message)s>z[(2)<one><two>(2)])rÐ  rO   rš  rÔ  r   r5   )r>   r±   Zlfr@   r@   rA   Útest_customñ  s
   
z"BufferingFormatterTest.test_customN)rb   rc   rd   rB   rÙ  rÚ  r@   r@   r@   rA   r×  å  s    r×  c                   @   rQ  )ÚExceptionTestc                 C   sž   | j }tƒ }| |¡ ztdƒ‚   tjddd Y | |¡ | ¡  |jd }|  	|j
 d¡¡ |  	|j
 d¡¡ |  	|j d¡¡ |  	|j d	¡¡ d S )
NrS  ZfailedTru  r   z#Traceback (most recent call last):
z!
RuntimeError: deliberate mistakeúStack (most recent call last):
z,logging.exception('failed', stack_info=True))r+   ÚRecordingHandlerr<   rT  r   r  rD   rC   rÔ  r=   Úexc_textr  r¿  rv  )r>   r²   rH   r@   r@   rA   ro  ù  s   


zExceptionTest.test_formattingN)rb   rc   rd   ro  r@   r@   r@   rA   rÛ  ø  rY  rÛ  c                   @   rQ  )ÚLastResortTestc              	   C   s°  | j }| | j¡ tj}tj}z»t ¡ "}| d¡ |  	| 
¡ d¡ | d¡ |  	| 
¡ d¡ W d   ƒ n1 s9w   Y  d t_t ¡ }| d¡ d}|  	| 
¡ |¡ W d   ƒ n1 s_w   Y  t ¡ }| d¡ |  	| 
¡ d¡ W d   ƒ n1 s€w   Y  d|j_dt_t ¡ }| d¡ |  	| 
¡ d¡ W d   ƒ n1 s¨w   Y  W | | j¡ |t_|t_d S W | | j¡ |t_|t_d S | | j¡ |t_|t_w )NzThis should not appearr   zFinal chance!zFinal chance!
z-No handlers could be found for logger "root"
F)r+   rD   r4   r   Ú
lastResortrb  r   rd  r~   rO   rM   r|   r   ÚemittedNoHandlerWarningr<   )r>   r)  Zold_lastresortZold_raise_exceptionsrf  rø   r@   r@   rA   Útest_last_resort  sJ   


ü

ý

þ

þ
ú
þzLastResortTest.test_last_resortN)rb   rc   rd   râ  r@   r@   r@   rA   rß    rY  rß  c                   @   r  )ÚFakeHandlerc              	   C   s$   dD ]}t | ||  |||¡ƒ qd S )N)r>  ÚflushrC   r?  )ÚsetattrÚrecord_call)r>   Ú
identifierÚcalledr  r@   r@   rA   r9  7  s   ÿzFakeHandler.__init__c                    s   ‡ ‡‡fdd„}|S )Nc                      s   ˆ   d ˆˆ¡¡ d S )Nz{} - {})rÁ  rš  r@   ©rè  rç  Úmethod_namer@   rA   Úinner<  rê  z&FakeHandler.record_call.<locals>.innerr@   )r>   rç  rê  rè  rë  r@   ré  rA   ræ  ;  s   zFakeHandler.record_callN)rb   rc   rd   r9  ræ  r@   r@   r@   rA   rã  5  s    rã  c                       r5  )rÝ  c                    s    t t| ƒj|i |¤Ž g | _d S rÉ   )r8  rÝ  r9  rÔ  )r>   r  ræ  r<  r@   rA   r9  C  s   
zRecordingHandler.__init__c                 C   s   | j  |¡ dS )z&Keep track of all the emitted records.N)rÔ  rÁ  rÌ   r@   r@   rA   r  G  s   zRecordingHandler.handle)rb   rc   rd   r9  r  rA  r@   r@   r<  rA   rÝ  A  s    rÝ  c                       s˜   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Z‡  ZS )"ÚShutdownTestz#Test suite for the shutdown method.c                    s.   t t| ƒ ¡  g | _tj}|  ttd|¡ d S )Nrb  )r8  rì  rB   rè  r   rb  r”   rå  )r>   Zraise_exceptionsr<  r@   rA   rB   P  s   zShutdownTest.setUpc                    s   ‡ fdd„}|S )Nc                      s   ˆ ƒ ‚rÉ   r@   r@   ©r{   r@   rA   rë  X  s   z'ShutdownTest.raise_error.<locals>.innerr@   )r>   r{   rë  r@   rí  rA   Úraise_errorW  s   zShutdownTest.raise_errorc                 C   sb   t d| jƒ}t d| jƒ}t d| jƒ}ttjj|||gƒ}tjt|ƒd g d¢}|  || j¡ d S )Nr   r]   r§   ©Ú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ã  rè  ro  r   r•  r–  r  r  rO   )r>   Zhandler0Zhandler1Zhandler2r:   rY   r@   r@   rA   Útest_no_failure\  s   zShutdownTest.test_no_failurec                 C   sR   t d| jƒ}t|||  |¡ƒ tj |¡g}tjt|ƒd |  	d| jd ¡ d S )Nr   rï  rñ  r÷   )
rã  rè  rå  rî  r   r•  r–  r  r  rO   )r>   r  r{   r¡   r:   r@   r@   rA   Ú_test_with_failure_in_methodl  s
   z)ShutdownTest._test_with_failure_in_methodc                 C   ó   |   dt¡ d S ©Nr>  ©ró  r  r_   r@   r@   rA   Útest_with_ioerror_in_acquireu  r˜  z)ShutdownTest.test_with_ioerror_in_acquirec                 C   rô  ©Nrä  rö  r_   r@   r@   rA   Útest_with_ioerror_in_flushx  r˜  z'ShutdownTest.test_with_ioerror_in_flushc                 C   rô  ©NrC   rö  r_   r@   r@   rA   Útest_with_ioerror_in_close{  r˜  z'ShutdownTest.test_with_ioerror_in_closec                 C   rô  rõ  ©ró  r  r_   r@   r@   rA   Útest_with_valueerror_in_acquire~  r˜  z,ShutdownTest.test_with_valueerror_in_acquirec                 C   rô  rø  rü  r_   r@   r@   rA   Útest_with_valueerror_in_flush  r˜  z*ShutdownTest.test_with_valueerror_in_flushc                 C   rô  rú  rü  r_   r@   r@   rA   Útest_with_valueerror_in_close„  r˜  z*ShutdownTest.test_with_valueerror_in_closec                 C   ó   dt _|  dt¡ d S )NFr>  ©r   rb  ró  Ú
IndexErrorr_   r@   r@   rA   Ú.test_with_other_error_in_acquire_without_raise‡  ó   z;ShutdownTest.test_with_other_error_in_acquire_without_raisec                 C   r   )NFrä  r  r_   r@   r@   rA   Ú,test_with_other_error_in_flush_without_raise‹  r  z9ShutdownTest.test_with_other_error_in_flush_without_raisec                 C   r   )NFrC   r  r_   r@   r@   rA   Ú,test_with_other_error_in_close_without_raise  r  z9ShutdownTest.test_with_other_error_in_close_without_raisec                 C   ó   dt _|  t| jdt¡ d S )NTr>  ©r   rb  rë   r  ró  r_   r@   r@   rA   Ú+test_with_other_error_in_acquire_with_raise“  ó   
ÿz8ShutdownTest.test_with_other_error_in_acquire_with_raisec                 C   r  )NTrä  r  r_   r@   r@   rA   Ú)test_with_other_error_in_flush_with_raise˜  r
  z6ShutdownTest.test_with_other_error_in_flush_with_raisec                 C   r  )NTrC   r  r_   r@   r@   rA   Ú)test_with_other_error_in_close_with_raise  r
  z6ShutdownTest.test_with_other_error_in_close_with_raise)rb   rc   rd   re   rB   rî  rò  ró  r÷  rù  rû  rý  rþ  rÿ  r  r  r  r	  r  r  rA  r@   r@   r<  rA   rì  L  s$    	rì  c                   @   sz   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚModuleLevelMiscTestz)Test suite for some module level methods.c                 C   sš   t jjj}|  |d¡ |  t j|¡ t  d¡ |  t jjjd¡ |  tt jd¡ G dd„ dƒ}|  tt j|ƒ ¡ t  d¡ t  ¡  |  t jjjt j	¡ d S )Nr   éS   Zdoesnotexistsc                   @   rÅ  )z;ModuleLevelMiscTest.test_disable.<locals>._NotAnIntOrStringNrÇ  r@   r@   r@   rA   Ú_NotAnIntOrString²  rÈ  r  ÚWARN)
r   r)  r   rG   rO   r”   rë   r  rK  rj   )r>   Úold_disabler  r@   r@   rA   Útest_disable§  s   


z ModuleLevelMiscTest.test_disableNc                    sÀ   g ‰ t  | td‡ fdd„¡ tƒ }tj |¡ tt|ƒ}|d ur'||d|ƒ n|d|ƒ |  t|j	ƒd¡ |j	d }|  | 
¡ d| ¡ |d urJ|ntt| ¡ ƒ}|  |j|¡ |  ˆ g ¡ d S )NÚbasicConfigc                     s   ˆ   | |f¡S rÉ   rC  )r  Úkw©rè  r@   rA   Ú<lambda>Á  ó    z/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rr]   r   )r   r|  r   rÝ  r)  r<   r'   rO   rP   rÔ  Ú
getMessageÚupperrÊ   )r>   r  r_  Ú	recordingÚ
log_methodrª   Zexpected_levelr@   r  rA   Ú	_test_log¾  s    

ÿ


zModuleLevelMiscTest._test_logc                 C   ó   |   dtj¡ d S ©Nrz   )r  r   rl   r_   r@   r@   rA   Útest_logÖ  r  zModuleLevelMiscTest.test_logc                 C   ó   |   d¡ d S ©Nr~   ©r  r_   r@   r@   rA   Ú
test_debugÙ  rÓ   zModuleLevelMiscTest.test_debugc                 C   r   ©Nr}   r"  r_   r@   r@   rA   Ú	test_infoÜ  rÓ   zModuleLevelMiscTest.test_infoc                 C   r   ©Nr|   r"  r_   r@   r@   rA   Útest_warningß  rÓ   z ModuleLevelMiscTest.test_warningc                 C   r   ©Nr{   r"  r_   r@   r@   rA   Ú
test_errorâ  rÓ   zModuleLevelMiscTest.test_errorc                 C   r   ©Nr  r"  r_   r@   r@   rA   Útest_criticalå  rÓ   z!ModuleLevelMiscTest.test_criticalc                 C   s^   |   ttjt¡ G dd„ dtjƒ}t |¡ |  t ¡ |¡ t tj¡ |  t ¡ tj¡ d S )Nc                   @   rÅ  )z;ModuleLevelMiscTest.test_set_logger_class.<locals>.MyLoggerNrÇ  r@   r@   r@   rA   rH  ë  rÈ  rH  )rë   rK  r   rL  rO  rI  rO   ÚgetLoggerClass)r>   rH  r@   r@   rA   Útest_set_logger_classè  s   
z)ModuleLevelMiscTest.test_set_logger_classc              	      s  g ‰ G ‡ fdd„dt  ¡ ƒ}t  |¡ t  d¡}|  ˆ dg¡ t ¡ }t  |¡}| |¡ zD| 	t j
¡ | d¡ |  | ¡  ¡ d¡ | d¡ | d¡ | 	t j¡ | d¡ |  | ¡ d¡ W | |¡ | ¡  t  t j¡ d S | |¡ | ¡  t  t j¡ w )Nc                       s&   e Zd Zdejf‡ ‡fdd„	Z‡  ZS )z@ModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLoggerrH  c                    s   t ƒ  ||¡ ˆ d¡ d S )NÚinitialized)r8  r9  rÁ  )r>   r?   r_  )r=  r¨  r@   rA   r9  ù  s   zIModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLogger.__init__)rb   rc   rd   r   r’   r9  rA  r@   ©r¨  r<  rA   rH  ø  s    rH  Zjust_some_loggerr.  Zhellor   r   )r   r,  rL  r   rO   r.   r/   r3   r<   r1   r2   r~   rM   r:  Útruncater
  rr   rD   rC   rI  )r>   rH  rÜ   r0   rH   r@   r/  rA   Útest_subclass_logger_cacheô  s.   









þz.ModuleLevelMiscTest.test_subclass_logger_cachec                 C   s>   t  d¡}td|ƒ\}}}| ¡ }|  d|¡ |  d|¡ d S )Na*  
            import logging

            class A:
                def __del__(self):
                    try:
                        raise ValueError("some error")
                    except Exception:
                        logging.exception("exception in __del__")

            a = A()
        ú-czexception in __del__zValueError: some error)rá  râ  r   r  re  ©r>   ÚcodeÚrcÚoutÚerrr@   r@   rA   Útest_logging_at_shutdown  s
   
z,ModuleLevelMiscTest.test_logging_at_shutdownc                 C   sv   t j}|  t j|¡ t d|›d¡}td|ƒ t|dd}|  | 	¡  
¡ d¡ W d   ƒ d S 1 s4w   Y  d S )Na¢  
            import builtins
            import logging

            class A:
                def __del__(self):
                    logging.error("log in __del__")

            # basicConfig() opens the file, but logging.shutdown() closes
            # it at Python exit. When A.__del__() is called,
            # FileHandler._open() must be called again to re-open the file.
            logging.basicConfig(filename=z¸, encoding="utf-8")

            a = A()

            # Simulate the Python finalization which removes the builtin
            # open() function.
            del builtins.open
        r2  ró   r6  zERROR:root:log in __del__)r   ZTESTFNr”   r  rá  râ  r   r:  rO   rV   r   )r>   r  r4  Úfpr@   r@   rA   Útest_logging_at_shutdown_open&  s   
õ
"ÿz1ModuleLevelMiscTest.test_logging_at_shutdown_openc                 C   s>   t  d¡}td|ƒ\}}}| ¡ }|  d|¡ |  |d¡ d S )NzŠ
            import logging

            def rec():
                logging.error("foo")
                rec()

            rec()
        r2  z#Cannot recover from stack overflow.r]   )rá  râ  r   r  rÎ  rO   r3  r@   r@   rA   Útest_recursion_errorE  s
   
	z(ModuleLevelMiscTest.test_recursion_errorrÉ   )rb   rc   rd   re   r  r  r  r#  r%  r'  r)  r+  r-  r1  r8  r:  r;  r@   r@   r@   rA   r  £  s    
r  c                   @   s:   e Zd Zdd„ Zdd„ Zeddd„ƒZdd	„ Zd
d„ ZdS )ÚLogRecordTestc                 C   s6   t  i ¡}t|ƒ}|  | d¡¡ |  | d¡¡ d S )Nz<LogRecord: ú>)r   r¯   rÎ  r=   r  r¿  )r>   r²   r[   r@   r@   rA   Útest_str_repW  s   
zLogRecordTest.test_str_repc                 C   sj   t ƒ }t ¡ }| |¡ ddi}t d|¡ |  |jd j|¡ |  |jd j	d¡ | 
|¡ | ¡  d S )NZlessZmorezless is %(less)sr   zless is more)rÝ  r   r   r<   r|   rc  rÔ  r  rO   r¨  rD   rC   )r>   rH   r²   r  r@   r@   rA   Útest_dict_arg]  s   

zLogRecordTest.test_dict_argNc           	      C   s°   t j}|t _zBdd l}| ¡ j}t  dd| › i¡}t tj	dd ¡ t  dd| › i¡}W d   ƒ n1 s7w   Y  ||j
|j
dœ}W |t _n|t _w |rV| |¡ d S |S )Nr   rø   Zmsg1_rŠ  Zmsg2_)ÚprocessNameúr1.processNameúr2.processName)r   ÚlogMultiprocessingrŠ  Úcurrent_processr?   r¯   r   Z	swap_itemrý   Úmodulesr@  r  )	r—  rC  rU  Zprev_logMultiprocessingÚmpr?   Úr1Úr2Úresultsr@   r@   rA   Ú_extract_logrecord_process_nameh  s"   
ÿþz-LogRecordTest._extract_logrecord_process_namec           	      C   s  dt jv }zy|  tjd¡ d}t i ¡}|  |jd¡ |  d|¡}|  d|d ¡ |  d|d ¡ |  d|d ¡ dd l}| 	¡ \}}|j
| jd	||fd
}| ¡  | ¡ }|  d|d ¡ |  |d |d ¡ |  d|d ¡ | ¡  W |r}dd l}d S d S |r…dd l}w )NrŠ  TÚMainProcessr]   r@  rA  rB  r   r§   r*  )rý   rE  rO   r   rC  r¯   r@  rJ  rŠ  ÚPipeÚProcessr0  rO  ZassertNotEqualr©   )	r>   Zmultiprocessing_importedZLOG_MULTI_PROCESSINGr²   rI  rŠ  Zparent_connZ
child_connr1  r@   r@   rA   Útest_multiprocessing  s4   

þ
ÿ
z"LogRecordTest.test_multiprocessingc                 C   sÂ   t  i ¡}| j}||jƒ ||jƒ ||jƒ ||jƒ t j}t j}t j	}z1dt _dt _dt _	t  i ¡}| j
}||jƒ ||jƒ ||jƒ ||jƒ W |t _|t _|t _	d S |t _|t _|t _	w )NF)r   r¯   ÚassertIsNotNonerÙ  Ú
threadNameÚprocessr@  Ú
logThreadsÚlogProcessesrC  ri  )r>   r²   ZNOT_NONEZlog_threadsZlog_processesZlog_multiprocessingÚNONEr@   r@   rA   Útest_optional¥  s2   









þzLogRecordTest.test_optionalrÉ   )	rb   rc   rd   r>  r?  r’  rJ  rN  rU  r@   r@   r@   rA   r<  V  s    $r<  c                       sö   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd9d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z‡  ZS ):ÚBasicConfigTestz#Test suite for logging.basicConfig.c                    sV   t t| ƒ ¡  tjj| _tj ¡ | _tj	d d … | _
tjj| _|  | j¡ g tj_d S rÉ   )r8  rV  rB   r   r)  r:   r   r   r   r   r    r_  r-   r”   r"  r_   r<  r@   rA   rB   Â  s   

zBasicConfigTest.setUpc                    s<   t jjd d … D ]}t j |¡ | ¡  qtt| ƒ ¡  d S rÉ   )r   r)  r:   rD   rC   r8  rV  rI   rî   r<  r@   rA   rI   Ë  s   
zBasicConfigTest.tearDownc                 C   sJ   t tjd| jƒ tj ¡  tj | j¡ | jtj	d d …< tj 
| j¡ d S )Nr:   )rå  r   r)  r:   r   rE   rF   r   r    r   r1   r-   r_   r@   r@   rA   r"  Ñ  s
   
zBasicConfigTest.cleanupc                 C   s   t  ¡  |  tt jjƒd¡ t jjd }|  |t j¡ |  |jt	j
¡ |j}|  |jjt j¡ |  |j¡ |  |jt j¡ |  t jj| j¡ d S )Nr]   r   )r   r  rO   rP   r)  r:   r»  r3   r0   rý   rf  rÌ  r  r²  ÚBASIC_FORMATri  r5  ÚPercentStyler_  r-   )r>   r¡   rÌ  r@   r@   rA   Útest_no_kwargsØ  s   zBasicConfigTest.test_no_kwargsc                 C   óh   t  ¡ &}tjtjdd t d¡ tj d¡ |  | 	¡  
¡ d¡ W d   ƒ d S 1 s-w   Y  d S )Nr«  ©r0   rØ  úLog an errorr   úERROR:root:Log an error©r   rí  r   r  rý   r	  r{   r
  rO   rM   r:  rå  r@   r@   rA   Útest_strformatstyleì  ó   

ÿ"üz#BasicConfigTest.test_strformatstylec                 C   rZ  )Nr×  r[  r\  r   r]  r^  rå  r@   r@   rA   Útest_stringtemplatestyleô  r`  z(BasicConfigTest.test_stringtemplatestylec                 C   s   dd„ }t jddd |  tt jjƒd¡ t jjd }|  |t j¡ t jdddd	}|  |jj	|jj	¡ |  |jj
|jj
¡ |  |||d¡ d S )
Nc                 S   ó   |   ¡  |  ¡  t |¡ d S rÉ   r  ©r!  Zh2r  r@   r@   rA   r"  þ  ó   z.BasicConfigTest.test_filename.<locals>.cleanupútest.logró   )r  rõ   r]   r   r  r6  )r   r  rO   rP   r)  r:   r»  r  r0   Úmoder?   r”   ©r>   r"  r¡   rY   r@   r@   rA   Útest_filenameü  s   zBasicConfigTest.test_filenamec                 C   sV   dd„ }t jddd t jjd }t  dd¡}|  |jj|jj¡ |  |||d¡ d S )Nc                 S   rb  rÉ   r  rc  r@   r@   rA   r"    rd  z.BasicConfigTest.test_filemode.<locals>.cleanupre  Úwb©r  Úfilemoder   )	r   r  r)  r:   r  rO   r0   rf  r”   rg  r@   r@   rA   Útest_filemode  s   zBasicConfigTest.test_filemodec                 C   s`   t  ¡ }|  |j¡ tj|d |  ttjj	ƒd¡ tjj	d }|  
|tj¡ |  |j|¡ d S )Nr7  r]   r   )r.   r/   r”   rC   r   r  rO   rP   r)  r:   r»  r3   r0   )r>   r0   r¡   r@   r@   rA   Útest_stream  s   zBasicConfigTest.test_streamc                 C   s.   t jdd t jjd j}|  |jjd¡ d S )Nz%(asctime)s - %(message)s)rš  r   )r   r  r)  r:   rÌ  rO   r  r²  ©r>   rÌ  r@   r@   rA   Útest_format&  ó   zBasicConfigTest.test_formatc                 C   s,   t jdd t jjd j}|  |jd¡ d S )Nr„  )r5  r   )r   r  r)  r:   rÌ  rO   r5  rn  r@   r@   rA   Útest_datefmt,  s   zBasicConfigTest.test_datefmtc                 C   s.   t jdd t jjd j}|  |jt j¡ d S )Nr×  r¬  r   )r   r  r)  r:   rÌ  r»  r  r  rn  r@   r@   rA   Ú
test_style2  rp  zBasicConfigTest.test_stylec                 C   sT   t jj}|  t jj|¡ t jdd |  t jjd¡ t jdd |  t jjd¡ d S )Né9   )r_  é:   )r   r)  r_  r”   r1   r  rO   )r>   Ú	old_levelr@   r@   rA   Ú
test_level8  s   zBasicConfigTest.test_levelc                 C   sp   | j }t ¡ g}tj}|ttjd|d |ttjd|d |ttj||d |ttjtjd tjd dd d S )Nre  )r  r0   )r  r:   )r0   r:   )Zloglevelr  rj  )rë   r   r3   rý   rf  r  r  rr   )r>   rë   r:   r0   r@   r@   rA   Útest_incompatibleB  s   

ÿ
ÿ
ÿz!BasicConfigTest.test_incompatiblec                 C   sÒ   t  ¡ t  tj¡t  ¡ g}t  ¡ }|d  |¡ t j|d |  |d t jj	d ¡ |  |d t jj	d ¡ |  |d t jj	d ¡ |  
|d j¡ |  
|d j¡ |  |d j|¡ |  |d j|d j¡ d S )Nr§   )r:   r   r]   )r   r3   rý   r	  r5   r8   r  rc  r)  r:   rO  rÌ  )r>   r:   r±   r@   r@   rA   Útest_handlersQ  s   
ýzBasicConfigTest.test_handlersc                 C   sÚ   t  ¡ }t  ¡ }t |¡g}t |¡g}tjtj|d t d¡ t d¡ t d¡ |  	t
tjjƒd¡ tjtj|dd t d¡ t d¡ t d¡ |  	t
tjjƒd¡ |  	| ¡  ¡ d¡ |  	| ¡  ¡ d	¡ d S )
NrÍ  r·  r}   r~   r]   T)r_  r:   ÚforcezWARNING:root:warnz WARNING:root:warn
INFO:root:info)r.   r/   r   r3   r  rp   r|   r}   r~   rO   rP   r)  r:   rr   rM   r:  )r>   Zold_string_ioZnew_string_ioZold_handlersZnew_handlersr@   r@   rA   Ú
test_forceb  s,   



ÿ


ÿÿzBasicConfigTest.test_forcec                 C   s  z^d}t jd|ddt jd |  tt jjƒd¡ t jjd }|  |t j¡ |  |j	|¡ t  
d¡ W | ¡  tddd	}| ¡  ¡ }W d   ƒ n1 sMw   Y  t d¡ |  |d¡ d S | ¡  tddd	}| ¡  ¡ }W d   ƒ n1 szw   Y  t d¡ |  |d¡ w )
Nró   re  r¤  ú%(message)s©r  rõ   Úerrorsrš  r_  r]   r   õ.   The Ã˜resund Bridge joins Copenhagen to MalmÃ¶r6  ©r   r  r2   rO   rP   r)  r:   r»  r  rõ   r~   rC   r:  rV   r:  r  r  ©r>   rõ   r¡   r±   rV  r@   r@   rA   Útest_encodingw  s6   þÿ
ÿüÿ
ÿzBasicConfigTest.test_encodingc                 C   s  z^d}t jd|ddt jd |  tt jjƒd¡ t jjd }|  |t j¡ |  |j	|¡ t  
d¡ W | ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 sMw   Y  t d¡ |  |d¡ d S | ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 szw   Y  t d¡ |  |d¡ w )Nr4  re  r   r{  r|  r]   r   r~  ró   r6  z*The resund Bridge joins Copenhagen to Malmr  r€  r@   r@   rA   Útest_encoding_errors‹  s.   þÿ
üÿ
z$BasicConfigTest.test_encoding_errorsc                 C   s"  zdd}t jd|dt jd |  tt jjƒd¡ t jjd }|  |t j¡ |  |j	|¡ |  |j
d¡ t  d¡ W | ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 sSw   Y  t d¡ |  |d¡ d S | ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 s€w   Y  t d¡ |  |d¡ w )Nr4  re  r{  )r  rõ   rš  r_  r]   r   Úbackslashreplaceu<   ðŸ˜‚: â˜ƒï¸: The Ã˜resund Bridge joins Copenhagen to MalmÃ¶ró   r6  zL\U0001f602: \u2603\ufe0f: The \xd8resund Bridge joins Copenhagen to Malm\xf6)r   r  r2   rO   rP   r)  r:   r»  r  rõ   r}  r~   rC   r:  rV   r:  r  r  r€  r@   r@   rA   Útest_encoding_errors_defaultž  s.   ÿÿ
üÿ
z,BasicConfigTest.test_encoding_errors_defaultc                    sR  z|d}t jd|d dt jd |  tt jjƒd¡ t jjd }|  |t j¡ |  |j	|¡ |  
|j¡ g ‰ ‡ fdd„}||_t  d	¡ |  ˆ ¡ |  d
ˆ d ¡ W | ¡  tddd}| ¡  ¡ }W d   ƒ n1 skw   Y  t d¡ |  |d¡ d S | ¡  tddd}| ¡  ¡ }W d   ƒ n1 s˜w   Y  t d¡ |  |d¡ w )Nr4  re  r{  r|  r]   r   c                    s    t  ¡ \}}}ˆ  t|ƒ¡ d S rÉ   )rý   rD  rÁ  rÎ  )rª   r&  rÚ   r/  r@   rA   Údummy_handle_errorÂ  s   zEBasicConfigTest.test_encoding_errors_none.<locals>.dummy_handle_errorr~  z:'ascii' codec can't encode character '\xd8' in position 4:ró   r6  r   )r   r  r2   rO   rP   r)  r:   r»  r  rõ   ri  r}  r]  r~   r=   re  rC   r:  rV   r:  r  r  )r>   rõ   r¡   r…  r±   rV  r@   r/  rA   Útest_encoding_errors_none²  s>   þ

ÿÿ
ûÿ
z)BasicConfigTest.test_encoding_errors_noneNc                    sf   g ‰ t j‰‡ ‡‡fdd„}t ˆt d|¡ tt |ƒ}|d ur$||dƒ n|dƒ ˆ ˆ di fg¡ d S )Nc                     s<   ˆƒ  t jj}t j d¡ ˆ t jj|¡ ˆ  | |f¡ d S )Néd   )r   r)  r_  r1   r”   rÁ  )r  r  ru  ©rè  Zold_basic_configr>   r@   rA   Úmy_basic_configÙ  s
   z2BasicConfigTest._test_log.<locals>.my_basic_configr  ztest mer@   )r   r  r   r|  r'   rO   )r>   r  r_  r‰  r  r@   rˆ  rA   r  Ô  s   
zBasicConfigTest._test_logc                 C   r  r  )r  r   rp   r_   r@   r@   rA   r  ë  r  zBasicConfigTest.test_logc                 C   r   r!  r"  r_   r@   r@   rA   r#  î  rÓ   zBasicConfigTest.test_debugc                 C   r   r$  r"  r_   r@   r@   rA   r%  ñ  rÓ   zBasicConfigTest.test_infoc                 C   r   r&  r"  r_   r@   r@   rA   r'  ô  rÓ   zBasicConfigTest.test_warningc                 C   r   r(  r"  r_   r@   r@   rA   r)  ÷  rÓ   zBasicConfigTest.test_errorc                 C   r   r*  r"  r_   r@   r@   rA   r+  ú  rÓ   zBasicConfigTest.test_criticalrÉ   ) rb   rc   rd   re   rB   rI   r"  rY  r_  ra  rh  rl  rm  ro  rq  rr  rv  rw  rx  rz  r  r‚  r„  r†  r  r  r#  r%  r'  r)  r+  rA  r@   r@   r<  rA   rV  ¾  s:    	


"rV  c                       sL   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚLoggerAdapterTestc                    s’   t t| ƒ ¡  tjd d … ‰ tƒ | _tj| _| j 	| j¡ |  
| jj| j¡ |  
| jj¡ ‡ fdd„}|  
|¡ |  
tj¡ tj| jd d| _d S )Nc                      s   ˆ t jd d …< d S rÉ   )r   r   r@   ©Zold_handler_listr@   rA   r"  	  r  z(LoggerAdapterTest.setUp.<locals>.cleanup©rÜ   rE  )r8  rŠ  rB   r   r   rÝ  r  r)  rÜ   r<   r”   rD   rC   r  ry   Úadapter)r>   r"  r<  r‹  rA   rB   ÿ  s   
zLoggerAdapterTest.setUpc              
   C   óº   d}d }zdd  W n t y& } z|}| j || j¡ W Y d }~nd }~ww |  t| jjƒd¡ | jjd }|  |jtj	¡ |  |j
|¡ |  |j| jf¡ |  |j|j||jf¡ d S ©Nztesting exception: %rr]   r   )rw  r  r  r  rO   rP   rÔ  rÊ   r   rl   rø   r  rD  r=  Ú__traceback__©r>   rø   rx  r   rª   r@   r@   rA   Útest_exception  ó"   €þÿz LoggerAdapterTest.test_exceptionc              
   C   s‚   zdd  W n t y } z|}W Y d }~nd }~ww | jjd|d |  t| jjƒd¡ | jjd }|  |j|j||j	f¡ d S )Nr]   r   zexc_info testrt  )
rw  r  r  rO   rP   r  rÔ  rD  r=  r  )r>   r   rx  rª   r@   r@   rA   Útest_exception_excinfo!  s   €ÿÿz(LoggerAdapterTest.test_exception_excinfoc                 C   sh   d}| j  || j¡ |  t| jjƒd¡ | jjd }|  |jtj¡ |  |j	|¡ |  |j
| jf¡ d S )Nzcritical test! %rr]   r   )r  r  r  rO   rP   rÔ  rÊ   r   rj   rø   r  )r>   rø   rª   r@   r@   rA   r+  .  s   zLoggerAdapterTest.test_criticalc                 C   sD   | j jjj}d| j jj_|  t| j jjd|¡ |  | j  d¡¡ d S )Né!   rG   é    )r  rÜ   r   rG   r”   rå  r  ÚisEnabledFor©r>   r  r@   r@   rA   Útest_is_enabled_for8  s   ÿz%LoggerAdapterTest.test_is_enabled_forc                 C   sN   |   | j ¡ ¡ | jjD ]}| j |¡ q|  | j ¡ ¡ |  | j ¡ ¡ d S rÉ   )r=   r  r9   rÜ   r:   rD   r  r   r@   r@   rA   Útest_has_handlers?  s
   z#LoggerAdapterTest.test_has_handlersc                 C   sR  G dd„ dt jƒ}d}|| jd d}||d d}d|_|  t|ƒt|ƒ¡ | t j|| j¡ |  t	| jj
ƒd¡ | jj
d }|  |jt j¡ |  |jd|› ¡ |  |j| jf¡ |j}|  |j|¡ |  | jj|¡ tƒ }z||_|  |j|¡ |  |j|¡ |  | jj|¡ W ||_n||_w |  |j|¡ |  |j|¡ |  | jj|¡ d S )	Nc                   @   rÇ   )z.LoggerAdapterTest.test_nested.<locals>.AdapterÚAdapterc                 S   s   | j › d|› |fS r9  ©r¬   )r>   rø   ræ  r@   r@   rA   rQ  L  ó   z6LoggerAdapterTest.test_nested.<locals>.Adapter.processN)rb   rc   rd   r¬   rQ  r@   r@   r@   rA   r›  I  s    r›  zAdapters can be nested, yo.rŒ  ZAdapterAdapterr]   r   zAdapter AdapterAdapter )r   ry   rÜ   r¬   rO   rl  rz   rj   r  rP   rÔ  rÊ   rø   r  r   rc  rO  )r>   r›  rø   r  Zadapter_adapterrª   Zorig_managerZtemp_managerr@   r@   rA   Útest_nestedH  s2   zLoggerAdapterTest.test_nested)rb   rc   rd   rB   r’  r”  r+  r™  rš  rž  rA  r@   r@   r<  rA   rŠ  þ  s    
	rŠ  c                       sœ   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Z‡  ZS )#Ú
LoggerTestc                    sb   t t| ƒ ¡  tƒ | _tjdd| _| j | j¡ |  	| jj
| j¡ |  	| jj¡ |  	tj¡ d S )NZblah©r?   )r8  rŸ  rB   rÝ  r  r   rI  rÜ   r<   r”   rD   rC   r  r_   r<  r@   rA   rB   l  s   zLoggerTest.setUpc                 C   s,   |   td| jjd ¡ |   td| jjd¡ d S )Nz,Level not an integer or a valid string: Nonez.Level not an integer or a valid string: (0, 0))r   r   )r›  rK  rÜ   r1   r_   r@   r@   rA   Útest_set_invalid_levelu  s   þþz!LoggerTest.test_set_invalid_levelc              
   C   rŽ  r  )rw  rÜ   r  r  rO   rP   rÔ  rÊ   r   rl   rø   r  rD  r=  r  r‘  r@   r@   rA   r’  }  r“  zLoggerTest.test_exceptionc                 C   sH   t  tdd¡ |  t| jjdd¡ W d   ƒ d S 1 sw   Y  d S )Nrb  Trw   útest message)r   Ú	swap_attrr   rë   rK  rÜ   rz   r_   r@   r@   rA   Ú!test_log_invalid_level_with_raiseŽ  s   "ÿz,LoggerTest.test_log_invalid_level_with_raisec                 C   sB   t  tdd¡ | j dd¡ W d   ƒ d S 1 sw   Y  d S )Nrb  Frw   r¢  )r   r£  r   rÜ   rz   r_   r@   r@   rA   Útest_log_invalid_level_no_raise’  s   "ÿz*LoggerTest.test_log_invalid_level_no_raisec                    sP   g ‰ t  | tjd‡ fdd„¡ | jjdd |  tˆ ƒd¡ |  dˆ d ¡ d S )	NÚprint_stackc                    s   ˆ   | ¡ ¡S rÉ   )rÁ  rM   )r±   rç  r  r@   rA   r  ™  r  z=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>Tru  r]   rÜ  r   )r   r|  r   Ú	tracebackrÜ   Ú
findCallerrO   rP   r_   r@   r  rA   Ú test_find_caller_with_stack_info–  s   
ÿz+LoggerTest.test_find_caller_with_stack_infoc                    s  d‰‡‡fdd„‰‡fdd„‰ ‡ fdd„}ˆj j}|ƒ  ˆ |d jd	¡ |d j}ˆd7 ‰|ƒ  ˆ |d jd
¡ ˆ |d j|¡ |d j}ˆd7 ‰|ƒ  ˆ |d jd¡ ˆ |d j|¡ |d j}ˆd7 ‰|ƒ  ˆ |d jd¡ ˆ |d j|¡ d S )Nr]   c                      s   ˆ j jdˆd d S )NrŸ  )Ú
stacklevel)rÜ   r|   r@   )r>   Ú	the_levelr@   rA   Ú	innermost£  r  z>LoggerTest.test_find_caller_with_stacklevel.<locals>.innermostc                      ó
   ˆ ƒ  d S rÉ   r@   r@   )r¬  r@   rA   rë  ¦  rÍ   z:LoggerTest.test_find_caller_with_stacklevel.<locals>.innerc                      r­  rÉ   r@   r@   )rë  r@   rA   Úouter©  rÍ   z:LoggerTest.test_find_caller_with_stacklevel.<locals>.outerr÷   r¬  rë  r®  Ú test_find_caller_with_stacklevel)r  rÔ  rO   r‡  rŸ  rJ  )r>   r®  rÔ  rŸ  r@   )rë  r¬  r>   r«  rA   r¯     s,   


z+LoggerTest.test_find_caller_with_stacklevelc                 C   s†   d}d}d  } } } } } }}	t  |||||||||	¡	}
dt|
j ¡ ƒ D ]}|di}| jt| jj|||||||||	d q(d S )Nú	my recordé   )r¨  rÈ  ú
some value©rE  Úsinfo)	r   Ú_logRecordFactoryrT   Ú__dict__Úkeysrë   r4  rÜ   Ú
makeRecord)r>   r?   r_  r  Úlnorø   r  rD  r   r´  Úrvr—  rE  r@   r@   rA   Ú%test_make_record_with_extra_overwrite¿  s   ÿ
þþz0LoggerTest.test_make_record_with_extra_overwritec                 C   s\   d}d}d  } } } } } }}	ddi}
| j j||||||||
|	d	}|  d|j¡ d S )Nr°  r±  Z	valid_keyr²  r³  )rÜ   r¸  re  r¶  )r>   r?   r_  r  r¹  rø   r  rD  r   r´  rE  r¤  r@   r@   rA   Ú(test_make_record_with_extra_no_overwriteÌ  s   ÿz3LoggerTest.test_make_record_with_extra_no_overwritec                 C   s>   |   | j ¡ ¡ | jjD ]}| j |¡ q|  | j ¡ ¡ d S rÉ   )r=   rÜ   r9   r:   rD   r  r   r@   r@   rA   rš  Õ  s   zLoggerTest.test_has_handlersc                 C   s"   t  d¡}d|_|  | ¡ ¡ d S )Nz
blah.childF)r   r   rÇ  r  r9   )r>   Zchild_loggerr@   r@   rA   Útest_has_handlers_no_propagateÜ  s   
z)LoggerTest.test_has_handlers_no_propagatec                 C   s>   | j jj}d| j j_|  t| j jd|¡ |  | j  d¡¡ d S )Né   rG   é   )rÜ   r   rG   r”   rå  r  r—  r˜  r@   r@   rA   r™  á  s   

zLoggerTest.test_is_enabled_forc                 C   s`   | j j}| j jj}d| j _d| j j_|  t| j d|¡ |  t| j jd|¡ |  | j  d¡¡ d S )NTrº  r   rG   r¿  )rÜ   r   r   rG   r”   rå  r  r—  )r>   Zold_disabledr  r@   r@   rA   Ú#test_is_enabled_for_disabled_loggerç  s   

z.LoggerTest.test_is_enabled_for_disabled_loggerc                 C   s²   t  ¡ }|  |t j¡ |  |t  d ¡¡ |  |t  d¡¡ |  |t  d¡¡ |  |t  d¡j¡ |  |t  d¡j¡ |  |t  d¡j¡ |  |t  d¡¡ |  |t  d¡j¡ d S )Nr   r)  rƒ  úfoo.barú )r   r   rc  r)  ÚparentZassertIsNot)r>   r)  r@   r@   rA   Útest_root_logger_aliasesó  s   z#LoggerTest.test_root_logger_aliasesc                 C   s$   |   ttjt¡ |   ttjd¡ d S )Ns   foo)rë   rK  r   r   Úanyr_   r@   r@   rA   Útest_invalid_names   s   zLoggerTest.test_invalid_namesc                 C   sN   t tjd ƒD ]}dD ]}t |¡}t ||¡}t |¡}|  ||¡ qqd S )Nr]   )r   r)  rƒ  rÁ  zbaz.bar)r   rR  ÚHIGHEST_PROTOCOLr   r   r  rS  rc  )r>   Úprotor?   rÜ   r[   Z	unpickledr@   r@   rA   Útest_pickling  s   

üÿzLoggerTest.test_picklingc                 C   s6  | j }t d¡}t d¡}| tj¡ |  | ¡ tj¡ |  |ji ¡ |  | 	tj¡¡ |  
| 	tj¡¡ |  |jtjdtjdi¡ |  |ji ¡ |  | 	tj¡¡ |  |ji ¡ |  | 	tj¡¡ |  |jtjdi¡ | tj¡ |  | ¡ tj¡ |  |ji ¡ |  
| 	tj¡¡ | tj¡ |  | ¡ tj¡ |  |ji ¡ |  |ji ¡ |  |ji ¡ |  
| 	tj¡¡ |  | 	tj¡¡ |  
| 	tj¡¡ |  | 	tj¡¡ |  | 	tj¡¡ t ¡  |  | ¡ tj¡ |  |ji ¡ |  |ji ¡ |  |ji ¡ |  
| 	tj¡¡ |  
| 	tj¡¡ |  
| 	tj¡¡ d S )NrT  rV  TF)r+   r   r   r1   rl   rO   r,   Ú_cacher=   r—  r  r2   rj   r’   rG   )r>   r)  r)   r*   r@   r@   rA   Útest_caching  sH   

zLoggerTest.test_caching)rb   rc   rd   rB   r¡  r’  r¤  r¥  r©  r¯  r»  r¼  rš  r½  r™  rÀ  rÄ  rÆ  rÉ  rË  rA  r@   r@   r<  rA   rŸ  j  s$    	
	rŸ  c                   @   r‘  )ÚBaseFileTestz1Base class for handler tests that write log filesc                 C   s0   t  | ¡ t dd¡\}| _t |¡ g | _d S )Nr)  ztest_logging-2-)r   rB   rÿ   r   r  r  rC   Úrmfiles)r>   r  r@   r@   rA   rB   H  s   


zBaseFileTest.setUpc                 C   s>   | j D ]}t |¡ qtj | j¡rt | j¡ t | ¡ d S rÉ   )rÍ  r  r  r  r	  r  r   rI   )r>   r  r@   r@   rA   rI   N  s
   
zBaseFileTest.tearDownc                 C   s*   | j tj |¡d| d | j |¡ dS )z7Assert a log file is there and register it for deletionzLog file %r does not exist©rø   N)r=   r  r  r	  rÍ  rÁ  )r>   r  r@   r@   rA   ÚassertLogFileU  s   ÿzBaseFileTest.assertLogFilec              
   C   s   t  dt jdd|  ¡ d d d ¡S )NrÓ  r1  r]   )r   rl  r2   r`   r_   r@   r@   rA   Únext_rec[  s   ÿzBaseFileTest.next_recN)rb   rc   rd   re   rB   rI   rÏ  rÐ  r@   r@   r@   rA   rÌ  E  s    rÌ  c                   @   r  )ÚFileHandlerTestc                 C   sz   t  | j¡ tj| jddd}|  |j¡ |  t j 	| j¡¡ | 
t i ¡¡ |  |j¡ |  t j 	| j¡¡ | ¡  d S )Nró   Trô   )r  r  r  r   r  ri  r0   r  r  r	  r  r¯   rO  r=   rC   )r>   Úfhr@   r@   rA   Ú
test_delay`  s   zFileHandlerTest.test_delayc                 C   s–   t  | j¡ tj| jddd}| t d¡¡ | |  ¡ ¡ | 	¡  | |  ¡ ¡ t
| jƒ}|  | ¡  ¡ d¡ W d   ƒ d S 1 sDw   Y  d S )Nró   r  )rõ   rf  r{  rk   )r  r  r  r   r  r8   r5   rí   rÐ  rC   r:  rO   rV   r:  )r>   rÒ  r9  r@   r@   rA   Ú%test_emit_after_closing_in_write_modej  s   "ÿz5FileHandlerTest.test_emit_after_closing_in_write_modeN)rb   rc   rd   rÓ  rÔ  r@   r@   r@   rA   rÑ  _  s    
rÑ  c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Ze 	¡ dd„ ƒZ
dS )ÚRotatingFileHandlerTestc                 C   s`   t jj| jddd}|  | d ¡¡ | ¡  t jjtjddd}|  | |  	¡ ¡¡ | ¡  d S )Nró   r   ©rõ   ÚmaxBytesr]   )
r   r:   r  r  r  ÚshouldRolloverrC   r  ÚdevnullrÐ  ©r>   Úrhr@   r@   rA   Útest_should_not_rolloverv  s   ÿÿz0RotatingFileHandlerTest.test_should_not_rolloverc                 C   s4   t jj| jddd}|  | |  ¡ ¡¡ | ¡  d S )Nró   r]   rÖ  )r   r:   r  r  r=   rØ  rÐ  rC   rÚ  r@   r@   rA   Útest_should_rollover„  s   z,RotatingFileHandlerTest.test_should_rolloverc                 C   s8   t jj| jdd}| |  ¡ ¡ |  | j¡ | ¡  d S )Nró   r6  )r   r:   r  r  rí   rÐ  rÏ  rC   rÚ  r@   r@   rA   Útest_file_created‰  s   z)RotatingFileHandlerTest.test_file_createdc                 C   sª   dd„ }t jj| jdddd}||_| |  ¡ ¡ |  | j¡ | |  ¡ ¡ |  || jd ƒ¡ | |  ¡ ¡ |  || jd ƒ¡ |  t	j
 || jd	 ƒ¡¡ | ¡  d S )
Nc                 S   ó   | d S ©Nú.testr@   r   r@   r@   rA   Únamer’  rX  z>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namerró   r§   r]   ©rõ   ÚbackupCountr×  ú.1ú.2ú.3)r   r:   r  r  râ  rí   rÐ  rÏ  r  r  r  r	  rC   )r>   râ  rÛ  r@   r@   rA   Útest_rollover_filenames‘  s   
ÿz/RotatingFileHandlerTest.test_rollover_filenamesc                 C   s¬   G dd„ dt jjƒ}|| jdddd}|  | | j¡| jd ¡ | |  ¡ ¡ |  | j¡ | |  ¡ ¡ |  | | jd ¡d	 ¡ |  	t
j | | jd ¡¡¡ | ¡  d S )
Nc                   @   r  )zZRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotatorc                 S   s   |d S rà  r@   )r>   r?   r@   r@   rA   râ  ¢  rX  z`RotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.namerc                 S   s$   t j |¡rt  ||d ¡ d S d S )Nú.rotated)r  r  r	  r'  )r>   ÚsourceÚdestr@   r@   rA   Úrotator¥  s   ÿzbRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.rotatorN)rb   rc   rd   râ  rì  r@   r@   r@   rA   ÚHandlerWithNamerAndRotator¡  r`  rí  ró   r§   r]   rã  rá  rå  ré  )r   r:   r  r  rO   râ  rí   rÐ  rÏ  r  r  r  r	  rC   )r>   rí  rÛ  r@   r@   rA   Útest_namer_rotator_inheritance   s   
ÿz6RotatingFileHandlerTest.test_namer_rotator_inheritancec                 C   sæ  dd„ }dd„ }t jj| jdddd}||_||_|  ¡ }| |¡ |  | j¡ |  ¡ }| |¡ || jd	 ƒ}|  |¡ t	j
}t|d
ƒ}| ¡ }	t |	¡}
|  |
 d¡|j| ¡ W d   ƒ n1 sew   Y  | |  ¡ ¡ || jd ƒ}|  |¡ t|d
ƒ}| ¡ }	t |	¡}
|  |
 d¡|j| ¡ W d   ƒ n1 s¢w   Y  | |  ¡ ¡ || jd ƒ}t|d
ƒ}| ¡ }	t |	¡}
|  |
 d¡|j| ¡ W d   ƒ n1 sÚw   Y  |  t	j || jd ƒ¡¡ | ¡  d S )Nc                 S   rß  )Nz.gzr@   r   r@   r@   rA   râ  µ  rX  z3RotatingFileHandlerTest.test_rotator.<locals>.namerc              	   S   s€   t | dƒ,}| ¡ }t |d¡}t |dƒ}| |¡ W d   ƒ n1 s%w   Y  W d   ƒ n1 s4w   Y  t | ¡ d S )NÚrbrÍ  ri  )r:  rV   ÚzlibÚcompressrW  r  r  )rê  rë  ZsfrV  Ú
compressedÚdfr@   r@   rA   rì  ¸  s   ÿ€ýz5RotatingFileHandlerTest.test_rotator.<locals>.rotatorró   r§   r]   rã  rå  rï  r4  ræ  rç  )r   r:   r  r  rì  râ  rÐ  rí   rÏ  r  Úlinesepr:  rV   rð  Ú
decompressrO   r  rø   r  r  r	  rC   )r>   râ  rì  rÛ  Zm1Zm2r  Únewliner±   rò  rV  r@   r@   rA   Útest_rotator³  sJ   
ÿ



ý

ý
ýz$RotatingFileHandlerTest.test_rotatorN)rb   rc   rd   rÜ  rÝ  rÞ  rè  rî  r   Zrequires_zlibr÷  r@   r@   r@   rA   rÕ  u  s    rÕ  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTimedRotatingFileHandlerTestc                 C   sJ   t jjtjdddd}t d¡ t  ddi¡}|  | 	|¡¡ | 
¡  d S )NÚSró   r]   ©rõ   rä  çš™™™™™ñ?rø   ztesting - device file)r   r:   r  r  rÙ  r!  r#  r¯   r  rØ  rC   )r>   rÒ  r²   r@   r@   rA   rÜ  á  s   
ÿ
z5TimedRotatingFileHandlerTest.test_should_not_rolloverc              	      s¤  t jj| jdddd}t  d¡}| |¡ t  ddi¡}| |¡ |  | j¡ t	 
d¡ t  dd	i¡}| |¡ | ¡  d
}tj ¡ }d}t|ƒD ]"}|tj|d }	| j|	 d¡ ‰ tj ˆ ¡}|rk| j ˆ ¡  nqId| }
|sÉtj | j¡\}‰ ‡ fdd„t |¡D ƒ}td| d¡ tjd td| tjd |D ]*}td| ƒ tj ||¡}t|dƒ}t| ¡ ƒ W d   ƒ n1 sÃw   Y  qž| j||
d d S )Nrù  ró   r]   rú  r½  rø   ztesting - initialrû  ztesting - after delayFi,  ©Zsecondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondsc                    s   g | ]	}|  ˆ ¡r|‘qS r@   )r  )rÏ  r±   ©r  r@   rA   rÑ    s    z>TimedRotatingFileHandlerTest.test_rollover.<locals>.<listcomp>zTest time: %sz%Y-%m-%d %H-%M-%S©rç  zThe only matching files are: %szContents of %s:r²   rÎ  )r   r:   r  r  r5   r8   r¯   rí   rÏ  r!  r#  rC   r¾  r]  r   Ú	timedeltaÚstrftimer  r  r	  rÍ  rÁ  r¨   Úlistdirr2  rý   rf  r©   r:  rV   r=   )r>   rÒ  rÂ  rG  rH  Úfoundr]  ÚGO_BACKÚsecsÚprevrø   ZdnÚfilesr±   r  Ztfr@   rý  rA   Útest_rolloverë  sJ   
ÿ





þÿ€z*TimedRotatingFileHandlerTest.test_rolloverc                 C   sX   | j }|ttjj| jdddd |ttjj| jdddd |ttjj| jdddd d S )NÚXró   Trô   ÚWZW7)rë   r  r   r:   r  r  )r>   rë   r@   r@   rA   Útest_invalid  s   

ÿ

ÿ


ÿz)TimedRotatingFileHandlerTest.test_invalidc              	   C   s€   d}t  ddd¡}tjj| jddddd|d}z#| |¡}|  ||d ¡ | |d	 ¡}|  ||d
 ¡ W | ¡  d S | ¡  w )Nr   é   ró   ÚMIDNIGHTr]   T©rõ   ÚwhenÚintervalrä  r¿  ÚatTimeéÀ¨  éÐ¶  i@ú )	r¾  r!  r   r:   r  r  ÚcomputeRolloverrO   rC   )r>   ÚcurrentTimer  rÛ  rX   r@   r@   rA   Ú"test_compute_rollover_daily_attime  s   þ
z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec           	   
   C   s8  t t ¡ ƒ}||d  }t ddd¡}t |¡j}tdƒD ]|}tjj| j	dd| ddd|d	}ze||kr;d| | }n|| }|d9 }|d
7 }||7 }| 
|¡}||krbtdtj ƒ tdtƒ  ƒ |  ||¡ ||krp|d7 }| 
|d ¡}||kr‰tdtj ƒ tdtƒ  ƒ |  ||¡ W | ¡  q| ¡  w d S )Né€Q r  r   é   ró   zW%dr]   Tr  r  zfailed in timezone: %dzlocal vars: %si€:	 r  )r  r!  r¾  rÅ  Útm_wdayr   r   r:   r  r  r  r2  ÚtimezoneÚlocalsrO   rC   )	r>   r  Ztodayr  ZwdayZdayrÛ  rY   rX   r@   r@   rA   Ú#test_compute_rollover_weekly_attime.  s<   þ
áz@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimec              	   C   sô  t jdd}|  tj|¡ g }tj ¡ }tdƒD ]}| | 	d¡¡ |tj
dd7 }qd}g }g }|D ]B}tj |d| ¡}	tjj|	d	dd
dd}
| |
¡ | d¡rb|D ]}| d||f ¡ qUq3dd„ |
_|D ]}| d||f ¡ qiq3|D ]}tj ||¡}	t|	dƒ}W d   ƒ n1 s‘w   Y  qxt|ƒD ]\\}}|| }
|
 ¡ }|  t|ƒd¡ | d¡rÎd| }	|D ]}tj |¡\}}|  | |	¡¡ qºq›|D ]&}tj |¡\}}|  | d¡¡ |  | |d ¡oô|t|ƒd   ¡ ¡ qÐq›d S )Nr1  rœ  rÃ  z%Y-%m-%d_%H-%M-%SrÙ  rü  )úa.bza.b.czd.ezd.e.fz%s.logr[   r  T)r  r  rä  rö   r  z	%s.log.%sc                 S   s   |   dd¡d S )Nr)  r   )r'  r   r@   r@   rA   r  m  s    zKTimedRotatingFileHandlerTest.test_compute_files_to_delete.<locals>.<lambda>z	%s.%s.logri  r*  z%s.log.r)  r¦   r§   )rÿ   Úmkdtempr”   ÚshutilÚrmtreer¾  r]  r   rÁ  r   rÿ  r  r  r©   r   r:   r  r  râ  r:  Ú	enumerateZgetFilesToDeleterO   rP   r¨   r=   r¿  Úisdigit)r>   ZwdÚtimesr–  rÐ  Úprefixesr  Zrotatorsr¬   r1  rì  rƒ  r  r±   Z
candidatesr,  r  r@   r@   rA   Útest_compute_files_to_deleteV  sd   

ý

ÿ
ÿÿ€
þÿýöz9TimedRotatingFileHandlerTest.test_compute_files_to_deleteN)	rb   rc   rd   rÜ  r  r
  r  r  r$  r@   r@   r@   rA   rø  à  s    
*	(rø  c                  K   s   t jdi | ¤Žt jdd S )Nr]   rü  r@   )r¾  rÿ  )r  r@   r@   rA   r  ‡  s   r  )rù  r]   )ÚMé<   )ÚHi  )ÚDr  )r  r  ZW0r  é   )ZdaysZhoursc              
   C   sV  t jj| jd|dddd}d}| |¡}||krŸ|dkrŸzg|jr&t |¡}nt |¡}|d }|d	 }|d
 }	t jj	|d | d |	  }
||
 }t
d||jf t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 W n tyž } zt
d| tjd W Y d }~nd }~ww |  ||¡ | ¡  d S )Nró   r]   r   T)rõ   r  r  rä  r¿  g        r  r*  r  rÙ  r&  z
t: %s (%s)rþ  zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz
result: %sz exception in diagnostic code: %s)r   r:   r  r  r  r¿  r!  rÅ  Ú	localtimeZ	_MIDNIGHTr2  rý   rf  r1  rO   rC   )r>   r  ÚexprÛ  r  rX   rƒ  ZcurrentHourZcurrentMinuteZcurrentSecondr²   r¤  r   r@   r@   rA   Útest_compute_rollover’  sD   ÿ

ÿÿþ€ÿr,  ztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c                   @   rQ  )ÚNTEventLogHandlerTestc              
   C   sú   d}t  d |¡}t  |¡}ztj d¡}W n tjy- } z|jdkr(t	 
d¡‚‚ d }~ww t ddi¡}| |¡ | ¡  |  |t  |¡¡ t jt jB }d}d}	t  |||	¡}
|
D ]}|jdkrbqZt ||¡}|d	krmqZd
} d|	 }| j||d d S )NZApplicationZtest_loggingrÙ  z#Insufficient privileges to run testrø   zTest Log MessageFr‡  zTest Log Message
Tz3Record not found in event log, went back %d recordsrÎ  )Úwin32evtlogZOpenEventLogZGetNumberOfEventLogRecordsr   r:   ZNTEventLogHandlerÚ
pywintypesr{   ÚwinerrorrO  ZSkipTestr¯   r  rC   Z
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceNameÚwin32evtlogutilZSafeFormatMessager=   )r>   ZlogtypeZelhZnum_recsrH   r   r²   Úflagsr  r  Úeventsrø   r@   r@   rA   rÀ  ¸  s>   


€ý
ÿ
z NTEventLogHandlerTest.test_basicN)rb   rc   rd   rÀ  r@   r@   r@   rA   r-  ¶  r¤  r-  c                   @   rQ  )ÚMiscTestCasec                 C   s   h d£}t j| t|d d S )N>   rS  ÚcurrentframeÚStrFormatStyler-  r)  ÚFiltererÚ
RootLoggerrC  rX  rR  ÚPlaceHolderr  rJ  )Únot_exported)r   Zcheck__all__r   )r>   r:  r@   r@   rA   Útest__all__Û  s   zMiscTestCase.test__all__N)rb   rc   rd   r;  r@   r@   r@   rA   r4  Ú  rY  r4  c                  C   s*   t  dd¡} |  ¡  t | jd d d ¡ d S )NÚLC_ALLr   )r   Zrun_with_localeÚ	__enter__rO  ZaddModuleCleanupÚ__exit__)Úcmr@   r@   rA   ÚsetUpModuleç  s   r@  Ú__main__rÉ   )¨re   r   Zlogging.handlersZlogging.configr¥  ró  r   r¾  r  rR  r.   r™  r  r  re  r$  rJ   r  rr  rP  rý   rÿ   Ztest.support.script_helperr   r   rŸ  r   Ztest.supportr   r   r   r   Ztest.support.logging_helperr	   rá  r-  r!  rO  r²  r•  Zhttp.serverr
   r   Úurllib.parser   r   Úsocketserverr   r   r   r   r³  ÚsimplefilterÚDeprecationWarningr†  rp  r.  r1  r/  r‰  rð  ZTestCaser   rf   r—   ZSILENTrÒ   ZTERSEZEFFUSIVErÑ   rä   Z	TALKATIVErË   Z
CHATTERBOXZBORINGr   rÛ   r×   rž   rÈ   rÐ   rÕ   rè   rO  rR  r3   rZ  r^  ra  rq  rn  r‹  r  r¢  r«  rP  r²  r¶  r·  rÂ  r5   rÜ  rß  r?  r_  r{  ra  rh  ro  rq  rv  ZIPV6_ENABLEDrw  r{  r’  rž  r«  r¾  rÀ  rÄ  rÆ  rÉ  rB  rS  rl  r]  r^  rd  r:   rŠ  Zunittest.mockr|  r}  rÿ  r”  Ztzinfor“  r¿  rš  rœ  rØ  rÐ  r×  rÛ  rß  rã  r¼  rÝ  rì  r  r<  rV  rŠ  rŸ  rÌ  rÑ  rÕ  rø  r  r  r+  r,  rå  r-  r4  r@  rb   Úmainr@   r@   r@   rA   Ú<module>   sz  

ýÿÿm FöY T,J2)/ h   dY@CÿM41
(         v#k
`	  'W 4h  Bl \k (ú!
#
ÿ