o
    ¯bË  ã                   @   sº   d Z ddlmZ ddlmZ ddlmZmZmZ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mZ d	dlmZ G dd„ deƒZG dd„ deƒZG dd„ dƒZdS )z)
Test cases for L{twisted.logger._file}.
é    )ÚStringIO)ÚTracebackType)ÚIOÚAnyÚAnyStrÚOptionalÚTypeÚcast)ÚBrokenMethodImplementation)ÚverifyObject)ÚFailure)ÚTestCaseé   )ÚFileLogObserverÚtextFileLogObserver)ÚILogObserverc                   @   s\   e Zd ZdZddd„Zddd„Zdee d	eddfd
d„Z	ddd„Z
ddd„Zddd„ZdS )ÚFileLogObserverTestsz'
    Tests for L{FileLogObserver}.
    ÚreturnNc                 C   sˆ   t ƒ �7}t|dd„ ƒ}ztt|ƒ W n ty) } z|  |¡ W Y d}~nd}~ww W d  ƒ dS W d  ƒ dS 1 s=w   Y  dS )z;
        L{FileLogObserver} is an L{ILogObserver}.
        c                 S   ó   t | ƒS ©N©Ústr©Úe© r   ú?/usr/lib/python3/dist-packages/twisted/logger/test/test_file.pyÚ<lambda>   ó    z5FileLogObserverTests.test_interface.<locals>.<lambda>N)r   r   r   r   r
   Úfail)ÚselfÚ
fileHandleÚobserverr   r   r   r   Útest_interface   s   €ÿÿý"ûz#FileLogObserverTests.test_interfacec                 C   s`   t ƒ �#}t|dd„ ƒ}tdd�}||ƒ |  | ¡ t|ƒ¡ W d  ƒ dS 1 s)w   Y  dS )zV
        L{FileLogObserver} writes to the given file when it observes events.
        c                 S   r   r   r   r   r   r   r   r   *   r   z9FileLogObserverTests.test_observeWrites.<locals>.<lambda>é   ©ÚxN)r   r   ÚdictÚassertEqualÚgetvaluer   ©r   r    r!   Úeventr   r   r   Útest_observeWrites%   s   
"üz'FileLogObserverTests.test_observeWritesÚwhatÚcountc                    sh   t ƒ �'}tttt |ƒ‡ fdd„ƒ}tdd�}||ƒ |  |j|¡ W d  ƒ dS 1 s-w   Y  dS )zð
        Verify that observer performs an expected number of writes when the
        formatter returns a given value.

        @param what: the value for the formatter to return.
        @param count: the expected number of writes.
        c                    s   ˆ S r   r   r   ©r,   r   r   r   8   s    z:FileLogObserverTests._test_observeWrites.<locals>.<lambda>r#   r$   N)Ú	DummyFiler   r	   r   r   r&   r'   Úwrites)r   r,   r-   r    r!   r*   r   r.   r   Ú_test_observeWrites/   s   
"üz(FileLogObserverTests._test_observeWritesc                 C   s   |   dd¡ dS )z‰
        L{FileLogObserver} does not write to the given file when it observes
        events and C{formatEvent} returns L{None}.
        Nr   ©r1   ©r   r   r   r   Útest_observeWritesNone=   ó   z+FileLogObserverTests.test_observeWritesNonec                 C   s   |   dd¡ dS )z‡
        L{FileLogObserver} does not write to the given file when it observes
        events and C{formatEvent} returns C{""}.
        Ú r   Nr2   r3   r   r   r   Útest_observeWritesEmptyD   r5   z,FileLogObserverTests.test_observeWritesEmptyc                 C   sd   t ƒ �%}tttt |ƒdd„ ƒ}tdd�}||ƒ |  |jd¡ W d  ƒ dS 1 s+w   Y  dS )zl
        L{FileLogObserver} calles C{flush()} on the output file when it
        observes an event.
        c                 S   r   r   r   r   r   r   r   r   Q   r   z:FileLogObserverTests.test_observeFlushes.<locals>.<lambda>r#   r$   N)r/   r   r	   r   r   r&   r'   Úflushesr)   r   r   r   Útest_observeFlushesK   s   
"üz(FileLogObserverTests.test_observeFlushes©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r+   r   r   Úintr1   r4   r7   r9   r   r   r   r   r      s    




