Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 3.145.93.203
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : test_logging.cpython-310.pyc
o

ab��@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZddlmZddlmZdd	l m!Z!ddl"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'dd
l(m)Z)m*Z*ddl+m,Z,m-Z-ddl.m/Z/m0Z0m1Z1m2Z2e&�3��e&�4d
e5�ddl6Z6ddl7Z7Wd�n1s�wYzddl8Z8ddl9Z9ddl:Z:Wne;y�dZ8Z9Z:Ynwzddl<Z<Wn
e;�yYnwGdd�de%j=�Z>Gdd�de>�Z?Gdd�de>�Z@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJeKeJeAd�ZLeAdeBd eCd!eDd"eEd#eFd$eGd%eHd&eId'eJd(i
ZMGd)d*�d*ejN�ZOGd+d,�d,ejN�ZPGd-d.�d.e>�ZQGd/d0�d0e>�ZRGd1d2�d2eS�ZTGd3d4�d4ejU�ZVGd5d6�d6eS�ZWGd7d8�d8e>�ZXGd9d:�d:e7jY�ZZGd;d<�d<eS�Z[Gd=d>�d>e[e)�Z\Gd?d@�d@e[e1�Z]GdAdB�dBe[e/�Z^e_edC��r�GdDdE�dEe]�Z`GdFdG�dGe^�ZaGdHdI�dIe>�ZbGdJdK�dKe>�ZcGdLdM�dMejd�ZeGdNdO�dOe>�ZfGdPdQ�dQe>�ZgdRdS�Zhe%�ie_edC�dT�GdUdV�dVeg��ZjGdWdX�dXe>�Zke%�ie_edC�dT�GdYdZ�dZek��ZlGd[d\�d\e>�Zme%�ie_edC�dT�Gd]d^�d^em��Zne%�iejod_�Gd`da�daem��ZpGdbdc�dce>�ZqGddde�dee>�ZrGdfdg�dge>�ZsGdhdi�die>�Ztd�djdk�ZuGdldm�dm�Zvdndo�ZwGdpdq�dqejU�ZxGdrds�dse>�ZyGdtdu�due>�ZzGdvdw�dwe>�Z{Gdxdy�dyej|�Z}Gdzd{�d{e>�Z~Gd|d}�d}e>�Ze_ej�d~��r�ddl�Z�ddl�m�Z�Gd�d��d�e>�Z�e��d�Z�Gd�d��d�ej��Z�e��Z�Gd�d��d��Z�Gd�d��d�e%j=e��Z�Gd�d��d�ej��Z�Gd�d��d�e%j=�Z�Gd�d��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>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�d�d�d�d�d�d�e�d�d�d��ffD]\Z�Z�e�e�fd�d��Z�e�e�d�e�e���q�e%�ie8d��Gd�d��d�e>��Z�Gd�d��d�e%j=�Z�d�d��Z�e�d�k�r�e%���dSdS)�zoTest harness for the logging module. Run all tests.

Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.
�N)�assert_python_ok�assert_python_failure)�support)�	os_helper)�
socket_helper)�threading_helper)�warnings_helper)�TestHandler)�
HTTPServer�BaseHTTPRequestHandler)�urlparse�parse_qs)�ThreadingUDPServer�DatagramRequestHandler�ThreadingTCPServer�StreamRequestHandler�ignorec@s>eZdZdZdZdZdZdd�Zdd�Zdd
d�Z	dd
�Z
d	S)�BaseTestzBase class for logging tests.z&%(name)s -> %(levelname)s: %(message)sz^([\w.]+) -> (\w+): (\d+)$rcCs�t��|_t��jj}t��z;tj�	�|_
tjdd�|_|�	�|_
}tj�	�|_tj�	�|_i|_}|D]}t||dd�||<q8Wt��nt��wt�d�|_t�d�|_t�d�|_|j��|_t��|_|j�tj�t�|j�|_ t�!|j"�|_#|j �$|j#�|j�%�r�|jj&|jj&}t'd|��|j�%�r�|jj&|jj&}t'd|��|j�(|j �|�)|j�%��|�)|j�%��dS)zxSetup the default logging stream to an internal StringIO instance,
        so that we can examine log output as we want.N�disabledu«×»uĿÖG�zUnexpected handlers: %s)*rZthreading_setup�_threading_key�logging�	getLogger�manager�
loggerDict�_acquireLock�	_handlers�copy�saved_handlers�_handlerList�saved_handler_list�
saved_loggers�_nameToLevel�saved_name_to_level�_levelToName�saved_level_to_name�
logger_states�getattr�_releaseLock�logger1�logger2�root_logger�getEffectiveLevel�original_logging_level�io�StringIO�stream�setLevel�DEBUG�
StreamHandler�	root_hdlr�	Formatter�
log_format�root_formatter�setFormatter�hasHandlers�handlers�AssertionError�
addHandler�
assertTrue)�selfZlogger_dictr!r&�nameZhlist�r@�:/usr/local/python-3.10/lib/python3.10/test/test_logging.py�setUpVsD


��


zBaseTest.setUpcCs>|j��|j�|j�|jjr$|jjd}|j�|�|��|jjs|j�|j�t�	�z^tj
��tj
�|j
�tj��tj�|j�tj��tj�|j�|jtjdd�<t��j}d|_|j}|��|�|j�|j}|jD]}||dur�|||j|_qwWt��nt��w|��tj|j�dS)zJRemove our logging stream, and restore the original logging
        level.rN) r0�closer+�
removeHandlerr4r:r1r-rrr$�clear�updater%r"r#rrr rrr�disablerr!r&rr(Z
doCleanupsrZthreading_cleanupr)r>�hrrr&r?r@r@rA�tearDown�s>
�




��zBaseTest.tearDownNc	Cs�|p|j}t�|p|j�}|����}|�t|�t|��t||�D]\}}|�	|�}|s4|�
d|�|�t|���|�q"|�
�}|rN|�
d|�dSdS)z�Match the collected log lines against the regular expression
        self.expected_log_pat, and compare the extracted group values to
        the expected_values list of tuples.z*Log line does not match expected pattern:
z'Remaining output at end of log stream:
N)r0�re�compile�expected_log_pat�getvalue�
splitlines�assertEqual�len�zip�search�fail�tuple�groups�read)	r>Zexpected_valuesr0�patZactual_lines�actual�expected�match�sr@r@rA�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@rA�next_message�s
zBaseTest.next_message�NN)�__name__�
__module__�__qualname__�__doc__r6rLr^rBrIr\r`r@r@r@rArNs*
"rc@sHeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)�BuiltinLevelsTestz*Test builtin levels and their inheritance.cCs"|j}t�d�}|�tj�t�t�d�i�}|�tj�t�d�}|�tj�|�tj	|��|�
|��|�tj	|��|�
|��|�|��|�|��|�tj	|��|�
|��|�|��|�|��|�
|��|�|��|�|��|�
|��|�
|��|�gd��dS)N�ERR�INF�DEB))rg�CRITICAL�1)rg�ERROR�2)rhrj�3)rhrl�4)rh�WARNING�5)rh�INFO�6)rirj�7)rirl�8)rirp�9)rirr�10)rir2�11)r`rrr1rl�
LoggerAdapterrrr2�logrj�error�warning�info�debugr\)r>�mrgrhrir@r@rA�	test_flat�s.

zBuiltinLevelsTest.test_flatcCs�|j}t�d�}|�tj�t�d�}|�tj�|�tj|��|�|��|�	|��|�
|��|�|��|�ddg�dS)Nrh�INF.ERR)r�rjrk)r�rlrm�
r`rrr1rrrlrzrjr{r|r}r~r\)r>rrh�INF_ERRr@r@rA�test_nested_explicit�s


�z&BuiltinLevelsTest.test_nested_explicitcCs�|j}t�d�}|�tj�t�d�}|�tj�t�d�}t�d�}t�d�}|�tj|��|�|��|�	|��|�
|��|�tj|��|�|��|�|��|�	|��|�
|��|�|��|�gd��dS)Nrhr��	INF.UNDEF�
INF.ERR.UNDEF�UNDEF))r�rjrk)r�rlrm)r�rprn)r�rrro)r�rjrq)r�rlrsr�)r>rrhr�Z	INF_UNDEFZ
INF_ERR_UNDEFr�r@r@rA�test_nested_inheriteds&




z'BuiltinLevelsTest.test_nested_inheritedcCs�|j}t�d�}t�d�}t�d�}|�tj�|�tj|��|�|��|�tj|��|�|��|�|��|�|��|�	gd��dS)Nrh�INF.BADPARENT.UNDEF�
INF.BADPARENT))r�rjrk)r�rrrm)r�rjrn)r�rrro)
r`rrr1rrrz�FATALr}r~r\)r>rrhZ
GRANDCHILDZCHILDr@r@rA�test_nested_with_virtual_parent's


z1BuiltinLevelsTest.test_nested_with_virtual_parentcCs,|�t�d�tj�|�t�tj�d�dS)z&See issue #22386 for more information.rrN)rOr�getLevelNamerrr_r@r@rA�test_regression_22386Asz'BuiltinLevelsTest.test_regression_22386cCst�d�}|�|tj�dS)Nr�)rr�rOr�)r>�fatalr@r@rA�test_issue27935F�
z!BuiltinLevelsTest.test_issue27935cCs`t�tjd�|�tjtjd�|�t�tj�d�|�t�tj�d�|�t�d�tj�dS)z&See issue #29220 for more information.rrr�NOTSETN)r�addLevelNamerr�
addCleanuprOr�r�r_r@r@rA�test_regression_29220Js
z'BuiltinLevelsTest.test_regression_29220N)rbrcrdrer�r�r�r�r�r�r�r@r@r@rArf�s/#rfc@�(eZdZdZdd�Zdd�Zdd�ZdS)	�BasicFilterTestzTest the bundled Filter class.c	Cs�t�d�}|jjd}zD|�|�t�d�}t�d�}t�d�}t�d�}|�|���|�|���|�|���|�|���|�ddg�W|�	|�dS|�	|�w)N�	spam.eggsr�spam�spam.eggs.fish�spam.bakedbeans�r�rrrm�r�rrrn)
r�Filterr+r:�	addFilterrr}r`r\�removeFilter)r>Zfilter_�handlerr��	spam_eggs�spam_eggs_fish�spam_bakedbeansr@r@rA�test_filterVs"





�zBasicFilterTest.test_filterc	Cs�dd�}|jjd}zD|�|�t�d�}t�d�}t�d�}t�d�}|�|���|�|���|�|���|�|���|�dd	g�W|�|�dS|�|�w)
NcSs&|j�d�}d�|dd��}|dkS)N�.�r�)r?�split�join)�record�parts�prefixr@r@rA�
filterfuncrsz8BasicFilterTest.test_callable_filter.<locals>.filterfuncrr�r�r�r�r�r�)	r+r:r�rrr}r`r\r�)r>r�r�r�r�r�r�r@r@rA�test_callable_filterns"




�z$BasicFilterTest.test_callable_filtercCs*t��}t�ddi�}|�|�|��dS)Nr?r�)rr��
makeLogRecordr=�filter)r>�f�rr@r@rA�test_empty_filter�sz!BasicFilterTest.test_empty_filterN)rbrcrdrer�r�r�r@r@r@rAr�Rs
r��x�w�v�u�t�s�r�q�p�or]�Silent�Taciturn�Terse�Effusive�Sociable�Verbose�	TalkativeZ	Garrulous�
Chatterbox�Boringc@�eZdZdZdd�ZdS)�GarrulousFilterz)A filter which blocks garrulous messages.cCs
|jtkS�N)�levelno�	GARRULOUS�r>r�r@r@rAr���
zGarrulousFilter.filterN�rbrcrdrer�r@r@r@rAr���r�c@r�)�VerySpecificFilterz5A filter which blocks sociable and taciturn messages.cCs|jttfvSr�)r��SOCIABLE�TACITURNr�r@r@rAr���zVerySpecificFilter.filterNr�r@r@r@rAr��r�r�c@�<eZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
S)�CustomLevelsAndFiltersTestz@Test various filtering possibilities with custom logging levels.�^[\w.]+ -> (\w+): (\d+)$cCs,t�|�t��D]
\}}t�||�q	dSr�)rrB�my_logging_levels�itemsrr�)r>�k�vr@r@rArB�s
�z CustomLevelsAndFiltersTest.setUpcCstD]
}|�||���qdSr�)�LEVEL_RANGErzr`)r>�loggerZlvlr@r@rA�log_at_all_levels�s�z,CustomLevelsAndFiltersTest.log_at_all_levelscCs*|j�t�|�|j�|�gd��dS)N)�r�rq�r�rs�r�rt�r�ru�r�rv�r�rw)r+r1�VERBOSEr�r\r_r@r@rA�test_logger_filter�sz-CustomLevelsAndFiltersTest.test_logger_filterc	Cs^|jjd�t�z|�|j�|�gd��W|jjd�tj�dS|jjd�tj�w)Nr)r�r�r�r�r�)r+r:r1r�r�r\rr�r_r@r@rA�test_handler_filter�s
.z.CustomLevelsAndFiltersTest.test_handler_filterc	Cs�|jjd}d}t�}|�|�z7|�|j�gd�}|�|�t�}|j�|�|�|j�|�|gd��W|rA|j�|�|�|�dS|rP|j�|�|�|�w)Nr)	)r�rk)r�rm)r�ror�r�r�r�r�r�))r�rx)r�Z12)r�Z14)r�Z15)r�Z17)r�Z18)r�Z20)r+r:r�r�r�r\r�r�)r>r�Zspecific_filterZgarrZfirst_linesr@r@rA�test_specific_filters�s$

�z0CustomLevelsAndFiltersTest.test_specific_filtersN)
rbrcrdrerLrBr�r�r�r�r@r@r@rAr��sr�c@sZeZdZdd�Zdd�Zdd�Ze�ej	dkd�d	d
��Z
e�eed�d�d
d��ZdS)�HandlerTestcCsDt��}d|_|�|jd�d|_|�|jd�|�t|jd�dS)N�genericZanothergeneric)r�Handlerr?rO�assertRaises�NotImplementedError�emit�r>rHr@r@rA�	test_nameszHandlerTest.test_namec
Cs�tjdvr�dD]t}t��\}}t�|�|st�|�tjj	|ddd�}|rb|j
|j}}|�|d�|�|d�t�
ddi�}|�|�t�|�|�tj�|��|�|�|�tj�|��n|�|j
d�|�|jd�|��|r{t�|�qtjd	kr�d
}nd}ztj�|�}|�|j|j�|�|j�|��Wn	ty�YnwdD]}	|	d
kr�|�ttjjdd|	�q�tj�dd|	�}|��q�tj�d�}t�
i�}|�|�|��|��tj�d�}|�|�|��|��dS)N��linux�darwin)TF�utf-8T��encoding�delay����msgZTestr�z/var/run/syslogz/dev/log)�GET�POST�PUTr��	localhostz/logrr])�sys�platform�tempfile�mkstemp�osrC�unlinkrr:�WatchedFileHandler�dev�inorOr��handle�assertFalse�path�existsr=�
SysLogHandlerZfacilityZLOG_USERZ
unixsocket�OSErrorr��
ValueError�HTTPHandlerZBufferingHandlerZshouldFlush)
r>Zexisting�fd�fnrHrrr�Zsockname�methodr@r@rA�test_builtin_handlers's`






�
��

z!HandlerTest.test_builtin_handlerscCs�t��\}}t�|�t�|�t�|�}tj|dfftj	j
|dfftj	j|dfff}tj
dvr;|tj	j|dfff7}|D]\}}||ddi�}|�tj�|��|��t�|�q=dS)zs
        Test that Path objects are accepted as filename arguments to handlers.

        See Issue #27493.
        �w�arHr�r�r�N)r�rrrCr�pathlib�Pathr�FileHandlerr:�RotatingFileHandler�TimedRotatingFileHandlerr�r�rr=rr	)r>rrZpfn�cases�cls�argsrHr@r@rA�test_path_objects]s 


