a
    )(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                   @   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   sv   t  \}t|dd }ztt| W n. tyR } z| | W Y d}~n
d}~0 0 W d   n1 sh0    Y  dS )z;
        L{FileLogObserver} is an L{ILogObserver}.
        c                 S   s   t | S Nstre r   <lib/python3.9/site-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   s^   t  D}t|dd }tdd}|| | | t| W d   n1 sP0    Y  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                    sf   t  L}tttt | fdd}tdd}|| | |j| W d   n1 sX0    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   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   sb   t  H}tttt |dd }tdd}|| | |jd W d   n1 sT0    Y  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 d   n1 s00    Y  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 d   n1 s20    Y  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   sV   t  <}t|dd}|tddd | | d W d   n1 sH0    Y  dS )r@   z%f)Z
timeFormatZXYZZYgm@)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  z}t|}zdd  W n ty4   t }Y n0 t|d}|| | }| j|dd dt	|d W d   n1 s0    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   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_observeFailureu   s    
z,TextFileLogObserverTests.test_observeFailurec                 C   s^   t  D}t|}tt d}|| | }d}| || W d   n1 sP0    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.
        rC   z'(UNABLE TO OBTAIN TRACEBACK FROM EVENT)N)r   r   r%   objectr'   ZassertIn)r   r   r    r)   rJ   Zexpectedr   r   r   +test_observeFailureThatRaisesInGetTraceback   s    zDTextFileLogObserverTests.test_observeFailureThatRaisesInGetTraceback)	r8   r9   r:   r;   r?   rA   rB   rK   rM   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   rO   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   rS   rT   rU   r   r   r   __exit__   s    zDummyFile.__exit__)r8   r9   r:   r;   rN   r   rP   rQ   rR   r   r   BaseExceptionr   boolrV   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   Z_filer   r   Z_interfacesr   r   r=   r.   r   r   r   r   <module>   s    BA