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 |