Fix some issues regarding quic TestPacketWriter changing its perspective. In WritePacket() the decrypter's perspective should be associated with framer's perspective. QuicConnectionTest::set_pespective() should also change peer_creator's and peer_framer's perspective. QuicTestConnection::set_perspective() should also alter encrypters' perspective at different encryption levels. PiperOrigin-RevId: 334481658 Change-Id: Icf627893e657967f9ff5e25ba3e8f3737e4ebe1c
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index 1b41e8e..0921d95 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -358,11 +358,26 @@ writer()->SetSupportedVersions(versions); } + // This should be called before setting customized encrypters/decrypters for + // connection and peer creator. void set_perspective(Perspective perspective) { writer()->set_perspective(perspective); QuicConnectionPeer::SetPerspective(this, perspective); QuicSentPacketManagerPeer::SetPerspective( QuicConnectionPeer::GetSentPacketManager(this), perspective); + QuicConnectionPeer::GetFramer(this)->SetInitialObfuscators( + TestConnectionId()); + for (EncryptionLevel level : {ENCRYPTION_ZERO_RTT, ENCRYPTION_HANDSHAKE, + ENCRYPTION_FORWARD_SECURE}) { + if (QuicConnectionPeer::GetFramer(this)->HasEncrypterOfEncryptionLevel( + level)) { + SetEncrypter(level, std::make_unique<NullEncrypter>(perspective)); + } + if (QuicConnectionPeer::GetFramer(this)->HasDecrypterOfEncryptionLevel( + level)) { + InstallDecrypter(level, std::make_unique<NullDecrypter>(perspective)); + } + } } // Enable path MTU discovery. Assumes that the test is performed from the @@ -575,7 +590,8 @@ peer_creator_(connection_id_, &peer_framer_, /*delegate=*/nullptr), - writer_(new TestPacketWriter(version(), &clock_)), + writer_( + new TestPacketWriter(version(), &clock_, Perspective::IS_CLIENT)), connection_(connection_id_, kPeerAddress, helper_.get(), @@ -1251,6 +1267,14 @@ } QuicFramerPeer::SetPerspective(&peer_framer_, QuicUtils::InvertPerspective(perspective)); + peer_framer_.SetInitialObfuscators(TestConnectionId()); + for (EncryptionLevel level : {ENCRYPTION_ZERO_RTT, ENCRYPTION_HANDSHAKE, + ENCRYPTION_FORWARD_SECURE}) { + if (peer_framer_.HasEncrypterOfEncryptionLevel(level)) { + peer_creator_.SetEncrypter( + level, std::make_unique<NullEncrypter>(peer_framer_.perspective())); + } + } } void set_packets_between_probes_base( @@ -6392,7 +6416,7 @@ TEST_P(QuicConnectionTest, WriteBlockedAfterClientSendsConnectivityProbe) { PathProbeTestInit(Perspective::IS_CLIENT); - TestPacketWriter probing_writer(version(), &clock_); + TestPacketWriter probing_writer(version(), &clock_, Perspective::IS_CLIENT); // Block next write so that sending connectivity probe will encounter a // blocked write when send a connectivity probe to the peer. probing_writer.BlockOnNextWrite(); @@ -6424,7 +6448,7 @@ TEST_P(QuicConnectionTest, WriterErrorWhenClientSendsConnectivityProbe) { PathProbeTestInit(Perspective::IS_CLIENT); - TestPacketWriter probing_writer(version(), &clock_); + TestPacketWriter probing_writer(version(), &clock_, Perspective::IS_CLIENT); probing_writer.SetShouldWriteFail(); // Connection should not be closed if a connectivity probe is failed to be @@ -8447,7 +8471,7 @@ // Simulate path degrading handling by sending a probe on an alternet path. clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); - TestPacketWriter probing_writer(version(), &clock_); + TestPacketWriter probing_writer(version(), &clock_, Perspective::IS_CLIENT); connection_.SendConnectivityProbingPacket(&probing_writer, connection_.peer_address()); // Verify that path degrading detection is not reset.
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc index 5aa2a7a..ed7dc75 100644 --- a/quic/test_tools/quic_test_utils.cc +++ b/quic/test_tools/quic_test_utils.cc
@@ -1363,9 +1363,12 @@ return true; } -TestPacketWriter::TestPacketWriter(ParsedQuicVersion version, MockClock* clock) +TestPacketWriter::TestPacketWriter(ParsedQuicVersion version, + MockClock* clock, + Perspective perspective) : version_(version), - framer_(SupportedVersions(version_), Perspective::IS_SERVER), + framer_(SupportedVersions(version_), + QuicUtils::InvertPerspective(perspective)), clock_(clock) { QuicFramerPeer::SetLastSerializedServerConnectionId(framer_.framer(), TestConnectionId()); @@ -1427,11 +1430,18 @@ } } else if (framer_.framer()->version().KnowsWhichDecrypterToUse()) { framer_.framer()->InstallDecrypter( + ENCRYPTION_HANDSHAKE, + std::make_unique<NullDecrypter>(framer_.framer()->perspective())); + framer_.framer()->InstallDecrypter( + ENCRYPTION_ZERO_RTT, + std::make_unique<NullDecrypter>(framer_.framer()->perspective())); + framer_.framer()->InstallDecrypter( ENCRYPTION_FORWARD_SECURE, - std::make_unique<NullDecrypter>(Perspective::IS_SERVER)); + std::make_unique<NullDecrypter>(framer_.framer()->perspective())); } EXPECT_TRUE(framer_.ProcessPacket(packet)) - << framer_.framer()->detailed_error(); + << framer_.framer()->detailed_error() << " perspective " + << framer_.framer()->perspective(); if (block_on_next_write_) { write_blocked_ = true; block_on_next_write_ = false;
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h index e207a56..457663e 100644 --- a/quic/test_tools/quic_test_utils.h +++ b/quic/test_tools/quic_test_utils.h
@@ -1878,7 +1878,10 @@ }; public: - TestPacketWriter(ParsedQuicVersion version, MockClock* clock); + TestPacketWriter(ParsedQuicVersion version, + MockClock* clock, + Perspective perspective); + TestPacketWriter(const TestPacketWriter&) = delete; TestPacketWriter& operator=(const TestPacketWriter&) = delete; @@ -2006,6 +2009,7 @@ // we send. QuicFramerPeer::SetPerspective(framer_.framer(), QuicUtils::InvertPerspective(perspective)); + framer_.framer()->SetInitialObfuscators(TestConnectionId()); } // final_bytes_of_last_packet_ returns the last four bytes of the previous