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

Side by Side Diff: net/tools/quic/quic_server_session_test.cc

Issue 1422533006: Merge GetIncomingDynamicStream and GetDynamicStream into a single GetOrCreateDynamicStream method i… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@106419223
Patch Set: Created 5 years, 1 month 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/tools/quic/end_to_end_test.cc ('k') | no next file » | 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/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/proto/cached_network_parameters.pb.h" 9 #include "net/quic/proto/cached_network_parameters.pb.h"
10 #include "net/quic/quic_connection.h" 10 #include "net/quic/quic_connection.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 using std::string; 47 using std::string;
48 using testing::StrictMock; 48 using testing::StrictMock;
49 using testing::_; 49 using testing::_;
50 50
51 namespace net { 51 namespace net {
52 namespace tools { 52 namespace tools {
53 namespace test { 53 namespace test {
54 54
55 class QuicServerSessionPeer { 55 class QuicServerSessionPeer {
56 public: 56 public:
57 static ReliableQuicStream* GetIncomingDynamicStream(QuicServerSession* s, 57 static ReliableQuicStream* GetOrCreateDynamicStream(QuicServerSession* s,
58 QuicStreamId id) { 58 QuicStreamId id) {
59 return s->GetIncomingDynamicStream(id); 59 return s->GetOrCreateDynamicStream(id);
60 } 60 }
61 static void SetCryptoStream(QuicServerSession* s, 61 static void SetCryptoStream(QuicServerSession* s,
62 QuicCryptoServerStream* crypto_stream) { 62 QuicCryptoServerStream* crypto_stream) {
63 s->crypto_stream_.reset(crypto_stream); 63 s->crypto_stream_.reset(crypto_stream);
64 s->static_streams()[kCryptoStreamId] = crypto_stream; 64 s->static_streams()[kCryptoStreamId] = crypto_stream;
65 } 65 }
66 static bool IsBandwidthResumptionEnabled(QuicServerSession* s) { 66 static bool IsBandwidthResumptionEnabled(QuicServerSession* s) {
67 return s->bandwidth_resumption_enabled_; 67 return s->bandwidth_resumption_enabled_;
68 } 68 }
69 }; 69 };
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); 206 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams());
207 session_->OnConfigNegotiated(); 207 session_->OnConfigNegotiated();
208 EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest, 208 EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest,
209 kMaxStreamsForTest + kMaxStreamsMinimumIncrement); 209 kMaxStreamsForTest + kMaxStreamsMinimumIncrement);
210 EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement, 210 EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement,
211 session_->get_max_open_streams()); 211 session_->get_max_open_streams());
212 EXPECT_EQ(0u, session_->GetNumOpenStreams()); 212 EXPECT_EQ(0u, session_->GetNumOpenStreams());
213 QuicStreamId stream_id = kClientDataStreamId1; 213 QuicStreamId stream_id = kClientDataStreamId1;
214 // Open the max configured number of streams, should be no problem. 214 // Open the max configured number of streams, should be no problem.
215 for (size_t i = 0; i < kMaxStreamsForTest; ++i) { 215 for (size_t i = 0; i < kMaxStreamsForTest; ++i) {
216 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 216 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(),
217 stream_id)); 217 stream_id));
218 stream_id += 2; 218 stream_id += 2;
219 } 219 }
220 220
221 // Open more streams: server should accept slightly more than the limit. 221 // Open more streams: server should accept slightly more than the limit.
222 for (size_t i = 0; i < kMaxStreamsMinimumIncrement; ++i) { 222 for (size_t i = 0; i < kMaxStreamsMinimumIncrement; ++i) {
223 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 223 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(),
224 stream_id)); 224 stream_id));
225 stream_id += 2; 225 stream_id += 2;
226 } 226 }
227 227
228 // Now violate the server's internal stream limit. 228 // Now violate the server's internal stream limit.
229 stream_id += 2; 229 stream_id += 2;
230 if (connection_->version() <= QUIC_VERSION_27) { 230 if (connection_->version() <= QUIC_VERSION_27) {
231 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); 231 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS));
232 EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(0); 232 EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(0);
233 } else { 233 } else {
234 EXPECT_CALL(*connection_, SendConnectionClose(_)).Times(0); 234 EXPECT_CALL(*connection_, SendConnectionClose(_)).Times(0);
235 EXPECT_CALL(*connection_, SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0)); 235 EXPECT_CALL(*connection_, SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0));
236 } 236 }
237 // Even if the connection remains open, the stream creation should fail. 237 // Even if the connection remains open, the stream creation should fail.
238 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 238 EXPECT_FALSE(QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(),
239 stream_id)); 239 stream_id));
240 } 240 }
241 241
242 TEST_P(QuicServerSessionTest, MaxAvailableStreams) { 242 TEST_P(QuicServerSessionTest, MaxAvailableStreams) {
243 // Test that the server closes the connection if a client makes too many data 243 // Test that the server closes the connection if a client makes too many data
244 // streams available. The server accepts slightly more than the negotiated 244 // streams available. The server accepts slightly more than the negotiated
245 // stream limit to deal with rare cases where a client FIN/RST is lost. 245 // stream limit to deal with rare cases where a client FIN/RST is lost.
246 246
247 // The slightly increased stream limit is set during config negotiation. 247 // The slightly increased stream limit is set during config negotiation.
248 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); 248 EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams());
249 session_->OnConfigNegotiated(); 249 session_->OnConfigNegotiated();
250 const size_t kAvailableStreamLimit = session_->get_max_available_streams(); 250 const size_t kAvailableStreamLimit = session_->get_max_available_streams();
251 EXPECT_EQ(session_->get_max_open_streams() * kMaxAvailableStreamsMultiplier, 251 EXPECT_EQ(session_->get_max_open_streams() * kMaxAvailableStreamsMultiplier,
252 session_->get_max_available_streams()); 252 session_->get_max_available_streams());
253 // The protocol specification requires that there can be at least 10 times 253 // The protocol specification requires that there can be at least 10 times
254 // as many available streams as the connection's maximum open streams. 254 // as many available streams as the connection's maximum open streams.
255 EXPECT_LE(10 * kMaxStreamsForTest, kAvailableStreamLimit); 255 EXPECT_LE(10 * kMaxStreamsForTest, kAvailableStreamLimit);
256 256
257 EXPECT_EQ(0u, session_->GetNumOpenStreams()); 257 EXPECT_EQ(0u, session_->GetNumOpenStreams());
258 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream( 258 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(
259 session_.get(), kClientDataStreamId1)); 259 session_.get(), kClientDataStreamId1));
260 260
261 // Establish available streams up to the server's limit. 261 // Establish available streams up to the server's limit.
262 const int kLimitingStreamId = 262 const int kLimitingStreamId =
263 FLAGS_allow_many_available_streams 263 FLAGS_allow_many_available_streams
264 ? kClientDataStreamId1 + (kAvailableStreamLimit)*2 + 2 264 ? kClientDataStreamId1 + (kAvailableStreamLimit)*2 + 2
265 : kClientDataStreamId1 + (session_->get_max_open_streams() - 1) * 2; 265 : kClientDataStreamId1 + (session_->get_max_open_streams() - 1) * 2;
266 EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDynamicStream( 266 EXPECT_TRUE(QuicServerSessionPeer::GetOrCreateDynamicStream(
267 session_.get(), kLimitingStreamId)); 267 session_.get(), kLimitingStreamId));
268 268
269 // A further available stream will result in connection close. 269 // A further available stream will result in connection close.
270 if (FLAGS_allow_many_available_streams) { 270 if (FLAGS_allow_many_available_streams) {
271 EXPECT_CALL(*connection_, 271 EXPECT_CALL(*connection_,
272 SendConnectionClose(QUIC_TOO_MANY_AVAILABLE_STREAMS)); 272 SendConnectionClose(QUIC_TOO_MANY_AVAILABLE_STREAMS));
273 } else { 273 } else {
274 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); 274 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS));
275 } 275 }
276 // This forces stream kLimitingStreamId + 2 to become available, which 276 // This forces stream kLimitingStreamId + 2 to become available, which
277 // violates the quota. 277 // violates the quota.
278 EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDynamicStream( 278 EXPECT_FALSE(QuicServerSessionPeer::GetOrCreateDynamicStream(
279 session_.get(), kLimitingStreamId + 4)); 279 session_.get(), kLimitingStreamId + 4));
280 } 280 }
281 281
282 TEST_P(QuicServerSessionTest, GetEvenIncomingError) { 282 TEST_P(QuicServerSessionTest, GetEvenIncomingError) {
283 // Incoming streams on the server session must be odd. 283 // Incoming streams on the server session must be odd.
284 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); 284 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID));
285 EXPECT_EQ(nullptr, 285 EXPECT_EQ(nullptr,
286 QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 4)); 286 QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), 4));
287 } 287 }
288 288
289 TEST_P(QuicServerSessionTest, GetStreamDisconnected) { 289 TEST_P(QuicServerSessionTest, GetStreamDisconnected) {
290 // Don't create new streams if the connection is disconnected. 290 // Don't create new streams if the connection is disconnected.
291 QuicConnectionPeer::CloseConnection(connection_); 291 QuicConnectionPeer::CloseConnection(connection_);
292 EXPECT_DFATAL( 292 EXPECT_DFATAL(
293 QuicServerSessionPeer::GetIncomingDynamicStream(session_.get(), 5), 293 QuicServerSessionPeer::GetOrCreateDynamicStream(session_.get(), 5),
294 "ShouldCreateIncomingDynamicStream called when disconnected"); 294 "ShouldCreateIncomingDynamicStream called when disconnected");
295 } 295 }
296 296
297 TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) { 297 TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) {
298 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); 298 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true);
299 299
300 // Set received config to have FEC connection option. 300 // Set received config to have FEC connection option.
301 QuicTagVector copt; 301 QuicTagVector copt;
302 copt.push_back(kFHDR); 302 copt.push_back(kFHDR);
303 QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt); 303 QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
304 session_->OnConfigNegotiated(); 304 session_->OnConfigNegotiated();
305 305
306 // Verify that headers stream is always protected and data streams are 306 // Verify that headers stream is always protected and data streams are
307 // optionally protected. 307 // optionally protected.
308 EXPECT_EQ(FEC_PROTECT_ALWAYS, QuicSpdySessionPeer::GetHeadersStream( 308 EXPECT_EQ(FEC_PROTECT_ALWAYS, QuicSpdySessionPeer::GetHeadersStream(
309 session_.get())->fec_policy()); 309 session_.get())->fec_policy());
310 ReliableQuicStream* stream = QuicServerSessionPeer::GetIncomingDynamicStream( 310 ReliableQuicStream* stream = QuicServerSessionPeer::GetOrCreateDynamicStream(
311 session_.get(), kClientDataStreamId1); 311 session_.get(), kClientDataStreamId1);
312 ASSERT_TRUE(stream); 312 ASSERT_TRUE(stream);
313 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy()); 313 EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy());
314 } 314 }
315 315
316 class MockQuicCryptoServerStream : public QuicCryptoServerStream { 316 class MockQuicCryptoServerStream : public QuicCryptoServerStream {
317 public: 317 public:
318 explicit MockQuicCryptoServerStream( 318 explicit MockQuicCryptoServerStream(
319 const QuicCryptoServerConfig* crypto_config, QuicSession* session) 319 const QuicCryptoServerConfig* crypto_config, QuicSession* session)
320 : QuicCryptoServerStream(crypto_config, session) {} 320 : QuicCryptoServerStream(crypto_config, session) {}
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); 492 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get()));
493 session_->OnConfigNegotiated(); 493 session_->OnConfigNegotiated();
494 EXPECT_FALSE( 494 EXPECT_FALSE(
495 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get())); 495 QuicServerSessionPeer::IsBandwidthResumptionEnabled(session_.get()));
496 } 496 }
497 497
498 } // namespace 498 } // namespace
499 } // namespace test 499 } // namespace test
500 } // namespace tools 500 } // namespace tools
501 } // namespace net 501 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/end_to_end_test.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698