Commit 02da7f6d authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

Use ServerLitePage preview for Report-To testing instead of LoFi

Bug: 944286
Change-Id: Ib7926e5c03b1066c48c10f71889bbd9accff3129
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1639457Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/heads/master@{#665592}
parent 41bf44c5
...@@ -7,12 +7,10 @@ ...@@ -7,12 +7,10 @@
#include "base/metrics/field_trial_param_associator.h" #include "base/metrics/field_trial_param_associator.h"
#include "base/metrics/field_trial_params.h" #include "base/metrics/field_trial_params.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/task/thread_pool/thread_pool.h" #include "base/task/thread_pool/thread_pool.h"
#include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "base/test/values_test_util.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/metrics/subprocess_metrics_provider.h" #include "chrome/browser/metrics/subprocess_metrics_provider.h"
...@@ -20,7 +18,6 @@ ...@@ -20,7 +18,6 @@
#include "chrome/browser/previews/previews_service_factory.h" #include "chrome/browser/previews/previews_service_factory.h"
#include "chrome/browser/previews/previews_ui_tab_helper.h" #include "chrome/browser/previews/previews_ui_tab_helper.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ssl/cert_verifier_browser_test.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
...@@ -38,12 +35,9 @@ ...@@ -38,12 +35,9 @@
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#include "net/reporting/reporting_policy.h"
#include "net/test/embedded_test_server/controllable_http_response.h"
#include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h" #include "net/test/embedded_test_server/http_response.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/network_quality_tracker.h" #include "services/network/public/cpp/network_quality_tracker.h"
namespace { namespace {
...@@ -428,147 +422,3 @@ IN_PROC_BROWSER_TEST_F( ...@@ -428,147 +422,3 @@ IN_PROC_BROWSER_TEST_F(
EXPECT_TRUE(noscript_js_requested()); EXPECT_TRUE(noscript_js_requested());
EXPECT_FALSE(noscript_css_requested()); EXPECT_FALSE(noscript_css_requested());
} }
namespace {
class PreviewsReportingBrowserTest : public CertVerifierBrowserTest {
public:
PreviewsReportingBrowserTest()
: https_server_(net::test_server::EmbeddedTestServer::TYPE_HTTPS) {}
~PreviewsReportingBrowserTest() override = default;
void SetUp() override {
scoped_feature_list_.InitWithFeatures(
{network::features::kReporting, previews::features::kPreviews,
previews::features::kClientLoFi,
data_reduction_proxy::features::
kDataReductionProxyEnabledWithNetworkService},
{network::features::kNetworkErrorLogging});
CertVerifierBrowserTest::SetUp();
// Make report delivery happen instantly.
net::ReportingPolicy policy;
policy.delivery_interval = base::TimeDelta::FromSeconds(0);
net::ReportingPolicy::UsePolicyForTesting(policy);
}
void SetUpOnMainThread() override {
CertVerifierBrowserTest::SetUpOnMainThread();
g_browser_process->network_quality_tracker()
->ReportEffectiveConnectionTypeForTesting(
net::EFFECTIVE_CONNECTION_TYPE_2G);
host_resolver()->AddRule("*", "127.0.0.1");
main_frame_response_ =
std::make_unique<net::test_server::ControllableHttpResponse>(
server(), "/lofi_test");
upload_response_ =
std::make_unique<net::test_server::ControllableHttpResponse>(server(),
"/upload");
mock_cert_verifier()->set_default_result(net::OK);
ASSERT_TRUE(server()->Start());
}
void SetUpCommandLine(base::CommandLine* cmd) override {
CertVerifierBrowserTest::SetUpCommandLine(cmd);
cmd->AppendSwitch("enable-spdy-proxy-auth");
// Due to race conditions, it's possible that blacklist data is not loaded
// at the time of first navigation. That may prevent Preview from
// triggering, and causing the test to flake.
cmd->AppendSwitch(previews::switches::kIgnorePreviewsBlacklist);
}
net::EmbeddedTestServer* server() { return &https_server_; }
int port() const { return https_server_.port(); }
net::test_server::ControllableHttpResponse* main_frame_response() {
return main_frame_response_.get();
}
net::test_server::ControllableHttpResponse* upload_response() {
return upload_response_.get();
}
GURL GetReportingEnabledURL() const {
return GURL(base::StringPrintf("https://example.com:%d/lofi_test", port()));
}
GURL GetCollectorURL() const {
return GURL(base::StringPrintf("https://example.com:%d/upload", port()));
}
std::string GetReportToHeader() const {
return "Report-To: {\"endpoints\":[{\"url\":\"" + GetCollectorURL().spec() +
"\"}],\"max_age\":86400}\r\n";
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
net::EmbeddedTestServer https_server_;
std::unique_ptr<net::test_server::ControllableHttpResponse>
main_frame_response_;
std::unique_ptr<net::test_server::ControllableHttpResponse> upload_response_;
DISALLOW_COPY_AND_ASSIGN(PreviewsReportingBrowserTest);
};
std::unique_ptr<base::Value> ParseReportUpload(const std::string& payload) {
auto parsed_payload = base::test::ParseJsonDeprecated(payload);
// Clear out any non-reproducible fields.
for (auto& report : parsed_payload->GetList()) {
report.RemoveKey("age");
auto* user_agent =
report.FindKeyOfType("user_agent", base::Value::Type::STRING);
if (user_agent != nullptr)
*user_agent = base::Value("Mozilla/1.0");
}
return parsed_payload;
}
} // namespace
// Checks that the intervention is reported during a LoFi load.
IN_PROC_BROWSER_TEST_F(PreviewsReportingBrowserTest,
TestReportingHeadersSentForLoFiPreview) {
NavigateParams params(browser(), GetReportingEnabledURL(),
ui::PAGE_TRANSITION_LINK);
Navigate(&params);
main_frame_response()->WaitForRequest();
main_frame_response()->Send(
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Empty page \r\n");
main_frame_response()->Send(GetReportToHeader());
main_frame_response()->Send("\r\n");
main_frame_response()->Done();
upload_response()->WaitForRequest();
auto actual = ParseReportUpload(upload_response()->http_request()->content);
upload_response()->Send("HTTP/1.1 204 OK\r\n");
upload_response()->Send("\r\n");
upload_response()->Done();
// Verify the contents of the report that we received.
EXPECT_TRUE(actual != nullptr);
auto expected = base::test::ParseJsonDeprecated(base::StringPrintf(
R"text(
[
{
"body": {
"id": "LitePageServed",
"message": "Modified page load behavior on the page because )text"
R"text(the page was expected to take a long amount of time to load. )text"
R"text(https://www.chromestatus.com/feature/5148050062311424"
},
"type": "intervention",
"url": "https://example.com:%d/lofi_test",
"user_agent": "Mozilla/1.0"
}
]
)text",
port()));
EXPECT_EQ(*expected, *actual);
}
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "base/test/simple_test_tick_clock.h" #include "base/test/simple_test_tick_clock.h"
#include "base/test/values_test_util.h"
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
...@@ -79,6 +80,7 @@ ...@@ -79,6 +80,7 @@
#include "net/http/http_request_headers.h" #include "net/http/http_request_headers.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
#include "net/nqe/effective_connection_type.h" #include "net/nqe/effective_connection_type.h"
#include "net/reporting/reporting_policy.h"
#include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h" #include "net/test/embedded_test_server/http_response.h"
#include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_builders.h"
...@@ -142,6 +144,9 @@ class PreviewsLitePageServerBrowserTest ...@@ -142,6 +144,9 @@ class PreviewsLitePageServerBrowserTest
// Previews server will put Chrome into a redirect loop. // Previews server will put Chrome into a redirect loop.
kRedirectLoop = 8, kRedirectLoop = 8,
// The URL that intervention reports should be sent to.
kInterventionReport = 9,
}; };
void SetUpCommandLine(base::CommandLine* cmd) override { void SetUpCommandLine(base::CommandLine* cmd) override {
...@@ -281,8 +286,9 @@ class PreviewsLitePageServerBrowserTest ...@@ -281,8 +286,9 @@ class PreviewsLitePageServerBrowserTest
{previews::features::kPreviews, previews::features::kOptimizationHints, {previews::features::kPreviews, previews::features::kOptimizationHints,
previews::features::kResourceLoadingHints, previews::features::kResourceLoadingHints,
data_reduction_proxy::features:: data_reduction_proxy::features::
kDataReductionProxyEnabledWithNetworkService}, kDataReductionProxyEnabledWithNetworkService,
{}); network::features::kReporting},
{network::features::kNetworkErrorLogging});
if (GetParam()) { if (GetParam()) {
url_loader_feature_list_.InitWithFeatures( url_loader_feature_list_.InitWithFeatures(
...@@ -308,6 +314,10 @@ class PreviewsLitePageServerBrowserTest ...@@ -308,6 +314,10 @@ class PreviewsLitePageServerBrowserTest
decider->BlacklistBypassedHost(kBlacklistedHost, decider->BlacklistBypassedHost(kBlacklistedHost,
base::TimeDelta::FromHours(1)); base::TimeDelta::FromHours(1));
net::ReportingPolicy policy;
policy.delivery_interval = base::TimeDelta::FromSeconds(0);
net::ReportingPolicy::UsePolicyForTesting(policy);
} }
void InitializeOptimizationHints() { void InitializeOptimizationHints() {
...@@ -503,6 +513,17 @@ class PreviewsLitePageServerBrowserTest ...@@ -503,6 +513,17 @@ class PreviewsLitePageServerBrowserTest
->GetHttpOriginalContentLength(); ->GetHttpOriginalContentLength();
} }
base::Value ParsedInterventionReport() const {
base::Value parsed_payload =
base::test::ParseJson(intervention_report_content_);
// Clear out any non-reproducible fields.
for (auto& report : parsed_payload.GetList()) {
report.RemoveKey("age");
report.RemoveKey("user_agent");
}
return parsed_payload;
}
// Returns a HTTP URL that will respond with the given action and headers when // Returns a HTTP URL that will respond with the given action and headers when
// used by the previews server. The response can be delayed a number of // used by the previews server. The response can be delayed a number of
// milliseconds by passing a value > 0 for |delay_ms| or pass -1 to make the // milliseconds by passing a value > 0 for |delay_ms| or pass -1 to make the
...@@ -582,6 +603,15 @@ class PreviewsLitePageServerBrowserTest ...@@ -582,6 +603,15 @@ class PreviewsLitePageServerBrowserTest
run_loop.Run(); run_loop.Run();
} }
void WaitForInterventionReport() {
if (!intervention_report_content_.empty())
return;
base::RunLoop run_loop;
waiting_for_report_closure_ = run_loop.QuitClosure();
run_loop.Run();
}
private: private:
std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest( std::unique_ptr<net::test_server::HttpResponse> HandleRedirectRequest(
const net::test_server::HttpRequest& request) { const net::test_server::HttpRequest& request) {
...@@ -669,6 +699,15 @@ class PreviewsLitePageServerBrowserTest ...@@ -669,6 +699,15 @@ class PreviewsLitePageServerBrowserTest
return response; return response;
} }
// If this request is for a intervention report, record the content.
if (request.GetURL().spec().find("upload_report") != std::string::npos) {
intervention_report_content_ = request.content;
response->set_code(net::HTTP_NO_CONTENT);
if (waiting_for_report_closure_)
std::move(waiting_for_report_closure_).Run();
return response;
}
response->set_content_type("text/html"); response->set_content_type("text/html");
std::string original_url_str; std::string original_url_str;
...@@ -755,6 +794,12 @@ class PreviewsLitePageServerBrowserTest ...@@ -755,6 +794,12 @@ class PreviewsLitePageServerBrowserTest
response->set_code(net::HTTP_OK); response->set_code(net::HTTP_OK);
response->set_content("porgporgporgporgporg" /* length = 20 */); response->set_content("porgporgporgporgporg" /* length = 20 */);
response->AddCustomHeader("chrome-proxy", "ofcl=60"); response->AddCustomHeader("chrome-proxy", "ofcl=60");
// Use the Host header for the report because CORS.
response->AddCustomHeader(
"Report-To",
base::StringPrintf("{\"endpoints\":[{\"url\":\"https://%s/"
"?upload_report=true\"}],\"max_age\":86400}",
request.headers.find("Host")->second.c_str()));
break; break;
case kRedirectNonPreview: case kRedirectNonPreview:
response->set_code(net::HTTP_TEMPORARY_REDIRECT); response->set_code(net::HTTP_TEMPORARY_REDIRECT);
...@@ -835,7 +880,9 @@ class PreviewsLitePageServerBrowserTest ...@@ -835,7 +880,9 @@ class PreviewsLitePageServerBrowserTest
GURL slow_http_url_; GURL slow_http_url_;
uint64_t got_page_id_ = 0; uint64_t got_page_id_ = 0;
int subresources_requested_ = 0; int subresources_requested_ = 0;
std::string intervention_report_content_;
base::OnceClosure waiting_for_pingback_closure_; base::OnceClosure waiting_for_pingback_closure_;
base::OnceClosure waiting_for_report_closure_;
}; };
// True if testing using the URLLoader Interceptor implementation. // True if testing using the URLLoader Interceptor implementation.
...@@ -1427,6 +1474,36 @@ IN_PROC_BROWSER_TEST_P(PreviewsLitePageServerBrowserTest, ...@@ -1427,6 +1474,36 @@ IN_PROC_BROWSER_TEST_P(PreviewsLitePageServerBrowserTest,
WaitForPingback(); WaitForPingback();
} }
IN_PROC_BROWSER_TEST_P(
PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC_CHROMESOS(LitePageSendsInterventionReport)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded();
WaitForInterventionReport();
base::Value expected = base::test::ParseJson(base::StringPrintf(
R"text(
[
{
"body": {
"id": "LitePageServed",
"message": "Modified page load behavior on the page because )text"
R"text(the page was expected to take a long amount of time to load. )text"
R"text(https://www.chromestatus.com/feature/5148050062311424"
},
"type": "intervention",
"url": "%s",
}
]
)text",
PreviewsLitePageNavigationThrottle::GetPreviewsURLForURL(
HttpsLitePageURL(kSuccess))
.spec()
.c_str()));
EXPECT_EQ(expected, ParsedInterventionReport());
}
class TestDataReductionProxyPingbackClient class TestDataReductionProxyPingbackClient
: public data_reduction_proxy::DataReductionProxyPingbackClient { : public data_reduction_proxy::DataReductionProxyPingbackClient {
public: public:
......
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