Your IP : 216.73.216.213


Current Path : /opt/alt/python34/lib64/python3.4/test/__pycache__/
Upload File :
Current File : //opt/alt/python34/lib64/python3.4/test/__pycache__/test_logging.cpython-34.pyc

�
f fr5�#@ss
dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlmZddlmZmZmZmZmZmZmZmZmZddl Z ddl!Z!ddl"Z"ddl#Z#ddl$Z$y�ddl%Z%ddl&Z&ddl'Z'ddl(Z(ddl)m*Z*m+Z+ddl,Z,ddl-m.Z.m/Z/ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6Wne7k
r*dZ%YnXy(ddl8Z8ddl9Z9ddl:Z:Wn e7k
rudZ8Z9Z:YnXyddl;Z;Wne7k
r�YnXGdd	�d	e"j<�Z=Gd
d�de=�Z>Gdd
�d
e=�Z?dZ@dZAdZBdZCdZDdZEdZFdZGdZHdZIeJeIe@d�ZKi
de@6deA6deB6deC6deD6deE6deF6d eG6d!eH6d"eI6ZLGd#d$�d$ejM�ZNGd%d&�d&ejM�ZOGd'd(�d(e=�ZPGd)d*�d*e=�ZQGd+d,�d,eR�ZSGd-d.�d.ejT�ZUGd/d0�d0e=�ZVe%r�Gd1d2�d2e,jW�ZXGd3d4�d4eR�ZYGd5d6�d6eYe*�ZZGd7d8�d8eYe3�Z[Gd9d:�d:eYe1�Z\e]ed;�r�Gd<d=�d=e[�Z^Gd>d?�d?e\�Z_nne"j`e%d@�GdAdB�dBe=��ZaGdCdD�dDe=�ZbGdEdF�dFejc�ZdGdGdH�dHe=�Zee"j`e%d@�GdIdJ�dJe=��ZfdKdL�Zge"j`e]ed;�dM�e"j`e%d@�GdNdO�dOef���Zhe"j`e%d@�GdPdQ�dQe=��Zie"j`e]ed;�dM�e"j`e%d@�GdRdS�dSei���Zje"j`e%d@�GdTdU�dUe=��Zke"j`e]ed;�dM�e"j`e%d@�GdVdW�dWek���Zle"j`e%d@�GdXdY�dYe=��ZmGdZd[�d[e=�ZnGd\d]�d]e=�ZoGd^d_�d_e=�Zpdd`da�Zqdbdc�ZrGddde�deejT�ZsGdfdg�dge=�ZtGdhdi�die=�ZuGdjdk�dke=�ZvGdldm�dmejw�ZxGdndo�doe=�ZyGdpdq�dqe=�Zzej{d�Z|Gdrds�dsej}�Z~e~�ZGdtdu�due"j<�Z�Gdvdw�dwej��Z�Gdxdy�dye"j<�Z�Gdzd{�d{e=�Z�Gd|d}�d}e=�Z�Gd~d�d�Z�Gd�d��d�ej��Z�Gd�d��d�e=�Z�Gd�d��d�e=�Z�Gd�d��d�e=�Z�Gd�d��d�e"j<�Z�Gd�d��d�e"j<�Z�Gd�d��d�e=�Z�Gd�d��d�e=�Z�Gd�d��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�d�d��Z�x�d�dfd�d�fd�d�d�fd�d�d�d�fd�d�d�d�fd�e�d�d�d�d��ffD]2\Z�Z�e�e�d�d��Z�e�e�d�e�e��q�	We"j`e8d��Gd�d��d�e=��Z�ed�d��d�d���Z�e�d�kro
e��ndS)�zoTest harness for the logging module. Run all tests.

Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved.
�N)�assert_python_ok)	�captured_stdout�run_with_locale�run_unittest�patch�
requires_zlib�TestHandler�Matcher�HOST�	swap_attr)�
HTTPServer�BaseHTTPRequestHandler)�urlparse�parse_qs)�ThreadingUDPServer�DatagramRequestHandler�ThreadingTCPServer�StreamRequestHandler�ThreadingUnixStreamServer�ThreadingUnixDatagramServerc@s^eZdZdZdZdZdZdd�Zdd�Zd	d	d
d�Z	dd
�Z
d	S)�BaseTestzBase class for logging tests.z&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$rcCstj�jj}tj�z�tjj�|_tjdd�|_	|j�|_
}tjj�|_tj
j�|_i|_}x(|D] }t||dd�||<q�WWdtj�Xtjd�|_tjd�|_tjd�|_|jj�|_tj�|_|jjtj�tj|j�|_tj|j�|_ |jj!|j �|jj"�r�|jj#|jj#}t$d|��n|jj"�r�|jj#|jj#}t$d|��n|jj%|j�|j&|jj"��|j&|jj"��dS)zxSetup the default logging stream to an internal StringIO instance,
        so that we can examine log output as we want.N�disabledu«×»uĿÖG�zUnexpected handlers: %s)'�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�_releaseLockZlogger1Zlogger2�root_loggerZgetEffectiveLevel�original_logging_level�io�StringIO�stream�setLevel�DEBUG�
StreamHandler�	root_hdlr�	Formatter�
log_formatZroot_formatter�setFormatter�hasHandlers�handlers�AssertionError�
addHandler�
assertTrue)�selfZlogger_dictr#r(�nameZhlist�r>�6/opt/alt/python34/lib64/python3.4/test/test_logging.py�setUpUs>



zBaseTest.setUpc
Csv|jj�|jj|j�x:|jjr\|jjd}|jj|�|j�q#W|jj|j�tj	�z�tj
j�tj
j|j
�tjj�tjj|j�tjj�tjj|j�|jtjdd�<tj�jj}|j�|j|j�|j}x8|jD]-}||dk	r2|||j|_q2q2WWdtj�XdS)zJRemove our logging stream, and restore the original logging
        level.rN)r/�closer+�
removeHandlerr3r8r0r,rrr&�clear�updater'r$r%rr r"r!rrrr#r(rr*)r<�hrr(r=r>r>r?�tearDown}s0





	zBaseTest.tearDownNc	Cs�|p|j}tj|p!|j�}|j�j�}|jt|�t|��xbt||�D]Q\}}|j	|�}|s�|j
d|�n|jt|j��|�qeW|j
�}|r�|j
d|�ndS)z�Match the collected log lines against the regular expression
        self.expected_log_pat, and compare the extracted group values to
        the expected_values list of tuples.z*Log line does not match expected pattern:
z'Remaining output at end of log stream:
N)r/�re�compile�expected_log_pat�getvalue�
splitlines�assertEqual�len�zip�search�fail�tuple�groups�read)	r<Zexpected_valuesr/�patZactual_lines�actual�expected�match�sr>r>r?�assert_log_lines�s	 zBaseTest.assert_log_linescCs|jd7_d|jS)zMGenerate a message consisting solely of an auto-incrementing
        integer.�z%d)�message_num)r<r>r>r?�next_message�szBaseTest.next_message)�__name__�
__module__�__qualname__�__doc__r5rIr[r@rFrYr\r>r>r>r?rMs(rc@sReZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BuiltinLevelsTestz*Test builtin levels and their inheritance.cCs�|j}tjd�}|jtj�tjtjd�i�}|jtj�tjd�}|jtj�|jtj	|��|j
|��|jtj	|��|j
|��|j|��|j|��|jtj	|��|j
|��|j|��|j|��|j
|��|j|��|j|��|j
|��|j
|��|jdddddddddddg�dS)N�ERR�INF�DEB�CRITICAL�1�ERROR�2�3�4�WARNING�5�INFO�6�7�8�9�10r1�11)�ERR�CRITICALrf)rt�ERRORrh)�INFruri)rwrvrj)rw�WARNINGrl)rw�INFOrn)�DEBruro)rzrvrp)rzrxrq)rzryrr)rzzDEBUGrs)r\rrr0rg�
LoggerAdapterrmr1�logre�error�warning�info�debugrY)r<�mrbrcrdr>r>r?�	test_flat�sD	zBuiltinLevelsTest.test_flatcCs�|j}tjd�}|jtj�tjd�}|jtj�|jtj|��|j|��|j	|��|j
|��|j|��|jddg�dS)	Nrc�INF.ERRrerfrgrh)r�zCRITICALrf)r�zERRORrh)
r\rrr0rmrgr|rer}r~rr�rY)r<r�rc�INF_ERRr>r>r?�test_nested_explicit�s	z&BuiltinLevelsTest.test_nested_explicitc	CsC|j}tjd�}|jtj�tjd�}|jtj�tjd�}tjd�}tjd�}|jtj|��|j|��|j	|��|j
|��|jtj|��|j|��|j|��|j	|��|j
|��|j|��|jddddddg�dS)NrczINF.ERR�	INF.UNDEF�
INF.ERR.UNDEF�UNDEFrerfrgrhrkrirmrjrlrn)r��CRITICALrf)r��ERRORrh)r�zWARNINGri)r�zINFOrj)r�r�rl)r�r�rn)
r\rrr0rmrgr|rer}r~rr�rY)r<r�rcr�Z	INF_UNDEFZ
INF_ERR_UNDEFr�r>r>r?�test_nested_inherited�s2	z'BuiltinLevelsTest.test_nested_inheritedcCs�|j}tjd�}tjd�}tjd�}|jtj�|jtj|��|j|��|jtj|��|j|��|j|��|j|��|j	d
ddd
g�dS)Nrc�INF.BADPARENT.UNDEF�
INF.BADPARENTrerfrmrhrirj)r��CRITICALrf)r��INFOrh)r�r�ri)r�r�rj)
r\rrr0rmr|ZFATALrr�rY)r<r�rcZ
GRANDCHILDZCHILDr>r>r?�test_nested_with_virtual_parents 	z1BuiltinLevelsTest.test_nested_with_virtual_parentcCs<|jtjd�tj�|jtjtj�d�dS)z&See issue #22386 for more information.rmN)rLrZgetLevelNamerm)r<r>r>r?�test_regression_223869sz'BuiltinLevelsTest.test_regression_22386N)	r]r^r_r`r�r�r�r�r�r>r>r>r?ra�s/#rac@s:eZdZdZdd�Zdd�Zdd�ZdS)	�BasicFilterTestzTest the bundled Filter class.cCs�tjd�}|jjd}z�|j|�tjd�}tjd�}tjd�}tjd�}|j|j��|j|j��|j|j��|j|j��|jd	d
g�Wd|j	|�XdS)N�	spam.eggsr�spam�spam.eggs.fishzspam.bakedbeansrmrhri)r��INFOrh)r�r�ri)
r�Filterr+r8�	addFilterrrr\rY�removeFilter)r<Zfilter_�handlerr��	spam_eggs�spam_eggs_fish�spam_bakedbeansr>r>r?�test_filterBs 
zBasicFilterTest.test_filtercCs�dd�}|jjd}z�|j|�tjd�}tjd�}tjd�}tjd�}|j|j��|j|j��|j|j��|j|j��|jddg�Wd|j|�XdS)
NcSs5|jjd�}dj|dd��}|dkS)N�.�z	spam.eggs)r=�split�join)�record�parts�prefixr>r>r?�
filterfunc^sz8BasicFilterTest.test_callable_filter.<locals>.filterfuncrr��	spam.eggs�spam.eggs.fishzspam.bakedbeansrmrhri)r��INFOrh)r�r�ri)	r+r8r�rrrr\rYr�)r<r�r�r�r�r�r�r>r>r?�test_callable_filterZs 
z$BasicFilterTest.test_callable_filtercCs<tj�}tjidd6�}|j|j|��dS)Nz	spam.eggsr=)rr��
makeLogRecordr;�filter)r<�f�rr>r>r?�test_empty_filterwsz!BasicFilterTest.test_empty_filterN)r]r^r_r`r�r�r�r>r>r>r?r�>sr��x�w�v�u�t�s�r�q�p�orZ�Silent�Taciturn�Terse�Effusive�Sociable�Verbose�	TalkativeZ	Garrulous�
Chatterbox�Boringc@s"eZdZdZdd�ZdS)�GarrulousFilterz)A filter which blocks garrulous messages.cCs
|jtkS)N)�levelno�	GARRULOUS)r<r�r>r>r?r��szGarrulousFilter.filterN)r]r^r_r`r�r>r>r>r?r��sr�c@s"eZdZdZdd�ZdS)�VerySpecificFilterz5A filter which blocks sociable and taciturn messages.cCs|jttgkS)N)r��SOCIABLE�TACITURN)r<r�r>r>r?r��szVerySpecificFilter.filterN)r]r^r_r`r�r>r>r>r?r��sr�c@sXeZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
S)�CustomLevelsAndFiltersTestz@Test various filtering possibilities with custom logging levels.z^[\w.]+ -> (\w+): (\d+)$cCs>tj|�x*tj�D]\}}tj||�qWdS)N)rr@�my_logging_levels�itemsrZaddLevelName)r<�k�vr>r>r?r@�s
z CustomLevelsAndFiltersTest.setUpcCs+x$tD]}|j||j��qWdS)N)�LEVEL_RANGEr|r\)r<�loggerZlvlr>r>r?�log_at_all_levels�s
z,CustomLevelsAndFiltersTest.log_at_all_levelscCsC|jjt�|j|j�|jd
dddddg�dS)Nr�rlr�rnr�ror�rpr�rqr�rr)r�rl)r�rn)r�ro)r�rp)r�rq)r�z10)r+r0�VERBOSEr�rY)r<r>r>r?�test_logger_filter�sz-CustomLevelsAndFiltersTest.test_logger_filterc
Csi|jjdjt�z0|j|j�|jdd
dddg�Wd|jjdjtj�XdS)Nrr�rnr�ror�rpr�rqr�rr)zSociablern)zEffusivero)zTerserp)zTaciturnrq)zSilentz10)r+r8r0r�r�rYr�NOTSET)r<r>r>r?�test_handler_filter�sz.CustomLevelsAndFiltersTest.test_handler_filtercCs�|jjd}d}t�}|j|�z�|j|j�dddddd d!d"d#g	}|j|�t�}|jj|�|j|j�|j|d$d%d&d'd(d)d*g�Wd|r�|jj|�n|j|�XdS)+Nrr�rfr�rhr�rjr�rlr�rnr�ror�rpr�rqr�rrrs�12�14�15�17�18�20)r�rf)r�rh)r�rj)�Verboserl)zSociablern)�Effusivero)�Terserp)zTaciturnrq)�Silentz10)r�z11)r�r�)r�r�)r�r�)r�r�)r�r�)r�r�)r+r8r�r�r�rYr�r�)r<r�Zspecific_filterZgarrZfirst_linesr>r>r?�test_specific_filters�s<	
	
		z0CustomLevelsAndFiltersTest.test_specific_filtersN)
