Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/trace_event/memory_dump_manager.h" | 5 #include "base/trace_event/memory_dump_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 112 // |task| is executed. | 112 // |task| is executed. |
| 113 event.Wait(); | 113 event.Wait(); |
| 114 } | 114 } |
| 115 | 115 |
| 116 } // namespace | 116 } // namespace |
| 117 | 117 |
| 118 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump | 118 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump |
| 119 // requests locally to the MemoryDumpManager instead of performing IPC dances. | 119 // requests locally to the MemoryDumpManager instead of performing IPC dances. |
| 120 class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { | 120 class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { |
| 121 public: | 121 public: |
| 122 MemoryDumpManagerDelegateForTesting() { | 122 MemoryDumpManagerDelegateForTesting(bool is_coordinator) |
| 123 : is_coordinator_(is_coordinator) { | |
| 123 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) | 124 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) |
| 124 .WillByDefault(Invoke( | 125 .WillByDefault(Invoke( |
| 125 this, &MemoryDumpManagerDelegateForTesting::CreateProcessDump)); | 126 this, &MemoryDumpManagerDelegateForTesting::CreateProcessDump)); |
| 126 } | 127 } |
| 127 | 128 |
| 128 MOCK_METHOD2(RequestGlobalMemoryDump, | 129 MOCK_METHOD2(RequestGlobalMemoryDump, |
| 129 void(const MemoryDumpRequestArgs& args, | 130 void(const MemoryDumpRequestArgs& args, |
| 130 const MemoryDumpCallback& callback)); | 131 const MemoryDumpCallback& callback)); |
| 131 | 132 |
| 132 uint64_t GetTracingProcessId() const override { | 133 bool IsCoordinator() const override { return is_coordinator_; } |
| 133 NOTREACHED(); | |
| 134 return MemoryDumpManager::kInvalidTracingProcessId; | |
| 135 } | |
| 136 | 134 |
| 137 // Promote the CreateProcessDump to public so it can be used by test fixtures. | 135 // Promote the CreateProcessDump to public so it can be used by test fixtures. |
| 138 using MemoryDumpManagerDelegate::CreateProcessDump; | 136 using MemoryDumpManagerDelegate::CreateProcessDump; |
| 137 | |
| 138 private: | |
| 139 bool is_coordinator_; | |
| 139 }; | 140 }; |
| 140 | 141 |
| 141 class MockMemoryDumpProvider : public MemoryDumpProvider { | 142 class MockMemoryDumpProvider : public MemoryDumpProvider { |
| 142 public: | 143 public: |
| 143 MOCK_METHOD0(Destructor, void()); | 144 MOCK_METHOD0(Destructor, void()); |
| 144 MOCK_METHOD2(OnMemoryDump, | 145 MOCK_METHOD2(OnMemoryDump, |
| 145 bool(const MemoryDumpArgs& args, ProcessMemoryDump* pmd)); | 146 bool(const MemoryDumpArgs& args, ProcessMemoryDump* pmd)); |
| 146 MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t* memory_total)); | 147 MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t* memory_total)); |
| 147 MOCK_METHOD0(SuspendFastMemoryPolling, void()); | 148 MOCK_METHOD0(SuspendFastMemoryPolling, void()); |
| 148 | 149 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 class MemoryDumpManagerTest : public testing::Test { | 214 class MemoryDumpManagerTest : public testing::Test { |
| 214 public: | 215 public: |
| 215 MemoryDumpManagerTest() : testing::Test(), kDefaultOptions() {} | 216 MemoryDumpManagerTest() : testing::Test(), kDefaultOptions() {} |
| 216 | 217 |
| 217 void SetUp() override { | 218 void SetUp() override { |
| 218 last_callback_success_ = false; | 219 last_callback_success_ = false; |
| 219 message_loop_.reset(new MessageLoop()); | 220 message_loop_.reset(new MessageLoop()); |
| 220 mdm_.reset(new MemoryDumpManager()); | 221 mdm_.reset(new MemoryDumpManager()); |
| 221 MemoryDumpManager::SetInstanceForTesting(mdm_.get()); | 222 MemoryDumpManager::SetInstanceForTesting(mdm_.get()); |
| 222 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); | 223 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); |
| 223 delegate_.reset(new MemoryDumpManagerDelegateForTesting); | |
| 224 } | 224 } |
| 225 | 225 |
| 226 void TearDown() override { | 226 void TearDown() override { |
| 227 MemoryDumpManager::SetInstanceForTesting(nullptr); | 227 MemoryDumpManager::SetInstanceForTesting(nullptr); |
| 228 delegate_.reset(); | |
| 229 delegate_ptr_ = nullptr; | |
| 228 mdm_.reset(); | 230 mdm_.reset(); |
| 229 delegate_.reset(); | |
| 230 message_loop_.reset(); | 231 message_loop_.reset(); |
| 231 TraceLog::DeleteForTesting(); | 232 TraceLog::DeleteForTesting(); |
| 232 } | 233 } |
| 233 | 234 |
| 234 // Turns a Closure into a MemoryDumpCallback, keeping track of the callback | 235 // Turns a Closure into a MemoryDumpCallback, keeping track of the callback |
| 235 // result and taking care of posting the closure on the correct task runner. | 236 // result and taking care of posting the closure on the correct task runner. |
| 236 void DumpCallbackAdapter(scoped_refptr<SingleThreadTaskRunner> task_runner, | 237 void DumpCallbackAdapter(scoped_refptr<SingleThreadTaskRunner> task_runner, |
| 237 Closure closure, | 238 Closure closure, |
| 238 uint64_t dump_guid, | 239 uint64_t dump_guid, |
| 239 bool success) { | 240 bool success) { |
| 240 last_callback_success_ = success; | 241 last_callback_success_ = success; |
| 241 task_runner->PostTask(FROM_HERE, closure); | 242 task_runner->PostTask(FROM_HERE, closure); |
| 242 } | 243 } |
| 243 | 244 |
| 244 void PollFastMemoryTotal(uint64_t* memory_total) { | 245 void PollFastMemoryTotal(uint64_t* memory_total) { |
| 245 mdm_->PollFastMemoryTotal(memory_total); | 246 mdm_->PollFastMemoryTotal(memory_total); |
| 246 } | 247 } |
| 247 | 248 |
| 248 protected: | 249 protected: |
| 249 void InitializeMemoryDumpManager(bool is_coordinator) { | 250 void InitializeMemoryDumpManager(bool is_coordinator) { |
| 250 mdm_->set_dumper_registrations_ignored_for_testing(true); | 251 mdm_->set_dumper_registrations_ignored_for_testing(true); |
| 251 mdm_->Initialize(delegate_.get(), is_coordinator); | 252 delegate_.reset(new MemoryDumpManagerDelegateForTesting(is_coordinator)); |
| 253 delegate_ptr_ = delegate_.get(); | |
| 254 mdm_->Initialize(std::move(delegate_)); | |
| 252 } | 255 } |
| 253 | 256 |
| 254 void RequestGlobalDumpAndWait(MemoryDumpType dump_type, | 257 void RequestGlobalDumpAndWait(MemoryDumpType dump_type, |
| 255 MemoryDumpLevelOfDetail level_of_detail) { | 258 MemoryDumpLevelOfDetail level_of_detail) { |
| 256 RunLoop run_loop; | 259 RunLoop run_loop; |
| 257 MemoryDumpCallback callback = | 260 MemoryDumpCallback callback = |
| 258 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 261 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
| 259 ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); | 262 ThreadTaskRunnerHandle::Get(), run_loop.QuitClosure()); |
| 260 mdm_->RequestGlobalDump(dump_type, level_of_detail, callback); | 263 mdm_->RequestGlobalDump(dump_type, level_of_detail, callback); |
| 261 run_loop.Run(); | 264 run_loop.Run(); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 277 return mdm_->dump_scheduler_->IsPeriodicTimerRunningForTesting(); | 280 return mdm_->dump_scheduler_->IsPeriodicTimerRunningForTesting(); |
| 278 } | 281 } |
| 279 | 282 |
| 280 int GetMaxConsecutiveFailuresCount() const { | 283 int GetMaxConsecutiveFailuresCount() const { |
| 281 return MemoryDumpManager::kMaxConsecutiveFailuresCount; | 284 return MemoryDumpManager::kMaxConsecutiveFailuresCount; |
| 282 } | 285 } |
| 283 | 286 |
| 284 const MemoryDumpProvider::Options kDefaultOptions; | 287 const MemoryDumpProvider::Options kDefaultOptions; |
| 285 std::unique_ptr<MemoryDumpManager> mdm_; | 288 std::unique_ptr<MemoryDumpManager> mdm_; |
| 286 std::unique_ptr<MemoryDumpManagerDelegateForTesting> delegate_; | 289 std::unique_ptr<MemoryDumpManagerDelegateForTesting> delegate_; |
| 290 MemoryDumpManagerDelegateForTesting* delegate_ptr_; | |
|
Primiano Tucci (use gerrit)
2017/03/13 21:31:10
we do we need both here, unique_ptr has an operato
chiniforooshan
2017/03/14 16:06:36
No, actually. Know that the delegate is not a glob
Primiano Tucci (use gerrit)
2017/03/15 16:59:40
Ahh hold on, now I read it correctly.
Yes, you are
chiniforooshan
2017/03/15 18:27:30
Done.
| |
| 287 bool last_callback_success_; | 291 bool last_callback_success_; |
| 288 | 292 |
| 289 private: | 293 private: |
| 290 std::unique_ptr<MessageLoop> message_loop_; | 294 std::unique_ptr<MessageLoop> message_loop_; |
| 291 | 295 |
| 292 // We want our singleton torn down after each test. | 296 // We want our singleton torn down after each test. |
| 293 ShadowingAtExitManager at_exit_manager_; | 297 ShadowingAtExitManager at_exit_manager_; |
| 294 }; | 298 }; |
| 295 | 299 |
| 296 // Basic sanity checks. Registers a memory dump provider and checks that it is | 300 // Basic sanity checks. Registers a memory dump provider and checks that it is |
| 297 // called, but only when memory-infra is enabled. | 301 // called, but only when memory-infra is enabled. |
| 298 TEST_F(MemoryDumpManagerTest, SingleDumper) { | 302 TEST_F(MemoryDumpManagerTest, SingleDumper) { |
| 299 InitializeMemoryDumpManager(false /* is_coordinator */); | 303 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 300 MockMemoryDumpProvider mdp; | 304 MockMemoryDumpProvider mdp; |
| 301 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 305 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 302 | 306 |
| 303 // Check that the dumper is not called if the memory category is not enabled. | 307 // Check that the dumper is not called if the memory category is not enabled. |
| 304 EnableTracingWithLegacyCategories("foobar-but-not-memory"); | 308 EnableTracingWithLegacyCategories("foobar-but-not-memory"); |
| 305 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 309 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(0); |
| 306 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 310 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 307 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 311 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 308 MemoryDumpLevelOfDetail::DETAILED); | 312 MemoryDumpLevelOfDetail::DETAILED); |
| 309 DisableTracing(); | 313 DisableTracing(); |
| 310 | 314 |
| 311 // Now repeat enabling the memory category and check that the dumper is | 315 // Now repeat enabling the memory category and check that the dumper is |
| 312 // invoked this time. | 316 // invoked this time. |
| 313 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 317 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 314 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | 318 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(3); |
| 315 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); | 319 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
| 316 for (int i = 0; i < 3; ++i) | 320 for (int i = 0; i < 3; ++i) |
| 317 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 321 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 318 MemoryDumpLevelOfDetail::DETAILED); | 322 MemoryDumpLevelOfDetail::DETAILED); |
| 319 DisableTracing(); | 323 DisableTracing(); |
| 320 | 324 |
| 321 mdm_->UnregisterDumpProvider(&mdp); | 325 mdm_->UnregisterDumpProvider(&mdp); |
| 322 | 326 |
| 323 // Finally check the unregister logic: the delegate will be invoked but not | 327 // Finally check the unregister logic: the delegate will be invoked but not |
| 324 // the dump provider, as it has been unregistered. | 328 // the dump provider, as it has been unregistered. |
| 325 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 329 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 326 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | 330 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(3); |
| 327 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 331 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 328 | 332 |
| 329 for (int i = 0; i < 3; ++i) { | 333 for (int i = 0; i < 3; ++i) { |
| 330 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 334 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 331 MemoryDumpLevelOfDetail::DETAILED); | 335 MemoryDumpLevelOfDetail::DETAILED); |
| 332 } | 336 } |
| 333 DisableTracing(); | 337 DisableTracing(); |
| 334 } | 338 } |
| 335 | 339 |
| 336 // Checks that requesting dumps with high level of detail actually propagates | 340 // Checks that requesting dumps with high level of detail actually propagates |
| 337 // the level of the detail properly to OnMemoryDump() call on dump providers. | 341 // the level of the detail properly to OnMemoryDump() call on dump providers. |
| 338 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { | 342 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
| 339 InitializeMemoryDumpManager(false /* is_coordinator */); | 343 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 340 MockMemoryDumpProvider mdp; | 344 MockMemoryDumpProvider mdp; |
| 341 | 345 |
| 342 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 346 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 343 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 347 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 344 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 348 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 345 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); | 349 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
| 346 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 350 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 347 MemoryDumpLevelOfDetail::DETAILED); | 351 MemoryDumpLevelOfDetail::DETAILED); |
| 348 DisableTracing(); | 352 DisableTracing(); |
| 349 mdm_->UnregisterDumpProvider(&mdp); | 353 mdm_->UnregisterDumpProvider(&mdp); |
| 350 | 354 |
| 351 // Check that requesting dumps with low level of detail actually propagates to | 355 // Check that requesting dumps with low level of detail actually propagates to |
| 352 // OnMemoryDump() call on dump providers. | 356 // OnMemoryDump() call on dump providers. |
| 353 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 357 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 354 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 358 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 355 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 359 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 356 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); | 360 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
| 357 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 361 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 358 MemoryDumpLevelOfDetail::LIGHT); | 362 MemoryDumpLevelOfDetail::LIGHT); |
| 359 DisableTracing(); | 363 DisableTracing(); |
| 360 mdm_->UnregisterDumpProvider(&mdp); | 364 mdm_->UnregisterDumpProvider(&mdp); |
| 361 } | 365 } |
| 362 | 366 |
| 363 // Checks that the SharedSessionState object is acqually shared over time. | 367 // Checks that the SharedSessionState object is acqually shared over time. |
| 364 TEST_F(MemoryDumpManagerTest, SharedSessionState) { | 368 TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
| 365 InitializeMemoryDumpManager(false /* is_coordinator */); | 369 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 366 MockMemoryDumpProvider mdp1; | 370 MockMemoryDumpProvider mdp1; |
| 367 MockMemoryDumpProvider mdp2; | 371 MockMemoryDumpProvider mdp2; |
| 368 RegisterDumpProvider(&mdp1, nullptr); | 372 RegisterDumpProvider(&mdp1, nullptr); |
| 369 RegisterDumpProvider(&mdp2, nullptr); | 373 RegisterDumpProvider(&mdp2, nullptr); |
| 370 | 374 |
| 371 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 375 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 372 const MemoryDumpSessionState* session_state = | 376 const MemoryDumpSessionState* session_state = |
| 373 mdm_->session_state_for_testing().get(); | 377 mdm_->session_state_for_testing().get(); |
| 374 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 378 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(2); |
| 375 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 379 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 376 .Times(2) | 380 .Times(2) |
| 377 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 381 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
| 378 ProcessMemoryDump* pmd) -> bool { | 382 ProcessMemoryDump* pmd) -> bool { |
| 379 EXPECT_EQ(session_state, pmd->session_state().get()); | 383 EXPECT_EQ(session_state, pmd->session_state().get()); |
| 380 return true; | 384 return true; |
| 381 })); | 385 })); |
| 382 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 386 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
| 383 .Times(2) | 387 .Times(2) |
| 384 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 388 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 397 | 401 |
| 398 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. | 402 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
| 399 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { | 403 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
| 400 InitializeMemoryDumpManager(false /* is_coordinator */); | 404 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 401 MockMemoryDumpProvider mdp1; | 405 MockMemoryDumpProvider mdp1; |
| 402 MockMemoryDumpProvider mdp2; | 406 MockMemoryDumpProvider mdp2; |
| 403 | 407 |
| 404 // Enable only mdp1. | 408 // Enable only mdp1. |
| 405 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); | 409 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get()); |
| 406 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 410 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 407 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 411 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 408 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 412 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 409 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 413 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
| 410 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 414 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 411 MemoryDumpLevelOfDetail::DETAILED); | 415 MemoryDumpLevelOfDetail::DETAILED); |
| 412 DisableTracing(); | 416 DisableTracing(); |
| 413 | 417 |
| 414 // Invert: enable mdp1 and disable mdp2. | 418 // Invert: enable mdp1 and disable mdp2. |
| 415 mdm_->UnregisterDumpProvider(&mdp1); | 419 mdm_->UnregisterDumpProvider(&mdp1); |
| 416 RegisterDumpProvider(&mdp2, nullptr); | 420 RegisterDumpProvider(&mdp2, nullptr); |
| 417 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 421 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 418 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 422 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 419 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 423 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
| 420 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 424 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 421 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 425 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 422 MemoryDumpLevelOfDetail::DETAILED); | 426 MemoryDumpLevelOfDetail::DETAILED); |
| 423 DisableTracing(); | 427 DisableTracing(); |
| 424 | 428 |
| 425 // Enable both mdp1 and mdp2. | 429 // Enable both mdp1 and mdp2. |
| 426 RegisterDumpProvider(&mdp1, nullptr); | 430 RegisterDumpProvider(&mdp1, nullptr); |
| 427 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 431 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 428 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 432 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 429 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 433 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 430 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 434 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 431 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 435 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 432 MemoryDumpLevelOfDetail::DETAILED); | 436 MemoryDumpLevelOfDetail::DETAILED); |
| 433 DisableTracing(); | 437 DisableTracing(); |
| 434 } | 438 } |
| 435 | 439 |
| 436 // Checks that the dump provider invocations depend only on the current | 440 // Checks that the dump provider invocations depend only on the current |
| 437 // registration state and not on previous registrations and dumps. | 441 // registration state and not on previous registrations and dumps. |
| 438 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { | 442 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { |
| 439 InitializeMemoryDumpManager(false /* is_coordinator */); | 443 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 440 MockMemoryDumpProvider mdp; | 444 MockMemoryDumpProvider mdp; |
| 441 | 445 |
| 442 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 446 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 443 | 447 |
| 444 { | 448 { |
| 445 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 449 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 446 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 450 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 447 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 451 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 448 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 452 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 449 MemoryDumpLevelOfDetail::DETAILED); | 453 MemoryDumpLevelOfDetail::DETAILED); |
| 450 DisableTracing(); | 454 DisableTracing(); |
| 451 } | 455 } |
| 452 | 456 |
| 453 mdm_->UnregisterDumpProvider(&mdp); | 457 mdm_->UnregisterDumpProvider(&mdp); |
| 454 | 458 |
| 455 { | 459 { |
| 456 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 460 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 457 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 461 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 458 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 462 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 459 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 463 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 460 MemoryDumpLevelOfDetail::DETAILED); | 464 MemoryDumpLevelOfDetail::DETAILED); |
| 461 DisableTracing(); | 465 DisableTracing(); |
| 462 } | 466 } |
| 463 | 467 |
| 464 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 468 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 465 mdm_->UnregisterDumpProvider(&mdp); | 469 mdm_->UnregisterDumpProvider(&mdp); |
| 466 | 470 |
| 467 { | 471 { |
| 468 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 472 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 469 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 473 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 470 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 474 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 471 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 475 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 472 MemoryDumpLevelOfDetail::DETAILED); | 476 MemoryDumpLevelOfDetail::DETAILED); |
| 473 DisableTracing(); | 477 DisableTracing(); |
| 474 } | 478 } |
| 475 | 479 |
| 476 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 480 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 477 mdm_->UnregisterDumpProvider(&mdp); | 481 mdm_->UnregisterDumpProvider(&mdp); |
| 478 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); | 482 RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get()); |
| 479 | 483 |
| 480 { | 484 { |
| 481 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 485 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 482 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 486 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 483 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 487 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 484 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 488 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 485 MemoryDumpLevelOfDetail::DETAILED); | 489 MemoryDumpLevelOfDetail::DETAILED); |
| 486 DisableTracing(); | 490 DisableTracing(); |
| 487 } | 491 } |
| 488 } | 492 } |
| 489 | 493 |
| 490 // Checks that the MemoryDumpManager respects the thread affinity when a | 494 // Checks that the MemoryDumpManager respects the thread affinity when a |
| 491 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 | 495 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 514 .WillRepeatedly(Invoke( | 518 .WillRepeatedly(Invoke( |
| 515 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 519 [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
| 516 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); | 520 EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); |
| 517 return true; | 521 return true; |
| 518 })); | 522 })); |
| 519 } | 523 } |
| 520 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 524 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 521 | 525 |
| 522 while (!threads.empty()) { | 526 while (!threads.empty()) { |
| 523 last_callback_success_ = false; | 527 last_callback_success_ = false; |
| 524 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 528 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 525 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 529 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 526 MemoryDumpLevelOfDetail::DETAILED); | 530 MemoryDumpLevelOfDetail::DETAILED); |
| 527 EXPECT_TRUE(last_callback_success_); | 531 EXPECT_TRUE(last_callback_success_); |
| 528 | 532 |
| 529 // Unregister a MDP and destroy one thread at each iteration to check the | 533 // Unregister a MDP and destroy one thread at each iteration to check the |
| 530 // live unregistration logic. The unregistration needs to happen on the same | 534 // live unregistration logic. The unregistration needs to happen on the same |
| 531 // thread the MDP belongs to. | 535 // thread the MDP belongs to. |
| 532 { | 536 { |
| 533 RunLoop run_loop; | 537 RunLoop run_loop; |
| 534 Closure unregistration = | 538 Closure unregistration = |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 559 RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1, | 563 RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1, |
| 560 kDefaultOptions); | 564 kDefaultOptions); |
| 561 RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2, | 565 RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2, |
| 562 kDefaultOptions); | 566 kDefaultOptions); |
| 563 RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2, | 567 RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2, |
| 564 kDefaultOptions); | 568 kDefaultOptions); |
| 565 // |mdps[0]| should be disabled permanently after first dump. | 569 // |mdps[0]| should be disabled permanently after first dump. |
| 566 EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0); | 570 EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0); |
| 567 EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2); | 571 EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2); |
| 568 EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2); | 572 EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2); |
| 569 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 573 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(2); |
| 570 | 574 |
| 571 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 575 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 572 | 576 |
| 573 task_runner1->set_enabled(false); | 577 task_runner1->set_enabled(false); |
| 574 last_callback_success_ = false; | 578 last_callback_success_ = false; |
| 575 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 579 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 576 MemoryDumpLevelOfDetail::DETAILED); | 580 MemoryDumpLevelOfDetail::DETAILED); |
| 577 // Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong | 581 // Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong |
| 578 // to same task runner. | 582 // to same task runner. |
| 579 EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); | 583 EXPECT_EQ(1u, task_runner1->no_of_post_tasks()); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 595 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { | 599 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
| 596 InitializeMemoryDumpManager(false /* is_coordinator */); | 600 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 597 MockMemoryDumpProvider mdp1; | 601 MockMemoryDumpProvider mdp1; |
| 598 MockMemoryDumpProvider mdp2; | 602 MockMemoryDumpProvider mdp2; |
| 599 | 603 |
| 600 RegisterDumpProvider(&mdp1, nullptr); | 604 RegisterDumpProvider(&mdp1, nullptr); |
| 601 RegisterDumpProvider(&mdp2, nullptr); | 605 RegisterDumpProvider(&mdp2, nullptr); |
| 602 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 606 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 603 | 607 |
| 604 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); | 608 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
| 605 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); | 609 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); |
| 606 | 610 |
| 607 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 611 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 608 .Times(GetMaxConsecutiveFailuresCount()) | 612 .Times(GetMaxConsecutiveFailuresCount()) |
| 609 .WillRepeatedly(Return(false)); | 613 .WillRepeatedly(Return(false)); |
| 610 | 614 |
| 611 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 615 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
| 612 .WillOnce(Return(false)) | 616 .WillOnce(Return(false)) |
| 613 .WillOnce(Return(true)) | 617 .WillOnce(Return(true)) |
| 614 .WillOnce(Return(false)) | 618 .WillOnce(Return(false)) |
| 615 .WillOnce(Return(false)) | 619 .WillOnce(Return(false)) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 627 // Sneakily registers an extra memory dump provider while an existing one is | 631 // Sneakily registers an extra memory dump provider while an existing one is |
| 628 // dumping and expect it to take part in the already active tracing session. | 632 // dumping and expect it to take part in the already active tracing session. |
| 629 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { | 633 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
| 630 InitializeMemoryDumpManager(false /* is_coordinator */); | 634 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 631 MockMemoryDumpProvider mdp1; | 635 MockMemoryDumpProvider mdp1; |
| 632 MockMemoryDumpProvider mdp2; | 636 MockMemoryDumpProvider mdp2; |
| 633 | 637 |
| 634 RegisterDumpProvider(&mdp1, nullptr); | 638 RegisterDumpProvider(&mdp1, nullptr); |
| 635 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 639 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 636 | 640 |
| 637 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 641 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(4); |
| 638 | 642 |
| 639 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 643 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 640 .Times(4) | 644 .Times(4) |
| 641 .WillOnce(Return(true)) | 645 .WillOnce(Return(true)) |
| 642 .WillOnce( | 646 .WillOnce( |
| 643 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 647 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
| 644 RegisterDumpProvider(&mdp2, nullptr); | 648 RegisterDumpProvider(&mdp2, nullptr); |
| 645 return true; | 649 return true; |
| 646 })) | 650 })) |
| 647 .WillRepeatedly(Return(true)); | 651 .WillRepeatedly(Return(true)); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 663 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. | 667 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. |
| 664 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { | 668 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
| 665 InitializeMemoryDumpManager(false /* is_coordinator */); | 669 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 666 MockMemoryDumpProvider mdp1; | 670 MockMemoryDumpProvider mdp1; |
| 667 MockMemoryDumpProvider mdp2; | 671 MockMemoryDumpProvider mdp2; |
| 668 | 672 |
| 669 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get(), kDefaultOptions); | 673 RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get(), kDefaultOptions); |
| 670 RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions); | 674 RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions); |
| 671 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 675 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 672 | 676 |
| 673 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 677 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(4); |
| 674 | 678 |
| 675 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 679 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 676 .Times(4) | 680 .Times(4) |
| 677 .WillOnce(Return(true)) | 681 .WillOnce(Return(true)) |
| 678 .WillOnce( | 682 .WillOnce( |
| 679 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 683 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
| 680 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); | 684 MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2); |
| 681 return true; | 685 return true; |
| 682 })) | 686 })) |
| 683 .WillRepeatedly(Return(true)); | 687 .WillRepeatedly(Return(true)); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 733 | 737 |
| 734 // OnMemoryDump is called once for the provider that dumps first, and zero | 738 // OnMemoryDump is called once for the provider that dumps first, and zero |
| 735 // times for the other provider. | 739 // times for the other provider. |
| 736 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 740 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
| 737 .Times(AtMost(1)) | 741 .Times(AtMost(1)) |
| 738 .WillOnce(Invoke(on_dump)); | 742 .WillOnce(Invoke(on_dump)); |
| 739 } | 743 } |
| 740 | 744 |
| 741 last_callback_success_ = false; | 745 last_callback_success_ = false; |
| 742 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 746 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 743 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 747 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 744 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 748 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 745 MemoryDumpLevelOfDetail::DETAILED); | 749 MemoryDumpLevelOfDetail::DETAILED); |
| 746 ASSERT_EQ(1, on_memory_dump_call_count); | 750 ASSERT_EQ(1, on_memory_dump_call_count); |
| 747 ASSERT_TRUE(last_callback_success_); | 751 ASSERT_TRUE(last_callback_success_); |
| 748 | 752 |
| 749 DisableTracing(); | 753 DisableTracing(); |
| 750 } | 754 } |
| 751 | 755 |
| 752 TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { | 756 TEST_F(MemoryDumpManagerTest, TestPollingOnDumpThread) { |
| 753 InitializeMemoryDumpManager(false /* is_coordinator */); | 757 InitializeMemoryDumpManager(false /* is_coordinator */); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 795 // all polls or in between polls. | 799 // all polls or in between polls. |
| 796 EXPECT_CALL(*mdp2, PollFastMemoryTotal(_)) | 800 EXPECT_CALL(*mdp2, PollFastMemoryTotal(_)) |
| 797 .Times(Between(0, kPollsToQuit - 1)) | 801 .Times(Between(0, kPollsToQuit - 1)) |
| 798 .WillRepeatedly(Return()); | 802 .WillRepeatedly(Return()); |
| 799 | 803 |
| 800 MemoryDumpScheduler::SetPollingIntervalForTesting(1); | 804 MemoryDumpScheduler::SetPollingIntervalForTesting(1); |
| 801 EnableTracingWithTraceConfig( | 805 EnableTracingWithTraceConfig( |
| 802 TraceConfigMemoryTestUtil::GetTraceConfig_PeakDetectionTrigger(3)); | 806 TraceConfigMemoryTestUtil::GetTraceConfig_PeakDetectionTrigger(3)); |
| 803 | 807 |
| 804 int last_poll_to_request_dump = -2; | 808 int last_poll_to_request_dump = -2; |
| 805 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)) | 809 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)) |
| 806 .Times(testing::AtLeast(2)) | 810 .Times(testing::AtLeast(2)) |
| 807 .WillRepeatedly(Invoke([&last_poll_to_request_dump, &call_count]( | 811 .WillRepeatedly(Invoke([&last_poll_to_request_dump, &call_count]( |
| 808 const MemoryDumpRequestArgs& args, | 812 const MemoryDumpRequestArgs& args, |
| 809 const MemoryDumpCallback& callback) -> void { | 813 const MemoryDumpCallback& callback) -> void { |
| 810 // Minimum number of polls between dumps must be 3 (polling interval is | 814 // Minimum number of polls between dumps must be 3 (polling interval is |
| 811 // 1ms). | 815 // 1ms). |
| 812 EXPECT_GE(call_count - last_poll_to_request_dump, 3); | 816 EXPECT_GE(call_count - last_poll_to_request_dump, 3); |
| 813 last_poll_to_request_dump = call_count; | 817 last_poll_to_request_dump = call_count; |
| 814 })); | 818 })); |
| 815 | 819 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 854 | 858 |
| 855 // OnMemoryDump is called once for the provider that dumps first, and zero | 859 // OnMemoryDump is called once for the provider that dumps first, and zero |
| 856 // times for the other provider. | 860 // times for the other provider. |
| 857 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 861 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
| 858 .Times(AtMost(1)) | 862 .Times(AtMost(1)) |
| 859 .WillOnce(Invoke(on_dump)); | 863 .WillOnce(Invoke(on_dump)); |
| 860 } | 864 } |
| 861 | 865 |
| 862 last_callback_success_ = false; | 866 last_callback_success_ = false; |
| 863 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 867 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 864 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 868 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 865 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 869 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 866 MemoryDumpLevelOfDetail::DETAILED); | 870 MemoryDumpLevelOfDetail::DETAILED); |
| 867 ASSERT_EQ(1, on_memory_dump_call_count); | 871 ASSERT_EQ(1, on_memory_dump_call_count); |
| 868 ASSERT_TRUE(last_callback_success_); | 872 ASSERT_TRUE(last_callback_success_); |
| 869 | 873 |
| 870 DisableTracing(); | 874 DisableTracing(); |
| 871 } | 875 } |
| 872 | 876 |
| 873 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when | 877 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
| 874 // tracing is not enabled. | 878 // tracing is not enabled. |
| 875 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { | 879 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
| 876 InitializeMemoryDumpManager(false /* is_coordinator */); | 880 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 877 MockMemoryDumpProvider mdp1; | 881 MockMemoryDumpProvider mdp1; |
| 878 RegisterDumpProvider(&mdp1, nullptr); | 882 RegisterDumpProvider(&mdp1, nullptr); |
| 879 | 883 |
| 880 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 884 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(0); |
| 881 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 885 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
| 882 | 886 |
| 883 last_callback_success_ = true; | 887 last_callback_success_ = true; |
| 884 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 888 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 885 MemoryDumpLevelOfDetail::DETAILED); | 889 MemoryDumpLevelOfDetail::DETAILED); |
| 886 EXPECT_FALSE(last_callback_success_); | 890 EXPECT_FALSE(last_callback_success_); |
| 887 } | 891 } |
| 888 | 892 |
| 889 // Checks that is the MemoryDumpManager is initialized after tracing already | 893 // Checks that is the MemoryDumpManager is initialized after tracing already |
| 890 // began, it will still late-join the party (real use case: startup tracing). | 894 // began, it will still late-join the party (real use case: startup tracing). |
| 891 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { | 895 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
| 892 MockMemoryDumpProvider mdp; | 896 MockMemoryDumpProvider mdp; |
| 893 RegisterDumpProvider(&mdp, nullptr); | 897 RegisterDumpProvider(&mdp, nullptr); |
| 894 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 898 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 895 | 899 |
| 896 // First check that a RequestGlobalDump() issued before the MemoryDumpManager | 900 // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
| 897 // initialization gets NACK-ed cleanly. | 901 // initialization gets NACK-ed cleanly. |
| 898 { | 902 { |
| 899 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 903 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 900 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | |
| 901 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 904 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 902 MemoryDumpLevelOfDetail::DETAILED); | 905 MemoryDumpLevelOfDetail::DETAILED); |
| 903 EXPECT_FALSE(last_callback_success_); | 906 EXPECT_FALSE(last_callback_success_); |
| 904 } | 907 } |
| 905 | 908 |
| 906 // Now late-initialize the MemoryDumpManager and check that the | 909 // Now late-initialize the MemoryDumpManager and check that the |
| 907 // RequestGlobalDump completes successfully. | 910 // RequestGlobalDump completes successfully. |
| 908 { | 911 { |
| 912 InitializeMemoryDumpManager(false /* is_coordinator */); | |
| 909 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); | 913 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); |
| 910 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 914 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 911 InitializeMemoryDumpManager(false /* is_coordinator */); | |
| 912 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 915 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 913 MemoryDumpLevelOfDetail::DETAILED); | 916 MemoryDumpLevelOfDetail::DETAILED); |
| 914 EXPECT_TRUE(last_callback_success_); | 917 EXPECT_TRUE(last_callback_success_); |
| 915 } | 918 } |
| 916 DisableTracing(); | 919 DisableTracing(); |
| 917 } | 920 } |
| 918 | 921 |
| 919 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the | 922 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the |
| 920 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic | 923 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic |
| 921 // dumps in memory-infra, handling gracefully the transition between the legacy | 924 // dumps in memory-infra, handling gracefully the transition between the legacy |
| 922 // and the new-style (JSON-based) TraceConfig. | 925 // and the new-style (JSON-based) TraceConfig. |
| 923 TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { | 926 TEST_F(MemoryDumpManagerTest, TraceConfigExpectations) { |
| 924 InitializeMemoryDumpManager(false /* is_coordinator */); | 927 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 925 MemoryDumpManagerDelegateForTesting& delegate = *delegate_; | 928 MemoryDumpManagerDelegateForTesting& delegate = *delegate_ptr_; |
| 926 | 929 |
| 927 // Don't trigger the default behavior of the mock delegate in this test, | 930 // Don't trigger the default behavior of the mock delegate in this test, |
| 928 // which would short-circuit the dump request to the actual | 931 // which would short-circuit the dump request to the actual |
| 929 // CreateProcessDump(). | 932 // CreateProcessDump(). |
| 930 // We don't want to create any dump in this test, only check whether the dumps | 933 // We don't want to create any dump in this test, only check whether the dumps |
| 931 // are requested or not. | 934 // are requested or not. |
| 932 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); | 935 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); |
| 933 | 936 |
| 934 // Enabling memory-infra in a non-coordinator process should not trigger any | 937 // Enabling memory-infra in a non-coordinator process should not trigger any |
| 935 // periodic dumps. | 938 // periodic dumps. |
| 936 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 939 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 937 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 940 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
| 938 DisableTracing(); | 941 DisableTracing(); |
| 939 | 942 |
| 940 // Enabling memory-infra with the new (JSON) TraceConfig in a non-coordinator | 943 // Enabling memory-infra with the new (JSON) TraceConfig in a non-coordinator |
| 941 // process with a fully defined trigger config should NOT enable any periodic | 944 // process with a fully defined trigger config should NOT enable any periodic |
| 942 // dumps. | 945 // dumps. |
| 943 EnableTracingWithTraceConfig( | 946 EnableTracingWithTraceConfig( |
| 944 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(1, 5)); | 947 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(1, 5)); |
| 945 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 948 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
| 946 DisableTracing(); | 949 DisableTracing(); |
| 947 } | 950 } |
| 948 | 951 |
| 949 TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { | 952 TEST_F(MemoryDumpManagerTest, TraceConfigExpectationsWhenIsCoordinator) { |
| 950 InitializeMemoryDumpManager(true /* is_coordinator */); | 953 InitializeMemoryDumpManager(true /* is_coordinator */); |
| 951 MemoryDumpManagerDelegateForTesting& delegate = *delegate_; | 954 MemoryDumpManagerDelegateForTesting& delegate = *delegate_ptr_; |
| 952 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); | 955 ON_CALL(delegate, RequestGlobalMemoryDump(_, _)).WillByDefault(Return()); |
| 953 | 956 |
| 954 // Enabling memory-infra with the legacy TraceConfig (category filter) in | 957 // Enabling memory-infra with the legacy TraceConfig (category filter) in |
| 955 // a coordinator process should enable periodic dumps. | 958 // a coordinator process should enable periodic dumps. |
| 956 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 959 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 957 EXPECT_TRUE(IsPeriodicDumpingEnabled()); | 960 EXPECT_TRUE(IsPeriodicDumpingEnabled()); |
| 958 DisableTracing(); | 961 DisableTracing(); |
| 959 | 962 |
| 960 // Enabling memory-infra with the new (JSON) TraceConfig in a coordinator | 963 // Enabling memory-infra with the new (JSON) TraceConfig in a coordinator |
| 961 // process without specifying any "memory_dump_config" section should enable | 964 // process without specifying any "memory_dump_config" section should enable |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1022 MockMemoryDumpProvider mdp_with_affinity; | 1025 MockMemoryDumpProvider mdp_with_affinity; |
| 1023 RegisterDumpProvider(&mdp_with_affinity, mdp_thread->task_runner(), | 1026 RegisterDumpProvider(&mdp_with_affinity, mdp_thread->task_runner(), |
| 1024 kDefaultOptions); | 1027 kDefaultOptions); |
| 1025 | 1028 |
| 1026 // Register also an unbound dump provider. Unbound dump providers are always | 1029 // Register also an unbound dump provider. Unbound dump providers are always |
| 1027 // invoked after bound ones. | 1030 // invoked after bound ones. |
| 1028 MockMemoryDumpProvider unbound_mdp; | 1031 MockMemoryDumpProvider unbound_mdp; |
| 1029 RegisterDumpProvider(&unbound_mdp, nullptr, kDefaultOptions); | 1032 RegisterDumpProvider(&unbound_mdp, nullptr, kDefaultOptions); |
| 1030 | 1033 |
| 1031 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1034 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 1032 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1035 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 1033 EXPECT_CALL(mdp_with_affinity, OnMemoryDump(_, _)) | 1036 EXPECT_CALL(mdp_with_affinity, OnMemoryDump(_, _)) |
| 1034 .Times(1) | 1037 .Times(1) |
| 1035 .WillOnce( | 1038 .WillOnce( |
| 1036 Invoke([&tracing_disabled_event](const MemoryDumpArgs&, | 1039 Invoke([&tracing_disabled_event](const MemoryDumpArgs&, |
| 1037 ProcessMemoryDump* pmd) -> bool { | 1040 ProcessMemoryDump* pmd) -> bool { |
| 1038 tracing_disabled_event.Wait(); | 1041 tracing_disabled_event.Wait(); |
| 1039 | 1042 |
| 1040 // At this point tracing has been disabled and the | 1043 // At this point tracing has been disabled and the |
| 1041 // MemoryDumpManager.dump_thread_ has been shut down. | 1044 // MemoryDumpManager.dump_thread_ has been shut down. |
| 1042 return true; | 1045 return true; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1071 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); | 1074 std::unique_ptr<Thread> mdp_thread(new Thread("test thread")); |
| 1072 mdp_thread->Start(); | 1075 mdp_thread->Start(); |
| 1073 | 1076 |
| 1074 // Create both same-thread MDP and another MDP with dedicated thread | 1077 // Create both same-thread MDP and another MDP with dedicated thread |
| 1075 MockMemoryDumpProvider mdp1; | 1078 MockMemoryDumpProvider mdp1; |
| 1076 RegisterDumpProvider(&mdp1, nullptr); | 1079 RegisterDumpProvider(&mdp1, nullptr); |
| 1077 MockMemoryDumpProvider mdp2; | 1080 MockMemoryDumpProvider mdp2; |
| 1078 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); | 1081 RegisterDumpProvider(&mdp2, mdp_thread->task_runner(), kDefaultOptions); |
| 1079 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1082 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 1080 | 1083 |
| 1081 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)) | 1084 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)) |
| 1082 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, | 1085 .WillOnce(Invoke([this](const MemoryDumpRequestArgs& args, |
| 1083 const MemoryDumpCallback& callback) { | 1086 const MemoryDumpCallback& callback) { |
| 1084 DisableTracing(); | 1087 DisableTracing(); |
| 1085 delegate_->CreateProcessDump(args, callback); | 1088 delegate_ptr_->CreateProcessDump(args, callback); |
| 1086 })); | 1089 })); |
| 1087 | 1090 |
| 1088 // If tracing is disabled for current session CreateProcessDump() should NOT | 1091 // If tracing is disabled for current session CreateProcessDump() should NOT |
| 1089 // request dumps from providers. Real-world regression: crbug.com/600570 . | 1092 // request dumps from providers. Real-world regression: crbug.com/600570 . |
| 1090 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 1093 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
| 1091 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 1094 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
| 1092 | 1095 |
| 1093 last_callback_success_ = true; | 1096 last_callback_success_ = true; |
| 1094 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1097 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 1095 MemoryDumpLevelOfDetail::DETAILED); | 1098 MemoryDumpLevelOfDetail::DETAILED); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1110 MockMemoryDumpProvider mdp2; | 1113 MockMemoryDumpProvider mdp2; |
| 1111 options.target_pid = 123; | 1114 options.target_pid = 123; |
| 1112 RegisterDumpProvider(&mdp2, nullptr, options); | 1115 RegisterDumpProvider(&mdp2, nullptr, options); |
| 1113 | 1116 |
| 1114 // Another provider with out-of-process dumping. | 1117 // Another provider with out-of-process dumping. |
| 1115 MockMemoryDumpProvider mdp3; | 1118 MockMemoryDumpProvider mdp3; |
| 1116 options.target_pid = 456; | 1119 options.target_pid = 456; |
| 1117 RegisterDumpProvider(&mdp3, nullptr, options); | 1120 RegisterDumpProvider(&mdp3, nullptr, options); |
| 1118 | 1121 |
| 1119 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1122 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 1120 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1123 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 1121 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1124 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
| 1122 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1125 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
| 1123 EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); | 1126 EXPECT_CALL(mdp3, OnMemoryDump(_, _)).Times(1).WillRepeatedly(Return(true)); |
| 1124 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1127 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 1125 MemoryDumpLevelOfDetail::DETAILED); | 1128 MemoryDumpLevelOfDetail::DETAILED); |
| 1126 DisableTracing(); | 1129 DisableTracing(); |
| 1127 | 1130 |
| 1128 // Flush the trace into JSON. | 1131 // Flush the trace into JSON. |
| 1129 trace_event::TraceResultBuffer buffer; | 1132 trace_event::TraceResultBuffer buffer; |
| 1130 TraceResultBuffer::SimpleOutput trace_output; | 1133 TraceResultBuffer::SimpleOutput trace_output; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1204 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) | 1207 EXPECT_CALL(*mdp, OnMemoryDump(_, _)) |
| 1205 .Times(1) | 1208 .Times(1) |
| 1206 .WillOnce(Invoke(self_unregister_from_another_thread)); | 1209 .WillOnce(Invoke(self_unregister_from_another_thread)); |
| 1207 EXPECT_CALL(*mdp, Destructor()) | 1210 EXPECT_CALL(*mdp, Destructor()) |
| 1208 .Times(1) | 1211 .Times(1) |
| 1209 .WillOnce(Invoke([&thread_ref]() { | 1212 .WillOnce(Invoke([&thread_ref]() { |
| 1210 EXPECT_EQ(thread_ref, PlatformThread::CurrentRef()); | 1213 EXPECT_EQ(thread_ref, PlatformThread::CurrentRef()); |
| 1211 })); | 1214 })); |
| 1212 | 1215 |
| 1213 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1216 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 1214 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 1217 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(2); |
| 1215 for (int i = 0; i < 2; ++i) { | 1218 for (int i = 0; i < 2; ++i) { |
| 1216 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1219 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 1217 MemoryDumpLevelOfDetail::DETAILED); | 1220 MemoryDumpLevelOfDetail::DETAILED); |
| 1218 } | 1221 } |
| 1219 DisableTracing(); | 1222 DisableTracing(); |
| 1220 } | 1223 } |
| 1221 | 1224 |
| 1222 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { | 1225 TEST_F(MemoryDumpManagerTest, TestWhitelistingMDP) { |
| 1223 InitializeMemoryDumpManager(false /* is_coordinator */); | 1226 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 1224 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); | 1227 SetDumpProviderWhitelistForTesting(kTestMDPWhitelist); |
| 1225 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); | 1228 std::unique_ptr<MockMemoryDumpProvider> mdp1(new MockMemoryDumpProvider); |
| 1226 RegisterDumpProvider(mdp1.get(), nullptr); | 1229 RegisterDumpProvider(mdp1.get(), nullptr); |
| 1227 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); | 1230 std::unique_ptr<MockMemoryDumpProvider> mdp2(new MockMemoryDumpProvider); |
| 1228 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, | 1231 RegisterDumpProvider(mdp2.get(), nullptr, kDefaultOptions, |
| 1229 kWhitelistedMDPName); | 1232 kWhitelistedMDPName); |
| 1230 | 1233 |
| 1231 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); | 1234 EXPECT_CALL(*mdp1, OnMemoryDump(_, _)).Times(0); |
| 1232 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); | 1235 EXPECT_CALL(*mdp2, OnMemoryDump(_, _)).Times(1).WillOnce(Return(true)); |
| 1233 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 1236 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 1234 | 1237 |
| 1235 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 1238 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 1236 EXPECT_FALSE(IsPeriodicDumpingEnabled()); | 1239 EXPECT_FALSE(IsPeriodicDumpingEnabled()); |
| 1237 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1240 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 1238 MemoryDumpLevelOfDetail::BACKGROUND); | 1241 MemoryDumpLevelOfDetail::BACKGROUND); |
| 1239 DisableTracing(); | 1242 DisableTracing(); |
| 1240 } | 1243 } |
| 1241 | 1244 |
| 1242 TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { | 1245 TEST_F(MemoryDumpManagerTest, TestBackgroundTracingSetup) { |
| 1243 InitializeMemoryDumpManager(true /* is_coordinator */); | 1246 InitializeMemoryDumpManager(true /* is_coordinator */); |
| 1244 | 1247 |
| 1245 RunLoop run_loop; | 1248 RunLoop run_loop; |
| 1246 auto quit_closure = run_loop.QuitClosure(); | 1249 auto quit_closure = run_loop.QuitClosure(); |
| 1247 | 1250 |
| 1248 testing::InSequence sequence; | 1251 testing::InSequence sequence; |
| 1249 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) | 1252 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
| 1250 .Times(5); | 1253 .Times(5); |
| 1251 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) | 1254 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(IsBackgroundDump(), _)) |
| 1252 .WillOnce(Invoke([quit_closure](const MemoryDumpRequestArgs& args, | 1255 .WillOnce(Invoke([quit_closure](const MemoryDumpRequestArgs& args, |
| 1253 const MemoryDumpCallback& callback) { | 1256 const MemoryDumpCallback& callback) { |
| 1254 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure); | 1257 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure); |
| 1255 })); | 1258 })); |
| 1256 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); | 1259 EXPECT_CALL(*delegate_ptr_, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); |
| 1257 | 1260 |
| 1258 EnableTracingWithTraceConfig( | 1261 EnableTracingWithTraceConfig( |
| 1259 TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger( | 1262 TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger( |
| 1260 1 /* period_ms */)); | 1263 1 /* period_ms */)); |
| 1261 | 1264 |
| 1262 // Only background mode dumps should be allowed with the trace config. | 1265 // Only background mode dumps should be allowed with the trace config. |
| 1263 last_callback_success_ = false; | 1266 last_callback_success_ = false; |
| 1264 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 1267 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 1265 MemoryDumpLevelOfDetail::LIGHT); | 1268 MemoryDumpLevelOfDetail::LIGHT); |
| 1266 EXPECT_FALSE(last_callback_success_); | 1269 EXPECT_FALSE(last_callback_success_); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1286 thread.Start(); | 1289 thread.Start(); |
| 1287 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, | 1290 RegisterDumpProvider(&mdp1, thread.task_runner(), kDefaultOptions, |
| 1288 "BlacklistTestDumpProvider"); | 1291 "BlacklistTestDumpProvider"); |
| 1289 // Unregistering on wrong thread should not crash. | 1292 // Unregistering on wrong thread should not crash. |
| 1290 mdm_->UnregisterDumpProvider(&mdp1); | 1293 mdm_->UnregisterDumpProvider(&mdp1); |
| 1291 thread.Stop(); | 1294 thread.Stop(); |
| 1292 } | 1295 } |
| 1293 | 1296 |
| 1294 } // namespace trace_event | 1297 } // namespace trace_event |
| 1295 } // namespace base | 1298 } // namespace base |
| OLD | NEW |