a
     Rîhõ ã                   @   s0  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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)Z)ddl*m+Z+m,Z, dd	l-m.Z.m/Z/m0Z0m1Z1 zddl2Z2ddl3Z3ddl4Z4W n  e5y”   d Z2 Z3Z4Y n0 zddl6Z6W n e5y¶   Y n0 G d
d„ de"j7ƒZ8G dd„ de8ƒZ9G dd„ de8ƒZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDeEeDe;d ƒZFe;de<de=de>de?de@d eAd!eBd"eCd#eDd$i
ZGG d%d&„ d&ejHƒZIG d'd(„ d(ejHƒZJG d)d*„ d*e8ƒZKG d+d,„ d,e8ƒZLG d-d.„ d.eMƒZNG d/d0„ d0ejOƒZPG d1d2„ d2eMƒZQG d3d4„ d4e8ƒZRG d5d6„ d6e)jSƒZTG d7d8„ d8eMƒZUG d9d:„ d:eUe'ƒZVG d;d<„ d<eUe0ƒZWG d=d>„ d>eUe.ƒZXeYed?ƒrVG d@dA„ dAeWƒZZG dBdC„ dCeXƒZ[G dDdE„ dEe8ƒZ\G dFdG„ dGe8ƒZ]G dHdI„ dIej^ƒZ_G dJdK„ dKe8ƒZ`G dLdM„ dMe8ƒZadNdO„ Zbe" ceYed?ƒdP¡G dQdR„ dReaƒƒZdG dSdT„ dTe8ƒZee" ceYed?ƒdP¡G dUdV„ dVeeƒƒZfG dWdX„ dXe8ƒZge" ceYed?ƒdP¡G dYdZ„ dZegƒƒZhe" cejid[¡G d\d]„ d]egƒƒZjG d^d_„ d_e8ƒZkG d`da„ dae8ƒZlG dbdc„ dce8ƒZmG ddde„ dee8ƒZnd¸dfdg„ZoG dhdi„ diƒZpdjdk„ ZqG dldm„ dmejOƒZrG dndo„ doe8ƒZsG dpdq„ dqe8ƒZtG drds„ dse8ƒZuG dtdu„ duejvƒZwG dvdw„ dwe8ƒZxG dxdy„ dye8ƒZyeYejzdzƒrZddl{Z{dd{l|m}Z} G d|d}„ d}e8ƒZ~e d¡Z€G d~d„ dejƒZ‚e‚ƒ ZƒG d€d„ de"j7ƒZ„G d‚dƒ„ dƒej…ƒZ†G d„d…„ d…e"j7ƒZ‡G d†d‡„ d‡e8ƒZˆG dˆd‰„ d‰e8ƒZ‰G dŠd‹„ d‹ƒZŠG dŒd„ dej‹ƒZŒG dŽd„ de8ƒZG dd‘„ d‘e8ƒZŽG d’d“„ d“e8ƒZG d”d•„ d•e"j7ƒZG d–d—„ d—e"j7ƒZ‘G d˜d™„ d™e8ƒZ’G dšd›„ d›e8ƒZ“G dœd„ de“ƒZ”G dždŸ„ dŸe“ƒZ•G d d¡„ d¡e“ƒZ–d¢d£„ Z—d¤d¥d¦d§d¨d©e—dªd«d¬ffD ](\Z˜Z™e˜e™fd­d®„Zše›e–d¯e˜ ešƒ qºe" ce2d°¡G d±d²„ d²e8ƒƒZœG d³d´„ d´e"j7ƒZdµd¶„ ZžeŸd·kr,e"  ¡  dS )¹zoTest harness for the logging module. Run all tests.

Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.
é    N)Úassert_python_okÚassert_python_failure)Úsupport)Úsocket_helper)ÚTestHandler)Ú
HTTPServerÚBaseHTTPRequestHandler)ÚurlparseÚparse_qs)ÚThreadingUDPServerÚDatagramRequestHandlerÚThreadingTCPServerÚStreamRequestHandlerc                   @   s>   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 ¡  zvtj 	¡ | _
tjdd… | _| 	¡  | _}tj 	¡ | _tj 	¡ | _i  | _}|D ]}t|| ddƒ||< qpW t ¡  n
t ¡  0 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 %¡ rb| 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<   ú9/opt/python-3.9.24/usr/lib/python3.9/test/test_logging.pyÚsetUpP   sB    

ÿ
zBaseTest.setUpc                 C   s8  | j  ¡  | j | j¡ | jjrB| jjd }| j |¡ | ¡  q| 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| _qèW t ¡  n
t ¡  0 |  ¡  tj| jŽ  dS )zJRemove our logging stream, and restore the original logging
        level.r   N) r,   Úcloser'   ÚremoveHandlerr0   r6   r-   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<   r=   ÚtearDownz   s8    






zBaseTest.tearDownNc           	      C   sœ   |p| j }t |p| j¡}| ¡  ¡ }|  t|ƒt|ƒ¡ t||ƒD ]8\}}| 	|¡}|sh|  
d| ¡ |  t| ¡ ƒ|¡ qD| ¡ }|r˜|  
d| ¡ 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)r,   ÚreÚcompileÚexpected_log_patÚgetvalueÚ
splitlinesÚassertEqualÚlenÚzipÚsearchÚfailÚtupleÚgroupsÚread)	r:   Zexpected_valuesr,   ÚpatZactual_linesÚactualÚexpectedÚmatchÚsr<   r<   r=   Ú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<   r=   Únext_message®   s    zBaseTest.next_message)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   rH   rZ   r>   rE   rX   r\   r<   r<   r<   r=   r   H   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))rb   ÚCRITICALÚ1)rb   ÚERRORÚ2)rc   re   Ú3)rc   rg   Ú4)rc   ÚWARNINGÚ5)rc   ÚINFOÚ6)rd   re   Ú7)rd   rg   Ú8)rd   rk   Ú9)rd   rm   Ú10)rd   r.   Ú11)r\   r   r   r-   rg   ÚLoggerAdapterrm   r.   Úlogre   ÚerrorÚwarningÚinfoÚdebugrX   )r:   Úmrb   rc   rd   r<   r<   r=   Ú	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 )Nrc   úINF.ERR)r|   re   rf   )r|   rg   rh   ©r\   r   r   r-   rm   rg   ru   re   rv   rw   rx   ry   rX   )r:   rz   rc   ÚINF_ERRr<   r<   r=   Ú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 )Nrc   r|   ú	INF.UNDEFúINF.ERR.UNDEFÚUNDEF))r€   re   rf   )r€   rg   rh   )r€   rk   ri   )r€   rm   rj   )r   re   rl   )r   rg   rn   r}   )r:   rz   rc   r~   Z	INF_UNDEFZINF_ERR_UNDEFr‚   r<   r<   r=   Ú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 )Nrc   úINF.BADPARENT.UNDEFúINF.BADPARENT))r„   re   rf   )r„   rm   rh   )r…   re   ri   )r…   rm   rj   )
r\   r   r   r-   rm   ru   ÚFATALrx   ry   rX   )r:   rz   rc   Z
GRANDCHILDZCHILDr<   r<   r=   Ú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.rm   N)rK   r   ÚgetLevelNamerm   r[   r<   r<   r=   Útest_regression_22386;  s    z'BuiltinLevelsTest.test_regression_22386c                 C   s   t  d¡}|  |t j¡ d S )Nr†   )r   rˆ   rK   r†   )r:   Úfatalr<   r<   r=   Útest_issue27935@  s    
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   rm   ÚNOTSETN)r   ÚaddLevelNamerm   Ú
addCleanuprK   rˆ   rŒ   r[   r<   r<   r=   Útest_regression_29220D  s
    z'BuiltinLevelsTest.test_regression_29220N)r]   r^   r_   r`   r{   r   rƒ   r‡   r‰   r‹   r   r<   r<   r<   r=   ra   µ   s   /#ra   c                   @   s(   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 }z†| |¡ t  d¡}t  d¡}t  d¡}t  d¡}| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ |  ddg¡ W | 	|¡ n| 	|¡ 0 d S )Nú	spam.eggsr   Úspamúspam.eggs.fishúspam.bakedbeans©r‘   rm   rh   ©r“   rm   ri   )
r   ÚFilterr'   r6   Ú	addFilterr   rx   r\   rX   ÚremoveFilter)r:   Zfilter_Úhandlerr’   Ú	spam_eggsÚspam_eggs_fishÚspam_bakedbeansr<   r<   r=   Útest_filterP  s"    





þzBasicFilterTest.test_filterc              	   C   s¬   dd„ }| j jd }z†| |¡ t d¡}t d¡}t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ |  dd	g¡ W | |¡ n| |¡ 0 d S )
Nc                 S   s&   | j  d¡}d |d d… ¡}|dkS )NÚ.é   r‘   )r;   ÚsplitÚjoin)ÚrecordÚpartsÚprefixr<   r<   r=   Ú
filterfuncl  s    z8BasicFilterTest.test_callable_filter.<locals>.filterfuncr   r’   r‘   r“   r”   r•   r–   )	r'   r6   r˜   r   r   rx   r\   rX   r™   )r:   r¦   rš   r’   r›   rœ   r   r<   r<   r=   Útest_callable_filterh  s"    




þz$BasicFilterTest.test_callable_filterc                 C   s*   t  ¡ }t  ddi¡}|  | |¡¡ d S )Nr;   r‘   )r   r—   ÚmakeLogRecordr9   Úfilter)r:   ÚfÚrr<   r<   r=   Útest_empty_filter…  s    z!BasicFilterTest.test_empty_filterN)r]   r^   r_   r`   rž   r§   r¬   r<   r<   r<   r=   r   L  s   r   éx   éw   év   éu   ét   és   ér   éq   ép   éo   rY   ÚSilentÚTaciturnÚTerseÚEffusiveÚSociableÚVerboseÚ	TalkativeZ	GarrulousÚ
ChatterboxÚBoringc                   @   s   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<   r=   r©   ´  s    zGarrulousFilter.filterN©r]   r^   r_   r`   r©   r<   r<   r<   r=   rÀ   °  s   rÀ   c                   @   s   e Zd ZdZdd„ ZdS )ÚVerySpecificFilterz5A filter which blocks sociable and taciturn messages.c                 C   s   |j ttfvS rÁ   )rÂ   ÚSOCIABLEÚTACITURNrÄ   r<   r<   r=   r©   »  s    zVerySpecificFilter.filterNrÅ   r<   r<   r<   r=   rÆ   ·  s   rÆ   c                   @   s<   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   r>   Úmy_logging_levelsÚitemsr   r   )r:   ÚkÚvr<   r<   r=   r>   Æ  s    
z CustomLevelsAndFiltersTest.setUpc                 C   s   t D ]}| ||  ¡ ¡ qd S rÁ   )ÚLEVEL_RANGEru   r\   )r:   ÚloggerZlvlr<   r<   r=   Úlog_at_all_levelsË  s    z,CustomLevelsAndFiltersTest.log_at_all_levelsc                 C   s*   | j  t¡ |  | j ¡ |  g d¢¡ d S )N)©r¼   rl   ©r»   rn   ©rº   ro   ©r¹   rp   ©r¸   rq   ©r·   rr   )r'   r-   ÚVERBOSErÑ   rX   r[   r<   r<   r=   Útest_logger_filterÏ  s    z-CustomLevelsAndFiltersTest.test_logger_filterc              	   C   s`   | j jd  t¡ z2|  | j ¡ |  g d¢¡ W | j jd  tj¡ n| j jd  tj¡ 0 d S )Nr   )rÓ   rÔ   rÕ   rÖ   r×   )r'   r6   r-   rÇ   rÑ   rX   r   rŒ   r[   r<   r<   r=   Útest_handler_filterÝ  s
    z.CustomLevelsAndFiltersTest.test_handler_filterc              	   C   s®   | j jd }d }tƒ }| |¡ zl|  | j ¡ g d¢}|  |¡ tƒ }| j  |¡ |  | j ¡ |  |g d¢ ¡ W |r‚| j  |¡ | |¡ n|rž| j  |¡ | |¡ 0 d S )Nr   )	)r¿   rf   )r¾   rh   )r½   rj   rÒ   rÓ   rÔ   rÕ   rÖ   r×   ))r¿   rs   )r¾   Z12)r½   Z14)r¼   Z15)rº   Z17)r¹   Z18)r·   Z20)r'   r6   rÀ   r˜   rÑ   rX   rÆ   r™   )r:   rš   Zspecific_filterZgarrZfirst_linesr<   r<   r=   Útest_specific_filtersí  s$    

