| 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 d71a3de5175449bafd47dea0efbbd9d40aecb48a..d93a403214fcda70c05ad9369667b45edfbc10f4 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
|
| @@ -9,8 +9,6 @@
|
| #include "base/optional.h"
|
| #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/ukm/test_ukm_recorder.h"
|
| #include "components/ukm/ukm_source.h"
|
| #include "net/nqe/effective_connection_type.h"
|
| #include "net/nqe/network_quality_provider.h"
|
| @@ -57,89 +55,19 @@ class UkmPageLoadMetricsObserverTest
|
| EXPECT_CALL(mock_network_quality_provider_, GetTransportRTT())
|
| .Times(AnyNumber())
|
| .WillRepeatedly(Return(base::Optional<base::TimeDelta>()));
|
| -
|
| - TestingBrowserProcess::GetGlobal()->SetUkmRecorder(&test_ukm_recorder_);
|
| }
|
|
|
| - size_t ukm_source_count() { return test_ukm_recorder_.sources_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 test_ukm_recorder_.GetSourceForUrl(url);
|
| - }
|
| -
|
| - const ukm::mojom::UkmEntry* GetUkmEntry(size_t entry_index) {
|
| - return test_ukm_recorder_.GetEntry(entry_index);
|
| - }
|
| -
|
| - 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::mojom::UkmEntry* entry = GetUkmEntry(i);
|
| - if (entry->source_id == source_id)
|
| - entries.push_back(entry);
|
| - }
|
| - return 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::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());
|
| - }
|
| - }
|
| - return merged_entry;
|
| - }
|
| -
|
| - 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 bool HasMetric(const char* name,
|
| - const ukm::mojom::UkmEntry* entry) WARN_UNUSED_RESULT {
|
| - return ukm::TestUkmRecorder::FindMetric(entry, name) != nullptr;
|
| - }
|
| -
|
| - 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);
|
| - }
|
| -
|
| private:
|
| MockNetworkQualityProvider mock_network_quality_provider_;
|
| - ukm::TestUkmRecorder test_ukm_recorder_;
|
| };
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, NoMetrics) {
|
| - EXPECT_EQ(0ul, ukm_source_count());
|
| - EXPECT_EQ(0ul, ukm_entry_count());
|
| + EXPECT_EQ(0ul, ukm_tester().sources_count());
|
| + EXPECT_EQ(0ul, ukm_tester().entries_count());
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, Basic) {
|
| @@ -166,25 +94,28 @@ TEST_F(UkmPageLoadMetricsObserverTest, Basic) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(1ul, ukm_source_count());
|
| - const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
|
| + EXPECT_EQ(1ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 1ul);
|
| - 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->metrics.empty());
|
| - ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
|
| - entry.get());
|
| - ExpectMetric(internal::kUkmParseStartName, 100, entry.get());
|
| - ExpectMetric(internal::kUkmDomContentLoadedName, 200, entry.get());
|
| - ExpectMetric(internal::kUkmFirstPaintName, 250, 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()));
|
| + EXPECT_GE(ukm_tester().entries_count(), 1ul);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmPageTransition,
|
| + ui::PAGE_TRANSITION_LINK);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmParseStartName, 100);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmDomContentLoadedName, 200);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstPaintName, 250);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstContentfulPaintName, 300);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmLoadEventName, 500);
|
| + EXPECT_FALSE(ukm_tester().HasMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstMeaningfulPaintName));
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmForegroundDurationName));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
|
| @@ -201,28 +132,30 @@ TEST_F(UkmPageLoadMetricsObserverTest, FailedProvisionalLoad) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(1ul, ukm_source_count());
|
| - const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
|
| + EXPECT_EQ(1ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 1ul);
|
| - ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source->id());
|
| - EXPECT_EQ(entry->source_id, source->id());
|
| - EXPECT_EQ(entry->event_hash,
|
| - base::HashMetricName(internal::kUkmPageLoadEventName));
|
| + EXPECT_GE(ukm_tester().entries_count(), 1ul);
|
|
|
| // 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(5ul, entry->metrics.size());
|
| - ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_LINK,
|
| - entry.get());
|
| - ExpectMetric(internal::kUkmEffectiveConnectionType,
|
| - net::EFFECTIVE_CONNECTION_TYPE_2G, entry.get());
|
| - ExpectMetric(internal::kUkmNetErrorCode,
|
| - 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()));
|
| + EXPECT_EQ(
|
| + 5, ukm_tester().CountMetrics(*source, internal::kUkmPageLoadEventName));
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmPageTransition,
|
| + ui::PAGE_TRANSITION_LINK);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmEffectiveConnectionType,
|
| + net::EFFECTIVE_CONNECTION_TYPE_2G);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmNetErrorCode,
|
| + static_cast<int64_t>(net::ERR_TIMED_OUT) * -1);
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmForegroundDurationName));
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFailedProvisionaLoadName));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) {
|
| @@ -239,18 +172,15 @@ TEST_F(UkmPageLoadMetricsObserverTest, FirstMeaningfulPaint) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(1ul, ukm_source_count());
|
| - const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
|
| + EXPECT_EQ(1ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 1ul);
|
| - 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->metrics.empty());
|
| - ExpectMetric(internal::kUkmFirstMeaningfulPaintName, 600, entry.get());
|
| - EXPECT_TRUE(HasMetric(internal::kUkmForegroundDurationName, entry.get()));
|
| + EXPECT_GE(ukm_tester().entries_count(), 1ul);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstMeaningfulPaintName, 600);
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmForegroundDurationName));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
|
| @@ -276,34 +206,30 @@ TEST_F(UkmPageLoadMetricsObserverTest, MultiplePageLoads) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(2ul, ukm_source_count());
|
| - const ukm::UkmSource* source1 = GetUkmSourceForUrl(kTestUrl1);
|
| - const ukm::UkmSource* source2 = GetUkmSourceForUrl(kTestUrl2);
|
| + EXPECT_EQ(2ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source1 = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| + const ukm::UkmSource* source2 = ukm_tester().GetSourceForUrl(kTestUrl2);
|
| EXPECT_EQ(GURL(kTestUrl1), source1->url());
|
| EXPECT_EQ(GURL(kTestUrl2), source2->url());
|
| EXPECT_NE(source1->id(), source2->id());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 2ul);
|
| - 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->source_id, source1->id());
|
| - EXPECT_EQ(entry1->event_hash,
|
| - base::HashMetricName(internal::kUkmPageLoadEventName));
|
| - 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->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()));
|
| + EXPECT_GE(ukm_tester().entries_count(), 2ul);
|
| +
|
| + ukm_tester().ExpectMetric(*source1, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstContentfulPaintName, 200);
|
| + EXPECT_FALSE(ukm_tester().HasMetric(*source2, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstMeaningfulPaintName));
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source1, internal::kUkmPageLoadEventName,
|
| + internal::kUkmForegroundDurationName));
|
| +
|
| + EXPECT_FALSE(ukm_tester().HasMetric(*source2, internal::kUkmPageLoadEventName,
|
| + internal::kUkmParseStartName));
|
| + EXPECT_FALSE(ukm_tester().HasMetric(*source2, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstContentfulPaintName));
|
| + EXPECT_FALSE(ukm_tester().HasMetric(*source2, internal::kUkmPageLoadEventName,
|
| + internal::kUkmFirstMeaningfulPaintName));
|
| + EXPECT_TRUE(ukm_tester().HasMetric(*source2, internal::kUkmPageLoadEventName,
|
| + internal::kUkmForegroundDurationName));
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) {
|
| @@ -319,20 +245,18 @@ TEST_F(UkmPageLoadMetricsObserverTest, NetworkQualityEstimates) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(1ul, ukm_source_count());
|
| - const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
|
| + EXPECT_EQ(1ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 1ul);
|
| - 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->metrics.empty());
|
| - ExpectMetric(internal::kUkmEffectiveConnectionType,
|
| - net::EFFECTIVE_CONNECTION_TYPE_3G, entry.get());
|
| - ExpectMetric(internal::kUkmHttpRttEstimate, 100, entry.get());
|
| - ExpectMetric(internal::kUkmTransportRttEstimate, 200, entry.get());
|
| + EXPECT_GE(ukm_tester().entries_count(), 1ul);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmEffectiveConnectionType,
|
| + net::EFFECTIVE_CONNECTION_TYPE_3G);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmHttpRttEstimate, 100);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmTransportRttEstimate, 200);
|
| }
|
|
|
| TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) {
|
| @@ -343,16 +267,12 @@ TEST_F(UkmPageLoadMetricsObserverTest, PageTransitionReload) {
|
| // Simulate closing the tab.
|
| DeleteContents();
|
|
|
| - EXPECT_EQ(1ul, ukm_source_count());
|
| - const ukm::UkmSource* source = GetUkmSourceForUrl(kTestUrl1);
|
| + EXPECT_EQ(1ul, ukm_tester().sources_count());
|
| + const ukm::UkmSource* source = ukm_tester().GetSourceForUrl(kTestUrl1);
|
| EXPECT_EQ(GURL(kTestUrl1), source->url());
|
|
|
| - EXPECT_GE(ukm_entry_count(), 1ul);
|
| - 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->metrics.empty());
|
| - ExpectMetric(internal::kUkmPageTransition, ui::PAGE_TRANSITION_RELOAD,
|
| - entry.get());
|
| + EXPECT_GE(ukm_tester().entries_count(), 1ul);
|
| + ukm_tester().ExpectMetric(*source, internal::kUkmPageLoadEventName,
|
| + internal::kUkmPageTransition,
|
| + ui::PAGE_TRANSITION_RELOAD);
|
| }
|
|
|