B
    18™\â‡ ã               @   s   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl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)m*Z*m+Z+ yddl,Z,ddl-Z-ddl.Z.W n" e/k
rr   d Z, Z-Z.Y nX yddl0Z0W n e/k
r–   Y nX G dd	„ d	ej1ƒZ2G d
d„ de2ƒZ3G dd„ de2ƒZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>e?e>e5d ƒZ@e5de6de7de8de9de:de;de<d e=d!e>d"i
ZAG d#d$„ d$ejBƒZCG d%d&„ d&ejBƒZDG d'd(„ d(e2ƒZEG d)d*„ d*e2ƒZFG d+d,„ d,eGƒZHG d-d.„ d.ejIƒZJG d/d0„ d0e2ƒZKG d1d2„ d2e#jLƒZMG d3d4„ d4eGƒZNG d5d6„ d6eNe!ƒZOG d7d8„ d8eNe*ƒZPG d9d:„ d:eNe(ƒZQeRed;ƒr&G d<d=„ d=ePƒZSG d>d?„ d?eQƒZTG d@dA„ dAe2ƒZUG dBdC„ dCe2ƒZVG dDdE„ dEejWƒZXG dFdG„ dGe2ƒZYG dHdI„ dIe2ƒZZdJdK„ Z[e \eRed;ƒdL¡G dMdN„ dNeZƒƒZ]G dOdP„ dPe2ƒZ^e \eRed;ƒdL¡G dQdR„ dRe^ƒƒZ_G dSdT„ dTe2ƒZ`e \eRed;ƒdL¡G dUdV„ dVe`ƒƒZae \ejbdW¡G dXdY„ dYe`ƒƒZcG dZd[„ d[e2ƒZdG d\d]„ d]e2ƒZeG d^d_„ d_e2ƒZfG d`da„ dae2ƒZgd´dbdc„Zhddde„ ZiG dfdg„ dgejIƒZjG dhdi„ die2ƒZkG djdk„ dke2ƒZlG dldm„ dme2ƒZmG dndo„ doejnƒZoG dpdq„ dqe2ƒZpG drds„ dse2ƒZqeRejrdtƒrddlsZsddultmuZu G dvdw„ dwe2ƒZve wd¡ZxG dxdy„ dyejyƒZzezƒ Z{G dzd{„ d{ej1ƒZ|G d|d}„ d}ej}ƒZ~G d~d„ dej1ƒZG d€d„ de2ƒZ€G d‚dƒ„ dƒe2ƒZG d„d…„ d…ƒZ‚G d†d‡„ d‡ejƒƒZ„G dˆd‰„ d‰e2ƒZ…G dŠd‹„ d‹e2ƒZ†G dŒd„ de2ƒZ‡G dŽd„ dej1ƒZˆG dd‘„ d‘ej1ƒZ‰G d’d“„ d“e2ƒZŠG d”d•„ d•e2ƒZ‹G d–d—„ d—e‹ƒZŒG d˜d™„ d™e‹ƒZG dšd›„ d›e‹ƒZŽdœd„ ZxHdždŸd d¡d¢d£ed¤d¥d¦ffD ](\ZZ‘ee‘fd§d¨„Z’e“eŽd©e e’ƒ q~W e \e,dª¡G d«d¬„ d¬e2ƒƒZ”G d­d®„ d®ej1ƒZ•e –d¯d°¡d±d²„ ƒZ—e˜d³krüe—ƒ  dS )µzoTest harness for the logging module. Run all tests.

Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved.
é    N)Úassert_python_ok)Úsupport)Ú
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 ¡  zrtj 	¡ | _
tjdd… | _| 	¡  | _}tj 	¡ | _tj 	¡ | _i  | _}x |D ]}t|| ddƒ||< qrW W dt ¡  X t d¡| _t d¡| _t d¡| _| j ¡ | _t ¡ | _| j tj¡ t | j¡| _ t !| j"¡| _#| j  $| j#¡ | j %¡ r6| jj&| jj& }t'd| ƒ‚| j %¡ r^| jj&| jj& }t'd| ƒ‚| j (| j ¡ |  )| j %¡ ¡ |  )| j %¡ ¡ dS )zxSetup the default logging stream to an internal StringIO instance,
        so that we can examine log output as we want.NÚdisabledu   Â«Ã—Â»u   Ä¿Ã–GÚ zUnexpected handlers: %s)*r   Ú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_formatZroot_formatterÚsetFormatterÚhasHandlersÚhandlersÚAssertionErrorÚ
addHandlerÚ
assertTrue)ÚselfZlogger_dictr   r    ÚnameZhlist© r9   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_logging.pyÚsetUpM   s@    




zBaseTest.setUpc             C   s8  | j  ¡  | j | j¡ x,| jjrD| jjd }| j |¡ | ¡  qW | 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}x*| jD ] }|| dk	rî|| | j| _qîW W dt ¡  X |  ¡  tj| jŽ  dS )zJRemove our logging stream, and restore the original logging
        level.r   N) r*   Úcloser%   ÚremoveHandlerr.   r3   r+   r'   r   r   r   ÚclearÚupdater   r   r   r   r   r   r   r   r   Údisabler   r   r    r   r"   Ú
doCleanupsr   Úthreading_cleanupr   )r7   Úhr   r   r    r8   r9   r9   r:   ÚtearDownw   s8    






zBaseTest.tearDownNc       	      C   s    |p| j }t |p| j¡}| ¡  ¡ }|  t|ƒt|ƒ¡ xFt||ƒD ]8\}}| 	|¡}|sj|  
d| ¡ |  t| ¡ ƒ|¡ qFW | ¡ }|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)	r7   Úexpected_valuesr*   ÚpatZactual_linesÚactualÚexpectedÚmatchÚsr9   r9   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)r7   r9   r9   r:   Únext_message«   s    zBaseTest.next_message)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   rG   rZ   r;   rD   rX   r[   r9   r9   r9   r:   r   E   s   *"
r   c               @   sP   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d„ Z	dS )ÚBuiltinLevelsTestz*Test builtin levels and their inheritance.c             C   s4  | j }t d¡}| tj¡ t t d¡i ¡}| tj¡ t d¡}| tj¡ | tj	|ƒ ¡ | 
|ƒ ¡ | tj	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | tj	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ |  dddddd	d
ddddg¡ d S )NÚERRÚINFÚDEB)ra   ÚCRITICALÚ1)ra   ÚERRORÚ2)rb   rd   Ú3)rb   rf   Ú4)rb   ÚWARNINGÚ5)rb   ÚINFOÚ6)rc   rd   Ú7)rc   rf   Ú8)rc   rj   Ú9)rc   rl   Ú10)rc   r,   Ú11)r[   r   r   r+   rf   ÚLoggerAdapterrl   r,   Úlogrd   ÚerrorÚwarningÚinfoÚdebugrX   )r7   Úmra   rb   rc   r9   r9   r:   Ú	test_flatµ   sD    

zBuiltinLevelsTest.test_flatc             C   s„   | j }t d¡}| tj¡ t d¡}| tj¡ | tj|ƒ ¡ | |ƒ ¡ | 	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ |  ddg¡ d S )Nrb   zINF.ERR)zINF.ERRrd   re   )zINF.ERRrf   rg   )r[   r   r   r+   rl   rf   rt   rd   ru   rv   rw   rx   rX   )r7   ry   rb   ÚINF_ERRr9   r9   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|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | 	|ƒ ¡ | 
|ƒ ¡ | |ƒ ¡ |  dddd	d
dg¡ d S )Nrb   zINF.ERRz	INF.UNDEFzINF.ERR.UNDEFÚUNDEF)z	INF.UNDEFrd   re   )z	INF.UNDEFrf   rg   )z	INF.UNDEFrj   rh   )z	INF.UNDEFrl   ri   )zINF.ERR.UNDEFrd   rk   )zINF.ERR.UNDEFrf   rm   )r[   r   r   r+   rl   rf   rt   rd   ru   rv   rw   rx   rX   )r7   ry   rb   r{   Z	INF_UNDEFZINF_ERR_UNDEFr}   r9   r9   r:   Útest_nested_inheritedû   s2    




z'BuiltinLevelsTest.test_nested_inheritedc             C   s–   | j }t d¡}t d¡}t d¡}| tj¡ | tj|ƒ ¡ | |ƒ ¡ | tj|ƒ ¡ | |ƒ ¡ | |ƒ ¡ | |ƒ ¡ |  	ddddg¡ d S )Nrb   zINF.BADPARENT.UNDEFzINF.BADPARENT)zINF.BADPARENT.UNDEFrd   re   )zINF.BADPARENT.UNDEFrl   rg   )zINF.BADPARENTrd   rh   )zINF.BADPARENTrl   ri   )
r[   r   r   r+   rl   rt   ÚFATALrw   rx   rX   )r7   ry   rb   Z
GRANDCHILDÚCHILDr9   r9   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.rl   N)rJ   r   ÚgetLevelNamerl   )r7   r9   r9   r:   Útest_regression_223868  s    z'BuiltinLevelsTest.test_regression_22386c             C   s8   t  t jd¡ |  t jt jd¡ |  t  t j¡d¡ dS )z&See issue #29220 for more information.r   rl   N)r   ÚaddLevelNamerl   Ú
addCleanuprJ   r‚   )r7   r9   r9   r:   Útest_regression_29220=  s    z'BuiltinLevelsTest.test_regression_29220c             C   s   t  d¡}|  |t j¡ d S )Nr   )r   r‚   rJ   r   )r7   Úfatalr9   r9   r:   Útest_issue27935C  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   rl   ÚNOTSETN)r   r„   rl   r…   rJ   r‚   r‰   )r7   r9   r9   r:   r†   G  s
    N)r\   r]   r^   r_   rz   r|   r~   r   rƒ   r†   rˆ   r9   r9   r9   r:   r`   ²   s   /#r`   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 d | 	|¡ X d S )Nz	spam.eggsr   Úspamzspam.eggs.fishzspam.bakedbeans)z	spam.eggsrl   rg   )zspam.eggs.fishrl   rh   )
r   ÚFilterr%   r3   Ú	addFilterr   rw   r[   rX   ÚremoveFilter)r7   Zfilter_Úhandlerr‹   Ú	spam_eggsÚspam_eggs_fishÚspam_bakedbeansr9   r9   r:   Útest_filterS  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 d | |¡ X d S )
Nc             S   s&   | j  d¡}d |d d… ¡}|dkS )NÚ.é   z	spam.eggs)r8   ÚsplitÚjoin)ÚrecordÚpartsÚprefixr9   r9   r:   Ú
filterfunco  s    z8BasicFilterTest.test_callable_filter.<locals>.filterfuncr   r‹   z	spam.eggszspam.eggs.fishzspam.bakedbeans)z	spam.eggsrl   rg   )zspam.eggs.fishrl   rh   )	r%   r3   r   r   r   rw   r[   rX   rŽ   )r7   r›   r   r‹   r   r‘   r’   r9   r9   r:   Útest_callable_filterk  s     




z$BasicFilterTest.test_callable_filterc             C   s*   t  ¡ }t  ddi¡}|  | |¡¡ d S )Nr8   z	spam.eggs)r   rŒ   ÚmakeLogRecordr6   Úfilter)r7   ÚfÚrr9   r9   r:   Útest_empty_filterˆ  s    z!BasicFilterTest.test_empty_filterN)r\   r]   r^   r_   r“   rœ   r¡   r9   r9   r9   r:   rŠ   O  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)r7   r˜   r9   r9   r:   rž   ·  s    zGarrulousFilter.filterN)r\   r]   r^   r_   rž   r9   r9   r9   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gkS )N)r¶   ÚSOCIABLEÚTACITURN)r7   r˜   r9   r9   r:   rž   ¾  s    zVerySpecificFilter.filterN)r\   r]   r^   r_   rž   r9   r9   r9   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.z^[\w.]+ -> (\w+): (\d+)$c             C   s0   t  | ¡ x t ¡ D ]\}}t ||¡ qW d S )N)r   r;   Úmy_logging_levelsÚitemsr   r„   )r7   ÚkÚvr9   r9   r:   r;   É  s    
z CustomLevelsAndFiltersTest.setUpc             C   s"   xt D ]}| ||  ¡ ¡ qW d S )N)ÚLEVEL_RANGErt   r[   )r7   ÚloggerZlvlr9   r9   r:   Úlog_at_all_levelsÎ  s    
z,CustomLevelsAndFiltersTest.log_at_all_levelsc             C   s2   | j  t¡ |  | j ¡ |  ddddddg¡ d S )N)r±   rk   )r°   rm   )r¯   rn   )r®   ro   )r­   rp   )r¬   rq   )r%   r+   ÚVERBOSErÂ   rX   )r7   r9   r9   r:   Útest_logger_filterÒ  s    z-CustomLevelsAndFiltersTest.test_logger_filterc          	   C   sR   | j jd  t¡ z$|  | j ¡ |  dddddg¡ W d | j jd  tj¡ X d S )Nr   )r°   rm   )r¯   rn   )r®   ro   )r­   rp   )r¬   rq   )r%   r3   r+   r¹   rÂ   rX   r   r‰   )r7   r9   r9   r:   Útest_handler_filterà  s    z.CustomLevelsAndFiltersTest.test_handler_filterc          
   C   s¬   | j jd }d }tƒ }| |¡ zj|  | j ¡ dddddddd	d
g	}|  |¡ tƒ }| j  |¡ |  | j ¡ |  |dddddddg ¡ W d |rœ| j  |¡ | |¡ X d S )Nr   )r´   re   )r³   rg   )r²   ri   )r±   rk   )r°   rm   )r¯   rn   )r®   ro   )r­   rp   )r¬   rq   )r´   rr   )r³   Ú12)r²   Z14)r±   Ú15)r¯   Ú17)r®   Ú18)r¬   Z20)r%   r3   rµ   r   rÂ   rX   r¸   rŽ   )r7   r   Zspecific_filterZgarrZfirst_linesr9   r9   r:   Útest_specific_filtersð  s<    

