Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(846)

Side by Side Diff: net/quic/core/quic_spdy_stream_test.cc

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_spdy_stream.h ('k') | net/quic/core/quic_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 381
382 // Set a small flow control limit. 382 // Set a small flow control limit.
383 const uint64_t kWindow = 36; 383 const uint64_t kWindow = 36;
384 QuicFlowControllerPeer::SetSendWindowOffset(stream_->flow_controller(), 384 QuicFlowControllerPeer::SetSendWindowOffset(stream_->flow_controller(),
385 kWindow); 385 kWindow);
386 EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset( 386 EXPECT_EQ(kWindow, QuicFlowControllerPeer::SendWindowOffset(
387 stream_->flow_controller())); 387 stream_->flow_controller()));
388 388
389 // Try to send more data than the flow control limit allows. 389 // Try to send more data than the flow control limit allows.
390 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); 390 string headers = SpdyUtils::SerializeUncompressedHeaders(headers_);
391 string body;
392 const uint64_t kOverflow = 15; 391 const uint64_t kOverflow = 15;
393 GenerateBody(&body, kWindow + kOverflow); 392 string body(kWindow + kOverflow, 'a');
394 393
395 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1)); 394 EXPECT_CALL(*connection_, SendBlocked(kClientDataStreamId1));
396 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)) 395 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
397 .WillOnce(Return(QuicConsumedData(kWindow, true))); 396 .WillOnce(Return(QuicConsumedData(kWindow, true)));
398 stream_->WriteOrBufferData(body, false, nullptr); 397 stream_->WriteOrBufferData(body, false, nullptr);
399 398
400 // Should have sent as much as possible, resulting in no send window left. 399 // Should have sent as much as possible, resulting in no send window left.
401 EXPECT_EQ(0u, 400 EXPECT_EQ(0u,
402 QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller())); 401 QuicFlowControllerPeer::SendWindowSize(stream_->flow_controller()));
403 402
(...skipping 16 matching lines...) Expand all
420 // Set a small flow control receive window. 419 // Set a small flow control receive window.
421 const uint64_t kWindow = 36; 420 const uint64_t kWindow = 36;
422 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 421 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
423 kWindow); 422 kWindow);
424 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), 423 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(),
425 kWindow); 424 kWindow);
426 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( 425 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset(
427 stream_->flow_controller())); 426 stream_->flow_controller()));
428 427
429 // Stream receives enough data to fill a fraction of the receive window. 428 // Stream receives enough data to fill a fraction of the receive window.
430 string body; 429 string body(kWindow / 3, 'a');
431 GenerateBody(&body, kWindow / 3); 430 auto headers = AsHeaderList(headers_);
432 ProcessHeaders(false, headers_); 431 ProcessHeaders(false, headers_);
433 432
434 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 433 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body));
435 stream_->OnStreamFrame(frame1); 434 stream_->OnStreamFrame(frame1);
436 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( 435 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize(
437 stream_->flow_controller())); 436 stream_->flow_controller()));
438 437
439 // Now receive another frame which results in the receive window being over 438 // Now receive another frame which results in the receive window being over
440 // half full. This should all be buffered, decreasing the receive window but 439 // half full. This should all be buffered, decreasing the receive window but
441 // not sending WINDOW_UPDATE. 440 // not sending WINDOW_UPDATE.
(...skipping 14 matching lines...) Expand all
456 // Set a small flow control limit. 455 // Set a small flow control limit.
457 const uint64_t kWindow = 36; 456 const uint64_t kWindow = 36;
458 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 457 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
459 kWindow); 458 kWindow);
460 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), 459 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(),
461 kWindow); 460 kWindow);
462 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( 461 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset(
463 stream_->flow_controller())); 462 stream_->flow_controller()));
464 463
465 // Stream receives enough data to fill a fraction of the receive window. 464 // Stream receives enough data to fill a fraction of the receive window.
466 string body; 465 string body(kWindow / 3, 'a');
467 GenerateBody(&body, kWindow / 3);
468 ProcessHeaders(false, headers_); 466 ProcessHeaders(false, headers_);
469 stream_->ConsumeHeaderList(); 467 stream_->ConsumeHeaderList();
470 468
471 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 469 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body));
472 stream_->OnStreamFrame(frame1); 470 stream_->OnStreamFrame(frame1);
473 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( 471 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize(
474 stream_->flow_controller())); 472 stream_->flow_controller()));
475 473
476 // Now receive another frame which results in the receive window being over 474 // Now receive another frame which results in the receive window being over
477 // half full. This will trigger the stream to increase its receive window 475 // half full. This will trigger the stream to increase its receive window
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 auto headers = AsHeaderList(headers_); 512 auto headers = AsHeaderList(headers_);
515 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), 513 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(),
516 headers); 514 headers);
517 stream_->ConsumeHeaderList(); 515 stream_->ConsumeHeaderList();
518 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), 516 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(),
519 headers); 517 headers);
520 stream2_->ConsumeHeaderList(); 518 stream2_->ConsumeHeaderList();
521 519
522 // Each stream gets a quarter window of data. This should not trigger a 520 // Each stream gets a quarter window of data. This should not trigger a
523 // WINDOW_UPDATE for either stream, nor for the connection. 521 // WINDOW_UPDATE for either stream, nor for the connection.
524 string body; 522 string body(kWindow / 4, 'a');
525 GenerateBody(&body, kWindow / 4);
526 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 523 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body));
527 stream_->OnStreamFrame(frame1); 524 stream_->OnStreamFrame(frame1);
528 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, StringPiece(body)); 525 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, StringPiece(body));
529 stream2_->OnStreamFrame(frame2); 526 stream2_->OnStreamFrame(frame2);
530 527
531 // Now receive a further single byte on one stream - again this does not 528 // Now receive a further single byte on one stream - again this does not
532 // trigger a stream WINDOW_UPDATE, but now the connection flow control window 529 // trigger a stream WINDOW_UPDATE, but now the connection flow control window
533 // is over half full and thus a connection WINDOW_UPDATE is sent. 530 // is over half full and thus a connection WINDOW_UPDATE is sent.
534 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0); 531 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0);
535 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0); 532 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0);
(...skipping 15 matching lines...) Expand all
551 Initialize(!kShouldProcessData); 548 Initialize(!kShouldProcessData);
552 549
553 // Set a small flow control limit. 550 // Set a small flow control limit.
554 const uint64_t kWindow = 50; 551 const uint64_t kWindow = 50;
555 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 552 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
556 kWindow); 553 kWindow);
557 554
558 ProcessHeaders(false, headers_); 555 ProcessHeaders(false, headers_);
559 556
560 // Receive data to overflow the window, violating flow control. 557 // Receive data to overflow the window, violating flow control.
561 string body; 558 string body(kWindow + 1, 'a');
562 GenerateBody(&body, kWindow + 1);
563 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 559 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body));
564 EXPECT_CALL(*connection_, 560 EXPECT_CALL(*connection_,
565 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); 561 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
566 stream_->OnStreamFrame(frame); 562 stream_->OnStreamFrame(frame);
567 } 563 }
568 564
569 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) { 565 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) {
570 Initialize(kShouldProcessData); 566 Initialize(kShouldProcessData);
571 ProcessHeaders(false, headers_); 567 ProcessHeaders(false, headers_);
572 568
(...skipping 16 matching lines...) Expand all
589 const uint64_t kStreamWindow = 50; 585 const uint64_t kStreamWindow = 50;
590 const uint64_t kConnectionWindow = 10; 586 const uint64_t kConnectionWindow = 10;
591 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 587 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
592 kStreamWindow); 588 kStreamWindow);
593 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), 589 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(),
594 kConnectionWindow); 590 kConnectionWindow);
595 591
596 ProcessHeaders(false, headers_); 592 ProcessHeaders(false, headers_);
597 593
598 // Send enough data to overflow the connection level flow control window. 594 // Send enough data to overflow the connection level flow control window.
599 string body; 595 string body(kConnectionWindow + 1, 'a');
600 GenerateBody(&body, kConnectionWindow + 1);
601 EXPECT_LT(body.size(), kStreamWindow); 596 EXPECT_LT(body.size(), kStreamWindow);
602 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 597 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body));
603 598
604 EXPECT_CALL(*connection_, 599 EXPECT_CALL(*connection_,
605 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); 600 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
606 stream_->OnStreamFrame(frame); 601 stream_->OnStreamFrame(frame);
607 } 602 }
608 603
609 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) { 604 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) {
610 // An attempt to write a FIN with no data should not be flow control blocked, 605 // An attempt to write a FIN with no data should not be flow control blocked,
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 926
932 // Writing Trailers should fail, as the FIN has already been sent. 927 // Writing Trailers should fail, as the FIN has already been sent.
933 // populated with the number of body bytes written. 928 // populated with the number of body bytes written.
934 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), 929 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr),
935 "Trailers cannot be sent after a FIN"); 930 "Trailers cannot be sent after a FIN");
936 } 931 }
937 932
938 } // namespace 933 } // namespace
939 } // namespace test 934 } // namespace test
940 } // namespace net 935 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_spdy_stream.h ('k') | net/quic/core/quic_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698