blob: 38ba5fbd679bae1a7cfd2d708f9be5eb92b5346d [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
14#include "api/jsep.h"
15#include "api/mediastreaminterface.h"
16#include "api/peerconnectioninterface.h"
17#include "pc/mediastream.h"
18#include "pc/mediastreamtrack.h"
19#include "pc/peerconnectionwrapper.h"
20#include "pc/test/fakeaudiocapturemodule.h"
21#include "pc/test/mockpeerconnectionobservers.h"
22#include "rtc_base/checks.h"
23#include "rtc_base/gunit.h"
24#include "rtc_base/ptr_util.h"
25#include "rtc_base/refcountedobject.h"
26#include "rtc_base/scoped_ref_ptr.h"
27#include "rtc_base/thread.h"
28
29// This file contains tests for RTP Media API-related behavior of
30// |webrtc::PeerConnection|, see https://w3c.github.io/webrtc-pc/#rtp-media-api.
31
32namespace {
33
34class PeerConnectionRtpTest : public testing::Test {
35 public:
36 PeerConnectionRtpTest()
37 :
38 pc_factory_(webrtc::CreatePeerConnectionFactory(
39 rtc::Thread::Current(),
40 rtc::Thread::Current(),
41 rtc::Thread::Current(),
42 FakeAudioCaptureModule::Create(),
43 nullptr,
44 nullptr)) {}
45
46 std::unique_ptr<webrtc::PeerConnectionWrapper> CreatePeerConnection() {
47 webrtc::PeerConnectionInterface::RTCConfiguration config;
48 auto observer = rtc::MakeUnique<webrtc::MockPeerConnectionObserver>();
49 auto pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr,
50 observer.get());
51 return std::unique_ptr<webrtc::PeerConnectionWrapper>(
52 new webrtc::PeerConnectionWrapper(pc_factory_, pc,
53 std::move(observer)));
54 }
55
56 protected:
57 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
58};
59
60TEST_F(PeerConnectionRtpTest, AddTrackWithoutStreamFiresOnAddTrack) {
61 auto caller = CreatePeerConnection();
62 auto callee = CreatePeerConnection();
63
64 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
65 pc_factory_->CreateAudioTrack("audio_track", nullptr));
66 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {}));
67 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
68
69 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
70 // TODO(deadbeef): When no stream is handled correctly we would expect
71 // |add_track_events_[0].streams| to be empty. https://crbug.com/webrtc/7933
72 ASSERT_EQ(1u, callee->observer()->add_track_events_[0].streams.size());
73 EXPECT_TRUE(
74 callee->observer()->add_track_events_[0].streams[0]->FindAudioTrack(
75 "audio_track"));
76}
77
78TEST_F(PeerConnectionRtpTest, AddTrackWithStreamFiresOnAddTrack) {
79 auto caller = CreatePeerConnection();
80 auto callee = CreatePeerConnection();
81
82 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
83 pc_factory_->CreateAudioTrack("audio_track", nullptr));
84 auto stream = webrtc::MediaStream::Create("audio_stream");
85 EXPECT_TRUE(caller->pc()->AddTrack(audio_track.get(), {stream.get()}));
86 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
87
88 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
89 ASSERT_EQ(1u, callee->observer()->add_track_events_[0].streams.size());
90 EXPECT_EQ("audio_stream",
91 callee->observer()->add_track_events_[0].streams[0]->label());
92 EXPECT_TRUE(
93 callee->observer()->add_track_events_[0].streams[0]->FindAudioTrack(
94 "audio_track"));
95}
96
97TEST_F(PeerConnectionRtpTest, RemoveTrackWithoutStreamFiresOnRemoveTrack) {
98 auto caller = CreatePeerConnection();
99 auto callee = CreatePeerConnection();
100
101 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
102 pc_factory_->CreateAudioTrack("audio_track", nullptr));
103 auto sender = caller->pc()->AddTrack(audio_track.get(), {});
104 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
105 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
106 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
107 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
108
109 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
110 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
111 callee->observer()->remove_track_events_);
112}
113
114TEST_F(PeerConnectionRtpTest, RemoveTrackWithStreamFiresOnRemoveTrack) {
115 auto caller = CreatePeerConnection();
116 auto callee = CreatePeerConnection();
117
118 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
119 pc_factory_->CreateAudioTrack("audio_track", nullptr));
120 auto stream = webrtc::MediaStream::Create("audio_stream");
121 auto sender = caller->pc()->AddTrack(audio_track.get(), {stream.get()});
122 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
123 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
124 EXPECT_TRUE(caller->pc()->RemoveTrack(sender));
125 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
126
127 ASSERT_EQ(1u, callee->observer()->add_track_events_.size());
128 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
129 callee->observer()->remove_track_events_);
130}
131
132TEST_F(PeerConnectionRtpTest, RemoveTrackWithSharedStreamFiresOnRemoveTrack) {
133 auto caller = CreatePeerConnection();
134 auto callee = CreatePeerConnection();
135
136 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track1(
137 pc_factory_->CreateAudioTrack("audio_track1", nullptr));
138 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track2(
139 pc_factory_->CreateAudioTrack("audio_track2", nullptr));
140 auto stream = webrtc::MediaStream::Create("shared_audio_stream");
141 std::vector<webrtc::MediaStreamInterface*> streams{stream.get()};
142 auto sender1 = caller->pc()->AddTrack(audio_track1.get(), streams);
143 auto sender2 = caller->pc()->AddTrack(audio_track2.get(), streams);
144 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
145
146 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
147
148 // Remove "audio_track1".
149 EXPECT_TRUE(caller->pc()->RemoveTrack(sender1));
150 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
151 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
152 EXPECT_EQ(
153 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>>{
154 callee->observer()->add_track_events_[0].receiver},
155 callee->observer()->remove_track_events_);
156
157 // Remove "audio_track2".
158 EXPECT_TRUE(caller->pc()->RemoveTrack(sender2));
159 ASSERT_TRUE(callee->SetRemoteDescription(caller->CreateOfferAndSetAsLocal()));
160 ASSERT_EQ(2u, callee->observer()->add_track_events_.size());
161 EXPECT_EQ(callee->observer()->GetAddTrackReceivers(),
162 callee->observer()->remove_track_events_);
163}
164
165} // namespace