z0CustomLevelsAndFiltersTest.test_specific_filtersN)
r\   r]   r^   r_   rG   r;   rÂ   rÄ   rÅ   rÊ   r9   r9   r9   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   ÚHandlerr8   rJ   ÚassertRaisesÚNotImplementedErrorÚemit)r7   rC   r9   r9   r:   Ú	test_name  s    zHandlerTest.test_namec       
      C   sþ  t jdkr^xîdD ]æ}t ¡ \}}t |¡ |s:t |¡ 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W t jdkrd	}nd
}y4tj |¡}|  |j|j¡ |  |j¡ | ¡  W n tk
r\   Y nX xHdD ]@}	|	dkrŠ|  ttjjdd|	¡ ntj dd|	¡}| ¡  qdW tj d¡}t i ¡}|  | |¡¡ | ¡  tj d¡}|  | |¡¡ | ¡  d S )N)ÚlinuxÚdarwin)TFT)ÚdelayéÿÿÿÿÚmsgÚTestrÓ   z/var/run/syslogz/dev/log)ÚGETÚPOSTÚPUTrÚ   Ú	localhostz/logr   rY   )ÚsysÚplatformÚtempfileÚmkstempÚosr<   Úunlinkr   r3   ÚWatchedFileHandlerÚdevÚinorJ   r   ÚhandleÚassertFalseÚpathÚexistsr6   ÚSysLogHandlerÚfacilityÚLOG_USERÚ
unixsocketÚOSErrorrÎ   Ú
ValueErrorÚHTTPHandlerÚBufferingHandlerÚshouldFlush)
r7   ÚexistingÚfdÚfnrC   rã   rä   r    ÚsocknameÚmethodr9   r9   r:   Útest_builtin_handlers$  sZ    








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krv|tj	j|dfff7 }x<|D ]4\}}||Ž }|  tj |¡¡ | ¡  t |¡ q|W dS )zs
        Test that Path objects are accepted as filename arguments to handlers.

        See Issue #27493.
        ÚwÚarC   )rÒ   rÓ   N)rÞ   rß   rà   r<   rá   ÚpathlibÚPathr   ÚFileHandlerr3   ÚRotatingFileHandlerÚTimedRotatingFileHandlerrÜ   rÝ   râ   r6   rç   rè   )r7   ró   rô   ÚpfnÚcasesÚclsÚargsrC   r9   r9   r:   Útest_path_objectsZ  s    



zHandlerTest.test_path_objectsÚntz/WatchedFileHandler not appropriate for Windows.c          
      s2  ‡ fdd„}d}d}d ˆ _ d ˆ _x
dD ] }t dd¡\}}t |¡ tj|||fd}d|_| 	¡  t
jj||d	}t
 d
¡}	| |	¡ zrxlt|ƒD ]`}
t d¡ t
 ddi¡}yt ¡ ˆ _ | |¡ W q˜ tk
rö   tdˆ jˆ j f ƒ ‚ Y q˜X q˜W W d | ¡  | ¡  tj |¡r(t |¡ X q(W d S )Nc          	      sZ   xTt |ƒD ]H}yt | ¡ t ¡ ˆ _W n tk
r:   Y nX t dt dd¡ ¡ q
W d S )Ngü©ñÒMbp?r   é   )	Úrangerà   rá   ÚtimeÚdeletion_timerí   ÚsleepÚrandomÚrandint)ÚfnameÚtriesÚ_)r7   r9   r:   Úremove_loopt  s    
z*HandlerTest.test_race.<locals>.remove_loopiô  )FTz.logztest_logging-3-)Útargetr  T)rÔ   z'%(asctime)s: %(levelname)s: %(message)sg{®Gázt?rÖ   ÚtestingzDeleted at %s, opened at %s)Zhandle_timer  rÞ   rß   rà   r<   Ú	threadingÚThreadÚdaemonÚstartr   r3   râ   r/   r1   r  r  r	  r   rå   Ú	ExceptionÚprintr—   rç   rè   rá   )r7   r  Z	del_countZ	log_countrÔ   ró   rô   ZremoverrC   rŸ   r  r    r9   )r7   r:   Ú	test_raceq  s<    	




zHandlerTest.test_raceÚforkzTest requires os.fork().c                s   t  ¡ ‰dˆ_|  tt jƒd¡ t ¡ ‰t ¡ ‰ ‡ ‡‡fdd„}tj|dd}| 	¡  ˆ 
¡  t ¡ }|dkr„t  d¡ t d¡ n˜ˆ  ¡  | ¡  t ¡ }x<t |tj¡\}}||krºP t ¡ | dkrÌP t d	¡ qžW ||krt |tj¡ t |d¡\}}|  d
¡ | j|ddd dS )z9Ensure forked child logging locks are not held; bpo-6721.z*because we need at least one for this testr   c                  sF   t  ¡  z.ˆ ¡  zˆ ¡  ˆ  d¡ W d ˆ ¡  X W d t  ¡  X d S )Ng      à?)r   r   ÚacquireÚsetÚwaitÚreleaser"   r9   )Ú+fork_happened__release_locks_and_end_threadÚlocks_held__ready_to_forkÚrefed_hr9   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  r8   z#Child process did not deadlock. \o/é   gš™™™™™©?zchild process deadlocked.zchild process error)rÖ   N)r   rÍ   r8   ÚassertGreaterrK   r   r  ÚEventr  r  r  rà   r  ru   Ú_exitr  r—   r  Ú	monotonicÚwaitpidÚWNOHANGr	  ÚkillÚsignalÚSIGKILLrN   rJ   )r7   r!  Zlock_holder_threadÚpidÚ
start_timeZ
waited_pidÚstatusr9   )r  r  r   r:   Ú test_post_fork_child_no_deadlock¢  s<    


z,HandlerTest.test_post_fork_child_no_deadlockN)r\   r]   r^   rÑ   r÷   r  ÚunittestÚskipIfrà   r8   r  Úhasattrr/  r9   r9   r9   r:   rË     s
   61rË   c               @   s   e Zd Zdd„ ZdS )Ú	BadStreamc             C   s   t dƒ‚d S )Nzdeliberate mistake)ÚRuntimeError)r7   Údatar9   r9   r:   Úwriteâ  s    zBadStream.writeN)r\   r]   r^   r6  r9   r9   r9   r:   r3  á  s   r3  c               @   s   e Zd Zdd„ ZdS )ÚTestStreamHandlerc             C   s
   || _ d S )N)Úerror_record)r7   r˜   r9   r9   r:   ÚhandleErroræ  s    zTestStreamHandler.handleErrorN)r\   r]   r^   r9  r9   r9   r9   r:   r7  å  s   r7  c               @   s   e Z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 Q R X dt_t	 
¡  }| |¡ |  d| ¡ ¡ W d Q R X W d |t_X d S )Nz"
RuntimeError: deliberate mistake
Fr   )r7  r3  r   r   ÚraiseExceptionsrå   ÚassertIsr8  r-   r   Úcaptured_stderrÚassertInrH   rJ   )r7   rC   r    Z	old_raiseÚstderrrÖ   r9   r9   r:   Útest_error_handlingê  s     






z%StreamHandlerTest.test_error_handlingc             C   sV   t  ¡ }t ¡ }| |¡}|  |tj¡ | |¡}|  ||¡ | |¡}|  |¡ dS )z3
        Test setting the handler's stream
        N)	r   r-   r(   r)   Ú	setStreamr<  rÜ   r?  ÚassertIsNone)r7   rC   r*   ÚoldrT   r9   r9   r:   Útest_stream_setting   s    


z%StreamHandlerTest.test_stream_settingN)r\   r]   r^   r@  rD  r9   r9   r9   r:   r:  é  s   r:  c               @   s:   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd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   s<   t jj| |d |dd | j ¡ d | _|| _d | _|| _d S )NT)ÚmapÚdecode_datarY   )	ÚsmtpdÚ
SMTPServerÚ__init__ÚsocketÚgetsocknameÚportÚ_handlerÚ_threadÚpoll_interval)r7   Úaddrr   rP  Úsockmapr9   r9   r:   rJ  &  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)rN  )r7   ÚpeerÚmailfromÚrcpttosr5  r9   r9   r:   Úprocess_message.  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  r  TN)r  r  Úserve_foreverrP  rO  Ú	setDaemonr  )r7   Útr9   r9   r:   r  :  s    
zTestSMTPServer.startc             C   s   t j|| jd 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`.
        )rF  N)ÚasyncoreÚloopÚ_map)r7   rP  r9   r9   r:   rW  C  s    zTestSMTPServer.serve_foreverNc             C   s0   |   ¡  t | j|¡ d| _tj| jdd dS )zØ
        Stop the thread by closing the server instance.
        Wait for the server thread to terminate.

        :param timeout: How long to wait for the server thread
                        to terminate.
        NT)rF  Ú
ignore_all)r<   r   Újoin_threadrO  rZ  Ú	close_allr\  )r7   Útimeoutr9   r9   r:   ÚstopM  s    zTestSMTPServer.stop)N)	r\   r]   r^   r_   rJ  rV  r  rW  ra  r9   r9   r9   r:   rE    s   	
rE  c                   s:   e Zd ZdZdd„ Zdd„ Z‡ fdd„Zd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 )N)rO  rP  rN  r  r$  Úready)r7   r   rP  r9   r9   r:   rJ  k  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  r  TN)r  r  rW  rP  rO  rX  r  )r7   rY  r9   r9   r:   r  q  s    
zControlMixin.startc                s   | j  ¡  tt| ƒ |¡ dS )z^
        Run the server. Set the ready flag before entering the
        service loop.
        N)rc  r  Úsuperrb  rW  )r7   rP  )Ú	__class__r9   r:   rW  z  s    
zControlMixin.serve_foreverNc             C   s<   |   ¡  | jdk	r&t | j|¡ d| _|  ¡  | j ¡  dS )z±
        Tell the server thread to stop, and wait for it to do so.

        :param timeout: How long to wait for the server thread
                        to terminate.
        N)ÚshutdownrO  r   r^  Úserver_closerc  r>   )r7   r`  r9   r9   r:   ra  ‚  s    
zControlMixin.stop)N)	r\   r]   r^   r_   rJ  r  rW  ra  Ú__classcell__r9   r9   )re  r:   rb  [  s
   	rb  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.
    ç      à?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 )NÚdo_)Ú
startswithÚprocess_requestÚAttributeError)r7   r8   Údefaultr9   r9   r:   Ú__getattr__ž  s    
zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__c             S   s   | j  | ¡ d S )N)ÚserverrN  )r7   r9   r9   r:   rm  £  s    zMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestc                s   ˆrt ˆ | ƒj|f|žŽ  d S )N)rd  Úlog_message)r7   Úformatr  )ÚDelegatingHTTPRequestHandlerre  rt   r9   r:   rr  ¦  s    zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_message)N)r\   r]   r^   rp  rm  rr  rh  r9   )rt  rt   )re  r:   rt    s   
rt  )r   r   rJ  rb  Ússlctx)r7   rQ  r   rP  rt   ru  r9   )rt  rt   r:   rJ  ›  s    zTestHTTPServer.__init__c          
   C   sf   y(| j  ¡ \}}| jr&| jj|dd}W n4 tk
r\ } ztj d| ¡ ‚ W d d }~X Y nX ||fS )NT)Úserver_sidezGot an error:
%s
)rK  Úacceptru  Úwrap_socketrí   rÜ   r?  r6  )r7   ÚsockrQ  Úer9   r9   r:   Úget_request®  s    zTestHTTPServer.get_request)rj  FN)r\   r]   r^   r_   rJ  r{  r9   r9   r9   r:   ri    s   
 
ri  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.
    Tç      à?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 )N)rq  rN  )r7   r9   r9   r:   rå   Î  s    zBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)r\   r]   r^   rå   r9   r9   r9   r:   ÚDelegatingTCPRequestHandlerÌ  s   r~  )r   r
   rJ  rb  )r7   rQ  r   rP  Úbind_and_activater~  r9   r9   r:   rJ  Ê  s    
zTestTCPServer.__init__c                s"   t t| ƒ ¡  | j ¡ d | _d S )NrY   )rd  r|  Úserver_bindrK  rL  rM  )r7   )re  r9   r:   r€  Ô  s    zTestTCPServer.server_bind)r}  T)r\   r]   r^   r_   Úallow_reuse_addressrJ  r€  rh  r9   r9   )re  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.
    ç      à?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 )N)rq  rN  )r7   r9   r9   r:   rå   í  s    zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlec                sD   | j  ¡ }|r@ytˆ | ƒ ¡  W n tk
r>   | jjs:‚ Y nX d S )N)ÚwfilerH   rd  Úfinishrí   rq  Ú_closed)r7   r5  )ÚDelegatingUDPRequestHandlerre  r9   r:   r…  ð  s    
zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)r\   r]   r^   rå   r…  rh  r9   )r‡  )re  r:   r‡  ë  s   r‡  F)r	   r   rJ  rb  r†  )r7   rQ  r   rP  r  r9   )r‡  r:   rJ  é  s    zTestUDPServer.__init__c                s"   t t| ƒ ¡  | j ¡ d | _d S )NrY   )rd  r‚  r€  rK  rL  rM  )r7   )re  r9   r:   r€  ÿ  s    zTestUDPServer.server_bindc                s   t t| ƒ ¡  d| _d S )NT)rd  r‚  rg  r†  )r7   )re  r9   r:   rg    s    zTestUDPServer.server_close)rƒ  T)r\   r]   r^   r_   rJ  r€  rg  rh  r9   r9   )re  r:   r‚  Ø  s
    
r‚  ÚAF_UNIXc               @   s   e Zd ZejZdS )ÚTestUnixStreamServerN)r\   r]   r^   rK  rˆ  Úaddress_familyr9   r9   r9   r:   r‰    s   r‰  c               @   s   e Zd ZejZdS )ÚTestUnixDatagramServerN)r\   r]   r^   rK  rˆ  rŠ  r9   r9   r9   r:   r‹    s   r‹  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSMTPHandlerTestg      N@c       
      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   gü©ñÒMbP?ÚmeZyouÚLog)r`  rÖ   u	   Hello âœ“rY   z
Subject: Log
u   

Hello âœ“)rE  r   ÚHOSTrV  r  rM  r   r3   ÚSMTPHandlerÚTIMEOUTrJ   ÚtoaddrsÚmessagesr   r  r$  Úhandledrå   r  ra  r6   Úis_setrK   r>  Úendswithr<   )
r7   rR  rq  rQ  rC   r    rS  rT  rU  r5  r9   r9   r:   Ú
test_basic  s,    


zSMTPHandlerTest.test_basicc             G   s   | j  |¡ | j ¡  d S )N)r“  Úappendr”  r  )r7   r  r9   r9   r:   rV  ,  s    zSMTPHandlerTest.process_messageN)r\   r]   r^   r‘  r—  rV  r9   r9   r9   r:   rŒ    s   rŒ  c               @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚMemoryHandlerTestzTests for the MemoryHandler.z^[\w.]+ -> (\w+): (\d+)$c             C   sF   t  | ¡ tj dtj| j¡| _t d¡| _	d| j	_
| j	 | j¡ d S )Né
   Zmemr   )r   r;   r   r3   ÚMemoryHandlerrj   r.   Úmem_hdlrr   Ú
