| 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 |