þz0CustomLevelsAndFiltersTest.test_specific_filtersN)
r]   r^   r_   r`   rH   r>   rÑ   rÙ   rÚ   rÛ   r<   r<   r<   r=   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;   rK   ÚassertRaisesÚNotImplementedErrorÚemit©r:   rD   r<   r<   r=   Ú	test_name  s    zHandlerTest.test_namec           
      C   sô  t jdv rXdD ]æ}t ¡ \}}t |¡ |s8t |¡ tjj	|dd}|rÄ|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
}z4tj |¡}|  |j|j¡ |  |j¡ | ¡  W n tyV   Y n0 dD ]@}	|	dkr‚|  ttjjdd|	¡ ntj dd|	¡}| ¡  q\tj d¡}t i ¡}|  | |¡¡ | ¡  tj d¡}|  | |¡¡ | ¡  d S )N©ÚlinuxÚdarwin)TFT©ÚdelayéÿÿÿÿÚmsgZTestræ   z/var/run/syslogz/dev/log)ÚGETÚPOSTÚPUTrí   Ú	localhostz/logr   rY   )ÚsysÚplatformÚtempfileÚmkstempÚosr?   Úunlinkr   r6   ÚWatchedFileHandlerÚdevÚinorK   r¨   ÚhandleÚassertFalseÚpathÚexistsr9   ÚSysLogHandlerZfacilityZLOG_USERZ
unixsocketÚOSErrorrß   Ú
ValueErrorÚHTTPHandlerZBufferingHandlerZshouldFlush)
r:   ÚexistingÚfdÚfnrD   rö   r÷   r«   ZsocknameÚmethodr<   r<   r=   Ú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 rv|tj	j|dfff7 }|D ]4\}}||Ž }|  tj |¡¡ | ¡  t |¡ qzdS )zs
        Test that Path objects are accepted as filename arguments to handlers.

        See Issue #27493.
        ÚwÚarD   rä   N)rñ   rò   ró   r?   rô   ÚpathlibÚPathr   ÚFileHandlerr6   ÚRotatingFileHandlerÚTimedRotatingFileHandlerrï   rð   rõ   r9   rú   rû   )r:   r  r  ZpfnZcasesÚclsÚargsrD   r<   r<   r=   Útest_path_objectsW  s    


ý
zHandlerTest.test_path_objectsÚntz/WatchedFileHandler not appropriate for Windows.c              
      sN  ‡ fdd„}d}d}d ˆ _ d ˆ _dD ]"}t dd¡\}}t |¡ tj|||fd}d|_| 	¡  t
jj||d	}t
 d
¡}	| |	¡ z”t|ƒD ]^}
t d¡ t
 ddi¡}zt ¡ ˆ _ | |¡ W q’ tyî   tdˆ jˆ j f ƒ ‚ Y q’0 q’W | ¡  | ¡  tj |¡rHt |¡ q$| ¡  | ¡  tj |¡rFt |¡ 0 q$d S )Nc              	      sT   t |ƒD ]F}zt | ¡ t ¡ ˆ _W n ty6   Y n0 t dt dd¡ ¡ qd S )Ngü©ñÒMbp?r   é   )	Úrangeró   rô   ÚtimeÚdeletion_timerý   ÚsleepÚrandomÚrandint)ZfnameZtriesÚ_r[   r<   r=   Úremove_loopq  s    
z*HandlerTest.test_race.<locals>.remove_loopiô  ©FTú.logztest_logging-3-©Útargetr  Trç   z'%(asctime)s: %(levelname)s: %(message)sç{®Gázt?rê   ZtestingzDeleted at %s, opened at %s)Zhandle_timer  rñ   rò   ró   r?   Ú	threadingÚThreadÚdaemonÚstartr   r6   rõ   r1   r4   r  r  r  r¨   rø   Ú	ExceptionÚprintr¢   rú   rû   rô   )r:   r  Z	del_countZ	log_countrè   r  r  ZremoverrD   rª   r  r«   r<   r[   r=   Ú	test_racen  sH    	





ÿÿý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¡ nt d¡ 0 n(| d¡ ˆ  ¡  | ¡  tj|dd dS )z>Ensure child logging locks are not held; bpo-6721 & bpo-36533.c                       s$   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 S )Nz	/dev/nullZwt©r,   )ÚsuperÚ__init__r   r/   ÚopenÚsub_handlerr[   ©Ú	__class__r<   r=   r(  £  s    
ÿzJHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.__init__c                 S   s6   | j  ¡  z| j  |¡ W | j  ¡  n| j  ¡  0 d S rÁ   )r*  Úacquirerá   ÚreleaserÄ   r<   r<   r=   rá   ¨  s    
zFHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.emit©r]   r^   r_   r(  rá   Ú__classcell__r<   r<   r+  r=   Ú_OurHandler¢  s   r1  r   z*because we need at least one for this testrY   Ú test_post_fork_child_no_deadlockc                      sV   t  ¡  z>ˆ ¡  zˆ ¡  ˆ  d¡ W ˆ ¡  n
ˆ ¡  0 W t  ¡  n
t  ¡  0 d S )Nç      à?)r   r   r-  ÚsetÚwaitr.  r$   r<   ©Z+fork_happened__release_locks_and_end_threadZlocks_held__ready_to_forkZrefed_hr<   r=   Ú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Þ   rK   rL   r   rŽ   r*  r,   r?   r;   ÚassertGreaterÚ_at_fork_reinit_lock_weaksetr   r8   r-   r.   r  ÚEventr  r!  r5  ró   r%  rx   Ú_exitr4  r¢   r   Zwait_process)r:   r1  Ztest_loggerr7  Zlock_holder_threadÚpidr<   r6  r=   r2  Ÿ  s8    

þ
z,HandlerTest.test_post_fork_child_no_deadlockN)r]   r^   r_   rã   r  r  ÚunittestZskipIfró   r;   r$  Úhasattrr2  r<   r<   r<   r=   rÜ     s   6
0rÜ   c                   @   s   e Zd Zdd„ ZdS )Ú	BadStreamc                 C   s   t dƒ‚d S )Núdeliberate mistake)ÚRuntimeError©r:   Údatar<   r<   r=   Úwriteì  s    zBadStream.writeN)r]   r^   r_   rE  r<   r<   r<   r=   r@  ë  s   r@  c                   @   s   e Zd Zdd„ ZdS )ÚTestStreamHandlerc                 C   s
   || _ d S rÁ   )Úerror_recordrÄ   r<   r<   r=   ÚhandleErrorð  s    zTestStreamHandler.handleErrorN)r]   r^   r_   rH  r<   r<   r<   r=   rF  ï  s   rF  c                   @   s   e Zd ZejZdZdS )ÚStreamWithIntNamer    N)r]   r^   r_   r   rŒ   Úlevelr;   r<   r<   r<   r=   rI  ó  s   rI  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStreamHandlerTestc                 C   sä   t tƒ ƒ}t i ¡}tj}z¼| |¡ |  |j|¡ t tƒ ¡}t	 
¡ .}| |¡ d}|  || ¡ ¡ W d   ƒ n1 s|0    Y  dt_t	 
¡ *}| |¡ |  d| ¡ ¡ W d   ƒ n1 sÄ0    Y  W |t_n|t_0 d S )Nz"
RuntimeError: deliberate mistake
Fr   )rF  r@  r   r¨   ÚraiseExceptionsrø   ÚassertIsrG  r/   r   Úcaptured_stderrÚassertInrI   rK   )r:   rD   r«   Z	old_raiseÚstderrrê   r<   r<   r=   Útest_error_handlingø  s     




.

0z%StreamHandlerTest.test_error_handlingc                 C   sV   t  ¡ }t ¡ }| |¡}|  |tj¡ | |¡}|  ||¡ | |¡}|  |¡ dS )z3
        Test setting the handler's stream
        N)	r   r/   r*   r+   Ú	setStreamrM  rï   rP  ÚassertIsNone)r:   rD   r,   ÚoldrT   r<   r<   r=   Útest_stream_setting  s    


z%StreamHandlerTest.test_stream_settingc                 C   s    t  tƒ ¡}|  t|ƒd¡ d S )Nz<StreamHandler 2 (NOTSET)>)r   r/   rI  rK   Úreprrâ   r<   r<   r=   Ú'test_can_represent_stream_with_int_name  s    z9StreamHandlerTest.test_can_represent_stream_with_int_nameN)r]   r^   r_   rQ  rU  rW  r<   r<   r<   r=   rK  ÷  s   rK  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_datarY   F)
ÚsmtpdÚ
SMTPServerr(  ÚsocketÚgetsocknameÚportÚ_handlerÚ_threadÚ_quitÚpoll_interval)r:   Úaddrrš   rb  Úsockmapr<   r<   r=   r(  8  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)r_  )r:   ÚpeerÚmailfromÚrcpttosrD  r<   r<   r=   Úprocess_messageA  s    
zTestSMTPServer.process_messagec                 C   s0   t j| j| jfd | _}| d¡ | ¡  dS )zG
        Start the server running on a separate daemon thread.
        r  TN©r  r  Úserve_foreverrb  r`  Ú	setDaemonr!  ©r:   Útr<   r<   r=   r!  M  s
    ÿ
zTestSMTPServer.startc                 C   s   | j stj|| jdd q 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`.
        rY   )rY  ÚcountN)ra  ÚasyncoreZloopÚ_map©r:   rb  r<   r<   r=   rj  V  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)rY  Z
ignore_all)ra  r   Újoin_threadr`  r?   ro  Z	close_allrp  r[   r<   r<   r=   Ústopa  s
    zTestSMTPServer.stopN)	r]   r^   r_   r`   r(  rh  r!  rj  rs  r<   r<   r<   r=   rX  #  s   		rX  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Á   )r`  rb  r_  r  r;  Úready)r:   rš   rb  r<   r<   r=   r(  }  s    zControlMixin.__init__c                 C   s0   t j| j| jfd | _}| d¡ | ¡  dS )zI
        Create a daemon thread to run the server, and start it.
        r  TNri  rl  r<   r<   r=   r!  ƒ  s
    ÿ
zControlMixin.startc                    s   | j  ¡  tt| ƒ |¡ dS )z^
        Run the server. Set the ready flag before entering the
        service loop.
        N)ru  r4  r'  rt  rj  rq  r+  r<   r=   rj  Œ  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)Úshutdownr`  r   rr  Úserver_closeru  rA   r[   r<   r<   r=   rs  ”  s    
zControlMixin.stop)	r]   r^   r_   r`   r(  r!  rj  rs  r0  r<   r<   r+  r=   rt  m  s
   	rt  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.
    r3  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|ƒ‚d S )NZdo_)Ú
startswithÚprocess_requestÚAttributeError)r:   r;   Údefaultr<   r<   r=   Ú__getattr__­  s    
zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__c                 S   s   | j  | ¡ d S rÁ   ©Úserverr_  r[   r<   r<   r=   rz  ²  s    zMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestc                    s    ˆrt ˆ | ƒj|g|¢R Ž  d S rÁ   )r'  Úlog_message)r:   Úformatr  )ÚDelegatingHTTPRequestHandlerr,  ru   r<   r=   r€  µ  s    ÿÿÿzITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_message)N)r]   r^   r_   r}  rz  r€  r0  r<   ©r‚  ru   r+  r=   r‚  ¬  s   
r‚  )r   r   r(  rt  Ússlctx)r:   rc  rš   rb  ru   r„  r<   rƒ  r=   r(  ª  s    zTestHTTPServer.__init__c              
   C   sh   z(| j  ¡ \}}| jr&| jj|dd}W n6 ty^ } ztj d| ¡ ‚ W Y d }~n
d }~0 0 ||fS )NT)Zserver_sidezGot an error:
%s
)r\  Úacceptr„  Zwrap_socketrý   rï   rP  rE  )r:   Úsockrc  Úer<   r<   r=   Úget_request½  s    zTestHTTPServer.get_request)r3  FN)r]   r^   r_   r`   r(  rˆ  r<   r<   r<   r=   rx  Ÿ  s
   
  ÿ
rx  c                       s.   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.
    Tr3  c                 C   s2   G dd„ dt ƒ}t | |||¡ t | ||¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z;TestTCPServer.__init__.<locals>.DelegatingTCPRequestHandlerc                 S   s   | j  | ¡ d S rÁ   r~  r[   r<   r<   r=   rø   Ý  s    zBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)r]   r^   r_   rø   r<   r<   r<   r=   ÚDelegatingTCPRequestHandlerÛ  s   rŠ  )r   r   r(  rt  )r:   rc  rš   rb  Úbind_and_activaterŠ  r<   r<   r=   r(  Ù  s
    
ÿzTestTCPServer.__init__c                    s"   t t| ƒ ¡  | j ¡ d | _d S ©NrY   )r'  r‰  Úserver_bindr\  r]  r^  r[   r+  r<   r=   r  ã  s    zTestTCPServer.server_bind)r3  T)r]   r^   r_   r`   Zallow_reuse_addressr(  r  r0  r<   r<   r+  r=   r‰  È  s     ÿ

r‰  c                       s6   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.
    r3  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   s   | j  | ¡ d S rÁ   r~  r[   r<   r<   r=   rø   ü  s    zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlec                    sB   | j  ¡ }|r>ztˆ | ƒ ¡  W n ty<   | jjs8‚ Y n0 d S rÁ   )ZwfilerI   r'  Úfinishrý   r  Ú_closedrC  )ÚDelegatingUDPRequestHandlerr,  r<   r=   r  ÿ  s    
zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)r]   r^   r_   rø   r  r0  r<   ©r‘  r+  r=   r‘  ú  s   r‘  F)r   r   r(  rt  r  )r:   rc  rš   rb  r‹  r<   r’  r=   r(  ø  s    þzTestUDPServer.__init__c                    s"   t t| ƒ ¡  | j ¡ d | _d S rŒ  )r'  rŽ  r  r\  r]  r^  r[   r+  r<   r=   r    s    zTestUDPServer.server_bindc                    s   t t| ƒ ¡  d| _d S )NT)r'  rŽ  rw  r  r[   r+  r<   r=   rw    s    zTestUDPServer.server_close)r3  T)r]   r^   r_   r`   r(  r  rw  r0  r<   r<   r+  r=   rŽ  ç  s     ÿ
rŽ  ÚAF_UNIXc                   @   s   e Zd ZejZdS )ÚTestUnixStreamServerN©r]   r^   r_   r\  r“  Úaddress_familyr<   r<   r<   r=   r”    s   r”  c                   @   s   e Zd ZejZdS )ÚTestUnixDatagramServerNr•  r<   r<   r<   r=   r—    s   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 âœ“rY   z
Subject: Log
u   

Hello âœ“)rX  r   ZHOSTrh  r!  r^  r   r6   ZSMTPHandlerÚTIMEOUTrK   ZtoaddrsÚmessagesr¨   r  r;  Úhandledrø   r5  rs  r9   Úis_setrL   rO  Úendswithr?   )
r:   rd  r  rc  rD   r«   re  rf  rg  rD  r<   r<   r=   Ú
test_basic#  s0    ÿÿ

zSMTPHandlerTest.test_basicc                 G   s   | j  |¡ | j ¡  d S rÁ   )r  Úappendrž  r4  )r:   r  r<   r<   r=   rh  ;  s    zSMTPHandlerTest.process_messageN)r]   r^   r_   r   ZLONG_TIMEOUTrœ  r¡  rh  r<   r<   r<   r=   r˜    s   r˜  c                   @   s<   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 )Ú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   r>   r   r6   ÚMemoryHandlerrk   r0   Úmem_hdlrr   Ú
mem_loggerÚ	propagater8   r[   r<   r<   r=   r>   F  s    
ÿzMemoryHandlerTest.setUpc                 C   s   | j  ¡  t | ¡ d S rÁ   )r¦  r?   r   rE   r[   r<   r<   r=   rE   N  s    
zMemoryHandlerTest.tearDownc                 C   sÜ   | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ g d¢}|  |¡ dD ]b}tdƒD ]}| j  |  ¡ ¡ qf|  |¡ | j  |  ¡ ¡ |dd„ t||d ƒD ƒ }|  |¡ qZ| j  |  ¡ ¡ |  |¡ d S )N)©r.   rf   ©rm   rh   )rk   ri   )r  é   é	   c                 S   s   g | ]}d t |ƒf‘qS )r.   )Ústr)Ú.0Úir<   r<   r=   Ú
<listcomp>h  ó    z0MemoryHandlerTest.test_flush.<locals>.<listcomp>r¤  )r§  ry   r\   rX   rx   rw   r  )r:   ÚlinesÚnr¯  r<   r<   r=   Ú
test_flushR  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§  ry   r\   rX   rx   r@   r¦  r?   r   r6   r¥  rk   r0   r8   )r:   r²  r<   r<   r=   Útest_flush_on_closen  s,    


þ
þ


z%MemoryHandlerTest.test_flush_on_closec              
   C   sŒ   G dd„ dƒ}|| j ƒ}zV| j  |¡ tdƒD ]&}t d¡ | j d¡ | j d¡ q.W |jD ]}t	 
|¡ q^n|jD ]}t	 
|¡ qv0 d S )Nc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zZMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandlerc                 S   s   || _ g | _d S rÁ   )r¦  Úthreads)r:   r¦  r<   r<   r=   r(  Ž  s    zcMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.__init__c                 S   s   | j  d ¡ d S rÁ   )r¦  Ú	setTargetr[   r<   r<   r=   ÚremoveTarget’  s    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¢  r!  )r:   rê   Úthreadr<   r<   r=   rø   •  s    zaMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.handleN)r]   r^   r_   r(  r¸  rø   r<   r<   r<   r=   ÚMockRaceConditionHandler  s   rº  r¤  r  znot flushedZflushed)r¦  r·  r  r  r  r§  rx   rw   r¶  r   rr  )r:   rº  r  r  r¹  r<   r<   r=   Ú&test_race_between_set_target_and_flushŒ  s    


ÿ
z8MemoryHandlerTest.test_race_between_set_target_and_flushN)
r]   r^   r_   r`   rH   r>   rE   r´  rµ  r»  r<   r<   r<   r=   r£  ?  s   r£  c                   @   s   e Zd ZdZdd„ ZdS )ÚExceptionFormatterzA special exception formatter.c                 C   s   d|d j  S )Nz
Got a [%s]r   )r]   )r:   Úeir<   r<   r=   ÚformatException©  s    z"ExceptionFormatter.formatExceptionN)r]   r^   r_   r`   r¾  r<   r<   r<   r=   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=
    zã
    [loggers]
    keys=root

    [handlers]
    keys=file

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=file

    [handler_file]
    class=FileHandler
    level=DEBUG
    args=("{tempfile}",)
    zø
    [loggers]
    keys=root

    [handlers]
    keys=screen

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=screen

    [handler_screen]
    level=DEBUG
    class=StreamHandler
    args=(sys.stdout,)
    formatter=
    c                 K   s(   t  t |¡¡}tjj|fi |¤Ž d S rÁ   )r*   r+   ÚtextwrapÚdedentr   ÚconfigÚ
