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