o
    >h!"                     @  s  d Z ddlm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ddZ$G dd dZ%G dd dej&Z'dddZ(G dd dej)Z*dS ) z+
Test cases for L{twisted.logger._format}.
    )annotationsN)getsourcefile)BytesIOTextIOWrapper)	Formatter	LogRecordStreamHandler	getLogger)ListOptionalTuple)BrokenMethodImplementation)verifyObject)currentframe)Failure)unittest   )ILogObserverLogEvent)LogLevel)STDLibLogObserverreturnTuple[Optional[str], int]c                  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    /var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/logger/test/test_stdlib.pynextLine   s   r"   c                   @  s.   e Zd ZdZdddZdddZdd	d
ZdS )StdlibLoggingContainerzF
    Continer for a test configuration of stdlib logging objects.
    r   Nonec                 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-   r0   closer1   r2   r    r    r!   r6   :   s
   
zStdlibLoggingContainer.closestrc                 C  s   | j  dS )zd
        Get the output to the underlying stream as text.

        @return: the output text
        utf-8)r1   getvaluedecoder2   r    r    r!   outputAsTextD   s   z#StdlibLoggingContainer.outputAsTextNr   r$   )r   r7   )r   
__module____qualname____doc__r4   r6   r;   r    r    r    r!   r#   )   s
    


r#   c                   @  s~   e Zd Z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ddZdddZdddZdS )"STDLibLogObserverTestsz)
    Tests for L{STDLibLogObserver}.
    r   r$   c              
   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)r3   observerer    r    r!   test_interfaceR   s   z%STDLibLogObserverTests.test_interfacer#   c                 C  s   t  }| |j |S )zj
        Create a logging object we can use to test with.

        @return: a stdlib-style logger
        )r#   
addCleanupr6   )r3   loggerr    r    r!   	py_logger\   s   z STDLibLogObserverTests.py_loggereventsr   Tuple[List[LogRecord], str]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   )
stackDepth)rG   r   defaultStackDepthr-   recordsr;   )r3   rH   plrB   eventr    r    r!   logEventf   s   	
zSTDLibLogObserverTests.logEventc                 C  s4   |  i \}}| t|d | |d jd dS )z
        Logger name.
        r   r   twistedN)rO   assertEquallennamer3   rL   r1   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appendrO   rQ   rR   rangelevelno)	r3   levelMappingrH   levelpyLevelrN   rL   r1   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"   rO   rQ   rR   pathnamelinenoassertIsNoneexc_info)r3   filenamelogLinerL   r1   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)dictrO   rQ   rR   r7   msgargsr3   rN   rL   r1   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.
        rr   rs   rt   r   z:Hello, dude!
N)rw   rO   rQ   rR   
assertTrueendswithreprrz   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)rO   rQ   rR   r7   rx   rT   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   r$   c                   S     dd  d S Nr   r   r    r    r    r    r!   failing_func      z9STDLibLogObserverTests.test_failure.<locals>.failing_funcHi mommeru   rv   log_failurer   in failing_funcZeroDivisionErrorNr<   )r   r   rw   rO   rQ   rR   assertInr3   r   failurerN   rL   r1   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   r$   c                   S  r   r   r    r    r    r    r!   r      r   z@STDLibLogObserverTests.test_cleanedFailure.<locals>.failing_funcr   r   r   r   r   r   Nr<   )r   r   cleanFailurerw   rO   rQ   rR   r   r   r    r    r!   test_cleanedFailure   s   

z*STDLibLogObserverTests.test_cleanedFailureNr<   )r   r#   )rH   r   r   rI   )r   r=   r>   r?   rD   rG   rO   rU   rj   rq   r{   r   r   r   r   r    r    r    r!   r@   M   s    






	
#




	r@   ,tuple[StreamHandler[TextIOWrapper], BytesIO]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
    r8   
)encodingnewline)r   r*   BASIC_FORMATr   r   r   setFormatter)r1   templatestream	formatterhandlerr    r    r!   r/     s   
r/   c                   @  s$   e Zd ZdZdddZddd	Zd
S )r,   zN
    A L{py_logging.Handler} that remembers all logged records in a list.
    r   r$   c                 C  s   t j|  g | _dS )z5
        Initialize this L{BufferedHandler}.
        N)r*   Handlerr4   rL   r2   r    r    r!   r4     s   
zBufferedHandler.__init__recordr   c                 C  s   | j | dS )z&
        Remember the record.
        N)rL   rc   )r3   r   r    r    r!   emit!  s   zBufferedHandler.emitNr<   )r   r   r   r$   )r   r=   r>   r?   r4   r   r    r    r    r!   r,     s    
r,   )r   r   )r   r   )+r?   
__future__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#   TestCaser@   r/   r   r,   r    r    r    r!   <module>   s,   
$ 
9