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 946b5b64162003adf5b997f8471f03744f7f07d7..f7f3f1d9de703ea660369dee5fe144fdb92c7949 100644 |
--- a/base/trace_event/memory_dump_manager_unittest.cc |
+++ b/base/trace_event/memory_dump_manager_unittest.cc |
@@ -116,10 +116,8 @@ void PostTaskAndWait(const tracked_objects::Location& from_here, |
event.Wait(); |
} |
-// Adapts a ProcessMemoryDumpCallback into a GlobalMemoryDumpCallback by |
-// trimming off the result argument and calling the global callback. |
-// TODO (fmeawad): we should keep the results for verification, but currently |
-// all results are empty. |
+// Adapts a ProcessMemoryDumpCallback into a GlobalMemoryDumpCallback |
+// and keeps around the process-local result. |
void ProcessDumpCallbackAdapter( |
GlobalMemoryDumpCallback callback, |
uint64_t dump_guid, |
@@ -248,6 +246,7 @@ class MemoryDumpManagerTest : public testing::Test { |
last_callback_success_ = false; |
message_loop_.reset(new MessageLoop()); |
mdm_.reset(new MemoryDumpManager()); |
+ results_.clear(); |
MemoryDumpManager::SetInstanceForTesting(mdm_.get()); |
ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); |
} |
@@ -310,13 +309,31 @@ 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. |
ShadowingAtExitManager at_exit_manager_; |
@@ -1318,5 +1335,84 @@ TEST_F(MemoryDumpManagerTest, DumpWithTracingDisabled) { |
mdm_->UnregisterDumpProvider(&mdp); |
} |
+TEST_F(MemoryDumpManagerTest, TestSummaryComputation) { |
+ InitializeMemoryDumpManager(false /* is_coordinator */); |
+ MockMemoryDumpProvider mdp; |
+ RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
+ |
+ const MemoryDumpSessionState* session_state = |
+ mdm_->session_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([session_state](const MemoryDumpArgs&, |
+ ProcessMemoryDump* pmd) -> bool { |
+ auto* size = MemoryAllocatorDump::kNameSize; |
+ auto* bytes = MemoryAllocatorDump::kUnitsBytes; |
+ const uint32_t kB = 1024; |
+ |
+ pmd->CreateAllocatorDump("malloc")->AddScalar(size, bytes, 1 * kB); |
+ pmd->CreateAllocatorDump("malloc/ignored") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ |
+ pmd->CreateAllocatorDump("blink_gc")->AddScalar(size, bytes, 2 * kB); |
+ pmd->CreateAllocatorDump("blink_gc/ignored") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ |
+ pmd->CreateAllocatorDump("v8/foo")->AddScalar(size, bytes, 1 * kB); |
+ pmd->CreateAllocatorDump("v8/bar")->AddScalar(size, bytes, 2 * kB); |
+ pmd->CreateAllocatorDump("v8")->AddScalar(size, bytes, 99 * kB); |
+ |
+ pmd->CreateAllocatorDump("partition_alloc") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ pmd->CreateAllocatorDump("partition_alloc/allocated_objects") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ pmd->CreateAllocatorDump("partition_alloc/allocated_objects/ignored") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ pmd->CreateAllocatorDump("partition_alloc/partitions") |
+ ->AddScalar(size, bytes, 99 * kB); |
+ pmd->CreateAllocatorDump("partition_alloc/partitions/foo") |
+ ->AddScalar(size, bytes, 2 * kB); |
+ pmd->CreateAllocatorDump("partition_alloc/partitions/bar") |
+ ->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); |
+ 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(); |
+ // For malloc we only count the root "malloc" not children "malloc/*". |
+ 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); |
+ // For v8 we count the children ("v8/*") as the root total is not given. |
+ 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); |
+ // resident_set_kb should read from process_totals. |
+ EXPECT_EQ(5u, result.os_dump.resident_set_kb); |
+}; |
+ |
} // namespace trace_event |
} // namespace base |