summaryrefslogtreecommitdiffstats
path: root/base/metrics
diff options
context:
space:
mode:
authorkaiwang@chromium.org <kaiwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 09:15:54 +0000
committerkaiwang@chromium.org <kaiwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 09:15:54 +0000
commit5418aeb6b657258dfda542bdaacc024307a6f9f1 (patch)
tree4d48953093b32d234c89557a7f3dccb6debd549c /base/metrics
parenta8335ac0b154ec9e6509bbed2ca6991352bac91a (diff)
downloadchromium_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.h34
-rw-r--r--base/metrics/sparse_histogram_unittest.cc77
-rw-r--r--base/metrics/statistics_recorder.h1
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