blob: 32dc1b14964ad9fe42495be37bb252058245622e [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"
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) {
deadbeefcbecd352015-09-23 11:50:27 -0700275 rtc::SSLRole role;
deadbeefd8cfa1a2017-03-27 10:33:26 -0700276 CreateFakeDtlsTransport("audio", 1);
277
278 // Should return false before role has been negotiated.
279 EXPECT_FALSE(transport_controller_->GetSslRole("audio", &role));
280
281 // To negotiate an SSL role, need to set a local certificate, and
282 // local/remote transport descriptions with DTLS info.
283 rtc::scoped_refptr<rtc::RTCCertificate> certificate =
284 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
285 rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
286 std::unique_ptr<rtc::SSLFingerprint> fingerprint(
287 rtc::SSLFingerprint::CreateFromCertificate(certificate));
288 transport_controller_->SetLocalCertificate(certificate);
289
290 // Set the same fingerprint on both sides since the remote fingerprint
291 // doesn't really matter for this test.
292 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
293 kIcePwd1, ICEMODE_FULL,
294 CONNECTIONROLE_ACTPASS, fingerprint.get());
295 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag2,
296 kIcePwd2, ICEMODE_FULL,
297 CONNECTIONROLE_ACTIVE, fingerprint.get());
298 std::string err;
299 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
300 "audio", local_desc, cricket::CA_OFFER, &err));
301 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
302 "audio", remote_desc, cricket::CA_ANSWER, &err));
303
304 // Finally we can get the role. Should be "server" since the remote
305 // endpoint's role was "active".
Taylor Brandstetterf475d362016-01-08 15:35:57 -0800306 EXPECT_TRUE(transport_controller_->GetSslRole("audio", &role));
deadbeefd8cfa1a2017-03-27 10:33:26 -0700307 EXPECT_EQ(rtc::SSL_SERVER, role);
308
309 // Lastly, test that GetSslRole returns false for a nonexistent transport.
310 EXPECT_FALSE(transport_controller_->GetSslRole("video", &role));
deadbeefcbecd352015-09-23 11:50:27 -0700311}
312
313TEST_F(TransportControllerTest, TestSetAndGetLocalCertificate) {
314 rtc::scoped_refptr<rtc::RTCCertificate> certificate1 =
jbauch555604a2016-04-26 03:13:22 -0700315 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800316 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700317 rtc::scoped_refptr<rtc::RTCCertificate> certificate2 =
jbauch555604a2016-04-26 03:13:22 -0700318 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
kwiberg0eb15ed2015-12-17 03:04:15 -0800319 rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
deadbeefcbecd352015-09-23 11:50:27 -0700320 rtc::scoped_refptr<rtc::RTCCertificate> returned_certificate;
321
deadbeeff5346592017-01-24 21:51:21 -0800322 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
323 ASSERT_NE(nullptr, transport1);
deadbeefcbecd352015-09-23 11:50:27 -0700324
325 EXPECT_TRUE(transport_controller_->SetLocalCertificate(certificate1));
326 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
327 "audio", &returned_certificate));
328 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
329 returned_certificate->identity()->certificate().ToPEMString());
330
331 // Should fail if called for a nonexistant transport.
332 EXPECT_FALSE(transport_controller_->GetLocalCertificate(
333 "video", &returned_certificate));
334
deadbeeff5346592017-01-24 21:51:21 -0800335 // Test that identity stored in controller is applied to new transports.
336 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
337 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700338 EXPECT_TRUE(transport_controller_->GetLocalCertificate(
339 "video", &returned_certificate));
340 EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
341 returned_certificate->identity()->certificate().ToPEMString());
342
343 // Shouldn't be able to change the identity once set.
344 EXPECT_FALSE(transport_controller_->SetLocalCertificate(certificate2));
345}
346
347TEST_F(TransportControllerTest, TestGetRemoteSSLCertificate) {
348 rtc::FakeSSLCertificate fake_certificate("fake_data");
deadbeefcbecd352015-09-23 11:50:27 -0700349
deadbeeff5346592017-01-24 21:51:21 -0800350 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
351 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700352
deadbeeff5346592017-01-24 21:51:21 -0800353 transport->SetRemoteSSLCertificate(&fake_certificate);
jbauch555604a2016-04-26 03:13:22 -0700354 std::unique_ptr<rtc::SSLCertificate> returned_certificate =
kwibergb4d01c42016-04-06 05:15:06 -0700355 transport_controller_->GetRemoteSSLCertificate("audio");
356 EXPECT_TRUE(returned_certificate);
deadbeefcbecd352015-09-23 11:50:27 -0700357 EXPECT_EQ(fake_certificate.ToPEMString(),
358 returned_certificate->ToPEMString());
359
360 // Should fail if called for a nonexistant transport.
kwibergb4d01c42016-04-06 05:15:06 -0700361 EXPECT_FALSE(transport_controller_->GetRemoteSSLCertificate("video"));
deadbeefcbecd352015-09-23 11:50:27 -0700362}
363
364TEST_F(TransportControllerTest, TestSetLocalTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800365 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
366 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800367 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700368 kIcePwd1, ICEMODE_FULL,
369 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700370 std::string err;
371 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700372 "audio", local_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800373 // Check that ICE ufrag and pwd were propagated to transport.
374 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->ice_ufrag());
375 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700376 // After setting local description, we should be able to start gathering
377 // candidates.
378 transport_controller_->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700379 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700380 EXPECT_EQ(1, gathering_state_signal_count_);
381}
382
383TEST_F(TransportControllerTest, TestSetRemoteTransportDescription) {
deadbeeff5346592017-01-24 21:51:21 -0800384 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
385 ASSERT_NE(nullptr, transport);
deadbeef46eed762016-01-28 13:24:37 -0800386 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700387 kIcePwd1, ICEMODE_FULL,
388 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700389 std::string err;
390 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700391 "audio", remote_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800392 // Check that ICE ufrag and pwd were propagated to transport.
393 EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->remote_ice_ufrag());
394 EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->remote_ice_pwd());
deadbeefcbecd352015-09-23 11:50:27 -0700395}
396
397TEST_F(TransportControllerTest, TestAddRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800398 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
399 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700400 Candidates candidates;
401 candidates.push_back(CreateCandidate(1));
402 std::string err;
403 EXPECT_TRUE(
404 transport_controller_->AddRemoteCandidates("audio", candidates, &err));
deadbeeff5346592017-01-24 21:51:21 -0800405 EXPECT_EQ(1U, transport->fake_ice_transport()->remote_candidates().size());
deadbeefcbecd352015-09-23 11:50:27 -0700406}
407
408TEST_F(TransportControllerTest, TestReadyForRemoteCandidates) {
deadbeeff5346592017-01-24 21:51:21 -0800409 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
410 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700411 // We expect to be ready for remote candidates only after local and remote
412 // descriptions are set.
413 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
414
415 std::string err;
deadbeef46eed762016-01-28 13:24:37 -0800416 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700417 kIcePwd1, ICEMODE_FULL,
418 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700419 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700420 "audio", remote_desc, CA_OFFER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700421 EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
422
deadbeef46eed762016-01-28 13:24:37 -0800423 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
deadbeef91042f82016-07-15 17:48:13 -0700424 kIcePwd2, ICEMODE_FULL,
425 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700426 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700427 "audio", local_desc, CA_ANSWER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700428 EXPECT_TRUE(transport_controller_->ReadyForRemoteCandidates("audio"));
429}
430
431TEST_F(TransportControllerTest, TestGetStats) {
deadbeeff5346592017-01-24 21:51:21 -0800432 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
433 ASSERT_NE(nullptr, transport1);
434 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 2);
435 ASSERT_NE(nullptr, transport2);
436 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 1);
437 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700438
439 TransportStats stats;
440 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
441 EXPECT_EQ("audio", stats.transport_name);
442 EXPECT_EQ(2U, stats.channel_stats.size());
443}
444
deadbeeff5346592017-01-24 21:51:21 -0800445// Test that a "transport" from a stats perspective (combination of RTP/RTCP
446// transports) goes away when all references to its transports are gone.
447TEST_F(TransportControllerTest, TestCreateAndDestroyFakeDtlsTransport) {
448 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
449 ASSERT_NE(nullptr, transport1);
450 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 1);
451 ASSERT_NE(nullptr, transport2);
452 ASSERT_EQ(transport1, transport2);
453 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("audio", 2);
454 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700455
456 // Using GetStats to check if transport is destroyed from an outside class's
457 // perspective.
458 TransportStats stats;
459 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800460 DestroyFakeDtlsTransport("audio", 2);
461 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700462 EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
deadbeeff5346592017-01-24 21:51:21 -0800463 DestroyFakeDtlsTransport("audio", 1);
deadbeefcbecd352015-09-23 11:50:27 -0700464 EXPECT_FALSE(transport_controller_->GetStats("audio", &stats));
465}
466
467TEST_F(TransportControllerTest, TestSignalConnectionStateFailed) {
468 // Need controlling ICE role to get in failed state.
deadbeef91042f82016-07-15 17:48:13 -0700469 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800470 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
471 ASSERT_NE(nullptr, transport1);
472 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
473 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700474
deadbeeff5346592017-01-24 21:51:21 -0800475 // Should signal "failed" if any transport failed; transport is considered
476 // failed
deadbeefcbecd352015-09-23 11:50:27 -0700477 // if it previously had a connection but now has none, and gathering is
478 // complete.
deadbeeff5346592017-01-24 21:51:21 -0800479 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
480 transport1->fake_ice_transport()->SetConnectionCount(1);
481 transport1->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700482 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700483 EXPECT_EQ(1, connection_state_signal_count_);
484}
485
486TEST_F(TransportControllerTest, TestSignalConnectionStateConnected) {
deadbeef91042f82016-07-15 17:48:13 -0700487 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800488 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
489 ASSERT_NE(nullptr, transport1);
490 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
491 ASSERT_NE(nullptr, transport2);
492 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
493 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700494
deadbeeff5346592017-01-24 21:51:21 -0800495 // First, have one transport connect, and another fail, to ensure that
496 // the first transport connecting didn't trigger a "connected" state signal.
deadbeefcbecd352015-09-23 11:50:27 -0700497 // We should only get a signal when all are connected.
deadbeeff5346592017-01-24 21:51:21 -0800498 transport1->fake_ice_transport()->SetConnectionCount(2);
499 transport1->SetWritable(true);
500 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
501 transport3->fake_ice_transport()->SetConnectionCount(1);
502 transport3->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700503 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700504 // Signal count of 1 means that the only signal emitted was "failed".
505 EXPECT_EQ(1, connection_state_signal_count_);
506
deadbeeff5346592017-01-24 21:51:21 -0800507 // Destroy the failed transport to return to "connecting" state.
508 DestroyFakeDtlsTransport("video", 2);
deadbeef91042f82016-07-15 17:48:13 -0700509 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700510 EXPECT_EQ(2, connection_state_signal_count_);
511
deadbeeff5346592017-01-24 21:51:21 -0800512 // Make the remaining transport reach a connected state.
513 transport2->fake_ice_transport()->SetConnectionCount(2);
514 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700515 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700516 EXPECT_EQ(3, connection_state_signal_count_);
517}
518
519TEST_F(TransportControllerTest, TestSignalConnectionStateComplete) {
deadbeef91042f82016-07-15 17:48:13 -0700520 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800521 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
522 ASSERT_NE(nullptr, transport1);
523 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
524 ASSERT_NE(nullptr, transport2);
525 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
526 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700527
528 // Similar to above test, but we're now reaching the completed state, which
zhihuangb2cdd932017-01-19 16:54:25 -0800529 // means only one connection per FakeDtlsTransport.
deadbeeff5346592017-01-24 21:51:21 -0800530 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
531 transport1->fake_ice_transport()->SetConnectionCount(1);
532 transport1->SetWritable(true);
533 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
534 transport3->fake_ice_transport()->SetConnectionCount(1);
535 transport3->fake_ice_transport()->SetConnectionCount(0);
deadbeef91042f82016-07-15 17:48:13 -0700536 EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700537 // Signal count of 1 means that the only signal emitted was "failed".
538 EXPECT_EQ(1, connection_state_signal_count_);
539
deadbeeff5346592017-01-24 21:51:21 -0800540 // Destroy the failed transport to return to "connecting" state.
541 DestroyFakeDtlsTransport("video", 2);
deadbeef91042f82016-07-15 17:48:13 -0700542 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700543 EXPECT_EQ(2, connection_state_signal_count_);
544
deadbeeff5346592017-01-24 21:51:21 -0800545 // Make the remaining transport reach a connected state.
546 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
547 transport2->fake_ice_transport()->SetConnectionCount(2);
548 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700549 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700550 EXPECT_EQ(3, connection_state_signal_count_);
551
552 // Finally, transition to completed state.
deadbeeff5346592017-01-24 21:51:21 -0800553 transport2->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700554 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700555 EXPECT_EQ(4, connection_state_signal_count_);
556}
557
558// Make sure that if we're "connected" and remove a transport, we stay in the
559// "connected" state.
560TEST_F(TransportControllerTest, TestDestroyTransportAndStayConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800561 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
562 ASSERT_NE(nullptr, transport1);
563 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
564 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700565
deadbeeff5346592017-01-24 21:51:21 -0800566 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
567 transport1->fake_ice_transport()->SetConnectionCount(2);
568 transport1->SetWritable(true);
569 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
570 transport2->fake_ice_transport()->SetConnectionCount(2);
571 transport2->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700572 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700573 EXPECT_EQ(1, connection_state_signal_count_);
574
deadbeeff5346592017-01-24 21:51:21 -0800575 // Destroy one transport, then "complete" the other one, so we reach
deadbeefcbecd352015-09-23 11:50:27 -0700576 // a known state.
deadbeeff5346592017-01-24 21:51:21 -0800577 DestroyFakeDtlsTransport("video", 1);
578 transport1->fake_ice_transport()->SetConnectionCount(1);
deadbeef91042f82016-07-15 17:48:13 -0700579 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700580 // Signal count of 2 means the deletion didn't cause any unexpected signals
581 EXPECT_EQ(2, connection_state_signal_count_);
582}
583
584// If we destroy the last/only transport, we should simply transition to
585// "connecting".
586TEST_F(TransportControllerTest, TestDestroyLastTransportWhileConnected) {
deadbeeff5346592017-01-24 21:51:21 -0800587 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
588 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700589
deadbeeff5346592017-01-24 21:51:21 -0800590 transport->fake_ice_transport()->SetCandidatesGatheringComplete();
591 transport->fake_ice_transport()->SetConnectionCount(2);
592 transport->SetWritable(true);
deadbeef91042f82016-07-15 17:48:13 -0700593 EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700594 EXPECT_EQ(1, connection_state_signal_count_);
595
deadbeeff5346592017-01-24 21:51:21 -0800596 DestroyFakeDtlsTransport("audio", 1);
deadbeef91042f82016-07-15 17:48:13 -0700597 EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700598 // Signal count of 2 means the deletion didn't cause any unexpected signals
599 EXPECT_EQ(2, connection_state_signal_count_);
600}
601
602TEST_F(TransportControllerTest, TestSignalReceiving) {
deadbeeff5346592017-01-24 21:51:21 -0800603 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
604 ASSERT_NE(nullptr, transport1);
605 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
606 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700607
deadbeeff5346592017-01-24 21:51:21 -0800608 // Should signal receiving as soon as any transport is receiving.
609 transport1->SetReceiving(true);
deadbeefcbecd352015-09-23 11:50:27 -0700610 EXPECT_TRUE_WAIT(receiving_, kTimeout);
611 EXPECT_EQ(1, receiving_signal_count_);
612
deadbeeff5346592017-01-24 21:51:21 -0800613 transport2->SetReceiving(true);
614 transport1->SetReceiving(false);
615 transport2->SetReceiving(false);
deadbeefcbecd352015-09-23 11:50:27 -0700616 EXPECT_TRUE_WAIT(!receiving_, kTimeout);
617 EXPECT_EQ(2, receiving_signal_count_);
618}
619
620TEST_F(TransportControllerTest, TestSignalGatheringStateGathering) {
deadbeeff5346592017-01-24 21:51:21 -0800621 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
622 ASSERT_NE(nullptr, transport);
623 transport->fake_ice_transport()->MaybeStartGathering();
deadbeefcbecd352015-09-23 11:50:27 -0700624 // Should be in the gathering state as soon as any transport starts gathering.
deadbeef91042f82016-07-15 17:48:13 -0700625 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700626 EXPECT_EQ(1, gathering_state_signal_count_);
627}
628
629TEST_F(TransportControllerTest, TestSignalGatheringStateComplete) {
deadbeeff5346592017-01-24 21:51:21 -0800630 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
631 ASSERT_NE(nullptr, transport1);
632 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
633 ASSERT_NE(nullptr, transport2);
634 FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("data", 1);
635 ASSERT_NE(nullptr, transport3);
deadbeefcbecd352015-09-23 11:50:27 -0700636
deadbeeff5346592017-01-24 21:51:21 -0800637 transport3->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700638 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700639 EXPECT_EQ(1, gathering_state_signal_count_);
640
deadbeeff5346592017-01-24 21:51:21 -0800641 // Have one transport finish gathering, then destroy it, to make sure
642 // gathering
deadbeefcbecd352015-09-23 11:50:27 -0700643 // completion wasn't signalled if only one transport finished gathering.
deadbeeff5346592017-01-24 21:51:21 -0800644 transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
645 DestroyFakeDtlsTransport("data", 1);
deadbeef91042f82016-07-15 17:48:13 -0700646 EXPECT_EQ_WAIT(kIceGatheringNew, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700647 EXPECT_EQ(2, gathering_state_signal_count_);
648
deadbeeff5346592017-01-24 21:51:21 -0800649 // Make remaining transports start and then finish gathering.
650 transport1->fake_ice_transport()->MaybeStartGathering();
651 transport2->fake_ice_transport()->MaybeStartGathering();
deadbeef91042f82016-07-15 17:48:13 -0700652 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700653 EXPECT_EQ(3, gathering_state_signal_count_);
654
deadbeeff5346592017-01-24 21:51:21 -0800655 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
656 transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700657 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700658 EXPECT_EQ(4, gathering_state_signal_count_);
659}
660
661// Test that when the last transport that hasn't finished connecting and/or
662// gathering is destroyed, the aggregate state jumps to "completed". This can
663// happen if, for example, we have an audio and video transport, the audio
664// transport completes, then we start bundling video on the audio transport.
665TEST_F(TransportControllerTest,
666 TestSignalingWhenLastIncompleteTransportDestroyed) {
deadbeef91042f82016-07-15 17:48:13 -0700667 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
deadbeeff5346592017-01-24 21:51:21 -0800668 FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
669 ASSERT_NE(nullptr, transport1);
670 FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
671 ASSERT_NE(nullptr, transport2);
deadbeefcbecd352015-09-23 11:50:27 -0700672
deadbeeff5346592017-01-24 21:51:21 -0800673 transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
deadbeef91042f82016-07-15 17:48:13 -0700674 EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700675 EXPECT_EQ(1, gathering_state_signal_count_);
676
deadbeeff5346592017-01-24 21:51:21 -0800677 transport1->fake_ice_transport()->SetConnectionCount(1);
678 transport1->SetWritable(true);
679 DestroyFakeDtlsTransport("video", 1);
deadbeef91042f82016-07-15 17:48:13 -0700680 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700681 EXPECT_EQ(1, connection_state_signal_count_);
deadbeef91042f82016-07-15 17:48:13 -0700682 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700683 EXPECT_EQ(2, gathering_state_signal_count_);
684}
685
686TEST_F(TransportControllerTest, TestSignalCandidatesGathered) {
deadbeeff5346592017-01-24 21:51:21 -0800687 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
688 ASSERT_NE(nullptr, transport);
deadbeefcbecd352015-09-23 11:50:27 -0700689
690 // Transport won't signal candidates until it has a local description.
deadbeef46eed762016-01-28 13:24:37 -0800691 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
deadbeef91042f82016-07-15 17:48:13 -0700692 kIcePwd1, ICEMODE_FULL,
693 CONNECTIONROLE_ACTPASS, nullptr);
deadbeefcbecd352015-09-23 11:50:27 -0700694 std::string err;
695 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
deadbeef91042f82016-07-15 17:48:13 -0700696 "audio", local_desc, CA_OFFER, &err));
deadbeefcbecd352015-09-23 11:50:27 -0700697 transport_controller_->MaybeStartGathering();
698
deadbeeff5346592017-01-24 21:51:21 -0800699 transport->fake_ice_transport()->SignalCandidateGathered(
700 transport->fake_ice_transport(), CreateCandidate(1));
deadbeefcbecd352015-09-23 11:50:27 -0700701 EXPECT_EQ_WAIT(1, candidates_signal_count_, kTimeout);
702 EXPECT_EQ(1U, candidates_["audio"].size());
703}
704
705TEST_F(TransportControllerTest, TestSignalingOccursOnSignalingThread) {
johan27c3d5b2016-10-17 00:54:57 -0700706 CreateTransportControllerWithNetworkThread();
deadbeeff5346592017-01-24 21:51:21 -0800707 CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread();
deadbeefcbecd352015-09-23 11:50:27 -0700708
709 // connecting --> connected --> completed
deadbeef91042f82016-07-15 17:48:13 -0700710 EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700711 EXPECT_EQ(2, connection_state_signal_count_);
712
713 EXPECT_TRUE_WAIT(receiving_, kTimeout);
714 EXPECT_EQ(1, receiving_signal_count_);
715
716 // new --> gathering --> complete
deadbeef91042f82016-07-15 17:48:13 -0700717 EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
deadbeefcbecd352015-09-23 11:50:27 -0700718 EXPECT_EQ(2, gathering_state_signal_count_);
719
720 EXPECT_EQ_WAIT(1U, candidates_["audio"].size(), kTimeout);
721 EXPECT_EQ_WAIT(1U, candidates_["video"].size(), kTimeout);
722 EXPECT_EQ(2, candidates_signal_count_);
723
724 EXPECT_TRUE(!signaled_on_non_signaling_thread_);
725}
deadbeef91042f82016-07-15 17:48:13 -0700726
727// Older versions of Chrome expect the ICE role to be re-determined when an
728// ICE restart occurs, and also don't perform conflict resolution correctly,
729// so for now we can't safely stop doing this.
730// See: https://bugs.chromium.org/p/chromium/issues/detail?id=628676
731// TODO(deadbeef): Remove this when these old versions of Chrome reach a low
732// enough population.
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700733TEST_F(TransportControllerTest, IceRoleRedeterminedOnIceRestartByDefault) {
deadbeeff5346592017-01-24 21:51:21 -0800734 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
735 ASSERT_NE(nullptr, transport);
deadbeef91042f82016-07-15 17:48:13 -0700736 std::string err;
737 // Do an initial offer answer, so that the next offer is an ICE restart.
738 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
739 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
740 kIcePwd1, ICEMODE_FULL,
741 CONNECTIONROLE_ACTPASS, nullptr);
742 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
743 "audio", remote_desc, CA_OFFER, &err));
744 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
745 kIcePwd2, ICEMODE_FULL,
746 CONNECTIONROLE_ACTPASS, nullptr);
747 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
748 "audio", local_desc, CA_ANSWER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800749 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700750
751 // The endpoint that initiated an ICE restart should take the controlling
752 // role.
753 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
754 kIcePwd3, ICEMODE_FULL,
755 CONNECTIONROLE_ACTPASS, nullptr);
756 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
757 "audio", ice_restart_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800758 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
deadbeef91042f82016-07-15 17:48:13 -0700759}
760
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700761// Test that if the TransportController was created with the
762// |redetermine_role_on_ice_restart| parameter set to false, the role is *not*
763// redetermined on an ICE restart.
764TEST_F(TransportControllerTest, IceRoleNotRedetermined) {
765 bool redetermine_role = false;
766 transport_controller_.reset(new TransportControllerForTest(redetermine_role));
deadbeeff5346592017-01-24 21:51:21 -0800767 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
768 ASSERT_NE(nullptr, transport);
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700769 std::string err;
770 // Do an initial offer answer, so that the next offer is an ICE restart.
771 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
772 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
773 kIcePwd1, ICEMODE_FULL,
774 CONNECTIONROLE_ACTPASS, nullptr);
775 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
776 "audio", remote_desc, CA_OFFER, &err));
777 TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
778 kIcePwd2, ICEMODE_FULL,
779 CONNECTIONROLE_ACTPASS, nullptr);
780 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
781 "audio", local_desc, CA_ANSWER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800782 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700783
784 // The endpoint that initiated an ICE restart should keep the existing role.
785 TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
786 kIcePwd3, ICEMODE_FULL,
787 CONNECTIONROLE_ACTPASS, nullptr);
788 EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
789 "audio", ice_restart_desc, CA_OFFER, &err));
deadbeeff5346592017-01-24 21:51:21 -0800790 EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
Taylor Brandstetterf0bb3602016-08-26 20:59:24 -0700791}
792
deadbeeff5346592017-01-24 21:51:21 -0800793// Tests ICE role is reversed after receiving ice-lite from remote.
deadbeef49f34fd2016-12-06 16:22:06 -0800794TEST_F(TransportControllerTest, TestSetRemoteIceLiteInOffer) {
deadbeeff5346592017-01-24 21:51:21 -0800795 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
796 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800797 std::string err;
798
799 transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
800 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
801 kIcePwd1, ICEMODE_LITE,
802 CONNECTIONROLE_ACTPASS, nullptr);
803 EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
804 "audio", remote_desc, CA_OFFER, &err));
805 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
806 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
807 "audio", local_desc, CA_ANSWER, nullptr));
808
deadbeeff5346592017-01-24 21:51:21 -0800809 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
810 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800811}
812
813// Tests ice-lite in remote answer.
814TEST_F(TransportControllerTest, TestSetRemoteIceLiteInAnswer) {
deadbeeff5346592017-01-24 21:51:21 -0800815 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
816 ASSERT_NE(nullptr, transport);
deadbeef49f34fd2016-12-06 16:22:06 -0800817 std::string err;
818
819 transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
820 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
821 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
822 "audio", local_desc, CA_OFFER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800823 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
824 // Transports will be created in ICEFULL_MODE.
825 EXPECT_EQ(ICEMODE_FULL, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800826 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
827 kIcePwd1, ICEMODE_LITE, CONNECTIONROLE_NONE,
828 nullptr);
829 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
830 "audio", remote_desc, CA_ANSWER, nullptr));
deadbeeff5346592017-01-24 21:51:21 -0800831 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
832 // After receiving remote description with ICEMODE_LITE, transport should
deadbeef49f34fd2016-12-06 16:22:06 -0800833 // have mode set to ICEMODE_LITE.
deadbeeff5346592017-01-24 21:51:21 -0800834 EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
deadbeef49f34fd2016-12-06 16:22:06 -0800835}
836
deadbeef897d08e2017-04-20 00:57:25 -0700837// Tests that the ICE role remains "controlling" if a subsequent offer that
838// does an ICE restart is received from an ICE lite endpoint. Regression test
839// for: https://crbug.com/710760
840TEST_F(TransportControllerTest,
841 IceRoleIsControllingAfterIceRestartFromIceLiteEndpoint) {
842 FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
843 ASSERT_NE(nullptr, transport);
844 std::string err;
845
846 // Initial offer/answer.
847 TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
848 kIcePwd1, ICEMODE_LITE,
849 CONNECTIONROLE_ACTPASS, nullptr);
850 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
851 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
852 "audio", remote_desc, CA_OFFER, &err));
853 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
854 "audio", local_desc, CA_ANSWER, nullptr));
855 // Subsequent ICE restart offer/answer.
856 remote_desc.ice_ufrag = kIceUfrag2;
857 remote_desc.ice_pwd = kIcePwd2;
858 local_desc.ice_ufrag = kIceUfrag2;
859 local_desc.ice_pwd = kIcePwd2;
860 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
861 "audio", remote_desc, CA_OFFER, &err));
862 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
863 "audio", local_desc, CA_ANSWER, nullptr));
864
865 EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
866}
867
deadbeefd1a38b52016-12-10 13:15:33 -0800868// Tests SetNeedsIceRestartFlag and NeedsIceRestart, setting the flag and then
869// initiating an ICE restart for one of the transports.
870TEST_F(TransportControllerTest, NeedsIceRestart) {
deadbeeff5346592017-01-24 21:51:21 -0800871 CreateFakeDtlsTransport("audio", 1);
872 CreateFakeDtlsTransport("video", 1);
deadbeefd1a38b52016-12-10 13:15:33 -0800873
874 // Do initial offer/answer so there's something to restart.
875 TransportDescription local_desc(kIceUfrag1, kIcePwd1);
876 TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
877 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
878 "audio", local_desc, CA_OFFER, nullptr));
879 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
880 "video", local_desc, CA_OFFER, nullptr));
881 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
882 "audio", remote_desc, CA_ANSWER, nullptr));
883 ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
884 "video", remote_desc, CA_ANSWER, nullptr));
885
886 // Initially NeedsIceRestart should return false.
887 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
888 EXPECT_FALSE(transport_controller_->NeedsIceRestart("video"));
889
890 // Set the needs-ice-restart flag and verify NeedsIceRestart starts returning
891 // true.
892 transport_controller_->SetNeedsIceRestartFlag();
893 EXPECT_TRUE(transport_controller_->NeedsIceRestart("audio"));
894 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
895 // For a nonexistent transport, false should be returned.
896 EXPECT_FALSE(transport_controller_->NeedsIceRestart("deadbeef"));
897
898 // Do ICE restart but only for audio.
899 TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
900 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
901 "audio", ice_restart_local_desc, CA_OFFER, nullptr));
902 ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
903 "video", local_desc, CA_OFFER, nullptr));
904 // NeedsIceRestart should still be true for video.
905 EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
906 EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
907}
908
Zhi Huangb5261582017-09-29 10:51:43 -0700909} // namespace cricket