r]r^r_r`rIr@r�r�r�r�r>r>r>r?r��sr�c@saeZdZdd�Zdd�Zejejdkd�ej	e
d�dd	���Zd
S)�HandlerTestcCs^tj�}d|_|j|jd�d|_|j|jd�|jt|jd�dS)NZgenericZanothergeneric)r�Handlerr=rL�assertRaises�NotImplementedError�emit)r<rEr>r>r?�	test_names		zHandlerTest.test_namec
Cs�tjdkr�xLdD]D}tj�\}}tj|�|sQtj|�ntjj	|dd�}|r|j
|j}}|j|d�|j|d�tj
idd6�}|j|�tj|�|jtjj|��|j|�|jtjj|��n&|j|j
d�|j|jd�|j�|rtj|�qqWtjdkrvd	}nd
}yFtjj|�}|j|j|j�|j|j�|j�Wq�tk
r�Yq�Xnx^dD]V}	|	d
kr|jttjjdd|	�q�tjjdd|	�}|j�q�Wtjjd�}tj
i�}|j|j|��|j�tjjd�}|j|j|��|j�dS)N�linux�darwinTF�delayrZZTest�msgz/var/run/syslogz/dev/log�GET�POST�PUT�	localhostz/logr)zlinuxzdarwin)TF���r�r�r�)r�r�r�)�sys�platform�tempfile�mkstemp�osrA�unlinkrr8�WatchedFileHandler�dev�inorLr��handle�assertFalse�path�existsr;�
SysLogHandlerZfacilityZLOG_USERZ
unixsocket�OSErrorr��
ValueError�HTTPHandlerZBufferingHandlerZshouldFlush)
r<Zexisting�fd�fnrEr�r�r�Zsockname�methodr>r>r?�test_builtin_handlerssZ





	


z!HandlerTest.test_builtin_handlers�ntz/WatchedFileHandler not appropriate for Windows.z!Threading required for this test.cs��fdd�}d}d}d�_d�_xbdD]Z}tjdd�\}}tj|�tjd|d	||f�}d|_|j	�t
jj|d
|�}t
j
d�}	|j|	�z�x�t|�D]{}
tjd�t
jid
d6�}y tj��_|j|�Wq�tk
rQtd�j�jf��Yq�Xq�WWd|j�|j�tjj|�r�tj|�nXq7WdS)Ncsmxft|�D]X}y tj|�tj��_Wntk
rGYnXtjdtjdd��q
WdS)Ng����Mbp?r�)	�ranger�r��time�
deletion_timer��sleep�randomZrandint)ZfnameZtries�_)r<r>r?�remove_loopMs

z*HandlerTest.test_race.<locals>.remove_loopi�FTz.logztest_logging-3-�target�argsr�z'%(asctime)s: %(levelname)s: %(message)sg{�G�zt?Ztestingr�zDeleted at %s, opened at %s)FT)Zhandle_timerr�r�r�rA�	threading�ThreadZdaemon�startrr8r�r4r6rrr	r�r��	Exception�printr�r�r�r�)r<rZ	del_countZ	log_countr�rrZremoverrEr�rr�r>)r<r?�	test_raceIs<			

	





zHandlerTest.test_raceN)r]r^r_r�r�unittest�skipIfr�r=�
skipUnlessrrr>r>r>r?r�
s6r�c@seZdZdd�ZdS)�	BadStreamcCstd��dS)Nzdeliberate mistake)�RuntimeError)r<�datar>r>r?�writeyszBadStream.writeN)r]r^r_rr>r>r>r?rxsrc@seZdZdd�ZdS)�TestStreamHandlercCs
||_dS)N)�error_record)r<r�r>r>r?�handleError}szTestStreamHandler.handleErrorN)r]r^r_rr>r>r>r?r|src@seZdZdd�ZdS)�StreamHandlerTestcCs�tt��}tji�}tj}tj}z�|j|�|j|j	|�tj
t��}tj�t_}|j|�|j
d|j��dt_tj�t_}|j|�|jd|j��Wd|t_|t_XdS)Nz"
RuntimeError: deliberate mistake
Fr)rrrr��raiseExceptionsr��stderrr��assertIsrr2r-r.�assertInrJrL)r<rEr�Z	old_raise�
old_stderr�sior>r>r?�test_error_handling�s$		

	
	
	z%StreamHandlerTest.test_error_handlingN)r]r^r_r&r>r>r>r?r�src@sUeZdZdZdd�Zdd�Zdd�Zdd	�Zd
dd�Zd
S)
�TestSMTPServeraD
        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.
        cCsQtjj||dd|�|jj�d|_||_d|_||_dS)N�maprZ)	�smtpd�
SMTPServer�__init__�socket�getsockname�port�_handler�_thread�
poll_interval)r<�addrr�r1�sockmapr>r>r?r+�s
		zTestSMTPServer.__init__cCs|j||||�dS)ae
            Delegates to the handler passed in to the server's constructor.

            Typically, this will be a test case method.
            :param peer: The client (host, port) tuple.
            :param mailfrom: The address of the sender.
            :param rcpttos: The addresses of the recipients.
            :param data: The message.
            N)r/)r<�peer�mailfrom�rcpttosrr>r>r?�process_message�s
zTestSMTPServer.process_messagecCsCtjd|jd|jf�|_}|jd�|j�dS)zO
            Start the server running on a separate daemon thread.
            r
rTN)rr�
serve_foreverr1r0�	setDaemonr)r<�tr>r>r?r�s
zTestSMTPServer.startcCsKytj|d|j�Wn*tk
rF|js<|jrB�nYnXdS)aB
            Run the :mod:`asyncore` loop until normal termination
            conditions arise.
            :param poll_interval: The interval, in seconds, used in the underlying
                                  :func:`select` or :func:`poll` call by
                                  :func:`asyncore.loop`.
            r(N)�asyncoreZloopZ_mapr�Z	connectedZ	accepting)r<r1r>r>r?r8�s

zTestSMTPServer.serve_foreverNcCs'|j�|jj|�d|_dS)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.
            N)rAr0r�)r<�timeoutr>r>r?�stop�s
zTestSMTPServer.stop)	r]r^r_r`r+r7rr8r=r>r>r>r?r'�s	r'csOeZdZdZdd�Zdd�Z�fdd�Zdd	d
�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.
        cCs.d|_||_||_tj�|_dS)N)r0r1r/r�Event�ready)r<r�r1r>r>r?r+�s			zControlMixin.__init__cCsCtjd|jd|jf�|_}|jd�|j�dS)zQ
            Create a daemon thread to run the server, and start it.
            r
rTN)rrr8r1r0r9r)r<r:r>r>r?r�s
zControlMixin.startcs'|jj�tt|�j|�dS)zj
            Run the server. Set the ready flag before entering the
            service loop.
            N)r@�set�superr>r8)r<r1)�	__class__r>r?r8s
zControlMixin.serve_foreverNcCsP|j�|jdk	r5|jj|�d|_n|j�|jj�dS)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)�shutdownr0r��server_closer@rC)r<r<r>r>r?r=s

zControlMixin.stop)r]r^r_r`r+rr8r=r>r>)rCr?r>�s
	r>c@s7eZdZdZddddd�Zdd�ZdS)	�TestHTTPServera�
        An HTTP server which is controllable using :class:`ControlMixin`.

        :param addr: A tuple with the IP address and port to listen on.
        :param handler: A handler callable which will be called with a
                        single parameter - the request - in order to
                        process the request.
        :param poll_interval: The polling interval in seconds.
        :param log: Pass ``True`` to enable log messages.
        g�?FNcsRG��fdd�dt��tj||��tj|||�||_dS)NcsCeZdZddd�Zdd�Z���fdd�Z�S)z=TestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandlerNcSs&|jd�r|jSt|��dS)NZdo_)�
startswith�process_request�AttributeError)r<r=�defaultr>r>r?�__getattr__+szITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__cSs|jj|�dS)N)�serverr/)r<r>r>r?rH0szMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestcs&�r"t�|�j||�ndS)N)rB�log_message)r<�formatr)�DelegatingHTTPRequestHandlerrCr|r>r?rM3szITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_message)r]r^r_rKrHrMr>)rOr|)rCr?rO*srO)r
rr+r>�sslctx)r<r2r�r1r|rPr>)rOr|r?r+(s
zTestHTTPServer.__init__cCs�y=|jj�\}}|jr<|jj|dd�}nWn<tk
r{}ztjjd|��WYdd}~XnX||fS)NZserver_sideTzGot an error:
%s
)r,ZacceptrPZwrap_socketr�r�r!r)r<�sockr2�er>r>r?�get_request;s	zTestHTTPServer.get_request)r]r^r_r`r+rSr>r>r>r?rFs
rFcs@eZdZdZdZdddd�Z�fdd�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.
        Tg�?cCsCGdd�dt�}tj||||�tj|||�dS)Nc@seZdZdd�ZdS)z;TestTCPServer.__init__.<locals>.DelegatingTCPRequestHandlercSs|jj|�dS)N)rLr/)r<r>r>r?r�[szBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)r]r^r_r�r>r>r>r?�DelegatingTCPRequestHandlerYsrU)rrr+r>)r<r2r�r1�bind_and_activaterUr>r>r?r+WszTestTCPServer.__init__cs-tt|�j�|jj�d|_dS)NrZ)rBrT�server_bindr,r-r.)r<)rCr>r?rWaszTestTCPServer.server_bind)r]r^r_r`Zallow_reuse_addressr+rWr>r>)rCr?rTFs

	rTcsLeZdZdZdddd�Z�fdd�Z�fdd	�Z�S)
�
TestUDPServerah
        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.
        g�?TcsRG�fdd�dt��tj||�|�tj|||�d|_dS)Ncs1eZdZdd�Z��fdd�Z�S)z;TestUDPServer.__init__.<locals>.DelegatingUDPRequestHandlercSs|jj|�dS)N)rLr/)r<r>r>r?r�zszBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlecsZ|jj�}|rVyt�|�j�WqVtk
rR|jjsN�nYqVXndS)N)ZwfilerJrB�finishr�rL�_closed)r<r)�DelegatingUDPRequestHandlerrCr>r?rY}s
zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)r]r^r_r�rYr>)r[)rCr?r[xsr[F)rrr+r>rZ)r<r2r�r1rVr>)r[r?r+vszTestUDPServer.__init__cs-tt|�j�|jj�d|_dS)NrZ)rBrXrWr,r-r.)r<)rCr>r?rW�szTestUDPServer.server_bindcs tt|�j�d|_dS)NT)rBrXrErZ)r<)rCr>r?rE�szTestUDPServer.server_close)r]r^r_r`r+rWrEr>r>)rCr?rXes
rX�AF_UNIXc@seZdZejZdS)�TestUnixStreamServerN)r]r^r_r,r\�address_familyr>r>r>r?r]�sr]c@seZdZejZdS)�TestUnixDatagramServerN)r]r^r_r,r\r^r>r>r>r?r_�sr_z!Threading required for this test.c@s.eZdZdZdd�Zdd�ZdS)�SMTPHandlerTestg @c
Csni}ttdf|jd|�}|j�t|jf}tjj|dddd|j�}|j	|j
dg�g|_tjidd6�}t
j�|_|j|�|jj|j�|j�|j|jj��|j	t|j�d	�|jd\}}}}	|j	|d�|j	|dg�|jd
|	�|j|	jd��|j�dS)Nrg����MbP?�meZyouZLogr<u	Hello ✓r�rZz
Subject: Log
u

