blob: 05c30c41b6fc697fa386a247e3dcf3957ceb50b0 [file] [log] [blame]
deadbeefcbecd352015-09-23 11:50:27 -07001/*
2 * Copyright 2015 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 <map>
jbauch555604a2016-04-26 03:13:22 -070012#include <memory>
deadbeefcbecd352015-09-23 11:50:27 -070013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "p2p/base/dtlstransport.h"
15#include "p2p/base/fakeportallocator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "p2p/base/p2ptransportchannel.h"
17#include "p2p/base/portallocator.h"
Zhi Huangb5261582017-09-29 10:51:43 -070018#include "pc/test/faketransportcontroller.h"
19#include "pc/transportcontroller.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "rtc_base/fakesslidentity.h"
21#include "rtc_base/gunit.h"
22#include "rtc_base/helpers.h"
23#include "rtc_base/sslidentity.h"
24#include "rtc_base/thread.h"
Zhi Huangc08de0f2017-12-11 00:20:23 -080025#include "test/gtest.h"
deadbeefcbecd352015-09-23 11:50:27 -070026
Steve Anton3828c062017-12-06 10:34:51 -080027using webrtc::SdpType;
28
deadbeefcbecd352015-09-23 11:50:27 -070029static const int kTimeout = 100;
30static const char kIceUfrag1[] = "TESTICEUFRAG0001";
31static const char kIcePwd1[] = "TESTICEPWD00000000000001";
32static const char kIceUfrag2[] = "TESTICEUFRAG0002";
33static const char kIcePwd2[] = "TESTICEPWD00000000000002";
deadbeef91042f82016-07-15 17:48:13 -070034static const char kIceUfrag3[] = "TESTICEUFRAG0003";
35static const char kIcePwd3[] = "TESTICEPWD00000000000003";
Zhi Huangc08de0f2017-12-11 00:20:23 -080036static const bool kRtcpMuxEnabled = true;
deadbeefcbecd352015-09-23 11:50:27 -070037
deadbeef91042f82016-07-15 17:48:13 -070038namespace cricket {
deadbeefcbecd352015-09-23 11:50:27 -070039
40// Only subclassing from FakeTransportController because currently that's the
deadbeeff5346592017-01-24 21:51:21 -080041// only way to have a TransportController with fake ICE/DTLS transports.
deadbeefcbecd352015-09-23 11:50:27 -070042//
deadbeeff5346592017-01-24 21:51:21 -080043// TODO(deadbeef): Pass a "TransportFactory" or something similar into
44// TransportController, instead of using inheritance in this way for testing.
deadbeefcbecd352015-09-23 11:50:27 -070045typedef FakeTransportController TransportControllerForTest;
46
47class TransportControllerTest : public testing::Test,
48 public sigslot::has_slots<> {
49 public:
50 TransportControllerTest()
51 : transport_controller_(new TransportControllerForTest()),
52 signaling_thread_(rtc::Thread::Current()) {
53 ConnectTransportControllerSignals();
54 }
55
johan27c3d5b2016-10-17 00:54:57 -070056 void CreateTransportControllerWithNetworkThread() {
57 if (!network_thread_) {
58 network_thread_ = rtc::Thread::CreateWithSocketServer();
59 network_thread_->Start();
deadbeefcbecd352015-09-23 11:50:27 -070060 }
61 transport_controller_.reset(
johan27c3d5b2016-10-17 00:54:57 -070062 new TransportControllerForTest(network_thread_.get()));
deadbeefcbecd352015-09-23 11:50:27 -070063 ConnectTransportControllerSignals();
64 }
65
66 void ConnectTransportControllerSignals() {
67 transport_controller_->SignalConnectionState.connect(
68 this, &TransportControllerTest::OnConnectionState);
69 transport_controller_->SignalReceiving.connect(
70 this, &TransportControllerTest::OnReceiving);
71 transport_controller_->SignalGatheringState.connect(
72 this, &TransportControllerTest::OnGatheringState);
73 transport_controller_->SignalCandidatesGathered.connect(
74 this, &TransportControllerTest::OnCandidatesGathered);
75 }
76
deadbeeff5346592017-01-24 21:51:21 -080077 FakeDtlsTransport* CreateFakeDtlsTransport(const std::string& content,
78 int component) {
79 DtlsTransportInternal* transport =
zhihuangb2cdd932017-01-19 16:54:25 -080080 transport_controller_->CreateDtlsTransport_n(content, component);
deadbeeff5346592017-01-24 21:51:21 -080081 return static_cast<FakeDtlsTransport*>(transport);
deadbeefcbecd352015-09-23 11:50:27 -070082 }
83
deadbeeff5346592017-01-24 21:51:21 -080084 void DestroyFakeDtlsTransport(const std::string& content, int component) {
zhihuangb2cdd932017-01-19 16:54:25 -080085 transport_controller_->DestroyDtlsTransport_n(content, component);
deadbeefcbecd352015-09-23 11:50:27 -070086 }
87
88 Candidate CreateCandidate(int component) {
89 Candidate c;
90 c.set_address(rtc::SocketAddress("192.168.1.1", 8000));
91 c.set_component(1);
deadbeef91042f82016-07-15 17:48:13 -070092 c.set_protocol(UDP_PROTOCOL_NAME);
deadbeefcbecd352015-09-23 11:50:27 -070093 c.set_priority(1);
94 return c;
95 }
96
97 // Used for thread hopping test.
deadbeeff5346592017-01-24 21:51:21 -080098 void CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread() {
johan27c3d5b2016-10-17 00:54:57 -070099 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700100 RTC_FROM_HERE,
deadbeeff5346592017-01-24 21:51:21 -0800101 rtc::Bind(&TransportControllerTest::
102 CreateFakeDtlsTransportsAndCompleteConnection_w,
103 this));
deadbeefcbecd352015-09-23 11:50:27 -0700104 }
105
deadbeeff5346592017-01-24 21:51:21 -0800106 void CreateFakeDtlsTransportsAndCompleteConnection_w() {
deadbeef91042f82016-07-15 17:48:13 -0700107 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800108 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
109 ASSERT_NE(nullptr, transport1);
110 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
111 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700112
deadbeef46eed762016-01-28 13:24:37 -0800113 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700114 kIcePwd1, ICEMODE_FULL,
115 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700116 std::string err;
deadbeef91042f82016-07-15 17:48:13 -0700117 transport_controller_->SetLocalTransportDescription("audio", local_desc,
Steve Anton3828c062017-12-06 10:34:51 -0800118 SdpType::kOffer, &err);
deadbeef91042f82016-07-15 17:48:13 -0700119 transport_controller_->SetLocalTransportDescription("video", local_desc,
Steve Anton3828c062017-12-06 10:34:51 -0800120 SdpType::kOffer, &err);
deadbeefcbecd352015-09-23 11:50:27 -0700121 transport_controller_->MaybeStartGathering();
deadbeeff5346592017-01-24 21:51:21 -0800122 transport1->fake_ice_transport()->SignalCandidateGathered(
123 transport1->fake_ice_transport(), CreateCandidate(1));
124 transport2->fake_ice_transport()->SignalCandidateGathered(
125 transport2->fake_ice_transport(), CreateCandidate(1));
126 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
127 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
128 transport1->fake_ice_transport()->SetConnectionCount(2);
129 transport2->fake_ice_transport()->SetConnectionCount(2);
130 transport1->SetReceiving(true);
131 transport2->SetReceiving(true);
132 transport1->SetWritable(true);
133 transport2->SetWritable(true);
134 transport1->fake_ice_transport()->SetConnectionCount(1);
135 transport2->fake_ice_transport()->SetConnectionCount(1);
deadbeefcbecd352015-09-23 11:50:27 -0700136 }
137
deadbeef91042f82016-07-15 17:48:13 -0700138 IceConfig CreateIceConfig(
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700139 int receiving_timeout,
deadbeef91042f82016-07-15 17:48:13 -0700140 ContinualGatheringPolicy continual_gathering_policy) {
141 IceConfig config;
Honghai Zhang049fbb12016-03-07 11:13:07 -0800142 config.receiving_timeout = receiving_timeout;
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700143 config.continual_gathering_policy = continual_gathering_policy;
honghaiz1f429e32015-09-28 07:57:34 -0700144 return config;
145 }
146
deadbeefcbecd352015-09-23 11:50:27 -0700147 protected:
148 void OnConnectionState(IceConnectionState state) {
149 if (!signaling_thread_->IsCurrent()) {
150 signaled_on_non_signaling_thread_ = true;
151 }
152 connection_state_ = state;
153 ++connection_state_signal_count_;
154 }
155
156 void OnReceiving(bool receiving) {
157 if (!signaling_thread_->IsCurrent()) {
158 signaled_on_non_signaling_thread_ = true;
159 }
160 receiving_ = receiving;
161 ++receiving_signal_count_;
162 }
163
164 void OnGatheringState(IceGatheringState state) {
165 if (!signaling_thread_->IsCurrent()) {
166 signaled_on_non_signaling_thread_ = true;
167 }
168 gathering_state_ = state;
169 ++gathering_state_signal_count_;
170 }
171
172 void OnCandidatesGathered(const std::string& transport_name,
173 const Candidates& candidates) {
174 if (!signaling_thread_->IsCurrent()) {
175 signaled_on_non_signaling_thread_ = true;
176 }
177 candidates_[transport_name].insert(candidates_[transport_name].end(),
178 candidates.begin(), candidates.end());
179 ++candidates_signal_count_;
180 }
181
johan27c3d5b2016-10-17 00:54:57 -0700182 std::unique_ptr<rtc::Thread> network_thread_; // Not used for most tests.
jbauch555604a2016-04-26 03:13:22 -0700183 std::unique_ptr<TransportControllerForTest> transport_controller_;
deadbeefcbecd352015-09-23 11:50:27 -0700184
185 // Information received from signals from transport controller.
deadbeef91042f82016-07-15 17:48:13 -0700186 IceConnectionState connection_state_ = kIceConnectionConnecting;
deadbeefcbecd352015-09-23 11:50:27 -0700187 bool receiving_ = false;
deadbeef91042f82016-07-15 17:48:13 -0700188 IceGatheringState gathering_state_ = kIceGatheringNew;
deadbeefcbecd352015-09-23 11:50:27 -0700189 // transport_name => candidates
190 std::map<std::string, Candidates> candidates_;
191 // Counts of each signal emitted.
192 int connection_state_signal_count_ = 0;
193 int receiving_signal_count_ = 0;
194 int gathering_state_signal_count_ = 0;
195 int candidates_signal_count_ = 0;
196
197 // Used to make sure signals only come on signaling thread.
198 rtc::Thread* const signaling_thread_ = nullptr;
199 bool signaled_on_non_signaling_thread_ = false;
200};
201
honghaiz1f429e32015-09-28 07:57:34 -0700202TEST_F(TransportControllerTest, TestSetIceConfig) {
deadbeeff5346592017-01-24 21:51:21 -0800203 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
204 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700205
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700206 transport_controller_->SetIceConfig(
deadbeef91042f82016-07-15 17:48:13 -0700207 CreateIceConfig(1000, GATHER_CONTINUALLY));
deadbeeff5346592017-01-24 21:51:21 -0800208 EXPECT_EQ(1000, transport1->fake_ice_transport()->receiving_timeout());
209 EXPECT_TRUE(transport1->fake_ice_transport()->gather_continually());
deadbeefcbecd352015-09-23 11:50:27 -0700210
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700211 transport_controller_->SetIceConfig(
deadbeef91042f82016-07-15 17:48:13 -0700212 CreateIceConfig(1000, GATHER_CONTINUALLY_AND_RECOVER));
deadbeeff5346592017-01-24 21:51:21 -0800213 // Test that value stored in controller is applied to new transports.
214 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
215 ASSERT_NE(nullptr, transport2);
216 EXPECT_EQ(1000, transport2->fake_ice_transport()->receiving_timeout());
217 EXPECT_TRUE(transport2->fake_ice_transport()->gather_continually());
deadbeefcbecd352015-09-23 11:50:27 -0700218}
219
220TEST_F(TransportControllerTest, TestSetSslMaxProtocolVersion) {
221 EXPECT_TRUE(transport_controller_->SetSslMaxProtocolVersion(
222 rtc::SSL_PROTOCOL_DTLS_12));
deadbeeff5346592017-01-24 21:51:21 -0800223 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700224
deadbeeff5346592017-01-24 21:51:21 -0800225 ASSERT_NE(nullptr, transport);
226 EXPECT_EQ(rtc::SSL_PROTOCOL_DTLS_12, transport->ssl_max_protocol_version());
deadbeefcbecd352015-09-23 11:50:27 -0700227
228 // Setting max version after transport is created should fail.
229 EXPECT_FALSE(transport_controller_->SetSslMaxProtocolVersion(
230 rtc::SSL_PROTOCOL_DTLS_10));
231}
232
233TEST_F(TransportControllerTest, TestSetIceRole) {
deadbeeff5346592017-01-24 21:51:21 -0800234 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
235 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700236
deadbeef91042f82016-07-15 17:48:13 -0700237 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800238 EXPECT_EQ(ICEROLE_CONTROLLING,
239 transport1->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700240 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
deadbeeff5346592017-01-24 21:51:21 -0800241 EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700242
deadbeeff5346592017-01-24 21:51:21 -0800243 // Test that value stored in controller is applied to new transports.
244 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
245 ASSERT_NE(nullptr, transport2);
246 EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700247}
248
deadbeeff5346592017-01-24 21:51:21 -0800249// Test that when one transport encounters a role conflict, the ICE role is
250// swapped on every transport.
deadbeefcbecd352015-09-23 11:50:27 -0700251TEST_F(TransportControllerTest, TestIceRoleConflict) {
deadbeeff5346592017-01-24 21:51:21 -0800252 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
253 ASSERT_NE(nullptr, transport1);
254 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
255 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700256
deadbeef91042f82016-07-15 17:48:13 -0700257 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800258 EXPECT_EQ(ICEROLE_CONTROLLING,
259 transport1->fake_ice_transport()->GetIceRole());
260 EXPECT_EQ(ICEROLE_CONTROLLING,
261 transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700262
deadbeeff5346592017-01-24 21:51:21 -0800263 transport1->fake_ice_transport()->SignalRoleConflict(
264 transport1->fake_ice_transport());
265 EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
266 EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
deadbeef1c206102016-05-27 13:34:37 -0700267
268 // Should be able to handle a second role conflict. The remote endpoint can
269 // change its role/tie-breaker when it does an ICE restart.
deadbeeff5346592017-01-24 21:51:21 -0800270 transport2->fake_ice_transport()->SignalRoleConflict(
271 transport2->fake_ice_transport());
272 EXPECT_EQ(ICEROLE_CONTROLLING,
273 transport1->fake_ice_transport()->GetIceRole());
274 EXPECT_EQ(ICEROLE_CONTROLLING,
275 transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700276}
277
278TEST_F(TransportControllerTest, TestGetSslRole) {
deadbeefcbecd352015-09-23 11:50:27 -0700279 rtc::SSLRole role;
deadbeefd8cfa1a2017-03-27 10:33:26 -0700280 CreateFakeDtlsTransport("audio", 1);
281
282 // Should return false before role has been negotiated.
283 EXPECT_FALSE(transport_controller_->GetSslRole("audio", &role));
284
285 // To negotiate an SSL role, need to set a local certificate, and
286 // local/remote transport descriptions with DTLS info.
287 rtc::scoped_refptr<rtc::RTCCertificate> certificate =
288 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
289 rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
290 std::unique_ptr<rtc::SSLFingerprint> fingerprint(
291 rtc::SSLFingerprint::CreateFromCertificate(certificate));
292 transport_controller_->SetLocalCertificate(certificate);
293
294 // Set the same fingerprint on both sides since the remote fingerprint
295 // doesn't really matter for this test.
296 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
297 kIcePwd1, ICEMODE_FULL,
298 CONNECTIONROLE_ACTPASS, fingerprint.get());
299 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag2,
300 kIcePwd2, ICEMODE_FULL,
301 CONNECTIONROLE_ACTIVE, fingerprint.get());
302 std::string err;
303 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800304 "audio", local_desc, SdpType::kOffer, &err));
deadbeefd8cfa1a2017-03-27 10:33:26 -0700305 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800306 "audio", remote_desc, SdpType::kAnswer, &err));
deadbeefd8cfa1a2017-03-27 10:33:26 -0700307
308 // Finally we can get the role. Should be "server" since the remote
309 // endpoint's role was "active".
Taylor Brandstetterf475d362016-01-08 15:35:57 -0800310 EXPECT_TRUE(transport_controller_->GetSslRole("audio", &role));
deadbeefd8cfa1a2017-03-27 10:33:26 -0700311 EXPECT_EQ(rtc::SSL_SERVER, role);
312
313 // Lastly, test that GetSslRole returns false for a nonexistent transport.
314 EXPECT_FALSE(transport_controller_->GetSslRole("video", &role));
deadbeefcbecd352015-09-23 11:50:27 -0700315}
316
317TEST_F(TransportControllerTest, TestSetAndGetLocalCertificate) {
318 rtc::scoped_refptr<rtc::RTCCertificate> certificate1 =
jbauch555604a2016-04-26 03:13:22 -0700319 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800320 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700321 rtc::scoped_refptr<rtc::RTCCertificate> certificate2 =
jbauch555604a2016-04-26 03:13:22 -0700322 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800323 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700324 rtc::scoped_refptr<rtc::RTCCertificate> returned_certificate;
325
deadbeeff5346592017-01-24 21:51:21 -0800326 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
327 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700328
329 EXPECT_TRUE(transport_controller_->SetLocalCertificate(certificate1));
330 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
331 "audio", &returned_certificate));
332 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
333 returned_certificate->identity()->certificate().ToPEMString());
334
335 // Should fail if called for a nonexistant transport.
336 EXPECT_FALSE(transport_controller_->GetLocalCertificate(
337 "video", &returned_certificate));
338
deadbeeff5346592017-01-24 21:51:21 -0800339 // Test that identity stored in controller is applied to new transports.
340 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
341 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700342 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
343 "video", &returned_certificate));
344 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
345 returned_certificate->identity()->certificate().ToPEMString());
346
347 // Shouldn't be able to change the identity once set.
348 EXPECT_FALSE(transport_controller_->SetLocalCertificate(certificate2));
349}
350
351TEST_F(TransportControllerTest, TestGetRemoteSSLCertificate) {
352 rtc::FakeSSLCertificate fake_certificate("fake_data");
deadbeefcbecd352015-09-23 11:50:27 -0700353
deadbeeff5346592017-01-24 21:51:21 -0800354 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
355 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700356
deadbeeff5346592017-01-24 21:51:21 -0800357 transport->SetRemoteSSLCertificate(&fake_certificate);
jbauch555604a2016-04-26 03:13:22 -0700358 std::unique_ptr<rtc::SSLCertificate> returned_certificate =
kwibergb4d01c42016-04-06 05:15:06 -0700359 transport_controller_->GetRemoteSSLCertificate("audio");
360 EXPECT_TRUE(returned_certificate);
deadbeefcbecd352015-09-23 11:50:27 -0700361 EXPECT_EQ(fake_certificate.ToPEMString(),
362 returned_certificate->ToPEMString());
363
364 // Should fail if called for a nonexistant transport.
kwibergb4d01c42016-04-06 05:15:06 -0700365 EXPECT_FALSE(transport_controller_->GetRemoteSSLCertificate("video"));
deadbeefcbecd352015-09-23 11:50:27 -0700366}
367
368TEST_F(TransportControllerTest, TestSetLocalTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800369 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
370 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800371 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700372 kIcePwd1, ICEMODE_FULL,
373 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700374 std::string err;
375 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800376 "audio", local_desc, SdpType::kOffer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800377 // Check that ICE ufrag and pwd were propagated to transport.
378 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->ice_ufrag());
379 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700380 // After setting local description, we should be able to start gathering
381 // candidates.
382 transport_controller_->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700383 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700384 EXPECT_EQ(1, gathering_state_signal_count_);
385}
386
387TEST_F(TransportControllerTest, TestSetRemoteTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800388 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
389 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800390 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700391 kIcePwd1, ICEMODE_FULL,
392 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700393 std::string err;
394 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800395 "audio", remote_desc, SdpType::kOffer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800396 // Check that ICE ufrag and pwd were propagated to transport.
397 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->remote_ice_ufrag());
398 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->remote_ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700399}
400
401TEST_F(TransportControllerTest, TestAddRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800402 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
403 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700404 Candidates candidates;
405 candidates.push_back(CreateCandidate(1));
406 std::string err;
407 EXPECT_TRUE(
408 transport_controller_->AddRemoteCandidates("audio", candidates, &err));
deadbeeff5346592017-01-24 21:51:21 -0800409 EXPECT_EQ(1U, transport->fake_ice_transport()->remote_candidates().size());
deadbeefcbecd352015-09-23 11:50:27 -0700410}
411
412TEST_F(TransportControllerTest, TestReadyForRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800413 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
414 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700415 // We expect to be ready for remote candidates only after local and remote
416 // descriptions are set.
417 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
418
419 std::string err;
deadbeef46eed762016-01-28 13:24:37 -0800420 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700421 kIcePwd1, ICEMODE_FULL,
422 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700423 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800424 "audio", remote_desc, SdpType::kOffer, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700425 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
426
deadbeef46eed762016-01-28 13:24:37 -0800427 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
deadbeef91042f82016-07-15 17:48:13 -0700428 kIcePwd2, ICEMODE_FULL,
429 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700430 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800431 "audio", local_desc, SdpType::kAnswer, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700432 EXPECT_TRUE(transport_controller_->ReadyForRemoteCandidates("audio"));
433}
434
435TEST_F(TransportControllerTest, TestGetStats) {
deadbeeff5346592017-01-24 21:51:21 -0800436 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
437 ASSERT_NE(nullptr, transport1);
438 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 2);
439 ASSERT_NE(nullptr, transport2);
440 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 1);
441 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700442
443 TransportStats stats;
444 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
445 EXPECT_EQ("audio", stats.transport_name);
446 EXPECT_EQ(2U, stats.channel_stats.size());
447}
448
deadbeeff5346592017-01-24 21:51:21 -0800449// Test that a "transport" from a stats perspective (combination of RTP/RTCP
450// transports) goes away when all references to its transports are gone.
451TEST_F(TransportControllerTest, TestCreateAndDestroyFakeDtlsTransport) {
452 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
453 ASSERT_NE(nullptr, transport1);
454 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 1);
455 ASSERT_NE(nullptr, transport2);
456 ASSERT_EQ(transport1, transport2);
457 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("audio", 2);
458 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700459
460 // Using GetStats to check if transport is destroyed from an outside class's
461 // perspective.
462 TransportStats stats;
463 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800464 DestroyFakeDtlsTransport("audio", 2);
465 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700466 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800467 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700468 EXPECT_FALSE(transport_controller_->GetStats("audio", &stats));
469}
470
471TEST_F(TransportControllerTest, TestSignalConnectionStateFailed) {
472 // Need controlling ICE role to get in failed state.
deadbeef91042f82016-07-15 17:48:13 -0700473 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800474 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
475 ASSERT_NE(nullptr, transport1);
476 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
477 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700478
deadbeeff5346592017-01-24 21:51:21 -0800479 // Should signal "failed" if any transport failed; transport is considered
480 // failed
deadbeefcbecd352015-09-23 11:50:27 -0700481 // if it previously had a connection but now has none, and gathering is
482 // complete.
deadbeeff5346592017-01-24 21:51:21 -0800483 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
484 transport1->fake_ice_transport()->SetConnectionCount(1);
485 transport1->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700486 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700487 EXPECT_EQ(1, connection_state_signal_count_);
488}
489
490TEST_F(TransportControllerTest, TestSignalConnectionStateConnected) {
deadbeef91042f82016-07-15 17:48:13 -0700491 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800492 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
493 ASSERT_NE(nullptr, transport1);
494 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
495 ASSERT_NE(nullptr, transport2);
496 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
497 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700498
deadbeeff5346592017-01-24 21:51:21 -0800499 // First, have one transport connect, and another fail, to ensure that
500 // the first transport connecting didn't trigger a "connected" state signal.
deadbeefcbecd352015-09-23 11:50:27 -0700501 // We should only get a signal when all are connected.
deadbeeff5346592017-01-24 21:51:21 -0800502 transport1->fake_ice_transport()->SetConnectionCount(2);
503 transport1->SetWritable(true);
504 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
505 transport3->fake_ice_transport()->SetConnectionCount(1);
506 transport3->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700507 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700508 // Signal count of 1 means that the only signal emitted was "failed".
509 EXPECT_EQ(1, connection_state_signal_count_);
510
deadbeeff5346592017-01-24 21:51:21 -0800511 // Destroy the failed transport to return to "connecting" state.
512 DestroyFakeDtlsTransport("video", 2);
deadbeef91042f82016-07-15 17:48:13 -0700513 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700514 EXPECT_EQ(2, connection_state_signal_count_);
515
deadbeeff5346592017-01-24 21:51:21 -0800516 // Make the remaining transport reach a connected state.
517 transport2->fake_ice_transport()->SetConnectionCount(2);
518 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700519 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700520 EXPECT_EQ(3, connection_state_signal_count_);
521}
522
523TEST_F(TransportControllerTest, TestSignalConnectionStateComplete) {
deadbeef91042f82016-07-15 17:48:13 -0700524 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800525 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
526 ASSERT_NE(nullptr, transport1);
527 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
528 ASSERT_NE(nullptr, transport2);
529 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
530 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700531
532 // Similar to above test, but we're now reaching the completed state, which
zhihuangb2cdd932017-01-19 16:54:25 -0800533 // means only one connection per FakeDtlsTransport.
deadbeeff5346592017-01-24 21:51:21 -0800534 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
535 transport1->fake_ice_transport()->SetConnectionCount(1);
536 transport1->SetWritable(true);
537 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
538 transport3->fake_ice_transport()->SetConnectionCount(1);
539 transport3->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700540 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700541 // Signal count of 1 means that the only signal emitted was "failed".
542 EXPECT_EQ(1, connection_state_signal_count_);
543
deadbeeff5346592017-01-24 21:51:21 -0800544 // Destroy the failed transport to return to "connecting" state.
545 DestroyFakeDtlsTransport("video", 2);
deadbeef91042f82016-07-15 17:48:13 -0700546 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700547 EXPECT_EQ(2, connection_state_signal_count_);
548
deadbeeff5346592017-01-24 21:51:21 -0800549 // Make the remaining transport reach a connected state.
550 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
551 transport2->fake_ice_transport()->SetConnectionCount(2);
552 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700553 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700554 EXPECT_EQ(3, connection_state_signal_count_);
555
556 // Finally, transition to completed state.
deadbeeff5346592017-01-24 21:51:21 -0800557 transport2->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700558 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700559 EXPECT_EQ(4, connection_state_signal_count_);
560}
561
562// Make sure that if we're "connected" and remove a transport, we stay in the
563// "connected" state.
564TEST_F(TransportControllerTest, TestDestroyTransportAndStayConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800565 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
566 ASSERT_NE(nullptr, transport1);
567 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
568 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700569
deadbeeff5346592017-01-24 21:51:21 -0800570 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
571 transport1->fake_ice_transport()->SetConnectionCount(2);
572 transport1->SetWritable(true);
573 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
574 transport2->fake_ice_transport()->SetConnectionCount(2);
575 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700576 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700577 EXPECT_EQ(1, connection_state_signal_count_);
578
deadbeeff5346592017-01-24 21:51:21 -0800579 // Destroy one transport, then "complete" the other one, so we reach
deadbeefcbecd352015-09-23 11:50:27 -0700580 // a known state.
deadbeeff5346592017-01-24 21:51:21 -0800581 DestroyFakeDtlsTransport("video", 1);
582 transport1->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700583 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700584 // Signal count of 2 means the deletion didn't cause any unexpected signals
585 EXPECT_EQ(2, connection_state_signal_count_);
586}
587
588// If we destroy the last/only transport, we should simply transition to
589// "connecting".
590TEST_F(TransportControllerTest, TestDestroyLastTransportWhileConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800591 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
592 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700593
deadbeeff5346592017-01-24 21:51:21 -0800594 transport->fake_ice_transport()->SetCandidatesGatheringComplete();
595 transport->fake_ice_transport()->SetConnectionCount(2);
596 transport->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700597 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700598 EXPECT_EQ(1, connection_state_signal_count_);
599
deadbeeff5346592017-01-24 21:51:21 -0800600 DestroyFakeDtlsTransport("audio", 1);
deadbeef91042f82016-07-15 17:48:13 -0700601 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700602 // Signal count of 2 means the deletion didn't cause any unexpected signals
603 EXPECT_EQ(2, connection_state_signal_count_);
604}
605
606TEST_F(TransportControllerTest, TestSignalReceiving) {
deadbeeff5346592017-01-24 21:51:21 -0800607 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
608 ASSERT_NE(nullptr, transport1);
609 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
610 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700611
deadbeeff5346592017-01-24 21:51:21 -0800612 // Should signal receiving as soon as any transport is receiving.
613 transport1->SetReceiving(true);
deadbeefcbecd352015-09-23 11:50:27 -0700614 EXPECT_TRUE_WAIT(receiving_, kTimeout);
615 EXPECT_EQ(1, receiving_signal_count_);
616
deadbeeff5346592017-01-24 21:51:21 -0800617 transport2->SetReceiving(true);
618 transport1->SetReceiving(false);
619 transport2->SetReceiving(false);
deadbeefcbecd352015-09-23 11:50:27 -0700620 EXPECT_TRUE_WAIT(!receiving_, kTimeout);
621 EXPECT_EQ(2, receiving_signal_count_);
622}
623
624TEST_F(TransportControllerTest, TestSignalGatheringStateGathering) {
deadbeeff5346592017-01-24 21:51:21 -0800625 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
626 ASSERT_NE(nullptr, transport);
627 transport->fake_ice_transport()->MaybeStartGathering();
deadbeefcbecd352015-09-23 11:50:27 -0700628 // Should be in the gathering state as soon as any transport starts gathering.
deadbeef91042f82016-07-15 17:48:13 -0700629 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700630 EXPECT_EQ(1, gathering_state_signal_count_);
631}
632
633TEST_F(TransportControllerTest, TestSignalGatheringStateComplete) {
deadbeeff5346592017-01-24 21:51:21 -0800634 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
635 ASSERT_NE(nullptr, transport1);
636 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
637 ASSERT_NE(nullptr, transport2);
638 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("data", 1);
639 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700640
deadbeeff5346592017-01-24 21:51:21 -0800641 transport3->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700642 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700643 EXPECT_EQ(1, gathering_state_signal_count_);
644
deadbeeff5346592017-01-24 21:51:21 -0800645 // Have one transport finish gathering, then destroy it, to make sure
646 // gathering
deadbeefcbecd352015-09-23 11:50:27 -0700647 // completion wasn't signalled if only one transport finished gathering.
deadbeeff5346592017-01-24 21:51:21 -0800648 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
649 DestroyFakeDtlsTransport("data", 1);
deadbeef91042f82016-07-15 17:48:13 -0700650 EXPECT_EQ_WAIT(kIceGatheringNew, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700651 EXPECT_EQ(2, gathering_state_signal_count_);
652
deadbeeff5346592017-01-24 21:51:21 -0800653 // Make remaining transports start and then finish gathering.
654 transport1->fake_ice_transport()->MaybeStartGathering();
655 transport2->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700656 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700657 EXPECT_EQ(3, gathering_state_signal_count_);
658
deadbeeff5346592017-01-24 21:51:21 -0800659 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
660 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700661 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700662 EXPECT_EQ(4, gathering_state_signal_count_);
663}
664
665// Test that when the last transport that hasn't finished connecting and/or
666// gathering is destroyed, the aggregate state jumps to "completed". This can
667// happen if, for example, we have an audio and video transport, the audio
668// transport completes, then we start bundling video on the audio transport.
669TEST_F(TransportControllerTest,
670 TestSignalingWhenLastIncompleteTransportDestroyed) {
deadbeef91042f82016-07-15 17:48:13 -0700671 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800672 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
673 ASSERT_NE(nullptr, transport1);
674 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
675 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700676
deadbeeff5346592017-01-24 21:51:21 -0800677 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700678 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700679 EXPECT_EQ(1, gathering_state_signal_count_);
680
deadbeeff5346592017-01-24 21:51:21 -0800681 transport1->fake_ice_transport()->SetConnectionCount(1);
682 transport1->SetWritable(true);
683 DestroyFakeDtlsTransport("video", 1);
deadbeef91042f82016-07-15 17:48:13 -0700684 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700685 EXPECT_EQ(1, connection_state_signal_count_);
deadbeef91042f82016-07-15 17:48:13 -0700686 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700687 EXPECT_EQ(2, gathering_state_signal_count_);
688}
689
690TEST_F(TransportControllerTest, TestSignalCandidatesGathered) {
deadbeeff5346592017-01-24 21:51:21 -0800691 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
692 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700693
694 // Transport won't signal candidates until it has a local description.
deadbeef46eed762016-01-28 13:24:37 -0800695 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700696 kIcePwd1, ICEMODE_FULL,
697 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700698 std::string err;
699 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800700 "audio", local_desc, SdpType::kOffer, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700701 transport_controller_->MaybeStartGathering();
702
deadbeeff5346592017-01-24 21:51:21 -0800703 transport->fake_ice_transport()->SignalCandidateGathered(
704 transport->fake_ice_transport(), CreateCandidate(1));
deadbeefcbecd352015-09-23 11:50:27 -0700705 EXPECT_EQ_WAIT(1, candidates_signal_count_, kTimeout);
706 EXPECT_EQ(1U, candidates_["audio"].size());
707}
708
709TEST_F(TransportControllerTest, TestSignalingOccursOnSignalingThread) {
johan27c3d5b2016-10-17 00:54:57 -0700710 CreateTransportControllerWithNetworkThread();
deadbeeff5346592017-01-24 21:51:21 -0800711 CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread();
deadbeefcbecd352015-09-23 11:50:27 -0700712
713 // connecting --> connected --> completed
deadbeef91042f82016-07-15 17:48:13 -0700714 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700715 EXPECT_EQ(2, connection_state_signal_count_);
716
717 EXPECT_TRUE_WAIT(receiving_, kTimeout);
718 EXPECT_EQ(1, receiving_signal_count_);
719
720 // new --> gathering --> complete
deadbeef91042f82016-07-15 17:48:13 -0700721 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700722 EXPECT_EQ(2, gathering_state_signal_count_);
723
724 EXPECT_EQ_WAIT(1U, candidates_["audio"].size(), kTimeout);
725 EXPECT_EQ_WAIT(1U, candidates_["video"].size(), kTimeout);
726 EXPECT_EQ(2, candidates_signal_count_);
727
728 EXPECT_TRUE(!signaled_on_non_signaling_thread_);
729}
deadbeef91042f82016-07-15 17:48:13 -0700730
731// Older versions of Chrome expect the ICE role to be re-determined when an
732// ICE restart occurs, and also don't perform conflict resolution correctly,
733// so for now we can't safely stop doing this.
734// See: https://bugs.chromium.org/p/chromium/issues/detail?id=628676
735// TODO(deadbeef): Remove this when these old versions of Chrome reach a low
736// enough population.
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700737TEST_F(TransportControllerTest, IceRoleRedeterminedOnIceRestartByDefault) {
deadbeeff5346592017-01-24 21:51:21 -0800738 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
739 ASSERT_NE(nullptr, transport);
deadbeef91042f82016-07-15 17:48:13 -0700740 std::string err;
741 // Do an initial offer answer, so that the next offer is an ICE restart.
742 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
743 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
744 kIcePwd1, ICEMODE_FULL,
745 CONNECTIONROLE_ACTPASS, nullptr);
746 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800747 "audio", remote_desc, SdpType::kOffer, &err));
deadbeef91042f82016-07-15 17:48:13 -0700748 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
749 kIcePwd2, ICEMODE_FULL,
750 CONNECTIONROLE_ACTPASS, nullptr);
751 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800752 "audio", local_desc, SdpType::kAnswer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800753 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700754
755 // The endpoint that initiated an ICE restart should take the controlling
756 // role.
757 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
758 kIcePwd3, ICEMODE_FULL,
759 CONNECTIONROLE_ACTPASS, nullptr);
760 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800761 "audio", ice_restart_desc, SdpType::kOffer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800762 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700763}
764
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700765// Test that if the TransportController was created with the
766// |redetermine_role_on_ice_restart| parameter set to false, the role is *not*
767// redetermined on an ICE restart.
768TEST_F(TransportControllerTest, IceRoleNotRedetermined) {
769 bool redetermine_role = false;
770 transport_controller_.reset(new TransportControllerForTest(redetermine_role));
deadbeeff5346592017-01-24 21:51:21 -0800771 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
772 ASSERT_NE(nullptr, transport);
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700773 std::string err;
774 // Do an initial offer answer, so that the next offer is an ICE restart.
775 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
776 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
777 kIcePwd1, ICEMODE_FULL,
778 CONNECTIONROLE_ACTPASS, nullptr);
779 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800780 "audio", remote_desc, SdpType::kOffer, &err));
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700781 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
782 kIcePwd2, ICEMODE_FULL,
783 CONNECTIONROLE_ACTPASS, nullptr);
784 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800785 "audio", local_desc, SdpType::kAnswer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800786 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700787
788 // The endpoint that initiated an ICE restart should keep the existing role.
789 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
790 kIcePwd3, ICEMODE_FULL,
791 CONNECTIONROLE_ACTPASS, nullptr);
792 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800793 "audio", ice_restart_desc, SdpType::kOffer, &err));
deadbeeff5346592017-01-24 21:51:21 -0800794 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700795}
796
deadbeeff5346592017-01-24 21:51:21 -0800797// Tests ICE role is reversed after receiving ice-lite from remote.
deadbeef49f34fd2016-12-06 16:22:06 -0800798TEST_F(TransportControllerTest, TestSetRemoteIceLiteInOffer) {
deadbeeff5346592017-01-24 21:51:21 -0800799 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
800 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800801 std::string err;
802
803 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
804 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
805 kIcePwd1, ICEMODE_LITE,
806 CONNECTIONROLE_ACTPASS, nullptr);
807 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800808 "audio", remote_desc, SdpType::kOffer, &err));
deadbeef49f34fd2016-12-06 16:22:06 -0800809 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
810 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800811 "audio", local_desc, SdpType::kAnswer, nullptr));
deadbeef49f34fd2016-12-06 16:22:06 -0800812
deadbeeff5346592017-01-24 21:51:21 -0800813 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
814 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800815}
816
817// Tests ice-lite in remote answer.
818TEST_F(TransportControllerTest, TestSetRemoteIceLiteInAnswer) {
deadbeeff5346592017-01-24 21:51:21 -0800819 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
820 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800821 std::string err;
822
823 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
824 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
825 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800826 "audio", local_desc, SdpType::kOffer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800827 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
828 // Transports will be created in ICEFULL_MODE.
829 EXPECT_EQ(ICEMODE_FULL, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800830 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
831 kIcePwd1, ICEMODE_LITE, CONNECTIONROLE_NONE,
832 nullptr);
833 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800834 "audio", remote_desc, SdpType::kAnswer, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800835 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
836 // After receiving remote description with ICEMODE_LITE, transport should
deadbeef49f34fd2016-12-06 16:22:06 -0800837 // have mode set to ICEMODE_LITE.
deadbeeff5346592017-01-24 21:51:21 -0800838 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800839}
840
deadbeef897d08e2017-04-20 00:57:25 -0700841// Tests that the ICE role remains "controlling" if a subsequent offer that
842// does an ICE restart is received from an ICE lite endpoint. Regression test
843// for: https://crbug.com/710760
844TEST_F(TransportControllerTest,
845 IceRoleIsControllingAfterIceRestartFromIceLiteEndpoint) {
846 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
847 ASSERT_NE(nullptr, transport);
848 std::string err;
849
850 // Initial offer/answer.
851 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
852 kIcePwd1, ICEMODE_LITE,
853 CONNECTIONROLE_ACTPASS, nullptr);
854 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
855 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800856 "audio", remote_desc, SdpType::kOffer, &err));
deadbeef897d08e2017-04-20 00:57:25 -0700857 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800858 "audio", local_desc, SdpType::kAnswer, nullptr));
deadbeef897d08e2017-04-20 00:57:25 -0700859 // Subsequent ICE restart offer/answer.
860 remote_desc.ice_ufrag = kIceUfrag2;
861 remote_desc.ice_pwd = kIcePwd2;
862 local_desc.ice_ufrag = kIceUfrag2;
863 local_desc.ice_pwd = kIcePwd2;
864 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800865 "audio", remote_desc, SdpType::kOffer, &err));
deadbeef897d08e2017-04-20 00:57:25 -0700866 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800867 "audio", local_desc, SdpType::kAnswer, nullptr));
deadbeef897d08e2017-04-20 00:57:25 -0700868
869 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
870}
871
deadbeefd1a38b52016-12-10 13:15:33 -0800872// Tests SetNeedsIceRestartFlag and NeedsIceRestart, setting the flag and then
873// initiating an ICE restart for one of the transports.
874TEST_F(TransportControllerTest, NeedsIceRestart) {
deadbeeff5346592017-01-24 21:51:21 -0800875 CreateFakeDtlsTransport("audio", 1);
876 CreateFakeDtlsTransport("video", 1);
deadbeefd1a38b52016-12-10 13:15:33 -0800877
878 // Do initial offer/answer so there's something to restart.
879 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
880 TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
881 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800882 "audio", local_desc, SdpType::kOffer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800883 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800884 "video", local_desc, SdpType::kOffer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800885 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800886 "audio", remote_desc, SdpType::kAnswer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800887 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800888 "video", remote_desc, SdpType::kAnswer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800889
890 // Initially NeedsIceRestart should return false.
891 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
892 EXPECT_FALSE(transport_controller_->NeedsIceRestart("video"));
893
894 // Set the needs-ice-restart flag and verify NeedsIceRestart starts returning
895 // true.
896 transport_controller_->SetNeedsIceRestartFlag();
897 EXPECT_TRUE(transport_controller_->NeedsIceRestart("audio"));
898 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
899 // For a nonexistent transport, false should be returned.
900 EXPECT_FALSE(transport_controller_->NeedsIceRestart("deadbeef"));
901
902 // Do ICE restart but only for audio.
903 TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
904 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800905 "audio", ice_restart_local_desc, SdpType::kOffer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800906 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
Steve Anton3828c062017-12-06 10:34:51 -0800907 "video", local_desc, SdpType::kOffer, nullptr));
deadbeefd1a38b52016-12-10 13:15:33 -0800908 // NeedsIceRestart should still be true for video.
909 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
910 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
911}
912
Zhi Huangc08de0f2017-12-11 00:20:23 -0800913enum class RTPTransportType { kSdes, kDtlsSrtp };
914std::ostream& operator<<(std::ostream& out, RTPTransportType value) {
915 switch (value) {
916 case RTPTransportType::kSdes:
917 return out << "SDES";
918 case RTPTransportType::kDtlsSrtp:
919 return out << "DTLS-SRTP";
920 }
921 return out;
922}
923
924// Tests the TransportController can correctly create and destroy the RTP
925// transports.
926class TransportControllerRTPTransportTest
927 : public TransportControllerTest,
928 public ::testing::WithParamInterface<RTPTransportType> {
929 protected:
930 // Helper function used to create an RTP layer transport.
931 webrtc::RtpTransportInternal* CreateRtpTransport(
932 const std::string& transport_name) {
933 RTPTransportType type = GetParam();
934 switch (type) {
935 case RTPTransportType::kSdes:
936 return transport_controller_->CreateSdesTransport(transport_name,
937 kRtcpMuxEnabled);
938 case RTPTransportType::kDtlsSrtp:
939 return transport_controller_->CreateDtlsSrtpTransport(transport_name,
940 kRtcpMuxEnabled);
941 }
942 return nullptr;
943 }
944};
945
946// Tests that creating transports with the same name will cause the
947// second call to re-use the transport created in the first call.
948TEST_P(TransportControllerRTPTransportTest, CreateTransportsWithReference) {
949 const std::string transport_name = "transport";
950 webrtc::RtpTransportInternal* transport1 = CreateRtpTransport(transport_name);
951 webrtc::RtpTransportInternal* transport2 = CreateRtpTransport(transport_name);
952 EXPECT_NE(nullptr, transport1);
953 EXPECT_NE(nullptr, transport2);
954 // The TransportController is expected to return the existing one when using
955 // the same transport name.
956 EXPECT_EQ(transport1, transport2);
957 transport_controller_->DestroyTransport(transport_name);
958 transport_controller_->DestroyTransport(transport_name);
959}
960
961// Tests that creating different type of RTP transports with same name is not
962// allowed.
963TEST_P(TransportControllerRTPTransportTest,
964 CreateDifferentTypeOfTransportsWithSameName) {
965 const std::string transport_name = "transport";
966 webrtc::RtpTransportInternal* transport1 = CreateRtpTransport(transport_name);
967 EXPECT_NE(nullptr, transport1);
968 RTPTransportType type = GetParam();
969 switch (type) {
970 case RTPTransportType::kSdes:
971 EXPECT_EQ(nullptr, transport_controller_->CreateDtlsSrtpTransport(
972 transport_name, kRtcpMuxEnabled));
973 break;
974 case RTPTransportType::kDtlsSrtp:
975 EXPECT_EQ(nullptr, transport_controller_->CreateSdesTransport(
976 transport_name, kRtcpMuxEnabled));
977 break;
978 default:
979 ASSERT_TRUE(false);
980 }
981 transport_controller_->DestroyTransport(transport_name);
982}
983
984// Tests the RTP transport is not actually destroyed if references still exist.
985TEST_P(TransportControllerRTPTransportTest, DestroyTransportWithReference) {
986 const std::string transport_name = "transport";
987 webrtc::RtpTransportInternal* transport1 = CreateRtpTransport(transport_name);
988 webrtc::RtpTransportInternal* transport2 = CreateRtpTransport(transport_name);
989 EXPECT_NE(nullptr, transport1);
990 EXPECT_NE(nullptr, transport2);
991 transport_controller_->DestroyTransport(transport_name);
992 EXPECT_NE(nullptr, transport1->rtp_packet_transport());
993 EXPECT_EQ(nullptr, transport1->rtcp_packet_transport());
994 transport_controller_->DestroyTransport(transport_name);
995}
996
997// Tests the RTP is actually destroyed if there is no reference to it.
Harald Alvestranda3dab842018-01-14 09:18:58 +0100998// Disabled because of sometimes not working on Windows.
999// https://bugs.webrtc.org/34942
1000TEST_P(TransportControllerRTPTransportTest,
1001 DISABLED_DestroyTransportWithNoReference) {
Zhi Huangc08de0f2017-12-11 00:20:23 -08001002 const std::string transport_name = "transport";
1003 webrtc::RtpTransportInternal* transport1 = CreateRtpTransport(transport_name);
1004 webrtc::RtpTransportInternal* transport2 = CreateRtpTransport(transport_name);
1005 EXPECT_NE(nullptr, transport1);
1006 EXPECT_NE(nullptr, transport2);
1007 transport_controller_->DestroyTransport(transport_name);
1008 transport_controller_->DestroyTransport(transport_name);
1009#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1010 EXPECT_DEATH(transport1->IsWritable(false), /*error_message=*/"");
1011#endif
1012}
1013
1014INSTANTIATE_TEST_CASE_P(TransportControllerTest,
1015 TransportControllerRTPTransportTest,
1016 ::testing::Values(RTPTransportType::kSdes,
1017 RTPTransportType::kDtlsSrtp));
1018
Zhi Huangb5261582017-09-29 10:51:43 -07001019} // namespace cricket