summaryrefslogtreecommitdiffstats
path: root/chromium/base/trace_event/memory_dump_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/trace_event/memory_dump_manager_unittest.cc')
-rw-r--r--chromium/base/trace_event/memory_dump_manager_unittest.cc115
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