1 /*
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
13 #include "pc/rtp_transceiver.h"
14
15 #include <memory>
16
17 #include "media/base/fake_media_engine.h"
18 #include "pc/test/mock_channel_interface.h"
19 #include "pc/test/mock_rtp_receiver_internal.h"
20 #include "pc/test/mock_rtp_sender_internal.h"
21 #include "test/gmock.h"
22 #include "test/gtest.h"
23
24 using ::testing::ElementsAre;
25 using ::testing::Eq;
26 using ::testing::Field;
27 using ::testing::Not;
28 using ::testing::Property;
29 using ::testing::Return;
30 using ::testing::ReturnRef;
31
32 namespace webrtc {
33
34 // Checks that a channel cannot be set on a stopped |RtpTransceiver|.
TEST(RtpTransceiverTest,CannotSetChannelOnStoppedTransceiver)35 TEST(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.
48 transceiver.Stop();
49 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|
TEST(RtpTransceiverTest,CanUnsetChannelOnStoppedTransceiver)61 TEST(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.
74 transceiver.Stop();
75 EXPECT_EQ(&channel, transceiver.channel());
76
77 // Set the channel to |nullptr|.
78 transceiver.SetChannel(nullptr);
79 EXPECT_EQ(nullptr, transceiver.channel());
80 }
81
82 class RtpTransceiverTestForHeaderExtensions : public ::testing::Test {
83 public:
RtpTransceiverTestForHeaderExtensions()84 RtpTransceiverTestForHeaderExtensions()
85 : channel_manager_(std::make_unique<cricket::FakeMediaEngine>(),
86 std::make_unique<cricket::FakeDataEngine>(),
87 rtc::Thread::Current(),
88 rtc::Thread::Current()),
89 extensions_(
90 {RtpHeaderExtensionCapability("uri1",
91 1,
92 RtpTransceiverDirection::kSendOnly),
93 RtpHeaderExtensionCapability("uri2",
94 2,
95 RtpTransceiverDirection::kRecvOnly),
96 RtpHeaderExtensionCapability(RtpExtension::kMidUri,
97 3,
98 RtpTransceiverDirection::kSendRecv),
99 RtpHeaderExtensionCapability(RtpExtension::kVideoRotationUri,
100 4,
101 RtpTransceiverDirection::kSendRecv)}),
102 transceiver_(RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
103 rtc::Thread::Current(),
104 new rtc::RefCountedObject<MockRtpSenderInternal>()),
105 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
106 rtc::Thread::Current(),
107 new rtc::RefCountedObject<MockRtpReceiverInternal>()),
108 &channel_manager_,
109 extensions_) {}
110
111 cricket::ChannelManager channel_manager_;
112 std::vector<RtpHeaderExtensionCapability> extensions_;
113 RtpTransceiver transceiver_;
114 };
115
TEST_F(RtpTransceiverTestForHeaderExtensions,OffersChannelManagerList)116 TEST_F(RtpTransceiverTestForHeaderExtensions, OffersChannelManagerList) {
117 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
118 }
119
TEST_F(RtpTransceiverTestForHeaderExtensions,ModifiesDirection)120 TEST_F(RtpTransceiverTestForHeaderExtensions, ModifiesDirection) {
121 auto modified_extensions = extensions_;
122 modified_extensions[0].direction = RtpTransceiverDirection::kSendOnly;
123 EXPECT_TRUE(
124 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
125 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
126 modified_extensions[0].direction = RtpTransceiverDirection::kRecvOnly;
127 EXPECT_TRUE(
128 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
129 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
130 modified_extensions[0].direction = RtpTransceiverDirection::kSendRecv;
131 EXPECT_TRUE(
132 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
133 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
134 modified_extensions[0].direction = RtpTransceiverDirection::kInactive;
135 EXPECT_TRUE(
136 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
137 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
138 }
139
TEST_F(RtpTransceiverTestForHeaderExtensions,AcceptsStoppedExtension)140 TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
141 auto modified_extensions = extensions_;
142 modified_extensions[0].direction = RtpTransceiverDirection::kStopped;
143 EXPECT_TRUE(
144 transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions).ok());
145 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), modified_extensions);
146 }
147
TEST_F(RtpTransceiverTestForHeaderExtensions,RejectsUnsupportedExtension)148 TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
149 std::vector<RtpHeaderExtensionCapability> modified_extensions(
150 {RtpHeaderExtensionCapability("uri3", 1,
151 RtpTransceiverDirection::kSendRecv)});
152 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
153 Property(&RTCError::type, RTCErrorType::INVALID_PARAMETER));
154 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
155 }
156
TEST_F(RtpTransceiverTestForHeaderExtensions,RejectsStoppedMandatoryExtensions)157 TEST_F(RtpTransceiverTestForHeaderExtensions,
158 RejectsStoppedMandatoryExtensions) {
159 std::vector<RtpHeaderExtensionCapability> modified_extensions = extensions_;
160 // Attempting to stop the mandatory MID extension.
161 modified_extensions[2].direction = RtpTransceiverDirection::kStopped;
162 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
163 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
164 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
165 modified_extensions = extensions_;
166 // Attempting to stop the mandatory video orientation extension.
167 modified_extensions[3].direction = RtpTransceiverDirection::kStopped;
168 EXPECT_THAT(transceiver_.SetOfferedRtpHeaderExtensions(modified_extensions),
169 Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
170 EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
171 }
172
173 } // namespace webrtc
174