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 |