�
�zHandlerTest.test_path_objects�ntz/WatchedFileHandler not appropriate for Windows.c
sD�fdd�}d}d}d�_d�_dD]�}t�dd�\}}t�|�tj|||fd�}d|_|�	�t
jj|d	|d
�}t
�
d�}	|�|	�zFt|�D],}
t�d�t
�d
di�}zt���_|�|�WqItyutd�j�jf��wW|��|��tj�|�r�t�|�q|��|��tj�|�r�t�|�wwdS)Nc	sTt|�D]#}zt�|�t���_Wn	tyYnwt�dt�dd��qdS)Ng����Mbp?r�)	�rangerr�time�
deletion_timer�sleep�random�randint)ZfnameZtries�_r_r@rA�remove_loopws
��z*HandlerTest.test_race.<locals>.remove_loopi��FT�.logztest_logging-3-��targetrTr�r�z'%(asctime)s: %(levelname)s: %(message)s�{�G�zt?r�ZtestingzDeleted at %s, opened at %s)Zhandle_timer!r�rrrC�	threading�Thread�daemon�startrr:rr5r8rr r"r�r�	Exception�printr�rr	r)r>r&Z	del_countZ	log_countr�rrZremoverrHr�r%r�r@r_rA�	test_racetsR	




����
����zHandlerTest.test_race�forkzTest requires os.fork().c	s&Gdd�dtj�}|�ttj�d�|��|��jjj�d�_	|�
ttj�d�|�
ttj�d�t�d�}|�
��|�tj�t���t������fdd�}tj|d	d
�}|�����t��}|dkr}z
|�d�Wt�d�dSt�d�w|�d����|��tj|dd
�dS)z>Ensure child logging locks are not held; bpo-6721 & bpo-36533.c�$eZdZ�fdd�Zdd�Z�ZS)zAHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandlercs&t���tjtdddd�d�|_dS)Nz	/dev/nullZwtr��r��r0)�super�__init__rr3�open�sub_handlerr_��	__class__r@rAr8�s
�zJHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.__init__cSs4|j��z|j�|�W|j��dS|j��wr�)r:�acquirer��releaser�r@r@rAr��s
zFHandlerTest.test_post_fork_child_no_deadlock.<locals>._OurHandler.emit�rbrcrdr8r��
__classcell__r@r@r;rA�_OurHandler�srArz*because we need at least one for this testr]� test_post_fork_child_no_deadlockcsTt��z ���z�����d�W���n���wWt��dSt��w)N��?)rrr=�set�waitr>r(r@�Z+fork_happened__release_locks_and_end_threadZlocks_held__ready_to_forkZrefed_hr@rA�lock_holder_thread_fn�s
zKHandlerTest.test_post_fork_child_no_deadlock.<locals>.lock_holder_thread_fnz,test_post_fork_child_no_deadlock lock holder)r*r?z#Child process did not deadlock. \o/z&Parent process returned from fork. \o/)�exitcodeN)rr�rOrPrr�r:r0rCr?�
assertGreater�_at_fork_reinit_lock_weaksetrr<r1r2r,�Eventr-r/rErr3r}�_exitrDr�rZwait_process)r>rAZtest_loggerrGZlock_holder_thread�pidr@rFrArB�s8


�
z,HandlerTest.test_post_fork_child_no_deadlockN)
rbrcrdr�rr�unittestZskipIfrr?r2�hasattrrBr@r@r@rAr�s6
0r�c@�eZdZdd�ZdS)�	BadStreamcCstd��)N�deliberate mistake)�RuntimeError�r>�datar@r@rA�write��zBadStream.writeN)rbrcrdrVr@r@r@rArQ��rQc@rP)�TestStreamHandlercC�
||_dSr�)�error_recordr�r@r@rA�handleError�r�zTestStreamHandler.handleErrorN)rbrcrdr\r@r@r@rArY�rXrYc@seZdZejZdZdS)�StreamWithIntNamer�N)rbrcrdrr��levelr?r@r@r@rAr]�sr]c@�$eZdZdd�Zdd�Zdd�ZdS)�StreamHandlerTestcCs�tt��}t�i�}tj}ze|�|�|�|j|�t�t��}t	�
��}|�|�d}|�||���Wd�n1s>wYdt_t	�
��}|�|�|�
d|���Wd�n1sbwYW|t_dSW|t_dS|t_w)Nz"
RuntimeError: deliberate mistake
Fr)rYrQrr��raiseExceptionsr�assertIsr[r3r�captured_stderr�assertInrMrO)r>rHr�Z	old_raise�stderrr�r@r@rA�test_error_handling�s(




�

�
�z%StreamHandlerTest.test_error_handlingcCsVt��}t��}|�|�}|�|tj�|�|�}|�||�|�|�}|�|�dS)z3
        Test setting the handler's stream
        N)	rr3r.r/�	setStreamrbr�re�assertIsNone)r>rHr0�oldrXr@r@rA�test_stream_settings


z%StreamHandlerTest.test_stream_settingcCs t�t��}|�t|�d�dS)Nz<StreamHandler 2 (NOTSET)>)rr3r]rO�reprr�r@r@rA�'test_can_represent_stream_with_int_name"sz9StreamHandlerTest.test_can_represent_stream_with_int_nameN)rbrcrdrfrjrlr@r@r@rAr`�sr`c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�TestSMTPServera
    This class implements a test SMTP server.

    :param addr: A (host, port) tuple which the server listens on.
                 You can specify a port value of zero: the server's
                 *port* attribute will hold the actual port number
                 used, which can be used in client connections.
    :param handler: A callable which will be called to process
                    incoming messages. The handler will be passed
                    the client address tuple, who the message is from,
                    a list of recipients and the message data.
    :param poll_interval: The interval, in seconds, used in the underlying
                          :func:`select` or :func:`poll` call by
                          :func:`asyncore.loop`.
    :param sockmap: A dictionary which will be used to hold
                    :class:`asyncore.dispatcher` instances used by
                    :func:`asyncore.loop`. This avoids changing the
                    :mod:`asyncore` module's global state.
    cCsBtjj||d|dd�|j��d|_||_d|_d|_||_	dS)NT)�mapZdecode_datar]F)
�smtpd�
SMTPServerr8�socket�getsockname�port�_handler�_thread�_quit�
poll_interval)r>�addrr�rw�sockmapr@r@rAr8>s�
zTestSMTPServer.__init__cCs|�||||�dS)aI
        Delegates to the handler passed in to the server's constructor.

        Typically, this will be a test case method.
        :param peer: The client (host, port) tuple.
        :param mailfrom: The address of the sender.
        :param rcpttos: The addresses of the recipients.
        :param data: The message.
        N)rt)r>�peer�mailfrom�rcpttosrUr@r@rA�process_messageGs
zTestSMTPServer.process_messagecC�,tj|j|jfd�|_}d|_|��dS)zG
        Start the server running on a separate daemon thread.
        r)TN�r,r-�
serve_foreverrwrur.r/�r>�tr@r@rAr/S�
�zTestSMTPServer.startcCs&|jstj||jdd�|jrdSdS)a*
        Run the :mod:`asyncore` loop until normal termination
        conditions arise.
        :param poll_interval: The interval, in seconds, used in the underlying
                              :func:`select` or :func:`poll` call by
                              :func:`asyncore.loop`.
        r])rn�countN)rv�asyncoreZloop�_map�r>rwr@r@rAr�\s�zTestSMTPServer.serve_forevercCs4d|_t�|j�d|_|��tj|jdd�dS)zr
        Stop the thread by closing the server instance.
        Wait for the server thread to terminate.
        TN)rnZ
ignore_all)rvr�join_threadrurCr�Z	close_allr�r_r@r@rA�stopgs
zTestSMTPServer.stopN)	rbrcrdrer8r}r/r�r�r@r@r@rArm)s		rmcs8eZdZdZdd�Zdd�Z�fdd�Zdd	�Z�ZS)
�ControlMixina

    This mixin is used to start a server on a separate thread, and
    shut it down programmatically. Request handling is simplified - instead
    of needing to derive a suitable RequestHandler subclass, you just
    provide a callable which will be passed each received request to be
    processed.

    :param handler: A handler callable which will be called with a
                    single parameter - the request - in order to
                    process the request. This handler is called on the
                    server thread, effectively meaning that requests are
                    processed serially. While not quite web scale ;-),
                    this should be fine for testing applications.
    :param poll_interval: The polling interval in seconds.
    cCs d|_||_||_t��|_dSr�)rurwrtr,rK�ready)r>r�rwr@r@rAr8�szControlMixin.__init__cCr~)zI
        Create a daemon thread to run the server, and start it.
        r)TNrr�r@r@rAr/�r�zControlMixin.startcs|j��tt|��|�dS)z^
        Run the server. Set the ready flag before entering the
        service loop.
        N)r�rDr7r�r�r�r;r@rAr��s
zControlMixin.serve_forevercCs:|��|jdurt�|j�d|_|��|j��dS)zK
        Tell the server thread to stop, and wait for it to do so.
        N)�shutdownrurr��server_closer�rEr_r@r@rAr��s
zControlMixin.stop)	rbrcrdrer8r/r�r�r@r@r@r;rAr�ss	r�c@s&eZdZdZ		d	dd�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.
    rCFNcs<G��fdd�dt��t�||��t�|||�||_dS)Ncs2eZdZddd�Zdd�Z���fdd�Z�ZS)	z=TestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandlerNcSs|�d�r|jSt|��)NZdo_)�
startswith�process_request�AttributeError)r>r?�defaultr@r@rA�__getattr__�s
zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.__getattr__cS�|j�|�dSr���serverrtr_r@r@rAr���zMTestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.process_requestcs$�rt�|�j|g|�R�dSdSr�)r7�log_message)r>�formatr)�DelegatingHTTPRequestHandlerr<rzr@rAr��s����zITestHTTPServer.__init__.<locals>.DelegatingHTTPRequestHandler.log_messager�)rbrcrdr�r�r�r@r@�r�rzr;rAr��s
r�)rr
r8r��sslctx)r>rxr�rwrzr�r@r�rAr8�s

zTestHTTPServer.__init__c
Csdz|j��\}}|jr|jj|dd�}W||fSW||fSty1}z	tj�d|��d}~ww)NT)Zserver_sidezGot an error:
%s
)rq�acceptr�Zwrap_socketrr�rerV)r>�sockrx�er@r@rA�get_request�s����zTestHTTPServer.get_request)rCFN)rbrcrdrer8r�r@r@r@rAr��s

�r�cs2eZdZdZdZ		ddd�Z�fdd�Z�ZS)	�
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.
    TrCcCs2Gdd�dt�}t�||||�t�|||�dS)Nc@rP)z;TestTCPServer.__init__.<locals>.DelegatingTCPRequestHandlercSr�r�r�r_r@r@rAr�r�zBTestTCPServer.__init__.<locals>.DelegatingTCPRequestHandler.handleN)rbrcrdrr@r@r@rA�DelegatingTCPRequestHandler��r�)rrr8r�)r>rxr�rw�bind_and_activater�r@r@rAr8�s

�zTestTCPServer.__init__c�"tt|���|j��d|_dS�Nr])r7r��server_bindrqrrrsr_r;r@rAr���zTestTCPServer.server_bind�rCT)rbrcrdreZallow_reuse_addressr8r�r@r@r@r;rAr��s
�
r�cs:eZdZdZ		d
dd�Z�fdd�Z�fdd	�Z�ZS)�
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.
    rCTcs<G�fdd�dt��t�||�|�t�|||�d|_dS)Ncs&eZdZdd�Z��fdd�Z�ZS)z;TestUDPServer.__init__.<locals>.DelegatingUDPRequestHandlercSr�r�r�r_r@r@rArr�zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.handlecsF|j��}|r!z
t�|���WdSty |jjs�YdSwdSr�)ZwfilerMr7�finishrr��_closedrT)�DelegatingUDPRequestHandlerr<r@rAr�s
���zBTestUDPServer.__init__.<locals>.DelegatingUDPRequestHandler.finish)rbrcrdrr�r@r@�r�r;rAr�sr�F)rrr8r�r�)r>rxr�rwr�r@r�rAr8�s�
zTestUDPServer.__init__cr�r�)r7r�r�rqrrrsr_r;r@rAr�r�zTestUDPServer.server_bindcstt|���d|_dS)NT)r7r�r�r�r_r;r@rAr�s
zTestUDPServer.server_closer�)rbrcrdrer8r�r�r@r@r@r;rAr��s
�r��AF_UNIXc@�eZdZejZdS)�TestUnixStreamServerN�rbrcrdrqr��address_familyr@r@r@rAr��
r�c@r�)�TestUnixDatagramServerNr�r@r@r@rAr� r�r�c@s"eZdZejZdd�Zdd�ZdS)�SMTPHandlerTestc
Cs
i}ttjdf|jd|�}|��tj|jf}tjj|ddd|j	d�}|�
|jdg�g|_t�
ddi�}t��|_|�|�|j�|j	�|��|�|j���|�
t|j�d	�|jd\}}}}	|�
|d�|�
|dg�|�d
|	�|�|	�d��|��dS)Nr���MbP?�meZyouZLog)�timeoutr�u	Hello ✓r]z
Subject: Log
u

Hello ✓)rmrZHOSTr}r/rsrr:ZSMTPHandler�TIMEOUTrOZtoaddrs�messagesr�r,rK�handledrrEr�r=�is_setrPrd�endswithrC)
r>ryr�rxrHr�rzr{r|rUr@r@rA�
test_basic)s0��

zSMTPHandlerTest.test_basiccGs|j�|�|j��dSr�)r��appendr�rD)r>rr@r@rAr}AszSMTPHandlerTest.process_messageN)rbrcrdrZLONG_TIMEOUTr�r�r}r@r@r@rAr�%sr�c@r�)�MemoryHandlerTestzTests for the MemoryHandler.r�cCsFt�|�tj�dtj|j�|_t�d�|_	d|j	_
|j	�|j�dS)N�
Zmemr)rrBrr:�
MemoryHandlerrpr4�mem_hdlrr�
mem_logger�	propagater<r_r@r@rArBLs
�zMemoryHandlerTest.setUpcC�|j��t�|�dSr�)r�rCrrIr_r@r@rArIT�
zMemoryHandlerTest.tearDowncCs�|j�|���|�g�|j�|���|�g�|j�|���gd�}|�|�dD]1}td�D]
}|j�|���q3|�|�|j�|���|dd�t||d�D�}|�|�q-|j�|���|�|�dS)N)�r2rk�rrrm)rprn)r��	cSsg|]}dt|�f�qS)r2)�str)�.0�ir@r@rA�
<listcomp>nsz0MemoryHandlerTest.test_flush.<locals>.<listcomp>r�)r�r~r`r\r}r|r)r>�lines�nr�r@r@rA�
test_flushXs 



zMemoryHandlerTest.test_flushcCs�|j�|���|�g�|j�|���|�g�|j�|j�|j��ddg}|�|�tj	�
dtj|jd�|_|j�
|j�|j�|���|�|�|j�|���|�|�|j�|j�|j��|�|�dS)zO
        Test that the flush-on-close configuration works as expected.
        r�r�r�FN)r�r~r`r\r}rDr�rCrr:r�rpr4r<)r>r�r@r@rA�test_flush_on_closets,


�
�


z%MemoryHandlerTest.test_flush_on_closec
Cs�Gdd�d�}||j�}z,|j�|�td�D]}t�d�|j�d�|j�d�qW|jD]}t	�
|�q/dS|jD]}t	�
|�q<w)Nc@r_)zZMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandlercSs||_g|_dSr�)r��threads)r>r�r@r@rAr8�s
zcMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.__init__cSs|j�d�dSr�)r��	setTargetr_r@r@rA�removeTarget�r�zgMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.removeTargetcSs&tj|jd�}|j�|�|��dS)N)r*)r,r-r�r�r�r/)r>r��threadr@r@rAr�szaMemoryHandlerTest.test_race_between_set_target_and_flush.<locals>.MockRaceConditionHandler.handleN)rbrcrdr8r�rr@r@r@rA�MockRaceConditionHandler�sr�r�r+znot flushedZflushed)r�r�rr r"r�r}r|r�rr�)r>r�r*r%r�r@r@rA�&test_race_between_set_target_and_flush�s


�
��z8MemoryHandlerTest.test_race_between_set_target_and_flushN)
rbrcrdrerLrBrIr�r�r�r@r@r@rAr�Esr�c@r�)�ExceptionFormatterzA special exception formatter.cCsd|djS)Nz
Got a [%s]r)rb)r>�eir@r@rA�formatException�r�z"ExceptionFormatter.formatExceptionN)rbrcrdrer�r@r@r@rAr��sr�c@s�eZdZdZejZdZdZdZdZ	e�
dd�Ze�
dd	�Zd
edZ
e�
dd
�ZdZdZdZdZdd�Zdd�Zdd�Zefdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z d.S)/�ConfigFileTestz5Reading logging config from a .ini-style config file.�^(\w+) \+\+ (\w+)$aN
    [loggers]
    keys=root

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

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

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

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=

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

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

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

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

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

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

    [formatter_form1]
    format=%(levelname)s ++ %(message)s
    datefmt=
    z
