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 |