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