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