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 95a565d148ab8b502af840f0339672c10eb4d3c8..9d45c0133fa3be50972ec93cb09452bebb0c8e0e 100644 |
--- a/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
+++ b/components/tracing/common/process_metrics_memory_dump_provider_unittest.cc |
@@ -11,6 +11,7 @@ |
#include "base/files/file_util.h" |
#include "base/memory/ptr_util.h" |
#include "base/process/process_metrics.h" |
+#include "base/trace_event/memory_dump_manager.h" |
#include "base/trace_event/process_memory_dump.h" |
#include "base/trace_event/process_memory_maps.h" |
#include "base/trace_event/process_memory_totals.h" |
@@ -393,4 +394,43 @@ TEST(ProcessMetricsMemoryDumpProviderTest, NoDuplicateRegions) { |
#endif // defined(OS_MACOSX) |
+class MockMemoryDumpProvider : public ProcessMetricsMemoryDumpProvider { |
+ public: |
+ MockMemoryDumpProvider(base::ProcessId process); |
+ ~MockMemoryDumpProvider() override; |
+}; |
+ |
+std::unordered_set<MockMemoryDumpProvider*> g_live_mocks; |
+std::unordered_set<MockMemoryDumpProvider*> g_dead_mocks; |
+ |
+MockMemoryDumpProvider::MockMemoryDumpProvider(base::ProcessId process) |
+ : ProcessMetricsMemoryDumpProvider(process) { |
+ g_live_mocks.insert(this); |
+} |
+ |
+MockMemoryDumpProvider::~MockMemoryDumpProvider() { |
+ g_live_mocks.erase(this); |
+ g_dead_mocks.insert(this); |
+} |
+ |
+TEST(ProcessMetricsMemoryDumpProviderTest, DoubleRegister) { |
+ auto factory = [](base::ProcessId process) { |
+ return std::unique_ptr<ProcessMetricsMemoryDumpProvider>( |
+ new MockMemoryDumpProvider(process)); |
+ }; |
+ ProcessMetricsMemoryDumpProvider::factory_for_testing = factory; |
+ ProcessMetricsMemoryDumpProvider::RegisterForProcess(1); |
+ ProcessMetricsMemoryDumpProvider::RegisterForProcess(1); |
+ ASSERT_EQ(1u, g_live_mocks.size()); |
+ ASSERT_EQ(1u, g_dead_mocks.size()); |
+ auto* manager = base::trace_event::MemoryDumpManager::GetInstance(); |
+ MockMemoryDumpProvider* live_mock = *g_live_mocks.begin(); |
+ EXPECT_TRUE(manager->IsDumpProviderRegisteredForTesting(live_mock)); |
+ auto* dead_mock = *g_dead_mocks.begin(); |
+ EXPECT_FALSE(manager->IsDumpProviderRegisteredForTesting(dead_mock)); |
+ ProcessMetricsMemoryDumpProvider::UnregisterForProcess(1); |
+ g_live_mocks.clear(); |
+ g_dead_mocks.clear(); |
+} |
+ |
} // namespace tracing |