Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(483)

Side by Side Diff: components/precache/core/precache_fetcher_unittest.cc

Issue 2229983002: Send the list of used and unused resources for precache (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nits Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <stdint.h> 7 #include <stdint.h>
8 8
9 #include <cstring> 9 #include <cstring>
10 #include <memory> 10 #include <memory>
11 #include <set> 11 #include <set>
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 #include "base/bind.h" 15 #include "base/bind.h"
16 #include "base/callback.h" 16 #include "base/callback.h"
17 #include "base/command_line.h" 17 #include "base/command_line.h"
18 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
19 #include "base/files/file_path.h"
20 #include "base/files/scoped_temp_dir.h"
19 #include "base/memory/ptr_util.h" 21 #include "base/memory/ptr_util.h"
20 #include "base/memory/ref_counted.h" 22 #include "base/memory/ref_counted.h"
21 #include "base/memory/weak_ptr.h" 23 #include "base/memory/weak_ptr.h"
22 #include "base/run_loop.h" 24 #include "base/run_loop.h"
23 #include "base/single_thread_task_runner.h" 25 #include "base/single_thread_task_runner.h"
24 #include "base/strings/stringprintf.h" 26 #include "base/strings/stringprintf.h"
25 #include "base/test/histogram_tester.h" 27 #include "base/test/histogram_tester.h"
26 #include "base/threading/thread_task_runner_handle.h" 28 #include "base/threading/thread_task_runner_handle.h"
29 #include "components/precache/core/precache_database.h"
27 #include "components/precache/core/precache_switches.h" 30 #include "components/precache/core/precache_switches.h"
28 #include "components/precache/core/proto/precache.pb.h" 31 #include "components/precache/core/proto/precache.pb.h"
29 #include "components/precache/core/proto/unfinished_work.pb.h" 32 #include "components/precache/core/proto/unfinished_work.pb.h"
33 #include "net/base/escape.h"
30 #include "net/base/load_flags.h" 34 #include "net/base/load_flags.h"
31 #include "net/http/http_response_headers.h" 35 #include "net/http/http_response_headers.h"
36 #include "net/http/http_response_info.h"
32 #include "net/http/http_status_code.h" 37 #include "net/http/http_status_code.h"
33 #include "net/url_request/test_url_fetcher_factory.h" 38 #include "net/url_request/test_url_fetcher_factory.h"
34 #include "net/url_request/url_request_status.h" 39 #include "net/url_request/url_request_status.h"
35 #include "net/url_request/url_request_test_util.h" 40 #include "net/url_request/url_request_test_util.h"
36 #include "testing/gmock/include/gmock/gmock.h" 41 #include "testing/gmock/include/gmock/gmock.h"
37 #include "testing/gtest/include/gtest/gtest.h" 42 #include "testing/gtest/include/gtest/gtest.h"
38 #include "url/gurl.h" 43 #include "url/gurl.h"
39 44
40 namespace precache { 45 namespace precache {
41 46
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 net::URLRequestStatus::Status status) { 88 net::URLRequestStatus::Status status) {
84 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( 89 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher(
85 url, delegate, response_data, response_code, status)); 90 url, delegate, response_data, response_code, status));
86 91
87 total_response_bytes_ += response_data.size(); 92 total_response_bytes_ += response_data.size();
88 requested_urls_.insert(url); 93 requested_urls_.insert(url);
89 94
90 return fetcher; 95 return fetcher;
91 } 96 }
92 97
93 const std::multiset<GURL>& requested_urls() const { 98 const std::multiset<GURL>& requested_urls() const { return requested_urls_; }
94 return requested_urls_; 99
95 } 100 void clear_requested_urls() { requested_urls_.clear(); }
96 101
97 int total_response_bytes() const { return total_response_bytes_; } 102 int total_response_bytes() const { return total_response_bytes_; }
98 103
99 private: 104 private:
100 // Multiset with one entry for each URL requested. 105 // Multiset with one entry for each URL requested.
101 std::multiset<GURL> requested_urls_; 106 std::multiset<GURL> requested_urls_;
102 int total_response_bytes_; 107 int total_response_bytes_;
103 }; 108 };
104 109
105 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate { 110 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 GURL url(kConfigURL); 228 GURL url(kConfigURL);
224 229
225 net::FakeURLFetcher* fetcher = nullptr; 230 net::FakeURLFetcher* fetcher = nullptr;
226 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 231 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
227 .WillOnce(factory_.RespondWith("", &fetcher)); 232 .WillOnce(factory_.RespondWith("", &fetcher));
228 EXPECT_CALL(*this, 233 EXPECT_CALL(*this,
229 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 234 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
230 NotNull()))); 235 NotNull())));
231 236
232 PrecacheFetcher::Fetcher precache_fetcher( 237 PrecacheFetcher::Fetcher precache_fetcher(
233 request_context_.get(), url, callback_, false /* is_resource_request */, 238 request_context_.get(), url, url.host(), callback_,
234 SIZE_MAX); 239 false /* is_resource_request */, SIZE_MAX);
235 240
236 loop_.RunUntilIdle(); 241 base::RunLoop().RunUntilIdle();
237 242
238 ASSERT_NE(nullptr, fetcher); 243 ASSERT_NE(nullptr, fetcher);
239 EXPECT_EQ(kNoTracking, fetcher->GetLoadFlags()); 244 EXPECT_EQ(kNoTracking, fetcher->GetLoadFlags());
240 } 245 }
241 246
242 TEST_F(PrecacheFetcherFetcherTest, ResourceNotInCache) { 247 TEST_F(PrecacheFetcherFetcherTest, ResourceNotInCache) {
243 GURL url(kGoodResourceURL); 248 GURL url(kGoodResourceURL);
244 249
245 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr; 250 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr;
246 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 251 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
247 .WillOnce(factory_.RespondWith("", CacheMiss, &fetcher1)) 252 .WillOnce(factory_.RespondWith("", CacheMiss, &fetcher1))
248 .WillOnce(factory_.RespondWith("", &fetcher2)); 253 .WillOnce(factory_.RespondWith("", &fetcher2));
249 EXPECT_CALL(*this, 254 EXPECT_CALL(*this,
250 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 255 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
251 NotNull()))) 256 NotNull())))
252 .Times(1); 257 .Times(1);
253 258
254 PrecacheFetcher::Fetcher precache_fetcher( 259 PrecacheFetcher::Fetcher precache_fetcher(
255 request_context_.get(), url, callback_, true /* is_resource_request */, 260 request_context_.get(), url, url.host(), callback_,
256 SIZE_MAX); 261 true /* is_resource_request */, SIZE_MAX);
257 262
258 loop_.RunUntilIdle(); 263 base::RunLoop().RunUntilIdle();
259 264
260 ASSERT_NE(nullptr, fetcher1); 265 ASSERT_NE(nullptr, fetcher1);
261 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags()); 266 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags());
262 ASSERT_NE(nullptr, fetcher2); 267 ASSERT_NE(nullptr, fetcher2);
263 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags()); 268 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags());
264 } 269 }
265 270
266 TEST_F(PrecacheFetcherFetcherTest, ResourceHasValidators) { 271 TEST_F(PrecacheFetcherFetcherTest, ResourceHasValidators) {
267 GURL url(kGoodResourceURL); 272 GURL url(kGoodResourceURL);
268 273
269 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr; 274 net::FakeURLFetcher *fetcher1 = nullptr, *fetcher2 = nullptr;
270 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 275 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
271 .WillOnce(factory_.RespondWith("", HasETag, &fetcher1)) 276 .WillOnce(factory_.RespondWith("", HasETag, &fetcher1))
272 .WillOnce(factory_.RespondWith("", &fetcher2)); 277 .WillOnce(factory_.RespondWith("", &fetcher2));
273 EXPECT_CALL(*this, 278 EXPECT_CALL(*this,
274 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 279 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
275 NotNull()))); 280 NotNull())));
276 281
277 PrecacheFetcher::Fetcher precache_fetcher( 282 PrecacheFetcher::Fetcher precache_fetcher(
278 request_context_.get(), url, callback_, true /* is_resource_request */, 283 request_context_.get(), url, url.host(), callback_,
279 SIZE_MAX); 284 true /* is_resource_request */, SIZE_MAX);
280 285
281 loop_.RunUntilIdle(); 286 base::RunLoop().RunUntilIdle();
282 287
283 ASSERT_NE(nullptr, fetcher1); 288 ASSERT_NE(nullptr, fetcher1);
284 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags()); 289 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher1->GetLoadFlags());
285 ASSERT_NE(nullptr, fetcher2); 290 ASSERT_NE(nullptr, fetcher2);
286 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags()); 291 EXPECT_EQ(net::LOAD_VALIDATE_CACHE | kNoTracking, fetcher2->GetLoadFlags());
287 } 292 }
288 293
289 TEST_F(PrecacheFetcherFetcherTest, ResourceHasNoValidators) { 294 TEST_F(PrecacheFetcherFetcherTest, ResourceHasNoValidators) {
290 GURL url(kGoodResourceURL); 295 GURL url(kGoodResourceURL);
291 296
292 net::FakeURLFetcher* fetcher; 297 net::FakeURLFetcher* fetcher;
293 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 298 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
294 .WillOnce(factory_.RespondWith("", &fetcher)); 299 .WillOnce(factory_.RespondWith("", &fetcher));
295 EXPECT_CALL(*this, 300 EXPECT_CALL(*this,
296 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 301 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
297 nullptr))); // It never reached the network. 302 nullptr))); // It never reached the network.
298 303
299 PrecacheFetcher::Fetcher precache_fetcher( 304 PrecacheFetcher::Fetcher precache_fetcher(
300 request_context_.get(), url, callback_, true /* is_resource_request */, 305 request_context_.get(), url, url.host(), callback_,
301 SIZE_MAX); 306 true /* is_resource_request */, SIZE_MAX);
302 307
303 loop_.RunUntilIdle(); 308 base::RunLoop().RunUntilIdle();
304 309
305 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher->GetLoadFlags()); 310 EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE | kNoTracking, fetcher->GetLoadFlags());
306 } 311 }
307 312
308 TEST_F(PrecacheFetcherFetcherTest, ResourceTooBig) { 313 TEST_F(PrecacheFetcherFetcherTest, ResourceTooBig) {
309 GURL url(kGoodResourceURL); 314 GURL url(kGoodResourceURL);
310 315
311 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _)) 316 EXPECT_CALL(factory_, DoCreateURLFetcher(_, url, net::URLFetcher::GET, _))
312 // Cache request will fail, so that a network request is made. Only 317 // Cache request will fail, so that a network request is made. Only
313 // network requests are byte-capped. 318 // network requests are byte-capped.
314 .WillOnce(factory_.RespondWith("", CacheMiss, nullptr)) 319 .WillOnce(factory_.RespondWith("", CacheMiss, nullptr))
315 .WillOnce(factory_.RespondWith(std::string(100, '.'), nullptr)); 320 .WillOnce(factory_.RespondWith(std::string(100, '.'), nullptr));
316 321
317 // The callback should be called even though the download was cancelled, so 322 // The callback should be called even though the download was cancelled, so
318 // that the next download can start. The network_url_fetcher within should be 323 // that the next download can start. The network_url_fetcher within should be
319 // null, to signify that either the network was never reached (which will be 324 // null, to signify that either the network was never reached (which will be
320 // flagged as an error due to the expectation above) or it was requested but 325 // flagged as an error due to the expectation above) or it was requested but
321 // cancelled (which is the desired behavior). 326 // cancelled (which is the desired behavior).
322 EXPECT_CALL(*this, 327 EXPECT_CALL(*this,
323 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher, 328 Callback(Property(&PrecacheFetcher::Fetcher::network_url_fetcher,
324 nullptr))); 329 nullptr)));
325 330
326 PrecacheFetcher::Fetcher precache_fetcher( 331 PrecacheFetcher::Fetcher precache_fetcher(
327 request_context_.get(), url, callback_, true /* is_resource_request */, 332 request_context_.get(), url, url.host(), callback_,
328 99 /* max_bytes */); 333 true /* is_resource_request */, 99 /* max_bytes */);
329 334
330 loop_.RunUntilIdle(); 335 base::RunLoop().RunUntilIdle();
331 } 336 }
332 337
333 class PrecacheFetcherTest : public testing::Test { 338 class PrecacheFetcherTest : public testing::Test {
334 public: 339 public:
335 PrecacheFetcherTest() 340 PrecacheFetcherTest()
336 : request_context_(new net::TestURLRequestContextGetter( 341 : task_runner_(base::ThreadTaskRunnerHandle::Get()),
342 request_context_(new net::TestURLRequestContextGetter(
337 base::ThreadTaskRunnerHandle::Get())), 343 base::ThreadTaskRunnerHandle::Get())),
338 factory_(NULL, 344 factory_(NULL,
339 base::Bind(&TestURLFetcherCallback::CreateURLFetcher, 345 base::Bind(&TestURLFetcherCallback::CreateURLFetcher,
340 base::Unretained(&url_callback_))), 346 base::Unretained(&url_callback_))),
341 expected_total_response_bytes_(0), 347 expected_total_response_bytes_(0),
342 parallel_fetches_beyond_capacity_(false) {} 348 parallel_fetches_beyond_capacity_(false) {}
343 349
350 void UpdatePrecacheReferrerHost(const std::string& hostname,
351 int64_t manifest_id) {
352 precache_database_.UpdatePrecacheReferrerHost(hostname, manifest_id,
353 base::Time());
354 }
355
356 void RecordURLPrefetch(const GURL& url, const std::string& referrer_host) {
357 precache_database_.RecordURLPrefetch(url, referrer_host, base::Time::Now(),
358 false /* was_cached */,
359 1000 /* size */);
360 }
361
362 void RecordURLNonPrefetch(const GURL& url) {
363 net::HttpResponseInfo info;
364 info.was_cached = true;
365 info.headers = new net::HttpResponseHeaders(std::string());
366 precache_database_.RecordURLNonPrefetch(
367 url, base::TimeDelta(), base::Time::Now(), info, 1000 /* size */,
368 0 /* host_rank */, false /* is_connection_cellular */);
369 }
370
344 protected: 371 protected:
372 void SetUp() override {
373 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
374 base::FilePath db_path = scoped_temp_dir_.path().Append(
375 base::FilePath(FILE_PATH_LITERAL("precache_database")));
376 precache_database_.Init(db_path);
377 }
345 void SetDefaultFlags() { 378 void SetDefaultFlags() {
346 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 379 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
347 switches::kPrecacheConfigSettingsURL, kConfigURL); 380 switches::kPrecacheConfigSettingsURL, kConfigURL);
348 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 381 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
349 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); 382 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix);
350 } 383 }
351 384
352 // Posts a task to check if more parallel fetches of precache manifest and 385 // Posts a task to check if more parallel fetches of precache manifest and
353 // resource URLs were attempted beyond the fetcher pool maximum defined 386 // resource URLs were attempted beyond the fetcher pool maximum defined
354 // capacity. The task will be posted repeatedly until such condition is met. 387 // capacity. The task will be posted repeatedly until such condition is met.
355 void CheckUntilParallelFetchesBeyondCapacity( 388 void CheckUntilParallelFetchesBeyondCapacity(
356 const PrecacheFetcher* precache_fetcher) { 389 const PrecacheFetcher* precache_fetcher) {
357 if (!precache_fetcher->pool_.IsAvailable() && 390 if (!precache_fetcher->pool_.IsAvailable() &&
358 !precache_fetcher->resource_urls_to_fetch_.empty() && 391 !precache_fetcher->top_hosts_to_fetch_.empty() &&
359 !precache_fetcher->manifest_urls_to_fetch_.empty()) { 392 !precache_fetcher->resources_to_fetch_.empty()) {
360 parallel_fetches_beyond_capacity_ = true; 393 parallel_fetches_beyond_capacity_ = true;
361 return; 394 return;
362 } 395 }
363 396
364 // Check again after allowing the message loop to process some messages. 397 // Check again after allowing the message loop to process some messages.
365 loop_.task_runner()->PostTask( 398 loop_.task_runner()->PostTask(
366 FROM_HERE, 399 FROM_HERE,
367 base::Bind( 400 base::Bind(
368 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity, 401 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity,
369 base::Unretained(this), precache_fetcher)); 402 base::Unretained(this), precache_fetcher));
370 } 403 }
371 404
405 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner() const {
406 return task_runner_;
407 }
408
409 // Must be declared first so that it is destroyed last.
372 base::MessageLoopForUI loop_; 410 base::MessageLoopForUI loop_;
411 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
373 scoped_refptr<net::TestURLRequestContextGetter> request_context_; 412 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
374 TestURLFetcherCallback url_callback_; 413 TestURLFetcherCallback url_callback_;
375 net::FakeURLFetcherFactory factory_; 414 net::FakeURLFetcherFactory factory_;
376 TestPrecacheDelegate precache_delegate_; 415 TestPrecacheDelegate precache_delegate_;
416 base::ScopedTempDir scoped_temp_dir_;
417 PrecacheDatabase precache_database_;
377 int expected_total_response_bytes_; 418 int expected_total_response_bytes_;
378 419
379 // True if more parallel fetches were attempted beyond the fetcher pool 420 // True if more parallel fetches were attempted beyond the fetcher pool
380 // maximum capacity. 421 // maximum capacity.
381 bool parallel_fetches_beyond_capacity_; 422 bool parallel_fetches_beyond_capacity_;
382 }; 423 };
383 424
384 TEST_F(PrecacheFetcherTest, FullPrecache) { 425 TEST_F(PrecacheFetcherTest, FullPrecache) {
385 SetDefaultFlags(); 426 SetDefaultFlags();
386 427
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 net::URLRequestStatus::FAILED); 459 net::URLRequestStatus::FAILED);
419 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 460 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
420 net::URLRequestStatus::SUCCESS); 461 net::URLRequestStatus::SUCCESS);
421 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), 462 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL),
422 PrecacheManifest().SerializeAsString(), net::HTTP_OK, 463 PrecacheManifest().SerializeAsString(), net::HTTP_OK,
423 net::URLRequestStatus::SUCCESS); 464 net::URLRequestStatus::SUCCESS);
424 465
425 base::HistogramTester histogram; 466 base::HistogramTester histogram;
426 467
427 { 468 {
428 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 469 PrecacheFetcher precache_fetcher(
429 std::string(), std::move(unfinished_work), 470 request_context_.get(), GURL(), std::string(),
430 kExperimentID, &precache_delegate_); 471 std::move(unfinished_work), kExperimentID,
472 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
431 precache_fetcher.Start(); 473 precache_fetcher.Start();
432 474
433 loop_.RunUntilIdle(); 475 base::RunLoop().RunUntilIdle();
434 476
435 // Destroy the PrecacheFetcher after it has finished, to record metrics. 477 // Destroy the PrecacheFetcher after it has finished, to record metrics.
436 } 478 }
437 479
438 std::multiset<GURL> expected_requested_urls; 480 std::multiset<GURL> expected_requested_urls;
439 expected_requested_urls.insert(GURL(kConfigURL)); 481 expected_requested_urls.insert(GURL(kConfigURL));
440 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); 482 expected_requested_urls.insert(GURL(kManifestFetchFailureURL));
441 expected_requested_urls.insert(GURL(kBadManifestURL)); 483 expected_requested_urls.insert(GURL(kBadManifestURL));
442 expected_requested_urls.insert(GURL(kGoodManifestURL)); 484 expected_requested_urls.insert(GURL(kGoodManifestURL));
443 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); 485 expected_requested_urls.insert(GURL(kResourceFetchFailureURL));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 528 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
487 net::URLRequestStatus::SUCCESS); 529 net::URLRequestStatus::SUCCESS);
488 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, 530 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
489 net::URLRequestStatus::SUCCESS); 531 net::URLRequestStatus::SUCCESS);
490 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 532 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
491 net::URLRequestStatus::SUCCESS); 533 net::URLRequestStatus::SUCCESS);
492 534
493 base::HistogramTester histogram; 535 base::HistogramTester histogram;
494 536
495 { 537 {
496 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 538 PrecacheFetcher precache_fetcher(
497 std::string(), std::move(unfinished_work), 539 request_context_.get(), GURL(), std::string(),
498 kExperimentID, &precache_delegate_); 540 std::move(unfinished_work), kExperimentID,
541 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
499 precache_fetcher.Start(); 542 precache_fetcher.Start();
500 543
501 loop_.RunUntilIdle(); 544 base::RunLoop().RunUntilIdle();
502 545
503 // Destroy the PrecacheFetcher after it has finished, to record metrics. 546 // Destroy the PrecacheFetcher after it has finished, to record metrics.
504 } 547 }
505 548
506 std::multiset<GURL> expected_requested_urls; 549 std::multiset<GURL> expected_requested_urls;
507 expected_requested_urls.insert(GURL(kConfigURL)); 550 expected_requested_urls.insert(GURL(kConfigURL));
508 expected_requested_urls.insert(GURL(kGoodManifestURL)); 551 expected_requested_urls.insert(GURL(kGoodManifestURL));
509 expected_requested_urls.insert(GURL(kGoodResourceURL)); 552 expected_requested_urls.insert(GURL(kGoodResourceURL));
510 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 553 expected_requested_urls.insert(GURL(kGoodResourceURLB));
511 expected_requested_urls.insert(GURL(kGoodResourceURLD)); 554 expected_requested_urls.insert(GURL(kGoodResourceURLD));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, 601 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
559 net::URLRequestStatus::SUCCESS); 602 net::URLRequestStatus::SUCCESS);
560 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK, 603 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK,
561 net::URLRequestStatus::SUCCESS); 604 net::URLRequestStatus::SUCCESS);
562 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 605 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
563 net::URLRequestStatus::SUCCESS); 606 net::URLRequestStatus::SUCCESS);
564 607
565 base::HistogramTester histogram; 608 base::HistogramTester histogram;
566 609
567 { 610 {
568 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 611 PrecacheFetcher precache_fetcher(
569 std::string(), std::move(unfinished_work), 612 request_context_.get(), GURL(), std::string(),
570 kExperimentID, &precache_delegate_); 613 std::move(unfinished_work), kExperimentID,
614 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
571 precache_fetcher.Start(); 615 precache_fetcher.Start();
572 616
573 loop_.RunUntilIdle(); 617 base::RunLoop().RunUntilIdle();
574 618
575 // Destroy the PrecacheFetcher after it has finished, to record metrics. 619 // Destroy the PrecacheFetcher after it has finished, to record metrics.
576 } 620 }
577 621
578 std::multiset<GURL> expected_requested_urls; 622 std::multiset<GURL> expected_requested_urls;
579 expected_requested_urls.insert(GURL(kConfigURL)); 623 expected_requested_urls.insert(GURL(kConfigURL));
580 expected_requested_urls.insert(GURL(kGoodManifestURL)); 624 expected_requested_urls.insert(GURL(kGoodManifestURL));
581 expected_requested_urls.insert(GURL(kGoodResourceURL)); 625 expected_requested_urls.insert(GURL(kGoodResourceURL));
582 expected_requested_urls.insert(GURL(kGoodResourceURLA)); 626 expected_requested_urls.insert(GURL(kGoodResourceURLA));
583 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 627 expected_requested_urls.insert(GURL(kGoodResourceURLB));
(...skipping 11 matching lines...) Expand all
595 } 639 }
596 640
597 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { 641 TEST_F(PrecacheFetcherTest, PrecachePauseResume) {
598 SetDefaultFlags(); 642 SetDefaultFlags();
599 643
600 PrecacheConfigurationSettings config; 644 PrecacheConfigurationSettings config;
601 config.set_top_sites_count(3); 645 config.set_top_sites_count(3);
602 646
603 std::unique_ptr<PrecacheUnfinishedWork> initial_work( 647 std::unique_ptr<PrecacheUnfinishedWork> initial_work(
604 new PrecacheUnfinishedWork()); 648 new PrecacheUnfinishedWork());
605 initial_work->add_manifest()->set_url( 649 initial_work->add_top_host()->set_hostname("manifest1.com");
606 "http://manifest-url-prefix.com/manifest1.com"); 650 initial_work->add_top_host()->set_hostname("manifest2.com");
607 initial_work->add_manifest()->set_url(
608 "http://manifest-url-prefix.com/manifest2.com");
609 initial_work->add_resource()->set_url(kGoodResourceURL);
610 initial_work->set_start_time( 651 initial_work->set_start_time(
611 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue()); 652 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue());
612 653
613 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(), 654 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(),
614 std::move(initial_work), kExperimentID, 655 std::move(initial_work), kExperimentID,
656 precache_database_.GetWeakPtr(), task_runner(),
615 &precache_delegate_); 657 &precache_delegate_);
616 658 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
617 loop_.RunUntilIdle(); 659 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
660 first_fetcher.Start();
618 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work = 661 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work =
619 first_fetcher.CancelPrecaching(); 662 first_fetcher.CancelPrecaching();
620 663
621 std::multiset<GURL> expected_requested_urls; 664 std::multiset<GURL> expected_requested_urls;
665 expected_requested_urls.insert(GURL(kConfigURL));
622 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 666 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
623 667
624 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 668 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
625 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 669 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
626 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK, 670 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK,
627 net::URLRequestStatus::SUCCESS); 671 net::URLRequestStatus::SUCCESS);
628 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"), 672 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"),
629 "bad protobuf", net::HTTP_OK, 673 "bad protobuf", net::HTTP_OK,
630 net::URLRequestStatus::SUCCESS); 674 net::URLRequestStatus::SUCCESS);
631 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"), 675 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"),
632 "bad protobuf", net::HTTP_OK, 676 "bad protobuf", net::HTTP_OK,
633 net::URLRequestStatus::SUCCESS); 677 net::URLRequestStatus::SUCCESS);
634 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 678 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
635 net::URLRequestStatus::SUCCESS); 679 net::URLRequestStatus::SUCCESS);
636 // Starting hosts should not be fetched. 680
637 unfinished_work->add_top_host()->set_hostname("bad-manifest.com"); 681 url_callback_.clear_requested_urls();
638 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(), 682 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(),
639 std::move(unfinished_work), kExperimentID, 683 std::move(unfinished_work), kExperimentID,
684 precache_database_.GetWeakPtr(), task_runner(),
640 &precache_delegate_); 685 &precache_delegate_);
641 second_fetcher.Start(); 686 second_fetcher.Start();
642 loop_.RunUntilIdle(); 687 base::RunLoop().RunUntilIdle();
643 expected_requested_urls.insert(GURL(kConfigURL));
644 expected_requested_urls.insert( 688 expected_requested_urls.insert(
645 GURL("http://manifest-url-prefix.com/manifest1.com")); 689 GURL("http://manifest-url-prefix.com/manifest1.com"));
646 expected_requested_urls.insert( 690 expected_requested_urls.insert(
647 GURL("http://manifest-url-prefix.com/manifest2.com")); 691 GURL("http://manifest-url-prefix.com/manifest2.com"));
648 expected_requested_urls.insert(GURL(kGoodResourceURL));
649 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 692 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
650 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 693 EXPECT_TRUE(precache_delegate_.was_on_done_called());
651 } 694 }
652 695
653 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) { 696 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) {
654 SetDefaultFlags(); 697 SetDefaultFlags();
655 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 698 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
656 new PrecacheUnfinishedWork()); 699 new PrecacheUnfinishedWork());
657 unfinished_work->mutable_config_settings()->add_forced_site( 700 unfinished_work->mutable_config_settings()->add_forced_site(
658 "good-manifest.com"); 701 "good-manifest.com");
659 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); 702 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
660 PrecacheManifest good_manifest; 703 PrecacheManifest good_manifest;
661 good_manifest.add_resource()->set_url(kGoodResourceURL); 704 good_manifest.add_resource()->set_url(kGoodResourceURL);
662 705
663 factory_.SetFakeResponse(GURL(kGoodManifestURL), 706 factory_.SetFakeResponse(GURL(kGoodManifestURL),
664 good_manifest.SerializeAsString(), net::HTTP_OK, 707 good_manifest.SerializeAsString(), net::HTTP_OK,
665 net::URLRequestStatus::SUCCESS); 708 net::URLRequestStatus::SUCCESS);
666 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 709 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
667 net::URLRequestStatus::SUCCESS); 710 net::URLRequestStatus::SUCCESS);
668 { 711 {
669 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 712 PrecacheFetcher precache_fetcher(
670 std::string(), std::move(unfinished_work), 713 request_context_.get(), GURL(), std::string(),
671 kExperimentID, &precache_delegate_); 714 std::move(unfinished_work), kExperimentID,
715 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
672 precache_fetcher.Start(); 716 precache_fetcher.Start();
673 717
674 loop_.RunUntilIdle(); 718 base::RunLoop().RunUntilIdle();
675 } 719 }
676 720
677 std::multiset<GURL> expected_requested_urls; 721 std::multiset<GURL> expected_requested_urls;
678 expected_requested_urls.insert(GURL(kGoodManifestURL)); 722 expected_requested_urls.insert(GURL(kGoodManifestURL));
679 expected_requested_urls.insert(GURL(kGoodResourceURL)); 723 expected_requested_urls.insert(GURL(kGoodResourceURL));
680 724
681 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 725 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
682 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 726 EXPECT_TRUE(precache_delegate_.was_on_done_called());
683 727
684 } 728 }
(...skipping 14 matching lines...) Expand all
699 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), 743 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(),
700 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 744 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
701 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), 745 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL),
702 good_manifest.SerializeAsString(), net::HTTP_OK, 746 good_manifest.SerializeAsString(), net::HTTP_OK,
703 net::URLRequestStatus::SUCCESS); 747 net::URLRequestStatus::SUCCESS);
704 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 748 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
705 net::URLRequestStatus::SUCCESS); 749 net::URLRequestStatus::SUCCESS);
706 750
707 PrecacheFetcher precache_fetcher( 751 PrecacheFetcher precache_fetcher(
708 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix, 752 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix,
709 std::move(unfinished_work), kExperimentID, &precache_delegate_); 753 std::move(unfinished_work), kExperimentID,
754 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
710 precache_fetcher.Start(); 755 precache_fetcher.Start();
711 756
712 loop_.RunUntilIdle(); 757 base::RunLoop().RunUntilIdle();
713 758
714 std::multiset<GURL> expected_requested_urls; 759 std::multiset<GURL> expected_requested_urls;
715 expected_requested_urls.insert(GURL(kCustomConfigURL)); 760 expected_requested_urls.insert(GURL(kCustomConfigURL));
716 expected_requested_urls.insert(GURL(kCustomGoodManifestURL)); 761 expected_requested_urls.insert(GURL(kCustomGoodManifestURL));
717 expected_requested_urls.insert(GURL(kGoodResourceURL)); 762 expected_requested_urls.insert(GURL(kGoodResourceURL));
718 763
719 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 764 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
720 765
721 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 766 EXPECT_TRUE(precache_delegate_.was_on_done_called());
722 } 767 }
723 768
724 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { 769 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) {
725 SetDefaultFlags(); 770 SetDefaultFlags();
726 771
727 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 772 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
728 new PrecacheUnfinishedWork()); 773 new PrecacheUnfinishedWork());
729 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 774 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
730 775
731 factory_.SetFakeResponse(GURL(kConfigURL), "", 776 factory_.SetFakeResponse(GURL(kConfigURL), "",
732 net::HTTP_INTERNAL_SERVER_ERROR, 777 net::HTTP_INTERNAL_SERVER_ERROR,
733 net::URLRequestStatus::FAILED); 778 net::URLRequestStatus::FAILED);
734 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 779 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
735 net::URLRequestStatus::SUCCESS); 780 net::URLRequestStatus::SUCCESS);
736 781
737 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 782 PrecacheFetcher precache_fetcher(
738 std::string(), std::move(unfinished_work), 783 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
739 kExperimentID, &precache_delegate_); 784 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
785 &precache_delegate_);
740 precache_fetcher.Start(); 786 precache_fetcher.Start();
741 787
742 loop_.RunUntilIdle(); 788 base::RunLoop().RunUntilIdle();
743 789
744 std::multiset<GURL> expected_requested_urls; 790 std::multiset<GURL> expected_requested_urls;
745 expected_requested_urls.insert(GURL(kConfigURL)); 791 expected_requested_urls.insert(GURL(kConfigURL));
746 expected_requested_urls.insert(GURL(kGoodManifestURL)); 792 expected_requested_urls.insert(GURL(kGoodManifestURL));
747 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 793 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
748 794
749 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 795 EXPECT_TRUE(precache_delegate_.was_on_done_called());
750 } 796 }
751 797
752 TEST_F(PrecacheFetcherTest, BadConfig) { 798 TEST_F(PrecacheFetcherTest, BadConfig) {
753 SetDefaultFlags(); 799 SetDefaultFlags();
754 800
755 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 801 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
756 new PrecacheUnfinishedWork()); 802 new PrecacheUnfinishedWork());
757 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 803 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
758 804
759 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, 805 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK,
760 net::URLRequestStatus::SUCCESS); 806 net::URLRequestStatus::SUCCESS);
761 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 807 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
762 net::URLRequestStatus::SUCCESS); 808 net::URLRequestStatus::SUCCESS);
763 809
764 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 810 PrecacheFetcher precache_fetcher(
765 std::string(), std::move(unfinished_work), 811 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
766 kExperimentID, &precache_delegate_); 812 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
813 &precache_delegate_);
767 precache_fetcher.Start(); 814 precache_fetcher.Start();
768 815
769 loop_.RunUntilIdle(); 816 base::RunLoop().RunUntilIdle();
770 817
771 std::multiset<GURL> expected_requested_urls; 818 std::multiset<GURL> expected_requested_urls;
772 expected_requested_urls.insert(GURL(kConfigURL)); 819 expected_requested_urls.insert(GURL(kConfigURL));
773 expected_requested_urls.insert(GURL(kGoodManifestURL)); 820 expected_requested_urls.insert(GURL(kGoodManifestURL));
774 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 821 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
775 822
776 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 823 EXPECT_TRUE(precache_delegate_.was_on_done_called());
777 } 824 }
778 825
779 TEST_F(PrecacheFetcherTest, Cancel) { 826 TEST_F(PrecacheFetcherTest, Cancel) {
780 SetDefaultFlags(); 827 SetDefaultFlags();
781 828
782 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 829 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
783 new PrecacheUnfinishedWork()); 830 new PrecacheUnfinishedWork());
784 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 831 unfinished_work->add_top_host()->set_hostname("starting-url.com");
785 832
786 PrecacheConfigurationSettings config; 833 PrecacheConfigurationSettings config;
787 config.set_top_sites_count(1); 834 config.set_top_sites_count(1);
788 835
789 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 836 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
790 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 837 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
791 838
792 base::HistogramTester histogram; 839 base::HistogramTester histogram;
793 840
794 { 841 {
795 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 842 PrecacheFetcher precache_fetcher(
796 std::string(), std::move(unfinished_work), 843 request_context_.get(), GURL(), std::string(),
797 kExperimentID, &precache_delegate_); 844 std::move(unfinished_work), kExperimentID,
845 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
798 precache_fetcher.Start(); 846 precache_fetcher.Start();
799 847
800 // Destroy the PrecacheFetcher, to cancel precaching. No metrics 848 // Destroy the PrecacheFetcher, to cancel precaching. No metrics
801 // should be recorded because this should not cause OnDone to be 849 // should be recorded because this should not cause OnDone to be
802 // called on the precache delegate. 850 // called on the precache delegate.
803 } 851 }
804 852
805 loop_.RunUntilIdle(); 853 base::RunLoop().RunUntilIdle();
806 854
807 std::multiset<GURL> expected_requested_urls; 855 std::multiset<GURL> expected_requested_urls;
808 expected_requested_urls.insert(GURL(kConfigURL)); 856 expected_requested_urls.insert(GURL(kConfigURL));
809 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 857 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
810 858
811 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 859 EXPECT_FALSE(precache_delegate_.was_on_done_called());
812 860
813 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0); 861 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0);
814 } 862 }
815 863
816 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 864 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
817 865
818 // If the default precache configuration settings URL is defined, then test that 866 // If the default precache configuration settings URL is defined, then test that
819 // it works with the PrecacheFetcher. 867 // it works with the PrecacheFetcher.
820 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 868 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
821 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 869 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
822 new PrecacheUnfinishedWork()); 870 new PrecacheUnfinishedWork());
823 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 871 unfinished_work->add_top_host()->set_hostname("starting-url.com");
824 872
825 PrecacheConfigurationSettings config; 873 PrecacheConfigurationSettings config;
826 config.set_top_sites_count(0); 874 config.set_top_sites_count(0);
827 875
828 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 876 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
829 config.SerializeAsString(), net::HTTP_OK, 877 config.SerializeAsString(), net::HTTP_OK,
830 net::URLRequestStatus::SUCCESS); 878 net::URLRequestStatus::SUCCESS);
831 879
832 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 880 PrecacheFetcher precache_fetcher(
833 std::string(), std::move(unfinished_work), 881 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
834 kExperimentID, &precache_delegate_); 882 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
883 &precache_delegate_);
835 precache_fetcher.Start(); 884 precache_fetcher.Start();
836 885
837 loop_.RunUntilIdle(); 886 base::RunLoop().RunUntilIdle();
838 887
839 std::multiset<GURL> expected_requested_urls; 888 std::multiset<GURL> expected_requested_urls;
840 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 889 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
841 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 890 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
842 891
843 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 892 EXPECT_TRUE(precache_delegate_.was_on_done_called());
844 } 893 }
845 894
846 #endif // PRECACHE_CONFIG_SETTINGS_URL 895 #endif // PRECACHE_CONFIG_SETTINGS_URL
847 896
(...skipping 12 matching lines...) Expand all
860 PrecacheConfigurationSettings config; 909 PrecacheConfigurationSettings config;
861 config.set_top_sites_count(1); 910 config.set_top_sites_count(1);
862 911
863 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 912 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
864 913
865 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 914 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
866 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 915 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
867 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 916 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
868 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 917 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
869 918
870 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 919 PrecacheFetcher precache_fetcher(
871 std::string(), std::move(unfinished_work), 920 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
872 kExperimentID, &precache_delegate_); 921 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
922 &precache_delegate_);
873 precache_fetcher.Start(); 923 precache_fetcher.Start();
874 924
875 loop_.RunUntilIdle(); 925 base::RunLoop().RunUntilIdle();
876 926
877 std::multiset<GURL> expected_requested_urls; 927 std::multiset<GURL> expected_requested_urls;
878 expected_requested_urls.insert(GURL(kConfigURL)); 928 expected_requested_urls.insert(GURL(kConfigURL));
879 expected_requested_urls.insert(manifest_url); 929 expected_requested_urls.insert(manifest_url);
880 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 930 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
881 931
882 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 932 EXPECT_TRUE(precache_delegate_.was_on_done_called());
883 } 933 }
884 934
885 #endif // PRECACHE_MANIFEST_URL_PREFIX 935 #endif // PRECACHE_MANIFEST_URL_PREFIX
(...skipping 20 matching lines...) Expand all
906 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 956 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
907 factory_.SetFakeResponse(GURL(kGoodManifestURL), 957 factory_.SetFakeResponse(GURL(kGoodManifestURL),
908 good_manifest.SerializeAsString(), net::HTTP_OK, 958 good_manifest.SerializeAsString(), net::HTTP_OK,
909 net::URLRequestStatus::SUCCESS); 959 net::URLRequestStatus::SUCCESS);
910 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", 960 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good",
911 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 961 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
912 962
913 base::HistogramTester histogram; 963 base::HistogramTester histogram;
914 964
915 { 965 {
916 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 966 PrecacheFetcher precache_fetcher(
917 std::string(), std::move(unfinished_work), 967 request_context_.get(), GURL(), std::string(),
918 kExperimentID, &precache_delegate_); 968 std::move(unfinished_work), kExperimentID,
969 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
919 precache_fetcher.Start(); 970 precache_fetcher.Start();
920 971
921 loop_.RunUntilIdle(); 972 base::RunLoop().RunUntilIdle();
922 973
923 // Destroy the PrecacheFetcher after it has finished, to record metrics. 974 // Destroy the PrecacheFetcher after it has finished, to record metrics.
924 } 975 }
925 976
926 std::multiset<GURL> expected_requested_urls; 977 std::multiset<GURL> expected_requested_urls;
927 expected_requested_urls.insert(GURL(kConfigURL)); 978 expected_requested_urls.insert(GURL(kConfigURL));
928 expected_requested_urls.insert(GURL(kGoodManifestURL)); 979 expected_requested_urls.insert(GURL(kGoodManifestURL));
929 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 980 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
930 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 981 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
931 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 982 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1034 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
984 } 1035 }
985 1036
986 factory_.SetFakeResponse(GURL(kGoodManifestURL), 1037 factory_.SetFakeResponse(GURL(kGoodManifestURL),
987 good_manifest.SerializeAsString(), net::HTTP_OK, 1038 good_manifest.SerializeAsString(), net::HTTP_OK,
988 net::URLRequestStatus::SUCCESS); 1039 net::URLRequestStatus::SUCCESS);
989 1040
990 base::HistogramTester histogram; 1041 base::HistogramTester histogram;
991 1042
992 { 1043 {
993 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1044 PrecacheFetcher precache_fetcher(
994 std::string(), std::move(unfinished_work), 1045 request_context_.get(), GURL(), std::string(),
995 kExperimentID, &precache_delegate_); 1046 std::move(unfinished_work), kExperimentID,
1047 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
996 precache_fetcher.Start(); 1048 precache_fetcher.Start();
997 1049
998 loop_.RunUntilIdle(); 1050 base::RunLoop().RunUntilIdle();
999 } 1051 }
1000 1052
1001 // We don't know which will make it and which won't due to the parallelism in 1053 // We don't know which will make it and which won't due to the parallelism in
1002 // the pool of Fetchers. 1054 // the pool of Fetchers.
1003 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 1055 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
1004 1056
1005 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1057 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1006 1058
1007 // good-manifest.com will not have been completed. 1059 // good-manifest.com will not have been completed.
1008 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1060 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 } 1097 }
1046 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), 1098 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url),
1047 top_host_manifest[i].SerializeAsString(), 1099 top_host_manifest[i].SerializeAsString(),
1048 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1100 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1049 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url)); 1101 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url));
1050 } 1102 }
1051 1103
1052 base::HistogramTester histogram; 1104 base::HistogramTester histogram;
1053 1105
1054 { 1106 {
1055 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1107 PrecacheFetcher precache_fetcher(
1056 std::string(), std::move(unfinished_work), 1108 request_context_.get(), GURL(), std::string(),
1057 kExperimentID, &precache_delegate_); 1109 std::move(unfinished_work), kExperimentID,
1110 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1058 precache_fetcher.Start(); 1111 precache_fetcher.Start();
1059 1112
1060 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size()); 1113 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size());
1061 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher); 1114 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher);
1062 1115
1063 loop_.RunUntilIdle(); 1116 base::RunLoop().RunUntilIdle();
1064 1117
1065 // Destroy the PrecacheFetcher after it has finished, to record metrics. 1118 // Destroy the PrecacheFetcher after it has finished, to record metrics.
1066 } 1119 }
1067 1120
1068 EXPECT_TRUE(parallel_fetches_beyond_capacity_); 1121 EXPECT_TRUE(parallel_fetches_beyond_capacity_);
1069 1122
1070 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 1123 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
1071 1124
1072 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1125 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1073 1126
(...skipping 12 matching lines...) Expand all
1086 new PrecacheUnfinishedWork()); 1139 new PrecacheUnfinishedWork());
1087 unfinished_work->add_top_host()->set_hostname("manifest.com"); 1140 unfinished_work->add_top_host()->set_hostname("manifest.com");
1088 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); 1141 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1089 1142
1090 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, 1143 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK,
1091 net::URLRequestStatus::SUCCESS); 1144 net::URLRequestStatus::SUCCESS);
1092 1145
1093 base::HistogramTester histogram; 1146 base::HistogramTester histogram;
1094 1147
1095 { 1148 {
1096 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1149 PrecacheFetcher precache_fetcher(
1097 std::string(), std::move(unfinished_work), 1150 request_context_.get(), GURL(), std::string(),
1098 kExperimentID, &precache_delegate_); 1151 std::move(unfinished_work), kExperimentID,
1152 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1099 precache_fetcher.Start(); 1153 precache_fetcher.Start();
1100 1154
1101 loop_.RunUntilIdle(); 1155 base::RunLoop().RunUntilIdle();
1102 } 1156 }
1103 1157
1104 // The config is fetched, but not the invalid manifest URL. 1158 // The config is fetched, but not the invalid manifest URL.
1105 EXPECT_EQ(1UL, url_callback_.requested_urls().size()); 1159 EXPECT_EQ(1UL, url_callback_.requested_urls().size());
1106 1160
1107 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1161 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1108 1162
1109 // manifest.com will have been failed to complete, in this case. 1163 // manifest.com will have been failed to complete, in this case.
1110 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1164 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1111 ElementsAre(base::Bucket(0, 1))); 1165 ElementsAre(base::Bucket(0, 1)));
(...skipping 13 matching lines...) Expand all
1125 PrecacheManifest bad_manifest; 1179 PrecacheManifest bad_manifest;
1126 bad_manifest.add_resource()->set_url("http://"); 1180 bad_manifest.add_resource()->set_url("http://");
1127 1181
1128 factory_.SetFakeResponse(GURL(kBadManifestURL), 1182 factory_.SetFakeResponse(GURL(kBadManifestURL),
1129 bad_manifest.SerializeAsString(), net::HTTP_OK, 1183 bad_manifest.SerializeAsString(), net::HTTP_OK,
1130 net::URLRequestStatus::SUCCESS); 1184 net::URLRequestStatus::SUCCESS);
1131 1185
1132 base::HistogramTester histogram; 1186 base::HistogramTester histogram;
1133 1187
1134 { 1188 {
1135 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1189 PrecacheFetcher precache_fetcher(
1136 std::string(), std::move(unfinished_work), 1190 request_context_.get(), GURL(), std::string(),
1137 kExperimentID, &precache_delegate_); 1191 std::move(unfinished_work), kExperimentID,
1192 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1138 precache_fetcher.Start(); 1193 precache_fetcher.Start();
1139 1194
1140 loop_.RunUntilIdle(); 1195 base::RunLoop().RunUntilIdle();
1141 } 1196 }
1142 1197
1143 // The config and manifest are fetched, but not the invalid resource URL. 1198 // The config and manifest are fetched, but not the invalid resource URL.
1144 EXPECT_EQ(2UL, url_callback_.requested_urls().size()); 1199 EXPECT_EQ(2UL, url_callback_.requested_urls().size());
1145 1200
1146 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1201 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1147 1202
1148 // bad-manifest.com will have been completed. 1203 // bad-manifest.com will have been completed.
1149 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1204 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1150 ElementsAre(base::Bucket(100, 1))); 1205 ElementsAre(base::Bucket(100, 1)));
1151 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 1206 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
1152 } 1207 }
1153 1208
1209 TEST(PrecacheFetcherStandaloneTest, GetResourceURLBase64Hash) {
1210 // Expected base64 hash for some selected URLs.
1211 EXPECT_EQ("dVSI/sC1cGk=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1212 {GURL("http://used-resource-1/a.js")}));
1213 EXPECT_EQ("B/Jc6JvusZQ=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1214 {GURL("http://used-resource-1/b.js")}));
1215 EXPECT_EQ("CmvACGJ4k08=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1216 {GURL("http://used-resource-1/c.js")}));
1217
1218 EXPECT_EQ("dVSI/sC1cGkH8lzom+6xlA==",
1219 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1220 {GURL("http://used-resource-1/a.js"),
1221 GURL("http://used-resource-1/b.js")}));
1222 }
1223
1224 TEST_F(PrecacheFetcherTest, SendUsedUnusedResourceHash) {
1225 SetDefaultFlags();
1226
1227 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
1228 new PrecacheUnfinishedWork());
1229 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1230 unfinished_work->add_top_host()->set_hostname("top-host-1.com");
1231 unfinished_work->add_top_host()->set_hostname("top-host-2.com");
1232 unfinished_work->add_top_host()->set_hostname("top-host-3.com");
1233
1234 UpdatePrecacheReferrerHost("top-host-1.com", 1);
1235 UpdatePrecacheReferrerHost("top-host-2.com", 2);
1236 UpdatePrecacheReferrerHost("top-host-3.com", 3);
1237
1238 // Mark some resources as precached.
1239 RecordURLPrefetch(GURL("http://used-resource-1/a.js"), "top-host-1.com");
1240 RecordURLPrefetch(GURL("http://used-resource-1/b.js"), "top-host-1.com");
1241 RecordURLPrefetch(GURL("http://unused-resource-1/c.js"), "top-host-1.com");
1242 RecordURLPrefetch(GURL("http://unused-resource-2/a.js"), "top-host-2.com");
1243 RecordURLPrefetch(GURL("http://unused-resource-2/b.js"), "top-host-2.com");
1244 base::RunLoop().RunUntilIdle();
1245
1246 // Mark some resources as used during user browsing.
1247 RecordURLNonPrefetch(GURL("http://used-resource-1/a.js"));
1248 RecordURLNonPrefetch(GURL("http://used-resource-1/b.js"));
1249 base::RunLoop().RunUntilIdle();
1250
1251 factory_.SetFakeResponse(GURL(kConfigURL), std::string(), net::HTTP_OK,
1252 net::URLRequestStatus::SUCCESS);
1253 factory_.SetFakeResponse(
1254 GURL(std::string(kManifestURLPrefix) +
1255 "top-host-1.com?manifest=1&used_resources=" +
1256 net::EscapeQueryParamValue(
1257 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1258 {GURL("http://used-resource-1/a.js"),
1259 GURL("http://used-resource-1/b.js")}),
1260 true) +
1261 "&unused_resources=" +
1262 net::EscapeQueryParamValue(
1263 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1264 {GURL("http://unused-resource-1/c.js")}),
1265 true)),
1266 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1267 factory_.SetFakeResponse(
1268 GURL(std::string(kManifestURLPrefix) +
1269 "top-host-2.com?manifest=2&used_resources=&unused_resources=" +
1270 net::EscapeQueryParamValue(
1271 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1272 {GURL("http://unused-resource-2/a.js"),
1273 GURL("http://unused-resource-2/b.js")}),
1274 true)),
1275 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1276 factory_.SetFakeResponse(
1277 GURL(std::string(kManifestURLPrefix) +
1278 "top-host-3.com?manifest=3&used_resources=&unused_resources="),
1279 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1280
1281 {
1282 PrecacheFetcher precache_fetcher(
1283 request_context_.get(), GURL(), std::string(),
1284 std::move(unfinished_work), kExperimentID,
1285 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1286 precache_fetcher.Start();
1287
1288 base::RunLoop().RunUntilIdle();
1289 }
1290 }
1291
1154 } // namespace precache 1292 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/core/precache_fetcher.cc ('k') | components/precache/core/precache_referrer_host_table.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698