~djfroofy/twisted/5013-txAfterResponse

« back to all changes in this revision

Viewing changes to twisted/internet/test/test_tcp.py

  • Committer: pahan
  • Date: 2011-03-17 02:34:22 UTC
  • Revision ID: svn-v4:bbbe8e31-12d6-0310-92fd-ac37d47ddeeb:trunk:31217
Merge iocp-tcp-large-write-3233-2

Author: PenguinOfDoom
Reviewer: exarkun
Fixes: #3233

Remove immediate successful completion handling for all overlapped operations.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
457
458
 
458
459
 
459
460
 
 
461
class StopStartReadingProtocol(Protocol):
 
462
    """
 
463
    Protocol that pauses and resumes the transport a few times
 
464
    """
 
465
    def connectionMade(self):
 
466
        self.data = ''
 
467
        self.pauseResumeProducing(3)
 
468
 
 
469
 
 
470
    def pauseResumeProducing(self, counter):
 
471
        """
 
472
        Toggle transport read state, then count down.
 
473
        """
 
474
        self.transport.pauseProducing()
 
475
        self.transport.resumeProducing()
 
476
        if counter:
 
477
            self.factory.reactor.callLater(0,
 
478
                    self.pauseResumeProducing, counter - 1)
 
479
        else:
 
480
            self.factory.reactor.callLater(0,
 
481
                    self.factory.ready.callback, self)
 
482
 
 
483
 
 
484
    def dataReceived(self, data):
 
485
        log.msg('got data', len(data))
 
486
        self.data += data
 
487
        if len(self.data) == 4*4096:
 
488
            self.factory.stop.callback(self.data)
 
489
 
 
490
 
 
491
 
 
492
class TCPConnectionTestsBuilder(ReactorBuilder):
 
493
    """
 
494
    Builder defining tests relating to L{twisted.internet.tcp.Connection}.
 
495
    """
 
496
    def test_stopStartReading(self):
 
497
        """
 
498
        This test verifies transport socket read state after multiple
 
499
        pause/resumeProducing calls.
 
500
        """
 
501
        sf = ServerFactory()
 
502
        reactor = sf.reactor = self.buildReactor()
 
503
 
 
504
        skippedReactors = ["Glib2Reactor", "Gtk2Reactor"]
 
505
        reactorClassName = reactor.__class__.__name__
 
506
        if reactorClassName in skippedReactors and platform.isWindows():
 
507
            raise SkipTest(
 
508
                "This test is broken on gtk/glib under Windows.")
 
509
 
 
510
        sf.protocol = StopStartReadingProtocol
 
511
        sf.ready = Deferred()
 
512
        sf.stop = Deferred()
 
513
        p = reactor.listenTCP(0, sf)
 
514
        port = p.getHost().port
 
515
        def proceed(protos, port):
 
516
            """
 
517
            Send several IOCPReactor's buffers' worth of data.
 
518
            """
 
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()))
 
525
        
 
526
        def cleanup(data, protos, port):
 
527
            """
 
528
            Make sure IOCPReactor didn't start several WSARecv operations
 
529
            that clobbered each other's results.
 
530
            """
 
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)])
 
537
 
 
538
        cc = TCP4ClientEndpoint(reactor, '127.0.0.1', port)
 
539
        cf = ClientFactory()
 
540
        cf.protocol = Protocol
 
541
        d = DeferredList([cc.connect(cf), sf.ready]).addCallback(proceed, p)
 
542
        self.runReactor(reactor)
 
543
        return d
 
544
 
 
545
 
 
546
 
460
547
globals().update(TCPClientTestsBuilder.makeTestCaseClasses())
461
548
globals().update(TCPPortTestsBuilder.makeTestCaseClasses())
 
549
globals().update(TCPConnectionTestsBuilder.makeTestCaseClasses())
 
550