Hello ✓)r'r
r7rr.rr8ZSMTPHandler�TIMEOUTrLZtoaddrs�messagesr�rr?�handledr��waitr=r;Zis_setrMr#�endswithrA)
r<r3rLr2rEr�r4r5r6rr>r>r?�
test_basic�s,	
	

zSMTPHandlerTest.test_basiccGs!|jj|�|jj�dS)N)rc�appendrdrA)r<rr>r>r?r7�szSMTPHandlerTest.process_messageN)r]r^r_rbrgr7r>r>r>r?r`�sr`c@s@eZdZdZdZdd�Zdd�Zdd�Zd	S)
�MemoryHandlerTestzTests for the MemoryHandler.z^[\w.]+ -> (\w+): (\d+)$cCsctj|�tjjdtj|j�|_tjd�|_	d|j	_
|j	j|j�dS)N�
Zmemr)rr@rr8Z
MemoryHandlerrkr3�mem_hdlrr�
mem_logger�	propagater:)r<r>r>r?r@�s
zMemoryHandlerTest.setUpcCs|jj�tj|�dS)N)rkrArrF)r<r>r>r?rF�s
zMemoryHandlerTest.tearDowncCs1|jj|j��|jg�|jj|j��|jg�|jj|j��d
ddg}|j|�x�dD]�}x*td	�D]}|jj|j��q�W|j|�|jj|j��|d
d�t||d�D�}|j|�qW|jj|j��|j|�dS)Nr1rfrmrhrkrir��	cSs"g|]}dt|�f�qS)r1)�str)�.0�ir>r>r?�
<listcomp>�s	z0MemoryHandlerTest.test_flush.<locals>.<listcomp>rj)zDEBUGrf)zINFOrh)zWARNINGri)rrn)rlr�r\rYrr~r)r<�lines�nrrr>r>r?�
test_flush�s$

	


$zMemoryHandlerTest.test_flushN)r]r^r_r`rIr@rFrvr>r>r>r?ri�s
ric@s"eZdZdZdd�ZdS)�ExceptionFormatterzA special exception formatter.cCsd|djS)Nz
Got a [%s]r)r])r<Zeir>r>r?�formatException�sz"ExceptionFormatter.formatExceptionN)r]r^r_r`rxr>r>r>r?rw�srwc@seZdZdZdZdZdZdZejdd�Z	ejdd	�Z
d
edZejdd
�ZdZ
dZdZdd�Zdd�Zdd�Zedd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'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.stboutzformatter=form1zformatter=misspelled_namea
    [loggers]
    keys=root

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=NOTSET
    handlers=hand1

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    class=zS.ExceptionFormatter
    format=%(levelname)s:%(name)s:%(message)s
    datefmt=
    zclass=StreamHandlerzclass=logging.StreamHandlerag
    [loggers]
    keys=root,parser

    [handlers]
    keys=hand1, hand2

    [formatters]
    keys=form1, form2

    [logger_root]
    level=WARNING
    handlers=

    [logger_parser]
    level=DEBUG
    handlers=hand1
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [handler_hand2]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stderr,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=

    [formatter_form2]
    format=%(message)s
    datefmt=
    a
    [loggers]
    keys=root,parser,compiler

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

    [logger_compiler]
    level=DEBUG
    handlers=
    propagate=1
    qualname=compiler

    [logger_parser]
    level=DEBUG
    handlers=
    propagate=1
    qualname=compiler.parser

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    args=(sys.stdout,)

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    z�
    [loggers]
    keys=root

    [handlers]
    keys=screen

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=screen

    [handler_screen]
    level=DEBUG
    class=StreamHandler
    args=(sys.stdout,)
    formatter=
    cKs/tjtj|��}tjj||�dS)N)r-r.�textwrap�dedentr�config�
fileConfig)r<�conf�kwargs�filer>r>r?�apply_config�szConfigFileTest.apply_configcCs{t��l}|j|j�tj�}|j|j��|j|j��|jdgd|�|jg�WdQXdS)Nrgrhr/)zERRORrh)	rr��config0rrrr\r}rY)r<�outputr�r>r>r?�test_config0_ok�s	zConfigFileTest.test_config0_okcCs�t���}tjtj|j��}tj�}|j|�t	j
j|�t	j�}|j
|j��|j|j��|jdgd|�|jg�WdQXdS)Nrgrhr/)zERRORrh)rr-r.rzr{r��configparserZConfigParserZ	read_filerr|r}rrr\r}rY)r<r�r��cpr�r>r>r?�test_config0_using_cp_ok�s
	z'ConfigFileTest.test_config0_using_cp_okcCs~t��o}|j|�tjd�}|j|j��|j|j��|jddgd|�|jg�WdQXdS)	Nzcompiler.parserrmrfrgrhr/)zINFOrf)zERRORrh)rr�rrrr\r}rY)r<r|r�r�r>r>r?�test_config1_oks
	zConfigFileTest.test_config1_okcCs|jt|j|j�dS)N)r�rr��config2)r<r>r>r?�test_config2_failuresz#ConfigFileTest.test_config2_failurecCs|jt|j|j�dS)N)r�rr��config3)r<r>r>r?�test_config3_failuresz#ConfigFileTest.test_config3_failurecCs�t���}|j|j�tj�}y
t��Wntk
rVtjd�YnXtjj	d�|j
|j�d�|jg�WdQXdS)Nzjust testingrz-ERROR:root:just testing
Got a [RuntimeError]
)
rr��config4rrr�	exceptionr��stdout�seekrLrJrY)r<r�r�r>r>r?�test_config4_oks

zConfigFileTest.test_config4_okcCs|jd|j�dS)Nr|)r��config5)r<r>r>r?�test_config5_ok&szConfigFileTest.test_config5_okcCs|jd|j�dS)Nr|)r��config6)r<r>r>r?�test_config6_ok)szConfigFileTest.test_config6_okcCs�t���}|j|j�tjd�}tjd�}|j|j��|j|j��|j|j��|j	dddgd	|�|j	g�WdQXt���}|j|j
�tjd�}|j|j�|j|j��|j|j��tjd
�}|j|j��|j|j��|j|j��|j	ddddgd	|�|j	g�WdQXdS)Nzcompiler.parserzcompiler-hyphenatedrmrfrgrhrerir/zcompiler.lexerrjrlrnro)�INFOrf)�ERRORrh)zCRITICALri)r�rj)r�rl)r�rn)r�ro)
rr��config1arrrr\r}�criticalrY�config7r�r)r<r�r��
hyphenatedr>r>r?�test_config7_ok,s<		zConfigFileTest.test_config7_okcCsy|j|j�tjd�}|j|j�|j|j�|j|j�|j|jdd�|j|j�dS)NZsome_pristine_logger�disable_existing_loggersF)r��disable_testrrr�rr;)r<r�r>r>r?�test_logger_disablingWsz$ConfigFileTest.test_logger_disablingN)r]r^r_r`rIr��config1r��replacer�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r>r>r>r?ry�s0  *&+ryc@sgeZdZdZer'eZdZndd�Zdd�Z	dd	�Z
d
d�Zdd
�ZdS)�SocketHandlerTestzTest for SocketHandler objects.r�rcCs�tj|�|j|j|jd�|_}|j�|jj�t	j
j}t|j
t�r||d|j�|_n||j
d�|_d|_|jj|jj
d�|jj|j�tjd�|_dS)ztSet up a TCP server to receive log messages, and a SocketHandler
        pointing to that server's address and port.g{�G�z�?r�Nrr)rr@�server_class�address�
handle_socketrLrr@rerr8Z
SocketHandler�
isinstance�server_addressrQr.�	sock_hdlr�
log_outputr+rBr:rZ	Semaphorerd)r<rL�hclsr>r>r?r@js


	zSocketHandlerTest.setUpcCsIz4|jjd�|jj|j�|jj�Wdtj|�XdS)zShutdown the TCP server.g@N)rLr=r+rBr�rArrF)r<r>r>r?rF|s
zSocketHandlerTest.tearDowncCs�|j}x�|jd�}t|�dkr1Pntjd|�d}|j|�}x3t|�|kr�||j|t|��}qYWtj|�}tj|�}|j	|j
d7_	|jj�qWdS)Nrz>Lr�
)
Z
connectionZrecvrM�structZunpack�pickle�loadsrr�r�r�rd�release)r<�requestZconn�chunk�slen�objr�r>r>r?r��s	!zSocketHandlerTest.handle_socketcCsZtjd�}|jd�|jj�|jd�|jj�|j|jd�dS)NZtcpr��eggsz
spam
eggs
)rrr}rd�acquirer�rLr�)r<r�r>r>r?�test_output�s



zSocketHandlerTest.test_outputcCs�d|j_|jjd�ytd��Wn"tk
rP|jjd�YnX|jjd�tj�}|j	|jj
|�tj|jj
|d�|jjd�dS)Ng@g@zDeliberate mistakez
Never sentzNever sent, eitherg����MbP?zNor this)r�Z
retryStartrLr=rr+r�r}r�
assertGreaterZ	retryTimer	)r<�nowr>r>r?�
test_noserver�s
zSocketHandlerTest.test_noserverN)z	localhostr)
r]r^r_r`rrTr�r�r@rFr�r�r�r>r>r>r?r�as			r�cCs<tjdddd�\}}tj|�tj|�|S)Nr�Z
test_logging_�suffixz.sock)r�r�r�rA�remove)rrr>r>r?�_get_temp_domain_socket�s

