// 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.

#include "quiche/quic/moqt/moqt_relay_publisher.h"

#include <memory>
#include <utility>
#include <variant>

#include "absl/strings/string_view.h"
#include "quiche/quic/moqt/moqt_error.h"
#include "quiche/quic/moqt/moqt_key_value_pair.h"
#include "quiche/quic/moqt/moqt_names.h"
#include "quiche/quic/moqt/moqt_publisher.h"
#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/quic/moqt/test_tools/mock_moqt_session.h"
#include "quiche/quic/moqt/test_tools/moqt_mock_visitor.h"
#include "quiche/common/platform/api/quiche_test.h"
#include "quiche/common/quiche_weak_ptr.h"

namespace moqt {
namespace test {

class MoqtRelayPublisherTest : public quiche::test::QuicheTest {
 public:
  MoqtSessionCallbacks callbacks_;
  MockMoqtSession session_;
  MoqtRelayPublisher publisher_;
  MockMoqtObjectListener object_listener_;
};

TEST_F(MoqtRelayPublisherTest, SetDefaultUpstreamSession) {
  EXPECT_FALSE(publisher_.GetDefaultUpstreamSession().IsValid());
  EXPECT_CALL(session_, callbacks).WillOnce(testing::ReturnRef(callbacks_));
  publisher_.SetDefaultUpstreamSession(&session_);
  EXPECT_TRUE(publisher_.GetDefaultUpstreamSession().IsValid());
  EXPECT_EQ(publisher_.GetDefaultUpstreamSession().GetIfAvailable(), &session_);
  // Destroy the session.
  std::move(callbacks_.session_terminated_callback)("test");
  EXPECT_FALSE(publisher_.GetDefaultUpstreamSession().IsValid());
}

TEST_F(MoqtRelayPublisherTest, SetDefaultUpstreamSessionTwice) {
  EXPECT_FALSE(publisher_.GetDefaultUpstreamSession().IsValid());
  EXPECT_CALL(session_, callbacks()).WillOnce(testing::ReturnRef(callbacks_));
  publisher_.SetDefaultUpstreamSession(&session_);
  EXPECT_TRUE(publisher_.GetDefaultUpstreamSession().IsValid());
  EXPECT_EQ(publisher_.GetDefaultUpstreamSession().GetIfAvailable(), &session_);

  MockMoqtSession session2;
  MoqtSessionCallbacks callbacks2;
  EXPECT_CALL(session_, callbacks).WillOnce(testing::ReturnRef(callbacks_));
  EXPECT_CALL(session2, callbacks).WillOnce(testing::ReturnRef(callbacks2));
  publisher_.SetDefaultUpstreamSession(&session2);
  EXPECT_TRUE(publisher_.GetDefaultUpstreamSession().IsValid());
  EXPECT_EQ(publisher_.GetDefaultUpstreamSession().GetIfAvailable(), &session2);

  // Destroying the old session doesn't affect the publisher.
  std::move(callbacks_.session_terminated_callback)("test");
  EXPECT_TRUE(publisher_.GetDefaultUpstreamSession().IsValid());

  // Destroying the new session does.
  std::move(callbacks2.session_terminated_callback)("test");
  EXPECT_FALSE(publisher_.GetDefaultUpstreamSession().IsValid());
}

TEST_F(MoqtRelayPublisherTest, GetTrackFromDefaultUpstream) {
  EXPECT_EQ(publisher_.GetTrack(FullTrackName("foo", "bar")), nullptr);
  EXPECT_CALL(session_, callbacks).WillOnce(testing::ReturnRef(callbacks_));
  publisher_.SetDefaultUpstreamSession(&session_);
  std::shared_ptr<MoqtTrackPublisher> track =
      publisher_.GetTrack(FullTrackName("foo", "bar"));
  EXPECT_NE(track, nullptr);
  EXPECT_EQ(track->GetTrackName(), FullTrackName("foo", "bar"));
}

TEST_F(MoqtRelayPublisherTest, PublishNamespaceLifecycle) {
  EXPECT_EQ(publisher_.GetTrack(FullTrackName("foo", "bar")), nullptr);
  publisher_.OnPublishNamespace(
      TrackNamespace({"foo"}), MessageParameters(), &session_,
      [&](std::variant<MessageParameters, MoqtRequestErrorInfo> response) {
        EXPECT_TRUE(std::holds_alternative<MessageParameters>(response));
      });
  std::shared_ptr<MoqtTrackPublisher> track =
      publisher_.GetTrack(FullTrackName("foo", "bar"));
  EXPECT_NE(track, nullptr);
  EXPECT_CALL(session_, Subscribe);
  track->AddObjectListener(&object_listener_);
  track->RemoveObjectListener(&object_listener_);
  publisher_.OnPublishNamespaceDone(TrackNamespace({"foo"}), &session_);
  EXPECT_EQ(publisher_.GetTrack(FullTrackName("foo", "bar")), nullptr);
}

}  // namespace test
}  // namespace moqt
