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 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 SpdyHeaderBlock headers; | 732 SpdyHeaderBlock headers; |
733 while (!headers_stream->flow_controller()->IsBlocked() && stream_id < 2000) { | 733 while (!headers_stream->flow_controller()->IsBlocked() && stream_id < 2000) { |
734 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); | 734 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); |
735 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); | 735 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); |
736 headers["header"] = base::Uint64ToString(base::RandUint64()) + | 736 headers["header"] = base::Uint64ToString(base::RandUint64()) + |
737 base::Uint64ToString(base::RandUint64()) + | 737 base::Uint64ToString(base::RandUint64()) + |
738 base::Uint64ToString(base::RandUint64()); | 738 base::Uint64ToString(base::RandUint64()); |
739 headers_stream->WriteHeaders(stream_id, headers, true, nullptr); | 739 headers_stream->WriteHeaders(stream_id, headers, true, nullptr); |
740 stream_id += 2; | 740 stream_id += 2; |
741 } | 741 } |
742 // Write one more to ensure that the headers stream has buffered data. The | 742 // Write once more to ensure that the headers stream has buffered data. The |
743 // random headers may have exactly filled the flow control window. | 743 // random headers may have exactly filled the flow control window. |
744 headers_stream->WriteHeaders(stream_id, headers, true, nullptr); | 744 headers_stream->WriteHeaders(stream_id, headers, true, nullptr); |
745 EXPECT_TRUE(headers_stream->HasBufferedData()); | 745 EXPECT_TRUE(headers_stream->HasBufferedData()); |
746 | 746 |
747 EXPECT_TRUE(headers_stream->flow_controller()->IsBlocked()); | 747 EXPECT_TRUE(headers_stream->flow_controller()->IsBlocked()); |
748 EXPECT_FALSE(crypto_stream->flow_controller()->IsBlocked()); | 748 EXPECT_FALSE(crypto_stream->flow_controller()->IsBlocked()); |
749 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); | 749 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); |
750 EXPECT_TRUE(session_.IsStreamFlowControlBlocked()); | 750 EXPECT_TRUE(session_.IsStreamFlowControlBlocked()); |
751 EXPECT_FALSE(session_.HasDataToWrite()); | 751 EXPECT_FALSE(session_.HasDataToWrite()); |
752 | 752 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 frames.push_back(window_update_frame); | 991 frames.push_back(window_update_frame); |
992 session_.OnWindowUpdateFrames(frames); | 992 session_.OnWindowUpdateFrames(frames); |
993 EXPECT_FALSE(headers_stream->flow_controller()->IsBlocked()); | 993 EXPECT_FALSE(headers_stream->flow_controller()->IsBlocked()); |
994 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); | 994 EXPECT_FALSE(session_.IsConnectionFlowControlBlocked()); |
995 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); | 995 EXPECT_FALSE(session_.IsStreamFlowControlBlocked()); |
996 } | 996 } |
997 | 997 |
998 TEST_P(QuicSessionTest, TooManyUnfinishedStreamsCauseConnectionClose) { | 998 TEST_P(QuicSessionTest, TooManyUnfinishedStreamsCauseConnectionClose) { |
999 // If a buggy/malicious peer creates too many streams that are not ended with | 999 // If a buggy/malicious peer creates too many streams that are not ended with |
1000 // a FIN or RST then we send a connection close. | 1000 // a FIN or RST then we send a connection close. |
1001 ValueRestore<bool> old_flag(&FLAGS_close_quic_connection_unfinished_streams_2, | |
1002 true); | |
1003 | |
1004 EXPECT_CALL(*connection_, | 1001 EXPECT_CALL(*connection_, |
1005 SendConnectionClose(QUIC_TOO_MANY_UNFINISHED_STREAMS)).Times(1); | 1002 SendConnectionClose(QUIC_TOO_MANY_UNFINISHED_STREAMS)).Times(1); |
1006 | 1003 |
1007 const int kMaxStreams = 5; | 1004 const int kMaxStreams = 5; |
1008 QuicSessionPeer::SetMaxOpenStreams(&session_, kMaxStreams); | 1005 QuicSessionPeer::SetMaxOpenStreams(&session_, kMaxStreams); |
1009 | 1006 |
1010 // Create kMaxStreams + 1 data streams, and close them all without receiving a | 1007 // Create kMaxStreams + 1 data streams, and close them all without receiving a |
1011 // FIN or a RST from the client. | 1008 // FIN or a RST from the client. |
1012 const int kFirstStreamId = kClientDataStreamId1; | 1009 const int kFirstStreamId = kClientDataStreamId1; |
1013 const int kFinalStreamId = kClientDataStreamId1 + 2 * kMaxStreams + 1; | 1010 const int kFinalStreamId = kClientDataStreamId1 + 2 * kMaxStreams + 1; |
1014 for (int i = kFirstStreamId; i < kFinalStreamId; i += 2) { | 1011 for (int i = kFirstStreamId; i < kFinalStreamId; i += 2) { |
1015 QuicStreamFrame data1(i, false, 0, MakeIOVector("HT")); | 1012 QuicStreamFrame data1(i, false, 0, MakeIOVector("HT")); |
1016 vector<QuicStreamFrame> frames; | 1013 vector<QuicStreamFrame> frames; |
1017 frames.push_back(data1); | 1014 frames.push_back(data1); |
1018 session_.OnStreamFrames(frames); | 1015 session_.OnStreamFrames(frames); |
1019 EXPECT_EQ(1u, session_.GetNumOpenStreams()); | 1016 EXPECT_EQ(1u, session_.GetNumOpenStreams()); |
1020 session_.CloseStream(i); | 1017 session_.CloseStream(i); |
1021 } | 1018 } |
1022 | 1019 |
1023 // Called after any new data is received by the session, and triggers the call | 1020 // Called after any new data is received by the session, and triggers the call |
1024 // to close the connection. | 1021 // to close the connection. |
1025 session_.PostProcessAfterData(); | 1022 session_.PostProcessAfterData(); |
1026 } | 1023 } |
1027 | 1024 |
1028 } // namespace | 1025 } // namespace |
1029 } // namespace test | 1026 } // namespace test |
1030 } // namespace net | 1027 } // namespace net |
OLD | NEW |