Commit 912ebabb authored by Ryan Sturm's avatar Ryan Sturm Committed by Commit Bot

Moving NoScript savings from CDUA to PLM

NoScript savings was previously recorded on the IO thread using
ChromeDataUseAscriber framework. This framework is being deprecated and
this change is blocking parts of previews servification. The results
from looking at this on real no script pages was not far off from the
results using CDUA, and I believe it is accurate enough.

Bug: 842233
Change-Id: I70057574554fd6717e0837be1a46cb6afa05ce4b
Reviewed-on: https://chromium-review.googlesource.com/1139081
Commit-Queue: Ryan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Reviewed-by: default avatarrajendrant <rajendrant@chromium.org>
Cr-Commit-Position: refs/heads/master@{#577216}
parent e3045918
...@@ -7,12 +7,19 @@ ...@@ -7,12 +7,19 @@
#include "base/optional.h" #include "base/optional.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/loader/chrome_navigation_data.h" #include "chrome/browser/loader/chrome_navigation_data.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/page_load_metrics_util.h" #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
#include "chrome/common/page_load_metrics/page_load_timing.h" #include "chrome/common/page_load_metrics/page_load_timing.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
#include "components/previews/content/previews_content_util.h" #include "components/previews/content/previews_content_util.h"
#include "components/previews/core/previews_experiments.h" #include "components/previews/core/previews_experiments.h"
#include "components/previews/core/previews_user_data.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
namespace previews { namespace previews {
...@@ -70,10 +77,15 @@ NoScriptPreviewPageLoadMetricsObserver::OnCommit( ...@@ -70,10 +77,15 @@ NoScriptPreviewPageLoadMetricsObserver::OnCommit(
previews::PreviewsType preview_type = previews::PreviewsType preview_type =
previews::GetMainFramePreviewsType(nav_data->previews_state()); previews::GetMainFramePreviewsType(nav_data->previews_state());
if (preview_type == previews::PreviewsType::NOSCRIPT) if (preview_type != previews::PreviewsType::NOSCRIPT)
return CONTINUE_OBSERVING; return STOP_OBSERVING;
return STOP_OBSERVING; data_savings_inflation_percent_ =
nav_data->previews_user_data()->data_savings_inflation_percent();
browser_context_ = navigation_handle->GetWebContents()->GetBrowserContext();
return CONTINUE_OBSERVING;
} }
page_load_metrics::PageLoadMetricsObserver::ObservePolicy page_load_metrics::PageLoadMetricsObserver::ObservePolicy
...@@ -91,6 +103,27 @@ NoScriptPreviewPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( ...@@ -91,6 +103,27 @@ NoScriptPreviewPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground(
return STOP_OBSERVING; return STOP_OBSERVING;
} }
void NoScriptPreviewPageLoadMetricsObserver::OnLoadEventStart(
const page_load_metrics::mojom::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) {
// TODO(dougarnett): Determine if a different event makes more sense.
// https://crbug.com/864720
int64_t inflation_bytes = 0;
if (data_savings_inflation_percent_ == 0) {
data_savings_inflation_percent_ =
previews::params::NoScriptPreviewsInflationPercent();
inflation_bytes = previews::params::NoScriptPreviewsInflationBytes();
}
int64_t total_saved_bytes =
(total_network_bytes_ * data_savings_inflation_percent_) / 100 +
inflation_bytes;
DCHECK(info.url.SchemeIs(url::kHttpsScheme));
WriteToSavings(info.url, total_saved_bytes);
}
void NoScriptPreviewPageLoadMetricsObserver::OnLoadedResource( void NoScriptPreviewPageLoadMetricsObserver::OnLoadedResource(
const page_load_metrics::ExtraRequestCompleteInfo& const page_load_metrics::ExtraRequestCompleteInfo&
extra_request_complete_info) { extra_request_complete_info) {
...@@ -145,4 +178,32 @@ void NoScriptPreviewPageLoadMetricsObserver::RecordTimingMetrics( ...@@ -145,4 +178,32 @@ void NoScriptPreviewPageLoadMetricsObserver::RecordTimingMetrics(
} }
} }
void NoScriptPreviewPageLoadMetricsObserver::OnDataUseObserved(
int64_t received_data_length,
int64_t data_reduction_proxy_bytes_saved) {
total_network_bytes_ += received_data_length;
}
void NoScriptPreviewPageLoadMetricsObserver::WriteToSavings(
const GURL& url,
int64_t bytes_saved) {
DCHECK(url.SchemeIs(url::kHttpsScheme));
data_reduction_proxy::DataReductionProxySettings*
data_reduction_proxy_settings =
DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
browser_context_);
bool data_saver_enabled =
data_reduction_proxy_settings->IsDataReductionProxyEnabled();
data_reduction_proxy_settings->data_reduction_proxy_service()
->UpdateContentLengths(0, bytes_saved, data_saver_enabled,
data_reduction_proxy::HTTPS, "text/html", true,
data_use_measurement::DataUseUserData::OTHER, 0);
data_reduction_proxy_settings->data_reduction_proxy_service()
->UpdateDataUseForHost(0, bytes_saved, url.HostNoBrackets());
}
} // namespace previews } // namespace previews
...@@ -50,6 +50,15 @@ class NoScriptPreviewPageLoadMetricsObserver ...@@ -50,6 +50,15 @@ class NoScriptPreviewPageLoadMetricsObserver
extra_request_complete_info) override; extra_request_complete_info) override;
void OnComplete(const page_load_metrics::mojom::PageLoadTiming& timing, void OnComplete(const page_load_metrics::mojom::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) override; const page_load_metrics::PageLoadExtraInfo& info) override;
void OnLoadEventStart(
const page_load_metrics::mojom::PageLoadTiming& timing,
const page_load_metrics::PageLoadExtraInfo& info) override;
void OnDataUseObserved(int64_t received_data_length,
int64_t data_reduction_proxy_bytes_saved) override;
protected:
// Virtual for testing. Writes the savings to the data saver feature.
virtual void WriteToSavings(const GURL& url, int64_t byte_savings);
private: private:
void RecordTimingMetrics( void RecordTimingMetrics(
...@@ -59,6 +68,16 @@ class NoScriptPreviewPageLoadMetricsObserver ...@@ -59,6 +68,16 @@ class NoScriptPreviewPageLoadMetricsObserver
// Records UMA of page size when the observer is about to be deleted. // Records UMA of page size when the observer is about to be deleted.
void RecordPageSizeUMA() const; void RecordPageSizeUMA() const;
content::BrowserContext* browser_context_;
// The total number of bytes from OnDataUseObserved().
int64_t total_network_bytes_ = 0;
// The percent of bytes used by load event that should be considered savings.
// This is often larger than 100 as it corresponds to bytes that were not
// downloaded.
int data_savings_inflation_percent_ = 0;
int64_t num_network_resources_ = 0; int64_t num_network_resources_ = 0;
int64_t network_bytes_ = 0; int64_t network_bytes_ = 0;
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
#include "chrome/browser/page_load_metrics/observers/noscript_preview_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/noscript_preview_page_load_metrics_observer.h"
#include <stdint.h> #include <stdint.h>
#include <map>
#include <memory> #include <memory>
#include <string>
#include <utility> #include <utility>
#include "base/macros.h" #include "base/macros.h"
...@@ -19,6 +21,7 @@ ...@@ -19,6 +21,7 @@
#include "chrome/common/page_load_metrics/page_load_timing.h" #include "chrome/common/page_load_metrics/page_load_timing.h"
#include "chrome/common/page_load_metrics/test/page_load_metrics_test_util.h" #include "chrome/common/page_load_metrics/test/page_load_metrics_test_util.h"
#include "components/previews/core/previews_features.h" #include "components/previews/core/previews_features.h"
#include "components/previews/core/previews_user_data.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/previews_state.h" #include "content/public/common/previews_state.h"
#include "content/public/test/navigation_simulator.h" #include "content/public/test/navigation_simulator.h"
...@@ -30,6 +33,22 @@ namespace { ...@@ -30,6 +33,22 @@ namespace {
const char kDefaultTestUrl[] = "https://www.google.com"; const char kDefaultTestUrl[] = "https://www.google.com";
class TestNoScriptPreviewPageLoadMetricsObserver
: public NoScriptPreviewPageLoadMetricsObserver {
public:
TestNoScriptPreviewPageLoadMetricsObserver(
base::OnceCallback<void(const GURL&, int64_t)> bytes_callback)
: bytes_callback_(std::move(bytes_callback)) {}
~TestNoScriptPreviewPageLoadMetricsObserver() override {}
void WriteToSavings(const GURL& url, int64_t bytes_savings) override {
std::move(bytes_callback_).Run(url, bytes_savings);
}
private:
base::OnceCallback<void(const GURL&, int64_t)> bytes_callback_;
};
class NoScriptPreviewPageLoadMetricsObserverTest class NoScriptPreviewPageLoadMetricsObserverTest
: public page_load_metrics::PageLoadMetricsObserverTestHarness { : public page_load_metrics::PageLoadMetricsObserverTestHarness {
public: public:
...@@ -64,6 +83,10 @@ class NoScriptPreviewPageLoadMetricsObserverTest ...@@ -64,6 +83,10 @@ class NoScriptPreviewPageLoadMetricsObserverTest
navigation_simulator->Start(); navigation_simulator->Start();
auto chrome_navigation_data = std::make_unique<ChromeNavigationData>(); auto chrome_navigation_data = std::make_unique<ChromeNavigationData>();
chrome_navigation_data->set_previews_state(previews_state); chrome_navigation_data->set_previews_state(previews_state);
auto data = std::make_unique<previews::PreviewsUserData>(1);
chrome_navigation_data->set_previews_user_data(std::move(data));
content::WebContentsTester::For(web_contents()) content::WebContentsTester::For(web_contents())
->SetNavigationData(navigation_simulator->GetNavigationHandle(), ->SetNavigationData(navigation_simulator->GetNavigationHandle(),
std::move(chrome_navigation_data)); std::move(chrome_navigation_data));
...@@ -124,14 +147,25 @@ class NoScriptPreviewPageLoadMetricsObserverTest ...@@ -124,14 +147,25 @@ class NoScriptPreviewPageLoadMetricsObserverTest
} }
} }
void WriteToSavings(const GURL& url, int64_t bytes_savings) {
savings_url_ = url;
bytes_savings_ = bytes_savings;
}
protected: protected:
void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
tracker->AddObserver( tracker->AddObserver(
std::make_unique<NoScriptPreviewPageLoadMetricsObserver>()); std::make_unique<TestNoScriptPreviewPageLoadMetricsObserver>(
base::BindOnce(
&NoScriptPreviewPageLoadMetricsObserverTest::WriteToSavings,
base::Unretained(this))));
} }
page_load_metrics::mojom::PageLoadTiming timing_; page_load_metrics::mojom::PageLoadTiming timing_;
GURL savings_url_;
int64_t bytes_savings_ = 0;
private: private:
DISALLOW_COPY_AND_ASSIGN(NoScriptPreviewPageLoadMetricsObserverTest); DISALLOW_COPY_AND_ASSIGN(NoScriptPreviewPageLoadMetricsObserverTest);
}; };
...@@ -214,6 +248,35 @@ TEST_F(NoScriptPreviewPageLoadMetricsObserverTest, NoScriptPreviewSeen) { ...@@ -214,6 +248,35 @@ TEST_F(NoScriptPreviewPageLoadMetricsObserverTest, NoScriptPreviewSeen) {
25 * 1024 /* network_bytes */); 25 * 1024 /* network_bytes */);
} }
TEST_F(NoScriptPreviewPageLoadMetricsObserverTest, DataSavings) {
int inflation = 50;
int constant_savings = 120;
base::test::ScopedFeatureList scoped_feature_list;
std::map<std::string, std::string> parameters = {
{"NoScriptInflationPercent", base::IntToString(inflation)},
{"NoScriptInflationBytes", base::IntToString(constant_savings)}};
scoped_feature_list.InitAndEnableFeatureWithParameters(
previews::features::kNoScriptPreviews, parameters);
ResetTest();
int64_t data_use = 0;
NavigateAndCommitWithPreviewsState(content::NOSCRIPT_ON);
SimulatePageLoadDataUseUpdate({5 * 1024, 0});
data_use += (5 * 1024);
SimulatePageLoadDataUseUpdate({20 * 1024, 13});
data_use += (20 * 1024);
SimulateTimingUpdate(timing_);
int64_t expected_savings = (data_use * inflation) / 100 + constant_savings;
EXPECT_EQ(GURL(kDefaultTestUrl), savings_url_);
EXPECT_EQ(expected_savings, bytes_savings_);
}
} // namespace } // namespace
} // namespace previews } // namespace previews
...@@ -59,6 +59,11 @@ void PageLoadMetricsObserverTestHarness::SimulateTimingAndMetadataUpdate( ...@@ -59,6 +59,11 @@ void PageLoadMetricsObserverTestHarness::SimulateTimingAndMetadataUpdate(
tester_->SimulateTimingAndMetadataUpdate(timing, metadata); tester_->SimulateTimingAndMetadataUpdate(timing, metadata);
} }
void PageLoadMetricsObserverTestHarness::SimulatePageLoadDataUseUpdate(
const mojom::PageLoadDataUse& data_use) {
tester_->SimulatePageLoadDataUseUpdate(data_use);
}
void PageLoadMetricsObserverTestHarness::SimulateFeaturesUpdate( void PageLoadMetricsObserverTestHarness::SimulateFeaturesUpdate(
const mojom::PageLoadFeatures& new_features) { const mojom::PageLoadFeatures& new_features) {
tester_->SimulateFeaturesUpdate(new_features); tester_->SimulateFeaturesUpdate(new_features);
......
...@@ -83,6 +83,7 @@ class PageLoadMetricsObserverTestHarness ...@@ -83,6 +83,7 @@ class PageLoadMetricsObserverTestHarness
const mojom::PageLoadTiming& timing, const mojom::PageLoadTiming& timing,
const mojom::PageLoadMetadata& metadata, const mojom::PageLoadMetadata& metadata,
const mojom::PageLoadFeatures& new_features); const mojom::PageLoadFeatures& new_features);
void SimulatePageLoadDataUseUpdate(const mojom::PageLoadDataUse& data_use);
// Simulates a loaded resource. Main frame resources must specify a // Simulates a loaded resource. Main frame resources must specify a
// GlobalRequestID, using the SimulateLoadedResource() method that takes a // GlobalRequestID, using the SimulateLoadedResource() method that takes a
......
...@@ -97,6 +97,13 @@ void PageLoadMetricsObserverTester::SimulatePageLoadTimingUpdate( ...@@ -97,6 +97,13 @@ void PageLoadMetricsObserverTester::SimulatePageLoadTimingUpdate(
mock_timer->Fire(); mock_timer->Fire();
} }
void PageLoadMetricsObserverTester::SimulatePageLoadDataUseUpdate(
const mojom::PageLoadDataUse& data_use) {
observer_->OnTimingUpdated(web_contents()->GetMainFrame(),
mojom::PageLoadTiming(), mojom::PageLoadMetadata(),
mojom::PageLoadFeatures(), data_use);
}
void PageLoadMetricsObserverTester::SimulateLoadedResource( void PageLoadMetricsObserverTester::SimulateLoadedResource(
const ExtraRequestCompleteInfo& info) { const ExtraRequestCompleteInfo& info) {
SimulateLoadedResource(info, content::GlobalRequestID()); SimulateLoadedResource(info, content::GlobalRequestID());
......
...@@ -54,6 +54,7 @@ class PageLoadMetricsObserverTester : public test::WeakMockTimerProvider { ...@@ -54,6 +54,7 @@ class PageLoadMetricsObserverTester : public test::WeakMockTimerProvider {
const mojom::PageLoadTiming& timing, const mojom::PageLoadTiming& timing,
const mojom::PageLoadMetadata& metadata, const mojom::PageLoadMetadata& metadata,
const mojom::PageLoadFeatures& new_features); const mojom::PageLoadFeatures& new_features);
void SimulatePageLoadDataUseUpdate(const mojom::PageLoadDataUse& data_use);
// Simulates a loaded resource. Main frame resources must specify a // Simulates a loaded resource. Main frame resources must specify a
// GlobalRequestID, using the SimulateLoadedResource() method that takes a // GlobalRequestID, using the SimulateLoadedResource() method that takes a
......
...@@ -439,6 +439,9 @@ void PageLoadMetricsUpdateDispatcher::UpdateMetrics( ...@@ -439,6 +439,9 @@ void PageLoadMetricsUpdateDispatcher::UpdateMetrics(
return; return;
} }
// Report data usage before new timing and metadata for messages that have
// both updates.
client_->UpdateDataUse(new_data_use);
if (render_frame_host->GetParent() == nullptr) { if (render_frame_host->GetParent() == nullptr) {
UpdateMainFrameMetadata(new_metadata); UpdateMainFrameMetadata(new_metadata);
UpdateMainFrameTiming(new_timing); UpdateMainFrameTiming(new_timing);
...@@ -447,7 +450,6 @@ void PageLoadMetricsUpdateDispatcher::UpdateMetrics( ...@@ -447,7 +450,6 @@ void PageLoadMetricsUpdateDispatcher::UpdateMetrics(
UpdateSubFrameTiming(render_frame_host, new_timing); UpdateSubFrameTiming(render_frame_host, new_timing);
} }
client_->UpdateFeaturesUsage(new_features); client_->UpdateFeaturesUsage(new_features);
client_->UpdateDataUse(new_data_use);
} }
void PageLoadMetricsUpdateDispatcher::UpdateFeatures( void PageLoadMetricsUpdateDispatcher::UpdateFeatures(
......
...@@ -180,7 +180,6 @@ source_set("unit_tests") { ...@@ -180,7 +180,6 @@ source_set("unit_tests") {
"data_reduction_proxy_config_unittest.cc", "data_reduction_proxy_config_unittest.cc",
"data_reduction_proxy_configurator_unittest.cc", "data_reduction_proxy_configurator_unittest.cc",
"data_reduction_proxy_data_unittest.cc", "data_reduction_proxy_data_unittest.cc",
"data_reduction_proxy_data_use_observer_unittest.cc",
"data_reduction_proxy_delegate_unittest.cc", "data_reduction_proxy_delegate_unittest.cc",
"data_reduction_proxy_interceptor_unittest.cc", "data_reduction_proxy_interceptor_unittest.cc",
"data_reduction_proxy_io_data_unittest.cc", "data_reduction_proxy_io_data_unittest.cc",
......
...@@ -142,41 +142,6 @@ void DataReductionProxyDataUseObserver::OnPageResourceLoad( ...@@ -142,41 +142,6 @@ void DataReductionProxyDataUseObserver::OnPageResourceLoad(
void DataReductionProxyDataUseObserver::OnPageDidFinishLoad( void DataReductionProxyDataUseObserver::OnPageDidFinishLoad(
data_use_measurement::DataUse* data_use) { data_use_measurement::DataUse* data_use) {
// This is good place to update data savings based on the overall page
// load. If we waited until the |OnPageLoadConcluded| callback, we would miss
// cases where the page loaded but the user doesn't navigate away before
// Android kills chrome.
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
previews::PreviewsUserData* previews_user_data =
reinterpret_cast<previews::PreviewsUserData*>(
data_use->GetUserData(kDataUsePreviewsUserDataKey));
if (previews_user_data) {
// Report estimated data savings for NOSCRIPT if applicable.
if (previews_user_data->committed_previews_type() ==
previews::PreviewsType::NOSCRIPT) {
int inflation_percent =
previews::params::NoScriptPreviewsInflationPercent();
int inflation_bytes = previews::params::NoScriptPreviewsInflationBytes();
if (previews_user_data->data_savings_inflation_percent() != 0) {
// Use specific inflation percent rather than default.
inflation_percent =
previews_user_data->data_savings_inflation_percent();
inflation_bytes = 0;
}
int total_inflated_bytes =
(data_use->total_bytes_received() * inflation_percent) / 100 +
inflation_bytes;
// Report for overall usage.
DCHECK(data_use->url().SchemeIs(url::kHttpsScheme));
data_reduction_proxy_io_data_->UpdateContentLengths(
0, total_inflated_bytes, data_reduction_proxy_io_data_->IsEnabled(),
HTTPS, std::string(), true,
data_use_measurement::DataUseUserData::OTHER, 0);
// Report for host usage.
data_reduction_proxy_io_data_->UpdateDataUseForHost(
0, total_inflated_bytes, data_use->url().HostNoBrackets());
}
}
} }
const void* const void*
......
// Copyright 2017 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 "components/data_reduction_proxy/core/browser/data_reduction_proxy_data_use_observer.h"
#include <map>
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h"
#include "components/data_use_measurement/core/data_use.h"
#include "components/data_use_measurement/core/data_use_ascriber.h"
#include "components/data_use_measurement/core/data_use_recorder.h"
#include "components/data_use_measurement/core/url_request_classifier.h"
#include "components/previews/core/previews_experiments.h"
#include "components/previews/core/previews_features.h"
#include "components/previews/core/previews_user_data.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::Mock;
using ::testing::Return;
using ::testing::_;
namespace {
class MockDataUseAscriber : public data_use_measurement::DataUseAscriber {
public:
MOCK_METHOD1(
GetOrCreateDataUseRecorder,
data_use_measurement::DataUseRecorder*(net::URLRequest* request));
MOCK_METHOD1(
GetDataUseRecorder,
data_use_measurement::DataUseRecorder*(const net::URLRequest& request));
MOCK_CONST_METHOD0(
CreateURLRequestClassifier,
std::unique_ptr<data_use_measurement::URLRequestClassifier>());
};
const int kInflationPercent = 50;
const int kInflationBytes = 1000;
} // namespace
namespace data_reduction_proxy {
class DataReductionProxyDataUseObserverTest : public testing::Test {
public:
DataReductionProxyDataUseObserverTest() {}
void SetUp() override {
std::map<std::string, std::string> parameters = {
{"NoScriptInflationPercent", base::IntToString(kInflationPercent)},
{"NoScriptInflationBytes", base::IntToString(kInflationBytes)}};
scoped_feature_list_.InitAndEnableFeatureWithParameters(
previews::features::kNoScriptPreviews, parameters);
test_context_ = DataReductionProxyTestContext::Builder()
.WithConfigClient()
.WithMockDataReductionProxyService()
.Build();
ascriber_ = std::make_unique<MockDataUseAscriber>();
data_use_observer_ = std::make_unique<DataReductionProxyDataUseObserver>(
test_context_->io_data(), ascriber_.get());
}
MockDataReductionProxyService* mock_drp_service() {
return test_context_->mock_data_reduction_proxy_service();
}
void SetPreviewsUserData(data_use_measurement::DataUse* data_use,
previews::PreviewsUserData* previews_user_data) {
data_use->SetUserData(
data_use_observer_->GetDataUsePreviewsUserDataKeyForTesting(),
previews_user_data->DeepCopy());
}
void DidFinishLoad(data_use_measurement::DataUse* data_use) {
data_use_observer_->OnPageDidFinishLoad(data_use);
}
void RunUntilIdle() { test_context_->RunUntilIdle(); }
private:
base::test::ScopedFeatureList scoped_feature_list_;
base::MessageLoopForIO message_loop_;
std::unique_ptr<DataReductionProxyTestContext> test_context_;
std::unique_ptr<MockDataUseAscriber> ascriber_;
std::unique_ptr<DataReductionProxyDataUseObserver> data_use_observer_;
DISALLOW_COPY_AND_ASSIGN(DataReductionProxyDataUseObserverTest);
};
TEST_F(DataReductionProxyDataUseObserverTest,
OnPageDidFinishLoadNotNoScriptPreview) {
std::unique_ptr<data_use_measurement::DataUse> data_use =
std::make_unique<data_use_measurement::DataUse>(
data_use_measurement::DataUse::TrafficType::USER_TRAFFIC);
data_use->IncrementTotalBytes(500000, 300);
data_use->set_url(GURL("https://testsite.com"));
// Verify with no committed preview.
previews::PreviewsUserData previews_user_data(3 /* page_id */);
SetPreviewsUserData(data_use.get(), &previews_user_data);
EXPECT_CALL(*mock_drp_service(), UpdateContentLengths(_, _, _, _, _, _, _, _))
.Times(0);
EXPECT_CALL(*mock_drp_service(), UpdateDataUseForHost(_, _, _)).Times(0);
DidFinishLoad(data_use.get());
RunUntilIdle();
Mock::VerifyAndClearExpectations(mock_drp_service());
// Now verify with LOFI as committed preview.
previews_user_data.SetCommittedPreviewsType(previews::PreviewsType::LOFI);
SetPreviewsUserData(data_use.get(), &previews_user_data);
EXPECT_CALL(*mock_drp_service(), UpdateContentLengths(_, _, _, _, _, _, _, _))
.Times(0);
EXPECT_CALL(*mock_drp_service(), UpdateDataUseForHost(_, _, _)).Times(0);
DidFinishLoad(data_use.get());
RunUntilIdle();
}
TEST_F(DataReductionProxyDataUseObserverTest,
OnPageDidFinishLoadHasCommittedNoScriptPreview) {
std::unique_ptr<data_use_measurement::DataUse> data_use =
std::make_unique<data_use_measurement::DataUse>(
data_use_measurement::DataUse::TrafficType::USER_TRAFFIC);
data_use->IncrementTotalBytes(500000, 300);
data_use->set_url(GURL("https://testsite.com"));
previews::PreviewsUserData previews_user_data(7 /* page_id */);
previews_user_data.SetCommittedPreviewsType(previews::PreviewsType::NOSCRIPT);
SetPreviewsUserData(data_use.get(), &previews_user_data);
int inflation_value = 500000 * kInflationPercent / 100 + kInflationBytes;
EXPECT_EQ(251000, inflation_value);
EXPECT_CALL(*mock_drp_service(),
UpdateContentLengths(0, inflation_value, true, _, _, _, _, _))
.Times(1);
EXPECT_CALL(*mock_drp_service(),
UpdateDataUseForHost(0, inflation_value, "testsite.com"))
.Times(1);
DidFinishLoad(data_use.get());
RunUntilIdle();
}
TEST_F(DataReductionProxyDataUseObserverTest,
OnPageDidFinishLoadHasCommittedNoScriptPreviewWithInflationPercent) {
std::unique_ptr<data_use_measurement::DataUse> data_use =
std::make_unique<data_use_measurement::DataUse>(
data_use_measurement::DataUse::TrafficType::USER_TRAFFIC);
data_use->IncrementTotalBytes(500000, 300);
data_use->set_url(GURL("https://testsite.com"));
previews::PreviewsUserData previews_user_data(7 /* page_id */);
previews_user_data.SetDataSavingsInflationPercent(80);
previews_user_data.SetCommittedPreviewsType(previews::PreviewsType::NOSCRIPT);
SetPreviewsUserData(data_use.get(), &previews_user_data);
int inflation_value = 500000 * 80 / 100;
EXPECT_EQ(400000, inflation_value);
EXPECT_CALL(*mock_drp_service(),
UpdateContentLengths(0, inflation_value, true, _, _, _, _, _))
.Times(1);
EXPECT_CALL(*mock_drp_service(),
UpdateDataUseForHost(0, inflation_value, "testsite.com"))
.Times(1);
DidFinishLoad(data_use.get());
RunUntilIdle();
}
} // namespace data_reduction_proxy
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment