In QUIC, add error code QUIC_SILENT_IDLE_TIMEOUT. Used when server silently close connection due to no network activity. The connection close packets would be serialized and will be sent by time wait list upon receiving client packets. Protected by gfe2_reloadable_flag_quic_add_silent_idle_timeout.
PiperOrigin-RevId: 325226891
Change-Id: Id32192da063e5f4f605ef4afcb779c6b7e6a700d
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 4d3189d..b39f606 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -11580,6 +11580,43 @@
EXPECT_EQ(deadline, connection_.GetTimeoutAlarm()->deadline());
}
+TEST_P(QuicConnectionTest, SilentIdleTimeout) {
+ set_perspective(Perspective::IS_SERVER);
+ QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
+ if (version().SupportsAntiAmplificationLimit()) {
+ QuicConnectionPeer::SetAddressValidated(&connection_);
+ }
+
+ QuicConfig config;
+ QuicConfigPeer::SetNegotiated(&config, true);
+ if (connection_.version().AuthenticatesHandshakeConnectionIds()) {
+ QuicConfigPeer::SetReceivedOriginalConnectionId(
+ &config, connection_.connection_id());
+ QuicConfigPeer::SetReceivedInitialSourceConnectionId(&config,
+ QuicConnectionId());
+ }
+ EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
+ connection_.SetFromConfig(config);
+
+ EXPECT_TRUE(connection_.connected());
+ EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
+
+ EXPECT_CALL(visitor_,
+ OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF));
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
+ connection_.GetTimeoutAlarm()->Fire();
+ if (GetQuicReloadableFlag(quic_add_silent_idle_timeout)) {
+ // Verify the connection close packets get serialized and added to
+ // termination packets list.
+ EXPECT_NE(nullptr,
+ QuicConnectionPeer::GetConnectionClosePacket(&connection_));
+ } else {
+ // Verify no connection close packet is serialized.
+ EXPECT_EQ(nullptr,
+ QuicConnectionPeer::GetConnectionClosePacket(&connection_));
+ }
+}
+
} // namespace
} // namespace test
} // namespace quic