| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic_data_stream.h" | 5 #include "net/quic/quic_data_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_flags.h" | 9 #include "net/quic/quic_flags.h" |
| 10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 using testing::AnyNumber; | 23 using testing::AnyNumber; |
| 24 using testing::InSequence; | 24 using testing::InSequence; |
| 25 using testing::Return; | 25 using testing::Return; |
| 26 using testing::SaveArg; | 26 using testing::SaveArg; |
| 27 using testing::StrictMock; | 27 using testing::StrictMock; |
| 28 | 28 |
| 29 namespace net { | 29 namespace net { |
| 30 namespace test { | 30 namespace test { |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 const QuicConnectionId kStreamId = 3; | 33 // First non-reserved client stream ID. |
| 34 const QuicStreamId kStreamId = 5; |
| 35 |
| 34 const bool kIsServer = true; | 36 const bool kIsServer = true; |
| 35 const bool kShouldProcessData = true; | 37 const bool kShouldProcessData = true; |
| 36 | 38 |
| 37 class TestStream : public QuicDataStream { | 39 class TestStream : public QuicDataStream { |
| 38 public: | 40 public: |
| 39 TestStream(QuicStreamId id, | 41 TestStream(QuicStreamId id, |
| 40 QuicSession* session, | 42 QuicSession* session, |
| 41 bool should_process_data) | 43 bool should_process_data) |
| 42 : QuicDataStream(id, session), | 44 : QuicDataStream(id, session), |
| 43 should_process_data_(should_process_data) {} | 45 should_process_data_(should_process_data) {} |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 // Set a small flow control limit for streams and connection. | 430 // Set a small flow control limit for streams and connection. |
| 429 const uint64 kWindow = 36; | 431 const uint64 kWindow = 36; |
| 430 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 432 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), |
| 431 kWindow); | 433 kWindow); |
| 432 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 434 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), |
| 433 kWindow); | 435 kWindow); |
| 434 QuicFlowControllerPeer::SetReceiveWindowOffset(stream2_->flow_controller(), | 436 QuicFlowControllerPeer::SetReceiveWindowOffset(stream2_->flow_controller(), |
| 435 kWindow); | 437 kWindow); |
| 436 QuicFlowControllerPeer::SetMaxReceiveWindow(stream2_->flow_controller(), | 438 QuicFlowControllerPeer::SetMaxReceiveWindow(stream2_->flow_controller(), |
| 437 kWindow); | 439 kWindow); |
| 438 QuicFlowControllerPeer::SetReceiveWindowOffset(connection_->flow_controller(), | 440 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), |
| 439 kWindow); | 441 kWindow); |
| 440 QuicFlowControllerPeer::SetMaxReceiveWindow(connection_->flow_controller(), | 442 QuicFlowControllerPeer::SetMaxReceiveWindow(session_->flow_controller(), |
| 441 kWindow); | 443 kWindow); |
| 442 | 444 |
| 443 // Supply headers to both streams so that they are happy to receive data. | 445 // Supply headers to both streams so that they are happy to receive data. |
| 444 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 446 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); |
| 445 stream_->OnStreamHeaders(headers); | 447 stream_->OnStreamHeaders(headers); |
| 446 stream_->OnStreamHeadersComplete(false, headers.size()); | 448 stream_->OnStreamHeadersComplete(false, headers.size()); |
| 447 stream2_->OnStreamHeaders(headers); | 449 stream2_->OnStreamHeaders(headers); |
| 448 stream2_->OnStreamHeadersComplete(false, headers.size()); | 450 stream2_->OnStreamHeadersComplete(false, headers.size()); |
| 449 | 451 |
| 450 // Each stream gets a quarter window of data. This should not trigger a | 452 // Each stream gets a quarter window of data. This should not trigger a |
| 451 // WINDOW_UPDATE for either stream, nor for the connection. | 453 // WINDOW_UPDATE for either stream, nor for the connection. |
| 452 string body; | 454 string body; |
| 453 GenerateBody(&body, kWindow / 4); | 455 GenerateBody(&body, kWindow / 4); |
| 454 QuicStreamFrame frame1(kStreamId, false, 0, MakeIOVector(body)); | 456 QuicStreamFrame frame1(kStreamId, false, 0, MakeIOVector(body)); |
| 455 stream_->OnStreamFrame(frame1); | 457 stream_->OnStreamFrame(frame1); |
| 456 QuicStreamFrame frame2(kStreamId + 2, false, 0, MakeIOVector(body)); | 458 QuicStreamFrame frame2(kStreamId + 2, false, 0, MakeIOVector(body)); |
| 457 stream2_->OnStreamFrame(frame2); | 459 stream2_->OnStreamFrame(frame2); |
| 458 | 460 |
| 459 // Now receive a further single byte on one stream - again this does not | 461 // Now receive a further single byte on one stream - again this does not |
| 460 // trigger a stream WINDOW_UPDATE, but now the connection flow control window | 462 // trigger a stream WINDOW_UPDATE, but now the connection flow control window |
| 461 // is over half full and thus a connection WINDOW_UPDATE is sent. | 463 // is over half full and thus a connection WINDOW_UPDATE is sent. |
| 462 EXPECT_CALL(*connection_, SendWindowUpdate(kStreamId, _)).Times(0); | 464 EXPECT_CALL(*connection_, SendWindowUpdate(kStreamId, _)).Times(0); |
| 463 EXPECT_CALL(*connection_, SendWindowUpdate(kStreamId + 2, _)).Times(0); | 465 EXPECT_CALL(*connection_, SendWindowUpdate(kStreamId + 2, _)).Times(0); |
| 464 EXPECT_CALL(*connection_, | 466 EXPECT_CALL(*connection_, |
| 465 SendWindowUpdate(0, QuicFlowControllerPeer::ReceiveWindowOffset( | 467 SendWindowUpdate(0, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 466 connection_->flow_controller()) + | 468 session_->flow_controller()) + |
| 467 1 + kWindow / 2)); | 469 1 + kWindow / 2)); |
| 468 QuicStreamFrame frame3(kStreamId, false, (kWindow / 4), MakeIOVector("a")); | 470 QuicStreamFrame frame3(kStreamId, false, (kWindow / 4), MakeIOVector("a")); |
| 469 stream_->OnStreamFrame(frame3); | 471 stream_->OnStreamFrame(frame3); |
| 470 } | 472 } |
| 471 | 473 |
| 472 TEST_P(QuicDataStreamTest, StreamFlowControlViolation) { | 474 TEST_P(QuicDataStreamTest, StreamFlowControlViolation) { |
| 473 // Tests that on if the peer sends too much data (i.e. violates the flow | 475 // Tests that on if the peer sends too much data (i.e. violates the flow |
| 474 // control protocol), then we terminate the connection. | 476 // control protocol), then we terminate the connection. |
| 475 if (GetParam() < QUIC_VERSION_17) { | 477 if (GetParam() < QUIC_VERSION_17) { |
| 476 return; | 478 return; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 | 513 |
| 512 // Stream should not process data, so that data gets buffered in the | 514 // Stream should not process data, so that data gets buffered in the |
| 513 // sequencer, triggering flow control limits. | 515 // sequencer, triggering flow control limits. |
| 514 Initialize(!kShouldProcessData); | 516 Initialize(!kShouldProcessData); |
| 515 | 517 |
| 516 // Set a small flow control window on streams, and connection. | 518 // Set a small flow control window on streams, and connection. |
| 517 const uint64 kStreamWindow = 50; | 519 const uint64 kStreamWindow = 50; |
| 518 const uint64 kConnectionWindow = 10; | 520 const uint64 kConnectionWindow = 10; |
| 519 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 521 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), |
| 520 kStreamWindow); | 522 kStreamWindow); |
| 521 QuicFlowControllerPeer::SetReceiveWindowOffset(connection_->flow_controller(), | 523 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), |
| 522 kConnectionWindow); | 524 kConnectionWindow); |
| 523 | 525 |
| 524 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 526 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); |
| 525 stream_->OnStreamHeaders(headers); | 527 stream_->OnStreamHeaders(headers); |
| 526 EXPECT_EQ(headers, stream_->data()); | 528 EXPECT_EQ(headers, stream_->data()); |
| 527 stream_->OnStreamHeadersComplete(false, headers.size()); | 529 stream_->OnStreamHeadersComplete(false, headers.size()); |
| 528 | 530 |
| 529 // Send enough data to overflow the connection level flow control window. | 531 // Send enough data to overflow the connection level flow control window. |
| 530 string body; | 532 string body; |
| 531 GenerateBody(&body, kConnectionWindow + 1); | 533 GenerateBody(&body, kConnectionWindow + 1); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 558 EXPECT_CALL(*connection_, SendBlocked(kStreamId)).Times(0); | 560 EXPECT_CALL(*connection_, SendBlocked(kStreamId)).Times(0); |
| 559 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce( | 561 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce( |
| 560 Return(QuicConsumedData(0, fin))); | 562 Return(QuicConsumedData(0, fin))); |
| 561 | 563 |
| 562 stream_->WriteOrBufferData(body, fin, NULL); | 564 stream_->WriteOrBufferData(body, fin, NULL); |
| 563 } | 565 } |
| 564 | 566 |
| 565 } // namespace | 567 } // namespace |
| 566 } // namespace test | 568 } // namespace test |
| 567 } // namespace net | 569 } // namespace net |
| OLD | NEW |