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