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 <vector> | 10 #include <vector> |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 MemoryDumpProvider* mdp, | 65 MemoryDumpProvider* mdp, |
66 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 66 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
67 const MemoryDumpProvider::Options& options, | 67 const MemoryDumpProvider::Options& options, |
68 const char* name = kMDPName) { | 68 const char* name = kMDPName) { |
69 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); | 69 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); |
70 mdm->set_dumper_registrations_ignored_for_testing(false); | 70 mdm->set_dumper_registrations_ignored_for_testing(false); |
71 mdm->RegisterDumpProvider(mdp, name, std::move(task_runner), options); | 71 mdm->RegisterDumpProvider(mdp, name, std::move(task_runner), options); |
72 mdm->set_dumper_registrations_ignored_for_testing(true); | 72 mdm->set_dumper_registrations_ignored_for_testing(true); |
73 } | 73 } |
74 | 74 |
75 void RegisterDumpProvider(MemoryDumpProvider* mdp) { | 75 void RegisterDumpProvider( |
76 RegisterDumpProvider(mdp, nullptr, MemoryDumpProvider::Options()); | 76 MemoryDumpProvider* mdp, |
| 77 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
| 78 RegisterDumpProvider(mdp, task_runner, MemoryDumpProvider::Options()); |
77 } | 79 } |
78 | 80 |
79 void RegisterDumpProviderWithSequencedTaskRunner( | 81 void RegisterDumpProviderWithSequencedTaskRunner( |
80 MemoryDumpProvider* mdp, | 82 MemoryDumpProvider* mdp, |
81 scoped_refptr<base::SequencedTaskRunner> task_runner, | 83 scoped_refptr<base::SequencedTaskRunner> task_runner, |
82 const MemoryDumpProvider::Options& options) { | 84 const MemoryDumpProvider::Options& options) { |
83 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); | 85 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); |
84 mdm->set_dumper_registrations_ignored_for_testing(false); | 86 mdm->set_dumper_registrations_ignored_for_testing(false); |
85 mdm->RegisterDumpProviderWithSequencedTaskRunner(mdp, kMDPName, task_runner, | 87 mdm->RegisterDumpProviderWithSequencedTaskRunner(mdp, kMDPName, task_runner, |
86 options); | 88 options); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 294 |
293 // We want our singleton torn down after each test. | 295 // We want our singleton torn down after each test. |
294 ShadowingAtExitManager at_exit_manager_; | 296 ShadowingAtExitManager at_exit_manager_; |
295 }; | 297 }; |
296 | 298 |
297 // Basic sanity checks. Registers a memory dump provider and checks that it is | 299 // Basic sanity checks. Registers a memory dump provider and checks that it is |
298 // called, but only when memory-infra is enabled. | 300 // called, but only when memory-infra is enabled. |
299 TEST_F(MemoryDumpManagerTest, SingleDumper) { | 301 TEST_F(MemoryDumpManagerTest, SingleDumper) { |
300 InitializeMemoryDumpManager(false /* is_coordinator */); | 302 InitializeMemoryDumpManager(false /* is_coordinator */); |
301 MockMemoryDumpProvider mdp; | 303 MockMemoryDumpProvider mdp; |
302 RegisterDumpProvider(&mdp); | 304 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
303 | 305 |
304 // Check that the dumper is not called if the memory category is not enabled. | 306 // Check that the dumper is not called if the memory category is not enabled. |
305 EnableTracingWithLegacyCategories("foobar-but-not-memory"); | 307 EnableTracingWithLegacyCategories("foobar-but-not-memory"); |
306 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 308 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
307 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 309 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
308 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 310 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
309 MemoryDumpLevelOfDetail::DETAILED); | 311 MemoryDumpLevelOfDetail::DETAILED); |
310 DisableTracing(); | 312 DisableTracing(); |
311 | 313 |
312 // Now repeat enabling the memory category and check that the dumper is | 314 // Now repeat enabling the memory category and check that the dumper is |
(...skipping 20 matching lines...) Expand all Loading... |
333 } | 335 } |
334 DisableTracing(); | 336 DisableTracing(); |
335 } | 337 } |
336 | 338 |
337 // Checks that requesting dumps with high level of detail actually propagates | 339 // Checks that requesting dumps with high level of detail actually propagates |
338 // the level of the detail properly to OnMemoryDump() call on dump providers. | 340 // the level of the detail properly to OnMemoryDump() call on dump providers. |
339 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { | 341 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
340 InitializeMemoryDumpManager(false /* is_coordinator */); | 342 InitializeMemoryDumpManager(false /* is_coordinator */); |
341 MockMemoryDumpProvider mdp; | 343 MockMemoryDumpProvider mdp; |
342 | 344 |
343 RegisterDumpProvider(&mdp); | 345 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
344 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 346 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
345 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 347 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
346 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); | 348 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
347 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 349 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
348 MemoryDumpLevelOfDetail::DETAILED); | 350 MemoryDumpLevelOfDetail::DETAILED); |
349 DisableTracing(); | 351 DisableTracing(); |
350 mdm_->UnregisterDumpProvider(&mdp); | 352 mdm_->UnregisterDumpProvider(&mdp); |
351 | 353 |
352 // Check that requesting dumps with low level of detail actually propagates to | 354 // Check that requesting dumps with low level of detail actually propagates to |
353 // OnMemoryDump() call on dump providers. | 355 // OnMemoryDump() call on dump providers. |
354 RegisterDumpProvider(&mdp); | 356 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
355 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 357 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
356 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 358 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
357 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); | 359 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
358 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 360 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
359 MemoryDumpLevelOfDetail::LIGHT); | 361 MemoryDumpLevelOfDetail::LIGHT); |
360 DisableTracing(); | 362 DisableTracing(); |
361 mdm_->UnregisterDumpProvider(&mdp); | 363 mdm_->UnregisterDumpProvider(&mdp); |
362 } | 364 } |
363 | 365 |
364 // Checks that the SharedSessionState object is acqually shared over time. | 366 // Checks that the SharedSessionState object is acqually shared over time. |
365 TEST_F(MemoryDumpManagerTest, SharedSessionState) { | 367 TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
366 InitializeMemoryDumpManager(false /* is_coordinator */); | 368 InitializeMemoryDumpManager(false /* is_coordinator */); |
367 MockMemoryDumpProvider mdp1; | 369 MockMemoryDumpProvider mdp1; |
368 MockMemoryDumpProvider mdp2; | 370 MockMemoryDumpProvider mdp2; |
369 RegisterDumpProvider(&mdp1); | 371 RegisterDumpProvider(&mdp1, nullptr); |
370 RegisterDumpProvider(&mdp2); | 372 RegisterDumpProvider(&mdp2, nullptr); |
371 | 373 |
372 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 374 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
373 const MemoryDumpSessionState* session_state = | 375 const MemoryDumpSessionState* session_state = |
374 mdm_->session_state_for_testing().get(); | 376 mdm_->session_state_for_testing().get(); |
375 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 377 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); |
376 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 378 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
377 .Times(2) | 379 .Times(2) |
378 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 380 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
379 ProcessMemoryDump* pmd) -> bool { | 381 ProcessMemoryDump* pmd) -> bool { |
380 EXPECT_EQ(session_state, pmd->session_state().get()); | 382 EXPECT_EQ(session_state, pmd->session_state().get()); |
(...skipping 15 matching lines...) Expand all Loading... |
396 DisableTracing(); | 398 DisableTracing(); |
397 } | 399 } |
398 | 400 |
399 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. | 401 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
400 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { | 402 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
401 InitializeMemoryDumpManager(false /* is_coordinator */); | 403 InitializeMemoryDumpManager(false /* is_coordinator */); |
402 MockMemoryDumpProvider mdp1; | 404 MockMemoryDumpProvider mdp1; |
403 MockMemoryDumpProvider mdp2; | 405 MockMemoryDumpProvider mdp2; |
404 | 406 |
405 // Enable only mdp1. | 407 // Enable only mdp1. |
406 RegisterDumpProvider(&mdp1); | 408 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); |
407 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 409 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
408 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 410 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
409 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 411 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
410 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 412 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
411 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 413 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
412 MemoryDumpLevelOfDetail::DETAILED); | 414 MemoryDumpLevelOfDetail::DETAILED); |
413 DisableTracing(); | 415 DisableTracing(); |
414 | 416 |
415 // Invert: enable mdp1 and disable mdp2. | 417 // Invert: enable mdp1 and disable mdp2. |
416 mdm_->UnregisterDumpProvider(&mdp1); | 418 mdm_->UnregisterDumpProvider(&mdp1); |
417 RegisterDumpProvider(&mdp2); | 419 RegisterDumpProvider(&mdp2, nullptr); |
418 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 420 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
419 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 421 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
420 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 422 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
421 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 423 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
422 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 424 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
423 MemoryDumpLevelOfDetail::DETAILED); | 425 MemoryDumpLevelOfDetail::DETAILED); |
424 DisableTracing(); | 426 DisableTracing(); |
425 | 427 |
426 // Enable both mdp1 and mdp2. | 428 // Enable both mdp1 and mdp2. |
427 RegisterDumpProvider(&mdp1); | 429 RegisterDumpProvider(&mdp1, nullptr); |
428 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 430 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
429 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 431 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
430 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 432 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
431 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 433 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
432 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 434 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
433 MemoryDumpLevelOfDetail::DETAILED); | 435 MemoryDumpLevelOfDetail::DETAILED); |
434 DisableTracing(); | 436 DisableTracing(); |
435 } | 437 } |
436 | 438 |
437 // Checks that the dump provider invocations depend only on the current | 439 // Checks that the dump provider invocations depend only on the current |
438 // registration state and not on previous registrations and dumps. | 440 // registration state and not on previous registrations and dumps. |
439 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { | 441 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { |
440 InitializeMemoryDumpManager(false /* is_coordinator */); | 442 InitializeMemoryDumpManager(false /* is_coordinator */); |
441 MockMemoryDumpProvider mdp; | 443 MockMemoryDumpProvider mdp; |
442 | 444 |
443 RegisterDumpProvider(&mdp); | 445 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
444 | 446 |
445 { | 447 { |
446 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 448 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
447 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 449 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
448 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 450 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
449 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 451 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
450 MemoryDumpLevelOfDetail::DETAILED); | 452 MemoryDumpLevelOfDetail::DETAILED); |
451 DisableTracing(); | 453 DisableTracing(); |
452 } | 454 } |
453 | 455 |
454 mdm_->UnregisterDumpProvider(&mdp); | 456 mdm_->UnregisterDumpProvider(&mdp); |
455 | 457 |
456 { | 458 { |
457 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 459 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
458 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 460 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
459 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 461 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
460 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 462 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
461 MemoryDumpLevelOfDetail::DETAILED); | 463 MemoryDumpLevelOfDetail::DETAILED); |
462 DisableTracing(); | 464 DisableTracing(); |
463 } | 465 } |
464 | 466 |
465 RegisterDumpProvider(&mdp); | 467 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
466 mdm_->UnregisterDumpProvider(&mdp); | 468 mdm_->UnregisterDumpProvider(&mdp); |
467 | 469 |
468 { | 470 { |
469 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 471 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
470 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 472 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
471 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 473 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
472 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 474 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
473 MemoryDumpLevelOfDetail::DETAILED); | 475 MemoryDumpLevelOfDetail::DETAILED); |
474 DisableTracing(); | 476 DisableTracing(); |
475 } | 477 } |
476 | 478 |
477 RegisterDumpProvider(&mdp); | 479 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
478 mdm_->UnregisterDumpProvider(&mdp); | 480 mdm_->UnregisterDumpProvider(&mdp); |
479 RegisterDumpProvider(&mdp); | 481 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
480 | 482 |
481 { | 483 { |
482 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 484 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
483 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 485 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
484 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 486 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
485 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 487 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
486 MemoryDumpLevelOfDetail::DETAILED); | 488 MemoryDumpLevelOfDetail::DETAILED); |
487 DisableTracing(); | 489 DisableTracing(); |
488 } | 490 } |
489 } | 491 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 DisableTracing(); | 593 DisableTracing(); |
592 } | 594 } |
593 | 595 |
594 // Checks that providers get disabled after 3 consecutive failures, but not | 596 // Checks that providers get disabled after 3 consecutive failures, but not |
595 // otherwise (e.g., if interleaved). | 597 // otherwise (e.g., if interleaved). |
596 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { | 598 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
597 InitializeMemoryDumpManager(false /* is_coordinator */); | 599 InitializeMemoryDumpManager(false /* is_coordinator */); |
598 MockMemoryDumpProvider mdp1; | 600 MockMemoryDumpProvider mdp1; |
599 MockMemoryDumpProvider mdp2; | 601 MockMemoryDumpProvider mdp2; |
600 | 602 |
601 RegisterDumpProvider(&mdp1); | 603 RegisterDumpProvider(&mdp1, nullptr); |
602 RegisterDumpProvider(&mdp2); | 604 RegisterDumpProvider(&mdp2, nullptr); |
603 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 605 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
604 | 606 |
605 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); | 607 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
606 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); | 608 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); |
607 | 609 |
608 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 610 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
609 .Times(GetMaxConsecutiveFailuresCount()) | 611 .Times(GetMaxConsecutiveFailuresCount()) |
610 .WillRepeatedly(Return(false)); | 612 .WillRepeatedly(Return(false)); |
611 | 613 |
612 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 614 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
(...skipping 12 matching lines...) Expand all Loading... |
625 DisableTracing(); | 627 DisableTracing(); |
626 } | 628 } |
627 | 629 |
628 // Sneakily registers an extra memory dump provider while an existing one is | 630 // Sneakily registers an extra memory dump provider while an existing one is |
629 // dumping and expect it to take part in the already active tracing session. | 631 // dumping and expect it to take part in the already active tracing session. |
630 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { | 632 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
631 InitializeMemoryDumpManager(false /* is_coordinator */); | 633 InitializeMemoryDumpManager(false /* is_coordinator */); |
632 MockMemoryDumpProvider mdp1; | 634 MockMemoryDumpProvider mdp1; |
633 MockMemoryDumpProvider mdp2; | 635 MockMemoryDumpProvider mdp2; |
634 | 636 |
635 RegisterDumpProvider(&mdp1); | 637 RegisterDumpProvider(&mdp1, nullptr); |
636 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 638 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
637 | 639 |
638 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 640 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); |
639 | 641 |
640 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 642 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
641 .Times(4) | 643 .Times(4) |
642 .WillOnce(Return(true)) | 644 .WillOnce(Return(true)) |
643 .WillOnce( | 645 .WillOnce( |
644 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 646 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
645 RegisterDumpProvider(&mdp2); | 647 RegisterDumpProvider(&mdp2, nullptr); |
646 return true; | 648 return true; |
647 })) | 649 })) |
648 .WillRepeatedly(Return(true)); | 650 .WillRepeatedly(Return(true)); |
649 | 651 |
650 // Depending on the insertion order (before or after mdp1), mdp2 might be | 652 // Depending on the insertion order (before or after mdp1), mdp2 might be |
651 // called also immediately after it gets registered. | 653 // called also immediately after it gets registered. |
652 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 654 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
653 .Times(Between(2, 3)) | 655 .Times(Between(2, 3)) |
654 .WillRepeatedly(Return(true)); | 656 .WillRepeatedly(Return(true)); |
655 | 657 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 ASSERT_TRUE(last_callback_success_); | 860 ASSERT_TRUE(last_callback_success_); |
859 | 861 |
860 DisableTracing(); | 862 DisableTracing(); |
861 } | 863 } |
862 | 864 |
863 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when | 865 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
864 // tracing is not enabled. | 866 // tracing is not enabled. |
865 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { | 867 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
866 InitializeMemoryDumpManager(false /* is_coordinator */); | 868 InitializeMemoryDumpManager(false /* is_coordinator */); |
867 MockMemoryDumpProvider mdp1; | 869 MockMemoryDumpProvider mdp1; |
868 RegisterDumpProvider(&mdp1); | 870 RegisterDumpProvider(&mdp1, nullptr); |
869 | 871 |
870 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 872 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
871 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 873 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
872 | 874 |
873 last_callback_success_ = true; | 875 last_callback_success_ = true; |
874 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 876 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
875 MemoryDumpLevelOfDetail::DETAILED); | 877 MemoryDumpLevelOfDetail::DETAILED); |
876 EXPECT_FALSE(last_callback_success_); | 878 EXPECT_FALSE(last_callback_success_); |
877 } | 879 } |
878 | 880 |
879 // Checks that is the MemoryDumpManager is initialized after tracing already | 881 // Checks that is the MemoryDumpManager is initialized after tracing already |
880 // began, it will still late-join the party (real use case: startup tracing). | 882 // began, it will still late-join the party (real use case: startup tracing). |
881 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { | 883 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
882 MockMemoryDumpProvider mdp; | 884 MockMemoryDumpProvider mdp; |
883 RegisterDumpProvider(&mdp); | 885 RegisterDumpProvider(&mdp, nullptr); |
884 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 886 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
885 | 887 |
886 // First check that a RequestGlobalDump() issued before the MemoryDumpManager | 888 // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
887 // initialization gets NACK-ed cleanly. | 889 // initialization gets NACK-ed cleanly. |
888 { | 890 { |
889 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 891 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
890 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 892 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
891 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 893 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
892 MemoryDumpLevelOfDetail::DETAILED); | 894 MemoryDumpLevelOfDetail::DETAILED); |
893 EXPECT_FALSE(last_callback_success_); | 895 EXPECT_FALSE(last_callback_success_); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 base::WaitableEvent tracing_disabled_event( | 1058 base::WaitableEvent tracing_disabled_event( |
1057 WaitableEvent::ResetPolicy::AUTOMATIC, | 1059 WaitableEvent::ResetPolicy::AUTOMATIC, |
1058 WaitableEvent::InitialState::NOT_SIGNALED); | 1060 WaitableEvent::InitialState::NOT_SIGNALED); |
1059 InitializeMemoryDumpManager(false /* is_coordinator */); | 1061 InitializeMemoryDumpManager(false /* is_coordinator */); |
1060 | 1062 |
1061 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); | 1063 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); |
1062 mdp_thread->Start(); | 1064 mdp_thread->Start(); |
1063 | 1065 |
1064 // Create both same-thread MDP and another MDP with dedicated thread | 1066 // Create both same-thread MDP and another MDP with dedicated thread |
1065 MockMemoryDumpProvider mdp1; | 1067 MockMemoryDumpProvider mdp1; |
1066 RegisterDumpProvider(&mdp1); | 1068 RegisterDumpProvider(&mdp1, nullptr); |
1067 MockMemoryDumpProvider mdp2; | 1069 MockMemoryDumpProvider mdp2; |
1068 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); | 1070 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); |
1069 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1071 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1070 | 1072 |
1071 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)) | 1073 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)) |
1072 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, | 1074 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, |
1073 const MemoryDumpCallback& callback) { | 1075 const MemoryDumpCallback& callback) { |
1074 DisableTracing(); | 1076 DisableTracing(); |
1075 delegate_->CreateProcessDump(args, callback); | 1077 delegate_->CreateProcessDump(args, callback); |
1076 })); | 1078 })); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1208 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
1207 MemoryDumpLevelOfDetail::DETAILED); | 1209 MemoryDumpLevelOfDetail::DETAILED); |
1208 } | 1210 } |
1209 DisableTracing(); | 1211 DisableTracing(); |
1210 } | 1212 } |
1211 | 1213 |
1212 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { | 1214 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { |
1213 InitializeMemoryDumpManager(false /* is_coordinator */); | 1215 InitializeMemoryDumpManager(false /* is_coordinator */); |
1214 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); | 1216 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
1215 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); | 1217 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); |
1216 RegisterDumpProvider(mdp1.get()); | 1218 RegisterDumpProvider(mdp1.get(), nullptr); |
1217 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); | 1219 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); |
1218 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, | 1220 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, |
1219 kWhitelistedMDPName); | 1221 kWhitelistedMDPName); |
1220 | 1222 |
1221 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); | 1223 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); |
1222 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); | 1224 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); |
1223 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1225 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
1224 | 1226 |
1225 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1227 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
1226 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 1228 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 MemoryDumpLevelOfDetail::DETAILED); | 1261 MemoryDumpLevelOfDetail::DETAILED); |
1260 EXPECT_FALSE(last_callback_success_); | 1262 EXPECT_FALSE(last_callback_success_); |
1261 | 1263 |
1262 ASSERT_TRUE(IsPeriodicDumpingEnabled()); | 1264 ASSERT_TRUE(IsPeriodicDumpingEnabled()); |
1263 run_loop.Run(); | 1265 run_loop.Run(); |
1264 DisableTracing(); | 1266 DisableTracing(); |
1265 } | 1267 } |
1266 | 1268 |
1267 } // namespace trace_event | 1269 } // namespace trace_event |
1268 } // namespace base | 1270 } // namespace base |
OLD | NEW |