blob: 444ea85a42090cfc990fd07464693a4410074f7a [file] [edit]
// Copyright 2026 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_request_update_queue.h"
#include <optional>
#include <utility>
#include <variant>
#include "absl/status/status.h"
#include "quiche/quic/moqt/moqt_error.h"
#include "quiche/quic/moqt/moqt_fetch_task.h"
#include "quiche/quic/moqt/moqt_key_value_pair.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/common/platform/api/quiche_test.h"
#include "quiche/common/test_tools/quiche_test_utils.h"
namespace moqt::test {
TEST(MoqtRequestUpdateQueueTest, EmptyQueue) {
MoqtRequestUpdateQueue queue;
EXPECT_TRUE(queue.empty());
EXPECT_EQ(queue.NextParameters().status().code(),
absl::StatusCode::kFailedPrecondition);
}
TEST(MoqtRequestUpdateQueueTest, EnqueueAndReceiveOk) {
MoqtRequestUpdateQueue queue;
MessageParameters params1;
params1.subscriber_priority = 20;
MessageParameters params2;
params2.subscriber_priority = 25;
bool callback1_called = false;
MoqtResponseCallback callback1 =
[&](std::variant<MessageParameters, MoqtRequestErrorInfo> res) {
callback1_called = true;
ASSERT_TRUE(std::holds_alternative<MessageParameters>(res));
EXPECT_EQ(std::get<MessageParameters>(res).subscriber_priority, 30);
};
bool callback2_called = false;
MoqtResponseCallback callback2 =
[&](std::variant<MessageParameters, MoqtRequestErrorInfo> res) {
callback2_called = true;
ASSERT_TRUE(std::holds_alternative<MessageParameters>(res));
EXPECT_EQ(std::get<MessageParameters>(res).subscriber_priority, 35);
};
queue.Enqueue(params1, std::move(callback1));
queue.Enqueue(params2, std::move(callback2));
EXPECT_FALSE(queue.empty());
absl::StatusOr<MessageParameters> next_params = queue.NextParameters();
QUICHE_EXPECT_OK(next_params);
EXPECT_EQ(next_params->subscriber_priority, 20);
MoqtRequestOk request_ok1;
request_ok1.parameters.subscriber_priority = 30;
QUICHE_EXPECT_OK(queue.OnControlMessage(request_ok1));
EXPECT_TRUE(callback1_called);
EXPECT_FALSE(callback2_called);
EXPECT_FALSE(queue.empty());
next_params = queue.NextParameters();
QUICHE_EXPECT_OK(next_params);
EXPECT_EQ(next_params->subscriber_priority, 25);
MoqtRequestOk request_ok2;
request_ok2.parameters.subscriber_priority = 35;
QUICHE_EXPECT_OK(queue.OnControlMessage(request_ok2));
EXPECT_TRUE(callback2_called);
EXPECT_TRUE(queue.empty());
EXPECT_EQ(queue.NextParameters().status().code(),
absl::StatusCode::kFailedPrecondition);
}
TEST(MoqtRequestUpdateQueueTest, EnqueueAndReceiveError) {
MoqtRequestUpdateQueue queue;
MessageParameters params;
bool callback_called = false;
MoqtResponseCallback callback =
[&](std::variant<MessageParameters, MoqtRequestErrorInfo> res) {
callback_called = true;
ASSERT_TRUE(std::holds_alternative<MoqtRequestErrorInfo>(res));
EXPECT_EQ(std::get<MoqtRequestErrorInfo>(res).error_code,
RequestErrorCode::kUnauthorized);
};
queue.Enqueue(params, std::move(callback));
EXPECT_FALSE(queue.empty());
MoqtRequestError request_error;
request_error.error_code = RequestErrorCode::kUnauthorized;
request_error.reason_phrase = "unauthorized";
QUICHE_EXPECT_OK(queue.OnControlMessage(request_error));
EXPECT_TRUE(callback_called);
EXPECT_TRUE(queue.empty());
}
} // namespace moqt::test