blob: 8a83554b532411386d339a0f4434c2941df49654 [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
Elad Alond8d32482019-02-18 23:45:57 +010011#include <string>
12#include <utility>
13#include <vector>
14
solenberg18f54272017-09-15 09:56:08 -070015#include "test/call_test.h"
Per Kjellander914351d2019-02-15 10:54:55 +010016#include "test/field_trial.h"
solenberg18f54272017-09-15 09:56:08 -070017#include "test/gtest.h"
18#include "test/rtcp_packet_parser.h"
19
20namespace webrtc {
21namespace test {
22namespace {
23
Elad Alond8d32482019-02-18 23:45:57 +010024enum : int { // The first valid value is 1.
25 kAudioLevelExtensionId = 1,
26 kTransportSequenceNumberExtensionId,
27};
28
solenberg18f54272017-09-15 09:56:08 -070029class AudioSendTest : public SendTest {
30 public:
31 AudioSendTest() : SendTest(CallTest::kDefaultTimeoutMs) {}
32
Yves Gerey665174f2018-06-19 15:03:05 +020033 size_t GetNumVideoStreams() const override { return 0; }
34 size_t GetNumAudioStreams() const override { return 1; }
35 size_t GetNumFlexfecStreams() const override { return 0; }
solenberg18f54272017-09-15 09:56:08 -070036};
37} // namespace
38
39using AudioSendStreamCallTest = CallTest;
40
41TEST_F(AudioSendStreamCallTest, SupportsCName) {
42 static std::string kCName = "PjqatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
43 class CNameObserver : public AudioSendTest {
44 public:
45 CNameObserver() = default;
46
47 private:
48 Action OnSendRtcp(const uint8_t* packet, size_t length) override {
49 RtcpPacketParser parser;
50 EXPECT_TRUE(parser.Parse(packet, length));
51 if (parser.sdes()->num_packets() > 0) {
52 EXPECT_EQ(1u, parser.sdes()->chunks().size());
53 EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname);
54
55 observation_complete_.Set();
56 }
57
58 return SEND_PACKET;
59 }
60
61 void ModifyAudioConfigs(
62 AudioSendStream::Config* send_config,
63 std::vector<AudioReceiveStream::Config>* receive_configs) override {
64 send_config->rtp.c_name = kCName;
65 }
66
67 void PerformTest() override {
68 EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
69 }
70 } test;
71
72 RunBaseTest(&test);
73}
74
75TEST_F(AudioSendStreamCallTest, NoExtensionsByDefault) {
76 class NoExtensionsObserver : public AudioSendTest {
77 public:
78 NoExtensionsObserver() = default;
79
80 private:
81 Action OnSendRtp(const uint8_t* packet, size_t length) override {
82 RTPHeader header;
83 EXPECT_TRUE(parser_->Parse(packet, length, &header));
84
85 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
86 EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
87 EXPECT_FALSE(header.extension.hasTransportSequenceNumber);
88 EXPECT_FALSE(header.extension.hasAudioLevel);
89 EXPECT_FALSE(header.extension.hasVideoRotation);
90 EXPECT_FALSE(header.extension.hasVideoContentType);
91 observation_complete_.Set();
92
93 return SEND_PACKET;
94 }
95
96 void ModifyAudioConfigs(
97 AudioSendStream::Config* send_config,
98 std::vector<AudioReceiveStream::Config>* receive_configs) override {
99 send_config->rtp.extensions.clear();
100 }
101
102 void PerformTest() override {
103 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
104 }
105 } test;
106
107 RunBaseTest(&test);
108}
109
110TEST_F(AudioSendStreamCallTest, SupportsAudioLevel) {
111 class AudioLevelObserver : public AudioSendTest {
112 public:
113 AudioLevelObserver() : AudioSendTest() {
Elad Alond8d32482019-02-18 23:45:57 +0100114 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
115 kAudioLevelExtensionId));
solenberg18f54272017-09-15 09:56:08 -0700116 }
117
118 Action OnSendRtp(const uint8_t* packet, size_t length) override {
119 RTPHeader header;
120 EXPECT_TRUE(parser_->Parse(packet, length, &header));
121
122 EXPECT_TRUE(header.extension.hasAudioLevel);
123 if (header.extension.audioLevel != 0) {
124 // Wait for at least one packet with a non-zero level.
125 observation_complete_.Set();
126 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100127 RTC_LOG(LS_WARNING) << "Got a packet with zero audioLevel - waiting"
128 " for another packet...";
solenberg18f54272017-09-15 09:56:08 -0700129 }
130
131 return SEND_PACKET;
132 }
133
134 void ModifyAudioConfigs(
135 AudioSendStream::Config* send_config,
136 std::vector<AudioReceiveStream::Config>* receive_configs) override {
137 send_config->rtp.extensions.clear();
Elad Alond8d32482019-02-18 23:45:57 +0100138 send_config->rtp.extensions.push_back(
139 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelExtensionId));
solenberg18f54272017-09-15 09:56:08 -0700140 }
141
142 void PerformTest() override {
143 EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
144 }
145 } test;
146
147 RunBaseTest(&test);
148}
149
Per Kjellander914351d2019-02-15 10:54:55 +0100150class TransportWideSequenceNumberObserver : public AudioSendTest {
151 public:
152 explicit TransportWideSequenceNumberObserver(bool expect_sequence_number)
153 : AudioSendTest(), expect_sequence_number_(expect_sequence_number) {
154 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
155 kRtpExtensionTransportSequenceNumber,
156 kTransportSequenceNumberExtensionId));
157 }
solenberg18f54272017-09-15 09:56:08 -0700158
Per Kjellander914351d2019-02-15 10:54:55 +0100159 private:
160 Action OnSendRtp(const uint8_t* packet, size_t length) override {
161 RTPHeader header;
162 EXPECT_TRUE(parser_->Parse(packet, length, &header));
solenberg18f54272017-09-15 09:56:08 -0700163
Per Kjellander914351d2019-02-15 10:54:55 +0100164 EXPECT_EQ(header.extension.hasTransportSequenceNumber,
165 expect_sequence_number_);
166 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
167 EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
solenberg18f54272017-09-15 09:56:08 -0700168
Per Kjellander914351d2019-02-15 10:54:55 +0100169 observation_complete_.Set();
solenberg18f54272017-09-15 09:56:08 -0700170
Per Kjellander914351d2019-02-15 10:54:55 +0100171 return SEND_PACKET;
172 }
solenberg18f54272017-09-15 09:56:08 -0700173
Per Kjellander914351d2019-02-15 10:54:55 +0100174 void ModifyAudioConfigs(
175 AudioSendStream::Config* send_config,
176 std::vector<AudioReceiveStream::Config>* receive_configs) override {
177 send_config->rtp.extensions.clear();
178 send_config->rtp.extensions.push_back(
179 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
180 kTransportSequenceNumberExtensionId));
181 }
solenberg18f54272017-09-15 09:56:08 -0700182
Per Kjellander914351d2019-02-15 10:54:55 +0100183 void PerformTest() override {
184 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
185 }
186 const bool expect_sequence_number_;
187};
solenberg18f54272017-09-15 09:56:08 -0700188
Per Kjellander914351d2019-02-15 10:54:55 +0100189TEST_F(AudioSendStreamCallTest, SendsTransportWideSequenceNumbersInFieldTrial) {
190 ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
191 TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/true);
192 RunBaseTest(&test);
193}
194
195TEST_F(AudioSendStreamCallTest,
196 DoesNotSendTransportWideSequenceNumbersPerDefault) {
197 TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/false);
solenberg18f54272017-09-15 09:56:08 -0700198 RunBaseTest(&test);
199}
200
201TEST_F(AudioSendStreamCallTest, SendDtmf) {
202 static const uint8_t kDtmfPayloadType = 120;
203 static const int kDtmfPayloadFrequency = 8000;
204 static const int kDtmfEventFirst = 12;
205 static const int kDtmfEventLast = 31;
206 static const int kDtmfDuration = 50;
207 class DtmfObserver : public AudioSendTest {
208 public:
209 DtmfObserver() = default;
210
211 private:
212 Action OnSendRtp(const uint8_t* packet, size_t length) override {
213 RTPHeader header;
214 EXPECT_TRUE(parser_->Parse(packet, length, &header));
215
216 if (header.payloadType == kDtmfPayloadType) {
217 EXPECT_EQ(12u, header.headerLength);
218 EXPECT_EQ(16u, length);
219 const int event = packet[12];
220 if (event != expected_dtmf_event_) {
221 ++expected_dtmf_event_;
222 EXPECT_EQ(event, expected_dtmf_event_);
223 if (expected_dtmf_event_ == kDtmfEventLast) {
224 observation_complete_.Set();
225 }
226 }
227 }
228
229 return SEND_PACKET;
230 }
231
232 void OnAudioStreamsCreated(
233 AudioSendStream* send_stream,
234 const std::vector<AudioReceiveStream*>& receive_streams) override {
235 // Need to start stream here, else DTMF events are dropped.
236 send_stream->Start();
237 for (int event = kDtmfEventFirst; event <= kDtmfEventLast; ++event) {
238 send_stream->SendTelephoneEvent(kDtmfPayloadType, kDtmfPayloadFrequency,
239 event, kDtmfDuration);
240 }
241 }
242
243 void PerformTest() override {
244 EXPECT_TRUE(Wait()) << "Timed out while waiting for DTMF stream.";
245 }
246
247 int expected_dtmf_event_ = kDtmfEventFirst;
248 } test;
249
250 RunBaseTest(&test);
251}
252
253} // namespace test
254} // namespace webrtc