diff options
Diffstat (limited to 'chromium/base/trace_event/memory_dump_manager_unittest.cc')
-rw-r--r-- | chromium/base/trace_event/memory_dump_manager_unittest.cc | 115 |
1 files changed, 88 insertions, 27 deletions
diff --git a/chromium/base/trace_event/memory_dump_manager_unittest.cc b/chromium/base/trace_event/memory_dump_manager_unittest.cc index b33b677beb9..c7b413d46a5 100644 --- a/chromium/base/trace_event/memory_dump_manager_unittest.cc +++ b/chromium/base/trace_event/memory_dump_manager_unittest.cc @@ -54,6 +54,14 @@ MATCHER(IsLightDump, "") { return arg.level_of_detail == MemoryDumpLevelOfDetail::LIGHT; } +MATCHER(IsDeterministicDump, "") { + return arg.determinism == MemoryDumpDeterminism::FORCE_GC; +} + +MATCHER(IsNotDeterministicDump, "") { + return arg.determinism == MemoryDumpDeterminism::NONE; +} + namespace { const char* kMDPName = "TestDumpProvider"; @@ -193,12 +201,14 @@ class MemoryDumpManagerTest : public testing::Test { // memory dump is complete. Returns: // - return value: the |success| from the CreateProcessDump() callback. bool RequestProcessDumpAndWait(MemoryDumpType dump_type, - MemoryDumpLevelOfDetail level_of_detail) { + MemoryDumpLevelOfDetail level_of_detail, + MemoryDumpDeterminism determinism) { RunLoop run_loop; bool success = false; static uint64_t test_guid = 1; test_guid++; - MemoryDumpRequestArgs request_args{test_guid, dump_type, level_of_detail}; + MemoryDumpRequestArgs request_args{test_guid, dump_type, level_of_detail, + determinism}; // The signature of the callback delivered by MemoryDumpManager is: // void ProcessMemoryDumpCallback( @@ -276,7 +286,8 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3); for (int i = 0; i < 3; ++i) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); @@ -288,7 +299,8 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); for (int i = 0; i < 3; ++i) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); } @@ -302,7 +314,8 @@ TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { EnableForTracing(); EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); mdm_->UnregisterDumpProvider(&mdp); @@ -312,7 +325,34 @@ TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { EnableForTracing(); EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::LIGHT)); + MemoryDumpLevelOfDetail::LIGHT, + MemoryDumpDeterminism::NONE)); + DisableTracing(); + mdm_->UnregisterDumpProvider(&mdp); +} + +// Checks that requesting deterministic dumps actually propagates +// the deterministic option properly to OnMemoryDump() call on dump providers. +TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgsDeterministic) { + MockMemoryDumpProvider mdp; + + RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); + EnableForTracing(); + EXPECT_CALL(mdp, OnMemoryDump(IsDeterministicDump(), _)); + EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::FORCE_GC)); + DisableTracing(); + mdm_->UnregisterDumpProvider(&mdp); + + // Check that requesting dumps with deterministic option set to false + // actually propagates to OnMemoryDump() call on dump providers. + RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); + EnableForTracing(); + EXPECT_CALL(mdp, OnMemoryDump(IsNotDeterministicDump(), _)); + EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, + MemoryDumpLevelOfDetail::LIGHT, + MemoryDumpDeterminism::NONE)); DisableTracing(); mdm_->UnregisterDumpProvider(&mdp); } @@ -328,7 +368,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { EXPECT_CALL(mdp1, OnMemoryDump(_, _)); EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); // Invert: enable mdp2 and disable mdp1. @@ -338,7 +379,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); EXPECT_CALL(mdp2, OnMemoryDump(_, _)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); // Enable both mdp1 and mdp2. @@ -347,7 +389,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { EXPECT_CALL(mdp1, OnMemoryDump(_, _)); EXPECT_CALL(mdp2, OnMemoryDump(_, _)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); } @@ -368,7 +411,8 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { EXPECT_CALL(mdp, OnMemoryDump(_, _)); EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); } @@ -378,7 +422,8 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); } @@ -389,7 +434,8 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); } @@ -401,7 +447,8 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { EXPECT_CALL(mdp, OnMemoryDump(_, _)); EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); DisableTracing(); } } @@ -439,7 +486,8 @@ TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { while (!threads.empty()) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); // Unregister a MDP and destroy one thread at each iteration to check the // live unregistration logic. The unregistration needs to happen on the same @@ -485,13 +533,15 @@ TEST_F(MemoryDumpManagerTest, PostTaskForSequencedTaskRunner) { task_runner1->set_enabled(false); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); EXPECT_EQ(1u, task_runner2->no_of_post_tasks()); task_runner1->set_enabled(true); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); EXPECT_EQ(2u, task_runner1->no_of_post_tasks()); EXPECT_EQ(2u, task_runner2->no_of_post_tasks()); DisableTracing(); @@ -522,7 +572,8 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); for (int i = 0; i < kNumDumps; i++) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); @@ -553,7 +604,8 @@ TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { for (int i = 0; i < 4; i++) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); @@ -584,7 +636,8 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { for (int i = 0; i < 4; i++) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); @@ -632,7 +685,8 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); ASSERT_EQ(1, on_memory_dump_call_count); DisableTracing(); @@ -679,7 +733,8 @@ TEST_F(MemoryDumpManagerTest, TearDownThreadWhileDumping) { EnableForTracing(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); ASSERT_EQ(1, on_memory_dump_call_count); DisableTracing(); @@ -692,7 +747,8 @@ TEST_F(MemoryDumpManagerTest, TriggerDumpWithoutTracing) { RegisterDumpProvider(&mdp, nullptr); EXPECT_CALL(mdp, OnMemoryDump(_, _)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } TEST_F(MemoryDumpManagerTest, BackgroundWhitelisting) { @@ -707,7 +763,8 @@ TEST_F(MemoryDumpManagerTest, BackgroundWhitelisting) { EXPECT_CALL(backgroundMdp, OnMemoryDump(_, _)).Times(1); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY, - MemoryDumpLevelOfDetail::BACKGROUND)); + MemoryDumpLevelOfDetail::BACKGROUND, + MemoryDumpDeterminism::NONE)); DisableTracing(); } @@ -769,7 +826,8 @@ TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoonDuringDump) { EnableForTracing(); for (int i = 0; i < 2; ++i) { EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); } DisableTracing(); } @@ -822,11 +880,14 @@ TEST_F(MemoryDumpManagerTest, NoStackOverflowWithTooManyMDPs) { stopped_thread->Stop(); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::DETAILED)); + MemoryDumpLevelOfDetail::DETAILED, + MemoryDumpDeterminism::NONE)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, - MemoryDumpLevelOfDetail::BACKGROUND)); + MemoryDumpLevelOfDetail::BACKGROUND, + MemoryDumpDeterminism::NONE)); EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY, - MemoryDumpLevelOfDetail::BACKGROUND)); + MemoryDumpLevelOfDetail::BACKGROUND, + MemoryDumpDeterminism::NONE)); } } // namespace trace_event |