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