1 // Copyright 2023 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/moqt/moqt_track.h"
6
7 #include <optional>
8
9 #include "absl/strings/string_view.h"
10 #include "quiche/quic/moqt/moqt_messages.h"
11 #include "quiche/quic/moqt/moqt_subscribe_windows.h"
12 #include "quiche/quic/moqt/tools/moqt_mock_visitor.h"
13 #include "quiche/quic/platform/api/quic_test.h"
14
15 namespace moqt {
16
17 namespace test {
18
19 class LocalTrackTest : public quic::test::QuicTest {
20 public:
LocalTrackTest()21 LocalTrackTest()
22 : track_(FullTrackName("foo", "bar"), MoqtForwardingPreference::kTrack,
23 &visitor_, FullSequence(4, 1)) {}
24 LocalTrack track_;
25 MockLocalTrackVisitor visitor_;
26 };
27
TEST_F(LocalTrackTest,Queries)28 TEST_F(LocalTrackTest, Queries) {
29 EXPECT_EQ(track_.full_track_name(), FullTrackName("foo", "bar"));
30 EXPECT_EQ(track_.track_alias(), std::nullopt);
31 EXPECT_EQ(track_.visitor(), &visitor_);
32 EXPECT_EQ(track_.next_sequence(), FullSequence(4, 1));
33 track_.SentSequence(FullSequence(4, 0));
34 EXPECT_EQ(track_.next_sequence(), FullSequence(4, 1)); // no change
35 track_.SentSequence(FullSequence(4, 1));
36 EXPECT_EQ(track_.next_sequence(), FullSequence(4, 2));
37 EXPECT_FALSE(track_.HasSubscriber());
38 EXPECT_EQ(track_.forwarding_preference(), MoqtForwardingPreference::kTrack);
39 }
40
TEST_F(LocalTrackTest,SetTrackAlias)41 TEST_F(LocalTrackTest, SetTrackAlias) {
42 EXPECT_EQ(track_.track_alias(), std::nullopt);
43 track_.set_track_alias(6);
44 EXPECT_EQ(track_.track_alias(), 6);
45 }
46
TEST_F(LocalTrackTest,AddGetDeleteWindow)47 TEST_F(LocalTrackTest, AddGetDeleteWindow) {
48 track_.AddWindow(0, 4, 1);
49 EXPECT_EQ(track_.GetWindow(0)->subscribe_id(), 0);
50 EXPECT_EQ(track_.GetWindow(1), nullptr);
51 track_.DeleteWindow(0);
52 EXPECT_EQ(track_.GetWindow(0), nullptr);
53 }
54
TEST_F(LocalTrackTest,ShouldSend)55 TEST_F(LocalTrackTest, ShouldSend) {
56 track_.AddWindow(0, 4, 1);
57 EXPECT_TRUE(track_.HasSubscriber());
58 EXPECT_TRUE(track_.ShouldSend(FullSequence(3, 12)).empty());
59 EXPECT_TRUE(track_.ShouldSend(FullSequence(4, 0)).empty());
60 EXPECT_EQ(track_.ShouldSend(FullSequence(4, 1)).size(), 1);
61 EXPECT_EQ(track_.ShouldSend(FullSequence(12, 0)).size(), 1);
62 }
63
64 class RemoteTrackTest : public quic::test::QuicTest {
65 public:
RemoteTrackTest()66 RemoteTrackTest()
67 : track_(FullTrackName("foo", "bar"), /*track_alias=*/5, &visitor_) {}
68 RemoteTrack track_;
69 MockRemoteTrackVisitor visitor_;
70 };
71
TEST_F(RemoteTrackTest,Queries)72 TEST_F(RemoteTrackTest, Queries) {
73 EXPECT_EQ(track_.full_track_name(), FullTrackName("foo", "bar"));
74 EXPECT_EQ(track_.track_alias(), 5);
75 EXPECT_EQ(track_.visitor(), &visitor_);
76 }
77
TEST_F(RemoteTrackTest,UpdateForwardingPreference)78 TEST_F(RemoteTrackTest, UpdateForwardingPreference) {
79 EXPECT_TRUE(
80 track_.CheckForwardingPreference(MoqtForwardingPreference::kObject));
81 EXPECT_TRUE(
82 track_.CheckForwardingPreference(MoqtForwardingPreference::kObject));
83 EXPECT_FALSE(
84 track_.CheckForwardingPreference(MoqtForwardingPreference::kDatagram));
85 }
86
87 // TODO: Write test for GetStreamForSequence.
88
89 } // namespace test
90
91 } // namespace moqt
92