| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_ack_notifier.h" | 7 #include "net/quic/quic_ack_notifier.h" |
| 8 #include "net/quic/quic_connection.h" | 8 #include "net/quic/quic_connection.h" |
| 9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
| 10 #include "net/quic/quic_write_blocked_list.h" | 10 #include "net/quic/quic_write_blocked_list.h" |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 .WillOnce(Return(QuicConsumedData(kLastWriteSize, false))); | 497 .WillOnce(Return(QuicConsumedData(kLastWriteSize, false))); |
| 498 stream_->OnCanWrite(); | 498 stream_->OnCanWrite(); |
| 499 | 499 |
| 500 // There were two writes, so OnAckNotification is not propagated | 500 // There were two writes, so OnAckNotification is not propagated |
| 501 // until the third Ack arrives. | 501 // until the third Ack arrives. |
| 502 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 502 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 503 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); | 503 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); |
| 504 | 504 |
| 505 // The arguments to delegate->OnAckNotification are the sum of the | 505 // The arguments to delegate->OnAckNotification are the sum of the |
| 506 // arguments to proxy_delegate OnAckNotification calls. | 506 // arguments to proxy_delegate OnAckNotification calls. |
| 507 EXPECT_CALL(*delegate, OnAckNotification(111, 222, 333, 444, zero_)); | 507 EXPECT_CALL(*delegate.get(), OnAckNotification(111, 222, 333, 444, zero_)); |
| 508 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); | 508 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); |
| 509 } | 509 } |
| 510 | 510 |
| 511 // Verify delegate behavior when packets are acked before the | 511 // Verify delegate behavior when packets are acked before the |
| 512 // WritevData call that sends out the last byte. | 512 // WritevData call that sends out the last byte. |
| 513 TEST_F(ReliableQuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) { | 513 TEST_F(ReliableQuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) { |
| 514 Initialize(kShouldProcessData); | 514 Initialize(kShouldProcessData); |
| 515 | 515 |
| 516 scoped_refptr<MockAckNotifierDelegate> delegate( | 516 scoped_refptr<MockAckNotifierDelegate> delegate( |
| 517 new StrictMock<MockAckNotifierDelegate>); | 517 new StrictMock<MockAckNotifierDelegate>); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 538 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 538 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 539 proxy_delegate = NULL; | 539 proxy_delegate = NULL; |
| 540 | 540 |
| 541 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( | 541 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( |
| 542 DoAll(WithArgs<5>(Invoke(CreateFunctor( | 542 DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 543 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 543 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 544 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); | 544 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); |
| 545 stream_->OnCanWrite(); | 545 stream_->OnCanWrite(); |
| 546 | 546 |
| 547 // Handle the ack for the second write. | 547 // Handle the ack for the second write. |
| 548 EXPECT_CALL(*delegate, OnAckNotification(101, 202, 303, 404, zero_)); | 548 EXPECT_CALL(*delegate.get(), OnAckNotification(101, 202, 303, 404, zero_)); |
| 549 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); | 549 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); |
| 550 } | 550 } |
| 551 | 551 |
| 552 // Verify delegate behavior when WriteOrBufferData does not buffer. | 552 // Verify delegate behavior when WriteOrBufferData does not buffer. |
| 553 TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferNoBuffer) { | 553 TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferNoBuffer) { |
| 554 Initialize(kShouldProcessData); | 554 Initialize(kShouldProcessData); |
| 555 | 555 |
| 556 scoped_refptr<MockAckNotifierDelegate> delegate( | 556 scoped_refptr<MockAckNotifierDelegate> delegate( |
| 557 new StrictMock<MockAckNotifierDelegate>); | 557 new StrictMock<MockAckNotifierDelegate>); |
| 558 | 558 |
| 559 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; | 559 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; |
| 560 | 560 |
| 561 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 561 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 562 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( | 562 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 563 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 563 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 564 Return(QuicConsumedData(kDataLen, true)))); | 564 Return(QuicConsumedData(kDataLen, true)))); |
| 565 stream_->WriteOrBufferData(kData1, true, delegate.get()); | 565 stream_->WriteOrBufferData(kData1, true, delegate.get()); |
| 566 EXPECT_FALSE(HasWriteBlockedStreams()); | 566 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 567 | 567 |
| 568 // Handle the ack. | 568 // Handle the ack. |
| 569 EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4, zero_)); | 569 EXPECT_CALL(*delegate.get(), OnAckNotification(1, 2, 3, 4, zero_)); |
| 570 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 570 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 571 } | 571 } |
| 572 | 572 |
| 573 // Verify delegate behavior when WriteOrBufferData buffers all the data. | 573 // Verify delegate behavior when WriteOrBufferData buffers all the data. |
| 574 TEST_F(ReliableQuicStreamTest, BufferOnWriteAndBufferDataWithAckNotifer) { | 574 TEST_F(ReliableQuicStreamTest, BufferOnWriteAndBufferDataWithAckNotifer) { |
| 575 Initialize(kShouldProcessData); | 575 Initialize(kShouldProcessData); |
| 576 | 576 |
| 577 scoped_refptr<MockAckNotifierDelegate> delegate( | 577 scoped_refptr<MockAckNotifierDelegate> delegate( |
| 578 new StrictMock<MockAckNotifierDelegate>); | 578 new StrictMock<MockAckNotifierDelegate>); |
| 579 | 579 |
| 580 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; | 580 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; |
| 581 | 581 |
| 582 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 582 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 583 .WillOnce(Return(QuicConsumedData(0, false))); | 583 .WillOnce(Return(QuicConsumedData(0, false))); |
| 584 stream_->WriteOrBufferData(kData1, true, delegate.get()); | 584 stream_->WriteOrBufferData(kData1, true, delegate.get()); |
| 585 EXPECT_TRUE(HasWriteBlockedStreams()); | 585 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 586 | 586 |
| 587 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 587 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 588 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( | 588 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 589 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 589 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 590 Return(QuicConsumedData(kDataLen, true)))); | 590 Return(QuicConsumedData(kDataLen, true)))); |
| 591 stream_->OnCanWrite(); | 591 stream_->OnCanWrite(); |
| 592 | 592 |
| 593 // Handle the ack. | 593 // Handle the ack. |
| 594 EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4, zero_)); | 594 EXPECT_CALL(*delegate.get(), OnAckNotification(1, 2, 3, 4, zero_)); |
| 595 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 595 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 596 } | 596 } |
| 597 | 597 |
| 598 // Verify delegate behavior when WriteOrBufferData when the FIN is | 598 // Verify delegate behavior when WriteOrBufferData when the FIN is |
| 599 // sent out in a different packet. | 599 // sent out in a different packet. |
| 600 TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferOnlyFinRemains) { | 600 TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferOnlyFinRemains) { |
| 601 Initialize(kShouldProcessData); | 601 Initialize(kShouldProcessData); |
| 602 | 602 |
| 603 scoped_refptr<MockAckNotifierDelegate> delegate( | 603 scoped_refptr<MockAckNotifierDelegate> delegate( |
| 604 new StrictMock<MockAckNotifierDelegate>); | 604 new StrictMock<MockAckNotifierDelegate>); |
| 605 | 605 |
| 606 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; | 606 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; |
| 607 | 607 |
| 608 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 608 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 609 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( | 609 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 610 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 610 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 611 Return(QuicConsumedData(kDataLen, false)))); | 611 Return(QuicConsumedData(kDataLen, false)))); |
| 612 stream_->WriteOrBufferData(kData1, true, delegate.get()); | 612 stream_->WriteOrBufferData(kData1, true, delegate.get()); |
| 613 EXPECT_TRUE(HasWriteBlockedStreams()); | 613 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 614 | 614 |
| 615 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 615 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 616 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( | 616 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 617 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 617 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 618 Return(QuicConsumedData(0, true)))); | 618 Return(QuicConsumedData(0, true)))); |
| 619 stream_->OnCanWrite(); | 619 stream_->OnCanWrite(); |
| 620 | 620 |
| 621 // Handle the acks. | 621 // Handle the acks. |
| 622 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 622 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 623 EXPECT_CALL(*delegate, OnAckNotification(11, 22, 33, 44, zero_)); | 623 EXPECT_CALL(*delegate.get(), OnAckNotification(11, 22, 33, 44, zero_)); |
| 624 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); | 624 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); |
| 625 } | 625 } |
| 626 | 626 |
| 627 // Verify that when we receive a packet which violates flow control (i.e. sends | 627 // Verify that when we receive a packet which violates flow control (i.e. sends |
| 628 // too much data on the stream) that the stream sequencer never sees this frame, | 628 // too much data on the stream) that the stream sequencer never sees this frame, |
| 629 // as we check for violation and close the connection early. | 629 // as we check for violation and close the connection early. |
| 630 TEST_F(ReliableQuicStreamTest, | 630 TEST_F(ReliableQuicStreamTest, |
| 631 StreamSequencerNeverSeesPacketsViolatingFlowControl) { | 631 StreamSequencerNeverSeesPacketsViolatingFlowControl) { |
| 632 Initialize(kShouldProcessData); | 632 Initialize(kShouldProcessData); |
| 633 | 633 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 | 666 |
| 667 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); | 667 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); |
| 668 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); | 668 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); |
| 669 stream_->OnStreamReset(rst_frame); | 669 stream_->OnStreamReset(rst_frame); |
| 670 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 670 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 671 } | 671 } |
| 672 | 672 |
| 673 } // namespace | 673 } // namespace |
| 674 } // namespace test | 674 } // namespace test |
| 675 } // namespace net | 675 } // namespace net |
| OLD | NEW |