| Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| index ef87c74e5814bbccb3ac02fc6f9de3e68e901d51..1daf58d3770a3cce2f584822e246dfa41333bbdb 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
|
| @@ -24,11 +24,6 @@
|
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| -#ifdef WIN32
|
| -#include "webrtc/base/win32.h"
|
| -#include <objbase.h>
|
| -#endif
|
|
|
| #include "webrtc/base/byteorder.h"
|
| #include "webrtc/base/gunit.h"
|
| @@ -3135,16 +3130,6 @@
|
| EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
|
| }
|
|
|
| -TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
|
| - cricket::WebRtcVoiceEngine engine;
|
| - cricket::AudioOptions options = engine.GetOptions();
|
| - // The default options should have at least a few things set. We purposefully
|
| - // don't check the option values here, though.
|
| - EXPECT_TRUE(options.echo_cancellation.IsSet());
|
| - EXPECT_TRUE(options.auto_gain_control.IsSet());
|
| - EXPECT_TRUE(options.noise_suppression.IsSet());
|
| -}
|
| -
|
| // Test that GetReceiveChannelNum returns the default channel for the first
|
| // recv stream in 1-1 calls.
|
| TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) {
|
| @@ -3194,7 +3179,328 @@
|
| EXPECT_DOUBLE_EQ(1, right);
|
| }
|
|
|
| +TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| + const uint32 kAudioSsrc = 123;
|
| + const std::string kSyncLabel = "AvSyncLabel";
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + media_channel->SetCall(&call);
|
| + cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
|
| + sp.sync_label = kSyncLabel;
|
| + // Creating two channels to make sure that sync label is set properly for both
|
| + // the default voice channel and following ones.
|
| + EXPECT_TRUE(channel_->AddRecvStream(sp));
|
| + sp.ssrcs[0] += 1;
|
| + EXPECT_TRUE(channel_->AddRecvStream(sp));
|
| +
|
| + ASSERT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + EXPECT_EQ(kSyncLabel,
|
| + call.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
|
| + << "SyncGroup should be set based on sync_label";
|
| + EXPECT_EQ(kSyncLabel,
|
| + call.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
|
| + << "SyncGroup should be set based on sync_label";
|
| +
|
| + media_channel->SetCall(nullptr);
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
|
| + // Test that changing the combined_audio_video_bwe option results in the
|
| + // expected state changes on an associated Call.
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| + const uint32 kAudioSsrc1 = 223;
|
| + const uint32 kAudioSsrc2 = 224;
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + const auto& rtp_extensions = engine_.rtp_header_extensions();
|
| + media_channel->SetRecvRtpHeaderExtensions(rtp_extensions);
|
| + media_channel->SetCall(&call);
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kAudioSsrc1)));
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kAudioSsrc2)));
|
| +
|
| + // Combined BWE should not be set up yet.
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| + EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| +
|
| + // Enable combined BWE option - now it should be set up.
|
| + cricket::AudioOptions options;
|
| + options.combined_audio_video_bwe.Set(true);
|
| + EXPECT_TRUE(media_channel->SetOptions(options));
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + EXPECT_TRUE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| + EXPECT_TRUE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| +
|
| + // Disable combined BWE option - should be disabled again.
|
| + options.combined_audio_video_bwe.Set(false);
|
| + EXPECT_TRUE(media_channel->SetOptions(options));
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| + EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| +
|
| + media_channel->SetCall(nullptr);
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, SetCallConfiguresAudioReceiveChannels) {
|
| + // Test that calling SetCall() on the voice media channel results in the
|
| + // expected state changes in Call.
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| + cricket::FakeCall call2((webrtc::Call::Config()));
|
| + const uint32 kAudioSsrc1 = 223;
|
| + const uint32 kAudioSsrc2 = 224;
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kAudioSsrc1)));
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kAudioSsrc2)));
|
| +
|
| + // Combined BWE should not be set up yet.
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| +
|
| + // Register - should be enabled.
|
| + media_channel->SetCall(&call);
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + EXPECT_NE(nullptr, call.GetAudioReceiveStream(kAudioSsrc1));
|
| + EXPECT_NE(nullptr, call.GetAudioReceiveStream(kAudioSsrc2));
|
| +
|
| + // Re-register - should now be enabled on new call.
|
| + media_channel->SetCall(&call2);
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| + EXPECT_EQ(2, call2.GetAudioReceiveStreams().size());
|
| + EXPECT_NE(nullptr, call2.GetAudioReceiveStream(kAudioSsrc1));
|
| + EXPECT_NE(nullptr, call2.GetAudioReceiveStream(kAudioSsrc2));
|
| +
|
| + // Unregister - should be disabled again.
|
| + media_channel->SetCall(nullptr);
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
|
| + // Test that adding receive streams after enabling combined bandwidth
|
| + // estimation will correctly configure each channel.
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + media_channel->SetCall(&call);
|
| + cricket::AudioOptions options;
|
| + options.combined_audio_video_bwe.Set(true);
|
| + EXPECT_TRUE(media_channel->SetOptions(options));
|
| +
|
| + static const uint32 kSsrcs[] = {1, 2, 3, 4};
|
| + for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kSsrcs[i])));
|
| + EXPECT_NE(nullptr, call.GetAudioReceiveStream(kSsrcs[i]));
|
| + EXPECT_TRUE(call.GetAudioReceiveStream(kSsrcs[i])
|
| + ->GetConfig()
|
| + .combined_audio_video_bwe);
|
| + }
|
| + EXPECT_EQ(ARRAY_SIZE(kSsrcs), call.GetAudioReceiveStreams().size());
|
| +
|
| + media_channel->SetCall(nullptr);
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
|
| + // Test that setting the header extensions results in the expected state
|
| + // changes on an associated Call.
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| + std::vector<uint32> ssrcs;
|
| + ssrcs.push_back(223);
|
| + ssrcs.push_back(224);
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + media_channel->SetCall(&call);
|
| + for (uint32 ssrc : ssrcs) {
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(ssrc)));
|
| + }
|
| +
|
| + // Combined BWE should be set up, but with no configured extensions.
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + for (uint32 ssrc : ssrcs) {
|
| + const auto* s = call.GetAudioReceiveStream(ssrc);
|
| + EXPECT_NE(nullptr, s);
|
| + EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
| + }
|
| +
|
| + // Set up receive extensions.
|
| + const auto& e_exts = engine_.rtp_header_extensions();
|
| + channel_->SetRecvRtpHeaderExtensions(e_exts);
|
| + EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| + for (uint32 ssrc : ssrcs) {
|
| + const auto* s = call.GetAudioReceiveStream(ssrc);
|
| + EXPECT_NE(nullptr, s);
|
| + const auto& s_exts = s->GetConfig().rtp.extensions;
|
| + EXPECT_EQ(e_exts.size(), s_exts.size());
|
| + for (const auto& e_ext : e_exts) {
|
| + for (const auto& s_ext : s_exts) {
|
| + if (e_ext.id == s_ext.id) {
|
| + EXPECT_EQ(e_ext.uri, s_ext.name);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + // Disable receive extensions.
|
| + std::vector<cricket::RtpHeaderExtension> extensions;
|
| + channel_->SetRecvRtpHeaderExtensions(extensions);
|
| + for (uint32 ssrc : ssrcs) {
|
| + const auto* s = call.GetAudioReceiveStream(ssrc);
|
| + EXPECT_NE(nullptr, s);
|
| + EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
| + }
|
| +
|
| + media_channel->SetCall(nullptr);
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
|
| + // Test that packets are forwarded to the Call when configured accordingly.
|
| + cricket::FakeCall call((webrtc::Call::Config()));
|
| + const uint32 kAudioSsrc = 1;
|
| + rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| + static const unsigned char kRtcp[] = {
|
| + 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
|
| + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
| + };
|
| + rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
|
| +
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + cricket::AudioOptions options;
|
| + options.combined_audio_video_bwe.Set(true);
|
| + EXPECT_TRUE(media_channel->SetOptions(options));
|
| + EXPECT_TRUE(media_channel->AddRecvStream(
|
| + cricket::StreamParams::CreateLegacy(kAudioSsrc)));
|
| +
|
| + // Call not set on media channel, so no packets can be forwarded.
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| + channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
|
| + channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
|
| + EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| +
|
| + // Set Call, now there should be a receive stream which is forwarded packets.
|
| + media_channel->SetCall(&call);
|
| + EXPECT_EQ(1, call.GetAudioReceiveStreams().size());
|
| + const cricket::FakeAudioReceiveStream* s =
|
| + call.GetAudioReceiveStream(kAudioSsrc);
|
| + EXPECT_EQ(0, s->received_packets());
|
| + channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
|
| + EXPECT_EQ(1, s->received_packets());
|
| + channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
|
| + EXPECT_EQ(2, s->received_packets());
|
| +
|
| + media_channel->SetCall(nullptr);
|
| +}
|
| +
|
| +// Associate channel should not set on 1:1 call, since the receive channel also
|
| +// sends RTCP SR.
|
| +TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
|
| + EXPECT_TRUE(SetupEngine());
|
| + EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| + int recv_ch = voe_.GetLastChannel();
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
|
| +}
|
| +
|
| +// This test is an extension of AssociateChannelUnset1On1. We create two receive
|
| +// channels. The second should be associated with the default channel, since it
|
| +// does not send RTCP SR.
|
| +TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
|
| + EXPECT_TRUE(SetupEngine());
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + int default_channel = media_channel->voe_channel();
|
| + EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| + int recv_ch_1 = voe_.GetLastChannel();
|
| + EXPECT_EQ(recv_ch_1, default_channel);
|
| + EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
| + int recv_ch_2 = voe_.GetLastChannel();
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
|
| + // Add send stream, the association remains.
|
| + EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
|
| +}
|
| +
|
| +// In conference mode, all receive channels should be associated with the
|
| +// default channel, since they do not send RTCP SR.
|
| +TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
|
| + EXPECT_TRUE(SetupEngine());
|
| + EXPECT_TRUE(channel_->SetOptions(options_conference_));
|
| + cricket::WebRtcVoiceMediaChannel* media_channel =
|
| + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| + int default_channel = media_channel->voe_channel();
|
| + EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| + int recv_ch = voe_.GetLastChannel();
|
| + EXPECT_NE(recv_ch, default_channel);
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
| + EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
| +}
|
| +
|
| +TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
|
| + EXPECT_TRUE(SetupEngine());
|
| + EXPECT_TRUE(channel_->SetOptions(options_conference_));
|
| +
|
| + EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| + int recv_ch = voe_.GetLastChannel();
|
| +
|
| + EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
| + int send_ch = voe_.GetLastChannel();
|
| +
|
| + // Manually associate |recv_ch| to |send_ch|. This test is to verify a
|
| + // deleting logic, i.e., deleting |send_ch| will reset the associate send
|
| + // channel of |recv_ch|.This is not a common case, since, normally, only the
|
| + // default channel can be associated. However, the default is not deletable.
|
| + // So we force the |recv_ch| to associate with a non-default channel.
|
| + EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
|
| +
|
| + EXPECT_TRUE(channel_->RemoveSendStream(2));
|
| + EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
|
| +}
|
| +
|
| // Tests for the actual WebRtc VoE library.
|
| +
|
| +TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
|
| + cricket::WebRtcVoiceEngine engine;
|
| + cricket::AudioOptions options = engine.GetOptions();
|
| + // The default options should have at least a few things set. We purposefully
|
| + // don't check the option values here, though.
|
| + EXPECT_TRUE(options.echo_cancellation.IsSet());
|
| + EXPECT_TRUE(options.auto_gain_control.IsSet());
|
| + EXPECT_TRUE(options.noise_suppression.IsSet());
|
| +}
|
|
|
| // Tests that the library initializes and shuts down properly.
|
| TEST(WebRtcVoiceEngineTest, StartupShutdown) {
|
| @@ -3325,341 +3631,3 @@
|
| cricket::WebRtcVoiceMediaChannel channel(&engine);
|
| EXPECT_TRUE(channel.SetRecvCodecs(engine.codecs()));
|
| }
|
| -
|
| -#ifdef WIN32
|
| -// Test our workarounds to WebRtc VoE' munging of the coinit count
|
| -TEST(WebRtcVoiceEngineTest, CoInitialize) {
|
| - cricket::WebRtcVoiceEngine* engine = new cricket::WebRtcVoiceEngine();
|
| -
|
| - // Initial refcount should be 0.
|
| - EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
| -
|
| - // Engine should start even with COM already inited.
|
| - EXPECT_TRUE(engine->Init(rtc::Thread::Current()));
|
| - engine->Terminate();
|
| - EXPECT_TRUE(engine->Init(rtc::Thread::Current()));
|
| - engine->Terminate();
|
| -
|
| - // Refcount after terminate should be 1 (in reality 3); test if it is nonzero.
|
| - EXPECT_EQ(S_FALSE, CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
| - // Decrement refcount to (hopefully) 0.
|
| - CoUninitialize();
|
| - CoUninitialize();
|
| - delete engine;
|
| -
|
| - // Ensure refcount is 0.
|
| - EXPECT_EQ(S_OK, CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
| - CoUninitialize();
|
| -}
|
| -#endif
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| - const uint32 kAudioSsrc = 123;
|
| - const std::string kSyncLabel = "AvSyncLabel";
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - media_channel->SetCall(&call);
|
| - cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
|
| - sp.sync_label = kSyncLabel;
|
| - // Creating two channels to make sure that sync label is set properly for both
|
| - // the default voice channel and following ones.
|
| - EXPECT_TRUE(channel_->AddRecvStream(sp));
|
| - sp.ssrcs[0] += 1;
|
| - EXPECT_TRUE(channel_->AddRecvStream(sp));
|
| -
|
| - ASSERT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - EXPECT_EQ(kSyncLabel,
|
| - call.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
|
| - << "SyncGroup should be set based on sync_label";
|
| - EXPECT_EQ(kSyncLabel,
|
| - call.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
|
| - << "SyncGroup should be set based on sync_label";
|
| -
|
| - media_channel->SetCall(nullptr);
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
|
| - // Test that changing the combined_audio_video_bwe option results in the
|
| - // expected state changes on an associated Call.
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| - const uint32 kAudioSsrc1 = 223;
|
| - const uint32 kAudioSsrc2 = 224;
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - const auto& rtp_extensions = engine_.rtp_header_extensions();
|
| - media_channel->SetRecvRtpHeaderExtensions(rtp_extensions);
|
| - media_channel->SetCall(&call);
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kAudioSsrc1)));
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kAudioSsrc2)));
|
| -
|
| - // Combined BWE should not be set up yet.
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| - EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| -
|
| - // Enable combined BWE option - now it should be set up.
|
| - cricket::AudioOptions options;
|
| - options.combined_audio_video_bwe.Set(true);
|
| - EXPECT_TRUE(media_channel->SetOptions(options));
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - EXPECT_TRUE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| - EXPECT_TRUE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| -
|
| - // Disable combined BWE option - should be disabled again.
|
| - options.combined_audio_video_bwe.Set(false);
|
| - EXPECT_TRUE(media_channel->SetOptions(options));
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc1)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| - EXPECT_FALSE(call.GetAudioReceiveStream(kAudioSsrc2)
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| -
|
| - media_channel->SetCall(nullptr);
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, SetCallConfiguresAudioReceiveChannels) {
|
| - // Test that calling SetCall() on the voice media channel results in the
|
| - // expected state changes in Call.
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| - cricket::FakeCall call2((webrtc::Call::Config()));
|
| - const uint32 kAudioSsrc1 = 223;
|
| - const uint32 kAudioSsrc2 = 224;
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kAudioSsrc1)));
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kAudioSsrc2)));
|
| -
|
| - // Combined BWE should not be set up yet.
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| -
|
| - // Register - should be enabled.
|
| - media_channel->SetCall(&call);
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - EXPECT_NE(nullptr, call.GetAudioReceiveStream(kAudioSsrc1));
|
| - EXPECT_NE(nullptr, call.GetAudioReceiveStream(kAudioSsrc2));
|
| -
|
| - // Re-register - should now be enabled on new call.
|
| - media_channel->SetCall(&call2);
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| - EXPECT_EQ(2, call2.GetAudioReceiveStreams().size());
|
| - EXPECT_NE(nullptr, call2.GetAudioReceiveStream(kAudioSsrc1));
|
| - EXPECT_NE(nullptr, call2.GetAudioReceiveStream(kAudioSsrc2));
|
| -
|
| - // Unregister - should be disabled again.
|
| - media_channel->SetCall(nullptr);
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
|
| - // Test that adding receive streams after enabling combined bandwidth
|
| - // estimation will correctly configure each channel.
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - media_channel->SetCall(&call);
|
| - cricket::AudioOptions options;
|
| - options.combined_audio_video_bwe.Set(true);
|
| - EXPECT_TRUE(media_channel->SetOptions(options));
|
| -
|
| - static const uint32 kSsrcs[] = {1, 2, 3, 4};
|
| - for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kSsrcs[i])));
|
| - EXPECT_NE(nullptr, call.GetAudioReceiveStream(kSsrcs[i]));
|
| - EXPECT_TRUE(call.GetAudioReceiveStream(kSsrcs[i])
|
| - ->GetConfig()
|
| - .combined_audio_video_bwe);
|
| - }
|
| - EXPECT_EQ(ARRAY_SIZE(kSsrcs), call.GetAudioReceiveStreams().size());
|
| -
|
| - media_channel->SetCall(nullptr);
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
|
| - // Test that setting the header extensions results in the expected state
|
| - // changes on an associated Call.
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| - std::vector<uint32> ssrcs;
|
| - ssrcs.push_back(223);
|
| - ssrcs.push_back(224);
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - media_channel->SetCall(&call);
|
| - for (uint32 ssrc : ssrcs) {
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(ssrc)));
|
| - }
|
| -
|
| - // Combined BWE should be set up, but with no configured extensions.
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - for (uint32 ssrc : ssrcs) {
|
| - const auto* s = call.GetAudioReceiveStream(ssrc);
|
| - EXPECT_NE(nullptr, s);
|
| - EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
| - }
|
| -
|
| - // Set up receive extensions.
|
| - const auto& e_exts = engine_.rtp_header_extensions();
|
| - channel_->SetRecvRtpHeaderExtensions(e_exts);
|
| - EXPECT_EQ(2, call.GetAudioReceiveStreams().size());
|
| - for (uint32 ssrc : ssrcs) {
|
| - const auto* s = call.GetAudioReceiveStream(ssrc);
|
| - EXPECT_NE(nullptr, s);
|
| - const auto& s_exts = s->GetConfig().rtp.extensions;
|
| - EXPECT_EQ(e_exts.size(), s_exts.size());
|
| - for (const auto& e_ext : e_exts) {
|
| - for (const auto& s_ext : s_exts) {
|
| - if (e_ext.id == s_ext.id) {
|
| - EXPECT_EQ(e_ext.uri, s_ext.name);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Disable receive extensions.
|
| - std::vector<cricket::RtpHeaderExtension> extensions;
|
| - channel_->SetRecvRtpHeaderExtensions(extensions);
|
| - for (uint32 ssrc : ssrcs) {
|
| - const auto* s = call.GetAudioReceiveStream(ssrc);
|
| - EXPECT_NE(nullptr, s);
|
| - EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
| - }
|
| -
|
| - media_channel->SetCall(nullptr);
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
|
| - // Test that packets are forwarded to the Call when configured accordingly.
|
| - cricket::FakeCall call((webrtc::Call::Config()));
|
| - const uint32 kAudioSsrc = 1;
|
| - rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
| - static const unsigned char kRtcp[] = {
|
| - 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
|
| - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
| - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
| - };
|
| - rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
|
| -
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - cricket::AudioOptions options;
|
| - options.combined_audio_video_bwe.Set(true);
|
| - EXPECT_TRUE(media_channel->SetOptions(options));
|
| - EXPECT_TRUE(media_channel->AddRecvStream(
|
| - cricket::StreamParams::CreateLegacy(kAudioSsrc)));
|
| -
|
| - // Call not set on media channel, so no packets can be forwarded.
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| - channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
|
| - channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
|
| - EXPECT_EQ(0, call.GetAudioReceiveStreams().size());
|
| -
|
| - // Set Call, now there should be a receive stream which is forwarded packets.
|
| - media_channel->SetCall(&call);
|
| - EXPECT_EQ(1, call.GetAudioReceiveStreams().size());
|
| - const cricket::FakeAudioReceiveStream* s =
|
| - call.GetAudioReceiveStream(kAudioSsrc);
|
| - EXPECT_EQ(0, s->received_packets());
|
| - channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
|
| - EXPECT_EQ(1, s->received_packets());
|
| - channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
|
| - EXPECT_EQ(2, s->received_packets());
|
| -
|
| - media_channel->SetCall(nullptr);
|
| -}
|
| -
|
| -// Associate channel should not set on 1:1 call, since the receive channel also
|
| -// sends RTCP SR.
|
| -TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
|
| - EXPECT_TRUE(SetupEngine());
|
| - EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| - int recv_ch = voe_.GetLastChannel();
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
|
| -}
|
| -
|
| -// This test is an extension of AssociateChannelUnset1On1. We create two receive
|
| -// channels. The second should be associated with the default channel, since it
|
| -// does not send RTCP SR.
|
| -TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
|
| - EXPECT_TRUE(SetupEngine());
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - int default_channel = media_channel->voe_channel();
|
| - EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| - int recv_ch_1 = voe_.GetLastChannel();
|
| - EXPECT_EQ(recv_ch_1, default_channel);
|
| - EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
| - int recv_ch_2 = voe_.GetLastChannel();
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
|
| - // Add send stream, the association remains.
|
| - EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
|
| -}
|
| -
|
| -// In conference mode, all receive channels should be associated with the
|
| -// default channel, since they do not send RTCP SR.
|
| -TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
|
| - EXPECT_TRUE(SetupEngine());
|
| - EXPECT_TRUE(channel_->SetOptions(options_conference_));
|
| - cricket::WebRtcVoiceMediaChannel* media_channel =
|
| - static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
| - int default_channel = media_channel->voe_channel();
|
| - EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| - int recv_ch = voe_.GetLastChannel();
|
| - EXPECT_NE(recv_ch, default_channel);
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
| - EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
| -}
|
| -
|
| -TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
|
| - EXPECT_TRUE(SetupEngine());
|
| - EXPECT_TRUE(channel_->SetOptions(options_conference_));
|
| -
|
| - EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
| - int recv_ch = voe_.GetLastChannel();
|
| -
|
| - EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
| - int send_ch = voe_.GetLastChannel();
|
| -
|
| - // Manually associate |recv_ch| to |send_ch|. This test is to verify a
|
| - // deleting logic, i.e., deleting |send_ch| will reset the associate send
|
| - // channel of |recv_ch|.This is not a common case, since, normally, only the
|
| - // default channel can be associated. However, the default is not deletable.
|
| - // So we force the |recv_ch| to associate with a non-default channel.
|
| - EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
|
| -
|
| - EXPECT_TRUE(channel_->RemoveSendStream(2));
|
| - EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
|
| -}
|
|
|