(n/a, not in use) add interfaces to set up peer address in QuicPacketCreator which the serialized packets are sent to through out the current call stack. No protected.
PiperOrigin-RevId: 328189072
Change-Id: I3c6d25aeb0f685891652519d62b92b1c0436d688
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index 60703fb..563f1eb 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -3833,6 +3833,134 @@
}
}
+TEST_F(QuicPacketCreatorMultiplePacketsTest,
+ PeerAddressContextWithSameAddress) {
+ QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
+ creator_.SetDefaultPeerAddress(peer_addr);
+ // Send some stream data.
+ MakeIOVector("foo", &iov_);
+ EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
+ .WillRepeatedly(Return(true));
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
+ Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, NO_FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ {
+ // Set a different address via context which should trigger flush.
+ QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr);
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ // Queue another STREAM_FRAME.
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
+ Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+ }
+ // After exiting the scope, the last queued frame should be flushed.
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke([=](SerializedPacket packet) {
+ EXPECT_EQ(peer_addr, packet.peer_address);
+ ASSERT_EQ(2u, packet.retransmittable_frames.size());
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.back().type);
+ }));
+ creator_.FlushCurrentPacket();
+}
+
+TEST_F(QuicPacketCreatorMultiplePacketsTest,
+ PeerAddressContextWithDifferentAddress) {
+ QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
+ creator_.SetDefaultPeerAddress(peer_addr);
+ // Send some stream data.
+ MakeIOVector("foo", &iov_);
+ EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
+ .WillRepeatedly(Return(true));
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
+ Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, NO_FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+
+ QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke([=](SerializedPacket packet) {
+ EXPECT_EQ(peer_addr, packet.peer_address);
+ ASSERT_EQ(1u, packet.retransmittable_frames.size());
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
+ }))
+ .WillOnce(Invoke([=](SerializedPacket packet) {
+ EXPECT_EQ(peer_addr1, packet.peer_address);
+ ASSERT_EQ(1u, packet.retransmittable_frames.size());
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
+ }));
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ {
+ // Set a different address via context which should trigger flush.
+ QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr1);
+ EXPECT_FALSE(creator_.HasPendingFrames());
+ // Queue another STREAM_FRAME.
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
+ Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ }
+ // After exiting the scope, the last queued frame should be flushed.
+ EXPECT_FALSE(creator_.HasPendingFrames());
+}
+
+TEST_F(QuicPacketCreatorMultiplePacketsTest,
+ NestedPeerAddressContextWithDifferentAddress) {
+ QuicSocketAddress peer_addr(QuicIpAddress::Any4(), 12345);
+ creator_.SetDefaultPeerAddress(peer_addr);
+ QuicPacketCreator::ScopedPeerAddressContext context(&creator_, peer_addr);
+
+ // Send some stream data.
+ MakeIOVector("foo", &iov_);
+ EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
+ .WillRepeatedly(Return(true));
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(creator_.transport_version(),
+ Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, NO_FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+ EXPECT_TRUE(creator_.HasPendingFrames());
+
+ QuicSocketAddress peer_addr1(QuicIpAddress::Any4(), 12346);
+ EXPECT_CALL(delegate_, OnSerializedPacket(_))
+ .WillOnce(Invoke([=](SerializedPacket packet) {
+ EXPECT_EQ(peer_addr, packet.peer_address);
+ ASSERT_EQ(1u, packet.retransmittable_frames.size());
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
+
+ // Set up another context with a different address.
+ QuicPacketCreator::ScopedPeerAddressContext context(&creator_,
+ peer_addr1);
+ MakeIOVector("foo", &iov_);
+ EXPECT_CALL(delegate_, ShouldGeneratePacket(_, _))
+ .WillRepeatedly(Return(true));
+ QuicConsumedData consumed = creator_.ConsumeData(
+ QuicUtils::GetFirstBidirectionalStreamId(
+ creator_.transport_version(), Perspective::IS_CLIENT),
+ &iov_, 1u, iov_.iov_len, 0, NO_FIN);
+ EXPECT_EQ(3u, consumed.bytes_consumed);
+ EXPECT_TRUE(creator_.HasPendingFrames());
+ // This should trigger another OnSerializedPacket() with the 2nd
+ // address.
+ creator_.FlushCurrentPacket();
+ }))
+ .WillOnce(Invoke([=](SerializedPacket packet) {
+ EXPECT_EQ(peer_addr1, packet.peer_address);
+ ASSERT_EQ(1u, packet.retransmittable_frames.size());
+ EXPECT_EQ(STREAM_FRAME, packet.retransmittable_frames.front().type);
+ }));
+ creator_.FlushCurrentPacket();
+}
+
} // namespace
} // namespace test
} // namespace quic