gfe-relnote: In QUIC, use IdleNetworkDetector to detect handshake and idle network timeout. Protected by gfe2_reloadable_flag_quic_use_idle_network_detector.

PiperOrigin-RevId: 303103349
Change-Id: I3e5d6c3a2585284a69fa680b698ea14e0c86174e
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 1b1511b..e5faa35 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -844,6 +844,11 @@
   }
 
   TestAlarmFactory::TestAlarm* GetTimeoutAlarm() {
+    if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+        GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+      return reinterpret_cast<TestAlarmFactory::TestAlarm*>(
+          QuicConnectionPeer::GetIdleNetworkDetectorAlarm(this));
+    }
     return reinterpret_cast<TestAlarmFactory::TestAlarm*>(
         QuicConnectionPeer::GetTimeoutAlarm(this));
   }
@@ -4777,7 +4782,7 @@
   EXPECT_TRUE(connection_.connected());
 
   // Advance the time and send the first packet to the peer.
-  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(20));
+  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
   QuicPacketNumber last_packet;
   SendStreamDataToPeer(1, "foo", 0, NO_FIN, &last_packet);
   EXPECT_EQ(QuicPacketNumber(1u), last_packet);
@@ -4790,7 +4795,10 @@
   EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(0);
   QuicTime::Delta delay = initial_ddl - clock_.ApproximateNow();
   clock_.AdvanceTime(delay);
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   // Verify the timeout alarm deadline is updated.
   EXPECT_TRUE(connection_.connected());
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
@@ -4879,8 +4887,11 @@
   EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
   ProcessAckPacket(&frame);
 
-  // Fire early to verify it wouldn't timeout yet.
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    // Fire early to verify it wouldn't timeout yet.
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_TRUE(connection_.connected());
 
@@ -5627,7 +5638,13 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       0, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // Now send more data. This will not move the timeout because
   // no data has been received since the previous write.
@@ -5635,13 +5652,22 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       3, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // The original alarm will fire.  We should not time out because we had a
   // network event at t=5ms.  The alarm will reregister.
   clock_.AdvanceTime(initial_idle_timeout - five_ms - five_ms);
   EXPECT_EQ(default_timeout, clock_.ApproximateNow());
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_TRUE(connection_.connected());
   EXPECT_EQ(default_timeout + five_ms,
@@ -5690,7 +5716,13 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       0, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // Move forward 5 ms and receive a packet, which will move the timeout
   // forward 5 ms more (but will not reschedule the alarm).
@@ -5719,7 +5751,10 @@
   ASSERT_EQ(default_timeout.ToDebuggingValue(),
             clock_.Now().ToDebuggingValue());
   EXPECT_EQ(default_timeout, clock_.Now());
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_TRUE(connection_.connected());
   ASSERT_EQ(final_timeout.ToDebuggingValue(),
@@ -5775,7 +5810,13 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       0, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // Now send more data. This will not move the timeout because
   // no data has been received since the previous write.
@@ -5783,13 +5824,22 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       3, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // The original alarm will fire.  We should not time out because we had a
   // network event at t=5ms.  The alarm will reregister.
   clock_.AdvanceTime(default_idle_timeout - five_ms - five_ms);
   EXPECT_EQ(default_timeout, clock_.ApproximateNow());
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_TRUE(connection_.connected());
   EXPECT_EQ(default_timeout + five_ms,
@@ -5852,7 +5902,13 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       0, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // Retransmit the packet via tail loss probe.
   clock_.AdvanceTime(connection_.GetRetransmissionAlarm()->deadline() -
@@ -5909,7 +5965,13 @@
   SendStreamDataToPeer(
       GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
       0, FIN, nullptr);
-  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  if (GetQuicReloadableFlag(quic_use_blackhole_detector) &&
+      GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    EXPECT_EQ(default_timeout + five_ms,
+              connection_.GetTimeoutAlarm()->deadline());
+  } else {
+    EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
+  }
 
   // Indicate streams are still open.
   EXPECT_CALL(visitor_, ShouldKeepConnectionAlive())
@@ -5960,7 +6022,10 @@
   // network event at t=5ms.  The alarm will reregister.
   clock_.AdvanceTime(initial_idle_timeout - five_ms);
   EXPECT_EQ(default_timeout, clock_.ApproximateNow());
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.connected());
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_EQ(default_timeout + five_ms,
@@ -6017,7 +6082,10 @@
   // network event at t=5ms.  The alarm will reregister.
   clock_.AdvanceTime(initial_idle_timeout - five_ms);
   EXPECT_EQ(default_timeout, clock_.ApproximateNow());
-  connection_.GetTimeoutAlarm()->Fire();
+  if (!GetQuicReloadableFlag(quic_use_blackhole_detector) ||
+      !GetQuicReloadableFlag(quic_use_idle_network_detector)) {
+    connection_.GetTimeoutAlarm()->Fire();
+  }
   EXPECT_TRUE(connection_.connected());
   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
   EXPECT_EQ(default_timeout + five_ms,