blob: 6b77a7d3fa833d4094e65cbd8e330a0377c22ac9 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_source.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/window_open_disposition.h"
#include "url/gurl.h"
using UkmEntry = ukm::builders::AmpPageLoad;
class AmpPageLoadMetricsBrowserTest : public InProcessBrowserTest {
public:
AmpPageLoadMetricsBrowserTest() {}
~AmpPageLoadMetricsBrowserTest() override {}
void PreRunTestOnMainThread() override {
InProcessBrowserTest::PreRunTestOnMainThread();
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
}
protected:
void StartHttpsServer(net::EmbeddedTestServer::ServerCertificate cert) {
https_test_server_ = std::make_unique<net::EmbeddedTestServer>(
net::EmbeddedTestServer::TYPE_HTTPS);
https_test_server_->SetSSLConfig(cert);
https_test_server_->ServeFilesFromSourceDirectory(GetChromeTestDataDir());
ASSERT_TRUE(https_test_server_->Start());
}
void ExpectMetricValueForUrl(const GURL& url,
const char* metric_name,
const int expected_value) {
for (auto* entry :
test_ukm_recorder_->GetEntriesByName(UkmEntry::kEntryName)) {
auto* source = test_ukm_recorder_->GetSourceForSourceId(entry->source_id);
if (source && source->url() == url) {
test_ukm_recorder_->EntryHasMetric(entry, metric_name);
test_ukm_recorder_->ExpectEntryMetric(entry, metric_name,
expected_value);
}
}
}
void ExpectMetricCountForUrl(const GURL& url,
const char* metric_name,
const int expected_count) {
int count = 0;
for (auto* entry :
test_ukm_recorder_->GetEntriesByName(UkmEntry::kEntryName)) {
auto* source = test_ukm_recorder_->GetSourceForSourceId(entry->source_id);
if (source && source->url() == url &&
test_ukm_recorder_->EntryHasMetric(entry, metric_name)) {
count++;
}
}
EXPECT_EQ(count, expected_count);
}
void CloseAllTabs() {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
content::WebContentsDestroyedWatcher destroyed_watcher(
tab_strip_model->GetActiveWebContents());
tab_strip_model->CloseAllTabs();
destroyed_watcher.Wait();
}
net::EmbeddedTestServer* https_test_server() {
return https_test_server_.get();
}
private:
std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
std::unique_ptr<net::EmbeddedTestServer> https_test_server_;
DISALLOW_COPY_AND_ASSIGN(AmpPageLoadMetricsBrowserTest);
};
IN_PROC_BROWSER_TEST_F(AmpPageLoadMetricsBrowserTest, NoAmp) {
page_load_metrics::PageLoadMetricsTestWaiter waiter(
browser()->tab_strip_model()->GetActiveWebContents());
waiter.AddPageExpectation(
page_load_metrics::PageLoadMetricsTestWaiter::TimingField::kLoadEvent);
StartHttpsServer(net::EmbeddedTestServer::CERT_OK);
GURL url = https_test_server()->GetURL("/english_page.html");
ui_test_utils::NavigateToURL(browser(), url);
waiter.Wait();
CloseAllTabs();
ExpectMetricCountForUrl(url, "MainFrameAmpPageLoad", 0);
ExpectMetricCountForUrl(url, "SubFrameAmpPageLoad", 0);
}
IN_PROC_BROWSER_TEST_F(AmpPageLoadMetricsBrowserTest, AmpMainFrame) {
page_load_metrics::PageLoadMetricsTestWaiter waiter(
browser()->tab_strip_model()->GetActiveWebContents());
waiter.AddPageExpectation(page_load_metrics::PageLoadMetricsTestWaiter::
TimingField::kFirstContentfulPaint);
StartHttpsServer(net::EmbeddedTestServer::CERT_OK);
GURL url = https_test_server()->GetURL("/page_load_metrics/amp_basic.html");
ui_test_utils::NavigateToURL(browser(), url);
waiter.Wait();
CloseAllTabs();
ExpectMetricValueForUrl(url, "MainFrameAmpPageLoad", 1);
ExpectMetricCountForUrl(url, "SubFrameAmpPageLoad", 0);
}
IN_PROC_BROWSER_TEST_F(AmpPageLoadMetricsBrowserTest, AmpSubframe) {
page_load_metrics::PageLoadMetricsTestWaiter waiter(
browser()->tab_strip_model()->GetActiveWebContents());
waiter.AddPageExpectation(page_load_metrics::PageLoadMetricsTestWaiter::
TimingField::kFirstContentfulPaint);
StartHttpsServer(net::EmbeddedTestServer::CERT_OK);
GURL url =
https_test_server()->GetURL("/page_load_metrics/amp_reader_mock.html");
ui_test_utils::NavigateToURL(browser(), url);
waiter.Wait();
CloseAllTabs();
ExpectMetricCountForUrl(url, "MainFrameAmpPageLoad", 0);
ExpectMetricValueForUrl(url, "SubFrameAmpPageLoad", 1);
}