U
    
W[d#  ã                   @   s    d 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mZ ddlmZ G dd	„ d	eƒZeeƒ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}.
é    )Úabsolute_importÚdivision)Úimplementer)ÚIPushProducer)ÚProtocol)ÚFakeTransportÚconnect)ÚTestCasec                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚFakeTransportTestsz%
    Tests for L{FakeTransport}.
    c                 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   ÚobjectZassertIsInstanceÚserialÚintZassertNotEqual)ÚselfÚaÚb© r   ú9/usr/lib/python3/dist-packages/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_writeAfterClose1   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„ Zdd„ Zdd„ Zd	S )
ÚStrictPushProducerzƒ
    An L{IPushProducer} implementation which produces nothing but enforces
    preconditions on its state transition methods.
    Úrunningc                 C   s   | j dkrtdƒ‚d| _ d S )NÚstoppedz)Cannot stop already-stopped IPushProducer)Ú_stateÚ
ValueError©r   r   r   r   ÚstopProducingG   s    
z StrictPushProducer.stopProducingc                 C   s$   | j dkrtd | j ¡ƒ‚d| _ d S )Nr%   zCannot pause {} IPushProducerÚpaused©r'   r(   Úformatr)   r   r   r   ÚpauseProducingM   s
    

ÿz!StrictPushProducer.pauseProducingc                 C   s$   | j dkrtd | j ¡ƒ‚d| _ d S )Nr+   zCannot resume {} IPushProducerr%   r,   r)   r   r   r   ÚresumeProducingU   s
    

ÿz"StrictPushProducer.resumeProducingN)r    r!   r"   r#   r'   r*   r.   r/   r   r   r   r   r$   ?   s
   r$   c                   @   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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(S ))ÚStrictPushProducerTestsz*
    Tests for L{StrictPushProducer}.
    c                 C   s   t ƒ S )zp
        @return: A new L{StrictPushProducer} which has not been through any state
            changes.
        )r$   r)   r   r   r   Ú_initialb   s    z StrictPushProducerTests._initialc                 C   s   t ƒ }| ¡  |S )z@
        @return: A new, stopped L{StrictPushProducer}.
        )r$   r*   ©r   Úproducerr   r   r   Ú_stoppedj   s    z StrictPushProducerTests._stoppedc                 C   s   t ƒ }| ¡  |S )z?
        @return: A new, paused L{StrictPushProducer}.
        )r$   r.   r2   r   r   r   Ú_pauseds   s    zStrictPushProducerTests._pausedc                 C   s   t ƒ }| ¡  | ¡  |S )zY
        @return: A new L{StrictPushProducer} which has been paused and resumed.
        )r$   r.   r/   r2   r   r   r   Ú_resumed|   s    z StrictPushProducerTests._resumedc                 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}
        r&   N©r   r'   r2   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}
        r+   Nr7   r2   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}
        r%   Nr7   r2   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)ÚassertRaisesr(   r4   r*   r)   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)r;   r(   r4   r.   r)   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)r;   r(   r4   r/   r)   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)r5   r*   r8   r2   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)r5   r;   r(   r.   r2   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)r5   r/   r:   r2   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)r6   r*   r8   r2   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)r6   r.   r9   r2   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)r6   r;   r(   r/   r2   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)r1   r*   r8   r2   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)r1   r.   r9   r2   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)r1   r;   r(   r/   r2   r   r   r   Útest_resume
  s    z#StrictPushProducerTests.test_resumeN)r    r!   r"   r#   r1   r4   r5   r6   r8   r9   r:   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r   r   r   r   r0   ^   s(   		




	


	

r0   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIOPumpTestsz
    Tests for L{IOPump}.
    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	streamingr%   N)r   r   r   r$   ZregisterProducerÚpumpr   r'   )	r   ÚmodeZserverProtoZserverTransportZclientProtoZclientTransportrK   r3   Zvictimr   r   r   Ú_testStreamingProducer  s(      ýþýz"IOPumpTests._testStreamingProducerc                 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.
        rI   ©rL   N©rM   r)   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.
        rJ   rN   NrO   r)   r   r   r   Útest_clientStreamingProducerB  s    z(IOPumpTests.test_clientStreamingProducerN)r    r!   r"   r#   rM   rP   rQ   r   r   r   r   rH     s   "rH   N)r#   Z
__future__r   r   Zzope.interfacer   Ztwisted.internet.interfacesr   Ztwisted.internet.protocolr   Ztwisted.test.iosimr   r   Ztwisted.trial.unittestr	   r
   r   r$   r0   rH   r   r   r   r   Ú<module>   s   , 7