| 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 |