/*
 *  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 "modules/audio_processing/aec3/render_delay_controller_metrics.h"

#include "absl/types/optional.h"
#include "modules/audio_processing/aec3/aec3_common.h"
#include "system_wrappers/include/metrics.h"
#include "test/gtest.h"

namespace webrtc {

// Verify the general functionality of RenderDelayControllerMetrics.
TEST(RenderDelayControllerMetrics, NormalUsage) {
  metrics::Reset();

  RenderDelayControllerMetrics metrics;

  int expected_num_metric_reports = 0;

  for (int j = 0; j < 3; ++j) {
    for (int k = 0; k < kMetricsReportingIntervalBlocks - 1; ++k) {
      metrics.Update(absl::nullopt, absl::nullopt,
                     ClockdriftDetector::Level::kNone);
    }
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.EchoPathDelay"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.BufferDelay"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(metrics::NumSamples(
                         "WebRTC.Audio.EchoCanceller.ReliableDelayEstimates"),
                     expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.DelayChanges"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.Clockdrift"),
        expected_num_metric_reports);

    // We expect metric reports every kMetricsReportingIntervalBlocks blocks.
    ++expected_num_metric_reports;

    metrics.Update(absl::nullopt, absl::nullopt,
                   ClockdriftDetector::Level::kNone);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.EchoPathDelay"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.BufferDelay"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(metrics::NumSamples(
                         "WebRTC.Audio.EchoCanceller.ReliableDelayEstimates"),
                     expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.DelayChanges"),
        expected_num_metric_reports);
    EXPECT_METRIC_EQ(
        metrics::NumSamples("WebRTC.Audio.EchoCanceller.Clockdrift"),
        expected_num_metric_reports);
  }
}

}  // namespace webrtc
