| 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 d289ab460e927b1b82df58f481642283a9681391..7f0a754e75bfe0e47230aa7fc4978e1854b70d6e 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
|
| @@ -5,14 +5,18 @@
|
| #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h"
|
|
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/metrics_hashes.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/ukm_source.h"
|
|
|
| namespace {
|
|
|
| -const char kDefaultTestUrl[] = "https://google.com";
|
| +const char kTestUrl1[] = "https://www.google.com/";
|
| +const char kTestUrl2[] = "https://www.example.com/";
|
|
|
| } // namespace
|
|
|
| @@ -30,45 +34,139 @@ class UkmPageLoadMetricsObserverTest
|
| ukm_service_test_harness_.test_ukm_service());
|
| }
|
|
|
| - void InitializeTestPageLoadTiming(page_load_metrics::PageLoadTiming* timing) {
|
| - timing->navigation_start = base::Time::FromInternalValue(1);
|
| - timing->first_contentful_paint = base::TimeDelta::FromInternalValue(300);
|
| - PopulateRequiredTimingFields(timing);
|
| - }
|
| -
|
| size_t ukm_source_count() {
|
| return ukm_service_test_harness_.test_ukm_service()->sources_count();
|
| }
|
|
|
| + size_t ukm_entry_count() {
|
| + return ukm_service_test_harness_.test_ukm_service()->entries_count();
|
| + }
|
| +
|
| const ukm::UkmSource* GetUkmSource(size_t source_index) {
|
| return ukm_service_test_harness_.test_ukm_service()->GetSource(
|
| source_index);
|
| }
|
|
|
| + const ukm::UkmEntry* GetUkmEntry(size_t entry_index) {
|
| + return ukm_service_test_harness_.test_ukm_service()->GetEntry(entry_index);
|
| + }
|
| +
|
| + static const ukm::Entry_Metric* FindMetric(
|
| + const char* name,
|
| + const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) {
|
| + for (const auto& metric : metrics) {
|
| + if (metric.metric_hash() == base::HashMetricName(name))
|
| + return &metric;
|
| + }
|
| + return nullptr;
|
| + }
|
| +
|
| + static bool HasMetric(
|
| + const char* name,
|
| + const google::protobuf::RepeatedPtrField<ukm::Entry_Metric>& metrics) {
|
| + 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);
|
| + EXPECT_NE(nullptr, metric) << "Failed to find metric: " << name;
|
| + EXPECT_EQ(expected_value, metric->value());
|
| + }
|
| +
|
| private:
|
| ukm::UkmServiceTestingHarness ukm_service_test_harness_;
|
| };
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, NoMetrics) {
|
| EXPECT_EQ(0ul, ukm_source_count());
|
| + EXPECT_EQ(0ul, ukm_entry_count());
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, FirstContentfulPaint) {
|
| page_load_metrics::PageLoadTiming timing;
|
| - InitializeTestPageLoadTiming(&timing);
|
| + timing.navigation_start = base::Time::FromDoubleT(1);
|
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(300);
|
| + PopulateRequiredTimingFields(&timing);
|
|
|
| - NavigateAndCommit(GURL(kDefaultTestUrl));
|
| + NavigateAndCommit(GURL(kTestUrl1));
|
| SimulateTimingUpdate(timing);
|
|
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| EXPECT_EQ(1ul, ukm_source_count());
|
| -
|
| const ukm::UkmSource* source = GetUkmSource(0);
|
| - ASSERT_TRUE(source);
|
| + EXPECT_EQ(GURL(kTestUrl1), source->url());
|
| +
|
| + EXPECT_EQ(1ul, ukm_entry_count());
|
| + const ukm::UkmEntry* entry = GetUkmEntry(0);
|
| + EXPECT_EQ(entry->source_id(), source->id());
|
| +
|
| + ukm::Entry entry_proto;
|
| + entry->PopulateProto(&entry_proto);
|
| + EXPECT_EQ(entry_proto.source_id(), source->id());
|
| + EXPECT_EQ(entry_proto.event_hash(),
|
| + base::HashMetricName(internal::kUkmPageLoadEventName));
|
| + EXPECT_GE(entry_proto.metrics_size(), 1);
|
| + ExpectMetric(internal::kUkmFirstContentfulPaintName, 300,
|
| + entry_proto.metrics());
|
| +}
|
| +
|
| +TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
|
| + page_load_metrics::PageLoadTiming timing1;
|
| + timing1.navigation_start = base::Time::FromDoubleT(1);
|
| + timing1.first_contentful_paint = base::TimeDelta::FromMilliseconds(200);
|
| + PopulateRequiredTimingFields(&timing1);
|
| +
|
| + // Second navigation reports no timing metrics.
|
| + page_load_metrics::PageLoadTiming timing2;
|
| + timing2.navigation_start = base::Time::FromDoubleT(1);
|
| + timing2.first_contentful_paint = base::TimeDelta::FromMilliseconds(300);
|
| + PopulateRequiredTimingFields(&timing2);
|
| +
|
| + NavigateAndCommit(GURL(kTestUrl1));
|
| + SimulateTimingUpdate(timing1);
|
| +
|
| + NavigateAndCommit(GURL(kTestUrl2));
|
| + SimulateTimingUpdate(timing2);
|
| +
|
| + // Simulate closing the tab.
|
| + DeleteContents();
|
|
|
| - EXPECT_EQ(GURL(kDefaultTestUrl), source->committed_url());
|
| - EXPECT_EQ(base::TimeDelta::FromInternalValue(300),
|
| - source->first_contentful_paint());
|
| + EXPECT_EQ(2ul, ukm_source_count());
|
| + const ukm::UkmSource* source1 = GetUkmSource(0);
|
| + const ukm::UkmSource* source2 = GetUkmSource(1);
|
| + EXPECT_EQ(GURL(kTestUrl1), source1->url());
|
| + EXPECT_EQ(GURL(kTestUrl2), source2->url());
|
| + EXPECT_NE(source1->id(), source2->id());
|
| +
|
| + EXPECT_EQ(2ul, ukm_entry_count());
|
| + const ukm::UkmEntry* entry1 = GetUkmEntry(0);
|
| + const ukm::UkmEntry* entry2 = GetUkmEntry(1);
|
| + EXPECT_EQ(entry1->source_id(), source1->id());
|
| + EXPECT_EQ(entry2->source_id(), source2->id());
|
| + EXPECT_NE(entry1->source_id(), entry2->source_id());
|
| +
|
| + ukm::Entry entry1_proto;
|
| + entry1->PopulateProto(&entry1_proto);
|
| + ukm::Entry entry2_proto;
|
| + entry2->PopulateProto(&entry2_proto);
|
| + EXPECT_NE(entry1_proto.source_id(), entry2_proto.source_id());
|
| +
|
| + EXPECT_EQ(entry1_proto.source_id(), source1->id());
|
| + EXPECT_EQ(entry1_proto.event_hash(),
|
| + base::HashMetricName(internal::kUkmPageLoadEventName));
|
| + EXPECT_GE(entry1_proto.metrics_size(), 1);
|
| + ExpectMetric(internal::kUkmFirstContentfulPaintName, 200,
|
| + entry1_proto.metrics());
|
| +
|
| + EXPECT_EQ(entry2_proto.source_id(), source2->id());
|
| + EXPECT_EQ(entry2_proto.event_hash(),
|
| + base::HashMetricName(internal::kUkmPageLoadEventName));
|
| + EXPECT_GE(entry2_proto.metrics_size(), 1);
|
| + ExpectMetric(internal::kUkmFirstContentfulPaintName, 300,
|
| + entry2_proto.metrics());
|
| }
|
|
|