Add a regression test for b/206077990.

PiperOrigin-RevId: 409494124
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index c9d5291..cd1513d 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -1704,6 +1704,91 @@
   client_->Disconnect();
 }
 
+TEST_P(EndToEndTest, AddressTokenRefreshedByServer) {
+  SetQuicReloadableFlag(quic_add_cached_network_parameters_to_address_token,
+                        true);
+  ASSERT_TRUE(Initialize());
+  if (!version_.HasIetfQuicFrames()) {
+    return;
+  }
+
+  QuicCryptoClientConfig* client_crypto_config =
+      client_->client()->crypto_config();
+  QuicServerId server_id = client_->client()->server_id();
+
+  SendSynchronousFooRequestAndCheckResponse();
+  EXPECT_FALSE(GetClientSession()->EarlyDataAccepted());
+
+  client_->Disconnect();
+
+  std::string old_address_token =
+      client_crypto_config->LookupOrCreate(server_id)->source_address_token();
+  ASSERT_TRUE(!old_address_token.empty());
+
+  SetQuicReloadableFlag(quic_add_cached_network_parameters_to_address_token,
+                        false);
+
+  // The 0-RTT handshake should succeed.
+  client_->Connect();
+  EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
+  ASSERT_TRUE(client_->client()->connected());
+  SendSynchronousFooRequestAndCheckResponse();
+
+  EXPECT_TRUE(GetClientSession()->EarlyDataAccepted());
+
+  server_thread_->Pause();
+  QuicSpdySession* server_session = GetServerSession();
+  QuicConnection* server_connection = GetServerConnection();
+  ASSERT_TRUE(server_session != nullptr && server_connection != nullptr);
+  // Verify address is validated via validating token received in INITIAL
+  // packet.
+  EXPECT_FALSE(
+      server_connection->GetStats().address_validated_via_decrypting_packet);
+  EXPECT_TRUE(server_connection->GetStats().address_validated_via_token);
+
+  server_thread_->Resume();
+
+  client_->Disconnect();
+
+  std::string new_address_token =
+      client_crypto_config->LookupOrCreate(server_id)->source_address_token();
+  ASSERT_TRUE(!new_address_token.empty());
+  ASSERT_NE(new_address_token, old_address_token);
+}
+
+// Verify that client does not reuse a source address token.
+TEST_P(EndToEndTest, AddressTokenNotReusedByClient) {
+  ASSERT_TRUE(Initialize());
+  if (!version_.HasIetfQuicFrames()) {
+    return;
+  }
+
+  QuicCryptoClientConfig* client_crypto_config =
+      client_->client()->crypto_config();
+  QuicServerId server_id = client_->client()->server_id();
+
+  SendSynchronousFooRequestAndCheckResponse();
+  EXPECT_FALSE(GetClientSession()->EarlyDataAccepted());
+
+  client_->Disconnect();
+
+  std::string old_address_token =
+      client_crypto_config->LookupOrCreate(server_id)->source_address_token();
+  ASSERT_TRUE(!old_address_token.empty());
+
+  // Pause the server thread again to blackhole packets from client.
+  server_thread_->Pause();
+  client_->Connect();
+  EXPECT_FALSE(client_->client()->WaitForOneRttKeysAvailable());
+  EXPECT_FALSE(client_->client()->connected());
+
+  std::string new_address_token =
+      client_crypto_config->LookupOrCreate(server_id)->source_address_token();
+  // TODO(b/206087883): This currently fails, fix the client and uncomment it.
+  // ASSERT_TRUE(new_address_token.empty());
+  server_thread_->Resume();
+}
+
 TEST_P(EndToEndTest, LargePostZeroRTTFailure) {
   // Send a request and then disconnect. This prepares the client to attempt
   // a 0-RTT handshake for the next request.