blob: be93d7ded8931bbe7c15fbe614038fd5c540fc4c [file] [log] [blame]
solenberg7e4e01a2015-12-02 08:05:01 -08001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
solenberg7e4e01a2015-12-02 08:05:01 -08003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
solenberg7e4e01a2015-12-02 08:05:01 -08009 */
10
11#include "testing/gtest/include/gtest/gtest.h"
12
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010013#include "webrtc/media/engine/webrtcmediaengine.h"
solenberg7e4e01a2015-12-02 08:05:01 -080014
15namespace cricket {
16namespace {
17
18std::vector<RtpHeaderExtension> MakeUniqueExtensions() {
19 std::vector<RtpHeaderExtension> result;
20 char name[] = "a";
21 for (int i = 0; i < 7; ++i) {
22 result.push_back(RtpHeaderExtension(name, 1 + i));
23 name[0]++;
24 result.push_back(RtpHeaderExtension(name, 14 - i));
25 name[0]++;
26 }
27 return result;
28}
29
30std::vector<RtpHeaderExtension> MakeRedundantExtensions() {
31 std::vector<RtpHeaderExtension> result;
32 char name[] = "a";
33 for (int i = 0; i < 7; ++i) {
34 result.push_back(RtpHeaderExtension(name, 1 + i));
35 result.push_back(RtpHeaderExtension(name, 14 - i));
36 name[0]++;
37 }
38 return result;
39}
40
41bool SupportedExtensions1(const std::string& name) {
42 return name == "c" || name == "i";
43}
44
45bool SupportedExtensions2(const std::string& name) {
46 return name != "a" && name != "n";
47}
48
49bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
50 const std::string* last = nullptr;
51 for (const auto& extension : extensions) {
52 if (last && *last > extension.name) {
53 return false;
54 }
55 last = &extension.name;
56 }
57 return true;
58}
59} // namespace
60
61TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
62 std::vector<RtpHeaderExtension> extensions;
63 EXPECT_TRUE(ValidateRtpExtensions(extensions));
64}
65
66TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
67 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
68 EXPECT_TRUE(ValidateRtpExtensions(extensions));
69}
70
71TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
72 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
73 extensions.push_back(RtpHeaderExtension("foo", 0));
74 EXPECT_FALSE(ValidateRtpExtensions(extensions));
75}
76
77TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
78 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
79 extensions.push_back(RtpHeaderExtension("foo", 15));
80 EXPECT_FALSE(ValidateRtpExtensions(extensions));
81}
82
83TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
84 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
85 extensions.push_back(RtpHeaderExtension("foo", 1));
86 EXPECT_FALSE(ValidateRtpExtensions(extensions));
87}
88
89TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
90 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
91 extensions.push_back(RtpHeaderExtension("foo", 14));
92 EXPECT_FALSE(ValidateRtpExtensions(extensions));
93}
94
95TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
96 std::vector<RtpHeaderExtension> extensions;
97 std::vector<webrtc::RtpExtension> filtered =
98 FilterRtpExtensions(extensions, SupportedExtensions1, true);
99 EXPECT_EQ(0, filtered.size());
100}
101
102TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
103 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
104 std::vector<webrtc::RtpExtension> filtered =
105 FilterRtpExtensions(extensions, SupportedExtensions1, false);
106 EXPECT_EQ(2, filtered.size());
107 EXPECT_EQ("c", filtered[0].name);
108 EXPECT_EQ("i", filtered[1].name);
109}
110
111TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
112 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
113 std::vector<webrtc::RtpExtension> filtered =
114 FilterRtpExtensions(extensions, SupportedExtensions2, false);
115 EXPECT_EQ(12, filtered.size());
116 EXPECT_TRUE(IsSorted(filtered));
117}
118
119TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
120 std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
121 std::vector<webrtc::RtpExtension> filtered =
122 FilterRtpExtensions(extensions, SupportedExtensions2, true);
123 EXPECT_EQ(12, filtered.size());
124 EXPECT_TRUE(IsSorted(filtered));
125}
126
127TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
128 std::vector<RtpHeaderExtension> extensions = MakeRedundantExtensions();
129 std::vector<webrtc::RtpExtension> filtered =
130 FilterRtpExtensions(extensions, SupportedExtensions2, false);
131 EXPECT_EQ(12, filtered.size());
132 EXPECT_TRUE(IsSorted(filtered));
133 EXPECT_EQ(filtered[0].name, filtered[1].name);
134}
135
136TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
137 std::vector<RtpHeaderExtension> extensions = MakeRedundantExtensions();
138 std::vector<webrtc::RtpExtension> filtered =
139 FilterRtpExtensions(extensions, SupportedExtensions2, true);
140 EXPECT_EQ(6, filtered.size());
141 EXPECT_TRUE(IsSorted(filtered));
142 EXPECT_NE(filtered[0].name, filtered[1].name);
143}
144
145TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
146 std::vector<RtpHeaderExtension> extensions;
147 extensions.push_back(
148 RtpHeaderExtension(kRtpTransportSequenceNumberHeaderExtension, 3));
149 extensions.push_back(
150 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 9));
151 extensions.push_back(
152 RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, 6));
153 extensions.push_back(
154 RtpHeaderExtension(kRtpTransportSequenceNumberHeaderExtension, 1));
155 extensions.push_back(
156 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 14));
157 std::vector<webrtc::RtpExtension> filtered =
158 FilterRtpExtensions(extensions, SupportedExtensions2, true);
159 EXPECT_EQ(1, filtered.size());
160 EXPECT_EQ(kRtpTransportSequenceNumberHeaderExtension, filtered[0].name);
161}
162
163TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
164 std::vector<RtpHeaderExtension> extensions;
165 extensions.push_back(
166 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 1));
167 extensions.push_back(
168 RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, 14));
169 extensions.push_back(
170 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 7));
171 std::vector<webrtc::RtpExtension> filtered =
172 FilterRtpExtensions(extensions, SupportedExtensions2, true);
173 EXPECT_EQ(1, filtered.size());
174 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtension, filtered[0].name);
175}
176
177TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
178 std::vector<RtpHeaderExtension> extensions;
179 extensions.push_back(
180 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 2));
181 extensions.push_back(
182 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 14));
183 std::vector<webrtc::RtpExtension> filtered =
184 FilterRtpExtensions(extensions, SupportedExtensions2, true);
185 EXPECT_EQ(1, filtered.size());
186 EXPECT_EQ(kRtpTimestampOffsetHeaderExtension, filtered[0].name);
187}
188} // namespace cricket