sys.stdoutz
sys.stboutzformatter=form1zformatter=misspelled_namea
    [loggers]
    keys=root

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=NOTSET
    handlers=hand1

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

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

    [handlers]
    keys=hand1, hand2

    [formatters]
    keys=form1, form2

    [logger_root]
    level=WARNING
    handlers=

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

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

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

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

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

    [handlers]
    keys=hand1

    [formatters]
    keys=form1

    [logger_root]
    level=WARNING
    handlers=hand1

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

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

    [handler_hand1]
    class=StreamHandler
    level=NOTSET
    formatter=form1
    kwargs={'stream': sys.stdout,}

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

    [handlers]
    keys=file

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=file

    [handler_file]
    class=FileHandler
    level=DEBUG
    args=("{tempfile}",)
    kwargs={{"encoding": "utf-8"}}
    z�
    [loggers]
    keys=root

    [handlers]
    keys=screen

    [formatters]
    keys=

    [logger_root]
    level=DEBUG
    handlers=screen

    [handler_screen]
    level=DEBUG
    class=StreamHandler
    args=(sys.stdout,)
    formatter=
    cKs,t�t�|��}tjj|fddi|��dS)Nr�r�)r.r/�textwrap�dedentr�config�
fileConfig)r>�conf�kwargs�filer@r@rA�apply_config�szConfigFileTest.apply_configcC�xt���.}|�|j�t��}|�|���|�|���|j	dg|d�|�	g�Wd�dS1s5wYdS�N�rlrmr6�
r�captured_stdoutr��config0rrr}r`r{r\�r>�outputr�r@r@rA�test_config0_ok��
��"�zConfigFileTest.test_config0_okcCs�t���@}t�t�|j��}t��}|�	|�t
j�|�t
�
�}|�|���|�|���|jdg|d�|�g�Wd�dS1sGwYdSr�)rr�r.r/r�r�r��configparser�ConfigParserZ	read_filerr�r�rr}r`r{r\)r>r�r�Zcpr�r@r@rA�test_config0_using_cp_ok�s

��"�z'ConfigFileTest.test_config0_using_cp_okcC�zt���/}|�|�t�d�}|�|���|�|���|jddg|d�|�g�Wd�dS1s6wYdS�N�compiler.parser�rrrkr�r6�	rr�r�rrr}r`r{r\�r>r�r�r�r@r@rA�test_config1_ok��


��"�zConfigFileTest.test_config1_okcC�|�t|j|j�dSr��r�r0r��config2r_r@r@rA�test_config2_failure��z#ConfigFileTest.test_config2_failurecCr�r��r�r0r��config3r_r@r@rA�test_config3_failure�rz#ConfigFileTest.test_config3_failurec	Cs�t���8}|�|j�t��}zt��ty t�d�Ynwtj	�
d�|�|��d�|�
g�Wd�dS1s?wYdS�Nzjust testingrz-ERROR:root:just testing
Got a [RuntimeError]
)rr�r��config4rrrS�	exceptionr��stdout�seekrOrMr\r�r@r@rA�test_config4_ok�s
�
�"�zConfigFileTest.test_config4_okcC�|j|jd�dS�N)r��r��config5r_r@r@rA�test_config5_ok��zConfigFileTest.test_config5_okcCrr)r��config6r_r@r@rA�test_config6_okrzConfigFileTest.test_config6_okcC�Jt���;}|�|j�t�d�}t�d�}|�|���|�|���|�	|���|j
gd�|d�|�
g�Wd�n1sBwYt���P}|�|j�t�d�}|�|j
�|�|���|�|���t�d�}|�|���|�|���|�	|���|j
gd�|d�|�
g�Wd�dS1s�wYdS�Nr�zcompiler-hyphenated)r�r�)rjrnr6�compiler.lexer))rrro)rlrq)rrrs)rlrt)rr�r��config1arrr}r`r{�criticalr\�config7rr�r>r�r�Z
hyphenatedr@r@rA�test_config7_ok�6



��



�"�zConfigFileTest.test_config7_okcCs�dd�}|���1t�dd�\}}t�|�tjdkr!|�dd�}|jj|d�}|�	|�|�	|�Wd�n1s<wYt
jjd	}|�
|||�dS)
NcS�|��t�|�dSr��rCr�remove��h1rr@r@rA�cleanup1�z/ConfigFileTest.test_config8_ok.<locals>.cleanupr(�test_logging-X-r�\z\\)r�r)�check_no_resource_warningr�rrrCr?�replace�config8r�r�r�rootr:r�)r>r!rrr'r�r@r@rA�test_config8_ok/s



�zConfigFileTest.test_config8_okcCsZ|�|j�t�d�}|�|j�|�|j�|�|j�|j|jdd�|�|j�dS)NZsome_pristine_loggerF)�disable_existing_loggers)r��disable_testrrrrr=�r>r�r@r@rA�test_logger_disablingFs
z$ConfigFileTest.test_logger_disablingcCs*d}|�|�|�t��jdjd�dS)Naw
            [loggers]
            keys=root

            [handlers]
            keys=hand1

            [formatters]
            keys=form1

            [logger_root]
            handlers=hand1

            [handler_hand1]
            class=StreamHandler
            formatter=form1

            [formatter_form1]
            format=%(levelname)s ++ %(message)s
            r�hand1)r�rOrrr:r?)r>Ztest_configr@r@rA�test_config_set_handler_namesOs
z,ConfigFileTest.test_config_set_handler_namescCs�t�d���}tjddd�\}}z*t�||�d��t�|�t	j
j|dtddd	d
ddd
�id�d�Wt�
|�dSt�
|�w)z.bpo-33802 defaults should not get interpolatedat
            [formatters]
            keys=default

            [formatter_default]

            [handlers]
            keys=console

            [handler_console]
            class=logging.StreamHandler
            args=tuple()

            [loggers]
            keys=root

            [logger_root]
            formatter=default
            handlers=console
            �
test_logging_z.ini�r��suffix�asciir�r]Fr�z5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)r��datefmt�class)�versionr*�
formatters)r��defaultsN)r�r��stripr�rrrV�encoderCrr�r��dictr)r>Zinirrr@r@rA�!test_defaults_do_no_interpolationgs,�
����z0ConfigFileTest.test_defaults_do_no_interpolationN)!rbrcrdrerr%rLr��config1rr&r�rrrrrr'r+r�r�r�r�rrr
rrrr)r-r/r<r@r@r@rAr��sB  ��*&+	r�c@s@eZdZdZeZdZdd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
S)�SocketHandlerTestzTest for SocketHandler objects.�r�rc
Cs�t�|�d|_|_|_z|�|j|jd�|_}|��Wnt	y6}z
||_WYd}~dSd}~ww|j
��tj
j}t|jt�rN|d|j�|_n||jd�|_d|_|j�|jj
d�|j�|j�t�d�|_dS)ztSet up a TCP server to receive log messages, and a SocketHandler
        pointing to that server's address and port.N�{�G�z�?r�rr)rrBr��	sock_hdlr�server_exception�server_class�address�
handle_socketr/rr�rErr:Z
SocketHandler�
isinstance�server_addressrTrs�
log_outputr+rDr<r,�	Semaphorer��r>r�r�Zhclsr@r@rArB�s*

���
zSocketHandlerTest.setUpc	Cs\z'|jr|j�|j�|j��|jr |j��Wt�|�dSWt�|�dSt�|�w)zShutdown the TCP server.N)rAr+rDrCr�r�rrIr_r@r@rArI�s
�zSocketHandlerTest.tearDowncCs�|j}	|�d�}t|�dkrdSt�d|�d}|�|�}t|�|kr5||�|t|��}t|�|ks$t�|�}t�|�}|j	|j
d7_	|j��q)NTr�>Lr�
)
�
connection�recvrP�struct�unpack�pickle�loadsrr�rHr�r�r>)r>�request�conn�chunk�slen�objr�r@r@rArE�s

�


�zSocketHandlerTest.handle_socketcCsV|jr	|�|j�t�d�}|�d�|j��|�d�|j��|�|j	d�dS)NZtcpr��eggs�
spam
eggs
)
rB�skipTestrrr{r�r=r~rOrHr,r@r@rA�test_output�s




zSocketHandlerTest.test_outputcCs�|jr	|�|j�d|j_|j��ztd��ty%|j�d�Ynw|j�	d�t
�
�}|�|jj|�t
�
|jj|d�|j�	d�dS)Ng@zDeliberate mistakez
Never sentzNever sent, eitherr�zNor this)rBrZrAZ
retryStartr�r�rSr+rr{r rIZ	retryTimer")r>�nowr@r@rA�
test_noserver�s
�zSocketHandlerTest.test_noserverN)rbrcrdrer�rCrDrBrIrEr[r]r@r@r@rAr>�sr>cCs*tjddd�\}}t�|�t�|�|S)Nr0z.sockr1)r�rrrCr)rrr@r@rA�_get_temp_domain_socket�s

r^zUnix sockets requiredc@�.eZdZdZeed�r
eZdd�Zdd�Z	dS)�UnixSocketHandlerTestz)Test for SocketHandler with unix sockets.r�cC�t�|_t�|�dSr�)r^rDr>rBr_r@r@rArB��zUnixSocketHandlerTest.setUpcC�t�|�t�|j�dSr�)r>rIrrrDr_r@r@rArI�
zUnixSocketHandlerTest.tearDownN)
rbrcrdrerOrqr�rCrBrIr@r@r@rAr`��
r`c@�8eZdZdZeZdZdd�Zdd�Zdd�Z	d	d
�Z
dS)�DatagramHandlerTestzTest for DatagramHandler.r?c
Cs�t�|�d|_|_|_z|�|j|jd�|_}|��Wnt	y6}z
||_WYd}~dSd}~ww|j
��tj
j}t|jt�rN|d|j�|_n||jd�|_d|_|j�|jj
d�|j�|j�t��|_dS)zvSet up a UDP server to receive log messages, and a DatagramHandler
        pointing to that server's address and port.Nr@r�rr)rrBr�rArBrCrD�handle_datagramr/rr�rErr:ZDatagramHandlerrFrGrTrsrHr+rDr<r,rKr�rJr@r@rArB
s*

���
zDatagramHandlerTest.setUpc	C�\z'|jr	|j��|jr |j�|j�|j��Wt�|�dSWt�|�dSt�|�w)zShutdown the UDP server.N)r�r�rAr+rDrCrrIr_r@r@rArI'�
�zDatagramHandlerTest.tearDowncCsTt�dd�}|jt|�d�}t�|�}t�|�}|j|j	d7_|j
��dS)NrKrrL)rO�pack�packetrPrQrRrr�rHr�r�rD)r>rSrVrlrWr�r@r@rArh2s

z#DatagramHandlerTest.handle_datagramcCs`|jr	|�|j�t�d�}|�d�|j��|j��|�d�|j��|�|j	d�dS)NZudpr�rXrY)
rBrZrrr{r�rErErOrHr,r@r@rAr[:s





zDatagramHandlerTest.test_outputN�rbrcrdrer�rCrDrBrIrhr[r@r@r@rArgsrgc@r_)�UnixDatagramHandlerTestz,Test for DatagramHandler using Unix sockets.r�cCrar�)r^rDrgrBr_r@r@rArBNrbzUnixDatagramHandlerTest.setUpcCrcr�)rgrIrrrDr_r@r@rArISrdz UnixDatagramHandlerTest.tearDownN�
rbrcrdrerOrqr�rCrBrIr@r@r@rArnFrernc@rf)�SysLogHandlerTestz!Test for SysLogHandler using UDP.r?c
Cs�t�|�d|_|_|_z|�|j|jd�|_}|��Wnt	y6}z
||_WYd}~dSd}~ww|j
��tj
j}t|jt�rR||jd|jf�|_n||j�|_d|_|j�|jj
d�|j�|j�t��|_dS)ztSet up a UDP server to receive log messages, and a SysLogHandler
        pointing to that server's address and port.Nr@rr)rrBr��sl_hdlrrBrCrDrhr/rr�rErr:r
rFrGrTrsrHr+rDr<r,rKr�rJr@r@rArB^s*

���
zSysLogHandlerTest.setUpc	Cri)zShutdown the server.N)r�r�rqr+rDrCrrIr_r@r@rArIxrjzSysLogHandlerTest.tearDowncCs|j|_|j��dSr�)rlrHr�rD)r>rSr@r@rArh�r"z!SysLogHandlerTest.handle_datagramcCs�|jr	|�|j�t�d�}|�d�|j��|�|jd�|j�	�d|j
_|�d�|j��|�|jd�|j�	�d|j
_|�d�|j��|�|jd�dS)NZslh�späms
<11>spämFs	<11>spämuhäm-s<11>häm-späm)
rBrZrrr{r�rErOrHrErqZ
append_nul�identr,r@r@rAr[�s 








zSysLogHandlerTest.test_outputNrmr@r@r@rArpWsrpc@r_)�UnixSysLogHandlerTestz)Test for SysLogHandler with Unix sockets.r�cCrar�)r^rDrprBr_r@r@rArB�rbzUnixSysLogHandlerTest.setUpcCrcr�)rprIrrrDr_r@r@rArI�rdzUnixSysLogHandlerTest.tearDownNror@r@r@rArt�rertz$IPv6 support required for this test.cs4eZdZdZeZdZ�fdd�Z�fdd�Z�Z	S)�IPv6SysLogHandlerTestz&Test for SysLogHandler with IPv6 host.)z::1rc�tj|j_tt|���dSr�)rq�AF_INET6rCr�r7rurBr_r;r@rArB�r�zIPv6SysLogHandlerTest.setUpcrvr�)rq�AF_INETrCr�r7rurIr_r;r@rArI�r�zIPv6SysLogHandlerTest.tearDown)
rbrcrdrer�rCrDrBrIr@r@r@r;rAru�sruc@r�)	�HTTPHandlerTestzTest for HTTPHandler.cCst�|�t��|_dS)ztSet up an HTTP server to receive log messages, and a HTTPHandler
        pointing to that server's address and port.N)rrBr,rKr�r_r@r@rArB�s
zHTTPHandlerTest.setUpcCsn|j|_t|j�|_|jdkr'zt|jd�}|j�|�|_Wnd|_Y|�	d�|�
�|j��dS)Nr�zContent-Length��)
�commandrr�log_data�intZheadersZrfilerV�	post_dataZ
send_responseZend_headersr�rD)r>rSZrlenr@r@rA�handle_request�s

zHTTPHandlerTest.handle_requestc	Cs�t�d�}|j}|�|jjd�dD]�}d}|rJzddl}Wnty*d}YqNwtj�	t
�}tj�|d�}|�|j
�}|�|�|j|d�}	nd}d}	t||jd|d�|_}
|
��|
j��d	|
j}|ok|}tjj|d
||	dd�|_d|_|�|j�d
D]T}
|
|j_|j��d}|�|�|j��|�|jjd
�|�|j |
�|
dkr�t!|jj"�}nt!|j#�$d��}|�|ddg�|�|ddg�|�|d|g�q�|j�%�|j�|j�|j�&�qdS)N�httprr'r?zkeycert.pem)Zcafiler@)r�zlocalhost:%dz/frob)�foo�bar)�secure�contextZcredentials)r�r�rrr�r�r?�funcNamer[r�)'rrr+rDr:�ssl�ImportErrorrr�dirname�__file__r�Z
SSLContextZPROTOCOL_TLS_SERVERZload_cert_chainZcreate_default_contextr�rr�r/r�rEZserver_portr
Zh_hdlrr|r<rr�rEr{rOr{r
�queryr~�decoder�rC)r>r�r+r�rxr�r��hereZlocalhost_certr�r��hostZ
secure_clientrr��dr@r@rAr[�sd
�
�


�



�zHTTPHandlerTest.test_outputN)rbrcrdrerBrr[r@r@r@rAry�s

ryc@�0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
MemoryTestz*Test memory persistence of logger objects.cCst�|�i|_dS)z8Create a dict to remember potentially destroyed objects.N)rrB�
_survivorsr_r@r@rArB
s

