| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/image_fetcher/core/image_data_fetcher.h" | 5 #include "components/image_fetcher/core/image_data_fetcher.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "net/base/load_flags.h" | 13 #include "net/base/load_flags.h" |
| 14 #include "net/http/http_response_headers.h" | 14 #include "net/http/http_response_headers.h" |
| 15 #include "net/http/http_status_code.h" | 15 #include "net/http/http_status_code.h" |
| 16 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 16 #include "net/url_request/test_url_fetcher_factory.h" | 17 #include "net/url_request/test_url_fetcher_factory.h" |
| 17 #include "net/url_request/url_request_status.h" | 18 #include "net/url_request/url_request_status.h" |
| 18 #include "net/url_request/url_request_test_util.h" | 19 #include "net/url_request/url_request_test_util.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 22 |
| 22 namespace { | 23 namespace { |
| 23 | 24 |
| 24 const char kImageURL[] = "http://www.example.com/image"; | 25 const char kImageURL[] = "http://www.example.com/image"; |
| 25 const char kURLResponseData[] = "EncodedImageData"; | 26 const char kURLResponseData[] = "EncodedImageData"; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 53 ImageDataFetcher image_data_fetcher_; | 54 ImageDataFetcher image_data_fetcher_; |
| 54 | 55 |
| 55 net::TestURLFetcherFactory fetcher_factory_; | 56 net::TestURLFetcherFactory fetcher_factory_; |
| 56 | 57 |
| 57 private: | 58 private: |
| 58 DISALLOW_COPY_AND_ASSIGN(ImageDataFetcherTest); | 59 DISALLOW_COPY_AND_ASSIGN(ImageDataFetcherTest); |
| 59 }; | 60 }; |
| 60 | 61 |
| 61 TEST_F(ImageDataFetcherTest, FetchImageData) { | 62 TEST_F(ImageDataFetcherTest, FetchImageData) { |
| 62 image_data_fetcher_.FetchImageData( | 63 image_data_fetcher_.FetchImageData( |
| 63 GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched, | 64 GURL(kImageURL), |
| 64 base::Unretained(this))); | 65 base::Bind(&ImageDataFetcherTest::OnImageDataFetched, |
| 66 base::Unretained(this)), |
| 67 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 65 | 68 |
| 66 RequestMetadata expected_metadata; | 69 RequestMetadata expected_metadata; |
| 67 expected_metadata.mime_type = std::string("image/png"); | 70 expected_metadata.mime_type = std::string("image/png"); |
| 68 expected_metadata.http_response_code = net::HTTP_OK; | 71 expected_metadata.http_response_code = net::HTTP_OK; |
| 69 EXPECT_CALL(*this, OnImageDataFetched(std::string(kURLResponseData), | 72 EXPECT_CALL(*this, OnImageDataFetched(std::string(kURLResponseData), |
| 70 expected_metadata)); | 73 expected_metadata)); |
| 71 | 74 |
| 72 // Get and configure the TestURLFetcher. | 75 // Get and configure the TestURLFetcher. |
| 73 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 76 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| 74 ASSERT_NE(nullptr, test_url_fetcher); | 77 ASSERT_NE(nullptr, test_url_fetcher); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 88 scoped_refptr<net::HttpResponseHeaders> headers( | 91 scoped_refptr<net::HttpResponseHeaders> headers( |
| 89 new net::HttpResponseHeaders(raw_header)); | 92 new net::HttpResponseHeaders(raw_header)); |
| 90 test_url_fetcher->set_response_headers(headers); | 93 test_url_fetcher->set_response_headers(headers); |
| 91 | 94 |
| 92 // Call the URLFetcher delegate to continue the test. | 95 // Call the URLFetcher delegate to continue the test. |
| 93 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 96 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 94 } | 97 } |
| 95 | 98 |
| 96 TEST_F(ImageDataFetcherTest, FetchImageData_FromCache) { | 99 TEST_F(ImageDataFetcherTest, FetchImageData_FromCache) { |
| 97 image_data_fetcher_.FetchImageData( | 100 image_data_fetcher_.FetchImageData( |
| 98 GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched, | 101 GURL(kImageURL), |
| 99 base::Unretained(this))); | 102 base::Bind(&ImageDataFetcherTest::OnImageDataFetched, |
| 103 base::Unretained(this)), |
| 104 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 100 | 105 |
| 101 RequestMetadata expected_metadata; | 106 RequestMetadata expected_metadata; |
| 102 expected_metadata.mime_type = std::string("image/png"); | 107 expected_metadata.mime_type = std::string("image/png"); |
| 103 expected_metadata.http_response_code = net::HTTP_OK; | 108 expected_metadata.http_response_code = net::HTTP_OK; |
| 104 expected_metadata.from_http_cache = true; | 109 expected_metadata.from_http_cache = true; |
| 105 EXPECT_CALL(*this, OnImageDataFetched(std::string(kURLResponseData), | 110 EXPECT_CALL(*this, OnImageDataFetched(std::string(kURLResponseData), |
| 106 expected_metadata)); | 111 expected_metadata)); |
| 107 | 112 |
| 108 // Get and configure the TestURLFetcher. | 113 // Get and configure the TestURLFetcher. |
| 109 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 114 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 121 scoped_refptr<net::HttpResponseHeaders> headers( | 126 scoped_refptr<net::HttpResponseHeaders> headers( |
| 122 new net::HttpResponseHeaders(raw_header)); | 127 new net::HttpResponseHeaders(raw_header)); |
| 123 test_url_fetcher->set_response_headers(headers); | 128 test_url_fetcher->set_response_headers(headers); |
| 124 | 129 |
| 125 // Call the URLFetcher delegate to continue the test. | 130 // Call the URLFetcher delegate to continue the test. |
| 126 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 131 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 127 } | 132 } |
| 128 | 133 |
| 129 TEST_F(ImageDataFetcherTest, FetchImageData_NotFound) { | 134 TEST_F(ImageDataFetcherTest, FetchImageData_NotFound) { |
| 130 image_data_fetcher_.FetchImageData( | 135 image_data_fetcher_.FetchImageData( |
| 131 GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched, | 136 GURL(kImageURL), |
| 132 base::Unretained(this))); | 137 base::Bind(&ImageDataFetcherTest::OnImageDataFetched, |
| 138 base::Unretained(this)), |
| 139 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 133 | 140 |
| 134 RequestMetadata expected_metadata; | 141 RequestMetadata expected_metadata; |
| 135 expected_metadata.mime_type = std::string("image/png"); | 142 expected_metadata.mime_type = std::string("image/png"); |
| 136 expected_metadata.http_response_code = net::HTTP_NOT_FOUND; | 143 expected_metadata.http_response_code = net::HTTP_NOT_FOUND; |
| 137 // For 404, expect an empty result even though correct image data is sent. | 144 // For 404, expect an empty result even though correct image data is sent. |
| 138 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); | 145 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); |
| 139 | 146 |
| 140 // Get and configure the TestURLFetcher. | 147 // Get and configure the TestURLFetcher. |
| 141 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 148 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| 142 ASSERT_NE(nullptr, test_url_fetcher); | 149 ASSERT_NE(nullptr, test_url_fetcher); |
| 143 test_url_fetcher->set_status( | 150 test_url_fetcher->set_status( |
| 144 net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK)); | 151 net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK)); |
| 145 test_url_fetcher->SetResponseString(kURLResponseData); | 152 test_url_fetcher->SetResponseString(kURLResponseData); |
| 146 | 153 |
| 147 std::string raw_header = | 154 std::string raw_header = |
| 148 "HTTP/1.1 404 Not Found\n" | 155 "HTTP/1.1 404 Not Found\n" |
| 149 "Content-type: image/png\n\n"; | 156 "Content-type: image/png\n\n"; |
| 150 std::replace(raw_header.begin(), raw_header.end(), '\n', '\0'); | 157 std::replace(raw_header.begin(), raw_header.end(), '\n', '\0'); |
| 151 scoped_refptr<net::HttpResponseHeaders> headers( | 158 scoped_refptr<net::HttpResponseHeaders> headers( |
| 152 new net::HttpResponseHeaders(raw_header)); | 159 new net::HttpResponseHeaders(raw_header)); |
| 153 test_url_fetcher->set_response_headers(headers); | 160 test_url_fetcher->set_response_headers(headers); |
| 154 | 161 |
| 155 // Call the URLFetcher delegate to continue the test. | 162 // Call the URLFetcher delegate to continue the test. |
| 156 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 163 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 157 } | 164 } |
| 158 | 165 |
| 159 TEST_F(ImageDataFetcherTest, FetchImageData_WithContentLocation) { | 166 TEST_F(ImageDataFetcherTest, FetchImageData_WithContentLocation) { |
| 160 image_data_fetcher_.FetchImageData( | 167 image_data_fetcher_.FetchImageData( |
| 161 GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched, | 168 GURL(kImageURL), |
| 162 base::Unretained(this))); | 169 base::Bind(&ImageDataFetcherTest::OnImageDataFetched, |
| 170 base::Unretained(this)), |
| 171 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 163 | 172 |
| 164 RequestMetadata expected_metadata; | 173 RequestMetadata expected_metadata; |
| 165 expected_metadata.mime_type = std::string("image/png"); | 174 expected_metadata.mime_type = std::string("image/png"); |
| 166 expected_metadata.http_response_code = net::HTTP_NOT_FOUND; | 175 expected_metadata.http_response_code = net::HTTP_NOT_FOUND; |
| 167 expected_metadata.content_location_header = "http://test-location/image.png"; | 176 expected_metadata.content_location_header = "http://test-location/image.png"; |
| 168 // For 404, expect an empty result even though correct image data is sent. | 177 // For 404, expect an empty result even though correct image data is sent. |
| 169 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); | 178 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); |
| 170 | 179 |
| 171 // Get and configure the TestURLFetcher. | 180 // Get and configure the TestURLFetcher. |
| 172 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 181 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 185 test_url_fetcher->set_response_headers(headers); | 194 test_url_fetcher->set_response_headers(headers); |
| 186 | 195 |
| 187 // Call the URLFetcher delegate to continue the test. | 196 // Call the URLFetcher delegate to continue the test. |
| 188 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 197 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 189 } | 198 } |
| 190 | 199 |
| 191 TEST_F(ImageDataFetcherTest, FetchImageData_FailedRequest) { | 200 TEST_F(ImageDataFetcherTest, FetchImageData_FailedRequest) { |
| 192 image_data_fetcher_.FetchImageData( | 201 image_data_fetcher_.FetchImageData( |
| 193 GURL(kImageURL), | 202 GURL(kImageURL), |
| 194 base::Bind(&ImageDataFetcherTest::OnImageDataFetchedFailedRequest, | 203 base::Bind(&ImageDataFetcherTest::OnImageDataFetchedFailedRequest, |
| 195 base::Unretained(this))); | 204 base::Unretained(this)), |
| 205 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 196 | 206 |
| 197 RequestMetadata expected_metadata; | 207 RequestMetadata expected_metadata; |
| 198 expected_metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID; | 208 expected_metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID; |
| 199 EXPECT_CALL( | 209 EXPECT_CALL( |
| 200 *this, OnImageDataFetchedFailedRequest(std::string(), expected_metadata)); | 210 *this, OnImageDataFetchedFailedRequest(std::string(), expected_metadata)); |
| 201 | 211 |
| 202 // Get and configure the TestURLFetcher. | 212 // Get and configure the TestURLFetcher. |
| 203 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 213 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| 204 ASSERT_NE(nullptr, test_url_fetcher); | 214 ASSERT_NE(nullptr, test_url_fetcher); |
| 205 test_url_fetcher->set_status(net::URLRequestStatus( | 215 test_url_fetcher->set_status(net::URLRequestStatus( |
| 206 net::URLRequestStatus::FAILED, net::ERR_INVALID_URL)); | 216 net::URLRequestStatus::FAILED, net::ERR_INVALID_URL)); |
| 207 | 217 |
| 208 // Call the URLFetcher delegate to continue the test. | 218 // Call the URLFetcher delegate to continue the test. |
| 209 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 219 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 210 } | 220 } |
| 211 | 221 |
| 212 TEST_F(ImageDataFetcherTest, FetchImageData_MultipleRequests) { | 222 TEST_F(ImageDataFetcherTest, FetchImageData_MultipleRequests) { |
| 213 ImageDataFetcher::ImageDataFetcherCallback callback = | 223 ImageDataFetcher::ImageDataFetcherCallback callback = |
| 214 base::Bind(&ImageDataFetcherTest::OnImageDataFetchedMultipleRequests, | 224 base::Bind(&ImageDataFetcherTest::OnImageDataFetchedMultipleRequests, |
| 215 base::Unretained(this)); | 225 base::Unretained(this)); |
| 216 EXPECT_CALL(*this, OnImageDataFetchedMultipleRequests(testing::_, testing::_)) | 226 EXPECT_CALL(*this, OnImageDataFetchedMultipleRequests(testing::_, testing::_)) |
| 217 .Times(2); | 227 .Times(2); |
| 218 | 228 |
| 219 image_data_fetcher_.FetchImageData(GURL(kImageURL), callback); | 229 image_data_fetcher_.FetchImageData(GURL(kImageURL), callback, |
| 220 image_data_fetcher_.FetchImageData(GURL(kImageURL), callback); | 230 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 231 image_data_fetcher_.FetchImageData(GURL(kImageURL), callback, |
| 232 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 221 | 233 |
| 222 // Multiple calls to FetchImageData for the same URL will result in | 234 // Multiple calls to FetchImageData for the same URL will result in |
| 223 // multiple URLFetchers being created. | 235 // multiple URLFetchers being created. |
| 224 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 236 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| 225 ASSERT_NE(nullptr, test_url_fetcher); | 237 ASSERT_NE(nullptr, test_url_fetcher); |
| 226 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 238 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 227 | 239 |
| 228 test_url_fetcher = fetcher_factory_.GetFetcherByID(1); | 240 test_url_fetcher = fetcher_factory_.GetFetcherByID(1); |
| 229 ASSERT_NE(nullptr, test_url_fetcher); | 241 ASSERT_NE(nullptr, test_url_fetcher); |
| 230 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); | 242 test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher); |
| 231 } | 243 } |
| 232 | 244 |
| 233 TEST_F(ImageDataFetcherTest, FetchImageData_CancelFetchIfImageExceedsMaxSize) { | 245 TEST_F(ImageDataFetcherTest, FetchImageData_CancelFetchIfImageExceedsMaxSize) { |
| 234 // In order to know whether the fetcher was canceled, it must notify about its | 246 // In order to know whether the fetcher was canceled, it must notify about its |
| 235 // deletion. | 247 // deletion. |
| 236 fetcher_factory_.set_remove_fetcher_on_delete(true); | 248 fetcher_factory_.set_remove_fetcher_on_delete(true); |
| 237 | 249 |
| 238 const int64_t kMaxDownloadBytes = 1024 * 1024; | 250 const int64_t kMaxDownloadBytes = 1024 * 1024; |
| 239 image_data_fetcher_.SetImageDownloadLimit(kMaxDownloadBytes); | 251 image_data_fetcher_.SetImageDownloadLimit(kMaxDownloadBytes); |
| 240 image_data_fetcher_.FetchImageData( | 252 image_data_fetcher_.FetchImageData( |
| 241 GURL(kImageURL), base::Bind(&ImageDataFetcherTest::OnImageDataFetched, | 253 GURL(kImageURL), |
| 242 base::Unretained(this))); | 254 base::Bind(&ImageDataFetcherTest::OnImageDataFetched, |
| 255 base::Unretained(this)), |
| 256 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 243 | 257 |
| 244 // Fetching an oversized image will behave like any other failed request. | 258 // Fetching an oversized image will behave like any other failed request. |
| 245 // There will be exactly one call to OnImageDataFetched containing a response | 259 // There will be exactly one call to OnImageDataFetched containing a response |
| 246 // code that would be impossible for a completed fetch. | 260 // code that would be impossible for a completed fetch. |
| 247 RequestMetadata expected_metadata; | 261 RequestMetadata expected_metadata; |
| 248 expected_metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID; | 262 expected_metadata.http_response_code = net::URLFetcher::RESPONSE_CODE_INVALID; |
| 249 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); | 263 EXPECT_CALL(*this, OnImageDataFetched(std::string(), expected_metadata)); |
| 250 | 264 |
| 251 // Get and configure the TestURLFetcher. | 265 // Get and configure the TestURLFetcher. |
| 252 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); | 266 net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 ASSERT_NE(nullptr, fetcher_factory_.GetFetcherByID(0)); | 302 ASSERT_NE(nullptr, fetcher_factory_.GetFetcherByID(0)); |
| 289 | 303 |
| 290 test_url_fetcher->delegate()->OnURLFetchDownloadProgress( | 304 test_url_fetcher->delegate()->OnURLFetchDownloadProgress( |
| 291 test_url_fetcher, kMaxDownloadBytes + 1, // Limits are exceeded. | 305 test_url_fetcher, kMaxDownloadBytes + 1, // Limits are exceeded. |
| 292 /*total=*/-1, /*current_network_bytes=*/0); | 306 /*total=*/-1, /*current_network_bytes=*/0); |
| 293 // ... and be canceled. | 307 // ... and be canceled. |
| 294 EXPECT_EQ(nullptr, fetcher_factory_.GetFetcherByID(0)); | 308 EXPECT_EQ(nullptr, fetcher_factory_.GetFetcherByID(0)); |
| 295 } | 309 } |
| 296 | 310 |
| 297 } // namespace image_fetcher | 311 } // namespace image_fetcher |
| OLD | NEW |