mem_loggerÚ	propagater5   )r7   r9   r9   r:   r;   7  s    

zMemoryHandlerTest.setUpc             C   s   | j  ¡  t | ¡ d S )N)rœ  r<   r   rD   )r7   r9   r9   r:   rD   ?  s    
zMemoryHandlerTest.tearDownc             C   sæ   | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ |  g ¡ | j  |  ¡ ¡ dddg}|  |¡ xndD ]f}x tdƒD ]}| j  |  ¡ ¡ qlW |  |¡ | j  |  ¡ ¡ |dd„ t||d ƒD ƒ }|  |¡ q^W | j  |  ¡ ¡ |  |¡ d S )	N)r,   re   )rl   rg   )rj   rh   )r  é   é	   c             S   s   g | ]}d t |ƒf‘qS )r,   )Ústr)Ú.0Úir9   r9   r:   ú
<listcomp>Y  s    z0MemoryHandlerTest.test_flush.<locals>.<listcomp>rš  )r  rx   r[   rX   rw   rv   r  )r7   ÚlinesÚnr£  r9   r9   r:   Ú
test_flushC  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,   re   )rl   rg   rš  FN)r  rx   r[   rX   rw   r=   rœ  r<   r   r3   r›  rj   r.   r5   )r7   r¥  r9   r9   r:   Útest_flush_on_close_  s(    






z%MemoryHandlerTest.test_flush_on_closeN)	r\   r]   r^   r_   rG   r;   rD   r§  r¨  r9   r9   r9   r:   r™  0  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\   )r7   Úeir9   r9   r:   ÚformatException€  s    z"ExceptionFormatter.formatExceptionN)r\   r]   r^   r_   r«  r9   r9   r9   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,S )-ÚConfigFileTestz5Reading logging config from a .ini-style config file.z^(\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|Ž d S )N)r(   r)   ÚtextwrapÚdedentr   ÚconfigÚ
fileConfig)r7   ÚconfÚkwargsÚfiler9   r9   r:   Úapply_configƒ  s    zConfigFileTest.apply_configc          	   C   sb   t  ¡ P}|  | j¡ t ¡ }| |  ¡ ¡ | |  ¡ ¡ | j	dg|d |  	g ¡ W d Q R X d S )N)rf   rg   )r*   )
r   Úcaptured_stdoutr´  Úconfig0r   r   rw   r[   ru   rX   )r7   ÚoutputrÁ   r9   r9   r:   Útest_config0_ok‡  s    
zConfigFileTest.test_config0_okc          	   C   s†   t  ¡ t}t t | j¡¡}t ¡ }| 	|¡ t
j |¡ t
 ¡ }| |  ¡ ¡ | |  ¡ ¡ | jdg|d |  g ¡ W d Q R X d S )N)rf   rg   )r*   )r   rµ  r(   r)   r­  r®  r¶  ÚconfigparserÚConfigParserÚ	read_filer   r¯  r°  r   rw   r[   ru   rX   )r7   r·  r³  ÚcprÁ   r9   r9   r:   Útest_config0_using_cp_ok–  s    

z'ConfigFileTest.test_config0_using_cp_okc          	   C   sd   t  ¡ R}|  |¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | jddg|d |  g ¡ W d Q R X d S )Nzcompiler.parser)rl   re   )rf   rg   )r*   )	r   rµ  r´  r   r   rw   r[   ru   rX   )r7   r¯  r·  rÁ   r9   r9   r:   Útest_config1_ok¨  s    


zConfigFileTest.test_config1_okc             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig2)r7   r9   r9   r:   Útest_config2_failure·  s    z#ConfigFileTest.test_config2_failurec             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig3)r7   r9   r9   r:   Útest_config3_failure»  s    z#ConfigFileTest.test_config3_failurec          	   C   s|   t  ¡ j}|  | j¡ t ¡ }y
tƒ ‚W n tk
rF   t d¡ Y nX tj	 
d¡ |  | ¡ d¡ |  g ¡ W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   rµ  r´  Úconfig4r   r   r4  Ú	exceptionrÜ   ÚstdoutÚseekrJ   rH   rX   )r7   r·  rÁ   r9   r9   r:   Útest_config4_ok¿  s    


zConfigFileTest.test_config4_okc             C   s   | j | jd d S )N)r¯  )r¾  Úconfig5)r7   r9   r9   r:   Útest_config5_okÎ  s    zConfigFileTest.test_config5_okc             C   s   | j | jd d S )N)r¯  )r¾  Úconfig6)r7   r9   r9   r:   Útest_config6_okÑ  s    zConfigFileTest.test_config6_okc          	   C   s&  t  ¡ n}|  | j¡ t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
dddg|d |  
g ¡ W d Q R X t  ¡ ˜}|  | j¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
dd	d
dg|d |  
g ¡ W d Q R X d S )Nzcompiler.parserzcompiler-hyphenated)rl   re   )rf   rg   )rd   rh   )r*   zcompiler.lexer)rl   ri   )rf   rk   )rl   rm   )rf   rn   )r   rµ  r´  Úconfig1ar   r   rw   r[   ru   ÚcriticalrX   Úconfig7ræ   r   )r7   r·  rÁ   Ú
hyphenatedr9   r9   r:   Útest_config7_okÔ  s<    





zConfigFileTest.test_config7_okc          	   C   sŒ   dd„ }|   ¡ X t dd¡\}}t |¡ tjdkrB| dd¡}| jj|d}|  	|¡ |  	|¡ W d Q R X t
jjd	 }|  |||¡ d S )
Nc             S   s   |   ¡  t |¡ d S )N)r<   rà   Úremove)Úh1rô   r9   r9   r:   Úcleanup  s    z/ConfigFileTest.test_config8_ok.<locals>.cleanupz.logztest_logging-X-r  ú\z\\)rÞ   r   )Úcheck_no_resource_warningrÞ   rß   rà   r<   r8   ÚreplaceÚconfig8rs  r´  r   Úrootr3   r…   )r7   rÓ  ró   rô   r×  r   r9   r9   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   r6   )r7   rÁ   r9   r9   r:   Útest_logger_disabling  s    
z$ConfigFileTest.test_logger_disablingc          
   C   sx   t  d¡ ¡ }tjddd\}}zFt || d¡¡ t |¡ t	j
j|tdddd	d
ddœidd W dt |¡ X 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)rs  ÚdatefmtÚclass)ÚversionrÚ  Ú
formatters)ÚdefaultsN)r­  r®  ÚstriprÞ   rß   rà   r6  Úencoder<   r   r¯  r°  Údictrá   )r7   Úiniró   rô   r9   r9   r:   Ú!test_defaults_do_no_interpolation  s     

z0ConfigFileTest.test_defaults_do_no_interpolationN) r\   r]   r^   r_   r   rÕ  rG   r¶  Úconfig1rÌ  rÖ  r¿  rÁ  rÃ  rÈ  rÊ  rÎ  r×  rÛ  r´  r¸  r½  r¾  rÀ  rÂ  rÇ  rÉ  rË  rÐ  rÙ  rÜ  ré  r9   r9   r9   r:   r¬  „  s8     *&+	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 | _ | _| _y$|  | j| jd¡ | _}| ¡  W n( t	k
rh } z
|| _dS d}~X Y nX |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.Ng{®Gáz„?rÛ   r   r   )r   r;   rq  Ú	sock_hdlrÚserver_exceptionÚserver_classÚaddressÚhandle_socketr  rí   rc  r  r   r3   ÚSocketHandlerÚ
isinstanceÚserver_addressrO   rM  Ú
log_outputr%   r=   r5   r  Ú	Semaphorer”  )r7   rq  rz  Úhclsr9   r9   r:   r;   R  s$    

zSocketHandlerTest.setUpc          	   C   sF   z4| j r | j | j ¡ | j  ¡  | jr2| j d¡ W dt | ¡ X dS )zShutdown the TCP server.g       @N)rì  r%   r=   r<   rq  ra  r   rD   )r7   r9   r9   r:   rD   l  s    
zSocketHandlerTest.tearDownc             C   sœ   |j }x| d¡}t|ƒdk r P t d|¡d }| |¡}x&t|ƒ|k r`|| |t|ƒ ¡ }q<W t |¡}t |¡}|  j	|j
d 7  _	| j ¡  qW d S )Nr  z>Lr   Ú
)Ú
connectionÚrecvrK   ÚstructÚunpackÚpickleÚloadsr   r   rô  rÖ   r”  r  )r7   ÚrequestÚconnÚchunkÚslenÚobjr˜   r9   r9   r:   rð  w  s    



zSocketHandlerTest.handle_socketc             C   sV   | j r|  | j ¡ t d¡}| d¡ | j ¡  | d¡ | j ¡  |  | j	d¡ d S )NÚtcpr‹   Úeggsz
spam
eggs
)
rí  ÚskipTestr   r   ru   r”  r  rx   rJ   rô  )r7   rÁ   r9   r9   r:   Útest_output†  s    




zSocketHandlerTest.test_outputc             C   sž   | j r|  | j ¡ d| j_| j d¡ ytdƒ‚W n  tk
rR   | j d¡ Y nX | j 	d¡ t
 
¡ }|  | jj|¡ t
 | jj| d ¡ | j 	d¡ d S )Ng      @g       @zDeliberate mistakez
Never sentzNever sent, eithergü©ñÒMbP?zNor this)rí  r  rì  Ú
retryStartrq  ra  r4  r%   rÄ  ru   r  r#  Ú	retryTimer	  )r7   Únowr9   r9   r:   Útest_noserver‘  s    zSocketHandlerTest.test_noserverN)r\   r]   r^   r_   r|  rî  rï  r;   rD   rð  r  r
  r9   r9   r9   r:   rë  K  s   rë  c              C   s*   t jddd\} }t | ¡ t |¡ |S )NrÝ  z.sock)rš   rÞ  )rÞ   rß   rà   r<   rÑ  )ró   rô   r9   r9   r:   Ú_get_temp_domain_socket¤  s    

r  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 )N)r  rï  rë  r;   )r7   r9   r9   r:   r;   ´  s    zUnixSocketHandlerTest.setUpc             C   s   t  | ¡ t | j¡ d S )N)rë  rD   r   rá   rï  )r7   r9   r9   r:   rD   ¹  s    
zUnixSocketHandlerTest.tearDownN)
r\   r]   r^   r_   r2  rK  r‰  rî  r;   rD   r9   r9   r9   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 )ÚDatagramHandlerTestzTest for DatagramHandler.)rÛ   r   c          
   C   sÜ   t  | ¡ d | _ | _| _y$|  | j| jd¡ | _}| ¡  W n( t	k
rh } z
|| _dS d}~X Y nX |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.Ng{®Gáz„?rÛ   r   r   )r   r;   rq  rì  rí  rî  rï  Úhandle_datagramr  rí   rc  r  r   r3   ÚDatagramHandlerrò  ró  rO   rM  rô  r%   r=   r5   r  r$  r”  )r7   rq  rz  rö  r9   r9   r:   r;   Ä  s$    

zDatagramHandlerTest.setUpc          	   C   sF   z4| j r| j  d¡ | jr2| j | j¡ | j ¡  W dt | ¡ X dS )zShutdown the UDP server.g       @N)rq  ra  rì  r%   r=   r<   r   rD   )r7   r9   r9   r:   rD   Þ  s    zDatagramHandlerTest.tearDownc             C   sT   t  dd¡}|jt|ƒd … }t |¡}t |¡}|  j|j	d 7  _| j
 ¡  d S )Nz>Lr   r÷  )rú  ÚpackÚpacketrK   rü  rý  r   r   rô  rÖ   r”  r  )r7   rþ  r  r  r  r˜   r9   r9   r:   r  é  s    

z#DatagramHandlerTest.handle_datagramc             C   s`   | j r|  | j ¡ t d¡}| d¡ | j ¡  | j ¡  | d¡ | j ¡  |  | j	d¡ d S )NZudpr‹   r  z
spam
eggs
)
rí  r  r   r   ru   r”  r  r>   rJ   rô  )r7   rÁ   r9   r9   r:   r  ñ  s    





zDatagramHandlerTest.test_outputN)r\   r]   r^   r_   r‚  rî  rï  r;   rD   r  r  r9   r9   r9   r:   r  ½  s   r  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 )N)r  rï  r  r;   )r7   r9   r9   r:   r;     s    zUnixDatagramHandlerTest.setUpc             C   s   t  | ¡ t | j¡ d S )N)r  rD   r   rá   rï  )r7   r9   r9   r:   rD   
  s    
z UnixDatagramHandlerTest.tearDownN)
r\   r]   r^   r_   r2  rK  r‹  rî  r;   rD   r9   r9   r9   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Û   r   c          
   C   sâ   t  | ¡ d | _ | _| _y$|  | j| jd¡ | _}| ¡  W n( t	k
rh } z
|| _dS d}~X Y nX |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.Ng{®Gáz„?r   r   )r   r;   rq  Úsl_hdlrrí  rî  rï  r  r  rí   rc  r  r   r3   ré   rò  ró  rO   rM  rô  r%   r=   r5   r  r$  r”  )r7   rq  rz  rö  r9   r9   r:   r;     s$    

zSysLogHandlerTest.setUpc          	   C   sF   z4| j r| j  d¡ | jr2| j | j¡ | j ¡  W dt | ¡ X dS )zShutdown the server.g       @N)rq  ra  r  r%   r=   r<   r   rD   )r7   r9   r9   r:   rD   /  s    zSysLogHandlerTest.tearDownc             C   s   |j | _| j ¡  d S )N)r  rô  r”  r  )r7   rþ  r9   r9   r:   r  :  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slhu   spÃ¤ms
   <11>spÃ¤m Fs	   <11>spÃ¤mu   hÃ¤m-s   <11>hÃ¤m-spÃ¤m)rí  r  r   r   ru   r”  r  rJ   rô  r>   r  Ú
append_nulÚident)r7   rÁ   r9   r9   r:   r  >  s     








