Index: base/trace_event/memory_dump_manager_unittest.cc |
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc |
index 2fcdff6b8f931e4c0d48026079878af24776c404..9835415f4e7ff0305c5c08d7a1a41e5aaab413c9 100644 |
--- a/base/trace_event/memory_dump_manager_unittest.cc |
+++ b/base/trace_event/memory_dump_manager_unittest.cc |
@@ -22,6 +22,10 @@ using testing::Return; |
namespace base { |
namespace trace_event { |
+namespace { |
+MemoryDumpArgs high_detail_args = {MemoryDumpArgs::LevelOfDetail::HIGH}; |
+MemoryDumpArgs low_detail_args = {MemoryDumpArgs::LevelOfDetail::LOW}; |
+} |
// Testing MemoryDumpManagerDelegate which short-circuits dump requests locally |
// instead of performing IPC dances. |
@@ -90,12 +94,19 @@ class MockDumpProvider : public MemoryDumpProvider { |
public: |
MockDumpProvider() |
: dump_provider_to_register_or_unregister(nullptr), |
- last_session_state_(nullptr) {} |
+ last_session_state_(nullptr), |
+ level_of_detail_(MemoryDumpArgs::LevelOfDetail::HIGH) {} |
// Ctor used by the RespectTaskRunnerAffinity test. |
explicit MockDumpProvider( |
const scoped_refptr<SingleThreadTaskRunner>& task_runner) |
- : last_session_state_(nullptr), task_runner_(task_runner) {} |
+ : last_session_state_(nullptr), |
+ task_runner_(task_runner), |
+ level_of_detail_(MemoryDumpArgs::LevelOfDetail::HIGH) {} |
+ |
+ // Ctor used by CheckMemoryDumpArgs test. |
+ explicit MockDumpProvider(const MemoryDumpArgs::LevelOfDetail level_of_detail) |
+ : last_session_state_(nullptr), level_of_detail_(level_of_detail) {} |
virtual ~MockDumpProvider() {} |
@@ -135,12 +146,20 @@ class MockDumpProvider : public MemoryDumpProvider { |
return true; |
} |
+ // OnMemoryDump() override for the CheckMemoryDumpArgs test. |
+ bool OnMemoryDump_CheckMemoryDumpArgs(const MemoryDumpArgs& args, |
+ ProcessMemoryDump* pmd) { |
+ EXPECT_EQ(level_of_detail_, args.level_of_detail); |
+ return true; |
+ } |
+ |
// Used by OnMemoryDump_(Un)RegisterExtraDumpProvider. |
MemoryDumpProvider* dump_provider_to_register_or_unregister; |
private: |
MemoryDumpSessionState* last_session_state_; |
scoped_refptr<SingleThreadTaskRunner> task_runner_; |
+ const MemoryDumpArgs::LevelOfDetail level_of_detail_; |
}; |
TEST_F(MemoryDumpManagerTest, SingleDumper) { |
@@ -150,7 +169,8 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { |
// Check that the dumper is not called if the memory category is not enabled. |
EnableTracing("foo-and-bar-but-not-memory"); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
// Now repeat enabling the memory category and check that the dumper is |
@@ -158,7 +178,8 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { |
EnableTracing(kTraceCategory); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
for (int i = 0; i < 3; ++i) |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
mdm_->UnregisterDumpProvider(&mdp); |
@@ -166,10 +187,45 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { |
// Finally check the unregister logic (no calls to the mdp after unregister). |
EnableTracing(kTraceCategory); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
TraceLog::GetInstance()->SetDisabled(); |
} |
+TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
+ // Check that requesting dumps with high level of detail actually propagates |
+ // to OnMemoryDump() call on dump providers. |
+ MockDumpProvider mdp_high_detail(MemoryDumpArgs::LevelOfDetail::HIGH); |
+ mdm_->RegisterDumpProvider(&mdp_high_detail); |
+ |
+ EnableTracing(kTraceCategory); |
+ EXPECT_CALL(mdp_high_detail, OnMemoryDump(_, _)) |
+ .Times(1) |
+ .WillRepeatedly( |
+ Invoke(&mdp_high_detail, |
+ &MockDumpProvider::OnMemoryDump_CheckMemoryDumpArgs)); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
+ DisableTracing(); |
+ mdm_->UnregisterDumpProvider(&mdp_high_detail); |
+ |
+ // Check that requesting dumps with low level of detail actually propagates to |
+ // OnMemoryDump() call on dump providers. |
+ MockDumpProvider mdp_low_detail(MemoryDumpArgs::LevelOfDetail::LOW); |
+ mdm_->RegisterDumpProvider(&mdp_low_detail); |
+ |
+ EnableTracing(kTraceCategory); |
+ EXPECT_CALL(mdp_low_detail, OnMemoryDump(_, _)) |
+ .Times(1) |
+ .WillRepeatedly( |
+ Invoke(&mdp_low_detail, |
+ &MockDumpProvider::OnMemoryDump_CheckMemoryDumpArgs)); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ low_detail_args); |
+ DisableTracing(); |
+ mdm_->UnregisterDumpProvider(&mdp_low_detail); |
+} |
+ |
TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
MockDumpProvider mdp1; |
MockDumpProvider mdp2; |
@@ -187,7 +243,8 @@ TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
Invoke(&mdp2, &MockDumpProvider::OnMemoryDump_CheckSessionState)); |
for (int i = 0; i < 2; ++i) |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
} |
@@ -201,7 +258,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
EnableTracing(kTraceCategory); |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
// Invert: enable mdp1 and disable mdp2. |
@@ -210,7 +268,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
EnableTracing(kTraceCategory); |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
// Enable both mdp1 and mdp2. |
@@ -218,7 +277,8 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
EnableTracing(kTraceCategory); |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
DisableTracing(); |
} |
@@ -256,7 +316,8 @@ TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { |
MemoryDumpCallback callback = |
Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, callback); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args, callback); |
// This nested message loop (|run_loop|) will be quit if and only if |
// the RequestGlobalDump callback is invoked. |
run_loop.Run(); |
@@ -303,7 +364,8 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
.WillRepeatedly(Return(true)); |
for (int i = 0; i < 1 + MemoryDumpManager::kMaxConsecutiveFailuresCount; |
i++) { |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
} |
DisableTracing(); |
@@ -333,7 +395,8 @@ TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
.WillRepeatedly(Return(true)); |
for (int i = 0; i < 4; i++) { |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
} |
DisableTracing(); |
@@ -363,7 +426,8 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
.WillRepeatedly(Return(true)); |
for (int i = 0; i < 4; i++) { |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args); |
} |
DisableTracing(); |
@@ -383,7 +447,8 @@ TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
MemoryDumpCallback callback = |
Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
- mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, callback); |
+ mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ high_detail_args, callback); |
run_loop.Run(); |
} |
EXPECT_FALSE(last_callback_success_); |