|  | // Copyright 2014 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 "base/metrics/histogram_snapshot_manager.h" | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/metrics/histogram_delta_serialization.h" | 
|  | #include "base/metrics/histogram_macros.h" | 
|  | #include "base/metrics/sample_vector.h" | 
|  | #include "base/metrics/statistics_recorder.h" | 
|  | #include "base/stl_util.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | class HistogramFlattenerDeltaRecorder : public HistogramFlattener { | 
|  | public: | 
|  | HistogramFlattenerDeltaRecorder() = default; | 
|  |  | 
|  | void RecordDelta(const HistogramBase& histogram, | 
|  | const HistogramSamples& snapshot) override { | 
|  | recorded_delta_histogram_names_.push_back(histogram.histogram_name()); | 
|  | // Use CHECK instead of ASSERT to get full stack-trace and thus origin. | 
|  | CHECK(!ContainsKey(recorded_delta_histogram_sum_, | 
|  | histogram.histogram_name())); | 
|  | // Keep pointer to snapshot for testing. This really isn't ideal but the | 
|  | // snapshot-manager keeps the snapshot alive until it's "forgotten". | 
|  | recorded_delta_histogram_sum_[histogram.histogram_name()] = snapshot.sum(); | 
|  | } | 
|  |  | 
|  | void Reset() { | 
|  | recorded_delta_histogram_names_.clear(); | 
|  | recorded_delta_histogram_sum_.clear(); | 
|  | } | 
|  |  | 
|  | std::vector<std::string> GetRecordedDeltaHistogramNames() { | 
|  | return recorded_delta_histogram_names_; | 
|  | } | 
|  |  | 
|  | int64_t GetRecordedDeltaHistogramSum(const std::string& name) { | 
|  | EXPECT_TRUE(ContainsKey(recorded_delta_histogram_sum_, name)); | 
|  | return recorded_delta_histogram_sum_[name]; | 
|  | } | 
|  |  | 
|  | private: | 
|  | std::vector<std::string> recorded_delta_histogram_names_; | 
|  | std::map<std::string, int64_t> recorded_delta_histogram_sum_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(HistogramFlattenerDeltaRecorder); | 
|  | }; | 
|  |  | 
|  | class HistogramSnapshotManagerTest : public testing::Test { | 
|  | protected: | 
|  | HistogramSnapshotManagerTest() | 
|  | : statistics_recorder_(StatisticsRecorder::CreateTemporaryForTesting()), | 
|  | histogram_snapshot_manager_(&histogram_flattener_delta_recorder_) {} | 
|  |  | 
|  | ~HistogramSnapshotManagerTest() override = default; | 
|  |  | 
|  | std::unique_ptr<StatisticsRecorder> statistics_recorder_; | 
|  | HistogramFlattenerDeltaRecorder histogram_flattener_delta_recorder_; | 
|  | HistogramSnapshotManager histogram_snapshot_manager_; | 
|  | }; | 
|  |  | 
|  | TEST_F(HistogramSnapshotManagerTest, PrepareDeltasNoFlagsFilter) { | 
|  | // kNoFlags filter should record all histograms. | 
|  | UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4); | 
|  | UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2); | 
|  |  | 
|  | StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags, | 
|  | HistogramBase::kNoFlags, | 
|  | &histogram_snapshot_manager_); | 
|  |  | 
|  | const std::vector<std::string>& histograms = | 
|  | histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames(); | 
|  | EXPECT_EQ(2U, histograms.size()); | 
|  | EXPECT_EQ("UmaHistogram", histograms[0]); | 
|  | EXPECT_EQ("UmaStabilityHistogram", histograms[1]); | 
|  | } | 
|  |  | 
|  | TEST_F(HistogramSnapshotManagerTest, PrepareDeltasUmaHistogramFlagFilter) { | 
|  | // Note that kUmaStabilityHistogramFlag includes kUmaTargetedHistogramFlag. | 
|  | UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4); | 
|  | UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2); | 
|  |  | 
|  | StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags, | 
|  | HistogramBase::kUmaTargetedHistogramFlag, | 
|  | &histogram_snapshot_manager_); | 
|  |  | 
|  | const std::vector<std::string>& histograms = | 
|  | histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames(); | 
|  | EXPECT_EQ(2U, histograms.size()); | 
|  | EXPECT_EQ("UmaHistogram", histograms[0]); | 
|  | EXPECT_EQ("UmaStabilityHistogram", histograms[1]); | 
|  | } | 
|  |  | 
|  | TEST_F(HistogramSnapshotManagerTest, | 
|  | PrepareDeltasUmaStabilityHistogramFlagFilter) { | 
|  | UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4); | 
|  | UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2); | 
|  |  | 
|  | StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags, | 
|  | HistogramBase::kUmaStabilityHistogramFlag, | 
|  | &histogram_snapshot_manager_); | 
|  |  | 
|  | const std::vector<std::string>& histograms = | 
|  | histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames(); | 
|  | EXPECT_EQ(1U, histograms.size()); | 
|  | EXPECT_EQ("UmaStabilityHistogram", histograms[0]); | 
|  | } | 
|  |  | 
|  | }  // namespace base |