blob: c91183c66bf3ddd220516306f03b00a00ee24a9b [file] [log] [blame]
Fredrik Solenberg73276ad2017-09-14 14:46:47 +02001/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "audio/test/audio_end_to_end_test.h"
Karl Wiberge40468b2017-11-22 10:42:26 +010012#include "rtc_base/numerics/safe_compare.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "system_wrappers/include/sleep.h"
14#include "test/gtest.h"
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020015
16namespace webrtc {
17namespace test {
18namespace {
19
20bool IsNear(int reference, int v) {
21 // Margin is 10%.
22 const int error = reference / 10 + 1;
23 return std::abs(reference - v) <= error;
24}
25
26class NoLossTest : public AudioEndToEndTest {
27 public:
28 const int kTestDurationMs = 8000;
29 const int kBytesSent = 69351;
30 const int32_t kPacketsSent = 400;
31 const int64_t kRttMs = 100;
32
33 NoLossTest() = default;
34
Artem Titov75e36472018-10-08 12:28:56 +020035 BuiltInNetworkBehaviorConfig GetNetworkPipeConfig() const override {
36 BuiltInNetworkBehaviorConfig pipe_config;
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020037 pipe_config.queue_delay_ms = kRttMs / 2;
38 return pipe_config;
39 }
40
41 void PerformTest() override {
42 SleepMs(kTestDurationMs);
43 send_audio_device()->StopRecording();
44 AudioEndToEndTest::PerformTest();
45 }
46
47 void OnStreamsStopped() override {
48 AudioSendStream::Stats send_stats = send_stream()->GetStats();
Niels Möllerac0a4cb2019-10-09 15:01:33 +020049 EXPECT_PRED2(IsNear, kBytesSent, send_stats.payload_bytes_sent);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020050 EXPECT_PRED2(IsNear, kPacketsSent, send_stats.packets_sent);
51 EXPECT_EQ(0, send_stats.packets_lost);
52 EXPECT_EQ(0.0f, send_stats.fraction_lost);
53 EXPECT_EQ("opus", send_stats.codec_name);
54 // send_stats.jitter_ms
55 EXPECT_PRED2(IsNear, kRttMs, send_stats.rtt_ms);
56 // Send level is 0 because it is cleared in TransmitMixer::StopSend().
57 EXPECT_EQ(0, send_stats.audio_level);
58 // send_stats.total_input_energy
59 // send_stats.total_input_duration
Ivo Creusen56d46092017-11-24 17:29:59 +010060 EXPECT_FALSE(send_stats.apm_statistics.delay_median_ms);
61 EXPECT_FALSE(send_stats.apm_statistics.delay_standard_deviation_ms);
62 EXPECT_FALSE(send_stats.apm_statistics.echo_return_loss);
63 EXPECT_FALSE(send_stats.apm_statistics.echo_return_loss_enhancement);
64 EXPECT_FALSE(send_stats.apm_statistics.residual_echo_likelihood);
65 EXPECT_FALSE(send_stats.apm_statistics.residual_echo_likelihood_recent_max);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020066 EXPECT_EQ(false, send_stats.typing_noise_detected);
67
68 AudioReceiveStream::Stats recv_stats = receive_stream()->GetStats();
Niels Möllerac0a4cb2019-10-09 15:01:33 +020069 EXPECT_PRED2(IsNear, kBytesSent, recv_stats.payload_bytes_rcvd);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020070 EXPECT_PRED2(IsNear, kPacketsSent, recv_stats.packets_rcvd);
71 EXPECT_EQ(0u, recv_stats.packets_lost);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +020072 EXPECT_EQ("opus", send_stats.codec_name);
73 // recv_stats.jitter_ms
74 // recv_stats.jitter_buffer_ms
75 EXPECT_EQ(20u, recv_stats.jitter_buffer_preferred_ms);
76 // recv_stats.delay_estimate_ms
77 // Receive level is 0 because it is cleared in Channel::StopPlayout().
78 EXPECT_EQ(0, recv_stats.audio_level);
79 // recv_stats.total_output_energy
80 // recv_stats.total_samples_received
81 // recv_stats.total_output_duration
82 // recv_stats.concealed_samples
83 // recv_stats.expand_rate
84 // recv_stats.speech_expand_rate
85 EXPECT_EQ(0.0, recv_stats.secondary_decoded_rate);
86 EXPECT_EQ(0.0, recv_stats.secondary_discarded_rate);
87 EXPECT_EQ(0.0, recv_stats.accelerate_rate);
88 EXPECT_EQ(0.0, recv_stats.preemptive_expand_rate);
89 EXPECT_EQ(0, recv_stats.decoding_calls_to_silence_generator);
90 // recv_stats.decoding_calls_to_neteq
91 // recv_stats.decoding_normal
92 // recv_stats.decoding_plc
93 EXPECT_EQ(0, recv_stats.decoding_cng);
94 // recv_stats.decoding_plc_cng
95 // recv_stats.decoding_muted_output
96 // Capture start time is -1 because we do not have an associated send stream
97 // on the receiver side.
98 EXPECT_EQ(-1, recv_stats.capture_start_ntp_time_ms);
99
100 // Match these stats between caller and receiver.
101 EXPECT_EQ(send_stats.local_ssrc, recv_stats.remote_ssrc);
102 EXPECT_EQ(*send_stats.codec_payload_type, *recv_stats.codec_payload_type);
Fredrik Solenberg73276ad2017-09-14 14:46:47 +0200103 }
104};
105} // namespace
106
107using AudioStatsTest = CallTest;
108
solenberg4652e862017-09-22 06:07:56 -0700109TEST_F(AudioStatsTest, DISABLED_NoLoss) {
Fredrik Solenberg73276ad2017-09-14 14:46:47 +0200110 NoLossTest test;
111 RunBaseTest(&test);
112}
113
114} // namespace test
115} // namespace webrtc