fileConfig)r:   ÚconfÚkwargsÚfiler<   r<   r=   Úapply_config¬  s    zConfigFileTest.apply_configc                 C   sv   t  ¡ Z}|  | j¡ t ¡ }| |  ¡ ¡ | |  ¡ ¡ | j	dg|d |  	g ¡ W d   ƒ n1 sh0    Y  d S ©N©rg   rh   r&  ©
r   Úcaptured_stdoutrÈ  Úconfig0r   r   rx   r\   rv   rX   ©r:   ÚoutputrÐ   r<   r<   r=   Útest_config0_ok°  s    
ÿþzConfigFileTest.test_config0_okc                 C   sš   t  ¡ ~}t t | j¡¡}t ¡ }| 	|¡ t
j |¡ t
 ¡ }| |  ¡ ¡ | |  ¡ ¡ | jdg|d |  g ¡ W d   ƒ n1 sŒ0    Y  d S rÉ  )r   rÌ  r*   r+   rÁ  rÂ  rÍ  ÚconfigparserÚConfigParserZ	read_filer   rÃ  rÄ  r   rx   r\   rv   rX   )r:   rÏ  rÇ  ZcprÐ   r<   r<   r=   Útest_config0_using_cp_ok¿  s    

ÿþz'ConfigFileTest.test_config0_using_cp_okc                 C   sx   t  ¡ \}|  |¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | jddg|d |  g ¡ W d   ƒ n1 sj0    Y  d S ©Núcompiler.parser©rm   rf   rÊ  r&  ©	r   rÌ  rÈ  r   r   rx   r\   rv   rX   ©r:   rÃ  rÏ  rÐ   r<   r<   r=   Útest_config1_okÑ  s    


þýzConfigFileTest.test_config1_okc                 C   s   |   t| j| j¡ d S rÁ   ©rß   r"  rÈ  Úconfig2r[   r<   r<   r=   Útest_config2_failureà  s    z#ConfigFileTest.test_config2_failurec                 C   s   |   t| j| j¡ d S rÁ   ©rß   r"  rÈ  Úconfig3r[   r<   r<   r=   Útest_config3_failureä  s    z#ConfigFileTest.test_config3_failurec              	   C   sŽ   t  ¡ r}|  | j¡ t ¡ }z
tƒ ‚W n tyD   t d¡ Y n0 tj	 
d¡ |  | ¡ d¡ |  g ¡ W d   ƒ n1 s€0    Y  d S ©Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   rÌ  rÈ  Úconfig4r   r   rB  Ú	exceptionrï   ÚstdoutÚseekrK   rI   rX   rÎ  r<   r<   r=   Útest_config4_okè  s    


ÿzConfigFileTest.test_config4_okc                 C   s   | j | jd d S ©N)rÃ  ©rÙ  Úconfig5r[   r<   r<   r=   Útest_config5_ok÷  s    zConfigFileTest.test_config5_okc                 C   s   | j | jd d S ræ  )rÙ  Úconfig6r[   r<   r<   r=   Útest_config6_okú  s    zConfigFileTest.test_config6_okc                 C   sJ  t  ¡ v}|  | j¡ t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ n1 s„0    Y  t  ¡ ž}|  | j¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ n1 s<0    Y  d S ©NrÕ  zcompiler-hyphenated)rÖ  rÊ  )re   ri   r&  úcompiler.lexer))rm   rj   )rg   rl   )rm   rn   )rg   ro   )r   rÌ  rÈ  Úconfig1ar   r   rx   r\   rv   ÚcriticalrX   Úconfig7rù   r   ©r:   rÏ  rÐ   Z
hyphenatedr<   r<   r=   Útest_config7_oký  s2    



ü(



ûzConfigFileTest.test_config7_okc                 C   s    dd„ }|   ¡ b t dd¡\}}t |¡ tjdkrB| dd¡}| jj|d}|  	|¡ |  	|¡ W d   ƒ n1 sx0    Y  t
jjd	 }|  |||¡ d S )
Nc                 S   s   |   ¡  t |¡ d S rÁ   ©r?   ró   Úremove©Úh1r  r<   r<   r=   Úcleanup*  s    z/ConfigFileTest.test_config8_ok.<locals>.cleanupr  útest_logging-X-r  ú\z\\)rñ   r   )Úcheck_no_resource_warningrñ   rò   ró   r?   r;   ÚreplaceÚconfig8r  rÈ  r   Úrootr6   rŽ   )r:   r÷  r  r  rü  rš   r<   r<   r=   Ú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   r9   ©r:   rÐ   r<   r<   r=   Útest_logger_disabling?  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È  rK   r   r   r6   r;   )r:   Ztest_configr<   r<   r=   Útest_config_set_handler_namesH  s    
z,ConfigFileTest.test_config_set_handler_namesc              
   C   s‚   t  d¡ ¡ }tjddd\}}zPt || d¡¡ t |¡ t	j
j|tdddd	d
ddœidd W t |¡ nt |¡ 0 dS )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ÚasciirY   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)ÚdefaultsN)rÁ  rÂ  Ústriprñ   rò   ró   rE  Úencoder?   r   rÃ  rÄ  Údictrô   )r:   Zinir  r  r<   r<   r=   Ú!test_defaults_do_no_interpolation`  s&    
ýÿýþz0ConfigFileTest.test_defaults_do_no_interpolationN)!r]   r^   r_   r`   r   rú  rH   rÍ  Úconfig1rî  rû  rÛ  rÞ  rá  rè  rê  rð  rü  r   rÈ  rÐ  rÓ  rÙ  rÜ  rß  rå  ré  rë  rò  rþ  r  r  r  r<   r<   r<   r=   r¿  ­  s@     ëë*&+	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	yl } z|| _W Y d}~dS d}~0 0 |j
 ¡  tjj}t|jtƒrœ|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   r>   r  Ú	sock_hdlrÚserver_exceptionÚserver_classÚaddressÚhandle_socketr!  rý   ru  r5  r   r6   ZSocketHandlerÚ
isinstanceÚserver_addressrP   r^  Ú
log_outputr'   r@   r8   r  Ú	Semaphorerž  ©r:   r  r‡  Zhclsr<   r<   r=   r>   “  s&    
ÿ

zSocketHandlerTest.setUpc              	   C   sN   z<| j r | j | j ¡ | j  ¡  | jr0| j ¡  W t | ¡ nt | ¡ 0 dS )zShutdown the TCP server.N)r  r'   r@   r?   r  rs  r   rE   r[   r<   r<   r=   rE   ­  s    
zSocketHandlerTest.tearDownc                 C   s”   |j }| d¡}t|ƒdk rqt d|¡d }| |¡}t|ƒ|k r\|| |t|ƒ ¡ }q8t |¡}t |¡}|  j	|j
d 7  _	| j ¡  qd S )Nr  ú>Lr   Ú
)Ú
connectionÚrecvrL   ÚstructÚunpackÚpickleÚloadsr   r¨   r  rê   rž  r.  )r:   ÚrequestÚconnÚchunkÚslenÚobjr£   r<   r<   r=   r  ¸  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
)
r  ÚskipTestr   r   rv   rž  r-  ry   rK   r  r  r<   r<   r=   Útest_outputÇ  s    




zSocketHandlerTest.test_outputc                 C   sš   | j r|  | j ¡ d| j_| j ¡  ztdƒ‚W n tyN   | j d¡ Y n0 | 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)r  r/  r  Z
retryStartr  rs  rB  r'   râ  rv   r  r9  Z	retryTimer  )r:   Únowr<   r<   r=   Útest_noserverÒ  s    
zSocketHandlerTest.test_noserverN)r]   r^   r_   r`   r‰  r  r  r>   rE   r  r0  r2  r<   r<   r<   r=   r  Œ  s   r  c                  C   s*   t jddd\} }t | ¡ t |¡ |S )Nr  z.sockr  )rñ   rò   ró   r?   rô  )r  r  r<   r<   r=   Ú_get_temp_domain_socketå  s    

r3  zUnix sockets requiredc                   @   s.   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   s   t ƒ | _t | ¡ d S rÁ   )r3  r  r  r>   r[   r<   r<   r=   r>   õ  s    zUnixSocketHandlerTest.setUpc                 C   s   t  | ¡ t | j¡ d S rÁ   )r  rE   r   rô   r  r[   r<   r<   r=   rE   ú  s    
zUnixSocketHandlerTest.tearDownN)
r]   r^   r_   r`   r?  r\  r”  r  r>   rE   r<   r<   r<   r=   r4  í  s
   
r4  c                   @   s8   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	yl } z|| _W Y d}~dS d}~0 0 |j
 ¡  tjj}t|jtƒrœ|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.Nr  rî   r   r   )r   r>   r  r  r  r  r  Úhandle_datagramr!  rý   ru  r5  r   r6   ZDatagramHandlerr  r  rP   r^  r  r'   r@   r8   r  r;  rž  r  r<   r<   r=   r>     s&    
ÿ

zDatagramHandlerTest.setUpc              	   C   sN   z<| j r| j  ¡  | jr0| j | j¡ | j ¡  W t | ¡ nt | ¡ 0 dS )zShutdown the UDP server.N)r  rs  r  r'   r@   r?   r   rE   r[   r<   r<   r=   rE     s    
zDatagramHandlerTest.tearDownc                 C   sT   t  dd¡}|jt|ƒd … }t |¡}t |¡}|  j|j	d 7  _| j
 ¡  d S )Nr   r   r!  )r$  ÚpackÚpacketrL   r&  r'  r   r¨   r  rê   rž  r4  )r:   r(  r+  r8  r,  r£   r<   r<   r=   r6  *  s    

z#DatagramHandlerTest.handle_datagramc                 C   s`   | j r|  | j ¡ t d¡}| d¡ | j ¡  | j ¡  | d¡ | j ¡  |  | j	d¡ d S )NZudpr’   r-  r.  )
r  r/  r   r   rv   rž  r5  rA   rK   r  r  r<   r<   r=   r0  2  s    





zDatagramHandlerTest.test_outputN©r]   r^   r_   r`   rŽ  r  r  r>   rE   r6  r0  r<   r<   r<   r=   r5  þ  s   r5  c                   @   s.   e Zd ZdZeedƒreZdd„ Zdd„ Z	dS )ÚUnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.r“  c                 C   s   t ƒ | _t | ¡ d S rÁ   )r3  r  r5  r>   r[   r<   r<   r=   r>   F  s    zUnixDatagramHandlerTest.setUpc                 C   s   t  | ¡ t | j¡ d S rÁ   )r5  rE   r   rô   r  r[   r<   r<   r=   rE   K  s    
z UnixDatagramHandlerTest.tearDownN©
r]   r^   r_   r`   r?  r\  r—  r  r>   rE   r<   r<   r<   r=   r:  >  s
   
r:  c                   @   s8   e Zd ZdZeZdZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dS )ÚSysLogHandlerTestz!Test for SysLogHandler using UDP.r  c              
   C   sæ   t  | ¡ d | _ | _| _z$|  | j| jd¡ | _}| ¡  W n, t	yl } z|| _W Y d}~dS d}~0 0 |j
 ¡  tjj}t|jtƒr¤||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.Nr  r   r   )r   r>   r  Úsl_hdlrr  r  r  r6  r!  rý   ru  r5  r   r6   rü   r  r  rP   r^  r  r'   r@   r8   r  r;  rž  r  r<   r<   r=   r>   V  s&    
ÿ

zSysLogHandlerTest.setUpc              	   C   sN   z<| j r| j  ¡  | jr0| j | j¡ | j ¡  W t | ¡ nt | ¡ 0 dS )zShutdown the server.N)r  rs  r=  r'   r@   r?   r   rE   r[   r<   r<   r=   rE   p  s    
zSysLogHandlerTest.tearDownc                 C   s   |j | _| j ¡  d S rÁ   )r8  r  rž  r4  )r:   r(  r<   r<   r=   r6  {  s    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)r  r/  r   r   rv   rž  r5  rK   r  rA   r=  Z
append_nulÚidentr  r<   r<   r=   r0    s     








zSysLogHandlerTest.test_outputNr9  r<   r<   r<   r=   r<  O  s   r<  c                   @   s.   e Zd ZdZeedƒreZdd„ Zdd„ Z	dS )ÚUnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.r“  c                 C   s   t ƒ | _t | ¡ d S rÁ   )r3  r  r<  r>   r[   r<   r<   r=   r>   š  s    zUnixSysLogHandlerTest.setUpc                 C   s   t  | ¡ t | j¡ d S rÁ   )r<  rE   r   rô   r  r[   r<   r<   r=   rE   Ÿ  s    
zUnixSysLogHandlerTest.tearDownNr;  r<   r<   r<   r=   r@  ’  s
   
r@  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                    s   t j| j_tt| ƒ ¡  d S rÁ   )r\  ÚAF_INET6r  r–  r'  rA  r>   r[   r+  r<   r=   r>   ¬  s    
zIPv6SysLogHandlerTest.setUpc                    s   t j| j_tt| ƒ ¡  d S rÁ   )r\  ÚAF_INETr  r–  r'  rA  rE   r[   r+  r<   r=   rE   °  s    
zIPv6SysLogHandlerTest.tearDown)
r]   r^   r_   r`   rŽ  r  r  r>   rE   r0  r<   r<   r+  r=   rA  £  s
   rA  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú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   r>   r  r;  rž  r[   r<   r<   r=   r>   ·  s    
zHTTPHandlerTest.setUpc                 C   sr   |j | _ t|jƒ| _| j dkrRz t|jd ƒ}|j |¡| _W n   d | _Y n0 | 	d¡ | 
¡  | j ¡  d S )Nrì   zContent-LengthéÈ   )Úcommandr	   rú   Úlog_dataÚintZheadersZrfilerR   Ú	post_dataZsend_responseZend_headersrž  r4  )r:   r(  Zrlenr<   r<   r=   Úhandle_request½  s    

zHTTPHandlerTest.handle_requestc              	   C   sÞ  t  d¡}| j}| | jjd ¡ dD ]°}d}|r–zdd l}W n tyV   d }Y qž0 tj 	t
¡}tj |d¡}| |j¡}| |¡ |j|d}	nd }d }	t|| jd|d | _}
|
 ¡  |
j ¡  d	|
j }|oØ|}t jj|d
||	dd| _d | _| | j¡ dD ]¬}|| j_| j ¡  d}| |¡ | j ¡  |  | jjd
¡ |  | j |¡ |dkrlt!| 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cafiler  )r„  zlocalhost:%dz/frob)ÚfooÚbar)ÚsecureÚcontextZcredentials)rë   rì   r>  rë   úutf-8r;   ÚfuncNamer0  rê   )'r   r   r'   r@   r6   ÚsslÚImportErrorró   rú   ÚdirnameÚ__file__r¢   Z
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextrx  rJ  r  r!  ru  r5  Zserver_portrÿ   Zh_hdlrrG  r8   r  rž  rA   rv   rK   rF  r
   ÚqueryrI  Údecoders  r?   )r:   rÐ   r'   rN  rc  rR  r„  ÚhereZlocalhost_certrO  r  ÚhostZsecure_clientr  rê   Údr<   r<   r=   r0  Ê  s`    



ÿ


ý




zHTTPHandlerTest.test_outputN)r]   r^   r_   r`   r>   rJ  r0  r<   r<   r<   r=   rD  ´  s   rD  c                   @   s0   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   r>   Ú
_survivorsr[   r<   r<   r=   r>     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)ÚidrV  ÚweakrefÚrefr\  )r:   r  r,  Úkeyr<   r<   r=   Ú_watch_for_survival
  s    zMemoryTest._watch_for_survivalc                 C   s\   t  ¡  g }| j ¡ D ] \\}}}|ƒ du r| |¡ q|rX|  dt|ƒd |¡f ¡ 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¢  rO   rL   r¢   )r:   ZdeadZid_Úrepr_r_  r<   r<   r=   Ú_assertTruesurvival  s    
ÿzMemoryTest._assertTruesurvivalc                 C   sŒ   | j  tj¡ t d¡}|  |¡ | tj¡ | j  |  ¡ ¡ | |  ¡ ¡ |  	dg¡ ~|  
¡  t d¡}| |  ¡ ¡ |  	ddg¡ d S )NrL  )rL  r.   rh   )rL  r.   ri   )r'   r-   r   rm   r   ra  r.   ry   r\   rX   rd  )r:   rL  rM  r<   r<   r=   Útest_persistent_loggers  s"    

ÿ
þz"MemoryTest.test_persistent_loggersN)r]   r^   r_   r`   r>   ra  rd  re  r<   r<   r<   r=   r[    s
   r[  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚEncodingTestc              	   C   sæ   t  d¡}t dd¡\}}t |¡ d}z t j|dd}| |¡ z | |¡ W | 	|¡ | ¡  n| 	|¡ | ¡  0 t