r�zUnix sockets requiredc@sLeZdZdZer0eed�r0eZndd�Z	dd�Z
dS)�UnixSocketHandlerTestz)Test for SocketHandler with unix sockets.r\cCst�|_tj|�dS)N)r�r�r�r@)r<r>r>r?r@�szUnixSocketHandlerTest.setUpcCs!tj|�tj|j�dS)N)r�rFr�r�r�)r<r>r>r?rF�s
zUnixSocketHandlerTest.tearDownN)r]r^r_r`r�hasattrr,r]r�r@rFr>r>r>r?r��s
	r�c@s[eZdZdZer'eZd
Zndd�Zdd�Z	dd	�Z
d
d�ZdS)�DatagramHandlerTestzTest for DatagramHandler.r�rcCs�tj|�|j|j|jd�|_}|j�|jj�t	j
j}t|j
t�r||d|j�|_n||j
d�|_d|_|jj|jj
d�|jj|j�tj�|_dS)zvSet up a UDP server to receive log messages, and a DatagramHandler
        pointing to that server's address and port.g{�G�z�?r�Nrr)rr@r�r��handle_datagramrLrr@rerr8ZDatagramHandlerr�r�rQr.r�r�r+rBr:rr?rd)r<rLr�r>r>r?r@�s


	zDatagramHandlerTest.setUpcCsIz4|jjd�|jj|j�|jj�Wdtj|�XdS)zShutdown the UDP server.g@N)rLr=r+rBr�rArrF)r<r>r>r?rF�s
zDatagramHandlerTest.tearDowncCsptjdd�}|jt|�d�}tj|�}tj|�}|j|j	d7_|j
j�dS)Nz>Lrr�)r��pack�packetrMr�r�rr�r�r�rdrA)r<r�r�r�r�r�r>r>r?r��sz#DatagramHandlerTest.handle_datagramcCsgtjd�}|jd�|jj�|jj�|jd�|jj�|j|jd�dS)NZudpr�r�z
spam
eggs
)rrr}rdrerCrLr�)r<r�r>r>r?r��s




zDatagramHandlerTest.test_outputN)z	localhostr)r]r^r_r`rrXr�r�r@rFr�r�r>r>r>r?r��s		r�c@sLeZdZdZer0eed�r0eZndd�Z	dd�Z
dS)�UnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.r\cCst�|_tj|�dS)N)r�r�r�r@)r<r>r>r?r@szUnixDatagramHandlerTest.setUpcCs!tj|�tj|j�dS)N)r�rFr�r�r�)r<r>r>r?rFs
z UnixDatagramHandlerTest.tearDownN)r]r^r_r`rr�r,r_r�r@rFr>r>r>r?r��s
	r�c@s[eZdZdZer'eZd
Zndd�Zdd�Z	dd	�Z
d
d�ZdS)�SysLogHandlerTestz!Test for SysLogHandler using UDP.r�rcCs�tj|�|j|j|jd�|_}|j�|jj�t	j
j}t|j
t�r|d|jf�|_n||j
�|_d|_|jj|jj
d�|jj|j�tj�|_dS)ztSet up a UDP server to receive log messages, and a SysLogHandler
        pointing to that server's address and port.g{�G�z�?r�rrN)rr@r�r�r�rLrr@rerr8r�r�r�rQr.�sl_hdlrr�r+rBr:rr?rd)r<rLr�r>r>r?r@s


	zSysLogHandlerTest.setUpcCsIz4|jjd�|jj|j�|jj�Wdtj|�XdS)zShutdown the UDP server.g@N)rLr=r+rBr�rArrF)r<r>r>r?rF+s
zSysLogHandlerTest.tearDowncCs|j|_|jj�dS)N)r�r�rdrA)r<r�r>r>r?r�4sz!SysLogHandlerTest.handle_datagramcCs�tjd�}|jd�|jj�|j|jd�|jj�d|j_	|jd�|jj�|j|jd�|jj�d|j_
|jd�|jj�|j|jd�dS)NZslhuspäms
<11>spämFs	<11>spämuhäm-s<11>häm-späm)rrr}rdrerLr�rCr�Z
append_nulZident)r<r�r>r>r?r�8s







zSysLogHandlerTest.test_outputN)z	localhostr)r]r^r_r`rrXr�r�r@rFr�r�r>r>r>r?r�s		r�c@sLeZdZdZer0eed�r0eZndd�Z	dd�Z
dS)�UnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.r\cCst�|_tj|�dS)N)r�r�r�r@)r<r>r>r?r@RszUnixSysLogHandlerTest.setUpcCs!tj|�tj|j�dS)N)r�rFr�r�r�)r<r>r>r?rFWs
zUnixSysLogHandlerTest.tearDownN)r]r^r_r`rr�r,r_r�r@rFr>r>r>r?r�Is
	r�c@s:eZdZdZdd�Zdd�Zdd�ZdS)	�HTTPHandlerTestzTest for HTTPHandler.cCs tj|�tj�|_dS)ztSet up an HTTP server to receive log messages, and a HTTPHandler
        pointing to that server's address and port.N)rr@rr?rd)r<r>r>r?r@_s
zHTTPHandlerTest.setUpc	Cs�|j|_t|j�|_|jdkrpy,t|jd�}|jj|�|_Wqpd|_YqpXn|j	d�|j
�|jj�dS)Nr�zContent-Length��)
�commandrr��log_data�intZheadersZrfilerS�	post_dataZ
send_responseZend_headersrdrA)r<r�Zrlenr>r>r?�handle_requestes

zHTTPHandlerTest.handle_requestcCs�tjd�}|j}|j|jjd�x\dD]T}d}|r�yddl}Wntk
rrd}Yq�Xtjj	t
�}tjj|d�}|j|j
�}|j|�|jd|�}	nd}d}	t||jdd	|�|_}
|
j�|
jj�d
|
j}|o)|}tjj|dd|d
|	�|_d|_|j|j�x�dD]�}
|
|j_|jj�d}|j|�|jj�|j|jjd�|j|j |
�|
dkr�t!|jj"�}nt!|j#j$d��}|j|ddg�|j|ddg�|j|d|g�qpW|jj%d�|jj|j�|jj&�q6WdS)NZhttprFTr�zkeycert.pemZcafileg{�G�z�?rPzlocalhost:%dz/frob�secure�contextr�r�uspämzutf-8r=ZfuncNamer�r�g@)FT)z	localhostr)zGETzPOST)'rrr+rBr8�ssl�ImportErrorr�r��dirname�__file__r�Z
SSLContextZPROTOCOL_SSLv23Zload_cert_chainZcreate_default_contextrFr�rLrr@reZserver_portr�Zh_hdlrr�r:rrdrCr}rLr�rZqueryr��decoder=rA)r<r�r+r�r2r�rP�hereZlocalhost_certr�rL�hostZ
secure_clientrr��dr>r>r?r�rsZ	





	



zHTTPHandlerTest.test_outputN)r]r^r_r`r@r�r�r>r>r>r?r�[s
r�c@sFeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
MemoryTestz*Test memory persistence of logger objects.cCstj|�i|_dS)z8Create a dict to remember potentially destroyed objects.N)rr@�
_survivors)r<r>r>r?r@�s
zMemoryTest.setUpcGsCx<|D]4}t|�t|�f}tj|�|j|<qWdS)zKWatch the given objects for survival, by creating weakrefs to
        them.N)�id�repr�weakref�refr�)r<rr��keyr>r>r?�_watch_for_survival�s
zMemoryTest._watch_for_survivalcCs�tj�g}xB|jj�D]1\\}}}|�dkr |j|�q q W|r�|jdt|�dj|�f�ndS)z;Assert that all objects watched for survival have survived.Nz;%d objects should have survived but have been destroyed: %sz, )�gcZcollectr�r�rhrPrMr�)r<ZdeadZid_�repr_r�r>r>r?�_assertTruesurvival�s
"	zMemoryTest._assertTruesurvivalcCs�|jjtj�tjd�}|j|�|jtj�|jj|j��|j|j��|j	dg�~|j
�tjd�}|j|j��|j	ddg�dS)N�foor1rhri)�foo�DEBUGrh)r�r�rh)r�r�ri)r+r0rrmrr�r1r�r\rYr�)r<r��barr>r>r?�test_persistent_loggers�s


z"MemoryTest.test_persistent_loggersN)r]r^r_r`r@r�r�r�r>r>r>r?r��s
r�c@s(eZdZdd�Zdd�ZdS)�EncodingTestcCs�tjd�}tjdd�\}}tj|�d}z�tj|dd�}|j|�z|j|�Wd|j	|�|j�Xt
|dd�}z |j|j�j
�|�Wd|j�XWdtjj|�r�tj|�nXdS)N�testz.logztest_logging-1-ufoo€�encodingzutf-8)rrr�r�r�rA�FileHandlerr:r~rB�openrLrS�rstripr��isfiler�)r<r|rrrr�r�r>r>r?�test_encoding_plain_file�s"


 z%EncodingTest.test_encoding_plain_filecCs�tjd�}d}tjd�}d|_tj�}||d�}tj|�}|j|�z|j	|�Wd|j
|�|j�X|j�}|j
|d�dS)Nr�uдо свидания�cp1251�stricts�� �������
)rr�codecs�	getwriterr�r-�BytesIOr2r:r~rBrArJrL)r<r|�messageZwriter_classr/�writerr�rXr>r>r?�test_encoding_cyrillic_unicode�s	

z+EncodingTest.test_encoding_cyrillic_unicodeN)r]r^r_r�r�r>r>r>r?r��sr�c@s(eZdZdd�Zdd�ZdS)�WarningsTestcCstj��tjd�|jtjd�tjddt�tj�}tj	|�}tj
d�}|j|�tjd�|j
|�|j�}|j�|j|jd�d�tj�}tjd	td
d|d�|j�}|j�|j|d
�WdQXdS)NTF�always�categoryzpy.warningszI'm warning you...z UserWarning: I'm warning you...
r�Explicitzdummy.py�*z
Dummy linez0dummy.py:42: UserWarning: Explicit
  Dummy line
)�warnings�catch_warningsr�captureWarnings�
addCleanup�filterwarnings�UserWarningr-r.r2rr:�warnrBrJrAr��find�showwarningrL)r<r/rEr�rXZa_filer>r>r?�
test_warningss(







	zWarningsTest.test_warningscCs�tj���tjd�|jtjd�tjd�}|j|jg�tjdt	dd�|jt
|j�d�|j|jdtj�WdQXdS)	NTFzpy.warningsr�zdummy.pyr�rZr)
r�r�rr�rrrLr8rrrM�assertIsInstance�NullHandler)r<r�r>r>r?�test_warnings_no_handlers's

z&WarningsTest.test_warnings_no_handlersN)r]r^r_rr	r>r>r>r?r�
sr�cCstj||�S)N)rr4)rN�datefmtr>r>r?�
formatFunc5srcCs
tj�S)N)rr2r>r>r>r?�handlerFunc8src@seZdZdS)�
CustomHandlerN)r]r^r_r>r>r>r?r
;sr
c@s�eZdZdZdZidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6idd
6dgd6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6d6d6idd
6dgd6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Z	idd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Z
idd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Zidd6iiedd6dd6d6d6iid	d
6dd6dd
6dd6d6d6idd
6dgd6d6Zidd6iie
d6dd6d6iedd6dd6d6ied6dd6d 6d6iid	d
6dd6dd
6dd6d6ied6d!6d6idd
6dgd6d6Zidd6iidd6d6d6iied"d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Zidd6iidd6d6d6iied"d
6dd6dd
6dd6d#d$6d6d6iidd
6dgd6d6d6idd
6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d%6d6idd
6d6Zidd6d&d'6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d(6id%6d6idd
6d6Zidd6d)d'6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d(6id%6d6idd
6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6d6d6iidd
6dgd6d6d6idd
6d6Zidd6d)d*6iidd
6d6d6iid+d
6d6d6Zidd6d)d*6iid+d
6d6d6iid+d
6d6d6Zidd6iidd6d6d6iidd,6d-6d.6iid	d
6dd6dd
6dd6d-gd.6d6d6iidd
6d-gd.6d6d6idd
6dgd6d6Zidd6iidd6d6d/6iid	d
6dd6dd
6dd6d6d06d1d6id2d6d6iidd
6dgd6d6d6idd
6d6Ziiidd6d6d/6iid	d
6dd6dd
6dd6d6d06d1d6id2d6d6iidd
6dgd6d6d6idd
6d6Zid3d6iidd6d6d/6iid	d
6dd6dd
6dd6d6d06d1d6id2d6d6iidd
6dgd6d6d6idd
6d6Zidd6iidd6d6d6iid	d
6dd6dd
6dd6id4d56d6d76d86d6d6idd
6dgd6d6Zidd6iid9d6d:d;6d<6d6iid	d
6dd
6d<d6d=6id>d
6d?d@6d<d6d=dA6dd
6dB6d6iidd
6dBgd6dCdD6dE6d6ZdFdG�ZdHdI�Z edJdK�Z!dLdM�Z"dNdO�Z#dPdQ�Z$dRdS�Z%dTdU�Z&dVdW�Z'dXdY�Z(dZd[�Z)d\d]�Z*d^d_�Z+d`da�Z,dbdc�Z-ddde�Z.dfdg�Z/dhdi�Z0djdk�Z1dldm�Z2e3j4e5dn�dodpdq��Z6e3j4e5dr�dsdt��Z7e3j4e5dr�dudv��Z8e3j4e5dr�dwdx��Z9dydz�Z:d{d|�Z;doS)}�ConfigDictTestz)Reading logging config from a dictionary.z^(\w+) \+\+ (\w+)$rZ�versionz%(levelname)s ++ %(message)srNZform1Z
formatterszlogging.StreamHandler�class�	formatterr��levelzext://sys.stdoutr/�hand1r8rk�rootr1zcompiler.parserZloggerszext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz()z"%(levelname)s:%(name)s:%(message)sz.formatFuncZform2Zform3Zhand2z.CustomHandlerzinvalid parameter namerqzcompiler.lexerFr��compilerTZincrementalrmr=Zfilt1�filtersZtrue_formattersZhandler_configszcfg://true_formatterszcfg://handler_configs[hand1]r�r�r�z!
�
terminatorr�z1%(asctime)s (%(name)s) %(levelname)s: %(message)s�$�styleZmySimpleFormatterZ
fileGlobalzlogging.handlers.MemoryHandler�Zcapacityr
ZbufferGlobal�truerm�mymodulecCstjj|�dS)N)rr|Z
dictConfig)r<r~r>r>r?r��	szConfigDictTest.apply_configcCs{t��l}|j|j�tj�}|j|j��|j|j��|jdgd|�|jg�WdQXdS)Nrgrhr/)zERRORrh)	rr�r�rrrr\r}rY)r<r�r�r>r>r?r��	s	zConfigDictTest.test_config0_okcCs~t��o}|j|�tjd�}|j|j��|j|j��|jddgd|�|jg�WdQXdS)	Nzcompiler.parserrmrfrgrhr/)zINFOrf)zERRORrh)rr�rrrr\r}rY)r<r|r�r�r>r>r?r��	s
	zConfigDictTest.test_config1_okcCs|jt|j|j�dS)N)r�rr�r�)r<r>r>r?r��	sz#ConfigDictTest.test_config2_failurecCs|jt|j|j�dS)N)r�rr��config2a)r<r>r>r?�test_config2a_failure�	sz$ConfigDictTest.test_config2a_failurecCs|jt|j|j�dS)N)r�rr��config2b)r<r>r>r?�test_config2b_failure�	sz$ConfigDictTest.test_config2b_failurecCs|jt|j|j�dS)N)r�rr�r�)r<r>r>r?r��	sz#ConfigDictTest.test_config3_failurecCs�t��y}|j|j�y