zSysLogHandlerTest.test_outputN)r\   r]   r^   r_   r‚  rî  rï  r;   rD   r  r  r9   r9   r9   r:   r    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 )N)r  rï  r  r;   )r7   r9   r9   r:   r;   Y  s    zUnixSysLogHandlerTest.setUpc             C   s   t  | ¡ t | j¡ d S )N)r  rD   r   rá   rï  )r7   r9   r9   r:   rD   ^  s    
zUnixSysLogHandlerTest.tearDownN)
r\   r]   r^   r_   r2  rK  r‹  rî  r;   rD   r9   r9   r9   r:   r  Q  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 )N)rK  ÚAF_INET6rî  rŠ  rd  r  r;   )r7   )re  r9   r:   r;   k  s    
zIPv6SysLogHandlerTest.setUpc                s   t j| j_tt| ƒ ¡  d S )N)rK  ÚAF_INETrî  rŠ  rd  r  rD   )r7   )re  r9   r:   rD   o  s    
zIPv6SysLogHandlerTest.tearDown)
r\   r]   r^   r_   r‚  rî  rï  r;   rD   rh  r9   r9   )re  r:   r  b  s
   r  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”  )r7   r9   r9   r:   r;   v  s    
zHTTPHandlerTest.setUpc             C   sr   |j | _ t|jƒ| _| j dkrRy t|jd ƒ}|j |¡| _W n   d | _Y nX | 	d¡ | 
¡  | j ¡  d S )NrÙ   zContent-LengthéÈ   )Úcommandr   rç   Úlog_dataÚintÚheadersÚrfilerQ   Ú	post_dataÚsend_responseÚend_headersr”  r  )r7   rþ  Úrlenr9   r9   r:   Úhandle_request|  s    

zHTTPHandlerTest.handle_requestc          	   C   sì  t  d¡}| j}| | jjd ¡ xÂdD ]¸}d}|rœydd l}W n tk
r\   d }Y q¤X 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¡ x´dD ]¬}|| j_| j ¡  d}| |¡ | j ¡  |  | jjd
¡ |  | j |¡ |dkrtt!| jj"ƒ}nt!| j# $d¡ƒ}|  |d dg¡ |  |d dg¡ |  |d |g¡ qW | j %d¡ | j | j¡ | j &¡  q*W d S )NÚhttpr   )FT)rÛ   r   zkeycert.pem)Úcafileg{®Gáz„?)ru  zlocalhost:%dz/frob)ÚfooÚbar)ÚsecureÚcontextÚcredentials)rØ   rÙ   u   spÃ¤mrØ   zutf-8r8   ÚfuncNamer  rÖ   g       @)'r   r   r%   r=   r3   ÚsslÚImportErrorrà   rç   ÚdirnameÚ__file__r—   Ú
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainÚcreate_default_contextri  r&  rq  r  rc  r  Úserver_portrï   Zh_hdlrr  r5   rö   r”  r>   ru   rJ   r  r   Úqueryr"  Údecodera  r<   )r7   rÁ   r%   r+  rQ  r/  ru  ÚhereZlocalhost_certr,  rq  ÚhostZsecure_clientrö   rÖ   Údr9   r9   r:   r  ‰  s\    











zHTTPHandlerTest.test_outputN)r\   r]   r^   r_   r;   r&  r  r9   r9   r9   r:   r  s  s   r  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;   Ú
_survivors)r7   r9   r9   r:   r;   Ä  s    
zMemoryTest.setUpc             G   s2   x,|D ]$}t |ƒt|ƒf}t |¡| j|< qW dS )zKWatch the given objects for survival, by creating weakrefs to
        them.N)ÚidÚreprÚweakrefÚrefr<  )r7   r  r  Úkeyr9   r9   r:   Ú_watch_for_survivalÉ  s    
zMemoryTest._watch_for_survivalc             C   s`   t  ¡  g }x.| j ¡ D ] \\}}}|ƒ dkr| |¡ qW |r\|  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, )ÚgcÚcollectr<  r½   r˜  rN   rK   r—   )r7   ZdeadZid_Úrepr_r@  r9   r9   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 )Nr)  )r)  r,   rg   )r)  r,   rh   )r%   r+   r   rl   r   rB  r,   rx   r[   rX   rF  )r7   r)  r*  r9   r9   r:   Útest_persistent_loggersÜ  s    


z"MemoryTest.test_persistent_loggersN)r\   r]   r^   r_   r;   rB  rF  rG  r9   r9   r9   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}zpt j|dd}| |¡ z| |¡ W d | 	|¡ | ¡  X t
|dd}z|  | ¡  ¡ |¡ W d | ¡  X W d tj |¡r°t |¡ X d S )NÚtestz.logztest_logging-1-u   fooÂ€zutf-8)Úencoding)r   r   rÞ   rß   rà   r<   rü   r5   rv   r=   ÚopenrJ   rQ   Úrstriprç   ÚisfilerÑ  )r7   rt   ró   rô   r5  r   rŸ   r9   r9   r:   Útest_encoding_plain_fileõ  s"    




z%EncodingTest.test_encoding_plain_filec          	   C   s€   t  d¡}d}t d¡}d|_t ¡ }||dƒ}t  |¡}| |¡ z| 	|¡ W d | 
|¡ | ¡  X | ¡ }|  |d¡ d S )NrI  u   Ð´Ð¾ ÑÐ²Ð¸Ð´Ð°Ð½Ð¸ÑÚcp1251Ústricts   äî ñâèäàíèÿ
)r   r   ÚcodecsÚ	getwriterrJ  r(   ÚBytesIOr-   r5   rv   r=   r<   rH   rJ   )r7   rt   ÚmessageZwriter_classr*   Úwriterr   rW   r9   r9   r:   Útest_encoding_cyrillic_unicode  s    






z+EncodingTest.test_encoding_cyrillic_unicodeN)r\   r]   r^   rN  rV  r9   r9   r9   r:   rH  ô  s   rH  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 Q R X d S )NTFÚalways)Úcategoryzpy.warningszI'm warning you...z UserWarning: I'm warning you...
r   ÚExplicitzdummy.pyé*   z
Dummy linez0dummy.py:42: UserWarning: Explicit
  Dummy line
)ÚwarningsÚcatch_warningsr   ÚcaptureWarningsr…   ÚfilterwarningsÚUserWarningr(   r)   r-   r   r5   Úwarnr=   rH   r<   r#  ÚfindÚshowwarningrJ   )r7   r*   rC   rÁ   rW   Za_filer9   r9   r:   Útest_warnings'  s(    






zWarningsTest.test_warningsc          	   C   s~   t  ¡ l t d¡ |  tjd¡ t d¡}|  |jg ¡ t  dt	dd¡ |  t
|jƒd¡ |  |jd tj¡ W d Q R X d S )	NTFzpy.warningsrZ  zdummy.pyr[  rY   r   )r\  r]  r   r^  r…   r   rJ   r3   rc  r`  rK   ÚassertIsInstanceÚNullHandler)r7   rÁ   r9   r9   r:   Útest_warnings_no_handlers?  s    


z&WarningsTest.test_warnings_no_handlersN)r\   r]   r^   rd  rg  r9   r9   r9   r:   rW  %  s   rW  c             C   s   t  | |¡S )N)r   r/   )rs  rà  r9   r9   r:   Ú
formatFuncM  s    rh  c               C   s   t  ¡ S )N)r   r-   r9   r9   r9   r:   ÚhandlerFuncP  s    ri  c               @   s   e Zd ZdS )ÚCustomHandlerN)r\   r]   r^   r9   r9   r9   r:   rj  S  s   rj  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 dEdF„ Z!dGdH„ Z"efdIdJ„Z#dKdL„ Z$dMdN„ Z%dOdP„ Z&dQdR„ Z'dSdT„ Z(dUdV„ Z)dWdX„ Z*dYdZ„ Z+d[d\„ Z,d]d^„ Z-d_d`„ Z.dadb„ Z/dcdd„ Z0dedf„ Z1dgdh„ Z2didj„ Z3dkdl„ Z4dmdn„ Z5d|dpdq„Z6drds„ Z7dtdu„ Z8dvdw„ Z9dxdy„ Z:dzd{„ Z;doS )}ÚConfigDictTestz)Reading logging config from a dictionary.z^(\w+) \+\+ (\w+)$rY   Úform1rs  z%(levelname)s ++ %(message)sÚhand1zlogging.StreamHandlerr‰   zext://sys.stdout)rá  Ú	formatterÚlevelr*   rj   )ro  r3   )râ  rã  r3   rØ  zcompiler.parserr,   ro  )râ  rã  r3   ÚloggersrØ  zext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)z()rs  z.formatFunc)rl  Zform2Zform3z())rm  Zhand2z.CustomHandlerzinvalid parameter name)rá  rn  ro  r*   rp   zcompiler.lexerF)Úcompilerzcompiler.lexer)râ  rÚ  rã  r3   rp  rØ  Trl   )râ  Zincrementalr3   rp  Zfilt1r8   )rá  rn  ro  r*   Úfilters)ro  rr  )râ  rã  rr  r3   rp  rØ  zcfg://true_formatterszcfg://handler_configs[hand1])râ  Útrue_formattersÚhandler_configsrã  r3   rp  rØ  )rs  rt  rã  r3   rp  rØ  r•   r*  z!
)r)  Ú
terminator)rá  rn  ro  r*   r”   ZmySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)sú$)rs  Ústyle)rá  ro  rn  zlogging.handlers.MemoryHandleré   Ú
fileGlobal)rá  Úcapacityrn  r  ro  )ry  ÚbufferGlobalÚmymoduler{  Útrue)ro  r3   rž  )râ  rã  r3   rp  c             C   s   t j |¡ d S )N)r   r¯  Z
dictConfig)r7   r±  r9   r9   r:   r´  Ð
  s    zConfigDictTest.apply_configc          	   C   sb   t  ¡ P}|  | j¡ t ¡ }| |  ¡ ¡ | |  ¡ ¡ | j	dg|d |  	g ¡ W d Q R X d S )N)rf   rg   )r*   )
r   rµ  r´  r¶  r   r   rw   r[   ru   rX   )r7   r·  rÁ   r9   r9   r:   r¸  Ó
  s    
zConfigDictTest.test_config0_okc          	   C   sd   t  ¡ R}|  |¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | jddg|d |  g ¡ W d Q R X d S )Nzcompiler.parser)rl   re   )rf   rg   )r*   )	r   rµ  r´  r   r   rw   r[   ru   rX   )r7   r¯  r·  rÁ   r9   r9   r:   r¾  â
  s    


zConfigDictTest.test_config1_okc             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  r¿  )r7   r9   r9   r:   rÀ  ñ
  s    z#ConfigDictTest.test_config2_failurec             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig2a)r7   r9   r9   r:   Útest_config2a_failureõ
  s    z$ConfigDictTest.test_config2a_failurec             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig2b)r7   r9   r9   r:   Útest_config2b_failureù
  s    z$ConfigDictTest.test_config2b_failurec             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  rÁ  )r7   r9   r9   r:   rÂ  ý
  s    z#ConfigDictTest.test_config3_failurec          	   C   st   t  ¡ b}|  | j¡ y
tƒ ‚W n tk
r>   t d¡ Y nX tj 	d¡ |  
| ¡ d¡ |  g ¡ W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   rµ  r´  rÃ  r4  r   rÄ  rÜ   rÅ  rÆ  rJ   rH   rX   )r7   r·  r9   r9   r:   rÇ    s    


zConfigDictTest.test_config4_okc          	   C   st   t  ¡ b}|  | j¡ y
tƒ ‚W n tk
r>   t d¡ Y nX tj 	d¡ |  
| ¡ d¡ |  g ¡ W d Q R X d S )Nzjust testingr   z-ERROR:root:just testing
Got a [RuntimeError]
)r   rµ  r´  Úconfig4ar4  r   rÄ  rÜ   rÅ  rÆ  rJ   rH   rX   )r7   r·  r9   r9   r:   Útest_config4a_ok  s    


zConfigDictTest.test_config4a_okc             C   s   | j | jd d S )N)r¯  )r¾  rÈ  )r7   r9   r9   r:   rÉ    s    zConfigDictTest.test_config5_okc             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  rÊ  )r7   r9   r9   r:   Útest_config6_failure"  s    z#ConfigDictTest.test_config6_failurec          	   C   sÞ   t  ¡ T}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d Q R X t  ¡ j}|  | j
¡ t d¡}|  |j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d Q R X d S )Nzcompiler.parser)rl   re   )rf   rg   )r*   zcompiler.lexer)rl   rh   )rf   ri   )r   rµ  r´  rê  r   r   rw   r[   ru   rX   rÎ  r6   r   )r7   r·  rÁ   r9   r9   r:   rÐ  %  s,    




zConfigDictTest.test_config7_okc          	   C   sþ   t  ¡ T}|  | j¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	ddg|d |  	g ¡ W d Q R X t  ¡ Š}|  | j
¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | j	dddd	g|d |  	g ¡ W d Q R X d S )
Nzcompiler.parser)rl   re   )rf   rg   )r*   zcompiler.lexer)rl   rh   )rf   ri   )rl   rk   )rf   rm   )r   rµ  r´  rê  r   r   rw   r[   ru   rX   r×  ræ   r   )r7   r·  rÁ   r9   r9   r:   Útest_config_8_okB  s4    




zConfigDictTest.test_config_8_okc          	   C   s&  t  ¡ n}|  | j¡ t d¡}t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
dddg|d |  
g ¡ W d Q R X t  ¡ ˜}|  | j¡ t d¡}|  |j¡ | |  ¡ ¡ | |  ¡ ¡ t d¡}| |  ¡ ¡ | |  ¡ ¡ | 	|  ¡ ¡ | j
dd	d
dg|d |  
g ¡ W d Q R X d S )Nzcompiler.parserzcompiler-hyphenated)rl   re   )rf   rg   )rd   rh   )r*   zcompiler.lexer)rl   ri   )rf   rk   )rl   rm   )rf   rn   )r   rµ  r´  rÌ  r   r   rw   r[   ru   rÍ  rX   Úconfig8aræ   r   )r7   r·  rÁ   rÏ  r9   r9   r:   Útest_config_8a_okc  s<    





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 Q R X d S )Nzcompiler.parser)r*   )rl   rh   )r   rµ  r´  Úconfig9r   r   rw   r[   rX   Úconfig9aÚconfig9b)r7   r·  rÁ   r9   r9   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 Q R X d S )Nzcompiler.parserrq  zcompiler.lexerzcompiler.parser.codegen)rj   re   )rf   ri   )r*   )
r   rµ  r´  Úconfig10r   r   rv   r[   ru   rX   )r7   r·  rÁ   r9   r9   r:   Útest_config_10_ok   s    