|dd}z |  | ¡  ¡ |¡ W | ¡  n
| ¡  0 W tj |¡rât |¡ ntj |¡ràt |¡ 0 d S )NÚtestr  ztest_logging-1-u   fooÂ€rP  ©Úencoding)r   r   rñ   rò   ró   r?   r	  r8   rw   r@   r)  rK   rR   Úrstriprú   Úisfilerô  )r:   ru   r  r  rD  rš   rª   r<   r<   r=   Útest_encoding_plain_file6  s*    




ÿ

ÿz%EncodingTest.test_encoding_plain_filec              	   C   s’   t  d¡}d}t d¡}d|_t ¡ }||dƒ}t  |¡}| |¡ z | 	|¡ W | 
|¡ | ¡  n| 
|¡ | ¡  0 | ¡ }|  |d¡ d S )Nrg  u   Ð´Ð¾ ÑÐ²Ð¸Ð´Ð°Ð½Ð¸ÑÚcp1251Ústricts   äî ñâèäàíèÿ
)r   r   ÚcodecsÚ	getwriterri  r*   ÚBytesIOr/   r8   rw   r@   r?   rI   rK   )r:   ru   ÚmessageZwriter_classr,   Úwriterrš   rW   r<   r<   r=   Útest_encoding_cyrillic_unicodeP  s     






ÿ

z+EncodingTest.test_encoding_cyrillic_unicodeN)r]   r^   r_   rl  rt  r<   r<   r<   r=   rf  5  s   rf  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚWarningsTestc              	   C   sæ   t  ¡ Ê 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   ƒ n1 sØ0    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+   r/   r   r8   Úwarnr@   rI   r?   r9  ÚfindÚshowwarningrK   )r:   r,   rD   rÐ   rW   Za_filer<   r<   r=   Útest_warningsh  s,    






ÿÿzWarningsTest.test_warningsc                 C   s’   t  ¡ v t d¡ |  tjd¡ t d¡}|  |jg ¡ t  dt	dd¡ |  t
|jƒd¡ |  |jd tj¡ W d   ƒ n1 s„0    Y  d S )	NTFrx  ry  rz  r{  rY   r   )r|  r}  r   r~  rŽ   r   rK   r6   rƒ  r€  rL   ÚassertIsInstanceÚNullHandlerr  r<   r<   r=   Útest_warnings_no_handlers€  s    


z&WarningsTest.test_warnings_no_handlersN)r]   r^   r_   r„  r‡  r<   r<   r<   r=   ru  f  s   ru  c                 C   s   t  | |¡S rÁ   )r   r1   )r  r	  r<   r<   r=   Ú
formatFuncŽ  s    rˆ  c                   @   s   e Zd Zddd„ZdS )ÚmyCustomFormatterNc                 C   s   d S rÁ   r<   )r:   Úfmtr	  r<   r<   r=   r(  ’  s    zmyCustomFormatter.__init__)N)r]   r^   r_   r(  r<   r<   r<   r=   r‰  ‘  s   r‰  c                   C   s   t  ¡ S rÁ   )r   r/   r<   r<   r<   r=   ÚhandlerFunc•  s    r‹  c                   @   s   e Zd ZdS )ÚCustomHandlerN©r]   r^   r_   r<   r<   r<   r=   rŒ  ˜  s   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„ Z9dŽdtdu„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„ ZFdsS )ÚConfigDictTestz)Reading logging config from a dictionary.rÀ  rY   Úform1r  z%(levelname)s ++ %(message)sr  zlogging.StreamHandlerrŒ   zext://sys.stdout)r
  Ú	formatterrJ  r,   rk   ©rJ  r6   )r  r  r6   rý  rÕ  r.   rJ  )r  r  r6   Ú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)r
  r  rJ  r,   rq   rí  F)Úcompilerrí  )r  rÿ  r  r6   r’  rý  Trm   )r  Zincrementalr6   r’  Zfilt1r;   )r
  r  rJ  r,   Úfilters)rJ  r•  )r  r  r•  r6   r’  rý  zcfg://true_formatterszcfg://handler_configs[hand1])r  Útrue_formattersÚhandler_configsr  r6   r’  rý  )r–  r—  r  r6   r’  rý  r    rM  ú!
)rL  Ú
terminator)r
  r  rJ  r,   rŸ   ÚmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)sú$)r  Ústyle)r
  rJ  r  zlogging.handlers.MemoryHandleré   Ú
fileGlobal)r
  Zcapacityr  r  rJ  )rž  ÚbufferGlobalÚmymodulerŸ  Útrue)rJ  r6   r¨  )r  r  r6   r’  )r“  r  ÚvalidateÚmy_test_logger_custom_formatter)r
  r  r¢  z.myCustomFormatterc                 C   s   t j |¡ d S rÁ   )r   rÃ  Z
dictConfig)r:   rÅ  r<   r<   r=   rÈ    s    zConfigDictTest.apply_configc                 C   sv   t  ¡ Z}|  | j¡ t ¡ }| |  ¡ ¡ | |  ¡ ¡ | j	dg|d |  	g ¡ W d   ƒ n1 sh0    Y  d S rÉ  rË  rÎ  r<   r<   r=   rÐ  „  s    
ÿþzConfigDictTest.test_config0_okc                 C   sx   t  ¡ \}|  |¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | jddg|d |  g ¡ W d   ƒ n1 sj0    Y  d S rÔ  r×  rØ  r<   r<   r=   rÙ  “  s    


þýzConfigDictTest.test_config1_okc                 C   s   |   t| j| j¡ d S rÁ   rÚ  r[   r<   r<   r=   rÜ  ¢  s    z#ConfigDictTest.test_config2_failurec                 C   s   |   t| j| j¡ d S rÁ   )rß   r"  rÈ  Úconfig2ar[   r<   r<   r=   Útest_config2a_failure¦  s    z$ConfigDictTest.test_config2a_failurec                 C   s   |   t| j| j¡ d S rÁ   )rß   r"  rÈ  Úconfig2br[   r<   r<   r=   Útest_config2b_failureª  s    z$ConfigDictTest.test_config2b_failurec                 C   s   |   t| j| j¡ d S rÁ   rÝ  r[   r<   r<   r=   rß  ®  s    z#ConfigDictTest.test_config3_failurec              	   C   s†   t  ¡ j}|  | j¡ z
tƒ ‚W n ty<   t d¡ Y n0 tj 	d¡ |  
| ¡ d¡ |  g ¡ W d   ƒ n1 sx0    Y  d S rà  )r   rÌ  rÈ  rá  rB  r   râ  rï   rã  rä  rK   rI   rX   ©r:   rÏ  r<   r<   r=   rå  ²  s    


ÿzConfigDictTest.test_config4_okc              	   C   s†   t  ¡ j}|  | j¡ z
tƒ ‚W n ty<   t d¡ Y n0 tj 	d¡ |  
| ¡ d¡ |  g ¡ W d   ƒ n1 sx0    Y  d S rà  )r   rÌ  rÈ  Úconfig4arB  r   râ  rï   rã  rä  rK   rI   rX   r¨  r<   r<   r=   Útest_config4a_okÁ  s    


ÿzConfigDictTest.test_config4a_okc                 C   s   | j | jd d S ræ  rç  r[   r<   r<   r=   ré  Ð  s    zConfigDictTest.test_config5_okc                 C   s   |   t| j| j¡ d S rÁ   )rß   r"  rÈ  rê  r[   r<   r<   r=   Útest_config6_failureÓ  s    z#ConfigDictTest.test_config6_failurec                 C   s  t  ¡ ^}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ n1 sl0    Y  t  ¡ t}|  | j
¡ t d¡}|  |j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ n1 sø0    Y  d S )NrÕ  rÖ  rÊ  r&  rí  ©rm   ri   ©rg   rj   )r   rÌ  rÈ  r  r   r   rx   r\   rv   rX   rð  r9   r   rÎ  r<   r<   r=   rò  Ö  s4    

þý(


þýzConfigDictTest.test_config7_okc                 C   s$  t  ¡ ^}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d   ƒ n1 sl0    Y  t  ¡ }|  | j
¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	g d¢|d |  	g ¡ W d   ƒ n1 s0    Y  d S )NrÕ  rÖ  rÊ  r&  rí  )r¬  r­  ©rm   rl   ©rg   rn   )r   rÌ  rÈ  r  r   r   rx   r\   rv   rX   rü  rù   r   rÎ  r<   r<   r=   Útest_config_8_okó  s2    

þý(



ûzConfigDictTest.test_config_8_okc                 C   sJ  t  ¡ v}|  | j¡ t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ n1 s„0    Y  t  ¡ ž}|  | j¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
g d¢|d |  
g ¡ W d   ƒ n1 s<0    Y  d S rì  )r   rÌ  rÈ  rî  r   r   rx   r\   rv   rï  rX   Úconfig8arù   r   rñ  r<   r<   r=   Útest_config_8a_ok  s2    



ü(



ûz ConfigDictTest.test_config_8a_okc                 C   s°   t  ¡ ”}|  | j¡ t d¡}| |  ¡ ¡ | jg |d |  | j	¡ | |  ¡ ¡ | jg |d |  | j
¡ | |  ¡ ¡ | jdg|d W d   ƒ n1 s¢0    Y  d S )NrÕ  r&  r¬  )r   rÌ  rÈ  Úconfig9r   r   rx   r\   rX   Úconfig9aÚconfig9brÎ  r<   r<   r=   Útest_config_9_ok?  s    

ÿþzConfigDictTest.test_config_9_okc                 C   sª   t  ¡ Ž}|  | j¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ t d¡}| |  ¡ ¡ | j	ddg|d W d   ƒ n1 sœ0    Y  d S ©NrÕ  r”  rí  zcompiler.parser.codegen)rk   rf   r­  r&  )
r   rÌ  rÈ  Úconfig10r   r   rw   r\   rv   rX   rÎ  r<   r<   r=   Útest_config_10_okQ  s     




þýz ConfigDictTest.test_config_10_okc                 C   s   |   | j¡ d S rÁ   )rÙ  Úconfig11r[   r<   r<   r=   Útest_config11_okd  s    zConfigDictTest.test_config11_okc                 C   s   |   t| j| j¡ d S rÁ   )rß   r"  rÈ  Úconfig12r[   r<   r<   r=   Útest_config12_failureg  s    z$ConfigDictTest.test_config12_failurec                 C   s   |   t| j| j¡ d S rÁ   )rß   r"  rÈ  Úconfig13r[   r<   r<   r=   Útest_config13_failurej  s    z$ConfigDictTest.test_config13_failurec                 C   s|   t  ¡ `}|  | j¡ tjd }|  |jd¡ |  |jd¡ t 	d¡ |  
| ¡  d¡¡ W d   ƒ n1 sn0    Y  d S )Nr  rM  r˜  ZExclamationzExclamation!
)r   rÌ  rÈ  Úconfig14r   r   rK   rL  r™  rw   r9   rI   r   )r:   rÏ  rD   r<   r<   r=   Útest_config14_okm  s    


zConfigDictTest.test_config14_okc                 C   s˜   dd„ }|   ¡ Z t dd¡\}}t |¡ ddd|dœid	dgid
œ}|  |¡ |  |¡ W d   ƒ n1 sp0    Y  tjjd }|  	|||¡ d S )Nc                 S   s   |   ¡  t |¡ d S rÁ   ró  rõ  r<   r<   r=   r÷  x  s    z0ConfigDictTest.test_config15_ok.<locals>.cleanupr  rø  rY   rÇ  zlogging.FileHandler)r
  Úfilenamer6   ©r  r6   rý  r   )
rú  rñ   rò   ró   r?   rÈ  r   rý  r6   rŽ   )r:   r÷  r  r  rÃ  rš   r<   r<   r=   Útest_config15_okv  s"    

þÿÿø
(zConfigDictTest.test_config15_okNc              	   C   s  |  d¡}tj d|¡}| ¡  |j ¡  |j}|j ¡  z¤t	 	t	j
t	j¡}| d¡ | d|f¡ t dt|ƒ¡}|| }d}t|ƒ}	|	dkr´| ||d … ¡}
||
7 }|	|
8 }	qˆ| ¡  W |j d¡ tj ¡  t |¡ n"|j d¡ tj ¡  t |¡ 0 d S )NrP  r   g       @rî   r   )r  r   rÃ  Úlistenr!  ru  r5  r^  rA   r\  rC  ÚSOCK_STREAMÚ
settimeoutÚconnectr$  r7  rL   Úsendr?   ZstopListeningr   rr  )r:   ÚtextZverifyrm  r^  r†  r+  rW   Z	sentsofarÚleftÚsentr<   r<   r=   Úsetup_via_listener“  s2    






þ
z!ConfigDictTest.setup_via_listenerc                 C   s°   t  ¡ ”}|  t | j¡¡ t d¡}| |  	¡ ¡ t d¡}| |  	¡ ¡ t d¡}| |  	¡ ¡ t d¡}| 
|  	¡ ¡ | jddg|d W d   ƒ n1 s¢0    Y  d S r·  )r   rÌ  rÍ  ÚjsonÚdumpsr¸  r   r   rw   r\   rv   rX   rÎ  r<   r<   r=   Útest_listen_config_10_ok¯  s     




þýz'ConfigDictTest.test_listen_config_10_okc                 C   s€   t  ¡ d}|  t tj¡¡ t d¡}| 	|  
¡ ¡ | |  
¡ ¡ | jddg|d |  g ¡ W d   ƒ n1 sr0    Y  d S rÔ  )r   rÌ  rÍ  rÁ  rÂ  r¿  r  r   r   rx   r\   rv   rX   rÎ  r<   r<   r=   Ú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 ¡ 8}|  ||¡ | 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 sl0    Y  | jg |d | jddgd	d
 t ¡ @}|  |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 sä0    Y  | jddg|d | jddgd	d
 t ¡ L}|  |d d d… |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d   ƒ n1 sn0    Y  | jddg|d | jddgd	d
 d S )Nc                 S   s   d S rÁ   r<   ©Ústuffr<   r<   r=   Úverify_failÒ  s    z6ConfigDictTest.test_listen_verify.<locals>.verify_failc                 S   s   | d d d… S )Nré   r<   rÒ  r<   r<   r=   Úverify_reverseÕ  s    z9ConfigDictTest.test_listen_verify.<locals>.verify_reverserÕ  r&  rÖ  rÊ  rÊ   )rS   r¬  r­  ré   r®  r¯  )r   r   rÁ  rÂ  r¿  r  r   rÌ  rÍ  rx   r\   rv   rX   )r:   rÔ  rÕ  rÐ   Zto_sendrÏ  r<   r<   r=   Útest_listen_verifyÐ  sb    

,þý


,þýþý

.þýþýz!ConfigDictTest.test_listen_verifyc                 C   s   |   t| j| j¡ d S rÁ   )rß   rþ   rÈ  Úout_of_orderr[   r<   r<   r=   Útest_out_of_order  s    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}r  rš  r  r   r   )r   Údeepcopyr×  rÈ  r   r   r6   r…  r  rÞ   r  Ú_styleÚStringTemplateStyle©r:   rÃ  rš   r<   r<   r=   Ú#test_out_of_order_with_dollar_style  s    

ÿz2ConfigDictTest.test_out_of_order_with_dollar_stylec                 C   s.   |   | j¡ t d¡jd }|  |jt¡ d S ©Nr£  r   )rÈ  Úcustom_formatter_class_validater   r   r6   r…  r  r¼  ©r:   rš   r<   r<   r=   Ú)test_custom_formatter_class_with_validate  s    z8ConfigDictTest.test_custom_formatter_class_with_validatec                 C   s.   |   | j¡ t d¡jd }|  |jt¡ d S rÞ  )rÈ  Ú custom_formatter_class_validate2r   r   r6   r…  r  r¼  rà  r<   r<   r=   Ú*test_custom_formatter_class_with_validate2   s    z9ConfigDictTest.test_custom_formatter_class_with_validate2c                 C   sF   | j  ¡ }d|d d d< |  |¡ t d¡jd }|  |jt¡ d S )Nr›  r  r  rœ  r£  r   )	rß  r   rÈ  r   r   r6   r…  r  r¼  rÜ  r<   r<   r=   Ú9test_custom_formatter_class_with_validate2_with_wrong_fmt%  s
    

zHConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmtc                 C   s   |   t| j| j¡ d S rÁ   )rß   rþ   rÈ  Ú custom_formatter_class_validate3r[   r<   r<   r=   Ú*test_custom_formatter_class_with_validate3.  s    z9ConfigDictTest.test_custom_formatter_class_with_validate3c                 C   s   |   t| j| j¡ d S rÁ   )rß   rþ   rÈ  Úcustom_formatter_with_functionr[   r<   r<   r=   Ú,test_custom_formatter_function_with_validate1  s    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)rY   r    é   )r  ÚbÚcr‡  ré  )rZ  rª   )Úg)rD   r¯  ÚjrÍ   Úlrz   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]rD   zcfg://nest2[1][1]zcfg://adict.dzcfg://adict[f]zcfg://nest3rY   zcfg://nosuchzcfg://!zcfg://adict[2])	r   rÃ  ZBaseConfiguratorrK   ÚconvertÚpoprß   ÚKeyErrorrþ   )r:   rZ  ZbcrÎ   r<   r<   r=   Útest_baseconfig4  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 sŽ0    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Á   )r'  r(  Úresource)r:   r÷  r  rÆ  )r,  rö  r<   r=   r(  O  s    z:ConfigDictTest.test_namedtuple.<locals>.MyHandler.__init__c                    s$   | j d| jj› 7  _ tƒ  |¡S ©Nú )rê   r÷  Útyper'  rá   rÄ   r+  r<   r=   rá   S  s    z6ConfigDictTest.test_namedtuple.<locals>.MyHandler.emitr/  r<   rõ  r+  r=   Ú	MyHandlerN  s   rû  ÚResourcerú  ÚlabelsZmy_typer  )rú  rý  rY   Z	myhandler)r“  r÷  rm   r‘  rÃ  zsome logzsome log my_type
)
Úcollectionsrö  r   r/   r   rN  rÈ  rx   rK   rI   )r:   rû  rü  r÷  rÃ  rP  r<   rõ  r=   Útest_namedtupleJ  s     	þÿ
ø


(zConfigDictTest.test_namedtuple)N)Gr]   r^   r_   r`   r   rú  rH   rÍ  r  rî  rÛ  r¤  r¦  rÞ  rá  r¼  rˆ  r‹  r©  rè  rê  rð  rü  r±  r³  r´  rµ  r¸  rº  r¼  r¾  rÀ  r×  rß  râ  rå  rç  rÈ  rÐ  rÙ  rÜ  r¥  r§  rß  rå  rª  ré  r«  rò  r°  r²  r¶  r¹  r»  r½  r¿  rÁ  rÄ  rÍ  rÐ  rÑ  rÖ  rØ  rÝ  rá  rã  rä  ræ  rè  rô  rÿ  r<   r<   r<   r=   rŽ  ›  s†  ÿÿüÿ	þñÿÿüÿ	þÿÿëÿÿüÿ	ÿÿþìÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëÿÿüÿ	þÿÿëþÿüÿ	þðþþþ÷üÿùþå#ÿÿüÿ	þÿÿëÿÿûÿ
þÿÿêÿÿüÿ	þÿÿëÿÿüÿ
þû	ÿèÿÿüÿ
þû	ÿèÿÿüÿ	þÿÿëÿÿÿÿøÿÿÿÿøÿÿÿÿûÿ
þÿþå#ÿÿüÿÿþÿÿç!ÿÿüÿÿþÿÿèÿÿüÿÿþÿÿç ÿÿþûÿþíþÿýûúýÿê!ýÿüÿ	ýÿïýÿüÿ	ýÿïýÿüÿ	ýÿïýÿüÿ	ýÿï!+	
>
	rŽ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú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:   rJ  rê   r  Úexc_infoÚextra©Zloggedr<   r=   Ú_logn  s    z;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._log)NN)r]   r^   r_   r  r<   r  r<   r=   ÚMyLoggerm  s   r  rg  zshould appear in loggedzshould not appear in logged)
