| 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/core/quic_stream.h" | 5 #include "net/quic/core/quic_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "net/quic/core/quic_connection.h" | 10 #include "net/quic/core/quic_connection.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 return write_blocked_list_->HasWriteBlockedCryptoOrHeadersStream() || | 136 return write_blocked_list_->HasWriteBlockedCryptoOrHeadersStream() || |
| 137 write_blocked_list_->HasWriteBlockedDataStreams(); | 137 write_blocked_list_->HasWriteBlockedDataStreams(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 QuicConsumedData CloseStreamOnWriteError( | 140 QuicConsumedData CloseStreamOnWriteError( |
| 141 QuicStream* /*stream*/, | 141 QuicStream* /*stream*/, |
| 142 QuicStreamId id, | 142 QuicStreamId id, |
| 143 QuicIOVector /*iov*/, | 143 QuicIOVector /*iov*/, |
| 144 QuicStreamOffset /*offset*/, | 144 QuicStreamOffset /*offset*/, |
| 145 bool /*fin*/, | 145 bool /*fin*/, |
| 146 const scoped_refptr< | 146 const QuicReferenceCountedPointer< |
| 147 QuicAckListenerInterface>& /*ack_notifier_delegate*/) { | 147 QuicAckListenerInterface>& /*ack_notifier_delegate*/) { |
| 148 session_->CloseStream(id); | 148 session_->CloseStream(id); |
| 149 return QuicConsumedData(1, false); | 149 return QuicConsumedData(1, false); |
| 150 } | 150 } |
| 151 | 151 |
| 152 protected: | 152 protected: |
| 153 MockQuicConnectionHelper helper_; | 153 MockQuicConnectionHelper helper_; |
| 154 MockAlarmFactory alarm_factory_; | 154 MockAlarmFactory alarm_factory_; |
| 155 MockQuicConnection* connection_; | 155 MockQuicConnection* connection_; |
| 156 std::unique_ptr<MockQuicSession> session_; | 156 std::unique_ptr<MockQuicSession> session_; |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 stream_->OnWindowUpdateFrame(window_update_2); | 380 stream_->OnWindowUpdateFrame(window_update_2); |
| 381 stream_->OnWindowUpdateFrame(window_update_3); | 381 stream_->OnWindowUpdateFrame(window_update_3); |
| 382 stream_->OnWindowUpdateFrame(window_update_4); | 382 stream_->OnWindowUpdateFrame(window_update_4); |
| 383 EXPECT_EQ( | 383 EXPECT_EQ( |
| 384 window_update_3.byte_offset, | 384 window_update_3.byte_offset, |
| 385 QuicFlowControllerPeer::SendWindowOffset(stream_->flow_controller())); | 385 QuicFlowControllerPeer::SendWindowOffset(stream_->flow_controller())); |
| 386 } | 386 } |
| 387 | 387 |
| 388 // TODO(ianswett): It's not clear this method is still needed now that | 388 // TODO(ianswett): It's not clear this method is still needed now that |
| 389 // ProxyAckNotifierDelegate has been removed. | 389 // ProxyAckNotifierDelegate has been removed. |
| 390 void SaveAckListener(scoped_refptr<QuicAckListenerInterface>* listener_out, | 390 void SaveAckListener( |
| 391 scoped_refptr<QuicAckListenerInterface> listener) { | 391 QuicReferenceCountedPointer<QuicAckListenerInterface>* listener_out, |
| 392 QuicReferenceCountedPointer<QuicAckListenerInterface> listener) { |
| 392 *listener_out = std::move(listener); | 393 *listener_out = std::move(listener); |
| 393 } | 394 } |
| 394 | 395 |
| 395 TEST_F(QuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) { | 396 TEST_F(QuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) { |
| 396 Initialize(kShouldProcessData); | 397 Initialize(kShouldProcessData); |
| 397 | 398 |
| 398 scoped_refptr<MockAckListener> delegate(new StrictMock<MockAckListener>); | 399 QuicReferenceCountedPointer<MockAckListener> delegate( |
| 400 new StrictMock<MockAckListener>); |
| 399 | 401 |
| 400 const int kDataSize = 16 * 1024; | 402 const int kDataSize = 16 * 1024; |
| 401 const string kData(kDataSize, 'a'); | 403 const string kData(kDataSize, 'a'); |
| 402 | 404 |
| 403 const int kFirstWriteSize = 100; | 405 const int kFirstWriteSize = 100; |
| 404 const int kSecondWriteSize = 50; | 406 const int kSecondWriteSize = 50; |
| 405 const int kLastWriteSize = kDataSize - kFirstWriteSize - kSecondWriteSize; | 407 const int kLastWriteSize = kDataSize - kFirstWriteSize - kSecondWriteSize; |
| 406 | 408 |
| 407 // Set a large flow control send window so this doesn't interfere with test. | 409 // Set a large flow control send window so this doesn't interfere with test. |
| 408 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); | 410 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 409 session_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); | 411 session_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 410 | 412 |
| 411 scoped_refptr<QuicAckListenerInterface> ack_listener; | 413 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener; |
| 412 | 414 |
| 413 EXPECT_CALL(*session_, WritevData(_, kTestStreamId, _, _, _, _)) | 415 EXPECT_CALL(*session_, WritevData(_, kTestStreamId, _, _, _, _)) |
| 414 .WillOnce(DoAll( | 416 .WillOnce(DoAll( |
| 415 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &ack_listener))), | 417 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &ack_listener))), |
| 416 Return(QuicConsumedData(kFirstWriteSize, false)))); | 418 Return(QuicConsumedData(kFirstWriteSize, false)))); |
| 417 stream_->WriteOrBufferData(kData, false, delegate); | 419 stream_->WriteOrBufferData(kData, false, delegate); |
| 418 EXPECT_TRUE(HasWriteBlockedStreams()); | 420 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 419 | 421 |
| 420 EXPECT_CALL(*session_, | 422 EXPECT_CALL(*session_, |
| 421 WritevData(stream_, kTestStreamId, _, _, _, ack_listener)) | 423 WritevData(stream_, kTestStreamId, _, _, _, ack_listener)) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 432 WritevData(stream_, kTestStreamId, _, _, _, ack_listener)) | 434 WritevData(stream_, kTestStreamId, _, _, _, ack_listener)) |
| 433 .WillOnce(Return(QuicConsumedData(kLastWriteSize, false))); | 435 .WillOnce(Return(QuicConsumedData(kLastWriteSize, false))); |
| 434 stream_->OnCanWrite(); | 436 stream_->OnCanWrite(); |
| 435 } | 437 } |
| 436 | 438 |
| 437 // Verify delegate behavior when packets are acked before the WritevData call | 439 // Verify delegate behavior when packets are acked before the WritevData call |
| 438 // that sends out the last byte. | 440 // that sends out the last byte. |
| 439 TEST_F(QuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) { | 441 TEST_F(QuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) { |
| 440 Initialize(kShouldProcessData); | 442 Initialize(kShouldProcessData); |
| 441 | 443 |
| 442 scoped_refptr<MockAckListener> ack_listener(new StrictMock<MockAckListener>); | 444 QuicReferenceCountedPointer<MockAckListener> ack_listener( |
| 445 new StrictMock<MockAckListener>); |
| 443 | 446 |
| 444 const int kDataSize = 16 * 1024; | 447 const int kDataSize = 16 * 1024; |
| 445 const string kData(kDataSize, 'a'); | 448 const string kData(kDataSize, 'a'); |
| 446 | 449 |
| 447 const int kInitialWriteSize = 100; | 450 const int kInitialWriteSize = 100; |
| 448 | 451 |
| 449 // Set a large flow control send window so this doesn't interfere with test. | 452 // Set a large flow control send window so this doesn't interfere with test. |
| 450 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); | 453 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 451 session_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); | 454 session_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 452 | 455 |
| 453 scoped_refptr<QuicAckListenerInterface> proxy_delegate; | 456 QuicReferenceCountedPointer<QuicAckListenerInterface> proxy_delegate; |
| 454 | 457 |
| 455 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 458 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 456 .WillOnce(DoAll( | 459 .WillOnce(DoAll( |
| 457 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), | 460 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), |
| 458 Return(QuicConsumedData(kInitialWriteSize, false)))); | 461 Return(QuicConsumedData(kInitialWriteSize, false)))); |
| 459 stream_->WriteOrBufferData(kData, false, ack_listener); | 462 stream_->WriteOrBufferData(kData, false, ack_listener); |
| 460 EXPECT_TRUE(HasWriteBlockedStreams()); | 463 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 461 | 464 |
| 462 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 465 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 463 .WillOnce(DoAll( | 466 .WillOnce(DoAll( |
| 464 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), | 467 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), |
| 465 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); | 468 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); |
| 466 stream_->OnCanWrite(); | 469 stream_->OnCanWrite(); |
| 467 } | 470 } |
| 468 | 471 |
| 469 // Verify delegate behavior when WriteOrBufferData does not buffer. | 472 // Verify delegate behavior when WriteOrBufferData does not buffer. |
| 470 TEST_F(QuicStreamTest, WriteAndBufferDataWithAckNotiferNoBuffer) { | 473 TEST_F(QuicStreamTest, WriteAndBufferDataWithAckNotiferNoBuffer) { |
| 471 Initialize(kShouldProcessData); | 474 Initialize(kShouldProcessData); |
| 472 | 475 |
| 473 scoped_refptr<MockAckListener> delegate(new StrictMock<MockAckListener>); | 476 QuicReferenceCountedPointer<MockAckListener> delegate( |
| 477 new StrictMock<MockAckListener>); |
| 474 | 478 |
| 475 scoped_refptr<QuicAckListenerInterface> proxy_delegate; | 479 QuicReferenceCountedPointer<QuicAckListenerInterface> proxy_delegate; |
| 476 | 480 |
| 477 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 481 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 478 .WillOnce(DoAll( | 482 .WillOnce(DoAll( |
| 479 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), | 483 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), |
| 480 Return(QuicConsumedData(kDataLen, true)))); | 484 Return(QuicConsumedData(kDataLen, true)))); |
| 481 stream_->WriteOrBufferData(kData1, true, delegate); | 485 stream_->WriteOrBufferData(kData1, true, delegate); |
| 482 EXPECT_FALSE(HasWriteBlockedStreams()); | 486 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 483 } | 487 } |
| 484 | 488 |
| 485 // Verify delegate behavior when WriteOrBufferData buffers all the data. | 489 // Verify delegate behavior when WriteOrBufferData buffers all the data. |
| 486 TEST_F(QuicStreamTest, BufferOnWriteAndBufferDataWithAckNotifer) { | 490 TEST_F(QuicStreamTest, BufferOnWriteAndBufferDataWithAckNotifer) { |
| 487 Initialize(kShouldProcessData); | 491 Initialize(kShouldProcessData); |
| 488 | 492 |
| 489 scoped_refptr<MockAckListener> delegate(new StrictMock<MockAckListener>); | 493 QuicReferenceCountedPointer<MockAckListener> delegate( |
| 494 new StrictMock<MockAckListener>); |
| 490 | 495 |
| 491 scoped_refptr<QuicAckListenerInterface> proxy_delegate; | 496 QuicReferenceCountedPointer<QuicAckListenerInterface> proxy_delegate; |
| 492 | 497 |
| 493 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 498 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 494 .WillOnce(Return(QuicConsumedData(0, false))); | 499 .WillOnce(Return(QuicConsumedData(0, false))); |
| 495 stream_->WriteOrBufferData(kData1, true, delegate); | 500 stream_->WriteOrBufferData(kData1, true, delegate); |
| 496 EXPECT_TRUE(HasWriteBlockedStreams()); | 501 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 497 | 502 |
| 498 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 503 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 499 .WillOnce(DoAll( | 504 .WillOnce(DoAll( |
| 500 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), | 505 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), |
| 501 Return(QuicConsumedData(kDataLen, true)))); | 506 Return(QuicConsumedData(kDataLen, true)))); |
| 502 stream_->OnCanWrite(); | 507 stream_->OnCanWrite(); |
| 503 } | 508 } |
| 504 | 509 |
| 505 // Verify delegate behavior when WriteOrBufferData when the FIN is | 510 // Verify delegate behavior when WriteOrBufferData when the FIN is |
| 506 // sent out in a different packet. | 511 // sent out in a different packet. |
| 507 TEST_F(QuicStreamTest, WriteAndBufferDataWithAckNotiferOnlyFinRemains) { | 512 TEST_F(QuicStreamTest, WriteAndBufferDataWithAckNotiferOnlyFinRemains) { |
| 508 Initialize(kShouldProcessData); | 513 Initialize(kShouldProcessData); |
| 509 | 514 |
| 510 scoped_refptr<MockAckListener> delegate(new StrictMock<MockAckListener>); | 515 QuicReferenceCountedPointer<MockAckListener> delegate( |
| 516 new StrictMock<MockAckListener>); |
| 511 | 517 |
| 512 scoped_refptr<QuicAckListenerInterface> proxy_delegate; | 518 QuicReferenceCountedPointer<QuicAckListenerInterface> proxy_delegate; |
| 513 | 519 |
| 514 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 520 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 515 .WillOnce(DoAll( | 521 .WillOnce(DoAll( |
| 516 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), | 522 WithArgs<5>(Invoke(CreateFunctor(SaveAckListener, &proxy_delegate))), |
| 517 Return(QuicConsumedData(kDataLen, false)))); | 523 Return(QuicConsumedData(kDataLen, false)))); |
| 518 stream_->WriteOrBufferData(kData1, true, delegate); | 524 stream_->WriteOrBufferData(kData1, true, delegate); |
| 519 EXPECT_TRUE(HasWriteBlockedStreams()); | 525 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 520 | 526 |
| 521 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) | 527 EXPECT_CALL(*session_, WritevData(stream_, kTestStreamId, _, _, _, _)) |
| 522 .WillOnce(DoAll( | 528 .WillOnce(DoAll( |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 // Receive remaining data and FIN for the request. | 712 // Receive remaining data and FIN for the request. |
| 707 QuicStreamFrame frame2(stream_->id(), true, 0, StringPiece("End")); | 713 QuicStreamFrame frame2(stream_->id(), true, 0, StringPiece("End")); |
| 708 stream_->OnStreamFrame(frame2); | 714 stream_->OnStreamFrame(frame2); |
| 709 EXPECT_TRUE(stream_->fin_received()); | 715 EXPECT_TRUE(stream_->fin_received()); |
| 710 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 716 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 711 } | 717 } |
| 712 | 718 |
| 713 } // namespace | 719 } // namespace |
| 714 } // namespace test | 720 } // namespace test |
| 715 } // namespace net | 721 } // namespace net |
| OLD | NEW |