OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/precache/core/precache_fetcher.h" | 5 #include "components/precache/core/precache_fetcher.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
17 #include "components/precache/core/precache_switches.h" | 17 #include "components/precache/core/precache_switches.h" |
18 #include "components/precache/core/proto/precache.pb.h" | 18 #include "components/precache/core/proto/precache.pb.h" |
19 #include "net/http/http_response_headers.h" | 19 #include "net/http/http_response_headers.h" |
| 20 #include "net/http/http_status_code.h" |
20 #include "net/url_request/test_url_fetcher_factory.h" | 21 #include "net/url_request/test_url_fetcher_factory.h" |
21 #include "net/url_request/url_request_test_util.h" | 22 #include "net/url_request/url_request_test_util.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
23 | 24 |
24 namespace precache { | 25 namespace precache { |
25 | 26 |
26 namespace { | 27 namespace { |
27 | 28 |
28 class TestURLFetcherCallback { | 29 class TestURLFetcherCallback { |
29 public: | 30 public: |
30 scoped_ptr<net::FakeURLFetcher> CreateURLFetcher( | 31 scoped_ptr<net::FakeURLFetcher> CreateURLFetcher( |
31 const GURL& url, net::URLFetcherDelegate* delegate, | 32 const GURL& url, net::URLFetcherDelegate* delegate, |
32 const std::string& response_data, bool success) { | 33 const std::string& response_data, net::HttpStatusCode response_code) { |
33 scoped_ptr<net::FakeURLFetcher> fetcher( | 34 scoped_ptr<net::FakeURLFetcher> fetcher( |
34 new net::FakeURLFetcher(url, delegate, response_data, success)); | 35 new net::FakeURLFetcher(url, delegate, response_data, response_code)); |
35 | 36 |
36 if (success) { | 37 if (response_code == net::HTTP_OK) { |
37 scoped_refptr<net::HttpResponseHeaders> download_headers = | 38 scoped_refptr<net::HttpResponseHeaders> download_headers = |
38 new net::HttpResponseHeaders(""); | 39 new net::HttpResponseHeaders(""); |
39 download_headers->AddHeader("Content-Type: text/html"); | 40 download_headers->AddHeader("Content-Type: text/html"); |
40 fetcher->set_response_headers(download_headers); | 41 fetcher->set_response_headers(download_headers); |
41 } | 42 } |
42 | 43 |
43 requested_urls_.insert(url); | 44 requested_urls_.insert(url); |
44 return fetcher.Pass(); | 45 return fetcher.Pass(); |
45 } | 46 } |
46 | 47 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 config.add_whitelisted_starting_url("http://bad-manifest.com"); | 117 config.add_whitelisted_starting_url("http://bad-manifest.com"); |
117 config.add_whitelisted_starting_url("http://good-manifest.com"); | 118 config.add_whitelisted_starting_url("http://good-manifest.com"); |
118 config.add_whitelisted_starting_url("http://not-in-top-4.com"); | 119 config.add_whitelisted_starting_url("http://not-in-top-4.com"); |
119 config.set_maximum_rank_starting_url(4); | 120 config.set_maximum_rank_starting_url(4); |
120 | 121 |
121 PrecacheManifest good_manifest; | 122 PrecacheManifest good_manifest; |
122 good_manifest.add_resource()->set_url(kResourceFetchFailureURL); | 123 good_manifest.add_resource()->set_url(kResourceFetchFailureURL); |
123 good_manifest.add_resource(); // Resource with no URL, should not be fetched. | 124 good_manifest.add_resource(); // Resource with no URL, should not be fetched. |
124 good_manifest.add_resource()->set_url(kGoodResourceURL); | 125 good_manifest.add_resource()->set_url(kGoodResourceURL); |
125 | 126 |
126 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), true); | 127 factory_.SetFakeResponse(GURL(kConfigURL), |
127 factory_.SetFakeResponse(GURL(kManifestFetchFailureURL), "", false); | 128 config.SerializeAsString(), |
128 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", true); | 129 net::HTTP_OK); |
| 130 factory_.SetFakeResponse(GURL(kManifestFetchFailureURL), |
| 131 "", |
| 132 net::HTTP_INTERNAL_SERVER_ERROR); |
| 133 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK); |
129 factory_.SetFakeResponse(GURL(kGoodManifestURL), | 134 factory_.SetFakeResponse(GURL(kGoodManifestURL), |
130 good_manifest.SerializeAsString(), true); | 135 good_manifest.SerializeAsString(), net::HTTP_OK); |
131 factory_.SetFakeResponse(GURL(kResourceFetchFailureURL), "", false); | 136 factory_.SetFakeResponse(GURL(kResourceFetchFailureURL), |
132 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", true); | 137 "", |
| 138 net::HTTP_INTERNAL_SERVER_ERROR); |
| 139 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK); |
133 | 140 |
134 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), | 141 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), |
135 &precache_delegate_); | 142 &precache_delegate_); |
136 precache_fetcher.Start(); | 143 precache_fetcher.Start(); |
137 | 144 |
138 base::MessageLoop::current()->RunUntilIdle(); | 145 base::MessageLoop::current()->RunUntilIdle(); |
139 | 146 |
140 std::multiset<GURL> expected_requested_urls; | 147 std::multiset<GURL> expected_requested_urls; |
141 expected_requested_urls.insert(GURL(kConfigURL)); | 148 expected_requested_urls.insert(GURL(kConfigURL)); |
142 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); | 149 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); |
143 expected_requested_urls.insert(GURL(kBadManifestURL)); | 150 expected_requested_urls.insert(GURL(kBadManifestURL)); |
144 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 151 expected_requested_urls.insert(GURL(kGoodManifestURL)); |
145 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); | 152 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); |
146 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 153 expected_requested_urls.insert(GURL(kGoodResourceURL)); |
147 | 154 |
148 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 155 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
149 | 156 |
150 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 157 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
151 } | 158 } |
152 | 159 |
153 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { | 160 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { |
154 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 161 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
155 switches::kPrecacheConfigSettingsURL, kConfigURL); | 162 switches::kPrecacheConfigSettingsURL, kConfigURL); |
156 | 163 |
157 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); | 164 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); |
158 | 165 |
159 factory_.SetFakeResponse(GURL(kConfigURL), "", false); | 166 factory_.SetFakeResponse(GURL(kConfigURL), |
| 167 "", |
| 168 net::HTTP_INTERNAL_SERVER_ERROR); |
160 | 169 |
161 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), | 170 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), |
162 &precache_delegate_); | 171 &precache_delegate_); |
163 precache_fetcher.Start(); | 172 precache_fetcher.Start(); |
164 | 173 |
165 base::MessageLoop::current()->RunUntilIdle(); | 174 base::MessageLoop::current()->RunUntilIdle(); |
166 | 175 |
167 std::multiset<GURL> expected_requested_urls; | 176 std::multiset<GURL> expected_requested_urls; |
168 expected_requested_urls.insert(GURL(kConfigURL)); | 177 expected_requested_urls.insert(GURL(kConfigURL)); |
169 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 178 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
170 | 179 |
171 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 180 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
172 } | 181 } |
173 | 182 |
174 TEST_F(PrecacheFetcherTest, BadConfig) { | 183 TEST_F(PrecacheFetcherTest, BadConfig) { |
175 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 184 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
176 switches::kPrecacheConfigSettingsURL, kConfigURL); | 185 switches::kPrecacheConfigSettingsURL, kConfigURL); |
177 | 186 |
178 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); | 187 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); |
179 | 188 |
180 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", true); | 189 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK); |
181 | 190 |
182 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), | 191 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), |
183 &precache_delegate_); | 192 &precache_delegate_); |
184 precache_fetcher.Start(); | 193 precache_fetcher.Start(); |
185 | 194 |
186 base::MessageLoop::current()->RunUntilIdle(); | 195 base::MessageLoop::current()->RunUntilIdle(); |
187 | 196 |
188 std::multiset<GURL> expected_requested_urls; | 197 std::multiset<GURL> expected_requested_urls; |
189 expected_requested_urls.insert(GURL(kConfigURL)); | 198 expected_requested_urls.insert(GURL(kConfigURL)); |
190 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 199 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
191 | 200 |
192 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 201 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
193 } | 202 } |
194 | 203 |
195 TEST_F(PrecacheFetcherTest, Cancel) { | 204 TEST_F(PrecacheFetcherTest, Cancel) { |
196 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 205 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
197 switches::kPrecacheConfigSettingsURL, kConfigURL); | 206 switches::kPrecacheConfigSettingsURL, kConfigURL); |
198 | 207 |
199 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); | 208 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); |
200 | 209 |
201 PrecacheConfigurationSettings config; | 210 PrecacheConfigurationSettings config; |
202 config.add_whitelisted_starting_url("http://starting-url.com"); | 211 config.add_whitelisted_starting_url("http://starting-url.com"); |
203 config.set_maximum_rank_starting_url(1); | 212 config.set_maximum_rank_starting_url(1); |
204 | 213 |
205 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), true); | 214 factory_.SetFakeResponse(GURL(kConfigURL), |
| 215 config.SerializeAsString(), |
| 216 net::HTTP_OK); |
206 | 217 |
207 scoped_ptr<PrecacheFetcher> precache_fetcher(new PrecacheFetcher( | 218 scoped_ptr<PrecacheFetcher> precache_fetcher(new PrecacheFetcher( |
208 starting_urls, request_context_.get(), &precache_delegate_)); | 219 starting_urls, request_context_.get(), &precache_delegate_)); |
209 precache_fetcher->Start(); | 220 precache_fetcher->Start(); |
210 | 221 |
211 // Destroy the PrecacheFetcher to cancel precaching. This should not cause | 222 // Destroy the PrecacheFetcher to cancel precaching. This should not cause |
212 // OnDone to be called on the precache delegate. | 223 // OnDone to be called on the precache delegate. |
213 precache_fetcher.reset(); | 224 precache_fetcher.reset(); |
214 | 225 |
215 base::MessageLoop::current()->RunUntilIdle(); | 226 base::MessageLoop::current()->RunUntilIdle(); |
216 | 227 |
217 std::multiset<GURL> expected_requested_urls; | 228 std::multiset<GURL> expected_requested_urls; |
218 expected_requested_urls.insert(GURL(kConfigURL)); | 229 expected_requested_urls.insert(GURL(kConfigURL)); |
219 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 230 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
220 | 231 |
221 EXPECT_FALSE(precache_delegate_.was_on_done_called()); | 232 EXPECT_FALSE(precache_delegate_.was_on_done_called()); |
222 } | 233 } |
223 | 234 |
224 #if defined(PRECACHE_CONFIG_SETTINGS_URL) | 235 #if defined(PRECACHE_CONFIG_SETTINGS_URL) |
225 | 236 |
226 // If the default precache configuration settings URL is defined, then test that | 237 // If the default precache configuration settings URL is defined, then test that |
227 // it works with the PrecacheFetcher. | 238 // it works with the PrecacheFetcher. |
228 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { | 239 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { |
229 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); | 240 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); |
230 | 241 |
231 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), | 242 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), |
232 PrecacheConfigurationSettings().SerializeAsString(), | 243 PrecacheConfigurationSettings().SerializeAsString(), |
233 true); | 244 net::HTTP_OK); |
234 | 245 |
235 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), | 246 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), |
236 &precache_delegate_); | 247 &precache_delegate_); |
237 precache_fetcher.Start(); | 248 precache_fetcher.Start(); |
238 | 249 |
239 base::MessageLoop::current()->RunUntilIdle(); | 250 base::MessageLoop::current()->RunUntilIdle(); |
240 | 251 |
241 std::multiset<GURL> expected_requested_urls; | 252 std::multiset<GURL> expected_requested_urls; |
242 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); | 253 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); |
243 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 254 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
(...skipping 13 matching lines...) Expand all Loading... |
257 | 268 |
258 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); | 269 std::list<GURL> starting_urls(1, GURL("http://starting-url.com")); |
259 | 270 |
260 PrecacheConfigurationSettings config; | 271 PrecacheConfigurationSettings config; |
261 config.add_whitelisted_starting_url("http://starting-url.com"); | 272 config.add_whitelisted_starting_url("http://starting-url.com"); |
262 config.set_maximum_rank_starting_url(1); | 273 config.set_maximum_rank_starting_url(1); |
263 | 274 |
264 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX | 275 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX |
265 "http%253A%252F%252Fstarting-url.com%252F"); | 276 "http%253A%252F%252Fstarting-url.com%252F"); |
266 | 277 |
267 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), true); | 278 factory_.SetFakeResponse(GURL(kConfigURL), |
268 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), | 279 config.SerializeAsString(), |
269 true); | 280 net::HTTP_OK); |
| 281 factory_.SetFakeResponse(manifest_url, |
| 282 PrecacheManifest().SerializeAsString(), |
| 283 net::HTTP_OK); |
270 | 284 |
271 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), | 285 PrecacheFetcher precache_fetcher(starting_urls, request_context_.get(), |
272 &precache_delegate_); | 286 &precache_delegate_); |
273 precache_fetcher.Start(); | 287 precache_fetcher.Start(); |
274 | 288 |
275 base::MessageLoop::current()->RunUntilIdle(); | 289 base::MessageLoop::current()->RunUntilIdle(); |
276 | 290 |
277 std::multiset<GURL> expected_requested_urls; | 291 std::multiset<GURL> expected_requested_urls; |
278 expected_requested_urls.insert(GURL(kConfigURL)); | 292 expected_requested_urls.insert(GURL(kConfigURL)); |
279 expected_requested_urls.insert(manifest_url); | 293 expected_requested_urls.insert(manifest_url); |
280 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 294 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
281 | 295 |
282 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 296 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
283 } | 297 } |
284 | 298 |
285 #endif // PRECACHE_MANIFEST_URL_PREFIX | 299 #endif // PRECACHE_MANIFEST_URL_PREFIX |
286 | 300 |
287 } // namespace | 301 } // namespace |
288 | 302 |
289 } // namespace precache | 303 } // namespace precache |
OLD | NEW |