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

Side by Side Diff: base/trace_event/memory_dump_manager_unittest.cc

Issue 1308403002: [Tracing] Disable registration of regular dump providers during tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@reland-content-browsertest
Patch Set: Fix RegisterDumperWhileDumping test Created 5 years, 2 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "base/trace_event/memory_dump_manager.h" 5 #include "base/trace_event/memory_dump_manager.h"
6 6
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/memory/scoped_vector.h" 8 #include "base/memory/scoped_vector.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 void DumpCallbackAdapter(scoped_refptr<SingleThreadTaskRunner> task_runner, 85 void DumpCallbackAdapter(scoped_refptr<SingleThreadTaskRunner> task_runner,
86 Closure closure, 86 Closure closure,
87 uint64 dump_guid, 87 uint64 dump_guid,
88 bool success) { 88 bool success) {
89 last_callback_success_ = success; 89 last_callback_success_ = success;
90 task_runner->PostTask(FROM_HERE, closure); 90 task_runner->PostTask(FROM_HERE, closure);
91 } 91 }
92 92
93 protected: 93 protected:
94 void InitializeMemoryDumpManager(bool is_coordinator) { 94 void InitializeMemoryDumpManager(bool is_coordinator) {
95 mdm_->set_dumper_registrations_ignored_for_testing(true);
95 mdm_->Initialize(delegate_.get(), is_coordinator); 96 mdm_->Initialize(delegate_.get(), is_coordinator);
96 } 97 }
97 98
98 void EnableTracingWithLegacyCategories(const char* category) { 99 void EnableTracingWithLegacyCategories(const char* category) {
99 TraceLog::GetInstance()->SetEnabled(TraceConfig(category, ""), 100 TraceLog::GetInstance()->SetEnabled(TraceConfig(category, ""),
100 TraceLog::RECORDING_MODE); 101 TraceLog::RECORDING_MODE);
101 } 102 }
102 103
103 void EnableTracingWithTraceConfig(const std::string& trace_config) { 104 void EnableTracingWithTraceConfig(const std::string& trace_config) {
104 TraceLog::GetInstance()->SetEnabled(TraceConfig(trace_config), 105 TraceLog::GetInstance()->SetEnabled(TraceConfig(trace_config),
105 TraceLog::RECORDING_MODE); 106 TraceLog::RECORDING_MODE);
106 } 107 }
107 108
108 void DisableTracing() { TraceLog::GetInstance()->SetDisabled(); } 109 void DisableTracing() { TraceLog::GetInstance()->SetDisabled(); }
109 110
111 void RegisterDumpProvider(MemoryDumpProvider* mdp) {
Primiano Tucci (use gerrit) 2015/10/13 13:35:50 This could be made a standalone method in the anon
Ruud van Asseldonk 2015/10/13 13:55:41 As you wish.
112 mdm_->set_dumper_registrations_ignored_for_testing(false);
Primiano Tucci (use gerrit) 2015/10/13 13:35:50 you can just call RegisterDumpProvider(mdp, nullpt
Ruud van Asseldonk 2015/10/13 13:55:41 Done.
113 mdm_->RegisterDumpProvider(mdp);
114 mdm_->set_dumper_registrations_ignored_for_testing(true);
115 }
116
117 void RegisterDumpProvider(
118 MemoryDumpProvider* mdp,
119 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
120 mdm_->set_dumper_registrations_ignored_for_testing(false);
121 mdm_->RegisterDumpProvider(mdp, task_runner);
122 mdm_->set_dumper_registrations_ignored_for_testing(true);
123 }
124
110 bool IsPeriodicDumpingEnabled() const { 125 bool IsPeriodicDumpingEnabled() const {
111 return mdm_->periodic_dump_timer_.IsRunning(); 126 return mdm_->periodic_dump_timer_.IsRunning();
112 } 127 }
113 128
114 int GetMaxConsecutiveFailuresCount() const { 129 int GetMaxConsecutiveFailuresCount() const {
115 return MemoryDumpManager::kMaxConsecutiveFailuresCount; 130 return MemoryDumpManager::kMaxConsecutiveFailuresCount;
116 } 131 }
117 132
118 scoped_ptr<MemoryDumpManager> mdm_; 133 scoped_ptr<MemoryDumpManager> mdm_;
119 scoped_ptr<MemoryDumpManagerDelegateForTesting> delegate_; 134 scoped_ptr<MemoryDumpManagerDelegateForTesting> delegate_;
120 bool last_callback_success_; 135 bool last_callback_success_;
121 136
122 private: 137 private:
123 scoped_ptr<MessageLoop> message_loop_; 138 scoped_ptr<MessageLoop> message_loop_;
124 139
125 // We want our singleton torn down after each test. 140 // We want our singleton torn down after each test.
126 ShadowingAtExitManager at_exit_manager_; 141 ShadowingAtExitManager at_exit_manager_;
127 }; 142 };
128 143
129 // Basic sanity checks. Registers a memory dump provider and checks that it is 144 // Basic sanity checks. Registers a memory dump provider and checks that it is
130 // called, but only when memory-infra is enabled. 145 // called, but only when memory-infra is enabled.
131 TEST_F(MemoryDumpManagerTest, SingleDumper) { 146 TEST_F(MemoryDumpManagerTest, SingleDumper) {
132 InitializeMemoryDumpManager(false /* is_coordinator */); 147 InitializeMemoryDumpManager(false /* is_coordinator */);
133 MockMemoryDumpProvider mdp; 148 MockMemoryDumpProvider mdp;
134 mdm_->RegisterDumpProvider(&mdp); 149 RegisterDumpProvider(&mdp);
135 150
136 // Check that the dumper is not called if the memory category is not enabled. 151 // Check that the dumper is not called if the memory category is not enabled.
137 EnableTracingWithLegacyCategories("foobar-but-not-memory"); 152 EnableTracingWithLegacyCategories("foobar-but-not-memory");
138 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); 153 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0);
139 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); 154 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
140 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 155 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
141 MemoryDumpLevelOfDetail::DETAILED); 156 MemoryDumpLevelOfDetail::DETAILED);
142 DisableTracing(); 157 DisableTracing();
143 158
144 // Now repeat enabling the memory category and check that the dumper is 159 // Now repeat enabling the memory category and check that the dumper is
(...skipping 17 matching lines...) Expand all
162 MemoryDumpLevelOfDetail::DETAILED); 177 MemoryDumpLevelOfDetail::DETAILED);
163 TraceLog::GetInstance()->SetDisabled(); 178 TraceLog::GetInstance()->SetDisabled();
164 } 179 }
165 180
166 // Checks that requesting dumps with high level of detail actually propagates 181 // Checks that requesting dumps with high level of detail actually propagates
167 // the level of the detail properly to OnMemoryDump() call on dump providers. 182 // the level of the detail properly to OnMemoryDump() call on dump providers.
168 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { 183 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) {
169 InitializeMemoryDumpManager(false /* is_coordinator */); 184 InitializeMemoryDumpManager(false /* is_coordinator */);
170 MockMemoryDumpProvider mdp; 185 MockMemoryDumpProvider mdp;
171 186
172 mdm_->RegisterDumpProvider(&mdp); 187 RegisterDumpProvider(&mdp);
173 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 188 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
174 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 189 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
175 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); 190 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true));
176 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 191 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
177 MemoryDumpLevelOfDetail::DETAILED); 192 MemoryDumpLevelOfDetail::DETAILED);
178 DisableTracing(); 193 DisableTracing();
179 mdm_->UnregisterDumpProvider(&mdp); 194 mdm_->UnregisterDumpProvider(&mdp);
180 195
181 // Check that requesting dumps with low level of detail actually propagates to 196 // Check that requesting dumps with low level of detail actually propagates to
182 // OnMemoryDump() call on dump providers. 197 // OnMemoryDump() call on dump providers.
183 mdm_->RegisterDumpProvider(&mdp); 198 RegisterDumpProvider(&mdp);
184 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 199 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
185 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 200 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
186 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); 201 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true));
187 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 202 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
188 MemoryDumpLevelOfDetail::LIGHT); 203 MemoryDumpLevelOfDetail::LIGHT);
189 DisableTracing(); 204 DisableTracing();
190 mdm_->UnregisterDumpProvider(&mdp); 205 mdm_->UnregisterDumpProvider(&mdp);
191 } 206 }
192 207
193 // Checks that the SharedSessionState object is acqually shared over time. 208 // Checks that the SharedSessionState object is acqually shared over time.
194 TEST_F(MemoryDumpManagerTest, SharedSessionState) { 209 TEST_F(MemoryDumpManagerTest, SharedSessionState) {
195 InitializeMemoryDumpManager(false /* is_coordinator */); 210 InitializeMemoryDumpManager(false /* is_coordinator */);
196 MockMemoryDumpProvider mdp1; 211 MockMemoryDumpProvider mdp1;
197 MockMemoryDumpProvider mdp2; 212 MockMemoryDumpProvider mdp2;
198 mdm_->RegisterDumpProvider(&mdp1); 213 RegisterDumpProvider(&mdp1);
199 mdm_->RegisterDumpProvider(&mdp2); 214 RegisterDumpProvider(&mdp2);
200 215
201 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 216 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
202 const MemoryDumpSessionState* session_state = mdm_->session_state().get(); 217 const MemoryDumpSessionState* session_state = mdm_->session_state().get();
203 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); 218 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2);
204 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) 219 EXPECT_CALL(mdp1, OnMemoryDump(_, _))
205 .Times(2) 220 .Times(2)
206 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, 221 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&,
207 ProcessMemoryDump* pmd) -> bool { 222 ProcessMemoryDump* pmd) -> bool {
208 EXPECT_EQ(session_state, pmd->session_state().get()); 223 EXPECT_EQ(session_state, pmd->session_state().get());
209 return true; 224 return true;
(...skipping 13 matching lines...) Expand all
223 DisableTracing(); 238 DisableTracing();
224 } 239 }
225 240
226 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. 241 // Checks that the (Un)RegisterDumpProvider logic behaves sanely.
227 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { 242 TEST_F(MemoryDumpManagerTest, MultipleDumpers) {
228 InitializeMemoryDumpManager(false /* is_coordinator */); 243 InitializeMemoryDumpManager(false /* is_coordinator */);
229 MockMemoryDumpProvider mdp1; 244 MockMemoryDumpProvider mdp1;
230 MockMemoryDumpProvider mdp2; 245 MockMemoryDumpProvider mdp2;
231 246
232 // Enable only mdp1. 247 // Enable only mdp1.
233 mdm_->RegisterDumpProvider(&mdp1); 248 RegisterDumpProvider(&mdp1);
234 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 249 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
235 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 250 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
236 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); 251 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true));
237 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); 252 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0);
238 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 253 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
239 MemoryDumpLevelOfDetail::DETAILED); 254 MemoryDumpLevelOfDetail::DETAILED);
240 DisableTracing(); 255 DisableTracing();
241 256
242 // Invert: enable mdp1 and disable mdp2. 257 // Invert: enable mdp1 and disable mdp2.
243 mdm_->UnregisterDumpProvider(&mdp1); 258 mdm_->UnregisterDumpProvider(&mdp1);
244 mdm_->RegisterDumpProvider(&mdp2); 259 RegisterDumpProvider(&mdp2);
245 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 260 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
246 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 261 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
247 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); 262 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0);
248 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); 263 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true));
249 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 264 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
250 MemoryDumpLevelOfDetail::DETAILED); 265 MemoryDumpLevelOfDetail::DETAILED);
251 DisableTracing(); 266 DisableTracing();
252 267
253 // Enable both mdp1 and mdp2. 268 // Enable both mdp1 and mdp2.
254 mdm_->RegisterDumpProvider(&mdp1); 269 RegisterDumpProvider(&mdp1);
255 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 270 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
256 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 271 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
257 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); 272 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true));
258 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); 273 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true));
259 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 274 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
260 MemoryDumpLevelOfDetail::DETAILED); 275 MemoryDumpLevelOfDetail::DETAILED);
261 DisableTracing(); 276 DisableTracing();
262 } 277 }
263 278
264 // Checks that the dump provider invocations depend only on the current 279 // Checks that the dump provider invocations depend only on the current
265 // registration state and not on previous registrations and dumps. 280 // registration state and not on previous registrations and dumps.
266 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { 281 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) {
267 InitializeMemoryDumpManager(false /* is_coordinator */); 282 InitializeMemoryDumpManager(false /* is_coordinator */);
268 MockMemoryDumpProvider mdp; 283 MockMemoryDumpProvider mdp;
269 284
270 mdm_->RegisterDumpProvider(&mdp); 285 RegisterDumpProvider(&mdp);
271 286
272 { 287 {
273 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 288 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
274 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); 289 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true));
275 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 290 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
276 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 291 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
277 MemoryDumpLevelOfDetail::DETAILED); 292 MemoryDumpLevelOfDetail::DETAILED);
278 DisableTracing(); 293 DisableTracing();
279 } 294 }
280 295
281 mdm_->UnregisterDumpProvider(&mdp); 296 mdm_->UnregisterDumpProvider(&mdp);
282 297
283 { 298 {
284 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 299 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
285 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); 300 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
286 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 301 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
287 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 302 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
288 MemoryDumpLevelOfDetail::DETAILED); 303 MemoryDumpLevelOfDetail::DETAILED);
289 DisableTracing(); 304 DisableTracing();
290 } 305 }
291 306
292 mdm_->RegisterDumpProvider(&mdp); 307 RegisterDumpProvider(&mdp);
293 mdm_->UnregisterDumpProvider(&mdp); 308 mdm_->UnregisterDumpProvider(&mdp);
294 309
295 { 310 {
296 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 311 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
297 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); 312 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
298 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 313 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
299 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 314 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
300 MemoryDumpLevelOfDetail::DETAILED); 315 MemoryDumpLevelOfDetail::DETAILED);
301 DisableTracing(); 316 DisableTracing();
302 } 317 }
303 318
304 mdm_->RegisterDumpProvider(&mdp); 319 RegisterDumpProvider(&mdp);
305 mdm_->UnregisterDumpProvider(&mdp); 320 mdm_->UnregisterDumpProvider(&mdp);
306 mdm_->RegisterDumpProvider(&mdp); 321 RegisterDumpProvider(&mdp);
307 322
308 { 323 {
309 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); 324 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1);
310 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); 325 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true));
311 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 326 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
312 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 327 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
313 MemoryDumpLevelOfDetail::DETAILED); 328 MemoryDumpLevelOfDetail::DETAILED);
314 DisableTracing(); 329 DisableTracing();
315 } 330 }
316 } 331 }
(...skipping 12 matching lines...) Expand all
329 // Create the threads and setup the expectations. Given that at each iteration 344 // Create the threads and setup the expectations. Given that at each iteration
330 // we will pop out one thread/MemoryDumpProvider, each MDP is supposed to be 345 // we will pop out one thread/MemoryDumpProvider, each MDP is supposed to be
331 // invoked a number of times equal to its index. 346 // invoked a number of times equal to its index.
332 for (uint32 i = kNumInitialThreads; i > 0; --i) { 347 for (uint32 i = kNumInitialThreads; i > 0; --i) {
333 Thread* thread = new Thread("test thread"); 348 Thread* thread = new Thread("test thread");
334 threads.push_back(thread); 349 threads.push_back(thread);
335 threads.back()->Start(); 350 threads.back()->Start();
336 scoped_refptr<SingleThreadTaskRunner> task_runner = thread->task_runner(); 351 scoped_refptr<SingleThreadTaskRunner> task_runner = thread->task_runner();
337 MockMemoryDumpProvider* mdp = new MockMemoryDumpProvider(); 352 MockMemoryDumpProvider* mdp = new MockMemoryDumpProvider();
338 mdps.push_back(mdp); 353 mdps.push_back(mdp);
339 mdm_->RegisterDumpProvider(mdp, task_runner); 354 RegisterDumpProvider(mdp, task_runner);
340 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) 355 EXPECT_CALL(*mdp, OnMemoryDump(_, _))
341 .Times(i) 356 .Times(i)
342 .WillRepeatedly(Invoke( 357 .WillRepeatedly(Invoke(
343 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { 358 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
344 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); 359 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread());
345 return true; 360 return true;
346 })); 361 }));
347 } 362 }
348 363
349 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 364 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 DisableTracing(); 399 DisableTracing();
385 } 400 }
386 401
387 // Checks that providers get disabled after 3 consecutive failures, but not 402 // Checks that providers get disabled after 3 consecutive failures, but not
388 // otherwise (e.g., if interleaved). 403 // otherwise (e.g., if interleaved).
389 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { 404 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) {
390 InitializeMemoryDumpManager(false /* is_coordinator */); 405 InitializeMemoryDumpManager(false /* is_coordinator */);
391 MockMemoryDumpProvider mdp1; 406 MockMemoryDumpProvider mdp1;
392 MockMemoryDumpProvider mdp2; 407 MockMemoryDumpProvider mdp2;
393 408
394 mdm_->RegisterDumpProvider(&mdp1); 409 RegisterDumpProvider(&mdp1);
395 mdm_->RegisterDumpProvider(&mdp2); 410 RegisterDumpProvider(&mdp2);
396 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 411 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
397 412
398 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); 413 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount();
399 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); 414 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps);
400 415
401 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) 416 EXPECT_CALL(mdp1, OnMemoryDump(_, _))
402 .Times(GetMaxConsecutiveFailuresCount()) 417 .Times(GetMaxConsecutiveFailuresCount())
403 .WillRepeatedly(Return(false)); 418 .WillRepeatedly(Return(false));
404 419
405 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) 420 EXPECT_CALL(mdp2, OnMemoryDump(_, _))
(...skipping 12 matching lines...) Expand all
418 DisableTracing(); 433 DisableTracing();
419 } 434 }
420 435
421 // Sneakily registers an extra memory dump provider while an existing one is 436 // Sneakily registers an extra memory dump provider while an existing one is
422 // dumping and expect it to take part in the already active tracing session. 437 // dumping and expect it to take part in the already active tracing session.
423 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { 438 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) {
424 InitializeMemoryDumpManager(false /* is_coordinator */); 439 InitializeMemoryDumpManager(false /* is_coordinator */);
425 MockMemoryDumpProvider mdp1; 440 MockMemoryDumpProvider mdp1;
426 MockMemoryDumpProvider mdp2; 441 MockMemoryDumpProvider mdp2;
427 442
428 mdm_->RegisterDumpProvider(&mdp1); 443 RegisterDumpProvider(&mdp1);
429 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 444 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
430 445
431 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); 446 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4);
432 447
433 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) 448 EXPECT_CALL(mdp1, OnMemoryDump(_, _))
434 .Times(4) 449 .Times(4)
435 .WillOnce(Return(true)) 450 .WillOnce(Return(true))
436 .WillOnce( 451 .WillOnce(Invoke(
437 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { 452 [this, &mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
Primiano Tucci (use gerrit) 2015/10/13 13:35:50 if you move RegisterDumpProvider to the anonymous
Ruud van Asseldonk 2015/10/13 13:55:41 Done.
438 MemoryDumpManager::GetInstance()->RegisterDumpProvider(&mdp2); 453 RegisterDumpProvider(&mdp2);
439 return true; 454 return true;
440 })) 455 }))
441 .WillRepeatedly(Return(true)); 456 .WillRepeatedly(Return(true));
442 457
443 // Depending on the insertion order (before or after mdp1), mdp2 might be 458 // Depending on the insertion order (before or after mdp1), mdp2 might be
444 // called also immediately after it gets registered. 459 // called also immediately after it gets registered.
445 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) 460 EXPECT_CALL(mdp2, OnMemoryDump(_, _))
446 .Times(Between(2, 3)) 461 .Times(Between(2, 3))
447 .WillRepeatedly(Return(true)); 462 .WillRepeatedly(Return(true));
448 463
449 for (int i = 0; i < 4; i++) { 464 for (int i = 0; i < 4; i++) {
450 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 465 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
451 MemoryDumpLevelOfDetail::DETAILED); 466 MemoryDumpLevelOfDetail::DETAILED);
452 } 467 }
453 468
454 DisableTracing(); 469 DisableTracing();
455 } 470 }
456 471
457 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. 472 // Like RegisterDumperWhileDumping, but unregister the dump provider instead.
458 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { 473 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) {
459 InitializeMemoryDumpManager(false /* is_coordinator */); 474 InitializeMemoryDumpManager(false /* is_coordinator */);
460 MockMemoryDumpProvider mdp1; 475 MockMemoryDumpProvider mdp1;
461 MockMemoryDumpProvider mdp2; 476 MockMemoryDumpProvider mdp2;
462 477
463 mdm_->RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); 478 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get());
464 mdm_->RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get()); 479 RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get());
465 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 480 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
466 481
467 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); 482 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4);
468 483
469 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) 484 EXPECT_CALL(mdp1, OnMemoryDump(_, _))
470 .Times(4) 485 .Times(4)
471 .WillOnce(Return(true)) 486 .WillOnce(Return(true))
472 .WillOnce( 487 .WillOnce(
473 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { 488 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
474 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); 489 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2);
(...skipping 18 matching lines...) Expand all
493 // Checks that the dump does not abort when unregistering a provider while 508 // Checks that the dump does not abort when unregistering a provider while
494 // dumping from a different thread than the dumping thread. 509 // dumping from a different thread than the dumping thread.
495 TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { 510 TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) {
496 InitializeMemoryDumpManager(false /* is_coordinator */); 511 InitializeMemoryDumpManager(false /* is_coordinator */);
497 ScopedVector<TestIOThread> threads; 512 ScopedVector<TestIOThread> threads;
498 ScopedVector<MockMemoryDumpProvider> mdps; 513 ScopedVector<MockMemoryDumpProvider> mdps;
499 514
500 for (int i = 0; i < 2; i++) { 515 for (int i = 0; i < 2; i++) {
501 threads.push_back(new TestIOThread(TestIOThread::kAutoStart)); 516 threads.push_back(new TestIOThread(TestIOThread::kAutoStart));
502 mdps.push_back(new MockMemoryDumpProvider()); 517 mdps.push_back(new MockMemoryDumpProvider());
503 mdm_->RegisterDumpProvider(mdps.back(), threads.back()->task_runner()); 518 RegisterDumpProvider(mdps.back(), threads.back()->task_runner());
504 } 519 }
505 520
506 int on_memory_dump_call_count = 0; 521 int on_memory_dump_call_count = 0;
507 RunLoop run_loop; 522 RunLoop run_loop;
508 523
509 // When OnMemoryDump is called on either of the dump providers, it will 524 // When OnMemoryDump is called on either of the dump providers, it will
510 // unregister the other one. 525 // unregister the other one.
511 for (MockMemoryDumpProvider* mdp : mdps) { 526 for (MockMemoryDumpProvider* mdp : mdps) {
512 int other_idx = (mdps.front() == mdp); 527 int other_idx = (mdps.front() == mdp);
513 TestIOThread* other_thread = threads[other_idx]; 528 TestIOThread* other_thread = threads[other_idx];
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 ASSERT_EQ(true, last_callback_success_); 560 ASSERT_EQ(true, last_callback_success_);
546 561
547 DisableTracing(); 562 DisableTracing();
548 } 563 }
549 564
550 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when 565 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when
551 // tracing is not enabled. 566 // tracing is not enabled.
552 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { 567 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) {
553 InitializeMemoryDumpManager(false /* is_coordinator */); 568 InitializeMemoryDumpManager(false /* is_coordinator */);
554 MockMemoryDumpProvider mdp1; 569 MockMemoryDumpProvider mdp1;
555 mdm_->RegisterDumpProvider(&mdp1); 570 RegisterDumpProvider(&mdp1);
556 571
557 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); 572 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0);
558 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); 573 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0);
559 574
560 last_callback_success_ = true; 575 last_callback_success_ = true;
561 { 576 {
562 RunLoop run_loop; 577 RunLoop run_loop;
563 MemoryDumpCallback callback = 578 MemoryDumpCallback callback =
564 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), 579 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this),
565 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); 580 MessageLoop::current()->task_runner(), run_loop.QuitClosure());
566 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, 581 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED,
567 MemoryDumpLevelOfDetail::DETAILED, callback); 582 MemoryDumpLevelOfDetail::DETAILED, callback);
568 run_loop.Run(); 583 run_loop.Run();
569 } 584 }
570 EXPECT_FALSE(last_callback_success_); 585 EXPECT_FALSE(last_callback_success_);
571 } 586 }
572 587
573 // Checks that is the MemoryDumpManager is initialized after tracing already 588 // Checks that is the MemoryDumpManager is initialized after tracing already
574 // began, it will still late-join the party (real use case: startup tracing). 589 // began, it will still late-join the party (real use case: startup tracing).
575 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { 590 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) {
576 MockMemoryDumpProvider mdp; 591 MockMemoryDumpProvider mdp;
577 mdm_->RegisterDumpProvider(&mdp); 592 RegisterDumpProvider(&mdp);
578 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 593 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
579 594
580 // First check that a RequestGlobalDump() issued before the MemoryDumpManager 595 // First check that a RequestGlobalDump() issued before the MemoryDumpManager
581 // initialization gets NACK-ed cleanly. 596 // initialization gets NACK-ed cleanly.
582 { 597 {
583 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); 598 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
584 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); 599 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0);
585 RunLoop run_loop; 600 RunLoop run_loop;
586 MemoryDumpCallback callback = 601 MemoryDumpCallback callback =
587 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), 602 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this),
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 712
698 EnableTracingWithTraceConfig( 713 EnableTracingWithTraceConfig(
699 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( 714 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(
700 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); 715 kLightDumpPeriodMs, kHeavyDumpPeriodMs));
701 run_loop.Run(); 716 run_loop.Run();
702 DisableTracing(); 717 DisableTracing();
703 } 718 }
704 719
705 } // namespace trace_event 720 } // namespace trace_event
706 } // namespace base 721 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698