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

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

Issue 2862563003: Landing Recent QUIC changes until Sat Apr 29 00:22:04 2017 +0000 (Closed)
Patch Set: rebase and fix test bugs detected by swarm bot. Created 3 years, 7 months 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
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_simple_server_session.h" 5 #include "net/tools/quic/quic_simple_server_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 class QuicSimpleServerSessionPeer { 49 class QuicSimpleServerSessionPeer {
50 public: 50 public:
51 static void SetCryptoStream(QuicSimpleServerSession* s, 51 static void SetCryptoStream(QuicSimpleServerSession* s,
52 QuicCryptoServerStream* crypto_stream) { 52 QuicCryptoServerStream* crypto_stream) {
53 s->crypto_stream_.reset(crypto_stream); 53 s->crypto_stream_.reset(crypto_stream);
54 s->static_streams()[kCryptoStreamId] = crypto_stream; 54 s->static_streams()[kCryptoStreamId] = crypto_stream;
55 } 55 }
56 56
57 static QuicSpdyStream* CreateIncomingDynamicStream(QuicSimpleServerSession* s, 57 static QuicSpdyStream* CreateIncomingDynamicStream(QuicSimpleServerSession* s,
58 QuicStreamId id) { 58 QuicStreamId id) {
59 return s->CreateIncomingDynamicStream(id); 59 return FLAGS_quic_reloadable_flag_quic_refactor_stream_creation
60 ? s->MaybeCreateIncomingDynamicStream(id)
61 : s->CreateIncomingDynamicStream(id);
60 } 62 }
61 63
62 static QuicSimpleServerStream* CreateOutgoingDynamicStream( 64 static QuicSimpleServerStream* CreateOutgoingDynamicStream(
63 QuicSimpleServerSession* s, 65 QuicSimpleServerSession* s,
64 SpdyPriority priority) { 66 SpdyPriority priority) {
65 return s->CreateOutgoingDynamicStream(priority); 67 return FLAGS_quic_reloadable_flag_quic_refactor_stream_creation
68 ? static_cast<QuicSimpleServerStream*>(
69 s->MaybeCreateOutgoingDynamicStream(priority))
70 : s->CreateOutgoingDynamicStream(priority);
66 } 71 }
67 72
68 static std::deque<PromisedStreamInfo>* promised_streams( 73 static std::deque<PromisedStreamInfo>* promised_streams(
69 QuicSimpleServerSession* s) { 74 QuicSimpleServerSession* s) {
70 return &(s->promised_streams_); 75 return &(s->promised_streams_);
71 } 76 }
72 77
73 static QuicStreamId hightest_promised_stream_id(QuicSimpleServerSession* s) { 78 static QuicStreamId hightest_promised_stream_id(QuicSimpleServerSession* s) {
74 return s->highest_promised_stream_id_; 79 return s->highest_promised_stream_id_;
75 } 80 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 MockClock clock; 205 MockClock clock;
201 handshake_message_.reset(crypto_config_.AddDefaultConfig( 206 handshake_message_.reset(crypto_config_.AddDefaultConfig(
202 QuicRandom::GetInstance(), &clock, 207 QuicRandom::GetInstance(), &clock,
203 QuicCryptoServerConfig::ConfigOptions())); 208 QuicCryptoServerConfig::ConfigOptions()));
204 session_->Initialize(); 209 session_->Initialize();
205 visitor_ = QuicConnectionPeer::GetVisitor(connection_); 210 visitor_ = QuicConnectionPeer::GetVisitor(connection_);
206 211
207 session_->OnConfigNegotiated(); 212 session_->OnConfigNegotiated();
208 } 213 }
209 214
215 QuicStreamId GetNthClientInitiatedId(int n) {
216 return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(*session_, n);
217 }
218
219 QuicStreamId GetNthServerInitiatedId(int n) {
220 return QuicSpdySessionPeer::GetNthServerInitiatedStreamId(*session_, n);
221 }
222
210 StrictMock<MockQuicSessionVisitor> owner_; 223 StrictMock<MockQuicSessionVisitor> owner_;
211 StrictMock<MockQuicCryptoServerStreamHelper> stream_helper_; 224 StrictMock<MockQuicCryptoServerStreamHelper> stream_helper_;
212 MockQuicConnectionHelper helper_; 225 MockQuicConnectionHelper helper_;
213 MockAlarmFactory alarm_factory_; 226 MockAlarmFactory alarm_factory_;
214 StrictMock<MockQuicConnectionWithSendStreamData>* connection_; 227 StrictMock<MockQuicConnectionWithSendStreamData>* connection_;
215 QuicConfig config_; 228 QuicConfig config_;
216 QuicCryptoServerConfig crypto_config_; 229 QuicCryptoServerConfig crypto_config_;
217 QuicCompressedCertsCache compressed_certs_cache_; 230 QuicCompressedCertsCache compressed_certs_cache_;
218 QuicHttpResponseCache response_cache_; 231 QuicHttpResponseCache response_cache_;
219 std::unique_ptr<MockQuicSimpleServerSession> session_; 232 std::unique_ptr<MockQuicSimpleServerSession> session_;
220 std::unique_ptr<CryptoHandshakeMessage> handshake_message_; 233 std::unique_ptr<CryptoHandshakeMessage> handshake_message_;
221 QuicConnectionVisitorInterface* visitor_; 234 QuicConnectionVisitorInterface* visitor_;
222 }; 235 };
223 236
224 INSTANTIATE_TEST_CASE_P(Tests, 237 INSTANTIATE_TEST_CASE_P(Tests,
225 QuicSimpleServerSessionTest, 238 QuicSimpleServerSessionTest,
226 ::testing::ValuesIn(AllSupportedVersions())); 239 ::testing::ValuesIn(AllSupportedVersions()));
227 240
228 TEST_P(QuicSimpleServerSessionTest, CloseStreamDueToReset) { 241 TEST_P(QuicSimpleServerSessionTest, CloseStreamDueToReset) {
229 // Open a stream, then reset it. 242 // Open a stream, then reset it.
230 // Send two bytes of payload to open it. 243 // Send two bytes of payload to open it.
231 QuicStreamFrame data1(kClientDataStreamId1, false, 0, QuicStringPiece("HT")); 244 QuicStreamFrame data1(GetNthClientInitiatedId(0), false, 0,
245 QuicStringPiece("HT"));
232 session_->OnStreamFrame(data1); 246 session_->OnStreamFrame(data1);
233 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); 247 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
234 248
235 // Receive a reset (and send a RST in response). 249 // Receive a reset (and send a RST in response).
236 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 250 QuicRstStreamFrame rst1(GetNthClientInitiatedId(0),
237 0); 251 QUIC_ERROR_PROCESSING_STREAM, 0);
238 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1); 252 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
239 EXPECT_CALL(*connection_, 253 EXPECT_CALL(*connection_, SendRstStream(GetNthClientInitiatedId(0),
240 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); 254 QUIC_RST_ACKNOWLEDGEMENT, 0));
241 visitor_->OnRstStream(rst1); 255 visitor_->OnRstStream(rst1);
242 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); 256 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
243 257
244 // Send the same two bytes of payload in a new packet. 258 // Send the same two bytes of payload in a new packet.
245 visitor_->OnStreamFrame(data1); 259 visitor_->OnStreamFrame(data1);
246 260
247 // The stream should not be re-opened. 261 // The stream should not be re-opened.
248 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); 262 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
249 EXPECT_TRUE(connection_->connected()); 263 EXPECT_TRUE(connection_->connected());
250 } 264 }
251 265
252 TEST_P(QuicSimpleServerSessionTest, NeverOpenStreamDueToReset) { 266 TEST_P(QuicSimpleServerSessionTest, NeverOpenStreamDueToReset) {
253 // Send a reset (and expect the peer to send a RST in response). 267 // Send a reset (and expect the peer to send a RST in response).
254 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 268 QuicRstStreamFrame rst1(GetNthClientInitiatedId(0),
255 0); 269 QUIC_ERROR_PROCESSING_STREAM, 0);
256 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1); 270 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
257 EXPECT_CALL(*connection_, 271 EXPECT_CALL(*connection_, SendRstStream(GetNthClientInitiatedId(0),
258 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); 272 QUIC_RST_ACKNOWLEDGEMENT, 0));
259 visitor_->OnRstStream(rst1); 273 visitor_->OnRstStream(rst1);
260 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); 274 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
261 275
262 // Send two bytes of payload. 276 // Send two bytes of payload.
263 QuicStreamFrame data1(kClientDataStreamId1, false, 0, QuicStringPiece("HT")); 277 QuicStreamFrame data1(GetNthClientInitiatedId(0), false, 0,
278 QuicStringPiece("HT"));
264 visitor_->OnStreamFrame(data1); 279 visitor_->OnStreamFrame(data1);
265 280
266 // The stream should never be opened, now that the reset is received. 281 // The stream should never be opened, now that the reset is received.
267 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); 282 EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
268 EXPECT_TRUE(connection_->connected()); 283 EXPECT_TRUE(connection_->connected());
269 } 284 }
270 285
271 TEST_P(QuicSimpleServerSessionTest, AcceptClosedStream) { 286 TEST_P(QuicSimpleServerSessionTest, AcceptClosedStream) {
272 // Send (empty) compressed headers followed by two bytes of data. 287 // Send (empty) compressed headers followed by two bytes of data.
273 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, 288 QuicStreamFrame frame1(GetNthClientInitiatedId(0), false, 0,
274 QuicStringPiece("\1\0\0\0\0\0\0\0HT")); 289 QuicStringPiece("\1\0\0\0\0\0\0\0HT"));
275 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, 290 QuicStreamFrame frame2(GetNthClientInitiatedId(1), false, 0,
276 QuicStringPiece("\2\0\0\0\0\0\0\0HT")); 291 QuicStringPiece("\2\0\0\0\0\0\0\0HT"));
277 visitor_->OnStreamFrame(frame1); 292 visitor_->OnStreamFrame(frame1);
278 visitor_->OnStreamFrame(frame2); 293 visitor_->OnStreamFrame(frame2);
279 EXPECT_EQ(2u, session_->GetNumOpenIncomingStreams()); 294 EXPECT_EQ(2u, session_->GetNumOpenIncomingStreams());
280 295
281 // Send a reset (and expect the peer to send a RST in response). 296 // Send a reset (and expect the peer to send a RST in response).
282 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 0); 297 QuicRstStreamFrame rst(GetNthClientInitiatedId(0),
298 QUIC_ERROR_PROCESSING_STREAM, 0);
283 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1); 299 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
284 EXPECT_CALL(*connection_, 300 EXPECT_CALL(*connection_, SendRstStream(GetNthClientInitiatedId(0),
285 SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); 301 QUIC_RST_ACKNOWLEDGEMENT, 0));
286 visitor_->OnRstStream(rst); 302 visitor_->OnRstStream(rst);
287 303
288 // If we were tracking, we'd probably want to reject this because it's data 304 // If we were tracking, we'd probably want to reject this because it's data
289 // past the reset point of stream 3. As it's a closed stream we just drop the 305 // past the reset point of stream 3. As it's a closed stream we just drop the
290 // data on the floor, but accept the packet because it has data for stream 5. 306 // data on the floor, but accept the packet because it has data for stream 5.
291 QuicStreamFrame frame3(kClientDataStreamId1, false, 2, QuicStringPiece("TP")); 307 QuicStreamFrame frame3(GetNthClientInitiatedId(0), false, 2,
292 QuicStreamFrame frame4(kClientDataStreamId2, false, 2, QuicStringPiece("TP")); 308 QuicStringPiece("TP"));
309 QuicStreamFrame frame4(GetNthClientInitiatedId(1), false, 2,
310 QuicStringPiece("TP"));
293 visitor_->OnStreamFrame(frame3); 311 visitor_->OnStreamFrame(frame3);
294 visitor_->OnStreamFrame(frame4); 312 visitor_->OnStreamFrame(frame4);
295 // The stream should never be opened, now that the reset is received. 313 // The stream should never be opened, now that the reset is received.
296 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); 314 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
297 EXPECT_TRUE(connection_->connected()); 315 EXPECT_TRUE(connection_->connected());
298 } 316 }
299 317
300 TEST_P(QuicSimpleServerSessionTest, CreateIncomingDynamicStreamDisconnected) { 318 TEST_P(QuicSimpleServerSessionTest, CreateIncomingDynamicStreamDisconnected) {
301 // Tests that incoming stream creation fails when connection is not connected. 319 // Tests that incoming stream creation fails when connection is not connected.
302 size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams(); 320 size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams();
303 QuicConnectionPeer::TearDownLocalConnectionState(connection_); 321 QuicConnectionPeer::TearDownLocalConnectionState(connection_);
304 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateIncomingDynamicStream( 322 if (FLAGS_quic_reloadable_flag_quic_refactor_stream_creation) {
305 session_.get(), kClientDataStreamId1), 323 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(
306 "ShouldCreateIncomingDynamicStream called when disconnected"); 324 session_.get(), GetNthClientInitiatedId(0)));
325 } else {
326 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(
327 session_.get(), GetNthClientInitiatedId(0)),
328 "ShouldCreateIncomingDynamicStream called when "
329 "disconnected");
330 }
307 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams()); 331 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams());
308 } 332 }
309 333
310 TEST_P(QuicSimpleServerSessionTest, CreateEvenIncomingDynamicStream) { 334 TEST_P(QuicSimpleServerSessionTest, CreateEvenIncomingDynamicStream) {
335 if (FLAGS_quic_reloadable_flag_quic_refactor_stream_creation) {
336 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(
337 session_.get(), 2));
338 return;
339 }
311 // Tests that incoming stream creation fails when given stream id is even. 340 // Tests that incoming stream creation fails when given stream id is even.
312 size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams(); 341 size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams();
313 EXPECT_CALL(*connection_, 342 EXPECT_CALL(*connection_,
314 CloseConnection(QUIC_INVALID_STREAM_ID, 343 CloseConnection(QUIC_INVALID_STREAM_ID,
315 "Client created even numbered stream", _)); 344 "Client created even numbered stream", _));
316 QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(session_.get(), 2); 345 QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(session_.get(), 2);
317 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams()); 346 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams());
318 } 347 }
319 348
320 TEST_P(QuicSimpleServerSessionTest, CreateIncomingDynamicStream) { 349 TEST_P(QuicSimpleServerSessionTest, CreateIncomingDynamicStream) {
321 QuicSpdyStream* stream = 350 QuicSpdyStream* stream =
322 QuicSimpleServerSessionPeer::CreateIncomingDynamicStream( 351 QuicSimpleServerSessionPeer::CreateIncomingDynamicStream(
323 session_.get(), kClientDataStreamId1); 352 session_.get(), GetNthClientInitiatedId(0));
324 EXPECT_NE(nullptr, stream); 353 EXPECT_NE(nullptr, stream);
325 EXPECT_EQ(kClientDataStreamId1, stream->id()); 354 EXPECT_EQ(GetNthClientInitiatedId(0), stream->id());
326 } 355 }
327 356
328 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamDisconnected) { 357 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamDisconnected) {
329 // Tests that outgoing stream creation fails when connection is not connected. 358 // Tests that outgoing stream creation fails when connection is not connected.
330 size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams(); 359 size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams();
331 QuicConnectionPeer::TearDownLocalConnectionState(connection_); 360 QuicConnectionPeer::TearDownLocalConnectionState(connection_);
332 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream( 361 if (FLAGS_quic_reloadable_flag_quic_refactor_stream_creation) {
333 session_.get(), kDefaultPriority), 362 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
334 "ShouldCreateOutgoingDynamicStream called when disconnected"); 363 session_.get(), kDefaultPriority));
364 } else {
365 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
366 session_.get(), kDefaultPriority),
367 "ShouldCreateOutgoingDynamicStream called when "
368 "disconnected");
369 }
335 370
336 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams()); 371 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams());
337 } 372 }
338 373
339 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamUnencrypted) { 374 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamUnencrypted) {
340 // Tests that outgoing stream creation fails when encryption has not yet been 375 // Tests that outgoing stream creation fails when encryption has not yet been
341 // established. 376 // established.
342 size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams(); 377 size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams();
343 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream( 378 if (FLAGS_quic_reloadable_flag_quic_refactor_stream_creation) {
344 session_.get(), kDefaultPriority), 379 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
345 "Encryption not established so no outgoing stream created."); 380 session_.get(), kDefaultPriority));
381 } else {
382 EXPECT_QUIC_BUG(QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
383 session_.get(), kDefaultPriority),
384 "Encryption not established so no outgoing stream "
385 "created.");
386 }
346 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams()); 387 EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams());
347 } 388 }
348 389
349 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamUptoLimit) { 390 TEST_P(QuicSimpleServerSessionTest, CreateOutgoingDynamicStreamUptoLimit) {
350 // Tests that outgoing stream creation should not be affected by existing 391 // Tests that outgoing stream creation should not be affected by existing
351 // incoming stream and vice-versa. But when reaching the limit of max outgoing 392 // incoming stream and vice-versa. But when reaching the limit of max outgoing
352 // stream allowed, creation should fail. 393 // stream allowed, creation should fail.
353 394
354 // Receive some data to initiate a incoming stream which should not effect 395 // Receive some data to initiate a incoming stream which should not effect
355 // creating outgoing streams. 396 // creating outgoing streams.
356 QuicStreamFrame data1(kClientDataStreamId1, false, 0, QuicStringPiece("HT")); 397 QuicStreamFrame data1(GetNthClientInitiatedId(0), false, 0,
398 QuicStringPiece("HT"));
357 session_->OnStreamFrame(data1); 399 session_->OnStreamFrame(data1);
358 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams()); 400 EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
359 EXPECT_EQ(0u, session_->GetNumOpenOutgoingStreams()); 401 EXPECT_EQ(0u, session_->GetNumOpenOutgoingStreams());
360 402
361 // Assume encryption already established. 403 // Assume encryption already established.
362 MockQuicCryptoServerStream* crypto_stream = 404 MockQuicCryptoServerStream* crypto_stream =
363 new MockQuicCryptoServerStream(&crypto_config_, &compressed_certs_cache_, 405 new MockQuicCryptoServerStream(&crypto_config_, &compressed_certs_cache_,
364 session_.get(), &stream_helper_); 406 session_.get(), &stream_helper_);
365 crypto_stream->set_encryption_established(true); 407 crypto_stream->set_encryption_established(true);
366 QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream); 408 QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream);
367 409
368 // Create push streams till reaching the upper limit of allowed open streams. 410 // Create push streams till reaching the upper limit of allowed open streams.
369 for (size_t i = 0; i < kMaxStreamsForTest; ++i) { 411 for (size_t i = 0; i < kMaxStreamsForTest; ++i) {
370 QuicSpdyStream* created_stream = 412 QuicSpdyStream* created_stream =
371 QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream( 413 QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
372 session_.get(), kDefaultPriority); 414 session_.get(), kDefaultPriority);
373 EXPECT_EQ(2 * (i + 1), created_stream->id()); 415 EXPECT_EQ(GetNthServerInitiatedId(i), created_stream->id());
374 EXPECT_EQ(i + 1, session_->GetNumOpenOutgoingStreams()); 416 EXPECT_EQ(i + 1, session_->GetNumOpenOutgoingStreams());
375 } 417 }
376 418
377 // Continuing creating push stream would fail. 419 // Continuing creating push stream would fail.
378 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream( 420 EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
379 session_.get(), kDefaultPriority)); 421 session_.get(), kDefaultPriority));
380 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); 422 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
381 423
382 // Create peer initiated stream should have no problem. 424 // Create peer initiated stream should have no problem.
383 QuicStreamFrame data2(kClientDataStreamId2, false, 0, QuicStringPiece("HT")); 425 QuicStreamFrame data2(GetNthClientInitiatedId(1), false, 0,
426 QuicStringPiece("HT"));
384 session_->OnStreamFrame(data2); 427 session_->OnStreamFrame(data2);
385 EXPECT_EQ(2u, session_->GetNumOpenIncomingStreams()); 428 EXPECT_EQ(2u, session_->GetNumOpenIncomingStreams());
386 } 429 }
387 430
388 TEST_P(QuicSimpleServerSessionTest, OnStreamFrameWithEvenStreamId) { 431 TEST_P(QuicSimpleServerSessionTest, OnStreamFrameWithEvenStreamId) {
389 QuicStreamFrame frame(2, false, 0, QuicStringPiece()); 432 QuicStreamFrame frame(2, false, 0, QuicStringPiece());
390 EXPECT_CALL(*connection_, 433 EXPECT_CALL(*connection_,
391 CloseConnection(QUIC_INVALID_STREAM_ID, 434 CloseConnection(QUIC_INVALID_STREAM_ID,
392 "Client sent data on server push stream", _)); 435 "Client sent data on server push stream", _));
393 session_->OnStreamFrame(frame); 436 session_->OnStreamFrame(frame);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 506
464 config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, kMaxStreamsForTest); 507 config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, kMaxStreamsForTest);
465 508
466 string request_url = "mail.google.com/"; 509 string request_url = "mail.google.com/";
467 SpdyHeaderBlock request_headers; 510 SpdyHeaderBlock request_headers;
468 string resource_host = "www.google.com"; 511 string resource_host = "www.google.com";
469 string partial_push_resource_path = "/server_push_src"; 512 string partial_push_resource_path = "/server_push_src";
470 std::list<QuicHttpResponseCache::ServerPushInfo> push_resources; 513 std::list<QuicHttpResponseCache::ServerPushInfo> push_resources;
471 string scheme = "http"; 514 string scheme = "http";
472 for (unsigned int i = 1; i <= num_resources; ++i) { 515 for (unsigned int i = 1; i <= num_resources; ++i) {
473 QuicStreamId stream_id = i * 2; 516 QuicStreamId stream_id = GetNthServerInitiatedId(i - 1);
474 string path = 517 string path =
475 partial_push_resource_path + QuicTextUtils::Uint64ToString(i); 518 partial_push_resource_path + QuicTextUtils::Uint64ToString(i);
476 string url = scheme + "://" + resource_host + path; 519 string url = scheme + "://" + resource_host + path;
477 QuicUrl resource_url = QuicUrl(url); 520 QuicUrl resource_url = QuicUrl(url);
478 string body(body_size, 'a'); 521 string body(body_size, 'a');
479 response_cache_.AddSimpleResponse(resource_host, path, 200, body); 522 response_cache_.AddSimpleResponse(resource_host, path, 200, body);
480 push_resources.push_back(QuicHttpResponseCache::ServerPushInfo( 523 push_resources.push_back(QuicHttpResponseCache::ServerPushInfo(
481 resource_url, SpdyHeaderBlock(), kDefaultPriority, body)); 524 resource_url, SpdyHeaderBlock(), kDefaultPriority, body));
482 // PUSH_PROMISED are sent for all the resources. 525 // PUSH_PROMISED are sent for all the resources.
483 EXPECT_CALL(*session_, 526 EXPECT_CALL(*session_, WritePushPromiseMock(GetNthClientInitiatedId(0),
484 WritePushPromiseMock(kClientDataStreamId1, stream_id, _)); 527 stream_id, _));
485 if (i <= kMaxStreamsForTest) { 528 if (i <= kMaxStreamsForTest) {
486 // |kMaxStreamsForTest| promised responses should be sent. 529 // |kMaxStreamsForTest| promised responses should be sent.
487 EXPECT_CALL(*session_, 530 EXPECT_CALL(*session_,
488 WriteHeadersMock(stream_id, _, false, kDefaultPriority, _)); 531 WriteHeadersMock(stream_id, _, false, kDefaultPriority, _));
489 // Since flow control window is smaller than response body, not the 532 // Since flow control window is smaller than response body, not the
490 // whole body will be sent. 533 // whole body will be sent.
491 if (!session_->force_hol_blocking()) { 534 if (!session_->force_hol_blocking()) {
492 EXPECT_CALL(*connection_, SendStreamData(stream_id, _, 0, NO_FIN, _)) 535 EXPECT_CALL(*connection_, SendStreamData(stream_id, _, 0, NO_FIN, _))
493 .WillOnce(Return( 536 .WillOnce(Return(
494 QuicConsumedData(kStreamFlowControlWindowSize, false))); 537 QuicConsumedData(kStreamFlowControlWindowSize, false)));
495 EXPECT_CALL(*connection_, SendBlocked(stream_id)); 538 EXPECT_CALL(*connection_, SendBlocked(stream_id));
496 } else { 539 } else {
497 // The forced HOL blocking encapsulates the stream data into 540 // The forced HOL blocking encapsulates the stream data into
498 // HTTP/2 DATA frames within the headers stream. HTTP/2 541 // HTTP/2 DATA frames within the headers stream. HTTP/2
499 // DATA frames are limited to a max size of 16KB, so the 542 // DATA frames are limited to a max size of 16KB, so the
500 // 64KB body will be fragemented into four DATA frames. 543 // 64KB body will be fragemented into four DATA frames.
501 EXPECT_CALL(*connection_, SendStreamData(_, _, _, NO_FIN, _)) 544 EXPECT_CALL(*connection_, SendStreamData(_, _, _, NO_FIN, _))
502 .Times(body_size / 16384) 545 .Times(body_size / 16384)
503 .WillOnce(Return(QuicConsumedData(9 + 16394, false))) 546 .WillOnce(Return(QuicConsumedData(9 + 16394, false)))
504 .WillOnce(Return(QuicConsumedData(9 + 16394, false))) 547 .WillOnce(Return(QuicConsumedData(9 + 16394, false)))
505 .WillOnce(Return(QuicConsumedData(9 + 16394, false))) 548 .WillOnce(Return(QuicConsumedData(9 + 16394, false)))
506 .WillOnce(Return(QuicConsumedData(9 + 16394, false))); 549 .WillOnce(Return(QuicConsumedData(9 + 16394, false)));
507 EXPECT_CALL(*connection_, SendBlocked(_)); 550 EXPECT_CALL(*connection_, SendBlocked(_));
508 } 551 }
509 } 552 }
510 } 553 }
511 session_->PromisePushResources(request_url, push_resources, 554 session_->PromisePushResources(request_url, push_resources,
512 kClientDataStreamId1, request_headers); 555 GetNthClientInitiatedId(0), request_headers);
513 } 556 }
514 }; 557 };
515 558
516 INSTANTIATE_TEST_CASE_P(Tests, 559 INSTANTIATE_TEST_CASE_P(Tests,
517 QuicSimpleServerSessionServerPushTest, 560 QuicSimpleServerSessionServerPushTest,
518 ::testing::ValuesIn(AllSupportedVersions())); 561 ::testing::ValuesIn(AllSupportedVersions()));
519 562
520 TEST_P(QuicSimpleServerSessionServerPushTest, TestPromisePushResources) { 563 TEST_P(QuicSimpleServerSessionServerPushTest, TestPromisePushResources) {
521 // Tests that given more than kMaxOpenStreamForTest resources, all their 564 // Tests that given more than kMaxOpenStreamForTest resources, all their
522 // PUSH_PROMISE's will be sent out and only |kMaxOpenStreamForTest| streams 565 // PUSH_PROMISE's will be sent out and only |kMaxOpenStreamForTest| streams
(...skipping 10 matching lines...) Expand all
533 TEST_P(QuicSimpleServerSessionServerPushTest, 576 TEST_P(QuicSimpleServerSessionServerPushTest,
534 HandlePromisedPushRequestsAfterStreamDraining) { 577 HandlePromisedPushRequestsAfterStreamDraining) {
535 if (session_->force_hol_blocking()) { 578 if (session_->force_hol_blocking()) {
536 return; 579 return;
537 } 580 }
538 581
539 // Tests that after promised stream queued up, when an opened stream is marked 582 // Tests that after promised stream queued up, when an opened stream is marked
540 // draining, a queued promised stream will become open and send push response. 583 // draining, a queued promised stream will become open and send push response.
541 size_t num_resources = kMaxStreamsForTest + 1; 584 size_t num_resources = kMaxStreamsForTest + 1;
542 PromisePushResources(num_resources); 585 PromisePushResources(num_resources);
543 QuicStreamId next_out_going_stream_id = num_resources * 2; 586 QuicStreamId next_out_going_stream_id =
587 GetNthServerInitiatedId(kMaxStreamsForTest);
544 588
545 // After an open stream is marked draining, a new stream is expected to be 589 // After an open stream is marked draining, a new stream is expected to be
546 // created and a response sent on the stream. 590 // created and a response sent on the stream.
547 EXPECT_CALL(*session_, WriteHeadersMock(next_out_going_stream_id, _, false, 591 EXPECT_CALL(*session_, WriteHeadersMock(next_out_going_stream_id, _, false,
548 kDefaultPriority, _)); 592 kDefaultPriority, _));
549 EXPECT_CALL(*connection_, 593 EXPECT_CALL(*connection_,
550 SendStreamData(next_out_going_stream_id, _, 0, NO_FIN, _)) 594 SendStreamData(next_out_going_stream_id, _, 0, NO_FIN, _))
551 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 595 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
552 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id)); 596 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id));
553 session_->StreamDraining(2); 597 session_->StreamDraining(2);
554 // Number of open outgoing streams should still be the same, because a new 598 // Number of open outgoing streams should still be the same, because a new
555 // stream is opened. And the queue should be empty. 599 // stream is opened. And the queue should be empty.
556 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); 600 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
557 } 601 }
558 602
559 TEST_P(QuicSimpleServerSessionServerPushTest, 603 TEST_P(QuicSimpleServerSessionServerPushTest,
560 ResetPromisedStreamToCancelServerPush) { 604 ResetPromisedStreamToCancelServerPush) {
561 if (session_->force_hol_blocking()) { 605 if (session_->force_hol_blocking()) {
562 return; 606 return;
563 } 607 }
564 // Tests that after all resources are promised, a RST frame from client can 608 // Tests that after all resources are promised, a RST frame from client can
565 // prevent a promised resource to be send out. 609 // prevent a promised resource to be send out.
566 610
567 // Having two extra resources to be send later. One of them will be reset, so 611 // Having two extra resources to be send later. One of them will be reset, so
568 // when opened stream become close, only one will become open. 612 // when opened stream become close, only one will become open.
569 size_t num_resources = kMaxStreamsForTest + 2; 613 size_t num_resources = kMaxStreamsForTest + 2;
570 PromisePushResources(num_resources); 614 PromisePushResources(num_resources);
571 615
572 // Reset the last stream in the queue. It should be marked cancelled. 616 // Reset the last stream in the queue. It should be marked cancelled.
573 QuicStreamId stream_got_reset = num_resources * 2; 617 QuicStreamId stream_got_reset =
618 GetNthServerInitiatedId(kMaxStreamsForTest + 1);
574 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); 619 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
575 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1); 620 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
576 EXPECT_CALL(*connection_, 621 EXPECT_CALL(*connection_,
577 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0)); 622 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0));
578 visitor_->OnRstStream(rst); 623 visitor_->OnRstStream(rst);
579 624
580 // When the first 2 streams becomes draining, the two queued up stream could 625 // When the first 2 streams becomes draining, the two queued up stream could
581 // be created. But since one of them was marked cancelled due to RST frame, 626 // be created. But since one of them was marked cancelled due to RST frame,
582 // only one queued resource will be sent out. 627 // only one queued resource will be sent out.
583 QuicStreamId stream_not_reset = (kMaxStreamsForTest + 1) * 2; 628 QuicStreamId stream_not_reset = GetNthServerInitiatedId(kMaxStreamsForTest);
584 InSequence s; 629 InSequence s;
585 EXPECT_CALL(*session_, WriteHeadersMock(stream_not_reset, _, false, 630 EXPECT_CALL(*session_, WriteHeadersMock(stream_not_reset, _, false,
586 kDefaultPriority, _)); 631 kDefaultPriority, _));
587 EXPECT_CALL(*connection_, SendStreamData(stream_not_reset, _, 0, NO_FIN, _)) 632 EXPECT_CALL(*connection_, SendStreamData(stream_not_reset, _, 0, NO_FIN, _))
588 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 633 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
589 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset)); 634 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset));
590 EXPECT_CALL(*session_, 635 EXPECT_CALL(*session_,
591 WriteHeadersMock(stream_got_reset, _, false, kDefaultPriority, _)) 636 WriteHeadersMock(stream_got_reset, _, false, kDefaultPriority, _))
592 .Times(0); 637 .Times(0);
593 638
594 session_->StreamDraining(2); 639 session_->StreamDraining(GetNthServerInitiatedId(0));
595 session_->StreamDraining(4); 640 session_->StreamDraining(GetNthServerInitiatedId(1));
596 } 641 }
597 642
598 TEST_P(QuicSimpleServerSessionServerPushTest, 643 TEST_P(QuicSimpleServerSessionServerPushTest,
599 CloseStreamToHandleMorePromisedStream) { 644 CloseStreamToHandleMorePromisedStream) {
600 if (session_->force_hol_blocking()) { 645 if (session_->force_hol_blocking()) {
601 return; 646 return;
602 } 647 }
603 // Tests that closing a open outgoing stream can trigger a promised resource 648 // Tests that closing a open outgoing stream can trigger a promised resource
604 // in the queue to be send out. 649 // in the queue to be send out.
605 size_t num_resources = kMaxStreamsForTest + 1; 650 size_t num_resources = kMaxStreamsForTest + 1;
606 PromisePushResources(num_resources); 651 PromisePushResources(num_resources);
607 QuicStreamId stream_to_open = num_resources * 2; 652 QuicStreamId stream_to_open = GetNthServerInitiatedId(kMaxStreamsForTest);
608 653
609 // Resetting 1st open stream will close the stream and give space for extra 654 // Resetting 1st open stream will close the stream and give space for extra
610 // stream to be opened. 655 // stream to be opened.
611 QuicStreamId stream_got_reset = 2; 656 QuicStreamId stream_got_reset = GetNthServerInitiatedId(0);
612 EXPECT_CALL(*connection_, 657 EXPECT_CALL(*connection_,
613 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _)); 658 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _));
614 EXPECT_CALL(*session_, 659 EXPECT_CALL(*session_,
615 WriteHeadersMock(stream_to_open, _, false, kDefaultPriority, _)); 660 WriteHeadersMock(stream_to_open, _, false, kDefaultPriority, _));
616 EXPECT_CALL(*connection_, SendStreamData(stream_to_open, _, 0, NO_FIN, _)) 661 EXPECT_CALL(*connection_, SendStreamData(stream_to_open, _, 0, NO_FIN, _))
617 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 662 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
618 663
619 EXPECT_CALL(*connection_, SendBlocked(stream_to_open)); 664 EXPECT_CALL(*connection_, SendBlocked(stream_to_open));
620 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1); 665 EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
621 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); 666 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
622 visitor_->OnRstStream(rst); 667 visitor_->OnRstStream(rst);
623 } 668 }
624 669
625 } // namespace 670 } // namespace
626 } // namespace test 671 } // namespace test
627 } // namespace net 672 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_simple_server_session.cc ('k') | net/tools/quic/quic_simple_server_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698