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/tools/quic/quic_server_session.h" | 5 #include "net/tools/quic/quic_server_session.h" |
6 | 6 |
7 #include "net/quic/crypto/quic_crypto_server_config.h" | 7 #include "net/quic/crypto/quic_crypto_server_config.h" |
8 #include "net/quic/crypto/quic_random.h" | 8 #include "net/quic/crypto/quic_random.h" |
9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 using net::test::SupportedVersions; | 24 using net::test::SupportedVersions; |
25 using testing::StrictMock; | 25 using testing::StrictMock; |
26 using testing::_; | 26 using testing::_; |
27 | 27 |
28 namespace net { | 28 namespace net { |
29 namespace tools { | 29 namespace tools { |
30 namespace test { | 30 namespace test { |
31 | 31 |
32 class QuicServerSessionPeer { | 32 class QuicServerSessionPeer { |
33 public: | 33 public: |
34 static QuicDataStream* GetIncomingDataStream( | 34 static QuicDataStream* GetIncomingDataStream(QuicServerSession* s, |
35 QuicServerSession* s, QuicStreamId id) { | 35 QuicStreamId id) { |
36 return s->GetIncomingDataStream(id); | 36 return s->GetIncomingDataStream(id); |
37 } | 37 } |
38 static QuicDataStream* GetDataStream(QuicServerSession* s, QuicStreamId id) { | 38 static QuicDataStream* GetDataStream(QuicServerSession* s, QuicStreamId id) { |
39 return s->GetDataStream(id); | 39 return s->GetDataStream(id); |
40 } | 40 } |
41 }; | 41 }; |
42 | 42 |
43 namespace { | 43 namespace { |
44 | 44 |
45 class QuicServerSessionTest : public ::testing::TestWithParam<QuicVersion> { | 45 class QuicServerSessionTest : public ::testing::TestWithParam<QuicVersion> { |
46 protected: | 46 protected: |
47 QuicServerSessionTest() | 47 QuicServerSessionTest() |
48 : crypto_config_(QuicCryptoServerConfig::TESTING, | 48 : crypto_config_(QuicCryptoServerConfig::TESTING, |
49 QuicRandom::GetInstance()) { | 49 QuicRandom::GetInstance()) { |
50 config_.SetDefaults(); | 50 config_.SetDefaults(); |
51 config_.set_max_streams_per_connection(3, 3); | 51 config_.set_max_streams_per_connection(3, 3); |
52 | 52 |
53 connection_ = | 53 connection_ = |
54 new StrictMock<MockConnection>(true, SupportedVersions(GetParam())); | 54 new StrictMock<MockConnection>(true, SupportedVersions(GetParam())); |
55 session_.reset(new QuicServerSession( | 55 session_.reset(new QuicServerSession(config_, connection_, &owner_)); |
56 config_, connection_, &owner_)); | |
57 session_->InitializeSession(crypto_config_); | 56 session_->InitializeSession(crypto_config_); |
58 visitor_ = QuicConnectionPeer::GetVisitor(connection_); | 57 visitor_ = QuicConnectionPeer::GetVisitor(connection_); |
59 } | 58 } |
60 | 59 |
61 QuicVersion version() const { return connection_->version(); } | 60 QuicVersion version() const { return connection_->version(); } |
62 | 61 |
63 StrictMock<MockQuicServerSessionVisitor> owner_; | 62 StrictMock<MockQuicServerSessionVisitor> owner_; |
64 StrictMock<MockConnection>* connection_; | 63 StrictMock<MockConnection>* connection_; |
65 QuicConfig config_; | 64 QuicConfig config_; |
66 QuicCryptoServerConfig crypto_config_; | 65 QuicCryptoServerConfig crypto_config_; |
67 scoped_ptr<QuicServerSession> session_; | 66 scoped_ptr<QuicServerSession> session_; |
68 QuicConnectionVisitorInterface* visitor_; | 67 QuicConnectionVisitorInterface* visitor_; |
69 }; | 68 }; |
70 | 69 |
71 INSTANTIATE_TEST_CASE_P(Tests, QuicServerSessionTest, | 70 INSTANTIATE_TEST_CASE_P(Tests, |
| 71 QuicServerSessionTest, |
72 ::testing::ValuesIn(QuicSupportedVersions())); | 72 ::testing::ValuesIn(QuicSupportedVersions())); |
73 | 73 |
74 TEST_P(QuicServerSessionTest, CloseStreamDueToReset) { | 74 TEST_P(QuicServerSessionTest, CloseStreamDueToReset) { |
75 QuicStreamId stream_id = 5; | 75 QuicStreamId stream_id = 5; |
76 // Open a stream, then reset it. | 76 // Open a stream, then reset it. |
77 // Send two bytes of payload to open it. | 77 // Send two bytes of payload to open it. |
78 QuicStreamFrame data1(stream_id, false, 0, MakeIOVector("HT")); | 78 QuicStreamFrame data1(stream_id, false, 0, MakeIOVector("HT")); |
79 vector<QuicStreamFrame> frames; | 79 vector<QuicStreamFrame> frames; |
80 frames.push_back(data1); | 80 frames.push_back(data1); |
81 session_->OnStreamFrames(frames); | 81 session_->OnStreamFrames(frames); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 | 114 |
115 // The stream should never be opened, now that the reset is received. | 115 // The stream should never be opened, now that the reset is received. |
116 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 116 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
117 EXPECT_TRUE(connection_->connected()); | 117 EXPECT_TRUE(connection_->connected()); |
118 } | 118 } |
119 | 119 |
120 TEST_P(QuicServerSessionTest, AcceptClosedStream) { | 120 TEST_P(QuicServerSessionTest, AcceptClosedStream) { |
121 QuicStreamId stream_id = 5; | 121 QuicStreamId stream_id = 5; |
122 vector<QuicStreamFrame> frames; | 122 vector<QuicStreamFrame> frames; |
123 // Send (empty) compressed headers followed by two bytes of data. | 123 // Send (empty) compressed headers followed by two bytes of data. |
124 frames.push_back(QuicStreamFrame(stream_id, false, 0, | 124 frames.push_back( |
125 MakeIOVector("\1\0\0\0\0\0\0\0HT"))); | 125 QuicStreamFrame(stream_id, false, 0, MakeIOVector("\1\0\0\0\0\0\0\0HT"))); |
126 frames.push_back(QuicStreamFrame(stream_id + 2, false, 0, | 126 frames.push_back(QuicStreamFrame( |
127 MakeIOVector("\2\0\0\0\0\0\0\0HT"))); | 127 stream_id + 2, false, 0, MakeIOVector("\2\0\0\0\0\0\0\0HT"))); |
128 visitor_->OnStreamFrames(frames); | 128 visitor_->OnStreamFrames(frames); |
129 EXPECT_EQ(2u, session_->GetNumOpenStreams()); | 129 EXPECT_EQ(2u, session_->GetNumOpenStreams()); |
130 | 130 |
131 // Send a reset (and expect the peer to send a RST in response). | 131 // Send a reset (and expect the peer to send a RST in response). |
132 QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR, 0); | 132 QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR, 0); |
133 EXPECT_CALL(*connection_, | 133 EXPECT_CALL(*connection_, |
134 SendRstStream(stream_id, QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0)); | 134 SendRstStream(stream_id, QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0)); |
135 visitor_->OnRstStream(rst); | 135 visitor_->OnRstStream(rst); |
136 | 136 |
137 // If we were tracking, we'd probably want to reject this because it's data | 137 // If we were tracking, we'd probably want to reject this because it's data |
138 // past the reset point of stream 3. As it's a closed stream we just drop the | 138 // past the reset point of stream 3. As it's a closed stream we just drop the |
139 // data on the floor, but accept the packet because it has data for stream 5. | 139 // data on the floor, but accept the packet because it has data for stream 5. |
140 frames.clear(); | 140 frames.clear(); |
141 frames.push_back(QuicStreamFrame(stream_id, false, 2, MakeIOVector("TP"))); | 141 frames.push_back(QuicStreamFrame(stream_id, false, 2, MakeIOVector("TP"))); |
142 frames.push_back(QuicStreamFrame(stream_id + 2, false, 2, | 142 frames.push_back( |
143 MakeIOVector("TP"))); | 143 QuicStreamFrame(stream_id + 2, false, 2, MakeIOVector("TP"))); |
144 visitor_->OnStreamFrames(frames); | 144 visitor_->OnStreamFrames(frames); |
145 // The stream should never be opened, now that the reset is received. | 145 // The stream should never be opened, now that the reset is received. |
146 EXPECT_EQ(1u, session_->GetNumOpenStreams()); | 146 EXPECT_EQ(1u, session_->GetNumOpenStreams()); |
147 EXPECT_TRUE(connection_->connected()); | 147 EXPECT_TRUE(connection_->connected()); |
148 } | 148 } |
149 | 149 |
150 TEST_P(QuicServerSessionTest, MaxNumConnections) { | 150 TEST_P(QuicServerSessionTest, MaxNumConnections) { |
151 QuicStreamId stream_id = 5; | 151 QuicStreamId stream_id = 5; |
152 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 152 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
153 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 153 EXPECT_TRUE( |
154 stream_id)); | 154 QuicServerSessionPeer::GetIncomingDataStream(session_.get(), stream_id)); |
155 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 155 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), |
156 stream_id + 2)); | 156 stream_id + 2)); |
157 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 157 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), |
158 stream_id + 4)); | 158 stream_id + 4)); |
159 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); | 159 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
160 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 160 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), |
161 stream_id + 6)); | 161 stream_id + 6)); |
162 } | 162 } |
163 | 163 |
164 TEST_P(QuicServerSessionTest, MaxNumConnectionsImplicit) { | 164 TEST_P(QuicServerSessionTest, MaxNumConnectionsImplicit) { |
165 QuicStreamId stream_id = 5; | 165 QuicStreamId stream_id = 5; |
166 EXPECT_EQ(0u, session_->GetNumOpenStreams()); | 166 EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
167 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 167 EXPECT_TRUE( |
168 stream_id)); | 168 QuicServerSessionPeer::GetIncomingDataStream(session_.get(), stream_id)); |
169 // Implicitly opens two more streams. | 169 // Implicitly opens two more streams. |
170 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); | 170 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
171 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), | 171 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), |
172 stream_id + 6)); | 172 stream_id + 6)); |
173 } | 173 } |
174 | 174 |
175 TEST_P(QuicServerSessionTest, GetEvenIncomingError) { | 175 TEST_P(QuicServerSessionTest, GetEvenIncomingError) { |
176 // Incoming streams on the server session must be odd. | 176 // Incoming streams on the server session must be odd. |
177 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); | 177 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); |
178 EXPECT_EQ(NULL, | 178 EXPECT_EQ(NULL, |
179 QuicServerSessionPeer::GetIncomingDataStream(session_.get(), 4)); | 179 QuicServerSessionPeer::GetIncomingDataStream(session_.get(), 4)); |
180 } | 180 } |
181 | 181 |
182 } // namespace | 182 } // namespace |
183 } // namespace test | 183 } // namespace test |
184 } // namespace tools | 184 } // namespace tools |
185 } // namespace net | 185 } // namespace net |
OLD | NEW |