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