1352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson/*
2352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *
4352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  Use of this source code is governed by a BSD-style license
5352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  that can be found in the LICENSE file in the root of the source
6352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  tree. An additional intellectual property rights grant can be found
7352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  in the file PATENTS.  All contributing project authors may
8352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson *  be found in the AUTHORS file in the root of the source tree.
9352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson */
10352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
11352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson#include "webrtc/test/histogram.h"
12352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
13352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson#include <map>
14352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
151fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson#include "webrtc/base/checks.h"
16a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson#include "webrtc/base/criticalsection.h"
17a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson#include "webrtc/base/thread_annotations.h"
1898f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/metrics.h"
19352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
20352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson// Test implementation of histogram methods in
2198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander// webrtc/system_wrappers/include/metrics.h.
22352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
23352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonnamespace webrtc {
24352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonnamespace {
25a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Perssonstruct SampleInfo {
261fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  SampleInfo(const std::string& name) : name_(name), last_(-1), total_(0) {}
271fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  const std::string name_;
281fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  int last_;   // Last added sample.
291fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  int total_;  // Total number of added samples.
30a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson};
31a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson
32a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Perssonrtc::CriticalSection histogram_crit_;
33a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson// Map holding info about added samples to a histogram (mapped by the histogram
34a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson// name).
35a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Perssonstd::map<std::string, SampleInfo> histograms_ GUARDED_BY(histogram_crit_);
36352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}  // namespace
37352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
38352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonnamespace metrics {
39352b2d7a19d6313273608c26edf8900e592a3831Åsa PerssonHistogram* HistogramFactoryGetCounts(const std::string& name, int min, int max,
401fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson                                     int bucket_count) {
411fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  rtc::CritScope cs(&histogram_crit_);
421fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  if (histograms_.find(name) == histograms_.end()) {
431fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson    histograms_.insert(std::make_pair(name, SampleInfo(name)));
441fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  }
451fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  auto it = histograms_.find(name);
461fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  return reinterpret_cast<Histogram*>(&it->second);
471fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson}
48352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
49352b2d7a19d6313273608c26edf8900e592a3831Åsa PerssonHistogram* HistogramFactoryGetEnumeration(const std::string& name,
501fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson                                          int boundary) {
511fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  rtc::CritScope cs(&histogram_crit_);
521fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  if (histograms_.find(name) == histograms_.end()) {
531fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson    histograms_.insert(std::make_pair(name, SampleInfo(name)));
541fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  }
551fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  auto it = histograms_.find(name);
561fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  return reinterpret_cast<Histogram*>(&it->second);
571fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson}
58352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
59352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonvoid HistogramAdd(
60352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson    Histogram* histogram_pointer, const std::string& name, int sample) {
61a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  rtc::CritScope cs(&histogram_crit_);
621fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  SampleInfo* ptr = reinterpret_cast<SampleInfo*>(histogram_pointer);
631fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  // The name should not vary.
641fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  RTC_CHECK(ptr->name_ == name);
651fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  ptr->last_ = sample;
661fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  ++ptr->total_;
67352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}
68352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}  // namespace metrics
69352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson
70352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonnamespace test {
71352b2d7a19d6313273608c26edf8900e592a3831Åsa Perssonint LastHistogramSample(const std::string& name) {
72a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  rtc::CritScope cs(&histogram_crit_);
73a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  const auto it = histograms_.find(name);
74352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  if (it == histograms_.end()) {
75352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson    return -1;
76352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson  }
771fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  return it->second.last_;
78a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson}
79a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson
80a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Perssonint NumHistogramSamples(const std::string& name) {
81a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  rtc::CritScope cs(&histogram_crit_);
82a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  const auto it = histograms_.find(name);
83a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  if (it == histograms_.end()) {
84a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson    return 0;
85a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  }
861fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  return it->second.total_;
87a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson}
88a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson
89a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Perssonvoid ClearHistograms() {
90a96f02b6f3ba1bdce601a81cf9f48c321162460eÅsa Persson  rtc::CritScope cs(&histogram_crit_);
911fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  for (auto& it : histograms_) {
921fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson    it.second.last_ = -1;
931fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson    it.second.total_ = 0;
941fe48a5e1dbc752b24b6c63eb2e6abd80c01c1dcasapersson  }
95352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}
96352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}  // namespace test
97352b2d7a19d6313273608c26edf8900e592a3831Åsa Persson}  // namespace webrtc
98