Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1225)

Unified Diff: talk/media/webrtc/webrtcvoiceengine_unittest.cc

Issue 1414743004: Implement AudioSendStream::GetStats(). (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: TODOs Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc
diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
index 4491929784528347b4f0f3a1b52f36492b52027e..38e0418498fc23a8e3d98598736220184ff66c62 100644
--- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc
+++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc
@@ -57,9 +57,9 @@ const cricket::AudioCodec* const kAudioCodecs[] = {
&kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
&kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
};
-static uint32_t kSsrc1 = 0x99;
-static uint32_t kSsrc2 = 0x98;
-static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
+const uint32_t kSsrc1 = 0x99;
+const uint32_t kSsrc2 = 0x98;
+const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
class FakeVoEWrapper : public cricket::VoEWrapper {
public:
@@ -124,13 +124,11 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_TRUE(SetupEngineWithSendStream());
// Remove stream added in Setup.
int default_channel_num = voe_.GetLastChannel();
- uint32_t default_send_ssrc = 0u;
- EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
- EXPECT_EQ(kSsrc1, default_send_ssrc);
- EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
+ EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(default_channel_num));
+ EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
// Verify the channel does not exist.
- EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
+ EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrc1));
}
void DeliverPacket(const void* data, int len) {
rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
@@ -290,6 +288,55 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
}
+ const webrtc::AudioSendStream::Stats& GetAudioSendStreamStats() const {
+ static webrtc::AudioSendStream::Stats stats;
tommi 2015/10/23 12:50:37 can you add a comment why this is static and not e
the sun 2015/10/23 15:14:17 Nah, if that's required I rather return by value.
+ if (stats.local_ssrc == 0) {
+ stats.local_ssrc = 12;
+ stats.bytes_sent = 345;
+ stats.packets_sent = 678;
+ stats.packets_lost = 9012;
+ stats.fraction_lost = 34.56f;
+ stats.codec_name = "codec_name_send";
+ stats.ext_seqnum = 789;
+ stats.jitter_ms = 12;
+ stats.rtt_ms = 345;
+ stats.audio_level = 678;
+ stats.aec_quality_min = 9.01f;
+ stats.echo_delay_median_ms = 234;
+ stats.echo_delay_std_ms = 567;
+ stats.echo_return_loss = 890;
+ stats.echo_return_loss_enhancement = 1234;
+ stats.typing_noise_detected = true;
+ }
+ return stats;
+ }
+ void SetAudioSendStreamStats() {
+ for (auto* s : call_.GetAudioSendStreams()) {
+ s->SetStats(GetAudioSendStreamStats());
+ }
+ }
+ void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info) {
+ const auto& kStats = GetAudioSendStreamStats();
tommi 2015/10/23 12:50:37 kStats -> stats since this is not a compile time c
the sun 2015/10/23 15:14:17 Done.
+ EXPECT_EQ(info.ssrc(), kStats.local_ssrc);
+ EXPECT_EQ(info.bytes_sent, kStats.bytes_sent);
+ EXPECT_EQ(info.packets_sent, kStats.packets_sent);
+ EXPECT_EQ(info.packets_lost, kStats.packets_lost);
+ EXPECT_EQ(info.fraction_lost, kStats.fraction_lost);
+ EXPECT_EQ(info.codec_name, kStats.codec_name);
+ EXPECT_EQ(info.ext_seqnum, kStats.ext_seqnum);
+ EXPECT_EQ(info.jitter_ms, kStats.jitter_ms);
+ EXPECT_EQ(info.rtt_ms, kStats.rtt_ms);
+ EXPECT_EQ(info.audio_level, kStats.audio_level);
+ EXPECT_EQ(info.aec_quality_min, kStats.aec_quality_min);
+ EXPECT_EQ(info.echo_delay_median_ms, kStats.echo_delay_median_ms);
+ EXPECT_EQ(info.echo_delay_std_ms, kStats.echo_delay_std_ms);
+ EXPECT_EQ(info.echo_return_loss, kStats.echo_return_loss);
+ EXPECT_EQ(info.echo_return_loss_enhancement,
+ kStats.echo_return_loss_enhancement);
+ // TODO(solenberg): Move typing noise detection into AudioSendStream.
+ // EXPECT_EQ(info.typing_noise_detected, kStats.typing_noise_detected);
+ }
+
const webrtc::AudioReceiveStream::Stats& GetAudioReceiveStreamStats() const {
static webrtc::AudioReceiveStream::Stats stats;
if (stats.remote_ssrc == 0) {
@@ -298,7 +345,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
stats.packets_rcvd = 768;
stats.packets_lost = 101;
stats.fraction_lost = 23.45f;
- stats.codec_name = "codec_name";
+ stats.codec_name = "codec_name_recv";
stats.ext_seqnum = 678;
stats.jitter_ms = 901;
stats.jitter_buffer_ms = 234;
@@ -327,7 +374,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
}
void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
const auto& kStats = GetAudioReceiveStreamStats();
- EXPECT_EQ(info.local_stats.front().ssrc, kStats.remote_ssrc);
+ EXPECT_EQ(info.ssrc(), kStats.remote_ssrc);
EXPECT_EQ(info.bytes_rcvd, kStats.bytes_rcvd);
EXPECT_EQ(info.packets_rcvd, kStats.packets_rcvd);
EXPECT_EQ(info.packets_lost, kStats.packets_lost);
@@ -2028,6 +2075,8 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(ssrc)));
}
+ SetAudioSendStreamStats();
+
// Create a receive stream to check that none of the send streams end up in
// the receive stream stats.
EXPECT_TRUE(channel_->AddRecvStream(
@@ -2038,30 +2087,22 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
cricket::VoiceMediaInfo info;
EXPECT_EQ(true, channel_->GetStats(&info));
- EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
+ {
+ // We have added 4 send streams. We should see empty stats for all.
+ EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
+ for (const auto& sender : info.senders) {
+ VerifyVoiceSenderInfo(sender);
+ }
- // Verify the statistic information is correct.
- // TODO(solenberg): Make this loop ordering independent.
- for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
- EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
- EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
- EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
- EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
+ // We have added one receive stream. We should see empty stats.
+ EXPECT_EQ(info.receivers.size(), 1u);
+ EXPECT_EQ(info.receivers[0].ssrc(), 0);
}
- // We have added one receive stream. We should see empty stats.
- EXPECT_EQ(info.receivers.size(), 1u);
- EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
-
// Remove the kSsrc2 stream. No receiver stats.
EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
EXPECT_EQ(true, channel_->GetStats(&info));
+ EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
EXPECT_EQ(0u, info.receivers.size());
// Deliver a new packet - a default receive stream should be created and we
@@ -2069,6 +2110,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
SetAudioReceiveStreamStats();
EXPECT_EQ(true, channel_->GetStats(&info));
+ EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
EXPECT_EQ(1u, info.receivers.size());
VerifyVoiceReceiverInfo(info.receivers[0]);
}
@@ -2292,17 +2334,13 @@ TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
// SSRC is set in SetupEngine by calling AddSendStream.
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
EXPECT_TRUE(SetupEngineWithSendStream());
- int channel_num = voe_.GetLastChannel();
- unsigned int send_ssrc;
- EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
- EXPECT_NE(0U, send_ssrc);
- EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
- EXPECT_EQ(kSsrc1, send_ssrc);
+ EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
}
TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
// Setup. We need send codec to be set to get all stats.
EXPECT_TRUE(SetupEngineWithSendStream());
+ SetAudioSendStreamStats();
// SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
// stream has to use a different SSRC.
EXPECT_TRUE(channel_->AddRecvStream(
@@ -2312,32 +2350,19 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
cricket::VoiceMediaInfo info;
EXPECT_EQ(true, channel_->GetStats(&info));
- EXPECT_EQ(1u, info.senders.size());
- EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
- EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
- EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
- EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
- EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
- // TODO(sriniv): Add testing for more fields. These are not populated
- // in FakeWebrtcVoiceEngine yet.
- // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
- // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
- // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
- // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
- // EXPECT_EQ(cricket::kIntStatValue,
- // info.senders[0].echo_return_loss_enhancement);
- // We have added one receive stream. We should see empty stats.
- EXPECT_EQ(info.receivers.size(), 1u);
- EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
+ {
+ // We have added one send stream. We should see the stats we've set.
+ EXPECT_EQ(1u, info.senders.size());
+ VerifyVoiceSenderInfo(info.senders[0]);
+ // We have added one receive stream. We should see empty stats.
+ EXPECT_EQ(info.receivers.size(), 1u);
+ EXPECT_EQ(info.receivers[0].ssrc(), 0);
+ }
// Remove the kSsrc2 stream. No receiver stats.
EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
EXPECT_EQ(true, channel_->GetStats(&info));
+ EXPECT_EQ(1u, info.senders.size());
EXPECT_EQ(0u, info.receivers.size());
// Deliver a new packet - a default receive stream should be created and we
@@ -2345,6 +2370,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
SetAudioReceiveStreamStats();
EXPECT_EQ(true, channel_->GetStats(&info));
+ EXPECT_EQ(1u, info.senders.size());
EXPECT_EQ(1u, info.receivers.size());
VerifyVoiceReceiverInfo(info.receivers[0]);
}
@@ -2353,15 +2379,9 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
// SSRC is set in SetupEngine by calling AddSendStream.
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
EXPECT_TRUE(SetupEngineWithSendStream());
- int channel_num1 = voe_.GetLastChannel();
- unsigned int send_ssrc;
- EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
- EXPECT_EQ(kSsrc1, send_ssrc);
-
+ EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
- int channel_num2 = voe_.GetLastChannel();
- EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
- EXPECT_EQ(kSsrc1, send_ssrc);
+ EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
}
// Test that the local SSRC is the same on sending and receiving channels if the
@@ -2376,12 +2396,8 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
cricket::StreamParams::CreateLegacy(1234)));
int send_channel_num = voe_.GetLastChannel();
- unsigned int ssrc = 0;
- EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
- EXPECT_EQ(1234U, ssrc);
- ssrc = 0;
- EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
- EXPECT_EQ(1234U, ssrc);
+ EXPECT_EQ(1234U, voe_.GetLocalSSRC(send_channel_num));
+ EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
}
// Test that we can properly receive packets.
@@ -2545,7 +2561,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
bool ec_enabled;
webrtc::EcModes ec_mode;
- bool ec_metrics_enabled;
webrtc::AecmModes aecm_mode;
bool cng_enabled;
bool agc_enabled;
@@ -2557,7 +2572,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
bool stereo_swapping_enabled;
bool typing_detection_enabled;
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
voe_.GetAecmMode(aecm_mode, cng_enabled);
voe_.GetAgcStatus(agc_enabled, agc_mode);
voe_.GetAgcConfig(agc_config);
@@ -2566,7 +2580,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
voe_.GetTypingDetectionStatus(typing_detection_enabled);
EXPECT_TRUE(ec_enabled);
- EXPECT_TRUE(ec_metrics_enabled);
+ EXPECT_TRUE(voe_.ec_metrics_enabled());
EXPECT_FALSE(cng_enabled);
EXPECT_TRUE(agc_enabled);
EXPECT_EQ(0, agc_config.targetLeveldBOv);
@@ -2581,7 +2595,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
cricket::AudioOptions options;
ASSERT_TRUE(engine_.SetOptions(options));
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
voe_.GetAecmMode(aecm_mode, cng_enabled);
voe_.GetAgcStatus(agc_enabled, agc_mode);
voe_.GetAgcConfig(agc_config);
@@ -2590,7 +2603,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
voe_.GetTypingDetectionStatus(typing_detection_enabled);
EXPECT_TRUE(ec_enabled);
- EXPECT_TRUE(ec_metrics_enabled);
+ EXPECT_TRUE(voe_.ec_metrics_enabled());
EXPECT_FALSE(cng_enabled);
EXPECT_TRUE(agc_enabled);
EXPECT_EQ(0, agc_config.targetLeveldBOv);
@@ -2615,7 +2628,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
options.echo_cancellation.Set(true);
ASSERT_TRUE(engine_.SetOptions(options));
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
voe_.GetAecmMode(aecm_mode, cng_enabled);
voe_.GetAgcStatus(agc_enabled, agc_mode);
voe_.GetAgcConfig(agc_config);
@@ -2624,7 +2636,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
voe_.GetTypingDetectionStatus(typing_detection_enabled);
EXPECT_TRUE(ec_enabled);
- EXPECT_TRUE(ec_metrics_enabled);
+ EXPECT_TRUE(voe_.ec_metrics_enabled());
EXPECT_TRUE(agc_enabled);
EXPECT_EQ(0, agc_config.targetLeveldBOv);
EXPECT_TRUE(ns_enabled);
@@ -2639,10 +2651,9 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
options.delay_agnostic_aec.Set(true);
ASSERT_TRUE(engine_.SetOptions(options));
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
voe_.GetAecmMode(aecm_mode, cng_enabled);
EXPECT_TRUE(ec_enabled);
- EXPECT_TRUE(ec_metrics_enabled);
+ EXPECT_TRUE(voe_.ec_metrics_enabled());
EXPECT_EQ(ec_mode, webrtc::kEcConference);
// Turn off echo cancellation and delay agnostic aec.
@@ -2656,9 +2667,8 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
options.delay_agnostic_aec.Set(true);
ASSERT_TRUE(engine_.SetOptions(options));
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
EXPECT_TRUE(ec_enabled);
- EXPECT_TRUE(ec_metrics_enabled);
+ EXPECT_TRUE(voe_.ec_metrics_enabled());
EXPECT_EQ(ec_mode, webrtc::kEcConference);
// Turn off AGC
@@ -2706,7 +2716,6 @@ TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
bool ec_enabled;
webrtc::EcModes ec_mode;
- bool ec_metrics_enabled;
bool agc_enabled;
webrtc::AgcModes agc_mode;
bool ns_enabled;
@@ -2716,7 +2725,6 @@ TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
bool typing_detection_enabled;
voe_.GetEcStatus(ec_enabled, ec_mode);
- voe_.GetEcMetricsStatus(ec_metrics_enabled);
voe_.GetAgcStatus(agc_enabled, agc_mode);
voe_.GetNsStatus(ns_enabled, ns_mode);
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();

Powered by Google App Engine
This is Rietveld 408576698