o
    Òó·i!"  ã                   @  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__N)r   r   ÚsysÚmodulesÚ	f_globalsÚf_lineno)Zcaller© r   úeC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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,   r/   Úcloser0   r1   r   r   r    r5   :   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-8N)r0   ÚgetvalueÚdecoder1   r   r   r    ÚoutputAsTextD   s   z#StdlibLoggingContainer.outputAsTextN©r   r#   )r   r6   )r   Ú
__module__Ú__qualname__Ú__doc__r3   r5   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   Zfail)r2   Ú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
        N)r"   Z
addCleanupr5   )r2   Ú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   )Z
stackDepthN)rD   r   ZdefaultStackDepthr,   Úrecordsr:   )r2   rE   Úplr@   Úeventr   r   r    ÚlogEventf   s   	ÿý
zSTDLibLogObserverTests.logEventc                 C  s4   |   i ¡\}}|  t|ƒd¡ |  |d jd¡ dS )z
        Logger name.
        r   r   ZtwistedN)rJ   ÚassertEqualÚlenÚname©r2   rG   r0   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_levelZ
py_levelno)r)   ÚINFOr   Údebugr*   ÚinfoÚwarnÚWARNINGÚerrorÚERRORÚcriticalÚCRITICALÚitemsÚintÚappendrJ   rK   rL   ÚrangeÚlevelno)	r2   ZlevelMappingrE   ÚlevelZpyLevelrI   rG   r0   Ú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!   rJ   rK   rL   ÚpathnameÚlinenoZassertIsNoneÚexc_info)r2   ÚfilenameZlogLinerG   r0   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)ÚdictrJ   rK   rL   r6   ÚmsgÚargs©r2   rI   rG   r0   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.
        rg   rh   ri   r   z:Hello, dude!
N)rl   rJ   rK   rL   Ú
assertTrueÚendswithÚreprro   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)rJ   rK   rL   r6   rm   rN   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©rj   rk   Zlog_failurer   úin failing_funcÚZeroDivisionErrorNr;   )r~   r   rl   rJ   rK   rL   ÚassertIn©r2   rx   ZfailurerI   rG   r0   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  rv   rw   r   r   r   r   r    rx   ó   ry   z@STDLibLogObserverTests.test_cleanedFailure.<locals>.failing_funcrz   r{   r|   r   r}   r~   Nr;   )r~   r   ZcleanFailurerl   rJ   rK   rL   r   r€   r   r   r    Útest_cleanedFailureì   s   

þz*STDLibLogObserverTests.test_cleanedFailureNr;   )r   r"   )rE   r   r   rF   )r   r<   r=   r>   rB   rD   rJ   rO   ra   rf   rp   rt   ru   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
    r7   Ú
)ÚencodingÚnewlineN)r   r)   ÚBASIC_FORMATr   r   r   ÚsetFormatter)r0   Ú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)   ÚHandlerr3   rG   r1   r   r   r    r3     s   
zBufferedHandler.__init__Úrecordr   c                 C  s   | j  |¡ dS )z&
        Remember the record.
        N)rG   r\   )r2   rŽ   r   r   r    Úemit!  s   zBufferedHandler.emitNr;   )rŽ   r   r   r#   )r   r<   r=   r>   r3   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   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   r!   r"   ZTestCaser?   r.   r�   r+   r   r   r   r    Ú<module>   s,   
$ 
9