t��Wntk
rJtjd�YnXtjjd�|j	|j
�d�|jg�WdQXdS)Nzjust testingrz-ERROR:root:just testing
Got a [RuntimeError]
)rr�r�rrr�r�r�r�rLrJrY)r<r�r>r>r?r��	s

zConfigDictTest.test_config4_okcCs�t��y}|j|j�y
t��Wntk
rJtjd�YnXtjjd�|j	|j
�d�|jg�WdQXdS)Nzjust testingrz-ERROR:root:just testing
Got a [RuntimeError]
)rr��config4arrr�r�r�r�rLrJrY)r<r�r>r>r?�test_config4a_ok�	s

zConfigDictTest.test_config4a_okcCs|jd|j�dS)Nr|)r�r�)r<r>r>r?r�
szConfigDictTest.test_config5_okcCs|jt|j|j�dS)N)r�rr�r�)r<r>r>r?�test_config6_failure	
sz#ConfigDictTest.test_config6_failurecCst��r}|j|j�tjd�}|j|j��|j|j��|jd
dgd|�|jg�WdQXt���}|j|j	�tjd�}|j
|j�tjd�}|j|j��|j|j��|jdd
gd|�|jg�WdQXdS)Nzcompiler.parserrmrfrgrhr/zcompiler.lexerrirj)�INFOrf)�ERRORrh)r$ri)r%rj)rr�r�rrrr\r}rYr�r;r)r<r�r�r>r>r?r�
s,		zConfigDictTest.test_config7_okcCsIt��r}|j|j�tjd�}|j|j��|j|j��|jdd
gd|�|jg�WdQXt���}|j|j	�tjd�}|j
|j�|j|j��|j|j��tjd�}|j|j��|j|j��|jddddgd|�|jg�WdQXdS)Nzcompiler.parserrmrfrgrhr/zcompiler.lexerrirjrlrn)�INFOrf)�ERRORrh)r&ri)r'rj)r&rl)r'rn)rr�r�rrrr\r}rY�config8r�r)r<r�r�r>r>r?�test_config_8_ok)
s4		zConfigDictTest.test_config_8_okcCs�t���}|j|j�tjd�}tjd�}|j|j��|j|j��|j|j��|j	dddgd	|�|j	g�WdQXt���}|j|j
�tjd�}|j|j�|j|j��|j|j��tjd
�}|j|j��|j|j��|j|j��|j	ddddgd	|�|j	g�WdQXdS)Nzcompiler.parserzcompiler-hyphenatedrmrfrgrhrerir/zcompiler.lexerrjrlrnro)�INFOrf)�ERRORrh)zCRITICALri)r*rj)r+rl)r*rn)r+ro)
rr�r�rrrr\r}r�rY�config8ar�r)r<r�r�r�r>r>r?�test_config_8a_okJ
s<		z ConfigDictTest.test_config_8a_okcCs�t���}|j|j�tjd�}|j|j��|jgd|�|j|j�|j|j��|jgd|�|j|j	�|j|j��|jdgd|�WdQXdS)Nzcompiler.parserr/rmri)zINFOri)
rr��config9rrrr\rY�config9a�config9b)r<r�r�r>r>r?�test_config_9_oku
s	zConfigDictTest.test_config_9_okcCs�t���}|j|j�tjd�}|j|j��tjd�}|j|j��tjd�}|j|j��tjd�}|j|j��|jd
dgd	|�WdQXdS)Nzcompiler.parserrzcompiler.lexerzcompiler.parser.codegenrkrfrgrjr/)zWARNINGrf)zERRORrj)	rr��config10rrr~r\r}rY)r<r�r�r>r>r?�test_config_10_ok�
s	z ConfigDictTest.test_config_10_okcCs|j|j�dS)N)r��config11)r<r>r>r?�test_config11_ok�
szConfigDictTest.test_config11_okcCs|jt|j|j�dS)N)r�rr��config12)r<r>r>r?�test_config12_failure�
sz$ConfigDictTest.test_config12_failurecCs|jt|j|j�dS)N)r�rr��config13)r<r>r>r?�test_config13_failure�
sz$ConfigDictTest.test_config13_failurec
Cs�t��s}|j|j�tjd}|j|jd�|j|jd�tjd�|j	|j
�jd��WdQXdS)Nrr�z!
ZExclamationz
Exclamation!
)rr��config14rrrLr�rr~r;rJrf)r<r�rEr>r>r?�test_config14_ok�
s

zConfigDictTest.test_config14_okz listen() needs threading to workNcCs=|jd�}tjjd|�}|j�|jj�|j}|jj�z�t	j	t	j
t	j�}|jd�|j
d|f�tjdt|��}||}d}t|�}	x=|	dkr�|j||d��}
||
7}|	|
8}	q�W|j�Wd|jjd�tjj�|jd�XdS)Nzutf-8rg@r�z>L)�encoderr|Zlistenrr@rer.rCr,ZAF_INETZSOCK_STREAMZ
settimeoutZconnectr�r�rM�sendrAZ
stopListeningr�)r<�textZverifyr:r.rQr�rXZ	sentsofar�leftZsentr>r>r?�setup_via_listener�
s,

	




z!ConfigDictTest.setup_via_listenerz!Threading required for this test.cCs�t���}|jtj|j��tjd�}|j|j��tjd�}|j|j��tjd�}|j|j��tjd�}|j	|j��|j
d
dgd	|�WdQXdS)Nzcompiler.parserrzcompiler.lexerzcompiler.parser.codegenrkrfrgrjr/)zWARNINGrf)zERRORrj)rr@�json�dumpsr2rrr~r\r}rY)r<r�r�r>r>r?�test_listen_config_10_ok�
s	z'ConfigDictTest.test_listen_config_10_okcCs�t��{}|jtjtj��tjd�}|j|j	��|j
|j	��|jddgd|�|jg�WdQXdS)	Nzcompiler.parserrmrfrgrhr/)zINFOrf)zERRORrh)rr@rzr{ryr�rrrr\r}rY)r<r�r�r>r>r?�test_listen_config_1_ok�
s	z&ConfigDictTest.test_listen_config_1_okcCs�dd�}dd�}tjd�}tjtj�}t��=}|j||�|j|j	��|j
|j	��WdQX|jgd|�|jddgdd�t��I}|j|�tjd�}|j|j	��|j
|j	��WdQX|jddgd|�|jddgdd�t��Y}|j|ddd�|�tjd�}|j|j	��|j
|j	��WdQX|jddgd|�|jddgdd�dS)NcSsdS)Nr>)�stuffr>r>r?�verify_fail�
sz6ConfigDictTest.test_listen_verify.<locals>.verify_failcSs|ddd�S)NrZr�r>)rEr>r>r?�verify_reverse�
sz9ConfigDictTest.test_listen_verify.<locals>.verify_reversezcompiler.parserr/rmrfrgrhrTz^[\w.]+ -> (\w+): (\d+)$rirjrZrlrn)�INFOrf)�ERRORrh)rHri)rIrj)rHrf)rIrhr�)rHrl)rIrn)rHrf)rIrh)rrrzr{ryr�rr@rr\r}rY)r<rFrGr�Zto_sendr�r>r>r?�test_listen_verify�
sN	
				z!ConfigDictTest.test_listen_verifycCsY|j|j�tjd�jd}|j|jtj�|j|jj	tj
�dS)Nrr)r��out_of_orderrrr8rr
r�r�_style�StringTemplateStyle)r<r�r>r>r?�test_out_of_order+s
z ConfigDictTest.test_out_of_ordercCs~id%d6dddgd6id	d
6dd6d6d'd6dddgdgd6dddgd6}tjj|�}|j|jd�d�|j|jd�d�|j|jd�d�|j|jd�d�|j|jd�d	�|j|jd �d�|jd!�}|j|jd�dddg�|jt|jd"�|jt|jd#�|jt|jd$�dS)(NrZr��Zatuple�a�b�cZalistrRr�r�Zadict�grErr�jZnest1r��lr�ruZnest2�ozcfg://alist�pZnest3zcfg://atuple[1]zcfg://alist[1]zcfg://nest1[1][0]zcfg://nest2[1][1]z
cfg://adict.dzcfg://adict[f]zcfg://nest3zcfg://nosuchzcfg://!zcfg://adict[2])rZr�rO�rErr)rSrXrT)	rr|ZBaseConfiguratorrL�convert�popr��KeyErrorr�)r<r�Zbcr�r>r>r?�test_baseconfig2s&"zConfigDictTest.test_baseconfig)<r]r^r_r`rIr�r�r�r�rrr�r�rwrrr!r�r�r�r(r,r.r/r0r2r4r6r8r:rKr�r�r�r�rr r�r�r"r�r#r�r)r-r1r3r5r7r9r;rrrr@rCrDrJrNr\r>r>r>r?r>sX
!+	?rc@s(eZdZdd�Zdd�ZdS)�ManagerTestcs�g�G�fdd�dtj�}tjd�}|jt|jt�|j|�|jd�}|jd�tjd�|j	�dg�dS)Ncs(eZdZdd�fdd�ZdS)z6ManagerTest.test_manager_loggerclass.<locals>.MyLoggerNcs�j|�dS)N)rh)r<rr�r�exc_info�extra)�loggedr>r?�_logMsz;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._log)r]r^r_rar>)r`r>r?�MyLoggerLsrbr�zshould appear in loggedzshould not appear in logged)
r�Logger�Managerr��	TypeError�setLoggerClassr�rr~rL)r<rb�manr�r>)r`r?�test_manager_loggerclassIs


z$ManagerTest.test_manager_loggerclasscCs<tjd�}t�}|j|�|j|j|�dS)N)rrd�object�setLogRecordFactoryrLZlogRecordFactory)r<rgrVr>r>r?�test_set_log_record_factoryYs	
z'ManagerTest.test_set_log_record_factoryN)r]r^r_rhrkr>r>r>r?r]Hsr]c@seZdZdd�ZdS)�ChildLoggerTestcCs�tj�}tjd�}tjd�}|jd�}|jd�}|j|tjd��|j|tjd��|jd�}|jd�}|jd�}|j|tjd��|j|tjd��|j||�dS)	N�abczdef.ghiZxyzzuvw.xyz�defZghizabc.defzabc.def.ghi)rrZgetChildr")r<r��l1�l2Zc1Zc2Zc3r>r>r?�test_child_loggers`sz"ChildLoggerTest.test_child_loggersN)r]r^r_rqr>r>r>r?rl_srlc@seZdZdS)�DerivedLogRecordN)r]r^r_r>r>r>r?rrpsrrc@s4eZdZdd�Zdd�Zdd�ZdS)�LogRecordFactoryTestcCs[Gdd�dtj�}tj|�|t�|_|jj|j�tj�|_	dS)Nc@s(eZdZdd�Zdd�ZdS)z2LogRecordFactoryTest.setUp.<locals>.CheckingFiltercSs
||_dS)N)�cls)r<rtr>r>r?r+wsz;LogRecordFactoryTest.setUp.<locals>.CheckingFilter.__init__cSsAt|�}||jk	r=d||jf}t|��ndS)Nz)Unexpected LogRecord type %s, expected %sT)�typertre)r<r�r:r�r>r>r?r�zs
z9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)r]r^r_r+r�r>r>r>r?�CheckingFiltervsrv)
rr�rr@rrr�r+r�ZgetLogRecordFactory�orig_factory)r<rvr>r>r?r@us

zLogRecordFactoryTest.setUpcCs4|jj|j�tj|�tj|j�dS)N)r+r�r�rrFrrjrw)r<r>r>r?rF�s
zLogRecordFactoryTest.tearDowncCsV|jt|jj|j��tjt�|jj|j��|j	dg�dS)Nrrgrh)zrootzERRORrh)
r�rer+r~r\rrjrrr}rY)r<r>r>r?�test_logrecord_class�s

