Index: third_party/twisted_8_1/twisted/test/iosim.py |
diff --git a/third_party/twisted_8_1/twisted/test/iosim.py b/third_party/twisted_8_1/twisted/test/iosim.py |
deleted file mode 100644 |
index e420661c3720d3e5106264bb082689560218ddac..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/test/iosim.py |
+++ /dev/null |
@@ -1,275 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_amp.TLSTest -*- |
-"""Utilities and helpers for simulating a network |
-""" |
- |
-import itertools |
- |
- |
-from zope.interface import implements, directlyProvides |
- |
-from twisted.internet import error |
-from twisted.internet import interfaces |
-from OpenSSL.SSL import Error as NativeOpenSSLError |
- |
-from twisted.internet._sslverify import OpenSSLVerifyError |
- |
-class TLSNegotiation: |
- def __init__(self, obj, connectState): |
- self.obj = obj |
- self.connectState = connectState |
- self.sent = False |
- self.readyToSend = connectState |
- |
- def __repr__(self): |
- return 'TLSNegotiation(%r)' % (self.obj,) |
- |
- def pretendToVerify(self, other, tpt): |
- # Set the transport problems list here? disconnections? |
- # hmmmmm... need some negative path tests. |
- |
- if not self.obj.iosimVerify(other.obj): |
- tpt.problems.append(OpenSSLVerifyError("fake cert", "fake errno", "fake depth")) |
- tpt.disconnectReason = NativeOpenSSLError() |
- tpt.loseConnection() |
- |
- |
-class FakeTransport: |
- """A wrapper around a file-like object to make it behave as a Transport. |
- |
- This doesn't actually stream the file to the attached protocol, |
- and is thus useful mainly as a utility for debugging protocols. |
- """ |
- |
- implements(interfaces.ITransport, |
- interfaces.ITLSTransport) # ha ha not really |
- |
- _nextserial = itertools.count().next |
- closed = 0 |
- disconnecting = 0 |
- disconnected = 0 |
- disconnectReason = error.ConnectionDone("Connection done") |
- producer = None |
- streamingProducer = 0 |
- tls = None |
- |
- def __init__(self): |
- self.stream = [] |
- self.problems = [] |
- self.serial = self._nextserial() |
- |
- def __repr__(self): |
- return 'FakeTransport<%s,%s,%s>' % ( |
- self.isServer and 'S' or 'C', self.serial, |
- self.protocol.__class__.__name__) |
- |
- def write(self, data): |
- if self.tls is not None: |
- self.tlsbuf.append(data) |
- else: |
- self.stream.append(data) |
- |
- def _checkProducer(self): |
- # Cheating; this is called at "idle" times to allow producers to be |
- # found and dealt with |
- if self.producer: |
- self.producer.resumeProducing() |
- |
- def registerProducer(self, producer, streaming): |
- """From abstract.FileDescriptor |
- """ |
- self.producer = producer |
- self.streamingProducer = streaming |
- if not streaming: |
- producer.resumeProducing() |
- |
- def unregisterProducer(self): |
- self.producer = None |
- |
- def stopConsuming(self): |
- self.unregisterProducer() |
- self.loseConnection() |
- |
- def writeSequence(self, iovec): |
- self.write("".join(iovec)) |
- |
- def loseConnection(self): |
- self.disconnecting = True |
- |
- def reportDisconnect(self): |
- if self.tls is not None: |
- # We were in the middle of negotiating! Must have been a TLS problem. |
- err = NativeOpenSSLError() |
- else: |
- err = self.disconnectReason |
- self.protocol.connectionLost(err) |
- |
- def getPeer(self): |
- # XXX: According to ITransport, this should return an IAddress! |
- return 'file', 'file' |
- |
- def getHost(self): |
- # XXX: According to ITransport, this should return an IAddress! |
- return 'file' |
- |
- def resumeProducing(self): |
- # Never sends data anyways |
- pass |
- |
- def pauseProducing(self): |
- # Never sends data anyways |
- pass |
- |
- def stopProducing(self): |
- self.loseConnection() |
- |
- def startTLS(self, contextFactory, beNormal=True): |
- # Nothing's using this feature yet, but startTLS has an undocumented |
- # second argument which defaults to true; if set to False, servers will |
- # behave like clients and clients will behave like servers. |
- connectState = self.isServer ^ beNormal |
- self.tls = TLSNegotiation(contextFactory, connectState) |
- self.tlsbuf = [] |
- |
- def getOutBuffer(self): |
- S = self.stream |
- if S: |
- self.stream = [] |
- return ''.join(S) |
- elif self.tls is not None: |
- if self.tls.readyToSend: |
- # Only _send_ the TLS negotiation "packet" if I'm ready to. |
- self.tls.sent = True |
- return self.tls |
- else: |
- return None |
- else: |
- return None |
- |
- def bufferReceived(self, buf): |
- if isinstance(buf, TLSNegotiation): |
- assert self.tls is not None # By the time you're receiving a |
- # negotiation, you have to have called |
- # startTLS already. |
- if self.tls.sent: |
- self.tls.pretendToVerify(buf, self) |
- self.tls = None # we're done with the handshake if we've gotten |
- # this far... although maybe it failed...? |
- # TLS started! Unbuffer... |
- b, self.tlsbuf = self.tlsbuf, None |
- self.writeSequence(b) |
- directlyProvides(self, interfaces.ISSLTransport) |
- else: |
- # We haven't sent our own TLS negotiation: time to do that! |
- self.tls.readyToSend = True |
- else: |
- self.protocol.dataReceived(buf) |
- |
- |
- # this next bit is just to fake out problemsFromTransport, which is an |
- # ultra-shitty API anyway. remove it when we manage to remove that. -glyph |
- def getHandle(self): |
- return self |
- |
- get_context = getHandle |
- get_app_data = getHandle |
- |
- # end of gross problemsFromTransport stuff |
- |
-def makeFakeClient(c): |
- ft = FakeTransport() |
- ft.isServer = False |
- ft.protocol = c |
- return ft |
- |
-def makeFakeServer(s): |
- ft = FakeTransport() |
- ft.isServer = True |
- ft.protocol = s |
- return ft |
- |
-class IOPump: |
- """Utility to pump data between clients and servers for protocol testing. |
- |
- Perhaps this is a utility worthy of being in protocol.py? |
- """ |
- def __init__(self, client, server, clientIO, serverIO, debug): |
- self.client = client |
- self.server = server |
- self.clientIO = clientIO |
- self.serverIO = serverIO |
- self.debug = debug |
- |
- def flush(self, debug=False): |
- """Pump until there is no more input or output. |
- |
- Returns whether any data was moved. |
- """ |
- result = False |
- for x in range(1000): |
- if self.pump(debug): |
- result = True |
- else: |
- break |
- else: |
- assert 0, "Too long" |
- return result |
- |
- |
- def pump(self, debug=False): |
- """Move data back and forth. |
- |
- Returns whether any data was moved. |
- """ |
- if self.debug or debug: |
- print '-- GLUG --' |
- sData = self.serverIO.getOutBuffer() |
- cData = self.clientIO.getOutBuffer() |
- self.clientIO._checkProducer() |
- self.serverIO._checkProducer() |
- if self.debug or debug: |
- print '.' |
- # XXX slightly buggy in the face of incremental output |
- if cData: |
- print 'C: '+repr(cData) |
- if sData: |
- print 'S: '+repr(sData) |
- if cData: |
- self.serverIO.bufferReceived(cData) |
- if sData: |
- self.clientIO.bufferReceived(sData) |
- if cData or sData: |
- return True |
- if (self.serverIO.disconnecting and |
- not self.serverIO.disconnected): |
- if self.debug or debug: |
- print '* C' |
- self.serverIO.disconnected = True |
- self.clientIO.disconnecting = True |
- self.clientIO.reportDisconnect() |
- return True |
- if self.clientIO.disconnecting and not self.clientIO.disconnected: |
- if self.debug or debug: |
- print '* S' |
- self.clientIO.disconnected = True |
- self.serverIO.disconnecting = True |
- self.serverIO.reportDisconnect() |
- return True |
- return False |
- |
- |
-def connectedServerAndClient(ServerClass, ClientClass, |
- clientTransportFactory=makeFakeClient, |
- serverTransportFactory=makeFakeServer, |
- debug=False): |
- """Returns a 3-tuple: (client, server, pump) |
- """ |
- c = ClientClass() |
- s = ServerClass() |
- cio = clientTransportFactory(c) |
- sio = serverTransportFactory(s) |
- c.makeConnection(cio) |
- s.makeConnection(sio) |
- pump = IOPump(c, s, cio, sio, debug) |
- # kick off server greeting, etc |
- pump.flush() |
- return c, s, pump |