zMemoryTest.setUpcGs.|D]}t|�t|�f}t�|�|j|<qdS)zKWatch the given objects for survival, by creating weakrefs to
        them.N)�idrk�weakref�refr�)r>rrW�keyr@r@rA�_watch_for_survivals�zMemoryTest._watch_for_survivalcCs`t��g}|j��D]\\}}}|�dur|�|�q|r.|�dt|�d�|�f�dSdS)z;Assert that all objects watched for survival have survived.Nz;%d objects should have survived but have been destroyed: %sz, )�gcZcollectr�r�r�rSrPr�)r>ZdeadZid_�repr_r�r@r@rA�_assertTruesurvivals

�
��zMemoryTest._assertTruesurvivalcCs�|j�tj�t�d�}|�|�|�tj�|j�|���|�|���|�	dg�~|�
�t�d�}|�|���|�	ddg�dS)Nr�)r�r2rm)r�r2rn)r+r1rrrrr�r2r~r`r\r�)r>r�r�r@r@rA�test_persistent_loggers%s"

�

�z"MemoryTest.test_persistent_loggersN)rbrcrdrerBr�r�r�r@r@r@rAr�	sr�c@�eZdZdd�Zdd�ZdS)�EncodingTestc	Cs�t�d�}t�dd�\}}t�|�d}zStj|dd�}|�|�z|�|�W|�	|�|��n
|�	|�|��wt
|dd�}z|�|���
�|�W|��n|��wWtj�|�rft�|�dSdStj�|�rtt�|�ww)N�testr(ztest_logging-1-ufoo€r�r5)rrr�rrrCrr<r|rDr9rOrV�rstripr�isfiler)r>rzrrrUr�r�r@r@rA�test_encoding_plain_file>s,





�
��z%EncodingTest.test_encoding_plain_filec	Cs�t�d�}d}t�d�}d|_t��}||d�}t�|�}|�|�z|�	|�W|�
|�|��n
|�
|�|��w|��}|�
|d�dS)Nr�uдо свидания�cp1251�stricts�� �������
)rr�codecs�	getwriterr�r.�BytesIOr3r<r|rDrCrMrO)r>rz�messageZwriter_classr0�writerr�r[r@r@rA�test_encoding_cyrillic_unicodeXs 







�
z+EncodingTest.test_encoding_cyrillic_unicodeN)rbrcrdr�r�r@r@r@rAr�=sr�c@r�)�WarningsTestc	Cs�t���ft�d�|�tjd�tjdtd�t��}t�	|�}t�
d�}|�|�t�d�|�
|�|��}|��|�|�d�d�t��}t�d	td
d|d�|��}|��|�|d
�Wd�dS1smwYdS)NTF�always)�category�py.warningszI'm warning you...z UserWarning: I'm warning you...
r�Explicit�dummy.py�*z
Dummy linez0dummy.py:42: UserWarning: Explicit
  Dummy line
)�warnings�catch_warningsr�captureWarningsr��filterwarnings�UserWarningr.r/r3rr<�warnrDrMrCrI�find�showwarningrO)r>r0rHr�r[Za_filer@r@rA�
test_warningsps.






��"�zWarningsTest.test_warningscCs�t���<t�d�|�tjd�t�d�}|�|jg�t�dt	dd�|�t
|j�d�|�|jdtj�Wd�dS1sCwYdS)	NTFr�r�r�r�r]r)
r�r�rr�r�rrOr:r�r�rP�assertIsInstance�NullHandlerr,r@r@rA�test_warnings_no_handlers�s


"�z&WarningsTest.test_warnings_no_handlersN)rbrcrdr�r�r@r@r@rAr�nsr�cCst�||�Sr�)rr5)r�r4r@r@rA�
formatFunc��r�c@seZdZddd�ZdS)�myCustomFormatterNcC�dSr�r@)r>�fmtr4r@r@rAr8��zmyCustomFormatter.__init__r�)rbrcrdr8r@r@r@rAr��sr�cCst��Sr�)rr3r@r@r@rA�handlerFunc�rWr�c@�eZdZdS)�
CustomHandlerN�rbrcrdr@r@r@rAr���r�c
@seZdZdZejZdZddddiidddd	d
d�iddgd
�d�Zddddiidddd	d
d�idddgd
�iddid�Zddddiidddd	d
d�idddiiddgd
�d�Z	ddddiidddd	dd�idddgd
�iddid�Z
ddddiiddddd
d�idddgd
�iddid�Zddddiidddd	d
d�idddgd
�iddid�Zddddiidddd	d
d�idddgd
�iddid�Z
ddeddd�idddd	d
d�id	dgd
�d�Zdedd�eddd�edd�d�ddd	d
d�deid�d	dgd
�d�Zddddiideddd	d
d�idddgd
�iddid�Zddddiideddd	d
dd �idddgd
�iddid�Zddddiidddd	d
d�id!ddgd
�iddid�Zdd"dddiidddd	d
d�iddgd
�id#�ddid$�Zdd%dddiidddd	d
d�iddgd
�id#�ddid$�Zddddiiddddd
d�idddgd
�idd	id�Zdd%dddiiddd&iid'�Zdd%ddd&iiddd&iid'�Zddddiid(d)diidddd	d
d(gd*�iddd(gd+�iddgd
�d,�Zddddiidddd	d
d�id-dd.idddgd
�iddid/�Zdddiidddd	d
d�id-dd.idddgd
�iddid0�Zd1dddiidddd	d
d�id-dd.idddgd
�iddid/�Zddddiidddd	d
d2d3d4�d5�iddgd
�d�Zdd6d7d8d9�iddd6d:�d;d<d6d=dd>�d?�d@ddAgdBdC�idD�Z ddeddd"dE�idddd	d
d�idFddgdBdC�idD�Z!ddeddd"dG�idddd	d
d�idFddgdBdC�idD�Z"ddedHdd"dG�idddd	d
d�idFddgdBdC�idD�Z#ddedd"dE�idddd	d
d�idFddgdBdC�idD�Z$dIdJ�Z%dKdL�Z&efdMdN�Z'dOdP�Z(dQdR�Z)dSdT�Z*dUdV�Z+dWdX�Z,dYdZ�Z-d[d\�Z.d]d^�Z/d_d`�Z0dadb�Z1dcdd�Z2dedf�Z3dgdh�Z4didj�Z5dkdl�Z6dmdn�Z7dodp�Z8dqdr�Z9d�dtdu�Z:dvdw�Z;dxdy�Z<dzd{�Z=d|d}�Z>d~d�Z?d�d��Z@d�d��ZAd�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFdsS)��ConfigDictTestz)Reading logging config from a dictionary.r�r]�form1r�z%(levelname)s ++ %(message)sr.zlogging.StreamHandlerr�zext://sys.stdout)r5�	formatterr^r0rp�r^r:)r6r7r:r(r�r2r^)r6r7r:�loggersr(zext://sys.stdboutZNTOSETZWRANINGZmisspelled_namez.ExceptionFormatterz"%(levelname)s:%(name)s:%(message)s)�()r�z.formatFunc)r�Zform2Zform3r�)r.Zhand2z.CustomHandlerzinvalid parameter name)r5r�r^r0rvrF)�compilerr)r6r*r7r:r�r(Trr)r6Zincrementalr:r�Zfilt1r?)r5r�r^r0�filters)r^r�)r6r7r�r:r�r(zcfg://true_formatterszcfg://handler_configs[hand1])r6�true_formatters�handler_configsr7r:r�r()r�r�r7r:r�r(r�r��!
)r��
terminator)r5r�r^r0r��mySimpleFormatterz1%(asctime)s (%(name)s) %(levelname)s: %(message)s�$)r��style)r5r^r�zlogging.handlers.MemoryHandler��
fileGlobal)r5Zcapacityr�r*r^)r��bufferGlobal�mymoduler��true)r^r:r�)r6r7r:r�)r�r��validate�my_test_logger_custom_formatter)r5r�r�z.myCustomFormattercCstj�|�dSr�)rr�Z
dictConfig)r>r�r@r@rAr��r�zConfigDictTest.apply_configcCr�r�r�r�r@r@rAr��r�zConfigDictTest.test_config0_okcCr�r�r�r�r@r@rAr��r�zConfigDictTest.test_config1_okcCr�r�r�r_r@r@rAr�rz#ConfigDictTest.test_config2_failurecCr�r�)r�r0r��config2ar_r@r@rA�test_config2a_failure�rz$ConfigDictTest.test_config2a_failurecCr�r�)r�r0r��config2br_r@r@rA�test_config2b_failure�rz$ConfigDictTest.test_config2b_failurecCr�r�rr_r@r@rAr�rz#ConfigDictTest.test_config3_failurec	C�t���4}|�|j�zt��tyt�d�Ynwtj�	d�|�
|��d�|�g�Wd�dS1s;wYdSr)
rr�r�rrSrrr�rr	rOrMr\�r>r�r@r@rAr
��
�
�"�zConfigDictTest.test_config4_okc	Cr�r)
rr�r��config4arSrrr�rr	rOrMr\r�r@r@rA�test_config4a_ok�r�zConfigDictTest.test_config4a_okcCrrr
r_r@r@rAr�rzConfigDictTest.test_config5_okcCr�r�)r�r0r�rr_r@r@rA�test_config6_failure��z#ConfigDictTest.test_config6_failurecCst���/}|�|j�t�d�}|�|���|�|���|j	ddg|d�|�	g�Wd�n1s6wYt���;}|�|j
�t�d�}|�|j�t�d�}|�|���|�|���|j	ddg|d�|�	g�Wd�dS1s}wYdS)Nr�r�r�r6r�rrrn�rlro)
rr�r�r=rrr}r`r{r\rr=rr�r@r@rAr�s8

���


��"�zConfigDictTest.test_config7_okcCs$t���/}|�|j�t�d�}|�|���|�|���|j	ddg|d�|�	g�Wd�n1s6wYt���I}|�|j
�t�d�}|�|j�|�|���|�|���t�d�}|�|���|�|���|j	gd�|d�|�	g�Wd�dS1s�wYdS)Nr�r�r�r6r)r�r��rrrq�rlrs)
rr�r�r=rrr}r`r{r\r'rrr�r@r@rA�test_config_8_ok�s6

���



�"�zConfigDictTest.test_config_8_okcCrr)rr�r�rrrr}r`r{rr\�config8arrrr@r@rA�test_config_8a_okrz ConfigDictTest.test_config_8a_okcCs�t���K}|�|j�t�d�}|�|���|jg|d�|�|j	�|�|���|jg|d�|�|j
�|�|���|jdg|d�Wd�dS1sRwYdS)Nr�r6r�)rr�r��config9rrr}r`r\�config9a�config9br�r@r@rA�test_config_9_okGs 

��"�zConfigDictTest.test_config_9_okcCs�t���H}|�|j�t�d�}|�|���t�d�}|�|���t�d�}|�|���t�d�}|�|���|j	ddg|d�Wd�dS1sOwYdS�Nr�r�rzcompiler.parser.codegen)rprkr�r6)
rr�r��config10rrr|r`r{r\r�r@r@rA�test_config_10_okYs"




��"�z ConfigDictTest.test_config_10_okcCs|�|j�dSr�)r��config11r_r@r@rA�test_config11_oklr�zConfigDictTest.test_config11_okcCr�r�)r�r0r��config12r_r@r@rA�test_config12_failureor�z$ConfigDictTest.test_config12_failurecCr�r�)r�r0r��config13r_r@r@rA�test_config13_failurerr�z$ConfigDictTest.test_config13_failurecCs~t���1}|�|j�tjd}|�|jd�|�|jd�t�	d�|�
|���d��Wd�dS1s8wYdS)Nr.r�r�ZExclamationz
Exclamation!
)
rr�r��config14rrrOr�r�r|r=rMr�)r>r�rHr@r@rA�test_config14_okus


"�zConfigDictTest.test_config14_okcCs�dd�}|���.t�dd�\}}t�|�ddd|dd	�id
dgid�}|�|�|�|�Wd�n1s9wYtjjd}|�	|||�dS)
NcSrr�rrr@r@rAr!�r"z0ConfigDictTest.test_config15_ok.<locals>.cleanupr(r#r]r�zlogging.FileHandlerr�)r5�filenamer�r:�r6r:r(r)
r%r�rrrCr�rr(r:r�)r>r!rrr�r�r@r@rA�test_config15_ok~s&

