1/*
2 *  Copyright (c) 2015 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/test/histogram.h"
12
13#include <map>
14
15#include "webrtc/base/checks.h"
16#include "webrtc/base/criticalsection.h"
17#include "webrtc/base/thread_annotations.h"
18#include "webrtc/system_wrappers/include/metrics.h"
19
20// Test implementation of histogram methods in
21// webrtc/system_wrappers/include/metrics.h.
22
23namespace webrtc {
24namespace {
25struct SampleInfo {
26  SampleInfo(const std::string& name) : name_(name), last_(-1), total_(0) {}
27  const std::string name_;
28  int last_;   // Last added sample.
29  int total_;  // Total number of added samples.
30};
31
32rtc::CriticalSection histogram_crit_;
33// Map holding info about added samples to a histogram (mapped by the histogram
34// name).
35std::map<std::string, SampleInfo> histograms_ GUARDED_BY(histogram_crit_);
36}  // namespace
37
38namespace metrics {
39Histogram* HistogramFactoryGetCounts(const std::string& name, int min, int max,
40                                     int bucket_count) {
41  rtc::CritScope cs(&histogram_crit_);
42  if (histograms_.find(name) == histograms_.end()) {
43    histograms_.insert(std::make_pair(name, SampleInfo(name)));
44  }
45  auto it = histograms_.find(name);
46  return reinterpret_cast<Histogram*>(&it->second);
47}
48
49Histogram* HistogramFactoryGetEnumeration(const std::string& name,
50                                          int boundary) {
51  rtc::CritScope cs(&histogram_crit_);
52  if (histograms_.find(name) == histograms_.end()) {
53    histograms_.insert(std::make_pair(name, SampleInfo(name)));
54  }
55  auto it = histograms_.find(name);
56  return reinterpret_cast<Histogram*>(&it->second);
57}
58
59void HistogramAdd(
60    Histogram* histogram_pointer, const std::string& name, int sample) {
61  rtc::CritScope cs(&histogram_crit_);
62  SampleInfo* ptr = reinterpret_cast<SampleInfo*>(histogram_pointer);
63  // The name should not vary.
64  RTC_CHECK(ptr->name_ == name);
65  ptr->last_ = sample;
66  ++ptr->total_;
67}
68}  // namespace metrics
69
70namespace test {
71int LastHistogramSample(const std::string& name) {
72  rtc::CritScope cs(&histogram_crit_);
73  const auto it = histograms_.find(name);
74  if (it == histograms_.end()) {
75    return -1;
76  }
77  return it->second.last_;
78}
79
80int NumHistogramSamples(const std::string& name) {
81  rtc::CritScope cs(&histogram_crit_);
82  const auto it = histograms_.find(name);
83  if (it == histograms_.end()) {
84    return 0;
85  }
86  return it->second.total_;
87}
88
89void ClearHistograms() {
90  rtc::CritScope cs(&histogram_crit_);
91  for (auto& it : histograms_) {
92    it.second.last_ = -1;
93    it.second.total_ = 0;
94  }
95}
96}  // namespace test
97}  // namespace webrtc
98