U
    ˆjb*  ã                   @  sâ   d 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mZ ddlmZ ddlmZ dd	lmZmZmZmZmZ dd
lmZ G dd„ deƒZeeƒG dd„ dƒƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )z"
Tests for L{twisted.test.iosim}.
é    )Úannotations)ÚLiteral)Úimplementer)ÚIPushProducer)ÚClientFactoryÚFactoryÚProtocol)ÚClock)ÚMemoryReactor)ÚConnectionCompleterÚFakeTransportÚIOPumpÚconnectÚconnectedServerAndClient)ÚTestCasec                   @  s:   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zd
S )ÚFakeTransportTestsz%
    Tests for L{FakeTransport}.
    ÚNone©Úreturnc                 C  sH   t tƒ dƒ}t tƒ dƒ}|  |jt¡ |  |jt¡ |  |j|j¡ dS )ze
        Each L{FakeTransport} receives a serial number that uniquely identifies
        it.
        TFN)r   ÚobjectÚassertIsInstanceÚserialÚintZassertNotEqual)ÚselfÚaÚb© r   ú;/tmp/pip-unpacked-wheel-j5h_c8_q/twisted/test/test_iosim.pyÚtest_connectionSerial    s
    z(FakeTransportTests.test_connectionSerialc                 C  s>   t tƒ dƒ}| d¡ | dddg¡ |  d |j¡d¡ dS )	zl
        L{FakeTransport.writeSequence} will write a sequence of L{bytes} to the
        transport.
        Fó   aó   bó   có   dó    s   abcdN)r   r   ÚwriteZwriteSequenceÚassertEqualÚjoinÚstream©r   r   r   r   r   Útest_writeSequence+   s    
z%FakeTransportTests.test_writeSequencec                 C  s@   t tƒ dƒ}| d¡ | ¡  | d¡ |  d |j¡d¡ dS )zˆ
        L{FakeTransport.write} will accept writes after transport was closed,
        but the data will be silently discarded.
        Fs   befores   afterr#   N)r   r   r$   ZloseConnectionr%   r&   r'   r(   r   r   r   Útest_writeAfterClose7   s
    

z'FakeTransportTests.test_writeAfterCloseN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   r*   r   r   r   r   r      s   r   c                   @  s>   e Zd ZdZdZddœdd„Zddœdd„Zddœd	d
„ZdS )ÚStrictPushProducerzƒ
    An L{IPushProducer} implementation which produces nothing but enforces
    preconditions on its state transition methods.
    Úrunningr   r   c                 C  s   | j dkrtdƒ‚d| _ d S )NÚstoppedz)Cannot stop already-stopped IPushProducer©Ú_stateÚ
