Split MoQT simulated endpoints into a separate header file.

PiperOrigin-RevId: 642327076
diff --git a/build/source_list.bzl b/build/source_list.bzl
index f8f6e7e..e4bfad3 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1508,6 +1508,7 @@
     "quic/moqt/moqt_session.h",
     "quic/moqt/moqt_subscribe_windows.h",
     "quic/moqt/moqt_track.h",
+    "quic/moqt/test_tools/moqt_simulator_harness.h",
     "quic/moqt/test_tools/moqt_test_message.h",
     "quic/moqt/tools/moqt_client.h",
     "quic/moqt/tools/moqt_mock_visitor.h",
@@ -1527,6 +1528,7 @@
     "quic/moqt/moqt_subscribe_windows.cc",
     "quic/moqt/moqt_subscribe_windows_test.cc",
     "quic/moqt/moqt_track_test.cc",
+    "quic/moqt/test_tools/moqt_simulator_harness.cc",
     "quic/moqt/tools/chat_client_bin.cc",
     "quic/moqt/tools/moqt_client.cc",
     "quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index f203a7a..60c5103 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1512,6 +1512,7 @@
     "src/quiche/quic/moqt/moqt_session.h",
     "src/quiche/quic/moqt/moqt_subscribe_windows.h",
     "src/quiche/quic/moqt/moqt_track.h",
+    "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.h",
     "src/quiche/quic/moqt/test_tools/moqt_test_message.h",
     "src/quiche/quic/moqt/tools/moqt_client.h",
     "src/quiche/quic/moqt/tools/moqt_mock_visitor.h",
@@ -1531,6 +1532,7 @@
     "src/quiche/quic/moqt/moqt_subscribe_windows.cc",
     "src/quiche/quic/moqt/moqt_subscribe_windows_test.cc",
     "src/quiche/quic/moqt/moqt_track_test.cc",
+    "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc",
     "src/quiche/quic/moqt/tools/chat_client_bin.cc",
     "src/quiche/quic/moqt/tools/moqt_client.cc",
     "src/quiche/quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/build/source_list.json b/build/source_list.json
index c5edd4d..b34b8f9 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1511,6 +1511,7 @@
     "quiche/quic/moqt/moqt_session.h",
     "quiche/quic/moqt/moqt_subscribe_windows.h",
     "quiche/quic/moqt/moqt_track.h",
+    "quiche/quic/moqt/test_tools/moqt_simulator_harness.h",
     "quiche/quic/moqt/test_tools/moqt_test_message.h",
     "quiche/quic/moqt/tools/moqt_client.h",
     "quiche/quic/moqt/tools/moqt_mock_visitor.h",
@@ -1530,6 +1531,7 @@
     "quiche/quic/moqt/moqt_subscribe_windows.cc",
     "quiche/quic/moqt/moqt_subscribe_windows_test.cc",
     "quiche/quic/moqt/moqt_track_test.cc",
+    "quiche/quic/moqt/test_tools/moqt_simulator_harness.cc",
     "quiche/quic/moqt/tools/chat_client_bin.cc",
     "quiche/quic/moqt/tools/moqt_client.cc",
     "quiche/quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/quiche/quic/moqt/moqt_integration_test.cc b/quiche/quic/moqt/moqt_integration_test.cc
index 3f71bb4..1e2de16 100644
--- a/quiche/quic/moqt/moqt_integration_test.cc
+++ b/quiche/quic/moqt/moqt_integration_test.cc
@@ -8,18 +8,12 @@
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "quiche/quic/core/crypto/quic_compressed_certs_cache.h"
-#include "quiche/quic/core/crypto/quic_crypto_client_config.h"
-#include "quiche/quic/core/crypto/quic_crypto_server_config.h"
-#include "quiche/quic/core/crypto/quic_random.h"
-#include "quiche/quic/core/quic_config.h"
 #include "quiche/quic/core/quic_generic_session.h"
-#include "quiche/quic/core/quic_types.h"
 #include "quiche/quic/moqt/moqt_messages.h"
 #include "quiche/quic/moqt/moqt_outgoing_queue.h"
 #include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h"
 #include "quiche/quic/moqt/tools/moqt_mock_visitor.h"
