Index: net/tools/quic/quic_dispatcher_test.cc |
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc |
index 9e898f56f2da2ae4a237a39b2ce50f7689886225..46a44bb837210782de9249c01e69f554f228e95b 100644 |
--- a/net/tools/quic/quic_dispatcher_test.cc |
+++ b/net/tools/quic/quic_dispatcher_test.cc |
@@ -537,6 +537,74 @@ TEST_F(QuicDispatcherTest, TooBigSeqNoPacketToTimeWaitListManager) { |
QuicDispatcher::kMaxReasonableInitialPacketNumber + 1); |
} |
+TEST_F(QuicDispatcherTest, SupportedVersionsChangeInFlight) { |
+ DCHECK_EQ(3u, arraysize(kSupportedQuicVersions)); |
+ FLAGS_quic_fix_version_manager = true; |
+ FLAGS_quic_enable_version_36_v3 = true; |
+ IPEndPoint client_address(Loopback4(), 1); |
+ server_address_ = IPEndPoint(Any4(), 5); |
+ QuicConnectionId connection_id = 1; |
+ |
+ EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
+ .Times(0); |
+ ProcessPacket(client_address, connection_id, true, |
+ static_cast<QuicVersion>(QuicVersionMin() - 1), SerializeCHLO(), |
+ PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, 1); |
+ ++connection_id; |
+ EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
+ .WillOnce(testing::Return(CreateSession( |
+ dispatcher_.get(), config_, connection_id, client_address, |
+ &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
+ QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
+ EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
+ ProcessUdpPacket(_, _, _)) |
+ .WillOnce(testing::WithArgs<2>( |
+ Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
+ base::Unretained(this), connection_id)))); |
+ ProcessPacket(client_address, connection_id, true, QuicVersionMin(), |
+ SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
+ PACKET_6BYTE_PACKET_NUMBER, 1); |
+ ++connection_id; |
+ EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
+ .WillOnce(testing::Return(CreateSession( |
+ dispatcher_.get(), config_, connection_id, client_address, |
+ &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
+ QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
+ EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
+ ProcessUdpPacket(_, _, _)) |
+ .WillOnce(testing::WithArgs<2>( |
+ Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
+ base::Unretained(this), connection_id)))); |
+ ProcessPacket(client_address, connection_id, true, QuicVersionMax(), |
+ SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
+ PACKET_6BYTE_PACKET_NUMBER, 1); |
+ // Turn off version 36. |
+ FLAGS_quic_enable_version_36_v3 = false; |
+ ++connection_id; |
+ EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
+ .Times(0); |
+ ProcessPacket(client_address, connection_id, true, QUIC_VERSION_36, |
+ SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
+ PACKET_6BYTE_PACKET_NUMBER, 1); |
+ |
+ // Turn on version 36. |
+ FLAGS_quic_enable_version_36_v3 = true; |
+ ++connection_id; |
+ EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address)) |
+ .WillOnce(testing::Return(CreateSession( |
+ dispatcher_.get(), config_, connection_id, client_address, |
+ &mock_helper_, &mock_alarm_factory_, &crypto_config_, |
+ QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); |
+ EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), |
+ ProcessUdpPacket(_, _, _)) |
+ .WillOnce(testing::WithArgs<2>( |
+ Invoke(CreateFunctor(&QuicDispatcherTest::ValidatePacket, |
+ base::Unretained(this), connection_id)))); |
+ ProcessPacket(client_address, connection_id, true, QUIC_VERSION_35, |
+ SerializeCHLO(), PACKET_8BYTE_CONNECTION_ID, |
+ PACKET_6BYTE_PACKET_NUMBER, 1); |
+} |
+ |
// Enables mocking of the handshake-confirmation for stateless rejects. |
class MockQuicCryptoServerStream : public QuicCryptoServerStream { |
public: |