U
    Â“«jË  ã                   @   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                   @   sl   e Zd ZdZddœdd„Zddœdd„Zee eddœd	d
„Z	ddœdd„Z
ddœdd„Zddœdd„ZdS )ÚFileLogObserverTestsz'
    Tests for L{FileLogObserver}.
    N©Úreturnc                 C   s`   t ƒ �P}t|dd„ ƒ}ztt|ƒ W n, tk
rP } z|  |¡ W 5 d}~X Y nX W 5 Q R X dS )z;
        L{FileLogObserver} is an L{ILogObserver}.
        c                 S   s   t | ƒS ©N©Ústr©Úe© r   úA/tmp/pip-unpacked-wheel-59kc99xd/twisted/logger/test/test_file.pyÚ<lambda>   ó    z5FileLogObserverTests.test_interface.<locals>.<lambda>N)r   r   r   r   r
   Zfail)ÚselfÚ
fileHandleÚobserverr   r   r   r   Útest_interface   s    z#FileLogObserverTests.test_interfacec              	   C   sJ   t ƒ �:}t|dd„ ƒ}tdd�}||ƒ |  | ¡ t|ƒ¡ W 5 Q R X dS )zV
        L{FileLogObserver} writes to the given file when it observes events.
        c                 S   s   t | ƒS 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Úcountr   c              	      sR   t ƒ �B}tttt |ƒ‡ fdd„ƒ}tdd�}||ƒ |  |j|¡ W 5 Q R X 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   r   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   ©r0   ©r   r   r   r   Útest_observeWritesNone=   s    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   Nr1   r2   r   r   r   Útest_observeWritesEmptyD   s    z,FileLogObserverTests.test_observeWritesEmptyc              	   C   sN   t ƒ �>}tttt |ƒdd„ ƒ}tdd�}||ƒ |  |jd¡ W 5 Q R X dS )zl
        L{FileLogObserver} calles C{flush()} on the output file when it
        observes an event.
        c                 S   s   t | ƒS 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)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r*   r   r   Úintr0   r3   r5   r7   r   r   r   r   r      s   
r   c                   @   sV   e Zd Z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 )ÚTextFileLogObserverTestsz+
    Tests for L{textFileLogObserver}.
    Nr   c              	   C   s*   t ƒ �}t|ƒ}|  |t¡ W 5 Q R X dS )zF
        L{textFileLogObserver} returns a L{FileLogObserver}.
        N)r   r   ZassertIsInstancer   ©r   r   r    r   r   r   Útest_returnsFileLogObserver\   s    z4TextFileLogObserverTests.test_returnsFileLogObserverc              	   C   s,   t ƒ �}t|ƒ}|  |j|¡ W 5 Q R X dS )úF
        Returned L{FileLogObserver} has the correct outFile.
        N)r   r   ZassertIsZ_outFiler>   r   r   r   Útest_outFiled   s    z%TextFileLogObserverTests.test_outFilec              	   C   sB   t ƒ �2}t|dd�}|tddd�ƒ |  | ¡ d¡ W 5 Q R X dS )r@   z%f)Z
timeFormatZXYZZYgš™™™™mû@)Z
log_formatZlog_timez600000 [-#-] XYZZY
N)r   r   r%   r&   r'   r>   r   r   r   Útest_timeFormatl   s    z(TextFileLogObserverTests.test_timeFormatc              	   C   s‚   t ƒ �r}t|ƒ}zdd  W n tk
r6   tƒ }Y nX t|d�}||ƒ | ¡ }| j| d¡d  d¡t	|ƒd� W 5 Q R X 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   ©Zlog_failureÚ
z	Traceback )ÚmsgN)
r   r   ÚZeroDivisionErrorr   r%   r'   Ú
assertTrueÚsplitÚ
startswithÚrepr)r   r   r    Zfailurer)   Úoutputr   r   r   Útest_observeFailureu   s    
 ÿz,TextFileLogObserverTests.test_observeFailurec              	   C   sJ   t ƒ �:}t|ƒ}ttƒ d�}||ƒ | ¡ }d}|  ||¡ W 5 Q R X 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.
        rC   z'(UNABLE TO OBTAIN TRACEBACK FROM EVENT)N)r   r   r%   Úobjectr'   ZassertIn)r   r   r    r)   rK   Úexpectedr   r   r   Ú+test_observeFailureThatRaisesInGetTraceback‰   s    zDTextFileLogObserverTests.test_observeFailureThatRaisesInGetTraceback)	r8   r9   r:   r;   r?   rA   rB   rL   rO   r   r   r   r   r=   W   s   	r=   c                   @   sr   e Zd ZdZddœdd„Zeddœdd„Zddœd	d
„Zd dœdd„Ze	e
e  e	e e	e e	e dœdd„ZdS )r.   z.
    File that counts writes and flushes.
    Nr   c                 C   s   d| _ d| _d S )Nr   )r/   r6   r2   r   r   r   Ú__init__�   s    zDummyFile.__init__)Údatar   c                 C   s   |  j d7  _ dS )z8
        Write data.

        @param data: data
        r"   N)r/   )r   rQ   r   r   r   Úwrite¡   s    zDummyFile.writec                 C   s   |  j d7  _ dS )z 
        Flush buffers.
        r"   N)r6   r2   r   r   r   Úflush©   s    zDummyFile.flushc                 C   s   | S r   r   r2   r   r   r   Ú	__enter__¯   s    zDummyFile.__enter__)Úexc_typeÚ	exc_valueÚ	tracebackr   c                 C   s   d S r   r   )r   rU   rV   rW   r   r   r   Ú__exit__²   s    zDummyFile.__exit__)r8   r9   r:   r;   rP   r   rR   rS   rT   r   r   ÚBaseExceptionr   ÚboolrX   r   r   r   r   r.   ˜   s   
ûr.   N)r;   Úior   Útypesr   Útypingr   r   r   r   r   r	   Zzope.interface.exceptionsr
   Zzope.interface.verifyr   Ztwisted.python.failurer   Ztwisted.trial.unittestr   Ú_filer   r   Z_interfacesr   r   r=   r.   r   r   r   r   Ú<module>   s    BA