Chromium Code Reviews| 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(); |