| 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_spdy_stream.h" | 5 #include "net/quic/quic_spdy_stream.h" | 
| 6 | 6 | 
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" | 
| 8 | 8 | 
| 9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" | 
| 10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" | 
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 342     ASSERT_EQ(body.data()[i + 1], buffer2[0]) << i; | 342     ASSERT_EQ(body.data()[i + 1], buffer2[0]) << i; | 
| 343   } | 343   } | 
| 344 } | 344 } | 
| 345 | 345 | 
| 346 TEST_P(QuicSpdyStreamTest, StreamFlowControlBlocked) { | 346 TEST_P(QuicSpdyStreamTest, StreamFlowControlBlocked) { | 
| 347   // Tests that we send a BLOCKED frame to the peer when we attempt to write, | 347   // Tests that we send a BLOCKED frame to the peer when we attempt to write, | 
| 348   // but are flow control blocked. | 348   // but are flow control blocked. | 
| 349   Initialize(kShouldProcessData); | 349   Initialize(kShouldProcessData); | 
| 350 | 350 | 
| 351   // Set a small flow control limit. | 351   // Set a small flow control limit. | 
| 352   const uint64 kWindow = 36; | 352   const uint64_t kWindow = 36; | 
| 353   QuicFlowControllerPeer::SetSendWindowOffset(stream_->flow_controller(), | 353   QuicFlowControllerPeer::SetSendWindowOffset(stream_->flow_controller(), | 
| 354                                               kWindow); | 354                                               kWindow); | 
| 355   EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset( | 355   EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset( | 
| 356                          stream_->flow_controller())); | 356                          stream_->flow_controller())); | 
| 357 | 357 | 
| 358   // Try to send more data than the flow control limit allows. | 358   // Try to send more data than the flow control limit allows. | 
| 359   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 359   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 
| 360   string body; | 360   string body; | 
| 361   const uint64 kOverflow = 15; | 361   const uint64_t kOverflow = 15; | 
| 362   GenerateBody(&body, kWindow + kOverflow); | 362   GenerateBody(&body, kWindow + kOverflow); | 
| 363 | 363 | 
| 364   EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)); | 364   EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)); | 
| 365   EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _, _)) | 365   EXPECT_CALL(*session_, WritevData(kClientDataStreamId1, _, _, _, _, _)) | 
| 366       .WillOnce(Return(QuicConsumedData(kWindow, true))); | 366       .WillOnce(Return(QuicConsumedData(kWindow, true))); | 
| 367   stream_->WriteOrBufferData(body, false, nullptr); | 367   stream_->WriteOrBufferData(body, false, nullptr); | 
| 368 | 368 | 
| 369   // Should have sent as much as possible, resulting in no send window left. | 369   // Should have sent as much as possible, resulting in no send window left. | 
| 370   EXPECT_EQ(0u, | 370   EXPECT_EQ(0u, | 
| 371             QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller())); | 371             QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller())); | 
| 372 | 372 | 
| 373   // And we should have queued the overflowed data. | 373   // And we should have queued the overflowed data. | 
| 374   EXPECT_EQ(kOverflow, ReliableQuicStreamPeer::SizeOfQueuedData(stream_)); | 374   EXPECT_EQ(kOverflow, ReliableQuicStreamPeer::SizeOfQueuedData(stream_)); | 
| 375 } | 375 } | 
| 376 | 376 | 
| 377 TEST_P(QuicSpdyStreamTest, StreamFlowControlNoWindowUpdateIfNotConsumed) { | 377 TEST_P(QuicSpdyStreamTest, StreamFlowControlNoWindowUpdateIfNotConsumed) { | 
| 378   // The flow control receive window decreases whenever we add new bytes to the | 378   // The flow control receive window decreases whenever we add new bytes to the | 
| 379   // sequencer, whether they are consumed immediately or buffered. However we | 379   // sequencer, whether they are consumed immediately or buffered. However we | 
| 380   // only send WINDOW_UPDATE frames based on increasing number of bytes | 380   // only send WINDOW_UPDATE frames based on increasing number of bytes | 
| 381   // consumed. | 381   // consumed. | 
| 382 | 382 | 
| 383   // Don't process data - it will be buffered instead. | 383   // Don't process data - it will be buffered instead. | 
| 384   Initialize(!kShouldProcessData); | 384   Initialize(!kShouldProcessData); | 
| 385 | 385 | 
| 386   // Expect no WINDOW_UPDATE frames to be sent. | 386   // Expect no WINDOW_UPDATE frames to be sent. | 
| 387   EXPECT_CALL(*connection_, SendWindowUpdate(_, _)).Times(0); | 387   EXPECT_CALL(*connection_, SendWindowUpdate(_, _)).Times(0); | 
| 388 | 388 | 
| 389   // Set a small flow control receive window. | 389   // Set a small flow control receive window. | 
| 390   const uint64 kWindow = 36; | 390   const uint64_t kWindow = 36; | 
| 391   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 391   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 
| 392                                                  kWindow); | 392                                                  kWindow); | 
| 393   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 393   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 
| 394                                               kWindow); | 394                                               kWindow); | 
| 395   EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 395   EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 
| 396                          stream_->flow_controller())); | 396                          stream_->flow_controller())); | 
| 397 | 397 | 
| 398   // Stream receives enough data to fill a fraction of the receive window. | 398   // Stream receives enough data to fill a fraction of the receive window. | 
| 399   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 399   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 
| 400   string body; | 400   string body; | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 418       QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller())); | 418       QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller())); | 
| 419 } | 419 } | 
| 420 | 420 | 
| 421 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) { | 421 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) { | 
| 422   // Tests that on receipt of data, the stream updates its receive window offset | 422   // Tests that on receipt of data, the stream updates its receive window offset | 
| 423   // appropriately, and sends WINDOW_UPDATE frames when its receive window drops | 423   // appropriately, and sends WINDOW_UPDATE frames when its receive window drops | 
| 424   // too low. | 424   // too low. | 
| 425   Initialize(kShouldProcessData); | 425   Initialize(kShouldProcessData); | 
| 426 | 426 | 
| 427   // Set a small flow control limit. | 427   // Set a small flow control limit. | 
| 428   const uint64 kWindow = 36; | 428   const uint64_t kWindow = 36; | 
| 429   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 429   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 
| 430                                                  kWindow); | 430                                                  kWindow); | 
| 431   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 431   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 
| 432                                               kWindow); | 432                                               kWindow); | 
| 433   EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 433   EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 
| 434                          stream_->flow_controller())); | 434                          stream_->flow_controller())); | 
| 435 | 435 | 
| 436   // Stream receives enough data to fill a fraction of the receive window. | 436   // Stream receives enough data to fill a fraction of the receive window. | 
| 437   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 437   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 
| 438   string body; | 438   string body; | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 462                          stream_->flow_controller())); | 462                          stream_->flow_controller())); | 
| 463 } | 463 } | 
| 464 | 464 | 
| 465 TEST_P(QuicSpdyStreamTest, ConnectionFlowControlWindowUpdate) { | 465 TEST_P(QuicSpdyStreamTest, ConnectionFlowControlWindowUpdate) { | 
| 466   // Tests that on receipt of data, the connection updates its receive window | 466   // Tests that on receipt of data, the connection updates its receive window | 
| 467   // offset appropriately, and sends WINDOW_UPDATE frames when its receive | 467   // offset appropriately, and sends WINDOW_UPDATE frames when its receive | 
| 468   // window drops too low. | 468   // window drops too low. | 
| 469   Initialize(kShouldProcessData); | 469   Initialize(kShouldProcessData); | 
| 470 | 470 | 
| 471   // Set a small flow control limit for streams and connection. | 471   // Set a small flow control limit for streams and connection. | 
| 472   const uint64 kWindow = 36; | 472   const uint64_t kWindow = 36; | 
| 473   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 473   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 
| 474                                                  kWindow); | 474                                                  kWindow); | 
| 475   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 475   QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 
| 476                                               kWindow); | 476                                               kWindow); | 
| 477   QuicFlowControllerPeer::SetReceiveWindowOffset(stream2_->flow_controller(), | 477   QuicFlowControllerPeer::SetReceiveWindowOffset(stream2_->flow_controller(), | 
| 478                                                  kWindow); | 478                                                  kWindow); | 
| 479   QuicFlowControllerPeer::SetMaxReceiveWindow(stream2_->flow_controller(), | 479   QuicFlowControllerPeer::SetMaxReceiveWindow(stream2_->flow_controller(), | 
| 480                                               kWindow); | 480                                               kWindow); | 
| 481   QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), | 481   QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), | 
| 482                                                  kWindow); | 482                                                  kWindow); | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 517 | 517 | 
| 518 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) { | 518 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) { | 
| 519   // Tests that on if the peer sends too much data (i.e. violates the flow | 519   // Tests that on if the peer sends too much data (i.e. violates the flow | 
| 520   // control protocol), then we terminate the connection. | 520   // control protocol), then we terminate the connection. | 
| 521 | 521 | 
| 522   // Stream should not process data, so that data gets buffered in the | 522   // Stream should not process data, so that data gets buffered in the | 
| 523   // sequencer, triggering flow control limits. | 523   // sequencer, triggering flow control limits. | 
| 524   Initialize(!kShouldProcessData); | 524   Initialize(!kShouldProcessData); | 
| 525 | 525 | 
| 526   // Set a small flow control limit. | 526   // Set a small flow control limit. | 
| 527   const uint64 kWindow = 50; | 527   const uint64_t kWindow = 50; | 
| 528   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 528   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 
| 529                                                  kWindow); | 529                                                  kWindow); | 
| 530 | 530 | 
| 531   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 531   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 
| 532   stream_->OnStreamHeaders(headers); | 532   stream_->OnStreamHeaders(headers); | 
| 533   stream_->OnStreamHeadersComplete(false, headers.size()); | 533   stream_->OnStreamHeadersComplete(false, headers.size()); | 
| 534 | 534 | 
| 535   // Receive data to overflow the window, violating flow control. | 535   // Receive data to overflow the window, violating flow control. | 
| 536   string body; | 536   string body; | 
| 537   GenerateBody(&body, kWindow + 1); | 537   GenerateBody(&body, kWindow + 1); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 563 TEST_P(QuicSpdyStreamTest, ConnectionFlowControlViolation) { | 563 TEST_P(QuicSpdyStreamTest, ConnectionFlowControlViolation) { | 
| 564   // Tests that on if the peer sends too much data (i.e. violates the flow | 564   // Tests that on if the peer sends too much data (i.e. violates the flow | 
| 565   // control protocol), at the connection level (rather than the stream level) | 565   // control protocol), at the connection level (rather than the stream level) | 
| 566   // then we terminate the connection. | 566   // then we terminate the connection. | 
| 567 | 567 | 
| 568   // Stream should not process data, so that data gets buffered in the | 568   // Stream should not process data, so that data gets buffered in the | 
| 569   // sequencer, triggering flow control limits. | 569   // sequencer, triggering flow control limits. | 
| 570   Initialize(!kShouldProcessData); | 570   Initialize(!kShouldProcessData); | 
| 571 | 571 | 
| 572   // Set a small flow control window on streams, and connection. | 572   // Set a small flow control window on streams, and connection. | 
| 573   const uint64 kStreamWindow = 50; | 573   const uint64_t kStreamWindow = 50; | 
| 574   const uint64 kConnectionWindow = 10; | 574   const uint64_t kConnectionWindow = 10; | 
| 575   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 575   QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 
| 576                                                  kStreamWindow); | 576                                                  kStreamWindow); | 
| 577   QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), | 577   QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), | 
| 578                                                  kConnectionWindow); | 578                                                  kConnectionWindow); | 
| 579 | 579 | 
| 580   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 580   string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); | 
| 581   stream_->OnStreamHeaders(headers); | 581   stream_->OnStreamHeaders(headers); | 
| 582   stream_->OnStreamHeadersComplete(false, headers.size()); | 582   stream_->OnStreamHeadersComplete(false, headers.size()); | 
| 583 | 583 | 
| 584   // Send enough data to overflow the connection level flow control window. | 584   // Send enough data to overflow the connection level flow control window. | 
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 852 | 852 | 
| 853   // Writing Trailers should fail, as the FIN has already been sent. | 853   // Writing Trailers should fail, as the FIN has already been sent. | 
| 854   // populated with the number of body bytes written. | 854   // populated with the number of body bytes written. | 
| 855   EXPECT_DFATAL(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), | 855   EXPECT_DFATAL(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), | 
| 856                 "Trailers cannot be sent after a FIN"); | 856                 "Trailers cannot be sent after a FIN"); | 
| 857 } | 857 } | 
| 858 | 858 | 
| 859 }  // namespace | 859 }  // namespace | 
| 860 }  // namespace test | 860 }  // namespace test | 
| 861 }  // namespace net | 861 }  // namespace net | 
| OLD | NEW | 
|---|