����
�zConfigDictTest.test_config15_okNc	Cs
|�d�}tj�d|�}|��|j��|j}|j��zVt	�	t	j
t	j�}|�d�|�
d|f�t�dt|��}||}d}t|�}	|	dkr]|�||d��}
||
7}|	|
8}	|	dksH|��W|j�d�tj��t�|�dS|j�d�tj��t�|�w)Nr�rg@r�rK)r:rr��listenr/r�rErsrErqrx�SOCK_STREAM�
settimeout�connectrOrkrP�sendrCZ
stopListeningrr�)r>�textZverifyr�rsr�rVr[Z	sentsofar�left�sentr@r@rA�setup_via_listener�s4



�

�
z!ConfigDictTest.setup_via_listenercCs�t���K}|�t�|j��t�d�}|�|�	��t�d�}|�|�	��t�d�}|�|�	��t�d�}|�
|�	��|jddg|d�Wd�dS1sRwYdSr�)rr�r	�json�dumpsr�rrr|r`r{r\r�r@r@rA�test_listen_config_10_ok�s"




��"�z'ConfigDictTest.test_listen_config_10_okcCs�t���3}|�t�tj��t�d�}|�	|�
��|�|�
��|jddg|d�|�g�Wd�dS1s:wYdSr�)
rr�r	r�r�r�r=rrr}r`r{r\r�r@r@rA�test_listen_config_1_ok�s

��"�z&ConfigDictTest.test_listen_config_1_okcCs�dd�}dd�}t�d�}t�tj�}t���}|�||�|�	|�
��|�|�
��Wd�n1s6wY|jg|d�|jddgd	d
�t��� }|�|�t�d�}|�	|�
��|�|�
��Wd�n1srwY|jddg|d�|jddgd	d
�t���&}|�|ddd
�|�t�d�}|�	|�
��|�|�
��Wd�n1s�wY|jddg|d�|jddgd	d
�dS)NcSr�r�r@��stuffr@r@rA�verify_fail�r�z6ConfigDictTest.test_listen_verify.<locals>.verify_failcSs|ddd�S)Nr�r@rr@r@rA�verify_reverse�r�z9ConfigDictTest.test_listen_verify.<locals>.verify_reverser�r6r�r�r�)rWr�r�r�r�r�)
rrr�r�r�r=rr�r	r}r`r{r\)r>rrr�Zto_sendr�r@r@rA�test_listen_verify�sh

���


�����

����
�z!ConfigDictTest.test_listen_verifycCr�r�)r�rr��out_of_orderr_r@r@rA�test_out_of_order
r�z ConfigDictTest.test_out_of_ordercCs\t�|j�}d|ddd<|�|�t�d�jd}|�|jtj	�|�|j
jtj�dS)Nz-${asctime} (${name}) ${levelname}: ${message}r7r�r�r�r)
r�deepcopyrr�rrr:r�r*r�r��_style�StringTemplateStyle�r>r�r�r@r@rA�#test_out_of_order_with_dollar_style
s

�z2ConfigDictTest.test_out_of_order_with_dollar_stylecC�.|�|j�t�d�jd}|�|jt�dS�Nr�r)r��custom_formatter_class_validaterrr:r�r�r��r>r�r@r@rA�)test_custom_formatter_class_with_validate$
�z8ConfigDictTest.test_custom_formatter_class_with_validatecCrr)r�� custom_formatter_class_validate2rrr:r�r�r�rr@r@rA�*test_custom_formatter_class_with_validate2)
rz9ConfigDictTest.test_custom_formatter_class_with_validate2cCsF|j��}d|ddd<|�|�t�d�jd}|�|jt�dS)Nr�r7r�r�r�r)	rrr�rrr:r�r�r�rr@r@rA�9test_custom_formatter_class_with_validate2_with_wrong_fmt.
s


zHConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmtcCr�r�)r�rr�� custom_formatter_class_validate3r_r@r@rA�*test_custom_formatter_class_with_validate37
r�z9ConfigDictTest.test_custom_formatter_class_with_validate3cCr�r�)r�rr��custom_formatter_with_functionr_r@r@rA�,test_custom_formatter_function_with_validate:
r�z;ConfigDictTest.test_custom_formatter_function_with_validatecCs�dgd�ddd�dddd	gd
ggd�d�}tj�|�}|�|�d
�d�|�|�d�d�|�|�d�d�|�|�d�d	�|�|�d�d�|�|�d�d�|�d�}|�|�d�gd��|�t|jd�|�t|jd�|�t|jd�dS)N)r]r��)r�b�cr�r')r�r�)�g)rHr��jr��lrr�)�ozcfg://alist�p)ZatupleZalistZadictZnest1Znest2Znest3zcfg://atuple[1]r�zcfg://alist[1]r(zcfg://nest1[1][0]rHzcfg://nest2[1][1]z
cfg://adict.dzcfg://adict[f]zcfg://nest3r]zcfg://nosuchzcfg://!zcfg://adict[2])	rr�ZBaseConfiguratorrO�convert�popr��KeyErrorr)r>r�Zbcr�r@r@rA�test_baseconfig=
s&�
zConfigDictTest.test_baseconfigcs�ddlm�G�fdd�dtj�}�dddg�}|dd	gd
�}dd||d
�iddgd�d�}t���}|�|�t�d�Wd�n1sGwY|�|�	�d�dS)Nr��
namedtuplecs*eZdZ��fdd�Z�fdd�Z�ZS)z1ConfigDictTest.test_namedtuple.<locals>.MyHandlercst�j|i|��||_dSr�)r7r8�resource)r>r5rr�)r<r4r@rAr8X
s
z:ConfigDictTest.test_namedtuple.<locals>.MyHandler.__init__cs$|jd|jj��7_t��|�S�N� )r�r5�typer7r�r�r;r@rAr�\
sz6ConfigDictTest.test_namedtuple.<locals>.MyHandler.emitr?r@r3r;rA�	MyHandlerW
sr9�Resourcer8�labelsZmy_typer)r8r;r]Z	myhandler)r�r5rrr�r�zsome logzsome log my_type
)
�collectionsr4rr3rrcr�r}rOrM)r>r9r:r5r�rer@r3rA�test_namedtupleS
s"	��
�


�zConfigDictTest.test_namedtupler�)Grbrcrdrerr%rLr�r=rr�r�r�rrr�r�r�r�rrrr'r�r�r�r�r�r�r�r�r�rrr r#r%r�r�r�rr�r�rr
r�rr�rr�r�r�r�r�r�r�r�rr	rr
rrrrr!r"r$r&r2r=r@r@r@rAr��s�����	������	��������	��������	��������	��������	��������	��������	�����������#����	��������
��������	��������
��	������
��	������	��������������������
����#���������!������������������ �����
����������!����	�������	�������	�������	���!+	
>
	r�c@r�)�ManagerTestcsng�G�fdd�dtj�}t�d�}|�t|jt�|�|�|�d�}|�d�t�d�|�	�dg�dS)NcseZdZd�fdd�	ZdS)z6ManagerTest.test_manager_loggerclass.<locals>.MyLoggerNcs��|�dSr��r�)r>r^r�r�exc_info�extra�Zloggedr@rA�_logw
r�z;ManagerTest.test_manager_loggerclass.<locals>.MyLogger._logra)rbrcrdrCr@rBr@rA�MyLoggerv
srDr�zshould appear in loggedzshould not appear in logged)
r�Logger�Managerr��	TypeError�setLoggerClassr}rr|rO)r>rD�manr�r@rBrA�test_manager_loggerclasss
s




z$ManagerTest.test_manager_loggerclasscCs,t�d�}t�}|�|�|�|j|�dSr�)rrF�object�setLogRecordFactoryrO�logRecordFactory)r>rIrYr@r@rA�test_set_log_record_factory�
s

z'ManagerTest.test_set_log_record_factoryN)rbrcrdrJrNr@r@r@rAr>r
sr>c@rP)�ChildLoggerTestcCs�t��}t�d�}t�d�}|�d�}|�d�}|�|t�d��|�|t�d��|�d�}|�d�}|�d�}|�|t�d��|�|t�d��|�||�dS)	N�abczdef.ghiZxyzzuvw.xyz�defZghi�abc.defzabc.def.ghi)rr�getChildrb)r>r��l1�l2�c1�c2Zc3r@r@rA�test_child_loggers�
s






z"ChildLoggerTest.test_child_loggersN)rbrcrdrXr@r@r@rArO�
rXrOc@r�)�DerivedLogRecordNr�r@r@r@rArY�
r�rYc@r_)�LogRecordFactoryTestcCsBGdd�dtj�}t�|�|t�|_|j�|j�t��|_	dS)Nc@r�)z2LogRecordFactoryTest.setUp.<locals>.CheckingFiltercSrZr�)r)r>rr@r@rAr8�
r�z;LogRecordFactoryTest.setUp.<locals>.CheckingFilter.__init__cSs,t|�}||jurd||jf}t|��dS)Nz)Unexpected LogRecord type %s, expected %sT)r8rrG)r>r�r�r�r@r@rAr��
s
�z9LogRecordFactoryTest.setUp.<locals>.CheckingFilter.filterN)rbrcrdr8r�r@r@r@rA�CheckingFilter�
�r[)
rr�rrBrYr�r+r��getLogRecordFactory�orig_factory)r>r[r@r@rArB�
s


zLogRecordFactoryTest.setUpcCs(|j�|j�t�|�t�|j�dSr�)r+r�r�rrIrrLr^r_r@r@rArI�
s
zLogRecordFactoryTest.tearDowncCs@|�t|jj|���t�t�|j�|���|�	dg�dS)N)r(rlrm)
r�rGr+r|r`rrLrYr{r\r_r@r@rA�test_logrecord_class�
s�

�z)LogRecordFactoryTest.test_logrecord_classN)rbrcrdrBrIr_r@r@r@rArZ�
srZc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Ze�	e
ejd
�d�dd
��Z
e�	e
ejd
�d�dd��Ze�	e
ejd
�d�dd��ZdS)�QueueHandlerTestr�cCs`t�|�t�d�|_tj�|j�|_d|_t�	d�|_
d|j
_|j
�tj
�|j
�|j�dS)Nr�ZqueF)rrB�queue�Queuerr:�QueueHandler�que_hdlrr?r�
que_loggerr�r1rpr<r_r@r@rArB�
s
zQueueHandlerTest.setUpcCr�r�)rdrCrrIr_r@r@rArI�
r�zQueueHandlerTest.tearDowncCs�|j�|���|�tj|jj�|j�|���|�tj|jj�|��}|j�|�|j��}|�	t
|tj��|�
|j|jj�|�
|j|jf|df�dSr�)rer~r`r�ra�Empty�
get_nowaitr}r|r=rFr�	LogRecordrOr?r�r)r>r�rUr@r@rA�test_queue_handler�
s
z#QueueHandlerTest.test_queue_handlercCsx|��}t�tj�}d}|j|j||d�}t�|j�}|j�	|�|j
�|�|j�
�}|�||j�|�||j�dS)Nz {name} -> {levelname}: {message})r?�	levelnamer�)r`rr�rpr�r?r5r6rdr8rer|rargrOr�r�)r>r�rjZlog_format_strZ
formatted_msgr�Z
log_recordr@r@rA�test_formatting�
s�
z QueueHandlerTest.test_formatting�
QueueListenerz5logging.handlers.QueueListener required for this testcCs�tt���}tj�|j|�}|��z|j�	|�
��|j�|�
��|j�|�
��W|�
�n|�
�w|�|jtjdd��|�|jtjdd��|�|jtjdd��|��tt���}|�tj�tjj|j|dd�}|��z|j�	|�
��|j�|�
��|j�|�
��W|�
�n|�
�w|�|jtjdd��|�|jtjdd��|�|jtjd	d��|��dS)
Nrk)r�r�rmrnT)Zrespect_handler_levelrorqrs)r	rZMatcherrr:rlrar/rer|r`r{rr�r=�matchesrprlrjrCr1r)r>r��listenerr@r@rA�test_queue_listener�
s6�z$QueueHandlerTest.test_queue_listenerc
Cs�tj�|j|j�}|��zddWnty1}z|}|jj|�	�|d�WYd}~nd}~ww|�
�|�|j�
����d�d�dS)Nr]r�r@Z	Traceback)rr:rlrar4r/�ZeroDivisionErrorrerr`r�rOr0rMr9r�)r>rnr��excr@r@rA�&test_queue_listener_with_StreamHandlers �� z7QueueHandlerTest.test_queue_listener_with_StreamHandlercCsd|j�|j�|j�|j�tj�|j	|j�}|�
�|j�d�|��|�
|j����d�dS)Nr{zque -> ERROR: error)rdr8r7rer<r4rr:rlrar/r{r�rOr0rMr9)r>rnr@r@rA�*test_queue_listener_with_multiple_handlerssz;QueueHandlerTest.test_queue_listener_with_multiple_handlersN)rbrcrdrLrBrIrirkrN�
skipUnlessrOrr:rorsrtr@r@r@rAr`�
s$

