| 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/core/quic_spdy_stream.h" | 5 #include "net/quic/core/quic_spdy_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "net/quic/core/quic_connection.h" | 10 #include "net/quic/core/quic_connection.h" |
| 11 #include "net/quic/core/quic_utils.h" | 11 #include "net/quic/core/quic_utils.h" |
| 12 #include "net/quic/core/quic_write_blocked_list.h" | 12 #include "net/quic/core/quic_write_blocked_list.h" |
| 13 #include "net/quic/core/spdy_utils.h" | 13 #include "net/quic/core/spdy_utils.h" |
| 14 #include "net/quic/platform/api/quic_ptr_util.h" | 14 #include "net/quic/platform/api/quic_ptr_util.h" |
| 15 #include "net/quic/platform/api/quic_string_piece.h" |
| 15 #include "net/quic/platform/api/quic_text_utils.h" | 16 #include "net/quic/platform/api/quic_text_utils.h" |
| 16 #include "net/quic/test_tools/quic_flow_controller_peer.h" | 17 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
| 17 #include "net/quic/test_tools/quic_session_peer.h" | 18 #include "net/quic/test_tools/quic_session_peer.h" |
| 18 #include "net/quic/test_tools/quic_stream_peer.h" | 19 #include "net/quic/test_tools/quic_stream_peer.h" |
| 19 #include "net/quic/test_tools/quic_test_utils.h" | 20 #include "net/quic/test_tools/quic_test_utils.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 23 |
| 23 using base::StringPiece; | |
| 24 using std::string; | 24 using std::string; |
| 25 using testing::AnyNumber; | 25 using testing::AnyNumber; |
| 26 using testing::Invoke; | 26 using testing::Invoke; |
| 27 using testing::Return; | 27 using testing::Return; |
| 28 using testing::StrictMock; | 28 using testing::StrictMock; |
| 29 using testing::_; | 29 using testing::_; |
| 30 | 30 |
| 31 namespace net { | 31 namespace net { |
| 32 namespace test { | 32 namespace test { |
| 33 namespace { | 33 namespace { |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 | 243 |
| 244 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBody) { | 244 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBody) { |
| 245 Initialize(kShouldProcessData); | 245 Initialize(kShouldProcessData); |
| 246 | 246 |
| 247 string body = "this is the body"; | 247 string body = "this is the body"; |
| 248 | 248 |
| 249 EXPECT_EQ("", stream_->data()); | 249 EXPECT_EQ("", stream_->data()); |
| 250 QuicHeaderList headers = ProcessHeaders(false, headers_); | 250 QuicHeaderList headers = ProcessHeaders(false, headers_); |
| 251 EXPECT_EQ(headers, stream_->header_list()); | 251 EXPECT_EQ(headers, stream_->header_list()); |
| 252 stream_->ConsumeHeaderList(); | 252 stream_->ConsumeHeaderList(); |
| 253 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 253 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 254 stream_->OnStreamFrame(frame); | 254 stream_->OnStreamFrame(frame); |
| 255 EXPECT_EQ(QuicHeaderList(), stream_->header_list()); | 255 EXPECT_EQ(QuicHeaderList(), stream_->header_list()); |
| 256 EXPECT_EQ(body, stream_->data()); | 256 EXPECT_EQ(body, stream_->data()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) { | 259 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) { |
| 260 string body = "this is the body"; | 260 string body = "this is the body"; |
| 261 | 261 |
| 262 for (size_t fragment_size = 1; fragment_size < body.size(); ++fragment_size) { | 262 for (size_t fragment_size = 1; fragment_size < body.size(); ++fragment_size) { |
| 263 Initialize(kShouldProcessData); | 263 Initialize(kShouldProcessData); |
| 264 QuicHeaderList headers = ProcessHeaders(false, headers_); | 264 QuicHeaderList headers = ProcessHeaders(false, headers_); |
| 265 ASSERT_EQ(headers, stream_->header_list()); | 265 ASSERT_EQ(headers, stream_->header_list()); |
| 266 stream_->ConsumeHeaderList(); | 266 stream_->ConsumeHeaderList(); |
| 267 for (size_t offset = 0; offset < body.size(); offset += fragment_size) { | 267 for (size_t offset = 0; offset < body.size(); offset += fragment_size) { |
| 268 size_t remaining_data = body.size() - offset; | 268 size_t remaining_data = body.size() - offset; |
| 269 StringPiece fragment(body.data() + offset, | 269 QuicStringPiece fragment(body.data() + offset, |
| 270 std::min(fragment_size, remaining_data)); | 270 std::min(fragment_size, remaining_data)); |
| 271 QuicStreamFrame frame(kClientDataStreamId1, false, offset, | 271 QuicStreamFrame frame(kClientDataStreamId1, false, offset, |
| 272 StringPiece(fragment)); | 272 QuicStringPiece(fragment)); |
| 273 stream_->OnStreamFrame(frame); | 273 stream_->OnStreamFrame(frame); |
| 274 } | 274 } |
| 275 ASSERT_EQ(body, stream_->data()) << "fragment_size: " << fragment_size; | 275 ASSERT_EQ(body, stream_->data()) << "fragment_size: " << fragment_size; |
| 276 } | 276 } |
| 277 } | 277 } |
| 278 | 278 |
| 279 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) { | 279 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) { |
| 280 string body = "this is the body"; | 280 string body = "this is the body"; |
| 281 | 281 |
| 282 for (size_t split_point = 1; split_point < body.size() - 1; ++split_point) { | 282 for (size_t split_point = 1; split_point < body.size() - 1; ++split_point) { |
| 283 Initialize(kShouldProcessData); | 283 Initialize(kShouldProcessData); |
| 284 QuicHeaderList headers = ProcessHeaders(false, headers_); | 284 QuicHeaderList headers = ProcessHeaders(false, headers_); |
| 285 ASSERT_EQ(headers, stream_->header_list()); | 285 ASSERT_EQ(headers, stream_->header_list()); |
| 286 stream_->ConsumeHeaderList(); | 286 stream_->ConsumeHeaderList(); |
| 287 | 287 |
| 288 StringPiece fragment1(body.data(), split_point); | 288 QuicStringPiece fragment1(body.data(), split_point); |
| 289 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, | 289 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, |
| 290 StringPiece(fragment1)); | 290 QuicStringPiece(fragment1)); |
| 291 stream_->OnStreamFrame(frame1); | 291 stream_->OnStreamFrame(frame1); |
| 292 | 292 |
| 293 StringPiece fragment2(body.data() + split_point, body.size() - split_point); | 293 QuicStringPiece fragment2(body.data() + split_point, |
| 294 body.size() - split_point); |
| 294 QuicStreamFrame frame2(kClientDataStreamId1, false, split_point, | 295 QuicStreamFrame frame2(kClientDataStreamId1, false, split_point, |
| 295 StringPiece(fragment2)); | 296 QuicStringPiece(fragment2)); |
| 296 stream_->OnStreamFrame(frame2); | 297 stream_->OnStreamFrame(frame2); |
| 297 | 298 |
| 298 ASSERT_EQ(body, stream_->data()) << "split_point: " << split_point; | 299 ASSERT_EQ(body, stream_->data()) << "split_point: " << split_point; |
| 299 } | 300 } |
| 300 } | 301 } |
| 301 | 302 |
| 302 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyReadv) { | 303 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyReadv) { |
| 303 Initialize(!kShouldProcessData); | 304 Initialize(!kShouldProcessData); |
| 304 | 305 |
| 305 string body = "this is the body"; | 306 string body = "this is the body"; |
| 306 | 307 |
| 307 ProcessHeaders(false, headers_); | 308 ProcessHeaders(false, headers_); |
| 308 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 309 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 309 stream_->OnStreamFrame(frame); | 310 stream_->OnStreamFrame(frame); |
| 310 stream_->ConsumeHeaderList(); | 311 stream_->ConsumeHeaderList(); |
| 311 | 312 |
| 312 char buffer[2048]; | 313 char buffer[2048]; |
| 313 ASSERT_LT(body.length(), arraysize(buffer)); | 314 ASSERT_LT(body.length(), arraysize(buffer)); |
| 314 struct iovec vec; | 315 struct iovec vec; |
| 315 vec.iov_base = buffer; | 316 vec.iov_base = buffer; |
| 316 vec.iov_len = arraysize(buffer); | 317 vec.iov_len = arraysize(buffer); |
| 317 | 318 |
| 318 size_t bytes_read = stream_->Readv(&vec, 1); | 319 size_t bytes_read = stream_->Readv(&vec, 1); |
| 319 EXPECT_EQ(body.length(), bytes_read); | 320 EXPECT_EQ(body.length(), bytes_read); |
| 320 EXPECT_EQ(body, string(buffer, bytes_read)); | 321 EXPECT_EQ(body, string(buffer, bytes_read)); |
| 321 } | 322 } |
| 322 | 323 |
| 323 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyMarkConsumed) { | 324 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyMarkConsumed) { |
| 324 Initialize(!kShouldProcessData); | 325 Initialize(!kShouldProcessData); |
| 325 | 326 |
| 326 string body = "this is the body"; | 327 string body = "this is the body"; |
| 327 | 328 |
| 328 ProcessHeaders(false, headers_); | 329 ProcessHeaders(false, headers_); |
| 329 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 330 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 330 stream_->OnStreamFrame(frame); | 331 stream_->OnStreamFrame(frame); |
| 331 stream_->ConsumeHeaderList(); | 332 stream_->ConsumeHeaderList(); |
| 332 | 333 |
| 333 struct iovec vec; | 334 struct iovec vec; |
| 334 | 335 |
| 335 EXPECT_EQ(1, stream_->GetReadableRegions(&vec, 1)); | 336 EXPECT_EQ(1, stream_->GetReadableRegions(&vec, 1)); |
| 336 EXPECT_EQ(body.length(), vec.iov_len); | 337 EXPECT_EQ(body.length(), vec.iov_len); |
| 337 EXPECT_EQ(body, string(static_cast<char*>(vec.iov_base), vec.iov_len)); | 338 EXPECT_EQ(body, string(static_cast<char*>(vec.iov_base), vec.iov_len)); |
| 338 | 339 |
| 339 stream_->MarkConsumed(body.length()); | 340 stream_->MarkConsumed(body.length()); |
| 340 EXPECT_EQ(body.length(), stream_->flow_controller()->bytes_consumed()); | 341 EXPECT_EQ(body.length(), stream_->flow_controller()->bytes_consumed()); |
| 341 } | 342 } |
| 342 | 343 |
| 343 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyIncrementalReadv) { | 344 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyIncrementalReadv) { |
| 344 Initialize(!kShouldProcessData); | 345 Initialize(!kShouldProcessData); |
| 345 | 346 |
| 346 string body = "this is the body"; | 347 string body = "this is the body"; |
| 347 ProcessHeaders(false, headers_); | 348 ProcessHeaders(false, headers_); |
| 348 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 349 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 349 stream_->OnStreamFrame(frame); | 350 stream_->OnStreamFrame(frame); |
| 350 stream_->ConsumeHeaderList(); | 351 stream_->ConsumeHeaderList(); |
| 351 | 352 |
| 352 char buffer[1]; | 353 char buffer[1]; |
| 353 struct iovec vec; | 354 struct iovec vec; |
| 354 vec.iov_base = buffer; | 355 vec.iov_base = buffer; |
| 355 vec.iov_len = arraysize(buffer); | 356 vec.iov_len = arraysize(buffer); |
| 356 | 357 |
| 357 for (size_t i = 0; i < body.length(); ++i) { | 358 for (size_t i = 0; i < body.length(); ++i) { |
| 358 size_t bytes_read = stream_->Readv(&vec, 1); | 359 size_t bytes_read = stream_->Readv(&vec, 1); |
| 359 ASSERT_EQ(1u, bytes_read); | 360 ASSERT_EQ(1u, bytes_read); |
| 360 EXPECT_EQ(body.data()[i], buffer[0]); | 361 EXPECT_EQ(body.data()[i], buffer[0]); |
| 361 } | 362 } |
| 362 } | 363 } |
| 363 | 364 |
| 364 TEST_P(QuicSpdyStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) { | 365 TEST_P(QuicSpdyStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) { |
| 365 Initialize(!kShouldProcessData); | 366 Initialize(!kShouldProcessData); |
| 366 | 367 |
| 367 string body = "this is the body"; | 368 string body = "this is the body"; |
| 368 ProcessHeaders(false, headers_); | 369 ProcessHeaders(false, headers_); |
| 369 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 370 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 370 stream_->OnStreamFrame(frame); | 371 stream_->OnStreamFrame(frame); |
| 371 stream_->ConsumeHeaderList(); | 372 stream_->ConsumeHeaderList(); |
| 372 | 373 |
| 373 char buffer1[1]; | 374 char buffer1[1]; |
| 374 char buffer2[1]; | 375 char buffer2[1]; |
| 375 struct iovec vec[2]; | 376 struct iovec vec[2]; |
| 376 vec[0].iov_base = buffer1; | 377 vec[0].iov_base = buffer1; |
| 377 vec[0].iov_len = arraysize(buffer1); | 378 vec[0].iov_len = arraysize(buffer1); |
| 378 vec[1].iov_base = buffer2; | 379 vec[1].iov_base = buffer2; |
| 379 vec[1].iov_len = arraysize(buffer2); | 380 vec[1].iov_len = arraysize(buffer2); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 kWindow); | 435 kWindow); |
| 435 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 436 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), |
| 436 kWindow); | 437 kWindow); |
| 437 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 438 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 438 stream_->flow_controller())); | 439 stream_->flow_controller())); |
| 439 | 440 |
| 440 // Stream receives enough data to fill a fraction of the receive window. | 441 // Stream receives enough data to fill a fraction of the receive window. |
| 441 string body(kWindow / 3, 'a'); | 442 string body(kWindow / 3, 'a'); |
| 442 ProcessHeaders(false, headers_); | 443 ProcessHeaders(false, headers_); |
| 443 | 444 |
| 444 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); | 445 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 445 stream_->OnStreamFrame(frame1); | 446 stream_->OnStreamFrame(frame1); |
| 446 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( | 447 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( |
| 447 stream_->flow_controller())); | 448 stream_->flow_controller())); |
| 448 | 449 |
| 449 // Now receive another frame which results in the receive window being over | 450 // Now receive another frame which results in the receive window being over |
| 450 // half full. This should all be buffered, decreasing the receive window but | 451 // half full. This should all be buffered, decreasing the receive window but |
| 451 // not sending WINDOW_UPDATE. | 452 // not sending WINDOW_UPDATE. |
| 452 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, | 453 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, |
| 453 StringPiece(body)); | 454 QuicStringPiece(body)); |
| 454 stream_->OnStreamFrame(frame2); | 455 stream_->OnStreamFrame(frame2); |
| 455 EXPECT_EQ( | 456 EXPECT_EQ( |
| 456 kWindow - (2 * kWindow / 3), | 457 kWindow - (2 * kWindow / 3), |
| 457 QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller())); | 458 QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller())); |
| 458 } | 459 } |
| 459 | 460 |
| 460 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) { | 461 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) { |
| 461 // Tests that on receipt of data, the stream updates its receive window offset | 462 // Tests that on receipt of data, the stream updates its receive window offset |
| 462 // appropriately, and sends WINDOW_UPDATE frames when its receive window drops | 463 // appropriately, and sends WINDOW_UPDATE frames when its receive window drops |
| 463 // too low. | 464 // too low. |
| 464 Initialize(kShouldProcessData); | 465 Initialize(kShouldProcessData); |
| 465 | 466 |
| 466 // Set a small flow control limit. | 467 // Set a small flow control limit. |
| 467 const uint64_t kWindow = 36; | 468 const uint64_t kWindow = 36; |
| 468 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 469 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), |
| 469 kWindow); | 470 kWindow); |
| 470 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), | 471 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), |
| 471 kWindow); | 472 kWindow); |
| 472 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( | 473 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( |
| 473 stream_->flow_controller())); | 474 stream_->flow_controller())); |
| 474 | 475 |
| 475 // Stream receives enough data to fill a fraction of the receive window. | 476 // Stream receives enough data to fill a fraction of the receive window. |
| 476 string body(kWindow / 3, 'a'); | 477 string body(kWindow / 3, 'a'); |
| 477 ProcessHeaders(false, headers_); | 478 ProcessHeaders(false, headers_); |
| 478 stream_->ConsumeHeaderList(); | 479 stream_->ConsumeHeaderList(); |
| 479 | 480 |
| 480 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); | 481 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 481 stream_->OnStreamFrame(frame1); | 482 stream_->OnStreamFrame(frame1); |
| 482 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( | 483 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( |
| 483 stream_->flow_controller())); | 484 stream_->flow_controller())); |
| 484 | 485 |
| 485 // Now receive another frame which results in the receive window being over | 486 // Now receive another frame which results in the receive window being over |
| 486 // half full. This will trigger the stream to increase its receive window | 487 // half full. This will trigger the stream to increase its receive window |
| 487 // offset and send a WINDOW_UPDATE. The result will be again an available | 488 // offset and send a WINDOW_UPDATE. The result will be again an available |
| 488 // window of kWindow bytes. | 489 // window of kWindow bytes. |
| 489 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, | 490 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, |
| 490 StringPiece(body)); | 491 QuicStringPiece(body)); |
| 491 EXPECT_CALL(*connection_, | 492 EXPECT_CALL(*connection_, |
| 492 SendWindowUpdate(kClientDataStreamId1, | 493 SendWindowUpdate(kClientDataStreamId1, |
| 493 QuicFlowControllerPeer::ReceiveWindowOffset( | 494 QuicFlowControllerPeer::ReceiveWindowOffset( |
| 494 stream_->flow_controller()) + | 495 stream_->flow_controller()) + |
| 495 2 * kWindow / 3)); | 496 2 * kWindow / 3)); |
| 496 stream_->OnStreamFrame(frame2); | 497 stream_->OnStreamFrame(frame2); |
| 497 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowSize( | 498 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowSize( |
| 498 stream_->flow_controller())); | 499 stream_->flow_controller())); |
| 499 } | 500 } |
| 500 | 501 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 524 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), | 525 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), |
| 525 headers); | 526 headers); |
| 526 stream_->ConsumeHeaderList(); | 527 stream_->ConsumeHeaderList(); |
| 527 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), | 528 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), |
| 528 headers); | 529 headers); |
| 529 stream2_->ConsumeHeaderList(); | 530 stream2_->ConsumeHeaderList(); |
| 530 | 531 |
| 531 // Each stream gets a quarter window of data. This should not trigger a | 532 // Each stream gets a quarter window of data. This should not trigger a |
| 532 // WINDOW_UPDATE for either stream, nor for the connection. | 533 // WINDOW_UPDATE for either stream, nor for the connection. |
| 533 string body(kWindow / 4, 'a'); | 534 string body(kWindow / 4, 'a'); |
| 534 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); | 535 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 535 stream_->OnStreamFrame(frame1); | 536 stream_->OnStreamFrame(frame1); |
| 536 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, StringPiece(body)); | 537 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, QuicStringPiece(body)); |
| 537 stream2_->OnStreamFrame(frame2); | 538 stream2_->OnStreamFrame(frame2); |
| 538 | 539 |
| 539 // Now receive a further single byte on one stream - again this does not | 540 // Now receive a further single byte on one stream - again this does not |
| 540 // trigger a stream WINDOW_UPDATE, but now the connection flow control window | 541 // trigger a stream WINDOW_UPDATE, but now the connection flow control window |
| 541 // is over half full and thus a connection WINDOW_UPDATE is sent. | 542 // is over half full and thus a connection WINDOW_UPDATE is sent. |
| 542 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0); | 543 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0); |
| 543 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0); | 544 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0); |
| 544 EXPECT_CALL(*connection_, | 545 EXPECT_CALL(*connection_, |
| 545 SendWindowUpdate(0, | 546 SendWindowUpdate(0, |
| 546 QuicFlowControllerPeer::ReceiveWindowOffset( | 547 QuicFlowControllerPeer::ReceiveWindowOffset( |
| 547 session_->flow_controller()) + | 548 session_->flow_controller()) + |
| 548 1 + kWindow / 2)); | 549 1 + kWindow / 2)); |
| 549 QuicStreamFrame frame3(kClientDataStreamId1, false, (kWindow / 4), | 550 QuicStreamFrame frame3(kClientDataStreamId1, false, (kWindow / 4), |
| 550 StringPiece("a")); | 551 QuicStringPiece("a")); |
| 551 stream_->OnStreamFrame(frame3); | 552 stream_->OnStreamFrame(frame3); |
| 552 } | 553 } |
| 553 | 554 |
| 554 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) { | 555 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) { |
| 555 // Tests that on if the peer sends too much data (i.e. violates the flow | 556 // Tests that on if the peer sends too much data (i.e. violates the flow |
| 556 // control protocol), then we terminate the connection. | 557 // control protocol), then we terminate the connection. |
| 557 | 558 |
| 558 // Stream should not process data, so that data gets buffered in the | 559 // Stream should not process data, so that data gets buffered in the |
| 559 // sequencer, triggering flow control limits. | 560 // sequencer, triggering flow control limits. |
| 560 Initialize(!kShouldProcessData); | 561 Initialize(!kShouldProcessData); |
| 561 | 562 |
| 562 // Set a small flow control limit. | 563 // Set a small flow control limit. |
| 563 const uint64_t kWindow = 50; | 564 const uint64_t kWindow = 50; |
| 564 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 565 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), |
| 565 kWindow); | 566 kWindow); |
| 566 | 567 |
| 567 ProcessHeaders(false, headers_); | 568 ProcessHeaders(false, headers_); |
| 568 | 569 |
| 569 // Receive data to overflow the window, violating flow control. | 570 // Receive data to overflow the window, violating flow control. |
| 570 string body(kWindow + 1, 'a'); | 571 string body(kWindow + 1, 'a'); |
| 571 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 572 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 572 EXPECT_CALL(*connection_, | 573 EXPECT_CALL(*connection_, |
| 573 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); | 574 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); |
| 574 stream_->OnStreamFrame(frame); | 575 stream_->OnStreamFrame(frame); |
| 575 } | 576 } |
| 576 | 577 |
| 577 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) { | 578 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) { |
| 578 Initialize(kShouldProcessData); | 579 Initialize(kShouldProcessData); |
| 579 ProcessHeaders(false, headers_); | 580 ProcessHeaders(false, headers_); |
| 580 | 581 |
| 581 stream_->OnStreamReset( | 582 stream_->OnStreamReset( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 599 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), | 600 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), |
| 600 kStreamWindow); | 601 kStreamWindow); |
| 601 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), | 602 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), |
| 602 kConnectionWindow); | 603 kConnectionWindow); |
| 603 | 604 |
| 604 ProcessHeaders(false, headers_); | 605 ProcessHeaders(false, headers_); |
| 605 | 606 |
| 606 // Send enough data to overflow the connection level flow control window. | 607 // Send enough data to overflow the connection level flow control window. |
| 607 string body(kConnectionWindow + 1, 'a'); | 608 string body(kConnectionWindow + 1, 'a'); |
| 608 EXPECT_LT(body.size(), kStreamWindow); | 609 EXPECT_LT(body.size(), kStreamWindow); |
| 609 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); | 610 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body)); |
| 610 | 611 |
| 611 EXPECT_CALL(*connection_, | 612 EXPECT_CALL(*connection_, |
| 612 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); | 613 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); |
| 613 stream_->OnStreamFrame(frame); | 614 stream_->OnStreamFrame(frame); |
| 614 } | 615 } |
| 615 | 616 |
| 616 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) { | 617 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) { |
| 617 // An attempt to write a FIN with no data should not be flow control blocked, | 618 // An attempt to write a FIN with no data should not be flow control blocked, |
| 618 // even if the send window is 0. | 619 // even if the send window is 0. |
| 619 | 620 |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 944 | 945 |
| 945 // Writing Trailers should fail, as the FIN has already been sent. | 946 // Writing Trailers should fail, as the FIN has already been sent. |
| 946 // populated with the number of body bytes written. | 947 // populated with the number of body bytes written. |
| 947 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), | 948 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), |
| 948 "Trailers cannot be sent after a FIN"); | 949 "Trailers cannot be sent after a FIN"); |
| 949 } | 950 } |
| 950 | 951 |
| 951 } // namespace | 952 } // namespace |
| 952 } // namespace test | 953 } // namespace test |
| 953 } // namespace net | 954 } // namespace net |
| OLD | NEW |