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_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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |