blob: 96e38b0b2315d014645b5c7335b67e4a1426fd42 [file] [log] [blame]
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001/*
2 * Copyright 2018 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// This file contains tests for |RtpTransceiver|.
12
Steve Anton10542f22019-01-11 09:11:00 -080013#include "pc/rtp_transceiver.h"
Yves Gerey3e707812018-11-28 16:47:49 +010014
Markus Handell0357b3e2020-03-16 13:40:51 +010015#include <memory>
16
17#include "media/base/fake_media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "pc/test/mock_channel_interface.h"
Markus Handell0357b3e2020-03-16 13:40:51 +010019#include "pc/test/mock_rtp_receiver_internal.h"
20#include "pc/test/mock_rtp_sender_internal.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080021#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "test/gtest.h"
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080023
Markus Handell0357b3e2020-03-16 13:40:51 +010024using ::testing::ElementsAre;
25using ::testing::Eq;
26using ::testing::Field;
27using ::testing::Not;
Markus Handell755c65d2020-06-24 01:06:10 +020028using ::testing::Property;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080029using ::testing::Return;
30using ::testing::ReturnRef;
31
32namespace webrtc {
33
34// Checks that a channel cannot be set on a stopped |RtpTransceiver|.
35TEST(RtpTransceiverTest, CannotSetChannelOnStoppedTransceiver) {
36 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_AUDIO);
37 cricket::MockChannelInterface channel1;
38 sigslot::signal1<cricket::ChannelInterface*> signal;
39 EXPECT_CALL(channel1, media_type())
40 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
41 EXPECT_CALL(channel1, SignalFirstPacketReceived())
42 .WillRepeatedly(ReturnRef(signal));
43
44 transceiver.SetChannel(&channel1);
45 EXPECT_EQ(&channel1, transceiver.channel());
46
47 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020048 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080049 EXPECT_EQ(&channel1, transceiver.channel());
50
51 cricket::MockChannelInterface channel2;
52 EXPECT_CALL(channel2, media_type())
53 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_AUDIO));
54
55 // Channel can no longer be set, so this call should be a no-op.
56 transceiver.SetChannel(&channel2);
57 EXPECT_EQ(&channel1, transceiver.channel());
58}
59
60// Checks that a channel can be unset on a stopped |RtpTransceiver|
61TEST(RtpTransceiverTest, CanUnsetChannelOnStoppedTransceiver) {
62 RtpTransceiver transceiver(cricket::MediaType::MEDIA_TYPE_VIDEO);
63 cricket::MockChannelInterface channel;
64 sigslot::signal1<cricket::ChannelInterface*> signal;
65 EXPECT_CALL(channel, media_type())
66 .WillRepeatedly(Return(cricket::MediaType::MEDIA_TYPE_VIDEO));
67 EXPECT_CALL(channel, SignalFirstPacketReceived())
68 .WillRepeatedly(ReturnRef(signal));
69
70 transceiver.SetChannel(&channel);
71 EXPECT_EQ(&channel, transceiver.channel());
72
73 // Stop the transceiver.
Harald Alvestrand6060df52020-08-11 09:54:02 +020074 transceiver.StopInternal();
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080075 EXPECT_EQ(&channel, transceiver.channel());
76
77 // Set the channel to |nullptr|.
78 transceiver.SetChannel(nullptr);
79 EXPECT_EQ(nullptr, transceiver.channel());
80}
81
Harald Alvestrandc75c4282020-08-26 12:17:54 +000082class RtpTransceiverUnifiedPlanTest : public ::testing::Test {
83 public:
84 RtpTransceiverUnifiedPlanTest()
85 : channel_manager_(std::make_unique<cricket::FakeMediaEngine>(),
86 std::make_unique<cricket::FakeDataEngine>(),
87 rtc::Thread::Current(),
88 rtc::Thread::Current()),
89 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
90 rtc::Thread::Current(),
91 new rtc::RefCountedObject<MockRtpSenderInternal>()),
92 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
93 rtc::Thread::Current(),
94 new rtc::RefCountedObject<MockRtpReceiverInternal>()),
95 &channel_manager_,
Harald Alvestrand280054f2020-11-10 13:12:53 +000096 channel_manager_.GetSupportedAudioRtpHeaderExtensions(),
97 /* on_negotiation_needed= */ [] {}) {}
Harald Alvestrandc75c4282020-08-26 12:17:54 +000098
99 cricket::ChannelManager channel_manager_;
100 RtpTransceiver transceiver_;
101};
102
103// Basic tests for Stop()
104TEST_F(RtpTransceiverUnifiedPlanTest, StopSetsDirection) {
105 EXPECT_EQ(RtpTransceiverDirection::kInactive, transceiver_.direction());
106 EXPECT_FALSE(transceiver_.current_direction());
107 transceiver_.StopStandard();
108 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
109 EXPECT_FALSE(transceiver_.current_direction());
110 transceiver_.StopTransceiverProcedure();
111 EXPECT_TRUE(transceiver_.current_direction());
112 EXPECT_EQ(RtpTransceiverDirection::kStopped, transceiver_.direction());
113 EXPECT_EQ(RtpTransceiverDirection::kStopped,
114 *transceiver_.current_direction());
115}
116
Markus Handell755c65d2020-06-24 01:06:10 +0200117class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
118 public:
119 RtpTransceiverTestForHeaderExtensions()
120 : channel_manager_(std::make_unique<cricket::FakeMediaEngine>(),
121 std::make_unique<cricket::FakeDataEngine>(),
122 rtc::Thread::Current(),
123 rtc::Thread::Current()),
124 extensions_(
125 {RtpHeaderExtensionCapability("uri1",
126 1,
127 RtpTransceiverDirection::kSendOnly),
128 RtpHeaderExtensionCapability("uri2",
129 2,
130 RtpTransceiverDirection::kRecvOnly),
131 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
132 3,
133 RtpTransceiverDirection::kSendRecv),
134 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
135 4,
136 RtpTransceiverDirection::kSendRecv)}),
137 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
138 rtc::Thread::Current(),
139 new rtc::RefCountedObject<MockRtpSenderInternal>()),
140 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
141 rtc::Thread::Current(),
142 new rtc::RefCountedObject<MockRtpReceiverInternal>()),
143 &channel_manager_,
Harald Alvestrand280054f2020-11-10 13:12:53 +0000144 extensions_,
145 /* on_negotiation_needed= */ [] {}) {}
Markus Handell755c65d2020-06-24 01:06:10 +0200146
147 cricket::ChannelManager channel_manager_;
148 std::vector<RtpHeaderExtensionCapability> extensions_;
149 RtpTransceiver transceiver_;
150};
151
152TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
153 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
154}
155
156TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
157 auto modified_extensions = extensions_;
158 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
159 EXPECT_TRUE(
160 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
161 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
162 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
163 EXPECT_TRUE(
164 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
165 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
166 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
167 EXPECT_TRUE(
168 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
169 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
170 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
171 EXPECT_TRUE(
172 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
173 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
174}
175
176TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
177 auto modified_extensions = extensions_;
178 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
179 EXPECT_TRUE(
180 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
181 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
182}
183
184TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
185 std::vector<RtpHeaderExtensionCapability> modified_extensions(
186 {RtpHeaderExtensionCapability("uri3", 1,
187 RtpTransceiverDirection::kSendRecv)});
188 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
189 Property(&RTCError::type, RTCErrorType::INVALID_PARAMETER));
190 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
191}
192
193TEST_F(RtpTransceiverTestForHeaderExtensions,
194 RejectsStoppedMandatoryExtensions) {
195 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
196 // Attempting to stop the mandatory MID extension.
197 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
198 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
199 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
200 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
201 modified_extensions = extensions_;
202 // Attempting to stop the mandatory video orientation extension.
203 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
204 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
205 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
206 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
Markus Handell0357b3e2020-03-16 13:40:51 +0100207}
208
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800209} // namespace webrtc