| Index: third_party/twisted_8_1/twisted/test/test_pcp.py
|
| diff --git a/third_party/twisted_8_1/twisted/test/test_pcp.py b/third_party/twisted_8_1/twisted/test/test_pcp.py
|
| deleted file mode 100644
|
| index 806d45bd9ff75f361dfbd1d0c8a66ac227bf0968..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/test/test_pcp.py
|
| +++ /dev/null
|
| @@ -1,368 +0,0 @@
|
| -# -*- Python -*-
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -__version__ = '$Revision: 1.5 $'[11:-2]
|
| -
|
| -from StringIO import StringIO
|
| -from twisted.trial import unittest
|
| -from twisted.protocols import pcp
|
| -
|
| -# Goal:
|
| -
|
| -# Take a Protocol instance. Own all outgoing data - anything that
|
| -# would go to p.transport.write. Own all incoming data - anything
|
| -# that comes to p.dataReceived.
|
| -
|
| -# I need:
|
| -# Something with the AbstractFileDescriptor interface.
|
| -# That is:
|
| -# - acts as a Transport
|
| -# - has a method write()
|
| -# - which buffers
|
| -# - acts as a Consumer
|
| -# - has a registerProducer, unRegisterProducer
|
| -# - tells the Producer to back off (pauseProducing) when its buffer is full.
|
| -# - tells the Producer to resumeProducing when its buffer is not so full.
|
| -# - acts as a Producer
|
| -# - calls registerProducer
|
| -# - calls write() on consumers
|
| -# - honors requests to pause/resume producing
|
| -# - honors stopProducing, and passes it along to upstream Producers
|
| -
|
| -
|
| -class DummyTransport:
|
| - """A dumb transport to wrap around."""
|
| -
|
| - def __init__(self):
|
| - self._writes = []
|
| -
|
| - def write(self, data):
|
| - self._writes.append(data)
|
| -
|
| - def getvalue(self):
|
| - return ''.join(self._writes)
|
| -
|
| -class DummyProducer:
|
| - resumed = False
|
| - stopped = False
|
| - paused = False
|
| -
|
| - def __init__(self, consumer):
|
| - self.consumer = consumer
|
| -
|
| - def resumeProducing(self):
|
| - self.resumed = True
|
| - self.paused = False
|
| -
|
| - def pauseProducing(self):
|
| - self.paused = True
|
| -
|
| - def stopProducing(self):
|
| - self.stopped = True
|
| -
|
| -
|
| -class DummyConsumer(DummyTransport):
|
| - producer = None
|
| - finished = False
|
| - unregistered = True
|
| -
|
| - def registerProducer(self, producer, streaming):
|
| - self.producer = (producer, streaming)
|
| -
|
| - def unregisterProducer(self):
|
| - self.unregistered = True
|
| -
|
| - def finish(self):
|
| - self.finished = True
|
| -
|
| -class TransportInterfaceTest(unittest.TestCase):
|
| - proxyClass = pcp.BasicProducerConsumerProxy
|
| -
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.transport = self.proxyClass(self.underlying)
|
| -
|
| - def testWrite(self):
|
| - self.transport.write("some bytes")
|
| -
|
| -class ConsumerInterfaceTest:
|
| - """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.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.consumer = self.proxyClass(self.underlying)
|
| - self.producer = DummyProducer(self.consumer)
|
| -
|
| - def testRegisterPush(self):
|
| - self.consumer.registerProducer(self.producer, True)
|
| - ## Consumer should NOT have called PushProducer.resumeProducing
|
| - self.failIf(self.producer.resumed)
|
| -
|
| - ## I'm I'm just a proxy, should I only do resumeProducing when
|
| - ## I get poked myself?
|
| - #def testRegisterPull(self):
|
| - # self.consumer.registerProducer(self.producer, False)
|
| - # ## Consumer SHOULD have called PushProducer.resumeProducing
|
| - # self.failUnless(self.producer.resumed)
|
| -
|
| - def testUnregister(self):
|
| - self.consumer.registerProducer(self.producer, False)
|
| - self.consumer.unregisterProducer()
|
| - # Now when the consumer would ordinarily want more data, it
|
| - # shouldn't ask producer for it.
|
| - # The most succinct way to trigger "want more data" is to proxy for
|
| - # a PullProducer and have someone ask me for data.
|
| - self.producer.resumed = False
|
| - self.consumer.resumeProducing()
|
| - self.failIf(self.producer.resumed)
|
| -
|
| - def testFinish(self):
|
| - self.consumer.registerProducer(self.producer, False)
|
| - self.consumer.finish()
|
| - # I guess finish should behave like unregister?
|
| - self.producer.resumed = False
|
| - self.consumer.resumeProducing()
|
| - self.failIf(self.producer.resumed)
|
| -
|
| -
|
| -class ProducerInterfaceTest:
|
| - """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.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.consumer = DummyConsumer()
|
| - self.producer = self.proxyClass(self.consumer)
|
| -
|
| - def testRegistersProducer(self):
|
| - self.failUnlessEqual(self.consumer.producer[0], self.producer)
|
| -
|
| - def testPause(self):
|
| - self.producer.pauseProducing()
|
| - self.producer.write("yakkity yak")
|
| - self.failIf(self.consumer.getvalue(),
|
| - "Paused producer should not have sent data.")
|
| -
|
| - def testResume(self):
|
| - self.producer.pauseProducing()
|
| - self.producer.resumeProducing()
|
| - self.producer.write("yakkity yak")
|
| - self.failUnlessEqual(self.consumer.getvalue(), "yakkity yak")
|
| -
|
| - def testResumeNoEmptyWrite(self):
|
| - self.producer.pauseProducing()
|
| - self.producer.resumeProducing()
|
| - self.failUnlessEqual(len(self.consumer._writes), 0,
|
| - "Resume triggered an empty write.")
|
| -
|
| - def testResumeBuffer(self):
|
| - self.producer.pauseProducing()
|
| - self.producer.write("buffer this")
|
| - self.producer.resumeProducing()
|
| - self.failUnlessEqual(self.consumer.getvalue(), "buffer this")
|
| -
|
| - def testStop(self):
|
| - self.producer.stopProducing()
|
| - self.producer.write("yakkity yak")
|
| - self.failIf(self.consumer.getvalue(),
|
| - "Stopped producer should not have sent data.")
|
| -
|
| -
|
| -class PCP_ConsumerInterfaceTest(ConsumerInterfaceTest, unittest.TestCase):
|
| - proxyClass = pcp.BasicProducerConsumerProxy
|
| -
|
| -class PCPII_ConsumerInterfaceTest(ConsumerInterfaceTest, unittest.TestCase):
|
| - proxyClass = pcp.ProducerConsumerProxy
|
| -
|
| -class PCP_ProducerInterfaceTest(ProducerInterfaceTest, unittest.TestCase):
|
| - proxyClass = pcp.BasicProducerConsumerProxy
|
| -
|
| -class PCPII_ProducerInterfaceTest(ProducerInterfaceTest, unittest.TestCase):
|
| - proxyClass = pcp.ProducerConsumerProxy
|
| -
|
| -class ProducerProxyTest(unittest.TestCase):
|
| - """Producer methods on me should be relayed to the Producer I proxy.
|
| - """
|
| - proxyClass = pcp.BasicProducerConsumerProxy
|
| -
|
| - def setUp(self):
|
| - self.proxy = self.proxyClass(None)
|
| - self.parentProducer = DummyProducer(self.proxy)
|
| - self.proxy.registerProducer(self.parentProducer, True)
|
| -
|
| - def testStop(self):
|
| - self.proxy.stopProducing()
|
| - self.failUnless(self.parentProducer.stopped)
|
| -
|
| -
|
| -class ConsumerProxyTest(unittest.TestCase):
|
| - """Consumer methods on me should be relayed to the Consumer I proxy.
|
| - """
|
| - proxyClass = pcp.BasicProducerConsumerProxy
|
| -
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.consumer = self.proxyClass(self.underlying)
|
| -
|
| - def testWrite(self):
|
| - # NOTE: This test only valid for streaming (Push) systems.
|
| - self.consumer.write("some bytes")
|
| - self.failUnlessEqual(self.underlying.getvalue(), "some bytes")
|
| -
|
| - def testFinish(self):
|
| - self.consumer.finish()
|
| - self.failUnless(self.underlying.finished)
|
| -
|
| - def testUnregister(self):
|
| - self.consumer.unregisterProducer()
|
| - self.failUnless(self.underlying.unregistered)
|
| -
|
| -
|
| -class PullProducerTest:
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.proxy = self.proxyClass(self.underlying)
|
| - self.parentProducer = DummyProducer(self.proxy)
|
| - self.proxy.registerProducer(self.parentProducer, True)
|
| -
|
| - def testHoldWrites(self):
|
| - self.proxy.write("hello")
|
| - # Consumer should get no data before it says resumeProducing.
|
| - self.failIf(self.underlying.getvalue(),
|
| - "Pulling Consumer got data before it pulled.")
|
| -
|
| - def testPull(self):
|
| - self.proxy.write("hello")
|
| - self.proxy.resumeProducing()
|
| - self.failUnlessEqual(self.underlying.getvalue(), "hello")
|
| -
|
| - def testMergeWrites(self):
|
| - self.proxy.write("hello ")
|
| - self.proxy.write("sunshine")
|
| - self.proxy.resumeProducing()
|
| - nwrites = len(self.underlying._writes)
|
| - self.failUnlessEqual(nwrites, 1, "Pull resulted in %d writes instead "
|
| - "of 1." % (nwrites,))
|
| - self.failUnlessEqual(self.underlying.getvalue(), "hello sunshine")
|
| -
|
| -
|
| - def testLateWrite(self):
|
| - # consumer sends its initial pull before we have data
|
| - self.proxy.resumeProducing()
|
| - self.proxy.write("data")
|
| - # This data should answer that pull request.
|
| - self.failUnlessEqual(self.underlying.getvalue(), "data")
|
| -
|
| -class PCP_PullProducerTest(PullProducerTest, unittest.TestCase):
|
| - class proxyClass(pcp.BasicProducerConsumerProxy):
|
| - iAmStreaming = False
|
| -
|
| -class PCPII_PullProducerTest(PullProducerTest, unittest.TestCase):
|
| - class proxyClass(pcp.ProducerConsumerProxy):
|
| - iAmStreaming = False
|
| -
|
| -# Buffering!
|
| -
|
| -class BufferedConsumerTest(unittest.TestCase):
|
| - """As a consumer, ask the producer to pause after too much data."""
|
| -
|
| - proxyClass = pcp.ProducerConsumerProxy
|
| -
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.proxy = self.proxyClass(self.underlying)
|
| - self.proxy.bufferSize = 100
|
| -
|
| - self.parentProducer = DummyProducer(self.proxy)
|
| - self.proxy.registerProducer(self.parentProducer, True)
|
| -
|
| - def testRegisterPull(self):
|
| - self.proxy.registerProducer(self.parentProducer, False)
|
| - ## Consumer SHOULD have called PushProducer.resumeProducing
|
| - self.failUnless(self.parentProducer.resumed)
|
| -
|
| - def testPauseIntercept(self):
|
| - self.proxy.pauseProducing()
|
| - self.failIf(self.parentProducer.paused)
|
| -
|
| - def testResumeIntercept(self):
|
| - self.proxy.pauseProducing()
|
| - self.proxy.resumeProducing()
|
| - # With a streaming producer, just because the proxy was resumed is
|
| - # not necessarily a reason to resume the parent producer. The state
|
| - # of the buffer should decide that.
|
| - self.failIf(self.parentProducer.resumed)
|
| -
|
| - def testTriggerPause(self):
|
| - """Make sure I say \"when.\""""
|
| -
|
| - # Pause the proxy so data sent to it builds up in its buffer.
|
| - self.proxy.pauseProducing()
|
| - self.failIf(self.parentProducer.paused, "don't pause yet")
|
| - self.proxy.write("x" * 51)
|
| - self.failIf(self.parentProducer.paused, "don't pause yet")
|
| - self.proxy.write("x" * 51)
|
| - self.failUnless(self.parentProducer.paused)
|
| -
|
| - def testTriggerResume(self):
|
| - """Make sure I resumeProducing when my buffer empties."""
|
| - self.proxy.pauseProducing()
|
| - self.proxy.write("x" * 102)
|
| - self.failUnless(self.parentProducer.paused, "should be paused")
|
| - self.proxy.resumeProducing()
|
| - # Resuming should have emptied my buffer, so I should tell my
|
| - # parent to resume too.
|
| - self.failIf(self.parentProducer.paused,
|
| - "Producer should have resumed.")
|
| - self.failIf(self.proxy.producerPaused)
|
| -
|
| -class BufferedPullTests(unittest.TestCase):
|
| - class proxyClass(pcp.ProducerConsumerProxy):
|
| - iAmStreaming = False
|
| -
|
| - def _writeSomeData(self, data):
|
| - pcp.ProducerConsumerProxy._writeSomeData(self, data[:100])
|
| - return min(len(data), 100)
|
| -
|
| - def setUp(self):
|
| - self.underlying = DummyConsumer()
|
| - self.proxy = self.proxyClass(self.underlying)
|
| - self.proxy.bufferSize = 100
|
| -
|
| - self.parentProducer = DummyProducer(self.proxy)
|
| - self.proxy.registerProducer(self.parentProducer, False)
|
| -
|
| - def testResumePull(self):
|
| - # If proxy has no data to send on resumeProducing, it had better pull
|
| - # some from its PullProducer.
|
| - self.parentProducer.resumed = False
|
| - self.proxy.resumeProducing()
|
| - self.failUnless(self.parentProducer.resumed)
|
| -
|
| - def testLateWriteBuffering(self):
|
| - # consumer sends its initial pull before we have data
|
| - self.proxy.resumeProducing()
|
| - self.proxy.write("datum" * 21)
|
| - # This data should answer that pull request.
|
| - self.failUnlessEqual(self.underlying.getvalue(), "datum" * 20)
|
| - # but there should be some left over
|
| - self.failUnlessEqual(self.proxy._buffer, ["datum"])
|
| -
|
| -
|
| -# TODO:
|
| -# test that web request finishing bug (when we weren't proxying
|
| -# unregisterProducer but were proxying finish, web file transfers
|
| -# would hang on the last block.)
|
| -# test what happens if writeSomeBytes decided to write zero bytes.
|
|
|