blob: 361a88d6c5d9b2216215c59cac6575749306e5f0 [file] [log] [blame]
// Copyright 2018 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/data_reduction_proxy_metrics_observer_base.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/optional.h"
#include "base/process/kill.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h"
#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
#include "chrome/browser/previews/previews_ui_tab_helper.h"
#include "chrome/test/base/testing_browser_process.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
#include "components/page_load_metrics/browser/page_load_metrics_observer.h"
#include "components/page_load_metrics/browser/page_load_tracker.h"
#include "components/page_load_metrics/common/page_load_timing.h"
#include "components/page_load_metrics/common/test/page_load_metrics_test_util.h"
#include "components/previews/content/previews_user_data.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/web_contents_tester.h"
#include "net/base/ip_endpoint.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "services/metrics/public/cpp/ukm_source.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
#include "services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom.h"
#include "third_party/blink/public/platform/web_input_event.h"
namespace data_reduction_proxy {
namespace {
// DataReductionProxyMetricsObserver responsible for modifying data about the
// navigation in OnCommit.
class TestDataReductionProxyMetricsObserverBase
: public DataReductionProxyMetricsObserverBase {
public:
TestDataReductionProxyMetricsObserverBase(
content::WebContents* web_contents,
bool data_reduction_proxy_used,
bool cached_data_reduction_proxy_used,
bool lite_page_used,
bool black_listed,
std::string session_key,
uint64_t page_id)
: web_contents_(web_contents),
data_reduction_proxy_used_(data_reduction_proxy_used),
cached_data_reduction_proxy_used_(cached_data_reduction_proxy_used),
lite_page_used_(lite_page_used),
black_listed_(black_listed),
session_key_(session_key),
page_id_(page_id) {}
~TestDataReductionProxyMetricsObserverBase() override {}
// DataReductionProxyMetricsObserverBase:
ObservePolicy OnCommitCalled(content::NavigationHandle* navigation_handle,
ukm::SourceId source_id) override {
auto data =
std::make_unique<data_reduction_proxy::DataReductionProxyData>();
data->set_request_url(navigation_handle->GetURL());
data->set_used_data_reduction_proxy(data_reduction_proxy_used_);
data->set_was_cached_data_reduction_proxy_response(
cached_data_reduction_proxy_used_);
data->set_request_url(GURL(kDefaultTestUrl));
data->set_lite_page_received(lite_page_used_);
data->set_session_key(session_key_);
data->set_page_id(page_id_);
DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
web_contents_->GetBrowserContext())
->SetDataForNextCommitForTesting(std::move(data));
auto* previews_data = PreviewsDataForNavigationHandle(navigation_handle);
previews_data->set_black_listed_for_lite_page(black_listed_);
return DataReductionProxyMetricsObserverBase::OnCommitCalled(
navigation_handle, source_id);
}
private:
content::WebContents* web_contents_;
bool data_reduction_proxy_used_;
bool cached_data_reduction_proxy_used_;
bool lite_page_used_;
bool black_listed_;
std::string session_key_;
uint64_t page_id_;
DISALLOW_COPY_AND_ASSIGN(TestDataReductionProxyMetricsObserverBase);
};
class DataReductionProxyMetricsObserverBaseTest
: public DataReductionProxyMetricsObserverTestBase {
public:
void ValidateUKM(bool want_ukm,
uint64_t want_original_bytes,
uint64_t want_uuid) {
using UkmEntry = ukm::builders::DataReductionProxy;
auto entries = test_ukm_recorder().GetEntriesByName(UkmEntry::kEntryName);
if (!want_ukm) {
EXPECT_EQ(0u, entries.size());
return;
}
EXPECT_EQ(1u, entries.size());
for (const auto* const entry : entries) {
test_ukm_recorder().ExpectEntrySourceHasUrl(entry, GURL(kDefaultTestUrl));
test_ukm_recorder().ExpectEntryMetric(
entry, UkmEntry::kEstimatedOriginalNetworkBytesName,
want_original_bytes);
test_ukm_recorder().ExpectEntryMetric(
entry, UkmEntry::kDataSaverPageUUIDName, want_uuid);
}
}
protected:
void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
tracker->AddObserver(
std::make_unique<TestDataReductionProxyMetricsObserverBase>(
web_contents(), data_reduction_proxy_used(),
cached_data_reduction_proxy_used(), is_using_lite_page(),
black_listed(), session_key(), page_id()));
}
};
} // namespace
TEST_F(DataReductionProxyMetricsObserverBaseTest,
ValidateUKM_DataSaverNotUsed) {
ResetTest();
RunTestAndNavigateToUntrackedUrl(false, false, false);
ValidateUKM(false, 0U, 0U);
}
TEST_F(DataReductionProxyMetricsObserverBaseTest, ValidateUKM_DataSaverUsed) {
ResetTest();
RunTestAndNavigateToUntrackedUrl(true, false, false);
ValidateUKM(true, 0U, 0U);
}
TEST_F(DataReductionProxyMetricsObserverBaseTest,
ValidateUKM_DataSaverPopulated_Lower) {
ResetTest();
session_key_ = "abc";
page_id_ = 1U;
RunTest(true, false, false, false);
std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources;
resources.push_back(CreateDataReductionProxyResource(
false /* was_cached */, 2 * 1024 /* delta_bytes */,
true /* is_complete */, true /* proxy_used*/, 5 /* compression_ratio */));
SimulateResourceDataUseUpdate(resources);
NavigateToUntrackedUrl();
// Use https://play.golang.org/p/XnMDcTiPzt8 to generate an updated uuid.
ValidateUKM(true, 9918U, 5261012271403106530);
}
TEST_F(DataReductionProxyMetricsObserverBaseTest,
ValidateUKM_DataSaverPopulated_Upper) {
ResetTest();
session_key_ = "xyz";
// Same as 1<<63, but keeps clang happy.
page_id_ = 0x8000000000000000;
RunTest(true, false, false, false);
std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources;
resources.push_back(CreateDataReductionProxyResource(
false /* was_cached */, 2 * 1024 /* delta_bytes */,
true /* is_complete */, true /* proxy_used*/, 5 /* compression_ratio */));
SimulateResourceDataUseUpdate(resources);
NavigateToUntrackedUrl();
// Use https://play.golang.org/p/XnMDcTiPzt8 to generate an updated uuid.
ValidateUKM(true, 9918U, 7538012597823726222);
}
} // namespace data_reduction_proxy