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