Chromium Code Reviews| 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 d90b7c6073563ba4d1bdab0250b2f78e9381f861..3be41fd0e05c0fdf07beee4cc6e4606899cf04f3 100644 |
| --- a/base/trace_event/memory_dump_manager_unittest.cc |
| +++ b/base/trace_event/memory_dump_manager_unittest.cc |
| @@ -8,6 +8,7 @@ |
| #include "base/memory/scoped_vector.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/run_loop.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "base/threading/thread.h" |
| #include "base/trace_event/memory_dump_provider.h" |
| #include "base/trace_event/process_memory_dump.h" |
| @@ -15,6 +16,7 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| using testing::_; |
| +using testing::Between; |
| using testing::Invoke; |
| using testing::Return; |
| @@ -25,9 +27,8 @@ namespace trace_event { |
| // instead of performing IPC dances. |
| class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { |
| public: |
| - void RequestGlobalMemoryDump( |
| - const base::trace_event::MemoryDumpRequestArgs& args, |
| - const MemoryDumpCallback& callback) override { |
| + void RequestGlobalMemoryDump(const MemoryDumpRequestArgs& args, |
| + const MemoryDumpCallback& callback) override { |
| CreateProcessDump(args, callback); |
| } |
| @@ -81,7 +82,9 @@ class MemoryDumpManagerTest : public testing::Test { |
| class MockDumpProvider : public MemoryDumpProvider { |
| public: |
| - MockDumpProvider() : last_session_state_(nullptr) {} |
| + MockDumpProvider() |
| + : dump_provider_to_register_or_unregister(nullptr), |
| + last_session_state_(nullptr) {} |
| // Ctor used by the RespectTaskRunnerAffinity test. |
| explicit MockDumpProvider( |
| @@ -107,6 +110,23 @@ class MockDumpProvider : public MemoryDumpProvider { |
| return true; |
| } |
| + // OnMemoryDump() override for the RegisterDumperWhileDumping test. |
| + bool OnMemoryDump_RegisterExtraDumpProvider(ProcessMemoryDump* pmd) { |
| + MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| + dump_provider_to_register_or_unregister); |
| + return true; |
| + } |
| + |
| + // OnMemoryDump() override for the UnegisterDumperWhileDumping test. |
| + bool OnMemoryDump_UnregisterDumpProvider(ProcessMemoryDump* pmd) { |
| + MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| + dump_provider_to_register_or_unregister); |
| + return true; |
| + } |
| + |
| + // Used by OnMemoryDump_(Un)RegisterExtraDumpProvider. |
| + MemoryDumpProvider* dump_provider_to_register_or_unregister; |
| + |
| private: |
| MemoryDumpSessionState* last_session_state_; |
| scoped_refptr<SingleThreadTaskRunner> task_runner_; |
| @@ -263,6 +283,7 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
| EXPECT_CALL(mdp1, OnMemoryDump(_)) |
| .Times(MemoryDumpManager::kMaxConsecutiveFailuresCount) |
| .WillRepeatedly(Return(false)); |
| + |
| EXPECT_CALL(mdp2, OnMemoryDump(_)) |
| .Times(1 + MemoryDumpManager::kMaxConsecutiveFailuresCount) |
| .WillOnce(Return(false)) |
| @@ -275,5 +296,65 @@ TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
| DisableTracing(); |
| } |
| +// Sneakily register an extra memory dump provider while an existing one is |
| +// dumping and expect it to take part to the already active tracing session. |
|
petrcermak
2015/07/03 11:04:17
s/take part to/take part in/
Primiano Tucci (use gerrit)
2015/07/03 15:05:45
Done.
|
| +TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
| + MockDumpProvider mdp1; |
| + MockDumpProvider mdp2; |
| + |
| + mdp1.dump_provider_to_register_or_unregister = &mdp2; |
| + mdm_->RegisterDumpProvider(&mdp1); |
| + EnableTracing(kTraceCategory); |
| + |
| + EXPECT_CALL(mdp1, OnMemoryDump(_)) |
| + .Times(4) |
| + .WillOnce(Return(true)) |
| + .WillOnce(Invoke( |
| + &mdp1, &MockDumpProvider::OnMemoryDump_RegisterExtraDumpProvider)) |
| + .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)); |
| + |
| + for (int i = 0; i < 4; i++) { |
| + mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
| + } |
| + |
| + DisableTracing(); |
| +} |
| + |
| +// Like the above, but suddenly unregister the dump provider. |
| +TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
| + MockDumpProvider mdp1; |
| + MockDumpProvider mdp2; |
| + |
| + mdm_->RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); |
| + mdm_->RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get()); |
| + mdp1.dump_provider_to_register_or_unregister = &mdp2; |
| + EnableTracing(kTraceCategory); |
| + |
| + EXPECT_CALL(mdp1, OnMemoryDump(_)) |
| + .Times(4) |
| + .WillOnce(Return(true)) |
| + .WillOnce(Invoke(&mdp1, |
| + &MockDumpProvider::OnMemoryDump_UnregisterDumpProvider)) |
| + .WillRepeatedly(Return(true)); |
| + |
| + // Depending on the insertion order (before or after mdp1), mdp2 might have |
| + // been already called when OnMemoryDump_UnregisterDumpProvider happens. |
| + EXPECT_CALL(mdp2, OnMemoryDump(_)) |
| + .Times(Between(1, 2)) |
| + .WillRepeatedly(Return(true)); |
| + |
| + for (int i = 0; i < 4; i++) { |
| + mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED); |
| + } |
| + |
| + DisableTracing(); |
| +} |
| + |
| } // namespace trace_event |
| } // namespace base |