blob: 860c6dc50e320692bd19b28c7b28f52a1590b145 [file] [log] [blame]
Henrik Boström933d8b02017-10-10 10:05:16 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <memory>
12#include <vector>
13
Karl Wiberg1b0eae32017-10-17 14:48:54 +020014#include "api/audio_codecs/builtin_audio_decoder_factory.h"
15#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Henrik Boström933d8b02017-10-10 10:05:16 -070016#include "api/jsep.h"
17#include "api/mediastreaminterface.h"
18#include "api/peerconnectioninterface.h"
19#include "pc/mediastream.h"
20#include "pc/mediastreamtrack.h"
21#include "pc/peerconnectionwrapper.h"
22#include "pc/test/fakeaudiocapturemodule.h"
23#include "pc/test/mockpeerconnectionobservers.h"
24#include "rtc_base/checks.h"
25#include "rtc_base/gunit.h"
26#include "rtc_base/ptr_util.h"
27#include "rtc_base/refcountedobject.h"
28#include "rtc_base/scoped_ref_ptr.h"
29#include "rtc_base/thread.h"
30
31// This file contains tests for RTP Media API-related behavior of
32// |webrtc::PeerConnection|, see https://w3c.github.io/webrtc-pc/#rtp-media-api.
33
34namespace {
35
36class PeerConnectionRtpTest : public testing::Test {
37 public:
38 PeerConnectionRtpTest()
Karl Wiberg1b0eae32017-10-17 14:48:54 +020039 : pc_factory_(webrtc::CreatePeerConnectionFactory(
Henrik Boström933d8b02017-10-10 10:05:16 -070040 rtc::Thread::Current(),
41 rtc::Thread::Current(),
42 rtc::Thread::Current(),
43 FakeAudioCaptureModule::Create(),
Karl Wiberg1b0eae32017-10-17 14:48:54 +020044 webrtc::CreateBuiltinAudioEncoderFactory(),
45 webrtc::CreateBuiltinAudioDecoderFactory(),
Henrik Boström933d8b02017-10-10 10:05:16 -070046 nullptr,
47 nullptr)) {}
48
49 std::unique_ptr<webrtc::PeerConnectionWrapper> CreatePeerConnection() {
50 webrtc::PeerConnectionInterface::RTCConfiguration config;
51 auto observer = rtc::MakeUnique<webrtc::MockPeerConnectionObserver>();
52 auto pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr,
53 observer.get());
54 return std::unique_ptr<webrtc::PeerConnectionWrapper>(
55 new webrtc::PeerConnectionWrapper(pc_factory_, pc,
56 std::move(observer)));
57 }
58
59 protected:
60 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
61};
62
63TEST_F(PeerConnectionRtpTest, AddTrackWithoutStreamFiresOnAddTrack) {
64 auto caller = CreatePeerConnection();
65 auto callee = CreatePeerConnection();
66
67 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
68 pc_factory_->CreateAudioTrack("audio_track", nullptr));
69 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {}));
70 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
71
72 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
73 // TODO(deadbeef): When no stream is handled correctly we would expect
74 // |add_track_events_[0].streams| to be empty. https://crbug.com/webrtc/7933
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010075 auto& add_track_event = callee->observer()->add_track_events_[0];
76 ASSERT_EQ(1u, add_track_event.streams.size());
77 EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
78 EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
Henrik Boström933d8b02017-10-10 10:05:16 -070079}
80
81TEST_F(PeerConnectionRtpTest, AddTrackWithStreamFiresOnAddTrack) {
82 auto caller = CreatePeerConnection();
83 auto callee = CreatePeerConnection();
84
85 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
86 pc_factory_->CreateAudioTrack("audio_track", nullptr));
87 auto stream = webrtc::MediaStream::Create("audio_stream");
88 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {stream.get()}));
89 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
90
91 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
Henrik Boström9e6fd2b2017-11-21 13:41:51 +010092 auto& add_track_event = callee->observer()->add_track_events_[0];
93 ASSERT_EQ(1u, add_track_event.streams.size());
94 EXPECT_EQ("audio_stream", add_track_event.streams[0]->label());
95 EXPECT_TRUE(add_track_event.streams[0]->FindAudioTrack("audio_track"));
96 EXPECT_EQ(add_track_event.streams, add_track_event.receiver->streams());
Henrik Boström933d8b02017-10-10 10:05:16 -070097}
98
99TEST_F(PeerConnectionRtpTest, RemoveTrackWithoutStreamFiresOnRemoveTrack) {
100 auto caller = CreatePeerConnection();
101 auto callee = CreatePeerConnection();
102
103 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
104 pc_factory_->CreateAudioTrack("audio_track", nullptr));
105 auto sender = caller->pc()->AddTrack(audio_track.get(), {});
106 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
107 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
108 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
109 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
110
111 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
112 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
113 callee->observer()->remove_track_events_);
114}
115
116TEST_F(PeerConnectionRtpTest, RemoveTrackWithStreamFiresOnRemoveTrack) {
117 auto caller = CreatePeerConnection();
118 auto callee = CreatePeerConnection();
119
120 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
121 pc_factory_->CreateAudioTrack("audio_track", nullptr));
122 auto stream = webrtc::MediaStream::Create("audio_stream");
123 auto sender = caller->pc()->AddTrack(audio_track.get(), {stream.get()});
124 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
125 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
126 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
127 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
128
129 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
130 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
131 callee->observer()->remove_track_events_);
132}
133
134TEST_F(PeerConnectionRtpTest, RemoveTrackWithSharedStreamFiresOnRemoveTrack) {
135 auto caller = CreatePeerConnection();
136 auto callee = CreatePeerConnection();
137
138 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track1(
139 pc_factory_->CreateAudioTrack("audio_track1", nullptr));
140 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track2(
141 pc_factory_->CreateAudioTrack("audio_track2", nullptr));
142 auto stream = webrtc::MediaStream::Create("shared_audio_stream");
143 std::vector<webrtc::MediaStreamInterface*> streams{stream.get()};
144 auto sender1 = caller->pc()->AddTrack(audio_track1.get(), streams);
145 auto sender2 = caller->pc()->AddTrack(audio_track2.get(), streams);
146 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
147
148 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
149
150 // Remove "audio_track1".
151 EXPECT_TRUE(caller->pc()->RemoveTrack(sender1));
152 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
153 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
154 EXPECT_EQ(
155 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>{
156 callee->observer()->add_track_events_[0].receiver},
157 callee->observer()->remove_track_events_);
158
159 // Remove "audio_track2".
160 EXPECT_TRUE(caller->pc()->RemoveTrack(sender2));
161 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
162 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
163 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
164 callee->observer()->remove_track_events_);
165}
166
167} // namespace