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 fe1b2fe5ac8a1e9fd3102af8b4488a6cdce4d859..87351395d39c22f892b0817981dd5189ad682e0d 100644 |
--- a/base/trace_event/memory_dump_manager_unittest.cc |
+++ b/base/trace_event/memory_dump_manager_unittest.cc |
@@ -27,7 +27,9 @@ |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/threading/thread.h" |
#include "base/threading/thread_task_runner_handle.h" |
+#include "base/trace_event/memory_dump_manager_test_utils.h" |
#include "base/trace_event/memory_dump_provider.h" |
+#include "base/trace_event/memory_dump_request_args.h" |
#include "base/trace_event/memory_dump_scheduler.h" |
#include "base/trace_event/memory_infra_background_whitelist.h" |
#include "base/trace_event/process_memory_dump.h" |
@@ -99,15 +101,6 @@ void RegisterDumpProviderWithSequencedTaskRunner( |
mdm->set_dumper_registrations_ignored_for_testing(true); |
} |
-void OnTraceDataCollected(Closure quit_closure, |
- trace_event::TraceResultBuffer* buffer, |
- const scoped_refptr<RefCountedString>& json, |
- bool has_more_events) { |
- buffer->AddFragment(json->data()); |
- if (!has_more_events) |
- quit_closure.Run(); |
-} |
- |
// Posts |task| to |task_runner| and blocks until it is executed. |
void PostTaskAndWait(const tracked_objects::Location& from_here, |
SequencedTaskRunner* task_runner, |
@@ -122,37 +115,6 @@ void PostTaskAndWait(const tracked_objects::Location& from_here, |
event.Wait(); |
} |
-// Adapts a ProcessMemoryDumpCallback into a GlobalMemoryDumpCallback |
-// and keeps around the process-local result. |
-void ProcessDumpCallbackAdapter( |
- GlobalMemoryDumpCallback callback, |
- uint64_t dump_guid, |
- bool success, |
- const base::Optional<base::trace_event::MemoryDumpCallbackResult>&) { |
- callback.Run(dump_guid, success); |
-} |
- |
-// This mocks the RequestGlobalDumpFunction which is typically handled by |
-// process_local_dump_manager_impl.cc, by short-circuiting dump requests locally |
-// to the MemoryDumpManager without an actual service. |
-class GlobalMemoryDumpHandler { |
- public: |
- MOCK_METHOD2(RequestGlobalMemoryDump, |
- void(const MemoryDumpRequestArgs& args, |
- const GlobalMemoryDumpCallback& callback)); |
- |
- GlobalMemoryDumpHandler() { |
- ON_CALL(*this, RequestGlobalMemoryDump(_, _)) |
- .WillByDefault(Invoke([this](const MemoryDumpRequestArgs& args, |
- const GlobalMemoryDumpCallback& callback) { |
- ProcessMemoryDumpCallback process_callback = |
- Bind(&ProcessDumpCallbackAdapter, callback); |
- MemoryDumpManager::GetInstance()->CreateProcessDump(args, |
- process_callback); |
- })); |
- } |
-}; |
- |
class MockMemoryDumpProvider : public MemoryDumpProvider { |
public: |
MOCK_METHOD0(Destructor, void()); |
@@ -228,8 +190,16 @@ std::unique_ptr<trace_analyzer::TraceAnalyzer> GetDeserializedTrace() { |
buffer.SetOutputCallback(trace_output.GetCallback()); |
RunLoop run_loop; |
buffer.Start(); |
- trace_event::TraceLog::GetInstance()->Flush( |
- Bind(&OnTraceDataCollected, run_loop.QuitClosure(), Unretained(&buffer))); |
+ auto on_trace_data_collected = |
+ [](Closure quit_closure, trace_event::TraceResultBuffer* buffer, |
+ const scoped_refptr<RefCountedString>& json, bool has_more_events) { |
+ buffer->AddFragment(json->data()); |
+ if (!has_more_events) |
+ quit_closure.Run(); |
+ }; |
+ |
+ trace_event::TraceLog::GetInstance()->Flush(Bind( |
+ on_trace_data_collected, run_loop.QuitClosure(), Unretained(&buffer))); |
run_loop.Run(); |
buffer.Finish(); |
@@ -245,11 +215,9 @@ class MemoryDumpManagerTest : public testing::Test { |
MemoryDumpManagerTest() : testing::Test(), kDefaultOptions() {} |
void SetUp() override { |
- last_callback_success_ = false; |
message_loop_.reset(new MessageLoop()); |
mdm_ = MemoryDumpManager::CreateInstanceForTesting(); |
ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); |
- results_.clear(); |
} |
void TearDown() override { |
@@ -258,35 +226,46 @@ class MemoryDumpManagerTest : public testing::Test { |
TraceLog::DeleteForTesting(); |
} |
- // Turns a Closure into a GlobalMemoryDumpCallback, keeping track of the |
- // callback result and taking care of posting the closure on the correct task |
- // runner. |
- void GlobalDumpCallbackAdapter( |
- scoped_refptr<SingleThreadTaskRunner> task_runner, |
- Closure closure, |
- uint64_t dump_guid, |
- bool success) { |
- last_callback_success_ = success; |
- task_runner->PostTask(FROM_HERE, closure); |
- } |
- |
protected: |
- void InitializeMemoryDumpManager(bool is_coordinator) { |
- mdm_->set_dumper_registrations_ignored_for_testing(true); |
- mdm_->Initialize( |
- BindRepeating(&GlobalMemoryDumpHandler::RequestGlobalMemoryDump, |
- Unretained(&global_dump_handler_)), |
- is_coordinator); |
- } |
- |
- void RequestGlobalDumpAndWait(MemoryDumpType dump_type, |
- MemoryDumpLevelOfDetail level_of_detail) { |
+ // Blocks the current thread (spinning a nested message loop) until the |
+ // memory dump is complete. Returns: |
+ // - return value: the |success| from the CreateProcessDump() callback. |
+ // - (optional) |result|: the summarized metrics for TestSummaryComputation. |
+ bool RequestProcessDumpAndWait( |
+ MemoryDumpType dump_type, |
+ MemoryDumpLevelOfDetail level_of_detail, |
+ Optional<MemoryDumpCallbackResult>* result = nullptr) { |
RunLoop run_loop; |
- GlobalMemoryDumpCallback callback = Bind( |
- &MemoryDumpManagerTest::GlobalDumpCallbackAdapter, Unretained(this), |
- ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); |
- mdm_->RequestGlobalDump(dump_type, level_of_detail, callback); |
+ bool success = false; |
+ static uint64_t test_guid = 1; |
+ test_guid++; |
+ MemoryDumpRequestArgs request_args{test_guid, dump_type, level_of_detail}; |
+ |
+ // The signature of the callback delivered by MemoryDumpManager is: |
+ // void ProcessMemoryDumpCallback(uint64_t dump_guid, |
+ // bool success, |
+ // const Optional<MemoryDumpCallbackResult>&) |
+ // The extra arguments prepended to the |callback| below (the ones with the |
+ // "curried_" prefix) are just passed from the Bind(). This is just to get |
+ // around the limitation of Bind() in supporting only capture-less lambdas. |
+ ProcessMemoryDumpCallback callback = Bind( |
+ [](bool* curried_success, Closure curried_quit_closure, |
+ uint64_t curried_expected_guid, |
+ Optional<MemoryDumpCallbackResult>* curried_result, |
+ uint64_t dump_guid, bool success, |
+ const Optional<MemoryDumpCallbackResult>& callback_result) { |
+ *curried_success = success; |
+ EXPECT_EQ(curried_expected_guid, dump_guid); |
+ if (curried_result) |
+ *curried_result = callback_result; |
+ ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
+ curried_quit_closure); |
+ }, |
+ Unretained(&success), run_loop.QuitClosure(), test_guid, result); |
+ |
+ mdm_->CreateProcessDump(request_args, callback); |
run_loop.Run(); |
+ return success; |
} |
void EnableTracingWithLegacyCategories(const char* category) { |
@@ -309,51 +288,30 @@ class MemoryDumpManagerTest : public testing::Test { |
return MemoryDumpManager::kMaxConsecutiveFailuresCount; |
} |
- const std::vector<MemoryDumpCallbackResult>* GetResults() const { |
- return &results_; |
- } |
- |
const MemoryDumpProvider::Options kDefaultOptions; |
std::unique_ptr<MemoryDumpManager> mdm_; |
- GlobalMemoryDumpHandler global_dump_handler_; |
- bool last_callback_success_; |
- |
- // Adapts a ProcessMemoryDumpCallback into a GlobalMemoryDumpCallback by |
- // trimming off the result argument and calling the global callback. |
- void ProcessDumpRecordingCallbackAdapter( |
- GlobalMemoryDumpCallback callback, |
- uint64_t dump_guid, |
- bool success, |
- const base::Optional<MemoryDumpCallbackResult>& result) { |
- if (result.has_value()) { |
- results_.push_back(result.value()); |
- } |
- callback.Run(dump_guid, success); |
- } |
private: |
std::unique_ptr<MessageLoop> message_loop_; |
- std::vector<MemoryDumpCallbackResult> results_; |
- // We want our singleton torn down after each test. |
+ // To tear down the singleton instance after each test. |
ShadowingAtExitManager at_exit_manager_; |
}; |
// Basic sanity checks. Registers a memory dump provider and checks that it is |
// called. |
TEST_F(MemoryDumpManagerTest, SingleDumper) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
// Now repeat enabling the memory category and check that the dumper is |
// invoked this time. |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3); |
for (int i = 0; i < 3; ++i) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
@@ -362,12 +320,10 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { |
// Finally check the unregister logic: the global dump handler will be invoked |
// but not the dump provider, as it has been unregistered. |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
- |
for (int i = 0; i < 3; ++i) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
} |
@@ -375,15 +331,14 @@ TEST_F(MemoryDumpManagerTest, SingleDumper) { |
// Checks that requesting dumps with high level of detail actually propagates |
// the level of the detail properly to OnMemoryDump() call on dump providers. |
TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
mdm_->UnregisterDumpProvider(&mdp); |
@@ -391,10 +346,9 @@ TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
// OnMemoryDump() call on dump providers. |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::LIGHT); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::LIGHT)); |
DisableTracing(); |
mdm_->UnregisterDumpProvider(&mdp); |
} |
@@ -402,7 +356,7 @@ TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
// Checks that the HeapProfilerSerializationState object is actually |
// shared over time. |
TEST_F(MemoryDumpManagerTest, HeapProfilerSerializationState) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp1; |
MockMemoryDumpProvider mdp2; |
RegisterDumpProvider(&mdp1, nullptr); |
@@ -411,7 +365,6 @@ TEST_F(MemoryDumpManagerTest, HeapProfilerSerializationState) { |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
const HeapProfilerSerializationState* heap_profiler_serialization_state = |
mdm_->heap_profiler_serialization_state_for_testing().get(); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
.Times(2) |
.WillRepeatedly( |
@@ -432,8 +385,8 @@ TEST_F(MemoryDumpManagerTest, HeapProfilerSerializationState) { |
})); |
for (int i = 0; i < 2; ++i) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
@@ -441,39 +394,36 @@ TEST_F(MemoryDumpManagerTest, HeapProfilerSerializationState) { |
// Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp1; |
MockMemoryDumpProvider mdp2; |
// Enable only mdp1. |
RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
+ EXPECT_CALL(mdp1, OnMemoryDump(_, _)); |
EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
- // Invert: enable mdp1 and disable mdp2. |
+ // Invert: enable mdp2 and disable mdp1. |
mdm_->UnregisterDumpProvider(&mdp1); |
RegisterDumpProvider(&mdp2, nullptr); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
- EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_CALL(mdp2, OnMemoryDump(_, _)); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
// Enable both mdp1 and mdp2. |
RegisterDumpProvider(&mdp1, nullptr); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
- EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_CALL(mdp1, OnMemoryDump(_, _)); |
+ EXPECT_CALL(mdp2, OnMemoryDump(_, _)); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
} |
@@ -486,28 +436,26 @@ TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
#define MAYBE_RegistrationConsistency RegistrationConsistency |
#endif |
TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
{ |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
} |
mdm_->UnregisterDumpProvider(&mdp); |
{ |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
} |
@@ -515,11 +463,10 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { |
mdm_->UnregisterDumpProvider(&mdp); |
{ |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
} |
@@ -528,11 +475,10 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
{ |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
} |
} |
@@ -542,7 +488,7 @@ TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) { |
// threads and registering a MemoryDumpProvider on each of them. At each |
// iteration, one thread is removed, to check the live unregistration logic. |
TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
const uint32_t kNumInitialThreads = 8; |
std::vector<std::unique_ptr<Thread>> threads; |
@@ -570,11 +516,8 @@ TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
while (!threads.empty()) { |
- last_callback_success_ = false; |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- EXPECT_TRUE(last_callback_success_); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
// Unregister a MDP and destroy one thread at each iteration to check the |
// live unregistration logic. The unregistration needs to happen on the same |
@@ -600,7 +543,7 @@ TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { |
// SequencedTaskRunner case and that the dump provider gets disabled when |
// PostTask fails, but the dump still succeeds. |
TEST_F(MemoryDumpManagerTest, PostTaskForSequencedTaskRunner) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
std::vector<MockMemoryDumpProvider> mdps(3); |
scoped_refptr<TestSequencedTaskRunner> task_runner1( |
make_scoped_refptr(new TestSequencedTaskRunner())); |
@@ -616,34 +559,29 @@ TEST_F(MemoryDumpManagerTest, PostTaskForSequencedTaskRunner) { |
EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0); |
EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2); |
EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
task_runner1->set_enabled(false); |
- last_callback_success_ = false; |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
// Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong |
// to same task runner. |
EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); |
EXPECT_EQ(2u, task_runner2->no_of_post_tasks()); |
- EXPECT_TRUE(last_callback_success_); |
task_runner1->set_enabled(true); |
- last_callback_success_ = false; |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
EXPECT_EQ(2u, task_runner1->no_of_post_tasks()); |
EXPECT_EQ(4u, task_runner2->no_of_post_tasks()); |
- EXPECT_TRUE(last_callback_success_); |
DisableTracing(); |
} |
// Checks that providers get disabled after 3 consecutive failures, but not |
// otherwise (e.g., if interleaved). |
TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp1; |
MockMemoryDumpProvider mdp2; |
@@ -651,10 +589,6 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
RegisterDumpProvider(&mdp2, nullptr); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .Times(kNumDumps); |
- |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
.Times(GetMaxConsecutiveFailuresCount()) |
.WillRepeatedly(Return(false)); |
@@ -667,9 +601,10 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
.WillOnce(Return(true)) |
.WillOnce(Return(false)); |
+ const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
for (int i = 0; i < kNumDumps; i++) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
@@ -678,15 +613,13 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
// Sneakily registers an extra memory dump provider while an existing one is |
// dumping and expect it to take part in the already active tracing session. |
TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp1; |
MockMemoryDumpProvider mdp2; |
RegisterDumpProvider(&mdp1, nullptr); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(4); |
- |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
.Times(4) |
.WillOnce(Return(true)) |
@@ -694,18 +627,15 @@ TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
RegisterDumpProvider(&mdp2, nullptr); |
return true; |
- })) |
- .WillRepeatedly(Return(true)); |
+ })); |
// Depending on the insertion order (before or after mdp1), mdp2 might be |
// called also immediately after it gets registered. |
- EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
- .Times(Between(2, 3)) |
- .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(Between(2, 3)); |
for (int i = 0; i < 4; i++) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
@@ -713,7 +643,7 @@ TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
// Like RegisterDumperWhileDumping, but unregister the dump provider instead. |
TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp1; |
MockMemoryDumpProvider mdp2; |
@@ -721,8 +651,6 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(4); |
- |
EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
.Times(4) |
.WillOnce(Return(true)) |
@@ -730,18 +658,15 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); |
return true; |
- })) |
- .WillRepeatedly(Return(true)); |
+ })); |
// Depending on the insertion order (before or after mdp1), mdp2 might have |
// been already called when UnregisterDumpProvider happens. |
- EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
- .Times(Between(1, 2)) |
- .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(Between(1, 2)); |
for (int i = 0; i < 4; i++) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
@@ -750,7 +675,7 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
// Checks that the dump does not abort when unregistering a provider while |
// dumping from a different thread than the dumping thread. |
TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
std::vector<std::unique_ptr<TestIOThread>> threads; |
std::vector<std::unique_ptr<MockMemoryDumpProvider>> mdps; |
@@ -789,19 +714,16 @@ TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { |
.WillOnce(Invoke(on_dump)); |
} |
- last_callback_success_ = false; |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
ASSERT_EQ(1, on_memory_dump_call_count); |
- ASSERT_TRUE(last_callback_success_); |
DisableTracing(); |
} |
TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider()); |
std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider()); |
mdp1->enable_mock_destructor = true; |
@@ -853,7 +775,7 @@ TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { |
// If a thread (with a dump provider living on it) is torn down during a dump |
// its dump provider should be skipped but the dump itself should succeed. |
TEST_F(MemoryDumpManagerTest, TearDownThreadWhileDumping) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
std::vector<std::unique_ptr<TestIOThread>> threads; |
std::vector<std::unique_ptr<MockMemoryDumpProvider>> mdps; |
@@ -891,28 +813,23 @@ TEST_F(MemoryDumpManagerTest, TearDownThreadWhileDumping) { |
.WillOnce(Invoke(on_dump)); |
} |
- last_callback_success_ = false; |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
ASSERT_EQ(1, on_memory_dump_call_count); |
- ASSERT_TRUE(last_callback_success_); |
DisableTracing(); |
} |
-// Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
+// Checks that a NACK callback is invoked if CreateProcessDump() is called when |
// tracing is not enabled. |
TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
- MockMemoryDumpProvider mdp1; |
- RegisterDumpProvider(&mdp1, nullptr); |
- |
- last_callback_success_ = true; |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- EXPECT_FALSE(last_callback_success_); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
+ MockMemoryDumpProvider mdp; |
+ RegisterDumpProvider(&mdp, nullptr); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)); |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
// Checks that is the MemoryDumpManager is initialized after tracing already |
@@ -922,24 +839,23 @@ TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
RegisterDumpProvider(&mdp, nullptr); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
+ // First check that a CreateProcessDump() issued before the MemoryDumpManager |
// initialization gets NACK-ed cleanly. |
{ |
+ testing::InSequence sequence; |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- EXPECT_FALSE(last_callback_success_); |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
// Now late-initialize the MemoryDumpManager and check that the |
- // RequestGlobalDump completes successfully. |
+ // CreateProcessDump() completes successfully. |
{ |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ testing::InSequence sequence; |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- EXPECT_TRUE(last_callback_success_); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
} |
@@ -949,15 +865,10 @@ TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
// dumps in memory-infra, handling gracefully the transition between the legacy |
// and the new-style (JSON-based) TraceConfig. |
TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
- // Don't trigger the default behavior of the global dump handler in this test, |
- // which would short-circuit the dump request to the actual |
- // CreateProcessDump(). |
- // We don't want to create any dump in this test, only check whether the dumps |
+ // We don't need to create any dump in this test, only check whether the dumps |
// are requested or not. |
- ON_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .WillByDefault(Return()); |
// Enabling memory-infra in a non-coordinator process should not trigger any |
// periodic dumps. |
@@ -975,9 +886,7 @@ TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { |
} |
TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { |
- InitializeMemoryDumpManager(true /* is_coordinator */); |
- ON_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .WillByDefault(Return()); |
+ InitializeMemoryDumpManagerForInProcessTesting(true /* is_coordinator */); |
// Enabling memory-infra with the legacy TraceConfig (category filter) in |
// a coordinator process should not enable periodic dumps. |
@@ -1013,26 +922,25 @@ TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { |
const int kHeavyDumpRate = 5; |
const int kLightDumpPeriodMs = 1; |
const int kHeavyDumpPeriodMs = kHeavyDumpRate * kLightDumpPeriodMs; |
+ |
// The expected sequence with light=1ms, heavy=5ms is H,L,L,L,L,H,... |
+ MockMemoryDumpProvider mdp; |
+ RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
+ |
testing::InSequence sequence; |
- EXPECT_CALL(global_dump_handler_, |
- RequestGlobalMemoryDump(IsDetailedDump(), _)); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
- .Times(kHeavyDumpRate - 1); |
- EXPECT_CALL(global_dump_handler_, |
- RequestGlobalMemoryDump(IsDetailedDump(), _)); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
- .Times(kHeavyDumpRate - 2); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(IsLightDump(), _)) |
- .WillOnce(Invoke([test_task_runner, quit_closure]( |
- const MemoryDumpRequestArgs& args, |
- const GlobalMemoryDumpCallback& callback) { |
+ EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).Times(kHeavyDumpRate - 1); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).Times(kHeavyDumpRate - 2); |
+ EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)) |
+ .WillOnce(Invoke([test_task_runner, quit_closure](const MemoryDumpArgs&, |
+ ProcessMemoryDump*) { |
test_task_runner->PostTask(FROM_HERE, quit_closure); |
+ return true; |
})); |
// Swallow all the final spurious calls until tracing gets disabled. |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .Times(AnyNumber()); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(AnyNumber()); |
EnableTracingWithTraceConfig( |
TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( |
@@ -1044,7 +952,7 @@ TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { |
TEST_F(MemoryDumpManagerTest, DumpOnBehalfOfOtherProcess) { |
using trace_analyzer::Query; |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
// Standard provider with default options (create dump for current process). |
MemoryDumpProvider::Options options; |
@@ -1062,12 +970,11 @@ TEST_F(MemoryDumpManagerTest, DumpOnBehalfOfOtherProcess) { |
RegisterDumpProvider(&mdp3, nullptr, options); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
- EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
- EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
- EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1); |
+ EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1); |
+ EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
DisableTracing(); |
std::unique_ptr<trace_analyzer::TraceAnalyzer> analyzer = |
@@ -1086,7 +993,8 @@ TEST_F(MemoryDumpManagerTest, DumpOnBehalfOfOtherProcess) { |
} |
TEST_F(MemoryDumpManagerTest, SummaryOnlyWhitelisting) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
+ |
// Summary only MDPs are a subset of background MDPs. |
SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
SetDumpProviderSummaryWhitelistForTesting(kTestMDPWhitelistForSummary); |
@@ -1100,18 +1008,18 @@ TEST_F(MemoryDumpManagerTest, SummaryOnlyWhitelisting) { |
kBackgroundButNotSummaryWhitelistedMDPName); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
+ |
EXPECT_CALL(backgroundMdp, OnMemoryDump(_, _)).Times(0); |
EXPECT_CALL(summaryMdp, OnMemoryDump(_, _)).Times(1); |
- RequestGlobalDumpAndWait(MemoryDumpType::SUMMARY_ONLY, |
- MemoryDumpLevelOfDetail::BACKGROUND); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY, |
+ MemoryDumpLevelOfDetail::BACKGROUND)); |
DisableTracing(); |
} |
TEST_F(MemoryDumpManagerTest, SummaryOnlyDumpsArentAddedToTrace) { |
using trace_analyzer::Query; |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
SetDumpProviderSummaryWhitelistForTesting(kTestMDPWhitelistForSummary); |
SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
@@ -1120,12 +1028,12 @@ TEST_F(MemoryDumpManagerTest, SummaryOnlyDumpsArentAddedToTrace) { |
RegisterDumpProvider(&mdp, nullptr, kDefaultOptions, kWhitelistedMDPName); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(2).WillRepeatedly(Return(true)); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::BACKGROUND); |
- RequestGlobalDumpAndWait(MemoryDumpType::SUMMARY_ONLY, |
- MemoryDumpLevelOfDetail::BACKGROUND); |
+ |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(2); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::BACKGROUND)); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY, |
+ MemoryDumpLevelOfDetail::BACKGROUND)); |
DisableTracing(); |
std::unique_ptr<trace_analyzer::TraceAnalyzer> analyzer = |
@@ -1143,7 +1051,7 @@ TEST_F(MemoryDumpManagerTest, SummaryOnlyDumpsArentAddedToTrace) { |
// Tests the basics of the UnregisterAndDeleteDumpProviderSoon(): the |
// unregistration should actually delete the providers and not leak them. |
TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoon) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
static const int kNumProviders = 3; |
int dtor_count = 0; |
std::vector<std::unique_ptr<MemoryDumpProvider>> mdps; |
@@ -1170,7 +1078,7 @@ TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoon) { |
// from another thread. The OnMemoryDump() and the dtor call are expected to |
// happen on the same thread (the MemoryDumpManager utility thread). |
TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoonDuringDump) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
std::unique_ptr<MockMemoryDumpProvider> mdp(new MockMemoryDumpProvider); |
mdp->enable_mock_destructor = true; |
RegisterDumpProvider(mdp.get(), nullptr, kDefaultOptions); |
@@ -1199,16 +1107,15 @@ TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoonDuringDump) { |
})); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(2); |
for (int i = 0; i < 2; ++i) { |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
} |
DisableTracing(); |
} |
TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); |
RegisterDumpProvider(mdp1.get(), nullptr); |
@@ -1217,41 +1124,40 @@ TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { |
kWhitelistedMDPName); |
EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); |
- EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(1); |
+ EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1); |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::BACKGROUND); |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::BACKGROUND)); |
DisableTracing(); |
} |
+// Configures periodic dumps with MemoryDumpLevelOfDetail::BACKGROUND triggers |
+// and tests that only BACKGROUND are added to the trace, but not LIGHT or |
+// DETAILED, even if requested explicitly. |
TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { |
- InitializeMemoryDumpManager(true /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(true /* is_coordinator */); |
- // We now need an MDP to hit the code path where the dump will be rejected |
- // since this happens at the point you try to serialize a process dump. |
- MockMemoryDumpProvider mdp; |
- RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
+ SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
+ auto mdp = MakeUnique<MockMemoryDumpProvider>(); |
+ RegisterDumpProvider(&*mdp, nullptr, kDefaultOptions, kWhitelistedMDPName); |
RunLoop run_loop; |
auto test_task_runner = ThreadTaskRunnerHandle::Get(); |
auto quit_closure = run_loop.QuitClosure(); |
- testing::InSequence sequence; |
- EXPECT_CALL(global_dump_handler_, |
- RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
- .Times(5); |
- EXPECT_CALL(global_dump_handler_, |
- RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
- .WillOnce(Invoke([test_task_runner, quit_closure]( |
- const MemoryDumpRequestArgs& args, |
- const GlobalMemoryDumpCallback& callback) { |
- test_task_runner->PostTask(FROM_HERE, quit_closure); |
- })); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .Times(AnyNumber()); |
+ { |
+ testing::InSequence sequence; |
+ EXPECT_CALL(*mdp, OnMemoryDump(IsBackgroundDump(), _)).Times(3); |
+ EXPECT_CALL(*mdp, OnMemoryDump(IsBackgroundDump(), _)) |
+ .WillOnce(Invoke([test_task_runner, quit_closure](const MemoryDumpArgs&, |
+ ProcessMemoryDump*) { |
+ test_task_runner->PostTask(FROM_HERE, quit_closure); |
+ return true; |
+ })); |
+ EXPECT_CALL(*mdp, OnMemoryDump(IsBackgroundDump(), _)).Times(AnyNumber()); |
+ } |
EnableTracingWithTraceConfig( |
TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger( |
@@ -1259,97 +1165,73 @@ TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { |
run_loop.Run(); |
- // Only background mode dumps should be allowed with the trace config. |
- last_callback_success_ = false; |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::LIGHT); |
- EXPECT_FALSE(last_callback_success_); |
- last_callback_success_ = false; |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- EXPECT_FALSE(last_callback_success_); |
+ // When requesting non-BACKGROUND dumps the MDP will be invoked but the |
+ // data is expected to be dropped on the floor, hence the EXPECT_FALSE. |
+ EXPECT_CALL(*mdp, OnMemoryDump(IsLightDump(), _)); |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::LIGHT)); |
+ |
+ EXPECT_CALL(*mdp, OnMemoryDump(IsDetailedDump(), _)); |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
ASSERT_TRUE(IsPeriodicDumpingEnabled()); |
DisableTracing(); |
+ mdm_->UnregisterAndDeleteDumpProviderSoon(std::move(mdp)); |
} |
-// Tests that we can manually take a dump without enabling tracing. |
-TEST_F(MemoryDumpManagerTest, DumpWithTracingDisabled) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+// Tests that the MemoryDumpProvider(s) are invoked even if tracing has not |
+// been initialized. |
+TEST_F(MemoryDumpManagerTest, DumpWithoutInitializingTracing) { |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
- |
DisableTracing(); |
- |
- const TraceConfig& trace_config = |
- TraceConfig(TraceConfigMemoryTestUtil::GetTraceConfig_NoTriggers()); |
- const TraceConfig::MemoryDumpConfig& memory_dump_config = |
- trace_config.memory_dump_config(); |
- |
- mdm_->SetupForTracing(memory_dump_config); |
- |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
- last_callback_success_ = true; |
- for (int i = 0; i < 3; ++i) |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- // The callback result should actually be false since (for the moment at |
- // least) a true result means that as well as the dump generally being |
- // successful we also managed to add the dump to the trace. |
- EXPECT_FALSE(last_callback_success_); |
- |
- mdm_->TeardownForTracing(); |
- |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3); |
+ for (int i = 0; i < 3; ++i) { |
+ // The callback result will be false for the moment. true result means that |
+ // as well as the dump being successful we also managed to add the dump to |
+ // the trace. But the latter won't happen here. |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
+ } |
mdm_->UnregisterDumpProvider(&mdp); |
} |
-// Tests that we can do a dump without enabling/disabling. |
-TEST_F(MemoryDumpManagerTest, DumpWithoutTracing) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+// Similar to DumpWithoutInitializingTracing. Tracing is initialized but not |
+// enabled. |
+TEST_F(MemoryDumpManagerTest, DumpWithTracingInitializedButDisabled) { |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
DisableTracing(); |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)).Times(3); |
- EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
- last_callback_success_ = true; |
- for (int i = 0; i < 3; ++i) |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::DETAILED); |
- // The callback result should be false since (for the moment at |
- // least) a true result means that as well as the dump being |
- // successful we also managed to add the dump to the trace which shouldn't |
- // happen when tracing is not enabled. |
- EXPECT_FALSE(last_callback_success_); |
+ const TraceConfig& trace_config = |
+ TraceConfig(TraceConfigMemoryTestUtil::GetTraceConfig_NoTriggers()); |
+ const TraceConfig::MemoryDumpConfig& memory_dump_config = |
+ trace_config.memory_dump_config(); |
+ mdm_->SetupForTracing(memory_dump_config); |
+ EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3); |
+ for (int i = 0; i < 3; ++i) { |
+ // Same as the above. Even if the MDP(s) are invoked, this will return false |
+ // while attempting to add the dump into the trace. |
+ EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::DETAILED)); |
+ } |
+ mdm_->TeardownForTracing(); |
mdm_->UnregisterDumpProvider(&mdp); |
} |
TEST_F(MemoryDumpManagerTest, TestSummaryComputation) { |
- InitializeMemoryDumpManager(false /* is_coordinator */); |
+ InitializeMemoryDumpManagerForInProcessTesting(false /* is_coordinator */); |
MockMemoryDumpProvider mdp; |
RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
- const HeapProfilerSerializationState* heap_profiler_serialization_state = |
- mdm_->heap_profiler_serialization_state_for_testing().get(); |
- |
- EXPECT_CALL(global_dump_handler_, RequestGlobalMemoryDump(_, _)) |
- .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, |
- const GlobalMemoryDumpCallback& callback) { |
- ProcessMemoryDumpCallback process_callback = |
- Bind(&MemoryDumpManagerTest_TestSummaryComputation_Test:: |
- ProcessDumpRecordingCallbackAdapter, |
- Unretained(this), callback); |
- mdm_->CreateProcessDump(args, process_callback); |
- })); |
- |
EXPECT_CALL(mdp, OnMemoryDump(_, _)) |
- .Times(1) |
- .WillRepeatedly(Invoke([heap_profiler_serialization_state]( |
- const MemoryDumpArgs&, |
- ProcessMemoryDump* pmd) -> bool { |
+ .WillOnce(Invoke([](const MemoryDumpArgs&, |
+ ProcessMemoryDump* pmd) -> bool { |
auto* size = MemoryAllocatorDump::kNameSize; |
auto* bytes = MemoryAllocatorDump::kUnitsBytes; |
const uint32_t kB = 1024; |
@@ -1366,6 +1248,7 @@ TEST_F(MemoryDumpManagerTest, TestSummaryComputation) { |
pmd->CreateAllocatorDump("v8/bar")->AddScalar(size, bytes, 2 * kB); |
pmd->CreateAllocatorDump("v8")->AddScalar(size, bytes, 99 * kB); |
+ // All the 99 KB values here are expected to be ignored. |
pmd->CreateAllocatorDump("partition_alloc") |
->AddScalar(size, bytes, 99 * kB); |
pmd->CreateAllocatorDump("partition_alloc/allocated_objects") |
@@ -1374,37 +1257,39 @@ TEST_F(MemoryDumpManagerTest, TestSummaryComputation) { |
->AddScalar(size, bytes, 99 * kB); |
pmd->CreateAllocatorDump("partition_alloc/partitions") |
->AddScalar(size, bytes, 99 * kB); |
- pmd->CreateAllocatorDump("partition_alloc/partitions/foo") |
+ pmd->CreateAllocatorDump("partition_alloc/partitions/not_ignored_1") |
->AddScalar(size, bytes, 2 * kB); |
- pmd->CreateAllocatorDump("partition_alloc/partitions/bar") |
+ pmd->CreateAllocatorDump("partition_alloc/partitions/not_ignored_2") |
->AddScalar(size, bytes, 2 * kB); |
pmd->process_totals()->set_resident_set_bytes(5 * kB); |
pmd->set_has_process_totals(); |
return true; |
})); |
- last_callback_success_ = false; |
- |
EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
- RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
- MemoryDumpLevelOfDetail::LIGHT); |
+ Optional<MemoryDumpCallbackResult> result; |
+ EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
+ MemoryDumpLevelOfDetail::LIGHT, |
+ &result)); |
DisableTracing(); |
- // We shouldn't see any of the 99 values from above. |
- EXPECT_TRUE(last_callback_success_); |
- ASSERT_EQ(1u, GetResults()->size()); |
- MemoryDumpCallbackResult result = GetResults()->front(); |
+ ASSERT_TRUE(result); |
+ |
// For malloc we only count the root "malloc" not children "malloc/*". |
- EXPECT_EQ(1u, result.chrome_dump.malloc_total_kb); |
+ EXPECT_EQ(1u, result->chrome_dump.malloc_total_kb); |
+ |
// For blink_gc we only count the root "blink_gc" not children "blink_gc/*". |
- EXPECT_EQ(2u, result.chrome_dump.blink_gc_total_kb); |
+ EXPECT_EQ(2u, result->chrome_dump.blink_gc_total_kb); |
+ |
// For v8 we count the children ("v8/*") as the root total is not given. |
- EXPECT_EQ(3u, result.chrome_dump.v8_total_kb); |
+ EXPECT_EQ(3u, result->chrome_dump.v8_total_kb); |
+ |
// partition_alloc has partition_alloc/allocated_objects/* which is a subset |
// of partition_alloc/partitions/* so we only count the latter. |
- EXPECT_EQ(4u, result.chrome_dump.partition_alloc_total_kb); |
+ EXPECT_EQ(4u, result->chrome_dump.partition_alloc_total_kb); |
+ |
// resident_set_kb should read from process_totals. |
- EXPECT_EQ(5u, result.os_dump.resident_set_kb); |
+ EXPECT_EQ(5u, result->os_dump.resident_set_kb); |
}; |
} // namespace trace_event |