/*
 *  Copyright 2015 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 "api/fakemetricsobserver.h"
#include "rtc_base/checks.h"

namespace webrtc {

FakeMetricsObserver::FakeMetricsObserver() {
  Reset();
}

void FakeMetricsObserver::Reset() {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  counters_.clear();
  memset(histogram_samples_, 0, sizeof(histogram_samples_));
}

void FakeMetricsObserver::IncrementEnumCounter(
    PeerConnectionEnumCounterType type,
    int counter,
    int counter_max) {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  if (counters_.size() <= static_cast<size_t>(type)) {
    counters_.resize(type + 1);
  }
  auto& counters = counters_[type];
  ++counters[counter];
}

void FakeMetricsObserver::AddHistogramSample(PeerConnectionMetricsName type,
    int value) {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  RTC_DCHECK_EQ(histogram_samples_[type], 0);
  histogram_samples_[type] = value;
}

int FakeMetricsObserver::GetEnumCounter(PeerConnectionEnumCounterType type,
                                        int counter) const {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  if (counters_.size() <= static_cast<size_t>(type)) {
    return 0;
  }
  const auto& it = counters_[type].find(counter);
  if (it == counters_[type].end()) {
    return 0;
  }
  return it->second;
}

int FakeMetricsObserver::GetHistogramSample(
    PeerConnectionMetricsName type) const {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  return histogram_samples_[type];
}

bool FakeMetricsObserver::ExpectOnlySingleEnumCount(
    PeerConnectionEnumCounterType type,
    int counter) const {
  RTC_DCHECK(thread_checker_.CalledOnValidThread());
  if (counters_.size() <= static_cast<size_t>(type)) {
    // If a counter has not been allocated then there has been no call to
    // |IncrementEnumCounter| so all the values are 0.
    return false;
  }
  bool pass = true;
  if (GetEnumCounter(type, counter) != 1) {
    RTC_LOG(LS_ERROR) << "Expected single count for counter: " << counter;
    pass = false;
  }
  for (const auto& entry : counters_[type]) {
    if (entry.first != counter && entry.second > 0) {
      RTC_LOG(LS_ERROR) << "Expected no count for counter: " << entry.first;
      pass = false;
    }
  }
  return pass;
}

}  // namespace webrtc
