| Index: webrtc/audio/test/audio_stats_test.cc
|
| diff --git a/webrtc/audio/test/audio_stats_test.cc b/webrtc/audio/test/audio_stats_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..57dfbed758f9d73031288a9c830cae6163fcb130
|
| --- /dev/null
|
| +++ b/webrtc/audio/test/audio_stats_test.cc
|
| @@ -0,0 +1,118 @@
|
| +/*
|
| + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include "webrtc/audio/test/audio_end_to_end_test.h"
|
| +#include "webrtc/rtc_base/safe_compare.h"
|
| +#include "webrtc/system_wrappers/include/sleep.h"
|
| +#include "webrtc/test/gtest.h"
|
| +
|
| +namespace webrtc {
|
| +namespace test {
|
| +namespace {
|
| +
|
| +bool IsNear(int reference, int v) {
|
| + // Margin is 10%.
|
| + const int error = reference / 10 + 1;
|
| + return std::abs(reference - v) <= error;
|
| +}
|
| +
|
| +class NoLossTest : public AudioEndToEndTest {
|
| + public:
|
| + const int kTestDurationMs = 8000;
|
| + const int kBytesSent = 69351;
|
| + const int32_t kPacketsSent = 400;
|
| + const int64_t kRttMs = 100;
|
| +
|
| + NoLossTest() = default;
|
| +
|
| + FakeNetworkPipe::Config GetNetworkPipeConfig() const override {
|
| + FakeNetworkPipe::Config pipe_config;
|
| + pipe_config.queue_delay_ms = kRttMs / 2;
|
| + return pipe_config;
|
| + }
|
| +
|
| + void PerformTest() override {
|
| + SleepMs(kTestDurationMs);
|
| + send_audio_device()->StopRecording();
|
| + AudioEndToEndTest::PerformTest();
|
| + }
|
| +
|
| + void OnStreamsStopped() override {
|
| + AudioSendStream::Stats send_stats = send_stream()->GetStats();
|
| + EXPECT_PRED2(IsNear, kBytesSent, send_stats.bytes_sent);
|
| + EXPECT_PRED2(IsNear, kPacketsSent, send_stats.packets_sent);
|
| + EXPECT_EQ(0, send_stats.packets_lost);
|
| + EXPECT_EQ(0.0f, send_stats.fraction_lost);
|
| + EXPECT_EQ("opus", send_stats.codec_name);
|
| + // send_stats.jitter_ms
|
| + EXPECT_PRED2(IsNear, kRttMs, send_stats.rtt_ms);
|
| + // Send level is 0 because it is cleared in TransmitMixer::StopSend().
|
| + EXPECT_EQ(0, send_stats.audio_level);
|
| + // send_stats.total_input_energy
|
| + // send_stats.total_input_duration
|
| + EXPECT_EQ(-1.0f, send_stats.aec_quality_min);
|
| + EXPECT_EQ(-1, send_stats.echo_delay_median_ms);
|
| + EXPECT_EQ(-1, send_stats.echo_delay_std_ms);
|
| + EXPECT_EQ(-100, send_stats.echo_return_loss);
|
| + EXPECT_EQ(-100, send_stats.echo_return_loss_enhancement);
|
| + EXPECT_EQ(0.0f, send_stats.residual_echo_likelihood);
|
| + EXPECT_EQ(0.0f, send_stats.residual_echo_likelihood_recent_max);
|
| + EXPECT_EQ(false, send_stats.typing_noise_detected);
|
| +
|
| + AudioReceiveStream::Stats recv_stats = receive_stream()->GetStats();
|
| + EXPECT_PRED2(IsNear, kBytesSent, recv_stats.bytes_rcvd);
|
| + EXPECT_PRED2(IsNear, kPacketsSent, recv_stats.packets_rcvd);
|
| + EXPECT_EQ(0u, recv_stats.packets_lost);
|
| + EXPECT_EQ(0.0f, recv_stats.fraction_lost);
|
| + EXPECT_EQ("opus", send_stats.codec_name);
|
| + // recv_stats.jitter_ms
|
| + // recv_stats.jitter_buffer_ms
|
| + EXPECT_EQ(20u, recv_stats.jitter_buffer_preferred_ms);
|
| + // recv_stats.delay_estimate_ms
|
| + // Receive level is 0 because it is cleared in Channel::StopPlayout().
|
| + EXPECT_EQ(0, recv_stats.audio_level);
|
| + // recv_stats.total_output_energy
|
| + // recv_stats.total_samples_received
|
| + // recv_stats.total_output_duration
|
| + // recv_stats.concealed_samples
|
| + // recv_stats.expand_rate
|
| + // recv_stats.speech_expand_rate
|
| + EXPECT_EQ(0.0, recv_stats.secondary_decoded_rate);
|
| + EXPECT_EQ(0.0, recv_stats.secondary_discarded_rate);
|
| + EXPECT_EQ(0.0, recv_stats.accelerate_rate);
|
| + EXPECT_EQ(0.0, recv_stats.preemptive_expand_rate);
|
| + EXPECT_EQ(0, recv_stats.decoding_calls_to_silence_generator);
|
| + // recv_stats.decoding_calls_to_neteq
|
| + // recv_stats.decoding_normal
|
| + // recv_stats.decoding_plc
|
| + EXPECT_EQ(0, recv_stats.decoding_cng);
|
| + // recv_stats.decoding_plc_cng
|
| + // recv_stats.decoding_muted_output
|
| + // Capture start time is -1 because we do not have an associated send stream
|
| + // on the receiver side.
|
| + EXPECT_EQ(-1, recv_stats.capture_start_ntp_time_ms);
|
| +
|
| + // Match these stats between caller and receiver.
|
| + EXPECT_EQ(send_stats.local_ssrc, recv_stats.remote_ssrc);
|
| + EXPECT_EQ(*send_stats.codec_payload_type, *recv_stats.codec_payload_type);
|
| + EXPECT_TRUE(rtc::SafeEq(send_stats.ext_seqnum, recv_stats.ext_seqnum));
|
| + }
|
| +};
|
| +} // namespace
|
| +
|
| +using AudioStatsTest = CallTest;
|
| +
|
| +TEST_F(AudioStatsTest, NoLoss) {
|
| + NoLossTest test;
|
| + RunBaseTest(&test);
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace webrtc
|
|
|