blob: 0421124b830cdc2df17507c2295a2e3c3f4373e3 [file] [log] [blame]
Henrik Boström933d8b02017-10-10 10:05:16 -07001/*
2 * Copyright 2017 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 <memory>
12#include <vector>
13
Karl Wiberg1b0eae32017-10-17 14:48:54 +020014#include "api/audio_codecs/builtin_audio_decoder_factory.h"
15#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Henrik Boström933d8b02017-10-10 10:05:16 -070016#include "api/jsep.h"
17#include "api/mediastreaminterface.h"
18#include "api/peerconnectioninterface.h"
19#include "pc/mediastream.h"
20#include "pc/mediastreamtrack.h"
21#include "pc/peerconnectionwrapper.h"
22#include "pc/test/fakeaudiocapturemodule.h"
23#include "pc/test/mockpeerconnectionobservers.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/ptr_util.h"
27#include "rtc_base/refcountedobject.h"
28#include "rtc_base/scoped_ref_ptr.h"
29#include "rtc_base/thread.h"
30
31// This file contains tests for RTP Media API-related behavior of
32// |webrtc::PeerConnection|, see https://w3c.github.io/webrtc-pc/#rtp-media-api.
33
34namespace {
35
Henrik Boström31638672017-11-23 17:48:32 +010036const uint32_t kDefaultTimeout = 10000u;
37
38template <typename MethodFunctor>
39class OnSuccessObserver : public rtc::RefCountedObject<
40 webrtc::SetRemoteDescriptionObserverInterface> {
41 public:
42 explicit OnSuccessObserver(MethodFunctor on_success)
43 : on_success_(std::move(on_success)) {}
44
45 // webrtc::SetRemoteDescriptionObserverInterface implementation.
46 void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override {
47 RTC_CHECK(error.ok());
48 on_success_();
49 }
50
51 private:
52 MethodFunctor on_success_;
53};
54
Henrik Boström933d8b02017-10-10 10:05:16 -070055class PeerConnectionRtpTest : public testing::Test {
56 public:
57 PeerConnectionRtpTest()
Karl Wiberg1b0eae32017-10-17 14:48:54 +020058 : pc_factory_(webrtc::CreatePeerConnectionFactory(
Henrik Boström933d8b02017-10-10 10:05:16 -070059 rtc::Thread::Current(),
60 rtc::Thread::Current(),
61 rtc::Thread::Current(),
62 FakeAudioCaptureModule::Create(),
Karl Wiberg1b0eae32017-10-17 14:48:54 +020063 webrtc::CreateBuiltinAudioEncoderFactory(),
64 webrtc::CreateBuiltinAudioDecoderFactory(),
Henrik Boström933d8b02017-10-10 10:05:16 -070065 nullptr,
66 nullptr)) {}
67
68 std::unique_ptr<webrtc::PeerConnectionWrapper> CreatePeerConnection() {
69 webrtc::PeerConnectionInterface::RTCConfiguration config;
70 auto observer = rtc::MakeUnique<webrtc::MockPeerConnectionObserver>();
71 auto pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr,
72 observer.get());
73 return std::unique_ptr<webrtc::PeerConnectionWrapper>(
74 new webrtc::PeerConnectionWrapper(pc_factory_, pc,
75 std::move(observer)));
76 }
77
78 protected:
79 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
80};
81
Henrik Boström31638672017-11-23 17:48:32 +010082// These tests cover |webrtc::PeerConnectionObserver| callbacks firing upon
83// setting the remote description.
84class PeerConnectionRtpCallbacksTest : public PeerConnectionRtpTest {};
85
86TEST_F(PeerConnectionRtpCallbacksTest, AddTrackWithoutStreamFiresOnAddTrack) {
Henrik Boström933d8b02017-10-10 10:05:16 -070087 auto caller = CreatePeerConnection();
88 auto callee = CreatePeerConnection();
89
90 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
91 pc_factory_->CreateAudioTrack("audio_track", nullptr));
92 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {}));
Henrik Boström31638672017-11-23 17:48:32 +010093 ASSERT_TRUE(
94 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
95 static_cast<webrtc::RTCError*>(nullptr)));
Henrik Boström933d8b02017-10-10 10:05:16 -070096
Henrik Boström31638672017-11-23 17:48:32 +010097 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
98 // TODO(hbos): When "no stream" is handled correctly we would expect
Henrik Boström933d8b02017-10-10 10:05:16 -070099 // |add_track_events_[0].streams| to be empty. https://crbug.com/webrtc/7933
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100100 auto& add_track_event = callee->observer()->add_track_events_[0];
Henrik Boström31638672017-11-23 17:48:32 +0100101 ASSERT_EQ(add_track_event.streams.size(), 1u);
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100102 EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
103 EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
Henrik Boström933d8b02017-10-10 10:05:16 -0700104}
105
Henrik Boström31638672017-11-23 17:48:32 +0100106TEST_F(PeerConnectionRtpCallbacksTest, AddTrackWithStreamFiresOnAddTrack) {
Henrik Boström933d8b02017-10-10 10:05:16 -0700107 auto caller = CreatePeerConnection();
108 auto callee = CreatePeerConnection();
109
110 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
111 pc_factory_->CreateAudioTrack("audio_track", nullptr));
112 auto stream = webrtc::MediaStream::Create("audio_stream");
113 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {stream.get()}));
Henrik Boström31638672017-11-23 17:48:32 +0100114 ASSERT_TRUE(
115 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
116 static_cast<webrtc::RTCError*>(nullptr)));
Henrik Boström933d8b02017-10-10 10:05:16 -0700117
Henrik Boström31638672017-11-23 17:48:32 +0100118 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100119 auto& add_track_event = callee->observer()->add_track_events_[0];
Henrik Boström31638672017-11-23 17:48:32 +0100120 ASSERT_EQ(add_track_event.streams.size(), 1u);
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100121 EXPECT_EQ("audio_stream", add_track_event.streams[0]->label());
122 EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
123 EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
Henrik Boström933d8b02017-10-10 10:05:16 -0700124}
125
Henrik Boström31638672017-11-23 17:48:32 +0100126TEST_F(PeerConnectionRtpCallbacksTest,
127 RemoveTrackWithoutStreamFiresOnRemoveTrack) {
Henrik Boström933d8b02017-10-10 10:05:16 -0700128 auto caller = CreatePeerConnection();
129 auto callee = CreatePeerConnection();
130
131 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
132 pc_factory_->CreateAudioTrack("audio_track", nullptr));
133 auto sender = caller->pc()->AddTrack(audio_track.get(), {});
Henrik Boström31638672017-11-23 17:48:32 +0100134 ASSERT_TRUE(
135 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
136 static_cast<webrtc::RTCError*>(nullptr)));
137 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700138 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
Henrik Boström31638672017-11-23 17:48:32 +0100139 ASSERT_TRUE(
140 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
141 static_cast<webrtc::RTCError*>(nullptr)));
Henrik Boström933d8b02017-10-10 10:05:16 -0700142
Henrik Boström31638672017-11-23 17:48:32 +0100143 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700144 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
145 callee->observer()->remove_track_events_);
146}
147
Henrik Boström31638672017-11-23 17:48:32 +0100148TEST_F(PeerConnectionRtpCallbacksTest,
149 RemoveTrackWithStreamFiresOnRemoveTrack) {
Henrik Boström933d8b02017-10-10 10:05:16 -0700150 auto caller = CreatePeerConnection();
151 auto callee = CreatePeerConnection();
152
153 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
154 pc_factory_->CreateAudioTrack("audio_track", nullptr));
155 auto stream = webrtc::MediaStream::Create("audio_stream");
156 auto sender = caller->pc()->AddTrack(audio_track.get(), {stream.get()});
Henrik Boström31638672017-11-23 17:48:32 +0100157 ASSERT_TRUE(
158 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
159 static_cast<webrtc::RTCError*>(nullptr)));
160 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700161 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
Henrik Boström31638672017-11-23 17:48:32 +0100162 ASSERT_TRUE(
163 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
164 static_cast<webrtc::RTCError*>(nullptr)));
Henrik Boström933d8b02017-10-10 10:05:16 -0700165
Henrik Boström31638672017-11-23 17:48:32 +0100166 ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700167 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
168 callee->observer()->remove_track_events_);
169}
170
Henrik Boström31638672017-11-23 17:48:32 +0100171TEST_F(PeerConnectionRtpCallbacksTest,
172 RemoveTrackWithSharedStreamFiresOnRemoveTrack) {
Henrik Boström933d8b02017-10-10 10:05:16 -0700173 auto caller = CreatePeerConnection();
174 auto callee = CreatePeerConnection();
175
176 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track1(
177 pc_factory_->CreateAudioTrack("audio_track1", nullptr));
178 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track2(
179 pc_factory_->CreateAudioTrack("audio_track2", nullptr));
180 auto stream = webrtc::MediaStream::Create("shared_audio_stream");
181 std::vector<webrtc::MediaStreamInterface*> streams{stream.get()};
182 auto sender1 = caller->pc()->AddTrack(audio_track1.get(), streams);
183 auto sender2 = caller->pc()->AddTrack(audio_track2.get(), streams);
Henrik Boström31638672017-11-23 17:48:32 +0100184 ASSERT_TRUE(
185 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
186 static_cast<webrtc::RTCError*>(nullptr)));
Henrik Boström933d8b02017-10-10 10:05:16 -0700187
Henrik Boström31638672017-11-23 17:48:32 +0100188 ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700189
190 // Remove "audio_track1".
191 EXPECT_TRUE(caller->pc()->RemoveTrack(sender1));
Henrik Boström31638672017-11-23 17:48:32 +0100192 ASSERT_TRUE(
193 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
194 static_cast<webrtc::RTCError*>(nullptr)));
195 ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700196 EXPECT_EQ(
197 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>{
198 callee->observer()->add_track_events_[0].receiver},
199 callee->observer()->remove_track_events_);
200
201 // Remove "audio_track2".
202 EXPECT_TRUE(caller->pc()->RemoveTrack(sender2));
Henrik Boström31638672017-11-23 17:48:32 +0100203 ASSERT_TRUE(
204 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
205 static_cast<webrtc::RTCError*>(nullptr)));
206 ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
Henrik Boström933d8b02017-10-10 10:05:16 -0700207 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
208 callee->observer()->remove_track_events_);
209}
210
Henrik Boström31638672017-11-23 17:48:32 +0100211// These tests examine the state of the peer connection as a result of
212// performing SetRemoteDescription().
213class PeerConnectionRtpObserverTest : public PeerConnectionRtpTest {};
214
215TEST_F(PeerConnectionRtpObserverTest, AddSenderWithoutStreamAddsReceiver) {
216 auto caller = CreatePeerConnection();
217 auto callee = CreatePeerConnection();
218
219 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
220 pc_factory_->CreateAudioTrack("audio_track", nullptr));
221 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {}));
222 ASSERT_TRUE(
223 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
224 static_cast<webrtc::RTCError*>(nullptr)));
225
226 EXPECT_EQ(callee->pc()->GetReceivers().size(), 1u);
227 auto receiver_added = callee->pc()->GetReceivers()[0];
228 EXPECT_EQ("audio_track", receiver_added->track()->id());
229 // TODO(hbos): When "no stream" is handled correctly we would expect
230 // |receiver_added->streams()| to be empty. https://crbug.com/webrtc/7933
231 EXPECT_EQ(receiver_added->streams().size(), 1u);
232 EXPECT_TRUE(receiver_added->streams()[0]->FindAudioTrack("audio_track"));
233}
234
235TEST_F(PeerConnectionRtpObserverTest, AddSenderWithStreamAddsReceiver) {
236 auto caller = CreatePeerConnection();
237 auto callee = CreatePeerConnection();
238
239 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
240 pc_factory_->CreateAudioTrack("audio_track", nullptr));
241 auto stream = webrtc::MediaStream::Create("audio_stream");
242 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {stream}));
243 ASSERT_TRUE(
244 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
245 static_cast<webrtc::RTCError*>(nullptr)));
246
247 EXPECT_EQ(callee->pc()->GetReceivers().size(), 1u);
248 auto receiver_added = callee->pc()->GetReceivers()[0];
249 EXPECT_EQ("audio_track", receiver_added->track()->id());
250 EXPECT_EQ(receiver_added->streams().size(), 1u);
251 EXPECT_EQ("audio_stream", receiver_added->streams()[0]->label());
252 EXPECT_TRUE(receiver_added->streams()[0]->FindAudioTrack("audio_track"));
253}
254
255TEST_F(PeerConnectionRtpObserverTest,
256 RemoveSenderWithoutStreamRemovesReceiver) {
257 auto caller = CreatePeerConnection();
258 auto callee = CreatePeerConnection();
259
260 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
261 pc_factory_->CreateAudioTrack("audio_track", nullptr));
262 auto sender = caller->pc()->AddTrack(audio_track.get(), {});
263 ASSERT_TRUE(sender);
264 ASSERT_TRUE(
265 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
266 static_cast<webrtc::RTCError*>(nullptr)));
267 ASSERT_EQ(callee->pc()->GetReceivers().size(), 1u);
268 auto receiver = callee->pc()->GetReceivers()[0];
269 ASSERT_TRUE(caller->pc()->RemoveTrack(sender));
270 ASSERT_TRUE(
271 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
272 static_cast<webrtc::RTCError*>(nullptr)));
273
274 // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
275 // Instead, the transceiver owning the receiver will become inactive.
276 EXPECT_EQ(callee->pc()->GetReceivers().size(), 0u);
277}
278
279TEST_F(PeerConnectionRtpObserverTest, RemoveSenderWithStreamRemovesReceiver) {
280 auto caller = CreatePeerConnection();
281 auto callee = CreatePeerConnection();
282
283 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
284 pc_factory_->CreateAudioTrack("audio_track", nullptr));
285 auto stream = webrtc::MediaStream::Create("audio_stream");
286 auto sender = caller->pc()->AddTrack(audio_track.get(), {stream});
287 ASSERT_TRUE(sender);
288 ASSERT_TRUE(
289 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
290 static_cast<webrtc::RTCError*>(nullptr)));
291 ASSERT_EQ(callee->pc()->GetReceivers().size(), 1u);
292 auto receiver = callee->pc()->GetReceivers()[0];
293 ASSERT_TRUE(caller->pc()->RemoveTrack(sender));
294 ASSERT_TRUE(
295 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
296 static_cast<webrtc::RTCError*>(nullptr)));
297
298 // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
299 // Instead, the transceiver owning the receiver will become inactive.
300 EXPECT_EQ(callee->pc()->GetReceivers().size(), 0u);
301}
302
303TEST_F(PeerConnectionRtpObserverTest,
304 RemoveSenderWithSharedStreamRemovesReceiver) {
305 auto caller = CreatePeerConnection();
306 auto callee = CreatePeerConnection();
307
308 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track1(
309 pc_factory_->CreateAudioTrack("audio_track1", nullptr));
310 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track2(
311 pc_factory_->CreateAudioTrack("audio_track2", nullptr));
312 auto stream = webrtc::MediaStream::Create("shared_audio_stream");
313 std::vector<webrtc::MediaStreamInterface*> streams{stream.get()};
314 auto sender1 = caller->pc()->AddTrack(audio_track1.get(), streams);
315 auto sender2 = caller->pc()->AddTrack(audio_track2.get(), streams);
316 ASSERT_TRUE(
317 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
318 static_cast<webrtc::RTCError*>(nullptr)));
319
320 ASSERT_EQ(callee->pc()->GetReceivers().size(), 2u);
321 rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver1;
322 rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver2;
323 if (callee->pc()->GetReceivers()[0]->track()->id() == "audio_track1") {
324 receiver1 = callee->pc()->GetReceivers()[0];
325 receiver2 = callee->pc()->GetReceivers()[1];
326 } else {
327 receiver1 = callee->pc()->GetReceivers()[1];
328 receiver2 = callee->pc()->GetReceivers()[0];
329 }
330 EXPECT_EQ("audio_track1", receiver1->track()->id());
331 EXPECT_EQ("audio_track2", receiver2->track()->id());
332
333 // Remove "audio_track1".
334 EXPECT_TRUE(caller->pc()->RemoveTrack(sender1));
335 ASSERT_TRUE(
336 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
337 static_cast<webrtc::RTCError*>(nullptr)));
338 // Only |receiver2| should remain.
339 // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
340 // Instead, the transceiver owning the receiver will become inactive.
341 EXPECT_EQ(
342 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>{receiver2},
343 callee->pc()->GetReceivers());
344
345 // Remove "audio_track2".
346 EXPECT_TRUE(caller->pc()->RemoveTrack(sender2));
347 ASSERT_TRUE(
348 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(),
349 static_cast<webrtc::RTCError*>(nullptr)));
350 // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
351 // Instead, the transceiver owning the receiver will become inactive.
352 EXPECT_EQ(callee->pc()->GetReceivers().size(), 0u);
353}
354
355// Invokes SetRemoteDescription() twice in a row without synchronizing the two
356// calls and examine the state of the peer connection inside the callbacks to
357// ensure that the second call does not occur prematurely, contaminating the
358// state of the peer connection of the first callback.
359TEST_F(PeerConnectionRtpObserverTest,
360 StatesCorrelateWithSetRemoteDescriptionCall) {
361 auto caller = CreatePeerConnection();
362 auto callee = CreatePeerConnection();
363
364 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
365 pc_factory_->CreateAudioTrack("audio_track", nullptr));
366 // Create SDP for adding a track and for removing it. This will be used in the
367 // first and second SetRemoteDescription() calls.
368 auto sender = caller->pc()->AddTrack(audio_track.get(), {});
369 auto srd1_sdp = caller->CreateOfferAndSetAsLocal();
370 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
371 auto srd2_sdp = caller->CreateOfferAndSetAsLocal();
372
373 // In the first SetRemoteDescription() callback, check that we have a
374 // receiver for the track.
375 auto pc = callee->pc();
376 bool srd1_callback_called = false;
377 auto srd1_callback = [&srd1_callback_called, &pc]() {
378 EXPECT_EQ(pc->GetReceivers().size(), 1u);
379 srd1_callback_called = true;
380 };
381
382 // In the second SetRemoteDescription() callback, check that the receiver has
383 // been removed.
384 // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
385 // Instead, the transceiver owning the receiver will become inactive.
386 // https://crbug.com/webrtc/7600
387 bool srd2_callback_called = false;
388 auto srd2_callback = [&srd2_callback_called, &pc]() {
389 EXPECT_TRUE(pc->GetReceivers().empty());
390 srd2_callback_called = true;
391 };
392
393 // Invoke SetRemoteDescription() twice in a row without synchronizing the two
394 // calls. The callbacks verify that the two calls are synchronized, as in, the
395 // effects of the second SetRemoteDescription() call must not have happened by
396 // the time the first callback is invoked. If it has then the receiver that is
397 // added as a result of the first SetRemoteDescription() call will already
398 // have been removed as a result of the second SetRemoteDescription() call
399 // when the first callback is invoked.
400 callee->pc()->SetRemoteDescription(
401 std::move(srd1_sdp),
402 new OnSuccessObserver<decltype(srd1_callback)>(srd1_callback));
403 callee->pc()->SetRemoteDescription(
404 std::move(srd2_sdp),
405 new OnSuccessObserver<decltype(srd2_callback)>(srd2_callback));
406 EXPECT_TRUE_WAIT(srd1_callback_called, kDefaultTimeout);
407 EXPECT_TRUE_WAIT(srd2_callback_called, kDefaultTimeout);
408}
409
410// Tests for the legacy SetRemoteDescription() function signature.
411class PeerConnectionRtpLegacyObserverTest : public PeerConnectionRtpTest {};
412
413// Sanity test making sure the callback is invoked.
414TEST_F(PeerConnectionRtpLegacyObserverTest, OnSuccess) {
415 auto caller = CreatePeerConnection();
416 auto callee = CreatePeerConnection();
417
418 std::string error;
419 ASSERT_TRUE(
420 callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(), &error));
421}
422
423// Verifies legacy behavior: The observer is not called if if the peer
424// connection is destroyed because the asynchronous callback is executed in the
425// peer connection's message handler.
426TEST_F(PeerConnectionRtpLegacyObserverTest,
427 ObserverNotCalledIfPeerConnectionDereferenced) {
428 auto caller = CreatePeerConnection();
429 auto callee = CreatePeerConnection();
430
431 rtc::scoped_refptr<webrtc::MockSetSessionDescriptionObserver> observer =
432 new rtc::RefCountedObject<webrtc::MockSetSessionDescriptionObserver>();
433
434 auto offer = caller->CreateOfferAndSetAsLocal();
435 callee->pc()->SetRemoteDescription(observer, offer.release());
436 callee = nullptr;
437 rtc::Thread::Current()->ProcessMessages(0);
438 EXPECT_FALSE(observer->called());
439}
440
Henrik Boström933d8b02017-10-10 10:05:16 -0700441} // namespace