| Index: components/image_fetcher/core/image_data_fetcher_unittest.cc
|
| diff --git a/components/image_fetcher/core/image_data_fetcher_unittest.cc b/components/image_fetcher/core/image_data_fetcher_unittest.cc
|
| index fad79ee59a59772fb42602748c3958f996c38b26..2ece1b067667bdcb0a541dc3c8b127d63cdeb129 100644
|
| --- a/components/image_fetcher/core/image_data_fetcher_unittest.cc
|
| +++ b/components/image_fetcher/core/image_data_fetcher_unittest.cc
|
| @@ -201,4 +201,68 @@ TEST_F(ImageDataFetcherTest, FetchImageData_MultipleRequests) {
|
| test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher);
|
| }
|
|
|
| +TEST_F(ImageDataFetcherTest, FetchImageData_CancelFetchIfImageExceedsMaxSize) {
|
| + // In order to know whether the fetcher was canceled, it must notify about its
|
| + // deletion.
|
| + fetcher_factory_.set_remove_fetcher_on_delete(true);
|
| +
|
| + const int64_t kMaxDownloadBytes = 1024 * 1024;
|
| + image_data_fetcher_.SetImageDownloadLimit(kMaxDownloadBytes);
|
| + image_data_fetcher_.FetchImageData(
|
| + GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched,
|
| + base::Unretained(this)));
|
| +
|
| + // Fetching an oversized image will behave like any other failed request.
|
| + // There will be exactly one call to OnImageDataFetched containing a response
|
| + // code that would be impossible for a completed fetch.
|
| + RequestMetadata expected_metadata;
|
| + expected_metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID;
|
| + EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata));
|
| +
|
| + // Get and configure the TestURLFetcher.
|
| + net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0);
|
| + ASSERT_NE(nullptr, test_url_fetcher);
|
| +
|
| + // Create a completely valid response that is never used. This is to make sure
|
| + // that the answer isn't accidentally invalid but intentionally.
|
| + test_url_fetcher->set_status(
|
| + net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
|
| + test_url_fetcher->SetResponseString(kURLResponseData);
|
| + test_url_fetcher->set_response_code(net::HTTP_OK);
|
| + std::string raw_header =
|
| + "HTTP/1.1 200 OK\n"
|
| + "Content-type: image/png\n\n";
|
| + std::replace(raw_header.begin(), raw_header.end(), '\n', '\0');
|
| + scoped_refptr<net::HttpResponseHeaders> headers(
|
| + new net::HttpResponseHeaders(raw_header));
|
| + test_url_fetcher->set_response_headers(headers);
|
| +
|
| + test_url_fetcher->delegate()->OnURLFetchDownloadProgress(
|
| + test_url_fetcher,
|
| + /*current=*/0, // Bytes received up to the call.
|
| + /*total=*/-1, // not determined
|
| + /*current_network_bytes=*/0); // not relevant
|
| + // The URL fetch should be running ...
|
| + ASSERT_NE(nullptr, fetcher_factory_.GetFetcherByID(0));
|
| +
|
| + test_url_fetcher->delegate()->OnURLFetchDownloadProgress(
|
| + test_url_fetcher,
|
| + 768 * 1024, // Current bytes are not exeeding the limit.
|
| + /*total=*/-1, /*current_network_bytes=*/0);
|
| + // ... and running ...
|
| + ASSERT_NE(nullptr, fetcher_factory_.GetFetcherByID(0));
|
| +
|
| + test_url_fetcher->delegate()->OnURLFetchDownloadProgress(
|
| + test_url_fetcher, kMaxDownloadBytes, // Still not exeeding the limit.
|
| + /*total=*/-1, /*current_network_bytes=*/0);
|
| + // ... and running ...
|
| + ASSERT_NE(nullptr, fetcher_factory_.GetFetcherByID(0));
|
| +
|
| + test_url_fetcher->delegate()->OnURLFetchDownloadProgress(
|
| + test_url_fetcher, kMaxDownloadBytes + 1, // Limits are exceeded.
|
| + /*total=*/-1, /*current_network_bytes=*/0);
|
| + // ... and be canceled.
|
| + EXPECT_EQ(nullptr, fetcher_factory_.GetFetcherByID(0));
|
| +}
|
| +
|
| } // namespace image_fetcher
|
|
|