| // 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 <vector> | 
 |  | 
 | #include "base/metrics/histogram.h" | 
 | #include "base/metrics/histogram_base.h" | 
 | #include "base/metrics/sparse_histogram.h" | 
 | #include "base/metrics/statistics_recorder.h" | 
 | #include "base/pickle.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | class HistogramBaseTest : public testing::Test { | 
 |  protected: | 
 |   HistogramBaseTest() { | 
 |     // Each test will have a clean state (no Histogram / BucketRanges | 
 |     // registered). | 
 |     statistics_recorder_ = NULL; | 
 |     ResetStatisticsRecorder(); | 
 |   } | 
 |  | 
 |   ~HistogramBaseTest() override { delete statistics_recorder_; } | 
 |  | 
 |   void ResetStatisticsRecorder() { | 
 |     delete statistics_recorder_; | 
 |     statistics_recorder_ = new StatisticsRecorder(); | 
 |   } | 
 |  | 
 |  private: | 
 |   StatisticsRecorder* statistics_recorder_; | 
 | }; | 
 |  | 
 | TEST_F(HistogramBaseTest, DeserializeHistogram) { | 
 |   HistogramBase* histogram = Histogram::FactoryGet( | 
 |       "TestHistogram", 1, 1000, 10, | 
 |       (HistogramBase::kUmaTargetedHistogramFlag | | 
 |       HistogramBase::kIPCSerializationSourceFlag)); | 
 |  | 
 |   Pickle pickle; | 
 |   ASSERT_TRUE(histogram->SerializeInfo(&pickle)); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |   HistogramBase* deserialized = DeserializeHistogramInfo(&iter); | 
 |   EXPECT_EQ(histogram, deserialized); | 
 |  | 
 |   ResetStatisticsRecorder(); | 
 |  | 
 |   PickleIterator iter2(pickle); | 
 |   deserialized = DeserializeHistogramInfo(&iter2); | 
 |   EXPECT_TRUE(deserialized); | 
 |   EXPECT_NE(histogram, deserialized); | 
 |   EXPECT_EQ("TestHistogram", deserialized->histogram_name()); | 
 |   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10)); | 
 |  | 
 |   // kIPCSerializationSourceFlag will be cleared. | 
 |   EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags()); | 
 | } | 
 |  | 
 | TEST_F(HistogramBaseTest, DeserializeLinearHistogram) { | 
 |   HistogramBase* histogram = LinearHistogram::FactoryGet( | 
 |       "TestHistogram", 1, 1000, 10, | 
 |       HistogramBase::kIPCSerializationSourceFlag); | 
 |  | 
 |   Pickle pickle; | 
 |   ASSERT_TRUE(histogram->SerializeInfo(&pickle)); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |   HistogramBase* deserialized = DeserializeHistogramInfo(&iter); | 
 |   EXPECT_EQ(histogram, deserialized); | 
 |  | 
 |   ResetStatisticsRecorder(); | 
 |  | 
 |   PickleIterator iter2(pickle); | 
 |   deserialized = DeserializeHistogramInfo(&iter2); | 
 |   EXPECT_TRUE(deserialized); | 
 |   EXPECT_NE(histogram, deserialized); | 
 |   EXPECT_EQ("TestHistogram", deserialized->histogram_name()); | 
 |   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10)); | 
 |   EXPECT_EQ(0, deserialized->flags()); | 
 | } | 
 |  | 
 | TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) { | 
 |   HistogramBase* histogram = BooleanHistogram::FactoryGet( | 
 |       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag); | 
 |  | 
 |   Pickle pickle; | 
 |   ASSERT_TRUE(histogram->SerializeInfo(&pickle)); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |   HistogramBase* deserialized = DeserializeHistogramInfo(&iter); | 
 |   EXPECT_EQ(histogram, deserialized); | 
 |  | 
 |   ResetStatisticsRecorder(); | 
 |  | 
 |   PickleIterator iter2(pickle); | 
 |   deserialized = DeserializeHistogramInfo(&iter2); | 
 |   EXPECT_TRUE(deserialized); | 
 |   EXPECT_NE(histogram, deserialized); | 
 |   EXPECT_EQ("TestHistogram", deserialized->histogram_name()); | 
 |   EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3)); | 
 |   EXPECT_EQ(0, deserialized->flags()); | 
 | } | 
 |  | 
 | TEST_F(HistogramBaseTest, DeserializeCustomHistogram) { | 
 |   std::vector<HistogramBase::Sample> ranges; | 
 |   ranges.push_back(13); | 
 |   ranges.push_back(5); | 
 |   ranges.push_back(9); | 
 |  | 
 |   HistogramBase* histogram = CustomHistogram::FactoryGet( | 
 |       "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag); | 
 |  | 
 |   Pickle pickle; | 
 |   ASSERT_TRUE(histogram->SerializeInfo(&pickle)); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |   HistogramBase* deserialized = DeserializeHistogramInfo(&iter); | 
 |   EXPECT_EQ(histogram, deserialized); | 
 |  | 
 |   ResetStatisticsRecorder(); | 
 |  | 
 |   PickleIterator iter2(pickle); | 
 |   deserialized = DeserializeHistogramInfo(&iter2); | 
 |   EXPECT_TRUE(deserialized); | 
 |   EXPECT_NE(histogram, deserialized); | 
 |   EXPECT_EQ("TestHistogram", deserialized->histogram_name()); | 
 |   EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4)); | 
 |   EXPECT_EQ(0, deserialized->flags()); | 
 | } | 
 |  | 
 | TEST_F(HistogramBaseTest, DeserializeSparseHistogram) { | 
 |   HistogramBase* histogram = SparseHistogram::FactoryGet( | 
 |       "TestHistogram", HistogramBase::kIPCSerializationSourceFlag); | 
 |  | 
 |   Pickle pickle; | 
 |   ASSERT_TRUE(histogram->SerializeInfo(&pickle)); | 
 |  | 
 |   PickleIterator iter(pickle); | 
 |   HistogramBase* deserialized = DeserializeHistogramInfo(&iter); | 
 |   EXPECT_EQ(histogram, deserialized); | 
 |  | 
 |   ResetStatisticsRecorder(); | 
 |  | 
 |   PickleIterator iter2(pickle); | 
 |   deserialized = DeserializeHistogramInfo(&iter2); | 
 |   EXPECT_TRUE(deserialized); | 
 |   EXPECT_NE(histogram, deserialized); | 
 |   EXPECT_EQ("TestHistogram", deserialized->histogram_name()); | 
 |   EXPECT_EQ(0, deserialized->flags()); | 
 | } | 
 |  | 
 | }  // namespace base |