Index: components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
diff --git a/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc b/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
index d05c3a736217d93e93bf179b66b25db8389f6261..95a565d148ab8b502af840f0339672c10eb4d3c8 100644 |
--- a/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
+++ b/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
@@ -22,6 +22,10 @@ |
#include <mach-o/dyld.h> |
#endif |
+#if defined(OS_WIN) |
+#include <base/strings/sys_string_conversions.h> |
+#endif |
+ |
namespace tracing { |
#if defined(OS_LINUX) || defined(OS_ANDROID) |
@@ -274,6 +278,56 @@ TEST(ProcessMetricsMemoryDumpProviderTest, TestPollFastMemoryTotal) { |
#endif |
} |
+#if defined(OS_WIN) |
+ |
+void DummyFunction() {} |
+ |
+TEST(ProcessMetricsMemoryDumpProviderTest, TestWinModuleReading) { |
+ using VMRegion = base::trace_event::ProcessMemoryMaps::VMRegion; |
+ |
+ ProcessMetricsMemoryDumpProvider mdp(base::kNullProcessId); |
+ base::trace_event::MemoryDumpArgs args; |
+ base::trace_event::ProcessMemoryDump dump(nullptr, args); |
+ ASSERT_TRUE(mdp.DumpProcessMemoryMaps(args, &dump)); |
+ ASSERT_TRUE(dump.has_process_mmaps()); |
+ |
+ wchar_t module_name[MAX_PATH]; |
+ DWORD result = GetModuleFileName(nullptr, module_name, MAX_PATH); |
+ ASSERT_TRUE(result); |
+ std::string executable_name = base::SysWideToNativeMB(module_name); |
+ |
+ HMODULE module_containing_dummy = nullptr; |
+ uintptr_t dummy_function_address = |
+ reinterpret_cast<uintptr_t>(&DummyFunction); |
+ result = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, |
+ reinterpret_cast<LPCWSTR>(dummy_function_address), |
+ &module_containing_dummy); |
+ ASSERT_TRUE(result); |
+ result = GetModuleFileName(nullptr, module_name, MAX_PATH); |
+ ASSERT_TRUE(result); |
+ std::string module_containing_dummy_name = |
+ base::SysWideToNativeMB(module_name); |
+ |
+ bool found_executable = false; |
+ bool found_region_with_dummy = false; |
+ for (const VMRegion& region : dump.process_mmaps()->vm_regions()) { |
+ EXPECT_NE(0u, region.start_address); |
+ EXPECT_NE(0u, region.size_in_bytes); |
+ |
+ if (region.mapped_file.find(executable_name) != std::string::npos) |
+ found_executable = true; |
+ |
+ if (dummy_function_address >= region.start_address && |
+ dummy_function_address < region.start_address + region.size_in_bytes) { |
+ found_region_with_dummy = true; |
+ EXPECT_EQ(module_containing_dummy_name, region.mapped_file); |
+ } |
+ } |
+ EXPECT_TRUE(found_executable); |
+ EXPECT_TRUE(found_region_with_dummy); |
+} |
+#endif |
+ |
#if defined(OS_MACOSX) |
TEST(ProcessMetricsMemoryDumpProviderTest, TestMachOReading) { |
using VMRegion = base::trace_event::ProcessMemoryMaps::VMRegion; |