QUICHE: always print ACK ranges as [a...b], except if the range is a single packet.
Even a moderately short list is easier to read when it's a range instead of each individual packet listed.
PiperOrigin-RevId: 676638766
diff --git a/quiche/quic/core/frames/quic_ack_frame.cc b/quiche/quic/core/frames/quic_ack_frame.cc
index ae6a2c9..b2f7a58 100644
--- a/quiche/quic/core/frames/quic_ack_frame.cc
+++ b/quiche/quic/core/frames/quic_ack_frame.cc
@@ -14,12 +14,6 @@
namespace quic {
-namespace {
-
-const QuicPacketCount kMaxPrintRange = 128;
-
-} // namespace
-
bool IsAwaitingPacket(const QuicAckFrame& ack_frame,
QuicPacketNumber packet_number,
QuicPacketNumber peer_least_packet_awaiting_ack) {
@@ -161,28 +155,15 @@
return packet_number_intervals_.rbegin()->Length();
}
-// Largest min...max range for packet numbers where we print the numbers
-// explicitly. If bigger than this, we print as a range [a,d] rather
-// than [a b c d]
-
std::ostream& operator<<(std::ostream& os, const PacketNumberQueue& q) {
for (const QuicInterval<QuicPacketNumber>& interval : q) {
- // Print as a range if there is a pathological condition.
- if ((interval.min() >= interval.max()) ||
- (interval.max() - interval.min() > kMaxPrintRange)) {
- // If min>max, it's really a bug, so QUIC_BUG it to
- // catch it in development.
- QUIC_BUG_IF(quic_bug_12614_2, interval.min() >= interval.max())
- << "Ack Range minimum (" << interval.min() << "Not less than max ("
- << interval.max() << ")";
- // print range as min...max rather than full list.
- // in the event of a bug, the list could be very big.
- os << interval.min() << "..." << (interval.max() - 1) << " ";
+ QUIC_BUG_IF(quic_bug_12614_2, interval.min() >= interval.max())
+ << "Ack Range minimum (" << interval.min() << "Not less than max ("
+ << interval.max() << ")";
+ if (interval.min() == interval.max() - 1) {
+ os << interval.min() << " ";
} else {
- for (QuicPacketNumber packet_number = interval.min();
- packet_number < interval.max(); ++packet_number) {
- os << packet_number << " ";
- }
+ os << interval.min() << "..." << (interval.max() - 1) << " ";
}
}
return os;
diff --git a/quiche/quic/core/frames/quic_frames_test.cc b/quiche/quic/core/frames/quic_frames_test.cc
index e41ff7a..37f45cc 100644
--- a/quiche/quic/core/frames/quic_frames_test.cc
+++ b/quiche/quic/core/frames/quic_frames_test.cc
@@ -42,13 +42,55 @@
std::ostringstream stream;
stream << frame;
EXPECT_EQ(
- "{ largest_acked: 5, ack_delay_time: 3, packets: [ 4 5 ], "
+ "{ largest_acked: 5, ack_delay_time: 3, packets: [ 4...5 ], "
"received_packets: [ 6 at 7 ], ecn_counters_populated: 0 }\n",
stream.str());
QuicFrame quic_frame(&frame);
EXPECT_FALSE(IsControlFrame(quic_frame.type));
}
+TEST_F(QuicFramesTest, AckFrameToStringMultipleIntervals) {
+ QuicAckFrame frame;
+ frame.largest_acked = QuicPacketNumber(6);
+ frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(3);
+ frame.packets.Add(QuicPacketNumber(1));
+ frame.packets.Add(QuicPacketNumber(2));
+ frame.packets.Add(QuicPacketNumber(3));
+ frame.packets.Add(QuicPacketNumber(5));
+ frame.packets.Add(QuicPacketNumber(6));
+ frame.received_packet_times = {
+ {QuicPacketNumber(7),
+ QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(7)}};
+ std::ostringstream stream;
+ stream << frame;
+ EXPECT_EQ(
+ "{ largest_acked: 6, ack_delay_time: 3, packets: [ 1...3 5...6 ], "
+ "received_packets: [ 7 at 7 ], ecn_counters_populated: 0 }\n",
+ stream.str());
+ QuicFrame quic_frame(&frame);
+ EXPECT_FALSE(IsControlFrame(quic_frame.type));
+}
+
+TEST_F(QuicFramesTest, AckFrameToStringMultipleIntervalsSinglePacketRange) {
+ QuicAckFrame frame;
+ frame.largest_acked = QuicPacketNumber(6);
+ frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(3);
+ frame.packets.Add(QuicPacketNumber(1));
+ frame.packets.Add(QuicPacketNumber(5));
+ frame.packets.Add(QuicPacketNumber(6));
+ frame.received_packet_times = {
+ {QuicPacketNumber(7),
+ QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(7)}};
+ std::ostringstream stream;
+ stream << frame;
+ EXPECT_EQ(
+ "{ largest_acked: 6, ack_delay_time: 3, packets: [ 1 5...6 ], "
+ "received_packets: [ 7 at 7 ], ecn_counters_populated: 0 }\n",
+ stream.str());
+ QuicFrame quic_frame(&frame);
+ EXPECT_FALSE(IsControlFrame(quic_frame.type));
+}
+
TEST_F(QuicFramesTest, BigAckFrameToString) {
QuicAckFrame frame;
frame.largest_acked = QuicPacketNumber(500);