diff options
author | kaiwang@chromium.org <kaiwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 09:15:54 +0000 |
---|---|---|
committer | kaiwang@chromium.org <kaiwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 09:15:54 +0000 |
commit | 5418aeb6b657258dfda542bdaacc024307a6f9f1 (patch) | |
tree | 4d48953093b32d234c89557a7f3dccb6debd549c /base/metrics | |
parent | a8335ac0b154ec9e6509bbed2ca6991352bac91a (diff) | |
download | chromium_src-5418aeb6b657258dfda542bdaacc024307a6f9f1.zip chromium_src-5418aeb6b657258dfda542bdaacc024307a6f9f1.tar.gz chromium_src-5418aeb6b657258dfda542bdaacc024307a6f9f1.tar.bz2 |
SparseHistogram macros
BUG=139612
Review URL: https://chromiumcodereview.appspot.com/12897003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188556 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/metrics')
-rw-r--r-- | base/metrics/sparse_histogram.h | 34 | ||||
-rw-r--r-- | base/metrics/sparse_histogram_unittest.cc | 77 | ||||
-rw-r--r-- | base/metrics/statistics_recorder.h | 1 |
3 files changed, 112 insertions, 0 deletions
diff --git a/base/metrics/sparse_histogram.h b/base/metrics/sparse_histogram.h index ae4530a..9c20766 100644 --- a/base/metrics/sparse_histogram.h +++ b/base/metrics/sparse_histogram.h @@ -11,6 +11,7 @@ #include "base/base_export.h" #include "base/basictypes.h" #include "base/compiler_specific.h" +#include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/metrics/histogram_base.h" #include "base/metrics/sample_map.h" @@ -18,6 +19,39 @@ namespace base { +// The common code for different SparseHistogram macros. +#define HISTOGRAM_SPARSE_COMMON(name, sample, flag) \ + do { \ + base::HistogramBase* histogram( \ + base::SparseHistogram::FactoryGet(name, flag)); \ + DCHECK_EQ(histogram->histogram_name(), name); \ + histogram->Add(sample); \ + } while (0) + +#define HISTOGRAM_SPARSE_SLOWLY(name, sample) \ + HISTOGRAM_SPARSE_COMMON(name, sample, base::HistogramBase::kNoFlags) + +#define UMA_HISTOGRAM_SPARSE_SLOWLY(name, sample) \ + HISTOGRAM_SPARSE_COMMON(name, sample, \ + base::HistogramBase::kUmaTargetedHistogramFlag) + +//------------------------------------------------------------------------------ +// Define debug only version of macros. +#ifndef NDEBUG + +#define DHISTOGRAM_SPARSE_SLOWLY(name, sample) \ + HISTOGRAM_SPARSE_SLOWLY(name, sample) + +#else // NDEBUG + +#define DHISTOGRAM_SPARSE_SLOWLY(name, sample) \ + while (0) { \ + static_cast<void>(name); \ + static_cast<void>(sample); \ + } + +#endif // NDEBUG + class HistogramSamples; class BASE_EXPORT_PRIVATE SparseHistogram : public HistogramBase { diff --git a/base/metrics/sparse_histogram_unittest.cc b/base/metrics/sparse_histogram_unittest.cc index 1b52b6c..d9db5d0 100644 --- a/base/metrics/sparse_histogram_unittest.cc +++ b/base/metrics/sparse_histogram_unittest.cc @@ -6,18 +6,42 @@ #include "base/memory/scoped_ptr.h" #include "base/metrics/histogram_base.h" +#include "base/metrics/histogram_samples.h" #include "base/metrics/sample_map.h" #include "base/metrics/sparse_histogram.h" +#include "base/metrics/statistics_recorder.h" #include "base/pickle.h" +#include "base/stringprintf.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { class SparseHistogramTest : public testing::Test { protected: + virtual void SetUp() { + // Each test will have a clean state (no Histogram / BucketRanges + // registered). + InitializeStatisticsRecorder(); + } + + virtual void TearDown() { + UninitializeStatisticsRecorder(); + } + + void InitializeStatisticsRecorder() { + statistics_recorder_ = new StatisticsRecorder(); + } + + void UninitializeStatisticsRecorder() { + delete statistics_recorder_; + statistics_recorder_ = NULL; + } + scoped_ptr<SparseHistogram> NewSparseHistogram(const std::string& name) { return scoped_ptr<SparseHistogram>(new SparseHistogram(name)); } + + StatisticsRecorder* statistics_recorder_; }; TEST_F(SparseHistogramTest, BasicTest) { @@ -39,6 +63,59 @@ TEST_F(SparseHistogramTest, BasicTest) { EXPECT_EQ(1, snapshot2->GetCount(101)); } +TEST_F(SparseHistogramTest, MacroBasicTest) { + HISTOGRAM_SPARSE_SLOWLY("Sparse", 100); + HISTOGRAM_SPARSE_SLOWLY("Sparse", 200); + HISTOGRAM_SPARSE_SLOWLY("Sparse", 100); + + StatisticsRecorder::Histograms histograms; + StatisticsRecorder::GetHistograms(&histograms); + + ASSERT_EQ(1U, histograms.size()); + HistogramBase* sparse_histogram = histograms[0]; + + EXPECT_EQ(SPARSE_HISTOGRAM, sparse_histogram->GetHistogramType()); + EXPECT_EQ("Sparse", sparse_histogram->histogram_name()); + EXPECT_EQ(HistogramBase::kNoFlags, sparse_histogram->flags()); + + scoped_ptr<HistogramSamples> samples = sparse_histogram->SnapshotSamples(); + EXPECT_EQ(3, samples->TotalCount()); + EXPECT_EQ(2, samples->GetCount(100)); + EXPECT_EQ(1, samples->GetCount(200)); +} + +TEST_F(SparseHistogramTest, MacroUmaTest) { + UMA_HISTOGRAM_SPARSE_SLOWLY("Uma", 100); + + StatisticsRecorder::Histograms histograms; + StatisticsRecorder::GetHistograms(&histograms); + + ASSERT_EQ(1U, histograms.size()); + HistogramBase* sparse_histogram = histograms[0]; + + EXPECT_EQ("Uma", sparse_histogram->histogram_name()); + EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, + sparse_histogram->flags()); +} + +TEST_F(SparseHistogramTest, MacroInLoopTest) { + // Unlike the macros in histogram.h, SparseHistogram macros can have a + // variable as histogram name. + for (int i = 0; i < 2; i++) { + std::string name = StringPrintf("Sparse%d", i + 1); + UMA_HISTOGRAM_SPARSE_SLOWLY(name, 100); + } + + StatisticsRecorder::Histograms histograms; + StatisticsRecorder::GetHistograms(&histograms); + ASSERT_EQ(2U, histograms.size()); + + std::string name1 = histograms[0]->histogram_name(); + std::string name2 = histograms[1]->histogram_name(); + EXPECT_TRUE(("Sparse1" == name1 && "Sparse2" == name2) || + ("Sparse2" == name1 && "Sparse1" == name2)); +} + TEST_F(SparseHistogramTest, Serialize) { scoped_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse")); histogram->SetFlags(HistogramBase::kIPCSerializationSourceFlag); diff --git a/base/metrics/statistics_recorder.h b/base/metrics/statistics_recorder.h index 4bb2548..4738802 100644 --- a/base/metrics/statistics_recorder.h +++ b/base/metrics/statistics_recorder.h @@ -92,6 +92,7 @@ class BASE_EXPORT StatisticsRecorder { friend struct DefaultLazyInstanceTraits<StatisticsRecorder>; friend class HistogramBaseTest; friend class HistogramTest; + friend class SparseHistogramTest; friend class StatisticsRecorderTest; // The constructor just initializes static members. Usually client code should |