U
    
W[                     @   s   d 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l
mZ ddlmZ dd	lmZ dd
lmZ G dd deZG dd deZG dd deZdS )z)
Test cases for L{twisted.logger._file}.
    )StringIO)verifyObjectBrokenMethodImplementation)TestCase)Failureunicode   )ILogObserver)FileLogObserver)textFileLogObserverc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )FileLogObserverTestsz'
    Tests for L{FileLogObserver}.
    c                 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 Nr   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   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_observeWritesc              	      sH   t  8}t| fdd}tdd}|| | |j| W 5 Q R X dS )a,  
        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.
        @type what: L{unicode}

        @param count: the expected number of writes.
        @type count: L{int}
        c                    s    S r   r   r   whatr   r   r   >   r   z:FileLogObserverTests._test_observeWrites.<locals>.<lambda>r   r   N)	DummyFiler   r   r   writes)r   r#   countr   r   r    r   r"   r   _test_observeWrites2   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   r'   r   r   r   r   test_observeWritesNoneD   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{u""}.
         r   Nr(   r)   r   r   r   test_observeWritesEmptyL   s    z,FileLogObserverTests.test_observeWritesEmptyc              	   C   sD   t  4}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   Z   r   z:FileLogObserverTests.test_observeFlushes.<locals>.<lambda>r   r   N)r$   r   r   r   flushesr   r   r   r   test_observeFlushesT   s
    
z(FileLogObserverTests.test_observeFlushesN)
__name__
__module____qualname____doc__r   r!   r'   r*   r,   r.   r   r   r   r   r      s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TextFileLogObserverTestsz+
    Tests for L{textFileLogObserver}.
    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_returnsFileLogObservere   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_outFiler4   r   r   r   test_outFilen   s    z%TextFileLogObserverTests.test_outFilec              	   C   sB   t  2}t|dd}|tddd | | d W 5 Q R X dS )r6   z%f)Z
timeFormatZXYZZYgm@)Z
log_formatZlog_timez600000 [-#-] XYZZY
N)r   r   r   r   r   r4   r   r   r   test_timeFormatw   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   Z
assertTruesplit
startswithrepr)r   r   r   Zfailurer    outputr   r   r   test_observeFailure   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.
        r9   z'(UNABLE TO OBTAIN TRACEBACK FROM EVENT)N)r   r   r   objectr   ZassertIn)r   r   r   r    r@   Zexpectedr   r   r   +test_observeFailureThatRaisesInGetTraceback   s    zDTextFileLogObserverTests.test_observeFailureThatRaisesInGetTracebackN)	r/   r0   r1   r2   r5   r7   r8   rA   rC   r   r   r   r   r3   `   s   		
r3   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r$   z.
    File that counts writes and flushes.
    c                 C   s   d| _ d| _d S )Nr   )r%   r-   r)   r   r   r   __init__   s    zDummyFile.__init__c                 C   s   |  j d7  _ dS )zc
        Write data.

        @param data: data
        @type data: L{unicode} or L{bytes}
        r   N)r%   )r   datar   r   r   write   s    zDummyFile.writec                 C   s   |  j d7  _ dS )z 
        Flush buffers.
        r   N)r-   r)   r   r   r   flush   s    zDummyFile.flushc                 C   s   | S r   r   r)   r   r   r   	__enter__   s    zDummyFile.__enter__c                 C   s   d S r   r   )r   exc_type	exc_value	tracebackr   r   r   __exit__   s    zDummyFile.__exit__N)	r/   r0   r1   r2   rD   rF   rG   rH   rL   r   r   r   r   r$      s   
r$   N)r2   ior   Zzope.interface.verifyr   r   Ztwisted.trial.unittestr   Ztwisted.python.failurer   Ztwisted.python.compatr   Z	_observerr
   Z_filer   r   r   r3   rB   r$   r   r   r   r   <module>   s   JG