| 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" |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "net/quic/crypto/crypto_protocol.h" | 12 #include "net/quic/crypto/crypto_protocol.h" |
| 13 #include "net/quic/quic_crypto_stream.h" | 13 #include "net/quic/quic_crypto_stream.h" |
| 14 #include "net/quic/quic_flags.h" | |
| 15 #include "net/quic/quic_protocol.h" | 14 #include "net/quic/quic_protocol.h" |
| 16 #include "net/quic/quic_utils.h" | 15 #include "net/quic/quic_utils.h" |
| 17 #include "net/quic/reliable_quic_stream.h" | 16 #include "net/quic/reliable_quic_stream.h" |
| 18 #include "net/quic/test_tools/quic_config_peer.h" | 17 #include "net/quic/test_tools/quic_config_peer.h" |
| 19 #include "net/quic/test_tools/quic_connection_peer.h" | 18 #include "net/quic/test_tools/quic_connection_peer.h" |
| 20 #include "net/quic/test_tools/quic_data_stream_peer.h" | 19 #include "net/quic/test_tools/quic_data_stream_peer.h" |
| 21 #include "net/quic/test_tools/quic_flow_controller_peer.h" | 20 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
| 22 #include "net/quic/test_tools/quic_session_peer.h" | 21 #include "net/quic/test_tools/quic_session_peer.h" |
| 23 #include "net/quic/test_tools/quic_test_utils.h" | 22 #include "net/quic/test_tools/quic_test_utils.h" |
| 24 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | 23 #include "net/quic/test_tools/reliable_quic_stream_peer.h" |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 EXPECT_CALL(*stream4, OnCanWrite()); | 523 EXPECT_CALL(*stream4, OnCanWrite()); |
| 525 session_.OnCanWrite(); | 524 session_.OnCanWrite(); |
| 526 EXPECT_FALSE(session_.WillingAndAbleToWrite()); | 525 EXPECT_FALSE(session_.WillingAndAbleToWrite()); |
| 527 } | 526 } |
| 528 | 527 |
| 529 TEST_P(QuicSessionTest, OnCanWriteLimitsNumWritesIfFlowControlBlocked) { | 528 TEST_P(QuicSessionTest, OnCanWriteLimitsNumWritesIfFlowControlBlocked) { |
| 530 if (version() < QUIC_VERSION_19) { | 529 if (version() < QUIC_VERSION_19) { |
| 531 return; | 530 return; |
| 532 } | 531 } |
| 533 | 532 |
| 534 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 535 true); | |
| 536 // Ensure connection level flow control blockage. | 533 // Ensure connection level flow control blockage. |
| 537 QuicFlowControllerPeer::SetSendWindowOffset(session_.flow_controller(), 0); | 534 QuicFlowControllerPeer::SetSendWindowOffset(session_.flow_controller(), 0); |
| 538 EXPECT_TRUE(session_.flow_controller()->IsBlocked()); | 535 EXPECT_TRUE(session_.flow_controller()->IsBlocked()); |
| 539 | 536 |
| 540 // Mark the crypto and headers streams as write blocked, we expect them to be | 537 // Mark the crypto and headers streams as write blocked, we expect them to be |
| 541 // allowed to write later. | 538 // allowed to write later. |
| 542 session_.MarkWriteBlocked(kCryptoStreamId, kHighestPriority); | 539 session_.MarkWriteBlocked(kCryptoStreamId, kHighestPriority); |
| 543 session_.MarkWriteBlocked(kHeadersStreamId, kHighestPriority); | 540 session_.MarkWriteBlocked(kHeadersStreamId, kHighestPriority); |
| 544 | 541 |
| 545 // Create a data stream, and although it is write blocked we never expect it | 542 // Create a data stream, and although it is write blocked we never expect it |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 EXPECT_CALL(*connection_, | 701 EXPECT_CALL(*connection_, |
| 705 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW)); | 702 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW)); |
| 706 session_.OnConfigNegotiated(); | 703 session_.OnConfigNegotiated(); |
| 707 } | 704 } |
| 708 | 705 |
| 709 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingRstOutOfOrder) { | 706 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingRstOutOfOrder) { |
| 710 if (version() < QUIC_VERSION_19) { | 707 if (version() < QUIC_VERSION_19) { |
| 711 return; | 708 return; |
| 712 } | 709 } |
| 713 | 710 |
| 714 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 715 true); | |
| 716 // Test that when we receive an out of order stream RST we correctly adjust | 711 // Test that when we receive an out of order stream RST we correctly adjust |
| 717 // our connection level flow control receive window. | 712 // our connection level flow control receive window. |
| 718 // On close, the stream should mark as consumed all bytes between the highest | 713 // On close, the stream should mark as consumed all bytes between the highest |
| 719 // byte consumed so far and the final byte offset from the RST frame. | 714 // byte consumed so far and the final byte offset from the RST frame. |
| 720 TestStream* stream = session_.CreateOutgoingDataStream(); | 715 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 721 | 716 |
| 722 const QuicStreamOffset kByteOffset = | 717 const QuicStreamOffset kByteOffset = |
| 723 1 + kInitialSessionFlowControlWindowForTest / 2; | 718 1 + kInitialSessionFlowControlWindowForTest / 2; |
| 724 | 719 |
| 725 // Expect no stream WINDOW_UPDATE frames, as stream read side closed. | 720 // Expect no stream WINDOW_UPDATE frames, as stream read side closed. |
| 726 EXPECT_CALL(*connection_, SendWindowUpdate(stream->id(), _)).Times(0); | 721 EXPECT_CALL(*connection_, SendWindowUpdate(stream->id(), _)).Times(0); |
| 727 // We do expect a connection level WINDOW_UPDATE when the stream is reset. | 722 // We do expect a connection level WINDOW_UPDATE when the stream is reset. |
| 728 EXPECT_CALL(*connection_, | 723 EXPECT_CALL(*connection_, |
| 729 SendWindowUpdate(0, kInitialSessionFlowControlWindowForTest + | 724 SendWindowUpdate(0, kInitialSessionFlowControlWindowForTest + |
| 730 kByteOffset)).Times(1); | 725 kByteOffset)).Times(1); |
| 731 | 726 |
| 732 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED, | 727 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED, |
| 733 kByteOffset); | 728 kByteOffset); |
| 734 session_.OnRstStream(rst_frame); | 729 session_.OnRstStream(rst_frame); |
| 735 session_.PostProcessAfterData(); | 730 session_.PostProcessAfterData(); |
| 736 EXPECT_EQ(kByteOffset, session_.flow_controller()->bytes_consumed()); | 731 EXPECT_EQ(kByteOffset, session_.flow_controller()->bytes_consumed()); |
| 737 } | 732 } |
| 738 | 733 |
| 739 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingFinAndLocalReset) { | 734 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingFinAndLocalReset) { |
| 740 if (version() < QUIC_VERSION_19) { | 735 if (version() < QUIC_VERSION_19) { |
| 741 return; | 736 return; |
| 742 } | 737 } |
| 743 | 738 |
| 744 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 745 true); | |
| 746 // Test the situation where we receive a FIN on a stream, and before we fully | 739 // Test the situation where we receive a FIN on a stream, and before we fully |
| 747 // consume all the data from the sequencer buffer we locally RST the stream. | 740 // consume all the data from the sequencer buffer we locally RST the stream. |
| 748 // The bytes between highest consumed byte, and the final byte offset that we | 741 // The bytes between highest consumed byte, and the final byte offset that we |
| 749 // determined when the FIN arrived, should be marked as consumed at the | 742 // determined when the FIN arrived, should be marked as consumed at the |
| 750 // connection level flow controller when the stream is reset. | 743 // connection level flow controller when the stream is reset. |
| 751 TestStream* stream = session_.CreateOutgoingDataStream(); | 744 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 752 | 745 |
| 753 const QuicStreamOffset kByteOffset = | 746 const QuicStreamOffset kByteOffset = |
| 754 1 + kInitialSessionFlowControlWindowForTest / 2; | 747 1 + kInitialSessionFlowControlWindowForTest / 2; |
| 755 QuicStreamFrame frame(stream->id(), true, kByteOffset, IOVector()); | 748 QuicStreamFrame frame(stream->id(), true, kByteOffset, IOVector()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 782 } | 775 } |
| 783 | 776 |
| 784 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingFinAfterRst) { | 777 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingFinAfterRst) { |
| 785 // Test that when we RST the stream (and tear down stream state), and then | 778 // Test that when we RST the stream (and tear down stream state), and then |
| 786 // receive a FIN from the peer, we correctly adjust our connection level flow | 779 // receive a FIN from the peer, we correctly adjust our connection level flow |
| 787 // control receive window. | 780 // control receive window. |
| 788 if (version() < QUIC_VERSION_19) { | 781 if (version() < QUIC_VERSION_19) { |
| 789 return; | 782 return; |
| 790 } | 783 } |
| 791 | 784 |
| 792 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 793 true); | |
| 794 // Connection starts with some non-zero highest received byte offset, | 785 // Connection starts with some non-zero highest received byte offset, |
| 795 // due to other active streams. | 786 // due to other active streams. |
| 796 const uint64 kInitialConnectionBytesConsumed = 567; | 787 const uint64 kInitialConnectionBytesConsumed = 567; |
| 797 const uint64 kInitialConnectionHighestReceivedOffset = 1234; | 788 const uint64 kInitialConnectionHighestReceivedOffset = 1234; |
| 798 EXPECT_LT(kInitialConnectionBytesConsumed, | 789 EXPECT_LT(kInitialConnectionBytesConsumed, |
| 799 kInitialConnectionHighestReceivedOffset); | 790 kInitialConnectionHighestReceivedOffset); |
| 800 session_.flow_controller()->UpdateHighestReceivedOffset( | 791 session_.flow_controller()->UpdateHighestReceivedOffset( |
| 801 kInitialConnectionHighestReceivedOffset); | 792 kInitialConnectionHighestReceivedOffset); |
| 802 session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed); | 793 session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed); |
| 803 | 794 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 826 } | 817 } |
| 827 | 818 |
| 828 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingRstAfterRst) { | 819 TEST_P(QuicSessionTest, ConnectionFlowControlAccountingRstAfterRst) { |
| 829 // Test that when we RST the stream (and tear down stream state), and then | 820 // Test that when we RST the stream (and tear down stream state), and then |
| 830 // receive a RST from the peer, we correctly adjust our connection level flow | 821 // receive a RST from the peer, we correctly adjust our connection level flow |
| 831 // control receive window. | 822 // control receive window. |
| 832 if (version() < QUIC_VERSION_19) { | 823 if (version() < QUIC_VERSION_19) { |
| 833 return; | 824 return; |
| 834 } | 825 } |
| 835 | 826 |
| 836 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 837 true); | |
| 838 // Connection starts with some non-zero highest received byte offset, | 827 // Connection starts with some non-zero highest received byte offset, |
| 839 // due to other active streams. | 828 // due to other active streams. |
| 840 const uint64 kInitialConnectionBytesConsumed = 567; | 829 const uint64 kInitialConnectionBytesConsumed = 567; |
| 841 const uint64 kInitialConnectionHighestReceivedOffset = 1234; | 830 const uint64 kInitialConnectionHighestReceivedOffset = 1234; |
| 842 EXPECT_LT(kInitialConnectionBytesConsumed, | 831 EXPECT_LT(kInitialConnectionBytesConsumed, |
| 843 kInitialConnectionHighestReceivedOffset); | 832 kInitialConnectionHighestReceivedOffset); |
| 844 session_.flow_controller()->UpdateHighestReceivedOffset( | 833 session_.flow_controller()->UpdateHighestReceivedOffset( |
| 845 kInitialConnectionHighestReceivedOffset); | 834 kInitialConnectionHighestReceivedOffset); |
| 846 session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed); | 835 session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed); |
| 847 | 836 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 862 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset, | 851 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset, |
| 863 session_.flow_controller()->highest_received_byte_offset()); | 852 session_.flow_controller()->highest_received_byte_offset()); |
| 864 } | 853 } |
| 865 | 854 |
| 866 TEST_P(QuicSessionTest, FlowControlWithInvalidFinalOffset) { | 855 TEST_P(QuicSessionTest, FlowControlWithInvalidFinalOffset) { |
| 867 // Test that if we receive a stream RST with a highest byte offset that | 856 // Test that if we receive a stream RST with a highest byte offset that |
| 868 // violates flow control, that we close the connection. | 857 // violates flow control, that we close the connection. |
| 869 if (version() <= QUIC_VERSION_16) { | 858 if (version() <= QUIC_VERSION_16) { |
| 870 return; | 859 return; |
| 871 } | 860 } |
| 872 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 873 true); | |
| 874 | 861 |
| 875 const uint64 kLargeOffset = kInitialSessionFlowControlWindowForTest + 1; | 862 const uint64 kLargeOffset = kInitialSessionFlowControlWindowForTest + 1; |
| 876 EXPECT_CALL(*connection_, | 863 EXPECT_CALL(*connection_, |
| 877 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)) | 864 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA)) |
| 878 .Times(2); | 865 .Times(2); |
| 879 | 866 |
| 880 // Check that stream frame + FIN results in connection close. | 867 // Check that stream frame + FIN results in connection close. |
| 881 TestStream* stream = session_.CreateOutgoingDataStream(); | 868 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 882 stream->Reset(QUIC_STREAM_CANCELLED); | 869 stream->Reset(QUIC_STREAM_CANCELLED); |
| 883 QuicStreamFrame frame(stream->id(), true, kLargeOffset, IOVector()); | 870 QuicStreamFrame frame(stream->id(), true, kLargeOffset, IOVector()); |
| 884 vector<QuicStreamFrame> frames; | 871 vector<QuicStreamFrame> frames; |
| 885 frames.push_back(frame); | 872 frames.push_back(frame); |
| 886 session_.OnStreamFrames(frames); | 873 session_.OnStreamFrames(frames); |
| 887 | 874 |
| 888 // Check that RST results in connection close. | 875 // Check that RST results in connection close. |
| 889 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED, | 876 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED, |
| 890 kLargeOffset); | 877 kLargeOffset); |
| 891 session_.OnRstStream(rst_frame); | 878 session_.OnRstStream(rst_frame); |
| 892 } | 879 } |
| 893 | 880 |
| 894 TEST_P(QuicSessionTest, VersionNegotiationDisablesFlowControl) { | 881 TEST_P(QuicSessionTest, VersionNegotiationDisablesFlowControl) { |
| 895 if (version() < QUIC_VERSION_19) { | 882 if (version() < QUIC_VERSION_19) { |
| 896 return; | 883 return; |
| 897 } | 884 } |
| 898 | 885 |
| 899 ValueRestore<bool> old_flag(&FLAGS_enable_quic_connection_flow_control_2, | |
| 900 true); | |
| 901 // Test that after successful version negotiation, flow control is disabled | 886 // Test that after successful version negotiation, flow control is disabled |
| 902 // appropriately at both the connection and stream level. | 887 // appropriately at both the connection and stream level. |
| 903 | 888 |
| 904 // Initially both stream and connection flow control are enabled. | 889 // Initially both stream and connection flow control are enabled. |
| 905 TestStream* stream = session_.CreateOutgoingDataStream(); | 890 TestStream* stream = session_.CreateOutgoingDataStream(); |
| 906 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); | 891 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); |
| 907 EXPECT_TRUE(session_.flow_controller()->IsEnabled()); | 892 EXPECT_TRUE(session_.flow_controller()->IsEnabled()); |
| 908 | 893 |
| 909 // Version 18 implies that stream flow control is enabled, but connection | 894 // Version 18 implies that stream flow control is enabled, but connection |
| 910 // level is disabled. | 895 // level is disabled. |
| 911 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_18); | 896 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_18); |
| 912 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); | 897 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); |
| 913 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); | 898 EXPECT_TRUE(stream->flow_controller()->IsEnabled()); |
| 914 | 899 |
| 915 // Version 16 means all flow control is disabled. | 900 // Version 16 means all flow control is disabled. |
| 916 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_16); | 901 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_16); |
| 917 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); | 902 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); |
| 918 EXPECT_FALSE(stream->flow_controller()->IsEnabled()); | 903 EXPECT_FALSE(stream->flow_controller()->IsEnabled()); |
| 919 } | 904 } |
| 920 | 905 |
| 921 } // namespace | 906 } // namespace |
| 922 } // namespace test | 907 } // namespace test |
| 923 } // namespace net | 908 } // namespace net |
| OLD | NEW |