blob: b09adf44a766cb6f6f5b772bb69221b39acf04f4 [file] [log] [blame] [edit]
// Copyright 2023 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_subscribe_windows.h"
#include <cstdint>
#include <optional>
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/platform/api/quic_expect_bug.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace moqt {
namespace test {
class QUICHE_EXPORT SubscribeWindowTest : public quic::test::QuicTest {
public:
SubscribeWindowTest() {}
const uint64_t subscribe_id_ = 2;
const FullSequence start_{4, 0};
const FullSequence end_{5, 5};
};
TEST_F(SubscribeWindowTest, Queries) {
SubscribeWindow window(start_, end_);
EXPECT_TRUE(window.InWindow(FullSequence(4, 0)));
EXPECT_TRUE(window.InWindow(FullSequence(5, 5)));
EXPECT_FALSE(window.InWindow(FullSequence(5, 6)));
EXPECT_FALSE(window.InWindow(FullSequence(6, 0)));
EXPECT_FALSE(window.InWindow(FullSequence(3, 12)));
}
TEST_F(SubscribeWindowTest, AddQueryRemoveStreamIdSubgroup) {
SendStreamMap stream_map(MoqtForwardingPreference::kSubgroup);
stream_map.AddStream(FullSequence{4, 0}, 2);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(5, 0)), std::nullopt);
stream_map.AddStream(FullSequence{5, 2}, 6);
EXPECT_QUIC_BUG(stream_map.AddStream(FullSequence{5, 3}, 6),
"Stream already added");
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(4, 1)), 2);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(5, 0)), 6);
stream_map.RemoveStream(FullSequence{5, 1}, 6);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(5, 2)), std::nullopt);
}
TEST_F(SubscribeWindowTest, AddQueryRemoveStreamIdDatagram) {
SendStreamMap stream_map(MoqtForwardingPreference::kDatagram);
stream_map.AddStream(FullSequence{4, 0}, 2),
stream_map.AddStream(FullSequence{4, 1}, 6);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(4, 0)), 2);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(4, 1)), 6);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(4, 2)), std::nullopt);
stream_map.RemoveStream(FullSequence{4, 1}, 6);
EXPECT_EQ(stream_map.GetStreamForSequence(FullSequence(4, 1)), std::nullopt);
}
TEST_F(SubscribeWindowTest, UpdateStartEnd) {
SubscribeWindow window(start_, end_);
EXPECT_TRUE(window.UpdateStartEnd(start_.next(),
FullSequence(end_.group, end_.object - 1)));
EXPECT_FALSE(window.InWindow(FullSequence(start_.group, start_.object)));
EXPECT_FALSE(window.InWindow(FullSequence(end_.group, end_.object)));
EXPECT_FALSE(
window.UpdateStartEnd(start_, FullSequence(end_.group, end_.object - 1)));
EXPECT_FALSE(window.UpdateStartEnd(start_.next(), end_));
}
TEST_F(SubscribeWindowTest, UpdateStartEndOpenEnded) {
SubscribeWindow window(start_, std::nullopt);
EXPECT_TRUE(window.UpdateStartEnd(start_, end_));
EXPECT_FALSE(window.InWindow(end_.next()));
EXPECT_FALSE(window.UpdateStartEnd(start_, std::nullopt));
}
} // namespace test
} // namespace moqt