OLD | NEW |
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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // TODO (fmeawad): we should keep the results for verification, but currently | 121 // TODO (fmeawad): we should keep the results for verification, but currently |
122 // all results are empty. | 122 // all results are empty. |
123 void ProcessDumpCallbackAdapter( | 123 void ProcessDumpCallbackAdapter( |
124 GlobalMemoryDumpCallback callback, | 124 GlobalMemoryDumpCallback callback, |
125 uint64_t dump_guid, | 125 uint64_t dump_guid, |
126 bool success, | 126 bool success, |
127 const base::Optional<base::trace_event::MemoryDumpCallbackResult>&) { | 127 const base::Optional<base::trace_event::MemoryDumpCallbackResult>&) { |
128 callback.Run(dump_guid, success); | 128 callback.Run(dump_guid, success); |
129 } | 129 } |
130 | 130 |
131 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump | 131 // This mocks the RequestGlobalDumpFunction which is typically handled by |
132 // requests locally to the MemoryDumpManager instead of performing IPC dances. | 132 // process_local_dump_manager_impl.cc, by short-circuiting dump requests locally |
133 class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { | 133 // to the MemoryDumpManager without an actual service. |
| 134 class GlobalMemoryDumpHandler { |
134 public: | 135 public: |
135 MemoryDumpManagerDelegateForTesting(bool is_coordinator) | 136 MOCK_METHOD2(RequestGlobalMemoryDump, |
136 : is_coordinator_(is_coordinator) { | 137 void(const MemoryDumpRequestArgs& args, |
| 138 const GlobalMemoryDumpCallback& callback)); |
| 139 |
| 140 GlobalMemoryDumpHandler() { |
137 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) | 141 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) |
138 .WillByDefault(Invoke([this](const MemoryDumpRequestArgs& args, | 142 .WillByDefault(Invoke([this](const MemoryDumpRequestArgs& args, |
139 const GlobalMemoryDumpCallback& callback) { | 143 const GlobalMemoryDumpCallback& callback) { |
140 ProcessMemoryDumpCallback process_callback = | 144 ProcessMemoryDumpCallback process_callback = |
141 Bind(&ProcessDumpCallbackAdapter, callback); | 145 Bind(&ProcessDumpCallbackAdapter, callback); |
142 CreateProcessDump(args, process_callback); | 146 MemoryDumpManager::GetInstance()->CreateProcessDump(args, |
| 147 process_callback); |
143 })); | 148 })); |
144 } | 149 } |
145 | |
146 MOCK_METHOD2(RequestGlobalMemoryDump, | |
147 void(const MemoryDumpRequestArgs& args, | |
148 const GlobalMemoryDumpCallback& callback)); | |
149 | |
150 bool IsCoordinator() const override { return is_coordinator_; } | |
151 | |
152 // Promote the CreateProcessDump to public so it can be used by test fixtures. | |
153 using MemoryDumpManagerDelegate::CreateProcessDump; | |
154 | |
155 private: | |
156 bool is_coordinator_; | |
157 }; | 150 }; |
158 | 151 |
159 class MockMemoryDumpProvider : public MemoryDumpProvider { | 152 class MockMemoryDumpProvider : public MemoryDumpProvider { |
160 public: | 153 public: |
161 MOCK_METHOD0(Destructor, void()); | 154 MOCK_METHOD0(Destructor, void()); |
162 MOCK_METHOD2(OnMemoryDump, | 155 MOCK_METHOD2(OnMemoryDump, |
163 bool(const MemoryDumpArgs& args, ProcessMemoryDump* pmd)); | 156 bool(const MemoryDumpArgs& args, ProcessMemoryDump* pmd)); |
164 MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t* memory_total)); | 157 MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t* memory_total)); |
165 MOCK_METHOD0(SuspendFastMemoryPolling, void()); | 158 MOCK_METHOD0(SuspendFastMemoryPolling, void()); |
166 | 159 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 void SetUp() override { | 230 void SetUp() override { |
238 last_callback_success_ = false; | 231 last_callback_success_ = false; |
239 message_loop_.reset(new MessageLoop()); | 232 message_loop_.reset(new MessageLoop()); |
240 mdm_.reset(new MemoryDumpManager()); | 233 mdm_.reset(new MemoryDumpManager()); |
241 MemoryDumpManager::SetInstanceForTesting(mdm_.get()); | 234 MemoryDumpManager::SetInstanceForTesting(mdm_.get()); |
242 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); | 235 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); |
243 } | 236 } |
244 | 237 |
245 void TearDown() override { | 238 void TearDown() override { |
246 MemoryDumpManager::SetInstanceForTesting(nullptr); | 239 MemoryDumpManager::SetInstanceForTesting(nullptr); |
247 delegate_ = nullptr; | |
248 mdm_.reset(); | 240 mdm_.reset(); |
249 message_loop_.reset(); | 241 message_loop_.reset(); |
250 TraceLog::DeleteForTesting(); | 242 TraceLog::DeleteForTesting(); |
251 } | 243 } |
252 | 244 |
253 // Turns a Closure into a GlobalMemoryDumpCallback, keeping track of the | 245 // Turns a Closure into a GlobalMemoryDumpCallback, keeping track of the |
254 // callback result and taking care of posting the closure on the correct task | 246 // callback result and taking care of posting the closure on the correct task |
255 // runner. | 247 // runner. |
256 void GlobalDumpCallbackAdapter( | 248 void GlobalDumpCallbackAdapter( |
257 scoped_refptr<SingleThreadTaskRunner> task_runner, | 249 scoped_refptr<SingleThreadTaskRunner> task_runner, |
258 Closure closure, | 250 Closure closure, |
259 uint64_t dump_guid, | 251 uint64_t dump_guid, |
260 bool success) { | 252 bool success) { |
261 last_callback_success_ = success; | 253 last_callback_success_ = success; |
262 task_runner->PostTask(FROM_HERE, closure); | 254 task_runner->PostTask(FROM_HERE, closure); |
263 } | 255 } |
264 | 256 |
265 protected: | 257 protected: |
266 void InitializeMemoryDumpManager(bool is_coordinator) { | 258 void InitializeMemoryDumpManager(bool is_coordinator) { |
267 mdm_->set_dumper_registrations_ignored_for_testing(true); | 259 mdm_->set_dumper_registrations_ignored_for_testing(true); |
268 delegate_ = new MemoryDumpManagerDelegateForTesting(is_coordinator); | 260 mdm_->Initialize( |
269 mdm_->Initialize(base::WrapUnique(delegate_)); | 261 BindRepeating(&GlobalMemoryDumpHandler::RequestGlobalMemoryDump, |
| 262 Unretained(&global_dump_handler_)), |
| 263 is_coordinator); |
270 } | 264 } |
271 | 265 |
272 void RequestGlobalDumpAndWait(MemoryDumpType dump_type, | 266 void RequestGlobalDumpAndWait(MemoryDumpType dump_type, |
273 MemoryDumpLevelOfDetail level_of_detail) { | 267 MemoryDumpLevelOfDetail level_of_detail) { |
274 RunLoop run_loop; | 268 RunLoop run_loop; |
275 GlobalMemoryDumpCallback callback = Bind( | 269 GlobalMemoryDumpCallback callback = Bind( |
276 &MemoryDumpManagerTest::GlobalDumpCallbackAdapter, Unretained(this), | 270 &MemoryDumpManagerTest::GlobalDumpCallbackAdapter, Unretained(this), |
277 ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); | 271 ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); |
278 mdm_->RequestGlobalDump(dump_type, level_of_detail, callback); | 272 mdm_->RequestGlobalDump(dump_type, level_of_detail, callback); |
279 run_loop.Run(); | 273 run_loop.Run(); |
(...skipping 14 matching lines...) Expand all Loading... |
294 bool IsPeriodicDumpingEnabled() const { | 288 bool IsPeriodicDumpingEnabled() const { |
295 return MemoryDumpScheduler::GetInstance()->is_enabled_for_testing(); | 289 return MemoryDumpScheduler::GetInstance()->is_enabled_for_testing(); |
296 } | 290 } |
297 | 291 |
298 int GetMaxConsecutiveFailuresCount() const { | 292 int GetMaxConsecutiveFailuresCount() const { |
299 return MemoryDumpManager::kMaxConsecutiveFailuresCount; | 293 return MemoryDumpManager::kMaxConsecutiveFailuresCount; |
300 } | 294 } |
301 | 295 |
302 const MemoryDumpProvider::Options kDefaultOptions; | 296 const MemoryDumpProvider::Options kDefaultOptions; |
303 std::unique_ptr<MemoryDumpManager> mdm_; | 297 std::unique_ptr<MemoryDumpManager> mdm_; |
304 MemoryDumpManagerDelegateForTesting* delegate_; | 298 GlobalMemoryDumpHandler global_dump_handler_; |
305 bool last_callback_success_; | 299 bool last_callback_success_; |
306 | 300 |
307 private: | 301 private: |
308 std::unique_ptr<MessageLoop> message_loop_; | 302 std::unique_ptr<MessageLoop> message_loop_; |
309 | 303 |
310 // We want our singleton torn down after each test. | 304 // We want our singleton torn down after each test. |
311 ShadowingAtExitManager at_exit_manager_; | 305 ShadowingAtExitManager at_exit_manager_; |
312 }; | 306 }; |
313 | 307 |
314 // Basic sanity checks. Registers a memory dump provider and checks that it is | 308 // Basic sanity checks. Registers a memory dump provider and checks that it is |
315 // called, but only when memory-infra is enabled. | 309 // called, but only when memory-infra is enabled. |
316 TEST_F(MemoryDumpManagerTest, SingleDumper) { | 310 TEST_F(MemoryDumpManagerTest, SingleDumper) { |
317 InitializeMemoryDumpManager(false /* is_coordinator */); | 311 InitializeMemoryDumpManager(false /* is_coordinator */); |
318 MockMemoryDumpProvider mdp; | 312 MockMemoryDumpProvider mdp; |
319 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 313 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
320 | 314 |
321 // Check that the dumper is not called if the memory category is not enabled. | 315 // Check that the dumper is not called if the memory category is not enabled. |
322 EnableTracingWithLegacyCategories("foobar-but-not-memory"); | 316 EnableTracingWithLegacyCategories("foobar-but-not-memory"); |
323 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 317 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(0); |
324 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 318 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
325 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 319 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
326 MemoryDumpLevelOfDetail::DETAILED); | 320 MemoryDumpLevelOfDetail::DETAILED); |
327 DisableTracing(); | 321 DisableTracing(); |
328 | 322 |
329 // Now repeat enabling the memory category and check that the dumper is | 323 // Now repeat enabling the memory category and check that the dumper is |
330 // invoked this time. | 324 // invoked this time. |
331 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 325 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
332 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | 326 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
333 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); | 327 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
334 for (int i = 0; i < 3; ++i) { | 328 for (int i = 0; i < 3; ++i) { |
335 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 329 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
336 MemoryDumpLevelOfDetail::DETAILED); | 330 MemoryDumpLevelOfDetail::DETAILED); |
337 } | 331 } |
338 DisableTracing(); | 332 DisableTracing(); |
339 | 333 |
340 mdm_->UnregisterDumpProvider(&mdp); | 334 mdm_->UnregisterDumpProvider(&mdp); |
341 | 335 |
342 // Finally check the unregister logic: the delegate will be invoked but not | 336 // Finally check the unregister logic: the global dump handler will be invoked |
343 // the dump provider, as it has been unregistered. | 337 // but not the dump provider, as it has been unregistered. |
344 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 338 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
345 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | 339 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
346 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 340 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
347 | 341 |
348 for (int i = 0; i < 3; ++i) { | 342 for (int i = 0; i < 3; ++i) { |
349 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 343 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
350 MemoryDumpLevelOfDetail::DETAILED); | 344 MemoryDumpLevelOfDetail::DETAILED); |
351 } | 345 } |
352 DisableTracing(); | 346 DisableTracing(); |
353 } | 347 } |
354 | 348 |
355 // Checks that requesting dumps with high level of detail actually propagates | 349 // Checks that requesting dumps with high level of detail actually propagates |
356 // the level of the detail properly to OnMemoryDump() call on dump providers. | 350 // the level of the detail properly to OnMemoryDump() call on dump providers. |
357 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { | 351 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
358 InitializeMemoryDumpManager(false /* is_coordinator */); | 352 InitializeMemoryDumpManager(false /* is_coordinator */); |
359 MockMemoryDumpProvider mdp; | 353 MockMemoryDumpProvider mdp; |
360 | 354 |
361 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 355 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
362 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 356 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
363 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 357 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
364 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); | 358 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
365 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 359 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
366 MemoryDumpLevelOfDetail::DETAILED); | 360 MemoryDumpLevelOfDetail::DETAILED); |
367 DisableTracing(); | 361 DisableTracing(); |
368 mdm_->UnregisterDumpProvider(&mdp); | 362 mdm_->UnregisterDumpProvider(&mdp); |
369 | 363 |
370 // Check that requesting dumps with low level of detail actually propagates to | 364 // Check that requesting dumps with low level of detail actually propagates to |
371 // OnMemoryDump() call on dump providers. | 365 // OnMemoryDump() call on dump providers. |
372 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 366 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
373 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 367 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
374 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 368 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
375 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); | 369 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
376 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 370 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
377 MemoryDumpLevelOfDetail::LIGHT); | 371 MemoryDumpLevelOfDetail::LIGHT); |
378 DisableTracing(); | 372 DisableTracing(); |
379 mdm_->UnregisterDumpProvider(&mdp); | 373 mdm_->UnregisterDumpProvider(&mdp); |
380 } | 374 } |
381 | 375 |
382 // Checks that the SharedSessionState object is acqually shared over time. | 376 // Checks that the SharedSessionState object is acqually shared over time. |
383 TEST_F(MemoryDumpManagerTest, SharedSessionState) { | 377 TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
384 InitializeMemoryDumpManager(false /* is_coordinator */); | 378 InitializeMemoryDumpManager(false /* is_coordinator */); |
385 MockMemoryDumpProvider mdp1; | 379 MockMemoryDumpProvider mdp1; |
386 MockMemoryDumpProvider mdp2; | 380 MockMemoryDumpProvider mdp2; |
387 RegisterDumpProvider(&mdp1, nullptr); | 381 RegisterDumpProvider(&mdp1, nullptr); |
388 RegisterDumpProvider(&mdp2, nullptr); | 382 RegisterDumpProvider(&mdp2, nullptr); |
389 | 383 |
390 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 384 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
391 const MemoryDumpSessionState* session_state = | 385 const MemoryDumpSessionState* session_state = |
392 mdm_->session_state_for_testing().get(); | 386 mdm_->session_state_for_testing().get(); |
393 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 387 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
394 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 388 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
395 .Times(2) | 389 .Times(2) |
396 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 390 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
397 ProcessMemoryDump* pmd) -> bool { | 391 ProcessMemoryDump* pmd) -> bool { |
398 EXPECT_EQ(session_state, pmd->session_state().get()); | 392 EXPECT_EQ(session_state, pmd->session_state().get()); |
399 return true; | 393 return true; |
400 })); | 394 })); |
401 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 395 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
402 .Times(2) | 396 .Times(2) |
403 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 397 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
(...skipping 12 matching lines...) Expand all Loading... |
416 | 410 |
417 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. | 411 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
418 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { | 412 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
419 InitializeMemoryDumpManager(false /* is_coordinator */); | 413 InitializeMemoryDumpManager(false /* is_coordinator */); |
420 MockMemoryDumpProvider mdp1; | 414 MockMemoryDumpProvider mdp1; |
421 MockMemoryDumpProvider mdp2; | 415 MockMemoryDumpProvider mdp2; |
422 | 416 |
423 // Enable only mdp1. | 417 // Enable only mdp1. |
424 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); | 418 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); |
425 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 419 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
426 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 420 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
427 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 421 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
428 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 422 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
429 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 423 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
430 MemoryDumpLevelOfDetail::DETAILED); | 424 MemoryDumpLevelOfDetail::DETAILED); |
431 DisableTracing(); | 425 DisableTracing(); |
432 | 426 |
433 // Invert: enable mdp1 and disable mdp2. | 427 // Invert: enable mdp1 and disable mdp2. |
434 mdm_->UnregisterDumpProvider(&mdp1); | 428 mdm_->UnregisterDumpProvider(&mdp1); |
435 RegisterDumpProvider(&mdp2, nullptr); | 429 RegisterDumpProvider(&mdp2, nullptr); |
436 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 430 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
437 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 431 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
438 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 432 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
439 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 433 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
440 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 434 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
441 MemoryDumpLevelOfDetail::DETAILED); | 435 MemoryDumpLevelOfDetail::DETAILED); |
442 DisableTracing(); | 436 DisableTracing(); |
443 | 437 |
444 // Enable both mdp1 and mdp2. | 438 // Enable both mdp1 and mdp2. |
445 RegisterDumpProvider(&mdp1, nullptr); | 439 RegisterDumpProvider(&mdp1, nullptr); |
446 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 440 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
447 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 441 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
448 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 442 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
449 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 443 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
450 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 444 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
451 MemoryDumpLevelOfDetail::DETAILED); | 445 MemoryDumpLevelOfDetail::DETAILED); |
452 DisableTracing(); | 446 DisableTracing(); |
453 } | 447 } |
454 | 448 |
455 // Checks that the dump provider invocations depend only on the current | 449 // Checks that the dump provider invocations depend only on the current |
456 // registration state and not on previous registrations and dumps. | 450 // registration state and not on previous registrations and dumps. |
457 // Flaky on iOS, see crbug.com/706874 | 451 // Flaky on iOS, see crbug.com/706874 |
458 #if defined(OS_IOS) | 452 #if defined(OS_IOS) |
459 #define MAYBE_RegistrationConsistency DISABLED_RegistrationConsistency | 453 #define MAYBE_RegistrationConsistency DISABLED_RegistrationConsistency |
460 #else | 454 #else |
461 #define MAYBE_RegistrationConsistency RegistrationConsistency | 455 #define MAYBE_RegistrationConsistency RegistrationConsistency |
462 #endif | 456 #endif |
463 TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { | 457 TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { |
464 InitializeMemoryDumpManager(false /* is_coordinator */); | 458 InitializeMemoryDumpManager(false /* is_coordinator */); |
465 MockMemoryDumpProvider mdp; | 459 MockMemoryDumpProvider mdp; |
466 | 460 |
467 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 461 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
468 | 462 |
469 { | 463 { |
470 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 464 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
471 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 465 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
472 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 466 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
473 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 467 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
474 MemoryDumpLevelOfDetail::DETAILED); | 468 MemoryDumpLevelOfDetail::DETAILED); |
475 DisableTracing(); | 469 DisableTracing(); |
476 } | 470 } |
477 | 471 |
478 mdm_->UnregisterDumpProvider(&mdp); | 472 mdm_->UnregisterDumpProvider(&mdp); |
479 | 473 |
480 { | 474 { |
481 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 475 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
482 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 476 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
483 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 477 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
484 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 478 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
485 MemoryDumpLevelOfDetail::DETAILED); | 479 MemoryDumpLevelOfDetail::DETAILED); |
486 DisableTracing(); | 480 DisableTracing(); |
487 } | 481 } |
488 | 482 |
489 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 483 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
490 mdm_->UnregisterDumpProvider(&mdp); | 484 mdm_->UnregisterDumpProvider(&mdp); |
491 | 485 |
492 { | 486 { |
493 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 487 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
494 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 488 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
495 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 489 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
496 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 490 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
497 MemoryDumpLevelOfDetail::DETAILED); | 491 MemoryDumpLevelOfDetail::DETAILED); |
498 DisableTracing(); | 492 DisableTracing(); |
499 } | 493 } |
500 | 494 |
501 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 495 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
502 mdm_->UnregisterDumpProvider(&mdp); | 496 mdm_->UnregisterDumpProvider(&mdp); |
503 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 497 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
504 | 498 |
505 { | 499 { |
506 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 500 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
507 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 501 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
508 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 502 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
509 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 503 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
510 MemoryDumpLevelOfDetail::DETAILED); | 504 MemoryDumpLevelOfDetail::DETAILED); |
511 DisableTracing(); | 505 DisableTracing(); |
512 } | 506 } |
513 } | 507 } |
514 | 508 |
515 // Checks that the MemoryDumpManager respects the thread affinity when a | 509 // Checks that the MemoryDumpManager respects the thread affinity when a |
516 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 | 510 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 |
(...skipping 22 matching lines...) Expand all Loading... |
539 .WillRepeatedly(Invoke( | 533 .WillRepeatedly(Invoke( |
540 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 534 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
541 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); | 535 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); |
542 return true; | 536 return true; |
543 })); | 537 })); |
544 } | 538 } |
545 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 539 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
546 | 540 |
547 while (!threads.empty()) { | 541 while (!threads.empty()) { |
548 last_callback_success_ = false; | 542 last_callback_success_ = false; |
549 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 543 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
550 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 544 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
551 MemoryDumpLevelOfDetail::DETAILED); | 545 MemoryDumpLevelOfDetail::DETAILED); |
552 EXPECT_TRUE(last_callback_success_); | 546 EXPECT_TRUE(last_callback_success_); |
553 | 547 |
554 // Unregister a MDP and destroy one thread at each iteration to check the | 548 // Unregister a MDP and destroy one thread at each iteration to check the |
555 // live unregistration logic. The unregistration needs to happen on the same | 549 // live unregistration logic. The unregistration needs to happen on the same |
556 // thread the MDP belongs to. | 550 // thread the MDP belongs to. |
557 { | 551 { |
558 RunLoop run_loop; | 552 RunLoop run_loop; |
559 Closure unregistration = | 553 Closure unregistration = |
(...skipping 24 matching lines...) Expand all Loading... |
584 RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1, | 578 RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1, |
585 kDefaultOptions); | 579 kDefaultOptions); |
586 RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2, | 580 RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2, |
587 kDefaultOptions); | 581 kDefaultOptions); |
588 RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2, | 582 RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2, |
589 kDefaultOptions); | 583 kDefaultOptions); |
590 // |mdps[0]| should be disabled permanently after first dump. | 584 // |mdps[0]| should be disabled permanently after first dump. |
591 EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0); | 585 EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0); |
592 EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2); | 586 EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2); |
593 EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2); | 587 EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2); |
594 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 588 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
595 | 589 |
596 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 590 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
597 | 591 |
598 task_runner1->set_enabled(false); | 592 task_runner1->set_enabled(false); |
599 last_callback_success_ = false; | 593 last_callback_success_ = false; |
600 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 594 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
601 MemoryDumpLevelOfDetail::DETAILED); | 595 MemoryDumpLevelOfDetail::DETAILED); |
602 // Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong | 596 // Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong |
603 // to same task runner. | 597 // to same task runner. |
604 EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); | 598 EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); |
(...skipping 15 matching lines...) Expand all Loading... |
620 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { | 614 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
621 InitializeMemoryDumpManager(false /* is_coordinator */); | 615 InitializeMemoryDumpManager(false /* is_coordinator */); |
622 MockMemoryDumpProvider mdp1; | 616 MockMemoryDumpProvider mdp1; |
623 MockMemoryDumpProvider mdp2; | 617 MockMemoryDumpProvider mdp2; |
624 | 618 |
625 RegisterDumpProvider(&mdp1, nullptr); | 619 RegisterDumpProvider(&mdp1, nullptr); |
626 RegisterDumpProvider(&mdp2, nullptr); | 620 RegisterDumpProvider(&mdp2, nullptr); |
627 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 621 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
628 | 622 |
629 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); | 623 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
630 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); | 624 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
| 625 .Times(kNumDumps); |
631 | 626 |
632 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 627 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
633 .Times(GetMaxConsecutiveFailuresCount()) | 628 .Times(GetMaxConsecutiveFailuresCount()) |
634 .WillRepeatedly(Return(false)); | 629 .WillRepeatedly(Return(false)); |
635 | 630 |
636 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 631 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
637 .WillOnce(Return(false)) | 632 .WillOnce(Return(false)) |
638 .WillOnce(Return(true)) | 633 .WillOnce(Return(true)) |
639 .WillOnce(Return(false)) | 634 .WillOnce(Return(false)) |
640 .WillOnce(Return(false)) | 635 .WillOnce(Return(false)) |
(...skipping 11 matching lines...) Expand all Loading... |
652 // Sneakily registers an extra memory dump provider while an existing one is | 647 // Sneakily registers an extra memory dump provider while an existing one is |
653 // dumping and expect it to take part in the already active tracing session. | 648 // dumping and expect it to take part in the already active tracing session. |
654 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { | 649 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
655 InitializeMemoryDumpManager(false /* is_coordinator */); | 650 InitializeMemoryDumpManager(false /* is_coordinator */); |
656 MockMemoryDumpProvider mdp1; | 651 MockMemoryDumpProvider mdp1; |
657 MockMemoryDumpProvider mdp2; | 652 MockMemoryDumpProvider mdp2; |
658 | 653 |
659 RegisterDumpProvider(&mdp1, nullptr); | 654 RegisterDumpProvider(&mdp1, nullptr); |
660 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 655 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
661 | 656 |
662 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 657 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(4); |
663 | 658 |
664 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 659 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
665 .Times(4) | 660 .Times(4) |
666 .WillOnce(Return(true)) | 661 .WillOnce(Return(true)) |
667 .WillOnce( | 662 .WillOnce( |
668 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 663 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
669 RegisterDumpProvider(&mdp2, nullptr); | 664 RegisterDumpProvider(&mdp2, nullptr); |
670 return true; | 665 return true; |
671 })) | 666 })) |
672 .WillRepeatedly(Return(true)); | 667 .WillRepeatedly(Return(true)); |
(...skipping 15 matching lines...) Expand all Loading... |
688 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. | 683 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. |
689 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { | 684 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
690 InitializeMemoryDumpManager(false /* is_coordinator */); | 685 InitializeMemoryDumpManager(false /* is_coordinator */); |
691 MockMemoryDumpProvider mdp1; | 686 MockMemoryDumpProvider mdp1; |
692 MockMemoryDumpProvider mdp2; | 687 MockMemoryDumpProvider mdp2; |
693 | 688 |
694 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get(), kDefaultOptions); | 689 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get(), kDefaultOptions); |
695 RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions); | 690 RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions); |
696 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 691 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
697 | 692 |
698 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 693 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(4); |
699 | 694 |
700 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 695 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
701 .Times(4) | 696 .Times(4) |
702 .WillOnce(Return(true)) | 697 .WillOnce(Return(true)) |
703 .WillOnce( | 698 .WillOnce( |
704 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 699 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
705 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); | 700 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); |
706 return true; | 701 return true; |
707 })) | 702 })) |
708 .WillRepeatedly(Return(true)); | 703 .WillRepeatedly(Return(true)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 | 753 |
759 // OnMemoryDump is called once for the provider that dumps first, and zero | 754 // OnMemoryDump is called once for the provider that dumps first, and zero |
760 // times for the other provider. | 755 // times for the other provider. |
761 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 756 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
762 .Times(AtMost(1)) | 757 .Times(AtMost(1)) |
763 .WillOnce(Invoke(on_dump)); | 758 .WillOnce(Invoke(on_dump)); |
764 } | 759 } |
765 | 760 |
766 last_callback_success_ = false; | 761 last_callback_success_ = false; |
767 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 762 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
768 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 763 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
769 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 764 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
770 MemoryDumpLevelOfDetail::DETAILED); | 765 MemoryDumpLevelOfDetail::DETAILED); |
771 ASSERT_EQ(1, on_memory_dump_call_count); | 766 ASSERT_EQ(1, on_memory_dump_call_count); |
772 ASSERT_TRUE(last_callback_success_); | 767 ASSERT_TRUE(last_callback_success_); |
773 | 768 |
774 DisableTracing(); | 769 DisableTracing(); |
775 } | 770 } |
776 | 771 |
777 TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { | 772 TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { |
778 InitializeMemoryDumpManager(false /* is_coordinator */); | 773 InitializeMemoryDumpManager(false /* is_coordinator */); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 | 855 |
861 // OnMemoryDump is called once for the provider that dumps first, and zero | 856 // OnMemoryDump is called once for the provider that dumps first, and zero |
862 // times for the other provider. | 857 // times for the other provider. |
863 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 858 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
864 .Times(AtMost(1)) | 859 .Times(AtMost(1)) |
865 .WillOnce(Invoke(on_dump)); | 860 .WillOnce(Invoke(on_dump)); |
866 } | 861 } |
867 | 862 |
868 last_callback_success_ = false; | 863 last_callback_success_ = false; |
869 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 864 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
870 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 865 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
871 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 866 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
872 MemoryDumpLevelOfDetail::DETAILED); | 867 MemoryDumpLevelOfDetail::DETAILED); |
873 ASSERT_EQ(1, on_memory_dump_call_count); | 868 ASSERT_EQ(1, on_memory_dump_call_count); |
874 ASSERT_TRUE(last_callback_success_); | 869 ASSERT_TRUE(last_callback_success_); |
875 | 870 |
876 DisableTracing(); | 871 DisableTracing(); |
877 } | 872 } |
878 | 873 |
879 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when | 874 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
880 // tracing is not enabled. | 875 // tracing is not enabled. |
881 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { | 876 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
882 InitializeMemoryDumpManager(false /* is_coordinator */); | 877 InitializeMemoryDumpManager(false /* is_coordinator */); |
883 MockMemoryDumpProvider mdp1; | 878 MockMemoryDumpProvider mdp1; |
884 RegisterDumpProvider(&mdp1, nullptr); | 879 RegisterDumpProvider(&mdp1, nullptr); |
885 | 880 |
886 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 881 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(0); |
887 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 882 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
888 | 883 |
889 last_callback_success_ = true; | 884 last_callback_success_ = true; |
890 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 885 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
891 MemoryDumpLevelOfDetail::DETAILED); | 886 MemoryDumpLevelOfDetail::DETAILED); |
892 EXPECT_FALSE(last_callback_success_); | 887 EXPECT_FALSE(last_callback_success_); |
893 } | 888 } |
894 | 889 |
895 // Checks that is the MemoryDumpManager is initialized after tracing already | 890 // Checks that is the MemoryDumpManager is initialized after tracing already |
896 // began, it will still late-join the party (real use case: startup tracing). | 891 // began, it will still late-join the party (real use case: startup tracing). |
897 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { | 892 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
898 MockMemoryDumpProvider mdp; | 893 MockMemoryDumpProvider mdp; |
899 RegisterDumpProvider(&mdp, nullptr); | 894 RegisterDumpProvider(&mdp, nullptr); |
900 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 895 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
901 | 896 |
902 // First check that a RequestGlobalDump() issued before the MemoryDumpManager | 897 // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
903 // initialization gets NACK-ed cleanly. | 898 // initialization gets NACK-ed cleanly. |
904 { | 899 { |
905 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 900 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
906 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 901 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
907 MemoryDumpLevelOfDetail::DETAILED); | 902 MemoryDumpLevelOfDetail::DETAILED); |
908 EXPECT_FALSE(last_callback_success_); | 903 EXPECT_FALSE(last_callback_success_); |
909 } | 904 } |
910 | 905 |
911 // Now late-initialize the MemoryDumpManager and check that the | 906 // Now late-initialize the MemoryDumpManager and check that the |
912 // RequestGlobalDump completes successfully. | 907 // RequestGlobalDump completes successfully. |
913 { | 908 { |
914 InitializeMemoryDumpManager(false /* is_coordinator */); | 909 InitializeMemoryDumpManager(false /* is_coordinator */); |
915 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); | 910 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); |
916 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 911 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
917 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 912 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
918 MemoryDumpLevelOfDetail::DETAILED); | 913 MemoryDumpLevelOfDetail::DETAILED); |
919 EXPECT_TRUE(last_callback_success_); | 914 EXPECT_TRUE(last_callback_success_); |
920 } | 915 } |
921 DisableTracing(); | 916 DisableTracing(); |
922 } | 917 } |
923 | 918 |
924 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the | 919 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the |
925 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic | 920 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic |
926 // dumps in memory-infra, handling gracefully the transition between the legacy | 921 // dumps in memory-infra, handling gracefully the transition between the legacy |
927 // and the new-style (JSON-based) TraceConfig. | 922 // and the new-style (JSON-based) TraceConfig. |
928 TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { | 923 TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { |
929 InitializeMemoryDumpManager(false /* is_coordinator */); | 924 InitializeMemoryDumpManager(false /* is_coordinator */); |
930 MemoryDumpManagerDelegateForTesting& delegate = *delegate_; | |
931 | 925 |
932 // Don't trigger the default behavior of the mock delegate in this test, | 926 // Don't trigger the default behavior of the global dump handler in this test, |
933 // which would short-circuit the dump request to the actual | 927 // which would short-circuit the dump request to the actual |
934 // CreateProcessDump(). | 928 // CreateProcessDump(). |
935 // We don't want to create any dump in this test, only check whether the dumps | 929 // We don't want to create any dump in this test, only check whether the dumps |
936 // are requested or not. | 930 // are requested or not. |
937 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); | 931 ON_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
| 932 .WillByDefault(Return()); |
938 | 933 |
939 // Enabling memory-infra in a non-coordinator process should not trigger any | 934 // Enabling memory-infra in a non-coordinator process should not trigger any |
940 // periodic dumps. | 935 // periodic dumps. |
941 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 936 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
942 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 937 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
943 DisableTracing(); | 938 DisableTracing(); |
944 | 939 |
945 // Enabling memory-infra with the new (JSON) TraceConfig in a non-coordinator | 940 // Enabling memory-infra with the new (JSON) TraceConfig in a non-coordinator |
946 // process with a fully defined trigger config should NOT enable any periodic | 941 // process with a fully defined trigger config should NOT enable any periodic |
947 // dumps. | 942 // dumps. |
948 EnableTracingWithTraceConfig( | 943 EnableTracingWithTraceConfig( |
949 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(1, 5)); | 944 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(1, 5)); |
950 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 945 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
951 DisableTracing(); | 946 DisableTracing(); |
952 } | 947 } |
953 | 948 |
954 TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { | 949 TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { |
955 InitializeMemoryDumpManager(true /* is_coordinator */); | 950 InitializeMemoryDumpManager(true /* is_coordinator */); |
956 MemoryDumpManagerDelegateForTesting& delegate = *delegate_; | 951 ON_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
957 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); | 952 .WillByDefault(Return()); |
958 | 953 |
959 // Enabling memory-infra with the legacy TraceConfig (category filter) in | 954 // Enabling memory-infra with the legacy TraceConfig (category filter) in |
960 // a coordinator process should enable periodic dumps. | 955 // a coordinator process should enable periodic dumps. |
961 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 956 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
962 EXPECT_TRUE(IsPeriodicDumpingEnabled()); | 957 EXPECT_TRUE(IsPeriodicDumpingEnabled()); |
963 DisableTracing(); | 958 DisableTracing(); |
964 | 959 |
965 // Enabling memory-infra with the new (JSON) TraceConfig in a coordinator | 960 // Enabling memory-infra with the new (JSON) TraceConfig in a coordinator |
966 // process without specifying any "memory_dump_config" section should enable | 961 // process without specifying any "memory_dump_config" section should enable |
967 // periodic dumps. This is to preserve the behavior chrome://tracing UI, that | 962 // periodic dumps. This is to preserve the behavior chrome://tracing UI, that |
(...skipping 17 matching lines...) Expand all Loading... |
985 // be performed in the correct order. | 980 // be performed in the correct order. |
986 RunLoop run_loop; | 981 RunLoop run_loop; |
987 auto test_task_runner = ThreadTaskRunnerHandle::Get(); | 982 auto test_task_runner = ThreadTaskRunnerHandle::Get(); |
988 auto quit_closure = run_loop.QuitClosure(); | 983 auto quit_closure = run_loop.QuitClosure(); |
989 | 984 |
990 const int kHeavyDumpRate = 5; | 985 const int kHeavyDumpRate = 5; |
991 const int kLightDumpPeriodMs = 1; | 986 const int kLightDumpPeriodMs = 1; |
992 const int kHeavyDumpPeriodMs = kHeavyDumpRate * kLightDumpPeriodMs; | 987 const int kHeavyDumpPeriodMs = kHeavyDumpRate * kLightDumpPeriodMs; |
993 // The expected sequence with light=1ms, heavy=5ms is H,L,L,L,L,H,... | 988 // The expected sequence with light=1ms, heavy=5ms is H,L,L,L,L,H,... |
994 testing::InSequence sequence; | 989 testing::InSequence sequence; |
995 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsDetailedDump(), _)); | 990 EXPECT_CALL(global_dump_handler_, |
996 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) | 991 RequestGlobalMemoryDump(IsDetailedDump(), _)); |
| 992 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
997 .Times(kHeavyDumpRate - 1); | 993 .Times(kHeavyDumpRate - 1); |
998 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsDetailedDump(), _)); | 994 EXPECT_CALL(global_dump_handler_, |
999 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) | 995 RequestGlobalMemoryDump(IsDetailedDump(), _)); |
| 996 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
1000 .Times(kHeavyDumpRate - 2); | 997 .Times(kHeavyDumpRate - 2); |
1001 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) | 998 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
1002 .WillOnce(Invoke([test_task_runner, quit_closure]( | 999 .WillOnce(Invoke([test_task_runner, quit_closure]( |
1003 const MemoryDumpRequestArgs& args, | 1000 const MemoryDumpRequestArgs& args, |
1004 const GlobalMemoryDumpCallback& callback) { | 1001 const GlobalMemoryDumpCallback& callback) { |
1005 test_task_runner->PostTask(FROM_HERE, quit_closure); | 1002 test_task_runner->PostTask(FROM_HERE, quit_closure); |
1006 })); | 1003 })); |
1007 | 1004 |
1008 // Swallow all the final spurious calls until tracing gets disabled. | 1005 // Swallow all the final spurious calls until tracing gets disabled. |
1009 EXPECT_CALL(delegate, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); | 1006 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
| 1007 .Times(AnyNumber()); |
1010 | 1008 |
1011 EnableTracingWithTraceConfig( | 1009 EnableTracingWithTraceConfig( |
1012 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( | 1010 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( |
1013 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); | 1011 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); |
1014 run_loop.Run(); | 1012 run_loop.Run(); |
1015 DisableTracing(); | 1013 DisableTracing(); |
1016 } | 1014 } |
1017 | 1015 |
1018 // Tests against race conditions that might arise when disabling tracing in the | 1016 // Tests against race conditions that might arise when disabling tracing in the |
1019 // middle of a global memory dump. | 1017 // middle of a global memory dump. |
(...skipping 15 matching lines...) Expand all Loading... |
1035 MockMemoryDumpProvider mdp_with_affinity; | 1033 MockMemoryDumpProvider mdp_with_affinity; |
1036 RegisterDumpProvider(&mdp_with_affinity, mdp_thread->task_runner(), | 1034 RegisterDumpProvider(&mdp_with_affinity, mdp_thread->task_runner(), |
1037 kDefaultOptions); | 1035 kDefaultOptions); |
1038 | 1036 |
1039 // Register also an unbound dump provider. Unbound dump providers are always | 1037 // Register also an unbound dump provider. Unbound dump providers are always |
1040 // invoked after bound ones. | 1038 // invoked after bound ones. |
1041 MockMemoryDumpProvider unbound_mdp; | 1039 MockMemoryDumpProvider unbound_mdp; |
1042 RegisterDumpProvider(&unbound_mdp, nullptr, kDefaultOptions); | 1040 RegisterDumpProvider(&unbound_mdp, nullptr, kDefaultOptions); |
1043 | 1041 |
1044 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1042 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1045 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1043 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
1046 EXPECT_CALL(mdp_with_affinity, OnMemoryDump(_, _)) | 1044 EXPECT_CALL(mdp_with_affinity, OnMemoryDump(_, _)) |
1047 .Times(1) | 1045 .Times(1) |
1048 .WillOnce( | 1046 .WillOnce( |
1049 Invoke([&tracing_disabled_event](const MemoryDumpArgs&, | 1047 Invoke([&tracing_disabled_event](const MemoryDumpArgs&, |
1050 ProcessMemoryDump* pmd) -> bool { | 1048 ProcessMemoryDump* pmd) -> bool { |
1051 tracing_disabled_event.Wait(); | 1049 tracing_disabled_event.Wait(); |
1052 | 1050 |
1053 // At this point tracing has been disabled and the | 1051 // At this point tracing has been disabled and the |
1054 // MemoryDumpManager.dump_thread_ has been shut down. | 1052 // MemoryDumpManager.dump_thread_ has been shut down. |
1055 return true; | 1053 return true; |
(...skipping 28 matching lines...) Expand all Loading... |
1084 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); | 1082 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); |
1085 mdp_thread->Start(); | 1083 mdp_thread->Start(); |
1086 | 1084 |
1087 // Create both same-thread MDP and another MDP with dedicated thread | 1085 // Create both same-thread MDP and another MDP with dedicated thread |
1088 MockMemoryDumpProvider mdp1; | 1086 MockMemoryDumpProvider mdp1; |
1089 RegisterDumpProvider(&mdp1, nullptr); | 1087 RegisterDumpProvider(&mdp1, nullptr); |
1090 MockMemoryDumpProvider mdp2; | 1088 MockMemoryDumpProvider mdp2; |
1091 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); | 1089 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); |
1092 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1090 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1093 | 1091 |
1094 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)) | 1092 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
1095 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, | 1093 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, |
1096 const GlobalMemoryDumpCallback& callback) { | 1094 const GlobalMemoryDumpCallback& callback) { |
1097 DisableTracing(); | 1095 DisableTracing(); |
1098 ProcessMemoryDumpCallback process_callback = | 1096 ProcessMemoryDumpCallback process_callback = |
1099 Bind(&ProcessDumpCallbackAdapter, callback); | 1097 Bind(&ProcessDumpCallbackAdapter, callback); |
1100 delegate_->CreateProcessDump(args, process_callback); | 1098 mdm_->CreateProcessDump(args, process_callback); |
1101 })); | 1099 })); |
1102 | 1100 |
1103 // If tracing is disabled for current session CreateProcessDump() should NOT | 1101 // If tracing is disabled for current session CreateProcessDump() should NOT |
1104 // request dumps from providers. Real-world regression: crbug.com/600570 . | 1102 // request dumps from providers. Real-world regression: crbug.com/600570 . |
1105 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 1103 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
1106 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 1104 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
1107 | 1105 |
1108 last_callback_success_ = true; | 1106 last_callback_success_ = true; |
1109 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1107 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1110 MemoryDumpLevelOfDetail::DETAILED); | 1108 MemoryDumpLevelOfDetail::DETAILED); |
(...skipping 14 matching lines...) Expand all Loading... |
1125 MockMemoryDumpProvider mdp2; | 1123 MockMemoryDumpProvider mdp2; |
1126 options.target_pid = 123; | 1124 options.target_pid = 123; |
1127 RegisterDumpProvider(&mdp2, nullptr, options); | 1125 RegisterDumpProvider(&mdp2, nullptr, options); |
1128 | 1126 |
1129 // Another provider with out-of-process dumping. | 1127 // Another provider with out-of-process dumping. |
1130 MockMemoryDumpProvider mdp3; | 1128 MockMemoryDumpProvider mdp3; |
1131 options.target_pid = 456; | 1129 options.target_pid = 456; |
1132 RegisterDumpProvider(&mdp3, nullptr, options); | 1130 RegisterDumpProvider(&mdp3, nullptr, options); |
1133 | 1131 |
1134 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1132 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1135 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1133 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
1136 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1134 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
1137 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1135 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
1138 EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1136 EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
1139 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1137 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1140 MemoryDumpLevelOfDetail::DETAILED); | 1138 MemoryDumpLevelOfDetail::DETAILED); |
1141 DisableTracing(); | 1139 DisableTracing(); |
1142 | 1140 |
1143 // Flush the trace into JSON. | 1141 // Flush the trace into JSON. |
1144 trace_event::TraceResultBuffer buffer; | 1142 trace_event::TraceResultBuffer buffer; |
1145 TraceResultBuffer::SimpleOutput trace_output; | 1143 TraceResultBuffer::SimpleOutput trace_output; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 1217 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
1220 .Times(1) | 1218 .Times(1) |
1221 .WillOnce(Invoke(self_unregister_from_another_thread)); | 1219 .WillOnce(Invoke(self_unregister_from_another_thread)); |
1222 EXPECT_CALL(*mdp, Destructor()) | 1220 EXPECT_CALL(*mdp, Destructor()) |
1223 .Times(1) | 1221 .Times(1) |
1224 .WillOnce(Invoke([&thread_ref]() { | 1222 .WillOnce(Invoke([&thread_ref]() { |
1225 EXPECT_EQ(thread_ref, PlatformThread::CurrentRef()); | 1223 EXPECT_EQ(thread_ref, PlatformThread::CurrentRef()); |
1226 })); | 1224 })); |
1227 | 1225 |
1228 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1226 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1229 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 1227 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
1230 for (int i = 0; i < 2; ++i) { | 1228 for (int i = 0; i < 2; ++i) { |
1231 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1229 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1232 MemoryDumpLevelOfDetail::DETAILED); | 1230 MemoryDumpLevelOfDetail::DETAILED); |
1233 } | 1231 } |
1234 DisableTracing(); | 1232 DisableTracing(); |
1235 } | 1233 } |
1236 | 1234 |
1237 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { | 1235 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { |
1238 InitializeMemoryDumpManager(false /* is_coordinator */); | 1236 InitializeMemoryDumpManager(false /* is_coordinator */); |
1239 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); | 1237 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
1240 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); | 1238 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); |
1241 RegisterDumpProvider(mdp1.get(), nullptr); | 1239 RegisterDumpProvider(mdp1.get(), nullptr); |
1242 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); | 1240 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); |
1243 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, | 1241 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, |
1244 kWhitelistedMDPName); | 1242 kWhitelistedMDPName); |
1245 | 1243 |
1246 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); | 1244 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); |
1247 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); | 1245 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); |
1248 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1246 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
1249 | 1247 |
1250 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1248 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1251 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 1249 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
1252 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1250 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1253 MemoryDumpLevelOfDetail::BACKGROUND); | 1251 MemoryDumpLevelOfDetail::BACKGROUND); |
1254 DisableTracing(); | 1252 DisableTracing(); |
1255 } | 1253 } |
1256 | 1254 |
1257 TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { | 1255 TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { |
1258 InitializeMemoryDumpManager(true /* is_coordinator */); | 1256 InitializeMemoryDumpManager(true /* is_coordinator */); |
1259 | 1257 |
1260 RunLoop run_loop; | 1258 RunLoop run_loop; |
1261 auto test_task_runner = ThreadTaskRunnerHandle::Get(); | 1259 auto test_task_runner = ThreadTaskRunnerHandle::Get(); |
1262 auto quit_closure = run_loop.QuitClosure(); | 1260 auto quit_closure = run_loop.QuitClosure(); |
1263 | 1261 |
1264 testing::InSequence sequence; | 1262 testing::InSequence sequence; |
1265 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) | 1263 EXPECT_CALL(global_dump_handler_, |
| 1264 RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
1266 .Times(5); | 1265 .Times(5); |
1267 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) | 1266 EXPECT_CALL(global_dump_handler_, |
| 1267 RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
1268 .WillOnce(Invoke([test_task_runner, quit_closure]( | 1268 .WillOnce(Invoke([test_task_runner, quit_closure]( |
1269 const MemoryDumpRequestArgs& args, | 1269 const MemoryDumpRequestArgs& args, |
1270 const GlobalMemoryDumpCallback& callback) { | 1270 const GlobalMemoryDumpCallback& callback) { |
1271 test_task_runner->PostTask(FROM_HERE, quit_closure); | 1271 test_task_runner->PostTask(FROM_HERE, quit_closure); |
1272 })); | 1272 })); |
1273 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); | 1273 EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
| 1274 .Times(AnyNumber()); |
1274 | 1275 |
1275 EnableTracingWithTraceConfig( | 1276 EnableTracingWithTraceConfig( |
1276 TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger( | 1277 TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger( |
1277 1 /* period_ms */)); | 1278 1 /* period_ms */)); |
1278 | 1279 |
1279 // Only background mode dumps should be allowed with the trace config. | 1280 // Only background mode dumps should be allowed with the trace config. |
1280 last_callback_success_ = false; | 1281 last_callback_success_ = false; |
1281 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1282 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1282 MemoryDumpLevelOfDetail::LIGHT); | 1283 MemoryDumpLevelOfDetail::LIGHT); |
1283 EXPECT_FALSE(last_callback_success_); | 1284 EXPECT_FALSE(last_callback_success_); |
(...skipping 19 matching lines...) Expand all Loading... |
1303 thread.Start(); | 1304 thread.Start(); |
1304 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, | 1305 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, |
1305 "BlacklistTestDumpProvider"); | 1306 "BlacklistTestDumpProvider"); |
1306 // Unregistering on wrong thread should not crash. | 1307 // Unregistering on wrong thread should not crash. |
1307 mdm_->UnregisterDumpProvider(&mdp1); | 1308 mdm_->UnregisterDumpProvider(&mdp1); |
1308 thread.Stop(); | 1309 thread.Stop(); |
1309 } | 1310 } |
1310 | 1311 |
1311 } // namespace trace_event | 1312 } // namespace trace_event |
1312 } // namespace base | 1313 } // namespace base |
OLD | NEW |