z)LogRecordFactoryTest.test_logrecord_classN)r]r^r_r@rFrxr>r>r>r?rsssrsc@sdeZdZdZdd�Zdd�Zdd�Zeje	e
jd�d	�d
d��ZdS)
�QueueHandlerTestz^[\w.]+ -> (\w+): (\d+)$cCstj|�tjd�|_tjj|j�|_tjd�|_	d|j	_
|j	jtj�|j	j
|j�dS)NrZZqueFr�)rr@�queueZQueuerr8ZQueueHandler�que_hdlrr�
que_loggerrmr0rkr:)r<r>r>r?r@�s
zQueueHandlerTest.setUpcCs|jj�tj|�dS)N)r{rArrF)r<r>r>r?rF�s
zQueueHandlerTest.tearDowncCs�|jj|j��|jtj|jj�|jj|j��|jtj|jj�|j�}|jj|�|jj�}|j	t
|tj��|j
|j|jj�|j
|j|jf|df�dS)N)r|r�r\r�rzZEmptyZ
get_nowaitrr~r;r�r�	LogRecordrLr=r�r)r<r�rr>r>r?�test_queue_handler�sz#QueueHandlerTest.test_queue_handler�
QueueListenerz5logging.handlers.QueueListener required for this testcCs�tt��}tjj|j|�}|j�zF|jj|j	��|jj
|j	��|jj|j	��Wd|j�X|j
|jdtjdd��|j
|jdtjdd��|j
|jdtjdd��dS)Nr�r�rfrhri)rr	rr8rrzrr|r~r\r}r�r=r;Zmatchesrkrgre)r<r�Zlistenerr>r>r?�test_queue_listener�s
""z$QueueHandlerTest.test_queue_listenerN)
r]r^r_rIr@rFr~rrr�rr8r�r>r>r>r?ry�s	ryc@s.eZdZdd�ZeZdd�ZdS)�UTCcCstS)N)�ZERO)r<�dtr>r>r?�	utcoffset�sz
UTC.utcoffsetcCsdS)Nr�r>)r<r�r>r>r?�tzname�sz
UTC.tznameN)r]r^r_r�Zdstr�r>r>r>r?r��sr�c@sgeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�
FormatterTestcCscidd6tjd6tjjddd�d6dd	6dd
6dd6dd
6dd6|_i|_dS)Nzformatter.testr=rr�Ztoz	dummy.ext�pathnamer��linenor^�funczMessage with %d %sr�r��placeholdersr)r�r�)rr1r�r�r��common�variants)r<r>r>r?r@�s

zFormatterTest.setUpNcCs?t|j�}|dk	r2|j|j|�ntj|�S)N)�dictr�rDr�rr�)r<r=�resultr>r>r?�
get_record�szFormatterTest.get_recordcCs�|j�}tjd�}|j|j|�d�tjd�}|jt|j|�|j|j��tjd�}|j	|j��tjd�}|j	|j��tjd�}|j|j��dS)Nz${%(message)s}z${Message with 2 placeholders}z
%(random)sz%(asctime)sz%(asctime)-15s�asctime)
r�rr4rLrNr�r[r��usesTimer;)r<r�r�r>r>r?�test_percent�szFormatterTest.test_percentcCs|j�}tjddd�}|j|j|�d�tjddd�}|jt|j|�|j|j��tjddd�}|j	|j��tjddd�}|j	|j��tjddd�}|j	|j��tjd	dd�}|j|j��dS)
Nz
$%{message}%$r�{z$%Message with 2 placeholders%$z{random}z	{asctime}z{asctime!s:15}z{asctime:15}r�)
r�rr4rLrNr�r[r�r�r;)r<r�r�r>r>r?�test_braces�szFormatterTest.test_bracescCsJ|j�}tjddd�}|j|j|�d�tjddd�}|j|j|�d�tjddd�}|jt|j|�|j|j��tjddd�}|j	|j��tjd	dd�}|j|j��tjd
dd�}|j	|j��tjddd�}|j|j��dS)Nz$messagerrzMessage with 2 placeholdersz$$%${message}%$$z$%Message with 2 placeholders%$z	${random}z
${asctime}z	${asctimez$asctimer�)
r�rr4rLrNr�r[r�r�r;)r<r�r�r>r>r?�test_dollarss zFormatterTest.test_dollarscCs |jttjddd�dS)N�x)r�r�rr4)r<r>r>r?�test_invalid_stylesz FormatterTest.test_invalid_stylec	Cs�|j�}tjdddddddt�}tj|jd�j��|_d|_t	j
d�}tj|_|j
|j|�d	�|j
|j|d
�d�|j|�|j
|jd	�dS)Ni�r��rOr�{z%(asctime)s %(message)sz1993-04-21 08:03:00,123z%Y:%dz1993:21)r��datetime�utcrZmktimeZ
astimezoneZ	timetupleZcreatedZmsecsrr4�gmtimeZ	converterrLZ
formatTimerNr�)r<r�r�r�r>r>r?�	test_times$!	
zFormatterTest.test_time)
r]r^r_r@r�r�r�r�r�r�r>r>r>r?r��sr�c@s(eZdZdd�Zdd�ZdS)�TestBufferingFormattercCsdt|�S)Nz[(%d))rM)r<�recordsr>r>r?�formatHeader*sz#TestBufferingFormatter.formatHeadercCsdt|�S)Nz(%d)])rM)r<r�r>r>r?�formatFooter-sz#TestBufferingFormatter.formatFooterN)r]r^r_r�r�r>r>r>r?r�)sr�c@s4eZdZdd�Zdd�Zdd�ZdS)�BufferingFormatterTestcCs3tjidd6�tjidd6�g|_dS)NZoner�Ztwo)rr�r�)r<r>r>r?r@1szBufferingFormatterTest.setUpcCsEtj�}|jd|jg��|jd|j|j��dS)NrZonetwo)r�BufferingFormatterrLrNr�)r<r�r>r>r?�test_default7sz#BufferingFormatterTest.test_defaultcCs`t�}|jd|j|j��tjd�}t|�}|jd|j|j��dS)Nz[(2)onetwo(2)]z
<%(message)s>z[(2)<one><two>(2)])r�rLrNr�rr4)r<r�Zlfr>r>r?�test_custom<s
	z"BufferingFormatterTest.test_customN)r]r^r_r@r�r�r>r>r>r?r�0sr�c@seZdZdd�ZdS)�
ExceptionTestc
Cs�|j}t�}|j|�ytd��Wntjddd�YnX|j|�|j�|jd}|j	|j
jd��|j	|j
jd��|j	|j
jd��|j	|j
jd	��dS)
Nzdeliberate mistakeZfailed�
stack_infoTrz#Traceback (most recent call last):
z!
RuntimeError: deliberate mistakezStack (most recent call last):
z,logging.exception('failed', stack_info=True))r+�RecordingHandlerr:rrr�rBrAr�r;Zexc_textrGrfr�)r<r�rEr>r>r?�test_formattingDs		



zExceptionTest.test_formattingN)r]r^r_r�r>r>r>r?r�Csr�c@seZdZdd�ZdS)�LastResortTestcCs�|j}|j|j�tj}tj}tj}ztj	�t_}|j
d�|j|j�d�|j
d�|j|j�d�dt_tj	�t_}|j
d�|j|j�d�tj	�t_}|j
d�|j|j�d�d|j_dt_tj	�t_}|j
d�|j|j�d�Wd|t_|j|j�|t_|t_XdS)NzThis should not appearrzThis is your final chance!zThis is your final chance!
z-No handlers could be found for logger "root"
F)r+rBr3r�r!rZ
lastResortr r-r.r�rLrJr~rZemittedNoHandlerWarningr:)r<rr$Zold_lastresortZold_raise_exceptionsr%r>r>r?�test_last_resortZs6				

	

	
		zLastResortTest.test_last_resortN)r]r^r_r�r>r>r>r?r�Ysr�c@s(eZdZdd�Zdd�ZdS)�FakeHandlercCs4x-dD]%}t|||j|||��qWdS)Nr��flushrAr�)zacquirezflushzclosezrelease)�setattr�record_call)r<�
identifier�calledrr>r>r?r+s
zFakeHandler.__init__cs���fdd�}|S)Ncs�jdj����dS)Nz{} - {})rhrNr>)r�r��method_namer>r?�inner�sz&FakeHandler.record_call.<locals>.innerr>)r<r�r�r�r�r>)r�r�r�r?r��szFakeHandler.record_callN)r]r^r_r+r�r>r>r>r?r�}sr�cs.eZdZ�fdd�Zdd�Z�S)r�cs&tt|�j||�g|_dS)N)rBr�r+r�)r<rr)rCr>r?r+�szRecordingHandler.__init__cCs|jj|�dS)z&Keep track of all the emitted records.N)r�rh)r<r�r>r>r?r��szRecordingHandler.handle)r]r^r_r+r�r>r>)rCr?r��sr�cs�eZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Z�S)"�ShutdownTestz#Test suite for the shutdown method.cs?tt|�j�g|_tj}|jttd|�dS)Nr )rBr�r@r�rr rr�)r<Zraise_exceptions)rCr>r?r@�s		zShutdownTest.setUpcs�fdd�}|S)Ncs
���dS)Nr>r>)r}r>r?r��sz'ShutdownTest.raise_error.<locals>.innerr>)r<r}r�r>)r}r?�raise_error�szShutdownTest.raise_errorcCs�td|j�}td|j�}td|j�}ttjj|||g�}tjdt|��ddddd	d
ddd
dddg}|j||j�dS)NrrZr��handlerListz2 - acquirez	2 - flushz	2 - closez2 - releasez1 - acquirez	1 - flushz	1 - closez1 - releasez0 - acquirez	0 - flushz	0 - closez0 - release)	r�r�r(rr�r�rD�listrL)r<Zhandler0Zhandler1Zhandler2r8rVr>r>r?�test_no_failure�szShutdownTest.test_no_failurecCsqtd|j�}t|||j|��tjj|�g}tjdt|��|j	d|jd�dS)Nrr�z0 - releaserZr�)
r�r�r�r�rr�r�rDr�rL)r<rr}r�r8r>r>r?�_test_with_failure_in_method�s
z)ShutdownTest._test_with_failure_in_methodcCs|jdt�dS)Nr�)r�r�)r<r>r>r?�test_with_ioerror_in_acquire�sz)ShutdownTest.test_with_ioerror_in_acquirecCs|jdt�dS)Nr�)r�r�)r<r>r>r?�test_with_ioerror_in_flush�sz'ShutdownTest.test_with_ioerror_in_flushcCs|jdt�dS)NrA)r�r�)r<r>r>r?�test_with_ioerror_in_close�sz'ShutdownTest.test_with_ioerror_in_closecCs|jdt�dS)Nr�)r�r�)r<r>r>r?�test_with_valueerror_in_acquire�sz,ShutdownTest.test_with_valueerror_in_acquirecCs|jdt�dS)Nr�)r�r�)r<r>r>r?�test_with_valueerror_in_flush�sz*ShutdownTest.test_with_valueerror_in_flushcCs|jdt�dS)NrA)r�r�)r<r>r>r?�test_with_valueerror_in_close�sz*ShutdownTest.test_with_valueerror_in_closecCsdt_|jdt�dS)NFr�)rr r��
IndexError)r<r>r>r?�.test_with_other_error_in_acquire_without_raise�s	z;ShutdownTest.test_with_other_error_in_acquire_without_raisecCsdt_|jdt�dS)NFr�)rr r�r�)r<r>r>r?�,test_with_other_error_in_flush_without_raise�s	z9ShutdownTest.test_with_other_error_in_flush_without_raisecCsdt_|jdt�dS)NFrA)rr r�r�)r<r>r>r?�,test_with_other_error_in_close_without_raise�s	z9ShutdownTest.test_with_other_error_in_close_without_raisecCs&dt_|jt|jdt�dS)NTr�)rr r�r�r�)r<r>r>r?�+test_with_other_error_in_acquire_with_raise�s	z8ShutdownTest.test_with_other_error_in_acquire_with_raisecCs&dt_|jt|jdt�dS)NTr�)rr r�r�r�)r<r>r>r?�)test_with_other_error_in_flush_with_raise�s	z6ShutdownTest.test_with_other_error_in_flush_with_raisecCs&dt_|jt|jdt�dS)NTrA)rr r�r�r�)r<r>r>r?�)test_with_other_error_in_close_with_raise�s	z6ShutdownTest.test_with_other_error_in_close_with_raise)r]r^r_r`r@r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r>r>)rCr?r��s"	r�c@s�eZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Ze
jeed�d�dd��ZdS)�ModuleLevelMiscTestz)Test suite for some module level methods.cCs\tjjj}|j|d�|jtj|�tjd�|jtjjjd�dS)Nr�S)rrr�disablerLr)r<�old_disabler>r>r?�test_disable�s

z ModuleLevelMiscTest.test_disableNcsg�t|td�fdd��t�}tjj|�tt|�}|dk	rl||d|�n
|d|�|jt|j�d�|jd}|j|j	�d|�|dk	r�|ntt|j
��}|j|j|�|j�g�dS)N�basicConfigcs�j||f�S)N)rh)rP�kw)r�r>r?�<lambda>�sz/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rrZr)rrr�rr:r)rLrMr�Z
getMessage�upperr�)r<rr�	recording�
log_methodr�Zexpected_levelr>)r�r?�	_test_log�s	

'zModuleLevelMiscTest._test_logcCs|jdtj�dS)Nr|)r�rrg)r<r>r>r?�test_log
szModuleLevelMiscTest.test_logcCs|jd�dS)Nr�)r�)r<r>r>r?�
test_debug
szModuleLevelMiscTest.test_debugcCs|jd�dS)Nr)r�)r<r>r>r?�	test_info
szModuleLevelMiscTest.test_infocCs|jd�dS)Nr~)r�)r<r>r>r?�test_warning
sz ModuleLevelMiscTest.test_warningcCs|jd�dS)Nr})r�)r<r>r>r?�
test_error
szModuleLevelMiscTest.test_errorcCs|jd�dS)Nr�)r�)r<r>r>r?�
test_critical
sz!ModuleLevelMiscTest.test_criticalcCs|jttjt�Gdd�dtj�}tj|�|jtj�|�tjtj�|jtj�tj�dS)Nc@seZdZdS)z;ModuleLevelMiscTest.test_set_logger_class.<locals>.MyLoggerN)r]r^r_r>r>r>r?rb%
srb)r�rerrfrircrLZgetLoggerClass)r<rbr>r>r?�test_set_logger_class"
s
z)ModuleLevelMiscTest.test_set_logger_classZ	getcountsz*types are immortal if COUNT_ALLOCS is usedcCsNd}td|�\}}}|j�}|jd|�|jd|�dS)Na&if 1:
            import logging

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

            a = A()z-czexception in __del__zValueError: some error)rr�r#)r<�code�rc�out�errr>r>r?�test_logging_at_shutdown.
s
z,ModuleLevelMiscTest.test_logging_at_shutdown)r]r^r_r`r�r�r�r�r�r�r�r�r�rrr�r�r�r>r>r>r?r��s	r�c@s@eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�
LogRecordTestcCsKtji�}t|�}|j|jd��|j|jd��dS)Nz<LogRecord: �>)rr�rpr;rGrf)r<r�rXr>r>r?�test_str_repD
szLogRecordTest.test_str_repcCs�t�}tj�}|j|�idd6}tjd|�|j|jdj|�|j|jdj	d�|j
|�|j�dS)NZmoreZlesszless is %(less)srzless is more)r�rrr:r~r"r�rrLr�rBrA)r<rEr�r�r>r>r?�
test_dict_argJ
s	


