17
17
from twisted.internet.interfaces import (
18
18
IResolverSimple, IConnector, IReactorFDSet)
19
19
from twisted.internet.address import IPv4Address
20
from twisted.internet.defer import Deferred, succeed, fail, maybeDeferred
20
from twisted.internet.defer import Deferred, DeferredList, succeed, fail, maybeDeferred
21
from twisted.internet.endpoints import TCP4ClientEndpoint
21
22
from twisted.internet.protocol import ServerFactory, ClientFactory, Protocol
22
23
from twisted.python.runtime import platform
23
24
from twisted.python.failure import Failure
461
class StopStartReadingProtocol(Protocol):
463
Protocol that pauses and resumes the transport a few times
465
def connectionMade(self):
467
self.pauseResumeProducing(3)
470
def pauseResumeProducing(self, counter):
472
Toggle transport read state, then count down.
474
self.transport.pauseProducing()
475
self.transport.resumeProducing()
477
self.factory.reactor.callLater(0,
478
self.pauseResumeProducing, counter - 1)
480
self.factory.reactor.callLater(0,
481
self.factory.ready.callback, self)
484
def dataReceived(self, data):
485
log.msg('got data', len(data))
487
if len(self.data) == 4*4096:
488
self.factory.stop.callback(self.data)
492
class TCPConnectionTestsBuilder(ReactorBuilder):
494
Builder defining tests relating to L{twisted.internet.tcp.Connection}.
496
def test_stopStartReading(self):
498
This test verifies transport socket read state after multiple
499
pause/resumeProducing calls.
502
reactor = sf.reactor = self.buildReactor()
504
skippedReactors = ["Glib2Reactor", "Gtk2Reactor"]
505
reactorClassName = reactor.__class__.__name__
506
if reactorClassName in skippedReactors and platform.isWindows():
508
"This test is broken on gtk/glib under Windows.")
510
sf.protocol = StopStartReadingProtocol
511
sf.ready = Deferred()
513
p = reactor.listenTCP(0, sf)
514
port = p.getHost().port
515
def proceed(protos, port):
517
Send several IOCPReactor's buffers' worth of data.
519
self.assertTrue(protos[0])
520
self.assertTrue(protos[1])
521
protos = protos[0][1], protos[1][1]
522
protos[0].transport.write('x' * (2 * 4096) + 'y' * (2 * 4096))
523
return (sf.stop.addCallback(cleanup, protos, port)
524
.addCallback(lambda ign: reactor.stop()))
526
def cleanup(data, protos, port):
528
Make sure IOCPReactor didn't start several WSARecv operations
529
that clobbered each other's results.
531
self.assertEquals(data, 'x'*(2*4096) + 'y'*(2*4096),
532
'did not get the right data')
533
return DeferredList([
534
maybeDeferred(protos[0].transport.loseConnection),
535
maybeDeferred(protos[1].transport.loseConnection),
536
maybeDeferred(port.stopListening)])
538
cc = TCP4ClientEndpoint(reactor, '127.0.0.1', port)
540
cf.protocol = Protocol
541
d = DeferredList([cc.connect(cf), sf.ready]).addCallback(proceed, p)
542
self.runReactor(reactor)
460
547
globals().update(TCPClientTestsBuilder.makeTestCaseClasses())
461
548
globals().update(TCPPortTestsBuilder.makeTestCaseClasses())
549
globals().update(TCPConnectionTestsBuilder.makeTestCaseClasses())