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_