| 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 "components/metrics/call_stack_profile_metrics_provider.h" | 5 #include "components/metrics/call_stack_profile_metrics_provider.h" |
| 6 | 6 |
| 7 #include "base/metrics/call_stack_profile_params.h" | 7 #include "base/metrics/call_stack_profile_params.h" |
| 8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" |
| 9 #include "base/profiler/stack_sampling_profiler.h" | 9 #include "base/profiler/stack_sampling_profiler.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 | 59 |
| 60 // Checks that all properties from multiple profiles are filled as expected. | 60 // Checks that all properties from multiple profiles are filled as expected. |
| 61 TEST_F(CallStackProfileMetricsProviderTest, MultipleProfiles) { | 61 TEST_F(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
| 62 const uintptr_t module1_base_address = 0x1000; | 62 const uintptr_t module1_base_address = 0x1000; |
| 63 const uintptr_t module2_base_address = 0x2000; | 63 const uintptr_t module2_base_address = 0x2000; |
| 64 const uintptr_t module3_base_address = 0x3000; | 64 const uintptr_t module3_base_address = 0x3000; |
| 65 | 65 |
| 66 const Module profile_modules[][2] = { | 66 const Module profile_modules[][2] = { |
| 67 { | 67 { |
| 68 Module( | 68 Module( |
| 69 reinterpret_cast<const void*>(module1_base_address), | 69 (module1_base_address), |
| 70 "ABCD", | 70 "ABCD", |
| 71 #if defined(OS_WIN) | 71 #if defined(OS_WIN) |
| 72 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") | 72 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") |
| 73 #else | 73 #else |
| 74 base::FilePath("/some/path/to/chrome") | 74 base::FilePath("/some/path/to/chrome") |
| 75 #endif | 75 #endif |
| 76 ), | 76 ), |
| 77 Module( | 77 Module( |
| 78 reinterpret_cast<const void*>(module2_base_address), | 78 (module2_base_address), |
| 79 "EFGH", | 79 "EFGH", |
| 80 #if defined(OS_WIN) | 80 #if defined(OS_WIN) |
| 81 base::FilePath(L"c:\\some\\path\\to\\third_party.dll") | 81 base::FilePath(L"c:\\some\\path\\to\\third_party.dll") |
| 82 #else | 82 #else |
| 83 base::FilePath("/some/path/to/third_party.so") | 83 base::FilePath("/some/path/to/third_party.so") |
| 84 #endif | 84 #endif |
| 85 ), | 85 ), |
| 86 }, | 86 }, |
| 87 { | 87 { |
| 88 Module( | 88 Module( |
| 89 reinterpret_cast<const void*>(module3_base_address), | 89 (module3_base_address), |
| 90 "MNOP", | 90 "MNOP", |
| 91 #if defined(OS_WIN) | 91 #if defined(OS_WIN) |
| 92 base::FilePath(L"c:\\some\\path\\to\\third_party2.dll") | 92 base::FilePath(L"c:\\some\\path\\to\\third_party2.dll") |
| 93 #else | 93 #else |
| 94 base::FilePath("/some/path/to/third_party2.so") | 94 base::FilePath("/some/path/to/third_party2.so") |
| 95 #endif | 95 #endif |
| 96 ), | 96 ), |
| 97 Module( // Repeated from the first profile. | 97 Module( // Repeated from the first profile. |
| 98 reinterpret_cast<const void*>(module1_base_address), | 98 (module1_base_address), |
| 99 "ABCD", | 99 "ABCD", |
| 100 #if defined(OS_WIN) | 100 #if defined(OS_WIN) |
| 101 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") | 101 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") |
| 102 #else | 102 #else |
| 103 base::FilePath("/some/path/to/chrome") | 103 base::FilePath("/some/path/to/chrome") |
| 104 #endif | 104 #endif |
| 105 ) | 105 ) |
| 106 } | 106 } |
| 107 }; | 107 }; |
| 108 | 108 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 // module index corresponding to the module for the profile in | 141 // module index corresponding to the module for the profile in |
| 142 // profile_modules. | 142 // profile_modules. |
| 143 // | 143 // |
| 144 // So, the first stack sample below has its top frame in module 0 at an offset | 144 // So, the first stack sample below has its top frame in module 0 at an offset |
| 145 // of 0x10 from the module's base address, the next-to-top frame in module 1 | 145 // of 0x10 from the module's base address, the next-to-top frame in module 1 |
| 146 // at an offset of 0x20 from the module's base address, and the bottom frame | 146 // at an offset of 0x20 from the module's base address, and the bottom frame |
| 147 // in module 0 at an offset of 0x30 from the module's base address | 147 // in module 0 at an offset of 0x30 from the module's base address |
| 148 const Frame profile_sample_frames[][2][3] = { | 148 const Frame profile_sample_frames[][2][3] = { |
| 149 { | 149 { |
| 150 { | 150 { |
| 151 Frame(reinterpret_cast<const void*>(module1_base_address + 0x10), 0), | 151 Frame((module1_base_address + 0x10), 0), |
| 152 Frame(reinterpret_cast<const void*>(module2_base_address + 0x20), 1), | 152 Frame((module2_base_address + 0x20), 1), |
| 153 Frame(reinterpret_cast<const void*>(module1_base_address + 0x30), 0) | 153 Frame((module1_base_address + 0x30), 0) |
| 154 }, | 154 }, |
| 155 { | 155 { |
| 156 Frame(reinterpret_cast<const void*>(module2_base_address + 0x10), 1), | 156 Frame((module2_base_address + 0x10), 1), |
| 157 Frame(reinterpret_cast<const void*>(module1_base_address + 0x20), 0), | 157 Frame((module1_base_address + 0x20), 0), |
| 158 Frame(reinterpret_cast<const void*>(module2_base_address + 0x30), 1) | 158 Frame((module2_base_address + 0x30), 1) |
| 159 } | 159 } |
| 160 }, | 160 }, |
| 161 { | 161 { |
| 162 { | 162 { |
| 163 Frame(reinterpret_cast<const void*>(module3_base_address + 0x10), 0), | 163 Frame((module3_base_address + 0x10), 0), |
| 164 Frame(reinterpret_cast<const void*>(module1_base_address + 0x20), 1), | 164 Frame((module1_base_address + 0x20), 1), |
| 165 Frame(reinterpret_cast<const void*>(module3_base_address + 0x30), 0) | 165 Frame((module3_base_address + 0x30), 0) |
| 166 }, | 166 }, |
| 167 { | 167 { |
| 168 Frame(reinterpret_cast<const void*>(module1_base_address + 0x10), 1), | 168 Frame((module1_base_address + 0x10), 1), |
| 169 Frame(reinterpret_cast<const void*>(module3_base_address + 0x20), 0), | 169 Frame((module3_base_address + 0x20), 0), |
| 170 Frame(reinterpret_cast<const void*>(module1_base_address + 0x30), 1) | 170 Frame((module1_base_address + 0x30), 1) |
| 171 } | 171 } |
| 172 } | 172 } |
| 173 }; | 173 }; |
| 174 | 174 |
| 175 base::TimeDelta profile_durations[2] = { | 175 base::TimeDelta profile_durations[2] = { |
| 176 base::TimeDelta::FromMilliseconds(100), | 176 base::TimeDelta::FromMilliseconds(100), |
| 177 base::TimeDelta::FromMilliseconds(200) | 177 base::TimeDelta::FromMilliseconds(200) |
| 178 }; | 178 }; |
| 179 | 179 |
| 180 base::TimeDelta profile_sampling_periods[2] = { | 180 base::TimeDelta profile_sampling_periods[2] = { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 } | 269 } |
| 270 } | 270 } |
| 271 | 271 |
| 272 // Checks that all duplicate samples are collapsed with | 272 // Checks that all duplicate samples are collapsed with |
| 273 // preserve_sample_ordering = false. | 273 // preserve_sample_ordering = false. |
| 274 TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { | 274 TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
| 275 const uintptr_t module_base_address = 0x1000; | 275 const uintptr_t module_base_address = 0x1000; |
| 276 | 276 |
| 277 const Module modules[] = { | 277 const Module modules[] = { |
| 278 Module( | 278 Module( |
| 279 reinterpret_cast<const void*>(module_base_address), | 279 (module_base_address), |
| 280 "ABCD", | 280 "ABCD", |
| 281 #if defined(OS_WIN) | 281 #if defined(OS_WIN) |
| 282 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") | 282 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") |
| 283 #else | 283 #else |
| 284 base::FilePath("/some/path/to/chrome") | 284 base::FilePath("/some/path/to/chrome") |
| 285 #endif | 285 #endif |
| 286 ) | 286 ) |
| 287 }; | 287 }; |
| 288 | 288 |
| 289 // Duplicate samples in slots 0, 2, and 3. | 289 // Duplicate samples in slots 0, 2, and 3. |
| 290 const Frame sample_frames[][1] = { | 290 const Frame sample_frames[][1] = { |
| 291 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0), }, | 291 { Frame((module_base_address + 0x10), 0), }, |
| 292 { Frame(reinterpret_cast<const void*>(module_base_address + 0x20), 0), }, | 292 { Frame((module_base_address + 0x20), 0), }, |
| 293 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0), }, | 293 { Frame((module_base_address + 0x10), 0), }, |
| 294 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0) } | 294 { Frame((module_base_address + 0x10), 0) } |
| 295 }; | 295 }; |
| 296 | 296 |
| 297 Profile profile; | 297 Profile profile; |
| 298 profile.modules.insert(profile.modules.end(), &modules[0], | 298 profile.modules.insert(profile.modules.end(), &modules[0], |
| 299 &modules[0] + arraysize(modules)); | 299 &modules[0] + arraysize(modules)); |
| 300 | 300 |
| 301 for (size_t i = 0; i < arraysize(sample_frames); ++i) { | 301 for (size_t i = 0; i < arraysize(sample_frames); ++i) { |
| 302 profile.samples.push_back(Sample()); | 302 profile.samples.push_back(Sample()); |
| 303 Sample& sample = profile.samples.back(); | 303 Sample& sample = profile.samples.back(); |
| 304 sample.insert(sample.end(), &sample_frames[i][0], | 304 sample.insert(sample.end(), &sample_frames[i][0], |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 } | 347 } |
| 348 } | 348 } |
| 349 | 349 |
| 350 // Checks that only contiguous duplicate samples are collapsed with | 350 // Checks that only contiguous duplicate samples are collapsed with |
| 351 // preserve_sample_ordering = true. | 351 // preserve_sample_ordering = true. |
| 352 TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { | 352 TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
| 353 const uintptr_t module_base_address = 0x1000; | 353 const uintptr_t module_base_address = 0x1000; |
| 354 | 354 |
| 355 const Module modules[] = { | 355 const Module modules[] = { |
| 356 Module( | 356 Module( |
| 357 reinterpret_cast<const void*>(module_base_address), | 357 (module_base_address), |
| 358 "ABCD", | 358 "ABCD", |
| 359 #if defined(OS_WIN) | 359 #if defined(OS_WIN) |
| 360 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") | 360 base::FilePath(L"c:\\some\\path\\to\\chrome.exe") |
| 361 #else | 361 #else |
| 362 base::FilePath("/some/path/to/chrome") | 362 base::FilePath("/some/path/to/chrome") |
| 363 #endif | 363 #endif |
| 364 ) | 364 ) |
| 365 }; | 365 }; |
| 366 | 366 |
| 367 // Duplicate samples in slots 0, 2, and 3. | 367 // Duplicate samples in slots 0, 2, and 3. |
| 368 const Frame sample_frames[][1] = { | 368 const Frame sample_frames[][1] = { |
| 369 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0), }, | 369 { Frame((module_base_address + 0x10), 0), }, |
| 370 { Frame(reinterpret_cast<const void*>(module_base_address + 0x20), 0), }, | 370 { Frame((module_base_address + 0x20), 0), }, |
| 371 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0), }, | 371 { Frame((module_base_address + 0x10), 0), }, |
| 372 { Frame(reinterpret_cast<const void*>(module_base_address + 0x10), 0) } | 372 { Frame((module_base_address + 0x10), 0) } |
| 373 }; | 373 }; |
| 374 | 374 |
| 375 Profile profile; | 375 Profile profile; |
| 376 profile.modules.insert(profile.modules.end(), &modules[0], | 376 profile.modules.insert(profile.modules.end(), &modules[0], |
| 377 &modules[0] + arraysize(modules)); | 377 &modules[0] + arraysize(modules)); |
| 378 | 378 |
| 379 for (size_t i = 0; i < arraysize(sample_frames); ++i) { | 379 for (size_t i = 0; i < arraysize(sample_frames); ++i) { |
| 380 profile.samples.push_back(Sample()); | 380 profile.samples.push_back(Sample()); |
| 381 Sample& sample = profile.samples.back(); | 381 Sample& sample = profile.samples.back(); |
| 382 sample.insert(sample.end(), &sample_frames[i][0], | 382 sample.insert(sample.end(), &sample_frames[i][0], |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 entry.address()); | 420 entry.address()); |
| 421 ASSERT_TRUE(entry.has_module_id_index()); | 421 ASSERT_TRUE(entry.has_module_id_index()); |
| 422 EXPECT_EQ(sample_frames[i][j].module_index, | 422 EXPECT_EQ(sample_frames[i][j].module_index, |
| 423 static_cast<size_t>(entry.module_id_index())); | 423 static_cast<size_t>(entry.module_id_index())); |
| 424 } | 424 } |
| 425 } | 425 } |
| 426 } | 426 } |
| 427 | 427 |
| 428 // Checks that unknown modules produce an empty Entry. | 428 // Checks that unknown modules produce an empty Entry. |
| 429 TEST_F(CallStackProfileMetricsProviderTest, UnknownModule) { | 429 TEST_F(CallStackProfileMetricsProviderTest, UnknownModule) { |
| 430 const Frame frame(reinterpret_cast<const void*>(0x1000), | 430 const Frame frame((0x1000), |
| 431 Frame::kUnknownModuleIndex); | 431 Frame::kUnknownModuleIndex); |
| 432 | 432 |
| 433 Profile profile; | 433 Profile profile; |
| 434 | 434 |
| 435 profile.samples.push_back(Sample(1, frame)); | 435 profile.samples.push_back(Sample(1, frame)); |
| 436 | 436 |
| 437 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 437 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 438 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 438 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 439 | 439 |
| 440 CallStackProfileMetricsProvider provider; | 440 CallStackProfileMetricsProvider provider; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 461 EXPECT_FALSE(entry.has_module_id_index()); | 461 EXPECT_FALSE(entry.has_module_id_index()); |
| 462 } | 462 } |
| 463 | 463 |
| 464 // Checks that pending profiles are only passed back to ProvideGeneralMetrics | 464 // Checks that pending profiles are only passed back to ProvideGeneralMetrics |
| 465 // once. | 465 // once. |
| 466 TEST_F(CallStackProfileMetricsProviderTest, ProfilesProvidedOnlyOnce) { | 466 TEST_F(CallStackProfileMetricsProviderTest, ProfilesProvidedOnlyOnce) { |
| 467 CallStackProfileMetricsProvider provider; | 467 CallStackProfileMetricsProvider provider; |
| 468 for (int i = 0; i < 2; ++i) { | 468 for (int i = 0; i < 2; ++i) { |
| 469 Profile profile; | 469 Profile profile; |
| 470 profile.samples.push_back(Sample(1, Frame( | 470 profile.samples.push_back(Sample(1, Frame( |
| 471 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 471 (0x1000), Frame::kUnknownModuleIndex))); |
| 472 | 472 |
| 473 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 473 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 474 // Use the sampling period to distinguish the two profiles. | 474 // Use the sampling period to distinguish the two profiles. |
| 475 profile.sampling_period = base::TimeDelta::FromMilliseconds(i); | 475 profile.sampling_period = base::TimeDelta::FromMilliseconds(i); |
| 476 | 476 |
| 477 provider.OnRecordingEnabled(); | 477 provider.OnRecordingEnabled(); |
| 478 AppendProfiles(Params(Params::PROCESS_STARTUP, false), | 478 AppendProfiles(Params(Params::PROCESS_STARTUP, false), |
| 479 std::vector<Profile>(1, profile)); | 479 std::vector<Profile>(1, profile)); |
| 480 ChromeUserMetricsExtension uma_proto; | 480 ChromeUserMetricsExtension uma_proto; |
| 481 provider.ProvideGeneralMetrics(&uma_proto); | 481 provider.ProvideGeneralMetrics(&uma_proto); |
| 482 | 482 |
| 483 ASSERT_EQ(1, uma_proto.sampled_profile().size()); | 483 ASSERT_EQ(1, uma_proto.sampled_profile().size()); |
| 484 const SampledProfile& sampled_profile = uma_proto.sampled_profile().Get(0); | 484 const SampledProfile& sampled_profile = uma_proto.sampled_profile().Get(0); |
| 485 ASSERT_TRUE(sampled_profile.has_call_stack_profile()); | 485 ASSERT_TRUE(sampled_profile.has_call_stack_profile()); |
| 486 const CallStackProfile& call_stack_profile = | 486 const CallStackProfile& call_stack_profile = |
| 487 sampled_profile.call_stack_profile(); | 487 sampled_profile.call_stack_profile(); |
| 488 ASSERT_TRUE(call_stack_profile.has_sampling_period_ms()); | 488 ASSERT_TRUE(call_stack_profile.has_sampling_period_ms()); |
| 489 EXPECT_EQ(i, call_stack_profile.sampling_period_ms()); | 489 EXPECT_EQ(i, call_stack_profile.sampling_period_ms()); |
| 490 } | 490 } |
| 491 } | 491 } |
| 492 | 492 |
| 493 // Checks that pending profiles are provided to ProvideGeneralMetrics | 493 // Checks that pending profiles are provided to ProvideGeneralMetrics |
| 494 // when collected before CallStackProfileMetricsProvider is instantiated. | 494 // when collected before CallStackProfileMetricsProvider is instantiated. |
| 495 TEST_F(CallStackProfileMetricsProviderTest, | 495 TEST_F(CallStackProfileMetricsProviderTest, |
| 496 ProfilesProvidedWhenCollectedBeforeInstantiation) { | 496 ProfilesProvidedWhenCollectedBeforeInstantiation) { |
| 497 Profile profile; | 497 Profile profile; |
| 498 profile.samples.push_back(Sample(1, Frame( | 498 profile.samples.push_back(Sample(1, Frame( |
| 499 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 499 (0x1000), Frame::kUnknownModuleIndex))); |
| 500 | 500 |
| 501 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 501 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 502 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 502 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 503 | 503 |
| 504 AppendProfiles(Params(Params::PROCESS_STARTUP, false), | 504 AppendProfiles(Params(Params::PROCESS_STARTUP, false), |
| 505 std::vector<Profile>(1, profile)); | 505 std::vector<Profile>(1, profile)); |
| 506 | 506 |
| 507 CallStackProfileMetricsProvider provider; | 507 CallStackProfileMetricsProvider provider; |
| 508 provider.OnRecordingEnabled(); | 508 provider.OnRecordingEnabled(); |
| 509 ChromeUserMetricsExtension uma_proto; | 509 ChromeUserMetricsExtension uma_proto; |
| 510 provider.ProvideGeneralMetrics(&uma_proto); | 510 provider.ProvideGeneralMetrics(&uma_proto); |
| 511 | 511 |
| 512 EXPECT_EQ(1, uma_proto.sampled_profile_size()); | 512 EXPECT_EQ(1, uma_proto.sampled_profile_size()); |
| 513 } | 513 } |
| 514 | 514 |
| 515 // Checks that pending profiles are not provided to ProvideGeneralMetrics | 515 // Checks that pending profiles are not provided to ProvideGeneralMetrics |
| 516 // while recording is disabled. | 516 // while recording is disabled. |
| 517 TEST_F(CallStackProfileMetricsProviderTest, ProfilesNotProvidedWhileDisabled) { | 517 TEST_F(CallStackProfileMetricsProviderTest, ProfilesNotProvidedWhileDisabled) { |
| 518 Profile profile; | 518 Profile profile; |
| 519 profile.samples.push_back(Sample(1, Frame( | 519 profile.samples.push_back(Sample(1, Frame( |
| 520 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 520 (0x1000), Frame::kUnknownModuleIndex))); |
| 521 | 521 |
| 522 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 522 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 523 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 523 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 524 | 524 |
| 525 CallStackProfileMetricsProvider provider; | 525 CallStackProfileMetricsProvider provider; |
| 526 provider.OnRecordingDisabled(); | 526 provider.OnRecordingDisabled(); |
| 527 AppendProfiles(Params(Params::PROCESS_STARTUP, false), | 527 AppendProfiles(Params(Params::PROCESS_STARTUP, false), |
| 528 std::vector<Profile>(1, profile)); | 528 std::vector<Profile>(1, profile)); |
| 529 ChromeUserMetricsExtension uma_proto; | 529 ChromeUserMetricsExtension uma_proto; |
| 530 provider.ProvideGeneralMetrics(&uma_proto); | 530 provider.ProvideGeneralMetrics(&uma_proto); |
| 531 | 531 |
| 532 EXPECT_EQ(0, uma_proto.sampled_profile_size()); | 532 EXPECT_EQ(0, uma_proto.sampled_profile_size()); |
| 533 } | 533 } |
| 534 | 534 |
| 535 // Checks that pending profiles are not provided to ProvideGeneralMetrics | 535 // Checks that pending profiles are not provided to ProvideGeneralMetrics |
| 536 // if recording is disabled while profiling. | 536 // if recording is disabled while profiling. |
| 537 TEST_F(CallStackProfileMetricsProviderTest, | 537 TEST_F(CallStackProfileMetricsProviderTest, |
| 538 ProfilesNotProvidedAfterChangeToDisabled) { | 538 ProfilesNotProvidedAfterChangeToDisabled) { |
| 539 Profile profile; | 539 Profile profile; |
| 540 profile.samples.push_back(Sample(1, Frame( | 540 profile.samples.push_back(Sample(1, Frame( |
| 541 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 541 (0x1000), Frame::kUnknownModuleIndex))); |
| 542 | 542 |
| 543 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 543 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 544 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 544 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 545 | 545 |
| 546 CallStackProfileMetricsProvider provider; | 546 CallStackProfileMetricsProvider provider; |
| 547 provider.OnRecordingEnabled(); | 547 provider.OnRecordingEnabled(); |
| 548 base::StackSamplingProfiler::CompletedCallback callback = | 548 base::StackSamplingProfiler::CompletedCallback callback = |
| 549 CallStackProfileMetricsProvider::GetProfilerCallback( | 549 CallStackProfileMetricsProvider::GetProfilerCallback( |
| 550 Params(Params::PROCESS_STARTUP, false)); | 550 Params(Params::PROCESS_STARTUP, false)); |
| 551 | 551 |
| 552 provider.OnRecordingDisabled(); | 552 provider.OnRecordingDisabled(); |
| 553 callback.Run(std::vector<Profile>(1, profile)); | 553 callback.Run(std::vector<Profile>(1, profile)); |
| 554 ChromeUserMetricsExtension uma_proto; | 554 ChromeUserMetricsExtension uma_proto; |
| 555 provider.ProvideGeneralMetrics(&uma_proto); | 555 provider.ProvideGeneralMetrics(&uma_proto); |
| 556 | 556 |
| 557 EXPECT_EQ(0, uma_proto.sampled_profile_size()); | 557 EXPECT_EQ(0, uma_proto.sampled_profile_size()); |
| 558 } | 558 } |
| 559 | 559 |
| 560 // Checks that pending profiles are not provided to ProvideGeneralMetrics if | 560 // Checks that pending profiles are not provided to ProvideGeneralMetrics if |
| 561 // recording is enabled, but then disabled and reenabled while profiling. | 561 // recording is enabled, but then disabled and reenabled while profiling. |
| 562 TEST_F(CallStackProfileMetricsProviderTest, | 562 TEST_F(CallStackProfileMetricsProviderTest, |
| 563 ProfilesNotProvidedAfterChangeToDisabledThenEnabled) { | 563 ProfilesNotProvidedAfterChangeToDisabledThenEnabled) { |
| 564 Profile profile; | 564 Profile profile; |
| 565 profile.samples.push_back(Sample(1, Frame( | 565 profile.samples.push_back(Sample(1, Frame( |
| 566 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 566 (0x1000), Frame::kUnknownModuleIndex))); |
| 567 | 567 |
| 568 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 568 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 569 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 569 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 570 | 570 |
| 571 CallStackProfileMetricsProvider provider; | 571 CallStackProfileMetricsProvider provider; |
| 572 provider.OnRecordingEnabled(); | 572 provider.OnRecordingEnabled(); |
| 573 base::StackSamplingProfiler::CompletedCallback callback = | 573 base::StackSamplingProfiler::CompletedCallback callback = |
| 574 CallStackProfileMetricsProvider::GetProfilerCallback( | 574 CallStackProfileMetricsProvider::GetProfilerCallback( |
| 575 Params(Params::PROCESS_STARTUP, false)); | 575 Params(Params::PROCESS_STARTUP, false)); |
| 576 | 576 |
| 577 provider.OnRecordingDisabled(); | 577 provider.OnRecordingDisabled(); |
| 578 provider.OnRecordingEnabled(); | 578 provider.OnRecordingEnabled(); |
| 579 callback.Run(std::vector<Profile>(1, profile)); | 579 callback.Run(std::vector<Profile>(1, profile)); |
| 580 ChromeUserMetricsExtension uma_proto; | 580 ChromeUserMetricsExtension uma_proto; |
| 581 provider.ProvideGeneralMetrics(&uma_proto); | 581 provider.ProvideGeneralMetrics(&uma_proto); |
| 582 | 582 |
| 583 EXPECT_EQ(0, uma_proto.sampled_profile_size()); | 583 EXPECT_EQ(0, uma_proto.sampled_profile_size()); |
| 584 } | 584 } |
| 585 | 585 |
| 586 // Checks that pending profiles are not provided to ProvideGeneralMetrics | 586 // Checks that pending profiles are not provided to ProvideGeneralMetrics |
| 587 // if recording is disabled, but then enabled while profiling. | 587 // if recording is disabled, but then enabled while profiling. |
| 588 TEST_F(CallStackProfileMetricsProviderTest, | 588 TEST_F(CallStackProfileMetricsProviderTest, |
| 589 ProfilesNotProvidedAfterChangeFromDisabled) { | 589 ProfilesNotProvidedAfterChangeFromDisabled) { |
| 590 Profile profile; | 590 Profile profile; |
| 591 profile.samples.push_back(Sample(1, Frame( | 591 profile.samples.push_back(Sample(1, Frame( |
| 592 reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); | 592 (0x1000), Frame::kUnknownModuleIndex))); |
| 593 | 593 |
| 594 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); | 594 profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
| 595 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); | 595 profile.sampling_period = base::TimeDelta::FromMilliseconds(10); |
| 596 | 596 |
| 597 CallStackProfileMetricsProvider provider; | 597 CallStackProfileMetricsProvider provider; |
| 598 provider.OnRecordingDisabled(); | 598 provider.OnRecordingDisabled(); |
| 599 base::StackSamplingProfiler::CompletedCallback callback = | 599 base::StackSamplingProfiler::CompletedCallback callback = |
| 600 CallStackProfileMetricsProvider::GetProfilerCallback( | 600 CallStackProfileMetricsProvider::GetProfilerCallback( |
| 601 Params(Params::PROCESS_STARTUP, false)); | 601 Params(Params::PROCESS_STARTUP, false)); |
| 602 | 602 |
| 603 provider.OnRecordingEnabled(); | 603 provider.OnRecordingEnabled(); |
| 604 callback.Run(std::vector<Profile>(1, profile)); | 604 callback.Run(std::vector<Profile>(1, profile)); |
| 605 ChromeUserMetricsExtension uma_proto; | 605 ChromeUserMetricsExtension uma_proto; |
| 606 provider.ProvideGeneralMetrics(&uma_proto); | 606 provider.ProvideGeneralMetrics(&uma_proto); |
| 607 | 607 |
| 608 EXPECT_EQ(0, uma_proto.sampled_profile_size()); | 608 EXPECT_EQ(0, uma_proto.sampled_profile_size()); |
| 609 } | 609 } |
| 610 | 610 |
| 611 } // namespace metrics | 611 } // namespace metrics |
| OLD | NEW |