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 |