xref: /aosp_15_r20/external/webrtc/pc/peer_connection_rtp_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
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 <stddef.h>
12 
13 #include <cstdint>
14 #include <memory>
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
19 #include "absl/types/optional.h"
20 #include "api/audio/audio_mixer.h"
21 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
22 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
23 #include "api/create_peerconnection_factory.h"
24 #include "api/jsep.h"
25 #include "api/media_stream_interface.h"
26 #include "api/media_types.h"
27 #include "api/peer_connection_interface.h"
28 #include "api/rtc_error.h"
29 #include "api/rtp_parameters.h"
30 #include "api/rtp_receiver_interface.h"
31 #include "api/rtp_sender_interface.h"
32 #include "api/rtp_transceiver_direction.h"
33 #include "api/rtp_transceiver_interface.h"
34 #include "api/scoped_refptr.h"
35 #include "api/set_remote_description_observer_interface.h"
36 #include "api/uma_metrics.h"
37 #include "api/video_codecs/builtin_video_decoder_factory.h"
38 #include "api/video_codecs/builtin_video_encoder_factory.h"
39 #include "media/base/stream_params.h"
40 #include "modules/audio_device/include/audio_device.h"
41 #include "modules/audio_processing/include/audio_processing.h"
42 #include "p2p/base/port_allocator.h"
43 #include "pc/media_session.h"
44 #include "pc/peer_connection_wrapper.h"
45 #include "pc/sdp_utils.h"
46 #include "pc/session_description.h"
47 #include "pc/test/fake_audio_capture_module.h"
48 #include "pc/test/mock_peer_connection_observers.h"
49 #include "rtc_base/checks.h"
50 #include "rtc_base/gunit.h"
51 #include "rtc_base/rtc_certificate_generator.h"
52 #include "rtc_base/thread.h"
53 #include "system_wrappers/include/metrics.h"
54 #include "test/gmock.h"
55 #include "test/gtest.h"
56 
57 // This file contains tests for RTP Media API-related behavior of
58 // `webrtc::PeerConnection`, see https://w3c.github.io/webrtc-pc/#rtp-media-api.
59 
60 namespace webrtc {
61 
62 using RTCConfiguration = PeerConnectionInterface::RTCConfiguration;
63 using ::testing::ElementsAre;
64 using ::testing::Pair;
65 using ::testing::UnorderedElementsAre;
66 using ::testing::Values;
67 
68 const uint32_t kDefaultTimeout = 10000u;
69 
70 template <typename MethodFunctor>
71 class OnSuccessObserver : public webrtc::SetRemoteDescriptionObserverInterface {
72  public:
OnSuccessObserver(MethodFunctor on_success)73   explicit OnSuccessObserver(MethodFunctor on_success)
74       : on_success_(std::move(on_success)) {}
75 
76   // webrtc::SetRemoteDescriptionObserverInterface implementation.
OnSetRemoteDescriptionComplete(webrtc::RTCError error)77   void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override {
78     RTC_CHECK(error.ok());
79     on_success_();
80   }
81 
82  private:
83   MethodFunctor on_success_;
84 };
85 
86 class PeerConnectionRtpBaseTest : public ::testing::Test {
87  public:
PeerConnectionRtpBaseTest(SdpSemantics sdp_semantics)88   explicit PeerConnectionRtpBaseTest(SdpSemantics sdp_semantics)
89       : sdp_semantics_(sdp_semantics),
90         pc_factory_(
91             CreatePeerConnectionFactory(rtc::Thread::Current(),
92                                         rtc::Thread::Current(),
93                                         rtc::Thread::Current(),
94                                         FakeAudioCaptureModule::Create(),
95                                         CreateBuiltinAudioEncoderFactory(),
96                                         CreateBuiltinAudioDecoderFactory(),
97                                         CreateBuiltinVideoEncoderFactory(),
98                                         CreateBuiltinVideoDecoderFactory(),
99                                         nullptr /* audio_mixer */,
100                                         nullptr /* audio_processing */)) {
101     webrtc::metrics::Reset();
102   }
103 
CreatePeerConnection()104   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnection() {
105     return CreatePeerConnection(RTCConfiguration());
106   }
107 
CreatePeerConnectionWithPlanB()108   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnectionWithPlanB() {
109     RTCConfiguration config;
110     config.sdp_semantics = SdpSemantics::kPlanB_DEPRECATED;
111     return CreatePeerConnectionInternal(config);
112   }
113 
CreatePeerConnectionWithUnifiedPlan()114   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnectionWithUnifiedPlan() {
115     RTCConfiguration config;
116     config.sdp_semantics = SdpSemantics::kUnifiedPlan;
117     return CreatePeerConnectionInternal(config);
118   }
119 
CreatePeerConnection(const RTCConfiguration & config)120   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnection(
121       const RTCConfiguration& config) {
122     RTCConfiguration modified_config = config;
123     modified_config.sdp_semantics = sdp_semantics_;
124     return CreatePeerConnectionInternal(modified_config);
125   }
126 
127  protected:
128   const SdpSemantics sdp_semantics_;
129   rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory_;
130 
131  private:
132   // Private so that tests don't accidentally bypass the SdpSemantics
133   // adjustment.
CreatePeerConnectionInternal(const RTCConfiguration & config)134   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnectionInternal(
135       const RTCConfiguration& config) {
136     auto observer = std::make_unique<MockPeerConnectionObserver>();
137     auto result = pc_factory_->CreatePeerConnectionOrError(
138         config, PeerConnectionDependencies(observer.get()));
139     EXPECT_TRUE(result.ok());
140     observer->SetPeerConnectionInterface(result.value().get());
141     return std::make_unique<PeerConnectionWrapper>(
142         pc_factory_, result.MoveValue(), std::move(observer));
143   }
144 
145   rtc::AutoThread main_thread_;
146 };
147 
148 class PeerConnectionRtpTest
149     : public PeerConnectionRtpBaseTest,
150       public ::testing::WithParamInterface<SdpSemantics> {
151  protected:
PeerConnectionRtpTest()152   PeerConnectionRtpTest() : PeerConnectionRtpBaseTest(GetParam()) {}
153 };
154 
155 class PeerConnectionRtpTestPlanB : public PeerConnectionRtpBaseTest {
156  protected:
PeerConnectionRtpTestPlanB()157   PeerConnectionRtpTestPlanB()
158       : PeerConnectionRtpBaseTest(SdpSemantics::kPlanB_DEPRECATED) {}
159 };
160 
161 class PeerConnectionRtpTestUnifiedPlan : public PeerConnectionRtpBaseTest {
162  protected:
PeerConnectionRtpTestUnifiedPlan()163   PeerConnectionRtpTestUnifiedPlan()
164       : PeerConnectionRtpBaseTest(SdpSemantics::kUnifiedPlan) {}
165 
166   // Helper to emulate an SFU that rejects an offered media section
167   // in answer.
ExchangeOfferAnswerWhereRemoteStopsTransceiver(PeerConnectionWrapper * caller,PeerConnectionWrapper * callee,size_t mid_to_stop)168   bool ExchangeOfferAnswerWhereRemoteStopsTransceiver(
169       PeerConnectionWrapper* caller,
170       PeerConnectionWrapper* callee,
171       size_t mid_to_stop) {
172     auto offer = caller->CreateOffer();
173     caller->SetLocalDescription(CloneSessionDescription(offer.get()));
174     callee->SetRemoteDescription(std::move(offer));
175     EXPECT_LT(mid_to_stop, callee->pc()->GetTransceivers().size());
176     // Must use StopInternal in order to do instant reject.
177     callee->pc()->GetTransceivers()[mid_to_stop]->StopInternal();
178     auto answer = callee->CreateAnswer();
179     EXPECT_TRUE(answer);
180     bool set_local_answer =
181         callee->SetLocalDescription(CloneSessionDescription(answer.get()));
182     EXPECT_TRUE(set_local_answer);
183     bool set_remote_answer = caller->SetRemoteDescription(std::move(answer));
184     EXPECT_TRUE(set_remote_answer);
185     return set_remote_answer;
186   }
187 };
188 
189 // These tests cover `webrtc::PeerConnectionObserver` callbacks firing upon
190 // setting the remote description.
191 
TEST_P(PeerConnectionRtpTest,AddTrackWithoutStreamFiresOnAddTrack)192 TEST_P(PeerConnectionRtpTest, AddTrackWithoutStreamFiresOnAddTrack) {
193   auto caller = CreatePeerConnection();
194   auto callee = CreatePeerConnection();
195 
196   ASSERT_TRUE(caller->AddAudioTrack("audio_track"));
197   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
198 
199   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
200   const auto& add_track_event = callee->observer()->add_track_events_[0];
201   EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
202 
203   if (sdp_semantics_ == SdpSemantics::kPlanB_DEPRECATED) {
204     // Since we are not supporting the no stream case with Plan B, there should
205     // be a generated stream, even though we didn't set one with AddTrack.
206     ASSERT_EQ(1u, add_track_event.streams.size());
207     EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
208   } else {
209     EXPECT_EQ(0u, add_track_event.streams.size());
210   }
211 }
212 
TEST_P(PeerConnectionRtpTest,AddTrackWithStreamFiresOnAddTrack)213 TEST_P(PeerConnectionRtpTest, AddTrackWithStreamFiresOnAddTrack) {
214   auto caller = CreatePeerConnection();
215   auto callee = CreatePeerConnection();
216 
217   ASSERT_TRUE(caller->AddAudioTrack("audio_track", {"audio_stream"}));
218   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
219 
220   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
221   auto& add_track_event = callee->observer()->add_track_events_[0];
222   ASSERT_EQ(add_track_event.streams.size(), 1u);
223   EXPECT_EQ("audio_stream", add_track_event.streams[0]->id());
224   EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
225   EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
226 }
227 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithoutStreamFiresOnRemoveTrack)228 TEST_P(PeerConnectionRtpTest, RemoveTrackWithoutStreamFiresOnRemoveTrack) {
229   auto caller = CreatePeerConnection();
230   auto callee = CreatePeerConnection();
231 
232   auto sender = caller->AddAudioTrack("audio_track", {});
233   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
234   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
235   ASSERT_TRUE(
236       caller->SetRemoteDescription(callee->CreateAnswerAndSetAsLocal()));
237 
238   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
239   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
240 
241   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
242   EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
243             callee->observer()->remove_track_events_);
244 }
245 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithStreamFiresOnRemoveTrack)246 TEST_P(PeerConnectionRtpTest, RemoveTrackWithStreamFiresOnRemoveTrack) {
247   auto caller = CreatePeerConnection();
248   auto callee = CreatePeerConnection();
249 
250   auto sender = caller->AddAudioTrack("audio_track", {"audio_stream"});
251   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
252   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
253   ASSERT_TRUE(
254       caller->SetRemoteDescription(callee->CreateAnswerAndSetAsLocal()));
255 
256   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
257   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
258 
259   ASSERT_EQ(callee->observer()->add_track_events_.size(), 1u);
260   EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
261             callee->observer()->remove_track_events_);
262   EXPECT_EQ(0u, callee->observer()->remote_streams()->count());
263 }
264 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithSharedStreamFiresOnRemoveTrack)265 TEST_P(PeerConnectionRtpTest, RemoveTrackWithSharedStreamFiresOnRemoveTrack) {
266   auto caller = CreatePeerConnection();
267   auto callee = CreatePeerConnection();
268 
269   const char kSharedStreamId[] = "shared_audio_stream";
270   auto sender1 = caller->AddAudioTrack("audio_track1", {kSharedStreamId});
271   auto sender2 = caller->AddAudioTrack("audio_track2", {kSharedStreamId});
272   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
273   ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
274   ASSERT_TRUE(
275       caller->SetRemoteDescription(callee->CreateAnswerAndSetAsLocal()));
276 
277   // Remove "audio_track1".
278   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender1).ok());
279   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
280   ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
281   EXPECT_EQ(
282       std::vector<rtc::scoped_refptr<RtpReceiverInterface>>{
283           callee->observer()->add_track_events_[0].receiver},
284       callee->observer()->remove_track_events_);
285   ASSERT_EQ(1u, callee->observer()->remote_streams()->count());
286   ASSERT_TRUE(
287       caller->SetRemoteDescription(callee->CreateAnswerAndSetAsLocal()));
288 
289   // Remove "audio_track2".
290   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender2).ok());
291   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
292   ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
293   EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
294             callee->observer()->remove_track_events_);
295   EXPECT_EQ(0u, callee->observer()->remote_streams()->count());
296 }
297 
298 // Tests the edge case that if a stream ID changes for a given track that both
299 // OnRemoveTrack and OnAddTrack is fired.
TEST_F(PeerConnectionRtpTestPlanB,RemoteStreamIdChangesFiresOnRemoveAndOnAddTrack)300 TEST_F(PeerConnectionRtpTestPlanB,
301        RemoteStreamIdChangesFiresOnRemoveAndOnAddTrack) {
302   auto caller = CreatePeerConnection();
303   auto callee = CreatePeerConnection();
304 
305   const char kStreamId1[] = "stream1";
306   const char kStreamId2[] = "stream2";
307   caller->AddAudioTrack("audio_track1", {kStreamId1});
308   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
309   EXPECT_EQ(callee->observer()->add_track_events_.size(), 1u);
310 
311   // Change the stream ID of the sender in the session description.
312   auto offer = caller->CreateOfferAndSetAsLocal();
313   auto* audio_desc =
314       cricket::GetFirstAudioContentDescription(offer->description());
315   ASSERT_EQ(audio_desc->mutable_streams().size(), 1u);
316   audio_desc->mutable_streams()[0].set_stream_ids({kStreamId2});
317   ASSERT_TRUE(callee->SetRemoteDescription(std::move(offer)));
318 
319   ASSERT_EQ(callee->observer()->add_track_events_.size(), 2u);
320   EXPECT_EQ(callee->observer()->add_track_events_[1].streams[0]->id(),
321             kStreamId2);
322   ASSERT_EQ(callee->observer()->remove_track_events_.size(), 1u);
323   EXPECT_EQ(callee->observer()->remove_track_events_[0]->streams()[0]->id(),
324             kStreamId1);
325 }
326 
327 // Tests that setting a remote description with sending transceivers will fire
328 // the OnTrack callback for each transceiver and setting a remote description
329 // with receive only transceivers will not call OnTrack. One transceiver is
330 // created without any stream_ids, while the other is created with multiple
331 // stream_ids.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverCallsOnTrack)332 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTransceiverCallsOnTrack) {
333   const std::string kStreamId1 = "video_stream1";
334   const std::string kStreamId2 = "video_stream2";
335   auto caller = CreatePeerConnection();
336   auto callee = CreatePeerConnection();
337 
338   auto audio_transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
339   RtpTransceiverInit video_transceiver_init;
340   video_transceiver_init.stream_ids = {kStreamId1, kStreamId2};
341   auto video_transceiver =
342       caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, video_transceiver_init);
343 
344   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
345 
346   ASSERT_EQ(0u, caller->observer()->on_track_transceivers_.size());
347   ASSERT_EQ(2u, callee->observer()->on_track_transceivers_.size());
348   EXPECT_EQ(audio_transceiver->mid(),
349             callee->pc()->GetTransceivers()[0]->mid());
350   EXPECT_EQ(video_transceiver->mid(),
351             callee->pc()->GetTransceivers()[1]->mid());
352   std::vector<rtc::scoped_refptr<MediaStreamInterface>> audio_streams =
353       callee->pc()->GetTransceivers()[0]->receiver()->streams();
354   std::vector<rtc::scoped_refptr<MediaStreamInterface>> video_streams =
355       callee->pc()->GetTransceivers()[1]->receiver()->streams();
356   ASSERT_EQ(0u, audio_streams.size());
357   ASSERT_EQ(2u, video_streams.size());
358   EXPECT_EQ(kStreamId1, video_streams[0]->id());
359   EXPECT_EQ(kStreamId2, video_streams[1]->id());
360 }
361 
362 // Test that doing additional offer/answer exchanges with no changes to tracks
363 // will cause no additional OnTrack calls after the tracks have been negotiated.
TEST_F(PeerConnectionRtpTestUnifiedPlan,ReofferDoesNotCallOnTrack)364 TEST_F(PeerConnectionRtpTestUnifiedPlan, ReofferDoesNotCallOnTrack) {
365   auto caller = CreatePeerConnection();
366   auto callee = CreatePeerConnection();
367 
368   caller->AddAudioTrack("audio");
369   callee->AddAudioTrack("audio");
370 
371   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
372   EXPECT_EQ(1u, caller->observer()->on_track_transceivers_.size());
373   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
374 
375   // If caller reoffers with no changes expect no additional OnTrack calls.
376   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
377   EXPECT_EQ(1u, caller->observer()->on_track_transceivers_.size());
378   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
379 
380   // Also if callee reoffers with no changes expect no additional OnTrack calls.
381   ASSERT_TRUE(callee->ExchangeOfferAnswerWith(caller.get()));
382   EXPECT_EQ(1u, caller->observer()->on_track_transceivers_.size());
383   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
384 }
385 
386 // Test that OnTrack is called when the transceiver direction changes to send
387 // the track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,SetDirectionCallsOnTrack)388 TEST_F(PeerConnectionRtpTestUnifiedPlan, SetDirectionCallsOnTrack) {
389   auto caller = CreatePeerConnection();
390   auto callee = CreatePeerConnection();
391 
392   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
393   EXPECT_TRUE(
394       transceiver->SetDirectionWithError(RtpTransceiverDirection::kInactive)
395           .ok());
396   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
397   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
398   EXPECT_EQ(0u, callee->observer()->on_track_transceivers_.size());
399 
400   EXPECT_TRUE(
401       transceiver->SetDirectionWithError(RtpTransceiverDirection::kSendOnly)
402           .ok());
403   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
404   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
405   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
406 
407   // If the direction changes but it is still receiving on the remote side, then
408   // OnTrack should not be fired again.
409   EXPECT_TRUE(
410       transceiver->SetDirectionWithError(RtpTransceiverDirection::kSendRecv)
411           .ok());
412   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
413   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
414   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
415 }
416 
417 // Test that OnTrack is called twice when a sendrecv call is started, the callee
418 // changes the direction to inactive, then changes it back to sendrecv.
TEST_F(PeerConnectionRtpTestUnifiedPlan,SetDirectionHoldCallsOnTrackTwice)419 TEST_F(PeerConnectionRtpTestUnifiedPlan, SetDirectionHoldCallsOnTrackTwice) {
420   auto caller = CreatePeerConnection();
421   auto callee = CreatePeerConnection();
422 
423   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
424 
425   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
426   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
427   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
428 
429   // Put the call on hold by no longer receiving the track.
430   EXPECT_TRUE(callee->pc()
431                   ->GetTransceivers()[0]
432                   ->SetDirectionWithError(RtpTransceiverDirection::kInactive)
433                   .ok());
434 
435   ASSERT_TRUE(callee->ExchangeOfferAnswerWith(caller.get()));
436   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
437   EXPECT_EQ(1u, callee->observer()->on_track_transceivers_.size());
438 
439   // Resume the call by changing the direction to recvonly. This should call
440   // OnTrack again on the callee side.
441   EXPECT_TRUE(callee->pc()
442                   ->GetTransceivers()[0]
443                   ->SetDirectionWithError(RtpTransceiverDirection::kRecvOnly)
444                   .ok());
445 
446   ASSERT_TRUE(callee->ExchangeOfferAnswerWith(caller.get()));
447   EXPECT_EQ(0u, caller->observer()->on_track_transceivers_.size());
448   EXPECT_EQ(2u, callee->observer()->on_track_transceivers_.size());
449 }
450 
451 // Test that setting a remote offer twice with no answer in the middle results
452 // in OnAddTrack being fired only once.
TEST_F(PeerConnectionRtpTestUnifiedPlan,ApplyTwoRemoteOffersWithNoAnswerResultsInOneAddTrackEvent)453 TEST_F(PeerConnectionRtpTestUnifiedPlan,
454        ApplyTwoRemoteOffersWithNoAnswerResultsInOneAddTrackEvent) {
455   auto caller = CreatePeerConnection();
456   auto callee = CreatePeerConnection();
457 
458   caller->AddAudioTrack("audio_track", {});
459 
460   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
461   ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
462 
463   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
464   EXPECT_EQ(1u, callee->observer()->add_track_events_.size());
465 }
466 
467 // Test that setting a remote offer twice with no answer in the middle and the
468 // track being removed between the two offers results in OnAddTrack being called
469 // once the first time and OnRemoveTrack being called once the second time.
TEST_F(PeerConnectionRtpTestUnifiedPlan,ApplyRemoteOfferAddThenRemoteOfferRemoveResultsInOneRemoveTrackEvent)470 TEST_F(PeerConnectionRtpTestUnifiedPlan,
471        ApplyRemoteOfferAddThenRemoteOfferRemoveResultsInOneRemoveTrackEvent) {
472   auto caller = CreatePeerConnection();
473   auto callee = CreatePeerConnection();
474 
475   auto sender = caller->AddAudioTrack("audio_track", {});
476 
477   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
478   ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
479   EXPECT_EQ(0u, callee->observer()->remove_track_events_.size());
480 
481   caller->pc()->RemoveTrackOrError(sender);
482 
483   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
484   EXPECT_EQ(1u, callee->observer()->add_track_events_.size());
485   EXPECT_EQ(1u, callee->observer()->remove_track_events_.size());
486 }
487 
488 // Test that changing the direction from receiving to not receiving between
489 // setting the remote offer and creating / setting the local answer results in
490 // a remove track event when SetLocalDescription is called.
TEST_F(PeerConnectionRtpTestUnifiedPlan,ChangeDirectionInAnswerResultsInRemoveTrackEvent)491 TEST_F(PeerConnectionRtpTestUnifiedPlan,
492        ChangeDirectionInAnswerResultsInRemoveTrackEvent) {
493   auto caller = CreatePeerConnection();
494   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
495   auto callee = CreatePeerConnection();
496   callee->AddAudioTrack("audio_track", {});
497 
498   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOffer()));
499   EXPECT_EQ(1u, callee->observer()->add_track_events_.size());
500   EXPECT_EQ(0u, callee->observer()->remove_track_events_.size());
501 
502   auto callee_transceiver = callee->pc()->GetTransceivers()[0];
503   EXPECT_TRUE(callee_transceiver
504                   ->SetDirectionWithError(RtpTransceiverDirection::kSendOnly)
505                   .ok());
506 
507   ASSERT_TRUE(callee->SetLocalDescription(callee->CreateAnswer()));
508   EXPECT_EQ(1u, callee->observer()->add_track_events_.size());
509   EXPECT_EQ(1u, callee->observer()->remove_track_events_.size());
510 }
511 
TEST_F(PeerConnectionRtpTestUnifiedPlan,ChangeMsidWhileReceiving)512 TEST_F(PeerConnectionRtpTestUnifiedPlan, ChangeMsidWhileReceiving) {
513   auto caller = CreatePeerConnection();
514   caller->AddAudioTrack("audio_track", {"stream1"});
515   auto callee = CreatePeerConnection();
516   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
517 
518   ASSERT_EQ(1u, callee->observer()->on_track_transceivers_.size());
519   auto transceiver = callee->observer()->on_track_transceivers_[0];
520   ASSERT_EQ(1u, transceiver->receiver()->streams().size());
521   EXPECT_EQ("stream1", transceiver->receiver()->streams()[0]->id());
522 
523   ASSERT_TRUE(callee->CreateAnswerAndSetAsLocal());
524 
525   // Change the stream ID in the offer.
526   caller->pc()->GetSenders()[0]->SetStreams({"stream2"});
527   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
528   ASSERT_EQ(1u, transceiver->receiver()->streams().size());
529   EXPECT_EQ("stream2", transceiver->receiver()->streams()[0]->id());
530 }
531 
532 // These tests examine the state of the peer connection as a result of
533 // performing SetRemoteDescription().
534 
TEST_P(PeerConnectionRtpTest,AddTrackWithoutStreamAddsReceiver)535 TEST_P(PeerConnectionRtpTest, AddTrackWithoutStreamAddsReceiver) {
536   auto caller = CreatePeerConnection();
537   auto callee = CreatePeerConnection();
538 
539   ASSERT_TRUE(caller->AddAudioTrack("audio_track", {}));
540   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
541 
542   EXPECT_EQ(callee->pc()->GetReceivers().size(), 1u);
543   auto receiver_added = callee->pc()->GetReceivers()[0];
544   EXPECT_EQ("audio_track", receiver_added->track()->id());
545 
546   if (sdp_semantics_ == SdpSemantics::kPlanB_DEPRECATED) {
547     // Since we are not supporting the no stream case with Plan B, there should
548     // be a generated stream, even though we didn't set one with AddTrack.
549     ASSERT_EQ(1u, receiver_added->streams().size());
550     EXPECT_TRUE(receiver_added->streams()[0]->FindAudioTrack("audio_track"));
551   } else {
552     EXPECT_EQ(0u, receiver_added->streams().size());
553   }
554 }
555 
TEST_P(PeerConnectionRtpTest,AddTrackWithStreamAddsReceiver)556 TEST_P(PeerConnectionRtpTest, AddTrackWithStreamAddsReceiver) {
557   auto caller = CreatePeerConnection();
558   auto callee = CreatePeerConnection();
559 
560   ASSERT_TRUE(caller->AddAudioTrack("audio_track", {"audio_stream"}));
561   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
562 
563   EXPECT_EQ(callee->pc()->GetReceivers().size(), 1u);
564   auto receiver_added = callee->pc()->GetReceivers()[0];
565   EXPECT_EQ("audio_track", receiver_added->track()->id());
566   EXPECT_EQ(receiver_added->streams().size(), 1u);
567   EXPECT_EQ("audio_stream", receiver_added->streams()[0]->id());
568   EXPECT_TRUE(receiver_added->streams()[0]->FindAudioTrack("audio_track"));
569 }
570 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithoutStreamRemovesReceiver)571 TEST_P(PeerConnectionRtpTest, RemoveTrackWithoutStreamRemovesReceiver) {
572   auto caller = CreatePeerConnection();
573   auto callee = CreatePeerConnection();
574 
575   auto sender = caller->AddAudioTrack("audio_track", {});
576   ASSERT_TRUE(sender);
577   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
578 
579   ASSERT_EQ(callee->pc()->GetReceivers().size(), 1u);
580   auto receiver = callee->pc()->GetReceivers()[0];
581   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
582   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
583 
584   if (sdp_semantics_ == SdpSemantics::kUnifiedPlan) {
585     // With Unified Plan the receiver stays but the transceiver transitions to
586     // inactive.
587     ASSERT_EQ(1u, callee->pc()->GetReceivers().size());
588     EXPECT_EQ(RtpTransceiverDirection::kInactive,
589               callee->pc()->GetTransceivers()[0]->current_direction());
590   } else {
591     // With Plan B the receiver is removed.
592     ASSERT_EQ(0u, callee->pc()->GetReceivers().size());
593   }
594 }
595 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithStreamRemovesReceiver)596 TEST_P(PeerConnectionRtpTest, RemoveTrackWithStreamRemovesReceiver) {
597   auto caller = CreatePeerConnection();
598   auto callee = CreatePeerConnection();
599 
600   auto sender = caller->AddAudioTrack("audio_track", {"audio_stream"});
601   ASSERT_TRUE(sender);
602   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
603   ASSERT_EQ(callee->pc()->GetReceivers().size(), 1u);
604   auto receiver = callee->pc()->GetReceivers()[0];
605   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
606   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
607 
608   if (sdp_semantics_ == SdpSemantics::kUnifiedPlan) {
609     // With Unified Plan the receiver stays but the transceiver transitions to
610     // inactive.
611     EXPECT_EQ(1u, callee->pc()->GetReceivers().size());
612     EXPECT_EQ(RtpTransceiverDirection::kInactive,
613               callee->pc()->GetTransceivers()[0]->current_direction());
614   } else {
615     // With Plan B the receiver is removed.
616     EXPECT_EQ(0u, callee->pc()->GetReceivers().size());
617   }
618 }
619 
TEST_P(PeerConnectionRtpTest,RemoveTrackWithSharedStreamRemovesReceiver)620 TEST_P(PeerConnectionRtpTest, RemoveTrackWithSharedStreamRemovesReceiver) {
621   auto caller = CreatePeerConnection();
622   auto callee = CreatePeerConnection();
623 
624   const char kSharedStreamId[] = "shared_audio_stream";
625   auto sender1 = caller->AddAudioTrack("audio_track1", {kSharedStreamId});
626   auto sender2 = caller->AddAudioTrack("audio_track2", {kSharedStreamId});
627   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
628   ASSERT_EQ(2u, callee->pc()->GetReceivers().size());
629 
630   // Remove "audio_track1".
631   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender1).ok());
632   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
633 
634   if (sdp_semantics_ == SdpSemantics::kUnifiedPlan) {
635     // With Unified Plan the receiver stays but the transceiver transitions to
636     // inactive.
637     ASSERT_EQ(2u, callee->pc()->GetReceivers().size());
638     auto transceiver = callee->pc()->GetTransceivers()[0];
639     EXPECT_EQ("audio_track1", transceiver->receiver()->track()->id());
640     EXPECT_EQ(RtpTransceiverDirection::kInactive,
641               transceiver->current_direction());
642   } else {
643     // With Plan B the receiver is removed.
644     ASSERT_EQ(1u, callee->pc()->GetReceivers().size());
645     EXPECT_EQ("audio_track2", callee->pc()->GetReceivers()[0]->track()->id());
646   }
647 
648   // Remove "audio_track2".
649   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender2).ok());
650   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
651 
652   if (sdp_semantics_ == SdpSemantics::kUnifiedPlan) {
653     // With Unified Plan the receiver stays but the transceiver transitions to
654     // inactive.
655     ASSERT_EQ(2u, callee->pc()->GetReceivers().size());
656     auto transceiver = callee->pc()->GetTransceivers()[1];
657     EXPECT_EQ("audio_track2", transceiver->receiver()->track()->id());
658     EXPECT_EQ(RtpTransceiverDirection::kInactive,
659               transceiver->current_direction());
660   } else {
661     // With Plan B the receiver is removed.
662     ASSERT_EQ(0u, callee->pc()->GetReceivers().size());
663   }
664 }
665 
TEST_P(PeerConnectionRtpTest,AudioGetParametersHasHeaderExtensions)666 TEST_P(PeerConnectionRtpTest, AudioGetParametersHasHeaderExtensions) {
667   auto caller = CreatePeerConnection();
668   auto callee = CreatePeerConnection();
669   auto sender = caller->AddAudioTrack("audio_track");
670   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
671 
672   ASSERT_GT(caller->pc()->GetSenders().size(), 0u);
673   EXPECT_GT(sender->GetParameters().header_extensions.size(), 0u);
674 
675   ASSERT_GT(callee->pc()->GetReceivers().size(), 0u);
676   auto receiver = callee->pc()->GetReceivers()[0];
677   EXPECT_GT(receiver->GetParameters().header_extensions.size(), 0u);
678 }
679 
TEST_P(PeerConnectionRtpTest,VideoGetParametersHasHeaderExtensions)680 TEST_P(PeerConnectionRtpTest, VideoGetParametersHasHeaderExtensions) {
681   auto caller = CreatePeerConnection();
682   auto callee = CreatePeerConnection();
683   auto sender = caller->AddVideoTrack("video_track");
684   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
685 
686   ASSERT_GT(caller->pc()->GetSenders().size(), 0u);
687   EXPECT_GT(sender->GetParameters().header_extensions.size(), 0u);
688 
689   ASSERT_GT(callee->pc()->GetReceivers().size(), 0u);
690   auto receiver = callee->pc()->GetReceivers()[0];
691   EXPECT_GT(receiver->GetParameters().header_extensions.size(), 0u);
692 }
693 
694 // Invokes SetRemoteDescription() twice in a row without synchronizing the two
695 // calls and examine the state of the peer connection inside the callbacks to
696 // ensure that the second call does not occur prematurely, contaminating the
697 // state of the peer connection of the first callback.
TEST_F(PeerConnectionRtpTestPlanB,StatesCorrelateWithSetRemoteDescriptionCall)698 TEST_F(PeerConnectionRtpTestPlanB,
699        StatesCorrelateWithSetRemoteDescriptionCall) {
700   auto caller = CreatePeerConnection();
701   auto callee = CreatePeerConnection();
702 
703   // Create SDP for adding a track and for removing it. This will be used in the
704   // first and second SetRemoteDescription() calls.
705   auto sender = caller->AddAudioTrack("audio_track", {});
706   auto srd1_sdp = caller->CreateOfferAndSetAsLocal();
707   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
708   auto srd2_sdp = caller->CreateOfferAndSetAsLocal();
709 
710   // In the first SetRemoteDescription() callback, check that we have a
711   // receiver for the track.
712   auto pc = callee->pc();
713   bool srd1_callback_called = false;
714   auto srd1_callback = [&srd1_callback_called, &pc]() {
715     EXPECT_EQ(pc->GetReceivers().size(), 1u);
716     srd1_callback_called = true;
717   };
718 
719   // In the second SetRemoteDescription() callback, check that the receiver has
720   // been removed.
721   // TODO(hbos): When we implement Unified Plan, receivers will not be removed.
722   // Instead, the transceiver owning the receiver will become inactive.
723   // https://crbug.com/webrtc/7600
724   bool srd2_callback_called = false;
725   auto srd2_callback = [&srd2_callback_called, &pc]() {
726     EXPECT_TRUE(pc->GetReceivers().empty());
727     srd2_callback_called = true;
728   };
729 
730   // Invoke SetRemoteDescription() twice in a row without synchronizing the two
731   // calls. The callbacks verify that the two calls are synchronized, as in, the
732   // effects of the second SetRemoteDescription() call must not have happened by
733   // the time the first callback is invoked. If it has then the receiver that is
734   // added as a result of the first SetRemoteDescription() call will already
735   // have been removed as a result of the second SetRemoteDescription() call
736   // when the first callback is invoked.
737   callee->pc()->SetRemoteDescription(
738       std::move(srd1_sdp),
739       rtc::make_ref_counted<OnSuccessObserver<decltype(srd1_callback)>>(
740           srd1_callback));
741   callee->pc()->SetRemoteDescription(
742       std::move(srd2_sdp),
743       rtc::make_ref_counted<OnSuccessObserver<decltype(srd2_callback)>>(
744           srd2_callback));
745   EXPECT_TRUE_WAIT(srd1_callback_called, kDefaultTimeout);
746   EXPECT_TRUE_WAIT(srd2_callback_called, kDefaultTimeout);
747 }
748 
749 // Tests that a remote track is created with the signaled MSIDs when they are
750 // communicated with a=msid and no SSRCs are signaled at all (i.e., no a=ssrc
751 // lines).
TEST_F(PeerConnectionRtpTestUnifiedPlan,UnsignaledSsrcCreatesReceiverStreams)752 TEST_F(PeerConnectionRtpTestUnifiedPlan, UnsignaledSsrcCreatesReceiverStreams) {
753   auto caller = CreatePeerConnection();
754   auto callee = CreatePeerConnection();
755   const char kStreamId1[] = "stream1";
756   const char kStreamId2[] = "stream2";
757   caller->AddTrack(caller->CreateAudioTrack("audio_track1"),
758                    {kStreamId1, kStreamId2});
759 
760   auto offer = caller->CreateOfferAndSetAsLocal();
761   // Munge the offer to take out everything but the stream_ids.
762   auto contents = offer->description()->contents();
763   ASSERT_TRUE(!contents.empty());
764   ASSERT_TRUE(!contents[0].media_description()->streams().empty());
765   std::vector<std::string> stream_ids =
766       contents[0].media_description()->streams()[0].stream_ids();
767   contents[0].media_description()->mutable_streams().clear();
768   cricket::StreamParams new_stream;
769   new_stream.set_stream_ids(stream_ids);
770   contents[0].media_description()->AddStream(new_stream);
771 
772   // Set the remote description and verify that the streams were added to the
773   // receiver correctly.
774   ASSERT_TRUE(
775       callee->SetRemoteDescription(CloneSessionDescription(offer.get())));
776   auto receivers = callee->pc()->GetReceivers();
777   ASSERT_EQ(receivers.size(), 1u);
778   ASSERT_EQ(receivers[0]->streams().size(), 2u);
779   EXPECT_EQ(receivers[0]->streams()[0]->id(), kStreamId1);
780   EXPECT_EQ(receivers[0]->streams()[1]->id(), kStreamId2);
781 }
TEST_F(PeerConnectionRtpTestUnifiedPlan,TracksDoNotEndWhenSsrcChanges)782 TEST_F(PeerConnectionRtpTestUnifiedPlan, TracksDoNotEndWhenSsrcChanges) {
783   constexpr uint32_t kFirstMungedSsrc = 1337u;
784 
785   auto caller = CreatePeerConnection();
786   auto callee = CreatePeerConnection();
787 
788   // Caller offers to receive audio and video.
789   RtpTransceiverInit init;
790   init.direction = RtpTransceiverDirection::kRecvOnly;
791   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init);
792   caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init);
793 
794   // Callee wants to send audio and video tracks.
795   callee->AddTrack(callee->CreateAudioTrack("audio_track"), {});
796   callee->AddTrack(callee->CreateVideoTrack("video_track"), {});
797 
798   // Do inittial offer/answer exchange.
799   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
800   ASSERT_TRUE(
801       caller->SetRemoteDescription(callee->CreateAnswerAndSetAsLocal()));
802   ASSERT_EQ(caller->observer()->add_track_events_.size(), 2u);
803   ASSERT_EQ(caller->pc()->GetReceivers().size(), 2u);
804 
805   // Do a follow-up offer/answer exchange where the SSRCs are modified.
806   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
807   auto answer = callee->CreateAnswer();
808   auto& contents = answer->description()->contents();
809   ASSERT_TRUE(!contents.empty());
810   for (size_t i = 0; i < contents.size(); ++i) {
811     auto& mutable_streams = contents[i].media_description()->mutable_streams();
812     ASSERT_EQ(mutable_streams.size(), 1u);
813     mutable_streams[0].ssrcs = {kFirstMungedSsrc + static_cast<uint32_t>(i)};
814   }
815   ASSERT_TRUE(
816       callee->SetLocalDescription(CloneSessionDescription(answer.get())));
817   ASSERT_TRUE(
818       caller->SetRemoteDescription(CloneSessionDescription(answer.get())));
819 
820   // No furher track events should fire because we never changed direction, only
821   // SSRCs.
822   ASSERT_EQ(caller->observer()->add_track_events_.size(), 2u);
823   // We should have the same number of receivers as before.
824   auto receivers = caller->pc()->GetReceivers();
825   ASSERT_EQ(receivers.size(), 2u);
826   // The tracks are still alive.
827   EXPECT_EQ(receivers[0]->track()->state(),
828             MediaStreamTrackInterface::TrackState::kLive);
829   EXPECT_EQ(receivers[1]->track()->state(),
830             MediaStreamTrackInterface::TrackState::kLive);
831 }
832 
833 // Tests that with Unified Plan if the the stream id changes for a track when
834 // when setting a new remote description, that the media stream is updated
835 // appropriately for the receiver.
836 // TODO(https://github.com/w3c/webrtc-pc/issues/1937): Resolve spec issue or fix
837 // test.
TEST_F(PeerConnectionRtpTestUnifiedPlan,DISABLED_RemoteStreamIdChangesUpdatesReceiver)838 TEST_F(PeerConnectionRtpTestUnifiedPlan,
839        DISABLED_RemoteStreamIdChangesUpdatesReceiver) {
840   auto caller = CreatePeerConnection();
841   auto callee = CreatePeerConnection();
842 
843   const char kStreamId1[] = "stream1";
844   const char kStreamId2[] = "stream2";
845   caller->AddAudioTrack("audio_track1", {kStreamId1});
846   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
847   EXPECT_EQ(callee->observer()->add_track_events_.size(), 1u);
848 
849   // Change the stream id of the sender in the session description.
850   auto offer = caller->CreateOfferAndSetAsLocal();
851   auto contents = offer->description()->contents();
852   ASSERT_EQ(contents.size(), 1u);
853   ASSERT_EQ(contents[0].media_description()->mutable_streams().size(), 1u);
854   contents[0].media_description()->mutable_streams()[0].set_stream_ids(
855       {kStreamId2});
856 
857   // Set the remote description and verify that the stream was updated
858   // properly.
859   ASSERT_TRUE(callee->SetRemoteDescription(std::move(offer)));
860   auto receivers = callee->pc()->GetReceivers();
861   ASSERT_EQ(receivers.size(), 1u);
862   ASSERT_EQ(receivers[0]->streams().size(), 1u);
863   EXPECT_EQ(receivers[0]->streams()[0]->id(), kStreamId2);
864 }
865 
866 // This tests a regression caught by a downstream client, that occured when
867 // applying a remote description with a SessionDescription object that
868 // contained StreamParams that didn't have ids. Although there were multiple
869 // remote audio senders, FindSenderInfo didn't find them as unique, because
870 // it looked up by StreamParam.id, which none had. This meant only one
871 // AudioRtpReceiver was created, as opposed to one for each remote sender.
TEST_F(PeerConnectionRtpTestPlanB,MultipleRemoteSendersWithoutStreamParamIdAddsMultipleReceivers)872 TEST_F(PeerConnectionRtpTestPlanB,
873        MultipleRemoteSendersWithoutStreamParamIdAddsMultipleReceivers) {
874   auto caller = CreatePeerConnection();
875   auto callee = CreatePeerConnection();
876 
877   const char kStreamId1[] = "stream1";
878   const char kStreamId2[] = "stream2";
879   caller->AddAudioTrack("audio_track1", {kStreamId1});
880   caller->AddAudioTrack("audio_track2", {kStreamId2});
881 
882   auto offer = caller->CreateOfferAndSetAsLocal();
883   auto mutable_streams =
884       cricket::GetFirstAudioContentDescription(offer->description())
885           ->mutable_streams();
886   ASSERT_EQ(mutable_streams.size(), 2u);
887   // Clear the IDs in the StreamParams.
888   mutable_streams[0].id.clear();
889   mutable_streams[1].id.clear();
890   ASSERT_TRUE(
891       callee->SetRemoteDescription(CloneSessionDescription(offer.get())));
892 
893   auto receivers = callee->pc()->GetReceivers();
894   ASSERT_EQ(receivers.size(), 2u);
895   ASSERT_EQ(receivers[0]->streams().size(), 1u);
896   EXPECT_EQ(kStreamId1, receivers[0]->streams()[0]->id());
897   ASSERT_EQ(receivers[1]->streams().size(), 1u);
898   EXPECT_EQ(kStreamId2, receivers[1]->streams()[0]->id());
899 }
900 
901 // Tests for the legacy SetRemoteDescription() function signature.
902 
903 // Sanity test making sure the callback is invoked.
TEST_P(PeerConnectionRtpTest,LegacyObserverOnSuccess)904 TEST_P(PeerConnectionRtpTest, LegacyObserverOnSuccess) {
905   auto caller = CreatePeerConnection();
906   auto callee = CreatePeerConnection();
907 
908   std::string error;
909   ASSERT_TRUE(
910       callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal(), &error));
911 }
912 
913 // Verifies legacy behavior: The observer is not called if if the peer
914 // connection is destroyed because the asynchronous callback is executed in the
915 // peer connection's message handler.
TEST_P(PeerConnectionRtpTest,LegacyObserverNotCalledIfPeerConnectionDereferenced)916 TEST_P(PeerConnectionRtpTest,
917        LegacyObserverNotCalledIfPeerConnectionDereferenced) {
918   auto caller = CreatePeerConnection();
919   auto callee = CreatePeerConnection();
920 
921   rtc::scoped_refptr<webrtc::MockSetSessionDescriptionObserver> observer =
922       rtc::make_ref_counted<webrtc::MockSetSessionDescriptionObserver>();
923 
924   auto offer = caller->CreateOfferAndSetAsLocal();
925   callee->pc()->SetRemoteDescription(observer.get(), offer.release());
926   callee = nullptr;
927   rtc::Thread::Current()->ProcessMessages(0);
928   EXPECT_FALSE(observer->called());
929 }
930 
931 // RtpTransceiver Tests.
932 
933 // Test that by default there are no transceivers with Unified Plan.
TEST_F(PeerConnectionRtpTestUnifiedPlan,PeerConnectionHasNoTransceivers)934 TEST_F(PeerConnectionRtpTestUnifiedPlan, PeerConnectionHasNoTransceivers) {
935   auto caller = CreatePeerConnection();
936   EXPECT_THAT(caller->pc()->GetTransceivers(), ElementsAre());
937 }
938 
939 // Test that a transceiver created with the audio kind has the correct initial
940 // properties.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverHasCorrectInitProperties)941 TEST_F(PeerConnectionRtpTestUnifiedPlan,
942        AddTransceiverHasCorrectInitProperties) {
943   auto caller = CreatePeerConnection();
944 
945   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
946   EXPECT_EQ(absl::nullopt, transceiver->mid());
947   EXPECT_FALSE(transceiver->stopped());
948   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, transceiver->direction());
949   EXPECT_EQ(absl::nullopt, transceiver->current_direction());
950 }
951 
952 // Test that adding a transceiver with the audio kind creates an audio sender
953 // and audio receiver with the receiver having a live audio track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddAudioTransceiverCreatesAudioSenderAndReceiver)954 TEST_F(PeerConnectionRtpTestUnifiedPlan,
955        AddAudioTransceiverCreatesAudioSenderAndReceiver) {
956   auto caller = CreatePeerConnection();
957 
958   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
959   EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceiver->media_type());
960 
961   ASSERT_TRUE(transceiver->sender());
962   EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceiver->sender()->media_type());
963 
964   ASSERT_TRUE(transceiver->receiver());
965   EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceiver->receiver()->media_type());
966 
967   auto track = transceiver->receiver()->track();
968   ASSERT_TRUE(track);
969   EXPECT_EQ(MediaStreamTrackInterface::kAudioKind, track->kind());
970   EXPECT_EQ(MediaStreamTrackInterface::TrackState::kLive, track->state());
971 }
972 
973 // Test that adding a transceiver with the video kind creates an video sender
974 // and video receiver with the receiver having a live video track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddAudioTransceiverCreatesVideoSenderAndReceiver)975 TEST_F(PeerConnectionRtpTestUnifiedPlan,
976        AddAudioTransceiverCreatesVideoSenderAndReceiver) {
977   auto caller = CreatePeerConnection();
978 
979   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO);
980   EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->media_type());
981 
982   ASSERT_TRUE(transceiver->sender());
983   EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->sender()->media_type());
984 
985   ASSERT_TRUE(transceiver->receiver());
986   EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->receiver()->media_type());
987 
988   auto track = transceiver->receiver()->track();
989   ASSERT_TRUE(track);
990   EXPECT_EQ(MediaStreamTrackInterface::kVideoKind, track->kind());
991   EXPECT_EQ(MediaStreamTrackInterface::TrackState::kLive, track->state());
992 }
993 
994 // Test that after a call to AddTransceiver, the transceiver shows in
995 // GetTransceivers(), the transceiver's sender shows in GetSenders(), and the
996 // transceiver's receiver shows in GetReceivers().
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverShowsInLists)997 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTransceiverShowsInLists) {
998   auto caller = CreatePeerConnection();
999 
1000   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1001   EXPECT_EQ(
1002       std::vector<rtc::scoped_refptr<RtpTransceiverInterface>>{transceiver},
1003       caller->pc()->GetTransceivers());
1004   EXPECT_EQ(
1005       std::vector<rtc::scoped_refptr<RtpSenderInterface>>{
1006           transceiver->sender()},
1007       caller->pc()->GetSenders());
1008   EXPECT_EQ(
1009       std::vector<rtc::scoped_refptr<RtpReceiverInterface>>{
1010           transceiver->receiver()},
1011       caller->pc()->GetReceivers());
1012 }
1013 
1014 // Test that the direction passed in through the AddTransceiver init parameter
1015 // is set in the returned transceiver.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverWithDirectionIsReflected)1016 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1017        AddTransceiverWithDirectionIsReflected) {
1018   auto caller = CreatePeerConnection();
1019 
1020   RtpTransceiverInit init;
1021   init.direction = RtpTransceiverDirection::kSendOnly;
1022   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init);
1023   EXPECT_EQ(RtpTransceiverDirection::kSendOnly, transceiver->direction());
1024 }
1025 
1026 // Test that calling AddTransceiver with a track creates a transceiver which has
1027 // its sender's track set to the passed-in track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverWithTrackCreatesSenderWithTrack)1028 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1029        AddTransceiverWithTrackCreatesSenderWithTrack) {
1030   auto caller = CreatePeerConnection();
1031 
1032   auto audio_track = caller->CreateAudioTrack("audio track");
1033   auto transceiver = caller->AddTransceiver(audio_track);
1034 
1035   auto sender = transceiver->sender();
1036   ASSERT_TRUE(sender->track());
1037   EXPECT_EQ(audio_track, sender->track());
1038 
1039   auto receiver = transceiver->receiver();
1040   ASSERT_TRUE(receiver->track());
1041   EXPECT_EQ(MediaStreamTrackInterface::kAudioKind, receiver->track()->kind());
1042   EXPECT_EQ(MediaStreamTrackInterface::TrackState::kLive,
1043             receiver->track()->state());
1044 }
1045 
1046 // Test that calling AddTransceiver twice with the same track creates distinct
1047 // transceivers, senders with the same track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverTwiceWithSameTrackCreatesMultipleTransceivers)1048 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1049        AddTransceiverTwiceWithSameTrackCreatesMultipleTransceivers) {
1050   auto caller = CreatePeerConnection();
1051 
1052   auto audio_track = caller->CreateAudioTrack("audio track");
1053 
1054   auto transceiver1 = caller->AddTransceiver(audio_track);
1055   auto transceiver2 = caller->AddTransceiver(audio_track);
1056 
1057   EXPECT_NE(transceiver1, transceiver2);
1058 
1059   auto sender1 = transceiver1->sender();
1060   auto sender2 = transceiver2->sender();
1061   EXPECT_NE(sender1, sender2);
1062   EXPECT_EQ(audio_track, sender1->track());
1063   EXPECT_EQ(audio_track, sender2->track());
1064 
1065   EXPECT_THAT(caller->pc()->GetTransceivers(),
1066               UnorderedElementsAre(transceiver1, transceiver2));
1067   EXPECT_THAT(caller->pc()->GetSenders(),
1068               UnorderedElementsAre(sender1, sender2));
1069 }
1070 
1071 // RtpTransceiver error handling tests.
1072 
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTransceiverWithInvalidKindReturnsError)1073 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1074        AddTransceiverWithInvalidKindReturnsError) {
1075   auto caller = CreatePeerConnection();
1076 
1077   auto result = caller->pc()->AddTransceiver(cricket::MEDIA_TYPE_DATA);
1078   EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
1079 }
1080 
TEST_F(PeerConnectionRtpTestUnifiedPlan,CanClosePeerConnectionWithoutCrashing)1081 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1082        CanClosePeerConnectionWithoutCrashing) {
1083   auto caller = CreatePeerConnection();
1084 
1085   caller->pc()->Close();
1086 }
1087 
1088 // Unified Plan AddTrack tests.
1089 
1090 // Test that adding an audio track creates a new audio RtpSender with the given
1091 // track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddAudioTrackCreatesAudioSender)1092 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddAudioTrackCreatesAudioSender) {
1093   auto caller = CreatePeerConnection();
1094 
1095   auto audio_track = caller->CreateAudioTrack("a");
1096   auto sender = caller->AddTrack(audio_track);
1097   ASSERT_TRUE(sender);
1098 
1099   EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, sender->media_type());
1100   EXPECT_EQ(audio_track, sender->track());
1101 }
1102 
1103 // Test that adding a video track creates a new video RtpSender with the given
1104 // track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddVideoTrackCreatesVideoSender)1105 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddVideoTrackCreatesVideoSender) {
1106   auto caller = CreatePeerConnection();
1107 
1108   auto video_track = caller->CreateVideoTrack("a");
1109   auto sender = caller->AddTrack(video_track);
1110   ASSERT_TRUE(sender);
1111 
1112   EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, sender->media_type());
1113   EXPECT_EQ(video_track, sender->track());
1114 }
1115 
1116 // Test that adding a track to a new PeerConnection creates an RtpTransceiver
1117 // with the sender that AddTrack returns and in the sendrecv direction.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddFirstTrackCreatesTransceiver)1118 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddFirstTrackCreatesTransceiver) {
1119   auto caller = CreatePeerConnection();
1120 
1121   auto sender = caller->AddAudioTrack("a");
1122   ASSERT_TRUE(sender);
1123 
1124   auto transceivers = caller->pc()->GetTransceivers();
1125   ASSERT_EQ(1u, transceivers.size());
1126   EXPECT_EQ(sender, transceivers[0]->sender());
1127   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, transceivers[0]->direction());
1128 }
1129 
1130 // Test that if a transceiver of the same type but no track had been added to
1131 // the PeerConnection and later a call to AddTrack is made, the resulting sender
1132 // is the transceiver's sender and the sender's track is the newly-added track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackReusesTransceiver)1133 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTrackReusesTransceiver) {
1134   auto caller = CreatePeerConnection();
1135 
1136   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1137   auto audio_track = caller->CreateAudioTrack("a");
1138   auto sender = caller->AddTrack(audio_track);
1139   ASSERT_TRUE(sender);
1140 
1141   auto transceivers = caller->pc()->GetTransceivers();
1142   ASSERT_EQ(1u, transceivers.size());
1143   EXPECT_EQ(transceiver, transceivers[0]);
1144   EXPECT_EQ(sender, transceiver->sender());
1145   EXPECT_EQ(audio_track, sender->track());
1146 }
1147 
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackWithSendEncodingDoesNotReuseTransceiver)1148 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1149        AddTrackWithSendEncodingDoesNotReuseTransceiver) {
1150   auto caller = CreatePeerConnection();
1151 
1152   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1153   auto audio_track = caller->CreateAudioTrack("a");
1154   RtpEncodingParameters encoding;
1155   auto sender = caller->AddTrack(audio_track, {}, {encoding});
1156   ASSERT_TRUE(sender);
1157 
1158   auto transceivers = caller->pc()->GetTransceivers();
1159   ASSERT_EQ(2u, transceivers.size());
1160   EXPECT_EQ(transceiver, transceivers[0]);
1161   EXPECT_NE(sender, transceiver->sender());
1162   EXPECT_EQ(audio_track, sender->track());
1163 }
1164 
1165 // Test that adding two tracks to a new PeerConnection creates two
1166 // RtpTransceivers in the same order.
TEST_F(PeerConnectionRtpTestUnifiedPlan,TwoAddTrackCreatesTwoTransceivers)1167 TEST_F(PeerConnectionRtpTestUnifiedPlan, TwoAddTrackCreatesTwoTransceivers) {
1168   auto caller = CreatePeerConnection();
1169 
1170   auto sender1 = caller->AddAudioTrack("a");
1171   auto sender2 = caller->AddVideoTrack("v");
1172   ASSERT_TRUE(sender2);
1173 
1174   auto transceivers = caller->pc()->GetTransceivers();
1175   ASSERT_EQ(2u, transceivers.size());
1176   EXPECT_EQ(sender1, transceivers[0]->sender());
1177   EXPECT_EQ(sender2, transceivers[1]->sender());
1178 }
1179 
1180 // Test that if there are multiple transceivers with no sending track then a
1181 // later call to AddTrack will use the one of the same type as the newly-added
1182 // track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackReusesTransceiverOfType)1183 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTrackReusesTransceiverOfType) {
1184   auto caller = CreatePeerConnection();
1185 
1186   auto audio_transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1187   auto video_transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO);
1188   auto sender = caller->AddVideoTrack("v");
1189 
1190   ASSERT_EQ(2u, caller->pc()->GetTransceivers().size());
1191   EXPECT_NE(sender, audio_transceiver->sender());
1192   EXPECT_EQ(sender, video_transceiver->sender());
1193 }
1194 
1195 // Test that if the only transceivers that do not have a sending track have a
1196 // different type from the added track, then AddTrack will create a new
1197 // transceiver for the track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackDoesNotReuseTransceiverOfWrongType)1198 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1199        AddTrackDoesNotReuseTransceiverOfWrongType) {
1200   auto caller = CreatePeerConnection();
1201 
1202   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1203   auto sender = caller->AddVideoTrack("v");
1204 
1205   auto transceivers = caller->pc()->GetTransceivers();
1206   ASSERT_EQ(2u, transceivers.size());
1207   EXPECT_NE(sender, transceivers[0]->sender());
1208   EXPECT_EQ(sender, transceivers[1]->sender());
1209 }
1210 
1211 // Test that the first available transceiver is reused by AddTrack when multiple
1212 // are available.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackReusesFirstMatchingTransceiver)1213 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1214        AddTrackReusesFirstMatchingTransceiver) {
1215   auto caller = CreatePeerConnection();
1216 
1217   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1218   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1219   auto sender = caller->AddAudioTrack("a");
1220 
1221   auto transceivers = caller->pc()->GetTransceivers();
1222   ASSERT_EQ(2u, transceivers.size());
1223   EXPECT_EQ(sender, transceivers[0]->sender());
1224   EXPECT_NE(sender, transceivers[1]->sender());
1225 }
1226 
1227 // Test that a call to AddTrack that reuses a transceiver will change the
1228 // direction from inactive to sendonly.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackChangesDirectionFromInactiveToSendOnly)1229 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1230        AddTrackChangesDirectionFromInactiveToSendOnly) {
1231   auto caller = CreatePeerConnection();
1232   auto callee = CreatePeerConnection();
1233 
1234   RtpTransceiverInit init;
1235   init.direction = RtpTransceiverDirection::kInactive;
1236   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init);
1237   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1238   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1239 
1240   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1241   caller->observer()->clear_legacy_renegotiation_needed();
1242   caller->observer()->clear_latest_negotiation_needed_event();
1243   ASSERT_TRUE(caller->AddAudioTrack("a"));
1244   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1245   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1246 
1247   EXPECT_EQ(RtpTransceiverDirection::kSendOnly, transceiver->direction());
1248 }
1249 
1250 // Test that a call to AddTrack that reuses a transceiver will change the
1251 // direction from recvonly to sendrecv.
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackChangesDirectionFromRecvOnlyToSendRecv)1252 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1253        AddTrackChangesDirectionFromRecvOnlyToSendRecv) {
1254   auto caller = CreatePeerConnection();
1255   auto callee = CreatePeerConnection();
1256 
1257   RtpTransceiverInit init;
1258   init.direction = RtpTransceiverDirection::kRecvOnly;
1259   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init);
1260   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1261   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1262 
1263   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1264   caller->observer()->clear_legacy_renegotiation_needed();
1265   caller->observer()->clear_latest_negotiation_needed_event();
1266   ASSERT_TRUE(caller->AddAudioTrack("a"));
1267   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1268   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1269 
1270   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, transceiver->direction());
1271 }
1272 
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackCreatesSenderWithTrackId)1273 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTrackCreatesSenderWithTrackId) {
1274   const std::string kTrackId = "audio_track";
1275 
1276   auto caller = CreatePeerConnection();
1277 
1278   auto audio_track = caller->CreateAudioTrack(kTrackId);
1279   auto sender = caller->AddTrack(audio_track);
1280 
1281   EXPECT_EQ(kTrackId, sender->id());
1282 }
1283 
1284 // Unified Plan AddTrack error handling.
1285 
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackErrorIfClosed)1286 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTrackErrorIfClosed) {
1287   auto caller = CreatePeerConnection();
1288 
1289   auto audio_track = caller->CreateAudioTrack("a");
1290   caller->pc()->Close();
1291 
1292   caller->observer()->clear_legacy_renegotiation_needed();
1293   caller->observer()->clear_latest_negotiation_needed_event();
1294   auto result = caller->pc()->AddTrack(audio_track, std::vector<std::string>());
1295   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.error().type());
1296   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1297   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1298 }
1299 
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddTrackErrorIfTrackAlreadyHasSender)1300 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddTrackErrorIfTrackAlreadyHasSender) {
1301   auto caller = CreatePeerConnection();
1302 
1303   auto audio_track = caller->CreateAudioTrack("a");
1304   ASSERT_TRUE(caller->AddTrack(audio_track));
1305 
1306   caller->observer()->clear_legacy_renegotiation_needed();
1307   caller->observer()->clear_latest_negotiation_needed_event();
1308   auto result = caller->pc()->AddTrack(audio_track, std::vector<std::string>());
1309   EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
1310   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1311   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1312 }
1313 
1314 // Unified Plan RemoveTrack tests.
1315 
1316 // Test that calling RemoveTrack on a sender with a previously-added track
1317 // clears the sender's track.
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackClearsSenderTrack)1318 TEST_F(PeerConnectionRtpTestUnifiedPlan, RemoveTrackClearsSenderTrack) {
1319   auto caller = CreatePeerConnection();
1320 
1321   auto sender = caller->AddAudioTrack("a");
1322   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
1323 
1324   EXPECT_FALSE(sender->track());
1325 }
1326 
1327 // Test that calling RemoveTrack on a sender where the transceiver is configured
1328 // in the sendrecv direction changes the transceiver's direction to recvonly.
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackChangesDirectionFromSendRecvToRecvOnly)1329 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1330        RemoveTrackChangesDirectionFromSendRecvToRecvOnly) {
1331   auto caller = CreatePeerConnection();
1332   auto callee = CreatePeerConnection();
1333 
1334   RtpTransceiverInit init;
1335   init.direction = RtpTransceiverDirection::kSendRecv;
1336   auto transceiver =
1337       caller->AddTransceiver(caller->CreateAudioTrack("a"), init);
1338   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1339   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1340 
1341   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1342   caller->observer()->clear_legacy_renegotiation_needed();
1343   caller->observer()->clear_latest_negotiation_needed_event();
1344 
1345   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(transceiver->sender()).ok());
1346   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1347   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1348 
1349   EXPECT_EQ(RtpTransceiverDirection::kRecvOnly, transceiver->direction());
1350 }
1351 
1352 // Test that calling RemoveTrack on a sender where the transceiver is configured
1353 // in the sendonly direction changes the transceiver's direction to inactive.
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackChangesDirectionFromSendOnlyToInactive)1354 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1355        RemoveTrackChangesDirectionFromSendOnlyToInactive) {
1356   auto caller = CreatePeerConnection();
1357   auto callee = CreatePeerConnection();
1358 
1359   RtpTransceiverInit init;
1360   init.direction = RtpTransceiverDirection::kSendOnly;
1361   auto transceiver =
1362       caller->AddTransceiver(caller->CreateAudioTrack("a"), init);
1363   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1364   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1365 
1366   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1367   caller->observer()->clear_legacy_renegotiation_needed();
1368   caller->observer()->clear_latest_negotiation_needed_event();
1369 
1370   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(transceiver->sender()).ok());
1371   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1372   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1373 
1374   EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver->direction());
1375 }
1376 
1377 // Test that calling RemoveTrack with a sender that has a null track results in
1378 // no change in state.
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackWithNullSenderTrackIsNoOp)1379 TEST_F(PeerConnectionRtpTestUnifiedPlan, RemoveTrackWithNullSenderTrackIsNoOp) {
1380   auto caller = CreatePeerConnection();
1381 
1382   auto sender = caller->AddAudioTrack("a");
1383   auto transceiver = caller->pc()->GetTransceivers()[0];
1384   ASSERT_TRUE(sender->SetTrack(nullptr));
1385 
1386   caller->observer()->clear_legacy_renegotiation_needed();
1387   caller->observer()->clear_latest_negotiation_needed_event();
1388   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
1389   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1390   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1391 
1392   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, transceiver->direction());
1393 }
1394 
1395 // Unified Plan RemoveTrack error handling.
1396 
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackErrorIfClosed)1397 TEST_F(PeerConnectionRtpTestUnifiedPlan, RemoveTrackErrorIfClosed) {
1398   auto caller = CreatePeerConnection();
1399 
1400   auto sender = caller->AddAudioTrack("a");
1401   caller->pc()->Close();
1402 
1403   caller->observer()->clear_legacy_renegotiation_needed();
1404   caller->observer()->clear_latest_negotiation_needed_event();
1405   EXPECT_FALSE(caller->pc()->RemoveTrackOrError(sender).ok());
1406   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1407   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1408 }
1409 
TEST_F(PeerConnectionRtpTestUnifiedPlan,RemoveTrackNoErrorIfTrackAlreadyRemoved)1410 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1411        RemoveTrackNoErrorIfTrackAlreadyRemoved) {
1412   auto caller = CreatePeerConnection();
1413 
1414   auto sender = caller->AddAudioTrack("a");
1415   ASSERT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
1416 
1417   caller->observer()->clear_legacy_renegotiation_needed();
1418   caller->observer()->clear_latest_negotiation_needed_event();
1419   EXPECT_TRUE(caller->pc()->RemoveTrackOrError(sender).ok());
1420   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1421   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1422 }
1423 
1424 // Test that setting offers that add/remove/add a track repeatedly without
1425 // setting the appropriate answer in between works.
1426 // These are regression tests for bugs.webrtc.org/9401
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddRemoveAddTrackOffersWorksAudio)1427 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddRemoveAddTrackOffersWorksAudio) {
1428   auto caller = CreatePeerConnection();
1429 
1430   auto sender1 = caller->AddAudioTrack("audio1");
1431   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1432 
1433   caller->pc()->RemoveTrackOrError(sender1);
1434   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1435 
1436   // This will re-use the transceiver created by the first AddTrack.
1437   auto sender2 = caller->AddAudioTrack("audio2");
1438   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1439 
1440   EXPECT_EQ(1u, caller->pc()->GetTransceivers().size());
1441   EXPECT_EQ(sender1, sender2);
1442 }
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddRemoveAddTrackOffersWorksVideo)1443 TEST_F(PeerConnectionRtpTestUnifiedPlan, AddRemoveAddTrackOffersWorksVideo) {
1444   auto caller = CreatePeerConnection();
1445 
1446   auto sender1 = caller->AddVideoTrack("video1");
1447   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1448 
1449   caller->pc()->RemoveTrackOrError(sender1);
1450   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1451 
1452   // This will re-use the transceiver created by the first AddTrack.
1453   auto sender2 = caller->AddVideoTrack("video2");
1454   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1455 
1456   EXPECT_EQ(1u, caller->pc()->GetTransceivers().size());
1457   EXPECT_EQ(sender1, sender2);
1458 }
1459 
1460 // Test that CreateOffer succeeds if two tracks with the same label are added.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CreateOfferSameTrackLabel)1461 TEST_F(PeerConnectionRtpTestUnifiedPlan, CreateOfferSameTrackLabel) {
1462   auto caller = CreatePeerConnection();
1463 
1464   auto audio_sender = caller->AddAudioTrack("track", {});
1465   auto video_sender = caller->AddVideoTrack("track", {});
1466 
1467   EXPECT_TRUE(caller->CreateOffer());
1468 
1469   EXPECT_EQ(audio_sender->track()->id(), video_sender->track()->id());
1470   EXPECT_NE(audio_sender->id(), video_sender->id());
1471 }
1472 
1473 // Test that CreateAnswer succeeds if two tracks with the same label are added.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CreateAnswerSameTrackLabel)1474 TEST_F(PeerConnectionRtpTestUnifiedPlan, CreateAnswerSameTrackLabel) {
1475   auto caller = CreatePeerConnection();
1476   auto callee = CreatePeerConnection();
1477 
1478   RtpTransceiverInit recvonly;
1479   recvonly.direction = RtpTransceiverDirection::kRecvOnly;
1480   caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, recvonly);
1481   caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, recvonly);
1482 
1483   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOffer()));
1484 
1485   auto audio_sender = callee->AddAudioTrack("track", {});
1486   auto video_sender = callee->AddVideoTrack("track", {});
1487 
1488   EXPECT_TRUE(callee->CreateAnswer());
1489 
1490   EXPECT_EQ(audio_sender->track()->id(), video_sender->track()->id());
1491   EXPECT_NE(audio_sender->id(), video_sender->id());
1492 }
1493 
1494 // Test that calling AddTrack, RemoveTrack and AddTrack again creates a second
1495 // m= section with a random sender id (different from the first, now rejected,
1496 // m= section).
TEST_F(PeerConnectionRtpTestUnifiedPlan,AddRemoveAddTrackGeneratesNewSenderId)1497 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1498        AddRemoveAddTrackGeneratesNewSenderId) {
1499   auto caller = CreatePeerConnection();
1500   auto callee = CreatePeerConnection();
1501 
1502   auto track = caller->CreateVideoTrack("video");
1503   auto sender1 = caller->AddTrack(track);
1504   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1505 
1506   caller->pc()->RemoveTrackOrError(sender1);
1507   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1508 
1509   auto sender2 = caller->AddTrack(track);
1510 
1511   EXPECT_NE(sender1, sender2);
1512   EXPECT_NE(sender1->id(), sender2->id());
1513   std::string sender2_id = sender2->id();
1514 
1515   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1516 
1517   // The sender's ID should not change after negotiation.
1518   EXPECT_EQ(sender2_id, sender2->id());
1519 }
1520 
1521 // Test that OnRenegotiationNeeded is fired if SetDirection is called on an
1522 // active RtpTransceiver with a new direction.
TEST_F(PeerConnectionRtpTestUnifiedPlan,RenegotiationNeededAfterTransceiverSetDirection)1523 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1524        RenegotiationNeededAfterTransceiverSetDirection) {
1525   auto caller = CreatePeerConnection();
1526   auto callee = CreatePeerConnection();
1527   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1528   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1529 
1530   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1531   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1532   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1533 
1534   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1535   caller->observer()->clear_legacy_renegotiation_needed();
1536   caller->observer()->clear_latest_negotiation_needed_event();
1537 
1538   transceiver->SetDirectionWithError(RtpTransceiverDirection::kInactive);
1539   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1540   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1541 }
1542 
1543 // Test that OnRenegotiationNeeded is not fired if SetDirection is called on an
1544 // active RtpTransceiver with current direction.
TEST_F(PeerConnectionRtpTestUnifiedPlan,NoRenegotiationNeededAfterTransceiverSetSameDirection)1545 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1546        NoRenegotiationNeededAfterTransceiverSetSameDirection) {
1547   auto caller = CreatePeerConnection();
1548 
1549   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1550 
1551   caller->observer()->clear_legacy_renegotiation_needed();
1552   caller->observer()->clear_latest_negotiation_needed_event();
1553   transceiver->SetDirectionWithError(transceiver->direction());
1554   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1555   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1556 }
1557 
1558 // Test that OnRenegotiationNeeded is not fired if SetDirection is called on a
1559 // stopped RtpTransceiver.
TEST_F(PeerConnectionRtpTestUnifiedPlan,NoRenegotiationNeededAfterSetDirectionOnStoppedTransceiver)1560 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1561        NoRenegotiationNeededAfterSetDirectionOnStoppedTransceiver) {
1562   auto caller = CreatePeerConnection();
1563 
1564   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1565   transceiver->StopInternal();
1566 
1567   caller->observer()->clear_legacy_renegotiation_needed();
1568   caller->observer()->clear_latest_negotiation_needed_event();
1569   transceiver->SetDirectionWithError(RtpTransceiverDirection::kInactive);
1570   EXPECT_FALSE(caller->observer()->legacy_renegotiation_needed());
1571   EXPECT_FALSE(caller->observer()->has_negotiation_needed_event());
1572 }
1573 
1574 // Test that currentDirection returnes "stopped" if the transceiver was stopped.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckStoppedCurrentDirectionOnStoppedTransceiver)1575 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1576        CheckStoppedCurrentDirectionOnStoppedTransceiver) {
1577   auto caller = CreatePeerConnection();
1578 
1579   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1580   transceiver->StopInternal();
1581 
1582   EXPECT_TRUE(transceiver->stopping());
1583   EXPECT_TRUE(transceiver->stopped());
1584   EXPECT_EQ(RtpTransceiverDirection::kStopped,
1585             transceiver->current_direction());
1586 }
1587 
1588 // Test that InvalidState is thrown on a stopping transceiver.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckForInvalidStateOnStoppingTransceiver)1589 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1590        CheckForInvalidStateOnStoppingTransceiver) {
1591   auto caller = CreatePeerConnection();
1592 
1593   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1594   transceiver->StopStandard();
1595 
1596   EXPECT_TRUE(transceiver->stopping());
1597   EXPECT_FALSE(transceiver->stopped());
1598   EXPECT_EQ(
1599       RTCErrorType::INVALID_STATE,
1600       transceiver->SetDirectionWithError(RtpTransceiverDirection::kInactive)
1601           .type());
1602 }
1603 
1604 // Test that InvalidState is thrown on a stopped transceiver.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckForInvalidStateOnStoppedTransceiver)1605 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1606        CheckForInvalidStateOnStoppedTransceiver) {
1607   auto caller = CreatePeerConnection();
1608 
1609   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1610   transceiver->StopInternal();
1611 
1612   EXPECT_TRUE(transceiver->stopping());
1613   EXPECT_TRUE(transceiver->stopped());
1614   EXPECT_EQ(
1615       RTCErrorType::INVALID_STATE,
1616       transceiver->SetDirectionWithError(RtpTransceiverDirection::kInactive)
1617           .type());
1618 }
1619 
1620 // Test that TypeError is thrown if the direction is set to "stopped".
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckForTypeErrorForStoppedOnTransceiver)1621 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1622        CheckForTypeErrorForStoppedOnTransceiver) {
1623   auto caller = CreatePeerConnection();
1624 
1625   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1626   EXPECT_EQ(
1627       RTCErrorType::INVALID_PARAMETER,
1628       transceiver->SetDirectionWithError(RtpTransceiverDirection::kStopped)
1629           .type());
1630 }
1631 
1632 // Test that you can do createOffer/setLocalDescription with a stopped
1633 // media section.
TEST_F(PeerConnectionRtpTestUnifiedPlan,SetLocalDescriptionWithStoppedMediaSection)1634 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1635        SetLocalDescriptionWithStoppedMediaSection) {
1636   auto caller = CreatePeerConnection();
1637   auto callee = CreatePeerConnection();
1638   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1639   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1640   callee->pc()->GetTransceivers()[0]->StopStandard();
1641   ASSERT_TRUE(callee->ExchangeOfferAnswerWith(caller.get()));
1642   EXPECT_EQ(RtpTransceiverDirection::kStopped,
1643             transceiver->current_direction());
1644   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1645 }
1646 
TEST_F(PeerConnectionRtpTestUnifiedPlan,StopAndNegotiateCausesTransceiverToDisappear)1647 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1648        StopAndNegotiateCausesTransceiverToDisappear) {
1649   auto caller = CreatePeerConnection();
1650   auto callee = CreatePeerConnection();
1651   auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
1652   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1653   callee->pc()->GetTransceivers()[0]->StopStandard();
1654   ASSERT_TRUE(callee->ExchangeOfferAnswerWith(caller.get()));
1655   EXPECT_EQ(RtpTransceiverDirection::kStopped,
1656             transceiver->current_direction());
1657   EXPECT_EQ(0U, caller->pc()->GetTransceivers().size());
1658   EXPECT_EQ(0U, callee->pc()->GetTransceivers().size());
1659   EXPECT_EQ(0U, caller->pc()->GetSenders().size());
1660   EXPECT_EQ(0U, callee->pc()->GetSenders().size());
1661   EXPECT_EQ(0U, caller->pc()->GetReceivers().size());
1662   EXPECT_EQ(0U, callee->pc()->GetReceivers().size());
1663 }
1664 
TEST_F(PeerConnectionRtpTestUnifiedPlan,SetLocalDescriptionWorksAfterRepeatedAddRemove)1665 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1666        SetLocalDescriptionWorksAfterRepeatedAddRemove) {
1667   auto caller = CreatePeerConnection();
1668   auto callee = CreatePeerConnection();
1669   auto video_track = caller->CreateVideoTrack("v");
1670   auto track = caller->CreateAudioTrack("a");
1671   caller->AddTransceiver(video_track);
1672   auto transceiver = caller->AddTransceiver(track);
1673   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1674   caller->pc()->RemoveTrackOrError(transceiver->sender());
1675   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1676   caller->AddTrack(track);
1677   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1678   caller->pc()->RemoveTrackOrError(transceiver->sender());
1679   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1680 }
1681 
1682 // This is a repro of Chromium bug https://crbug.com/1134686
TEST_F(PeerConnectionRtpTestUnifiedPlan,SetLocalDescriptionWorksAfterRepeatedAddRemoveWithRemoteReject)1683 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1684        SetLocalDescriptionWorksAfterRepeatedAddRemoveWithRemoteReject) {
1685   auto caller = CreatePeerConnection();
1686   auto callee = CreatePeerConnection();
1687   auto video_track = caller->CreateVideoTrack("v");
1688   auto track = caller->CreateAudioTrack("a");
1689   caller->AddTransceiver(video_track);
1690   auto transceiver = caller->AddTransceiver(track);
1691   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1692   caller->pc()->RemoveTrackOrError(transceiver->sender());
1693   ExchangeOfferAnswerWhereRemoteStopsTransceiver(caller.get(), callee.get(), 1);
1694   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1695   caller->AddTrack(track);
1696   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1697   caller->pc()->RemoveTrackOrError(transceiver->sender());
1698   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1699 }
1700 
1701 // Test that AddTransceiver fails if trying to use unimplemented RTP encoding
1702 // parameters with the send_encodings parameters.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckForUnsupportedEncodingParameters)1703 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1704        CheckForUnsupportedEncodingParameters) {
1705   auto caller = CreatePeerConnection();
1706 
1707   RtpTransceiverInit init;
1708   init.send_encodings.emplace_back();
1709 
1710   auto default_send_encodings = init.send_encodings;
1711 
1712   // Unimplemented RtpParameters: ssrc, codec_payload_type, fec, rtx, dtx,
1713   // ptime, scale_framerate_down_by, dependency_rids.
1714   init.send_encodings[0].ssrc = 1;
1715   EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1716             caller->pc()
1717                 ->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init)
1718                 .error()
1719                 .type());
1720   init.send_encodings = default_send_encodings;
1721 }
1722 
1723 // Test that AddTransceiver fails if trying to use invalid RTP encoding
1724 // parameters with the send_encodings parameters.
TEST_F(PeerConnectionRtpTestUnifiedPlan,CheckForInvalidEncodingParameters)1725 TEST_F(PeerConnectionRtpTestUnifiedPlan, CheckForInvalidEncodingParameters) {
1726   auto caller = CreatePeerConnection();
1727 
1728   RtpTransceiverInit init;
1729   init.send_encodings.emplace_back();
1730 
1731   auto default_send_encodings = init.send_encodings;
1732 
1733   init.send_encodings[0].scale_resolution_down_by = 0.5;
1734   EXPECT_EQ(RTCErrorType::INVALID_RANGE,
1735             caller->pc()
1736                 ->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init)
1737                 .error()
1738                 .type());
1739   init.send_encodings = default_send_encodings;
1740 
1741   init.send_encodings[0].bitrate_priority = 0;
1742   EXPECT_EQ(RTCErrorType::INVALID_RANGE,
1743             caller->pc()
1744                 ->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init)
1745                 .error()
1746                 .type());
1747   init.send_encodings = default_send_encodings;
1748 
1749   init.send_encodings[0].min_bitrate_bps = 200000;
1750   init.send_encodings[0].max_bitrate_bps = 100000;
1751   EXPECT_EQ(RTCErrorType::INVALID_RANGE,
1752             caller->pc()
1753                 ->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init)
1754                 .error()
1755                 .type());
1756   init.send_encodings = default_send_encodings;
1757 
1758   init.send_encodings[0].num_temporal_layers = 0;
1759   EXPECT_EQ(RTCErrorType::INVALID_RANGE,
1760             caller->pc()
1761                 ->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init)
1762                 .error()
1763                 .type());
1764   init.send_encodings = default_send_encodings;
1765 
1766   init.send_encodings[0].num_temporal_layers = 5;
1767   EXPECT_EQ(RTCErrorType::INVALID_RANGE,
1768             caller->pc()
1769                 ->AddTransceiver(cricket::MEDIA_TYPE_VIDEO, init)
1770                 .error()
1771                 .type());
1772   init.send_encodings = default_send_encodings;
1773 }
1774 
1775 // Test that AddTransceiver transfers the send_encodings to the sender and they
1776 // are retained after SetLocalDescription().
TEST_F(PeerConnectionRtpTestUnifiedPlan,SendEncodingsPassedToSender)1777 TEST_F(PeerConnectionRtpTestUnifiedPlan, SendEncodingsPassedToSender) {
1778   auto caller = CreatePeerConnection();
1779 
1780   RtpTransceiverInit init;
1781   init.send_encodings.emplace_back();
1782   init.send_encodings[0].active = false;
1783   init.send_encodings[0].max_bitrate_bps = 180000;
1784 
1785   auto result = caller->pc()->AddTransceiver(cricket::MEDIA_TYPE_AUDIO, init);
1786   ASSERT_TRUE(result.ok());
1787 
1788   auto init_send_encodings = result.value()->sender()->init_send_encodings();
1789   EXPECT_FALSE(init_send_encodings[0].active);
1790   EXPECT_EQ(init_send_encodings[0].max_bitrate_bps, 180000);
1791 
1792   auto parameters = result.value()->sender()->GetParameters();
1793   EXPECT_FALSE(parameters.encodings[0].active);
1794   EXPECT_EQ(parameters.encodings[0].max_bitrate_bps, 180000);
1795 
1796   ASSERT_TRUE(caller->SetLocalDescription(caller->CreateOffer()));
1797 
1798   parameters = result.value()->sender()->GetParameters();
1799   EXPECT_FALSE(parameters.encodings[0].active);
1800   EXPECT_EQ(parameters.encodings[0].max_bitrate_bps, 180000);
1801 }
1802 
1803 // Test MSID signaling between Unified Plan and Plan B endpoints. There are two
1804 // options for this kind of signaling: media section based (a=msid) and ssrc
1805 // based (a=ssrc MSID). While JSEP only specifies media section MSID signaling,
1806 // we want to ensure compatibility with older Plan B endpoints that might expect
1807 // ssrc based MSID signaling. Thus we test here that Unified Plan offers both
1808 // types but answers with the same type as the offer.
1809 
1810 class PeerConnectionMsidSignalingTest
1811     : public PeerConnectionRtpTestUnifiedPlan {};
1812 
TEST_F(PeerConnectionMsidSignalingTest,UnifiedPlanTalkingToOurself)1813 TEST_F(PeerConnectionMsidSignalingTest, UnifiedPlanTalkingToOurself) {
1814   auto caller = CreatePeerConnectionWithUnifiedPlan();
1815   caller->AddAudioTrack("caller_audio");
1816   auto callee = CreatePeerConnectionWithUnifiedPlan();
1817   callee->AddAudioTrack("callee_audio");
1818 
1819   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1820 
1821   // Offer should have had both a=msid and a=ssrc MSID lines.
1822   auto* offer = callee->pc()->remote_description();
1823   EXPECT_EQ((cricket::kMsidSignalingMediaSection |
1824              cricket::kMsidSignalingSsrcAttribute),
1825             offer->description()->msid_signaling());
1826 
1827   // Answer should have had only a=msid lines.
1828   auto* answer = caller->pc()->remote_description();
1829   EXPECT_EQ(cricket::kMsidSignalingMediaSection,
1830             answer->description()->msid_signaling());
1831 }
1832 
TEST_F(PeerConnectionMsidSignalingTest,PlanBOfferToUnifiedPlanAnswer)1833 TEST_F(PeerConnectionMsidSignalingTest, PlanBOfferToUnifiedPlanAnswer) {
1834   auto caller = CreatePeerConnectionWithPlanB();
1835   caller->AddAudioTrack("caller_audio");
1836   auto callee = CreatePeerConnectionWithUnifiedPlan();
1837   callee->AddAudioTrack("callee_audio");
1838 
1839   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1840 
1841   // Offer should have only a=ssrc MSID lines.
1842   auto* offer = callee->pc()->remote_description();
1843   EXPECT_EQ(cricket::kMsidSignalingSsrcAttribute,
1844             offer->description()->msid_signaling());
1845 
1846   // Answer should have only a=ssrc MSID lines to match the offer.
1847   auto* answer = caller->pc()->remote_description();
1848   EXPECT_EQ(cricket::kMsidSignalingSsrcAttribute,
1849             answer->description()->msid_signaling());
1850 }
1851 
1852 // This tests that a Plan B endpoint appropriately sets the remote description
1853 // from a Unified Plan offer. When the Unified Plan offer contains a=msid lines
1854 // that signal no stream ids or multiple stream ids we expect that the Plan B
1855 // endpoint always has exactly one media stream per track.
TEST_F(PeerConnectionMsidSignalingTest,UnifiedPlanToPlanBAnswer)1856 TEST_F(PeerConnectionMsidSignalingTest, UnifiedPlanToPlanBAnswer) {
1857   const std::string kStreamId1 = "audio_stream_1";
1858   const std::string kStreamId2 = "audio_stream_2";
1859 
1860   auto caller = CreatePeerConnectionWithUnifiedPlan();
1861   caller->AddAudioTrack("caller_audio", {kStreamId1, kStreamId2});
1862   caller->AddVideoTrack("caller_video", {});
1863   auto callee = CreatePeerConnectionWithPlanB();
1864   callee->AddAudioTrack("callee_audio");
1865   caller->AddVideoTrack("callee_video");
1866 
1867   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1868 
1869   // Offer should have had both a=msid and a=ssrc MSID lines.
1870   auto* offer = callee->pc()->remote_description();
1871   EXPECT_EQ((cricket::kMsidSignalingMediaSection |
1872              cricket::kMsidSignalingSsrcAttribute),
1873             offer->description()->msid_signaling());
1874 
1875   // Callee should always have 1 stream for all of it's receivers.
1876   const auto& track_events = callee->observer()->add_track_events_;
1877   ASSERT_EQ(2u, track_events.size());
1878   ASSERT_EQ(1u, track_events[0].streams.size());
1879   EXPECT_EQ(kStreamId1, track_events[0].streams[0]->id());
1880   ASSERT_EQ(1u, track_events[1].streams.size());
1881   // This autogenerated a stream id for the empty one signalled.
1882   EXPECT_FALSE(track_events[1].streams[0]->id().empty());
1883 }
1884 
TEST_F(PeerConnectionMsidSignalingTest,PureUnifiedPlanToUs)1885 TEST_F(PeerConnectionMsidSignalingTest, PureUnifiedPlanToUs) {
1886   auto caller = CreatePeerConnectionWithUnifiedPlan();
1887   caller->AddAudioTrack("caller_audio");
1888   auto callee = CreatePeerConnectionWithUnifiedPlan();
1889   callee->AddAudioTrack("callee_audio");
1890 
1891   auto offer = caller->CreateOffer();
1892   // Simulate a pure Unified Plan offerer by setting the MSID signaling to media
1893   // section only.
1894   offer->description()->set_msid_signaling(cricket::kMsidSignalingMediaSection);
1895 
1896   ASSERT_TRUE(
1897       caller->SetLocalDescription(CloneSessionDescription(offer.get())));
1898   ASSERT_TRUE(callee->SetRemoteDescription(std::move(offer)));
1899 
1900   // Answer should have only a=msid to match the offer.
1901   auto answer = callee->CreateAnswer();
1902   EXPECT_EQ(cricket::kMsidSignalingMediaSection,
1903             answer->description()->msid_signaling());
1904 }
1905 
1906 // Sender setups in a call.
1907 
TEST_P(PeerConnectionRtpTest,CreateTwoSendersWithSameTrack)1908 TEST_P(PeerConnectionRtpTest, CreateTwoSendersWithSameTrack) {
1909   auto caller = CreatePeerConnection();
1910   auto callee = CreatePeerConnection();
1911 
1912   auto track = caller->CreateAudioTrack("audio_track");
1913   auto sender1 = caller->AddTrack(track);
1914   ASSERT_TRUE(sender1);
1915   // We need to temporarily reset the track for the subsequent AddTrack() to
1916   // succeed.
1917   EXPECT_TRUE(sender1->SetTrack(nullptr));
1918   auto sender2 = caller->AddTrack(track);
1919   EXPECT_TRUE(sender2);
1920   EXPECT_TRUE(sender1->SetTrack(track.get()));
1921 
1922   if (sdp_semantics_ == SdpSemantics::kPlanB_DEPRECATED) {
1923     // TODO(hbos): When https://crbug.com/webrtc/8734 is resolved, this should
1924     // return true, and doing `callee->SetRemoteDescription()` should work.
1925     EXPECT_FALSE(caller->CreateOfferAndSetAsLocal());
1926   } else {
1927     EXPECT_TRUE(caller->CreateOfferAndSetAsLocal());
1928   }
1929 }
1930 
1931 // This test exercises the code path that fires a NegotiationNeeded
1932 // notification when the stream IDs of the local description differ from
1933 // the ones in the transceiver.
TEST_F(PeerConnectionRtpTestUnifiedPlan,ChangeAssociatedStreamsTriggersRenegotiation)1934 TEST_F(PeerConnectionRtpTestUnifiedPlan,
1935        ChangeAssociatedStreamsTriggersRenegotiation) {
1936   auto caller = CreatePeerConnection();
1937   auto callee = CreatePeerConnection();
1938 
1939   RtpTransceiverInit init;
1940   init.direction = RtpTransceiverDirection::kSendRecv;
1941   auto transceiver =
1942       caller->AddTransceiver(caller->CreateAudioTrack("a"), init);
1943   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1944   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1945 
1946   ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
1947   caller->observer()->clear_legacy_renegotiation_needed();
1948   caller->observer()->clear_latest_negotiation_needed_event();
1949 
1950   transceiver->sender()->SetStreams({"stream3", "stream4", "stream5"});
1951   EXPECT_TRUE(caller->observer()->legacy_renegotiation_needed());
1952   EXPECT_TRUE(caller->observer()->has_negotiation_needed_event());
1953 
1954   ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
1955   auto callee_streams = callee->pc()->GetReceivers()[0]->streams();
1956   ASSERT_EQ(3u, callee_streams.size());
1957   EXPECT_EQ("stream3", callee_streams[0]->id());
1958   EXPECT_EQ("stream4", callee_streams[1]->id());
1959   EXPECT_EQ("stream5", callee_streams[2]->id());
1960 }
1961 
1962 INSTANTIATE_TEST_SUITE_P(PeerConnectionRtpTest,
1963                          PeerConnectionRtpTest,
1964                          Values(SdpSemantics::kPlanB_DEPRECATED,
1965                                 SdpSemantics::kUnifiedPlan));
1966 
1967 }  // namespace webrtc
1968