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 a4e3efb9cc9935311307079f48aa345fb83d8628..9700bf04e7f8b1c19a6562ae6339dd988952bb50 100644 |
--- a/components/metrics/call_stack_profile_metrics_provider_unittest.cc |
+++ b/components/metrics/call_stack_profile_metrics_provider_unittest.cc |
@@ -4,9 +4,11 @@ |
#include "components/metrics/call_stack_profile_metrics_provider.h" |
+#include "base/metrics/field_trial.h" |
#include "base/profiler/stack_sampling_profiler.h" |
#include "base/strings/string_number_conversions.h" |
#include "components/metrics/proto/chrome_user_metrics_extension.pb.h" |
+#include "components/variations/entropy_provider.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using base::StackSamplingProfiler; |
@@ -17,8 +19,33 @@ using Sample = StackSamplingProfiler::Sample; |
namespace metrics { |
+// This test fixture enables the field trial that |
+// CallStackProfileMetricsProvider depends on to report profiles. |
+class CallStackProfileMetricsProviderTest : public testing::Test { |
+ public: |
+ CallStackProfileMetricsProviderTest() |
+ : field_trial_list_(new base::FieldTrialList( |
+ new metrics::SHA1EntropyProvider("foo"))) { |
+ base::FieldTrialList::CreateFieldTrial( |
+ FieldTrialState::kFieldTrialName, |
+ FieldTrialState::kReportProfilesGroupName); |
+ } |
+ |
+ ~CallStackProfileMetricsProviderTest() override {} |
+ |
+ private: |
+ // Exposes field trial/group names from the CallStackProfileMetricsProvider. |
+ class FieldTrialState : public CallStackProfileMetricsProvider { |
+ public: |
+ using CallStackProfileMetricsProvider::kFieldTrialName; |
+ using CallStackProfileMetricsProvider::kReportProfilesGroupName; |
+ }; |
+ |
+ const scoped_ptr<base::FieldTrialList> field_trial_list_; |
+}; |
+ |
// Checks that all properties from multiple profiles are filled as expected. |
-TEST(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
+TEST_F(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
const uintptr_t module1_base_address = 0x1000; |
const uintptr_t module2_base_address = 0x2000; |
const uintptr_t module3_base_address = 0x3000; |
@@ -165,7 +192,7 @@ TEST(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
} |
CallStackProfileMetricsProvider provider; |
- provider.SetSourceProfilesForTesting(profiles); |
+ provider.AppendSourceProfilesForTesting(profiles); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -229,7 +256,7 @@ TEST(CallStackProfileMetricsProviderTest, MultipleProfiles) { |
// Checks that all duplicate samples are collapsed with |
// preserve_sample_ordering = false. |
-TEST(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
+TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
const uintptr_t module_base_address = 0x1000; |
const Module modules[] = { |
@@ -268,7 +295,7 @@ TEST(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
profile.preserve_sample_ordering = false; |
CallStackProfileMetricsProvider provider; |
- provider.SetSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
+ provider.AppendSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -306,7 +333,7 @@ TEST(CallStackProfileMetricsProviderTest, RepeatedStacksUnordered) { |
// Checks that only contiguous duplicate samples are collapsed with |
// preserve_sample_ordering = true. |
-TEST(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
+TEST_F(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
const uintptr_t module_base_address = 0x1000; |
const Module modules[] = { |
@@ -345,7 +372,7 @@ TEST(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
profile.preserve_sample_ordering = true; |
CallStackProfileMetricsProvider provider; |
- provider.SetSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
+ provider.AppendSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -381,9 +408,8 @@ TEST(CallStackProfileMetricsProviderTest, RepeatedStacksOrdered) { |
} |
} |
- |
// Checks that unknown modules produce an empty Entry. |
-TEST(CallStackProfileMetricsProviderTest, UnknownModule) { |
+TEST_F(CallStackProfileMetricsProviderTest, UnknownModule) { |
const Frame frame(reinterpret_cast<const void*>(0x1000), |
Frame::kUnknownModuleIndex); |
@@ -396,7 +422,7 @@ TEST(CallStackProfileMetricsProviderTest, UnknownModule) { |
profile.preserve_sample_ordering = false; |
CallStackProfileMetricsProvider provider; |
- provider.SetSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
+ provider.AppendSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
ChromeUserMetricsExtension uma_proto; |
provider.ProvideGeneralMetrics(&uma_proto); |
@@ -417,4 +443,32 @@ TEST(CallStackProfileMetricsProviderTest, UnknownModule) { |
EXPECT_FALSE(entry.has_module_id_index()); |
} |
+// Checks that pending profiles are only passed back to ProvideGeneralMetrics |
+// once. |
+TEST_F(CallStackProfileMetricsProviderTest, ProfilesProvidedOnlyOnce) { |
+ CallStackProfileMetricsProvider provider; |
+ for (int i = 0; i < 2; ++i) { |
+ Profile profile; |
+ profile.samples.push_back(Sample(1, Frame( |
+ reinterpret_cast<const void*>(0x1000), Frame::kUnknownModuleIndex))); |
+ |
+ profile.profile_duration = base::TimeDelta::FromMilliseconds(100); |
+ // Use the sampling period to distinguish the two profiles. |
+ profile.sampling_period = base::TimeDelta::FromMilliseconds(i); |
+ profile.preserve_sample_ordering = false; |
+ |
+ provider.AppendSourceProfilesForTesting(std::vector<Profile>(1, profile)); |
+ ChromeUserMetricsExtension uma_proto; |
+ provider.ProvideGeneralMetrics(&uma_proto); |
+ |
+ ASSERT_EQ(1, uma_proto.sampled_profile().size()); |
+ const SampledProfile& sampled_profile = uma_proto.sampled_profile().Get(0); |
+ ASSERT_TRUE(sampled_profile.has_call_stack_profile()); |
+ const CallStackProfile& call_stack_profile = |
+ sampled_profile.call_stack_profile(); |
+ ASSERT_TRUE(call_stack_profile.has_sampling_period_ms()); |
+ EXPECT_EQ(i, call_stack_profile.sampling_period_ms()); |
+ } |
+} |
+ |
} // namespace metrics |