1 /*
2  *  Copyright (c) 2012 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 
11 #include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
12 
13 class EcMetricsTest : public AfterStreamingFixture {
14 };
15 
TEST_F(EcMetricsTest,EcMetricsAreOffByDefault)16 TEST_F(EcMetricsTest, EcMetricsAreOffByDefault) {
17   bool enabled = true;
18   EXPECT_EQ(0, voe_apm_->GetEcMetricsStatus(enabled));
19   EXPECT_FALSE(enabled);
20 }
21 
TEST_F(EcMetricsTest,CanEnableAndDisableEcMetrics)22 TEST_F(EcMetricsTest, CanEnableAndDisableEcMetrics) {
23   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true));
24   bool ec_on = false;
25   EXPECT_EQ(0, voe_apm_->GetEcMetricsStatus(ec_on));
26   ASSERT_TRUE(ec_on);
27   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(false));
28   EXPECT_EQ(0, voe_apm_->GetEcMetricsStatus(ec_on));
29   ASSERT_FALSE(ec_on);
30 }
31 
TEST_F(EcMetricsTest,ManualTestEcMetrics)32 TEST_F(EcMetricsTest, ManualTestEcMetrics) {
33   SwitchToManualMicrophone();
34 
35   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true));
36 
37   // Must enable AEC to get valid echo metrics.
38   EXPECT_EQ(0, voe_apm_->SetEcStatus(true, webrtc::kEcAec));
39 
40   TEST_LOG("Speak into microphone and check metrics for 5 seconds...\n");
41   int erl, erle, rerl, a_nlp;
42   int delay_median = 0;
43   int delay_std = 0;
44   float fraction_poor_delays = 0;
45 
46   for (int i = 0; i < 5; i++) {
47     Sleep(1000);
48     EXPECT_EQ(0, voe_apm_->GetEchoMetrics(erl, erle, rerl, a_nlp));
49     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay_median, delay_std,
50                                              fraction_poor_delays));
51     TEST_LOG("    Echo  : ERL=%5d, ERLE=%5d, RERL=%5d, A_NLP=%5d [dB], "
52         " delay median=%3d, delay std=%3d [ms], "
53         "fraction_poor_delays=%3.1f [%%]\n", erl, erle, rerl, a_nlp,
54         delay_median, delay_std, fraction_poor_delays * 100);
55   }
56 
57   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(false));
58 }
59 
TEST_F(EcMetricsTest,GetEcMetricsFailsIfEcNotEnabled)60 TEST_F(EcMetricsTest, GetEcMetricsFailsIfEcNotEnabled) {
61   int dummy = 0;
62   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true));
63   EXPECT_EQ(-1, voe_apm_->GetEchoMetrics(dummy, dummy, dummy, dummy));
64   EXPECT_EQ(VE_APM_ERROR, voe_base_->LastError());
65 }
66 
TEST_F(EcMetricsTest,GetEcDelayMetricsFailsIfEcNotEnabled)67 TEST_F(EcMetricsTest, GetEcDelayMetricsFailsIfEcNotEnabled) {
68   int dummy = 0;
69   float dummy_f = 0;
70   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true));
71   EXPECT_EQ(-1, voe_apm_->GetEcDelayMetrics(dummy, dummy, dummy_f));
72   EXPECT_EQ(VE_APM_ERROR, voe_base_->LastError());
73 }
74 
TEST_F(EcMetricsTest,ManualVerifyEcDelayMetrics)75 TEST_F(EcMetricsTest, ManualVerifyEcDelayMetrics) {
76   SwitchToManualMicrophone();
77   TEST_LOG("Verify EC Delay metrics:");
78   EXPECT_EQ(0, voe_apm_->SetEcStatus(true));
79   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true));
80 
81   for (int i = 0; i < 5; i++) {
82     int delay, delay_std;
83     float fraction_poor_delays;
84     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay, delay_std,
85                                              fraction_poor_delays));
86     TEST_LOG("Delay = %d, Delay Std = %d, Fraction poor delays = %3.1f\n",
87              delay, delay_std, fraction_poor_delays * 100);
88     Sleep(1000);
89   }
90 }
91