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

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

Issue 2295413002: Detach LeakDetectorController from remote controller on shutdown (Closed)
Patch Set: Fix for unit testing Created 4 years, 3 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 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 #include "chrome/browser/metrics/leak_detector/leak_detector_controller.h" 5 #include "chrome/browser/metrics/leak_detector/leak_detector_controller.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "components/metrics/proto/memory_leak_report.pb.h" 11 #include "components/metrics/proto/memory_leak_report.pb.h"
12 #include "content/public/test/test_browser_thread_bundle.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 14
14 namespace metrics { 15 namespace metrics {
15 16
16 namespace { 17 namespace {
17 18
18 // Converts a vector of values into a protobuf RepeatedField. Although there is 19 // 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 // no hard requirement, T should be a POD type since that is what RepeatedField
20 // is used for in protobuf classes. 21 // is used for in protobuf classes.
21 template <typename T> 22 template <typename T>
22 void InitializeRepeatedField(const std::vector<T>& input, 23 void InitializeRepeatedField(const std::vector<T>& input,
23 ::google::protobuf::RepeatedField<T>* output) { 24 ::google::protobuf::RepeatedField<T>* output) {
24 *output = ::google::protobuf::RepeatedField<T>(input.begin(), input.end()); 25 *output = ::google::protobuf::RepeatedField<T>(input.begin(), input.end());
25 } 26 }
26 27
27 } // namespace 28 } // namespace
28 29
29 // Test class for LeakDetectorController that exposes protected methods. 30 // Test class for LeakDetectorController that exposes protected methods.
30 class TestLeakDetectorController : public LeakDetectorController { 31 class TestLeakDetectorController : public LeakDetectorController {
31 public: 32 public:
32 using LeakDetectorController::OnLeaksFound; 33 using LeakDetectorController::OnLeaksFound;
33 34
34 TestLeakDetectorController() {} 35 TestLeakDetectorController() {}
35 36
36 private: 37 private:
37 DISALLOW_COPY_AND_ASSIGN(TestLeakDetectorController); 38 DISALLOW_COPY_AND_ASSIGN(TestLeakDetectorController);
38 }; 39 };
39 40
41 class LeakDetectorControllerTest : public ::testing::Test {
42 public:
43 LeakDetectorControllerTest() {}
44
45 private:
46 // For supporting content::BrowserThread operations.
47 content::TestBrowserThreadBundle thread_bundle_;
48
49 DISALLOW_COPY_AND_ASSIGN(LeakDetectorControllerTest);
50 };
51
40 // Use a global instance of the test class because LeakDetectorController 52 // Use a global instance of the test class because LeakDetectorController
41 // initializes class LeakDetector, which can only be initialized once, enforced 53 // initializes class LeakDetector, which can only be initialized once, enforced
42 // by an internal CHECK. Multiple initializations of LeakDetectorController in 54 // by an internal CHECK. Multiple initializations of LeakDetectorController in
43 // the same process will result in multiple initializations of class 55 // the same process will result in multiple initializations of class
44 // LeakDetector. 56 // LeakDetector.
45 // 57 //
46 // See src/components/metrics/leak_detector/leak_detector.h for more info. 58 // See src/components/metrics/leak_detector/leak_detector.h for more info.
47 base::LazyInstance<TestLeakDetectorController> g_instance = 59 base::LazyInstance<TestLeakDetectorController> g_instance =
48 LAZY_INSTANCE_INITIALIZER; 60 LAZY_INSTANCE_INITIALIZER;
49 61
50 TEST(LeakDetectorControllerTest, SingleReport) { 62 TEST_F(LeakDetectorControllerTest, SingleReport) {
51 MemoryLeakReportProto report; 63 MemoryLeakReportProto report;
52 report.set_size_bytes(8); 64 report.set_size_bytes(8);
53 InitializeRepeatedField({1, 2, 3, 4}, report.mutable_call_stack()); 65 InitializeRepeatedField({1, 2, 3, 4}, report.mutable_call_stack());
54 66
55 TestLeakDetectorController* controller = &g_instance.Get(); 67 TestLeakDetectorController* controller = &g_instance.Get();
56 controller->OnLeaksFound({report}); 68 controller->OnLeaksFound({report});
57 69
58 std::vector<MemoryLeakReportProto> stored_reports; 70 std::vector<MemoryLeakReportProto> stored_reports;
59 controller->GetLeakReports(&stored_reports); 71 controller->GetLeakReports(&stored_reports);
60 ASSERT_EQ(1U, stored_reports.size()); 72 ASSERT_EQ(1U, stored_reports.size());
(...skipping 12 matching lines...) Expand all
73 EXPECT_EQ(4U, proto.params().max_stack_depth()); 85 EXPECT_EQ(4U, proto.params().max_stack_depth());
74 EXPECT_EQ(32U * 1024 * 1024, proto.params().analysis_interval_bytes()); 86 EXPECT_EQ(32U * 1024 * 1024, proto.params().analysis_interval_bytes());
75 EXPECT_EQ(4U, proto.params().size_suspicion_threshold()); 87 EXPECT_EQ(4U, proto.params().size_suspicion_threshold());
76 EXPECT_EQ(4U, proto.params().call_stack_suspicion_threshold()); 88 EXPECT_EQ(4U, proto.params().call_stack_suspicion_threshold());
77 89
78 // No more reports. 90 // No more reports.
79 controller->GetLeakReports(&stored_reports); 91 controller->GetLeakReports(&stored_reports);
80 ASSERT_EQ(0U, stored_reports.size()); 92 ASSERT_EQ(0U, stored_reports.size());
81 } 93 }
82 94
83 TEST(LeakDetectorControllerTest, SingleReportHistory) { 95 TEST_F(LeakDetectorControllerTest, SingleReportHistory) {
84 MemoryLeakReportProto report; 96 MemoryLeakReportProto report;
85 97
86 auto* entry = report.add_alloc_breakdown_history(); 98 auto* entry = report.add_alloc_breakdown_history();
87 InitializeRepeatedField({100, 200, 300}, entry->mutable_counts_by_size()); 99 InitializeRepeatedField({100, 200, 300}, entry->mutable_counts_by_size());
88 entry->set_count_for_call_stack(15); 100 entry->set_count_for_call_stack(15);
89 101
90 entry = report.add_alloc_breakdown_history(); 102 entry = report.add_alloc_breakdown_history();
91 InitializeRepeatedField({150, 250, 350, 650}, 103 InitializeRepeatedField({150, 250, 350, 650},
92 entry->mutable_counts_by_size()); 104 entry->mutable_counts_by_size());
93 entry->set_count_for_call_stack(30); 105 entry->set_count_for_call_stack(30);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 EXPECT_EQ(400U, history.Get(2).counts_by_size(2)); 138 EXPECT_EQ(400U, history.Get(2).counts_by_size(2));
127 EXPECT_EQ(700U, history.Get(2).counts_by_size(3)); 139 EXPECT_EQ(700U, history.Get(2).counts_by_size(3));
128 EXPECT_EQ(800U, history.Get(2).counts_by_size(4)); 140 EXPECT_EQ(800U, history.Get(2).counts_by_size(4));
129 EXPECT_EQ(45U, history.Get(2).count_for_call_stack()); 141 EXPECT_EQ(45U, history.Get(2).count_for_call_stack());
130 142
131 // No more reports. 143 // No more reports.
132 controller->GetLeakReports(&stored_reports); 144 controller->GetLeakReports(&stored_reports);
133 ASSERT_EQ(0U, stored_reports.size()); 145 ASSERT_EQ(0U, stored_reports.size());
134 } 146 }
135 147
136 TEST(LeakDetectorControllerTest, MultipleReportsSeparately) { 148 TEST_F(LeakDetectorControllerTest, MultipleReportsSeparately) {
137 TestLeakDetectorController* controller = &g_instance.Get(); 149 TestLeakDetectorController* controller = &g_instance.Get();
138 std::vector<MemoryLeakReportProto> stored_reports; 150 std::vector<MemoryLeakReportProto> stored_reports;
139 151
140 // Pass in first report. 152 // Pass in first report.
141 MemoryLeakReportProto report1; 153 MemoryLeakReportProto report1;
142 report1.set_size_bytes(8); 154 report1.set_size_bytes(8);
143 InitializeRepeatedField({1, 2, 3, 4}, report1.mutable_call_stack()); 155 InitializeRepeatedField({1, 2, 3, 4}, report1.mutable_call_stack());
144 156
145 controller->OnLeaksFound({report1}); 157 controller->OnLeaksFound({report1});
146 controller->GetLeakReports(&stored_reports); 158 controller->GetLeakReports(&stored_reports);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 EXPECT_EQ(12U, stored_reports[0].call_stack().Get(3)); 207 EXPECT_EQ(12U, stored_reports[0].call_stack().Get(3));
196 EXPECT_EQ(13U, stored_reports[0].call_stack().Get(4)); 208 EXPECT_EQ(13U, stored_reports[0].call_stack().Get(4));
197 EXPECT_EQ(14U, stored_reports[0].call_stack().Get(5)); 209 EXPECT_EQ(14U, stored_reports[0].call_stack().Get(5));
198 EXPECT_EQ(15U, stored_reports[0].call_stack().Get(6)); 210 EXPECT_EQ(15U, stored_reports[0].call_stack().Get(6));
199 EXPECT_EQ(16U, stored_reports[0].call_stack().Get(7)); 211 EXPECT_EQ(16U, stored_reports[0].call_stack().Get(7));
200 212
201 controller->GetLeakReports(&stored_reports); 213 controller->GetLeakReports(&stored_reports);
202 ASSERT_EQ(0U, stored_reports.size()); 214 ASSERT_EQ(0U, stored_reports.size());
203 } 215 }
204 216
205 TEST(LeakDetectorControllerTest, MultipleReportsTogether) { 217 TEST_F(LeakDetectorControllerTest, MultipleReportsTogether) {
206 std::vector<MemoryLeakReportProto> reports(3); 218 std::vector<MemoryLeakReportProto> reports(3);
207 reports[0].set_size_bytes(8); 219 reports[0].set_size_bytes(8);
208 InitializeRepeatedField({1, 2, 3, 4}, reports[0].mutable_call_stack()); 220 InitializeRepeatedField({1, 2, 3, 4}, reports[0].mutable_call_stack());
209 reports[1].set_size_bytes(16); 221 reports[1].set_size_bytes(16);
210 InitializeRepeatedField({5, 6, 7, 8, 9, 10}, reports[1].mutable_call_stack()); 222 InitializeRepeatedField({5, 6, 7, 8, 9, 10}, reports[1].mutable_call_stack());
211 reports[2].set_size_bytes(24); 223 reports[2].set_size_bytes(24);
212 InitializeRepeatedField({9, 10, 11, 12, 13, 14, 15, 16}, 224 InitializeRepeatedField({9, 10, 11, 12, 13, 14, 15, 16},
213 reports[2].mutable_call_stack()); 225 reports[2].mutable_call_stack());
214 226
215 TestLeakDetectorController* controller = &g_instance.Get(); 227 TestLeakDetectorController* controller = &g_instance.Get();
(...skipping 29 matching lines...) Expand all
245 EXPECT_EQ(13U, stored_reports[2].call_stack().Get(4)); 257 EXPECT_EQ(13U, stored_reports[2].call_stack().Get(4));
246 EXPECT_EQ(14U, stored_reports[2].call_stack().Get(5)); 258 EXPECT_EQ(14U, stored_reports[2].call_stack().Get(5));
247 EXPECT_EQ(15U, stored_reports[2].call_stack().Get(6)); 259 EXPECT_EQ(15U, stored_reports[2].call_stack().Get(6));
248 EXPECT_EQ(16U, stored_reports[2].call_stack().Get(7)); 260 EXPECT_EQ(16U, stored_reports[2].call_stack().Get(7));
249 261
250 controller->GetLeakReports(&stored_reports); 262 controller->GetLeakReports(&stored_reports);
251 ASSERT_EQ(0U, stored_reports.size()); 263 ASSERT_EQ(0U, stored_reports.size());
252 } 264 }
253 265
254 } // namespace metrics 266 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698