Move MoqtParserTestVisitor to a library This is mostly a behavior-preserving refactor. The only change is that logging is now conditional on a boolean passed to the constructor. This enables the visitor to be used silently in a fuzzer without crowding out the fuzzer's status output. PiperOrigin-RevId: 768198326
diff --git a/build/source_list.bzl b/build/source_list.bzl index 5a8ee78..9d46977 100644 --- a/build/source_list.bzl +++ b/build/source_list.bzl
@@ -1556,6 +1556,7 @@ "quic/moqt/moqt_track.h", "quic/moqt/test_tools/mock_moqt_session.h", "quic/moqt/test_tools/moqt_framer_utils.h", + "quic/moqt/test_tools/moqt_parser_test_visitor.h", "quic/moqt/test_tools/moqt_session_peer.h", "quic/moqt/test_tools/moqt_simulator_harness.h", "quic/moqt/test_tools/moqt_test_message.h",
diff --git a/build/source_list.gni b/build/source_list.gni index 89c4626..c3436a9 100644 --- a/build/source_list.gni +++ b/build/source_list.gni
@@ -1560,6 +1560,7 @@ "src/quiche/quic/moqt/moqt_track.h", "src/quiche/quic/moqt/test_tools/mock_moqt_session.h", "src/quiche/quic/moqt/test_tools/moqt_framer_utils.h", + "src/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", "src/quiche/quic/moqt/test_tools/moqt_session_peer.h", "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.h", "src/quiche/quic/moqt/test_tools/moqt_test_message.h",
diff --git a/build/source_list.json b/build/source_list.json index 3a262e2..93ee1ee 100644 --- a/build/source_list.json +++ b/build/source_list.json
@@ -1559,6 +1559,7 @@ "quiche/quic/moqt/moqt_track.h", "quiche/quic/moqt/test_tools/mock_moqt_session.h", "quiche/quic/moqt/test_tools/moqt_framer_utils.h", + "quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h", "quiche/quic/moqt/test_tools/moqt_session_peer.h", "quiche/quic/moqt/test_tools/moqt_simulator_harness.h", "quiche/quic/moqt/test_tools/moqt_test_message.h",
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc index d979ffe..9b8bd29 100644 --- a/quiche/quic/moqt/moqt_parser_test.cc +++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -11,16 +11,18 @@ #include <memory> #include <optional> #include <string> +#include <utility> #include <variant> #include <vector> -#include "absl/strings/str_join.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_data_writer.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h" #include "quiche/quic/moqt/test_tools/moqt_test_message.h" #include "quiche/quic/platform/api/quic_test.h" +#include "quiche/common/platform/api/quiche_test.h" #include "quiche/web_transport/test_tools/in_memory_stream.h" namespace moqt::test { @@ -28,8 +30,6 @@ namespace { using ::testing::AnyOf; -using ::testing::HasSubstr; -using ::testing::Optional; constexpr std::array kMessageTypes{ MoqtMessageType::kSubscribe, @@ -112,129 +112,6 @@ "_" + (info.param.uses_web_transport ? "WebTransport" : "QUIC"); } -class MoqtParserTestVisitor : public MoqtControlParserVisitor, - public MoqtDataParserVisitor { - public: - ~MoqtParserTestVisitor() = default; - - void OnObjectMessage(const MoqtObject& message, absl::string_view payload, - bool end_of_message) override { - MoqtObject object = message; - object_payloads_.push_back(std::string(payload)); - end_of_message_ = end_of_message; - if (end_of_message) { - ++messages_received_; - } - last_message_ = TestMessageBase::MessageStructuredData(object); - } - template <typename Message> - void OnControlMessage(const Message& message) { - end_of_message_ = true; - ++messages_received_; - last_message_ = TestMessageBase::MessageStructuredData(message); - } - void OnClientSetupMessage(const MoqtClientSetup& message) override { - OnControlMessage(message); - } - void OnServerSetupMessage(const MoqtServerSetup& message) override { - OnControlMessage(message); - } - void OnSubscribeMessage(const MoqtSubscribe& message) override { - OnControlMessage(message); - } - void OnSubscribeOkMessage(const MoqtSubscribeOk& message) override { - OnControlMessage(message); - } - void OnSubscribeErrorMessage(const MoqtSubscribeError& message) override { - OnControlMessage(message); - } - void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) override { - OnControlMessage(message); - } - void OnUnsubscribeMessage(const MoqtUnsubscribe& message) override { - OnControlMessage(message); - } - void OnSubscribeDoneMessage(const MoqtSubscribeDone& message) override { - OnControlMessage(message); - } - void OnAnnounceMessage(const MoqtAnnounce& message) override { - OnControlMessage(message); - } - void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override { - OnControlMessage(message); - } - void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override { - OnControlMessage(message); - } - void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override { - OnControlMessage(message); - } - void OnTrackStatusRequestMessage( - const MoqtTrackStatusRequest& message) override { - OnControlMessage(message); - } - void OnUnannounceMessage(const MoqtUnannounce& message) override { - OnControlMessage(message); - } - void OnTrackStatusMessage(const MoqtTrackStatus& message) override { - OnControlMessage(message); - } - void OnGoAwayMessage(const MoqtGoAway& message) override { - OnControlMessage(message); - } - void OnSubscribeAnnouncesMessage( - const MoqtSubscribeAnnounces& message) override { - OnControlMessage(message); - } - void OnSubscribeAnnouncesOkMessage( - const MoqtSubscribeAnnouncesOk& message) override { - OnControlMessage(message); - } - void OnSubscribeAnnouncesErrorMessage( - const MoqtSubscribeAnnouncesError& message) override { - OnControlMessage(message); - } - void OnUnsubscribeAnnouncesMessage( - const MoqtUnsubscribeAnnounces& message) override { - OnControlMessage(message); - } - void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) override { - OnControlMessage(message); - } - void OnFetchMessage(const MoqtFetch& message) override { - OnControlMessage(message); - } - void OnFetchCancelMessage(const MoqtFetchCancel& message) override { - OnControlMessage(message); - } - void OnFetchOkMessage(const MoqtFetchOk& message) override { - OnControlMessage(message); - } - void OnFetchErrorMessage(const MoqtFetchError& message) override { - OnControlMessage(message); - } - void OnRequestsBlockedMessage(const MoqtRequestsBlocked& message) override { - OnControlMessage(message); - } - void OnObjectAckMessage(const MoqtObjectAck& message) override { - OnControlMessage(message); - } - void OnParsingError(MoqtError code, absl::string_view reason) override { - QUIC_LOG(INFO) << "Parsing error: " << reason; - parsing_error_ = reason; - parsing_error_code_ = code; - } - - std::string object_payload() { return absl::StrJoin(object_payloads_, ""); } - - std::vector<std::string> object_payloads_; - bool end_of_message_ = false; - std::optional<std::string> parsing_error_; - MoqtError parsing_error_code_; - uint64_t messages_received_ = 0; - std::optional<TestMessageBase::MessageStructuredData> last_message_; -}; - class MoqtParserTest : public quic::test::QuicTestWithParam<MoqtParserTestParams> { public:
diff --git a/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h b/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h new file mode 100644 index 0000000..759922c --- /dev/null +++ b/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h
@@ -0,0 +1,150 @@ +// Copyright (c) 2025 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_PARSER_TEST_VISITOR_H_ +#define QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_PARSER_TEST_VISITOR_H_ + +#include <cstdint> +#include <optional> +#include <string> +#include <vector> + +#include "absl/strings/str_join.h" +#include "absl/strings/string_view.h" +#include "quiche/quic/moqt/moqt_messages.h" +#include "quiche/quic/moqt/moqt_parser.h" +#include "quiche/quic/moqt/test_tools/moqt_test_message.h" +#include "quiche/common/platform/api/quiche_logging.h" + +namespace moqt::test { + +class MoqtParserTestVisitor : public MoqtControlParserVisitor, + public MoqtDataParserVisitor { + public: + explicit MoqtParserTestVisitor(bool enable_logging = true) + : enable_logging_(enable_logging) {} + ~MoqtParserTestVisitor() = default; + + void OnObjectMessage(const MoqtObject& message, absl::string_view payload, + bool end_of_message) override { + MoqtObject object = message; + object_payloads_.push_back(std::string(payload)); + end_of_message_ = end_of_message; + if (end_of_message) { + ++messages_received_; + } + last_message_ = TestMessageBase::MessageStructuredData(object); + } + template <typename Message> + void OnControlMessage(const Message& message) { + end_of_message_ = true; + ++messages_received_; + last_message_ = TestMessageBase::MessageStructuredData(message); + } + void OnClientSetupMessage(const MoqtClientSetup& message) override { + OnControlMessage(message); + } + void OnServerSetupMessage(const MoqtServerSetup& message) override { + OnControlMessage(message); + } + void OnSubscribeMessage(const MoqtSubscribe& message) override { + OnControlMessage(message); + } + void OnSubscribeOkMessage(const MoqtSubscribeOk& message) override { + OnControlMessage(message); + } + void OnSubscribeErrorMessage(const MoqtSubscribeError& message) override { + OnControlMessage(message); + } + void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) override { + OnControlMessage(message); + } + void OnUnsubscribeMessage(const MoqtUnsubscribe& message) override { + OnControlMessage(message); + } + void OnSubscribeDoneMessage(const MoqtSubscribeDone& message) override { + OnControlMessage(message); + } + void OnAnnounceMessage(const MoqtAnnounce& message) override { + OnControlMessage(message); + } + void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override { + OnControlMessage(message); + } + void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override { + OnControlMessage(message); + } + void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override { + OnControlMessage(message); + } + void OnTrackStatusRequestMessage( + const MoqtTrackStatusRequest& message) override { + OnControlMessage(message); + } + void OnUnannounceMessage(const MoqtUnannounce& message) override { + OnControlMessage(message); + } + void OnTrackStatusMessage(const MoqtTrackStatus& message) override { + OnControlMessage(message); + } + void OnGoAwayMessage(const MoqtGoAway& message) override { + OnControlMessage(message); + } + void OnSubscribeAnnouncesMessage( + const MoqtSubscribeAnnounces& message) override { + OnControlMessage(message); + } + void OnSubscribeAnnouncesOkMessage( + const MoqtSubscribeAnnouncesOk& message) override { + OnControlMessage(message); + } + void OnSubscribeAnnouncesErrorMessage( + const MoqtSubscribeAnnouncesError& message) override { + OnControlMessage(message); + } + void OnUnsubscribeAnnouncesMessage( + const MoqtUnsubscribeAnnounces& message) override { + OnControlMessage(message); + } + void OnMaxRequestIdMessage(const MoqtMaxRequestId& message) override { + OnControlMessage(message); + } + void OnFetchMessage(const MoqtFetch& message) override { + OnControlMessage(message); + } + void OnFetchCancelMessage(const MoqtFetchCancel& message) override { + OnControlMessage(message); + } + void OnFetchOkMessage(const MoqtFetchOk& message) override { + OnControlMessage(message); + } + void OnFetchErrorMessage(const MoqtFetchError& message) override { + OnControlMessage(message); + } + void OnRequestsBlockedMessage(const MoqtRequestsBlocked& message) override { + OnControlMessage(message); + } + void OnObjectAckMessage(const MoqtObjectAck& message) override { + OnControlMessage(message); + } + void OnParsingError(MoqtError code, absl::string_view reason) override { + QUICHE_LOG_IF(INFO, enable_logging_) << "Parsing error: " << reason; + parsing_error_ = reason; + parsing_error_code_ = code; + } + + std::string object_payload() { return absl::StrJoin(object_payloads_, ""); } + + bool enable_logging_ = true; + std::vector<std::string> object_payloads_; + bool end_of_message_ = false; + std::optional<std::string> parsing_error_; + MoqtError parsing_error_code_; + uint64_t messages_received_ = 0; + std::optional<TestMessageBase::MessageStructuredData> last_message_; +}; + +} // namespace moqt::test + +#endif // QUICHE_QUIC_MOQT_TEST_TOOLS_MOQT_PARSER_TEST_VISITOR_H_