r   ÚLoggerÚManagerrß   Ú	TypeErrorÚsetLoggerClassrH  r   rw   rK   )r:   r  ÚmanrÐ   r<   r  r=   Útest_manager_loggerclassj  s    




z$ManagerTest.test_manager_loggerclassc                 C   s,   t  d ¡}tƒ }| |¡ |  |j|¡ d S rÁ   )r   r  ÚobjectÚsetLogRecordFactoryrK   ÚlogRecordFactory)r:   r  rU   r<   r<   r=   Útest_set_log_record_factoryz  s    

z'ManagerTest.test_set_log_record_factoryN)r]   r^   r_   r  r  r<   r<   r<   r=   r   i  s   r   c                   @   s   e Zd Zdd„ ZdS )Ú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   ÚgetChildrM  )r:   r«   Úl1Úl2Úc1Úc2Zc3r<   r<   r=   Útest_child_loggers  s    






z"ChildLoggerTest.test_child_loggersN)r]   r^   r_   r  r<   r<   r<   r=   r  €  s   r  c                   @   s   e Zd ZdS )ÚDerivedLogRecordNr  r<   r<   r<   r=   r  ‘  s   r  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚLogRecordFactoryTestc                 C   sB   G dd„ dt jƒ}t | ¡ |tƒ| _| j | j¡ t  ¡ | _	d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z2LogRecordFactoryTest.setUp.<locals>.CheckingFilterc                 S   s
   || _ d S rÁ   )r  )r:   r  r<   r<   r=   r(  ˜  s    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  r	  )r:   r£   rm  rê   r<   r<   r=   r©   ›  s    
ÿz9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)r]   r^   r_   r(  r©   r<   r<   r<   r=   ÚCheckingFilter—  s   r  )
r   r—   r   r>   r  r©   r'   r˜   ÚgetLogRecordFactoryÚorig_factory)r:   r  r<   r<   r=   r>   –  s
    

zLogRecordFactoryTest.setUpc                 C   s(   | j  | j¡ t | ¡ t | j¡ d S rÁ   )r'   r™   r©   r   rE   r   r  r  r[   r<   r<   r=   rE   ¨  s    
zLogRecordFactoryTest.tearDownc                 C   s@   |   t| jj|  ¡ ¡ t t¡ | j |  ¡ ¡ |  	dg¡ d S )N)rý  rg   rh   )
rß   r	  r'   rw   r\   r   r  r  rv   rX   r[   r<   r<   r=   Útest_logrecord_class­  s    ÿ
ÿz)LogRecordFactoryTest.test_logrecord_classN)r]   r^   r_   r>   rE   r   r<   r<   r<   r=   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   r>   ÚqueueÚQueuer   r6   ÚQueueHandlerÚque_hdlrr;   r   Ú
que_loggerr¨  r-   rk   r8   r[   r<   r<   r=   r>   »  s    
zQueueHandlerTest.setUpc                 C   s   | j  ¡  t | ¡ d S rÁ   )r%  r?   r   rE   r[   r<   r<   r=   rE   Å  s    
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Á   )r&  ry   r\   rß   r"  ÚEmptyÚ
get_nowaitrx   rw   r9   r  r   Ú	LogRecordrK   r;   rê   r  )r:   rê   rD  r<   r<   r=   Ú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;   Ú	levelnamerr  )r\   r   rˆ   rk   r  r;   r1   r2   r%  r4   r&  rw   r"  r(  rK   rê   rr  )r:   rê   r+  Zlog_format_strZformatted_msgr  Z
log_recordr<   r<   r=   Ú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
| ¡  0 |  |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
| ¡  0 |  |jtjdd¡ |  |jtjdd¡ |  |jtjd	d¡ | ¡  d S )
Nrf   )rÂ   rr  rh   ri   T)Zrespect_handler_levelrj   rl   rn   )r   r   ZMatcherr   r6   r-  r"  r!  r&  rw   r\   rv   rï  rs  r9   Úmatchesrk   rg   re   r?   r-   rù   )r:   rš   Úlistenerr<   r<   r=   Útest_queue_listenerâ  s6    ÿz$QueueHandlerTest.test_queue_listenerc              
   C   sŒ   t j | j| j¡}| ¡  zdd  W n< tyb } z$|}| jj|  	¡ |d W Y d }~n
d }~0 0 | 
¡  |  | j ¡  ¡  d¡d¡ d S )NrY   r   ©r  Z	Traceback)r   r6   r-  r"  r0   r!  ÚZeroDivisionErrorr&  râ  r\   rs  rK   r,   rI   r  rn  )r:   r/  r‡  Úexcr<   r<   r=   Ú&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 )Nrv   zque -> ERROR: error)r%  r4   r3   r&  r8   r0   r   r6   r-  r"  r!  rv   rs  rK   r,   rI   r  )r:   r/  r<   r<   r=   Ú*test_queue_listener_with_multiple_handlers  s    z;QueueHandlerTest.test_queue_listener_with_multiple_handlersN)r]   r^   r_   rH   r>   rE   r*  r,  r>  Ú
skipUnlessr?  r   r6   r0  r4  r5  r<   r<   r<   r=   r!  ·  s"   
ÿ
!ÿ
ÿr!  r-  )Ú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   r-   r.   r6   r$  r8   r-  r!  rx   rs  r@   r?   )Ú	log_queuer?  rÐ   rš   r/  r<   r<   r=   Úsetup_and_log,  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  Úrepeatr"  r#  r=  r]  rK   Ú
call_count©r:   Zmock_handler¯  r<  r<   r<   r=   Ú#test_handle_called_with_queue_queueD  s    ÿz5QueueListenerTest.test_handle_called_with_queue_queuec                 C   sb   t  ¡  t| jƒD ]4}t ¡ }|  |d|  ¡ |f ¡ | ¡  | 	¡  q|  
|jd| j d¡ d S r>  )r   Ú*skip_if_broken_multiprocessing_synchronizer  r@  Úmultiprocessingr#  r=  r]  r?   rr  rK   rA  rB  r<   r<   r=   Ú test_handle_called_with_mp_queueL  s    
ÿz2QueueListenerTest.test_handle_called_with_mp_queuec                 c   s.   z|   ¡ V  qW n tjy(   g  Y S 0 d S rÁ   )r(  r"  r'  )r<  r<   r<   r=   Úget_all_from_queueY  s    z$QueueListenerTest.get_all_from_queuec                 C   s†   t  ¡  t| jƒD ]n}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<   )r  r   r)  rê   )r®  rz   r<   r<   r=   r°  v  s   ÿzJQueueListenerTest.test_no_messages_in_queue_after_stop.<locals>.<listcomp>N)r   rD  r  r@  rE  r#  r=  r]  ÚlistrG  r?   rr  r   r6   r-  Ú	_sentinelrO  )r:   r¯  r"  rÌ   rU   r<   r<   r=   Ú$test_no_messages_in_queue_after_stopa  s    	ÿÿÿz6QueueListenerTest.test_no_messages_in_queue_after_stopc                 C   sZ   t  ¡ }tj |¡}| ¡  | ¡  |  t¡ | 	¡  W d   ƒ n1 sL0    Y  d S rÁ   )
r"  r#  r   r6   r-  r!  rs  rß   rþ   Ú	task_done)r:   r<  r/  r<   r<   r=   Útest_calls_task_done_after_stopy  s    z1QueueListenerTest.test_calls_task_done_after_stopN)r]   r^   r_   r`   r@  Ústaticmethodr=  r7  r  r   r6   r-  rC  rF  rG  rJ  rL  r<   r<   r<   r=   r8  $  s   



r8  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<   r=   Ú	utcoffset‡  s    zUTC.utcoffsetc                 C   s   dS )NrN  r<   rP  r<   r<   r=   ÚtznameŒ  s    z
UTC.tznameN)r]   r^   r_   rR  ÚdstrS  r<   r<   r<   r=   rN  †  s   rN  c                   @   s^   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S )ÚFormatterTestc              	   C   s0   dt jtj ddd¡dd d dddœ| _i | _d S )	Nzformatter.testrú   Útoz	dummy.extr{  zMessage with %d %s)r    Zplaceholders)r;   rJ  ÚpathnameÚlinenor  Úfuncrê   r  )r   r.   ró   rú   r¢   ÚcommonÚvariantsr[   r<   r<   r=   r>   ’  s    ø
zFormatterTest.setUpNc                 C   s,   t | jƒ}|d ur"| | j| ¡ t |¡S rÁ   )r  rZ  rB   r[  r   r¨   )r:   r;   Úresultr<   r<   r=   Ú
get_record   s    
zFormatterTest.get_recordc              
   O   sT   z| j |g|¢R i |¤Ž W n2 |yN } z|  ||j¡ W Y d }~n
