a
    )(b!                     @   s&  d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ddl m!Z! eee" e#f dddZ$G dd dZ%G dd dej&Z'eeef dddZ(G dd dej)Z*dS )z+
Test cases for L{twisted.logger._format}.
    N)getsourcefile)BytesIOTextIOWrapper)	Formatter	LogRecordStreamHandler	getLogger)ListOptionalTuple)BrokenMethodImplementation)verifyObject)currentframe)Failure)unittest   )ILogObserverLogEvent)LogLevel)STDLibLogObserverreturnc                  C   s&   t d} ttj| jd  | jd fS )z
    Retrive the file name and line number immediately after where this function
    is called.

    @return: the file name and line number
       __name__)r   r   sysmodules	f_globalsf_lineno)Zcaller r   >lib/python3.9/site-packages/twisted/logger/test/test_stdlib.pynextLine   s    r    c                   @   s:   e Zd ZdZddddZddddZeddd	ZdS )
StdlibLoggingContainerzF
    Continer for a test configuration of stdlib logging objects.
    Nr   c                 C   sZ   t d| _| j | _| jtj t | _| j	| j t
 \| _| _| j	| j d S )N )r   
rootLoggerZgetEffectiveLeveloriginalLevelsetLevel
py_loggingDEBUGBufferedHandlerbufferedHandlerZ
addHandlerhandlerAndBytesIOstreamHandleroutputselfr   r   r   __init__-   s    
zStdlibLoggingContainer.__init__c                 C   sB   | j | j | j | j | j | j | j  | j  dS )z#
        Close the logger.
        N)r#   r%   r$   ZremoveHandlerr)   r+   closer,   r-   r   r   r   r0   9   s
    
zStdlibLoggingContainer.closec                 C   s   | j  dS )zd
        Get the output to the underlying stream as text.

        @return: the output text
        utf-8)r,   getvaluedecoder-   r   r   r   outputAsTextC   s    z#StdlibLoggingContainer.outputAsText)r   
__module____qualname____doc__r/   r0   strr4   r   r   r   r   r!   (   s   
r!   c                   @   s   e Zd ZdZddddZedddZeee	e
 ef dd	d
ZddddZddddZddddZddddZddddZddddZddddZddddZdS )STDLibLogObserverTestsz)
    Tests for L{STDLibLogObserver}.
    Nr   c              
   C   sH   t  }ztt| W n. tyB } z| | W Y d}~n
d}~0 0 dS )z=
        L{STDLibLogObserver} is an L{ILogObserver}.
        N)r   r   r   r   Zfail)r.   observerer   r   r   test_interfaceQ   s
    z%STDLibLogObserverTests.test_interfacec                 C   s   t  }| |j |S )zj
        Create a logging object we can use to test with.

        @return: a stdlib-style logger
        )r!   Z
addCleanupr0   )r.   Zloggerr   r   r   	py_logger[   s    z STDLibLogObserverTests.py_logger)eventsr   c                 G   s:   |   }ttjd d}|D ]}|| q|jj| fS )z
        Send one or more events to Python's logging module, and capture the
        emitted L{LogRecord}s and output stream as a string.

        @param events: events

        @return: a tuple: (records, output)
        r   )Z
stackDepth)r=   r   ZdefaultStackDepthr)   recordsr4   )r.   r>   Zplr:   eventr   r   r   logEvente   s    	
zSTDLibLogObserverTests.logEventc                 C   s4   |  i \}}| t|d | |d jd dS )z
        Logger name.
        r   r   ZtwistedN)rA   assertEquallennamer.   r?   r,   r   r   r   	test_name{   s    z STDLibLogObserverTests.test_namec           	      C   s   dt jtjt jtjt jtjt jtjt j	tj
t ji}g }| D ]2\}}i }|durZ||d< t||d< || q>| j| \}}| t|t| tt|D ]}| || j|| d  qdS )z
        Log levels.
        NZ	log_levelZ
py_levelno)r&   INFOr   debugr'   infowarnZWARNINGerrorZERRORZcriticalZCRITICALitemsintappendrA   rB   rC   rangeZlevelno)	r.   ZlevelMappingr>   levelZpyLevelr@   r?   r,   ir   r   r   test_levels   s$    
z"STDLibLogObserverTests.test_levelsc                 C   s`   t  \}}| i \}}| t|d | |d j| | |d j| | |d j dS )zb
        C{pathname}, C{lineno}, C{exc_info}, C{func} is set properly on
        records.
        r   r   N)r    rA   rB   rC   pathnamelinenoZassertIsNoneexc_info)r.   filenameZlogLiner?   r,   r   r   r   test_callerInfo   s    