�
!�
�r`rl)�patchc@sleZdZdZdZedd��Ze�e	j
jd�dd��Ze�e	j
jd�dd	��Z
ed
d��Zdd
�Zdd�ZdS)�QueueListenerTestz~
        Tests based on patch submitted for issue #27930. Ensure that
        QueueListener handles all log messages.
        �cCs�t�d|�}|�tj�tj�|�}|�|�tj�|�}|��|�	d�|�	d�|�	d�|�	d�|�	d�|�
�|�|�|��dS)z�
            Creates a logger with a QueueHandler that logs to a queue read by a
            QueueListener. Starts the listener, logs five messages, and stops
            the listener.
            ztest_logger_with_id_%s�one�twoZthreeZfourZfiveN)
rrr1r2r:rcr<rlr/r}r�rDrC)�	log_queuersr�r�rnr@r@rA�
setup_and_log5s






zQueueListenerTest.setup_and_logrcCsJt|j�D]}t��}|�|d|��|f�q|�|jd|jd�dS�N�%s_%sr�z&correct number of handled log messages)r�repeatrarbr|r�rO�
call_count�r>Zmock_handler�r{r@r@rA�#test_handle_called_with_queue_queueMs�z5QueueListenerTest.test_handle_called_with_queue_queuecCsbt��t|j�D]}t��}|�|d|��|f�|��|�	�q	|�
|jd|jd�dSr})r�*skip_if_broken_multiprocessing_synchronizerr�multiprocessingrbr|r�rCr�rOr�r�r@r@rA� test_handle_called_with_mp_queueUs
�z2QueueListenerTest.test_handle_called_with_mp_queueccs*�z	|��VqtjygYSwr�)rgrarf)r{r@r@rA�get_all_from_queuebs�
��z$QueueListenerTest.get_all_from_queuecCs�t��t|j�D]7}t��}|�|d|��|f�t|�	|��}|�
�|��gtj
jjgg}|�||ddd�|D��q	dS)a
            Five messages are logged then the QueueListener is stopped. This
            test then gets everything off the queue. Failure of this test
            indicates that messages were not registered on the queue until
            _after_ the QueueListener stopped.
            r~z&Found unexpected messages in queue: %scSs"g|]
}t|tj�r
|jn|�qSr@)rFrrhr�)r�rr@r@rAr�s
��zJQueueListenerTest.test_no_messages_in_queue_after_stop.<locals>.<listcomp>N)rr�rrr�rbr|r��listr�rCr�rr:rl�	_sentinelrd)r>r�rar�rYr@r@rA�$test_no_messages_in_queue_after_stopjs 	����z6QueueListenerTest.test_no_messages_in_queue_after_stopcCs\t��}tj�|�}|��|��|�t��
|�	�Wd�dS1s'wYdSr�)
rarbrr:rlr/r�r�r�	task_done)r>r{rnr@r@rA�test_calls_task_done_after_stop�s
"�z1QueueListenerTest.test_calls_task_done_after_stopN)rbrcrdrer�staticmethodr|rvrKrr:rlr�r�r�r�r�r@r@r@rArw-s



rwc@s eZdZdd�ZeZdd�ZdS)�UTCcCstSr�)�ZERO�r>�dtr@r@rA�	utcoffset�r�z
UTC.utcoffsetcCsdS)Nr�r@r�r@r@rA�tzname�r�z
UTC.tznameN)rbrcrdr��dstr�r@r@r@rAr��sr�c@rP)�AssertErrorMessagec
OsVz|jdg|�Ri|��WdS|y*}z|�|t|��WYd}~dSd}~ww)Nr@)r�rOr�)r>rr�rr�r�r@r@rA�assert_error_message�s��z'AssertErrorMessage.assert_error_messageN)rbrcrdr�r@r@r@rAr��r�r�c@s^eZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�ZdS)�
FormatterTestc	Cs8dtjtj�ddd�dddddd�|_d	d	d
ii|_dS)Nzformatter.testr�toz	dummy.extr�zMessage with %d %s)r�Zplaceholders)r?r^�pathname�linenor@�funcr�r�customi�)rr2rrr��common�variantsr_r@r@rArB�s��
�zFormatterTest.setUpNcCs,t|j�}|dur|�|j|�t�|�Sr�)r;r�rFr�rr�)r>r?�resultr@r@rA�
get_record�s

zFormatterTest.get_recordcCs�|��}t�d�}|�|�|�d�t�d�}|�t|j|�|�|���t�d�}|�	|���t�d�}|�	|���t�d�}|�	|���dS)Nz${%(message)s}z${Message with 2 placeholders}z
%(random)s�%(asctime)sz%(asctime)-15sz%(asctime)#15s�
r�rr5rOr�r�rr�usesTimer=�r>r�r�r@r@rA�test_percent�s




zFormatterTest.test_percentcCs�|��}tjddd�}|�|�|�d�tjddd�}|�t|j|�tjddd�}|�|���tjddd�}|�	|���tjddd�}|�	|���tjd	dd�}|�	|���dS)
Nz
$%{message}%$�{�r��$%Message with 2 placeholders%$z{random}z	{message}�	{asctime}z{asctime!s:15}z{asctime:15}r�r�r@r@rA�test_braces�szFormatterTest.test_bracescCs|��}tjddd�}|�|�|�d�tjddd�}|�|�|�d�tjddd�}|�|�|�d�tjddd�}|�t|j|�|�|���tjd	dd�}|�	|���tjd
dd�}|�	|���tjddd�}|�|���tjddd�}|�	|���dS)N�
${message}r�r�zMessage with 2 placeholdersz$messagez$$%${message}%$$r�z	${random}z
${asctime}z$asctimez${asctime}--r�r�r@r@rA�test_dollars�s$zFormatterTest.test_dollarscCst�d�}|�|jd�t�d�}|�|jd�t�d�}|�|jd�t�d�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjd	dd�}|�|jd	�tjd
dd�}|�|jd
�tjddd�}|�|jd�tjddd�}|�|jd�tjd
dd�}|�|jd
�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�tjddd�}|�|jd�|�ttjd�|�ttjd�|�ttjd�|�ttjd�|�ttjd�|�ttjd�|�ttjd�|�ttjd �|�ttjd!�|jtd"tjd#dd�|jtd$tjd%dd�|�td&�|jttjd'dd�|jtd(tjd)dd�|jtd*tjd+dd�|jttjd,dd�|jttjd-dd�|jttjd.dd�|jttjd/dd�|jtd0tjd1dd�|jtd2tjd3dd�|jttjd4dd�|jttjd5dd�|jttjd6dd�|jttjd7dd�|jttjd8dd�|jttjd9dd�|jttjd:dd�|jttjd;dd�|jttjd<dd�|jtd=tjd>dd�|jtd=tjd?dd�|jtd=tjd@dd�|jtd$tjddd�|jttjd%dd�|jtd$tjdAdd�|jttjdBdd�dS)CNzM%(levelname)-15s - %(message) 5s - %(process)03d - %(module) - %(asctime)*.3sz1%(asctime)*s - %(asctime)*.3s - %(process)-34.33oz%(process)#+027.23Xz
%(foo)#.*gz5$%{message}%$ - {asctime!a:15} - {customfield['key']}r�r�z{process:.2f} - {custom.f:.4f}z{customfield!s:#<30}z{message!r}z{message!s}z{message!a}z{process!r:4.2}z8{process!s:<#30,.12f}- {custom:=+#30,.1d} - {module:^30}z{process!s:{w},.{p}}z{foo:12.{p}}z{foo:{w}.6}z{foo[0].bar[1].baz}z{foo[k1].bar[k2].baz}z{12[k1].bar[k2].baz}z${asctime} - $messager�z$bar $$z	$bar $$$$z%(asctime)Zz%(asctime)bz%(asctime)*z
%(asctime)*3sz%(asctime)_r�r�z
%(foo)#12.3*fz%(foo)0*.8*fz;invalid format: invalid field name/expression: 'name-thing'z{name-thing}zinvalid format: no fieldsr�zinvalid conversion: 'Z'z{asctime!s:#30,15f}z7invalid format: expected ':' after conversion specifierz{asctime!aa:15}z%invalid format: bad specifier: '.2ff'z{process:.2ff}z
{process:.2Z}z{process!s:<##30,12g}z{process!s:<#30#,12g}z{process!s:{{w}},{{p}}}z1invalid format: expected '}' before end of stringz{processz7invalid format: Single '}' encountered in format stringzprocess}z{{foo!r:4.2}z
{{foo!r:4.2}}z	{foo/bar}z{foo:{{w}}.{{p}}}}z{foo!X:{{w}}.{{p}}}z{foo!a:random}z{foo!a:ran{dom}z{foo!a:ran{d}om}z
{foo.!a:d}z$invalid format: bare '$' not allowedz$bar $$$zbar $zfoo $.r�z	${asctime)rr5rO�_fmtr�rr��r>r�r@r@rA�test_format_validate�s�



������������z"FormatterTest.test_format_validatecCs�gd�}gd�}t||�D]T\}}tj||ddid�}|��}|�|�|�d�|�d�}|�|�|�d�tj||d�}|��}|�t|j|�tj||d	did�}|�d�}|�|�|�d�q
dS)
N)z%(custom)s %(message)sz{custom} {message}z$custom $message)�%r�r�r�ZDefault)r�r8z#Default Message with 2 placeholdersz 1234 Message with 2 placeholdersr�zNon-existing)rQrr5r�rOr�r�r)r>ZfmtsZstylesr�r�r�r�r@r@rA�test_defaults_parameter�s

�z%FormatterTest.test_defaults_parametercCs|�ttjddd�dS)N�x)r�rrr5r_r@r@rA�test_invalid_style�sz FormatterTest.test_invalid_stylec
Cs�|��}t�dddddddt�}t�|�d����|_d|_t	�
d�}tj|_|�
|�|�d	�|�
|�|d
�d�|�|�|�
|jd	�dS)N��r��r'r�{�%(asctime)s %(message)sz1993-04-21 08:03:00,123z%Y:%dz1993:21)r��datetime�utcr �mktime�
astimezone�	timetuple�created�msecsrr5�gmtime�	converterrO�
formatTimer��asctime)r>r�r�r�r@r@rA�	test_time�s

zFormatterTest.test_timec
CslGdd�dtj�}|��}t�ddddddd	t�}t�|�d����|_	|�}tj
|_|�|�
|�d
�dS)Nc@seZdZdZdZdS)zDFormatterTest.test_default_msec_format_none.<locals>.NoMsecFormatterNz%d/%m/%Y %H:%M:%S)rbrcrd�default_msec_format�default_time_formatr@r@r@rA�NoMsecFormatter�sr�r�rr�r�r'rr�z21/04/1993 08:03:00)rr5r�r�r�r r�r�r�r�r�r�rOr�)r>r�r�r�r�r@r@rA�test_default_msec_format_none�sz+FormatterTest.test_default_msec_format_noner�)
rbrcrdrBr�r�r�r�r�r�r�r�r�r@r@r@rAr��s
r�c@r�)�TestBufferingFormattercC�dt|�S)Nz[(%d)�rP�r>�recordsr@r@rA�formatHeader�r�z#TestBufferingFormatter.formatHeadercCr�)Nz(%d)]r�r�r@r@rA�formatFooter�r�z#TestBufferingFormatter.formatFooterN)rbrcrdr�r�r@r@r@rAr��r\r�c@r_)�BufferingFormatterTestcCs"t�ddi�t�ddi�g|_dS)Nr�ryrz)rr�r�r_r@r@rArB�s
�zBufferingFormatterTest.setUpcCs2t��}|�d|�g��|�d|�|j��dS)NrZonetwo)r�BufferingFormatterrOr�r�r�r@r@rA�test_default�sz#BufferingFormatterTest.test_defaultcCsDt�}|�d|�|j��t�d�}t|�}|�d|�|j��dS)Nz[(2)onetwo(2)]z
<%(message)s>z[(2)<one><two>(2)])r�rOr�r�rr5)r>r�Zlfr@r@rA�test_custom�s

z"BufferingFormatterTest.test_customN)rbrcrdrBr�r�r@r@r@rAr��sr�c@rP)�
ExceptionTestcCs�|j}t�}|�|�ztd��tjddd�Y|�|�|��|jd}|�	|j
�d��|�	|j
�d��|�	|j
�d��|�	|j
�d	��dS)
NrRZfailedT��
stack_inforz#Traceback (most recent call last):
z!
RuntimeError: deliberate mistake�Stack (most recent call last):
z,logging.exception('failed', stack_info=True))r+�RecordingHandlerr<rSrrrDrCr�r=�exc_textr�r�r�)r>r�rHr@r@rArk�s


zExceptionTest.test_formattingN)rbrcrdrkr@r@r@rAr��rXr�c@rP)�LastResortTestc	Cs�|j}|�|j�tj}tj}z�t���"}|�d�|�	|�
�d�|�d�|�	|�
�d�Wd�n1s9wYdt_t���}|�d�d}|�	|�
�|�Wd�n1s_wYt���}|�d�|�	|�
�d�Wd�n1s�wYd|j_
dt_t���}|�d�|�	|�
�d�Wd�n1s�wYW|�|j�|t_|t_dSW|�|j�|t_|t_dS|�|j�|t_|t_w)NzThis should not appearrz
Final chance!zFinal chance!
z-No handlers could be found for logger "root"
F)r+rDr4r�
lastResortrarrcr~rOrMr|r�emittedNoHandlerWarningr<)r>r(Zold_lastresortZold_raise_exceptionsrer�r@r@rA�test_last_resort�sJ


�

�

�

�
�
�zLastResortTest.test_last_resortN)rbrcrdr�r@r@r@rAr��rXr�c@r�)�FakeHandlerc	Cs$dD]
}t|||�|||��qdS)N)r=�flushrCr>)�setattr�record_call)r>�
identifier�calledrr@r@rAr8s�zFakeHandler.__init__cs���fdd�}|S)Ncs��d�����dS)Nz{} - {})r�r�r@�r�r��method_namer@rA�innerr�z&FakeHandler.record_call.<locals>.innerr@)r>r�r�r�r�r@r�rAr�szFakeHandler.record_callN)rbrcrdr8r�r@r@r@rAr�
sr�cr4)r�cs tt|�j|i|��g|_dSr�)r7r�r8r�)r>rr�r;r@rAr8s
zRecordingHandler.__init__cCs|j�|�dS)z&Keep track of all the emitted records.N)r�r�r�r@r@rArszRecordingHandler.handle)rbrcrdr8rr@r@r@r;rAr�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�ZS)"�ShutdownTestz#Test suite for the shutdown method.cs.tt|���g|_tj}|�ttd|�dS)Nra)r7r�rBr�rrar�r�)r>Zraise_exceptionsr;r@rArB(szShutdownTest.setUpcs�fdd�}|S)Ncs���r�r@r@�r{r@rAr�0sz'ShutdownTest.raise_error.<locals>.innerr@)r>r{r�r@r�rA�raise_error/szShutdownTest.raise_errorcCsbtd|j�}td|j�}td|j�}ttjj|||g�}tjt|�d�gd�}|�||j�dS)Nrr]r���handlerList)z2 - acquirez	2 - flushz	2 - closez2 - releasez1 - acquirez	1 - flushz	1 - closez1 - releasez0 - acquirez	0 - flushz	0 - close�0 - release)	r�r�rnrr�r�r�r�rO)r>Zhandler0Zhandler1Zhandler2r:rYr@r@rA�test_no_failure4szShutdownTest.test_no_failurecCsRtd|j�}t|||�|��tj�|�g}tjt|�d�|�	d|jd�dS)Nrr�r�r�)
r�r�r�r�rr�r�r�r�rO)r>rr{r�r:r@r@rA�_test_with_failure_in_methodDs
z)ShutdownTest._test_with_failure_in_methodcC�|�dt�dS�Nr=�r�rr_r@r@rA�test_with_ioerror_in_acquireMr�z)ShutdownTest.test_with_ioerror_in_acquirecCr��Nr�r�r_r@r@rA�test_with_ioerror_in_flushPr�z'ShutdownTest.test_with_ioerror_in_flushcCr��NrCr�r_r@r@rA�test_with_ioerror_in_closeSr�z'ShutdownTest.test_with_ioerror_in_closecCr�r��r�rr_r@r@rA�test_with_valueerror_in_acquireVr�z,ShutdownTest.test_with_valueerror_in_acquirecCr�r�r�r_r@r@rA�test_with_valueerror_in_flushYr�z*ShutdownTest.test_with_valueerror_in_flushcCr�r�r�r_r@r@rA�test_with_valueerror_in_close\r�z*ShutdownTest.test_with_valueerror_in_closecC�dt_|�dt�dS)NFr=�rrar��
IndexErrorr_r@r@rA�.test_with_other_error_in_acquire_without_raise_�z;ShutdownTest.test_with_other_error_in_acquire_without_raisecCr�)NFr�r�r_r@r@rA�,test_with_other_error_in_flush_without_raisecr�z9ShutdownTest.test_with_other_error_in_flush_without_raisecCr�)NFrCr�r_r@r@rA�,test_with_other_error_in_close_without_raisegr�z9ShutdownTest.test_with_other_error_in_close_without_raisecC�dt_|�t|jdt�dS)NTr=�rrar�r�r�r_r@r@rA�+test_with_other_error_in_acquire_with_raisek�
�z8ShutdownTest.test_with_other_error_in_acquire_with_raisecCr)NTr�rr_r@r@rA�)test_with_other_error_in_flush_with_raiseprz6ShutdownTest.test_with_other_error_in_flush_with_raisecCr)NTrCrr_r@r@rA�)test_with_other_error_in_close_with_raiseurz6ShutdownTest.test_with_other_error_in_close_with_raise)rbrcrdrerBr�r�r�r�r�r�r�r�r�r�r�rrrrr@r@r@r;rAr�$s$	r�c@szeZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�ModuleLevelMiscTestz)Test suite for some module level methods.cCs�tjjj}|�|d�|�tj|�t�d�|�tjjjd�|�ttjd�Gdd�d�}|�ttj|��t�d�t��|�tjjjtj	�dS)Nr�SZ
doesnotexistsc@r�)z;ModuleLevelMiscTest.test_disable.<locals>._NotAnIntOrStringNr�r@r@r@rA�_NotAnIntOrString�r�r	�WARN)
rr(rrGrOr�r�rrGrj)r>�old_disabler	r@r@rA�test_disables


z ModuleLevelMiscTest.test_disableNcs�g�t�|td�fdd��t�}tj�|�tt|�}|dur'||d|�n|d|�|�t|j	�d�|j	d}|�|�
�d|�|durJ|ntt|���}|�|j|�|��g�dS)N�basicConfigcs��||f�Sr�r?)r�kw�r�r@rA�<lambda>��z/ModuleLevelMiscTest._test_log.<locals>.<lambda>ztest me: %rr]r)
rrvrr�r(r<r'rOrPr��
getMessage�upperr�)r>rr^�	recording�
log_methodr�Zexpected_levelr@rrA�	_test_log�s 

�


zModuleLevelMiscTest._test_logcC�|�dtj�dS�Nrz)rrrlr_r@r@rA�test_log�rzModuleLevelMiscTest.test_logcC�|�d�dS�Nr~�rr_r@r@rA�
test_debug�r�zModuleLevelMiscTest.test_debugcCr�Nr}rr_r@r@rA�	test_info�r�zModuleLevelMiscTest.test_infocCr�Nr|rr_r@r@rA�test_warning�r�z ModuleLevelMiscTest.test_warningcCr�Nr{rr_r@r@rA�
test_error�r�zModuleLevelMiscTest.test_errorcCr�Nrrr_r@r@rA�
test_critical�r�z!ModuleLevelMiscTest.test_criticalcCs^|�ttjt�Gdd�dtj�}t�|�|�t��|�t�tj�|�t��tj�dS)Nc@r�)z;ModuleLevelMiscTest.test_set_logger_class.<locals>.MyLoggerNr�r@r@r@rArD�r�rD)r�rGrrHrKrErO�getLoggerClass)r>rDr@r@rA�test_set_logger_class�s
z)ModuleLevelMiscTest.test_set_logger_classc	sg�G�fdd�dt���}t�|�t�d�}|��dg�t��}t�|�}|�|�zD|�	tj
�|�d�|�|���
�d�|�d�|�d�|�	tj�|�d�|�|��d�W|�|�|��t�tj�dS|�|�|��t�tj�w)Ncs&eZdZdejf��fdd�	Z�ZS)z@ModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLoggerrDcst��||���d�dS)N�initialized)r7r8r�)r>r?r^)r<r�r@rAr8�szIModuleLevelMiscTest.test_subclass_logger_cache.<locals>.MyLogger.__init__)rbrcrdrr�r8r@r@�r�r;rArD�srDZjust_some_loggerr(Zhellorr)rr&rHrrOr.r/r3r<r1r2r~rMr9�truncater	rrrDrCrE)r>rDr�r0rHr@r)rA�test_subclass_logger_cache�s.









�z.ModuleLevelMiscTest.test_subclass_logger_cachecCs>t�d�}td|�\}}}|��}|�d|�|�d|�dS)Na*
            import logging

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

            a = A()
        �-czexception in __del__zValueError: some error)r�r�rr�rd�r>�code�rc�out�errr@r@rA�test_logging_at_shutdown�s

z,ModuleLevelMiscTest.test_logging_at_shutdowncCsvtj}|�tj|�t�d|�d��}td|�t|dd��}|�|�	��
�d�Wd�dS1s4wYdS)Na�
            import builtins
            import logging

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

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

            a = A()

            # Simulate the Python finalization which removes the builtin
            # open() function.
            del builtins.open
        r,r�r5zERROR:root:log in __del__)rZTESTFNr�rr�r�rr9rOrVr�)r>r�r.�fpr@r@rA�test_logging_at_shutdown_open�s
�
"�z1ModuleLevelMiscTest.test_logging_at_shutdown_opencCs>t�d�}td|�\}}}|��}|�d|�|�|d�dS)Nz�
            import logging

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

            rec()
        r,z#Cannot recover from stack overflow.r])r�r�rr�ZassertNotInrOr-r@r@rA�test_recursion_errors

	z(ModuleLevelMiscTest.test_recursion_errorr�)rbrcrdrerrrrrr!r#r%r'r+r2r4r5r@r@r@rAr{s
rc@s:eZdZdd�Zdd�Zeddd��Zdd	�Zd
d�ZdS)
�
LogRecordTestcCs6t�i�}t|�}|�|�d��|�|�d��dS)Nz<LogRecord: �>)rr�r�r=r�r�)r>r�r[r@r@rA�test_str_rep/s
zLogRecordTest.test_str_repcCsjt�}t��}|�|�ddi}t�d|�|�|jdj|�|�|jdj	d�|�
|�|��dS)NZlessZmorezless is %(less)srzless is more)r�rrr<r|rbr�rrOr�rDrC)r>rHr�r�r@r@rA�
test_dict_arg5s

zLogRecordTest.test_dict_argNc	Cs�tj}|t_zBddl}|��j}t�dd|��i�}t�tj	dd��t�dd|��i�}Wd�n1s7wY||j
|j
d�}W|t_n|t_w|rV|�|�dS|S)Nrr�Zmsg1_r�Zmsg2_)�processName�r1.processName�r2.processName)r�logMultiprocessingr��current_processr?r�rZ	swap_itemr��modulesr:r)	r�r=rTZprev_logMultiprocessing�mpr?�r1�r2�resultsr@r@rA�_extract_logrecord_process_name@s"
��z-LogRecordTest._extract_logrecord_process_namec	Csdtjv}zy|�tjd�d}t�i�}|�|jd�|�d|�}|�d|d�|�d|d�|�d|d�ddl}|�	�\}}|j
|jd	||fd
�}|��|��}|�
d|d�|�|d|d�|�d|d�|��W|r}ddl}dSdS|r�ddl}w)Nr�T�MainProcessr]r:r;r<rr�r))r�r?rOrr=r�r:rDr��Pipe�Processr/rNZassertNotEqualr�)	r>Zmultiprocessing_importedZLOG_MULTI_PROCESSINGr�rCr�Zparent_connZ
child_connr.r@r@rA�test_multiprocessingYs4

�
�
z"LogRecordTest.test_multiprocessingcCs�t�i�}|j}||j�||j�||j�||j�tj}tj}tj	}z1dt_dt_dt_	t�i�}|j
}||j�||j�||j�||j�W|t_|t_|t_	dS|t_|t_|t_	w)NF)rr��assertIsNotNoner��
threadName�processr:�
logThreads�logProcessesr=rh)r>r�ZNOT_NONEZlog_threadsZ
log_processesZlog_multiprocessing�NONEr@r@rA�
test_optional}s2









�zLogRecordTest.test_optionalr�)	rbrcrdr8r9r�rDrHrOr@r@r@rAr6.s$r6cs�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!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd9d+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Z�ZS):�BasicConfigTestz#Test suite for logging.basicConfig.csVtt|���tjj|_tj��|_tj	dd�|_
tjj|_|�
|j�gtj_dSr�)r7rPrBrr(r:rrrrr r^r-r�r!r_r;r@rArB�s

zBasicConfigTest.setUpcs<tjjdd�D]}tj�|�|��qtt|���dSr�)rr(r:rDrCr7rPrIr�r;r@rArI�s
zBasicConfigTest.tearDowncCsJttjd|j�tj��tj�|j�|jtj	dd�<tj�
|j�dS)Nr:)r�rr(r:rrErFrr rr1r-r_r@r@rAr!�s

zBasicConfigTest.cleanupcCs�t��|�ttjj�d�tjjd}|�|tj�|�|jt	j
�|j}|�|jj
tj�|�|j�|�|jtj�|�tjj|j�dS)Nr]r)rr
rOrPr(r:r�r3r0r�rer�rr��BASIC_FORMATrhr4�PercentStyler^r-)r>r�r�r@r@rA�test_no_kwargs�szBasicConfigTest.test_no_kwargscC�ht���&}tjtjdd�t�d�tj�d�|�|�	��
�d�Wd�dS1s-wYdS)Nr��r0r��Log an errorr�ERROR:root:Log an error�rr�rr
r�rr{r	rOrMr9r�r@r@rA�test_strformatstyle��

�"�z#BasicConfigTest.test_strformatstylecCrT)Nr�rUrVrrWrXr�r@r@rA�test_stringtemplatestyle�rZz(BasicConfigTest.test_stringtemplatestylecCs�dd�}tjddd�|�ttjj�d�tjjd}|�|tj�tjdddd	�}|�|jj	|jj	�|�|jj
|jj
�|�|||d�dS)
NcS�|��|��t�|�dSr�r�r Zh2rr@r@rAr!��z.BasicConfigTest.test_filename.<locals>.cleanup�test.logr�)r�r�r]rrr5)rr
rOrPr(r:r�rr0�moder?r��r>r!r�rYr@r@rA�
test_filename�szBasicConfigTest.test_filenamecCsVdd�}tjddd�tjjd}t�dd�}|�|jj|jj�|�|||d�dS)NcSr\r�rr]r@r@rAr!�r^z.BasicConfigTest.test_filemode.<locals>.cleanupr_�wb�r��filemoder)	rr
r(r:rrOr0r`r�rar@r@rA�
test_filemode�szBasicConfigTest.test_filemodecCs`t��}|�|j�tj|d�|�ttjj	�d�tjj	d}|�
|tj�|�|j|�dS)Nr6r]r)
r.r/r�rCrr
rOrPr(r:r�r3r0)r>r0r�r@r@rA�test_stream�szBasicConfigTest.test_streamcCs.tjdd�tjjdj}|�|jjd�dS)Nz%(asctime)s - %(message)s)r�r)rr
r(r:r�rOrr��r>r�r@r@rA�test_format��zBasicConfigTest.test_formatcCs,tjdd�tjjdj}|�|jd�dS)Nr�)r4r)rr
r(r:r�rOr4rhr@r@rA�test_datefmtszBasicConfigTest.test_datefmtcCs.tjdd�tjjdj}|�|jtj�dS)Nr�r�r)rr
r(r:r�r�rrrhr@r@rA�
test_style
rjzBasicConfigTest.test_stylecCsTtjj}|�tjj|�tjdd�|�tjjd�tjdd�|�tjjd�dS)N�9)r^�:)rr(r^r�r1r
rO)r>�	old_levelr@r@rA�
test_levelszBasicConfigTest.test_levelcCsp|j}t��g}tj}|ttjd|d�|ttjd|d�|ttj||d�|ttjtjd�tjddd�dS)Nr_)r�r0)r�r:)r0r:)Zloglevelrrd)r�rr3r�rerr
rr)r>r�r:r0r@r@rA�test_incompatibles

�
�
�z!BasicConfigTest.test_incompatiblecCs�t��t�tj�t��g}t��}|d�|�tj|d�|�|dtjj	d�|�|dtjj	d�|�|dtjj	d�|�
|dj�|�
|dj�|�|dj|�|�|dj|dj�dS)Nr�)r:rr])rr3r�rr5r8r
rbr(r:rIr�)r>r:r�r@r@rA�
test_handlers)s
�zBasicConfigTest.test_handlerscCs�t��}t��}t�|�g}t�|�g}tjtj|d�t�d�t�d�t�d�|�	t
tjj�d�tjtj
|dd�t�d�t�d�t�d�|�	t
tjj�d�|�	|����d�|�	|����d	�dS)
Nr�r�r}r~r]T)r^r:�forcezWARNING:root:warnz WARNING:root:warn
INFO:root:info)r.r/rr3r
rpr|r}r~rOrPr(r:rrrMr9)r>Z
old_string_ioZ
new_string_ioZold_handlersZnew_handlersr@r@rA�
test_force:s,



�


��zBasicConfigTest.test_forcecCsz^d}tjd|ddtjd�|�ttjj�d�tjjd}|�|tj�|�|j	|�t�
d�W|��tddd	��}|�
���}Wd�n1sMwYt�d�|�|d�dS|��tddd	��}|�
���}Wd�n1szwYt�d�|�|d�w)
Nr�r_r��%(message)s�r�r��errorsr�r^r]r�.The Øresund Bridge joins Copenhagen to Malmör5�rr
r2rOrPr(r:r�rr�r~rCr9rVr9rr�r>r�r�r�rUr@r@rA�
test_encodingOs6��
���
�zBasicConfigTest.test_encodingcCsz^d}tjd|ddtjd�|�ttjj�d�tjjd}|�|tj�|�|j	|�t�
d�W|��tdd	d
��}|�
���}Wd�n1sMwYt�d�|�|d�dS|��tdd	d
��}|�
���}Wd�n1szwYt�d�|�|d�w)Nr3r_rrurvr]rrxr�r5z*The resund Bridge joins Copenhagen to Malmryrzr@r@rA�test_encoding_errorscs.��
��
z$BasicConfigTest.test_encoding_errorscCs"zdd}tjd|dtjd�|�ttjj�d�tjjd}|�|tj�|�|j	|�|�|j
d�t�d�W|��t
dd	d
��}|����}Wd�n1sSwYt�d�|�|d�dS|��t
dd	d
��}|����}Wd�n1s�wYt�d�|�|d�w)Nr3r_ru)r�r�r�r^r]r�backslashreplaceu<😂: ☃️: The Øresund Bridge joins Copenhagen to Malmör�r5zL\U0001f602: \u2603\ufe0f: The \xd8resund Bridge joins Copenhagen to Malm\xf6)rr
r2rOrPr(r:r�rr�rwr~rCr9rVr9rrrzr@r@rA�test_encoding_errors_defaultvs.��
��
z,BasicConfigTest.test_encoding_errors_defaultcsRz|d}tjd|ddtjd�|�ttjj�d�tjjd}|�|tj�|�|j	|�|�
|j�g��fdd�}||_t�
d	�|���|�d
�d�W|��tddd��}|����}Wd�n1skwYt�d�|�|d
�dS|��tddd��}|����}Wd�n1s�wYt�d�|�|d
�w)Nr3r_rurvr]rcs t��\}}}��t|��dSr�)r�r@r�r�)r�r%r�r)r@rA�dummy_handle_error�szEBasicConfigTest.test_encoding_errors_none.<locals>.dummy_handle_errorrxz:'ascii' codec can't encode character '\xd8' in position 4:r�r5r)rr
r2rOrPr(r:r�rr�rhrwr\r~r=rdrCr9rVr9rr)r>r�r�rr�rUr@r)rA�test_encoding_errors_none�s>�

��
��
z)BasicConfigTest.test_encoding_errors_noneNcsfg�tj����fdd�}t��td|�tt|�}|dur$||d�n|d����difg�dS)Ncs<��tjj}tj�d���tjj|���||f�dS)N�d)rr(r^r1r�r�)rrro�r�Zold_basic_configr>r@rA�my_basic_config�s
z2BasicConfigTest._test_log.<locals>.my_basic_configr
ztest mer@)rr
rrvr'rO)r>rr^r�rr@r�rAr�s
zBasicConfigTest._test_logcCrr)rrrpr_r@r@rAr�rzBasicConfigTest.test_logcCrrrr_r@r@rAr�r�zBasicConfigTest.test_debugcCrrrr_r@r@rAr�r�zBasicConfigTest.test_infocCrr rr_r@r@rAr!�r�zBasicConfigTest.test_warningcCrr"rr_r@r@rAr#�r�zBasicConfigTest.test_errorcCrr$rr_r@r@rAr%�r�zBasicConfigTest.test_criticalr�) rbrcrdrerBrIr!rSrYr[rbrfrgrirkrlrprqrrrtr{r|r~r�rrrrr!r#r%r@r@r@r;rArP�s:	


"rPcsLeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	�Z
S)�LoggerAdapterTestcs�tt|���tjdd��t�|_tj|_|j�	|j�|�
|jj|j�|�
|jj��fdd�}|�
|�|�
tj
�tj|jdd�|_dS)Ncs�tjdd�<dSr�)rrr@�Zold_handler_listr@rAr!�rz(LoggerAdapterTest.setUp.<locals>.cleanup�r�rA)r7r�rBrrr�rr(r�r<r�rDrCr�ry�adapter)r>r!r;r�rArB�s
zLoggerAdapterTest.setUpc
C�d}d}zddWnty&}z|}|j�||j�WYd}~nd}~ww|�t|jj�d�|jjd}|�|jtj	�|�|j
|�|�|j|jf�|�|j|j
||jf�dS�Nztesting exception: %rr]r)rqr�rrrOrPr�r�rrlr�rr@r<�
__traceback__�r>r�rrr�r�r@r@rA�test_exception��"���z LoggerAdapterTest.test_exceptionc
Cs�zddWnty}z|}WYd}~nd}~ww|jjd|d�|�t|jj�d�|jjd}|�|j|j||j	f�dS)Nr]rz
exc_info testrp)
rqr�rrOrPrr�r@r<r�)r>r�rrr�r@r@rA�test_exception_excinfo�s���z(LoggerAdapterTest.test_exception_excinfocCshd}|j�||j�|�t|jj�d�|jjd}|�|jtj�|�|j	|�|�|j
|jf�dS)Nzcritical test! %rr]r)r�rrrOrPr�r�rrjr�r)r>r�r�r@r@rAr%szLoggerAdapterTest.test_criticalcCsD|jjjj}d|jjj_|�t|jjjd|�|�|j�d��dS)N�!rG� )r�r�rrGr�r�r�isEnabledFor�r>rr@r@rA�test_is_enabled_fors�z%LoggerAdapterTest.test_is_enabled_forcCsN|�|j���|jjD]}|j�|�q|�|j���|�|j���dSr�)r=r�r9r�r:rDrrr@r@rA�test_has_handlerss
z#LoggerAdapterTest.test_has_handlerscCsRGdd�dtj�}d}||jdd�}||dd�}d|_|�t|�t|��|�tj||j�|�t	|jj
�d�|jj
d}|�|jtj�|�|jd|���|�|j
|jf�|j}|�|j|�|�|jj|�t�}z||_|�|j|�|�|j|�|�|jj|�W||_n||_w|�|j|�|�|j|�|�|jj|�dS)	Nc@r�)z.LoggerAdapterTest.test_nested.<locals>.Adapter�AdaptercSs|j�d|��|fSr6�r�)r>r�r�r@r@rArK$�z6LoggerAdapterTest.test_nested.<locals>.Adapter.processN)rbrcrdr�rKr@r@r@rAr�!sr�zAdapters can be nested, yo.r�ZAdapterAdapterr]rzAdapter AdapterAdapter )rryr�r�rOrkrzrjrrPr�r�r�rrrbrK)r>r�r�r�Zadapter_adapterr�Zorig_managerZtemp_managerr@r@rA�test_nested s2zLoggerAdapterTest.test_nested)rbrcrdrBr�r�r%r�r�r�r@r@r@r;rAr��s

	r�cs�eZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Z�ZS)#�
LoggerTestcsbtt|���t�|_tjdd�|_|j�|j�|�	|jj
|j�|�	|jj�|�	tj�dS)NZblah�r?)
r7r�rBr�rrrEr�r<r�rDrCr�r_r;r@rArBDszLoggerTest.setUpcCs,|�td|jjd�|�td|jjd�dS)Nz,Level not an integer or a valid string: Nonez.Level not an integer or a valid string: (0, 0))rr)r�rGr�r1r_r@r@rA�test_set_invalid_levelMs��z!LoggerTest.test_set_invalid_levelc
Cr�r�)rqr�rrrOrPr�r�rrlr�rr@r<r�r�r@r@rAr�Ur�zLoggerTest.test_exceptioncCsHt�tdd��|�t|jjdd�Wd�dS1swYdS)NraTrw�test message)r�	swap_attrrr�rGr�rzr_r@r@rA�!test_log_invalid_level_with_raisefs"�z,LoggerTest.test_log_invalid_level_with_raisecCsBt�tdd��|j�dd�Wd�dS1swYdS)NraFrwr�)rr�rr�rzr_r@r@rA�test_log_invalid_level_no_raisejs"�z*LoggerTest.test_log_invalid_level_no_raisecsPg�t�|tjd�fdd��|jjdd�|�t��d�|�d�d�dS)	N�print_stackcs��|���Sr�)r�rM)r�r�rr@rArqrz=LoggerTest.test_find_caller_with_stack_info.<locals>.<lambda>Tr�r]r�r)rrvr�	tracebackr��
findCallerrOrPr_r@rrA� test_find_caller_with_stack_infons
�z+LoggerTest.test_find_caller_with_stack_infocsd���fdd���fdd���fdd�}�jj}|���|djd	�|dj}�d7�|���|djd
���|dj|�|dj}�d7�|���|djd���|dj|�|dj}�d7�|���|djd���|dj|�dS)
Nr]cs�jjd�d�dS)Nr�)�
stacklevel)r�r|r@)r>�	the_levelr@rA�	innermost{r�z>LoggerTest.test_find_caller_with_stacklevel.<locals>.innermostc�
��dSr�r@r@)r�r@rAr�~r�z:LoggerTest.test_find_caller_with_stacklevel.<locals>.innercr�r�r@r@)r�r@rA�outer�r�z:LoggerTest.test_find_caller_with_stacklevel.<locals>.outerr�r�r�r�� test_find_caller_with_stacklevel)rr�rOr�r�rI)r>r�r�r�r@)r�r�r>r�rAr�xs,


z+LoggerTest.test_find_caller_with_stacklevelc
Cs�d}d}d}}}}}}}	t�|||||||||	�	}
dt|
j���D]}|di}|jt|jj|||||||||	d�q(dS)N�	my record�
)r�r��
some value�rA�sinfo)	r�_logRecordFactoryrT�__dict__�keysr�r1r��
makeRecord)
r>r?r^r�lnor�rr@r�r��rvr�rAr@r@rA�%test_make_record_with_extra_overwrite�s�
��z0LoggerTest.test_make_record_with_extra_overwritecCs\d}d}d}}}}}}}	ddi}
|jj||||||||
|	d�	}|�d|j�dS)Nr�r�Z	valid_keyr�r�)r�r�rdr�)r>r?r^rr�r�rr@r�r�rAr�r@r@rA�(test_make_record_with_extra_no_overwrite�s�z3LoggerTest.test_make_record_with_extra_no_overwritecCs>|�|j���|jjD]}|j�|�q|�|j���dSr�)r=r�r9r:rDrrr@r@rAr��szLoggerTest.test_has_handlerscCs"t�d�}d|_|�|���dS)Nz
blah.childF)rrr�rr9)r>Zchild_loggerr@r@rA�test_has_handlers_no_propagate�s
z)LoggerTest.test_has_handlers_no_propagatecCs>|jjj}d|jj_|�t|jjd|�|�|j�d��dS)N�rG�)r�rrGr�r�rr�r�r@r@rAr��s

zLoggerTest.test_is_enabled_forcCs`|jj}|jjj}d|j_d|jj_|�t|jd|�|�t|jjd|�|�|j�d��dS)NTr�rrGr�)r�rrrGr�r�rr�)r>Zold_disabledrr@r@rA�#test_is_enabled_for_disabled_logger�s