z ConfigDictTest.test_config_10_okc             C   s   |   | j¡ d S )N)r¾  Úconfig11)r7   r9   r9   r:   Útest_config11_ok³  s    zConfigDictTest.test_config11_okc             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig12)r7   r9   r9   r:   Útest_config12_failure¶  s    z$ConfigDictTest.test_config12_failurec             C   s   |   t| j| j¡ d S )N)rÎ   r  r´  Úconfig13)r7   r9   r9   r:   Útest_config13_failure¹  s    z$ConfigDictTest.test_config13_failurec          	   C   sh   t  ¡ V}|  | j¡ tjd }|  |jd¡ |  |jd¡ t 	d¡ |  
| ¡  d¡¡ W d Q R X d S )Nrm  r*  z!
ZExclamationzExclamation!
)r   rµ  r´  Úconfig14r   r   rJ   r)  ru  rv   r6   rH   r–  )r7   r·  rC   r9   r9   r:   Útest_config14_ok¼  s    


zConfigDictTest.test_config14_okc          	   C   s„   dd„ }|   ¡ P t dd¡\}}t |¡ ddd|dœid	dgid
œ}|  |¡ |  |¡ W d Q R X tjjd }|  	|||¡ d S )Nc             S   s   |   ¡  t |¡ d S )N)r<   rà   rÑ  )rÒ  rô   r9   r9   r:   rÓ  Ç  s    z0ConfigDictTest.test_config15_ok.<locals>.cleanupz.logztest_logging-X-rY   r³  zlogging.FileHandler)rá  Úfilenamer3   )râ  r3   rØ  r   )
rÕ  rÞ   rß   rà   r<   r´  r   rØ  r3   r…   )r7   rÓ  ró   rô   r¯  r   r9   r9   r:   Útest_config15_okÅ  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|ƒ}	x.|	dkr¶| ||d … ¡}
||
7 }|	|
8 }	qŠW | ¡  W d |j d¡ tj ¡  t |d¡ X d S )Nzutf-8r   g       @rÛ   z>L)ræ  r   r¯  Úlistenr  rc  r  rM  r>   rK  r  ÚSOCK_STREAMÚ
settimeoutÚconnectrú  r  rK   Úsendr<   ZstopListeningr   r^  )r7   ÚtextÚverifyrY  rM  ry  r  rW   Z	sentsofarÚleftÚsentr9   r9   r:   Úsetup_via_listenerâ  s,    





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 Q R X d S )Nzcompiler.parserrq  zcompiler.lexerzcompiler.parser.codegen)rj   re   )rf   ri   )r*   )r   rµ  r¡  ÚjsonÚdumpsrŒ  r   r   rv   r[   ru   rX   )r7   r·  rÁ   r9   r9   r:   Útest_listen_config_10_okþ  s    




z'ConfigDictTest.test_listen_config_10_okc          	   C   sl   t  ¡ Z}|  t tj¡¡ t d¡}| 	|  
¡ ¡ | |  
¡ ¡ | jddg|d |  g ¡ W d Q R X d S )Nzcompiler.parser)rl   re   )rf   rg   )r*   )r   rµ  r¡  r­  r®  r¬  rê  r   r   rw   r[   ru   rX   )r7   r·  rÁ   r9   r9   r:   Útest_listen_config_1_ok  s    

z&ConfigDictTest.test_listen_config_1_okc          	   C   sb  dd„ }dd„ }t  d¡}t tj¡}t ¡ .}|  ||¡ | 	|  
¡ ¡ | |  
¡ ¡ W d Q R X | jg |d | jddgd	d
 t ¡ 6}|  |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d Q R X | jddg|d | jddgd	d
 t ¡ B}|  |d d d… |¡ t  d¡}| 	|  
¡ ¡ | |  
¡ ¡ W d Q R X | jddg|d | jddgd	d
 d S )Nc             S   s   d S )Nr9   )Ústuffr9   r9   r:   Úverify_fail!  s    z6ConfigDictTest.test_listen_verify.<locals>.verify_failc             S   s   | d d d… S )NrÕ   r9   )r¦  r9   r9   r:   Úverify_reverse$  s    z9ConfigDictTest.test_listen_verify.<locals>.verify_reversezcompiler.parser)r*   )rl   re   )rf   rg   z^[\w.]+ -> (\w+): (\d+)$)rS   )rl   rh   )rf   ri   rÕ   )rl   rk   )rf   rm   )r   r   r­  r®  r¬  rê  r   rµ  r¡  rw   r[   ru   rX   )r7   r§  r¨  rÁ   Zto_sendr·  r9   r9   r:   Útest_listen_verify  sN    






z!ConfigDictTest.test_listen_verifyc             C   sB   |   | j¡ t d¡jd }|  |jtj¡ |  |jj	tj
¡ d S )Nr|  r   )r´  Úout_of_orderr   r   r3   re  r  rÍ   rn  Ú_styleÚStringTemplateStyle)r7   r   r9   r9   r:   Útest_out_of_order]  s
    
z ConfigDictTest.test_out_of_orderc             C   sü   ddddgdddœdd	d
dgdgdddgdœ}t j |¡}|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ | d¡}|  | d¡dddg¡ |  t|jd¡ |  t|jd¡ |  t|jd¡ d S )N)rY   r•   é   rù   ÚbÚcrz  r®  )r:  rŸ   )Úg)rC   r£  Újr¾   Úlry   r¦  Úozcfg://alistÚp)ZatupleZalistÚadictZnest1Znest2Znest3zcfg://atuple[1]r•   zcfg://alist[1]zcfg://nest1[1][0]rC   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BaseConfiguratorrJ   ÚconvertÚpoprÎ   ÚKeyErrorrî   )r7   r:  Úbcr¿   r9   r9   r:   Útest_baseconfigd  s$    
zConfigDictTest.test_baseconfig)N)<r\   r]   r^   r_   r   rÕ  rG   r¶  rê  rÌ  r¿  r~  r€  rÁ  rÃ  r©  rh  ri  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»  r9   r9   r9   r:   rk  V  sj  
















!+	
>rk  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 )N)r˜  )r7   ro  rÖ   r  Úexc_infoÚextra)Úloggedr9   r:   Ú_log  s    z;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._log)NN)r\   r]   r^   rÀ  r9   )r¿  r9   r:   ÚMyLogger~  s   rÁ  rI  zshould appear in loggedzshould not appear in logged)
r   ÚLoggerÚManagerrÎ   Ú	TypeErrorÚsetLoggerClassr  r   rv   rJ   )r7   rÁ  ÚmanrÁ   r9   )r¿  r:   Útest_manager_loggerclass{  s    




z$ManagerTest.test_manager_loggerclassc             C   s,   t  d ¡}tƒ }| |¡ |  |j|¡ d S )N)r   rÃ  ÚobjectÚsetLogRecordFactoryrJ   ÚlogRecordFactory)r7   rÆ  rU   r9   r9   r:   Útest_set_log_record_factory‹  s    

z'ManagerTest.test_set_log_record_factoryN)r\   r]   r^   rÇ  rË  r9   r9   r9   r:   r¼  z  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.ghiÚxyzzuvw.xyzÚdefZghizabc.defzabc.def.ghi)r   r   ÚgetChildr<  )r7   r    Úl1Úl2Úc1Úc2Úc3r9   r9   r:   Útest_child_loggers’  s    






z"ChildLoggerTest.test_child_loggersN)r\   r]   r^   rÖ  r9   r9   r9   r:   rÌ  ‘  s   rÌ  c               @   s   e Zd ZdS )ÚDerivedLogRecordN)r\   r]   r^   r9   r9   r9   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 )N)r  )r7   r  r9   r9   r:   rJ  ©  s    z;LogRecordFactoryTest.setUp.<locals>.CheckingFilter.__init__c             S   s,   t |ƒ}|| jk	r(d|| jf }t|ƒ‚dS )Nz)Unexpected LogRecord type %s, expected %sT)Útyper  rÄ  )r7   r˜   rY  rÖ   r9   r9   r:   rž   ¬  s    

z9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)r\   r]   r^   rJ  rž   r9   r9   r9   r:   ÚCheckingFilter¨  s   rÚ  )
r   rŒ   r   r;   r×  rž   r%   r   ÚgetLogRecordFactoryÚorig_factory)r7   rÚ  r9   r9   r:   r;   §  s
    

zLogRecordFactoryTest.setUpc             C   s(   | j  | j¡ t | ¡ t | j¡ d S )N)r%   rŽ   rž   r   rD   r   rÉ  rÜ  )r7   r9   r9   r:   rD   ¹  s    
zLogRecordFactoryTest.tearDownc             C   s@   |   t| jj|  ¡ ¡ t t¡ | j |  ¡ ¡ |  	dg¡ d S )N)rØ  rf   rg   )
rÎ   rÄ  r%   rv   r[   r   rÉ  r×  ru   rX   )r7   r9   r9   r:   Útest_logrecord_class¾  s    

z)LogRecordFactoryTest.test_logrecord_classN)r\   r]   r^   r;   rD   rÝ  r9   r9   r9   r:   rØ  ¥  s   rØ  c               @   sh   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dS )ÚQueueHandlerTestz^[\w.]+ -> (\w+): (\d+)$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   r3   ÚQueueHandlerÚque_hdlrr8   r   Ú
que_loggerrž  r+   rj   r5   )r7   r9   r9   r:   r;   Ì  s    
zQueueHandlerTest.setUpc             C   s   | j  ¡  t | ¡ d S )N)râ  r<   r   rD   )r7   r9   r9   r:   rD   Ö  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 )N)rã  rx   r[   rÎ   rß  ÚEmptyÚ
get_nowaitrw   rv   r6   rò  r   Ú	LogRecordrJ   r8   rÖ   r  )r7   rÖ   r5  r9   r9   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})r8   Ú	levelnamerT  )r[   r   r‚   rj   rs  r8   r/   r0   râ  r1   rã  rv   rß  rå  rJ   rÖ   rT  )r7   rÖ   rè  Zlog_format_strZformatted_msgrn  Z
log_recordr9   r9   r:   Útest_formattingæ  s    

z QueueHandlerTest.test_formattingÚQueueListenerz5logging.handlers.QueueListener required for this testc             C   st  t  t  ¡ ¡}tj | j|¡}| ¡  z4| j 	|  
¡ ¡ | j |  
¡ ¡ | j |  
¡ ¡ W d | ¡  X |  |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}| ¡  z4| j 	|  
¡ ¡ | j |  
¡ ¡ | j |  
¡ ¡ W d | ¡  X |  |jtjdd¡ |  |jtjdd¡ |  |jtjd	d¡ | ¡  d S )
Nre   )r¶   rT  rg   rh   T)Úrespect_handler_levelri   rk   rm   )r   ÚTestHandlerÚMatcherr   r3   rê  rß  r  rã  rv   r[   ru   rÍ  ra  r6   Úmatchesrj   rf   rd   r<   r+   ræ   )r7   r   Úlistenerr9   r9   r:   Útest_queue_listeneró  s4    

z$QueueHandlerTest.test_queue_listenerc          
   C   sŠ   t j | j| j¡}| ¡  ydd  W n: tk
