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     statistics_recorder_ = NULL;
     22     ResetStatisticsRecorder();
     23   }
     24 
     25   virtual ~HistogramBaseTest() {
     26     delete statistics_recorder_;
     27   }
     28 
     29   void ResetStatisticsRecorder() {
     30     delete statistics_recorder_;
     31     statistics_recorder_ = new StatisticsRecorder();
     32   }
     33 
     34  private:
     35   StatisticsRecorder* statistics_recorder_;
     36 };
     37 
     38 TEST_F(HistogramBaseTest, DeserializeHistogram) {
     39   HistogramBase* histogram = Histogram::FactoryGet(
     40       "TestHistogram", 1, 1000, 10,
     41       (HistogramBase::kUmaTargetedHistogramFlag |
     42       HistogramBase::kIPCSerializationSourceFlag));
     43 
     44   Pickle pickle;
     45   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
     46 
     47   PickleIterator iter(pickle);
     48   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
     49   EXPECT_EQ(histogram, deserialized);
     50 
     51   ResetStatisticsRecorder();
     52 
     53   PickleIterator iter2(pickle);
     54   deserialized = DeserializeHistogramInfo(&iter2);
     55   EXPECT_TRUE(deserialized);
     56   EXPECT_NE(histogram, deserialized);
     57   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
     58   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
     59 
     60   // kIPCSerializationSourceFlag will be cleared.
     61   EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags());
     62 }
     63 
     64 TEST_F(HistogramBaseTest, DeserializeHistogramAndAddSamples) {
     65   HistogramBase* histogram = Histogram::FactoryGet(
     66       "TestHistogram", 1, 1000, 10, HistogramBase::kIPCSerializationSourceFlag);
     67   histogram->Add(1);
     68   histogram->Add(10);
     69   histogram->Add(100);
     70   histogram->Add(1000);
     71 
     72   Pickle pickle;
     73   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
     74   histogram->SnapshotSamples()->Serialize(&pickle);
     75 
     76   PickleIterator iter(pickle);
     77   DeserializeHistogramAndAddSamples(&iter);
     78 
     79   // The histogram has kIPCSerializationSourceFlag. So samples will be ignored.
     80   scoped_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
     81   EXPECT_EQ(1, snapshot->GetCount(1));
     82   EXPECT_EQ(1, snapshot->GetCount(10));
     83   EXPECT_EQ(1, snapshot->GetCount(100));
     84   EXPECT_EQ(1, snapshot->GetCount(1000));
     85 
     86   // Clear kIPCSerializationSourceFlag to emulate multi-process usage.
     87   histogram->ClearFlags(HistogramBase::kIPCSerializationSourceFlag);
     88   PickleIterator iter2(pickle);
     89   DeserializeHistogramAndAddSamples(&iter2);
     90 
     91   scoped_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples());
     92   EXPECT_EQ(2, snapshot2->GetCount(1));
     93   EXPECT_EQ(2, snapshot2->GetCount(10));
     94   EXPECT_EQ(2, snapshot2->GetCount(100));
     95   EXPECT_EQ(2, snapshot2->GetCount(1000));
     96 }
     97 
     98 TEST_F(HistogramBaseTest, DeserializeLinearHistogram) {
     99   HistogramBase* histogram = LinearHistogram::FactoryGet(
    100       "TestHistogram", 1, 1000, 10,
    101       HistogramBase::kIPCSerializationSourceFlag);
    102 
    103   Pickle pickle;
    104   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    105 
    106   PickleIterator iter(pickle);
    107   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    108   EXPECT_EQ(histogram, deserialized);
    109 
    110   ResetStatisticsRecorder();
    111 
    112   PickleIterator iter2(pickle);
    113   deserialized = DeserializeHistogramInfo(&iter2);
    114   EXPECT_TRUE(deserialized);
    115   EXPECT_NE(histogram, deserialized);
    116   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    117   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
    118   EXPECT_EQ(0, deserialized->flags());
    119 }
    120 
    121 TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) {
    122   HistogramBase* histogram = BooleanHistogram::FactoryGet(
    123       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
    124 
    125   Pickle pickle;
    126   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    127 
    128   PickleIterator iter(pickle);
    129   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    130   EXPECT_EQ(histogram, deserialized);
    131 
    132   ResetStatisticsRecorder();
    133 
    134   PickleIterator iter2(pickle);
    135   deserialized = DeserializeHistogramInfo(&iter2);
    136   EXPECT_TRUE(deserialized);
    137   EXPECT_NE(histogram, deserialized);
    138   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    139   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3));
    140   EXPECT_EQ(0, deserialized->flags());
    141 }
    142 
    143 TEST_F(HistogramBaseTest, DeserializeCustomHistogram) {
    144   std::vector<HistogramBase::Sample> ranges;
    145   ranges.push_back(13);
    146   ranges.push_back(5);
    147   ranges.push_back(9);
    148 
    149   HistogramBase* histogram = CustomHistogram::FactoryGet(
    150       "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag);
    151 
    152   Pickle pickle;
    153   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    154 
    155   PickleIterator iter(pickle);
    156   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    157   EXPECT_EQ(histogram, deserialized);
    158 
    159   ResetStatisticsRecorder();
    160 
    161   PickleIterator iter2(pickle);
    162   deserialized = DeserializeHistogramInfo(&iter2);
    163   EXPECT_TRUE(deserialized);
    164   EXPECT_NE(histogram, deserialized);
    165   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    166   EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4));
    167   EXPECT_EQ(0, deserialized->flags());
    168 }
    169 
    170 TEST_F(HistogramBaseTest, DeserializeSparseHistogram) {
    171   HistogramBase* histogram = SparseHistogram::FactoryGet(
    172       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
    173 
    174   Pickle pickle;
    175   ASSERT_TRUE(histogram->SerializeInfo(&pickle));
    176 
    177   PickleIterator iter(pickle);
    178   HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
    179   EXPECT_EQ(histogram, deserialized);
    180 
    181   ResetStatisticsRecorder();
    182 
    183   PickleIterator iter2(pickle);
    184   deserialized = DeserializeHistogramInfo(&iter2);
    185   EXPECT_TRUE(deserialized);
    186   EXPECT_NE(histogram, deserialized);
    187   EXPECT_EQ("TestHistogram", deserialized->histogram_name());
    188   EXPECT_EQ(0, deserialized->flags());
    189 }
    190 
    191 }  // namespace base
    192