z.LoggerTest.test_is_enabled_for_disabled_loggercCs�t��}|�|tj�|�|t�d��|�|t�d��|�|t�d��|�|t�d�j�|�|t�d�j�|�|t�d�j�|�|t�d��|�|t�d�j�dS)Nrr(r��foo.bar�)rrrbr(�parentZassertIsNot)r>r(r@r@rA�test_root_logger_aliases�sz#LoggerTest.test_root_logger_aliasescCs$|�ttjt�|�ttjd�dS)Nsfoo)r�rGrr�anyr_r@r@rA�test_invalid_names�szLoggerTest.test_invalid_namescCsNttjd�D]}dD]}t�|�}t�||�}t�|�}|�||�qqdS)Nr])rr(r�r�zbaz.bar)rrQ�HIGHEST_PROTOCOLrrrrRrb)r>�protor?r�r[Z	unpickledr@r@rA�
test_pickling�s

��zLoggerTest.test_picklingcCs6|j}t�d�}t�d�}|�tj�|�|��tj�|�|ji�|�|�	tj��|�
|�	tj��|�|jtjdtjdi�|�|ji�|�|�	tj��|�|ji�|�|�	tj��|�|jtjdi�|�tj�|�|��tj�|�|ji�|�
|�	tj��|�tj
�|�|��tj�|�|ji�|�|ji�|�|ji�|�
|�	tj��|�|�	tj��|�
|�	tj��|�|�	tj��|�|�	tj��t��|�|��tj�|�|ji�|�|ji�|�|ji�|�
|�	tj��|�
|�	tj��|�
|�	tj��dS)NrPrRTF)r+rrr1rlrOr,�_cacher=r�rr2rjr�rG)r>r(r)r*r@r@rA�test_caching�sH

