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

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

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