blob: d5eeacc583cddb85f1e33428bfe48ab3bea96df8 [file]
// 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_