zLogRecordTest.test_dict_argcCsvtji�}|j|jd�y;ddl}tji�}|j|j|j�j�Wntk
rqYnXdS)NZMainProcessr)rr�rL�processNameZmultiprocessingZcurrent_processr=r�)r<r�Zmpr>r>r?�test_multiprocessingU
s 
z"LogRecordTest.test_multiprocessingcCs�tji�}|j}tr;||j�||j�n||j�||j�tj}tj	}tj
}zkdt_dt_	dt_
tji�}|j}||j�||j�||j�||j�Wd|t_|t_	|t_
XdS)NF)rr��assertIsNotNonerZthreadZ
threadNameZprocessr�Z
logThreadsZlogProcessesZlogMultiprocessing�assertIsNone)r<r�ZNOT_NONEZlog_threadsZ
log_processesZlog_multiprocessingZNONEr>r>r?�
test_optional_
s.	


							


		zLogRecordTest.test_optionalN)r]r^r_r�r�r�r�r>r>r>r?r�C
s
r�cs-eZdZdZ�fdd�Z�fdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z�S)/�BasicConfigTestz#Test suite for logging.basicConfig.csytt|�j�tjj|_tjj�|_tj	dd�|_
tjj|_|j
|j�gtj_dS)N)rBr�r@rrr8rrr r!r"rr,r�cleanup)r<)rCr>r?r@}
szBasicConfigTest.setUpcsRx8tjjdd�D] }tjj|�|j�qWtt|�j�dS)N)rrr8rBrArBr�rF)r<rE)rCr>r?rF�
szBasicConfigTest.tearDowncCs_ttjd|j�tjj�tjj|j�|jtj	dd�<|j
tj_dS)Nr8)r�rrr8rrCrDr r"r!r,r)r<r>r>r?r��
s

zBasicConfigTest.cleanupcCs�tj�|jttjj�d�tjjd}|j|tj�|j|jt	j
�|j}|j|jj
tj�|j|j�|j|jtj�|jtjj|j�dS)NrZr)rr�rLrMrr8rr2r/r�r!rrL�_fmtZBASIC_FORMATr�r
ZPercentStylerr,)r<r�rr>r>r?�test_no_kwargs�
s
	zBasicConfigTest.test_no_kwargscCsht��Y}tjdtjdd�tjd�tjjd�|j|j�j	�d�WdQXdS)Nr/rr�zLog an errorrzERROR:root:Log an error)
rrr�r�r�r}r�rLrJ�strip)r<r�r>r>r?�test_strformatstyle�
s
z#BasicConfigTest.test_strformatstylecCsht��Y}tjdtjdd�tjd�tjjd�|j|j�j	�d�WdQXdS)Nr/rrzLog an errorrzERROR:root:Log an error)
rrr�r�r�r}r�rLrJr�)r<r�r>r>r?�test_stringtemplatestyle�
s
z(BasicConfigTest.test_stringtemplatestylecCs�dd�}tjdd�|jttjj�d�tjjd}|j|tj�tjdd�}|j|jj	|jj	�|j|jj
|jj
�|j|||d�dS)NcSs%|j�|j�tj|�dS)N)rAr�r�)�h1�h2rr>r>r?r��
s

z.BasicConfigTest.test_filename.<locals>.cleanup�filenameztest.logrZrrP)rr�rLrMrr8rr�r/�moder=r)r<r�r�rVr>r>r?�
test_filename�
szBasicConfigTest.test_filenamecCszdd�}tjdddd�tjjd}tjdd�}|j|jj|jj�|j|||d�dS)NcSs%|j�|j�tj|�dS)N)rAr�r�)r�r�rr>r>r?r��
s

z.BasicConfigTest.test_filemode.<locals>.cleanupr�ztest.log�filemode�wbr)	rr�rr8r�rLr/r�r)r<r�r�rVr>r>r?�
test_filemode�
szBasicConfigTest.test_filemodecCs�tj�}|j|j�tjd|�|jttjj	�d�tjj	d}|j
|tj�|j|j|�dS)Nr/rZr)
r-r.rrArr�rLrMrr8rr2r/)r<r/r�r>r>r?�test_stream�
szBasicConfigTest.test_streamcCs=tjdd�tjjdj}|j|jjd�dS)NrNr�r)rr�rr8rrLrLr�)r<rr>r>r?�test_format�
szBasicConfigTest.test_formatcCs:tjdd�tjjdj}|j|jd�dS)Nr
r�r)rr�rr8rrLr
)r<rr>r>r?�test_datefmt�
szBasicConfigTest.test_datefmtcCs=tjdd�tjjdj}|j|jtj�dS)Nrrr)rr�rr8rrrLrM)r<rr>r>r?�
test_style�
szBasicConfigTest.test_stylecCsrtjj}|jtjj|�tjdd�|jtjjd�tjdd�|jtjjd�dS)Nr�9�:)rrrrr0r�rL)r<�	old_levelr>r>r?�
test_level�
szBasicConfigTest.test_levelcCs�|j}tj�g}tj}|ttjddd|�|ttjddd|�|ttjd|d|�|ttjdtj�tjdddd�dS)Nr�ztest.logr/r8Zloglevelr�rP)r�rr2r�r!r�r�rm)r<r�r8r/r>r>r?�test_incompatible�
s		z!BasicConfigTest.test_incompatiblecCstj�tjtj�tj�g}tj�}|dj|�tjd|�|j|dtjj	d�|j|dtjj	d�|j|dtjj	d�|j
|dj�|j
|dj�|j|dj|�|j|dj|dj�dS)Nr�r8rrZ)rr2r�r�r4r6r�r"rr8r�r)r<r8r�r>r>r?�
test_handlerss	zBasicConfigTest.test_handlersNcs�g�tj����fdd�}t�td|�tt|�}|dk	re||d�n
|d��j�fifg�dS)NcsP��tjj}tjjd��jtjj|��j||f�dS)N�d)rrrr0rrh)rPr�r�)r��old_basic_configr<r>r?�my_basic_config"s
z2BasicConfigTest._test_log.<locals>.my_basic_configr�ztest me)rr�rr)rL)r<rrrr�r>)r�rr<r?r�s	
zBasicConfigTest._test_logcCs|jdtj�dS)Nr|)r�rrk)r<r>r>r?r�4szBasicConfigTest.test_logcCs|jd�dS)Nr�)r�)r<r>r>r?r�7szBasicConfigTest.test_debugcCs|jd�dS)Nr)r�)r<r>r>r?r�:szBasicConfigTest.test_infocCs|jd�dS)Nr~)r�)r<r>r>r?r�=szBasicConfigTest.test_warningcCs|jd�dS)Nr})r�)r<r>r>r?r�@szBasicConfigTest.test_errorcCs|jd�dS)Nr�)r�)r<r>r>r?r�CszBasicConfigTest.test_critical)r]r^r_r`r@rFr�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r�r�r>r>)rCr?r�y
s.	

r�csReZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Z�S)�LoggerAdapterTestcs�tt|�j�tjdd��t�|_tj|_|jj	|j�|j
|jj|j�|j
|jj��fdd�}|j
|�|j
tj
�tjd|jdd�|_dS)Ncs�tjdd�<dS)N)rr!r>)�old_handler_listr>r?r�Ssz(LoggerAdapterTest.setUp.<locals>.cleanupr�r_)rBrr@rr!r�r�rr�r:rrBrArDr{�adapter)r<r�)rC)rr?r@Is
zLoggerAdapterTest.setUpcCs�d}d}yddWnAtk
r[}z!|}|jj||j�WYdd}~XnX|jt|jj�d�|jjd}|j|jtj	�|j|j
|�|j|j|jf�|j|j|j
||jf�dS)Nztesting exception: %rrZr)�ZeroDivisionErrorrr�r�rLrMr�r�rrgr�rr^rC�
__traceback__)r<r��excrRr�r>r>r?�test_exceptionZs)z LoggerAdapterTest.test_exceptioncCs�d}|jj||j�|jt|jj�d�|jjd}|j|jtj�|j|j	|�|j|j
|jf�dS)Nzcritical test! %rrZr)rr�r�rLrMr�r�rrer�r)r<r�r�r>r>r?r�kszLoggerAdapterTest.test_criticalcCs`|jjjj}d|jjj_|jt|jjjd|�|j|jjd��dS)N�!r�� )rr�rr�rr�r��isEnabledFor)r<r�r>r>r?�test_is_enabled_forus
z%LoggerAdapterTest.test_is_enabled_forcCsm|j|jj��x$|jjD]}|jj|�q#W|j|jj��|j|jj��dS)N)r;rr7r�r8rBr�)r<r�r>r>r?�test_has_handlers|s
z#LoggerAdapterTest.test_has_handlers)r]r^r_r@rr�rrr>r>)rCr?rGs

