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XYZZYgm@)
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