| 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 <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 void RegisterDumpProvider( | 50 void RegisterDumpProvider( |
| 51 MemoryDumpProvider* mdp, | 51 MemoryDumpProvider* mdp, |
| 52 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 52 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 53 const MemoryDumpProvider::Options& options) { | 53 const MemoryDumpProvider::Options& options) { |
| 54 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); | 54 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); |
| 55 mdm->set_dumper_registrations_ignored_for_testing(false); | 55 mdm->set_dumper_registrations_ignored_for_testing(false); |
| 56 mdm->RegisterDumpProvider(mdp, "TestDumpProvider", task_runner, options); | 56 mdm->RegisterDumpProvider(mdp, "TestDumpProvider", task_runner, options); |
| 57 mdm->set_dumper_registrations_ignored_for_testing(true); | 57 mdm->set_dumper_registrations_ignored_for_testing(true); |
| 58 } | 58 } |
| 59 | 59 |
| 60 void RegisterDumpProvider(MemoryDumpProvider* mdp) { | 60 void RegisterDumpProviderOnCurrentThread(MemoryDumpProvider* mdp) { |
| 61 RegisterDumpProvider(mdp, nullptr, MemoryDumpProvider::Options()); | 61 RegisterDumpProvider(mdp, ThreadTaskRunnerHandle::Get(), |
| 62 MemoryDumpProvider::Options()); |
| 62 } | 63 } |
| 63 | 64 |
| 64 void OnTraceDataCollected(Closure quit_closure, | 65 void OnTraceDataCollected(Closure quit_closure, |
| 65 trace_event::TraceResultBuffer* buffer, | 66 trace_event::TraceResultBuffer* buffer, |
| 66 const scoped_refptr<RefCountedString>& json, | 67 const scoped_refptr<RefCountedString>& json, |
| 67 bool has_more_events) { | 68 bool has_more_events) { |
| 68 buffer->AddFragment(json->data()); | 69 buffer->AddFragment(json->data()); |
| 69 if (!has_more_events) | 70 if (!has_more_events) |
| 70 quit_closure.Run(); | 71 quit_closure.Run(); |
| 71 } | 72 } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 | 185 |
| 185 // We want our singleton torn down after each test. | 186 // We want our singleton torn down after each test. |
| 186 ShadowingAtExitManager at_exit_manager_; | 187 ShadowingAtExitManager at_exit_manager_; |
| 187 }; | 188 }; |
| 188 | 189 |
| 189 // Basic sanity checks. Registers a memory dump provider and checks that it is | 190 // Basic sanity checks. Registers a memory dump provider and checks that it is |
| 190 // called, but only when memory-infra is enabled. | 191 // called, but only when memory-infra is enabled. |
| 191 TEST_F(MemoryDumpManagerTest, SingleDumper) { | 192 TEST_F(MemoryDumpManagerTest, SingleDumper) { |
| 192 InitializeMemoryDumpManager(false /* is_coordinator */); | 193 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 193 MockMemoryDumpProvider mdp; | 194 MockMemoryDumpProvider mdp; |
| 194 RegisterDumpProvider(&mdp); | 195 RegisterDumpProviderOnCurrentThread(&mdp); |
| 195 | 196 |
| 196 // Check that the dumper is not called if the memory category is not enabled. | 197 // Check that the dumper is not called if the memory category is not enabled. |
| 197 EnableTracingWithLegacyCategories("foobar-but-not-memory"); | 198 EnableTracingWithLegacyCategories("foobar-but-not-memory"); |
| 198 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 199 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
| 199 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 200 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 200 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 201 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 201 MemoryDumpLevelOfDetail::DETAILED); | 202 MemoryDumpLevelOfDetail::DETAILED); |
| 202 DisableTracing(); | 203 DisableTracing(); |
| 203 | 204 |
| 204 // Now repeat enabling the memory category and check that the dumper is | 205 // Now repeat enabling the memory category and check that the dumper is |
| (...skipping 20 matching lines...) Expand all Loading... |
| 225 } | 226 } |
| 226 DisableTracing(); | 227 DisableTracing(); |
| 227 } | 228 } |
| 228 | 229 |
| 229 // Checks that requesting dumps with high level of detail actually propagates | 230 // Checks that requesting dumps with high level of detail actually propagates |
| 230 // the level of the detail properly to OnMemoryDump() call on dump providers. | 231 // the level of the detail properly to OnMemoryDump() call on dump providers. |
| 231 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { | 232 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
| 232 InitializeMemoryDumpManager(false /* is_coordinator */); | 233 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 233 MockMemoryDumpProvider mdp; | 234 MockMemoryDumpProvider mdp; |
| 234 | 235 |
| 235 RegisterDumpProvider(&mdp); | 236 RegisterDumpProviderOnCurrentThread(&mdp); |
| 236 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 237 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 237 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 238 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 238 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); | 239 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
| 239 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 240 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 240 MemoryDumpLevelOfDetail::DETAILED); | 241 MemoryDumpLevelOfDetail::DETAILED); |
| 241 DisableTracing(); | 242 DisableTracing(); |
| 242 mdm_->UnregisterDumpProvider(&mdp); | 243 mdm_->UnregisterDumpProvider(&mdp); |
| 243 | 244 |
| 244 // Check that requesting dumps with low level of detail actually propagates to | 245 // Check that requesting dumps with low level of detail actually propagates to |
| 245 // OnMemoryDump() call on dump providers. | 246 // OnMemoryDump() call on dump providers. |
| 246 RegisterDumpProvider(&mdp); | 247 RegisterDumpProviderOnCurrentThread(&mdp); |
| 247 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 248 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 248 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 249 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 249 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); | 250 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
| 250 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 251 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 251 MemoryDumpLevelOfDetail::LIGHT); | 252 MemoryDumpLevelOfDetail::LIGHT); |
| 252 DisableTracing(); | 253 DisableTracing(); |
| 253 mdm_->UnregisterDumpProvider(&mdp); | 254 mdm_->UnregisterDumpProvider(&mdp); |
| 254 } | 255 } |
| 255 | 256 |
| 256 // Checks that the SharedSessionState object is acqually shared over time. | 257 // Checks that the SharedSessionState object is acqually shared over time. |
| 257 TEST_F(MemoryDumpManagerTest, SharedSessionState) { | 258 TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
| 258 InitializeMemoryDumpManager(false /* is_coordinator */); | 259 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 259 MockMemoryDumpProvider mdp1; | 260 MockMemoryDumpProvider mdp1; |
| 260 MockMemoryDumpProvider mdp2; | 261 MockMemoryDumpProvider mdp2; |
| 261 RegisterDumpProvider(&mdp1); | 262 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 262 RegisterDumpProvider(&mdp2); | 263 RegisterDumpProviderOnCurrentThread(&mdp2); |
| 263 | 264 |
| 264 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 265 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 265 const MemoryDumpSessionState* session_state = mdm_->session_state().get(); | 266 const MemoryDumpSessionState* session_state = mdm_->session_state().get(); |
| 266 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 267 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); |
| 267 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 268 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 268 .Times(2) | 269 .Times(2) |
| 269 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 270 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
| 270 ProcessMemoryDump* pmd) -> bool { | 271 ProcessMemoryDump* pmd) -> bool { |
| 271 EXPECT_EQ(session_state, pmd->session_state().get()); | 272 EXPECT_EQ(session_state, pmd->session_state().get()); |
| 272 return true; | 273 return true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 287 DisableTracing(); | 288 DisableTracing(); |
| 288 } | 289 } |
| 289 | 290 |
| 290 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. | 291 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
| 291 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { | 292 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
| 292 InitializeMemoryDumpManager(false /* is_coordinator */); | 293 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 293 MockMemoryDumpProvider mdp1; | 294 MockMemoryDumpProvider mdp1; |
| 294 MockMemoryDumpProvider mdp2; | 295 MockMemoryDumpProvider mdp2; |
| 295 | 296 |
| 296 // Enable only mdp1. | 297 // Enable only mdp1. |
| 297 RegisterDumpProvider(&mdp1); | 298 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 298 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 299 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 299 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 300 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 300 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 301 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 301 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 302 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
| 302 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 303 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 303 MemoryDumpLevelOfDetail::DETAILED); | 304 MemoryDumpLevelOfDetail::DETAILED); |
| 304 DisableTracing(); | 305 DisableTracing(); |
| 305 | 306 |
| 306 // Invert: enable mdp1 and disable mdp2. | 307 // Invert: enable mdp1 and disable mdp2. |
| 307 mdm_->UnregisterDumpProvider(&mdp1); | 308 mdm_->UnregisterDumpProvider(&mdp1); |
| 308 RegisterDumpProvider(&mdp2); | 309 RegisterDumpProviderOnCurrentThread(&mdp2); |
| 309 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 310 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 310 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 311 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 311 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 312 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
| 312 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 313 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 313 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 314 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 314 MemoryDumpLevelOfDetail::DETAILED); | 315 MemoryDumpLevelOfDetail::DETAILED); |
| 315 DisableTracing(); | 316 DisableTracing(); |
| 316 | 317 |
| 317 // Enable both mdp1 and mdp2. | 318 // Enable both mdp1 and mdp2. |
| 318 RegisterDumpProvider(&mdp1); | 319 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 319 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 320 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 320 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 321 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 321 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 322 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 322 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 323 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 323 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 324 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 324 MemoryDumpLevelOfDetail::DETAILED); | 325 MemoryDumpLevelOfDetail::DETAILED); |
| 325 DisableTracing(); | 326 DisableTracing(); |
| 326 } | 327 } |
| 327 | 328 |
| 328 // Checks that the dump provider invocations depend only on the current | 329 // Checks that the dump provider invocations depend only on the current |
| 329 // registration state and not on previous registrations and dumps. | 330 // registration state and not on previous registrations and dumps. |
| 330 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { | 331 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { |
| 331 InitializeMemoryDumpManager(false /* is_coordinator */); | 332 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 332 MockMemoryDumpProvider mdp; | 333 MockMemoryDumpProvider mdp; |
| 333 | 334 |
| 334 RegisterDumpProvider(&mdp); | 335 RegisterDumpProviderOnCurrentThread(&mdp); |
| 335 | 336 |
| 336 { | 337 { |
| 337 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 338 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 338 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 339 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 339 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 340 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 340 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 341 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 341 MemoryDumpLevelOfDetail::DETAILED); | 342 MemoryDumpLevelOfDetail::DETAILED); |
| 342 DisableTracing(); | 343 DisableTracing(); |
| 343 } | 344 } |
| 344 | 345 |
| 345 mdm_->UnregisterDumpProvider(&mdp); | 346 mdm_->UnregisterDumpProvider(&mdp); |
| 346 | 347 |
| 347 { | 348 { |
| 348 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 349 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 349 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 350 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 350 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 351 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 351 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 352 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 352 MemoryDumpLevelOfDetail::DETAILED); | 353 MemoryDumpLevelOfDetail::DETAILED); |
| 353 DisableTracing(); | 354 DisableTracing(); |
| 354 } | 355 } |
| 355 | 356 |
| 356 RegisterDumpProvider(&mdp); | 357 RegisterDumpProviderOnCurrentThread(&mdp); |
| 357 mdm_->UnregisterDumpProvider(&mdp); | 358 mdm_->UnregisterDumpProvider(&mdp); |
| 358 | 359 |
| 359 { | 360 { |
| 360 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 361 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 361 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 362 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 362 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 363 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 363 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 364 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 364 MemoryDumpLevelOfDetail::DETAILED); | 365 MemoryDumpLevelOfDetail::DETAILED); |
| 365 DisableTracing(); | 366 DisableTracing(); |
| 366 } | 367 } |
| 367 | 368 |
| 368 RegisterDumpProvider(&mdp); | 369 RegisterDumpProviderOnCurrentThread(&mdp); |
| 369 mdm_->UnregisterDumpProvider(&mdp); | 370 mdm_->UnregisterDumpProvider(&mdp); |
| 370 RegisterDumpProvider(&mdp); | 371 RegisterDumpProviderOnCurrentThread(&mdp); |
| 371 | 372 |
| 372 { | 373 { |
| 373 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 374 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
| 374 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 375 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
| 375 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 376 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 376 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 377 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 377 MemoryDumpLevelOfDetail::DETAILED); | 378 MemoryDumpLevelOfDetail::DETAILED); |
| 378 DisableTracing(); | 379 DisableTracing(); |
| 379 } | 380 } |
| 380 } | 381 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 DisableTracing(); | 439 DisableTracing(); |
| 439 } | 440 } |
| 440 | 441 |
| 441 // Checks that providers get disabled after 3 consecutive failures, but not | 442 // Checks that providers get disabled after 3 consecutive failures, but not |
| 442 // otherwise (e.g., if interleaved). | 443 // otherwise (e.g., if interleaved). |
| 443 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { | 444 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { |
| 444 InitializeMemoryDumpManager(false /* is_coordinator */); | 445 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 445 MockMemoryDumpProvider mdp1; | 446 MockMemoryDumpProvider mdp1; |
| 446 MockMemoryDumpProvider mdp2; | 447 MockMemoryDumpProvider mdp2; |
| 447 | 448 |
| 448 RegisterDumpProvider(&mdp1); | 449 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 449 RegisterDumpProvider(&mdp2); | 450 RegisterDumpProviderOnCurrentThread(&mdp2); |
| 450 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 451 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 451 | 452 |
| 452 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); | 453 const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount(); |
| 453 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); | 454 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(kNumDumps); |
| 454 | 455 |
| 455 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 456 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 456 .Times(GetMaxConsecutiveFailuresCount()) | 457 .Times(GetMaxConsecutiveFailuresCount()) |
| 457 .WillRepeatedly(Return(false)); | 458 .WillRepeatedly(Return(false)); |
| 458 | 459 |
| 459 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 460 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 472 DisableTracing(); | 473 DisableTracing(); |
| 473 } | 474 } |
| 474 | 475 |
| 475 // Sneakily registers an extra memory dump provider while an existing one is | 476 // Sneakily registers an extra memory dump provider while an existing one is |
| 476 // dumping and expect it to take part in the already active tracing session. | 477 // dumping and expect it to take part in the already active tracing session. |
| 477 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { | 478 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
| 478 InitializeMemoryDumpManager(false /* is_coordinator */); | 479 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 479 MockMemoryDumpProvider mdp1; | 480 MockMemoryDumpProvider mdp1; |
| 480 MockMemoryDumpProvider mdp2; | 481 MockMemoryDumpProvider mdp2; |
| 481 | 482 |
| 482 RegisterDumpProvider(&mdp1); | 483 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 483 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 484 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 484 | 485 |
| 485 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); | 486 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(4); |
| 486 | 487 |
| 487 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) | 488 EXPECT_CALL(mdp1, OnMemoryDump(_, _)) |
| 488 .Times(4) | 489 .Times(4) |
| 489 .WillOnce(Return(true)) | 490 .WillOnce(Return(true)) |
| 490 .WillOnce( | 491 .WillOnce( |
| 491 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { | 492 Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool { |
| 492 RegisterDumpProvider(&mdp2); | 493 RegisterDumpProviderOnCurrentThread(&mdp2); |
| 493 return true; | 494 return true; |
| 494 })) | 495 })) |
| 495 .WillRepeatedly(Return(true)); | 496 .WillRepeatedly(Return(true)); |
| 496 | 497 |
| 497 // Depending on the insertion order (before or after mdp1), mdp2 might be | 498 // Depending on the insertion order (before or after mdp1), mdp2 might be |
| 498 // called also immediately after it gets registered. | 499 // called also immediately after it gets registered. |
| 499 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 500 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
| 500 .Times(Between(2, 3)) | 501 .Times(Between(2, 3)) |
| 501 .WillRepeatedly(Return(true)); | 502 .WillRepeatedly(Return(true)); |
| 502 | 503 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 ASSERT_TRUE(last_callback_success_); | 640 ASSERT_TRUE(last_callback_success_); |
| 640 | 641 |
| 641 DisableTracing(); | 642 DisableTracing(); |
| 642 } | 643 } |
| 643 | 644 |
| 644 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when | 645 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
| 645 // tracing is not enabled. | 646 // tracing is not enabled. |
| 646 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { | 647 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
| 647 InitializeMemoryDumpManager(false /* is_coordinator */); | 648 InitializeMemoryDumpManager(false /* is_coordinator */); |
| 648 MockMemoryDumpProvider mdp1; | 649 MockMemoryDumpProvider mdp1; |
| 649 RegisterDumpProvider(&mdp1); | 650 RegisterDumpProviderOnCurrentThread(&mdp1); |
| 650 | 651 |
| 651 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 652 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
| 652 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 653 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
| 653 | 654 |
| 654 last_callback_success_ = true; | 655 last_callback_success_ = true; |
| 655 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 656 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 656 MemoryDumpLevelOfDetail::DETAILED); | 657 MemoryDumpLevelOfDetail::DETAILED); |
| 657 EXPECT_FALSE(last_callback_success_); | 658 EXPECT_FALSE(last_callback_success_); |
| 658 } | 659 } |
| 659 | 660 |
| 660 // Checks that is the MemoryDumpManager is initialized after tracing already | 661 // Checks that is the MemoryDumpManager is initialized after tracing already |
| 661 // began, it will still late-join the party (real use case: startup tracing). | 662 // began, it will still late-join the party (real use case: startup tracing). |
| 662 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { | 663 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
| 663 MockMemoryDumpProvider mdp; | 664 MockMemoryDumpProvider mdp; |
| 664 RegisterDumpProvider(&mdp); | 665 RegisterDumpProviderOnCurrentThread(&mdp); |
| 665 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 666 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
| 666 | 667 |
| 667 // First check that a RequestGlobalDump() issued before the MemoryDumpManager | 668 // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
| 668 // initialization gets NACK-ed cleanly. | 669 // initialization gets NACK-ed cleanly. |
| 669 { | 670 { |
| 670 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 671 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
| 671 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 672 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
| 672 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 673 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 673 MemoryDumpLevelOfDetail::DETAILED); | 674 MemoryDumpLevelOfDetail::DETAILED); |
| 674 EXPECT_FALSE(last_callback_success_); | 675 EXPECT_FALSE(last_callback_success_); |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); | 950 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); |
| 950 for (int i = 0; i < 2; ++i) { | 951 for (int i = 0; i < 2; ++i) { |
| 951 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, | 952 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, |
| 952 MemoryDumpLevelOfDetail::DETAILED); | 953 MemoryDumpLevelOfDetail::DETAILED); |
| 953 } | 954 } |
| 954 DisableTracing(); | 955 DisableTracing(); |
| 955 } | 956 } |
| 956 | 957 |
| 957 } // namespace trace_event | 958 } // namespace trace_event |
| 958 } // namespace base | 959 } // namespace base |
| OLD | NEW |