Index: components/metrics/call_stack_profile_metrics_provider_unittest.cc |
diff --git a/components/metrics/call_stack_profile_metrics_provider_unittest.cc b/components/metrics/call_stack_profile_metrics_provider_unittest.cc |
index c81e23922ac460f6d69b52b7326a8c848e629249..11f2ddcbfa0155fd81f2d15704d20e1136c9089c 100644 |
--- a/components/metrics/call_stack_profile_metrics_provider_unittest.cc |
+++ b/components/metrics/call_stack_profile_metrics_provider_unittest.cc |
@@ -10,10 +10,10 @@ |
#include <utility> |
#include "base/macros.h" |
-#include "base/metrics/field_trial.h" |
#include "base/profiler/stack_sampling_profiler.h" |
#include "base/run_loop.h" |
#include "base/strings/string_number_conversions.h" |
+#include "base/test/scoped_feature_list.h" |
#include "build/build_config.h" |
#include "components/metrics/call_stack_profile_params.h" |
#include "components/metrics/proto/chrome_user_metrics_extension.pb.h" |
@@ -58,8 +58,8 @@ struct ExpectedProtoProfile { |
class ProfilesFactory { |
public: |
- ProfilesFactory(){}; |
- ~ProfilesFactory(){}; |
+ ProfilesFactory() {} |
+ ~ProfilesFactory() {} |
ProfilesFactory& AddMilestone(int milestone); |
ProfilesFactory& NewProfile(int duration_ms, int interval_ms); |
@@ -117,39 +117,34 @@ Profiles ProfilesFactory::Build() { |
namespace metrics { |
-// This test fixture enables the field trial that |
+// This test fixture enables the feature that |
// CallStackProfileMetricsProvider depends on to report profiles. |
class CallStackProfileMetricsProviderTest : public testing::Test { |
public: |
- CallStackProfileMetricsProviderTest() |
- : field_trial_list_(nullptr) { |
- base::FieldTrialList::CreateFieldTrial( |
- TestState::kFieldTrialName, |
- TestState::kReportProfilesGroupName); |
+ CallStackProfileMetricsProviderTest() { |
+ scoped_feature_list_.InitAndEnableFeature(TestState::kEnableReporting); |
TestState::ResetStaticStateForTesting(); |
} |
~CallStackProfileMetricsProviderTest() override {} |
// Utility function to append profiles to the metrics provider. |
- void AppendProfiles(const CallStackProfileParams& params, Profiles profiles) { |
- CallStackProfileMetricsProvider::GetProfilerCallback(params).Run( |
- std::move(profiles)); |
+ void AppendProfiles(CallStackProfileParams* params, Profiles profiles) { |
+ internal::GetProfilerCallback(params).Run(std::move(profiles)); |
} |
void VerifyProfileProto(const ExpectedProtoProfile& expected, |
const SampledProfile& proto); |
private: |
- // Exposes field trial/group names from the CallStackProfileMetricsProvider. |
+ // Exposes the feature from the CallStackProfileMetricsProvider. |
class TestState : public CallStackProfileMetricsProvider { |
public: |
- using CallStackProfileMetricsProvider::kFieldTrialName; |
- using CallStackProfileMetricsProvider::kReportProfilesGroupName; |
+ using CallStackProfileMetricsProvider::kEnableReporting; |
using CallStackProfileMetricsProvider::ResetStaticStateForTesting; |
}; |
- base::FieldTrialList field_trial_list_; |
+ base::test::ScopedFeatureList scoped_feature_list_; |
DISALLOW_COPY_AND_ASSIGN(CallStackProfileMetricsProviderTest); |
}; |
@@ -343,12 +338,11 @@ TEST_F(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -428,12 +422,11 @@ TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -515,11 +508,11 @@ TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
- AppendProfiles(CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::PRESERVE_ORDER), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::PRESERVE_ORDER); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -559,12 +552,11 @@ TEST_F(CallStackProfileMetricsProviderTest, UnknownModule) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -593,12 +585,11 @@ TEST_F(CallStackProfileMetricsProviderTest, ProfilesProvidedOnlyOnce) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -624,12 +615,11 @@ TEST_F(CallStackProfileMetricsProviderTest, |
ASSERT_EQ(1U, profiles.size()); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
@@ -652,12 +642,11 @@ TEST_F(CallStackProfileMetricsProviderTest, ProfilesNotProvidedWhileDisabled) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingDisabled(); |
- AppendProfiles( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE), |
- std::move(profiles)); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ AppendProfiles(¶ms, std::move(profiles)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -670,12 +659,12 @@ TEST_F(CallStackProfileMetricsProviderTest, |
ProfilesNotProvidedAfterChangeToDisabled) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
base::StackSamplingProfiler::CompletedCallback callback = |
- CallStackProfileMetricsProvider::GetProfilerCallback( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE)); |
+ internal::GetProfilerCallback(¶ms); |
provider.OnRecordingDisabled(); |
Profiles profiles = ProfilesFactory() |
@@ -696,12 +685,12 @@ TEST_F(CallStackProfileMetricsProviderTest, |
ProfilesNotProvidedAfterChangeToDisabledThenEnabled) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingEnabled(); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
base::StackSamplingProfiler::CompletedCallback callback = |
- CallStackProfileMetricsProvider::GetProfilerCallback( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE)); |
+ internal::GetProfilerCallback(¶ms); |
provider.OnRecordingDisabled(); |
provider.OnRecordingEnabled(); |
@@ -723,12 +712,12 @@ TEST_F(CallStackProfileMetricsProviderTest, |
ProfilesNotProvidedAfterChangeFromDisabled) { |
CallStackProfileMetricsProvider provider; |
provider.OnRecordingDisabled(); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PROCESS_STARTUP, |
+ CallStackProfileParams::MAY_SHUFFLE); |
base::StackSamplingProfiler::CompletedCallback callback = |
- CallStackProfileMetricsProvider::GetProfilerCallback( |
- CallStackProfileParams(CallStackProfileParams::BROWSER_PROCESS, |
- CallStackProfileParams::UI_THREAD, |
- CallStackProfileParams::PROCESS_STARTUP, |
- CallStackProfileParams::MAY_SHUFFLE)); |
+ internal::GetProfilerCallback(¶ms); |
provider.OnRecordingEnabled(); |
Profiles profiles = ProfilesFactory() |
@@ -743,4 +732,109 @@ TEST_F(CallStackProfileMetricsProviderTest, |
EXPECT_EQ(0, uma_proto.sampled_profile_size()); |
} |
+// Only certain platforms support GetUptime() which is used both by the test |
+// and the code being tested. |
+#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) || \ |
+ defined(OS_LINUX) |
+#define MAYBE_PeriodicProfiles PeriodicProfiles |
+#else |
+#define MAYBE_PeriodicProfiles DISABLED_PeriodicProfiles |
+#endif |
+TEST_F(CallStackProfileMetricsProviderTest, MAYBE_PeriodicProfiles) { |
+ const uintptr_t module_base_address = 0x1000; |
+ const char* module_name = "ABCD"; |
+ |
+#if defined(OS_WIN) |
+ uint64_t module_md5 = 0x46C3E4166659AC02ULL; |
+ base::FilePath module_path(L"c:\\some\\path\\to\\chrome.exe"); |
+#else |
+ uint64_t module_md5 = 0x554838A8451AC36CULL; |
+ base::FilePath module_path("/some/path/to/chrome"); |
+#endif |
+ |
+ Profiles profiles = |
+ ProfilesFactory() |
+ .NewProfile(100, 10) |
+ .DefineModule(module_name, module_path, module_base_address) |
+ |
+ .AddMilestone(0) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x20) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ |
+ .AddMilestone(1) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x20) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ .NewSample() |
+ .AddFrame(0, module_base_address + 0x10) |
+ |
+ .Build(); |
+ |
+ const ExpectedProtoModule expected_proto_modules[] = { |
+ {module_name, module_md5, module_base_address}, |
+ }; |
+ |
+ const ExpectedProtoEntry expected_proto_entries[] = { |
+ {0, 0x10}, {0, 0x20}, |
+ }; |
+ const ExpectedProtoSample expected_proto_samples[] = { |
+ {1, &expected_proto_entries[0], 1, 3}, |
+ {0, &expected_proto_entries[1], 1, 1}, |
+ {2, &expected_proto_entries[0], 1, 3}, |
+ {0, &expected_proto_entries[1], 1, 1}, |
+ }; |
+ |
+ ExpectedProtoProfile expected_proto_profiles[] = { |
+ { |
+ 0, // Will be updated below. |
+ 1000, // Based on kPeriodicSamplingInterval in the .cc. |
+ expected_proto_modules, arraysize(expected_proto_modules), |
+ expected_proto_samples, arraysize(expected_proto_samples), |
+ }, |
+ }; |
+ |
+ ASSERT_EQ(arraysize(expected_proto_profiles), profiles.size()); |
+ |
+ CallStackProfileMetricsProvider provider; |
+ provider.OnRecordingEnabled(); |
+ CallStackProfileParams params(CallStackProfileParams::BROWSER_PROCESS, |
+ CallStackProfileParams::UI_THREAD, |
+ CallStackProfileParams::PERIODIC_COLLECTION, |
+ CallStackProfileParams::MAY_SHUFFLE); |
+ const base::TimeDelta min_expected_uptime = internal::GetUptime(); |
+ AppendProfiles(¶ms, std::move(profiles)); |
+ const base::TimeDelta max_expected_uptime = internal::GetUptime(); |
+ |
+ ChromeUserMetricsExtension uma_proto; |
+ provider.ProvideGeneralMetrics(&uma_proto); |
+ |
+ // We expect duration_ms to be the process uptime. Check that it's within the |
+ // min/max boundary values that were retrieved earlier. Then, set the value |
+ // in |expected_proto_profiles| to be the actual value so it matches below. |
+ const int32_t profile_duration_ms = |
+ uma_proto.sampled_profile(0).call_stack_profile().profile_duration_ms(); |
+ EXPECT_GE(profile_duration_ms, min_expected_uptime.InMilliseconds()); |
+ EXPECT_LE(profile_duration_ms, max_expected_uptime.InMilliseconds()); |
+ expected_proto_profiles[0].duration_ms = profile_duration_ms; |
+ |
+ ASSERT_EQ(static_cast<int>(arraysize(expected_proto_profiles)), |
+ uma_proto.sampled_profile().size()); |
+ for (size_t p = 0; p < arraysize(expected_proto_profiles); ++p) { |
+ SCOPED_TRACE("profile " + base::SizeTToString(p)); |
+ VerifyProfileProto(expected_proto_profiles[p], |
+ uma_proto.sampled_profile().Get(p)); |
+ EXPECT_EQ(SampledProfile::PERIODIC_COLLECTION, |
+ uma_proto.sampled_profile(p).trigger_event()); |
+ } |
+} |
+ |
} // namespace metrics |