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

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

Issue 2739313002: Remove multipath_enabled from quic_config and quic_connection. No functional change expected. (Closed)
Patch Set: Created 3 years, 9 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_dispatcher.h" 5 #include "net/tools/quic/quic_dispatcher.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <ostream> 8 #include <ostream>
9 #include <string> 9 #include <string>
10 10
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 MockQuicConnection* connection2() { 201 MockQuicConnection* connection2() {
202 return reinterpret_cast<MockQuicConnection*>(session2_->connection()); 202 return reinterpret_cast<MockQuicConnection*>(session2_->connection());
203 } 203 }
204 204
205 // Process a packet with an 8 byte connection id, 205 // Process a packet with an 8 byte connection id,
206 // 6 byte packet number, default path id, and packet number 1, 206 // 6 byte packet number, default path id, and packet number 1,
207 // using the first supported version. 207 // using the first supported version.
208 void ProcessPacket(QuicSocketAddress client_address, 208 void ProcessPacket(QuicSocketAddress client_address,
209 QuicConnectionId connection_id, 209 QuicConnectionId connection_id,
210 bool has_version_flag, 210 bool has_version_flag,
211 bool has_multipath_flag,
212 const string& data) { 211 const string& data) {
213 ProcessPacket(client_address, connection_id, has_version_flag, 212 ProcessPacket(client_address, connection_id, has_version_flag, data,
214 has_multipath_flag, data, PACKET_8BYTE_CONNECTION_ID, 213 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER);
215 PACKET_6BYTE_PACKET_NUMBER);
216 } 214 }
217 215
218 // Process a packet with a default path id, and packet number 1, 216 // Process a packet with a default path id, and packet number 1,
219 // using the first supported version. 217 // using the first supported version.
220 void ProcessPacket(QuicSocketAddress client_address, 218 void ProcessPacket(QuicSocketAddress client_address,
221 QuicConnectionId connection_id, 219 QuicConnectionId connection_id,
222 bool has_version_flag, 220 bool has_version_flag,
223 bool has_multipath_flag,
224 const string& data, 221 const string& data,
225 QuicConnectionIdLength connection_id_length, 222 QuicConnectionIdLength connection_id_length,
226 QuicPacketNumberLength packet_number_length) { 223 QuicPacketNumberLength packet_number_length) {
227 ProcessPacket(client_address, connection_id, has_version_flag, 224 ProcessPacket(client_address, connection_id, has_version_flag, data,
228 has_multipath_flag, data, connection_id_length, 225 connection_id_length, packet_number_length, 1);
229 packet_number_length, 1);
230 } 226 }
231 227
232 // Process a packet using the first supported version. 228 // Process a packet using the first supported version.
233 void ProcessPacket(QuicSocketAddress client_address, 229 void ProcessPacket(QuicSocketAddress client_address,
234 QuicConnectionId connection_id, 230 QuicConnectionId connection_id,
235 bool has_version_flag, 231 bool has_version_flag,
236 bool has_multipath_flag,
237 const string& data, 232 const string& data,
238 QuicConnectionIdLength connection_id_length, 233 QuicConnectionIdLength connection_id_length,
239 QuicPacketNumberLength packet_number_length, 234 QuicPacketNumberLength packet_number_length,
240 QuicPacketNumber packet_number) { 235 QuicPacketNumber packet_number) {
241 ProcessPacket(client_address, connection_id, has_version_flag, 236 ProcessPacket(client_address, connection_id, has_version_flag,
242 CurrentSupportedVersions().front(), data, 237 CurrentSupportedVersions().front(), data,
243 connection_id_length, packet_number_length, packet_number); 238 connection_id_length, packet_number_length, packet_number);
244 } 239 }
245 240
246 // Processes a packet. 241 // Processes a packet.
247 void ProcessPacket(QuicSocketAddress client_address, 242 void ProcessPacket(QuicSocketAddress client_address,
248 QuicConnectionId connection_id, 243 QuicConnectionId connection_id,
249 bool has_version_flag, 244 bool has_version_flag,
250 QuicVersion version, 245 QuicVersion version,
251 const string& data, 246 const string& data,
252 QuicConnectionIdLength connection_id_length, 247 QuicConnectionIdLength connection_id_length,
253 QuicPacketNumberLength packet_number_length, 248 QuicPacketNumberLength packet_number_length,
254 QuicPacketNumber packet_number) { 249 QuicPacketNumber packet_number) {
255 QuicVersionVector versions(SupportedVersions(version)); 250 QuicVersionVector versions(SupportedVersions(version));
256 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( 251 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
257 connection_id, has_version_flag, false, false, packet_number, data, 252 connection_id, has_version_flag, false, packet_number, data,
258 connection_id_length, packet_number_length, &versions)); 253 connection_id_length, packet_number_length, &versions));
259 std::unique_ptr<QuicReceivedPacket> received_packet( 254 std::unique_ptr<QuicReceivedPacket> received_packet(
260 ConstructReceivedPacket(*packet, helper_.GetClock()->Now())); 255 ConstructReceivedPacket(*packet, helper_.GetClock()->Now()));
261 256
262 if (ChloExtractor::Extract(*packet, versions, nullptr)) { 257 if (ChloExtractor::Extract(*packet, versions, nullptr)) {
263 // Add CHLO packet to the beginning to be verified first, because it is 258 // Add CHLO packet to the beginning to be verified first, because it is
264 // also processed first by new session. 259 // also processed first by new session.
265 data_connection_map_[connection_id].push_front( 260 data_connection_map_[connection_id].push_front(
266 string(packet->data(), packet->length())); 261 string(packet->data(), packet->length()));
267 } else { 262 } else {
268 // For non-CHLO, always append to last. 263 // For non-CHLO, always append to last.
269 data_connection_map_[connection_id].push_back( 264 data_connection_map_[connection_id].push_back(
270 string(packet->data(), packet->length())); 265 string(packet->data(), packet->length()));
271 } 266 }
272 dispatcher_->ProcessPacket(server_address_, client_address, 267 dispatcher_->ProcessPacket(server_address_, client_address,
273 *received_packet); 268 *received_packet);
274 } 269 }
275 270
276 void ValidatePacket(QuicConnectionId conn_id, 271 void ValidatePacket(QuicConnectionId conn_id,
277 const QuicEncryptedPacket& packet) { 272 const QuicEncryptedPacket& packet) {
278 EXPECT_EQ(data_connection_map_[conn_id].front().length(), 273 EXPECT_EQ(data_connection_map_[conn_id].front().length(),
279 packet.AsStringPiece().length()); 274 packet.AsStringPiece().length());
280 EXPECT_EQ(data_connection_map_[conn_id].front(), packet.AsStringPiece()); 275 EXPECT_EQ(data_connection_map_[conn_id].front(),
276 packet.AsStringPiece().as_string());
281 data_connection_map_[conn_id].pop_front(); 277 data_connection_map_[conn_id].pop_front();
282 } 278 }
283 279
284 QuicServerSessionBase* CreateSession( 280 QuicServerSessionBase* CreateSession(
285 QuicDispatcher* dispatcher, 281 QuicDispatcher* dispatcher,
286 const QuicConfig& config, 282 const QuicConfig& config,
287 QuicConnectionId connection_id, 283 QuicConnectionId connection_id,
288 const QuicSocketAddress& client_address, 284 const QuicSocketAddress& client_address,
289 MockQuicConnectionHelper* helper, 285 MockQuicConnectionHelper* helper,
290 MockAlarmFactory* alarm_factory, 286 MockAlarmFactory* alarm_factory,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 337
342 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)) 338 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address))
343 .WillOnce(testing::Return(CreateSession( 339 .WillOnce(testing::Return(CreateSession(
344 dispatcher_.get(), config_, 1, client_address, &mock_helper_, 340 dispatcher_.get(), config_, 1, client_address, &mock_helper_,
345 &mock_alarm_factory_, &crypto_config_, 341 &mock_alarm_factory_, &crypto_config_,
346 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 342 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
347 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 343 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
348 ProcessUdpPacket(_, _, _)) 344 ProcessUdpPacket(_, _, _))
349 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 345 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
350 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 346 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
351 ProcessPacket(client_address, 1, true, false, SerializeCHLO()); 347 ProcessPacket(client_address, 1, true, SerializeCHLO());
352 EXPECT_EQ(client_address, dispatcher_->current_client_address()); 348 EXPECT_EQ(client_address, dispatcher_->current_client_address());
353 EXPECT_EQ(server_address_, dispatcher_->current_server_address()); 349 EXPECT_EQ(server_address_, dispatcher_->current_server_address());
354 350
355 EXPECT_CALL(*dispatcher_, CreateQuicSession(2, client_address)) 351 EXPECT_CALL(*dispatcher_, CreateQuicSession(2, client_address))
356 .WillOnce(testing::Return(CreateSession( 352 .WillOnce(testing::Return(CreateSession(
357 dispatcher_.get(), config_, 2, client_address, &mock_helper_, 353 dispatcher_.get(), config_, 2, client_address, &mock_helper_,
358 &mock_alarm_factory_, &crypto_config_, 354 &mock_alarm_factory_, &crypto_config_,
359 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session2_))); 355 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session2_)));
360 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session2_->connection()), 356 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session2_->connection()),
361 ProcessUdpPacket(_, _, _)) 357 ProcessUdpPacket(_, _, _))
362 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 358 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
363 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2)))); 359 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2))));
364 ProcessPacket(client_address, 2, true, false, SerializeCHLO()); 360 ProcessPacket(client_address, 2, true, SerializeCHLO());
365 361
366 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 362 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
367 ProcessUdpPacket(_, _, _)) 363 ProcessUdpPacket(_, _, _))
368 .Times(1) 364 .Times(1)
369 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 365 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
370 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 366 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
371 ProcessPacket(client_address, 1, false, false, "data"); 367 ProcessPacket(client_address, 1, false, "data");
372 } 368 }
373 369
374 TEST_F(QuicDispatcherTest, StatelessVersionNegotiation) { 370 TEST_F(QuicDispatcherTest, StatelessVersionNegotiation) {
375 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 371 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
376 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 372 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
377 373
378 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)).Times(0); 374 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)).Times(0);
379 QuicVersion version = static_cast<QuicVersion>(QuicVersionMin() - 1); 375 QuicVersion version = static_cast<QuicVersion>(QuicVersionMin() - 1);
380 ProcessPacket(client_address, 1, true, version, SerializeCHLO(), 376 ProcessPacket(client_address, 1, true, version, SerializeCHLO(),
381 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1); 377 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1);
382 } 378 }
383 379
384 TEST_F(QuicDispatcherTest, Shutdown) { 380 TEST_F(QuicDispatcherTest, Shutdown) {
385 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 381 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
386 382
387 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address)) 383 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address))
388 .WillOnce(testing::Return(CreateSession( 384 .WillOnce(testing::Return(CreateSession(
389 dispatcher_.get(), config_, 1, client_address, &mock_helper_, 385 dispatcher_.get(), config_, 1, client_address, &mock_helper_,
390 &mock_alarm_factory_, &crypto_config_, 386 &mock_alarm_factory_, &crypto_config_,
391 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 387 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
392 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 388 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
393 ProcessUdpPacket(_, _, _)) 389 ProcessUdpPacket(_, _, _))
394 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 390 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
395 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 391 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
396 392
397 ProcessPacket(client_address, 1, true, false, SerializeCHLO()); 393 ProcessPacket(client_address, 1, true, SerializeCHLO());
398 394
399 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 395 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
400 CloseConnection(QUIC_PEER_GOING_AWAY, _, _)); 396 CloseConnection(QUIC_PEER_GOING_AWAY, _, _));
401 397
402 dispatcher_->Shutdown(); 398 dispatcher_->Shutdown();
403 } 399 }
404 400
405 TEST_F(QuicDispatcherTest, TimeWaitListManager) { 401 TEST_F(QuicDispatcherTest, TimeWaitListManager) {
406 CreateTimeWaitListManager(); 402 CreateTimeWaitListManager();
407 403
408 // Create a new session. 404 // Create a new session.
409 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 405 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
410 QuicConnectionId connection_id = 1; 406 QuicConnectionId connection_id = 1;
411 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) 407 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address))
412 .WillOnce(testing::Return(CreateSession( 408 .WillOnce(testing::Return(CreateSession(
413 dispatcher_.get(), config_, connection_id, client_address, 409 dispatcher_.get(), config_, connection_id, client_address,
414 &mock_helper_, &mock_alarm_factory_, &crypto_config_, 410 &mock_helper_, &mock_alarm_factory_, &crypto_config_,
415 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 411 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
416 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 412 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
417 ProcessUdpPacket(_, _, _)) 413 ProcessUdpPacket(_, _, _))
418 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 414 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
419 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 415 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
420 416
421 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO()); 417 ProcessPacket(client_address, connection_id, true, SerializeCHLO());
422 418
423 // Close the connection by sending public reset packet. 419 // Close the connection by sending public reset packet.
424 QuicPublicResetPacket packet; 420 QuicPublicResetPacket packet;
425 packet.public_header.connection_id = connection_id; 421 packet.public_header.connection_id = connection_id;
426 packet.public_header.reset_flag = true; 422 packet.public_header.reset_flag = true;
427 packet.public_header.version_flag = false; 423 packet.public_header.version_flag = false;
428 packet.rejected_packet_number = 19191; 424 packet.rejected_packet_number = 19191;
429 packet.nonce_proof = 132232; 425 packet.nonce_proof = 132232;
430 std::unique_ptr<QuicEncryptedPacket> encrypted( 426 std::unique_ptr<QuicEncryptedPacket> encrypted(
431 QuicFramer::BuildPublicResetPacket(packet)); 427 QuicFramer::BuildPublicResetPacket(packet));
(...skipping 13 matching lines...) Expand all
445 dispatcher_->ProcessPacket(QuicSocketAddress(), client_address, *received); 441 dispatcher_->ProcessPacket(QuicSocketAddress(), client_address, *received);
446 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); 442 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
447 443
448 // Dispatcher forwards subsequent packets for this connection_id to the time 444 // Dispatcher forwards subsequent packets for this connection_id to the time
449 // wait list manager. 445 // wait list manager.
450 EXPECT_CALL(*time_wait_list_manager_, 446 EXPECT_CALL(*time_wait_list_manager_,
451 ProcessPacket(_, _, connection_id, _, _)) 447 ProcessPacket(_, _, connection_id, _, _))
452 .Times(1); 448 .Times(1);
453 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) 449 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
454 .Times(0); 450 .Times(0);
455 ProcessPacket(client_address, connection_id, true, false, "data"); 451 ProcessPacket(client_address, connection_id, true, "data");
456 } 452 }
457 453
458 TEST_F(QuicDispatcherTest, NoVersionPacketToTimeWaitListManager) { 454 TEST_F(QuicDispatcherTest, NoVersionPacketToTimeWaitListManager) {
459 CreateTimeWaitListManager(); 455 CreateTimeWaitListManager();
460 456
461 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 457 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
462 QuicConnectionId connection_id = 1; 458 QuicConnectionId connection_id = 1;
463 // Dispatcher forwards all packets for this connection_id to the time wait 459 // Dispatcher forwards all packets for this connection_id to the time wait
464 // list manager. 460 // list manager.
465 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0); 461 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0);
466 EXPECT_CALL(*time_wait_list_manager_, 462 EXPECT_CALL(*time_wait_list_manager_,
467 ProcessPacket(_, _, connection_id, _, _)) 463 ProcessPacket(_, _, connection_id, _, _))
468 .Times(1); 464 .Times(1);
469 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) 465 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
470 .Times(1); 466 .Times(1);
471 ProcessPacket(client_address, connection_id, false, false, SerializeCHLO()); 467 ProcessPacket(client_address, connection_id, false, SerializeCHLO());
472 } 468 }
473 469
474 TEST_F(QuicDispatcherTest, ProcessPacketWithZeroPort) { 470 TEST_F(QuicDispatcherTest, ProcessPacketWithZeroPort) {
475 CreateTimeWaitListManager(); 471 CreateTimeWaitListManager();
476 472
477 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 0); 473 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 0);
478 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 474 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
479 475
480 // dispatcher_ should drop this packet. 476 // dispatcher_ should drop this packet.
481 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)).Times(0); 477 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)).Times(0);
482 EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0); 478 EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
483 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) 479 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
484 .Times(0); 480 .Times(0);
485 ProcessPacket(client_address, 1, true, false, SerializeCHLO()); 481 ProcessPacket(client_address, 1, true, SerializeCHLO());
486 } 482 }
487 483
488 TEST_F(QuicDispatcherTest, OKSeqNoPacketProcessed) { 484 TEST_F(QuicDispatcherTest, OKSeqNoPacketProcessed) {
489 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 485 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
490 QuicConnectionId connection_id = 1; 486 QuicConnectionId connection_id = 1;
491 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 487 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
492 488
493 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address)) 489 EXPECT_CALL(*dispatcher_, CreateQuicSession(1, client_address))
494 .WillOnce(testing::Return(CreateSession( 490 .WillOnce(testing::Return(CreateSession(
495 dispatcher_.get(), config_, 1, client_address, &mock_helper_, 491 dispatcher_.get(), config_, 1, client_address, &mock_helper_,
496 &mock_alarm_factory_, &crypto_config_, 492 &mock_alarm_factory_, &crypto_config_,
497 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 493 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
498 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 494 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
499 ProcessUdpPacket(_, _, _)) 495 ProcessUdpPacket(_, _, _))
500 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 496 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
501 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 497 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
502 // A packet whose packet number is the largest that is allowed to start a 498 // A packet whose packet number is the largest that is allowed to start a
503 // connection. 499 // connection.
504 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO(), 500 ProcessPacket(client_address, connection_id, true, SerializeCHLO(),
505 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 501 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
506 QuicDispatcher::kMaxReasonableInitialPacketNumber); 502 QuicDispatcher::kMaxReasonableInitialPacketNumber);
507 EXPECT_EQ(client_address, dispatcher_->current_client_address()); 503 EXPECT_EQ(client_address, dispatcher_->current_client_address());
508 EXPECT_EQ(server_address_, dispatcher_->current_server_address()); 504 EXPECT_EQ(server_address_, dispatcher_->current_server_address());
509 } 505 }
510 506
511 TEST_F(QuicDispatcherTest, TooBigSeqNoPacketToTimeWaitListManager) { 507 TEST_F(QuicDispatcherTest, TooBigSeqNoPacketToTimeWaitListManager) {
512 CreateTimeWaitListManager(); 508 CreateTimeWaitListManager();
513 509
514 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 510 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
515 QuicConnectionId connection_id = 1; 511 QuicConnectionId connection_id = 1;
516 // Dispatcher forwards this packet for this connection_id to the time wait 512 // Dispatcher forwards this packet for this connection_id to the time wait
517 // list manager. 513 // list manager.
518 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0); 514 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0);
519 EXPECT_CALL(*time_wait_list_manager_, 515 EXPECT_CALL(*time_wait_list_manager_,
520 ProcessPacket(_, _, connection_id, _, _)) 516 ProcessPacket(_, _, connection_id, _, _))
521 .Times(1); 517 .Times(1);
522 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) 518 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
523 .Times(1); 519 .Times(1);
524 // A packet whose packet number is one to large to be allowed to start a 520 // A packet whose packet number is one to large to be allowed to start a
525 // connection. 521 // connection.
526 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO(), 522 ProcessPacket(client_address, connection_id, true, SerializeCHLO(),
527 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 523 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
528 QuicDispatcher::kMaxReasonableInitialPacketNumber + 1); 524 QuicDispatcher::kMaxReasonableInitialPacketNumber + 1);
529 } 525 }
530 526
531 TEST_F(QuicDispatcherTest, SupportedVersionsChangeInFlight) { 527 TEST_F(QuicDispatcherTest, SupportedVersionsChangeInFlight) {
532 static_assert(arraysize(kSupportedQuicVersions) == 5u, 528 static_assert(arraysize(kSupportedQuicVersions) == 5u,
533 "Supported versions out of sync"); 529 "Supported versions out of sync");
534 FLAGS_quic_reloadable_flag_quic_disable_version_34 = false; 530 FLAGS_quic_reloadable_flag_quic_disable_version_34 = false;
535 FLAGS_quic_reloadable_flag_quic_enable_version_36_v3 = true; 531 FLAGS_quic_reloadable_flag_quic_enable_version_36_v3 = true;
536 FLAGS_quic_reloadable_flag_quic_enable_version_37 = true; 532 FLAGS_quic_reloadable_flag_quic_enable_version_37 = true;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 QuicConnectionId connection_id = 1; 751 QuicConnectionId connection_id = 1;
756 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) 752 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address))
757 .WillOnce(testing::Return( 753 .WillOnce(testing::Return(
758 CreateSessionBasedOnTestParams(connection_id, client_address))); 754 CreateSessionBasedOnTestParams(connection_id, client_address)));
759 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 755 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
760 ProcessUdpPacket(_, _, _)) 756 ProcessUdpPacket(_, _, _))
761 .WillOnce(testing::WithArgs<2>( 757 .WillOnce(testing::WithArgs<2>(
762 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 758 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
763 base::Unretained(this), connection_id)))); 759 base::Unretained(this), connection_id))));
764 // Process the first packet for the connection. 760 // Process the first packet for the connection.
765 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO()); 761 ProcessPacket(client_address, connection_id, true, SerializeCHLO());
766 if (ExpectStatelessReject()) { 762 if (ExpectStatelessReject()) {
767 // If this is a stateless reject, the crypto stream will close the 763 // If this is a stateless reject, the crypto stream will close the
768 // connection. 764 // connection.
769 session1_->connection()->CloseConnection( 765 session1_->connection()->CloseConnection(
770 QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, "stateless reject", 766 QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, "stateless reject",
771 ConnectionCloseBehavior::SILENT_CLOSE); 767 ConnectionCloseBehavior::SILENT_CLOSE);
772 } 768 }
773 769
774 // Send a second packet and check the results. If this is a stateless reject, 770 // Send a second packet and check the results. If this is a stateless reject,
775 // the existing connection_id will go on the time-wait list. 771 // the existing connection_id will go on the time-wait list.
776 EXPECT_EQ(ExpectStatelessReject(), 772 EXPECT_EQ(ExpectStatelessReject(),
777 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); 773 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
778 if (ExpectStatelessReject()) { 774 if (ExpectStatelessReject()) {
779 // The second packet will be processed on the time-wait list. 775 // The second packet will be processed on the time-wait list.
780 EXPECT_CALL(*time_wait_list_manager_, 776 EXPECT_CALL(*time_wait_list_manager_,
781 ProcessPacket(_, _, connection_id, _, _)) 777 ProcessPacket(_, _, connection_id, _, _))
782 .Times(1); 778 .Times(1);
783 } else { 779 } else {
784 // The second packet will trigger a packet-validation 780 // The second packet will trigger a packet-validation
785 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 781 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
786 ProcessUdpPacket(_, _, _)) 782 ProcessUdpPacket(_, _, _))
787 .Times(1) 783 .Times(1)
788 .WillOnce(testing::WithArgs<2>( 784 .WillOnce(testing::WithArgs<2>(
789 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 785 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
790 base::Unretained(this), connection_id)))); 786 base::Unretained(this), connection_id))));
791 } 787 }
792 ProcessPacket(client_address, connection_id, true, false, "data"); 788 ProcessPacket(client_address, connection_id, true, "data");
793 } 789 }
794 790
795 TEST_P(QuicDispatcherStatelessRejectTest, CheapRejects) { 791 TEST_P(QuicDispatcherStatelessRejectTest, CheapRejects) {
796 FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects = true; 792 FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects = true;
797 CreateTimeWaitListManager(); 793 CreateTimeWaitListManager();
798 794
799 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 795 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
800 QuicConnectionId connection_id = 1; 796 QuicConnectionId connection_id = 1;
801 if (GetParam().enable_stateless_rejects_via_flag) { 797 if (GetParam().enable_stateless_rejects_via_flag) {
802 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) 798 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address))
(...skipping 12 matching lines...) Expand all
815 QUIC_LOG(INFO) << "Params: " << GetParam(); 811 QUIC_LOG(INFO) << "Params: " << GetParam();
816 // Process the first packet for the connection. 812 // Process the first packet for the connection.
817 CryptoHandshakeMessage client_hello = 813 CryptoHandshakeMessage client_hello =
818 crypto_test_utils::CreateCHLO({{"AEAD", "AESG"}, 814 crypto_test_utils::CreateCHLO({{"AEAD", "AESG"},
819 {"KEXS", "C255"}, 815 {"KEXS", "C255"},
820 {"COPT", "SREJ"}, 816 {"COPT", "SREJ"},
821 {"NONC", "1234567890123456789012"}, 817 {"NONC", "1234567890123456789012"},
822 {"VER\0", "Q025"}}, 818 {"VER\0", "Q025"}},
823 kClientHelloMinimumSize); 819 kClientHelloMinimumSize);
824 820
825 ProcessPacket(client_address, connection_id, true, false, 821 ProcessPacket(client_address, connection_id, true,
826 client_hello.GetSerialized().AsStringPiece().as_string()); 822 client_hello.GetSerialized().AsStringPiece().as_string());
827 823
828 if (GetParam().enable_stateless_rejects_via_flag) { 824 if (GetParam().enable_stateless_rejects_via_flag) {
829 EXPECT_EQ(true, 825 EXPECT_EQ(true,
830 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); 826 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
831 } 827 }
832 } 828 }
833 829
834 TEST_P(QuicDispatcherStatelessRejectTest, BufferNonChlo) { 830 TEST_P(QuicDispatcherStatelessRejectTest, BufferNonChlo) {
835 FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects = true; 831 FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects = true;
836 CreateTimeWaitListManager(); 832 CreateTimeWaitListManager();
837 833
838 const QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 834 const QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
839 const QuicConnectionId connection_id = 1; 835 const QuicConnectionId connection_id = 1;
840 836
841 ProcessPacket(client_address, connection_id, true, false, 837 ProcessPacket(client_address, connection_id, true, "NOT DATA FOR A CHLO");
842 "NOT DATA FOR A CHLO");
843 838
844 // Process the first packet for the connection. 839 // Process the first packet for the connection.
845 CryptoHandshakeMessage client_hello = 840 CryptoHandshakeMessage client_hello =
846 crypto_test_utils::CreateCHLO({{"AEAD", "AESG"}, 841 crypto_test_utils::CreateCHLO({{"AEAD", "AESG"},
847 {"KEXS", "C255"}, 842 {"KEXS", "C255"},
848 {"NONC", "1234567890123456789012"}, 843 {"NONC", "1234567890123456789012"},
849 {"VER\0", "Q025"}}, 844 {"VER\0", "Q025"}},
850 kClientHelloMinimumSize); 845 kClientHelloMinimumSize);
851 846
852 // If stateless rejects are enabled then a connection will be created now 847 // If stateless rejects are enabled then a connection will be created now
853 // and the buffered packet will be processed 848 // and the buffered packet will be processed
854 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) 849 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address))
855 .WillOnce(testing::Return( 850 .WillOnce(testing::Return(
856 CreateSessionBasedOnTestParams(connection_id, client_address))); 851 CreateSessionBasedOnTestParams(connection_id, client_address)));
857 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 852 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
858 ProcessUdpPacket(_, client_address, _)) 853 ProcessUdpPacket(_, client_address, _))
859 .WillOnce(testing::WithArg<2>( 854 .WillOnce(testing::WithArg<2>(
860 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 855 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
861 base::Unretained(this), connection_id)))); 856 base::Unretained(this), connection_id))));
862 // Expect both packets to be passed to ProcessUdpPacket(). And one of them 857 // Expect both packets to be passed to ProcessUdpPacket(). And one of them
863 // is already expected in CreateSessionBasedOnTestParams(). 858 // is already expected in CreateSessionBasedOnTestParams().
864 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 859 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
865 ProcessUdpPacket(_, client_address, _)) 860 ProcessUdpPacket(_, client_address, _))
866 .WillOnce(testing::WithArg<2>( 861 .WillOnce(testing::WithArg<2>(
867 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 862 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
868 base::Unretained(this), connection_id)))) 863 base::Unretained(this), connection_id))))
869 .RetiresOnSaturation(); 864 .RetiresOnSaturation();
870 ProcessPacket(client_address, connection_id, true, false, 865 ProcessPacket(client_address, connection_id, true,
871 client_hello.GetSerialized().AsStringPiece().as_string()); 866 client_hello.GetSerialized().AsStringPiece().as_string());
872 EXPECT_FALSE( 867 EXPECT_FALSE(
873 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); 868 time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
874 } 869 }
875 870
876 // Verify the stopgap test: Packets with truncated connection IDs should be 871 // Verify the stopgap test: Packets with truncated connection IDs should be
877 // dropped. 872 // dropped.
878 class QuicDispatcherTestStrayPacketConnectionId : public QuicDispatcherTest {}; 873 class QuicDispatcherTestStrayPacketConnectionId : public QuicDispatcherTest {};
879 874
880 // Packets with truncated connection IDs should be dropped. 875 // Packets with truncated connection IDs should be dropped.
881 TEST_F(QuicDispatcherTestStrayPacketConnectionId, 876 TEST_F(QuicDispatcherTestStrayPacketConnectionId,
882 StrayPacketTruncatedConnectionId) { 877 StrayPacketTruncatedConnectionId) {
883 CreateTimeWaitListManager(); 878 CreateTimeWaitListManager();
884 879
885 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 880 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
886 QuicConnectionId connection_id = 1; 881 QuicConnectionId connection_id = 1;
887 // Dispatcher drops this packet. 882 // Dispatcher drops this packet.
888 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0); 883 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _)).Times(0);
889 EXPECT_CALL(*time_wait_list_manager_, 884 EXPECT_CALL(*time_wait_list_manager_,
890 ProcessPacket(_, _, connection_id, _, _)) 885 ProcessPacket(_, _, connection_id, _, _))
891 .Times(0); 886 .Times(0);
892 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) 887 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
893 .Times(0); 888 .Times(0);
894 ProcessPacket(client_address, connection_id, true, false, "data", 889 ProcessPacket(client_address, connection_id, true, "data",
895 PACKET_0BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER); 890 PACKET_0BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER);
896 } 891 }
897 892
898 class BlockingWriter : public QuicPacketWriterWrapper { 893 class BlockingWriter : public QuicPacketWriterWrapper {
899 public: 894 public:
900 BlockingWriter() : write_blocked_(false) {} 895 BlockingWriter() : write_blocked_(false) {}
901 896
902 bool IsWriteBlocked() const override { return write_blocked_; } 897 bool IsWriteBlocked() const override { return write_blocked_; }
903 void SetWritable() override { write_blocked_ = false; } 898 void SetWritable() override { write_blocked_ = false; }
904 899
(...skipping 23 matching lines...) Expand all
928 923
929 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address)) 924 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address))
930 .WillOnce(testing::Return(CreateSession( 925 .WillOnce(testing::Return(CreateSession(
931 dispatcher_.get(), config_, 1, client_address, &helper_, 926 dispatcher_.get(), config_, 1, client_address, &helper_,
932 &alarm_factory_, &crypto_config_, 927 &alarm_factory_, &crypto_config_,
933 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 928 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
934 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 929 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
935 ProcessUdpPacket(_, _, _)) 930 ProcessUdpPacket(_, _, _))
936 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 931 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
937 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1)))); 932 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 1))));
938 ProcessPacket(client_address, 1, true, false, SerializeCHLO()); 933 ProcessPacket(client_address, 1, true, SerializeCHLO());
939 934
940 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address)) 935 EXPECT_CALL(*dispatcher_, CreateQuicSession(_, client_address))
941 .WillOnce(testing::Return(CreateSession( 936 .WillOnce(testing::Return(CreateSession(
942 dispatcher_.get(), config_, 2, client_address, &helper_, 937 dispatcher_.get(), config_, 2, client_address, &helper_,
943 &alarm_factory_, &crypto_config_, 938 &alarm_factory_, &crypto_config_,
944 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session2_))); 939 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session2_)));
945 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session2_->connection()), 940 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session2_->connection()),
946 ProcessUdpPacket(_, _, _)) 941 ProcessUdpPacket(_, _, _))
947 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor( 942 .WillOnce(testing::WithArgs<2>(Invoke(CreateFunctor(
948 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2)))); 943 &QuicDispatcherTest::ValidatePacket, base::Unretained(this), 2))));
949 ProcessPacket(client_address, 2, true, false, SerializeCHLO()); 944 ProcessPacket(client_address, 2, true, SerializeCHLO());
950 945
951 blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(dispatcher_.get()); 946 blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(dispatcher_.get());
952 } 947 }
953 948
954 void TearDown() override { 949 void TearDown() override {
955 EXPECT_CALL(*connection1(), CloseConnection(QUIC_PEER_GOING_AWAY, _, _)); 950 EXPECT_CALL(*connection1(), CloseConnection(QUIC_PEER_GOING_AWAY, _, _));
956 EXPECT_CALL(*connection2(), CloseConnection(QUIC_PEER_GOING_AWAY, _, _)); 951 EXPECT_CALL(*connection2(), CloseConnection(QUIC_PEER_GOING_AWAY, _, _));
957 dispatcher_->Shutdown(); 952 dispatcher_->Shutdown();
958 } 953 }
959 954
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketsUptoLimitAndProcessChlo) { 1183 TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketsUptoLimitAndProcessChlo) {
1189 InSequence s; 1184 InSequence s;
1190 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 1185 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
1191 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 1186 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
1192 QuicConnectionId conn_id = 1; 1187 QuicConnectionId conn_id = 1;
1193 // A bunch of non-CHLO should be buffered upon arrival, and the first one 1188 // A bunch of non-CHLO should be buffered upon arrival, and the first one
1194 // should trigger ShouldCreateOrBufferPacketForConnection(). 1189 // should trigger ShouldCreateOrBufferPacketForConnection().
1195 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id)) 1190 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id))
1196 .Times(1); 1191 .Times(1);
1197 for (size_t i = 1; i <= kDefaultMaxUndecryptablePackets + 1; ++i) { 1192 for (size_t i = 1; i <= kDefaultMaxUndecryptablePackets + 1; ++i) {
1198 ProcessPacket(client_address, conn_id, true, false, 1193 ProcessPacket(client_address, conn_id, true,
1199 QuicStrCat("data packet ", i + 1), PACKET_8BYTE_CONNECTION_ID, 1194 QuicStrCat("data packet ", i + 1), PACKET_8BYTE_CONNECTION_ID,
1200 PACKET_6BYTE_PACKET_NUMBER, /*packet_number=*/i + 1); 1195 PACKET_6BYTE_PACKET_NUMBER, /*packet_number=*/i + 1);
1201 } 1196 }
1202 EXPECT_EQ(0u, dispatcher_->session_map().size()) 1197 EXPECT_EQ(0u, dispatcher_->session_map().size())
1203 << "No session should be created before CHLO arrives."; 1198 << "No session should be created before CHLO arrives.";
1204 1199
1205 // Pop out the last packet as it is also be dropped by the store. 1200 // Pop out the last packet as it is also be dropped by the store.
1206 data_connection_map_[conn_id].pop_back(); 1201 data_connection_map_[conn_id].pop_back();
1207 // When CHLO arrives, a new session should be created, and all packets 1202 // When CHLO arrives, a new session should be created, and all packets
1208 // buffered should be delivered to the session. 1203 // buffered should be delivered to the session.
1209 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address)) 1204 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address))
1210 .WillOnce(testing::Return(CreateSession( 1205 .WillOnce(testing::Return(CreateSession(
1211 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_, 1206 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_,
1212 &mock_alarm_factory_, &crypto_config_, 1207 &mock_alarm_factory_, &crypto_config_,
1213 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1208 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1214 1209
1215 // Only |kDefaultMaxUndecryptablePackets| packets were buffered, and they 1210 // Only |kDefaultMaxUndecryptablePackets| packets were buffered, and they
1216 // should be delivered in arrival order. 1211 // should be delivered in arrival order.
1217 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1212 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1218 ProcessUdpPacket(_, _, _)) 1213 ProcessUdpPacket(_, _, _))
1219 .Times(kDefaultMaxUndecryptablePackets + 1) // + 1 for CHLO. 1214 .Times(kDefaultMaxUndecryptablePackets + 1) // + 1 for CHLO.
1220 .WillRepeatedly(testing::WithArg<2>( 1215 .WillRepeatedly(testing::WithArg<2>(
1221 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1216 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1222 base::Unretained(this), conn_id)))); 1217 base::Unretained(this), conn_id))));
1223 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1218 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1224 } 1219 }
1225 1220
1226 TEST_P(BufferedPacketStoreTest, 1221 TEST_P(BufferedPacketStoreTest,
1227 ProcessNonChloPacketsForDifferentConnectionsUptoLimit) { 1222 ProcessNonChloPacketsForDifferentConnectionsUptoLimit) {
1228 InSequence s; 1223 InSequence s;
1229 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 1224 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
1230 // A bunch of non-CHLO should be buffered upon arrival. 1225 // A bunch of non-CHLO should be buffered upon arrival.
1231 size_t kNumConnections = 1226 size_t kNumConnections =
1232 (FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop 1227 (FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop
1233 ? kMaxConnectionsWithoutCHLO 1228 ? kMaxConnectionsWithoutCHLO
1234 : kDefaultMaxConnectionsInStore) + 1229 : kDefaultMaxConnectionsInStore) +
1235 1; 1230 1;
1236 for (size_t i = 1; i <= kNumConnections; ++i) { 1231 for (size_t i = 1; i <= kNumConnections; ++i) {
1237 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), i); 1232 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), i);
1238 QuicConnectionId conn_id = i; 1233 QuicConnectionId conn_id = i;
1239 if (FLAGS_quic_reloadable_flag_quic_create_session_after_insertion) { 1234 if (FLAGS_quic_reloadable_flag_quic_create_session_after_insertion) {
1240 EXPECT_CALL(*dispatcher_, 1235 EXPECT_CALL(*dispatcher_,
1241 ShouldCreateOrBufferPacketForConnection(conn_id)); 1236 ShouldCreateOrBufferPacketForConnection(conn_id));
1242 } else { 1237 } else {
1243 if (i <= kNumConnections - 1) { 1238 if (i <= kNumConnections - 1) {
1244 // As they are on different connection, they should trigger 1239 // As they are on different connection, they should trigger
1245 // ShouldCreateOrBufferPacketForConnection(). The last packet should be 1240 // ShouldCreateOrBufferPacketForConnection(). The last packet should be
1246 // dropped. 1241 // dropped.
1247 EXPECT_CALL(*dispatcher_, 1242 EXPECT_CALL(*dispatcher_,
1248 ShouldCreateOrBufferPacketForConnection(conn_id)); 1243 ShouldCreateOrBufferPacketForConnection(conn_id));
1249 } 1244 }
1250 } 1245 }
1251 ProcessPacket(client_address, conn_id, true, false, 1246 ProcessPacket(client_address, conn_id, true,
1252 QuicStrCat("data packet on connection ", i), 1247 QuicStrCat("data packet on connection ", i),
1253 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1248 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
1254 /*packet_number=*/2); 1249 /*packet_number=*/2);
1255 } 1250 }
1256 1251
1257 // Pop out the packet on last connection as it shouldn't be enqueued in store 1252 // Pop out the packet on last connection as it shouldn't be enqueued in store
1258 // as well. 1253 // as well.
1259 data_connection_map_[kNumConnections].pop_front(); 1254 data_connection_map_[kNumConnections].pop_front();
1260 1255
1261 // Reset session creation counter to ensure processing CHLO can always 1256 // Reset session creation counter to ensure processing CHLO can always
(...skipping 30 matching lines...) Expand all
1292 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop 1287 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop
1293 ? kMaxConnectionsWithoutCHLO 1288 ? kMaxConnectionsWithoutCHLO
1294 : kDefaultMaxConnectionsInStore; 1289 : kDefaultMaxConnectionsInStore;
1295 size_t num_packet_to_process = i <= upper_limit ? 2u : 1u; 1290 size_t num_packet_to_process = i <= upper_limit ? 2u : 1u;
1296 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1291 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1297 ProcessUdpPacket(_, client_address, _)) 1292 ProcessUdpPacket(_, client_address, _))
1298 .Times(num_packet_to_process) 1293 .Times(num_packet_to_process)
1299 .WillRepeatedly(testing::WithArg<2>( 1294 .WillRepeatedly(testing::WithArg<2>(
1300 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1295 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1301 base::Unretained(this), conn_id)))); 1296 base::Unretained(this), conn_id))));
1302 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1297 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1303 } 1298 }
1304 } 1299 }
1305 1300
1306 // Tests that store delivers empty packet list if CHLO arrives firstly. 1301 // Tests that store delivers empty packet list if CHLO arrives firstly.
1307 TEST_P(BufferedPacketStoreTest, DeliverEmptyPackets) { 1302 TEST_P(BufferedPacketStoreTest, DeliverEmptyPackets) {
1308 QuicConnectionId conn_id = 1; 1303 QuicConnectionId conn_id = 1;
1309 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 1304 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
1310 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id)); 1305 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id));
1311 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address)) 1306 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address))
1312 .WillOnce(testing::Return(CreateSession( 1307 .WillOnce(testing::Return(CreateSession(
1313 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_, 1308 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_,
1314 &mock_alarm_factory_, &crypto_config_, 1309 &mock_alarm_factory_, &crypto_config_,
1315 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1310 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1316 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1311 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1317 } 1312 }
1318 1313
1319 // Tests that a retransmitted CHLO arrives after a connection for the 1314 // Tests that a retransmitted CHLO arrives after a connection for the
1320 // CHLO has been created. 1315 // CHLO has been created.
1321 TEST_P(BufferedPacketStoreTest, ReceiveRetransmittedCHLO) { 1316 TEST_P(BufferedPacketStoreTest, ReceiveRetransmittedCHLO) {
1322 InSequence s; 1317 InSequence s;
1323 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 1318 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
1324 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 1319 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
1325 QuicConnectionId conn_id = 1; 1320 QuicConnectionId conn_id = 1;
1326 ProcessPacket(client_address, conn_id, true, false, 1321 ProcessPacket(client_address, conn_id, true, QuicStrCat("data packet ", 2),
1327 QuicStrCat("data packet ", 2), PACKET_8BYTE_CONNECTION_ID, 1322 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
1328 PACKET_6BYTE_PACKET_NUMBER, /*packet_number=*/2); 1323 /*packet_number=*/2);
1329 1324
1330 // When CHLO arrives, a new session should be created, and all packets 1325 // When CHLO arrives, a new session should be created, and all packets
1331 // buffered should be delivered to the session. 1326 // buffered should be delivered to the session.
1332 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address)) 1327 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_address))
1333 .Times(1) // Only triggered by 1st CHLO. 1328 .Times(1) // Only triggered by 1st CHLO.
1334 .WillOnce(testing::Return(CreateSession( 1329 .WillOnce(testing::Return(CreateSession(
1335 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_, 1330 dispatcher_.get(), config_, conn_id, client_address, &mock_helper_,
1336 &mock_alarm_factory_, &crypto_config_, 1331 &mock_alarm_factory_, &crypto_config_,
1337 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1332 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1338 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1333 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1339 ProcessUdpPacket(_, _, _)) 1334 ProcessUdpPacket(_, _, _))
1340 .Times(3) // Triggered by 1 data packet and 2 CHLOs. 1335 .Times(3) // Triggered by 1 data packet and 2 CHLOs.
1341 .WillRepeatedly(testing::WithArg<2>( 1336 .WillRepeatedly(testing::WithArg<2>(
1342 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1337 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1343 base::Unretained(this), conn_id)))); 1338 base::Unretained(this), conn_id))));
1344 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1339 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1345 1340
1346 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1341 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1347 } 1342 }
1348 1343
1349 // Tests that expiration of a connection add connection id to time wait list. 1344 // Tests that expiration of a connection add connection id to time wait list.
1350 TEST_P(BufferedPacketStoreTest, ReceiveCHLOAfterExpiration) { 1345 TEST_P(BufferedPacketStoreTest, ReceiveCHLOAfterExpiration) {
1351 InSequence s; 1346 InSequence s;
1352 CreateTimeWaitListManager(); 1347 CreateTimeWaitListManager();
1353 QuicBufferedPacketStore* store = 1348 QuicBufferedPacketStore* store =
1354 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get()); 1349 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get());
1355 QuicBufferedPacketStorePeer::set_clock(store, mock_helper_.GetClock()); 1350 QuicBufferedPacketStorePeer::set_clock(store, mock_helper_.GetClock());
1356 1351
1357 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); 1352 QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
1358 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5); 1353 server_address_ = QuicSocketAddress(QuicIpAddress::Any4(), 5);
1359 QuicConnectionId conn_id = 1; 1354 QuicConnectionId conn_id = 1;
1360 ProcessPacket(client_address, conn_id, true, false, 1355 ProcessPacket(client_address, conn_id, true, QuicStrCat("data packet ", 2),
1361 QuicStrCat("data packet ", 2), PACKET_8BYTE_CONNECTION_ID, 1356 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
1362 PACKET_6BYTE_PACKET_NUMBER, /*packet_number=*/2); 1357 /*packet_number=*/2);
1363 1358
1364 mock_helper_.AdvanceTime( 1359 mock_helper_.AdvanceTime(
1365 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs)); 1360 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs));
1366 QuicAlarm* alarm = QuicBufferedPacketStorePeer::expiration_alarm(store); 1361 QuicAlarm* alarm = QuicBufferedPacketStorePeer::expiration_alarm(store);
1367 // Cancel alarm as if it had been fired. 1362 // Cancel alarm as if it had been fired.
1368 alarm->Cancel(); 1363 alarm->Cancel();
1369 store->OnExpirationTimeout(); 1364 store->OnExpirationTimeout();
1370 // New arrived CHLO will be dropped because this connection is in time wait 1365 // New arrived CHLO will be dropped because this connection is in time wait
1371 // list. 1366 // list.
1372 ASSERT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); 1367 ASSERT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id));
1373 EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, conn_id, _, _)); 1368 EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, conn_id, _, _));
1374 ProcessPacket(client_address, conn_id, true, false, SerializeFullCHLO()); 1369 ProcessPacket(client_address, conn_id, true, SerializeFullCHLO());
1375 } 1370 }
1376 1371
1377 TEST_P(BufferedPacketStoreTest, ProcessCHLOsUptoLimitAndBufferTheRest) { 1372 TEST_P(BufferedPacketStoreTest, ProcessCHLOsUptoLimitAndBufferTheRest) {
1378 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop = true; 1373 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop = true;
1379 // Process more than (|kMaxNumSessionsToCreate| + 1374 // Process more than (|kMaxNumSessionsToCreate| +
1380 // |kDefaultMaxConnectionsInStore|) CHLOs, 1375 // |kDefaultMaxConnectionsInStore|) CHLOs,
1381 // the first |kMaxNumSessionsToCreate| should create connections immediately, 1376 // the first |kMaxNumSessionsToCreate| should create connections immediately,
1382 // the next |kDefaultMaxConnectionsInStore| should be buffered, 1377 // the next |kDefaultMaxConnectionsInStore| should be buffered,
1383 // the rest should be dropped. 1378 // the rest should be dropped.
1384 QuicBufferedPacketStore* store = 1379 QuicBufferedPacketStore* store =
(...skipping 18 matching lines...) Expand all
1403 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_, 1398 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_,
1404 &mock_alarm_factory_, &crypto_config_, 1399 &mock_alarm_factory_, &crypto_config_,
1405 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1400 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1406 EXPECT_CALL( 1401 EXPECT_CALL(
1407 *reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1402 *reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1408 ProcessUdpPacket(_, _, _)) 1403 ProcessUdpPacket(_, _, _))
1409 .WillOnce(testing::WithArg<2>( 1404 .WillOnce(testing::WithArg<2>(
1410 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1405 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1411 base::Unretained(this), conn_id)))); 1406 base::Unretained(this), conn_id))));
1412 } 1407 }
1413 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1408 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1414 if (conn_id <= kMaxNumSessionsToCreate + kDefaultMaxConnectionsInStore && 1409 if (conn_id <= kMaxNumSessionsToCreate + kDefaultMaxConnectionsInStore &&
1415 conn_id > kMaxNumSessionsToCreate) { 1410 conn_id > kMaxNumSessionsToCreate) {
1416 EXPECT_TRUE(store->HasChloForConnection(conn_id)); 1411 EXPECT_TRUE(store->HasChloForConnection(conn_id));
1417 } else { 1412 } else {
1418 // First |kMaxNumSessionsToCreate| CHLOs should be passed to new 1413 // First |kMaxNumSessionsToCreate| CHLOs should be passed to new
1419 // connections immediately, and the last CHLO should be dropped as the 1414 // connections immediately, and the last CHLO should be dropped as the
1420 // store is full. 1415 // store is full.
1421 EXPECT_FALSE(store->HasChloForConnection(conn_id)); 1416 EXPECT_FALSE(store->HasChloForConnection(conn_id));
1422 } 1417 }
1423 } 1418 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_, 1457 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_,
1463 &mock_alarm_factory_, &crypto_config_, 1458 &mock_alarm_factory_, &crypto_config_,
1464 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1459 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1465 EXPECT_CALL( 1460 EXPECT_CALL(
1466 *reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1461 *reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1467 ProcessUdpPacket(_, _, _)) 1462 ProcessUdpPacket(_, _, _))
1468 .WillOnce(testing::WithArg<2>( 1463 .WillOnce(testing::WithArg<2>(
1469 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1464 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1470 base::Unretained(this), conn_id)))); 1465 base::Unretained(this), conn_id))));
1471 } 1466 }
1472 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1467 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1473 } 1468 }
1474 // Retransmit CHLO on last connection should be dropped. 1469 // Retransmit CHLO on last connection should be dropped.
1475 QuicConnectionId last_connection = kMaxNumSessionsToCreate + 1; 1470 QuicConnectionId last_connection = kMaxNumSessionsToCreate + 1;
1476 ProcessPacket(client_addr_, last_connection, true, false, 1471 ProcessPacket(client_addr_, last_connection, true, SerializeFullCHLO());
1477 SerializeFullCHLO());
1478 1472
1479 size_t packets_buffered = 2; 1473 size_t packets_buffered = 2;
1480 if (!FLAGS_quic_reloadable_flag_quic_buffer_packets_after_chlo) { 1474 if (!FLAGS_quic_reloadable_flag_quic_buffer_packets_after_chlo) {
1481 // The packet sent above is dropped when flag is off. 1475 // The packet sent above is dropped when flag is off.
1482 packets_buffered = 1; 1476 packets_buffered = 1;
1483 } 1477 }
1484 1478
1485 // Reset counter and process buffered CHLO. 1479 // Reset counter and process buffered CHLO.
1486 EXPECT_CALL(*dispatcher_, CreateQuicSession(last_connection, client_addr_)) 1480 EXPECT_CALL(*dispatcher_, CreateQuicSession(last_connection, client_addr_))
1487 .WillOnce(testing::Return(CreateSession( 1481 .WillOnce(testing::Return(CreateSession(
(...skipping 21 matching lines...) Expand all
1509 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_, 1503 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_,
1510 &mock_alarm_factory_, &crypto_config_, 1504 &mock_alarm_factory_, &crypto_config_,
1511 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1505 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1512 EXPECT_CALL( 1506 EXPECT_CALL(
1513 *reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1507 *reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1514 ProcessUdpPacket(_, _, _)) 1508 ProcessUdpPacket(_, _, _))
1515 .WillOnce(testing::WithArg<2>( 1509 .WillOnce(testing::WithArg<2>(
1516 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1510 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1517 base::Unretained(this), conn_id)))); 1511 base::Unretained(this), conn_id))));
1518 } 1512 }
1519 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1513 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1520 } 1514 }
1521 1515
1522 // Process another |kDefaultMaxUndecryptablePackets| + 1 data packets. The 1516 // Process another |kDefaultMaxUndecryptablePackets| + 1 data packets. The
1523 // last one should be dropped. 1517 // last one should be dropped.
1524 for (QuicPacketNumber packet_number = 2; 1518 for (QuicPacketNumber packet_number = 2;
1525 packet_number <= kDefaultMaxUndecryptablePackets + 2; ++packet_number) { 1519 packet_number <= kDefaultMaxUndecryptablePackets + 2; ++packet_number) {
1526 ProcessPacket(client_addr_, last_connection_id, true, false, "data packet"); 1520 ProcessPacket(client_addr_, last_connection_id, true, "data packet");
1527 } 1521 }
1528 1522
1529 // Reset counter and process buffered CHLO. 1523 // Reset counter and process buffered CHLO.
1530 EXPECT_CALL(*dispatcher_, CreateQuicSession(last_connection_id, client_addr_)) 1524 EXPECT_CALL(*dispatcher_, CreateQuicSession(last_connection_id, client_addr_))
1531 .WillOnce(testing::Return(CreateSession( 1525 .WillOnce(testing::Return(CreateSession(
1532 dispatcher_.get(), config_, last_connection_id, client_addr_, 1526 dispatcher_.get(), config_, last_connection_id, client_addr_,
1533 &mock_helper_, &mock_alarm_factory_, &crypto_config_, 1527 &mock_helper_, &mock_alarm_factory_, &crypto_config_,
1534 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1528 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1535 // Only CHLO and following |kDefaultMaxUndecryptablePackets| data packets 1529 // Only CHLO and following |kDefaultMaxUndecryptablePackets| data packets
1536 // should be process. 1530 // should be process.
1537 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1531 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1538 ProcessUdpPacket(_, _, _)) 1532 ProcessUdpPacket(_, _, _))
1539 .Times(kDefaultMaxUndecryptablePackets + 1) 1533 .Times(kDefaultMaxUndecryptablePackets + 1)
1540 .WillRepeatedly(testing::WithArg<2>( 1534 .WillRepeatedly(testing::WithArg<2>(
1541 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1535 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1542 base::Unretained(this), last_connection_id)))); 1536 base::Unretained(this), last_connection_id))));
1543 dispatcher_->ProcessBufferedChlos(kMaxNumSessionsToCreate); 1537 dispatcher_->ProcessBufferedChlos(kMaxNumSessionsToCreate);
1544 } 1538 }
1545 1539
1546 // Tests that when dispatcher's packet buffer is full, a CHLO on connection 1540 // Tests that when dispatcher's packet buffer is full, a CHLO on connection
1547 // which doesn't have buffered CHLO should be buffered. 1541 // which doesn't have buffered CHLO should be buffered.
1548 TEST_P(BufferedPacketStoreTest, ReceiveCHLOForBufferedConnection) { 1542 TEST_P(BufferedPacketStoreTest, ReceiveCHLOForBufferedConnection) {
1549 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop = true; 1543 FLAGS_quic_reloadable_flag_quic_limit_num_new_sessions_per_epoll_loop = true;
1550 QuicBufferedPacketStore* store = 1544 QuicBufferedPacketStore* store =
1551 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get()); 1545 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get());
1552 1546
1553 QuicConnectionId conn_id = 1; 1547 QuicConnectionId conn_id = 1;
1554 ProcessPacket(client_addr_, conn_id, true, false, "data packet", 1548 ProcessPacket(client_addr_, conn_id, true, "data packet",
1555 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1549 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER,
1556 /*packet_number=*/1); 1550 /*packet_number=*/1);
1557 // Fill packet buffer to full with CHLOs on other connections. Need to feed 1551 // Fill packet buffer to full with CHLOs on other connections. Need to feed
1558 // extra CHLOs because the first |kMaxNumSessionsToCreate| are going to create 1552 // extra CHLOs because the first |kMaxNumSessionsToCreate| are going to create
1559 // session directly. 1553 // session directly.
1560 for (conn_id = 2; 1554 for (conn_id = 2;
1561 conn_id <= kDefaultMaxConnectionsInStore + kMaxNumSessionsToCreate; 1555 conn_id <= kDefaultMaxConnectionsInStore + kMaxNumSessionsToCreate;
1562 ++conn_id) { 1556 ++conn_id) {
1563 if (conn_id <= kMaxNumSessionsToCreate + 1) { 1557 if (conn_id <= kMaxNumSessionsToCreate + 1) {
1564 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_)) 1558 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_))
1565 .WillOnce(testing::Return(CreateSession( 1559 .WillOnce(testing::Return(CreateSession(
1566 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_, 1560 dispatcher_.get(), config_, conn_id, client_addr_, &mock_helper_,
1567 &mock_alarm_factory_, &crypto_config_, 1561 &mock_alarm_factory_, &crypto_config_,
1568 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); 1562 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_)));
1569 EXPECT_CALL( 1563 EXPECT_CALL(
1570 *reinterpret_cast<MockQuicConnection*>(session1_->connection()), 1564 *reinterpret_cast<MockQuicConnection*>(session1_->connection()),
1571 ProcessUdpPacket(_, _, _)) 1565 ProcessUdpPacket(_, _, _))
1572 .WillOnce(testing::WithArg<2>( 1566 .WillOnce(testing::WithArg<2>(
1573 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1567 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1574 base::Unretained(this), conn_id)))); 1568 base::Unretained(this), conn_id))));
1575 } 1569 }
1576 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1570 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1577 } 1571 }
1578 EXPECT_FALSE(store->HasChloForConnection(/*connection_id=*/1)); 1572 EXPECT_FALSE(store->HasChloForConnection(/*connection_id=*/1));
1579 1573
1580 // CHLO on connection 1 should still be buffered. 1574 // CHLO on connection 1 should still be buffered.
1581 ProcessPacket(client_addr_, /*connection_id=*/1, true, false, 1575 ProcessPacket(client_addr_, /*connection_id=*/1, true, SerializeFullCHLO());
1582 SerializeFullCHLO());
1583 EXPECT_TRUE(store->HasChloForConnection(/*connection_id=*/1)); 1576 EXPECT_TRUE(store->HasChloForConnection(/*connection_id=*/1));
1584 } 1577 }
1585 1578
1586 // Test which exercises the async GetProof codepaths, especially in the context 1579 // Test which exercises the async GetProof codepaths, especially in the context
1587 // of stateless rejection. 1580 // of stateless rejection.
1588 class AsyncGetProofTest : public QuicDispatcherTest { 1581 class AsyncGetProofTest : public QuicDispatcherTest {
1589 public: 1582 public:
1590 AsyncGetProofTest() 1583 AsyncGetProofTest()
1591 : QuicDispatcherTest( 1584 : QuicDispatcherTest(
1592 std::unique_ptr<FakeProofSource>(new FakeProofSource())), 1585 std::unique_ptr<FakeProofSource>(new FakeProofSource())),
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1695 EXPECT_CALL(check, Call(2)); 1688 EXPECT_CALL(check, Call(2));
1696 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>( 1689 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(
1697 GetSession(conn_id)->connection()), 1690 GetSession(conn_id)->connection()),
1698 ProcessUdpPacket(_, _, _)) 1691 ProcessUdpPacket(_, _, _))
1699 .WillOnce(testing::WithArg<2>( 1692 .WillOnce(testing::WithArg<2>(
1700 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1693 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1701 base::Unretained(this), conn_id)))); 1694 base::Unretained(this), conn_id))));
1702 } 1695 }
1703 1696
1704 // Send a CHLO that the StatelessRejector will accept. 1697 // Send a CHLO that the StatelessRejector will accept.
1705 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1698 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1706 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1699 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1707 1700
1708 check.Call(1); 1701 check.Call(1);
1709 // Complete the ProofSource::GetProof call and verify that a session is 1702 // Complete the ProofSource::GetProof call and verify that a session is
1710 // created. 1703 // created.
1711 GetFakeProofSource()->InvokePendingCallback(0); 1704 GetFakeProofSource()->InvokePendingCallback(0);
1712 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 1705 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
1713 1706
1714 check.Call(2); 1707 check.Call(2);
1715 // Verify that a data packet gets processed immediately. 1708 // Verify that a data packet gets processed immediately.
1716 ProcessPacket(client_addr_, conn_id, true, false, "My name is Data"); 1709 ProcessPacket(client_addr_, conn_id, true, "My name is Data");
1717 } 1710 }
1718 1711
1719 // Test a simple situation of connections which the StatelessRejector will 1712 // Test a simple situation of connections which the StatelessRejector will
1720 // reject. 1713 // reject.
1721 TEST_F(AsyncGetProofTest, BasicReject) { 1714 TEST_F(AsyncGetProofTest, BasicReject) {
1722 CreateTimeWaitListManager(); 1715 CreateTimeWaitListManager();
1723 1716
1724 QuicConnectionId conn_id = 1; 1717 QuicConnectionId conn_id = 1;
1725 1718
1726 testing::MockFunction<void(int check_point)> check; 1719 testing::MockFunction<void(int check_point)> check;
1727 { 1720 {
1728 InSequence s; 1721 InSequence s;
1729 EXPECT_CALL(check, Call(1)); 1722 EXPECT_CALL(check, Call(1));
1730 EXPECT_CALL(*time_wait_list_manager_, 1723 EXPECT_CALL(*time_wait_list_manager_,
1731 AddConnectionIdToTimeWait(conn_id, _, true, _)); 1724 AddConnectionIdToTimeWait(conn_id, _, true, _));
1732 EXPECT_CALL(*time_wait_list_manager_, 1725 EXPECT_CALL(*time_wait_list_manager_,
1733 ProcessPacket(_, client_addr_, conn_id, _, _)); 1726 ProcessPacket(_, client_addr_, conn_id, _, _));
1734 1727
1735 EXPECT_CALL(check, Call(2)); 1728 EXPECT_CALL(check, Call(2));
1736 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_)) 1729 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_))
1737 .Times(0); 1730 .Times(0);
1738 EXPECT_CALL(*time_wait_list_manager_, 1731 EXPECT_CALL(*time_wait_list_manager_,
1739 ProcessPacket(_, client_addr_, conn_id, _, _)); 1732 ProcessPacket(_, client_addr_, conn_id, _, _));
1740 } 1733 }
1741 1734
1742 // Send a CHLO that the StatelessRejector will reject. 1735 // Send a CHLO that the StatelessRejector will reject.
1743 ProcessPacket(client_addr_, conn_id, true, false, SerializeCHLO()); 1736 ProcessPacket(client_addr_, conn_id, true, SerializeCHLO());
1744 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1737 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1745 1738
1746 // Complete the ProofSource::GetProof call and verify that the connection and 1739 // Complete the ProofSource::GetProof call and verify that the connection and
1747 // packet are processed by the time wait list manager. 1740 // packet are processed by the time wait list manager.
1748 check.Call(1); 1741 check.Call(1);
1749 GetFakeProofSource()->InvokePendingCallback(0); 1742 GetFakeProofSource()->InvokePendingCallback(0);
1750 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 1743 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
1751 1744
1752 // Verify that a data packet is passed to the time wait list manager. 1745 // Verify that a data packet is passed to the time wait list manager.
1753 check.Call(2); 1746 check.Call(2);
1754 ProcessPacket(client_addr_, conn_id, true, false, "My name is Data"); 1747 ProcessPacket(client_addr_, conn_id, true, "My name is Data");
1755 } 1748 }
1756 1749
1757 // Test a situation with multiple interleaved connections which the 1750 // Test a situation with multiple interleaved connections which the
1758 // StatelessRejector will accept. 1751 // StatelessRejector will accept.
1759 TEST_F(AsyncGetProofTest, MultipleAccept) { 1752 TEST_F(AsyncGetProofTest, MultipleAccept) {
1760 QuicConnectionId conn_id_1 = 1; 1753 QuicConnectionId conn_id_1 = 1;
1761 QuicConnectionId conn_id_2 = 2; 1754 QuicConnectionId conn_id_2 = 2;
1762 QuicBufferedPacketStore* store = 1755 QuicBufferedPacketStore* store =
1763 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get()); 1756 QuicDispatcherPeer::GetBufferedPackets(dispatcher_.get());
1764 1757
(...skipping 29 matching lines...) Expand all
1794 .WillOnce(testing::Return(GetSession(conn_id_1))); 1787 .WillOnce(testing::Return(GetSession(conn_id_1)));
1795 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>( 1788 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(
1796 GetSession(conn_id_1)->connection()), 1789 GetSession(conn_id_1)->connection()),
1797 ProcessUdpPacket(_, _, _)) 1790 ProcessUdpPacket(_, _, _))
1798 .WillRepeatedly(testing::WithArg<2>( 1791 .WillRepeatedly(testing::WithArg<2>(
1799 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 1792 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
1800 base::Unretained(this), conn_id_1)))); 1793 base::Unretained(this), conn_id_1))));
1801 } 1794 }
1802 1795
1803 // Send a CHLO that the StatelessRejector will accept. 1796 // Send a CHLO that the StatelessRejector will accept.
1804 ProcessPacket(client_addr_, conn_id_1, true, false, SerializeFullCHLO()); 1797 ProcessPacket(client_addr_, conn_id_1, true, SerializeFullCHLO());
1805 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1798 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1806 1799
1807 // Send another CHLO that the StatelessRejector will accept. 1800 // Send another CHLO that the StatelessRejector will accept.
1808 ProcessPacket(client_addr_, conn_id_2, true, false, SerializeFullCHLO()); 1801 ProcessPacket(client_addr_, conn_id_2, true, SerializeFullCHLO());
1809 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 2); 1802 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 2);
1810 1803
1811 // Complete the second ProofSource::GetProof call and verify that a session is 1804 // Complete the second ProofSource::GetProof call and verify that a session is
1812 // created. 1805 // created.
1813 check.Call(1); 1806 check.Call(1);
1814 GetFakeProofSource()->InvokePendingCallback(1); 1807 GetFakeProofSource()->InvokePendingCallback(1);
1815 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1808 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1816 1809
1817 // Verify that a data packet on that connection gets processed immediately. 1810 // Verify that a data packet on that connection gets processed immediately.
1818 check.Call(2); 1811 check.Call(2);
1819 ProcessPacket(client_addr_, conn_id_2, true, false, "My name is Data"); 1812 ProcessPacket(client_addr_, conn_id_2, true, "My name is Data");
1820 1813
1821 // Verify that a data packet on the other connection does not get processed 1814 // Verify that a data packet on the other connection does not get processed
1822 // yet. 1815 // yet.
1823 check.Call(3); 1816 check.Call(3);
1824 ProcessPacket(client_addr_, conn_id_1, true, false, "My name is Data"); 1817 ProcessPacket(client_addr_, conn_id_1, true, "My name is Data");
1825 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1)); 1818 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1));
1826 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2)); 1819 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2));
1827 1820
1828 // Complete the first ProofSource::GetProof call and verify that a session is 1821 // Complete the first ProofSource::GetProof call and verify that a session is
1829 // created and the buffered packet is processed. 1822 // created and the buffered packet is processed.
1830 check.Call(4); 1823 check.Call(4);
1831 GetFakeProofSource()->InvokePendingCallback(0); 1824 GetFakeProofSource()->InvokePendingCallback(0);
1832 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 1825 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
1833 } 1826 }
1834 1827
(...skipping 28 matching lines...) Expand all
1863 ShouldCreateOrBufferPacketForConnection(conn_id_1)); 1856 ShouldCreateOrBufferPacketForConnection(conn_id_1));
1864 1857
1865 EXPECT_CALL(check, Call(4)); 1858 EXPECT_CALL(check, Call(4));
1866 EXPECT_CALL(*time_wait_list_manager_, 1859 EXPECT_CALL(*time_wait_list_manager_,
1867 AddConnectionIdToTimeWait(conn_id_1, _, true, _)); 1860 AddConnectionIdToTimeWait(conn_id_1, _, true, _));
1868 EXPECT_CALL(*time_wait_list_manager_, 1861 EXPECT_CALL(*time_wait_list_manager_,
1869 ProcessPacket(_, client_addr_, conn_id_1, _, _)); 1862 ProcessPacket(_, client_addr_, conn_id_1, _, _));
1870 } 1863 }
1871 1864
1872 // Send a CHLO that the StatelessRejector will reject. 1865 // Send a CHLO that the StatelessRejector will reject.
1873 ProcessPacket(client_addr_, conn_id_1, true, false, SerializeCHLO()); 1866 ProcessPacket(client_addr_, conn_id_1, true, SerializeCHLO());
1874 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1867 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1875 1868
1876 // Send another CHLO that the StatelessRejector will reject. 1869 // Send another CHLO that the StatelessRejector will reject.
1877 ProcessPacket(client_addr_, conn_id_2, true, false, SerializeCHLO()); 1870 ProcessPacket(client_addr_, conn_id_2, true, SerializeCHLO());
1878 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 2); 1871 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 2);
1879 1872
1880 // Complete the second ProofSource::GetProof call and verify that the 1873 // Complete the second ProofSource::GetProof call and verify that the
1881 // connection and packet are processed by the time wait manager. 1874 // connection and packet are processed by the time wait manager.
1882 check.Call(1); 1875 check.Call(1);
1883 GetFakeProofSource()->InvokePendingCallback(1); 1876 GetFakeProofSource()->InvokePendingCallback(1);
1884 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1877 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1885 1878
1886 // Verify that a data packet on that connection gets processed immediately by 1879 // Verify that a data packet on that connection gets processed immediately by
1887 // the time wait manager. 1880 // the time wait manager.
1888 check.Call(2); 1881 check.Call(2);
1889 ProcessPacket(client_addr_, conn_id_2, true, false, "My name is Data"); 1882 ProcessPacket(client_addr_, conn_id_2, true, "My name is Data");
1890 1883
1891 // Verify that a data packet on the first connection gets buffered. 1884 // Verify that a data packet on the first connection gets buffered.
1892 check.Call(3); 1885 check.Call(3);
1893 ProcessPacket(client_addr_, conn_id_1, true, false, "My name is Data"); 1886 ProcessPacket(client_addr_, conn_id_1, true, "My name is Data");
1894 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1)); 1887 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1));
1895 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2)); 1888 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2));
1896 1889
1897 // Complete the first ProofSource::GetProof call and verify that the CHLO is 1890 // Complete the first ProofSource::GetProof call and verify that the CHLO is
1898 // processed by the time wait manager and the remaining packets are discarded. 1891 // processed by the time wait manager and the remaining packets are discarded.
1899 check.Call(4); 1892 check.Call(4);
1900 GetFakeProofSource()->InvokePendingCallback(0); 1893 GetFakeProofSource()->InvokePendingCallback(0);
1901 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 1894 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
1902 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1)); 1895 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1));
1903 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2)); 1896 EXPECT_FALSE(store->HasBufferedPackets(conn_id_2));
(...skipping 18 matching lines...) Expand all
1922 EXPECT_CALL(check, Call(2)); 1915 EXPECT_CALL(check, Call(2));
1923 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id_1, client_addr_)) 1916 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id_1, client_addr_))
1924 .Times(0); 1917 .Times(0);
1925 EXPECT_CALL(*time_wait_list_manager_, 1918 EXPECT_CALL(*time_wait_list_manager_,
1926 AddConnectionIdToTimeWait(conn_id_1, _, true, _)); 1919 AddConnectionIdToTimeWait(conn_id_1, _, true, _));
1927 EXPECT_CALL(*time_wait_list_manager_, 1920 EXPECT_CALL(*time_wait_list_manager_,
1928 ProcessPacket(_, client_addr_, conn_id_1, _, _)); 1921 ProcessPacket(_, client_addr_, conn_id_1, _, _));
1929 } 1922 }
1930 1923
1931 // Send a CHLO that the StatelessRejector will reject. 1924 // Send a CHLO that the StatelessRejector will reject.
1932 ProcessPacket(client_addr_, conn_id_1, true, false, SerializeCHLO()); 1925 ProcessPacket(client_addr_, conn_id_1, true, SerializeCHLO());
1933 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1926 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1934 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1)); 1927 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1));
1935 1928
1936 // Send an identical CHLO which should get buffered. 1929 // Send an identical CHLO which should get buffered.
1937 check.Call(1); 1930 check.Call(1);
1938 ProcessPacket(client_addr_, conn_id_1, true, false, SerializeCHLO()); 1931 ProcessPacket(client_addr_, conn_id_1, true, SerializeCHLO());
1939 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1932 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1940 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1)); 1933 EXPECT_TRUE(store->HasBufferedPackets(conn_id_1));
1941 1934
1942 // Complete the ProofSource::GetProof call and verify that the CHLO is 1935 // Complete the ProofSource::GetProof call and verify that the CHLO is
1943 // rejected and the copy is discarded. 1936 // rejected and the copy is discarded.
1944 check.Call(2); 1937 check.Call(2);
1945 GetFakeProofSource()->InvokePendingCallback(0); 1938 GetFakeProofSource()->InvokePendingCallback(0);
1946 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 1939 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
1947 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1)); 1940 EXPECT_FALSE(store->HasBufferedPackets(conn_id_1));
1948 } 1941 }
(...skipping 15 matching lines...) Expand all
1964 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id)); 1957 EXPECT_CALL(*dispatcher_, ShouldCreateOrBufferPacketForConnection(conn_id));
1965 1958
1966 EXPECT_CALL(check, Call(2)); 1959 EXPECT_CALL(check, Call(2));
1967 EXPECT_CALL(*time_wait_list_manager_, 1960 EXPECT_CALL(*time_wait_list_manager_,
1968 ProcessPacket(_, client_addr_, conn_id, _, _)); 1961 ProcessPacket(_, client_addr_, conn_id, _, _));
1969 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_)) 1962 EXPECT_CALL(*dispatcher_, CreateQuicSession(conn_id, client_addr_))
1970 .Times(0); 1963 .Times(0);
1971 } 1964 }
1972 1965
1973 // Send a CHLO that the StatelessRejector will accept. 1966 // Send a CHLO that the StatelessRejector will accept.
1974 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 1967 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
1975 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 1968 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
1976 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); 1969 EXPECT_FALSE(store->HasBufferedPackets(conn_id));
1977 1970
1978 // Send a data packet that will get buffered 1971 // Send a data packet that will get buffered
1979 check.Call(1); 1972 check.Call(1);
1980 ProcessPacket(client_addr_, conn_id, true, false, "My name is Data"); 1973 ProcessPacket(client_addr_, conn_id, true, "My name is Data");
1981 EXPECT_TRUE(store->HasBufferedPackets(conn_id)); 1974 EXPECT_TRUE(store->HasBufferedPackets(conn_id));
1982 1975
1983 // Pretend that enough time has gone by for the packets to get expired out of 1976 // Pretend that enough time has gone by for the packets to get expired out of
1984 // the buffer 1977 // the buffer
1985 mock_helper_.AdvanceTime( 1978 mock_helper_.AdvanceTime(
1986 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs)); 1979 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs));
1987 QuicBufferedPacketStorePeer::expiration_alarm(store)->Cancel(); 1980 QuicBufferedPacketStorePeer::expiration_alarm(store)->Cancel();
1988 store->OnExpirationTimeout(); 1981 store->OnExpirationTimeout();
1989 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); 1982 EXPECT_FALSE(store->HasBufferedPackets(conn_id));
1990 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); 1983 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2022 .WillOnce(testing::Return(GetSession(conn_id))); 2015 .WillOnce(testing::Return(GetSession(conn_id)));
2023 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>( 2016 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(
2024 GetSession(conn_id)->connection()), 2017 GetSession(conn_id)->connection()),
2025 ProcessUdpPacket(_, _, _)) 2018 ProcessUdpPacket(_, _, _))
2026 .WillOnce(testing::WithArg<2>( 2019 .WillOnce(testing::WithArg<2>(
2027 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, 2020 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket,
2028 base::Unretained(this), conn_id)))); 2021 base::Unretained(this), conn_id))));
2029 } 2022 }
2030 2023
2031 // Send a CHLO that the StatelessRejector will accept. 2024 // Send a CHLO that the StatelessRejector will accept.
2032 ProcessPacket(client_addr_, conn_id, true, false, SerializeFullCHLO()); 2025 ProcessPacket(client_addr_, conn_id, true, SerializeFullCHLO());
2033 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1); 2026 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 1);
2034 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); 2027 EXPECT_FALSE(store->HasBufferedPackets(conn_id));
2035 2028
2036 // Send a data packet that will get buffered 2029 // Send a data packet that will get buffered
2037 check.Call(1); 2030 check.Call(1);
2038 ProcessPacket(client_addr_, conn_id, true, false, "My name is Data"); 2031 ProcessPacket(client_addr_, conn_id, true, "My name is Data");
2039 EXPECT_TRUE(store->HasBufferedPackets(conn_id)); 2032 EXPECT_TRUE(store->HasBufferedPackets(conn_id));
2040 2033
2041 // Pretend that enough time has gone by for the packets to get expired out of 2034 // Pretend that enough time has gone by for the packets to get expired out of
2042 // the buffer 2035 // the buffer
2043 mock_helper_.AdvanceTime( 2036 mock_helper_.AdvanceTime(
2044 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs)); 2037 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs));
2045 QuicBufferedPacketStorePeer::expiration_alarm(store)->Cancel(); 2038 QuicBufferedPacketStorePeer::expiration_alarm(store)->Cancel();
2046 store->OnExpirationTimeout(); 2039 store->OnExpirationTimeout();
2047 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); 2040 EXPECT_FALSE(store->HasBufferedPackets(conn_id));
2048 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); 2041 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id));
(...skipping 15 matching lines...) Expand all
2064 check.Call(2); 2057 check.Call(2);
2065 GetFakeProofSource()->InvokePendingCallback(0); 2058 GetFakeProofSource()->InvokePendingCallback(0);
2066 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); 2059 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0);
2067 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); 2060 EXPECT_FALSE(store->HasBufferedPackets(conn_id));
2068 EXPECT_FALSE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); 2061 EXPECT_FALSE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id));
2069 } 2062 }
2070 2063
2071 } // namespace 2064 } // namespace
2072 } // namespace test 2065 } // namespace test
2073 } // namespace net 2066 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_client_session_test.cc ('k') | net/tools/quic/quic_time_wait_list_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698