Move the logic to run MoQT handshake into a separate helper function.

PiperOrigin-RevId: 741327934
diff --git a/quiche/quic/moqt/moqt_integration_test.cc b/quiche/quic/moqt/moqt_integration_test.cc
index e4e973b..72b7ca4 100644
--- a/quiche/quic/moqt/moqt_integration_test.cc
+++ b/quiche/quic/moqt/moqt_integration_test.cc
@@ -61,16 +61,7 @@
     test_harness_.WireUpEndpointsWithLoss(lose_every_n);
   }
   void ConnectEndpoints() {
-    client_->quic_session()->CryptoConnect();
-    bool client_established = false;
-    bool server_established = false;
-    EXPECT_CALL(client_callbacks_.session_established_callback, Call())
-        .WillOnce(Assign(&client_established, true));
-    EXPECT_CALL(server_callbacks_.session_established_callback, Call())
-        .WillOnce(Assign(&server_established, true));
-    bool success = test_harness_.RunUntilWithDefaultTimeout(
-        [&]() { return client_established && server_established; });
-    QUICHE_CHECK(success);
+    RunHandshakeOrDie(test_harness_.simulator(), *client_, *server_);
   }
 
   void EstablishSession() {
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
index 26eb0c2..3bf5e85 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
@@ -5,6 +5,7 @@
 #include "quiche/quic/moqt/test_tools/moqt_simulator_harness.h"
 
 #include <memory>
+#include <optional>
 #include <string>
 
 #include "absl/strings/string_view.h"
@@ -13,12 +14,15 @@
 #include "quiche/quic/core/crypto/quic_random.h"
 #include "quiche/quic/core/quic_alarm_factory_proxy.h"
 #include "quiche/quic/core/quic_generic_session.h"
+#include "quiche/quic/core/quic_time.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/moqt/moqt_session_callbacks.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"
+#include "quiche/common/platform/api/quiche_logging.h"
 
 namespace moqt::test {
 
@@ -83,4 +87,28 @@
   quic_session_.Initialize();
 }
 
+void RunHandshakeOrDie(quic::simulator::Simulator& simulator,
+                       MoqtClientEndpoint& client, MoqtServerEndpoint& server,
+                       std::optional<quic::QuicTimeDelta> timeout) {
+  constexpr quic::QuicTimeDelta kDefaultTimeout =
+      quic::QuicTimeDelta::FromSeconds(3);
+  bool client_established = false;
+  bool server_established = false;
+
+  // Retaining pointers to local variables is safe here, since if the handshake
+  // succeeds, both callbacks are executed and deleted, and if either fails, the
+  // program crashes.
+  client.session()->callbacks().session_established_callback =
+      [&client_established] { client_established = true; };
+  server.session()->callbacks().session_established_callback =
+      [&server_established] { server_established = true; };
+
+  client.quic_session()->CryptoConnect();
+  simulator.RunUntilOrTimeout(
+      [&]() { return client_established && server_established; },
+      timeout.value_or(kDefaultTimeout));
+  QUICHE_CHECK(client_established) << "Client failed to establish session";
+  QUICHE_CHECK(server_established) << "Server failed to establish session";
+}
+
 }  // 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
index 9b84bb8..a75498f 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator_harness.h
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_harness.h
@@ -5,12 +5,14 @@
 #ifndef QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_
 #define QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_
 
+#include <optional>
 #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/core/quic_time.h"
 #include "quiche/quic/moqt/moqt_messages.h"
 #include "quiche/quic/moqt/moqt_session.h"
 #include "quiche/quic/test_tools/simulator/simulator.h"
@@ -51,6 +53,13 @@
   MoqtSession session_;
 };
 
+// Runs the handshake for MoQT, crashes if the handshake fails.  Overrides
+// the pre-existing session_initalized_callback of both sessions.
+void RunHandshakeOrDie(
+    quic::simulator::Simulator& simulator, MoqtClientEndpoint& client,
+    MoqtServerEndpoint& server,
+    std::optional<quic::QuicTimeDelta> timeout = std::nullopt);
+
 }  // namespace moqt::test
 
 #endif  // QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_SIMULATOR_HARNESS_H_
diff --git a/quiche/quic/moqt/tools/moqt_simulator_bin.cc b/quiche/quic/moqt/tools/moqt_simulator_bin.cc
index 257c4a5..523cc65 100644
--- a/quiche/quic/moqt/tools/moqt_simulator_bin.cc
+++ b/quiche/quic/moqt/tools/moqt_simulator_bin.cc
@@ -421,24 +421,10 @@
 
   // Runs the simulation and outputs the results to stdout.
   void Run() {
-    // Timeout for establishing the connection.
-    constexpr QuicTimeDelta kConnectionTimeout = QuicTimeDelta::FromSeconds(1);
-
     // Perform the QUIC and the MoQT handshake.
     client_session()->set_support_object_acks(true);
-    client_session()->callbacks().session_established_callback = [this] {
-      client_established_ = true;
-    };
     server_session()->set_support_object_acks(true);
-    server_session()->callbacks().session_established_callback = [this] {
-      server_established_ = true;
-    };
-    client_endpoint_.quic_session()->CryptoConnect();
-    simulator_.RunUntilOrTimeout(
-        [&]() { return client_established_ && server_established_; },
-        kConnectionTimeout);
-    QUICHE_CHECK(client_established_) << "Client failed to establish session";
-    QUICHE_CHECK(server_established_) << "Server failed to establish session";
+    RunHandshakeOrDie(simulator_, client_endpoint_, server_endpoint_);
 
     generator_.queue()->SetDeliveryOrder(parameters_.delivery_order);
     client_session()->set_publisher(&publisher_);
@@ -531,8 +517,6 @@
   MoqtBitrateAdjuster adjuster_;
   SimulationParameters parameters_;
 
-  bool client_established_ = false;
-  bool server_established_ = false;
   absl::Duration wait_at_the_end_;
 };