| // Copyright 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_TOOLS_MOCK_MOQT_SESSION_H_ |
| #define QUICHE_QUIC_MOQT_TOOLS_MOCK_MOQT_SESSION_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| #include <optional> |
| #include <utility> |
| |
| #include "absl/base/nullability.h" |
| #include "absl/status/status.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/types/span.h" |
| #include "quiche/quic/core/quic_alarm_factory.h" |
| #include "quiche/quic/core/quic_clock.h" |
| #include "quiche/quic/core/quic_types.h" |
| #include "quiche/quic/moqt/moqt_bidi_stream.h" |
| #include "quiche/quic/moqt/moqt_error.h" |
| #include "quiche/quic/moqt/moqt_fetch_task.h" |
| #include "quiche/quic/moqt/moqt_framer.h" |
| #include "quiche/quic/moqt/moqt_key_value_pair.h" |
| #include "quiche/quic/moqt/moqt_live_publisher.h" |
| #include "quiche/quic/moqt/moqt_messages.h" |
| #include "quiche/quic/moqt/moqt_names.h" |
| #include "quiche/quic/moqt/moqt_parser.h" |
| #include "quiche/quic/moqt/moqt_priority.h" |
| #include "quiche/quic/moqt/moqt_publisher.h" |
| #include "quiche/quic/moqt/moqt_session_callbacks.h" |
| #include "quiche/quic/moqt/moqt_session_interface.h" |
| #include "quiche/quic/moqt/moqt_trace_recorder.h" |
| #include "quiche/quic/moqt/moqt_types.h" |
| #include "quiche/common/platform/api/quiche_test.h" |
| #include "quiche/common/quiche_mem_slice.h" |
| #include "quiche/common/quiche_weak_ptr.h" |
| #include "quiche/web_transport/test_tools/mock_web_transport.h" |
| #include "quiche/web_transport/web_transport.h" |
| |
| namespace moqt { |
| namespace test { |
| |
| class MockSessionToPublisherInterface : public SessionToPublisherInterface { |
| public: |
| MockSessionToPublisherInterface() : weak_ptr_factory_(this) {} |
| ~MockSessionToPublisherInterface() override = default; |
| MOCK_METHOD(bool, alternate_delivery_timeout, (), (const, override)); |
| MOCK_METHOD(void, UpdateTrackPriority, |
| (uint64_t, std::optional<MoqtTrackPriority>, MoqtTrackPriority), |
| (override)); |
| MOCK_METHOD(quic::QuicAlarmFactory*, alarm_factory, (), (override)); |
| MOCK_METHOD(std::shared_ptr<MoqtTrackPublisher>, GetTrackPublisher, |
| (const FullTrackName&), (override)); |
| MOCK_METHOD(MoqtPublishingMonitorInterface*, ReleaseMonitoringInterface, |
| (const FullTrackName&), (override)); |
| MOCK_METHOD(const quic::QuicClock*, clock, (), (override)); |
| MOCK_METHOD(MoqtTraceRecorder&, trace_recorder, (), (override)); |
| MOCK_METHOD(webtransport::Session*, session, (), (override)); |
| |
| quiche::QuicheWeakPtrFactory<SessionToPublisherInterface> weak_ptr_factory_; |
| }; |
| |
| class MockMoqtSession : public MoqtSessionInterface { |
| public: |
| MOCK_METHOD(MoqtSessionCallbacks&, callbacks, (), (override)); |
| MOCK_METHOD(void, Error, (MoqtError code, absl::string_view error), |
| (override)); |
| MOCK_METHOD(bool, Subscribe, |
| (const FullTrackName& name, SubscribeVisitor* visitor, |
| const MessageParameters& parameters), |
| (override)); |
| MOCK_METHOD(bool, SubscribeUpdate, |
| (const FullTrackName&, const MessageParameters&, |
| MoqtResponseCallback), |
| (override)); |
| MOCK_METHOD(bool, PublishUpdate, |
| (const FullTrackName& name, const MessageParameters& parameters, |
| MoqtResponseCallback response_callback), |
| (override)); |
| MOCK_METHOD(void, Unsubscribe, (const FullTrackName& name), (override)); |
| MOCK_METHOD(bool, Publish, |
| (std::shared_ptr<MoqtTrackPublisher> publisher, |
| const MessageParameters& parameters, |
| const TrackExtensions& extensions, |
| MoqtResponseCallback response_callback), |
| (override)); |
| MOCK_METHOD(bool, Fetch, |
| (const FullTrackName& name, FetchResponseCallback callback, |
| Location start, uint64_t end_group, |
| std::optional<uint64_t> end_object, |
| MessageParameters parameters), |
| (override)); |
| MOCK_METHOD(bool, RelativeJoiningFetch, |
| (const FullTrackName& name, SubscribeVisitor* visitor, |
| uint64_t num_previous_groups, MessageParameters parameters), |
| (override)); |
| MOCK_METHOD(bool, RelativeJoiningFetch, |
| (const FullTrackName& name, SubscribeVisitor* visitor, |
| FetchResponseCallback callback, uint64_t num_previous_groups, |
| MessageParameters parameters), |
| (override)); |
| MOCK_METHOD( |
| bool, PublishNamespace, |
| (const TrackNamespace& track_namespace, |
| const MessageParameters& parameters, |
| MoqtResponseCallback response_callback, |
| quiche::SingleUseCallback<void(MoqtRequestErrorInfo)> cancel_callback), |
| (override)); |
| MOCK_METHOD(bool, PublishNamespaceUpdate, |
| (const TrackNamespace& track_namespace, |
| MessageParameters& parameters, |
| MoqtResponseCallback response_callback), |
| (override)); |
| MOCK_METHOD(bool, PublishNamespaceDone, |
| (const TrackNamespace& track_namespace), (override)); |
| MOCK_METHOD(bool, PublishNamespaceCancel, |
| (const TrackNamespace& track_namespace, |
| RequestErrorCode error_code, absl::string_view error_reason), |
| (override)); |
| MOCK_METHOD(std::unique_ptr<MoqtNamespaceTask>, SubscribeNamespace, |
| (TrackNamespace&, const MessageParameters&, MoqtResponseCallback), |
| (override)); |
| MOCK_METHOD(bool, SubscribeTracks, |
| (TrackNamespace&, const MessageParameters&, MoqtResponseCallback), |
| (override)); |
| MOCK_METHOD(void, UnsubscribeTracks, (TrackNamespace&), (override)); |
| |
| quiche::QuicheWeakPtr<MoqtSessionInterface> GetWeakPtr() override { |
| return weak_factory_.Create(); |
| } |
| quiche::QuicheWeakPtrFactory<MoqtSessionInterface> weak_factory_{this}; |
| }; |
| |
| inline void ExpectFin(webtransport::test::MockStream& stream, |
| bool has_data = false) { |
| EXPECT_CALL(stream, Writev) |
| .WillOnce([has_data](absl::Span<quiche::QuicheMemSlice> data, |
| const webtransport::StreamWriteOptions& options) { |
| EXPECT_EQ(data.empty(), !has_data); |
| EXPECT_TRUE(options.send_fin()); |
| return absl::OkStatus(); |
| }); |
| } |
| |
| class MockBidiStream : public MoqtBidiStreamBase { |
| public: |
| MockBidiStream() |
| : MoqtBidiStreamBase(reinterpret_cast<MoqtFramer*>(0x1), |
| MoqtControlMessageParser( |
| "moqt-00", true, quic::Perspective::IS_CLIENT), |
| nullptr) {} |
| MockBidiStream(MoqtFramer* absl_nonnull framer, |
| const MoqtControlMessageParser& message_parser, |
| SessionErrorCallback session_error_callback) |
| : MoqtBidiStreamBase(framer, message_parser, |
| std::move(session_error_callback)) {} |
| |
| MOCK_METHOD(absl::Status, SendRequestUpdate, |
| (uint64_t request_id, uint64_t existing_request_id, |
| const MessageParameters& parameters, |
| MoqtResponseCallback callback), |
| (override)); |
| MOCK_METHOD(void, Detach, (), (override)); |
| MOCK_METHOD(void, OnStreamBound, (), (override)); |
| MOCK_METHOD(absl::Status, OnRawControlMessage, |
| (const MoqtRawControlMessage& message), (override)); |
| MOCK_METHOD(absl::Status, OnControlMessage, (const MoqtRequestOk& message), |
| (override)); |
| MOCK_METHOD(absl::Status, OnControlMessage, (const MoqtRequestError& message), |
| (override)); |
| }; |
| |
| } // namespace test |
| } // namespace moqt |
| |
| #endif // QUICHE_QUIC_MOQT_TOOLS_MOCK_MOQT_SESSION_H_ |