| Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| index a62bcb225fc7c6111fed44c0a43507f1ecf7b353..19cceb4b99362298f5e281f6497c897f49996f0c 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| @@ -29,6 +29,8 @@
|
| #include "webrtc/base/byteorder.h"
|
| #include "webrtc/base/gunit.h"
|
| #include "webrtc/call.h"
|
| +#include "webrtc/p2p/base/faketransportcontroller.h"
|
| +#include "webrtc/test/field_trial.h"
|
| #include "talk/media/base/constants.h"
|
| #include "talk/media/base/fakemediaengine.h"
|
| #include "talk/media/base/fakenetworkinterface.h"
|
| @@ -36,7 +38,6 @@
|
| #include "talk/media/webrtc/fakewebrtccall.h"
|
| #include "talk/media/webrtc/fakewebrtcvoiceengine.h"
|
| #include "talk/media/webrtc/webrtcvoiceengine.h"
|
| -#include "webrtc/p2p/base/faketransportcontroller.h"
|
| #include "talk/session/media/channel.h"
|
|
|
| using cricket::kRtpAudioLevelHeaderExtension;
|
| @@ -74,10 +75,13 @@ class FakeVoEWrapper : public cricket::VoEWrapper {
|
|
|
| class WebRtcVoiceEngineTestFake : public testing::Test {
|
| public:
|
| - WebRtcVoiceEngineTestFake()
|
| + explicit WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
|
| +
|
| + explicit WebRtcVoiceEngineTestFake(const char* field_trials)
|
| : call_(webrtc::Call::Config()),
|
| engine_(new FakeVoEWrapper(&voe_)),
|
| - channel_(nullptr) {
|
| + channel_(nullptr),
|
| + override_field_trials_(field_trials) {
|
| send_parameters_.codecs.push_back(kPcmuCodec);
|
| recv_parameters_.codecs.push_back(kPcmuCodec);
|
| }
|
| @@ -281,6 +285,29 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
|
| EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
|
| }
|
|
|
| + void TestExtensionFilter(const std::vector<std::string>& extensions,
|
| + const std::string& expected_extension) {
|
| + EXPECT_TRUE(SetupEngineWithSendStream());
|
| + cricket::AudioSendParameters parameters = send_parameters_;
|
| + int expected_id = -1;
|
| + int id = 1;
|
| + for (const std::string& extension : extensions) {
|
| + if (extension == expected_extension)
|
| + expected_id = id;
|
| + parameters.extensions.push_back(
|
| + cricket::RtpHeaderExtension(extension, id++));
|
| + }
|
| + EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
| + const cricket::FakeAudioSendStream send_stream = GetSendStream(kSsrc1);
|
| +
|
| + // Verify that only one of them has been set, and that it is the one with
|
| + // highest priority (transport sequence number).
|
| + ASSERT_EQ(1u, send_stream.GetConfig().rtp.extensions.size());
|
| + EXPECT_EQ(expected_id, send_stream.GetConfig().rtp.extensions[0].id);
|
| + EXPECT_EQ(expected_extension,
|
| + send_stream.GetConfig().rtp.extensions[0].name);
|
| + }
|
| +
|
| webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
|
| webrtc::AudioSendStream::Stats stats;
|
| stats.local_ssrc = 12;
|
| @@ -399,6 +426,9 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
|
| cricket::VoiceMediaChannel* channel_;
|
| cricket::AudioSendParameters send_parameters_;
|
| cricket::AudioRecvParameters recv_parameters_;
|
| +
|
| + private:
|
| + webrtc::test::ScopedFieldTrials override_field_trials_;
|
| };
|
|
|
| // Tests that our stub library "works".
|
| @@ -433,6 +463,18 @@ TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
|
| }
|
| }
|
|
|
| +TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
|
| + const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
|
| + bool opus_found = false;
|
| + for (cricket::AudioCodec codec : codecs) {
|
| + if (codec.name == "opus") {
|
| + EXPECT_TRUE(HasTransportCc(codec));
|
| + opus_found = true;
|
| + }
|
| + }
|
| + EXPECT_TRUE(opus_found);
|
| +}
|
| +
|
| // Tests that we can find codecs by name or id, and that we interpret the
|
| // clockrate and bitrate fields properly.
|
| TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
|
| @@ -1276,6 +1318,29 @@ TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
|
| EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
|
| }
|
|
|
| +TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::AudioSendParameters send_parameters;
|
| + send_parameters.codecs.push_back(kOpusCodec);
|
| + EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
|
| + EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
|
| +
|
| + cricket::AudioRecvParameters recv_parameters;
|
| + recv_parameters.codecs.push_back(kOpusCodec);
|
| + EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
|
| + EXPECT_TRUE(
|
| + channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
|
| + ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
|
| + EXPECT_FALSE(
|
| + call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
|
| +
|
| + send_parameters.codecs = engine_.codecs();
|
| + EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
|
| + ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
|
| + EXPECT_TRUE(
|
| + call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
|
| +}
|
| +
|
| // Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
|
| TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
|
| EXPECT_TRUE(SetupEngineWithSendStream());
|
| @@ -1918,6 +1983,37 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
|
| EXPECT_FALSE(voe_.GetRED(channel_num));
|
| }
|
|
|
| +class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
|
| + public:
|
| + WebRtcVoiceEngineWithSendSideBweTest()
|
| + : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
|
| +};
|
| +
|
| +TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
|
| + SupportsTransportSequenceNumberHeaderExtension) {
|
| + cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
|
| + ASSERT_FALSE(capabilities.header_extensions.empty());
|
| + for (const cricket::RtpHeaderExtension& extension :
|
| + capabilities.header_extensions) {
|
| + if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
|
| + EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
|
| + extension.id);
|
| + return;
|
| + }
|
| + }
|
| + FAIL() << "Transport sequence number extension not in header-extension list.";
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
|
| + FiltersExtensionsPicksTransportSeqNum) {
|
| + // Enable three redundant extensions.
|
| + std::vector<std::string> extensions;
|
| + extensions.push_back(cricket::kRtpAbsoluteSenderTimeHeaderExtension);
|
| + extensions.push_back(cricket::kRtpTransportSequenceNumberHeaderExtension);
|
| + TestExtensionFilter(extensions,
|
| + cricket::kRtpTransportSequenceNumberHeaderExtension);
|
| +}
|
| +
|
| // Test support for audio level header extension.
|
| TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
|
| TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
|
|
|