OLD | NEW |
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 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) | 530 EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _)) |
531 .Times(1); | 531 .Times(1); |
532 // A packet whose packet number is one to large to be allowed to start a | 532 // A packet whose packet number is one to large to be allowed to start a |
533 // connection. | 533 // connection. |
534 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO(), | 534 ProcessPacket(client_address, connection_id, true, false, SerializeCHLO(), |
535 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, | 535 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, |
536 kDefaultPathId, | 536 kDefaultPathId, |
537 QuicDispatcher::kMaxReasonableInitialPacketNumber + 1); | 537 QuicDispatcher::kMaxReasonableInitialPacketNumber + 1); |
538 } | 538 } |
539 | 539 |
| 540 TEST_F(QuicDispatcherTest, SupportedVersionsChangeInFlight) { |
| 541 DCHECK_EQ(3u, arraysize(kSupportedQuicVersions)); |
| 542 FLAGS_quic_fix_version_manager = true; |
| 543 FLAGS_quic_enable_version_36_v3 = true; |
| 544 IPEndPoint client_address(Loopback4(), 1); |
| 545 server_address_ = IPEndPoint(Any4(), 5); |
| 546 QuicConnectionId connection_id = 1; |
| 547 |
| 548 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
| 549 .Times(0); |
| 550 ProcessPacket(client_address, connection_id, true, |
| 551 static_cast<QuicVersion>(QuicVersionMin() - 1), SerializeCHLO(), |
| 552 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1); |
| 553 ++connection_id; |
| 554 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
| 555 .WillOnce(testing::Return(CreateSession( |
| 556 dispatcher_.get(), config_, connection_id, client_address, |
| 557 &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
| 558 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
| 559 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
| 560 ProcessUdpPacket(_, _, _)) |
| 561 .WillOnce(testing::WithArgs<2>( |
| 562 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
| 563 base::Unretained(this), connection_id)))); |
| 564 ProcessPacket(client_address, connection_id, true, QuicVersionMin(), |
| 565 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
| 566 PACKET_6BYTE_PACKET_NUMBER, 1); |
| 567 ++connection_id; |
| 568 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
| 569 .WillOnce(testing::Return(CreateSession( |
| 570 dispatcher_.get(), config_, connection_id, client_address, |
| 571 &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
| 572 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
| 573 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
| 574 ProcessUdpPacket(_, _, _)) |
| 575 .WillOnce(testing::WithArgs<2>( |
| 576 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
| 577 base::Unretained(this), connection_id)))); |
| 578 ProcessPacket(client_address, connection_id, true, QuicVersionMax(), |
| 579 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
| 580 PACKET_6BYTE_PACKET_NUMBER, 1); |
| 581 // Turn off version 36. |
| 582 FLAGS_quic_enable_version_36_v3 = false; |
| 583 ++connection_id; |
| 584 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
| 585 .Times(0); |
| 586 ProcessPacket(client_address, connection_id, true, QUIC_VERSION_36, |
| 587 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
| 588 PACKET_6BYTE_PACKET_NUMBER, 1); |
| 589 |
| 590 // Turn on version 36. |
| 591 FLAGS_quic_enable_version_36_v3 = true; |
| 592 ++connection_id; |
| 593 EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
| 594 .WillOnce(testing::Return(CreateSession( |
| 595 dispatcher_.get(), config_, connection_id, client_address, |
| 596 &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
| 597 QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
| 598 EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
| 599 ProcessUdpPacket(_, _, _)) |
| 600 .WillOnce(testing::WithArgs<2>( |
| 601 Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
| 602 base::Unretained(this), connection_id)))); |
| 603 ProcessPacket(client_address, connection_id, true, QUIC_VERSION_35, |
| 604 SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
| 605 PACKET_6BYTE_PACKET_NUMBER, 1); |
| 606 } |
| 607 |
540 // Enables mocking of the handshake-confirmation for stateless rejects. | 608 // Enables mocking of the handshake-confirmation for stateless rejects. |
541 class MockQuicCryptoServerStream : public QuicCryptoServerStream { | 609 class MockQuicCryptoServerStream : public QuicCryptoServerStream { |
542 public: | 610 public: |
543 MockQuicCryptoServerStream(const QuicCryptoServerConfig& crypto_config, | 611 MockQuicCryptoServerStream(const QuicCryptoServerConfig& crypto_config, |
544 QuicCompressedCertsCache* compressed_certs_cache, | 612 QuicCompressedCertsCache* compressed_certs_cache, |
545 QuicServerSessionBase* session, | 613 QuicServerSessionBase* session, |
546 QuicCryptoServerStream::Helper* helper) | 614 QuicCryptoServerStream::Helper* helper) |
547 : QuicCryptoServerStream(&crypto_config, | 615 : QuicCryptoServerStream(&crypto_config, |
548 compressed_certs_cache, | 616 compressed_certs_cache, |
549 FLAGS_enable_quic_stateless_reject_support, | 617 FLAGS_enable_quic_stateless_reject_support, |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1057 } | 1125 } |
1058 | 1126 |
1059 // A dispatcher whose stateless rejector will always ACCEPTs CHLO. | 1127 // A dispatcher whose stateless rejector will always ACCEPTs CHLO. |
1060 class BufferedPacketStoreTest | 1128 class BufferedPacketStoreTest |
1061 : public QuicDispatcherTest, | 1129 : public QuicDispatcherTest, |
1062 public ::testing::WithParamInterface<BufferedPacketStoreTestParams> { | 1130 public ::testing::WithParamInterface<BufferedPacketStoreTestParams> { |
1063 public: | 1131 public: |
1064 BufferedPacketStoreTest() | 1132 BufferedPacketStoreTest() |
1065 : QuicDispatcherTest(), | 1133 : QuicDispatcherTest(), |
1066 client_addr_(Loopback4(), 1234), | 1134 client_addr_(Loopback4(), 1234), |
1067 proof_(new QuicCryptoProof) { | 1135 signed_config_(new QuicSignedServerConfig) { |
1068 FLAGS_quic_use_cheap_stateless_rejects = | 1136 FLAGS_quic_use_cheap_stateless_rejects = |
1069 GetParam().support_cheap_stateless_reject; | 1137 GetParam().support_cheap_stateless_reject; |
1070 FLAGS_enable_quic_stateless_reject_support = | 1138 FLAGS_enable_quic_stateless_reject_support = |
1071 GetParam().enable_stateless_rejects_via_flag; | 1139 GetParam().enable_stateless_rejects_via_flag; |
1072 } | 1140 } |
1073 | 1141 |
1074 void SetUp() override { | 1142 void SetUp() override { |
1075 QuicDispatcherTest::SetUp(); | 1143 QuicDispatcherTest::SetUp(); |
1076 clock_ = QuicDispatcherPeer::GetHelper(dispatcher_.get())->GetClock(); | 1144 clock_ = QuicDispatcherPeer::GetHelper(dispatcher_.get())->GetClock(); |
1077 | 1145 |
1078 QuicVersion version = AllSupportedVersions().front(); | 1146 QuicVersion version = AllSupportedVersions().front(); |
1079 CryptoHandshakeMessage chlo = CryptoTestUtils::GenerateDefaultInchoateCHLO( | 1147 CryptoHandshakeMessage chlo = CryptoTestUtils::GenerateDefaultInchoateCHLO( |
1080 clock_, version, &crypto_config_); | 1148 clock_, version, &crypto_config_); |
1081 chlo.SetVector(net::kCOPT, net::QuicTagVector{net::kSREJ}); | 1149 chlo.SetVector(net::kCOPT, net::QuicTagVector{net::kSREJ}); |
1082 // Pass an inchoate CHLO. | 1150 // Pass an inchoate CHLO. |
1083 CryptoTestUtils::GenerateFullCHLO( | 1151 CryptoTestUtils::GenerateFullCHLO( |
1084 chlo, &crypto_config_, server_ip_, client_addr_, version, clock_, | 1152 chlo, &crypto_config_, server_ip_, client_addr_, version, clock_, |
1085 proof_, QuicDispatcherPeer::GetCache(dispatcher_.get()), &full_chlo_); | 1153 signed_config_, QuicDispatcherPeer::GetCache(dispatcher_.get()), |
| 1154 &full_chlo_); |
1086 } | 1155 } |
1087 | 1156 |
1088 string SerializeFullCHLO() { | 1157 string SerializeFullCHLO() { |
1089 return full_chlo_.GetSerialized().AsStringPiece().as_string(); | 1158 return full_chlo_.GetSerialized().AsStringPiece().as_string(); |
1090 } | 1159 } |
1091 | 1160 |
1092 protected: | 1161 protected: |
1093 IPAddress server_ip_; | 1162 IPAddress server_ip_; |
1094 IPEndPoint client_addr_; | 1163 IPEndPoint client_addr_; |
1095 scoped_refptr<QuicCryptoProof> proof_; | 1164 scoped_refptr<QuicSignedServerConfig> signed_config_; |
1096 const QuicClock* clock_; | 1165 const QuicClock* clock_; |
1097 CryptoHandshakeMessage full_chlo_; | 1166 CryptoHandshakeMessage full_chlo_; |
1098 }; | 1167 }; |
1099 | 1168 |
1100 INSTANTIATE_TEST_CASE_P( | 1169 INSTANTIATE_TEST_CASE_P( |
1101 BufferedPacketStoreTests, | 1170 BufferedPacketStoreTests, |
1102 BufferedPacketStoreTest, | 1171 BufferedPacketStoreTest, |
1103 ::testing::ValuesIn(GetBufferedPacketStoreTestParams())); | 1172 ::testing::ValuesIn(GetBufferedPacketStoreTestParams())); |
1104 | 1173 |
1105 TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketsUptoLimitAndProcessChlo) { | 1174 TEST_P(BufferedPacketStoreTest, ProcessNonChloPacketsUptoLimitAndProcessChlo) { |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1505 | 1574 |
1506 // Test which exercises the async GetProof codepaths, especially in the context | 1575 // Test which exercises the async GetProof codepaths, especially in the context |
1507 // of stateless rejection. | 1576 // of stateless rejection. |
1508 class AsyncGetProofTest : public QuicDispatcherTest { | 1577 class AsyncGetProofTest : public QuicDispatcherTest { |
1509 public: | 1578 public: |
1510 AsyncGetProofTest() | 1579 AsyncGetProofTest() |
1511 : QuicDispatcherTest( | 1580 : QuicDispatcherTest( |
1512 std::unique_ptr<FakeProofSource>(new FakeProofSource())), | 1581 std::unique_ptr<FakeProofSource>(new FakeProofSource())), |
1513 client_addr_(net::test::Loopback4(), 1234), | 1582 client_addr_(net::test::Loopback4(), 1234), |
1514 crypto_config_peer_(&crypto_config_), | 1583 crypto_config_peer_(&crypto_config_), |
1515 proof_(new QuicCryptoProof) { | 1584 signed_config_(new QuicSignedServerConfig) { |
1516 FLAGS_enable_async_get_proof = true; | 1585 FLAGS_enable_async_get_proof = true; |
1517 FLAGS_enable_quic_stateless_reject_support = true; | 1586 FLAGS_enable_quic_stateless_reject_support = true; |
1518 FLAGS_quic_use_cheap_stateless_rejects = true; | 1587 FLAGS_quic_use_cheap_stateless_rejects = true; |
1519 FLAGS_quic_create_session_after_insertion = true; | 1588 FLAGS_quic_create_session_after_insertion = true; |
1520 } | 1589 } |
1521 | 1590 |
1522 void SetUp() override { | 1591 void SetUp() override { |
1523 QuicDispatcherTest::SetUp(); | 1592 QuicDispatcherTest::SetUp(); |
1524 | 1593 |
1525 clock_ = QuicDispatcherPeer::GetHelper(dispatcher_.get())->GetClock(); | 1594 clock_ = QuicDispatcherPeer::GetHelper(dispatcher_.get())->GetClock(); |
1526 QuicVersion version = AllSupportedVersions().front(); | 1595 QuicVersion version = AllSupportedVersions().front(); |
1527 chlo_ = CryptoTestUtils::GenerateDefaultInchoateCHLO(clock_, version, | 1596 chlo_ = CryptoTestUtils::GenerateDefaultInchoateCHLO(clock_, version, |
1528 &crypto_config_); | 1597 &crypto_config_); |
1529 chlo_.SetVector(net::kCOPT, net::QuicTagVector{net::kSREJ}); | 1598 chlo_.SetVector(net::kCOPT, net::QuicTagVector{net::kSREJ}); |
1530 // Pass an inchoate CHLO. | 1599 // Pass an inchoate CHLO. |
1531 CryptoTestUtils::GenerateFullCHLO( | 1600 CryptoTestUtils::GenerateFullCHLO( |
1532 chlo_, &crypto_config_, server_ip_, client_addr_, version, clock_, | 1601 chlo_, &crypto_config_, server_ip_, client_addr_, version, clock_, |
1533 proof_, QuicDispatcherPeer::GetCache(dispatcher_.get()), &full_chlo_); | 1602 signed_config_, QuicDispatcherPeer::GetCache(dispatcher_.get()), |
| 1603 &full_chlo_); |
1534 | 1604 |
1535 GetFakeProofSource()->Activate(); | 1605 GetFakeProofSource()->Activate(); |
1536 } | 1606 } |
1537 | 1607 |
1538 FakeProofSource* GetFakeProofSource() const { | 1608 FakeProofSource* GetFakeProofSource() const { |
1539 return static_cast<FakeProofSource*>(crypto_config_peer_.GetProofSource()); | 1609 return static_cast<FakeProofSource*>(crypto_config_peer_.GetProofSource()); |
1540 } | 1610 } |
1541 | 1611 |
1542 string SerializeFullCHLO() { | 1612 string SerializeFullCHLO() { |
1543 return full_chlo_.GetSerialized().AsStringPiece().as_string(); | 1613 return full_chlo_.GetSerialized().AsStringPiece().as_string(); |
(...skipping 29 matching lines...) Expand all Loading... |
1573 CHECK(ok); | 1643 CHECK(ok); |
1574 return session; | 1644 return session; |
1575 } | 1645 } |
1576 | 1646 |
1577 protected: | 1647 protected: |
1578 const IPEndPoint client_addr_; | 1648 const IPEndPoint client_addr_; |
1579 | 1649 |
1580 private: | 1650 private: |
1581 QuicCryptoServerConfigPeer crypto_config_peer_; | 1651 QuicCryptoServerConfigPeer crypto_config_peer_; |
1582 IPAddress server_ip_; | 1652 IPAddress server_ip_; |
1583 scoped_refptr<QuicCryptoProof> proof_; | 1653 scoped_refptr<QuicSignedServerConfig> signed_config_; |
1584 const QuicClock* clock_; | 1654 const QuicClock* clock_; |
1585 CryptoHandshakeMessage chlo_; | 1655 CryptoHandshakeMessage chlo_; |
1586 CryptoHandshakeMessage full_chlo_; | 1656 CryptoHandshakeMessage full_chlo_; |
1587 | 1657 |
1588 struct SessionInfo { | 1658 struct SessionInfo { |
1589 TestQuicSpdyServerSession* session; | 1659 TestQuicSpdyServerSession* session; |
1590 std::unique_ptr<MockQuicCryptoServerStream> crypto_stream; | 1660 std::unique_ptr<MockQuicCryptoServerStream> crypto_stream; |
1591 }; | 1661 }; |
1592 std::map<QuicConnectionId, SessionInfo> sessions_; | 1662 std::map<QuicConnectionId, SessionInfo> sessions_; |
1593 }; | 1663 }; |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1984 check.Call(2); | 2054 check.Call(2); |
1985 GetFakeProofSource()->InvokePendingCallback(0); | 2055 GetFakeProofSource()->InvokePendingCallback(0); |
1986 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); | 2056 ASSERT_EQ(GetFakeProofSource()->NumPendingCallbacks(), 0); |
1987 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); | 2057 EXPECT_FALSE(store->HasBufferedPackets(conn_id)); |
1988 EXPECT_FALSE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); | 2058 EXPECT_FALSE(time_wait_list_manager_->IsConnectionIdInTimeWait(conn_id)); |
1989 } | 2059 } |
1990 | 2060 |
1991 } // namespace | 2061 } // namespace |
1992 } // namespace test | 2062 } // namespace test |
1993 } // namespace net | 2063 } // namespace net |
OLD | NEW |