U
    
W[1  ã                   @   sP  d dd… Z ddlmZ ddlmZ G dd„ dƒZG dd	„ d	ƒZG d
d„ deƒZG dd„ dejƒZ	G dd„ dƒZ
G dd„ dƒZG dd„ de
ejƒZG dd„ de
ejƒZG dd„ deejƒZG dd„ deejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dƒZG d d!„ d!eejƒZG d"d#„ d#eejƒZG d$d%„ d%ejƒZG d&d'„ d'ejƒZd(S ))z$Revision: 1.5 $é   éþÿÿÿé    )Úunittest)Úpcpc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚDummyTransportz A dumb transport to wrap around.c                 C   s
   g | _ d S ©N)Ú_writes©Úself© r   ú7/usr/lib/python3/dist-packages/twisted/test/test_pcp.pyÚ__init__%   s    zDummyTransport.__init__c                 C   s   | j  |¡ d S r   )r   Úappend©r
   Údatar   r   r   Úwrite(   s    zDummyTransport.writec                 C   s   d  | j¡S )NÚ )Újoinr   r	   r   r   r   Úgetvalue+   s    zDummyTransport.getvalueN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   "   s   r   c                   @   s8   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zdd	„ Z	d
S )ÚDummyProducerFc                 C   s
   || _ d S r   )Úconsumer)r
   r   r   r   r   r   3   s    zDummyProducer.__init__c                 C   s   d| _ d| _d S )NTF)ÚresumedÚpausedr	   r   r   r   ÚresumeProducing6   s    zDummyProducer.resumeProducingc                 C   s
   d| _ d S ©NT)r   r	   r   r   r   ÚpauseProducing:   s    zDummyProducer.pauseProducingc                 C   s
   d| _ d S r   )Ústoppedr	   r   r   r   ÚstopProducing=   s    zDummyProducer.stopProducingN)
r   r   r   r   r    r   r   r   r   r!   r   r   r   r   r   .   s   r   c                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ ZdS )
ÚDummyConsumerNFTc                 C   s   ||f| _ d S r   )Úproducer)r
   r#   Z	streamingr   r   r   ÚregisterProducerF   s    zDummyConsumer.registerProducerc                 C   s
   d| _ d S r   )Úunregisteredr	   r   r   r   ÚunregisterProducerI   s    z DummyConsumer.unregisterProducerc                 C   s
   d| _ d S r   )Úfinishedr	   r   r   r   ÚfinishL   s    zDummyConsumer.finish)	r   r   r   r#   r'   r%   r$   r&   r(   r   r   r   r   r"   A   s   r"   c                   @   s"   e Zd ZejZdd„ Zdd„ ZdS )ÚTransportInterfaceTestsc                 C   s   t ƒ | _|  | j¡| _d S r   )r"   Ú
underlyingÚ
proxyClassÚ	transportr	   r   r   r   ÚsetUpR   s    zTransportInterfaceTests.setUpc                 C   s   | j  d¡ d S ©Nz
some bytes)r,   r   r	   r   r   r   Ú	testWriteV   s    z!TransportInterfaceTests.testWriteN)r   r   r   r   ÚBasicProducerConsumerProxyr+   r-   r/   r   r   r   r   r)   O   s   r)   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚConsumerInterfaceTestzõTest ProducerConsumerProxy as a Consumer.

    Normally we have ProducingServer -> ConsumingTransport.

    If I am to go between (Server -> Shaper -> Transport), I have to
    play the role of Consumer convincingly for the ProducingServer.
    c                 C   s&   t ƒ | _|  | j¡| _t| jƒ| _d S r   )r"   r*   r+   r   r   r#   r	   r   r   r   r-   b   s    zConsumerInterfaceTest.setUpc                 C   s"   | j  | jd¡ |  | jj¡ d S r   )r   r$   r#   ÚassertFalser   r	   r   r   r   ÚtestRegisterPushg   s    z&ConsumerInterfaceTest.testRegisterPushc                 C   s>   | j  | jd¡ | j  ¡  d| j_| j  ¡  |  | jj¡ d S ©NF)r   r$   r#   r&   r   r   r2   r	   r   r   r   ÚtestUnregisters   s
    

z$ConsumerInterfaceTest.testUnregisterc                 C   s>   | j  | jd¡ | j  ¡  d| j_| j  ¡  |  | jj¡ d S r4   )r   r$   r#   r(   r   r   r2   r	   r   r   r   Ú
testFinish~   s
    

z ConsumerInterfaceTest.testFinishN)r   r   r   r   r-   r3   r5   r6   r   r   r   r   r1   Y   s
   r1   c                   @   sH   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S )ÚProducerInterfaceTestzøTest ProducerConsumerProxy as a Producer.

    Normally we have ProducingServer -> ConsumingTransport.

    If I am to go between (Server -> Shaper -> Transport), I have to
    play the role of Producer convincingly for the ConsumingTransport.
    c                 C   s   t ƒ | _|  | j¡| _d S r   )r"   r   r+   r#   r	   r   r   r   r-      s    zProducerInterfaceTest.setUpc                 C   s   |   | jjd | j¡ d S )Nr   )ÚassertEqualr   r#   r	   r   r   r   ÚtestRegistersProducer”   s    z+ProducerInterfaceTest.testRegistersProducerc                 C   s,   | j  ¡  | j  d¡ |  | j ¡ d¡ d S )Núyakkity yakz*Paused producer should not have sent data.)r#   r   r   r2   r   r   r	   r   r   r   Ú	testPause—   s
    
