| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/metrics/sparse_histogram.h" | 
 |  | 
 | #include <string> | 
 |  | 
 | #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/statistics_recorder.h" | 
 | #include "base/pickle.h" | 
 | #include "base/strings/stringprintf.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | class SparseHistogramTest : public testing::Test { | 
 |  protected: | 
 |   void SetUp() override { | 
 |     // Each test will have a clean state (no Histogram / BucketRanges | 
 |     // registered). | 
 |     InitializeStatisticsRecorder(); | 
 |   } | 
 |  | 
 |   void TearDown() override { 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) { | 
 |   scoped_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse")); | 
 |   scoped_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples()); | 
 |   EXPECT_EQ(0, snapshot->TotalCount()); | 
 |   EXPECT_EQ(0, snapshot->sum()); | 
 |  | 
 |   histogram->Add(100); | 
 |   scoped_ptr<HistogramSamples> snapshot1(histogram->SnapshotSamples()); | 
 |   EXPECT_EQ(1, snapshot1->TotalCount()); | 
 |   EXPECT_EQ(1, snapshot1->GetCount(100)); | 
 |  | 
 |   histogram->Add(100); | 
 |   histogram->Add(101); | 
 |   scoped_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples()); | 
 |   EXPECT_EQ(3, snapshot2->TotalCount()); | 
 |   EXPECT_EQ(2, snapshot2->GetCount(100)); | 
 |   EXPECT_EQ(1, snapshot2->GetCount(101)); | 
 | } | 
 |  | 
 | TEST_F(SparseHistogramTest, MacroBasicTest) { | 
 |   UMA_HISTOGRAM_SPARSE_SLOWLY("Sparse", 100); | 
 |   UMA_HISTOGRAM_SPARSE_SLOWLY("Sparse", 200); | 
 |   UMA_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::kUmaTargetedHistogramFlag, | 
 |             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, 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); | 
 |  | 
 |   Pickle pickle; | 
 |   histogram->SerializeInfo(&pickle); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |  | 
 |   int type; | 
 |   EXPECT_TRUE(iter.ReadInt(&type)); | 
 |   EXPECT_EQ(SPARSE_HISTOGRAM, type); | 
 |  | 
 |   std::string name; | 
 |   EXPECT_TRUE(iter.ReadString(&name)); | 
 |   EXPECT_EQ("Sparse", name); | 
 |  | 
 |   int flag; | 
 |   EXPECT_TRUE(iter.ReadInt(&flag)); | 
 |   EXPECT_EQ(HistogramBase::kIPCSerializationSourceFlag, flag); | 
 |  | 
 |   // No more data in the pickle. | 
 |   EXPECT_FALSE(iter.SkipBytes(1)); | 
 | } | 
 |  | 
 | }  // namespace base |