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