U
    2ÜŸj!"  ã                   @  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d„Z$G dd„ dƒZ%G dd„ dej&ƒZ'd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)ÚSTDLibLogObserverzTuple[Optional[str], int]©Ú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   úC/tmp/pip-unpacked-wheel-4b529toj/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ddœd	d
„ZdS )ÚStdlibLoggingContainerzF
    Continer for a test configuration of stdlib logging objects.
    ÚNoner   c                 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-8)r0   ÚgetvalueÚdecoder1   r   r   r    ÚoutputAsTextD   s    z#StdlibLoggingContainer.outputAsTextN)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d„Zddœdd„Zd	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dœdd„ZdS )ÚSTDLibLogObserverTestsz)
    Tests for L{STDLibLogObserver}.
    r#   r   c              
   C  sF   t ƒ }ztt|ƒ W n, tk
r@ } z|  |¡ W 5 d}~X Y nX dS )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
        )r"   Z
addCleanupr5   )r2   Úloggerr   r   r    Ú	py_logger\   s    z STDLibLogObserverTests.py_loggerr   zTuple[List[LogRecord], str])Ú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)rC   r   ZdefaultStackDepthr,   Úrecordsr:   )r2   rD   Ú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)rH   ÚassertEqualÚlenÚname©r2   rE   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 ]2\}}i }|dk	rZ||d< t|ƒ|d< | |¡ q>| j|Ž \}}|  t|ƒt|ƒ¡ tt|ƒƒD ]}|  || j|| d ¡ q dS )z
        Log levels.
        NZ	log_levelZ
py_levelno)r)   ÚINFOr   Údebugr*   ÚinfoÚwarnÚWARNINGÚerrorÚERRORÚcriticalÚCRITICALÚitemsÚintÚappendrH   rI   rJ   ÚrangeÚlevelno)	r2   ZlevelMappingrD   ÚlevelZpyLevelrG   rE   r0   Úir   r   r    Útest_levels…   s0          ú
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!   rH   rI   rJ   ÚpathnameÚlinenoZassertIsNoneÚexc_info)r2   ÚfilenameZlogLinerE   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)ÚdictrH   rI   rJ   r6   ÚmsgÚargs©r2   rG   rE   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.
        rd   re   rf   r   z:Hello, dude!
N)ri   rH   rI   rJ   Ú
assertTrueÚendswithÚreprrl   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)rH   rI   rJ   r6   rj   rL   r   r   r    Útest_noFormatÎ   s    z$STDLibLogObserverTests.test_noFormatc                 C  sˆ   ddœdd„}z
|ƒ  W n t k
r2   tƒ }Y nX 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  s   dd  d S ©Nr   r   r   r   r   r   r    Úfailing_funcÜ   s    z9STDLibLogObserverTests.test_failure.<locals>.failing_funcúHi momÚme©rg   rh   Zlog_failurer   úin failing_funcÚZeroDivisionErrorN)ry   r   ri   rH   rI   rJ   ÚassertIn©r2   rt   ZfailurerG   rE   r0   r   r   r    Útest_failure×   s    
z#STDLibLogObserverTests.test_failurec                 C  s�   ddœdd„}z
|ƒ  W n" t k
r:   tƒ }| ¡  Y nX 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  s   dd  d S rs   r   r   r   r   r    rt   ó   s    z@STDLibLogObserverTests.test_cleanedFailure.<locals>.failing_funcru   rv   rw   r   rx   ry   N)ry   r   ZcleanFailureri   rH   rI   rJ   rz   r{   r   r   r    Útest_cleanedFailureì   s    
z*STDLibLogObserverTests.test_cleanedFailureN)r   r;   r<   r=   rA   rC   rH   rM   r^   rc   rm   rq   rr   r|   r}   r   r   r   r    r>   M   s   

	#
	r>   z,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Únewline)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d„Zdd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   rE   r1   r   r   r    r3     s    zBufferedHandler.__init__r   )Úrecordr   c                 C  s   | j  |¡ dS )z&
        Remember the record.
        N)rE   rY   )r2   rˆ   r   r   r    Úemit!  s    zBufferedHandler.emitN)r   r;   r<   r=   r3   r‰   r   r   r   r    r+     s   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