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