d }~0 0 d S rÁ   )rß   rK   rr  )r:   râ  rr  r  rÆ  r‡  r<   r<   r=   Úassert_error_message¦  s    z"FormatterTest.assert_error_messagec                 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   r1   rK   r  rß   rþ   rù   ÚusesTimer9   ©r:   r«   rª   r<   r<   r=   Ú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`  rb  r<   r<   r=   Ú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›  re  zMessage with 2 placeholdersz$messagez$$%${message}%$$rf  z	${random}z
${asctime}z$asctimez${asctime}--r`  rb  r<   r<   r=   Ú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d0t jd2dd | jtt 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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d@dd | jtt jdAdd d S )BNzM%(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']}rd  re  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)_rg  ri  z%(foo)#12.3*fz%(foo)0*.8*fz+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bad specifier: '.2ff'z{process:.2ff}z{process:.2Z}z{process!s:<##30,12g}z{process!s:<#30#,12g}z{process!s:{{w}},{{p}}}z,invalid format: unmatched '{' in format specz{processz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 $.rL  z	${asctime)r   r1   rK   Ú_fmtrß   rþ   r^  ©r:   rª   r<   r<   r=   Útest_format_validateà  sü    



ýýþýýýýýýýýýz"FormatterTest.test_format_validatec                 C   s   |   ttjd d d¡ d S )NÚx)rß   rþ   r   r1   r[   r<   r<   r=   Útest_invalid_stylev  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   r1   ÚgmtimeÚ	converterrK   Ú
formatTimer  Úasctime)r:   r«   rQ  rª   r<   r<   r=   Ú	test_timey  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)r]   r^   r_   Údefault_msec_formatÚdefault_time_formatr<   r<   r<   r=   ÚNoMsecFormatterˆ  s   rƒ  rp  r  rq  rr  ré  r   rs  z21/04/1993 08:03:00)r   r1   r]  ru  rv  r  rw  rx  ry  rz  r|  r}  rK   r~  )r:   rƒ  r«   rQ  rª   r<   r<   r=   Útest_default_msec_format_none‡  s    z+FormatterTest.test_default_msec_format_none)N)r]   r^   r_   r>   r]  r^  rc  rh  rj  rm  ro  r€  r„  r<   r<   r<   r=   rU  ‘  s   
 rU  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestBufferingFormatterc                 C   s   dt |ƒ S )Nz[(%d)©rL   ©r:   Úrecordsr<   r<   r=   ÚformatHeader•  s    z#TestBufferingFormatter.formatHeaderc                 C   s   dt |ƒ S )Nz(%d)]r†  r‡  r<   r<   r=   ÚformatFooter˜  s    z#TestBufferingFormatter.formatFooterN)r]   r^   r_   r‰  rŠ  r<   r<   r<   r=   r…  ”  s   r…  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚBufferingFormatterTestc                 C   s"   t  ddi¡t  ddi¡g| _d S )Nrê   r:  r;  )r   r¨   rˆ  r[   r<   r<   r=   r>   œ  s    þzBufferingFormatterTest.setUpc                 C   s2   t  ¡ }|  d| g ¡¡ |  d| | j¡¡ d S )Nr   Zonetwo)r   ÚBufferingFormatterrK   r  rˆ  rl  r<   r<   r=   Ú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…  rK   r  rˆ  r   r1   )r:   rª   Zlfr<   r<   r=   Útest_custom§  s
    
z"BufferingFormatterTest.test_customN)r]   r^   r_   r>   r  rŽ  r<   r<   r<   r=   r‹  ›  s   r‹  c                   @   s   e Zd Zdd„ ZdS )ÚExceptionTestc                 C   s¦   | j }tƒ }| |¡ ztdƒ‚W n   tjddd Y n0 | |¡ | ¡  |jd }|  	|j
 d¡¡ |  	|j
 d¡¡ |  	|j d¡¡ |  	|j d	¡¡ d S )
NrA  ZfailedT©Ú
stack_infor   z#Traceback (most recent call last):
z!
RuntimeError: deliberate mistakeúStack (most recent call last):
z,logging.exception('failed', stack_info=True))r'   ÚRecordingHandlerr8   rB  r   râ  r@   r?   rˆ  r9   Úexc_textry  r   r‘  )r:   r«   rD   r<   r<   r=   r,  ¯  s    


zExceptionTest.test_formattingN)r]   r^   r_   r,  r<   r<   r<   r=   r  ®  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚLastResortTestc              	   C   sš  | j }| | j¡ tj}tj}zZt ¡ D}| d¡ |  	| 
¡ d¡ | d¡ |  	| 
¡ d¡ W d   ƒ n1 st0    Y  d t_t ¡ .}| d¡ d}|  	| 
¡ |¡ W d   ƒ n1 sÀ0    Y  t ¡ *}| d¡ |  	| 
¡ d¡ W d   ƒ n1 s0    Y  d|j_dt_t ¡ *}| d¡ |  	| 
¡ d¡ W d   ƒ n1 sV0    Y  W | | j¡ |t_|t_n| | j¡ |t_|t_0 d S )NzThis should not appearr   zFinal chance!zFinal chance!
z-No handlers could be found for logger "root"
F)r'   r@   r0   r   Ú
lastResortrL  r   rN  ry   rK   rI   rw   r   ÚemittedNoHandlerWarningr8   )r:   rý  Zold_lastresortZold_raise_exceptionsrP  rê   r<   r<   r=   Útest_last_resortÅ  s:    


.

.

0

2þzLastResortTest.test_last_resortN)r]   r^   r_   r˜  r<   r<   r<   r=   r•  Ä  s   r•  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFakeHandlerc              	   C   s$   dD ]}t | ||  |||¡ƒ qd S )N)r-  Úflushr?   r.  )ÚsetattrÚrecord_call)r:   Ú
identifierÚcalledr  r<   r<   r=   r(  í  s    zFakeHandler.__init__c                    s   ‡ ‡‡fdd„}|S )Nc                      s   ˆ   d ˆˆ¡¡ d S )Nz{} - {})r¢  r  r<   ©rž  r  Úmethod_namer<   r=   Úinnerò  s    z&FakeHandler.record_call.<locals>.innerr<   )r:   r  r   rž  r¡  r<   rŸ  r=   rœ  ñ  s    zFakeHandler.record_callN)r]   r^   r_   r(  rœ  r<   r<   r<   r=   r™  ë  s   r™  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r“  c                    s    t t| ƒj|i |¤Ž g | _d S rÁ   )r'  r“  r(  rˆ  )r:   r  rÆ  r+  r<   r=   r(  ù  s    zRecordingHandler.__init__c                 C   s   | j  |¡ dS )z&Keep track of all the emitted records.N)rˆ  r¢  rÄ   r<   r<   r=   rø   ý  s    zRecordingHandler.handle)r]   r^   r_   r(  rø   r0  r<   r<   r+  r=   r“  ÷  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 )NrL  )r'  r¢  r>   rž  r   rL  rŽ   r›  )r:   Zraise_exceptionsr+  r<   r=   r>     s    zShutdownTest.setUpc                    s   ‡ fdd„}|S )Nc                      s
   ˆ ƒ ‚d S rÁ   r<   r<   ©rv   r<   r=   r¡    s    z'ShutdownTest.raise_error.<locals>.innerr<   )r:   rv   r¡  r<   r£  r=   Úraise_error  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   rY   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ž  rY  r   r^  r_  rv  rH  rK   )r:   Zhandler0Zhandler1Zhandler2r6   rU   r<   r<   r=   Ú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_  rv  rH  rK   )r:   r  rv   rš   r6   r<   r<   r=   Ú_test_with_failure_in_method"  s
    z)ShutdownTest._test_with_failure_in_methodc                 C   s   |   dt¡ d S ©Nr-  ©r©  rý   r[   r<   r<   r=   Útest_with_ioerror_in_acquire+  s    z)ShutdownTest.test_with_ioerror_in_acquirec                 C   s   |   dt¡ d S ©Nrš  r«  r[   r<   r<   r=   Útest_with_ioerror_in_flush.  s    z'ShutdownTest.test_with_ioerror_in_flushc                 C   s   |   dt¡ d S ©Nr?   r«  r[   r<   r<   r=   Útest_with_ioerror_in_close1  s    z'ShutdownTest.test_with_ioerror_in_closec                 C   s   |   dt¡ d S rª  ©r©  rþ   r[   r<   r<   r=   Útest_with_valueerror_in_acquire4  s    z,ShutdownTest.test_with_valueerror_in_acquirec                 C   s   |   dt¡ d S r­  r±  r[   r<   r<   r=   Útest_with_valueerror_in_flush7  s    z*ShutdownTest.test_with_valueerror_in_flushc                 C   s   |   dt¡ d S r¯  r±  r[   r<   r<   r=   Útest_with_valueerror_in_close:  s    z*ShutdownTest.test_with_valueerror_in_closec                 C   s   dt _|  dt¡ d S )NFr-  ©r   rL  r©  Ú
IndexErrorr[   r<   r<   r=   Ú.test_with_other_error_in_acquire_without_raise=  s    z;ShutdownTest.test_with_other_error_in_acquire_without_raisec                 C   s   dt _|  dt¡ d S )NFrš  rµ  r[   r<   r<   r=   Ú,test_with_other_error_in_flush_without_raiseA  s    z9ShutdownTest.test_with_other_error_in_flush_without_raisec                 C   s   dt _|  dt¡ d S )NFr?   rµ  r[   r<   r<   r=   Ú,test_with_other_error_in_close_without_raiseE  s    z9ShutdownTest.test_with_other_error_in_close_without_raisec                 C   s   dt _|  t| jdt¡ d S )NTr-  ©r   rL  rß   r¶  r©  r[   r<   r<   r=   Ú+test_with_other_error_in_acquire_with_raiseI  s    
ÿz8ShutdownTest.test_with_other_error_in_acquire_with_raisec                 C   s   dt _|  t| jdt¡ d S )NTrš  rº  r[   r<   r<   r=   Ú)test_with_other_error_in_flush_with_raiseN  s    
ÿz6ShutdownTest.test_with_other_error_in_flush_with_raisec                 C   s   dt _|  t| jdt¡ d S )NTr?   rº  r[   r<   r<   r=   Ú)test_with_other_error_in_close_with_raiseS  s    
ÿz6ShutdownTest.test_with_other_error_in_close_with_raise)r]   r^   r_   r`   r>   r¤  r¨  r©  r¬  r®  r°  r²  r³  r´  r·  r¸  r¹  r»  r¼  r½  r0  r<   r<   r+  r=   r¢    s"   	r¢  c                   @   sr   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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                   @   s   e Zd ZdS )z;ModuleLevelMiscTest.test_disable.<locals>._NotAnIntOrStringNr  r<   r<   r<   r=   Ú_NotAnIntOrStringh  s   rÀ  ÚWARN)
r   rý  r   rC   rK   rŽ   rß   rþ   r	  re   )r:   Úold_disablerÀ  r<   r<   r=   Útest_disable]  s    


z ModuleLevelMiscTest.test_disableNc                    sÀ   g ‰ t  | td‡ fdd„¡ tƒ }tj |¡ tt|ƒ}|d urN||d|ƒ n
|d|ƒ |  t|j	ƒd¡ |j	d }|  | 
¡ d| ¡ |d ur”|ntt| ¡ ƒ}|  |j|¡ |  ˆ g ¡ d S )NÚbasicConfigc                     s   ˆ   | |f¡S rÁ   r  )r  Úkw©rž  r<   r=   Ú<lambda>w  r±  z/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rrY   r   )r   r7  r   r“  rý  r8   r#   rK   rL   rˆ  Ú
getMessageÚupperrÂ   )r:   r  rJ  Ú	recordingÚ
log_methodr£   Zexpected_levelr<   rÆ  r=   Ú	_test_logt  s     

ÿ


zModuleLevelMiscTest._test_logc                 C   s   |   dtj¡ d S ©Nru   )rÌ  r   rg   r[   r<   r<   r=   Útest_logŒ  s    zModuleLevelMiscTest.test_logc                 C   s   |   d¡ d S ©Nry   ©rÌ  r[   r<   r<   r=   Ú
test_debug  s    zModuleLevelMiscTest.test_debugc                 C   s   |   d¡ d S ©Nrx   rÐ  r[   r<   r<   r=   Ú	test_info’  s    zModuleLevelMiscTest.test_infoc                 C   s   |   d¡ d S ©Nrw   rÐ  r[   r<   r<   r=   Útest_warning•  s    z ModuleLevelMiscTest.test_warningc                 C   s   |   d¡ d S ©Nrv   rÐ  r[   r<   r<   r=   Ú
test_error˜  s    zModuleLevelMiscTest.test_errorc                 C   s   |   d¡ d S ©Nrï  rÐ  r[   r<   r<   r=   Útest_critical›  s    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                   @   s   e Zd ZdS )z;ModuleLevelMiscTest.test_set_logger_class.<locals>.MyLoggerNr  r<   r<   r<   r=   r  ¡  s   r  )rß   r	  r   r
  r  r  rK   ÚgetLoggerClass)r:   r  r<   r<   r=   Ú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  |¡}| |¡ z†| 	t j
¡ | d¡ |  | ¡  ¡ d¡ | d¡ | d¡ | 	t j¡ | d¡ |  | ¡ d¡ W | |¡ | ¡  t  t j¡ n | |¡ | ¡  t  t j¡ 0 d S )Nc                       s&   e Zd Zdejf‡ ‡fdd„	Z‡  ZS )z@ModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLoggerr  c                    s   t ƒ  ||¡ ˆ d¡ d S )NÚinitialized)r'  r(  r¢  )r:   r;   rJ  )r,  rr  r<   r=   r(  ¯  s    zIModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLogger.__init__)r]   r^   r_   r   rŒ   r(  r0  r<   ©rr  r+  r=   r  ®  s   r  Zjust_some_loggerrÜ  Zhellor   r   )r   rÚ  r
  r   rK   r*   r+   r/   r8   r-   r.   ry   rI   r  Útruncaterä  rm   r@   r?   r  )r:   r  rÐ   r,   rD   r<   rÝ  r=   Útest_subclass_logger_cacheª  s.    








þ
z.ModuleLevelMiscTest.test_subclass_logger_cachec                 C   s8   d}t d|ƒ\}}}| ¡ }|  d|¡ |  d|¡ d S )Na&  if 1:
            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   rW  rO  ©r:   ÚcodeÚrcÚoutÚerrr<   r<   r=   Útest_logging_at_shutdownÉ  s
    z,ModuleLevelMiscTest.test_logging_at_shutdownc                 C   s8   d}t d|ƒ\}}}| ¡ }|  d|¡ |  |d¡ d S )Nz†if 1:
            import logging

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

            rec()rà  z#Cannot recover from stack overflow.rY   )r   rW  ZassertNotInrK   rá  r<   r<   r=   Útest_recursion_errorÛ  s
    z(ModuleLevelMiscTest.test_recursion_error)N)r]   r^   r_   r`   rÃ  rÌ  rÎ  rÑ  rÓ  rÕ  r×  rÙ  rÛ  rß  ræ  rç  r<   r<   r<   r=   r¾  Y  s   
r¾  c                   @   s,   e Zd Zdd„ Z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­  r9   ry  r   )r:   r«   rW   r<   r<   r=   Útest_str_repì  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   r8   rw   rM  rˆ  r  rK   rr  r@   r?   )r:   rD   r«   rZ  r<   r<   r=   Útest_dict_argò  s    

zLogRecordTest.test_dict_argc                 C   sZ   t  i ¡}|  |jd¡ z*dd l}t  i ¡}|  |j| ¡ j¡ W n tyT   Y n0 d S )NÚMainProcessr   )r   r¨   rK   ÚprocessNamerE  Úcurrent_processr;   rS  )r:   r«   Úmpr<   r<   r=   Útest_multiprocessingý  s    

z"LogRecordTest.test_multiprocessingc                 C   sÄ   t  i ¡}| j}||jƒ ||jƒ ||jƒ ||jƒ t j}t j}t j	}z`dt _dt _dt _	t  i ¡}| j
}||jƒ ||jƒ ||jƒ ||jƒ W |t _|t _|t _	n|t _|t _|t _	0 d S )NF)r   r¨   ÚassertIsNotNoner¹  Ú
threadNameÚprocessrí  Ú
logThreadsÚlogProcessesÚlogMultiprocessingrS  )r:   r«   ZNOT_NONEZlog_threadsZlog_processesZlog_multiprocessingÚNONEr<   r<   r=   Útest_optional  s2    








þzLogRecordTest.test_optionalN)r]   r^   r_   rê  rë  rð  rø  r<   r<   r<   r=   rè  ë  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Á   )r'  rù  r>   r   rý  r6   r   r   r   r   r   rJ  r)   rŽ   r÷  r[   r+  r<   r=   r>   $  s    

zBasicConfigTest.setUpc                    s<   t jjd d … D ]}t j |¡ | ¡  qtt| ƒ ¡  d S rÁ   )r   rý  r6   r@   r?   r'  rù  rE   râ   r+  r<   r=   rE   -  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 )Nr6   )r›  r   rý  r6   r   rA   rB   r   r   r   r-   r)   r[   r<   r<   r=   r÷  3  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 )NrY   r   )r   rÄ  rK   rL   rý  r6   r…  r/   r,   rï   rP  r  rÚ  rk  ÚBASIC_FORMATrS  r	  ÚPercentStylerJ  r)   )r:   rš   r  r<   r<   r=   Útest_no_kwargs:  s    zBasicConfigTest.test_no_kwargsc                 C   sf   t  ¡ J}tjtjdd t d¡ tj d¡ |  | 	¡  
¡ d¡ W d   ƒ n1 sX0    Y  d S )Nrd  ©r,   rœ  úLog an errorr   úERROR:root:Log an error©r   rÌ  r   rÄ  rï   rã  rv   rä  rK   rI   r  r¨  r<   r<   r=   Útest_strformatstyleN  s    

ÿz#BasicConfigTest.test_strformatstylec                 C   sf   t  ¡ J}tjtjdd t d¡ tj d¡ |  | 	¡  
¡ d¡ W d   ƒ n1 sX0    Y  d S )Nr›  rý  rþ  r   rÿ  r   r¨  r<   r<   r=   Útest_stringtemplatestyleV  s    

ÿz(BasicConfigTest.test_stringtemplatestylec                 C   sŠ   dd„ }t jdd |  tt jjƒd¡ t jjd }|  |t j¡ t  dd¡}|  |jj	|jj	¡ |  |jj
|jj
¡ |  |||d¡ d S )Nc                 S   s   |   ¡  |  ¡  t |¡ d S rÁ   ró  ©rö  Zh2r  r<   r<   r=   r÷  `  s    z.BasicConfigTest.test_filename.<locals>.cleanupútest.log)rÂ  rY   r   r  )r   rÄ  rK   rL   rý  r6   r…  r	  r,   Úmoder;   rŽ   ©r:   r÷  rš   rU   r<   r<   r=   Ú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   s   |   ¡  |  ¡  t |¡ d S rÁ   ró  r  r<   r<   r=   r÷  r  s    z.BasicConfigTest.test_filemode.<locals>.cleanupr  Úwb©rÂ  Úfilemoder   )	r   rÄ  rý  r6   r	  rK   r,   r  rŽ   r  r<   r<   r=   Útest_filemodep  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 )Nr&  rY   r   )r*   r+   rŽ   r?   r   rÄ  rK   rL   rý  r6   r…  r/   r,   )r:   r,   rš   r<   r<   r=   Ú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ý  r6   r  rK   rÚ  rk  ©r:   r  r<   r<   r=   Útest_formatˆ  s    zBasicConfigTest.test_formatc                 C   s,   t jdd t jjd j}|  |jd¡ d S )NrM  )r	  r   )r   rÄ  rý  r6   r  rK   r	  r  r<   r<   r=   Útest_datefmtŽ  s    zBasicConfigTest.test_datefmtc                 C   s.   t jdd t jjd j}|  |jt j¡ d S )Nr›  re  r   )r   rÄ  rý  r6   r  r…  rÚ  rÛ  r  r<   r<   r=   Ú
test_style”  s    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   )rJ  é:   )r   rý  rJ  rŽ   r-   rÄ  rK   )r:   Ú	old_levelr<   r<   r=   Ú
test_levelš  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 )Nr  )rÂ  r,   )rÂ  r6   )r,   r6   )Zloglevelr  r	  )rß   r   r/   rï   rP  rþ   rÄ  rm   )r:   rß   r6   r,   r<   r<   r=   Útest_incompatible¤  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    )r6   r   rY   )r   r/   rï   rã  r1   r4   rÄ  rM  rý  r6   rñ  r  )r:   r6   rª   r<   r<   r=   Útest_handlers³  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  rx   ry   rY   T)rJ  r6   ÚforcezWARNING:root:warnz WARNING:root:warn
INFO:root:info)r*   r+   r   r/   rÄ  rk   rw   rx   ry   rK   rL   rý  r6   rm   rI   r  )r:   Zold_string_ioZnew_string_ioZold_handlersZnew_handlersr<   r<   r=   Ú
test_forceÄ  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 sš0    Y  t d¡ |  |d¡ nX| ¡  tddd	}| ¡  ¡ }W d   ƒ n1 sò0    Y  t d¡ |  |d¡ 0 d S )
NrP  r  rn  ú%(message)s©rÂ  ri  Úerrorsr  rJ  rY   r   õ.   The Ã˜resund Bridge joins Copenhagen to MalmÃ¶rh  ©r   rÄ  r.   rK   rL   rý  r6   r…  r	  ri  ry   r?   r)  rR   r  ró   rô  ©r:   ri  rš   rª   rD  r<   r<   r=   Útest_encodingÙ  s2    þ*
ÿü*
ÿ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 sš0    Y  t d¡ |  |d¡ nX| ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 sò0    Y  t d¡ |  |d¡ 0 d S )Nr  r  Úignorer  r  rY   r   r  rP  rh  z*The resund Bridge joins Copenhagen to Malmr  r  r<   r<   r=   Útest_encoding_errorsí  s*    þ*
ü*
z$BasicConfigTest.test_encoding_errorsc                 C   s$  zÆd}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 s¦0    Y  t d¡ |  |d¡ nX| ¡  tdd	d
}| ¡  ¡ }W d   ƒ n1 sþ0    Y  t d¡ |  |d¡ 0 d S )Nr  r  r  )rÂ  ri  r  rJ  rY   r   Úbackslashreplaceu<   ðŸ˜‚: â˜ƒï¸: The Ã˜resund Bridge joins Copenhagen to MalmÃ¶rP  rh  zL\U0001f602: \u2603\ufe0f: The \xd8resund Bridge joins Copenhagen to Malm\xf6)r   rÄ  r.   rK   rL   rý  r6   r…  r	  ri  r  ry   r?   r)  rR   r  ró   rô  r  r<   r<   r=   Útest_encoding_errors_default   s*    ÿ*
ü*
z,BasicConfigTest.test_encoding_errors_defaultc                    sV  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 sÖ0    Y  t d¡ |  |d¡ nZ| ¡  tddd}| ¡  ¡ }W d   ƒ n1 s00    Y  t d¡ |  |d¡ 0 d S )Nr  r  r  r  rY   r   c                    s    t  ¡ \}}}ˆ  t|ƒ¡ d S rÁ   )rï   r  r¢  r­  )r£   r  rÎ   rÝ  r<   r=   Údummy_handle_error$  s    zEBasicConfigTest.test_encoding_errors_none.<locals>.dummy_handle_errorr  z:'ascii' codec can't encode character '\xd8' in position 4:rP  rh  r   )r   rÄ  r.   rK   rL   rý  r6   r…  r	  ri  rS  r  rH  ry   r9   rO  r?   r)  rR   r  ró   rô  )r:   ri  rš   r$  rª   rD  r<   rÝ  r=   Ú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rH||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ý  rJ  r-   rŽ   r¢  )r  rÅ  r  ©rž  Zold_basic_configr:   r<   r=   Úmy_basic_config;  s
    z2BasicConfigTest._test_log.<locals>.my_basic_configrÄ  ztest mer<   )r   rÄ  r   r7  r#   rK   )r:   r  rJ  r(  rË  r<   r'  r=   rÌ  6  s    
zBasicConfigTest._test_logc                 C   s   |   dtj¡ d S rÍ  )rÌ  r   rk   r[   r<   r<   r=   rÎ  M  s    zBasicConfigTest.test_logc                 C   s   |   d¡ d S rÏ  rÐ  r[   r<   r<   r=   rÑ  P  s    zBasicConfigTest.test_debugc                 C   s   |   d¡ d S rÒ  rÐ  r[   r<   r<   r=   rÓ  S  s    zBasicConfigTest.test_infoc                 C   s   |   d¡ d S rÔ  rÐ  r[   r<   r<   r=   rÕ  V  s    zBasicConfigTest.test_warningc                 C   s   |   d¡ d S rÖ  rÐ  r[   r<   r<   r=   r×  Y  s    zBasicConfigTest.test_errorc                 C   s   |   d¡ d S rØ  rÐ  r[   r<   r<   r=   rÙ  \  s    zBasicConfigTest.test_critical)N) r]   r^   r_   r`   r>   rE   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Ù  r0  r<   r<   r+  r=   rù     s8   	

"
rù  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<   r=   r÷  k  s    z(LoggerAdapterTest.setUp.<locals>.cleanup©rÐ   r  )r'  r)  r>   r   r   r“  rÊ  rý  rÐ   r8   rŽ   r@   r?   rv  rt   Úadapter)r:   r÷  r+  r*  r=   r>   a  s    
zLoggerAdapterTest.setUpc              
   C   sº   d}d }zdd  W n8 t yL } z |}| j || j¡ W Y d }~n
d }~0 0 |  t| jjƒd¡ | jjd }|  |jtj	¡ |  |j
|¡ |  |j| jf¡ |  |j|j||jf¡ d S ©Nztesting exception: %rrY   r   )r2  r,  râ  rÊ  rK   rL   rˆ  rÂ   r   rg   rê   r  r  r,  Ú__traceback__©r:   rê   r3  r‡  r£   r<   r<   r=   Útest_exceptionr  s    &ÿz LoggerAdapterTest.test_exceptionc              
   C   s‚   zdd  W n( t y4 } z|}W Y d }~n
d }~0 0 | jjd|d |  t| jjƒd¡ | jjd }|  |j|j||j	f¡ d S )NrY   r   zexc_info testr1  )
r2  r,  râ  rK   rL   rÊ  rˆ  r  r,  r.  )r:   r‡  r3  r£   r<   r<   r=   Ú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! %rrY   r   )r,  rï  rÊ  rK   rL   rˆ  rÂ   r   re   rê   r  )r:   rê   r£   r<   r<   r=   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é!   rC   é    )r,  rÐ   r   rC   rŽ   r›  rù   ÚisEnabledFor©r:   rÂ  r<   r<   r=   Útest_is_enabled_forš  s    ÿz%LoggerAdapterTest.test_is_enabled_forc                 C   sN   |   | j ¡ ¡ | jjD ]}| j |¡ q|  | j ¡ ¡ |  | j ¡ ¡ d S rÁ   )r9   r,  r5   rÐ   r6   r@   rù   rà  r<   r<   r=   Ú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||_0 |  |j|¡ |  |j|¡ |  | jj|¡ d S )	Nc                   @   s   e Zd ZdZdd„ ZdS )z.LoggerAdapterTest.test_nested.<locals>.AdapterÚAdapterc                 S   s   | j › d|› |fS rø  ©r¥   )r:   rê   rÆ  r<   r<   r=   ró  ®  s    z6LoggerAdapterTest.test_nested.<locals>.Adapter.processN)r]   r^   r_   r¥   ró  r<   r<   r<   r=   r8  «  s   r8  zAdapters can be nested, yo.r+  ZAdapterAdapterrY   r   zAdapter AdapterAdapter )r   rt   rÐ   r¥   rK   rV  ru   re   rÊ  rL   rˆ  rÂ   rê   r  r   rM  r  )r:   r8  rê   r,  Zadapter_adapterr£   Zorig_managerZtemp_managerr<   r<   r=   Útest_nestedª  s2    zLoggerAdapterTest.test_nested)r]   r^   r_   r>   r0  r1  rÙ  r6  r7  r:  r0  r<   r<   r+  r=   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;   )r'  r;  r>   r“  rÊ  r   r  rÐ   r8   rŽ   r@   r?   rv  r[   r+  r<   r=   r>   Î  s    zLoggerTest.setUpc                 C   s   |   t| jjtƒ ¡ d S rÁ   )rß   r	  rÐ   r-   r  r[   r<   r<   r=   Útest_set_invalid_level×  s    z!LoggerTest.test_set_invalid_levelc              
   C   sº   d}d }zdd  W n8 t yL } z |}| j || j¡ W Y d }~n
d }~0 0 |  t| jjƒd¡ | jjd }|  |jtj	¡ |  |j
|¡ |  |j| jf¡ |  |j|j||jf¡ d S r-  )r2  rÐ   râ  rÊ  rK   rL   rˆ  rÂ   r   rg   rê   r  r  r,  r.  r/  r<   r<   r=   r0  Ú  s    &ÿzLoggerTest.test_exceptionc                 C   sF   t  tdd¡$ |  t| jjdd¡ W d   ƒ n1 s80    Y  d S )NrL  Trr   útest message)r   Ú	swap_attrr   rß   r	  rÐ   ru   r[   r<   r<   r=   Ú!test_log_invalid_level_with_raiseë  s    z,LoggerTest.test_log_invalid_level_with_raisec                 C   s@   t  tdd¡ | j dd¡ W d   ƒ n1 s20    Y  d S )NrL  Frr   r>  )r   r?  r   rÐ   ru   r[   r<   r<   r=   Ú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¢  rI   )rª   rÇ  rÆ  r<   r=   rÇ  ö  r±  z=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>Tr  rY   r’  r   )r   r7  r   Ú	tracebackrÐ   Ú
findCallerrK   rL   r[   r<   rÆ  r=   Ú 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 )NrY   c                      s   ˆ j jdˆd d S )Nrg  )Ú
stacklevel)rÐ   rw   r<   )r:   Ú	the_levelr<   r=   Ú	innermost   s    z>LoggerTest.test_find_caller_with_stacklevel.<locals>.innermostc                      s
   ˆ ƒ  d S rÁ   r<   r<   )rH  r<   r=   r¡    s    z:LoggerTest.test_find_caller_with_stacklevel.<locals>.innerc                      s
   ˆ ƒ  d S rÁ   r<   r<   )r¡  r<   r=   Úouter  s    z:LoggerTest.test_find_caller_with_stacklevel.<locals>.outerré   rH  r¡  rI  Ú test_find_caller_with_stacklevel)rÊ  rˆ  rK   rQ  rX  r9  )r:   rI  rˆ  rX  r<   )r¡  rH  r:   rG  r=   rJ  ý  s,    


