12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram_base.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/sparse_histogram.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/statistics_recorder.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/pickle.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HistogramBaseTest : public testing::Test {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBaseTest() {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Each test will have a clean state (no Histogram / BucketRanges
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // registered).
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    statistics_recorder_ = NULL;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResetStatisticsRecorder();
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~HistogramBaseTest() {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete statistics_recorder_;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ResetStatisticsRecorder() {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete statistics_recorder_;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    statistics_recorder_ = new StatisticsRecorder();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StatisticsRecorder* statistics_recorder_;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistogramBaseTest, DeserializeHistogram) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* histogram = Histogram::FactoryGet(
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestHistogram", 1, 1000, 10,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (HistogramBase::kUmaTargetedHistogramFlag |
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HistogramBase::kIPCSerializationSourceFlag));
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(histogram->SerializeInfo(&pickle));
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter(pickle);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(histogram, deserialized);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetStatisticsRecorder();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter2(pickle);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deserialized = DeserializeHistogramInfo(&iter2);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(histogram, deserialized);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("TestHistogram", deserialized->histogram_name());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // kIPCSerializationSourceFlag will be cleared.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags());
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistogramBaseTest, DeserializeLinearHistogram) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* histogram = LinearHistogram::FactoryGet(
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestHistogram", 1, 1000, 10,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HistogramBase::kIPCSerializationSourceFlag);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(histogram->SerializeInfo(&pickle));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter(pickle);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(histogram, deserialized);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetStatisticsRecorder();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter2(pickle);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deserialized = DeserializeHistogramInfo(&iter2);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(histogram, deserialized);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("TestHistogram", deserialized->histogram_name());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, deserialized->flags());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* histogram = BooleanHistogram::FactoryGet(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(histogram->SerializeInfo(&pickle));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter(pickle);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(histogram, deserialized);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetStatisticsRecorder();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter2(pickle);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deserialized = DeserializeHistogramInfo(&iter2);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(histogram, deserialized);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("TestHistogram", deserialized->histogram_name());
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, deserialized->flags());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistogramBaseTest, DeserializeCustomHistogram) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<HistogramBase::Sample> ranges;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ranges.push_back(13);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ranges.push_back(5);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ranges.push_back(9);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* histogram = CustomHistogram::FactoryGet(
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(histogram->SerializeInfo(&pickle));
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter(pickle);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(histogram, deserialized);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetStatisticsRecorder();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter2(pickle);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deserialized = DeserializeHistogramInfo(&iter2);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(histogram, deserialized);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("TestHistogram", deserialized->histogram_name());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, deserialized->flags());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistogramBaseTest, DeserializeSparseHistogram) {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* histogram = SparseHistogram::FactoryGet(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Pickle pickle;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(histogram->SerializeInfo(&pickle));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter(pickle);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(histogram, deserialized);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetStatisticsRecorder();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PickleIterator iter2(pickle);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  deserialized = DeserializeHistogramInfo(&iter2);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(deserialized);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(histogram, deserialized);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("TestHistogram", deserialized->histogram_name());
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, deserialized->flags());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
158