OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_TEST_HISTOGRAM_TESTER_H_ | 5 #ifndef BASE_TEST_HISTOGRAM_TESTER_H_ |
6 #define BASE_TEST_HISTOGRAM_TESTER_H_ | 6 #define BASE_TEST_HISTOGRAM_TESTER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 #include <ostream> | 10 #include <ostream> |
11 #include <string> | 11 #include <string> |
12 #include <utility> | 12 #include <utility> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/macros.h" | 15 #include "base/macros.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/metrics/histogram_base.h" | 17 #include "base/metrics/histogram_base.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 | 19 |
20 namespace base { | 20 namespace base { |
21 | 21 |
22 struct Bucket; | 22 struct Bucket; |
23 class HistogramSamples; | 23 class HistogramSamples; |
24 | 24 |
25 // HistogramTester provides a simple interface for examining histograms, UMA | 25 // HistogramTester provides a simple interface for examining histograms, UMA |
26 // or otherwise. Tests can use this interface to verify that histogram data is | 26 // or otherwise. Tests can use this interface to verify that histogram data is |
27 // getting logged as intended. | 27 // getting logged as intended. |
28 class HistogramTester { | 28 class HistogramTester { |
29 public: | 29 public: |
30 using CountsMap = std::map<std::string, base::HistogramBase::Count>; | 30 using CountsMap = std::map<std::string, HistogramBase::Count>; |
31 | 31 |
32 // The constructor will call StatisticsRecorder::Initialize() for you. Also, | 32 // The constructor will call StatisticsRecorder::Initialize() for you. Also, |
33 // this takes a snapshot of all current histograms counts. | 33 // this takes a snapshot of all current histograms counts. |
34 HistogramTester(); | 34 HistogramTester(); |
35 ~HistogramTester(); | 35 ~HistogramTester(); |
36 | 36 |
37 // We know the exact number of samples in a bucket, and that no other bucket | 37 // We know the exact number of samples in a bucket, and that no other bucket |
38 // should have samples. Measures the diff from the snapshot taken when this | 38 // should have samples. Measures the diff from the snapshot taken when this |
39 // object was constructed. | 39 // object was constructed. |
40 void ExpectUniqueSample(const std::string& name, | 40 void ExpectUniqueSample(const std::string& name, |
41 base::HistogramBase::Sample sample, | 41 HistogramBase::Sample sample, |
42 base::HistogramBase::Count expected_count) const; | 42 HistogramBase::Count expected_count) const; |
43 | 43 |
44 // We know the exact number of samples in a bucket, but other buckets may | 44 // We know the exact number of samples in a bucket, but other buckets may |
45 // have samples as well. Measures the diff from the snapshot taken when this | 45 // have samples as well. Measures the diff from the snapshot taken when this |
46 // object was constructed. | 46 // object was constructed. |
47 void ExpectBucketCount(const std::string& name, | 47 void ExpectBucketCount(const std::string& name, |
48 base::HistogramBase::Sample sample, | 48 HistogramBase::Sample sample, |
49 base::HistogramBase::Count expected_count) const; | 49 HistogramBase::Count expected_count) const; |
50 | 50 |
51 // We don't know the values of the samples, but we know how many there are. | 51 // We don't know the values of the samples, but we know how many there are. |
52 // This measures the diff from the snapshot taken when this object was | 52 // This measures the diff from the snapshot taken when this object was |
53 // constructed. | 53 // constructed. |
54 void ExpectTotalCount(const std::string& name, | 54 void ExpectTotalCount(const std::string& name, |
55 base::HistogramBase::Count count) const; | 55 HistogramBase::Count count) const; |
56 | 56 |
57 // We know exact number of samples for buckets corresponding to a time | 57 // We know exact number of samples for buckets corresponding to a time |
58 // interval. Other intervals may have samples too. | 58 // interval. Other intervals may have samples too. |
59 void ExpectTimeBucketCount(const std::string& name, | 59 void ExpectTimeBucketCount(const std::string& name, |
60 base::TimeDelta sample, | 60 TimeDelta sample, |
61 base::HistogramBase::Count count) const; | 61 HistogramBase::Count count) const; |
62 | 62 |
63 // Returns a list of all of the buckets recorded since creation of this | 63 // Returns a list of all of the buckets recorded since creation of this |
64 // object, as vector<Bucket>, where the Bucket represents the min boundary of | 64 // object, as vector<Bucket>, where the Bucket represents the min boundary of |
65 // the bucket and the count of samples recorded to that bucket since creation. | 65 // the bucket and the count of samples recorded to that bucket since creation. |
66 // | 66 // |
67 // Example usage, using gMock: | 67 // Example usage, using gMock: |
68 // EXPECT_THAT(histogram_tester.GetAllSamples("HistogramName"), | 68 // EXPECT_THAT(histogram_tester.GetAllSamples("HistogramName"), |
69 // ElementsAre(Bucket(1, 5), Bucket(2, 10), Bucket(3, 5))); | 69 // ElementsAre(Bucket(1, 5), Bucket(2, 10), Bucket(3, 5))); |
70 // | 70 // |
71 // If you build the expected list programmatically, you can use ContainerEq: | 71 // If you build the expected list programmatically, you can use ContainerEq: |
72 // EXPECT_THAT(histogram_tester.GetAllSamples("HistogramName"), | 72 // EXPECT_THAT(histogram_tester.GetAllSamples("HistogramName"), |
73 // ContainerEq(expected_buckets)); | 73 // ContainerEq(expected_buckets)); |
74 // | 74 // |
75 // or EXPECT_EQ if you prefer not to depend on gMock, at the expense of a | 75 // or EXPECT_EQ if you prefer not to depend on gMock, at the expense of a |
76 // slightly less helpful failure message: | 76 // slightly less helpful failure message: |
77 // EXPECT_EQ(expected_buckets, | 77 // EXPECT_EQ(expected_buckets, |
78 // histogram_tester.GetAllSamples("HistogramName")); | 78 // histogram_tester.GetAllSamples("HistogramName")); |
79 std::vector<Bucket> GetAllSamples(const std::string& name) const; | 79 std::vector<Bucket> GetAllSamples(const std::string& name) const; |
80 | 80 |
81 // Finds histograms whose names start with |query|, and returns them along | 81 // Finds histograms whose names start with |prefix|, and returns them along |
82 // with the counts of any samples added since the creation of this object. | 82 // with the counts of any samples added since the creation of this object. |
83 // Histograms that are unchanged are omitted from the result. The return value | 83 // Histograms that are unchanged are omitted from the result. The return value |
84 // is a map whose keys are the histogram name, and whose values are the sample | 84 // is a map whose keys are the histogram name, and whose values are the sample |
85 // count. | 85 // count. |
86 // | 86 // |
87 // This is useful for cases where the code under test is choosing among a | 87 // This is useful for cases where the code under test is choosing among a |
88 // family of related histograms and incrementing one of them. Typically you | 88 // family of related histograms and incrementing one of them. Typically you |
89 // should pass the result of this function directly to EXPECT_THAT. | 89 // should pass the result of this function directly to EXPECT_THAT. |
90 // | 90 // |
91 // Example usage, using gmock (which produces better failure messages): | 91 // Example usage, using gmock (which produces better failure messages): |
92 // #include "testing/gmock/include/gmock/gmock.h" | 92 // #include "testing/gmock/include/gmock/gmock.h" |
93 // ... | 93 // ... |
94 // base::HistogramTester::CountsMap expected_counts; | 94 // base::HistogramTester::CountsMap expected_counts; |
95 // expected_counts["MyMetric.A"] = 1; | 95 // expected_counts["MyMetric.A"] = 1; |
96 // expected_counts["MyMetric.B"] = 1; | 96 // expected_counts["MyMetric.B"] = 1; |
97 // EXPECT_THAT(histogram_tester.GetTotalCountsForPrefix("MyMetric."), | 97 // EXPECT_THAT(histogram_tester.GetTotalCountsForPrefix("MyMetric."), |
98 // testing::ContainerEq(expected_counts)); | 98 // testing::ContainerEq(expected_counts)); |
99 CountsMap GetTotalCountsForPrefix(const std::string& query) const; | 99 CountsMap GetTotalCountsForPrefix(const std::string& prefix) const; |
100 | 100 |
101 // Access a modified HistogramSamples containing only what has been logged | 101 // Access a modified HistogramSamples containing only what has been logged |
102 // to the histogram since the creation of this object. | 102 // to the histogram since the creation of this object. |
103 std::unique_ptr<HistogramSamples> GetHistogramSamplesSinceCreation( | 103 std::unique_ptr<HistogramSamples> GetHistogramSamplesSinceCreation( |
104 const std::string& histogram_name) const; | 104 const std::string& histogram_name) const; |
105 | 105 |
106 private: | 106 private: |
107 // Verifies and asserts that value in the |sample| bucket matches the | 107 // Verifies and asserts that value in the |sample| bucket matches the |
108 // |expected_count|. The bucket's current value is determined from |samples| | 108 // |expected_count|. The bucket's current value is determined from |samples| |
109 // and is modified based on the snapshot stored for histogram |name|. | 109 // and is modified based on the snapshot stored for histogram |name|. |
110 void CheckBucketCount(const std::string& name, | 110 void CheckBucketCount(const std::string& name, |
111 base::HistogramBase::Sample sample, | 111 HistogramBase::Sample sample, |
112 base::Histogram::Count expected_count, | 112 Histogram::Count expected_count, |
113 const base::HistogramSamples& samples) const; | 113 const HistogramSamples& samples) const; |
114 | 114 |
115 // Verifies that the total number of values recorded for the histogram |name| | 115 // Verifies that the total number of values recorded for the histogram |name| |
116 // is |expected_count|. This is checked against |samples| minus the snapshot | 116 // is |expected_count|. This is checked against |samples| minus the snapshot |
117 // that was taken for |name|. | 117 // that was taken for |name|. |
118 void CheckTotalCount(const std::string& name, | 118 void CheckTotalCount(const std::string& name, |
119 base::Histogram::Count expected_count, | 119 Histogram::Count expected_count, |
120 const base::HistogramSamples& samples) const; | 120 const HistogramSamples& samples) const; |
121 | 121 |
122 // Used to determine the histogram changes made during this instance's | 122 // Used to determine the histogram changes made during this instance's |
123 // lifecycle. | 123 // lifecycle. |
124 std::map<std::string, std::unique_ptr<HistogramSamples>> histograms_snapshot_; | 124 std::map<std::string, std::unique_ptr<HistogramSamples>> histograms_snapshot_; |
125 | 125 |
126 DISALLOW_COPY_AND_ASSIGN(HistogramTester); | 126 DISALLOW_COPY_AND_ASSIGN(HistogramTester); |
127 }; | 127 }; |
128 | 128 |
129 struct Bucket { | 129 struct Bucket { |
130 Bucket(base::HistogramBase::Sample min, base::HistogramBase::Count count) | 130 Bucket(HistogramBase::Sample min, HistogramBase::Count count) |
131 : min(min), count(count) {} | 131 : min(min), count(count) {} |
132 | 132 |
133 bool operator==(const Bucket& other) const; | 133 bool operator==(const Bucket& other) const; |
134 | 134 |
135 base::HistogramBase::Sample min; | 135 HistogramBase::Sample min; |
136 base::HistogramBase::Count count; | 136 HistogramBase::Count count; |
137 }; | 137 }; |
138 | 138 |
139 void PrintTo(const Bucket& value, std::ostream* os); | 139 void PrintTo(const Bucket& value, std::ostream* os); |
140 | 140 |
141 } // namespace base | 141 } // namespace base |
142 | 142 |
143 #endif // BASE_TEST_HISTOGRAM_TESTER_H_ | 143 #endif // BASE_TEST_HISTOGRAM_TESTER_H_ |
OLD | NEW |