blob: 6ea83a48098ce2af6514e0ebc83100ef350f3b8a [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
14#include "webrtc/base/fakesslidentity.h"
15#include "webrtc/base/gunit.h"
16#include "webrtc/base/helpers.h"
deadbeefcbecd352015-09-23 11:50:27 -070017#include "webrtc/base/sslidentity.h"
18#include "webrtc/base/thread.h"
19#include "webrtc/p2p/base/dtlstransportchannel.h"
Taylor Brandstettera1c30352016-05-13 08:15:11 -070020#include "webrtc/p2p/base/fakeportallocator.h"
deadbeefcbecd352015-09-23 11:50:27 -070021#include "webrtc/p2p/base/faketransportcontroller.h"
22#include "webrtc/p2p/base/p2ptransportchannel.h"
23#include "webrtc/p2p/base/portallocator.h"
24#include "webrtc/p2p/base/transportcontroller.h"
deadbeefcbecd352015-09-23 11:50:27 -070025
26static const int kTimeout = 100;
27static const char kIceUfrag1[] = "TESTICEUFRAG0001";
28static const char kIcePwd1[] = "TESTICEPWD00000000000001";
29static const char kIceUfrag2[] = "TESTICEUFRAG0002";
30static const char kIcePwd2[] = "TESTICEPWD00000000000002";
deadbeef91042f82016-07-15 17:48:13 -070031static const char kIceUfrag3[] = "TESTICEUFRAG0003";
32static const char kIcePwd3[] = "TESTICEPWD00000000000003";
deadbeefcbecd352015-09-23 11:50:27 -070033
deadbeef91042f82016-07-15 17:48:13 -070034namespace cricket {
deadbeefcbecd352015-09-23 11:50:27 -070035
36// Only subclassing from FakeTransportController because currently that's the
deadbeeff5346592017-01-24 21:51:21 -080037// only way to have a TransportController with fake ICE/DTLS transports.
deadbeefcbecd352015-09-23 11:50:27 -070038//
deadbeeff5346592017-01-24 21:51:21 -080039// TODO(deadbeef): Pass a "TransportFactory" or something similar into
40// TransportController, instead of using inheritance in this way for testing.
deadbeefcbecd352015-09-23 11:50:27 -070041typedef FakeTransportController TransportControllerForTest;
42
43class TransportControllerTest : public testing::Test,
44 public sigslot::has_slots<> {
45 public:
46 TransportControllerTest()
47 : transport_controller_(new TransportControllerForTest()),
48 signaling_thread_(rtc::Thread::Current()) {
49 ConnectTransportControllerSignals();
50 }
51
johan27c3d5b2016-10-17 00:54:57 -070052 void CreateTransportControllerWithNetworkThread() {
53 if (!network_thread_) {
54 network_thread_ = rtc::Thread::CreateWithSocketServer();
55 network_thread_->Start();
deadbeefcbecd352015-09-23 11:50:27 -070056 }
57 transport_controller_.reset(
johan27c3d5b2016-10-17 00:54:57 -070058 new TransportControllerForTest(network_thread_.get()));
deadbeefcbecd352015-09-23 11:50:27 -070059 ConnectTransportControllerSignals();
60 }
61
62 void ConnectTransportControllerSignals() {
63 transport_controller_->SignalConnectionState.connect(
64 this, &TransportControllerTest::OnConnectionState);
65 transport_controller_->SignalReceiving.connect(
66 this, &TransportControllerTest::OnReceiving);
67 transport_controller_->SignalGatheringState.connect(
68 this, &TransportControllerTest::OnGatheringState);
69 transport_controller_->SignalCandidatesGathered.connect(
70 this, &TransportControllerTest::OnCandidatesGathered);
71 }
72
deadbeeff5346592017-01-24 21:51:21 -080073 FakeDtlsTransport* CreateFakeDtlsTransport(const std::string& content,
74 int component) {
75 DtlsTransportInternal* transport =
zhihuangb2cdd932017-01-19 16:54:25 -080076 transport_controller_->CreateDtlsTransport_n(content, component);
deadbeeff5346592017-01-24 21:51:21 -080077 return static_cast<FakeDtlsTransport*>(transport);
deadbeefcbecd352015-09-23 11:50:27 -070078 }
79
deadbeeff5346592017-01-24 21:51:21 -080080 void DestroyFakeDtlsTransport(const std::string& content, int component) {
zhihuangb2cdd932017-01-19 16:54:25 -080081 transport_controller_->DestroyDtlsTransport_n(content, component);
deadbeefcbecd352015-09-23 11:50:27 -070082 }
83
84 Candidate CreateCandidate(int component) {
85 Candidate c;
86 c.set_address(rtc::SocketAddress("192.168.1.1", 8000));
87 c.set_component(1);
deadbeef91042f82016-07-15 17:48:13 -070088 c.set_protocol(UDP_PROTOCOL_NAME);
deadbeefcbecd352015-09-23 11:50:27 -070089 c.set_priority(1);
90 return c;
91 }
92
93 // Used for thread hopping test.
deadbeeff5346592017-01-24 21:51:21 -080094 void CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread() {
johan27c3d5b2016-10-17 00:54:57 -070095 network_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070096 RTC_FROM_HERE,
deadbeeff5346592017-01-24 21:51:21 -080097 rtc::Bind(&TransportControllerTest::
98 CreateFakeDtlsTransportsAndCompleteConnection_w,
99 this));
deadbeefcbecd352015-09-23 11:50:27 -0700100 }
101
deadbeeff5346592017-01-24 21:51:21 -0800102 void CreateFakeDtlsTransportsAndCompleteConnection_w() {
deadbeef91042f82016-07-15 17:48:13 -0700103 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800104 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
105 ASSERT_NE(nullptr, transport1);
106 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
107 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700108
deadbeef46eed762016-01-28 13:24:37 -0800109 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700110 kIcePwd1, ICEMODE_FULL,
111 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700112 std::string err;
deadbeef91042f82016-07-15 17:48:13 -0700113 transport_controller_->SetLocalTransportDescription("audio", local_desc,
114 CA_OFFER, &err);
115 transport_controller_->SetLocalTransportDescription("video", local_desc,
116 CA_OFFER, &err);
deadbeefcbecd352015-09-23 11:50:27 -0700117 transport_controller_->MaybeStartGathering();
deadbeeff5346592017-01-24 21:51:21 -0800118 transport1->fake_ice_transport()->SignalCandidateGathered(
119 transport1->fake_ice_transport(), CreateCandidate(1));
120 transport2->fake_ice_transport()->SignalCandidateGathered(
121 transport2->fake_ice_transport(), CreateCandidate(1));
122 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
123 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
124 transport1->fake_ice_transport()->SetConnectionCount(2);
125 transport2->fake_ice_transport()->SetConnectionCount(2);
126 transport1->SetReceiving(true);
127 transport2->SetReceiving(true);
128 transport1->SetWritable(true);
129 transport2->SetWritable(true);
130 transport1->fake_ice_transport()->SetConnectionCount(1);
131 transport2->fake_ice_transport()->SetConnectionCount(1);
deadbeefcbecd352015-09-23 11:50:27 -0700132 }
133
deadbeef91042f82016-07-15 17:48:13 -0700134 IceConfig CreateIceConfig(
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700135 int receiving_timeout,
deadbeef91042f82016-07-15 17:48:13 -0700136 ContinualGatheringPolicy continual_gathering_policy) {
137 IceConfig config;
Honghai Zhang049fbb12016-03-07 11:13:07 -0800138 config.receiving_timeout = receiving_timeout;
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700139 config.continual_gathering_policy = continual_gathering_policy;
honghaiz1f429e32015-09-28 07:57:34 -0700140 return config;
141 }
142
deadbeefcbecd352015-09-23 11:50:27 -0700143 protected:
144 void OnConnectionState(IceConnectionState state) {
145 if (!signaling_thread_->IsCurrent()) {
146 signaled_on_non_signaling_thread_ = true;
147 }
148 connection_state_ = state;
149 ++connection_state_signal_count_;
150 }
151
152 void OnReceiving(bool receiving) {
153 if (!signaling_thread_->IsCurrent()) {
154 signaled_on_non_signaling_thread_ = true;
155 }
156 receiving_ = receiving;
157 ++receiving_signal_count_;
158 }
159
160 void OnGatheringState(IceGatheringState state) {
161 if (!signaling_thread_->IsCurrent()) {
162 signaled_on_non_signaling_thread_ = true;
163 }
164 gathering_state_ = state;
165 ++gathering_state_signal_count_;
166 }
167
168 void OnCandidatesGathered(const std::string& transport_name,
169 const Candidates& candidates) {
170 if (!signaling_thread_->IsCurrent()) {
171 signaled_on_non_signaling_thread_ = true;
172 }
173 candidates_[transport_name].insert(candidates_[transport_name].end(),
174 candidates.begin(), candidates.end());
175 ++candidates_signal_count_;
176 }
177
johan27c3d5b2016-10-17 00:54:57 -0700178 std::unique_ptr<rtc::Thread> network_thread_; // Not used for most tests.
jbauch555604a2016-04-26 03:13:22 -0700179 std::unique_ptr<TransportControllerForTest> transport_controller_;
deadbeefcbecd352015-09-23 11:50:27 -0700180
181 // Information received from signals from transport controller.
deadbeef91042f82016-07-15 17:48:13 -0700182 IceConnectionState connection_state_ = kIceConnectionConnecting;
deadbeefcbecd352015-09-23 11:50:27 -0700183 bool receiving_ = false;
deadbeef91042f82016-07-15 17:48:13 -0700184 IceGatheringState gathering_state_ = kIceGatheringNew;
deadbeefcbecd352015-09-23 11:50:27 -0700185 // transport_name => candidates
186 std::map<std::string, Candidates> candidates_;
187 // Counts of each signal emitted.
188 int connection_state_signal_count_ = 0;
189 int receiving_signal_count_ = 0;
190 int gathering_state_signal_count_ = 0;
191 int candidates_signal_count_ = 0;
192
193 // Used to make sure signals only come on signaling thread.
194 rtc::Thread* const signaling_thread_ = nullptr;
195 bool signaled_on_non_signaling_thread_ = false;
196};
197
honghaiz1f429e32015-09-28 07:57:34 -0700198TEST_F(TransportControllerTest, TestSetIceConfig) {
deadbeeff5346592017-01-24 21:51:21 -0800199 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
200 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700201
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700202 transport_controller_->SetIceConfig(
deadbeef91042f82016-07-15 17:48:13 -0700203 CreateIceConfig(1000, GATHER_CONTINUALLY));
deadbeeff5346592017-01-24 21:51:21 -0800204 EXPECT_EQ(1000, transport1->fake_ice_transport()->receiving_timeout());
205 EXPECT_TRUE(transport1->fake_ice_transport()->gather_continually());
deadbeefcbecd352015-09-23 11:50:27 -0700206
Honghai Zhang5622c5e2016-07-01 13:59:29 -0700207 transport_controller_->SetIceConfig(
deadbeef91042f82016-07-15 17:48:13 -0700208 CreateIceConfig(1000, GATHER_CONTINUALLY_AND_RECOVER));
deadbeeff5346592017-01-24 21:51:21 -0800209 // Test that value stored in controller is applied to new transports.
210 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
211 ASSERT_NE(nullptr, transport2);
212 EXPECT_EQ(1000, transport2->fake_ice_transport()->receiving_timeout());
213 EXPECT_TRUE(transport2->fake_ice_transport()->gather_continually());
deadbeefcbecd352015-09-23 11:50:27 -0700214}
215
216TEST_F(TransportControllerTest, TestSetSslMaxProtocolVersion) {
217 EXPECT_TRUE(transport_controller_->SetSslMaxProtocolVersion(
218 rtc::SSL_PROTOCOL_DTLS_12));
deadbeeff5346592017-01-24 21:51:21 -0800219 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700220
deadbeeff5346592017-01-24 21:51:21 -0800221 ASSERT_NE(nullptr, transport);
222 EXPECT_EQ(rtc::SSL_PROTOCOL_DTLS_12, transport->ssl_max_protocol_version());
deadbeefcbecd352015-09-23 11:50:27 -0700223
224 // Setting max version after transport is created should fail.
225 EXPECT_FALSE(transport_controller_->SetSslMaxProtocolVersion(
226 rtc::SSL_PROTOCOL_DTLS_10));
227}
228
229TEST_F(TransportControllerTest, TestSetIceRole) {
deadbeeff5346592017-01-24 21:51:21 -0800230 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
231 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700232
deadbeef91042f82016-07-15 17:48:13 -0700233 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800234 EXPECT_EQ(ICEROLE_CONTROLLING,
235 transport1->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700236 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
deadbeeff5346592017-01-24 21:51:21 -0800237 EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700238
deadbeeff5346592017-01-24 21:51:21 -0800239 // Test that value stored in controller is applied to new transports.
240 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
241 ASSERT_NE(nullptr, transport2);
242 EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700243}
244
deadbeeff5346592017-01-24 21:51:21 -0800245// Test that when one transport encounters a role conflict, the ICE role is
246// swapped on every transport.
deadbeefcbecd352015-09-23 11:50:27 -0700247TEST_F(TransportControllerTest, TestIceRoleConflict) {
deadbeeff5346592017-01-24 21:51:21 -0800248 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
249 ASSERT_NE(nullptr, transport1);
250 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
251 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700252
deadbeef91042f82016-07-15 17:48:13 -0700253 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800254 EXPECT_EQ(ICEROLE_CONTROLLING,
255 transport1->fake_ice_transport()->GetIceRole());
256 EXPECT_EQ(ICEROLE_CONTROLLING,
257 transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700258
deadbeeff5346592017-01-24 21:51:21 -0800259 transport1->fake_ice_transport()->SignalRoleConflict(
260 transport1->fake_ice_transport());
261 EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
262 EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
deadbeef1c206102016-05-27 13:34:37 -0700263
264 // Should be able to handle a second role conflict. The remote endpoint can
265 // change its role/tie-breaker when it does an ICE restart.
deadbeeff5346592017-01-24 21:51:21 -0800266 transport2->fake_ice_transport()->SignalRoleConflict(
267 transport2->fake_ice_transport());
268 EXPECT_EQ(ICEROLE_CONTROLLING,
269 transport1->fake_ice_transport()->GetIceRole());
270 EXPECT_EQ(ICEROLE_CONTROLLING,
271 transport2->fake_ice_transport()->GetIceRole());
deadbeefcbecd352015-09-23 11:50:27 -0700272}
273
274TEST_F(TransportControllerTest, TestGetSslRole) {
deadbeeff5346592017-01-24 21:51:21 -0800275 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
276 ASSERT_NE(nullptr, transport);
277 ASSERT_TRUE(transport->SetSslRole(rtc::SSL_CLIENT));
deadbeefcbecd352015-09-23 11:50:27 -0700278 rtc::SSLRole role;
Taylor Brandstetterf475d362016-01-08 15:35:57 -0800279 EXPECT_FALSE(transport_controller_->GetSslRole("video", &role));
280 EXPECT_TRUE(transport_controller_->GetSslRole("audio", &role));
deadbeefcbecd352015-09-23 11:50:27 -0700281 EXPECT_EQ(rtc::SSL_CLIENT, role);
282}
283
284TEST_F(TransportControllerTest, TestSetAndGetLocalCertificate) {
285 rtc::scoped_refptr<rtc::RTCCertificate> certificate1 =
jbauch555604a2016-04-26 03:13:22 -0700286 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800287 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700288 rtc::scoped_refptr<rtc::RTCCertificate> certificate2 =
jbauch555604a2016-04-26 03:13:22 -0700289 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800290 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700291 rtc::scoped_refptr<rtc::RTCCertificate> returned_certificate;
292
deadbeeff5346592017-01-24 21:51:21 -0800293 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
294 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700295
296 EXPECT_TRUE(transport_controller_->SetLocalCertificate(certificate1));
297 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
298 "audio", &returned_certificate));
299 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
300 returned_certificate->identity()->certificate().ToPEMString());
301
302 // Should fail if called for a nonexistant transport.
303 EXPECT_FALSE(transport_controller_->GetLocalCertificate(
304 "video", &returned_certificate));
305
deadbeeff5346592017-01-24 21:51:21 -0800306 // Test that identity stored in controller is applied to new transports.
307 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
308 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700309 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
310 "video", &returned_certificate));
311 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
312 returned_certificate->identity()->certificate().ToPEMString());
313
314 // Shouldn't be able to change the identity once set.
315 EXPECT_FALSE(transport_controller_->SetLocalCertificate(certificate2));
316}
317
318TEST_F(TransportControllerTest, TestGetRemoteSSLCertificate) {
319 rtc::FakeSSLCertificate fake_certificate("fake_data");
deadbeefcbecd352015-09-23 11:50:27 -0700320
deadbeeff5346592017-01-24 21:51:21 -0800321 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
322 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700323
deadbeeff5346592017-01-24 21:51:21 -0800324 transport->SetRemoteSSLCertificate(&fake_certificate);
jbauch555604a2016-04-26 03:13:22 -0700325 std::unique_ptr<rtc::SSLCertificate> returned_certificate =
kwibergb4d01c42016-04-06 05:15:06 -0700326 transport_controller_->GetRemoteSSLCertificate("audio");
327 EXPECT_TRUE(returned_certificate);
deadbeefcbecd352015-09-23 11:50:27 -0700328 EXPECT_EQ(fake_certificate.ToPEMString(),
329 returned_certificate->ToPEMString());
330
331 // Should fail if called for a nonexistant transport.
kwibergb4d01c42016-04-06 05:15:06 -0700332 EXPECT_FALSE(transport_controller_->GetRemoteSSLCertificate("video"));
deadbeefcbecd352015-09-23 11:50:27 -0700333}
334
335TEST_F(TransportControllerTest, TestSetLocalTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800336 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
337 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800338 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700339 kIcePwd1, ICEMODE_FULL,
340 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700341 std::string err;
342 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700343 "audio", local_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800344 // Check that ICE ufrag and pwd were propagated to transport.
345 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->ice_ufrag());
346 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700347 // After setting local description, we should be able to start gathering
348 // candidates.
349 transport_controller_->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700350 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700351 EXPECT_EQ(1, gathering_state_signal_count_);
352}
353
354TEST_F(TransportControllerTest, TestSetRemoteTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800355 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
356 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800357 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700358 kIcePwd1, ICEMODE_FULL,
359 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700360 std::string err;
361 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700362 "audio", remote_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800363 // Check that ICE ufrag and pwd were propagated to transport.
364 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->remote_ice_ufrag());
365 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->remote_ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700366}
367
368TEST_F(TransportControllerTest, TestAddRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800369 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
370 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700371 Candidates candidates;
372 candidates.push_back(CreateCandidate(1));
373 std::string err;
374 EXPECT_TRUE(
375 transport_controller_->AddRemoteCandidates("audio", candidates, &err));
deadbeeff5346592017-01-24 21:51:21 -0800376 EXPECT_EQ(1U, transport->fake_ice_transport()->remote_candidates().size());
deadbeefcbecd352015-09-23 11:50:27 -0700377}
378
379TEST_F(TransportControllerTest, TestReadyForRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800380 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
381 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700382 // We expect to be ready for remote candidates only after local and remote
383 // descriptions are set.
384 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
385
386 std::string err;
deadbeef46eed762016-01-28 13:24:37 -0800387 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700388 kIcePwd1, ICEMODE_FULL,
389 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700390 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700391 "audio", remote_desc, CA_OFFER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700392 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
393
deadbeef46eed762016-01-28 13:24:37 -0800394 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
deadbeef91042f82016-07-15 17:48:13 -0700395 kIcePwd2, ICEMODE_FULL,
396 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700397 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700398 "audio", local_desc, CA_ANSWER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700399 EXPECT_TRUE(transport_controller_->ReadyForRemoteCandidates("audio"));
400}
401
402TEST_F(TransportControllerTest, TestGetStats) {
deadbeeff5346592017-01-24 21:51:21 -0800403 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
404 ASSERT_NE(nullptr, transport1);
405 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 2);
406 ASSERT_NE(nullptr, transport2);
407 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 1);
408 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700409
410 TransportStats stats;
411 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
412 EXPECT_EQ("audio", stats.transport_name);
413 EXPECT_EQ(2U, stats.channel_stats.size());
414}
415
deadbeeff5346592017-01-24 21:51:21 -0800416// Test that a "transport" from a stats perspective (combination of RTP/RTCP
417// transports) goes away when all references to its transports are gone.
418TEST_F(TransportControllerTest, TestCreateAndDestroyFakeDtlsTransport) {
419 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
420 ASSERT_NE(nullptr, transport1);
421 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 1);
422 ASSERT_NE(nullptr, transport2);
423 ASSERT_EQ(transport1, transport2);
424 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("audio", 2);
425 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700426
427 // Using GetStats to check if transport is destroyed from an outside class's
428 // perspective.
429 TransportStats stats;
430 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800431 DestroyFakeDtlsTransport("audio", 2);
432 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700433 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800434 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700435 EXPECT_FALSE(transport_controller_->GetStats("audio", &stats));
436}
437
438TEST_F(TransportControllerTest, TestSignalConnectionStateFailed) {
439 // Need controlling ICE role to get in failed state.
deadbeef91042f82016-07-15 17:48:13 -0700440 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800441 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
442 ASSERT_NE(nullptr, transport1);
443 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
444 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700445
deadbeeff5346592017-01-24 21:51:21 -0800446 // Should signal "failed" if any transport failed; transport is considered
447 // failed
deadbeefcbecd352015-09-23 11:50:27 -0700448 // if it previously had a connection but now has none, and gathering is
449 // complete.
deadbeeff5346592017-01-24 21:51:21 -0800450 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
451 transport1->fake_ice_transport()->SetConnectionCount(1);
452 transport1->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700453 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700454 EXPECT_EQ(1, connection_state_signal_count_);
455}
456
457TEST_F(TransportControllerTest, TestSignalConnectionStateConnected) {
deadbeef91042f82016-07-15 17:48:13 -0700458 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800459 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
460 ASSERT_NE(nullptr, transport1);
461 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
462 ASSERT_NE(nullptr, transport2);
463 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
464 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700465
deadbeeff5346592017-01-24 21:51:21 -0800466 // First, have one transport connect, and another fail, to ensure that
467 // the first transport connecting didn't trigger a "connected" state signal.
deadbeefcbecd352015-09-23 11:50:27 -0700468 // We should only get a signal when all are connected.
deadbeeff5346592017-01-24 21:51:21 -0800469 transport1->fake_ice_transport()->SetConnectionCount(2);
470 transport1->SetWritable(true);
471 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
472 transport3->fake_ice_transport()->SetConnectionCount(1);
473 transport3->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700474 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700475 // Signal count of 1 means that the only signal emitted was "failed".
476 EXPECT_EQ(1, connection_state_signal_count_);
477
deadbeeff5346592017-01-24 21:51:21 -0800478 // Destroy the failed transport to return to "connecting" state.
479 DestroyFakeDtlsTransport("video", 2);
deadbeef91042f82016-07-15 17:48:13 -0700480 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700481 EXPECT_EQ(2, connection_state_signal_count_);
482
deadbeeff5346592017-01-24 21:51:21 -0800483 // Make the remaining transport reach a connected state.
484 transport2->fake_ice_transport()->SetConnectionCount(2);
485 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700486 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700487 EXPECT_EQ(3, connection_state_signal_count_);
488}
489
490TEST_F(TransportControllerTest, TestSignalConnectionStateComplete) {
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
499 // Similar to above test, but we're now reaching the completed state, which
zhihuangb2cdd932017-01-19 16:54:25 -0800500 // means only one connection per FakeDtlsTransport.
deadbeeff5346592017-01-24 21:51:21 -0800501 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
502 transport1->fake_ice_transport()->SetConnectionCount(1);
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()->SetCandidatesGatheringComplete();
518 transport2->fake_ice_transport()->SetConnectionCount(2);
519 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700520 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700521 EXPECT_EQ(3, connection_state_signal_count_);
522
523 // Finally, transition to completed state.
deadbeeff5346592017-01-24 21:51:21 -0800524 transport2->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700525 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700526 EXPECT_EQ(4, connection_state_signal_count_);
527}
528
529// Make sure that if we're "connected" and remove a transport, we stay in the
530// "connected" state.
531TEST_F(TransportControllerTest, TestDestroyTransportAndStayConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800532 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
533 ASSERT_NE(nullptr, transport1);
534 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
535 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700536
deadbeeff5346592017-01-24 21:51:21 -0800537 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
538 transport1->fake_ice_transport()->SetConnectionCount(2);
539 transport1->SetWritable(true);
540 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
541 transport2->fake_ice_transport()->SetConnectionCount(2);
542 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700543 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700544 EXPECT_EQ(1, connection_state_signal_count_);
545
deadbeeff5346592017-01-24 21:51:21 -0800546 // Destroy one transport, then "complete" the other one, so we reach
deadbeefcbecd352015-09-23 11:50:27 -0700547 // a known state.
deadbeeff5346592017-01-24 21:51:21 -0800548 DestroyFakeDtlsTransport("video", 1);
549 transport1->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700550 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700551 // Signal count of 2 means the deletion didn't cause any unexpected signals
552 EXPECT_EQ(2, connection_state_signal_count_);
553}
554
555// If we destroy the last/only transport, we should simply transition to
556// "connecting".
557TEST_F(TransportControllerTest, TestDestroyLastTransportWhileConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800558 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
559 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700560
deadbeeff5346592017-01-24 21:51:21 -0800561 transport->fake_ice_transport()->SetCandidatesGatheringComplete();
562 transport->fake_ice_transport()->SetConnectionCount(2);
563 transport->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700564 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700565 EXPECT_EQ(1, connection_state_signal_count_);
566
deadbeeff5346592017-01-24 21:51:21 -0800567 DestroyFakeDtlsTransport("audio", 1);
deadbeef91042f82016-07-15 17:48:13 -0700568 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700569 // Signal count of 2 means the deletion didn't cause any unexpected signals
570 EXPECT_EQ(2, connection_state_signal_count_);
571}
572
573TEST_F(TransportControllerTest, TestSignalReceiving) {
deadbeeff5346592017-01-24 21:51:21 -0800574 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
575 ASSERT_NE(nullptr, transport1);
576 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
577 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700578
deadbeeff5346592017-01-24 21:51:21 -0800579 // Should signal receiving as soon as any transport is receiving.
580 transport1->SetReceiving(true);
deadbeefcbecd352015-09-23 11:50:27 -0700581 EXPECT_TRUE_WAIT(receiving_, kTimeout);
582 EXPECT_EQ(1, receiving_signal_count_);
583
deadbeeff5346592017-01-24 21:51:21 -0800584 transport2->SetReceiving(true);
585 transport1->SetReceiving(false);
586 transport2->SetReceiving(false);
deadbeefcbecd352015-09-23 11:50:27 -0700587 EXPECT_TRUE_WAIT(!receiving_, kTimeout);
588 EXPECT_EQ(2, receiving_signal_count_);
589}
590
591TEST_F(TransportControllerTest, TestSignalGatheringStateGathering) {
deadbeeff5346592017-01-24 21:51:21 -0800592 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
593 ASSERT_NE(nullptr, transport);
594 transport->fake_ice_transport()->MaybeStartGathering();
deadbeefcbecd352015-09-23 11:50:27 -0700595 // Should be in the gathering state as soon as any transport starts gathering.
deadbeef91042f82016-07-15 17:48:13 -0700596 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700597 EXPECT_EQ(1, gathering_state_signal_count_);
598}
599
600TEST_F(TransportControllerTest, TestSignalGatheringStateComplete) {
deadbeeff5346592017-01-24 21:51:21 -0800601 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
602 ASSERT_NE(nullptr, transport1);
603 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
604 ASSERT_NE(nullptr, transport2);
605 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("data", 1);
606 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700607
deadbeeff5346592017-01-24 21:51:21 -0800608 transport3->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700609 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700610 EXPECT_EQ(1, gathering_state_signal_count_);
611
deadbeeff5346592017-01-24 21:51:21 -0800612 // Have one transport finish gathering, then destroy it, to make sure
613 // gathering
deadbeefcbecd352015-09-23 11:50:27 -0700614 // completion wasn't signalled if only one transport finished gathering.
deadbeeff5346592017-01-24 21:51:21 -0800615 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
616 DestroyFakeDtlsTransport("data", 1);
deadbeef91042f82016-07-15 17:48:13 -0700617 EXPECT_EQ_WAIT(kIceGatheringNew, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700618 EXPECT_EQ(2, gathering_state_signal_count_);
619
deadbeeff5346592017-01-24 21:51:21 -0800620 // Make remaining transports start and then finish gathering.
621 transport1->fake_ice_transport()->MaybeStartGathering();
622 transport2->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700623 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700624 EXPECT_EQ(3, gathering_state_signal_count_);
625
deadbeeff5346592017-01-24 21:51:21 -0800626 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
627 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700628 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700629 EXPECT_EQ(4, gathering_state_signal_count_);
630}
631
632// Test that when the last transport that hasn't finished connecting and/or
633// gathering is destroyed, the aggregate state jumps to "completed". This can
634// happen if, for example, we have an audio and video transport, the audio
635// transport completes, then we start bundling video on the audio transport.
636TEST_F(TransportControllerTest,
637 TestSignalingWhenLastIncompleteTransportDestroyed) {
deadbeef91042f82016-07-15 17:48:13 -0700638 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800639 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
640 ASSERT_NE(nullptr, transport1);
641 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
642 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700643
deadbeeff5346592017-01-24 21:51:21 -0800644 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700645 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700646 EXPECT_EQ(1, gathering_state_signal_count_);
647
deadbeeff5346592017-01-24 21:51:21 -0800648 transport1->fake_ice_transport()->SetConnectionCount(1);
649 transport1->SetWritable(true);
650 DestroyFakeDtlsTransport("video", 1);
deadbeef91042f82016-07-15 17:48:13 -0700651 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700652 EXPECT_EQ(1, connection_state_signal_count_);
deadbeef91042f82016-07-15 17:48:13 -0700653 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700654 EXPECT_EQ(2, gathering_state_signal_count_);
655}
656
657TEST_F(TransportControllerTest, TestSignalCandidatesGathered) {
deadbeeff5346592017-01-24 21:51:21 -0800658 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
659 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700660
661 // Transport won't signal candidates until it has a local description.
deadbeef46eed762016-01-28 13:24:37 -0800662 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700663 kIcePwd1, ICEMODE_FULL,
664 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700665 std::string err;
666 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700667 "audio", local_desc, CA_OFFER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700668 transport_controller_->MaybeStartGathering();
669
deadbeeff5346592017-01-24 21:51:21 -0800670 transport->fake_ice_transport()->SignalCandidateGathered(
671 transport->fake_ice_transport(), CreateCandidate(1));
deadbeefcbecd352015-09-23 11:50:27 -0700672 EXPECT_EQ_WAIT(1, candidates_signal_count_, kTimeout);
673 EXPECT_EQ(1U, candidates_["audio"].size());
674}
675
676TEST_F(TransportControllerTest, TestSignalingOccursOnSignalingThread) {
johan27c3d5b2016-10-17 00:54:57 -0700677 CreateTransportControllerWithNetworkThread();
deadbeeff5346592017-01-24 21:51:21 -0800678 CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread();
deadbeefcbecd352015-09-23 11:50:27 -0700679
680 // connecting --> connected --> completed
deadbeef91042f82016-07-15 17:48:13 -0700681 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700682 EXPECT_EQ(2, connection_state_signal_count_);
683
684 EXPECT_TRUE_WAIT(receiving_, kTimeout);
685 EXPECT_EQ(1, receiving_signal_count_);
686
687 // new --> gathering --> complete
deadbeef91042f82016-07-15 17:48:13 -0700688 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700689 EXPECT_EQ(2, gathering_state_signal_count_);
690
691 EXPECT_EQ_WAIT(1U, candidates_["audio"].size(), kTimeout);
692 EXPECT_EQ_WAIT(1U, candidates_["video"].size(), kTimeout);
693 EXPECT_EQ(2, candidates_signal_count_);
694
695 EXPECT_TRUE(!signaled_on_non_signaling_thread_);
696}
deadbeef91042f82016-07-15 17:48:13 -0700697
698// Older versions of Chrome expect the ICE role to be re-determined when an
699// ICE restart occurs, and also don't perform conflict resolution correctly,
700// so for now we can't safely stop doing this.
701// See: https://bugs.chromium.org/p/chromium/issues/detail?id=628676
702// TODO(deadbeef): Remove this when these old versions of Chrome reach a low
703// enough population.
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700704TEST_F(TransportControllerTest, IceRoleRedeterminedOnIceRestartByDefault) {
deadbeeff5346592017-01-24 21:51:21 -0800705 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
706 ASSERT_NE(nullptr, transport);
deadbeef91042f82016-07-15 17:48:13 -0700707 std::string err;
708 // Do an initial offer answer, so that the next offer is an ICE restart.
709 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
710 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
711 kIcePwd1, ICEMODE_FULL,
712 CONNECTIONROLE_ACTPASS, nullptr);
713 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
714 "audio", remote_desc, CA_OFFER, &err));
715 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
716 kIcePwd2, ICEMODE_FULL,
717 CONNECTIONROLE_ACTPASS, nullptr);
718 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
719 "audio", local_desc, CA_ANSWER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800720 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700721
722 // The endpoint that initiated an ICE restart should take the controlling
723 // role.
724 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
725 kIcePwd3, ICEMODE_FULL,
726 CONNECTIONROLE_ACTPASS, nullptr);
727 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
728 "audio", ice_restart_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800729 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700730}
731
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700732// Test that if the TransportController was created with the
733// |redetermine_role_on_ice_restart| parameter set to false, the role is *not*
734// redetermined on an ICE restart.
735TEST_F(TransportControllerTest, IceRoleNotRedetermined) {
736 bool redetermine_role = false;
737 transport_controller_.reset(new TransportControllerForTest(redetermine_role));
deadbeeff5346592017-01-24 21:51:21 -0800738 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
739 ASSERT_NE(nullptr, transport);
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -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(
747 "audio", remote_desc, CA_OFFER, &err));
748 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
749 kIcePwd2, ICEMODE_FULL,
750 CONNECTIONROLE_ACTPASS, nullptr);
751 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
752 "audio", local_desc, CA_ANSWER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800753 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700754
755 // The endpoint that initiated an ICE restart should keep the existing role.
756 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
757 kIcePwd3, ICEMODE_FULL,
758 CONNECTIONROLE_ACTPASS, nullptr);
759 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
760 "audio", ice_restart_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800761 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700762}
763
deadbeeff5346592017-01-24 21:51:21 -0800764// Tests ICE role is reversed after receiving ice-lite from remote.
deadbeef49f34fd2016-12-06 16:22:06 -0800765TEST_F(TransportControllerTest, TestSetRemoteIceLiteInOffer) {
deadbeeff5346592017-01-24 21:51:21 -0800766 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
767 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800768 std::string err;
769
770 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
771 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
772 kIcePwd1, ICEMODE_LITE,
773 CONNECTIONROLE_ACTPASS, nullptr);
774 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
775 "audio", remote_desc, CA_OFFER, &err));
776 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
777 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
778 "audio", local_desc, CA_ANSWER, nullptr));
779
deadbeeff5346592017-01-24 21:51:21 -0800780 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
781 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800782}
783
784// Tests ice-lite in remote answer.
785TEST_F(TransportControllerTest, TestSetRemoteIceLiteInAnswer) {
deadbeeff5346592017-01-24 21:51:21 -0800786 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
787 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800788 std::string err;
789
790 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
791 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
792 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
793 "audio", local_desc, CA_OFFER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800794 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
795 // Transports will be created in ICEFULL_MODE.
796 EXPECT_EQ(ICEMODE_FULL, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800797 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
798 kIcePwd1, ICEMODE_LITE, CONNECTIONROLE_NONE,
799 nullptr);
800 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
801 "audio", remote_desc, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800802 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
803 // After receiving remote description with ICEMODE_LITE, transport should
deadbeef49f34fd2016-12-06 16:22:06 -0800804 // have mode set to ICEMODE_LITE.
deadbeeff5346592017-01-24 21:51:21 -0800805 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800806}
807
deadbeefd1a38b52016-12-10 13:15:33 -0800808// Tests SetNeedsIceRestartFlag and NeedsIceRestart, setting the flag and then
809// initiating an ICE restart for one of the transports.
810TEST_F(TransportControllerTest, NeedsIceRestart) {
deadbeeff5346592017-01-24 21:51:21 -0800811 CreateFakeDtlsTransport("audio", 1);
812 CreateFakeDtlsTransport("video", 1);
deadbeefd1a38b52016-12-10 13:15:33 -0800813
814 // Do initial offer/answer so there's something to restart.
815 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
816 TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
817 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
818 "audio", local_desc, CA_OFFER, nullptr));
819 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
820 "video", local_desc, CA_OFFER, nullptr));
821 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
822 "audio", remote_desc, CA_ANSWER, nullptr));
823 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
824 "video", remote_desc, CA_ANSWER, nullptr));
825
826 // Initially NeedsIceRestart should return false.
827 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
828 EXPECT_FALSE(transport_controller_->NeedsIceRestart("video"));
829
830 // Set the needs-ice-restart flag and verify NeedsIceRestart starts returning
831 // true.
832 transport_controller_->SetNeedsIceRestartFlag();
833 EXPECT_TRUE(transport_controller_->NeedsIceRestart("audio"));
834 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
835 // For a nonexistent transport, false should be returned.
836 EXPECT_FALSE(transport_controller_->NeedsIceRestart("deadbeef"));
837
838 // Do ICE restart but only for audio.
839 TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
840 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
841 "audio", ice_restart_local_desc, CA_OFFER, nullptr));
842 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
843 "video", local_desc, CA_OFFER, nullptr));
844 // NeedsIceRestart should still be true for video.
845 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
846 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
847}
848
deadbeef91042f82016-07-15 17:48:13 -0700849} // namespace cricket {