blob: 55de03dd5150f0fc2b384646600268c1037b9afe [file] [log] [blame]
solenberg18f54272017-09-15 09:56:08 -07001/*
2 * Copyright (c) 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 "test/call_test.h"
Oleh Prypin4f36b7a2019-02-18 17:43:50 +000012#include "test/constants.h"
Per Kjellander914351d2019-02-15 10:54:55 +010013#include "test/field_trial.h"
solenberg18f54272017-09-15 09:56:08 -070014#include "test/gtest.h"
15#include "test/rtcp_packet_parser.h"
16
17namespace webrtc {
18namespace test {
19namespace {
20
21class AudioSendTest : public SendTest {
22 public:
23 AudioSendTest() : SendTest(CallTest::kDefaultTimeoutMs) {}
24
Yves Gerey665174f2018-06-19 15:03:05 +020025 size_t GetNumVideoStreams() const override { return 0; }
26 size_t GetNumAudioStreams() const override { return 1; }
27 size_t GetNumFlexfecStreams() const override { return 0; }
solenberg18f54272017-09-15 09:56:08 -070028};
29} // namespace
30
31using AudioSendStreamCallTest = CallTest;
32
33TEST_F(AudioSendStreamCallTest, SupportsCName) {
34 static std::string kCName = "PjqatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
35 class CNameObserver : public AudioSendTest {
36 public:
37 CNameObserver() = default;
38
39 private:
40 Action OnSendRtcp(const uint8_t* packet, size_t length) override {
41 RtcpPacketParser parser;
42 EXPECT_TRUE(parser.Parse(packet, length));
43 if (parser.sdes()->num_packets() > 0) {
44 EXPECT_EQ(1u, parser.sdes()->chunks().size());
45 EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname);
46
47 observation_complete_.Set();
48 }
49
50 return SEND_PACKET;
51 }
52
53 void ModifyAudioConfigs(
54 AudioSendStream::Config* send_config,
55 std::vector<AudioReceiveStream::Config>* receive_configs) override {
56 send_config->rtp.c_name = kCName;
57 }
58
59 void PerformTest() override {
60 EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
61 }
62 } test;
63
64 RunBaseTest(&test);
65}
66
67TEST_F(AudioSendStreamCallTest, NoExtensionsByDefault) {
68 class NoExtensionsObserver : public AudioSendTest {
69 public:
70 NoExtensionsObserver() = default;
71
72 private:
73 Action OnSendRtp(const uint8_t* packet, size_t length) override {
74 RTPHeader header;
75 EXPECT_TRUE(parser_->Parse(packet, length, &header));
76
77 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
78 EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
79 EXPECT_FALSE(header.extension.hasTransportSequenceNumber);
80 EXPECT_FALSE(header.extension.hasAudioLevel);
81 EXPECT_FALSE(header.extension.hasVideoRotation);
82 EXPECT_FALSE(header.extension.hasVideoContentType);
83 observation_complete_.Set();
84
85 return SEND_PACKET;
86 }
87
88 void ModifyAudioConfigs(
89 AudioSendStream::Config* send_config,
90 std::vector<AudioReceiveStream::Config>* receive_configs) override {
91 send_config->rtp.extensions.clear();
92 }
93
94 void PerformTest() override {
95 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
96 }
97 } test;
98
99 RunBaseTest(&test);
100}
101
102TEST_F(AudioSendStreamCallTest, SupportsAudioLevel) {
103 class AudioLevelObserver : public AudioSendTest {
104 public:
105 AudioLevelObserver() : AudioSendTest() {
Oleh Prypin4f36b7a2019-02-18 17:43:50 +0000106 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
107 kRtpExtensionAudioLevel, test::kAudioLevelExtensionId));
solenberg18f54272017-09-15 09:56:08 -0700108 }
109
110 Action OnSendRtp(const uint8_t* packet, size_t length) override {
111 RTPHeader header;
112 EXPECT_TRUE(parser_->Parse(packet, length, &header));
113
114 EXPECT_TRUE(header.extension.hasAudioLevel);
115 if (header.extension.audioLevel != 0) {
116 // Wait for at least one packet with a non-zero level.
117 observation_complete_.Set();
118 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100119 RTC_LOG(LS_WARNING) << "Got a packet with zero audioLevel - waiting"
120 " for another packet...";
solenberg18f54272017-09-15 09:56:08 -0700121 }
122
123 return SEND_PACKET;
124 }
125
126 void ModifyAudioConfigs(
127 AudioSendStream::Config* send_config,
128 std::vector<AudioReceiveStream::Config>* receive_configs) override {
129 send_config->rtp.extensions.clear();
Oleh Prypin4f36b7a2019-02-18 17:43:50 +0000130 send_config->rtp.extensions.push_back(RtpExtension(
131 RtpExtension::kAudioLevelUri, test::kAudioLevelExtensionId));
solenberg18f54272017-09-15 09:56:08 -0700132 }
133
134 void PerformTest() override {
135 EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
136 }
137 } test;
138
139 RunBaseTest(&test);
140}
141
Per Kjellander914351d2019-02-15 10:54:55 +0100142class TransportWideSequenceNumberObserver : public AudioSendTest {
143 public:
144 explicit TransportWideSequenceNumberObserver(bool expect_sequence_number)
145 : AudioSendTest(), expect_sequence_number_(expect_sequence_number) {
146 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
147 kRtpExtensionTransportSequenceNumber,
148 kTransportSequenceNumberExtensionId));
149 }
solenberg18f54272017-09-15 09:56:08 -0700150
Per Kjellander914351d2019-02-15 10:54:55 +0100151 private:
152 Action OnSendRtp(const uint8_t* packet, size_t length) override {
153 RTPHeader header;
154 EXPECT_TRUE(parser_->Parse(packet, length, &header));
solenberg18f54272017-09-15 09:56:08 -0700155
Per Kjellander914351d2019-02-15 10:54:55 +0100156 EXPECT_EQ(header.extension.hasTransportSequenceNumber,
157 expect_sequence_number_);
158 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
159 EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
solenberg18f54272017-09-15 09:56:08 -0700160
Per Kjellander914351d2019-02-15 10:54:55 +0100161 observation_complete_.Set();
solenberg18f54272017-09-15 09:56:08 -0700162
Per Kjellander914351d2019-02-15 10:54:55 +0100163 return SEND_PACKET;
164 }
solenberg18f54272017-09-15 09:56:08 -0700165
Per Kjellander914351d2019-02-15 10:54:55 +0100166 void ModifyAudioConfigs(
167 AudioSendStream::Config* send_config,
168 std::vector<AudioReceiveStream::Config>* receive_configs) override {
169 send_config->rtp.extensions.clear();
170 send_config->rtp.extensions.push_back(
171 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
172 kTransportSequenceNumberExtensionId));
173 }
solenberg18f54272017-09-15 09:56:08 -0700174
Per Kjellander914351d2019-02-15 10:54:55 +0100175 void PerformTest() override {
176 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
177 }
178 const bool expect_sequence_number_;
179};
solenberg18f54272017-09-15 09:56:08 -0700180
Per Kjellander914351d2019-02-15 10:54:55 +0100181TEST_F(AudioSendStreamCallTest, SendsTransportWideSequenceNumbersInFieldTrial) {
182 ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
183 TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/true);
184 RunBaseTest(&test);
185}
186
187TEST_F(AudioSendStreamCallTest,
188 DoesNotSendTransportWideSequenceNumbersPerDefault) {
189 TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/false);
solenberg18f54272017-09-15 09:56:08 -0700190 RunBaseTest(&test);
191}
192
193TEST_F(AudioSendStreamCallTest, SendDtmf) {
194 static const uint8_t kDtmfPayloadType = 120;
195 static const int kDtmfPayloadFrequency = 8000;
196 static const int kDtmfEventFirst = 12;
197 static const int kDtmfEventLast = 31;
198 static const int kDtmfDuration = 50;
199 class DtmfObserver : public AudioSendTest {
200 public:
201 DtmfObserver() = default;
202
203 private:
204 Action OnSendRtp(const uint8_t* packet, size_t length) override {
205 RTPHeader header;
206 EXPECT_TRUE(parser_->Parse(packet, length, &header));
207
208 if (header.payloadType == kDtmfPayloadType) {
209 EXPECT_EQ(12u, header.headerLength);
210 EXPECT_EQ(16u, length);
211 const int event = packet[12];
212 if (event != expected_dtmf_event_) {
213 ++expected_dtmf_event_;
214 EXPECT_EQ(event, expected_dtmf_event_);
215 if (expected_dtmf_event_ == kDtmfEventLast) {
216 observation_complete_.Set();
217 }
218 }
219 }
220
221 return SEND_PACKET;
222 }
223
224 void OnAudioStreamsCreated(
225 AudioSendStream* send_stream,
226 const std::vector<AudioReceiveStream*>& receive_streams) override {
227 // Need to start stream here, else DTMF events are dropped.
228 send_stream->Start();
229 for (int event = kDtmfEventFirst; event <= kDtmfEventLast; ++event) {
230 send_stream->SendTelephoneEvent(kDtmfPayloadType, kDtmfPayloadFrequency,
231 event, kDtmfDuration);
232 }
233 }
234
235 void PerformTest() override {
236 EXPECT_TRUE(Wait()) << "Timed out while waiting for DTMF stream.";
237 }
238
239 int expected_dtmf_event_ = kDtmfEventFirst;
240 } test;
241
242 RunBaseTest(&test);
243}
244
245} // namespace test
246} // namespace webrtc