| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_session.h" | 5 #include "net/quic/quic_session.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 | 625 |
| 626 // Processing of second invalid stream reset should not result in the | 626 // Processing of second invalid stream reset should not result in the |
| 627 // connection being closed for a second time. | 627 // connection being closed for a second time. |
| 628 QuicRstStreamFrame rst2(kLargeInvalidStreamId, QUIC_STREAM_NO_ERROR, 0); | 628 QuicRstStreamFrame rst2(kLargeInvalidStreamId, QUIC_STREAM_NO_ERROR, 0); |
| 629 session_.OnRstStream(rst2); | 629 session_.OnRstStream(rst2); |
| 630 } | 630 } |
| 631 | 631 |
| 632 TEST_P(QuicSessionTest, HandshakeUnblocksFlowControlBlockedStream) { | 632 TEST_P(QuicSessionTest, HandshakeUnblocksFlowControlBlockedStream) { |
| 633 // Test that if a stream is flow control blocked, then on receipt of the SHLO | 633 // Test that if a stream is flow control blocked, then on receipt of the SHLO |
| 634 // containing a suitable send window offset, the stream becomes unblocked. | 634 // containing a suitable send window offset, the stream becomes unblocked. |
| 635 if (version() <= QUIC_VERSION_16) { | |
| 636 return; | |
| 637 } | |
| 638 | 635 |
| 639 // Ensure that Writev consumes all the data it is given (simulate no socket | 636 // Ensure that Writev consumes all the data it is given (simulate no socket |
| 640 // blocking). | 637 // blocking). |
| 641 session_.set_writev_consumes_all_data(true); | 638 session_.set_writev_consumes_all_data(true); |
| 642 | 639 |
| 643 // Create a stream, and send enough data to make it flow control blocked. | 640 // Create a stream, and send enough data to make it flow control blocked. |
| 644 TestStream* stream2 = session_.CreateOutgoingDataStream(); | 641 TestStream* stream2 = session_.CreateOutgoingDataStream(); |
| 645 string body(kDefaultFlowControlSendWindow, '.'); | 642 string body(kDefaultFlowControlSendWindow, '.'); |
| 646 EXPECT_FALSE(stream2->flow_controller()->IsBlocked()); | 643 EXPECT_FALSE(stream2->flow_controller()->IsBlocked()); |
| 647 stream2->SendBody(body, false); | 644 stream2->SendBody(body, false); |
| 648 EXPECT_TRUE(stream2->flow_controller()->IsBlocked()); | 645 EXPECT_TRUE(stream2->flow_controller()->IsBlocked()); |
| 649 | 646 |
| 650 // Now complete the crypto handshake, resulting in an increased flow control | 647 // Now complete the crypto handshake, resulting in an increased flow control |
| 651 // send window. | 648 // send window. |
| 652 CryptoHandshakeMessage msg; | 649 CryptoHandshakeMessage msg; |
| 653 session_.GetCryptoStream()->OnHandshakeMessage(msg); | 650 session_.GetCryptoStream()->OnHandshakeMessage(msg); |
| 654 | 651 |
| 655 // Stream is now unblocked. | 652 // Stream is now unblocked. |
| 656 EXPECT_FALSE(stream2->flow_controller()->IsBlocked()); | 653 EXPECT_FALSE(stream2->flow_controller()->IsBlocked()); |
| 657 } | 654 } |
| 658 | 655 |
| 659 TEST_P(QuicSessionTest, InvalidFlowControlWindowInHandshake) { | 656 TEST_P(QuicSessionTest, InvalidFlowControlWindowInHandshake) { |
| 660 // TODO(rjshade): Remove this test when removing QUIC_VERSION_19. | 657 // TODO(rjshade): Remove this test when removing QUIC_VERSION_19. |
| 661 // Test that receipt of an invalid (< default) flow control window from | 658 // Test that receipt of an invalid (< default) flow control window from |
| 662 // the peer results in the connection being torn down. | 659 // the peer results in the connection being torn down. |
| 663 if (version() <= QUIC_VERSION_16 || version() > QUIC_VERSION_19) { | 660 if (version() > QUIC_VERSION_19) { |
| 664 return; | 661 return; |
| 665 } | 662 } |
| 666 | 663 |
| 667 uint32 kInvalidWindow = kDefaultFlowControlSendWindow - 1; | 664 uint32 kInvalidWindow = kDefaultFlowControlSendWindow - 1; |
| 668 QuicConfigPeer::SetReceivedInitialFlowControlWindow(session_.config(), | 665 QuicConfigPeer::SetReceivedInitialFlowControlWindow(session_.config(), |
| 669 kInvalidWindow); | 666 kInvalidWindow); |
| 670 | 667 |
| 671 EXPECT_CALL(*connection_, | 668 EXPECT_CALL(*connection_, |
| 672 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW)).Times(2); | 669 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW)).Times(2); |
| 673 session_.OnConfigNegotiated(); | 670 session_.OnConfigNegotiated(); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 | 847 |
| 851 EXPECT_EQ(kInitialConnectionBytesConsumed + kByteOffset, | 848 EXPECT_EQ(kInitialConnectionBytesConsumed + kByteOffset, |
| 852 session_.flow_controller()->bytes_consumed()); | 849 session_.flow_controller()->bytes_consumed()); |
| 853 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset, | 850 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset, |
| 854 session_.flow_controller()->highest_received_byte_offset()); | 851 session_.flow_controller()->highest_received_byte_offset()); |
| 855 } | 852 } |
| 856 | 853 |
| 857 TEST_P(QuicSessionTest, FlowControlWithInvalidFinalOffset) { | 854 TEST_P(QuicSessionTest, FlowControlWithInvalidFinalOffset) { |
| 858 // Test that if we receive a stream RST with a highest byte offset that | 855 // Test that if we receive a stream RST with a highest byte offset that |
| 859 // violates flow control, that we close the connection. | 856 // violates flow control, that we close the connection. |
| 860 if (version() <= QUIC_VERSION_16) { | |
| 861 return; | |
| 862 } | |
| 863 | |
| 864 const uint64 kLargeOffset = kInitialSessionFlowControlWindowForTest + 1; | 857 const uint64 kLargeOffset = kInitialSessionFlowControlWindowForTest + 1; |
| 865 EXPECT_CALL(*connection_, | 858 EXPECT_CALL(*connection_, |
| 866 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)) | 859 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)) |
| 867 .Times(2); | 860 .Times(2); |
| 868 | 861 |
| 869 // Check that stream frame + FIN results in connection close. | 862 // Check that stream frame + FIN results in connection close. |
| 870 TestStream* stream = session_.CreateOutgoingDataStream(); | 863 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 871 stream->Reset(QUIC_STREAM_CANCELLED); | 864 stream->Reset(QUIC_STREAM_CANCELLED); |
| 872 QuicStreamFrame frame(stream->id(), true, kLargeOffset, IOVector()); | 865 QuicStreamFrame frame(stream->id(), true, kLargeOffset, IOVector()); |
| 873 vector<QuicStreamFrame> frames; | 866 vector<QuicStreamFrame> frames; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 891 // Initially both stream and connection flow control are enabled. | 884 // Initially both stream and connection flow control are enabled. |
| 892 TestStream* stream = session_.CreateOutgoingDataStream(); | 885 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 893 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); | 886 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); |
| 894 EXPECT_TRUE(session_.flow_controller()->IsEnabled()); | 887 EXPECT_TRUE(session_.flow_controller()->IsEnabled()); |
| 895 | 888 |
| 896 // Version 18 implies that stream flow control is enabled, but connection | 889 // Version 18 implies that stream flow control is enabled, but connection |
| 897 // level is disabled. | 890 // level is disabled. |
| 898 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_18); | 891 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_18); |
| 899 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); | 892 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); |
| 900 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); | 893 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); |
| 901 | |
| 902 // Version 16 means all flow control is disabled. | |
| 903 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_16); | |
| 904 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); | |
| 905 EXPECT_FALSE(stream->flow_controller()->IsEnabled()); | |
| 906 } | 894 } |
| 907 | 895 |
| 908 TEST_P(QuicSessionTest, WindowUpdateUnblocksHeadersStream) { | 896 TEST_P(QuicSessionTest, WindowUpdateUnblocksHeadersStream) { |
| 909 // Test that a flow control blocked headers stream gets unblocked on recipt of | 897 // Test that a flow control blocked headers stream gets unblocked on recipt of |
| 910 // a WINDOW_UPDATE frame. Regression test for b/17413860. | 898 // a WINDOW_UPDATE frame. Regression test for b/17413860. |
| 911 if (version() < QUIC_VERSION_21) { | 899 if (version() < QUIC_VERSION_21) { |
| 912 return; | 900 return; |
| 913 } | 901 } |
| 914 | 902 |
| 915 // Set the headers stream to be flow control blocked. | 903 // Set the headers stream to be flow control blocked. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 } | 945 } |
| 958 | 946 |
| 959 // Called after any new data is received by the session, and triggers the call | 947 // Called after any new data is received by the session, and triggers the call |
| 960 // to close the connection. | 948 // to close the connection. |
| 961 session_.PostProcessAfterData(); | 949 session_.PostProcessAfterData(); |
| 962 } | 950 } |
| 963 | 951 |
| 964 } // namespace | 952 } // namespace |
| 965 } // namespace test | 953 } // namespace test |
| 966 } // namespace net | 954 } // namespace net |
| OLD | NEW |