r   c                   @   sB   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S )ÚTextFileLogObserverTestsz+
    Tests for L{textFileLogObserver}.
    r   Nc                 C   s@   t ƒ �}t|ƒ}|  |t¡ W d  ƒ dS 1 sw   Y  dS )zF
        L{textFileLogObserver} returns a L{FileLogObserver}.
        N)r   r   ÚassertIsInstancer   ©r   r    r!   r   r   r   Útest_returnsFileLogObserver\   s   "þz4TextFileLogObserverTests.test_returnsFileLogObserverc                 C   sB   t ƒ �}t|ƒ}|  |j|¡ W d  ƒ dS 1 sw   Y  dS )úF
        Returned L{FileLogObserver} has the correct outFile.
        N)r   r   ÚassertIsÚ_outFilerB   r   r   r   Útest_outFiled   s   "þz%TextFileLogObserverTests.test_outFilec                 C   sX   t ƒ �}t|dd�}|tddd�ƒ |  | ¡ d¡ W d  ƒ dS 1 s%w   Y  dS )rD   z%f)Ú
timeFormatÚXYZZYgš™™™™mû@)Ú
log_formatÚlog_timez600000 [-#-] XYZZY
N)r   r   r&   r'   r(   rB   r   r   r   Útest_timeFormatl   s
   "ýz(TextFileLogObserverTests.test_timeFormatc              	   C   s–   t ƒ �>}t|ƒ}zdd  W n ty   tƒ }Y nw t|d�}||ƒ | ¡ }| j| d¡d  d¡t	|ƒd� W d  ƒ dS 1 sDw   Y  dS )z…
        If the C{"log_failure"} key exists in an event, the observer appends
        the failure's traceback to the output.
        r#   r   ©Úlog_failureÚ
z	Traceback )ÚmsgN)
r   r   ÚZeroDivisionErrorr   r&   r(   Ú
assertTrueÚsplitÚ
startswithÚrepr)r   r    r!   Úfailurer*   Úoutputr   r   r   Útest_observeFailureu   s   
ÿ
ÿ"õz,TextFileLogObserverTests.test_observeFailurec                 C   s`   t ƒ �#}t|ƒ}ttƒ d�}||ƒ | ¡ }d}|  ||¡ W d  ƒ dS 1 s)w   Y  dS )zå
        If the C{"log_failure"} key exists in an event, and contains an object
        that raises when you call its C{getTraceback()}, then the observer
        appends a message noting the problem, instead of raising.
        rM   z'(UNABLE TO OBTAIN TRACEBACK FROM EVENT)N)r   r   r&   Úobjectr(   ÚassertIn)r   r    r!   r*   rW   Úexpectedr   r   r   Ú+test_observeFailureThatRaisesInGetTraceback‰   s   "úzDTextFileLogObserverTests.test_observeFailureThatRaisesInGetTracebackr:   )	r;   r<   r=   r>   rC   rG   rL   rX   r\   r   r   r   r   r@   W   s    



	r@   c                	   @   sn   e Zd ZdZddd„Zdeddfdd„Zdd	d
„Zddd„Zde	e
e  de	e de	e de	e fdd„ZdS )r/   z.
    File that counts writes and flushes.
    r   Nc                 C   s   d| _ d| _d S )Nr   )r0   r8   r3   r   r   r   Ú__init__�   s   
zDummyFile.__init__Údatac                 C   ó   |  j d7  _ dS )z8
        Write data.

        @param data: data
        r#   N)r0   )r   r^   r   r   r   Úwrite¡   s   zDummyFile.writec                 C   r_   )z 
        Flush buffers.
        r#   N)r8   r3   r   r   r   Úflush©   s   zDummyFile.flushc                 C   s   | S r   r   r3   r   r   r   Ú	__enter__¯   s   zDummyFile.__enter__Úexc_typeÚ	exc_valueÚ	tracebackc                 C   s   d S r   r   )r   rc   rd   re   r   r   r   Ú__exit__²   s   zDummyFile.__exit__r:   )r   r/   )r;   r<   r=   r>   r]   r   r`   ra   rb   r   r   ÚBaseExceptionr   Úboolrf   r   r   r   r   r/   ˜   s    



þýüûr/   N)r>   Úior   Útypesr   Útypingr   r   r   r   r   r	   Úzope.interface.exceptionsr
   Úzope.interface.verifyr   Útwisted.python.failurer   Útwisted.trial.unittestr   Ú_filer   r   Ú_interfacesr   r   r@   r/   r   r   r   r   Ú<module>   s    BA