r` } z|}| jj|  	¡ |d W d d }~X Y nX | 
¡  |  | j ¡  ¡  d¡d¡ d S )NrY   r   )r½  Ú	Traceback)r   r3   rê  rß  r.   r  ÚZeroDivisionErrorrã  rÄ  r[   ra  rJ   r*   rH   rå  Úcount)r7   rï  rz  Úexcr9   r9   r:   Ú&test_queue_listener_with_StreamHandler  s    &z7QueueHandlerTest.test_queue_listener_with_StreamHandlerN)r\   r]   r^   rG   r;   rD   rç  ré  r0  Ú
skipUnlessr2  r   r3   rð  rõ  r9   r9   r9   r:   rÞ  È  s   
"rÞ  rê  )Úpatchc               @   sd   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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ÚtwoÚthreeÚfourÚfiveN)r   r   r+   r,   r3   rá  r5   rê  r  rw   ra  r=   r<   )Ú	log_queuer  rÁ   r   rï  r9   r9   r:   Úsetup_and_log0  s    






zQueueListenerTest.setup_and_logrå   c             C   sN   x2t | jƒD ]$}t ¡ }|  |d|  ¡ |f ¡ qW |  |jd| j d¡ d S )Nz%s_%srx  z&correct number of handled log messages)r  Úrepeatrß  rà  r   r=  rJ   Ú
call_count)r7   Úmock_handler£  rÿ  r9   r9   r:   Ú#test_handle_called_with_queue_queueH  s
    z5QueueListenerTest.test_handle_called_with_queue_queuec             C   sh   t  d¡ xBt| jƒD ]4}t ¡ }|  |d|  ¡ |f ¡ | ¡  | 	¡  qW |  
|jd| j d¡ d S )Nzmultiprocessing.synchronizez%s_%srx  z&correct number of handled log messages)r   Úimport_moduler  r  Úmultiprocessingrà  r   r=  r<   r^  rJ   r  )r7   r  r£  rÿ  r9   r9   r:   Ú test_handle_called_with_mp_queueP  s    
z2QueueListenerTest.test_handle_called_with_mp_queuec             c   s0   yx|   ¡ V  qW W n tjk
r*   g S X d S )N)rå  rß  rä  )rÿ  r9   r9   r:   Úget_all_from_queue]  s
    z$QueueListenerTest.get_all_from_queuec             C   sŒ   t  d¡ x|t| jƒD ]n}t ¡ }|  |d|  ¡ |f ¡ t|  	|¡ƒ}| 
¡  | ¡  g tjjjgg}|  ||ddd„ |D ƒ ¡ qW 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.
            zmultiprocessing.synchronizez%s_%sz&Found unexpected messages in queue: %sc             S   s"   g | ]}t |tjƒr|jn|‘qS r9   )rò  r   ræ  rÖ   )r¢  ry   r9   r9   r:   r¤  z  s   zJQueueListenerTest.test_no_messages_in_queue_after_stop.<locals>.<listcomp>N)r   r  r  r  r  rà  r   r=  Úlistr  r<   r^  r   r3   rê  Ú	_sentinelr>  )r7   r£  rß  r½   rU   r9   r9   r:   Ú$test_no_messages_in_queue_after_stope  s    	
z6QueueListenerTest.test_no_messages_in_queue_after_stopN)r\   r]   r^   r_   r  Ústaticmethodr   r÷  rÈ  r   r3   rê  r  r  r  r  r9   r9   r9   r:   rø  (  s   rø  c               @   s    e Zd Zdd„ ZeZdd„ ZdS )ÚUTCc             C   s   t S )N)ÚZERO)r7   Údtr9   r9   r:   Ú	utcoffset  s    zUTC.utcoffsetc             C   s   dS )Nr  r9   )r7   r  r9   r9   r:   Útzname†  s    z
UTC.tznameN)r\   r]   r^   r  Údstr  r9   r9   r9   r:   r  €  s   r  c               @   sF   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	d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)r8   ro  ÚpathnameÚlinenor½  ÚfuncrÖ   r  )r   r,   rà   rç   r—   ÚcommonÚvariants)r7   r9   r9   r:   r;   Œ  s    
zFormatterTest.setUpNc             C   s,   t | jƒ}|d k	r"| | j| ¡ t |¡S )N)rç  r  r?   r  r   r   )r7   r8   Úresultr9   r9   r:   Ú
get_recordš  s    
zFormatterTest.get_recordc             C   s˜   |   ¡ }t d¡}|  | |¡d¡ t d¡}|  t|j|¡ |  | ¡ ¡ t d¡}|  	| ¡ ¡ t d¡}|  	| ¡ ¡ t d¡}|  | ¡ ¡ d S )Nz${%(message)s}z${Message with 2 placeholders}z
%(random)sz%(asctime)sz%(asctime)-15sÚasctime)
r  r   r/   rJ   rs  rÎ   r¹  ræ   ÚusesTimer6   )r7   r    rŸ   r9   r9   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}%$ú{)rw  z$%Message with 2 placeholders%$z{random}z	{asctime}z{asctime!s:15}z{asctime:15}r  )
r  r   r/   rJ   rs  rÎ   r¹  ræ   r  r6   )r7   r    rŸ   r9   r9   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}|  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$messagerv  )rw  zMessage with 2 placeholdersz$$%${message}%$$z$%Message with 2 placeholders%$z	${random}z
${asctime}z	${asctimez$asctimer  )
r  r   r/   rJ   rs  rÎ   r¹  ræ   r  r6   )r7   r    rŸ   r9   r9   r:   Útest_dollarsÀ  s     zFormatterTest.test_dollarsc             C   s   |   ttjd d d¡ d S )NÚx)rÎ   rî   r   r/   )r7   r9   r9   r:   Útest_invalid_styleÓ  s    z FormatterTest.test_invalid_stylec          
   C   s   |   ¡ }t dddddddt¡}t | d ¡ ¡ ¡|_d|_t	 
d¡}tj|_|  | |¡d	¡ |  | |d
¡d¡ | |¡ |  |jd	¡ d S )NiÉ  r  é   é   r®  r   é{   z%(asctime)s %(message)sz1993-04-21 08:03:00,123z%Y:%dz1993:21)r  ÚdatetimeÚutcr  ÚmktimeÚ
astimezoneÚ	timetupleÚcreatedÚmsecsr   r/   ÚgmtimeÚ	converterrJ   Ú
formatTimers  r  )r7   r    r  rŸ   r9   r9   r:   Ú	test_timeÖ  s    

zFormatterTest.test_time)N)
r\   r]   r^   r;   r  r  r   r!  r#  r1  r9   r9   r9   r:   r  ‹  s   
r  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestBufferingFormatterc             C   s   dt |ƒ S )Nz[(%d))rK   )r7   Úrecordsr9   r9   r:   ÚformatHeaderå  s    z#TestBufferingFormatter.formatHeaderc             C   s   dt |ƒ S )Nz(%d)])rK   )r7   r3  r9   r9   r:   ÚformatFooterè  s    z#TestBufferingFormatter.formatFooterN)r\   r]   r^   r4  r5  r9   r9   r9   r:   r2  ä  s   r2  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   r3  )r7   r9   r9   r:   r;   ì  s    zBufferingFormatterTest.setUpc             C   s2   t  ¡ }|  d| g ¡¡ |  d| | j¡¡ d S )Nr   Zonetwo)r   ÚBufferingFormatterrJ   rs  r3  )r7   rŸ   r9   r9   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)])r2  rJ   rs  r3  r   r/   )r7   rŸ   Úlfr9   r9   r:   Útest_custom÷  s
    
z"BufferingFormatterTest.test_customN)r\   r]   r^   r;   r8  r:  r9   r9   r9   r:   r6  ë  s   r6  c               @   s   e Zd Zdd„ ZdS )ÚExceptionTestc             C   s¦   | j }tƒ }| |¡ ytdƒ‚W n   tjddd Y nX | |¡ | ¡  |jd }|  	|j
 d¡¡ |  	|j
 d¡¡ |  	|j d¡¡ |  	|j d	¡¡ d S )
Nzdeliberate mistakeÚfailedT)Ú
stack_infor   z#Traceback (most recent call last):
z!
RuntimeError: deliberate mistakezStack (most recent call last):
z,logging.exception('failed', stack_info=True))r%   ÚRecordingHandlerr5   r4  r   rÄ  r=   r<   r3  r6   Úexc_textrl  r–  r=  )r7   r    rC   r9   r9   r:   ré  ÿ  s    


zExceptionTest.test_formattingN)r\   r]   r^   ré  r9   r9   r9   r:   r;  þ  s   r;  c               @   s   e Zd Zdd„ ZdS )ÚLastResortTestc          	   C   s,  | j }| | j¡ tj}tj}zît ¡ :}| d¡ |  	| 
¡ d¡ | d¡ |  	| 
¡ d¡ W d Q R X d t_t ¡ $}| d¡ d}|  	| 
¡ |¡ W d Q R X t ¡  }| d¡ |  	| 
¡ d¡ W d Q R X d|j_dt_t ¡  }| d¡ |  	| 
¡ d¡ W d Q R X W d | | j¡ |t_|t_X 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=   r.   r   Ú
lastResortr;  r   r=  rx   rJ   rH   rv   r   ÚemittedNoHandlerWarningr5   )r7   rØ  Zold_lastresortZold_raise_exceptionsr?  rÖ   r9   r9   r:   Útest_last_resort  s4    








zLastResortTest.test_last_resortN)r\   r]   r^   rC  r9   r9   r9   r:   r@    s   r@  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFakeHandlerc          	   C   s(   x"dD ]}t | ||  |||¡ƒ qW d S )N)r  Úflushr<   r  )ÚsetattrÚrecord_call)r7   Ú
identifierÚcalledrö   r9   r9   r:   rJ  =  s    
zFakeHandler.__init__c                s   ‡ ‡‡fdd„}|S )Nc                  s   ˆ   d ˆˆ¡¡ d S )Nz{} - {})r˜  rs  r9   )rI  rH  Úmethod_namer9   r:   ÚinnerB  s    z&FakeHandler.record_call.<locals>.innerr9   )r7   rH  rJ  rI  rK  r9   )rI  rH  rJ  r:   rG  A  s    zFakeHandler.record_callN)r\   r]   r^   rJ  rG  r9   r9   r9   r:   rD  ;  s   rD  c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r>  c                s   t t| ƒj||Ž g | _d S )N)rd  r>  rJ  r3  )r7   r  r²  )re  r9   r:   rJ  I  s    zRecordingHandler.__init__c             C   s   | j  |¡ dS )z&Keep track of all the emitted records.N)r3  r˜  )r7   r˜   r9   r9   r:   rå   M  s    zRecordingHandler.handle)r\   r]   r^   rJ  rå   rh  r9   r9   )re  r:   r>  G  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 )Nr;  )rd  rL  r;   rI  r   r;  r…   rF  )r7   Zraise_exceptions)re  r9   r:   r;   V  s    zShutdownTest.setUpc                s   ‡ fdd„}|S )Nc                  s
   ˆ ƒ ‚d S )Nr9   r9   )ru   r9   r:   rK  ^  s    z'ShutdownTest.raise_error.<locals>.innerr9   )r7   ru   rK  r9   )ru   r:   Úraise_error]  s    zShutdownTest.raise_errorc             C   sv   t d| jƒ}t d| jƒ}t d| jƒ}ttjj|||gƒ}tjt|ƒd ddddd	d
ddddddg}|  || j¡ d S )Nr   rY   r•   )ÚhandlerListz2 - acquirez	2 - flushz	2 - closez2 - releasez1 - acquirez	1 - flushz	1 - closez1 - releasez0 - acquirez	0 - flushz	0 - closez0 - release)	rD  rI  rF  r   r?  r@  rf  r	  rJ   )r7   Zhandler0Zhandler1Zhandler2r3   rU   r9   r9   r:   Útest_no_failureb  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   )rN  z0 - releaserÕ   )
rD  rI  rF  rM  r   r?  r@  rf  r	  rJ   )r7   rö   ru   r   r3   r9   r9   r:   Ú_test_with_failure_in_methodr  s
    z)ShutdownTest._test_with_failure_in_methodc             C   s   |   dt¡ d S )Nr  )rP  rí   )r7   r9   r9   r:   Útest_with_ioerror_in_acquire{  s    z)ShutdownTest.test_with_ioerror_in_acquirec             C   s   |   dt¡ d S )NrE  )rP  rí   )r7   r9   r9   r:   Útest_with_ioerror_in_flush~  s    z'ShutdownTest.test_with_ioerror_in_flushc             C   s   |   dt¡ d S )Nr<   )rP  rí   )r7   r9   r9   r:   Útest_with_ioerror_in_close  s    z'ShutdownTest.test_with_ioerror_in_closec             C   s   |   dt¡ d S )Nr  )rP  rî   )r7   r9   r9   r:   Útest_with_valueerror_in_acquire„  s    z,ShutdownTest.test_with_valueerror_in_acquirec             C   s   |   dt¡ d S )NrE  )rP  rî   )r7   r9   r9   r:   Útest_with_valueerror_in_flush‡  s    z*ShutdownTest.test_with_valueerror_in_flushc             C   s   |   dt¡ d S )Nr<   )rP  rî   )r7   r9   r9   r:   Útest_with_valueerror_in_closeŠ  s    z*ShutdownTest.test_with_valueerror_in_closec             C   s   dt _|  dt¡ d S )NFr  )r   r;  rP  Ú
IndexError)r7   r9   r9   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 )NFrE  )r   r;  rP  rW  )r7   r9   r9   r:   Ú,test_with_other_error_in_flush_without_raise‘  s    z9ShutdownTest.test_with_other_error_in_flush_without_raisec             C   s   dt _|  dt¡ d S )NFr<   )r   r;  rP  rW  )r7   r9   r9   r:   Ú,test_with_other_error_in_close_without_raise•  s    z9ShutdownTest.test_with_other_error_in_close_without_raisec             C   s   dt _|  t| jdt¡ d S )NTr  )r   r;  rÎ   rW  rP  )r7   r9   r9   r:   Ú+test_with_other_error_in_acquire_with_raise™  s    
z8ShutdownTest.test_with_other_error_in_acquire_with_raisec             C   s   dt _|  t| jdt¡ d S )NTrE  )r   r;  rÎ   rW  rP  )r7   r9   r9   r:   Ú)test_with_other_error_in_flush_with_raisež  s    
z6ShutdownTest.test_with_other_error_in_flush_with_raisec             C   s   dt _|  t| jdt¡ d S )NTr<   )r   r;  rÎ   rW  rP  )r7   r9   r9   r:   Ú)test_with_other_error_in_close_with_raise£  s    
z6ShutdownTest.test_with_other_error_in_close_with_raise)r\   r]   r^   r_   r;   rM  rO  rP  rQ  rR  rS  rT  rU  rV  rX  rY  rZ  r[  r\  r]  rh  r9   r9   )re  r:   rL  R  s"   	rL  c               @   sh   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ej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jjt j¡ d S )Nr   éS   )r   rØ  r   r@   rJ   r…   rd   )r7   Úold_disabler9   r9   r:   Útest_disable­  s    

z ModuleLevelMiscTest.test_disableNc                sÀ   g ‰ t  | td‡ fdd„¡ tƒ }tj |¡ tt|ƒ}|d k	rN||d|ƒ n
|d|ƒ |  t|j	ƒd¡ |j	d }|  | 
¡ d| ¡ |d k	r”|ntt| ¡ ƒ}|  |j|¡ |  ˆ g ¡ d S )NÚbasicConfigc                 s   ˆ   | |f¡S )N)r˜  )rù   Úkw)rI  r9   r:   Ú<lambda>¾  ó    z/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rrY   r   )r   r÷  r   r>  rØ  r5   r!   rJ   rK   r3  Ú
getMessageÚupperr¶   )r7   rö   ro  Ú	recordingÚ
log_methodr˜   Zexpected_levelr9   )rI  r:   Ú	_test_log»  s    



zModuleLevelMiscTest._test_logc             C   s   |   dtj¡ d S )Nrt   )rj  r   rf   )r7   r9   r9   r:   Útest_logÓ  s    zModuleLevelMiscTest.test_logc             C   s   |   d¡ d S )Nrx   )rj  )r7   r9   r9   r:   Ú
test_debugÖ  s    zModuleLevelMiscTest.test_debugc             C   s   |   d¡ d S )Nrw   )rj  )r7   r9   r9   r:   Ú	test_infoÙ  s    zModuleLevelMiscTest.test_infoc             C   s   |   d¡ d S )Nrv   )rj  )r7   r9   r9   r:   Útest_warningÜ  s    z ModuleLevelMiscTest.test_warningc             C   s   |   d¡ d S )Nru   )rj  )r7   r9   r9   r:   Ú
test_errorß  s    zModuleLevelMiscTest.test_errorc             C   s   |   d¡ d S )NrÍ  )rj  )r7   r9   r9   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>.MyLoggerN)r\   r]   r^   r9   r9   r9   r:   rÁ  è  s   rÁ  )rÎ   rÄ  r   rÅ  rÈ  rÂ  rJ   ÚgetLoggerClass)r7   rÁ  r9   r9   r:   Útest_set_logger_classå  s    
z)ModuleLevelMiscTest.test_set_logger_classc             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()z-czexception in __del__zValueError: some error)r   r7  r>  )r7   ÚcodeÚrcÚoutÚerrr9   r9   r:   Útest_logging_at_shutdownñ  s
    z,ModuleLevelMiscTest.test_logging_at_shutdown)N)r\   r]   r^   r_   ra  rj  rk  rl  rm  rn  ro  rp  rr  r   Úrequires_type_collectingrw  r9   r9   r9   r:   r^  ©  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¡  r6   rl  r–  )r7   r    rW   r9   r9   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 )NÚlessÚmorezless is %(less)sr   zless is more)r>  r   r   r5   rv   r<  r3  r  rJ   rT  r=   r<   )r7   rC   r    r:  r9   r9   r:   Útest_dict_arg  s    

zLogRecordTest.test_dict_argc             C   s\   t  i ¡}|  |jd¡ y*dd l}t  i ¡}|  |j| ¡ j¡ W n tk
rV   Y nX d S )NÚMainProcessr   )r   r   rJ   ÚprocessNamer  Úcurrent_processr8   r0  )r7   r    Úmpr9   r9   r:   Útest_multiprocessing  s    

z"LogRecordTest.test_multiprocessingc             C   s²   t  i ¡}| j}||jƒ ||jƒ ||jƒ ||jƒ t j}t j}t j	}zNdt _dt _dt _	t  i ¡}| j
}||jƒ ||jƒ ||jƒ ||jƒ W d |t _|t _|t _	X d S )NF)r   r   ÚassertIsNotNoneÚthreadÚ
threadNameÚprocessr€  Ú
logThreadsÚlogProcessesÚlogMultiprocessingrB  )r7   r    ZNOT_NONEZlog_threadsZlog_processesZlog_multiprocessingÚNONEr9   r9   r:   Útest_optional!  s,    








zLogRecordTest.test_optionalN)r\   r]   r^   r{  r~  rƒ  rŒ  r9   r9   r9   r:   ry    s   
ry  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!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Z‡  ZS )0Ú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 )N)rd  r  r;   r   rØ  r3   r   r   r   r   r   ro  r'   r…   rÓ  )r7   )re  r9   r:   r;   >  s    

zBasicConfigTest.setUpc                s@   x,t jjd d … D ]}t j |¡ | ¡  qW tt| ƒ ¡  d S )N)r   rØ  r3   r=   r<   rd  r  rD   )r7   rC   )re  r9   r:   rD   G  s    zBasicConfigTest.tearDownc             C   sF   t tjd| jƒ tj ¡  tj | j¡ | jtj	d d …< | j
tj_d S )Nr3   )rF  r   rØ  r3   r   r>   r?   r   r   r   r'   ro  )r7   r9   r9   r:   rÓ  M  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   rb  rJ   rK   rØ  r3   re  r-   r*   rÜ   r?  rn  r«  Ú_fmtÚBASIC_FORMATrB  rà  ÚPercentStylero  r'   )r7   r   rn  r9   r9   r:   Útest_no_kwargsT  s    zBasicConfigTest.test_no_kwargsc          	   C   sR   t  ¡ @}tjtjdd t d¡ tj d¡ |  | 	¡  
¡ d¡ W d Q R X d S )Nr  )r*   rw  zLog an errorr   zERROR:root:Log an error)r   rµ  r   rb  rÜ   rÅ  ru   rÆ  rJ   rH   rå  )r7   r·  r9   r9   r:   Útest_strformatstyleh  s    

z#BasicConfigTest.test_strformatstylec          	   C   sR   t  ¡ @}tjtjdd t d¡ tj d¡ |  | 	¡  
¡ d¡ W d Q R X d S )Nrv  )r*   rw  zLog an errorr   zERROR:root:Log an error)r   rµ  r   rb  rÜ   rÅ  ru   rÆ  rJ   rH   rå  )r7   r·  r9   r9   r:   Útest_stringtemplatestylep  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 )N)r<   rà   rÑ  )rÒ  Úh2rô   r9   r9   r:   rÓ  z  s    z.BasicConfigTest.test_filename.<locals>.cleanupztest.log)r–  rY   r   rù   )r   rb  rJ   rK   rØ  r3   re  rü   r*   Úmoder8   r…   )r7   rÓ  r   rU   r9   r9   r:   Útest_filenamex  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 )N)r<   rà   rÑ  )rÒ  r”  rô   r9   r9   r:   rÓ  Œ  s    z.BasicConfigTest.test_filemode.<locals>.cleanupztest.logÚwb)r–  Úfilemoder   )	r   rb  rØ  r3   rü   rJ   r*   r•  r…   )r7   rÓ  r   rU   r9   r9   r:   Útest_filemodeŠ  s    zBasicConfigTest.test_filemodec             C   s`   t  ¡ }|  |j¡ tj|d |  ttjj	ƒd¡ tjj	d }|  
|tj¡ |  |j|¡ d S )N)r*   rY   r   )r(   r)   r…   r<   r   rb  rJ   rK   rØ  r3   re  r-   r*   )r7   r*   r   r9   r9   r:   Útest_stream˜  s    zBasicConfigTest.test_streamc             C   s.   t jdd t jjd j}|  |jjd¡ d S )Nr)  )rs  r   )r   rb  rØ  r3   rn  rJ   r«  rŽ  )r7   rn  r9   r9   r:   Útest_format¢  s    zBasicConfigTest.test_formatc             C   s,   t jdd t jjd j}|  |jd¡ d S )Nr*  )rà  r   )r   rb  rØ  r3   rn  rJ   rà  )r7   rn  r9   r9   r:   Útest_datefmt¨  s    zBasicConfigTest.test_datefmtc             C   s.   t jdd t jjd j}|  |jt j¡ d S )Nrv  )rw  r   )r   rb  rØ  r3   rn  re  r«  r¬  )r7   rn  r9   r9   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   )ro  é:   )r   rØ  ro  r…   r+   rb  rJ   )r7   Ú	old_levelr9   r9   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 )Nztest.log)r–  r*   )r–  r3   )r*   r3   )Zloglevelrù   )r–  r˜  )rÎ   r   r-   rÜ   r?  rî   rb  rl   )r7   rÎ   r3   r*   r9   r9   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•   )r3   r   rY   )r   r-   rÜ   rÅ  r/   r1   rb  r<  rØ  r3   r„  rn  )r7   r3   rŸ   r9   r9   r:   Útest_handlersÍ  s    

