Index: chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc |
diff --git a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc |
index e83ed8cef2503a2c2476f4565f5a02fe64877c33..db7ec7303d7eae517ff5c66635ba55b95b8ed4e0 100644 |
--- a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc |
+++ b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc |
@@ -9,8 +9,11 @@ |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
+#include "base/metrics/metrics_hashes.h" |
#include "chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h" |
#include "chrome/browser/page_load_metrics/page_load_metrics_util.h" |
+#include "chrome/common/page_load_metrics/page_load_metrics_messages.h" |
+#include "chrome/test/base/testing_browser_process.h" |
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/web_contents.h" |
@@ -58,6 +61,7 @@ PageLoadMetricsObserverTestHarness::~PageLoadMetricsObserverTestHarness() {} |
void PageLoadMetricsObserverTestHarness::SetUp() { |
ChromeRenderViewHostTestHarness::SetUp(); |
+ ukm_tester_.SetUp(); |
SetContents(CreateTestWebContents()); |
NavigateAndCommit(GURL("http://www.google.com")); |
observer_ = MetricsWebContentsObserver::CreateForWebContents( |
@@ -146,6 +150,109 @@ void PageLoadMetricsObserverTestHarness::NavigateWithPageTransitionAndCommit( |
content::WebContentsTester::For(web_contents())->CommitPendingNavigation(); |
} |
+void PageLoadMetricsObserverTestHarness::UkmTester::SetUp() { |
+ TestingBrowserProcess::GetGlobal()->SetUkmRecorder(&test_ukm_recorder_); |
+} |
+ |
+const ukm::UkmSource* |
+PageLoadMetricsObserverTestHarness::UkmTester::GetSourceForUrl( |
+ const char* url) const { |
+ std::vector<const ukm::UkmSource*> matching_sources = GetSourcesForUrl(url); |
+ EXPECT_LE(1ul, matching_sources.size()); |
+ return matching_sources.empty() ? nullptr : matching_sources.back(); |
+} |
+ |
+std::vector<const ukm::UkmSource*> |
+PageLoadMetricsObserverTestHarness::UkmTester::GetSourcesForUrl( |
+ const char* url) const { |
+ std::vector<const ukm::UkmSource*> matching_sources; |
+ for (const auto& candidate : test_ukm_recorder_.GetSources()) { |
+ if (candidate.second->url() == url) |
+ matching_sources.push_back(candidate.second.get()); |
+ } |
+ return matching_sources; |
+} |
+ |
+std::vector<const ukm::mojom::UkmEntry*> |
+PageLoadMetricsObserverTestHarness::UkmTester::GetEntriesForSourceID( |
+ ukm::SourceId source_id, |
+ const char* event) const { |
+ std::vector<const ukm::mojom::UkmEntry*> entries; |
+ for (size_t i = 0; i < entries_count(); ++i) { |
+ const ukm::mojom::UkmEntry* entry = test_ukm_recorder_.GetEntry(i); |
+ if (entry->source_id == source_id && |
+ entry->event_hash == base::HashMetricName(event)) { |
+ entries.push_back(entry); |
+ } |
+ } |
+ return entries; |
+} |
+ |
+// static |
+ukm::mojom::UkmEntryPtr |
+PageLoadMetricsObserverTestHarness::UkmTester::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 |
+PageLoadMetricsObserverTestHarness::UkmTester::GetMergedEntryForSourceID( |
+ ukm::SourceId source_id, |
+ const char* event) const { |
+ ukm::mojom::UkmEntryPtr entry = |
+ GetMergedEntry(GetEntriesForSourceID(source_id, event)); |
+ EXPECT_EQ(source_id, entry->source_id); |
+ EXPECT_EQ(base::HashMetricName(event), entry->event_hash); |
+ return entry; |
+} |
+ |
+bool PageLoadMetricsObserverTestHarness::UkmTester::HasEntry( |
+ const ukm::UkmSource& source, |
+ const char* event) const { |
+ return !GetEntriesForSourceID(source.id(), event).empty(); |
+} |
+ |
+int PageLoadMetricsObserverTestHarness::UkmTester::CountMetrics( |
+ const ukm::UkmSource& source, |
+ const char* event) const { |
+ ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source.id(), event); |
+ return entry.get() ? entry->metrics.size() : 0; |
+} |
+ |
+bool PageLoadMetricsObserverTestHarness::UkmTester::HasMetric( |
+ const ukm::UkmSource& source, |
+ const char* event, |
+ const char* name) const { |
+ ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source.id(), event); |
+ return ukm::TestUkmRecorder::FindMetric(entry.get(), name) != nullptr; |
+} |
+ |
+void PageLoadMetricsObserverTestHarness::UkmTester::ExpectMetric( |
+ const ukm::UkmSource& source, |
+ const char* event, |
+ const char* name, |
+ int64_t expected_value) const { |
+ ukm::mojom::UkmEntryPtr entry = GetMergedEntryForSourceID(source.id(), event); |
+ const ukm::mojom::UkmMetric* metric = |
+ ukm::TestUkmRecorder::FindMetric(entry.get(), name); |
+ EXPECT_NE(nullptr, metric) << "Failed to find metric: " << name; |
+ EXPECT_EQ(expected_value, metric->value); |
+} |
+ |
const char PageLoadMetricsObserverTestHarness::kResourceUrl[] = |
"https://www.example.com/resource"; |