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);