zBasicConfigTest.test_handlersNc                sf   g ‰ t j‰‡ ‡‡fdd„}t ˆt d|¡ tt |ƒ}|d k	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Ø  ro  r+   r…   r˜  )rù   rc  r   )rI  Úold_basic_configr7   r9   r:   Úmy_basic_configã  s
    z2BasicConfigTest._test_log.<locals>.my_basic_configrb  ztest mer9   )r   rb  r   r÷  r!   rJ   )r7   rö   ro  r¦  ri  r9   )rI  r¥  r7   r:   rj  Þ  s    
zBasicConfigTest._test_logc             C   s   |   dtj¡ d S )Nrt   )rj  r   rj   )r7   r9   r9   r:   rk  õ  s    zBasicConfigTest.test_logc             C   s   |   d¡ d S )Nrx   )rj  )r7   r9   r9   r:   rl  ø  s    zBasicConfigTest.test_debugc             C   s   |   d¡ d S )Nrw   )rj  )r7   r9   r9   r:   rm  û  s    zBasicConfigTest.test_infoc             C   s   |   d¡ d S )Nrv   )rj  )r7   r9   r9   r:   rn  þ  s    zBasicConfigTest.test_warningc             C   s   |   d¡ d S )Nru   )rj  )r7   r9   r9   r:   ro    s    zBasicConfigTest.test_errorc             C   s   |   d¡ d S )NrÍ  )rj  )r7   r9   r9   r:   rp    s    zBasicConfigTest.test_critical)N)r\   r]   r^   r_   r;   rD   rÓ  r‘  r’  r“  r–  r™  rš  r›  rœ  r  r¡  r¢  r£  rj  rk  rl  rm  rn  ro  rp  rh  r9   r9   )re  r:   r  :  s.   	


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 )N)r   r   r9   )Úold_handler_listr9   r:   rÓ    s    z(LoggerAdapterTest.setUp.<locals>.cleanup)rÁ   r¾  )rd  r§  r;   r   r   r>  rh  rØ  rÁ   r5   r…   r=   r<   rf  rs   Úadapter)r7   rÓ  )re  )r¨  r:   r;   	  s    
zLoggerAdapterTest.setUpc          
   C   s¸   d}d }ydd  W n6 t k
rJ } z|}| j || j¡ W d d }~X Y nX |  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   )rò  r©  rÄ  rh  rJ   rK   r3  r¶   r   rf   rÖ   r  r½  re  Ú__traceback__)r7   rÖ   rô  rz  r˜   r9   r9   r:   Útest_exception  s    "z LoggerAdapterTest.test_exceptionc          
   C   s€   ydd  W n& t k
r2 } z|}W d d }~X Y nX | jjd|d |  t| jjƒd¡ | jjd }|  |j|j||j	f¡ d S )NrY   r   zexc_info test)r½  )
rò  r©  rÄ  rJ   rK   rh  r3  r½  re  rª  )r7   rz  rô  r˜   r9   r9   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Í  rh  rJ   rK   r3  r¶   r   rd   rÖ   r  )r7   rÖ   r˜   r9   r9   r:   rp  8  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é!   r@   é    )r©  rÁ   r   r@   r…   rF  ræ   ÚisEnabledFor)r7   r`  r9   r9   r:   Útest_is_enabled_forB  s
    z%LoggerAdapterTest.test_is_enabled_forc             C   sR   |   | j ¡ ¡ x| jjD ]}| j |¡ qW |  | j ¡ ¡ |  | j ¡ ¡ d S )N)r6   r©  r2   rÁ   r3   r=   ræ   )r7   r   r9   r9   r:   Útest_has_handlersI  s
    z#LoggerAdapterTest.test_has_handlersc             C   sL  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ƒ }z6||_|  |j|¡ |  |j|¡ |  | jj|¡ W d ||_X |  |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 )Nú )rš   )r7   rÖ   r²  r9   r9   r:   r‡  V  s    z6LoggerAdapterTest.test_nested.<locals>.Adapter.processN)r\   r]   r^   rš   r‡  r9   r9   r9   r:   r²  S  s   r²  zAdapters can be nested, yo.)rÁ   r¾  ZAdapterAdapterrY   r   zAdapter AdapterAdapter )r   rs   rÁ   rš   rJ   r>  rt   rd   rh  rK   r3  r¶   rÖ   r  r   r<  rÈ  )r7   r²  rÖ   r©  Zadapter_adapterr˜   Zorig_managerZtemp_managerr9   r9   r:   Útest_nestedR  s2    zLoggerAdapterTest.test_nested)r\   r]   r^   r;   r«  r¬  rp  r°  r±  r´  rh  r9   r9   )re  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‡  ZS )Ú
LoggerTestc                sb   t t| ƒ ¡  tƒ | _tjdd| _| j | j¡ |  	| jj
| j¡ |  	| jj¡ |  	tj¡ d S )NÚblah)r8   )rd  rµ  r;   r>  rh  r   rÂ  rÁ   r5   r…   r=   r<   rf  )r7   )re  r9   r:   r;   v  s    zLoggerTest.setUpc             C   s   |   t| jjtƒ ¡ d S )N)rÎ   rÄ  rÁ   r+   rÈ  )r7   r9   r9   r:   Útest_set_invalid_level  s    z!LoggerTest.test_set_invalid_levelc          
   C   s¸   d}d }ydd  W n6 t k
rJ } z|}| j || j¡ W d d }~X Y nX |  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   )rò  rÁ   rÄ  rh  rJ   rK   r3  r¶   r   rf   rÖ   r  r½  re  rª  )r7   rÖ   rô  rz  r˜   r9   r9   r:   r«  ‚  s    "zLoggerTest.test_exceptionc          	   C   s2   t  tdd¡ |  t| jjdd¡ W d Q R X d S )Nr;  Trq   ztest message)r   Ú	swap_attrr   rÎ   rÄ  rÁ   rt   )r7   r9   r9   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 Q R X d S )Nr;  Frq   ztest message)r   r¸  r   rÁ   rt   )r7   r9   r9   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 )N)r˜  rH   )rŸ   r³  )rI  r9   r:   rd  ž  re  z=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>T)r=  rY   zStack (most recent call last):
r   )r   r÷  r   Ú	tracebackrÁ   Ú
findCallerrJ   rK   )r7   r9   )rI  r:   Ú test_find_caller_with_stack_info›  s    z+LoggerTest.test_find_caller_with_stack_infoc             C   sŠ   d}d}d  } } } } } }}	t  |||||||||	¡	}
xFdt|
j ¡ ƒ D ]0}|di}| jt| jj|||||||||	d qRW d S )Nz	my recordé   )rT  r  z
some value)r¾  Úsinfo)	r   Ú_logRecordFactoryrO   Ú__dict__ÚkeysrÎ   r¹  rÁ   Ú
makeRecord)r7   r8   ro  rô   ÚlnorÖ   r  r½  r  rÀ  ÚrvrA  r¾  r9   r9   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 )Nz	my recordr¿  Z	valid_keyz
some value)r¾  rÀ  )rÁ   rÄ  r>  rÂ  )r7   r8   ro  rô   rÅ  rÖ   r  r½  r  rÀ  r¾  r  r9   r9   r:   Ú(test_make_record_with_extra_no_overwrite²  s    z3LoggerTest.test_make_record_with_extra_no_overwritec             C   sB   |   | j ¡ ¡ x| jjD ]}| j |¡ qW |  | j ¡ ¡ d S )N)r6   rÁ   r2   r3   r=   ræ   )r7   r   r9   r9   r:   r±  »  s    zLoggerTest.test_has_handlersc             C   s"   t  d¡}d|_|  | ¡ ¡ d S )Nz
blah.childF)r   r   rž  ræ   r2   )r7   Zchild_loggerr9   r9   r:   Útest_has_handlers_no_propagateÂ  s    
z)LoggerTest.test_has_handlers_no_propagatec             C   s>   | j jj}d| j j_|  t| j jd|¡ |  | j  d¡¡ d S )Né   r@   é   )rÁ   r   r@   r…   rF  ræ   r¯  )r7   r`  r9   r9   r:   r°  Ç  s    