ValueError©r   r   r   r   ÚstopProducingM   s    
z StrictPushProducer.stopProducingc                 C  s&   | j dkrtd| j › d�ƒ‚d| _ d S )Nr0   zCannot pause ú IPushProducerÚpausedr2   r5   r   r   r   ÚpauseProducingR   s    
z!StrictPushProducer.pauseProducingc                 C  s&   | j dkrtd| j › d�ƒ‚d| _ d S )Nr8   zCannot resume r7   r0   r2   r5   r   r   r   ÚresumeProducingW   s    
z"StrictPushProducer.resumeProducingN)r+   r,   r-   r.   r3   r6   r9   r:   r   r   r   r   r/   D   s
   r/   c                   @  s   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d„Zdddœdd„Z	d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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dœd&d'„Zddœd(d)„Zddœd*d+„Zd,S )-ÚStrictPushProducerTestsz*
    Tests for L{StrictPushProducer}.
    r/   r   c                 C  s   t ƒ S )zp
        @return: A new L{StrictPushProducer} which has not been through any state
            changes.
        )r/   r5   r   r   r   Ú_initialb   s    z StrictPushProducerTests._initialc                 C  s   t ƒ }| ¡  |S )z@
        @return: A new, stopped L{StrictPushProducer}.
        )r/   r6   ©r   Úproducerr   r   r   Ú_stoppedi   s    z StrictPushProducerTests._stoppedc                 C  s   t ƒ }| ¡  |S )z?
        @return: A new, paused L{StrictPushProducer}.
        )r/   r9   r=   r   r   r   Ú_pausedq   s    zStrictPushProducerTests._pausedc                 C  s   t ƒ }| ¡  | ¡  |S )zY
        @return: A new L{StrictPushProducer} which has been paused and resumed.
        )r/   r9   r:   r=   r   r   r   Ú_resumedy   s    z StrictPushProducerTests._resumedr   )r>   r   c                 C  s   |   |jd¡ dS )z©
        Assert that the given producer is in the stopped state.

        @param producer: The producer to verify.
        @type producer: L{StrictPushProducer}
        r1   N©r%   r3   r=   r   r   r   ÚassertStopped‚   s    z%StrictPushProducerTests.assertStoppedc                 C  s   |   |jd¡ dS )z¨
        Assert that the given producer is in the paused state.

        @param producer: The producer to verify.
        @type producer: L{StrictPushProducer}
        r8   NrB   r=   r   r   r   ÚassertPaused‹   s    z$StrictPushProducerTests.assertPausedc                 C  s   |   |jd¡ dS )z©
        Assert that the given producer is in the running state.

        @param producer: The producer to verify.
        @type producer: L{StrictPushProducer}
        r0   NrB   r=   r   r   r   ÚassertRunning”   s    z%StrictPushProducerTests.assertRunningc                 C  s   |   t|  ¡ j¡ dS )zz
        L{StrictPushProducer.stopProducing} raises L{ValueError} if called when
        the producer is stopped.
        N)ÚassertRaisesr4   r?   r6   r5   r   r   r   Útest_stopThenStop�   s    z)StrictPushProducerTests.test_stopThenStopc                 C  s   |   t|  ¡ j¡ dS )z{
        L{StrictPushProducer.pauseProducing} raises L{ValueError} if called when
        the producer is stopped.
        N)rF   r4   r?   r9   r5   r   r   r   Útest_stopThenPause¤   s    z*StrictPushProducerTests.test_stopThenPausec                 C  s   |   t|  ¡ j¡ dS )z|
        L{StrictPushProducer.resumeProducing} raises L{ValueError} if called when
        the producer is stopped.
        N)rF   r4   r?   r:   r5   r   r   r   Útest_stopThenResume«   s    z+StrictPushProducerTests.test_stopThenResumec                 C  s   |   ¡ }| ¡  |  |¡ dS )zn
        L{StrictPushProducer} is stopped if C{stopProducing} is called on a paused
        producer.
        N)r@   r6   rC   r=   r   r   r   Útest_pauseThenStop²   s    z*StrictPushProducerTests.test_pauseThenStopc                 C  s   |   ¡ }|  t|j¡ dS )zs
        L{StrictPushProducer.pauseProducing} raises L{ValueError} if called on a
        paused producer.
        N)r@   rF   r4   r9   r=   r   r   r   Útest_pauseThenPause»   s    z+StrictPushProducerTests.test_pauseThenPausec                 C  s   |   ¡ }| ¡  |  |¡ dS )zp
        L{StrictPushProducer} is resumed if C{resumeProducing} is called on a
        paused producer.
        N)r@   r:   rE   r=   r   r   r   Útest_pauseThenResumeÃ   s    z,StrictPushProducerTests.test_pauseThenResumec                 C  s   |   ¡ }| ¡  |  |¡ dS )zo
        L{StrictPushProducer} is stopped if C{stopProducing} is called on a
        resumed producer.
        N)rA   r6   rC   r=   r   r   r   Útest_resumeThenStopÌ   s    z+StrictPushProducerTests.test_resumeThenStopc                 C  s   |   ¡ }| ¡  |  |¡ dS )zo
        L{StrictPushProducer} is paused if C{pauseProducing} is called on a
        resumed producer.
        N)rA   r9   rD   r=   r   r   r   Útest_resumeThenPauseÕ   s    z,StrictPushProducerTests.test_resumeThenPausec                 C  s   |   ¡ }|  t|j¡ dS )zu
        L{StrictPushProducer.resumeProducing} raises L{ValueError} if called on a
        resumed producer.
        N)rA   rF   r4   r:   r=   r   r   r   Útest_resumeThenResumeÞ   s    z-StrictPushProducerTests.test_resumeThenResumec                 C  s   |   ¡ }| ¡  |  |¡ dS )zn
        L{StrictPushProducer} is stopped if C{stopProducing} is called in the
        initial state.
        N)r<   r6   rC   r=   r   r   r   Ú	test_stopæ   s    z!StrictPushProducerTests.test_stopc                 C  s   |   ¡ }| ¡  |  |¡ dS )zn
        L{StrictPushProducer} is paused if C{pauseProducing} is called in the
        initial state.
        N)r<   r9   rD   r=   r   r   r   Ú