ÿzProducerInterfaceTest.testPausec                 C   s6   | j  ¡  | j  ¡  | j  d¡ |  | j ¡ d¡ d S )Nr:   )r#   r   r   r   r8   r   r   r	   r   r   r   Ú
testResume   s    

z ProducerInterfaceTest.testResumec                 C   s.   | j  ¡  | j  ¡  |  t| jjƒdd¡ d S )Nr   z Resume triggered an empty write.)r#   r   r   r8   Úlenr   r   r	   r   r   r   ÚtestResumeNoEmptyWrite£   s
    

ÿz,ProducerInterfaceTest.testResumeNoEmptyWritec                 C   s6   | j  ¡  | j  d¡ | j  ¡  |  | j ¡ d¡ d S )Nzbuffer this)r#   r   r   r   r8   r   r   r	   r   r   r   ÚtestResumeBuffer©   s    

z&ProducerInterfaceTest.testResumeBufferc                 C   s,   | j  ¡  | j  d¡ |  | j ¡ d¡ d S )Nr:   z+Stopped producer should not have sent data.)r#   r!   r   r2   r   r   r	   r   r   r   ÚtestStop¯   s
    
ÿzProducerInterfaceTest.testStopN)r   r   r   r   r-   r9   r;   r<   r>   r?   r@   r   r   r   r   r7   ‡   s   r7   c                   @   s   e Zd ZejZdS )ÚPCP_ConsumerInterfaceTestsN©r   r   r   r   r0   r+   r   r   r   r   rA   ¶   s   rA   c                   @   s   e Zd ZejZdS )ÚPCPII_ConsumerInterfaceTestsN©r   r   r   r   ÚProducerConsumerProxyr+   r   r   r   r   rC   ¹   s   rC   c                   @   s   e Zd ZejZdS )ÚPCP_ProducerInterfaceTestsNrB   r   r   r   r   rF   ¼   s   rF   c                   @   s   e Zd ZejZdS )ÚPCPII_ProducerInterfaceTestsNrD   r   r   r   r   rG   ¿   s   rG   c                   @   s&   e Zd ZdZejZdd„ Zdd„ ZdS )ÚProducerProxyTestszFProducer methods on me should be relayed to the Producer I proxy.
    c                 C   s,   |   d ¡| _t| jƒ| _| j | jd¡ d S r   )r+   Úproxyr   ÚparentProducerr$   r	   r   r   r   r-   Ç   s    zProducerProxyTests.setUpc                 C   s   | j  ¡  |  | jj¡ d S r   )rI   r!   Ú
assertTruerJ   r    r	   r   r   r   r@   Ì   s    
zProducerProxyTests.testStopN)	r   r   r   r   r   r0   r+   r-   r@   r   r   r   r   rH   Â   s   rH   c                   @   s6   e Zd ZdZejZdd„ Zdd„ Zdd„ Z	dd	„ Z
d
S )ÚConsumerProxyTestszFConsumer methods on me should be relayed to the Consumer I proxy.
    c                 C   s   t ƒ | _|  | j¡| _d S r   )r"   r*   r+   r   r	   r   r   r   r-   Ö   s    zConsumerProxyTests.setUpc                 C   s"   | j  d¡ |  | j ¡ d¡ d S r.   )r   r   r8   r*   r   r	   r   r   r   r/   Ú   s    zConsumerProxyTests.testWritec                 C   s   | j  ¡  |  | jj¡ d S r   )r   r(   rK   r*   r'   r	   r   r   r   r6   ß   s    
zConsumerProxyTests.testFinishc                 C   s   | j  ¡  |  | jj¡ d S r   )r   r&   rK   r*   r%   r	   r   r   r   r5   ã   s    
z!ConsumerProxyTests.testUnregisterN)r   r   r   r   r   r0   r+   r-   r/   r6   r5   r   r   r   r   rL   Ñ   s   rL   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚPullProducerTestc                 C   s6   t ƒ | _|  | j¡| _t| jƒ| _| j | jd¡ d S r   )r"   r*   r+   rI   r   rJ   r$   r	   r   r   r   r-   é   s    zPullProducerTest.setUpc                 C   s"   | j  d¡ |  | j ¡ d¡ d S )NÚhelloz+Pulling Consumer got data before it pulled.)rI   r   r2   r*   r   r	   r   r   r   ÚtestHoldWritesï   s    ÿzPullProducerTest.testHoldWritesc                 C   s,   | j  d¡ | j  ¡  |  | j ¡ d¡ d S )NrN   )rI   r   r   r8   r*   r   r	   r   r   r   ÚtestPullõ   s    
zPullProducerTest.testPullc                 C   sX   | j  d¡ | j  d¡ | j  ¡  t| jjƒ}|  |dd|f ¡ |  | j ¡ d¡ d S )Nzhello Zsunshineé   z(Pull resulted in %d writes instead of 1.zhello sunshine)rI   r   r   r=   r*   r   r8   r   )r
   Znwritesr   r   r   ÚtestMergeWritesú   s    