z+LoggerTest.test_find_caller_with_stacklevelc                 C   s†   d}d}d  } } } } } }}	t  |||||||||	¡	}
dt|
j ¡ ƒ D ]0}|di}| jt| jj|||||||||	d qPd S )Nú	my recordé   )rr  r  ú
some value©r  Úsinfo)	r   Ú_logRecordFactoryrP   Ú__dict__Úkeysrß   ró  rÐ   Ú
makeRecord)r:   r;   rJ  r  Úlnorê   r  r  rY  rO  Úrvr`  r  r<   r<   r=   Ú%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 )NrK  rL  Z	valid_keyrM  rN  )rÐ   rS  rO  rQ  )r:   r;   rJ  r  rT  rê   r  r  rY  rO  r  r\  r<   r<   r=   Ú(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Á   )r9   rÐ   r5   r6   r@   rù   rà  r<   r<   r=   r7  2  s    zLoggerTest.test_has_handlersc                 C   s"   t  d¡}d|_|  | ¡ ¡ d S )Nz
blah.childF)r   r   r¨  rù   r5   )r:   Zchild_loggerr<   r<   r=   Útest_has_handlers_no_propagate9  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é   rC   é   )rÐ   r   rC   rŽ   r›  rù   r4  r5  r<   r<   r=   r6  >  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 )NTrq  r   rC   rZ  )rÐ   r   r   rC   rŽ   r›  rù   r4  )r:   Zold_disabledrÂ  r<   r<   r=   Ú#test_is_enabled_for_disabled_loggerD  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ý  rL  úfoo.barú )r   r   rM  rý  ÚparentZassertIsNot)r:   rý  r<   r<   r=   Útest_root_logger_aliasesP  s    z#LoggerTest.test_root_logger_aliasesc                 C   s$   |   ttjt¡ |   ttjd¡ d S )Ns   foo)rß   r	  r   r   Úanyr[   r<   r<   r=   Útest_invalid_names]  s    zLoggerTest.test_invalid_namesc                 C   sN   t tjd ƒD ]:}dD ]0}t |¡}t ||¡}t |¡}|  ||¡ qqd S )NrY   )r   rý  rL  r\  zbaz.bar)r  r&  ÚHIGHEST_PROTOCOLr   r   rÏ  r'  rM  )r:   Úprotor;   rÐ   rW   Z	unpickledr<   r<   r=   Útest_picklinga  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 )Nr  r  TF)r'   r   r   r-   rg   rK   r(   Ú_cacher9   r4  rù   r.   re   rŒ   rC   )r:   rý  r%   r&   r<   r<   r=   Útest_cachingi  sH    

zLoggerTest.test_caching)r]   r^   r_   r>   r=  r0  r@  rA  rE  rJ  rV  rW  r7  rX  r6  r[  r_  ra  rd  rf  r0  r<   r<   r+  r=   r;  Ì  s"   	
	r;  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú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   r>   rñ   rò   r  ró   r?   Úrmfiles)r:   r  r<   r<   r=   r>   ¥  s    

zBaseFileTest.setUpc                 C   s>   | j D ]}t |¡ qtj | j¡r0t | j¡ t | ¡ d S rÁ   )rh  ró   rô   rú   rû   r  r   rE   )r:   r  r<   r<   r=   rE   «  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)r9   ró   rú   rû   rh  r¢  )r:   rÂ  r<   r<   r=   ÚassertLogFile²  s    ÿzBaseFileTest.assertLogFileN)r]   r^   r_   r`   r>   rE   rj  r<   r<   r<   r=   rg  ¢  s   rg  c                   @   s   e Zd Zdd„ ZdS )ÚFileHandlerTestc                 C   sx   t  | j¡ tj| jdd}|  |j¡ |  t j 	| j¡¡ | 
t i ¡¡ |  |j¡ |  t j 	| j¡¡ | ¡  d S )NTrç   )ró   rô   r  r   r	  rS  r,   rù   rú   rû   rø   r¨   rñ  r9   r?   )r:   Úfhr<   r<   r=   Ú
test_delayº  s    zFileHandlerTest.test_delayN)r]   r^   r_   rm  r<   r<   r<   r=   rk  ¹  s   rk  c                   @   sL   e Zd Zd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  dt jdd|  ¡ d d d ¡S )Nr³  rð  rY   )r   r)  r.   r\   r[   r<   r<   r=   Únext_recÅ  s    ÿz RotatingFileHandlerTest.next_recc                 C   s^   t jj| jdd}|  | d ¡¡ | ¡  t jjtjddd}|  | |  	¡ ¡¡ | ¡  d S )Nr   ©ÚmaxBytesrP  rY   )ri  rq  )
r   r6   r
  r  rù   ÚshouldRolloverr?   ró   Údevnullro  ©r:   Úrhr<   r<   r=   Útest_should_not_rolloverÉ  s    ÿz0RotatingFileHandlerTest.test_should_not_rolloverc                 C   s2   t jj| jdd}|  | |  ¡ ¡¡ | ¡  d S )NrY   rp  )r   r6   r
  r  r9   rr  ro  r?   rt  r<   r<   r=   Útest_should_rolloverÖ  s    z,RotatingFileHandlerTest.test_should_rolloverc                 C   s4   t j | j¡}| |  ¡ ¡ |  | j¡ | ¡  d S rÁ   )r   r6   r
  r  rá   ro  rj  r?   rt  r<   r<   r=   Útest_file_createdÛ  s    z)RotatingFileHandlerTest.test_file_createdc                 C   s¨   dd„ }t jj| jddd}||_| |  ¡ ¡ |  | j¡ | |  ¡ ¡ |  || jd ƒ¡ | |  ¡ ¡ |  || jd ƒ¡ |  t	j
 || jd ƒ¡¡ | ¡  d S )	Nc                 S   s   | d S ©Nú.testr<   r<  r<   r<   r=   Únamerä  s    z>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namerr    rY   ©ÚbackupCountrq  ú.1ú.2ú.3)r   r6   r
  r  r{  rá   ro  rj  rù   ró   rú   rû   r?   )r:   r{  ru  r<   r<   r=   Útest_rollover_filenamesã  s    ÿz/RotatingFileHandlerTest.test_rollover_filenamesc                 C   sª   G dd„ dt jjƒ}|| jddd}|  | | j¡| jd ¡ | |  ¡ ¡ |  | j¡ | |  ¡ ¡ |  | | jd ¡d ¡ |  	t
j | | jd ¡¡¡ | ¡  d S )	Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )zZRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotatorc                 S   s   |d S ry  r<   )r:   r;   r<   r<   r=   r{  ô  s    z`RotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.namerc                 S   s    t j |¡rt  ||d ¡ d S )Nú.rotated)ró   rú   rû   rû  )r:   ÚsourceÚdestr<   r<   r=   Úrotator÷  s    zbRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.rotatorN)r]   r^   r_   r{  r…  r<   r<   r<   r=   ÚHandlerWithNamerAndRotatoró  s   r†  r    rY   r|  rz  r~  r‚  )r   r6   r
  r  rK   r{  rá   ro  rj  rù   ró   rú   rû   r?   )r:   r†  ru  r<   r<   r=   Útest_namer_rotator_inheritanceò  s    ÿz6RotatingFileHandlerTest.test_namer_rotator_inheritancec                 C   sè  dd„ }dd„ }t jj| jddd}||_||_|  ¡ }| |¡ |  | j¡ |  ¡ }| |¡ || jd ƒ}|  |¡ t	j
}t|d	ƒ:}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d   ƒ n1 sÈ0    Y  | |  ¡ ¡ || jd ƒ}|  |¡ t|d	ƒ:}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d   ƒ n1 sD0    Y  | |  ¡ ¡ || jd ƒ}t|d	ƒ:}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d   ƒ n1 s¶0    Y  |  t	j || jd ƒ¡¡ | ¡  d S )Nc                 S   s   | d S )Nz.gzr<   r<  r<   r<   r=   r{    s    z3RotatingFileHandlerTest.test_rotator.<locals>.namerc              	   S   s€   t | dƒX}| ¡ }t |d¡}t |dƒ}| |¡ W d   ƒ n1 sJ0    Y  W d   ƒ n1 sh0    Y  t | ¡ d S )NÚrbr¬  r  )r)  rR   ÚzlibÚcompressrE  ró   rô  )rƒ  r„  ZsfrD  Ú
compressedÚdfr<   r<   r=   r…  
  s    Fz5RotatingFileHandlerTest.test_rotator.<locals>.rotatorr    rY   r|  r~  rˆ  r  r  r€  )r   r6   r
  r  r…  r{  ro  rá   rj  ró   Úlinesepr)  rR   r‰  Ú
decompressrK   rW  rê   rù   rú   rû   r?   )r:   r{  r…  ru  Zm1Zm2r  Únewlinerª   r‹  rD  r<   r<   r=   Útest_rotator  sD    ÿ



6

8
8z$RotatingFileHandlerTest.test_rotatorN)r]   r^   r_   ro  rv  rw  rx  r  r‡  r   Zrequires_zlibr  r<   r<   r<   r=   rn  Ä  s   rn  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ÚSrP  rY   )ri  r}  çš™™™™™ñ?rê   ztesting - device file)r   r6   r  ró   rs  r  r  r¨   rù   rr  r?   )r:   rl  r«   r<   r<   r=   rv  3  s    
ÿ
z5TimedRotatingFileHandlerTest.test_should_not_rolloverc              	      s¨  t jj| jddd}t  d¡}| |¡ t  ddi¡}| |¡ |  | j¡ t	 
d¡ t  ddi¡}| |¡ | ¡  d	}tj ¡ }d
}t|ƒD ]D}|tj|d }	| j|	 d¡ ‰ tj ˆ ¡}|r| j ˆ ¡  qÖqd| }
|s–tj | j¡\}‰ ‡ fdd„t |¡D ƒ}td| d¡ tjd td| tjd |D ]X}td| ƒ tj ||¡}t|dƒ}t| ¡ ƒ W d   ƒ n1 sˆ0    Y  q<| j||
d d S )Nr’  rY   )r}  rt  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<   )ry  )r®  rª   ©r  r<   r=   r°  ]  r±  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«   ri  )r   r6   r  r  r1   r4   r¨   rá   rj  r  r  r?   ru  r1  r  Ú	timedeltaÚstrftimeró   rú   rû   rh  r¢  r¡   Úlistdirr#  rï   rP  r¢   r)  rR   r9   )r:   rl  rŠ  Zr1Zr2Úfoundr1  ÚGO_BACKÚsecsÚprevrê   ZdnÚfilesrª   rú   Ztfr<   r•  r=   Útest_rollover=  sD    ÿ





0z*TimedRotatingFileHandlerTest.test_rolloverc                 C   sR   | j }|ttjj| jddd |ttjj| jddd |ttjj| jddd d S )NÚXTrç   ÚWZW7)rß   rþ   r   r6   r  r  )r:   rß   r<   r<   r=   Útest_invalidg  s    
ÿ
ÿ
ÿz)TimedRotatingFileHandlerTest.test_invalidc                 C   s€   d}t  ddd¡}tjj| jdddd|d}zD| |¡}|  ||d ¡ | |d ¡}|  ||d	 ¡ W | ¡  n
| ¡  0 d S )
Nr   é   ÚMIDNIGHTrY   T©ÚwhenÚintervalr}  rv  ÚatTimeéÀ¨  éÐ¶  i@ú )	ru  r  r   r6   r  r  ÚcomputeRolloverrK   r?   )r:   ÚcurrentTimer¨  ru  rT   r<   r<   r=   Ú"test_compute_rollover_daily_attimep  s    þ
z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec           	   	   C   s:  t t ¡ ƒ}||d  }t ddd¡}t |¡j}tdƒD ]ú}tjj| j	d| ddd|d}zÌ||krtd| | }n|| }|d9 }|d	7 }||7 }| 
|¡}||krÂtd
tj ƒ tdtƒ  ƒ |  ||¡ ||krÞ|d7 }| 
|d ¡}||krtd
tj ƒ tdtƒ  ƒ |  ||¡ W | ¡  q:| ¡  0 q:d S )Né€Q r£  r   é   zW%drY   Tr¥  r©  zfailed in timezone: %dzlocal vars: %si€:	 rª  )rH  r  ru  r|  Útm_wdayr  r   r6   r  r  r«  r#  ÚtimezoneÚlocalsrK   r?   )	r:   r¬  Ztodayr¨  ZwdayZdayru  rU   rT   r<   r<   r=   Ú#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 }q0d}g }g }|D ]„}tj |d| ¡}	tjj|	d	dd
dd}
| |
¡ | d¡rÄ|D ]}| d||f ¡ qªqfdd„ |
_|D ]}| d||f ¡ qÒqf|D ]>}tj ||¡}	t|	dƒ}W d   ƒ qð1 s$0    Y  qðt|ƒD ]Â\}}|| }
|
 ¡ }|  t|ƒd¡ | d¡r¢d| }	|D ]&}tj |¡\}}|  | |	¡¡ qxnV|D ]P}tj |¡\}}|  | d¡¡ |  | |d ¡oð|t|ƒd   ¡ ¡ q¦q8d S )Nr  r9  r¤  z%Y-%m-%d_%H-%M-%Sr  r”  )úa.bza.b.czd.ezd.e.fz%s.logrW   r¯  T)r¦  r§  r}  rè   r´  z	%s.log.%sc                 S   s   |   dd¡d S )Nr  r   )rû  r<  r<   r<   r=   rÇ  ¿  r±  zKTimedRotatingFileHandlerTest.test_compute_files_to_delete.<locals>.<lambda>z	%s.%s.logr  ré  z%s.log.r  rŸ   r    )rñ   ÚmkdtemprŽ   ÚshutilÚrmtreeru  r1  r  r¢  r˜  r—  ró   rú   r¢   r   r6   r  ry  r{  r)  Ú	enumerateZgetFilesToDeleterK   rL   r¡   r9   r   Úisdigit)r:   ZwdÚtimesrQ  r¯  Úprefixesrž  Zrotatorsr¥   rð  r…  rm  r  rª   Z
candidatesrë  rZ  r<   r<   r=   Útest_compute_files_to_delete¨  sV    

ý


"ÿz9TimedRotatingFileHandlerTest.test_compute_files_to_deleteN)	r]   r^   r_   rv  rŸ  r¢  r­  r³  r¼  r<   r<   r<   r=   r‘  2  s   
*	(r‘  c                  K   s   t jf i | ¤Žt jdd S )NrY   r”  )ru  r—  )rÅ  r<   r<   r=   rœ  Ù  s    rœ  )r’  rY   )ÚMé<   )ÚHi  )ÚDr®  )r¤  r®  ZW0r  é   )ZdaysZhoursc              
   C   sZ  t jj| j|dddd}d}| |¡}||krB|dkrBzÎ|jrNt |¡}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 n8 ty@ } zt
d| tjd W Y d }~n
d }~0 0 |  ||¡ | ¡  d S )NrY   r   T)r¦  r§  r}  rv  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   r6   r  r  r«  rv  r  r|  Ú	localtimeZ	_MIDNIGHTr#  rï   rP  r"  rK   r?   )r:   r¦  Úexpru  r¬  rT   rm  ZcurrentHourZcurrentMinuteZcurrentSecondr«   r\  r‡  r<   r<   r=   Útest_compute_rolloverä  s@    ÿ



ÿÿþ(rÄ  ztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c                   @   s   e Zd Zdd„ ZdS )ÚNTEventLogHandlerTestc              
   C   s
  d}t  d |¡}t  |¡}ztj d¡}W n< tjyf } z"|jdkrPt	 
d¡‚‚ W Y d }~n
d }~0 0 t ddi¡}| |¡ | ¡  |  |t  |¡¡ t jt jB }d}d}	t  |||	¡}
|
D ].}|jdkrÐqÀt ||¡}|d	kræqÀd
} qðqÀ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 recordsri  )Úwin32evtlogZOpenEventLogZGetNumberOfEventLogRecordsr   r6   ZNTEventLogHandlerÚ
pywintypesrv   Úwinerrorr>  ZSkipTestr¨   rø   r?   Z
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceNameÚwin32evtlogutilZSafeFormatMessager9   )r:   ZlogtypeZelhZnum_recsrD   r‡  r«   Úflagsrš  r›  Úeventsrê   r<   r<   r=   r¡  
  s:    



ÿ
z NTEventLogHandlerTest.test_basicN)r]   r^   r_   r¡  r<   r<   r<   r=   rÅ    s   rÅ  c                   @   s   e Zd Zdd„ ZdS )ÚMiscTestCasec                 C   s   h d£}t j| t|d d S )N>   r  rû  rõ  rö  ÚFiltererrý  ÚPlaceHolderrô  r  ÚStrFormatStyleÚ
RootLoggerrÛ  Úcurrentframe)Ú	blacklist)r   Zcheck__all__r   )r:   rÒ  r<   r<   r=   Útest__all__-  s    zMiscTestCase.test__all__N)r]   r^   r_   rÓ  r<   r<   r<   r=   rÌ  ,  s   rÌ  c                  C   s*   t  dd¡} |  ¡  t | jd d d ¡ d S )NÚLC_ALLr   )r   Zrun_with_localeÚ	__enter__r>  ZaddModuleCleanupÚ__exit__)Úcmr<   r<   r=   ÚsetUpModule9  s    rØ  Ú__main__)N)¡r`   r   Zlogging.handlersZlogging.configro  rÑ  r   ru  r  r&  r*   rb  rÎ  ró   r"  r  rF   r¶  r\  r$  rï   rñ   Ztest.support.script_helperr   r   rg  r   Ztest.supportr   Ztest.support.logging_helperr   rÁ  r  r  r>  r|  r^  ro  Zhttp.serverr   r   rZ  Úurllib.parser	   r
   Úsocketserverr   r   r   r   rÆ  rÉ  rÇ  rS  r‰  ZTestCaser   ra   r   ZSILENTrÈ   ZTERSEZEFFUSIVErÇ   rØ   Z	TALKATIVErÃ   Z
CHATTERBOXZBORINGr  rÏ   rË   r—   rÀ   rÆ   rÉ   rÜ   r  r@  r/   rF  rI  rK  r[  rX  rt  rx  r‰  rŽ  r?  r”  r—  r˜  r£  r1   r¼  r¿  r  r3  r6  r4  r5  r:  r<  r@  ZIPV6_ENABLEDrA  rD  r[  rf  ru  rˆ  r‰  r‹  rŒ  rŽ  r   r  r)  r  r  r!  r6   rE  Zunittest.mockr7  r8  r—  rO  ZtzinforN  rv  rU  rŒ  r…  r‹  r  r•  r™  r†  r“  r¢  r¾  rè  rù  r)  r;  rg  rk  rn  r‘  rœ  r¦  rÃ  rÄ  r›  rÅ  rÌ  rØ  r]   Úmainr<   r<   r<   r=   Ú<module>   sd  m FöY T,J2)/ h   bY@CÿM41(
         W#i`
	  'W 5  Bl Wn (ú!
#