zLoggerTest.test_caching)rbrcrdrBr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r@r@r@r;rAr�Bs$	

	
r�c@r�)�BaseFileTestz1Base class for handler tests that write log filescCs0t�|�t�dd�\}|_t�|�g|_dS)Nr(ztest_logging-2-)rrBr�rrrrC�rmfiles)r>rr@r@rArB s


zBaseFileTest.setUpcCs>|jD]}t�|�qtj�|j�rt�|j�t�|�dSr�)r�rrrr	rrrI)r>rr@r@rArI&s

zBaseFileTest.tearDowncCs*|jtj�|�d|d�|j�|�dS)z7Assert a log file is there and register it for deletionzLog file %r does not exist�r�N)r=rrr	r�r�)r>r�r@r@rA�
assertLogFile-s�zBaseFileTest.assertLogFilec
Cst�dtjdd|��ddd�S)Nr�r.r])rrhr2r`r_r@r@rA�next_rec3s�zBaseFileTest.next_recN)rbrcrdrerBrIr�r�r@r@r@rAr�sr�c@r�)�FileHandlerTestcCszt�|j�tj|jddd�}|�|j�|�tj�	|j��|�
t�i��|�|j�|�
tj�	|j��|��dS)Nr�Tr�)rrrrrrhr0rrr	rr�rIr=rC)r>�fhr@r@rA�
test_delay8szFileHandlerTest.test_delaycCs�t�|j�tj|jddd�}|�t�d��|�|���|�	�|�|���t
|j��}|�|���
�d�Wd�dS1sDwYdS)Nr�r)r�r`rurk)rrrrrr8r5r�r�rCr9rOrVr9)r>r�r3r@r@rA�%test_emit_after_closing_in_write_modeBs"�z5FileHandlerTest.test_emit_after_closing_in_write_modeN)rbrcrdr�r�r@r@r@rAr�7s
r�c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	�dd��Z
d
S)�RotatingFileHandlerTestcCs`tjj|jddd�}|�|�d��|��tjjtjddd�}|�|�|�	���|��dS)Nr�r�r��maxBytesr])
rr:rrr�shouldRolloverrCr�devnullr��r>�rhr@r@rA�test_should_not_rolloverNs��z0RotatingFileHandlerTest.test_should_not_rollovercCs4tjj|jddd�}|�|�|����|��dS)Nr�r]r�)rr:rrr=r�r�rCr�r@r@rA�test_should_rollover\sz,RotatingFileHandlerTest.test_should_rollovercCs8tjj|jdd�}|�|���|�|j�|��dS)Nr�r5)rr:rrr�r�r�rCr�r@r@rA�test_file_createdasz)RotatingFileHandlerTest.test_file_createdcCs�dd�}tjj|jdddd�}||_|�|���|�|j�|�|���|�||jd��|�|���|�||jd��|�t	j
�||jd	���|��dS)
NcS�|dS�N�.testr@r�r@r@rA�namerjrWz>RotatingFileHandlerTest.test_rollover_filenames.<locals>.namerr�r�r]�r��backupCountr��.1�.2�.3)
rr:rrr�r�r�r�rrrr	rC)r>r�r�r@r@rA�test_rollover_filenamesis
�z/RotatingFileHandlerTest.test_rollover_filenamescCs�Gdd�dtjj�}||jdddd�}|�|�|j�|jd�|�|���|�|j�|�|���|�|�|jd�d	�|�	t
j�|�|jd���|�
�dS)
Nc@r�)zZRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotatorcSs|dSr�r@)r>r?r@r@rAr�zrWz`RotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.namercSs$tj�|�rt�||d�dSdS)N�.rotated)rrr	r&)r>�source�destr@r@rA�rotator}s�zbRotatingFileHandlerTest.test_namer_rotator_inheritance.<locals>.HandlerWithNamerAndRotator.rotatorN)rbrcrdr�r�r@r@r@rA�HandlerWithNamerAndRotatoryr\r�r�r�r]r�r�r�r�)rr:rrrOr�r�r�r�rrrr	rC)r>r�r�r@r@rA�test_namer_rotator_inheritancexs
�z6RotatingFileHandlerTest.test_namer_rotator_inheritancecCs�dd�}dd�}tjj|jdddd�}||_||_|��}|�|�|�|j�|��}|�|�||jd	�}|�|�t	j
}t|d
��}|��}	t
�|	�}
|�|
�d�|j|�Wd�n1sewY|�|���||jd�}|�|�t|d
��}|��}	t
�|	�}
|�|
�d�|j|�Wd�n1s�wY|�|���||jd�}t|d
��}|��}	t
�|	�}
|�|
�d�|j|�Wd�n1s�wY|�t	j�||jd
���|��dS)NcSr�)Nz.gzr@r�r@r@rAr��rWz3RotatingFileHandlerTest.test_rotator.<locals>.namerc	Ss�t|d��,}|��}t�|d�}t|d��
}|�|�Wd�n1s%wYWd�n1s4wYt�|�dS)N�rbr�rc)r9rV�zlib�compressrVrr)r�r�ZsfrU�
compressed�dfr@r@rAr��s���z5RotatingFileHandlerTest.test_rotator.<locals>.rotatorr�r�r]r�r�r�r3r�r�)rr:rrr�r�r�r�r�r�linesepr9rVr��
decompressrOr�r�rrr	rC)r>r�r�r�Zm1Zm2r�newliner�r�rUr@r@rA�test_rotator�sJ
�



�

�
�z$RotatingFileHandlerTest.test_rotatorN)rbrcrdr�r�r�r�r�rZ
requires_zlibr�r@r@r@rAr�Msr�c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TimedRotatingFileHandlerTestcCsJtjjtjdddd�}t�d�t�ddi�}|�|�	|��|�
�dS)N�Sr�r]�r�r�皙�����?r�ztesting - device file)rr:rrr�r r"r�rr�rC)r>r�r�r@r@rAr��s
�
z5TimedRotatingFileHandlerTest.test_should_not_rolloverc	s�tjj|jdddd�}t�d�}|�|�t�ddi�}|�|�|�|j�t	�
d�t�dd	i�}|�|�|��d
}tj�
�}d}t|�D]"}|tj|d�}	|j|	�d
��tj���}|rk|j���qlqId|}
|s�tj�|j�\}��fdd�t�|�D�}td|�d�tjd�td|tjd�|D]*}
td|
�tj�||
�}t|d��}t|���Wd�n1s�wYq�|j||
d�dS)Nr�r�r]r�r�r�ztesting - initialr�ztesting - after delayFi,�Zsecondsz.%Y-%m-%d_%H-%M-%Sz,No rotated files found, went back %d secondscsg|]	}|���r|�qSr@)r�)r�r��rr@rAr��sz>TimedRotatingFileHandlerTest.test_rollover.<locals>.<listcomp>z
Test time: %sz%Y-%m-%d %H-%M-%S�r�zThe only matching files are: %szContents of %s:r�r�)rr:rrr5r8r�r�r�r r"rCr�r\r�	timedelta�strftimerrr	r�r�r��listdirr1r�rer�r9rVr=)r>r�r�rArB�foundr\�GO_BACK�secs�prevr�Zdn�filesr�rZtfr@r�rA�
test_rollover�sJ
�





���z*TimedRotatingFileHandlerTest.test_rollovercCsX|j}|ttjj|jdddd�|ttjj|jdddd�|ttjj|jdddd�dS)N�Xr�Tr��WZW7)r�rrr:rr)r>r�r@r@rA�test_invalid�s

�

�


�z)TimedRotatingFileHandlerTest.test_invalidc	Cs�d}t�ddd�}tjj|jddddd|d�}z#|�|�}|�||d�|�|d	�}|�||d
�W|��dS|��w)Nr�r��MIDNIGHTr]T�r��when�intervalr�r��atTime��жi@�)	r�r rr:rr�computeRolloverrOrC)r>�currentTimer
r�rXr@r@rA�"test_compute_rollover_daily_attime�s�
z?TimedRotatingFileHandlerTest.test_compute_rollover_daily_attimec	
Cs8tt���}||d}t�ddd�}t�|�j}td�D]|}tjj|j	dd|ddd|d	�}ze||kr;d||}n||}|d9}|d
7}||7}|�
|�}||krbtdtj�tdt
��|�||�||krp|d
7}|�
|d�}||kr�tdtj�tdt
��|�||�W|��q|��wdS)N�Qrr�r�zW%dr]Trrzfailed in timezone: %dzlocal vars: %si�:	r)r}r r�r��tm_wdayrrr:rrr
r1�timezone�localsrOrC)	r>rZtodayr
ZwdayZdayr�rYrXr@r@rA�#test_compute_rollover_weekly_attimes<�
�z@TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attimec	Cs�tjdd�}|�tj|�g}tj��}td�D]}|�|�	d��|tj
dd�7}qd}g}g}|D]B}tj�
|d|�}	tjj|	d	dd
dd�}
|�|
�|�d
�rb|D]}|�d||f�qUq3dd�|
_|D]}|�d||f�qiq3|D]}tj�
||�}	t|	d��}
Wd�n1s�wYqxt|�D]\\}}||}
|
��}|�t|�d�|�d
�r�d|}	|D]}tj�|�\}}|�|�|	��q�q�|D]&}tj�|�\}}|�|�d��|�|�|d�o�|t|�d���q�q�dS)Nr0r�r�z%Y-%m-%d_%H-%M-%Sr�r�)�a.bza.b.czd.ezd.e.fz%s.logr[rT)rr	r�r�rz	%s.log.%scSs|�dd�dS)Nr(r)r&r�r@r@rArEszKTimedRotatingFileHandlerTest.test_compute_files_to_delete.<locals>.<lambda>z	%s.%s.logrcr'z%s.log.r(r�r�)r��mkdtempr��shutil�rmtreer�r\rr�r�r�rrr�rr:rr�r�r9�	enumerateZgetFilesToDeleterOrPr�r=r��isdigit)r>Zwd�timesr�r��prefixesrZrotatorsr�r.r�r�rr�Z
candidatesr)r�r@r@rA�test_compute_files_to_delete.sd

�

�
���
����z9TimedRotatingFileHandlerTest.test_compute_files_to_deleteN)	rbrcrdr�rrrrrr@r@r@rAr��s
*	(r�cKstjdi|��tjdd�S)Nr]r�r@)r�r�)rr@r@rAr�_sr�)r�r])�M�<)�Hi)�Dr)rrZW0r�)ZdaysZhourscCsLtjj|jd|dddd�}d}|�|�}||kr�|dkr�zg|jr&t�|�}nt�|�}|d}|d	}|d
}	tjj	|d|d|	}
||
}t
d||jftjd
�t
d|tjd
�t
d|tjd
�t
d|	tjd
�t
d|
tjd
�t
d|tjd
�Wnt
y�t
dt��dtjd
�Ynw|�||�|��dS)Nr�r]rT)r�rr	r�r�grr'rr�r z
t: %s (%s)r�zcurrentHour: %szcurrentMinute: %szcurrentSecond: %szr: %sz
result: %sz exception in diagnostic code: %s)rr:rrr
r�r r��	localtimeZ	_MIDNIGHTr1r�rer0r@rOrC)r>r�expr�rrXr�ZcurrentHourZ
currentMinuteZ
currentSecondr�r�r@r@rA�test_compute_rolloverjsB�

����r&ztest_compute_rollover_%sz>win32evtlog/win32evtlogutil/pywintypes required for this test.c@rP)�NTEventLogHandlerTestc
Cs�d}t�d|�}t�|�}ztj�d�}Wntjy-}z|jdkr(t	�
d���d}~wwt�ddi�}|�|�|�
�|�|t�|��tjtjB}d}d}	t�|||	�}
|
D]}|jdkrbqZt�||�}|d	krmqZd
}d|	}|j||d�dS)
NZApplicationZtest_loggingr�z#Insufficient privileges to run testr�zTest Log MessageFr�zTest Log Message
Tz3Record not found in event log, went back %d recordsr�)�win32evtlogZOpenEventLogZGetNumberOfEventLogRecordsrr:ZNTEventLogHandler�
pywintypesr{�winerrorrNZSkipTestr�rrCZ
assertLessZEVENTLOG_BACKWARDS_READZEVENTLOG_SEQUENTIAL_READZReadEventLogZ
SourceName�win32evtlogutilZSafeFormatMessager=)r>ZlogtypeZelhZnum_recsrHr�r��flagsr�r��eventsr�r@r@rAr��s>


��
�
z NTEventLogHandlerTest.test_basicN)rbrcrdr�r@r@r@rAr'�r�r'c@rP)�MiscTestCasecCshd�}tj|t|d�dS)N>
rrFr,�Filterer�currentframe�
RootLogger�PlaceHolderr(r=rLrRrM�StrFormatStyle)�not_exported)rZcheck__all__r)r>r4r@r@rA�test__all__�szMiscTestCase.test__all__N)rbrcrdr5r@r@r@rAr.�rXr.cCs*t�dd�}|��t�|jddd�dS)N�LC_ALLr)rZrun_with_locale�	__enter__rNZaddModuleCleanup�__exit__)�cmr@r@rA�setUpModule�sr:�__main__r�)�rerZlogging.handlersZlogging.configr�r�rr�rrQr.r�r
rrar#rJrrqrOr�r�Ztest.support.script_helperrrr�rZtest.supportrrrrZtest.support.logging_helperr	r�r,r rNr�r�Zhttp.serverr
r�urllib.parserr
�socketserverrrrrr��simplefilter�DeprecationWarningr�ror(r+r)r�r�ZTestCaserrfr�ZSILENTr�ZTERSEZEFFUSIVEr�r�Z	TALKATIVEr�Z
CHATTERBOXZBORINGrr�r�r�r�r�r�r�rKrQr3rYr]r`rprmr�r�r�r�rOr�r�r�r�r5r�r�r>r^rur`rgrnrprtZIPV6_ENABLEDruryr�r�r�r�r�r�r�r�r>rOrhrYrZr`r:r�Z
unittest.mockrvrwr�r�Ztzinfor�r�r�r�r�r�r�r�r�r�r�r�r�rr6rPr�r�r�r�r�r�r�rr%r&r�r'r.r:rb�mainr@r@r@rA�<module>sz

���mF�
YT,J2)/ hdY@C�M41
(X#i
`	'W4hBl\k(�!
#
�
© 2025 GrazzMean