o
    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! deee" e#f fddZ$G dd dZ%G dd dej&Z'deeef f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)caller r   A/usr/lib/python3/dist-packages/twisted/logger/test/test_stdlib.pynextLine   s   r    c                   @   s2   e Zd ZdZd
ddZd
ddZdefdd	ZdS )StdlibLoggingContainerzF
    Continer for a test configuration of stdlib logging objects.
    r   Nc                 C   sZ   t d| _| j | _| jtj t | _| j	| j t
 \| _| _| j	| j d S )N )r   
rootLoggergetEffectiveLeveloriginalLevelsetLevel
py_loggingDEBUGBufferedHandlerbufferedHandler
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%   removeHandlerr*   r-   closer.   r/   r   r   r   r3   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   N)r   
__module____qualname____doc__r1   r3   strr7   r   r   r   r   r!   (   s
    


r!   c                   @   s   e Zd ZdZdddZdefddZdedee	e
 ef fd	d
ZdddZdddZdddZdddZdddZdddZdddZdddZdS )STDLibLogObserverTestsz)
    Tests for L{STDLibLogObserver}.
    r   Nc              
   C   sH   t  }ztt| W dS  ty# } z| | W Y d}~dS d}~ww )z=
        L{STDLibLogObserver} is an L{ILogObserver}.
        N)r   r   r   r   fail)r0   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!   
addCleanupr3   )r0   loggerr   r   r   	py_logger[   s   z STDLibLogObserverTests.py_loggereventsc                 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   )
stackDepth)rD   r   defaultStackDepthr*   recordsr7   )r0   rE   plr?   eventr   r   r   logEvente   s   	
zSTDLibLogObserverTests.logEventc                 C   s4   |  i \}}| t|d | |d jd dS )z
        Logger name.
        r   r   twistedN)rK   assertEquallennamer0   rH   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 ]\}}i }|dur-||d< t||d< || q| j| \}}| t|t| tt|D ]}| || j|| d  qPdS )z
        Log levels.
        N	log_level
py_levelno)r'   INFOr   debugr(   infowarnWARNINGerrorERRORcriticalCRITICALitemsintappendrK   rM   rN   rangelevelno)	r0   levelMappingrE   levelpyLevelrJ   rH   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    rK   rM   rN   pathnamelinenoassertIsNoneexc_info)r0   filenamelogLinerH   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)dictrK   rM   rN   r<   msgargsr0   rJ   rH   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.
        rn   ro   rp   r   z:Hello, dude!
N)rs   rK   rM   rN   
assertTrueendswithreprrv   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)rK   rM   rN   r<   rt   rP   r   r   r   test_noFormat   s   z$STDLibLogObserverTests.test_noFormatc                 C   s   ddd}z|  W n t y   t }Y nw tdd|d}| |\}}| t|d | d| | d	| | d
| dS )zK
        An event with a failure logs the failure details as well.
        r   Nc                   S      dd  d S Nr   r   r   r   r   r   r   failing_func      z9STDLibLogObserverTests.test_failure.<locals>.failing_funcHi mommerq   rr   log_failurer   in failing_funcZeroDivisionErrorr8   )r   r   rs   rK   rM   rN   assertInr0   r   failurerJ   rH   r.   r   r   r   test_failure   s   


z#STDLibLogObserverTests.test_failurec                 C   s   ddd}z|  W n t y   t }|  Y nw 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.
        r   Nc                   S   r}   r~   r   r   r   r   r   r      r   z@STDLibLogObserverTests.test_cleanedFailure.<locals>.failing_funcr   r   r   r   r   r   r8   )r   r   cleanFailurers   rK   rM   rN   r   r   r   r   r   test_cleanedFailure   s   

z*STDLibLogObserverTests.test_cleanedFailurer8   )r   r9   r:   r;   rA   r!   rD   r   r   r	   r   r<   rK   rQ   rf   rm   rw   r{   r|   r   r   r   r   r   r   r=   L   s    




	
#




	r=   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
    r4   
)encodingnewline)r   r'   BASIC_FORMATr   r   r   setFormatter)r.   templatestream	formatterhandlerr   r   r   r,     s   
r,   c                   @   s,   e Zd ZdZd	ddZdeddfddZdS )
r)   zN
    A L{py_logging.Handler} that remembers all logged records in a list.
    r   Nc                 C   s   t j|  g | _dS )z5
        Initialize this L{BufferedHandler}.
        N)r'   Handlerr1   rH   r/   r   r   r   r1     s   
zBufferedHandler.__init__recordc                 C   s   | j | dS )z&
        Remember the record.
        N)rH   r_   )r0   r   r   r   r   emit   s   zBufferedHandler.emitr8   )r   r9   r:   r;   r1   r   r   r   r   r   r   r)     s    
r)   )+r;   loggingr'   r   inspectr   ior   r   r   r   r   r   typingr	   r
   r   zope.interface.exceptionsr   zope.interface.verifyr   twisted.python.compatr   twisted.python.failurer   twisted.trialr   _interfacesr   r   _levelsr   _stdlibr   r<   r^   r    r!   TestCaser=   r,   r   r)   r   r   r   r   <module>   s*   $ 9