Home | History | Annotate | Download | only in metrics
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/metrics/histogram.h"
      8 #include "base/metrics/histogram_base.h"
      9 #include "base/metrics/sparse_histogram.h"
     10 #include "base/metrics/statistics_recorder.h"
     11 #include "base/pickle.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace base {
     15 
     16 class HistogramBaseTest : public testing::Test {
     17  protected:
     18   HistogramBaseTest() {
     19     // Each test will have a clean state (no Histogram / BucketRanges
     20     // registered).
     21     ResetStatisticsRecorder();
     22   }
     23 
     24   ~HistogramBaseTest() override {
     25     HistogramBase::report_histogram_ = nullptr;
     26   }
     27 
     28   void ResetStatisticsRecorder() {
     29     // It is necessary to fully destruct any existing StatisticsRecorder
     30     // before creating a new one.
     31     statistics_recorder_.reset();
     32     statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
     33   }
     34 
     35   HistogramBase* GetCreationReportHistogram(const std::string& name) {
     36     HistogramBase::EnableActivityReportHistogram(name);
     37     return HistogramBase::report_histogram_;
     38   }
     39 
     40  private:
     41   std::unique_ptr<StatisticsRecorder> statistics_recorder_;
     42 
     43   DISALLOW_COPY_AND_ASSIGN(HistogramBaseTest);
     44 };
     45 
     46 TEST_F(HistogramBaseTest, DeserializeHistogram) {
     47   HistogramBase* histogram = Histogram::FactoryGet(
     48       "TestHistogram", 1, 1000, 10,
     49       (HistogramBase::kUmaTargetedHistogramFlag |
     50       HistogramBase::kIPCSerializationSourceFlag));
     51 
     52   Pickle pickle;
     53   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
     54 
     55   PickleIterator iter(pickle);
     56   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
     57   EXPECT_EQ(histogram, deserialized);
     58 
     59   ResetStatisticsRecorder();
     60 
     61   PickleIterator iter2(pickle);
     62   deserialized = DeserializeHistogramInfo(&iter2);
     63   EXPECT_TRUE(deserialized);
     64   EXPECT_NE(histogram, deserialized);
     65   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
     66   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
     67 
     68   // kIPCSerializationSourceFlag will be cleared.
     69   EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags());
     70 }
     71 
     72 TEST_F(HistogramBaseTest, DeserializeLinearHistogram) {
     73   HistogramBase* histogram = LinearHistogram::FactoryGet(
     74       "TestHistogram", 1, 1000, 10,
     75       HistogramBase::kIPCSerializationSourceFlag);
     76 
     77   Pickle pickle;
     78   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
     79 
     80   PickleIterator iter(pickle);
     81   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
     82   EXPECT_EQ(histogram, deserialized);
     83 
     84   ResetStatisticsRecorder();
     85 
     86   PickleIterator iter2(pickle);
     87   deserialized = DeserializeHistogramInfo(&iter2);
     88   EXPECT_TRUE(deserialized);
     89   EXPECT_NE(histogram, deserialized);
     90   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
     91   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
     92   EXPECT_EQ(0, deserialized->flags());
     93 }
     94 
     95 TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) {
     96   HistogramBase* histogram = BooleanHistogram::FactoryGet(
     97       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
     98 
     99   Pickle pickle;
    100   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    101 
    102   PickleIterator iter(pickle);
    103   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    104   EXPECT_EQ(histogram, deserialized);
    105 
    106   ResetStatisticsRecorder();
    107 
    108   PickleIterator iter2(pickle);
    109   deserialized = DeserializeHistogramInfo(&iter2);
    110   EXPECT_TRUE(deserialized);
    111   EXPECT_NE(histogram, deserialized);
    112   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    113   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3));
    114   EXPECT_EQ(0, deserialized->flags());
    115 }
    116 
    117 TEST_F(HistogramBaseTest, DeserializeCustomHistogram) {
    118   std::vector<HistogramBase::Sample> ranges;
    119   ranges.push_back(13);
    120   ranges.push_back(5);
    121   ranges.push_back(9);
    122 
    123   HistogramBase* histogram = CustomHistogram::FactoryGet(
    124       "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag);
    125 
    126   Pickle pickle;
    127   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    128 
    129   PickleIterator iter(pickle);
    130   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    131   EXPECT_EQ(histogram, deserialized);
    132 
    133   ResetStatisticsRecorder();
    134 
    135   PickleIterator iter2(pickle);
    136   deserialized = DeserializeHistogramInfo(&iter2);
    137   EXPECT_TRUE(deserialized);
    138   EXPECT_NE(histogram, deserialized);
    139   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    140   EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4));
    141   EXPECT_EQ(0, deserialized->flags());
    142 }
    143 
    144 TEST_F(HistogramBaseTest, DeserializeSparseHistogram) {
    145   HistogramBase* histogram = SparseHistogram::FactoryGet(
    146       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
    147 
    148   Pickle pickle;
    149   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    150 
    151   PickleIterator iter(pickle);
    152   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    153   EXPECT_EQ(histogram, deserialized);
    154 
    155   ResetStatisticsRecorder();
    156 
    157   PickleIterator iter2(pickle);
    158   deserialized = DeserializeHistogramInfo(&iter2);
    159   EXPECT_TRUE(deserialized);
    160   EXPECT_NE(histogram, deserialized);
    161   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    162   EXPECT_EQ(0, deserialized->flags());
    163 }
    164 
    165 TEST_F(HistogramBaseTest, CreationReportHistogram) {
    166   // Enabled creation report. Itself is not included in the report.
    167   HistogramBase* report = GetCreationReportHistogram("CreationReportTest");
    168   ASSERT_TRUE(report);
    169 
    170   std::vector<HistogramBase::Sample> ranges;
    171   ranges.push_back(1);
    172   ranges.push_back(2);
    173   ranges.push_back(4);
    174   ranges.push_back(8);
    175   ranges.push_back(10);
    176 
    177   // Create all histogram types and verify counts.
    178   Histogram::FactoryGet("CRH-Histogram", 1, 10, 5, 0);
    179   LinearHistogram::FactoryGet("CRH-Linear", 1, 10, 5, 0);
    180   BooleanHistogram::FactoryGet("CRH-Boolean", 0);
    181   CustomHistogram::FactoryGet("CRH-Custom", ranges, 0);
    182   SparseHistogram::FactoryGet("CRH-Sparse", 0);
    183 
    184   std::unique_ptr<HistogramSamples> samples = report->SnapshotSamples();
    185   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_CREATED));
    186   EXPECT_EQ(5, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_CREATED));
    187   EXPECT_EQ(0, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_LOOKUP));
    188   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_TYPE_LOGARITHMIC));
    189   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_TYPE_LINEAR));
    190   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_TYPE_BOOLEAN));
    191   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_TYPE_CUSTOM));
    192   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_TYPE_SPARSE));
    193 
    194   // Create all flag types and verify counts.
    195   Histogram::FactoryGet("CRH-Histogram-UMA-Targeted", 1, 10, 5,
    196                         HistogramBase::kUmaTargetedHistogramFlag);
    197   Histogram::FactoryGet("CRH-Histogram-UMA-Stability", 1, 10, 5,
    198                         HistogramBase::kUmaStabilityHistogramFlag);
    199   SparseHistogram::FactoryGet("CRH-Sparse-UMA-Targeted",
    200                               HistogramBase::kUmaTargetedHistogramFlag);
    201   SparseHistogram::FactoryGet("CRH-Sparse-UMA-Stability",
    202                               HistogramBase::kUmaStabilityHistogramFlag);
    203   samples = report->SnapshotSamples();
    204   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_CREATED));
    205   EXPECT_EQ(9, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_CREATED));
    206   EXPECT_EQ(0, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_LOOKUP));
    207   EXPECT_EQ(2, samples->GetCount(HISTOGRAM_REPORT_FLAG_UMA_TARGETED));
    208   EXPECT_EQ(2, samples->GetCount(HISTOGRAM_REPORT_FLAG_UMA_STABILITY));
    209 
    210   // Do lookup of existing histograms and verify counts.
    211   Histogram::FactoryGet("CRH-Histogram", 1, 10, 5, 0);
    212   LinearHistogram::FactoryGet("CRH-Linear", 1, 10, 5, 0);
    213   BooleanHistogram::FactoryGet("CRH-Boolean", 0);
    214   CustomHistogram::FactoryGet("CRH-Custom", ranges, 0);
    215   SparseHistogram::FactoryGet("CRH-Sparse", 0);
    216   samples = report->SnapshotSamples();
    217   EXPECT_EQ(1, samples->GetCount(HISTOGRAM_REPORT_CREATED));
    218   EXPECT_EQ(9, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_CREATED));
    219   EXPECT_EQ(5, samples->GetCount(HISTOGRAM_REPORT_HISTOGRAM_LOOKUP));
    220 }
    221 
    222 }  // namespace base
    223