blob: ae5cb9443b44824a25d36f2b8319decf8afa5161 [file] [log] [blame] [edit]
// Copyright 2024 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_priority.h"
#include "quiche/common/platform/api/quiche_test.h"
namespace moqt {
namespace {
TEST(MoqtPriorityTest, SubgroupPriorities) {
// MoQT track priorities are descending (0 is highest), but WebTransport send
// order is ascending.
EXPECT_GT(
SendOrderForStream(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForStream(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
// Subscriber priority takes precedence over the sender priority.
EXPECT_GT(
SendOrderForStream(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kAscending));
// Group order breaks ties.
EXPECT_GT(
SendOrderForStream(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0x10, 1, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForStream(0x10, 0x80, 1, 0, MoqtDeliveryOrder::kDescending),
SendOrderForStream(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kDescending));
// Subgroup order breaks tied group IDs.
EXPECT_GT(
SendOrderForStream(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0x10, 0, 1, MoqtDeliveryOrder::kAscending));
// Test extreme priority values (0x00 and 0xff).
EXPECT_GT(
SendOrderForStream(0x00, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0xff, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForStream(0x80, 0x00, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForStream(0x80, 0xff, 0, 0, MoqtDeliveryOrder::kAscending));
}
TEST(MoqtPriorityTest, DatagramPriorities) {
// MoQT track priorities are descending (0 is highest), but WebTransport send
// order is ascending.
EXPECT_GT(
SendOrderForDatagram(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForDatagram(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
// Subscriber priority takes precedence over the sender priority.
EXPECT_GT(
SendOrderForDatagram(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kAscending));
// Group order breaks ties.
EXPECT_GT(
SendOrderForDatagram(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0x10, 1, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForDatagram(0x10, 0x80, 1, 0, MoqtDeliveryOrder::kDescending),
SendOrderForDatagram(0x80, 0x10, 0, 0, MoqtDeliveryOrder::kDescending));
// Object ID breaks tied group IDs.
EXPECT_GT(
SendOrderForDatagram(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0x10, 0, 1, MoqtDeliveryOrder::kAscending));
// Test extreme priority values (0x00 and 0xff).
EXPECT_GT(
SendOrderForDatagram(0x00, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0xff, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
EXPECT_GT(
SendOrderForDatagram(0x80, 0x00, 0, 0, MoqtDeliveryOrder::kAscending),
SendOrderForDatagram(0x80, 0xff, 0, 0, MoqtDeliveryOrder::kAscending));
}
TEST(MoqtPriorityTest, FetchPriorities) {
EXPECT_LT(SendOrderForFetch(0x10),
SendOrderForStream(0x10, 0x05, 0x06, 0x03,
MoqtDeliveryOrder::kDescending));
EXPECT_LT(SendOrderForFetch(0x10),
SendOrderForStream(0x09, 0x05, 0x06, 0x03,
MoqtDeliveryOrder::kDescending));
EXPECT_GT(SendOrderForFetch(0x10),
SendOrderForStream(0x11, 0x05, 0x06, 0x03,
MoqtDeliveryOrder::kDescending));
EXPECT_GT(SendOrderForFetch(0x10), SendOrderForFetch(0x11));
}
TEST(MoqtPriorityTest, ControlStream) {
EXPECT_GT(
kMoqtControlStreamSendOrder,
SendOrderForStream(0x00, 0x00, 0, 0, MoqtDeliveryOrder::kAscending));
}
TEST(MoqtPriorityTest, UpdateSendOrderForSubscriberPriority) {
EXPECT_EQ(
UpdateSendOrderForSubscriberPriority(
SendOrderForStream(0x80, 0x80, 0, 0, MoqtDeliveryOrder::kAscending),
0x10),
SendOrderForStream(0x10, 0x80, 0, 0, MoqtDeliveryOrder::kAscending));
}
} // namespace
} // namespace moqt