| Index: chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc
|
| diff --git a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc
|
| index 8393c2826b56f9b6d5f4662d33afb2a3f66834e4..801ac52db5d2552671282d5aa37b5163e11e599a 100644
|
| --- a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc
|
| +++ b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc
|
| @@ -10,9 +10,7 @@
|
| #include "base/time/time.h"
|
| #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
|
| #include "chrome/test/base/testing_browser_process.h"
|
| -#include "components/metrics/proto/ukm/entry.pb.h"
|
| -#include "components/ukm/test_ukm_service.h"
|
| -#include "components/ukm/ukm_entry.h"
|
| +#include "components/ukm/test_ukm_recorder.h"
|
| #include "components/ukm/ukm_source.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
|
|
| @@ -71,99 +69,83 @@ class UkmPageLoadMetricsObserverTest
|
| .Times(AnyNumber())
|
| .WillRepeatedly(Return(base::Optional<base::TimeDelta>()));
|
|
|
| - TestingBrowserProcess::GetGlobal()->SetUkmService(
|
| - ukm_service_test_harness_.test_ukm_service());
|
| + TestingBrowserProcess::GetGlobal()->SetUkmRecorder(&test_ukm_recorder_);
|
| }
|
|
|
| - size_t ukm_source_count() {
|
| - return ukm_service_test_harness_.test_ukm_service()->sources_count();
|
| - }
|
| + size_t ukm_source_count() { return test_ukm_recorder_.sources_count(); }
|
|
|
| - size_t ukm_entry_count() {
|
| - return ukm_service_test_harness_.test_ukm_service()->entries_count();
|
| - }
|
| + size_t ukm_entry_count() { return test_ukm_recorder_.entries_count(); }
|
|
|
| MockNetworkQualityProvider& mock_network_quality_provider() {
|
| return mock_network_quality_provider_;
|
| }
|
|
|
| const ukm::UkmSource* GetUkmSourceForUrl(const char* url) {
|
| - return ukm_service_test_harness_.test_ukm_service()->GetSourceForUrl(url);
|
| + return test_ukm_recorder_.GetSourceForUrl(url);
|
| }
|
|
|
| - const ukm::UkmEntry* GetUkmEntry(size_t entry_index) {
|
| - return ukm_service_test_harness_.test_ukm_service()->GetEntry(entry_index);
|
| + const ukm::mojom::UkmEntry* GetUkmEntry(size_t entry_index) {
|
| + return test_ukm_recorder_.GetEntry(entry_index);
|
| }
|
|
|
| - std::vector<const ukm::UkmEntry*> GetUkmEntriesForSourceID(
|
| - int32_t source_id) {
|
| - std::vector<const ukm::UkmEntry*> entries;
|
| + std::vector<const ukm::mojom::UkmEntry*> GetUkmEntriesForSourceID(
|
| + ukm::SourceId source_id) {
|
| + std::vector<const ukm::mojom::UkmEntry*> entries;
|
| for (size_t i = 0; i < ukm_entry_count(); ++i) {
|
| - const ukm::UkmEntry* entry = GetUkmEntry(i);
|
| - if (entry->source_id() == source_id)
|
| + const ukm::mojom::UkmEntry* entry = GetUkmEntry(i);
|
| + if (entry->source_id == source_id)
|
| entries.push_back(entry);
|
| }
|
| return entries;
|
| }
|
|
|
| - // Provides a single merged ukm::Entry proto that contains all metrics from
|
| - // the given |entries|. |entries| must be non-empty, and all |entries| must
|
| - // have the same |source_id| and |event_hash|.
|
| - ukm::Entry GetMergedEntryProto(
|
| - const std::vector<const ukm::UkmEntry*>& entries) {
|
| + // Provides a single merged ukm::mojom::UkmEntry proto that contains all
|
| + // metrics from the given |entries|. |entries| must be non-empty, and all
|
| + // |entries| must have the same |source_id| and |event_hash|.
|
| + ukm::mojom::UkmEntryPtr GetMergedEntry(
|
| + const std::vector<const ukm::mojom::UkmEntry*>& entries) {
|
| EXPECT_FALSE(entries.empty());
|
| - ukm::Entry merged_entry;
|
| - for (auto* entry : entries) {
|
| - ukm::Entry entry_proto;
|
| - entry->PopulateProto(&entry_proto);
|
| - EXPECT_TRUE(entry_proto.has_source_id());
|
| - EXPECT_TRUE(entry_proto.has_event_hash());
|
| - if (merged_entry.has_source_id()) {
|
| - EXPECT_EQ(merged_entry.source_id(), entry_proto.source_id());
|
| - EXPECT_EQ(merged_entry.event_hash(), entry_proto.event_hash());
|
| + ukm::mojom::UkmEntryPtr merged_entry = ukm::mojom::UkmEntry::New();
|
| + for (const auto* entry : entries) {
|
| + if (merged_entry->event_hash) {
|
| + EXPECT_EQ(merged_entry->source_id, entry->source_id);
|
| + EXPECT_EQ(merged_entry->event_hash, entry->event_hash);
|
| + } else {
|
| + merged_entry->event_hash = entry->event_hash;
|
| + merged_entry->source_id = entry->source_id;
|
| + }
|
| + for (const auto& metric : entry->metrics) {
|
| + merged_entry->metrics.emplace_back(metric->Clone());
|
| }
|
| - merged_entry.MergeFrom(entry_proto);
|
| }
|
| return merged_entry;
|
| }
|
|
|
| - ukm::Entry GetMergedEntryProtoForSourceID(int32_t source_id) {
|
| - ukm::Entry entry = GetMergedEntryProto(GetUkmEntriesForSourceID(source_id));
|
| - EXPECT_EQ(source_id, entry.source_id());
|
| - EXPECT_TRUE(entry.has_event_hash());
|
| + ukm::mojom::UkmEntryPtr GetMergedEntryForSourceID(ukm::SourceId source_id) {
|
| + ukm::mojom::UkmEntryPtr entry =
|
| + GetMergedEntry(GetUkmEntriesForSourceID(source_id));
|
| + EXPECT_EQ(source_id, entry->source_id);
|
| + EXPECT_NE(0UL, entry->event_hash);
|
| return entry;
|
| }
|
|
|
| - static const ukm::Entry_Metric* FindMetric(
|
| - const char* name,
|
| - const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics)
|
| - WARN_UNUSED_RESULT {
|
| - for (const auto& metric : metrics) {
|
| - if (metric.metric_hash() == base::HashMetricName(name))
|
| - return &metric;
|
| - }
|
| - return nullptr;
|
| + static bool HasMetric(const char* name,
|
| + const ukm::mojom::UkmEntry* entry) WARN_UNUSED_RESULT {
|
| + return ukm::TestUkmRecorder::FindMetric(entry, name) != nullptr;
|
| }
|
|
|
| - static bool HasMetric(
|
| - const char* name,
|
| - const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics)
|
| - WARN_UNUSED_RESULT {
|
| - return FindMetric(name, metrics) != nullptr;
|
| - }
|
| -
|
| - static void ExpectMetric(
|
| - const char* name,
|
| - int64_t expected_value,
|
| - const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) {
|
| - const ukm::Entry_Metric* metric = FindMetric(name, metrics);
|
| + static void ExpectMetric(const char* name,
|
| + int64_t expected_value,
|
| + const ukm::mojom::UkmEntry* entry) {
|
| + const ukm::mojom::UkmMetric* metric =
|
| + ukm::TestUkmRecorder::FindMetric(entry, name);
|
| EXPECT_NE(nullptr, metric) << "Failed to find metric: " << name;
|
| - EXPECT_EQ(expected_value, metric->value());
|
| + EXPECT_EQ(expected_value, metric->value);
|
| }
|
|
|
| private:
|
| MockNetworkQualityProvider mock_network_quality_provider_;
|
| - ukm::UkmServiceTestingHarness ukm_service_test_harness_;
|
| + ukm::TestUkmRecorder test_ukm_recorder_;
|
| };
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, NoMetrics) {
|
| @@ -198,22 +180,19 @@ TEST_F(UkmPageLoadMetricsObserverTest, Basic) {
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id());
|
| - EXPECT_EQ(entry_proto.source_id(), source->id());
|
| - EXPECT_EQ(entry_proto.event_hash(),
|
| + ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| + EXPECT_EQ(entry->source_id, source->id());
|
| + EXPECT_EQ(entry->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry_proto.metrics().empty());
|
| + EXPECT_FALSE(entry->metrics.empty());
|
| ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
|
| - entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmParseStartName, 100, entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmDomContentLoadedName, 200, entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmFirstContentfulPaintName, 300,
|
| - entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmLoadEventName, 500, entry_proto.metrics());
|
| - EXPECT_FALSE(
|
| - HasMetric(internal::kUkmFirstMeaningfulPaintName, entry_proto.metrics()));
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
|
| + entry.get());
|
| + ExpectMetric(internal::kUkmParseStartName, 100, entry.get());
|
| + ExpectMetric(internal::kUkmDomContentLoadedName, 200, entry.get());
|
| + ExpectMetric(internal::kUkmFirstContentfulPaintName, 300, entry.get());
|
| + ExpectMetric(internal::kUkmLoadEventName, 500, entry.get());
|
| + EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry.get()));
|
| + EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
|
| @@ -235,26 +214,23 @@ TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id());
|
| - EXPECT_EQ(entry_proto.source_id(), source->id());
|
| - EXPECT_EQ(entry_proto.event_hash(),
|
| + ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| + EXPECT_EQ(entry->source_id, source->id());
|
| + EXPECT_EQ(entry->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
|
|
| // Make sure that only the following metrics are logged. In particular, no
|
| // paint/document/etc timing metrics should be logged for failed provisional
|
| // loads.
|
| - EXPECT_EQ(5, entry_proto.metrics().size());
|
| + EXPECT_EQ(5ul, entry->metrics.size());
|
| ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
|
| - entry_proto.metrics());
|
| + entry.get());
|
| ExpectMetric(internal::kUkmEffectiveConnectionType,
|
| - net::EFFECTIVE_CONNECTION_TYPE_2G, entry_proto.metrics());
|
| + net::EFFECTIVE_CONNECTION_TYPE_2G, entry.get());
|
| ExpectMetric(internal::kUkmNetErrorCode,
|
| - static_cast<int64_t>(net::ERR_TIMED_OUT) * -1,
|
| - entry_proto.metrics());
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmFailedProvisionaLoadName, entry_proto.metrics()));
|
| + static_cast<int64_t>(net::ERR_TIMED_OUT) * -1, entry.get());
|
| + EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
|
| + EXPECT_TRUE(HasMetric(internal::kUkmFailedProvisionaLoadName, entry.get()));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) {
|
| @@ -275,15 +251,13 @@ TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) {
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id());
|
| - EXPECT_EQ(entry_proto.source_id(), source->id());
|
| - EXPECT_EQ(entry_proto.event_hash(),
|
| + ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| + EXPECT_EQ(entry->source_id, source->id());
|
| + EXPECT_EQ(entry->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry_proto.metrics().empty());
|
| - ExpectMetric(internal::kUkmFirstMeaningfulPaintName, 600,
|
| - entry_proto.metrics());
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmForegroundDurationName, entry_proto.metrics()));
|
| + EXPECT_FALSE(entry->metrics.empty());
|
| + ExpectMetric(internal::kUkmFirstMeaningfulPaintName, 600, entry.get());
|
| + EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
|
| @@ -315,32 +289,26 @@ TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
|
| EXPECT_NE(source1->id(), source2->id());
|
|
|
| EXPECT_GE(ukm_entry_count(), 2ul);
|
| - ukm::Entry entry1_proto = GetMergedEntryProtoForSourceID(source1->id());
|
| - ukm::Entry entry2_proto = GetMergedEntryProtoForSourceID(source2->id());
|
| - EXPECT_NE(entry1_proto.source_id(), entry2_proto.source_id());
|
| + ukm::mojom::UkmEntryPtr entry1 = GetMergedEntryForSourceID(source1->id());
|
| + ukm::mojom::UkmEntryPtr entry2 = GetMergedEntryForSourceID(source2->id());
|
| + EXPECT_NE(entry1->source_id, entry2->source_id);
|
|
|
| - EXPECT_EQ(entry1_proto.source_id(), source1->id());
|
| - EXPECT_EQ(entry1_proto.event_hash(),
|
| + EXPECT_EQ(entry1->source_id, source1->id());
|
| + EXPECT_EQ(entry1->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry1_proto.metrics().empty());
|
| - ExpectMetric(internal::kUkmFirstContentfulPaintName, 200,
|
| - entry1_proto.metrics());
|
| - EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName,
|
| - entry2_proto.metrics()));
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmForegroundDurationName, entry1_proto.metrics()));
|
| -
|
| - EXPECT_EQ(entry2_proto.source_id(), source2->id());
|
| - EXPECT_EQ(entry2_proto.event_hash(),
|
| + EXPECT_FALSE(entry1->metrics.empty());
|
| + ExpectMetric(internal::kUkmFirstContentfulPaintName, 200, entry1.get());
|
| + EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry2.get()));
|
| + EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry1.get()));
|
| +
|
| + EXPECT_EQ(entry2->source_id, source2->id());
|
| + EXPECT_EQ(entry2->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry2_proto.metrics().empty());
|
| - EXPECT_FALSE(HasMetric(internal::kUkmParseStartName, entry2_proto.metrics()));
|
| - EXPECT_FALSE(HasMetric(internal::kUkmFirstContentfulPaintName,
|
| - entry2_proto.metrics()));
|
| - EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName,
|
| - entry2_proto.metrics()));
|
| - EXPECT_TRUE(
|
| - HasMetric(internal::kUkmForegroundDurationName, entry2_proto.metrics()));
|
| + EXPECT_FALSE(entry2->metrics.empty());
|
| + EXPECT_FALSE(HasMetric(internal::kUkmParseStartName, entry2.get()));
|
| + EXPECT_FALSE(HasMetric(internal::kUkmFirstContentfulPaintName, entry2.get()));
|
| + EXPECT_FALSE(HasMetric(internal::kUkmFirstMeaningfulPaintName, entry2.get()));
|
| + EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry2.get()));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) {
|
| @@ -361,15 +329,15 @@ TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) {
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id());
|
| - EXPECT_EQ(entry_proto.source_id(), source->id());
|
| - EXPECT_EQ(entry_proto.event_hash(),
|
| + ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| + EXPECT_EQ(entry->source_id, source->id());
|
| + EXPECT_EQ(entry->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry_proto.metrics().empty());
|
| + EXPECT_FALSE(entry->metrics.empty());
|
| ExpectMetric(internal::kUkmEffectiveConnectionType,
|
| - net::EFFECTIVE_CONNECTION_TYPE_3G, entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmHttpRttEstimate, 100, entry_proto.metrics());
|
| - ExpectMetric(internal::kUkmTransportRttEstimate, 200, entry_proto.metrics());
|
| + net::EFFECTIVE_CONNECTION_TYPE_3G, entry.get());
|
| + ExpectMetric(internal::kUkmHttpRttEstimate, 100, entry.get());
|
| + ExpectMetric(internal::kUkmTransportRttEstimate, 200, entry.get());
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) {
|
| @@ -385,11 +353,11 @@ TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) {
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::Entry entry_proto = GetMergedEntryProtoForSourceID(source->id());
|
| - EXPECT_EQ(entry_proto.source_id(), source->id());
|
| - EXPECT_EQ(entry_proto.event_hash(),
|
| + ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| + EXPECT_EQ(entry->source_id, source->id());
|
| + EXPECT_EQ(entry->event_hash,
|
| base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - EXPECT_FALSE(entry_proto.metrics().empty());
|
| + EXPECT_FALSE(entry->metrics.empty());
|
| ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_RELOAD,
|
| - entry_proto.metrics());
|
| + entry.get());
|
| }
|
|
|