gfe-relnote: In QUIC, add a utility function CopySerializedPacket. Not used yet, not protected.
Add bool has_ack_frame_copy to SerializedPacket, indicating whether the serialized packet contains a copy of ack frame.
PiperOrigin-RevId: 275908820
Change-Id: I34b156091a9fbaa542bed5951588c43b59de12bb
diff --git a/quic/core/quic_packets_test.cc b/quic/core/quic_packets_test.cc
index 7ee7797..e080cd8 100644
--- a/quic/core/quic_packets_test.cc
+++ b/quic/core/quic_packets_test.cc
@@ -4,6 +4,7 @@
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
@@ -70,6 +71,46 @@
GetClientConnectionIdAsSender(header, Perspective::IS_CLIENT));
}
+TEST_F(QuicPacketsTest, CopySerializedPacket) {
+ std::string buffer(1000, 'a');
+ SimpleBufferAllocator allocator;
+ SerializedPacket packet(QuicPacketNumber(1), PACKET_1BYTE_PACKET_NUMBER,
+ buffer.data(), buffer.length(), /*has_ack=*/false,
+ /*has_stop_waiting=*/false);
+ packet.retransmittable_frames.push_back(
+ QuicFrame(new QuicWindowUpdateFrame()));
+ packet.retransmittable_frames.push_back(QuicFrame(QuicStreamFrame()));
+
+ QuicAckFrame ack_frame(InitAckFrame(1));
+ packet.nonretransmittable_frames.push_back(QuicFrame(&ack_frame));
+ packet.nonretransmittable_frames.push_back(QuicFrame(QuicPaddingFrame(-1)));
+
+ std::unique_ptr<SerializedPacket> copy = QuicWrapUnique<SerializedPacket>(
+ CopySerializedPacket(packet, &allocator, /*copy_buffer=*/true));
+ EXPECT_EQ(quic::QuicPacketNumber(1), copy->packet_number);
+ EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, copy->packet_number_length);
+ ASSERT_EQ(2u, copy->retransmittable_frames.size());
+ EXPECT_EQ(WINDOW_UPDATE_FRAME, copy->retransmittable_frames[0].type);
+ EXPECT_EQ(STREAM_FRAME, copy->retransmittable_frames[1].type);
+
+ ASSERT_EQ(2u, copy->nonretransmittable_frames.size());
+ EXPECT_EQ(ACK_FRAME, copy->nonretransmittable_frames[0].type);
+ EXPECT_EQ(PADDING_FRAME, copy->nonretransmittable_frames[1].type);
+ EXPECT_EQ(1000u, copy->encrypted_length);
+ test::CompareCharArraysWithHexError(
+ "encrypted_buffer", copy->encrypted_buffer, copy->encrypted_length,
+ packet.encrypted_buffer, packet.encrypted_length);
+
+ std::unique_ptr<SerializedPacket> copy2 = QuicWrapUnique<SerializedPacket>(
+ CopySerializedPacket(packet, &allocator, /*copy_buffer=*/false));
+ EXPECT_EQ(packet.encrypted_buffer, copy2->encrypted_buffer);
+ EXPECT_EQ(1000u, copy2->encrypted_length);
+ ClearSerializedPacket(&packet);
+ delete[] copy->encrypted_buffer;
+ ClearSerializedPacket(copy.get());
+ ClearSerializedPacket(copy2.get());
+}
+
} // namespace
} // namespace test
} // namespace quic