Commit 0c874e17 authored by Benoît Lizé's avatar Benoît Lizé Committed by Commit Bot

customtabs: Add large response tests for DetachedResourceRequest.

Large headers should not be counted, only large response bodies.

Bug: 906042
Change-Id: I941376f671ad63500e3676811ab74c80e659c0fa
Reviewed-on: https://chromium-review.googlesource.com/c/1340310Reviewed-by: default avatarAlexandr Ilin <alexilin@chromium.org>
Commit-Queue: Benoit L <lizeb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609256}
parent 4c600c1b
......@@ -24,12 +24,6 @@
namespace customtabs {
namespace {
constexpr int kMaxResponseSize = 100 * 1024;
} // namespace
// static
void DetachedResourceRequest::CreateAndStart(
content::BrowserContext* browser_context,
......
......@@ -39,6 +39,8 @@ namespace customtabs {
// This is a UI thread class.
class DetachedResourceRequest {
public:
static constexpr int kMaxResponseSize = 100 * 1024;
// The motivation of the resource request, used for histograms reporting.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.customtabs
// GENERATED_JAVA_CLASS_NAME_OVERRIDE: DetachedResourceRequestMotivation
......
......@@ -39,6 +39,9 @@ constexpr const char kHttpNoContent[] = "/nocontent";
constexpr const char kEchoTitle[] = "/echotitle";
constexpr const char kManyRedirects[] = "/many-redirects";
constexpr const char kCacheable[] = "/cachetime";
constexpr const char kLargeHeadersAndResponseSize[] =
"/large-headers-and-response-size";
constexpr const char kCookieKey[] = "cookie";
constexpr const char kUrlKey[] = "url";
constexpr const char kCookieFromNoContent[] = "no-content-cookie";
......@@ -126,6 +129,26 @@ std::unique_ptr<HttpResponse> SetCookieAndNoContent(
return response;
}
// /large-headers-and-response-size?10000
// Replies with large headers and a set response body size.
std::unique_ptr<HttpResponse> LargeHeadersAndResponseSize(
const HttpRequest& request) {
const GURL& url = request.GetURL();
if (url.path() != kLargeHeadersAndResponseSize)
return nullptr;
auto response = std::make_unique<net::test_server::BasicHttpResponse>();
response->AddCustomHeader(
"X-Large-Header",
std::string(DetachedResourceRequest::kMaxResponseSize, 'b'));
response->set_code(net::HTTP_OK);
uint32_t length;
CHECK(base::StringToUint(request.GetURL().query(), &length));
response->set_content(std::string(length, 'a'));
return response;
}
// Waits for |expected_requests| requests to |path|, then reports the headers
// in |headers| and calls |closure|.
// Output parameters can be nullptr.
......@@ -160,6 +183,8 @@ class DetachedResourceRequestTest : public ::testing::Test {
base::BindRepeating(&SetCookieAndNoContent));
embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&ManyRedirects));
embedded_test_server()->RegisterRequestHandler(
base::BindRepeating(&LargeHeadersAndResponseSize));
embedded_test_server()->AddDefaultHandlers(
base::FilePath("chrome/test/data"));
host_resolver_ = std::make_unique<content::TestHostResolver>();
......@@ -298,6 +323,60 @@ TEST_F(DetachedResourceRequestTest, SimpleFailure) {
"CustomTabs.DetachedResourceRequest.FinalStatus", -net::ERR_FAILED, 1);
}
TEST_F(DetachedResourceRequestTest, ResponseTooLarge) {
base::HistogramTester histogram_tester;
ASSERT_TRUE(embedded_test_server()->Start());
GURL site_for_cookies(embedded_test_server()->base_url());
// Checks that headers are not included in the size limit (response size is
// 1 below the limit, hence above including headers.)
{
base::RunLoop request_waiter;
GURL url(embedded_test_server()->GetURL(
base::StringPrintf("%s?%u", kLargeHeadersAndResponseSize,
DetachedResourceRequest::kMaxResponseSize - 1)));
DetachedResourceRequest::CreateAndStart(
browser_context(), url, site_for_cookies,
content::Referrer::GetDefaultReferrerPolicy(), kMotivation,
base::BindLambdaForTesting([&](int net_error) {
EXPECT_EQ(net::OK, net_error);
request_waiter.Quit();
}));
request_waiter.Run();
histogram_tester.ExpectUniqueSample(
"CustomTabs.DetachedResourceRequest.RedirectsCount.Success", 0, 1);
histogram_tester.ExpectTotalCount(
"CustomTabs.DetachedResourceRequest.Duration.Success", 1);
histogram_tester.ExpectBucketCount(
"CustomTabs.DetachedResourceRequest.FinalStatus", net::OK, 1);
}
// Response too large, failure.
{
base::RunLoop request_waiter;
GURL url(embedded_test_server()->GetURL(
base::StringPrintf("%s?%u", kLargeHeadersAndResponseSize,
DetachedResourceRequest::kMaxResponseSize + 1)));
DetachedResourceRequest::CreateAndStart(
browser_context(), url, site_for_cookies,
content::Referrer::GetDefaultReferrerPolicy(), kMotivation,
base::BindLambdaForTesting([&](int net_error) {
EXPECT_NE(net::OK, net_error);
request_waiter.Quit();
}));
request_waiter.Run();
histogram_tester.ExpectUniqueSample(
"CustomTabs.DetachedResourceRequest.RedirectsCount.Failure", 0, 1);
histogram_tester.ExpectTotalCount(
"CustomTabs.DetachedResourceRequest.Duration.Failure", 1);
histogram_tester.ExpectBucketCount(
"CustomTabs.DetachedResourceRequest.FinalStatus",
-net::ERR_INSUFFICIENT_RESOURCES, 1);
}
}
TEST_F(DetachedResourceRequestTest, MultipleRequests) {
base::RunLoop request_waiter;
int expected_requests = 2;
......
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