ÿz PullProducerTest.testMergeWritesc                 C   s,   | j  ¡  | j  d¡ |  | j ¡ d¡ d S )Nr   )rI   r   r   r8   r*   r   r	   r   r   r   ÚtestLateWrite  s    
zPullProducerTest.testLateWriteN)r   r   r   r-   rO   rP   rR   rS   r   r   r   r   rM   è   s
   
rM   c                   @   s   e Zd ZG dd„ dejƒZdS )ÚPCP_PullProducerTestsc                   @   s   e Zd ZdZdS )z PCP_PullProducerTests.proxyClassFN©r   r   r   ÚiAmStreamingr   r   r   r   r+     s   r+   NrB   r   r   r   r   rT     s   rT   c                   @   s   e Zd ZG dd„ dejƒZdS )ÚPCPII_PullProducerTestsc                   @   s   e Zd ZdZdS )z"PCPII_PullProducerTests.proxyClassFNrU   r   r   r   r   r+     s   r+   NrD   r   r   r   r   rW     s   rW   c                   @   sF   e Zd ZdZejZdd„ Zdd„ Zdd„ Z	dd	„ Z
d
d„ Zdd„ ZdS )ÚBufferedConsumerTestsz=As a consumer, ask the producer to pause after too much data.c                 C   s>   t ƒ | _|  | j¡| _d| j_t| jƒ| _| j | jd¡ d S )Néd   T©r"   r*   r+   rI   Z
bufferSizer   rJ   r$   r	   r   r   r   r-     s
    zBufferedConsumerTests.setUpc                 C   s"   | j  | jd¡ |  | jj¡ d S r4   )rI   r$   rJ   rK   r   r	   r   r   r   ÚtestRegisterPull"  s    z&BufferedConsumerTests.testRegisterPullc                 C   s   | j  ¡  |  | jj¡ d S r   )rI   r   r2   rJ   r   r	   r   r   r   ÚtestPauseIntercept'  s    
z(BufferedConsumerTests.testPauseInterceptc                 C   s&   | j  ¡  | j  ¡  |  | jj¡ d S r   )rI   r   r   r2   rJ   r   r	   r   r   r   ÚtestResumeIntercept+  s    

z)BufferedConsumerTests.testResumeInterceptc                 C   sT   | j  ¡  |  | jjd¡ | j  d¡ |  | jjd¡ | j  d¡ |  | jj¡ dS )zMake sure I say "when."zdon't pause yetZ3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxN)rI   r   r2   rJ   r   r   rK   r	   r   r   r   ÚtestTriggerPause3  s    
z&BufferedConsumerTests.testTriggerPausec                 C   sR   | j  ¡  | j  d¡ |  | jjd¡ | j  ¡  |  | jjd¡ |  | j j¡ dS )z3Make sure I resumeProducing when my buffer empties.Zfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzshould be pausedzProducer should have resumed.N)	rI   r   r   rK   rJ   r   r   r2   ZproducerPausedr	   r   r   r   ÚtestTriggerResume>  s    


ÿz'BufferedConsumerTests.testTriggerResumeN)r   r   r   r   r   rE   r+   r-   r[   r\   r]   r^   r_   r   r   r   r   rX     s   rX   c                   @   s6   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	S )
ÚBufferedPullTestsc                   @   s   e Zd ZdZdd„ ZdS )zBufferedPullTests.proxyClassFc                 C   s$   t j | |d d… ¡ tt|ƒdƒS )NrY   )r   rE   Ú_writeSomeDataÚminr=   r   r   r   r   ra   N  s    z+BufferedPullTests.proxyClass._writeSomeDataN)r   r   r   rV   ra   r   r   r   r   r+   K  s   r+   c                 C   s>   t ƒ | _|  | j¡| _d| j_t| jƒ| _| j | jd¡ d S )NrY   FrZ   r	   r   r   r   r-   R  s
    zBufferedPullTests.setUpc                 C   s$   d| j _| j ¡  |  | j j¡ d S r4   )rJ   r   rI   r   rK   r	   r   r   r   ÚtestResumePullZ  s    
z BufferedPullTests.testResumePullc                 C   s>   | j  ¡  | j  d¡ |  | j ¡ d¡ |  | j jdg¡ d S )NZidatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumZddatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumZdatum)rI   r   r   r8   r*   r   Z_bufferr	   r   r   r   ÚtestLateWriteBufferinga  s    
z(BufferedPullTests.testLateWriteBufferingN)	r   r   r   r   rE   r+   r-   rc   rd   r   r   r   r   r`   J  s   r`   N)Ú__version__Ztwisted.trialr   Ztwisted.protocolsr   r   r   r"   ZTestCaser)   r1   r7   rA   rC   rF   rG   rH   rL   rM   rT   rW   rX   r`   r   r   r   r   Ú<module>   s&   
./#5