z&STDLibLogObserverTests.test_callerInfoc                 C   sV   t ddd}| |\}}| t|d | t|d jd | |d jd dS )	zL
        Basic formattable event passes the format along correctly.
        Hello, {who}!dude
log_formatwhor   r   zHello, dude!r   N)dictrA   rB   rC   r8   msgargsr.   r@   r?   r,   r   r   r   test_basicFormat   s
    z'STDLibLogObserverTests.test_basicFormatc                 C   sD   t ddd}| |\}}| t|d | |dt| dS )z<
        Basic formattable event renders correctly.
        rX   rY   rZ   r   z:Hello, dude!
N)r]   rA   rB   rC   Z
assertTrueendswithreprr`   r   r   r   test_basicFormatRendered   s    z/STDLibLogObserverTests.test_basicFormatRenderedc                 C   s8   |  i \}}| t|d | t|d jd dS )z'
        Event with no format.
        r   r   r"   N)rA   rB   rC   r8   r^   rE   r   r   r   test_noFormat   s    z$STDLibLogObserverTests.test_noFormatc                 C   s   dddd}z
|  W n t y0   t }Y n0 tdd|d}| |\}}| t|d | d| | d	| | d
| dS )zK
        An event with a failure logs the failure details as well.
        Nr   c                   S   s   dd  d S Nr   r   r   r   r   r   r   failing_func   s    z9STDLibLogObserverTests.test_failure.<locals>.failing_funcHi mommer[   r\   Zlog_failurer   in failing_funcZeroDivisionError)rl   r   r]   rA   rB   rC   assertInr.   rg   Zfailurer@   r?   r,   r   r   r   test_failure   s    
z#STDLibLogObserverTests.test_failurec                 C   s   dddd}z
|  W n  t y8   t }|  Y n0 tdd|d}| |\}}| t|d | d| | d	| | d
| dS )z
        A cleaned Failure object has a fake traceback object; make sure that
        logging such a failure still results in the exception details being
        logged.
        Nr   c                   S   s   dd  d S rf   r   r   r   r   r   rg      s    z@STDLibLogObserverTests.test_cleanedFailure.<locals>.failing_funcrh   ri   rj   r   rk   rl   )rl   r   ZcleanFailurer]   rA   rB   rC   rm   rn   r   r   r   test_cleanedFailure   s    
z*STDLibLogObserverTests.test_cleanedFailure)r   r5   r6   r7   r<   r!   r=   r   r   r	   r   r8   rA   rF   rR   rW   ra   rd   re   ro   rp   r   r   r   r   r9   L   s   

	#
	r9   c                  C   s<   t  } tj}t| ddd}t|}t|}|| || fS )z
    Construct a 2-tuple of C{(StreamHandler, BytesIO)} for testing interaction
    with the 'logging' module.

    @return: handler and io object
    r1   
)encodingnewline)r   r&   ZBASIC_FORMATr   r   r   ZsetFormatter)r,   templatestreamZ	formatterZhandlerr   r   r   r*     s    
r*   c                   @   s.   e Zd ZdZddddZeddddZdS )	r(   zN
    A L{py_logging.Handler} that remembers all logged records in a list.
    Nr   c                 C   s   t j|  g | _dS )z5
        Initialize this L{BufferedHandler}.
        N)r&   Handlerr/   r?   r-   r   r   r   r/     s    zBufferedHandler.__init__)recordr   c                 C   s   | j | dS )z&
        Remember the record.
        N)r?   rN   )r.   rw   r   r   r   emit   s    zBufferedHandler.emit)r   r5   r6   r7   r/   r   rx   r   r   r   r   r(     s   r(   )+r7   Zloggingr&   r   inspectr   ior   r   r   r   r   r   typingr	   r
   r   Zzope.interface.exceptionsr   Zzope.interface.verifyr   Ztwisted.python.compatr   Ztwisted.python.failurer   Ztwisted.trialr   Z_interfacesr   r   Z_levelsr   Z_stdlibr   r8   rM   r    r!   ZTestCaser9   r*   rv   r(   r   r   r   r   <module>   s(   $ 9