test_pauseï   s    z"StrictPushProducerTests.test_pausec                 C  s   |   ¡ }|  t|j¡ dS )zz
        L{StrictPushProducer} raises L{ValueError} if C{resumeProducing} is called
        in the initial state.
        N)r<   rF   r4   r:   r=   r   r   r   Útest_resumeø   s    z#StrictPushProducerTests.test_resumeN)r+   r,   r-   r.   r<   r?   r@   rA   rC   rD   rE   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   r   r   r   r   r;   ]   s(   										r;   c                   @  sJ   e Zd ZdZdddœdd„Zddœdd	„Zddœd
d„Zddœdd„ZdS )ÚIOPumpTestsz
    Tests for L{IOPump}.
    zLiteral[('server', 'client')]r   )Úmoder   c           	      C  sr   t ƒ }t|dd�}t ƒ }t|dd�}t||||dd�}tƒ }||dœ| }|j|dd� | ¡  |  d|j¡ dS )	aÌ  
        Connect a couple protocol/transport pairs to an L{IOPump} and then pump
        it.  Verify that a streaming producer registered with one of the
        transports does not receive invalid L{IPushProducer} method calls and
        ends in the right state.

        @param mode: C{u"server"} to test a producer registered with the
            server transport.  C{u"client"} to test a producer registered with
            the client transport.
        T)ZisServerF)Zgreet)ÚserverÚclient)Z	streamingr0   N)r   r   r   r/   ZregisterProducerÚpumpr%   r3   )	r   rT   ZserverProtoZserverTransportZclientProtoZclientTransportrW   r>   Zvictimr   r   r   Ú_testStreamingProducer  s(    ûþýz"IOPumpTests._testStreamingProducerr   c                 C  s   | j dd� dS )z—
        L{IOPump.pump} does not call C{resumeProducing} on a L{IPushProducer}
        (stream producer) registered with the server transport.
        rU   ©rT   N©rX   r5   r   r   r   Útest_serverStreamingProducer)  s    z(IOPumpTests.test_serverStreamingProducerc                 C  s   | j dd� dS )z—
        L{IOPump.pump} does not call C{resumeProducing} on a L{IPushProducer}
        (stream producer) registered with the client transport.
        rV   rY   NrZ   r5   r   r   r   Útest_clientStreamingProducer0  s    z(IOPumpTests.test_clientStreamingProducerc                   sR   g ‰ t ƒ }ttt|d�\}}}| d‡ fdd„¡ |  ˆ ¡ | ¡  |  ˆ ¡ dS )zE
        L{IOPump.pump} advances time in the given L{Clock}.
        )Úclockr   c                     s
   ˆ   d¡S )NT)Úappendr   ©Ztime_passedr   r   Ú<lambda>>  r#   z/IOPumpTests.test_timeAdvances.<locals>.<lambda>N)r	   r   r   Z	callLaterZassertFalserW   Ú
assertTrue)r   r]   Ú_rW   r   r_   r   Útest_timeAdvances7  s    
zIOPumpTests.test_timeAdvancesN)r+   r,   r-   r.   rX   r[   r\   rc   r   r   r   r   rS     s
   #rS   c                   @  s,   e Zd ZdZddœdd„Zddœdd„ZdS )	ÚConnectionCompleterTestszr
    L{ConnectionCompleter} can connect a connecting client and a listening
    server in a L{MemoryReactor}.
    r   r   c                 C  s   t tƒ ƒ}|  | ¡ d¡ dS )z|
        When no connection for its reactor is pending,
        L{ConnectionCompleter.succeedOnce} returns C{None}.
        N)r   r
   ZassertIsÚsucceedOnce)r   Úccr   r   r   Útest_noConnectionJ  s    
z*ConnectionCompleterTests.test_noConnectionc                 C  sH   t ƒ }| dt t¡¡ | ddt t¡¡ t|ƒ}|  | 	¡ t
¡ dS )z�
        When a connection to a matched host and port is pending,
        L{ConnectionCompleter} returns an L{IOPump} connecting them.
        éP   z	127.0.0.1N)r
   Z	listenTCPr   ZforProtocolr   Z
connectTCPr   r   r   re   r   )r   Zmemrf   r   r   r   Útest_someConnectionR  s
    z,ConnectionCompleterTests.test_someConnectionN)r+   r,   r-   r.   rg   ri   r   r   r   r   rd   D  s   rd   N)r.   Ú
__future__r   Útypingr   Zzope.interfacer   Ztwisted.internet.interfacesr   Ztwisted.internet.protocolr   r   r   Ztwisted.internet.taskr	   Ztwisted.internet.testingr
   Ztwisted.test.iosimr   r   r   r   r   Ztwisted.trial.unittestr   r   r/   r;   rS   rd   r   r   r   r   Ú<module>   s    ) %C