2 * Copyright 2019 The WebRTC project authors. All Rights Reserved.
4 * 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.
11 #include "pc/used_ids.h"
13 #include "absl/strings/string_view.h"
14 #include "test/gtest.h"
16 using cricket::UsedIds
;
17 using cricket::UsedRtpHeaderExtensionIds
;
23 TEST(UsedIdsTest
, UniqueIdsAreUnchanged
) {
24 UsedIds
<Foo
> used_ids(1, 5);
25 for (int i
= 1; i
<= 5; ++i
) {
27 used_ids
.FindAndSetIdUsed(&id
);
32 TEST(UsedIdsTest
, IdsOutsideRangeAreUnchanged
) {
33 UsedIds
<Foo
> used_ids(1, 5);
37 Foo id_12_collision
= {12};
39 Foo id_13_collision
= {13};
41 used_ids
.FindAndSetIdUsed(&id_11
);
42 EXPECT_EQ(id_11
.id
, 11);
43 used_ids
.FindAndSetIdUsed(&id_12
);
44 EXPECT_EQ(id_12
.id
, 12);
45 used_ids
.FindAndSetIdUsed(&id_12_collision
);
46 EXPECT_EQ(id_12_collision
.id
, 12);
47 used_ids
.FindAndSetIdUsed(&id_13
);
48 EXPECT_EQ(id_13
.id
, 13);
49 used_ids
.FindAndSetIdUsed(&id_13_collision
);
50 EXPECT_EQ(id_13_collision
.id
, 13);
53 TEST(UsedIdsTest
, CollisionsAreReassignedIdsInReverseOrder
) {
54 UsedIds
<Foo
> used_ids(1, 10);
57 Foo id_2_collision
= {2};
59 Foo id_3_collision
= {3};
61 used_ids
.FindAndSetIdUsed(&id_1
);
62 used_ids
.FindAndSetIdUsed(&id_2
);
63 used_ids
.FindAndSetIdUsed(&id_2_collision
);
64 EXPECT_EQ(id_2_collision
.id
, 10);
65 used_ids
.FindAndSetIdUsed(&id_3
);
66 used_ids
.FindAndSetIdUsed(&id_3_collision
);
67 EXPECT_EQ(id_3_collision
.id
, 9);
71 UsedRtpHeaderExtensionIds::IdDomain id_domain
;
75 class UsedRtpHeaderExtensionIdsTest
76 : public ::testing::TestWithParam
<TestParams
> {};
78 constexpr TestParams kOneByteTestParams
= {
79 UsedRtpHeaderExtensionIds::IdDomain::kOneByteOnly
, 14};
80 constexpr TestParams kTwoByteTestParams
= {
81 UsedRtpHeaderExtensionIds::IdDomain::kTwoByteAllowed
, 255};
83 INSTANTIATE_TEST_SUITE_P(All
,
84 UsedRtpHeaderExtensionIdsTest
,
85 ::testing::Values(kOneByteTestParams
,
88 TEST_P(UsedRtpHeaderExtensionIdsTest
, UniqueIdsAreUnchanged
) {
89 UsedRtpHeaderExtensionIds
used_ids(GetParam().id_domain
);
92 for (int j
= 1; j
<= GetParam().max_id
; ++j
) {
93 webrtc::RtpExtension
extension("", j
);
94 used_ids
.FindAndSetIdUsed(&extension
);
95 EXPECT_EQ(extension
.id
, j
);
99 TEST_P(UsedRtpHeaderExtensionIdsTest
, PrioritizeReassignmentToOneByteIds
) {
100 UsedRtpHeaderExtensionIds
used_ids(GetParam().id_domain
);
101 webrtc::RtpExtension
id_1("", 1);
102 webrtc::RtpExtension
id_2("", 2);
103 webrtc::RtpExtension
id_2_collision("", 2);
104 webrtc::RtpExtension
id_3("", 3);
105 webrtc::RtpExtension
id_3_collision("", 3);
107 // Expect that colliding IDs are reassigned to one-byte IDs.
108 used_ids
.FindAndSetIdUsed(&id_1
);
109 used_ids
.FindAndSetIdUsed(&id_2
);
110 used_ids
.FindAndSetIdUsed(&id_2_collision
);
111 EXPECT_EQ(id_2_collision
.id
, 14);
112 used_ids
.FindAndSetIdUsed(&id_3
);
113 used_ids
.FindAndSetIdUsed(&id_3_collision
);
114 EXPECT_EQ(id_3_collision
.id
, 13);
117 TEST_F(UsedRtpHeaderExtensionIdsTest
, TwoByteIdsAllowed
) {
118 UsedRtpHeaderExtensionIds
used_ids(
119 UsedRtpHeaderExtensionIds::IdDomain::kTwoByteAllowed
);
121 // Fill all one byte IDs.
122 for (int i
= 1; i
< 15; ++i
) {
123 webrtc::RtpExtension
id("", i
);
124 used_ids
.FindAndSetIdUsed(&id
);
127 // Add new extensions with colliding IDs.
128 webrtc::RtpExtension
id1_collision("", 1);
129 webrtc::RtpExtension
id2_collision("", 2);
130 webrtc::RtpExtension
id3_collision("", 3);
132 // Expect to reassign to two-byte header extension IDs.
133 used_ids
.FindAndSetIdUsed(&id1_collision
);
134 EXPECT_EQ(id1_collision
.id
, 15);
135 used_ids
.FindAndSetIdUsed(&id2_collision
);
136 EXPECT_EQ(id2_collision
.id
, 16);
137 used_ids
.FindAndSetIdUsed(&id3_collision
);
138 EXPECT_EQ(id3_collision
.id
, 17);
142 // Disabled on Android because death tests misbehave on Android, see
143 // base/test/gtest_util.h.
144 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
145 TEST(UsedIdsDeathTest
, DieWhenAllIdsAreOccupied
) {
146 UsedIds
<Foo
> used_ids(1, 5);
147 for (int i
= 1; i
<= 5; ++i
) {
149 used_ids
.FindAndSetIdUsed(&id
);
151 Foo id_collision
= {3};
152 EXPECT_DEATH(used_ids
.FindAndSetIdUsed(&id_collision
), "");
155 using UsedRtpHeaderExtensionIdsDeathTest
= UsedRtpHeaderExtensionIdsTest
;
156 INSTANTIATE_TEST_SUITE_P(All
,
157 UsedRtpHeaderExtensionIdsDeathTest
,
158 ::testing::Values(kOneByteTestParams
,
159 kTwoByteTestParams
));
161 TEST_P(UsedRtpHeaderExtensionIdsDeathTest
, DieWhenAllIdsAreOccupied
) {
162 UsedRtpHeaderExtensionIds
used_ids(GetParam().id_domain
);
165 for (int j
= 1; j
<= GetParam().max_id
; ++j
) {
166 webrtc::RtpExtension
id("", j
);
167 used_ids
.FindAndSetIdUsed(&id
);
170 webrtc::RtpExtension
id1_collision("", 1);
171 webrtc::RtpExtension
id2_collision("", 2);
172 webrtc::RtpExtension
id3_collision("", GetParam().max_id
);
174 EXPECT_DEATH(used_ids
.FindAndSetIdUsed(&id1_collision
), "");
175 EXPECT_DEATH(used_ids
.FindAndSetIdUsed(&id2_collision
), "");
176 EXPECT_DEATH(used_ids
.FindAndSetIdUsed(&id3_collision
), "");
178 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)