-#include "quiche/quic/test_tools/crypto_test_utils.h"
 #include "quiche/quic/test_tools/quic_test_utils.h"
 #include "quiche/quic/test_tools/simulator/simulator.h"
 #include "quiche/quic/test_tools/simulator/test_harness.h"
@@ -35,87 +29,29 @@
 using ::testing::Assign;
 using ::testing::Return;
 
-class ClientEndpoint : public quic::simulator::QuicEndpointWithConnection {
+class ClientEndpoint : public MoqtClientEndpoint {
  public:
   ClientEndpoint(Simulator* simulator, const std::string& name,
                  const std::string& peer_name, MoqtVersion version)
-      : QuicEndpointWithConnection(simulator, name, peer_name,
-                                   quic::Perspective::IS_CLIENT,
-                                   quic::GetQuicVersionsForGenericSession()),
-        crypto_config_(
-            quic::test::crypto_test_utils::ProofVerifierForTesting()),
-        quic_session_(connection_.get(), false, nullptr, quic::QuicConfig(),
-                      "test.example.com", 443, "moqt", &session_,
-                      /*visitor_owned=*/false, nullptr, &crypto_config_),
-        session_(
-            &quic_session_,
-            MoqtSessionParameters{.version = version,
-                                  .perspective = quic::Perspective::IS_CLIENT,
-                                  .using_webtrans = false,
-                                  .deliver_partial_objects = false},
-            callbacks_.AsSessionCallbacks()) {
-    quic_session_.Initialize();
-  }
-
-  MoqtSession* session() { return &session_; }
-  quic::QuicGenericClientSession* quic_session() { return &quic_session_; }
-  testing::MockFunction<void()>& established_callback() {
-    return callbacks_.session_established_callback;
-  }
-  testing::MockFunction<void(absl::string_view)>& terminated_callback() {
-    return callbacks_.session_terminated_callback;
+      : MoqtClientEndpoint(simulator, name, peer_name, version) {
+    session()->callbacks() = callbacks_.AsSessionCallbacks();
   }
   MockSessionCallbacks& callbacks() { return callbacks_; }
 
  private:
   MockSessionCallbacks callbacks_;
-  quic::QuicCryptoClientConfig crypto_config_;
-  quic::QuicGenericClientSession quic_session_;
-  MoqtSession session_;
 };
-
-class ServerEndpoint : public quic::simulator::QuicEndpointWithConnection {
+class ServerEndpoint : public MoqtServerEndpoint {
  public:
   ServerEndpoint(Simulator* simulator, const std::string& name,
                  const std::string& peer_name, MoqtVersion version)
-      : QuicEndpointWithConnection(simulator, name, peer_name,
-                                   quic::Perspective::IS_SERVER,
-                                   quic::GetQuicVersionsForGenericSession()),
-        compressed_certs_cache_(
-            quic::QuicCompressedCertsCache::kQuicCompressedCertsCacheSize),
-        crypto_config_(quic::QuicCryptoServerConfig::TESTING,
-                       quic::QuicRandom::GetInstance(),
-                       quic::test::crypto_test_utils::ProofSourceForTesting(),
-                       quic::KeyExchangeSource::Default()),
-        quic_session_(connection_.get(), false, nullptr, quic::QuicConfig(),
-                      "moqt", &session_,
-                      /*visitor_owned=*/false, nullptr, &crypto_config_,
-                      &compressed_certs_cache_),
-        session_(
-            &quic_session_,
-            MoqtSessionParameters{.version = version,
-                                  .perspective = quic::Perspective::IS_SERVER,
-                                  .using_webtrans = false,
-                                  .deliver_partial_objects = false},
-            callbacks_.AsSessionCallbacks()) {
-    quic_session_.Initialize();
-  }
-
-  MoqtSession* session() { return &session_; }
-  testing::MockFunction<void()>& established_callback() {
-    return callbacks_.session_established_callback;
-  }
-  testing::MockFunction<void(absl::string_view)>& terminated_callback() {
-    return callbacks_.session_terminated_callback;
+      : MoqtServerEndpoint(simulator, name, peer_name, version) {
+    session()->callbacks() = callbacks_.AsSessionCallbacks();
   }
   MockSessionCallbacks& callbacks() { return callbacks_; }
 
  private:
   MockSessionCallbacks callbacks_;
-  quic::QuicCompressedCertsCache compressed_certs_cache_;
-  quic::QuicCryptoServerConfig crypto_config_;
-  quic::QuicGenericServerSession quic_session_;
-  MoqtSession session_;
 };
 
 class MoqtIntegrationTest : public quiche::test::QuicheTest {
@@ -138,9 +74,9 @@
     client_->quic_session()->CryptoConnect();
     bool client_established = false;
     bool server_established = false;
-    EXPECT_CALL(client_->established_callback(), Call())
+    EXPECT_CALL(client_->callbacks().session_established_callback, Call())
         .WillOnce(Assign(&client_established, true));
-    EXPECT_CALL(server_->established_callback(), Call())
+    EXPECT_CALL(server_->callbacks().session_established_callback, Call())
         .WillOnce(Assign(&server_established, true));
     bool success = test_harness_.RunUntilWithDefaultTimeout(
         [&]() { return client_established && server_established; });
@@ -161,9 +97,9 @@
   client_->quic_session()->CryptoConnect();
   bool client_established = false;
   bool server_established = false;
-  EXPECT_CALL(client_->established_callback(), Call())
+  EXPECT_CALL(client_->callbacks().session_established_callback, Call())
       .WillOnce(Assign(&client_established, true));
-  EXPECT_CALL(server_->established_callback(), Call())
+  EXPECT_CALL(server_->callbacks().session_established_callback, Call())
       .WillOnce(Assign(&server_established, true));
   bool success = test_harness_.RunUntilWithDefaultTimeout(
       [&]() { return client_established && server_established; });
@@ -183,11 +119,13 @@
   client_->quic_session()->CryptoConnect();
   bool client_terminated = false;
   bool server_terminated = false;
-  EXPECT_CALL(client_->established_callback(), Call()).Times(0);
-  EXPECT_CALL(server_->established_callback(), Call()).Times(0);
-  EXPECT_CALL(client_->terminated_callback(), Call(_))
+  EXPECT_CALL(client_->callbacks().session_established_callback, Call())
+      .Times(0);
+  EXPECT_CALL(server_->callbacks().session_established_callback, Call())
+      .Times(0);
+  EXPECT_CALL(client_->callbacks().session_terminated_callback, Call(_))
       .WillOnce(Assign(&client_terminated, true));
-  EXPECT_CALL(server_->terminated_callback(), Call(_))
+  EXPECT_CALL(server_->callbacks().session_terminated_callback, Call(_))
       .WillOnce(Assign(&server_terminated, true));
   bool success = test_harness_.RunUntilWithDefaultTimeout(
       [&]() { return client_terminated && server_terminated; });
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
new file mode 100644
index 0000000..20b42ee
--- /dev/null
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
@@ -0,0 +1,73 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h"
+
+#include <string>
+#include <utility>
+
+#include "quiche/quic/core/crypto/quic_compressed_certs_cache.h"
+#include "quiche/quic/core/crypto/quic_crypto_server_config.h"
+#include "quiche/quic/core/crypto/quic_random.h"
+#include "quiche/quic/core/quic_generic_session.h"
+#include "quiche/quic/core/quic_types.h"
+#include "quiche/quic/moqt/moqt_messages.h"
+#include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/test_tools/crypto_test_utils.h"
+#include "quiche/quic/test_tools/simulator/simulator.h"
+#include "quiche/quic/test_tools/simulator/test_harness.h"
+
+namespace moqt::test {
+
+MoqtClientEndpoint::MoqtClientEndpoint(quic::simulator::Simulator* simulator,
+                                       const std::string& name,
+                                       const std::string& peer_name,
+                                       MoqtVersion version)
+    : QuicEndpointWithConnection(simulator, name, peer_name,
+                                 quic::Perspective::IS_CLIENT,
+                                 quic::GetQuicVersionsForGenericSession()),
+      crypto_config_(quic::test::crypto_test_utils::ProofVerifierForTesting()),
+      quic_session_(connection_.get(), false, nullptr, quic::QuicConfig(),
+                    "test.example.com", 443, "moqt", &session_,
+                    /*visitor_owned=*/false, nullptr, &crypto_config_),
+      session_(
+          &quic_session_,
+          MoqtSessionParameters{.version = version,
+                                .perspective = quic::Perspective::IS_CLIENT,
+                                .using_webtrans = false,
+                                .path = "",
+                                .deliver_partial_objects = false},
+          MoqtSessionCallbacks()) {
+  quic_session_.Initialize();
+}
+
+MoqtServerEndpoint::MoqtServerEndpoint(quic::simulator::Simulator* simulator,
+                                       const std::string& name,
+                                       const std::string& peer_name,
+                                       MoqtVersion version)
+    : QuicEndpointWithConnection(simulator, name, peer_name,
+                                 quic::Perspective::IS_SERVER,
+                                 quic::GetQuicVersionsForGenericSession()),
+      compressed_certs_cache_(
+          quic::QuicCompressedCertsCache::kQuicCompressedCertsCacheSize),
+      crypto_config_(quic::QuicCryptoServerConfig::TESTING,
+                     quic::QuicRandom::GetInstance(),
+                     quic::test::crypto_test_utils::ProofSourceForTesting(),
+                     quic::KeyExchangeSource::Default()),
+      quic_session_(connection_.get(), false, nullptr, quic::QuicConfig(),
+                    "moqt", &session_,
+                    /*visitor_owned=*/false, nullptr, &crypto_config_,
+                    &compressed_certs_cache_),
+      session_(
+          &quic_session_,
+          MoqtSessionParameters{.version = version,
+                                .perspective = quic::Perspective::IS_SERVER,
+                                .using_webtrans = false,
+                                .path = "",
+                                .deliver_partial_objects = false},
+          MoqtSessionCallbacks()) {
+  quic_session_.Initialize();
+}
+
+}  // namespace moqt::test
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator_harness.h b/quiche/quic/moqt/test_tools/moqt_simulator_harness.h
new file mode 100644
index 0000000..9b84bb8
--- /dev/null
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_harness.h
@@ -0,0 +1,56 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_
+#define QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_
+
+#include <string>
+
+#include "quiche/quic/core/crypto/quic_compressed_certs_cache.h"
+#include "quiche/quic/core/crypto/quic_crypto_client_config.h"
+#include "quiche/quic/core/crypto/quic_crypto_server_config.h"
+#include "quiche/quic/core/quic_generic_session.h"
+#include "quiche/quic/moqt/moqt_messages.h"
+#include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/test_tools/simulator/simulator.h"
+#include "quiche/quic/test_tools/simulator/test_harness.h"
+
+namespace moqt::test {
+
+// Places a MoQT-over-raw-QUIC client within a network simulation.
+class MoqtClientEndpoint : public quic::simulator::QuicEndpointWithConnection {
+ public:
+  MoqtClientEndpoint(quic::simulator::Simulator* simulator,
+                     const std::string& name, const std::string& peer_name,
+                     MoqtVersion version);
+
+  MoqtSession* session() { return &session_; }
+  quic::QuicGenericClientSession* quic_session() { return &quic_session_; }
+
+ private:
+  quic::QuicCryptoClientConfig crypto_config_;
+  quic::QuicGenericClientSession quic_session_;
+  MoqtSession session_;
+};
+
+// Places a MoQT-over-raw-QUIC server within a network simulation.
+class MoqtServerEndpoint : public quic::simulator::QuicEndpointWithConnection {
+ public:
+  MoqtServerEndpoint(quic::simulator::Simulator* simulator,
+                     const std::string& name, const std::string& peer_name,
+                     MoqtVersion version);
+
+  MoqtSession* session() { return &session_; }
+  quic::QuicGenericServerSession* quic_session() { return &quic_session_; }
+
+ private:
+  quic::QuicCompressedCertsCache compressed_certs_cache_;
+  quic::QuicCryptoServerConfig crypto_config_;
+  quic::QuicGenericServerSession quic_session_;
+  MoqtSession session_;
+};
+
+}  // namespace moqt::test
+
+#endif  // QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_