1 /*
2 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
3 *
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.
9 */
10
11 #include "pc/rtcp_mux_filter.h"
12
13 #include "test/gtest.h"
14
TEST(RtcpMuxFilterTest,IsActiveSender)15 TEST(RtcpMuxFilterTest, IsActiveSender) {
16 cricket::RtcpMuxFilter filter;
17 // Init state - not active
18 EXPECT_FALSE(filter.IsActive());
19 EXPECT_FALSE(filter.IsProvisionallyActive());
20 EXPECT_FALSE(filter.IsFullyActive());
21 // After sent offer, demux should not be active.
22 filter.SetOffer(true, cricket::CS_LOCAL);
23 EXPECT_FALSE(filter.IsActive());
24 EXPECT_FALSE(filter.IsProvisionallyActive());
25 EXPECT_FALSE(filter.IsFullyActive());
26 // Remote accepted, filter is now active.
27 filter.SetAnswer(true, cricket::CS_REMOTE);
28 EXPECT_TRUE(filter.IsActive());
29 EXPECT_FALSE(filter.IsProvisionallyActive());
30 EXPECT_TRUE(filter.IsFullyActive());
31 }
32
33 // Test that we can receive provisional answer and final answer.
TEST(RtcpMuxFilterTest,ReceivePrAnswer)34 TEST(RtcpMuxFilterTest, ReceivePrAnswer) {
35 cricket::RtcpMuxFilter filter;
36 filter.SetOffer(true, cricket::CS_LOCAL);
37 // Received provisional answer with mux enabled.
38 EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_REMOTE));
39 // We are now provisionally active since both sender and receiver support mux.
40 EXPECT_TRUE(filter.IsActive());
41 EXPECT_TRUE(filter.IsProvisionallyActive());
42 EXPECT_FALSE(filter.IsFullyActive());
43 // Received provisional answer with mux disabled.
44 EXPECT_TRUE(filter.SetProvisionalAnswer(false, cricket::CS_REMOTE));
45 // We are now inactive since the receiver doesn't support mux.
46 EXPECT_FALSE(filter.IsActive());
47 EXPECT_FALSE(filter.IsProvisionallyActive());
48 EXPECT_FALSE(filter.IsFullyActive());
49 // Received final answer with mux enabled.
50 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_REMOTE));
51 EXPECT_TRUE(filter.IsActive());
52 EXPECT_FALSE(filter.IsProvisionallyActive());
53 EXPECT_TRUE(filter.IsFullyActive());
54 }
55
TEST(RtcpMuxFilterTest,IsActiveReceiver)56 TEST(RtcpMuxFilterTest, IsActiveReceiver) {
57 cricket::RtcpMuxFilter filter;
58 // Init state - not active.
59 EXPECT_FALSE(filter.IsActive());
60 EXPECT_FALSE(filter.IsProvisionallyActive());
61 EXPECT_FALSE(filter.IsFullyActive());
62 // After received offer, demux should not be active
63 filter.SetOffer(true, cricket::CS_REMOTE);
64 EXPECT_FALSE(filter.IsActive());
65 EXPECT_FALSE(filter.IsProvisionallyActive());
66 EXPECT_FALSE(filter.IsFullyActive());
67 // We accept, filter is now active
68 filter.SetAnswer(true, cricket::CS_LOCAL);
69 EXPECT_TRUE(filter.IsActive());
70 EXPECT_FALSE(filter.IsProvisionallyActive());
71 EXPECT_TRUE(filter.IsFullyActive());
72 }
73
74 // Test that we can send provisional answer and final answer.
TEST(RtcpMuxFilterTest,SendPrAnswer)75 TEST(RtcpMuxFilterTest, SendPrAnswer) {
76 cricket::RtcpMuxFilter filter;
77 filter.SetOffer(true, cricket::CS_REMOTE);
78 // Send provisional answer with mux enabled.
79 EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_LOCAL));
80 EXPECT_TRUE(filter.IsActive());
81 EXPECT_TRUE(filter.IsProvisionallyActive());
82 EXPECT_FALSE(filter.IsFullyActive());
83 // Received provisional answer with mux disabled.
84 EXPECT_TRUE(filter.SetProvisionalAnswer(false, cricket::CS_LOCAL));
85 EXPECT_FALSE(filter.IsActive());
86 EXPECT_FALSE(filter.IsProvisionallyActive());
87 EXPECT_FALSE(filter.IsFullyActive());
88 // Send final answer with mux enabled.
89 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
90 EXPECT_TRUE(filter.IsActive());
91 EXPECT_FALSE(filter.IsProvisionallyActive());
92 EXPECT_TRUE(filter.IsFullyActive());
93 }
94
95 // Test that we can enable the filter in an update.
96 // We can not disable the filter later since that would mean we need to
97 // recreate a rtcp transport channel.
TEST(RtcpMuxFilterTest,EnableFilterDuringUpdate)98 TEST(RtcpMuxFilterTest, EnableFilterDuringUpdate) {
99 cricket::RtcpMuxFilter filter;
100 EXPECT_FALSE(filter.IsActive());
101 EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
102 EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
103 EXPECT_FALSE(filter.IsActive());
104
105 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
106 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
107 EXPECT_TRUE(filter.IsActive());
108
109 EXPECT_FALSE(filter.SetOffer(false, cricket::CS_REMOTE));
110 EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_LOCAL));
111 EXPECT_TRUE(filter.IsActive());
112 }
113
114 // Test that SetOffer can be called twice.
TEST(RtcpMuxFilterTest,SetOfferTwice)115 TEST(RtcpMuxFilterTest, SetOfferTwice) {
116 cricket::RtcpMuxFilter filter;
117
118 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
119 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
120 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
121 EXPECT_TRUE(filter.IsActive());
122
123 cricket::RtcpMuxFilter filter2;
124 EXPECT_TRUE(filter2.SetOffer(false, cricket::CS_LOCAL));
125 EXPECT_TRUE(filter2.SetOffer(false, cricket::CS_LOCAL));
126 EXPECT_TRUE(filter2.SetAnswer(false, cricket::CS_REMOTE));
127 EXPECT_FALSE(filter2.IsActive());
128 }
129
130 // Test that the filter can be enabled twice.
TEST(RtcpMuxFilterTest,EnableFilterTwiceDuringUpdate)131 TEST(RtcpMuxFilterTest, EnableFilterTwiceDuringUpdate) {
132 cricket::RtcpMuxFilter filter;
133
134 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
135 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
136 EXPECT_TRUE(filter.IsActive());
137
138 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
139 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
140 EXPECT_TRUE(filter.IsActive());
141 }
142
143 // Test that the filter can be kept disabled during updates.
TEST(RtcpMuxFilterTest,KeepFilterDisabledDuringUpdate)144 TEST(RtcpMuxFilterTest, KeepFilterDisabledDuringUpdate) {
145 cricket::RtcpMuxFilter filter;
146
147 EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
148 EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
149 EXPECT_FALSE(filter.IsActive());
150
151 EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
152 EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
153 EXPECT_FALSE(filter.IsActive());
154 }
155
156 // Test that we can SetActive and then can't deactivate.
TEST(RtcpMuxFilterTest,SetActiveCantDeactivate)157 TEST(RtcpMuxFilterTest, SetActiveCantDeactivate) {
158 cricket::RtcpMuxFilter filter;
159
160 filter.SetActive();
161 EXPECT_TRUE(filter.IsActive());
162
163 EXPECT_FALSE(filter.SetOffer(false, cricket::CS_LOCAL));
164 EXPECT_TRUE(filter.IsActive());
165 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_LOCAL));
166 EXPECT_TRUE(filter.IsActive());
167
168 EXPECT_FALSE(filter.SetProvisionalAnswer(false, cricket::CS_REMOTE));
169 EXPECT_TRUE(filter.IsActive());
170 EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_REMOTE));
171 EXPECT_TRUE(filter.IsActive());
172
173 EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_REMOTE));
174 EXPECT_TRUE(filter.IsActive());
175 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_REMOTE));
176 EXPECT_TRUE(filter.IsActive());
177
178 EXPECT_FALSE(filter.SetOffer(false, cricket::CS_REMOTE));
179 EXPECT_TRUE(filter.IsActive());
180 EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
181 EXPECT_TRUE(filter.IsActive());
182
183 EXPECT_FALSE(filter.SetProvisionalAnswer(false, cricket::CS_LOCAL));
184 EXPECT_TRUE(filter.IsActive());
185 EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_LOCAL));
186 EXPECT_TRUE(filter.IsActive());
187
188 EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_LOCAL));
189 EXPECT_TRUE(filter.IsActive());
190 EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
191 EXPECT_TRUE(filter.IsActive());
192 }
193