1 // Copyright 2014 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 "base/metrics/histogram_snapshot_manager.h"
6 
7 #include <string>
8 #include <vector>
9 
10 #include "base/macros.h"
11 #include "base/metrics/histogram_delta_serialization.h"
12 #include "base/metrics/histogram_macros.h"
13 #include "base/metrics/statistics_recorder.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace base {
17 
18 class HistogramFlattenerDeltaRecorder : public HistogramFlattener {
19  public:
HistogramFlattenerDeltaRecorder()20   HistogramFlattenerDeltaRecorder() {}
21 
RecordDelta(const HistogramBase & histogram,const HistogramSamples & snapshot)22   void RecordDelta(const HistogramBase& histogram,
23                    const HistogramSamples& snapshot) override {
24     recorded_delta_histogram_names_.push_back(histogram.histogram_name());
25   }
26 
InconsistencyDetected(HistogramBase::Inconsistency problem)27   void InconsistencyDetected(HistogramBase::Inconsistency problem) override {
28     ASSERT_TRUE(false);
29   }
30 
UniqueInconsistencyDetected(HistogramBase::Inconsistency problem)31   void UniqueInconsistencyDetected(
32       HistogramBase::Inconsistency problem) override {
33     ASSERT_TRUE(false);
34   }
35 
InconsistencyDetectedInLoggedCount(int amount)36   void InconsistencyDetectedInLoggedCount(int amount) override {
37     ASSERT_TRUE(false);
38   }
39 
GetRecordedDeltaHistogramNames()40   std::vector<std::string> GetRecordedDeltaHistogramNames() {
41     return recorded_delta_histogram_names_;
42   }
43 
44  private:
45   std::vector<std::string> recorded_delta_histogram_names_;
46 
47   DISALLOW_COPY_AND_ASSIGN(HistogramFlattenerDeltaRecorder);
48 };
49 
50 class HistogramSnapshotManagerTest : public testing::Test {
51  protected:
HistogramSnapshotManagerTest()52   HistogramSnapshotManagerTest()
53       : histogram_snapshot_manager_(&histogram_flattener_delta_recorder_) {}
54 
~HistogramSnapshotManagerTest()55   ~HistogramSnapshotManagerTest() override {}
56 
57   StatisticsRecorder statistics_recorder_;
58   HistogramFlattenerDeltaRecorder histogram_flattener_delta_recorder_;
59   HistogramSnapshotManager histogram_snapshot_manager_;
60 };
61 
TEST_F(HistogramSnapshotManagerTest,PrepareDeltasNoFlagsFilter)62 TEST_F(HistogramSnapshotManagerTest, PrepareDeltasNoFlagsFilter) {
63   // kNoFlags filter should record all histograms.
64   UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 2);
65   UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
66 
67   histogram_snapshot_manager_.PrepareDeltas(HistogramBase::kNoFlags,
68                                             HistogramBase::kNoFlags);
69 
70   const std::vector<std::string>& histograms =
71       histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
72   EXPECT_EQ(2U, histograms.size());
73   EXPECT_EQ("UmaHistogram", histograms[0]);
74   EXPECT_EQ("UmaStabilityHistogram", histograms[1]);
75 }
76 
TEST_F(HistogramSnapshotManagerTest,PrepareDeltasUmaHistogramFlagFilter)77 TEST_F(HistogramSnapshotManagerTest, PrepareDeltasUmaHistogramFlagFilter) {
78   // Note that kUmaStabilityHistogramFlag includes kUmaTargetedHistogramFlag.
79   UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 2);
80   UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
81 
82   histogram_snapshot_manager_.PrepareDeltas(
83       HistogramBase::kNoFlags, HistogramBase::kUmaTargetedHistogramFlag);
84 
85   const std::vector<std::string>& histograms =
86       histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
87   EXPECT_EQ(2U, histograms.size());
88   EXPECT_EQ("UmaHistogram", histograms[0]);
89   EXPECT_EQ("UmaStabilityHistogram", histograms[1]);
90 }
91 
TEST_F(HistogramSnapshotManagerTest,PrepareDeltasUmaStabilityHistogramFlagFilter)92 TEST_F(HistogramSnapshotManagerTest,
93        PrepareDeltasUmaStabilityHistogramFlagFilter) {
94   UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 2);
95   UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
96 
97   histogram_snapshot_manager_.PrepareDeltas(
98       HistogramBase::kNoFlags, HistogramBase::kUmaStabilityHistogramFlag);
99 
100   const std::vector<std::string>& histograms =
101       histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
102   EXPECT_EQ(1U, histograms.size());
103   EXPECT_EQ("UmaStabilityHistogram", histograms[0]);
104 }
105 
106 }  // namespace base
107