rcs�eZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Z�S)�
LoggerTestcs�tt|�j�t�|_tjdd�|_|jj|j�|j	|jj
|j�|j	|jj�|j	tj�dS)Nr=Zblah)
rBrr@r�r�rrcr�r:rrBrArD)r<)rCr>r?r@�szLoggerTest.setUpcCs |jt|jjt��dS)N)r�rer�r0ri)r<r>r>r?�test_set_invalid_level�sz!LoggerTest.test_set_invalid_levelcCs�d}d}yddWnAtk
r[}z!|}|jj||j�WYdd}~XnX|jt|jj�d�|jjd}|j|jtj	�|j|j
|�|j|j|jf�|j|j|j
||jf�dS)Nztesting exception: %rrZr)rr�r�r�rLrMr�r�rrgr�rr^rCr	)r<r�r
rRr�r>r>r?r�s)zLoggerTest.test_exceptioncCs9ttdd��!|jt|jjdd�WdQXdS)Nr Trrztest message)rrr�rer�r|)r<r>r>r?�!test_log_invalid_level_with_raise�sz,LoggerTest.test_log_invalid_level_with_raisec
Cs0ttdd��|jjdd�WdQXdS)Nr Frrztest message)rrr�r|)r<r>r>r?�test_log_invalid_level_no_raise�sz*LoggerTest.test_log_invalid_level_no_raisecsig�t|tjd�fdd��|jjdd�|jt��d�|jd�d�dS)	N�print_stackcs�j|j��S)N)rhrJ)r�r�)r�r>r?r��sz=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>r�TrZzStack (most recent call last):
r)rr�	tracebackr�Z
findCallerrLrM)r<r>)r�r?� test_find_caller_with_stack_info�sz+LoggerTest.test_find_caller_with_stack_infoc
Cs�d}d}d}}}}}}}	tj|||||||||	�	}
xedt|
jj��D]J}id|6}|jt|jj|||||||d|d|	�	qkWdS)	Nz	my record�
r�r�z
some valuer_�sinfo)zmessagezasctime)	rZ_logRecordFactoryrQ�__dict__�keysr�r[r��
makeRecord)
r<r=rr�lnor�rr^r�r�rvr�r_r>r>r?�%test_make_record_with_extra_overwrite�s 
z0LoggerTest.test_make_record_with_extra_overwritecCs~d}d}d}}}}}}}	idd6}
|jj|||||||d|
d|	�}|jd|j�dS)Nz	my recordrz
some valueZ	valid_keyr_r)r�rr#r)r<r=rrrr�rr^r�rr_r�r>r>r?�(test_make_record_with_extra_no_overwrite�s
z3LoggerTest.test_make_record_with_extra_no_overwritecCsW|j|jj��x$|jjD]}|jj|�q#W|j|jj��dS)N)r;r�r7r8rBr�)r<r�r>r>r?r�szLoggerTest.test_has_handlerscCs/tjd�}d|_|j|j��dS)Nz
blah.childF)rrrmr�r7)r<Zchild_loggerr>r>r?�test_has_handlers_no_propagate�s	z)LoggerTest.test_has_handlers_no_propagatecCsW|jjj}d|jj_|jt|jjd|�|j|jjd��dS)N�r��)r�rr�rr�r�r)r<r�r>r>r?r�szLoggerTest.test_is_enabled_forcCs�tj�}|j|tj�|j|tjd��|j|tjd��|j|tjd�j�|j|tjd�j�|j|tjd�j�|j|tjd��|j|tjd�j�dS)Nrr�zfoo.bar�)rrr"r�parentZassertIsNot)r<rr>r>r?�test_root_logger_aliases�sz#LoggerTest.test_root_logger_aliasescCs0|jttjt�|jttjd�dS)Nsfoo)r�rerr�any)r<r>r>r?�test_invalid_names�szLoggerTest.test_invalid_names)r]r^r_r@rrrrrrr rr!rr&r(r>r>)rCr?r�s	

	rc@s:eZdZdZdd�Zdd�Zdd�ZdS)	�BaseFileTestz1Base class for handler tests that write log filescCsBtj|�tjdd�\}|_tj|�g|_dS)Nz.logztest_logging-2-)rr@r�r�rr�rA�rmfiles)r<rr>r>r?r@�s

zBaseFileTest.setUpcCsZx|jD]}tj|�q
Wtjj|j�rItj|j�ntj|�dS)N)r*r�r�r�r�rrrF)r<rr>r>r?rF�s
zBaseFileTest.tearDowncCs7|jtjj|�dd|�|jj|�dS)z7Assert a log file is there and register it for deletionr�zLog file %r does not existN)r;r�r�r�r*rh)r<r�r>r>r?�
assertLogFileszBaseFileTest.assertLogFileN)r]r^r_r`r@rFr+r>r>r>r?r)�sr)c@seZdZdd�ZdS)�FileHandlerTestcCs�tj|j�tj|jdd�}|j|j�|jtjj	|j��|j
tji��|j|j�|j
tjj	|j��|j�dS)Nr�T)r�r�rrr�r�r/r�r�r�r�r�r�r;rA)r<�fhr>r>r?�
test_delayszFileHandlerTest.test_delayN)r]r^r_r.r>r>r>r?r,sr,c@s^eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zedd��Z	d
S)�RotatingFileHandlerTestc	Cs+tjdtjdd|j�ddd�S)NrurWrZ)rr}r1r\)r<r>r>r?�next_recsz RotatingFileHandlerTest.next_reccCs?tjj|jdd�}|j|jd��|j�dS)N�maxBytesr)rr8�RotatingFileHandlerrr��shouldRolloverrA)r<�rhr>r>r?�test_should_not_rolloversz0RotatingFileHandlerTest.test_should_not_rollovercCsEtjj|jdd�}|j|j|j���|j�dS)Nr1rZ)rr8r2rr;r3r0rA)r<r4r>r>r?�test_should_rolloversz,RotatingFileHandlerTest.test_should_rollovercCsFtjj|j�}|j|j��|j|j�|j�dS)N)rr8r2rr�r0r+rA)r<r4r>r>r?�test_file_created"sz)RotatingFileHandlerTest.test_file_createdcCs�dd�}tjj|jdddd�}||_|j|j��|j|j�|j|j��|j||jd��|j|j��|j||jd��|jt	j
j||jd	���|j�dS)
NcSs|dS)Nz.testr>)r=r>r>r?�namer+sz>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namer�backupCountr�r1rZz.1z.2z.3)
rr8r2rr8r�r0r+r�r�r�r�rA)r<r8r4r>r>r?�test_rollover_filenames*s		&z/RotatingFileHandlerTest.test_rollover_filenamescCs<dd�}dd�}tjj|jdddd�}||_||_|j�}|j|�|j|j�|j�}|j|�||jd	�}|j|�t	j
}t|d
��B}|j�}	t
j|	�}
|j|
jd�|j|�WdQX|j|j��||jd�}|j|�t|d
��B}|j�}	t
j|	�}
|j|
jd�|j|�WdQX|j|j��||jd�}t|d
��B}|j�}	t
j|	�}
|j|
jd�|j|�WdQX|jt	jj||jd
���|j�dS)NcSs|dS)Nz.gzr>)r=r>r>r?r8;sz3RotatingFileHandlerTest.test_rotator.<locals>.namercSslt|d��J}|j�}tj|d�}t|d��}|j|�WdQXWdQXtj|�dS)N�rbror�)r�rS�zlib�compressrr�r�)�source�destZsfr�
compressedZdfr>r>r?�rotator>sz5RotatingFileHandlerTest.test_rotator.<locals>.rotatorr9r�r1rZz.1r;�asciiz.2z.3)rr8r2rrAr8r0r�r+r��linesepr�rSr<Z
decompressrLr�r�r�r�r�rA)r<r8rAr4Zm1Zm2r�newliner�r@rr>r>r?�test_rotator9sB			


	&
&&&z$RotatingFileHandlerTest.test_rotatorN)
r]r^r_r0r5r6r7r:rrEr>r>r>r?r/sr/c@s@eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�TimedRotatingFileHandlerTestc
s+tjj|jddd�}tjd�}|j|�tjidd6�}|j|�|j|j�t	j
d�tjidd6�}|j|�|j�d	}tjj
�}d}xlt|�D]^}|tjd|�}	|j|	jd
��tjj��}|r�|jj��Pq�q�Wd|}
|stjj|j�\}��fdd�tj|�D�}td|jd�dtj�td|dtj�x\|D]Q}
td|
�tjj||
�}t|d��}t|j��WdQXq�Wn|j|d|
�dS)N�Sr9rZz%(asctime)s %(message)sztesting - initialr�g�������?ztesting - after delayFr�<�secondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondscs%g|]}|j��r|�qSr>)rG)rqr�)rr>r?rs�s	z>TimedRotatingFileHandlerTest.test_rollover.<locals>.<listcomp>z
Test time: %sz%Y-%m-%d %H-%M-%Sr�zThe only matching files are: %szContents of %s:r�i,)rr8�TimedRotatingFileHandlerrr4r6r�r�r+rr	rAr�r�r�	timedeltaZstrftimer�r�r�r*rhr��listdirrr�r!r�r�rSr;)r<r-ZfmtZr1Zr2�foundr��GO_BACK�secs�prevr�Zdn�filesr�r�Ztfr>)rr?�
test_rolloverhsB	





" 
z*TimedRotatingFileHandlerTest.test_rollovercCss|j}|ttjj|jddd�|ttjj|jddd�|ttjj|jddd�dS)N�Xr�T�WZW7)r�r�rr8rJr)r<r�r>r>r?�test_invalid�s	z)TimedRotatingFileHandlerTest.test_invalidcCs�d}tjddd�}tjj|jdddddddd	d
|�}zN|j|�}|j||d�|j|d�}|j||d�Wd|j�XdS)Nr��when�MIDNIGHT�intervalrZr9r�T�atTimerHr�$i�i��iiжipi@�)	r�rrr8rJr�computeRolloverrLrA)r<�currentTimerZr4rUr>r>r?�"test_compute_rollover_daily_attime�s	!	z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec	
Cs�ttj��}||d}tjddd�}tj|�j}x_td�D]Q}tjj|j	dd|ddd	dd
dd|�}z||kr�d||}n
||}|d9}|d7}||7}|j
|�}||krtdtj�tdt
��n|j||�||krB|d7}n|j
|d�}||kr�tdtj�tdt
��n|j||�Wd|j�XqTWdS)Ni�QrVr�rWzW%drYrZr9r�TrZ�rHzfailed in timezone: %dzlocal vars: %sri�i�Qi�i���i`'i�:	iiж)r�rr�r�Ztm_wdayrrr8rJrr\rZtimezone�localsrLrA)	r<r]ZtodayrZZwdayZdayr4rVrUr>r>r?�#test_compute_rollover_weekly_attime�s8	%	




z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimeN)r]r^r_rRrUr^rcr>r>r>r?rFfs*	rFcKstj|�tjdd�S)NrIrZ)r�rK)r�r>r>r?rO�srOrG�MrH�H�Dr`rXZW0ZdaysrZhourscCs�tjj|jd|dddddd�}d}|j|�}||kr�|d	kr�y	|jrxtj|�}ntj|�}|d
}|d}|d}	tjj	|d
|d
|	}
||
}t
d||jfdtj�t
d|dtj�t
d|dtj�t
d|	dtj�t
d|
dtj�t
d|dtj�Wq�t
k
r�t
dtj�ddtj�Yq�Xq�n|j||�|j�dS)NrWrYrZr9rr�TgrXrOrrrHz
t: %s (%s)r�zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz
result: %sz exception in diagnostic code: %s)rr8rJrr\r�rr�Z	localtimeZ	_MIDNIGHTrr�r!rr^rLrA)r<rW�expr4r]rUr:ZcurrentHourZ
currentMinuteZ
currentSecondr�r�r>r>r?�test_compute_rollover�s6	$	



 
,rhztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c@seZdZdd�ZdS)�NTEventLogHandlerTestcCsud}tjd|�}tj|�}ytjjd�}WnLtjk
r�}z)|jdkrvt	j
d��n�WYdd}~XnXtjidd6�}|j|�|j
�|j|tj|��tjtjB}d}d}	tj|||	�}
xN|
D]F}|jdkr%q
ntj||�}|d	krIq
nd
}Pq
Wd|	}|j|d|�dS)NZApplicationZtest_loggingrz#Insufficient privileges to run testzTest Log Messager�FrzTest Log Message
Tz3Record not found in event log, went back %d records)�win32evtlogZOpenEventLogZGetNumberOfEventLogRecordsrr8ZNTEventLogHandler�
pywintypesr}ZwinerrorrZSkipTestr�r�rAZ
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceName�win32evtlogutilZSafeFormatMessager;)r<ZlogtypeZelhZnum_recsrErRr��flagsrMrNZeventsr�r>r>r?rgs8




z NTEventLogHandlerTest.test_basicN)r]r^r_rgr>r>r>r?risri�LC_ALLrc&Csztttttttttt	t
ttt
ttttttttttttttttttt t!t"t#t$t%�%dS)N)&rrar�r�r�riryr�r�r�r�r�rr]r�r�rrsrlryr�r�r�rrr`r,r/r�r�r�r�r�rirFr�r�r�r>r>r>r?�	test_main)s										ro�__main__)�r`rZlogging.handlersZlogging.configr�r�r�r�r-r�rAr�rzr
rGZselectr,r�r�r�Ztest.script_helperrZtest.supportrrrrrrr	r
rrzrrr�r�rZasynchatr;�errnoZhttp.serverrr
r)Zurllib.parserrZsocketserverrrrrrrr�rjrlrkr<ZTestCaserrar�ZSILENTr�ZTERSEZEFFUSIVEr�r�Z	TALKATIVEr�Z
CHATTERBOXZBORINGrr�r�r�r�r�r�r�rirr2rrr*r'r>rFrTrXr�r]r_rr`rir4rwryr�r�r�r�r�r�r�r�r�r�r�rrr
rr]rlr}rrrsryrKr�Ztzinfor�r�r�r�r�r�r�r�r�rr�r�r�r�r�rrr)r,r/rFrOrWrgrhr�riror]r>r>r>r?�<module>s@@2
(

f�F
YnN5)/0�pL58L41(����#-		Y$WX6�?jTn	
(!%