Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: chrome/browser/metrics/leak_detector_controller_unittest.cc

Issue 2047163002: Move leak_detector_controller to its own directory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update include paths Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/metrics/leak_detector_controller.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 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 "chrome/browser/metrics/leak_detector_controller.h"
6
7 #include <set>
8
9 #include "base/lazy_instance.h"
10 #include "base/macros.h"
11 #include "components/metrics/proto/memory_leak_report.pb.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace metrics {
15
16 namespace {
17
18 // Converts a vector of values into a protobuf RepeatedField. Although there is
19 // no hard requirement, T should be a POD type since that is what RepeatedField
20 // is used for in protobuf classes.
21 template <typename T>
22 void InitializeRepeatedField(const std::vector<T>& input,
23 ::google::protobuf::RepeatedField<T>* output) {
24 *output = ::google::protobuf::RepeatedField<T>(input.begin(), input.end());
25 }
26
27 } // namespace
28
29 // Test class for LeakDetectorController that exposes protected methods.
30 class TestLeakDetectorController : public LeakDetectorController {
31 public:
32 using LeakDetectorController::OnLeaksFound;
33
34 TestLeakDetectorController() {}
35
36 private:
37 DISALLOW_COPY_AND_ASSIGN(TestLeakDetectorController);
38 };
39
40 // Use a global instance of the test class because LeakDetectorController
41 // initializes class LeakDetector, which can only be initialized once, enforced
42 // by an internal CHECK. Multiple initializations of LeakDetectorController in
43 // the same process will result in multiple initializations of class
44 // LeakDetector.
45 //
46 // See src/components/metrics/leak_detector/leak_detector.h for more info.
47 base::LazyInstance<TestLeakDetectorController> g_instance =
48 LAZY_INSTANCE_INITIALIZER;
49
50 TEST(LeakDetectorControllerTest, SingleReport) {
51 MemoryLeakReportProto report;
52 report.set_size_bytes(8);
53 InitializeRepeatedField({1, 2, 3, 4}, report.mutable_call_stack());
54
55 TestLeakDetectorController* controller = &g_instance.Get();
56 controller->OnLeaksFound({report});
57
58 std::vector<MemoryLeakReportProto> stored_reports;
59 controller->GetLeakReports(&stored_reports);
60 ASSERT_EQ(1U, stored_reports.size());
61
62 const MemoryLeakReportProto& proto = stored_reports[0];
63 EXPECT_EQ(8U, proto.size_bytes());
64 ASSERT_EQ(4, proto.call_stack().size());
65 EXPECT_EQ(1U, proto.call_stack().Get(0));
66 EXPECT_EQ(2U, proto.call_stack().Get(1));
67 EXPECT_EQ(3U, proto.call_stack().Get(2));
68 EXPECT_EQ(4U, proto.call_stack().Get(3));
69
70 // Check that default leak detector parameters are stored in the leak report.
71 // Default values are listed in leak_detector_controller.cc.
72 EXPECT_DOUBLE_EQ(1.0f / 256, proto.params().sampling_rate());
73 EXPECT_EQ(4U, proto.params().max_stack_depth());
74 EXPECT_EQ(32U * 1024 * 1024, proto.params().analysis_interval_bytes());
75 EXPECT_EQ(4U, proto.params().size_suspicion_threshold());
76 EXPECT_EQ(4U, proto.params().call_stack_suspicion_threshold());
77
78 // No more reports.
79 controller->GetLeakReports(&stored_reports);
80 ASSERT_EQ(0U, stored_reports.size());
81 }
82
83 TEST(LeakDetectorControllerTest, SingleReportHistory) {
84 MemoryLeakReportProto report;
85
86 auto entry = report.add_alloc_breakdown_history();
87 InitializeRepeatedField({100, 200, 300}, entry->mutable_counts_by_size());
88 entry->set_count_for_call_stack(15);
89
90 entry = report.add_alloc_breakdown_history();
91 InitializeRepeatedField({150, 250, 350, 650},
92 entry->mutable_counts_by_size());
93 entry->set_count_for_call_stack(30);
94
95 entry = report.add_alloc_breakdown_history();
96 InitializeRepeatedField({200, 300, 400, 700, 800},
97 entry->mutable_counts_by_size());
98 entry->set_count_for_call_stack(45);
99
100 TestLeakDetectorController* controller = &g_instance.Get();
101 controller->OnLeaksFound({report});
102
103 std::vector<MemoryLeakReportProto> stored_reports;
104 controller->GetLeakReports(&stored_reports);
105 ASSERT_EQ(1U, stored_reports.size());
106
107 const auto& history = stored_reports[0].alloc_breakdown_history();
108 ASSERT_EQ(3, history.size());
109
110 ASSERT_EQ(3, history.Get(0).counts_by_size().size());
111 EXPECT_EQ(100U, history.Get(0).counts_by_size(0));
112 EXPECT_EQ(200U, history.Get(0).counts_by_size(1));
113 EXPECT_EQ(300U, history.Get(0).counts_by_size(2));
114 EXPECT_EQ(15U, history.Get(0).count_for_call_stack());
115
116 ASSERT_EQ(4, history.Get(1).counts_by_size_size());
117 EXPECT_EQ(150U, history.Get(1).counts_by_size(0));
118 EXPECT_EQ(250U, history.Get(1).counts_by_size(1));
119 EXPECT_EQ(350U, history.Get(1).counts_by_size(2));
120 EXPECT_EQ(650U, history.Get(1).counts_by_size(3));
121 EXPECT_EQ(30U, history.Get(1).count_for_call_stack());
122
123 ASSERT_EQ(5, history.Get(2).counts_by_size_size());
124 EXPECT_EQ(200U, history.Get(2).counts_by_size(0));
125 EXPECT_EQ(300U, history.Get(2).counts_by_size(1));
126 EXPECT_EQ(400U, history.Get(2).counts_by_size(2));
127 EXPECT_EQ(700U, history.Get(2).counts_by_size(3));
128 EXPECT_EQ(800U, history.Get(2).counts_by_size(4));
129 EXPECT_EQ(45U, history.Get(2).count_for_call_stack());
130
131 // No more reports.
132 controller->GetLeakReports(&stored_reports);
133 ASSERT_EQ(0U, stored_reports.size());
134 }
135
136 TEST(LeakDetectorControllerTest, MultipleReportsSeparately) {
137 TestLeakDetectorController* controller = &g_instance.Get();
138 std::vector<MemoryLeakReportProto> stored_reports;
139
140 // Pass in first report.
141 MemoryLeakReportProto report1;
142 report1.set_size_bytes(8);
143 InitializeRepeatedField({1, 2, 3, 4}, report1.mutable_call_stack());
144
145 controller->OnLeaksFound({report1});
146 controller->GetLeakReports(&stored_reports);
147 ASSERT_EQ(1U, stored_reports.size());
148
149 EXPECT_EQ(8U, stored_reports[0].size_bytes());
150 ASSERT_EQ(4, stored_reports[0].call_stack().size());
151 EXPECT_EQ(1U, stored_reports[0].call_stack().Get(0));
152 EXPECT_EQ(2U, stored_reports[0].call_stack().Get(1));
153 EXPECT_EQ(3U, stored_reports[0].call_stack().Get(2));
154 EXPECT_EQ(4U, stored_reports[0].call_stack().Get(3));
155
156 controller->GetLeakReports(&stored_reports);
157 ASSERT_EQ(0U, stored_reports.size());
158
159 // Pass in second report.
160 MemoryLeakReportProto report2;
161 report2.set_size_bytes(16);
162 InitializeRepeatedField({5, 6, 7, 8, 9, 10}, report2.mutable_call_stack());
163 controller->OnLeaksFound({report2});
164
165 controller->GetLeakReports(&stored_reports);
166 ASSERT_EQ(1U, stored_reports.size());
167
168 EXPECT_EQ(16U, stored_reports[0].size_bytes());
169 ASSERT_EQ(6, stored_reports[0].call_stack().size());
170 EXPECT_EQ(5U, stored_reports[0].call_stack().Get(0));
171 EXPECT_EQ(6U, stored_reports[0].call_stack().Get(1));
172 EXPECT_EQ(7U, stored_reports[0].call_stack().Get(2));
173 EXPECT_EQ(8U, stored_reports[0].call_stack().Get(3));
174 EXPECT_EQ(9U, stored_reports[0].call_stack().Get(4));
175 EXPECT_EQ(10U, stored_reports[0].call_stack().Get(5));
176
177 controller->GetLeakReports(&stored_reports);
178 ASSERT_EQ(0U, stored_reports.size());
179
180 // Pass in third report.
181 MemoryLeakReportProto report3;
182 report3.set_size_bytes(24);
183 InitializeRepeatedField({9, 10, 11, 12, 13, 14, 15, 16},
184 report3.mutable_call_stack());
185 controller->OnLeaksFound({report3});
186
187 controller->GetLeakReports(&stored_reports);
188 ASSERT_EQ(1U, stored_reports.size());
189
190 EXPECT_EQ(24U, stored_reports[0].size_bytes());
191 ASSERT_EQ(8, stored_reports[0].call_stack().size());
192 EXPECT_EQ(9U, stored_reports[0].call_stack().Get(0));
193 EXPECT_EQ(10U, stored_reports[0].call_stack().Get(1));
194 EXPECT_EQ(11U, stored_reports[0].call_stack().Get(2));
195 EXPECT_EQ(12U, stored_reports[0].call_stack().Get(3));
196 EXPECT_EQ(13U, stored_reports[0].call_stack().Get(4));
197 EXPECT_EQ(14U, stored_reports[0].call_stack().Get(5));
198 EXPECT_EQ(15U, stored_reports[0].call_stack().Get(6));
199 EXPECT_EQ(16U, stored_reports[0].call_stack().Get(7));
200
201 controller->GetLeakReports(&stored_reports);
202 ASSERT_EQ(0U, stored_reports.size());
203 }
204
205 TEST(LeakDetectorControllerTest, MultipleReportsTogether) {
206 std::vector<MemoryLeakReportProto> reports(3);
207 reports[0].set_size_bytes(8);
208 InitializeRepeatedField({1, 2, 3, 4}, reports[0].mutable_call_stack());
209 reports[1].set_size_bytes(16);
210 InitializeRepeatedField({5, 6, 7, 8, 9, 10}, reports[1].mutable_call_stack());
211 reports[2].set_size_bytes(24);
212 InitializeRepeatedField({9, 10, 11, 12, 13, 14, 15, 16},
213 reports[2].mutable_call_stack());
214
215 TestLeakDetectorController* controller = &g_instance.Get();
216 controller->OnLeaksFound(reports);
217
218 std::vector<MemoryLeakReportProto> stored_reports;
219
220 controller->GetLeakReports(&stored_reports);
221 ASSERT_EQ(3U, stored_reports.size());
222
223 EXPECT_EQ(8U, stored_reports[0].size_bytes());
224 ASSERT_EQ(4, stored_reports[0].call_stack().size());
225 EXPECT_EQ(1U, stored_reports[0].call_stack().Get(0));
226 EXPECT_EQ(2U, stored_reports[0].call_stack().Get(1));
227 EXPECT_EQ(3U, stored_reports[0].call_stack().Get(2));
228 EXPECT_EQ(4U, stored_reports[0].call_stack().Get(3));
229
230 EXPECT_EQ(16U, stored_reports[1].size_bytes());
231 ASSERT_EQ(6, stored_reports[1].call_stack().size());
232 EXPECT_EQ(5U, stored_reports[1].call_stack().Get(0));
233 EXPECT_EQ(6U, stored_reports[1].call_stack().Get(1));
234 EXPECT_EQ(7U, stored_reports[1].call_stack().Get(2));
235 EXPECT_EQ(8U, stored_reports[1].call_stack().Get(3));
236 EXPECT_EQ(9U, stored_reports[1].call_stack().Get(4));
237 EXPECT_EQ(10U, stored_reports[1].call_stack().Get(5));
238
239 EXPECT_EQ(24U, stored_reports[2].size_bytes());
240 ASSERT_EQ(8, stored_reports[2].call_stack().size());
241 EXPECT_EQ(9U, stored_reports[2].call_stack().Get(0));
242 EXPECT_EQ(10U, stored_reports[2].call_stack().Get(1));
243 EXPECT_EQ(11U, stored_reports[2].call_stack().Get(2));
244 EXPECT_EQ(12U, stored_reports[2].call_stack().Get(3));
245 EXPECT_EQ(13U, stored_reports[2].call_stack().Get(4));
246 EXPECT_EQ(14U, stored_reports[2].call_stack().Get(5));
247 EXPECT_EQ(15U, stored_reports[2].call_stack().Get(6));
248 EXPECT_EQ(16U, stored_reports[2].call_stack().Get(7));
249
250 controller->GetLeakReports(&stored_reports);
251 ASSERT_EQ(0U, stored_reports.size());
252 }
253
254 } // namespace metrics
OLDNEW
« no previous file with comments | « chrome/browser/metrics/leak_detector_controller.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698