zLoggerTest.test_is_enabled_forc             C   s    t  ¡ }|  |t j¡ |  |t  d ¡¡ |  |t  d¡¡ |  |t  d¡j¡ |  |t  d¡j¡ |  |t  d¡j¡ |  |t  d¡¡ |  |t  d¡j¡ d S )Nr   r)  zfoo.barú )r   r   r<  rØ  ÚparentÚassertIsNot)r7   rØ  r9   r9   r:   Útest_root_logger_aliasesÍ  s    z#LoggerTest.test_root_logger_aliasesc             C   s$   |   ttjt¡ |   ttjd¡ d S )Ns   foo)rÎ   rÄ  r   r   Úany)r7   r9   r9   r:   Útest_invalid_namesÙ  s    zLoggerTest.test_invalid_namesc             C   sV   xPt tjd ƒD ]>}x8dD ]0}t |¡}t ||¡}t |¡}|  ||¡ qW qW d S )NrY   )r   rØ  r)  zfoo.barzbaz.bar)r  rü  ÚHIGHEST_PROTOCOLr   r   r£  rý  r<  )r7   Úprotor8   rÁ   rW   Z	unpickledr9   r9   r:   Útest_picklingÝ  s    


zLoggerTest.test_picklingc             C   s6  | j }t d¡}t d¡}| tj¡ |  | ¡ tj¡ |  |ji ¡ |  | 	tj¡¡ |  
| 	tj¡¡ |  |jtjdtjdi¡ |  |ji ¡ |  | 	tj¡¡ |  |ji ¡ |  | 	tj¡¡ |  |jtjdi¡ | tj¡ |  | ¡ tj¡ |  |ji ¡ |  
| 	tj¡¡ | tj¡ |  | ¡ tj¡ |  |ji ¡ |  |ji ¡ |  |ji ¡ |  
| 	tj¡¡ |  | 	tj¡¡ |  
| 	tj¡¡ |  | 	tj¡¡ |  | 	tj¡¡ t ¡  |  | ¡ tj¡ |  |ji ¡ |  |ji ¡ |  |ji ¡ |  
| 	tj¡¡ |  
| 	tj¡¡ |  
| 	tj¡¡ d S )NrÍ  zabc.defTF)r%   r   r   r+   rf   rJ   r&   Ú_cacher6   r¯  ræ   r,   rd   r‰   r@   )r7   rØ  r#   r$   r9   r9   r:   Útest_cachingå  sH    

zLoggerTest.test_caching)r\   r]   r^   r;   r·  r«  r¹  rº  r¾  rÇ  rÈ  r±  rÉ  r°  rÏ  rÑ  rÔ  rÖ  rh  r9   r9   )re  r:   rµ  t  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 )Nz.logztest_logging-2-)r   r;   rÞ   rß   rô   rà   r<   Úrmfiles)r7   ró   r9   r9   r:   r;   !  s    

zBaseFileTest.setUpc             C   sB   x| j D ]}t |¡ qW tj | j¡r4t | j¡ t | ¡ d S )N)rØ  rà   rá   rç   rè   rô   r   rD   )r7   rô   r9   r9   r:   rD   '  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)r6   rà   rç   rè   rØ  r˜  )r7   r–  r9   r9   r:   ÚassertLogFile.  s    zBaseFileTest.assertLogFileN)r\   r]   r^   r_   r;   rD   rÙ  r9   r9   r9   r:   r×    s   r×  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 )NT)rÔ   )rà   rá   rô   r   rü   rB  r*   ræ   rç   rè   rå   r   r„  r6   r<   )r7   Úfhr9   r9   r:   Ú
test_delay6  s    zFileHandlerTest.test_delayN)r\   r]   r^   rÜ  r9   r9   r9   r:   rÚ  5  s   rÚ  c               @   sB   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zej	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[   )r7   r9   r9   r:   Únext_recA  s    z RotatingFileHandlerTest.next_recc             C   s.   t jj| jdd}|  | d ¡¡ | ¡  d S )Nr   )ÚmaxBytes)r   r3   rý   rô   ræ   ÚshouldRolloverr<   )r7   Úrhr9   r9   r:   Útest_should_not_rolloverE  s    z0RotatingFileHandlerTest.test_should_not_rolloverc             C   s2   t jj| jdd}|  | |  ¡ ¡¡ | ¡  d S )NrY   )rß  )r   r3   rý   rô   r6   rà  rÞ  r<   )r7   rá  r9   r9   r:   Útest_should_rolloverK  s    z,RotatingFileHandlerTest.test_should_rolloverc             C   s4   t j | j¡}| |  ¡ ¡ |  | j¡ | ¡  d S )N)r   r3   rý   rô   rÐ   rÞ  rÙ  r<   )r7   rá  r9   r9   r:   Útest_file_createdP  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 )Nz.testr9   )r8   r9   r9   r:   ÚnamerY  s    z>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namerr•   rY   )ÚbackupCountrß  z.1z.2z.3)r   r3   rý   rô   rå  rÐ   rÞ  rÙ  ræ   rà   rç   rè   r<   )r7   rå  rá  r9   r9   r:   Útest_rollover_filenamesX  s    z/RotatingFileHandlerTest.test_rollover_filenamesc          	   C   s¨  dd„ }dd„ }t jj| jddd}||_||_|  ¡ }| |¡ |  | j¡ |  ¡ }| |¡ || jd ƒ}|  |¡ t	j
}t|d	ƒ0}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d Q R X | |  ¡ ¡ || jd ƒ}|  |¡ t|d	ƒ0}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d Q R X | |  ¡ ¡ || jd ƒ}t|d	ƒ0}| ¡ }	t |	¡}
|  |
 d
¡|j| ¡ W d Q R X |  t	j || jd ƒ¡¡ | ¡  d S )Nc             S   s   | d S )Nz.gzr9   )r8   r9   r9   r:   rå  i  s    z3RotatingFileHandlerTest.test_rotator.<locals>.namerc          
   S   sX   t | dƒ:}| ¡ }t |d¡}t |dƒ}| |¡ W d Q R X W d Q R X t | ¡ d S )NÚrbr   r—  )rK  rQ   ÚzlibÚcompressr6  rà   rÑ  )ÚsourceÚdestÚsfr5  Ú
compressedÚdfr9   r9   r:   Úrotatorl  s    z5RotatingFileHandlerTest.test_rotator.<locals>.rotatorr•   rY   )ræ  rß  z.1rè  rß  z.2z.3)r   r3   rý   rô   rð  rå  rÞ  rÐ   rÙ  rà   ÚlineseprK  rQ   ré  Ú
decompressrJ   r7  rÖ   ræ   rç   rè   r<   )r7   rå  rð  rá  Úm1Úm2rô   ÚnewlinerŸ   rî  r5  r9   r9   r:   Útest_rotatorg  sB    



"

"
"z$RotatingFileHandlerTest.test_rotatorN)r\   r]   r^   rÞ  râ  rã  rä  rç  r   Úrequires_zlibrö  r9   r9   r9   r:   rÝ  @  s   rÝ  c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTimedRotatingFileHandlerTestc          
      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
}xNt|ƒD ]B}|tj|d }	| j|	 d¡ ‰ tj ˆ ¡}|r’| j ˆ ¡ P q’W d| }
|s†tj | j¡\}‰ ‡ fdd„t |¡D ƒ}td| d¡ tjd td| tjd xJ|D ]B}td| ƒ tj ||¡}t|dƒ}t| ¡ ƒ W d Q R X q@W | j||
d d S )NÚSrY   )ræ  z%(asctime)s %(message)srÖ   ztesting - initialgš™™™™™ñ?ztesting - after delayFi,  )Úsecondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondsc                s   g | ]}|  ˆ ¡r|‘qS r9   )rl  )r¢  rŸ   )rô   r9   r:   r¤  ¶  s    z>TimedRotatingFileHandlerTest.test_rollover.<locals>.<listcomp>zTest time: %sz%Y-%m-%d %H-%M-%S)r³  zThe only matching files are: %szContents of %s:r    )rÖ   )r   r3   rþ   rô   r/   r1   r   rÐ   rÙ  r  r	  r<   r'  r	  r  Ú	timedeltaÚstrftimerà   rç   rè   rØ  r˜  r–   Úlistdirr  rÜ   r?  r—   rK  rQ   r6   )r7   rÛ  ÚfmtZr1Zr2Úfoundr	  ÚGO_BACKÚsecsÚprevrÖ   ÚdnÚfilesrŸ   rç   Útfr9   )rô   r:   Útest_rollover–  sB    






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ÚXT)rÔ   ÚWZW7)rÎ   rî   r   r3   rþ   rô   )r7   rÎ   r9   r9   r:   Útest_invalidÀ  s    


z)TimedRotatingFileHandlerTest.test_invalidc             C   sx   d}t  ddd¡}tjj| jdddd|d}z<| |¡}|  ||d ¡ | |d ¡}|  ||d	 ¡ W d | ¡  X d S )
Nr   é   ÚMIDNIGHTrY   T)ÚwhenÚintervalræ  r(  ÚatTimeiÀ¨  iÐ¶  i@ú )	r'  r  r   r3   rþ   rô   ÚcomputeRolloverrJ   r<   )r7   ÚcurrentTimer  rá  rT   r9   r9   r:   Ú"test_compute_rollover_daily_attimeÉ  s    
z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec       	   	   C   s6  t t ¡ ƒ}||d  }t ddd¡}t |¡j}xþtdƒD ]ò}tjj| j	d| ddd|d}zÄ||krvd| | }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 d | ¡  X q<W d S )Ni€Q r
  r   r"  zW%drY   T)r  r  ræ  r(  r  iÀ¨  zfailed in timezone: %dzlocal vars: %si€:	 iÐ¶  )r  r  r'  r.  Útm_wdayr  r   r3   rþ   rô   r  r  ÚtimezoneÚlocalsrJ   r<   )	r7   r  Útodayr  ZwdayÚdayrá  rU   rT   r9   r9   r:   Ú#test_compute_rollover_weekly_attimeÙ  s8    

z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimeN)r\   r]   r^   r  r	  r  r  r9   r9   r9   r:   rø  ”  s   *	rø  c              K   s   t jf | Žt jdd S )NrY   )rú  )r'  rû  )rc  r9   r9   r:   r    s    r  )rù  rY   )ÚMé<   )ÚHi  )ÚDi€Q )r  i€Q ZW0r  é   )ÚdaysÚhoursc             C   sR  t jj| j|dddd}d}| |¡}||kr:|dkr:yÎ|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 n0 tk
r8   t
dt ¡ d  tjd Y nX |  ||¡ | ¡  d S )NrY   r   T)r  r  ræ  r(  g        r  r®  r  rx  r  z
t: %s (%s))r³  zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz
result: %sz exception in diagnostic code: %s)r   r3   rþ   rô   r  r(  r  r.  Ú	localtimeÚ	_MIDNIGHTr  rÜ   r?  r  r½  rJ   r<   )r7   r  Úexprá  r  rT   rY  ÚcurrentHourÚcurrentMinuteÚcurrentSecondr    r  r9   r9   r:   Útest_compute_rollover  s6    



 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  |¡}ytj d¡}W n: tjk
rd } z|jdkrRt	 
d¡‚‚ W d d }~X Y nX t ddi¡}| |¡ | ¡  |  |t  |¡¡ t jt jB }d}d}	t  |||	¡}
x4|
D ],}|jdkrÐqÀt ||¡}|d	kræqÀd
}P qÀW d|	 }| j||d d S )NÚApplicationZtest_loggingrx  z#Insufficient privileges to run testrÖ   zTest Log MessageFr¤  zTest Log Message
Tz3Record not found in event log, went back %d records)rÖ   )Úwin32evtlogZOpenEventLogZGetNumberOfEventLogRecordsr   r3   ÚNTEventLogHandlerÚ
pywintypesru   Úwinerrorr0  ÚSkipTestr   rå   r<   Ú
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceNameÚwin32evtlogutilZSafeFormatMessager6   )r7   ÚlogtypeZelhZnum_recsrC   rz  r    Úflagsrÿ  r   ÚeventsrÖ   r9   r9   r:   r—  3  s8    





z NTEventLogHandlerTest.test_basicN)r\   r]   r^   r—  r9   r9   r9   r:   r&  1  s   r&  c               @   s   e Zd Zdd„ ZdS )ÚMiscTestCasec             C   s2   ddddddddd	d
dddh}t j| t|d d S )Nrˆ  rŠ  r‰  Úcurrentframer  ÚStrFormatStyler¬  ÚFiltererÚPlaceHolderrÃ  Ú
RootLoggerrØ  r  )Ú	blacklist)r   Úcheck__all__r   )r7   r8  r9   r9   r:   Útest__all__V  s    zMiscTestCase.test__all__N)r\   r]   r^   r:  r9   r9   r9   r:   r2  U  s   r2  ÚLC_ALLr   c           '   C   sv   t ttttttttt	t
tttttttttttttttttttttt t!t"t#t$t%t&g'} t't(j)dƒrh|  *t+¡ t,j-| Ž  d S )Nrê  ).r`   rŠ   r»   rË   r™  r¬  rë  r  r;  rH  rW  rk  r¼  r  r6  r:  rØ  rÌ  rÞ  rL  r^  r  r§  rµ  rŒ  rÚ  rÝ  r@  ry  r;  r  r  r  r&  rø  r  r  r  r2  r2  r   r3   r˜  rø  r   Úrun_unittest)Útestsr9   r9   r:   Ú	test_mainb  s    
r>  Ú__main__)N)™r_   r   Úlogging.handlersZlogging.configrQ  r¹  r'  rú   rü  r(   rC  r¢  rà   rß  r
  rE   r*  rK  rú  rÜ   rÞ   Útest.support.script_helperr   rI  r   r­  r  r  r0  r\  r?  rZ  Úhttp.serverr   r   rH  Úurllib.parser   r   Úsocketserverr   r	   r
   r   r(  r.  r*  r0  ré  ÚTestCaser   r`   rŠ   ZSILENTrº   ZTERSEZEFFUSIVEr¹   rÃ   Z	TALKATIVEr·   Z
CHATTERBOXZBORINGr  rÀ   r¼   rŒ   rµ   r¸   r»   rË   rÈ  r3  r-   r7  r:  rI  rE  rb  ri  r|  r‚  r2  r‰  r‹  rŒ  r™  r/   r©  r¬  rë  r  rö  r  r  r  r  r  ÚIPV6_ENABLEDr  r  r;  rH  rW  rh  ri  rj  rk  r¼  rÌ  ræ  r×  rØ  rÞ  r3   r  Zunittest.mockr÷  rø  rû  r  Útzinfor  r(  r  r7  r2  r6  r;  r@  rD  rf  r>  rL  r^  ry  r  r§  rµ  r×  rÚ  rÝ  rø  r  r  r!  r%  rF  r&  r2  Úrun_with_localer>  r\   r9   r9   r9   r:   Ú<module>   sH  m FY G(J5)/ N   JY@CM41(
        ,#\V
	Y'W\5 Ol +Tn!#
