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

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 comments, removed timestamp from proto Created 4 years, 4 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_ &&
359 !precache_fetcher->manifest_urls_to_fetch_.empty()) { 392 !precache_fetcher->top_hosts_to_fetch_->empty() &&
393 !precache_fetcher->resources_to_fetch_.empty()) {
360 parallel_fetches_beyond_capacity_ = true; 394 parallel_fetches_beyond_capacity_ = true;
361 return; 395 return;
362 } 396 }
363 397
364 // Check again after allowing the message loop to process some messages. 398 // Check again after allowing the message loop to process some messages.
365 loop_.task_runner()->PostTask( 399 loop_.PostTask(
366 FROM_HERE, 400 FROM_HERE,
367 base::Bind( 401 base::Bind(
368 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity, 402 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity,
369 base::Unretained(this), precache_fetcher)); 403 base::Unretained(this), precache_fetcher));
370 } 404 }
371 405
406 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner() const {
407 return task_runner_;
408 }
409
410 // Must be declared first so that it is destroyed last.
372 base::MessageLoopForUI loop_; 411 base::MessageLoopForUI loop_;
412 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
373 scoped_refptr<net::TestURLRequestContextGetter> request_context_; 413 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
374 TestURLFetcherCallback url_callback_; 414 TestURLFetcherCallback url_callback_;
375 net::FakeURLFetcherFactory factory_; 415 net::FakeURLFetcherFactory factory_;
376 TestPrecacheDelegate precache_delegate_; 416 TestPrecacheDelegate precache_delegate_;
417 base::ScopedTempDir scoped_temp_dir_;
418 PrecacheDatabase precache_database_;
377 int expected_total_response_bytes_; 419 int expected_total_response_bytes_;
378 420
379 // True if more parallel fetches were attempted beyond the fetcher pool 421 // True if more parallel fetches were attempted beyond the fetcher pool
380 // maximum capacity. 422 // maximum capacity.
381 bool parallel_fetches_beyond_capacity_; 423 bool parallel_fetches_beyond_capacity_;
382 }; 424 };
383 425
384 TEST_F(PrecacheFetcherTest, FullPrecache) { 426 TEST_F(PrecacheFetcherTest, FullPrecache) {
385 SetDefaultFlags(); 427 SetDefaultFlags();
386 428
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 net::URLRequestStatus::FAILED); 460 net::URLRequestStatus::FAILED);
419 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 461 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
420 net::URLRequestStatus::SUCCESS); 462 net::URLRequestStatus::SUCCESS);
421 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), 463 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL),
422 PrecacheManifest().SerializeAsString(), net::HTTP_OK, 464 PrecacheManifest().SerializeAsString(), net::HTTP_OK,
423 net::URLRequestStatus::SUCCESS); 465 net::URLRequestStatus::SUCCESS);
424 466
425 base::HistogramTester histogram; 467 base::HistogramTester histogram;
426 468
427 { 469 {
428 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 470 PrecacheFetcher precache_fetcher(
429 std::string(), std::move(unfinished_work), 471 request_context_.get(), GURL(), std::string(),
430 kExperimentID, &precache_delegate_); 472 std::move(unfinished_work), kExperimentID,
473 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
431 precache_fetcher.Start(); 474 precache_fetcher.Start();
432 475
433 loop_.RunUntilIdle(); 476 base::RunLoop().RunUntilIdle();
434 477
435 // Destroy the PrecacheFetcher after it has finished, to record metrics. 478 // Destroy the PrecacheFetcher after it has finished, to record metrics.
436 } 479 }
437 480
438 std::multiset<GURL> expected_requested_urls; 481 std::multiset<GURL> expected_requested_urls;
439 expected_requested_urls.insert(GURL(kConfigURL)); 482 expected_requested_urls.insert(GURL(kConfigURL));
440 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); 483 expected_requested_urls.insert(GURL(kManifestFetchFailureURL));
441 expected_requested_urls.insert(GURL(kBadManifestURL)); 484 expected_requested_urls.insert(GURL(kBadManifestURL));
442 expected_requested_urls.insert(GURL(kGoodManifestURL)); 485 expected_requested_urls.insert(GURL(kGoodManifestURL));
443 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); 486 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, 529 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
487 net::URLRequestStatus::SUCCESS); 530 net::URLRequestStatus::SUCCESS);
488 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, 531 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
489 net::URLRequestStatus::SUCCESS); 532 net::URLRequestStatus::SUCCESS);
490 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 533 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
491 net::URLRequestStatus::SUCCESS); 534 net::URLRequestStatus::SUCCESS);
492 535
493 base::HistogramTester histogram; 536 base::HistogramTester histogram;
494 537
495 { 538 {
496 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 539 PrecacheFetcher precache_fetcher(
497 std::string(), std::move(unfinished_work), 540 request_context_.get(), GURL(), std::string(),
498 kExperimentID, &precache_delegate_); 541 std::move(unfinished_work), kExperimentID,
542 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
499 precache_fetcher.Start(); 543 precache_fetcher.Start();
500 544
501 loop_.RunUntilIdle(); 545 base::RunLoop().RunUntilIdle();
502 546
503 // Destroy the PrecacheFetcher after it has finished, to record metrics. 547 // Destroy the PrecacheFetcher after it has finished, to record metrics.
504 } 548 }
505 549
506 std::multiset<GURL> expected_requested_urls; 550 std::multiset<GURL> expected_requested_urls;
507 expected_requested_urls.insert(GURL(kConfigURL)); 551 expected_requested_urls.insert(GURL(kConfigURL));
508 expected_requested_urls.insert(GURL(kGoodManifestURL)); 552 expected_requested_urls.insert(GURL(kGoodManifestURL));
509 expected_requested_urls.insert(GURL(kGoodResourceURL)); 553 expected_requested_urls.insert(GURL(kGoodResourceURL));
510 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 554 expected_requested_urls.insert(GURL(kGoodResourceURLB));
511 expected_requested_urls.insert(GURL(kGoodResourceURLD)); 555 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, 602 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK,
559 net::URLRequestStatus::SUCCESS); 603 net::URLRequestStatus::SUCCESS);
560 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK, 604 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK,
561 net::URLRequestStatus::SUCCESS); 605 net::URLRequestStatus::SUCCESS);
562 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, 606 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK,
563 net::URLRequestStatus::SUCCESS); 607 net::URLRequestStatus::SUCCESS);
564 608
565 base::HistogramTester histogram; 609 base::HistogramTester histogram;
566 610
567 { 611 {
568 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 612 PrecacheFetcher precache_fetcher(
569 std::string(), std::move(unfinished_work), 613 request_context_.get(), GURL(), std::string(),
570 kExperimentID, &precache_delegate_); 614 std::move(unfinished_work), kExperimentID,
615 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
571 precache_fetcher.Start(); 616 precache_fetcher.Start();
572 617
573 loop_.RunUntilIdle(); 618 base::RunLoop().RunUntilIdle();
574 619
575 // Destroy the PrecacheFetcher after it has finished, to record metrics. 620 // Destroy the PrecacheFetcher after it has finished, to record metrics.
576 } 621 }
577 622
578 std::multiset<GURL> expected_requested_urls; 623 std::multiset<GURL> expected_requested_urls;
579 expected_requested_urls.insert(GURL(kConfigURL)); 624 expected_requested_urls.insert(GURL(kConfigURL));
580 expected_requested_urls.insert(GURL(kGoodManifestURL)); 625 expected_requested_urls.insert(GURL(kGoodManifestURL));
581 expected_requested_urls.insert(GURL(kGoodResourceURL)); 626 expected_requested_urls.insert(GURL(kGoodResourceURL));
582 expected_requested_urls.insert(GURL(kGoodResourceURLA)); 627 expected_requested_urls.insert(GURL(kGoodResourceURLA));
583 expected_requested_urls.insert(GURL(kGoodResourceURLB)); 628 expected_requested_urls.insert(GURL(kGoodResourceURLB));
(...skipping 11 matching lines...) Expand all
595 } 640 }
596 641
597 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { 642 TEST_F(PrecacheFetcherTest, PrecachePauseResume) {
598 SetDefaultFlags(); 643 SetDefaultFlags();
599 644
600 PrecacheConfigurationSettings config; 645 PrecacheConfigurationSettings config;
601 config.set_top_sites_count(3); 646 config.set_top_sites_count(3);
602 647
603 std::unique_ptr<PrecacheUnfinishedWork> initial_work( 648 std::unique_ptr<PrecacheUnfinishedWork> initial_work(
604 new PrecacheUnfinishedWork()); 649 new PrecacheUnfinishedWork());
605 initial_work->add_manifest()->set_url( 650 initial_work->add_top_host()->set_hostname("manifest1.com");
606 "http://manifest-url-prefix.com/manifest1.com"); 651 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( 652 initial_work->set_start_time(
611 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue()); 653 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue());
612 654
613 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(), 655 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(),
614 std::move(initial_work), kExperimentID, 656 std::move(initial_work), kExperimentID,
657 precache_database_.GetWeakPtr(), task_runner(),
615 &precache_delegate_); 658 &precache_delegate_);
616 659 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
617 loop_.RunUntilIdle(); 660 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
661 first_fetcher.Start();
618 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work = 662 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work =
619 first_fetcher.CancelPrecaching(); 663 first_fetcher.CancelPrecaching();
620 664
621 std::multiset<GURL> expected_requested_urls; 665 std::multiset<GURL> expected_requested_urls;
666 expected_requested_urls.insert(GURL(kConfigURL));
622 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 667 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
623 668
624 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 669 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
625 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 670 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
626 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK, 671 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK,
627 net::URLRequestStatus::SUCCESS); 672 net::URLRequestStatus::SUCCESS);
628 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"), 673 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"),
629 "bad protobuf", net::HTTP_OK, 674 "bad protobuf", net::HTTP_OK,
630 net::URLRequestStatus::SUCCESS); 675 net::URLRequestStatus::SUCCESS);
631 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"), 676 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"),
632 "bad protobuf", net::HTTP_OK, 677 "bad protobuf", net::HTTP_OK,
633 net::URLRequestStatus::SUCCESS); 678 net::URLRequestStatus::SUCCESS);
634 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 679 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
635 net::URLRequestStatus::SUCCESS); 680 net::URLRequestStatus::SUCCESS);
636 // Starting hosts should not be fetched. 681
637 unfinished_work->add_top_host()->set_hostname("bad-manifest.com"); 682 url_callback_.clear_requested_urls();
638 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(), 683 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(),
639 std::move(unfinished_work), kExperimentID, 684 std::move(unfinished_work), kExperimentID,
685 precache_database_.GetWeakPtr(), task_runner(),
640 &precache_delegate_); 686 &precache_delegate_);
641 second_fetcher.Start(); 687 second_fetcher.Start();
642 loop_.RunUntilIdle(); 688 base::RunLoop().RunUntilIdle();
643 expected_requested_urls.insert(GURL(kConfigURL));
644 expected_requested_urls.insert( 689 expected_requested_urls.insert(
645 GURL("http://manifest-url-prefix.com/manifest1.com")); 690 GURL("http://manifest-url-prefix.com/manifest1.com"));
646 expected_requested_urls.insert( 691 expected_requested_urls.insert(
647 GURL("http://manifest-url-prefix.com/manifest2.com")); 692 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()); 693 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
650 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 694 EXPECT_TRUE(precache_delegate_.was_on_done_called());
651 } 695 }
652 696
653 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) { 697 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) {
654 SetDefaultFlags(); 698 SetDefaultFlags();
655 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 699 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
656 new PrecacheUnfinishedWork()); 700 new PrecacheUnfinishedWork());
657 unfinished_work->mutable_config_settings()->add_forced_site( 701 unfinished_work->mutable_config_settings()->add_forced_site(
658 "good-manifest.com"); 702 "good-manifest.com");
659 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); 703 unfinished_work->set_start_time(base::Time::Now().ToInternalValue());
660 PrecacheManifest good_manifest; 704 PrecacheManifest good_manifest;
661 good_manifest.add_resource()->set_url(kGoodResourceURL); 705 good_manifest.add_resource()->set_url(kGoodResourceURL);
662 706
663 factory_.SetFakeResponse(GURL(kGoodManifestURL), 707 factory_.SetFakeResponse(GURL(kGoodManifestURL),
664 good_manifest.SerializeAsString(), net::HTTP_OK, 708 good_manifest.SerializeAsString(), net::HTTP_OK,
665 net::URLRequestStatus::SUCCESS); 709 net::URLRequestStatus::SUCCESS);
666 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 710 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
667 net::URLRequestStatus::SUCCESS); 711 net::URLRequestStatus::SUCCESS);
668 { 712 {
669 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 713 PrecacheFetcher precache_fetcher(
670 std::string(), std::move(unfinished_work), 714 request_context_.get(), GURL(), std::string(),
671 kExperimentID, &precache_delegate_); 715 std::move(unfinished_work), kExperimentID,
716 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
672 precache_fetcher.Start(); 717 precache_fetcher.Start();
673 718
674 loop_.RunUntilIdle(); 719 base::RunLoop().RunUntilIdle();
675 } 720 }
676 721
677 std::multiset<GURL> expected_requested_urls; 722 std::multiset<GURL> expected_requested_urls;
678 expected_requested_urls.insert(GURL(kGoodManifestURL)); 723 expected_requested_urls.insert(GURL(kGoodManifestURL));
679 expected_requested_urls.insert(GURL(kGoodResourceURL)); 724 expected_requested_urls.insert(GURL(kGoodResourceURL));
680 725
681 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 726 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
682 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 727 EXPECT_TRUE(precache_delegate_.was_on_done_called());
683 728
684 } 729 }
(...skipping 14 matching lines...) Expand all
699 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), 744 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(),
700 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 745 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
701 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), 746 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL),
702 good_manifest.SerializeAsString(), net::HTTP_OK, 747 good_manifest.SerializeAsString(), net::HTTP_OK,
703 net::URLRequestStatus::SUCCESS); 748 net::URLRequestStatus::SUCCESS);
704 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, 749 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK,
705 net::URLRequestStatus::SUCCESS); 750 net::URLRequestStatus::SUCCESS);
706 751
707 PrecacheFetcher precache_fetcher( 752 PrecacheFetcher precache_fetcher(
708 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix, 753 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix,
709 std::move(unfinished_work), kExperimentID, &precache_delegate_); 754 std::move(unfinished_work), kExperimentID,
755 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
710 precache_fetcher.Start(); 756 precache_fetcher.Start();
711 757
712 loop_.RunUntilIdle(); 758 base::RunLoop().RunUntilIdle();
713 759
714 std::multiset<GURL> expected_requested_urls; 760 std::multiset<GURL> expected_requested_urls;
715 expected_requested_urls.insert(GURL(kCustomConfigURL)); 761 expected_requested_urls.insert(GURL(kCustomConfigURL));
716 expected_requested_urls.insert(GURL(kCustomGoodManifestURL)); 762 expected_requested_urls.insert(GURL(kCustomGoodManifestURL));
717 expected_requested_urls.insert(GURL(kGoodResourceURL)); 763 expected_requested_urls.insert(GURL(kGoodResourceURL));
718 764
719 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 765 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
720 766
721 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 767 EXPECT_TRUE(precache_delegate_.was_on_done_called());
722 } 768 }
723 769
724 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { 770 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) {
725 SetDefaultFlags(); 771 SetDefaultFlags();
726 772
727 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 773 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
728 new PrecacheUnfinishedWork()); 774 new PrecacheUnfinishedWork());
729 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 775 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
730 776
731 factory_.SetFakeResponse(GURL(kConfigURL), "", 777 factory_.SetFakeResponse(GURL(kConfigURL), "",
732 net::HTTP_INTERNAL_SERVER_ERROR, 778 net::HTTP_INTERNAL_SERVER_ERROR,
733 net::URLRequestStatus::FAILED); 779 net::URLRequestStatus::FAILED);
734 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 780 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
735 net::URLRequestStatus::SUCCESS); 781 net::URLRequestStatus::SUCCESS);
736 782
737 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 783 PrecacheFetcher precache_fetcher(
738 std::string(), std::move(unfinished_work), 784 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
739 kExperimentID, &precache_delegate_); 785 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
786 &precache_delegate_);
740 precache_fetcher.Start(); 787 precache_fetcher.Start();
741 788
742 loop_.RunUntilIdle(); 789 base::RunLoop().RunUntilIdle();
743 790
744 std::multiset<GURL> expected_requested_urls; 791 std::multiset<GURL> expected_requested_urls;
745 expected_requested_urls.insert(GURL(kConfigURL)); 792 expected_requested_urls.insert(GURL(kConfigURL));
746 expected_requested_urls.insert(GURL(kGoodManifestURL)); 793 expected_requested_urls.insert(GURL(kGoodManifestURL));
747 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 794 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
748 795
749 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 796 EXPECT_TRUE(precache_delegate_.was_on_done_called());
750 } 797 }
751 798
752 TEST_F(PrecacheFetcherTest, BadConfig) { 799 TEST_F(PrecacheFetcherTest, BadConfig) {
753 SetDefaultFlags(); 800 SetDefaultFlags();
754 801
755 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 802 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
756 new PrecacheUnfinishedWork()); 803 new PrecacheUnfinishedWork());
757 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 804 unfinished_work->add_top_host()->set_hostname("good-manifest.com");
758 805
759 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, 806 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK,
760 net::URLRequestStatus::SUCCESS); 807 net::URLRequestStatus::SUCCESS);
761 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, 808 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK,
762 net::URLRequestStatus::SUCCESS); 809 net::URLRequestStatus::SUCCESS);
763 810
764 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 811 PrecacheFetcher precache_fetcher(
765 std::string(), std::move(unfinished_work), 812 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
766 kExperimentID, &precache_delegate_); 813 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
814 &precache_delegate_);
767 precache_fetcher.Start(); 815 precache_fetcher.Start();
768 816
769 loop_.RunUntilIdle(); 817 base::RunLoop().RunUntilIdle();
770 818
771 std::multiset<GURL> expected_requested_urls; 819 std::multiset<GURL> expected_requested_urls;
772 expected_requested_urls.insert(GURL(kConfigURL)); 820 expected_requested_urls.insert(GURL(kConfigURL));
773 expected_requested_urls.insert(GURL(kGoodManifestURL)); 821 expected_requested_urls.insert(GURL(kGoodManifestURL));
774 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 822 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
775 823
776 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 824 EXPECT_TRUE(precache_delegate_.was_on_done_called());
777 } 825 }
778 826
779 TEST_F(PrecacheFetcherTest, Cancel) { 827 TEST_F(PrecacheFetcherTest, Cancel) {
780 SetDefaultFlags(); 828 SetDefaultFlags();
781 829
782 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 830 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
783 new PrecacheUnfinishedWork()); 831 new PrecacheUnfinishedWork());
784 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 832 unfinished_work->add_top_host()->set_hostname("starting-url.com");
785 833
786 PrecacheConfigurationSettings config; 834 PrecacheConfigurationSettings config;
787 config.set_top_sites_count(1); 835 config.set_top_sites_count(1);
788 836
789 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 837 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
790 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 838 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
791 839
792 base::HistogramTester histogram; 840 base::HistogramTester histogram;
793 841
794 { 842 {
795 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 843 PrecacheFetcher precache_fetcher(
796 std::string(), std::move(unfinished_work), 844 request_context_.get(), GURL(), std::string(),
797 kExperimentID, &precache_delegate_); 845 std::move(unfinished_work), kExperimentID,
846 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
798 precache_fetcher.Start(); 847 precache_fetcher.Start();
799 848
800 // Destroy the PrecacheFetcher, to cancel precaching. No metrics 849 // Destroy the PrecacheFetcher, to cancel precaching. No metrics
801 // should be recorded because this should not cause OnDone to be 850 // should be recorded because this should not cause OnDone to be
802 // called on the precache delegate. 851 // called on the precache delegate.
803 } 852 }
804 853
805 loop_.RunUntilIdle(); 854 base::RunLoop().RunUntilIdle();
806 855
807 std::multiset<GURL> expected_requested_urls; 856 std::multiset<GURL> expected_requested_urls;
808 expected_requested_urls.insert(GURL(kConfigURL)); 857 expected_requested_urls.insert(GURL(kConfigURL));
809 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 858 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
810 859
811 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 860 EXPECT_FALSE(precache_delegate_.was_on_done_called());
812 861
813 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0); 862 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0);
814 } 863 }
815 864
816 #if defined(PRECACHE_CONFIG_SETTINGS_URL) 865 #if defined(PRECACHE_CONFIG_SETTINGS_URL)
817 866
818 // If the default precache configuration settings URL is defined, then test that 867 // If the default precache configuration settings URL is defined, then test that
819 // it works with the PrecacheFetcher. 868 // it works with the PrecacheFetcher.
820 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { 869 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) {
821 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 870 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
822 new PrecacheUnfinishedWork()); 871 new PrecacheUnfinishedWork());
823 unfinished_work->add_top_host()->set_hostname("starting-url.com"); 872 unfinished_work->add_top_host()->set_hostname("starting-url.com");
824 873
825 PrecacheConfigurationSettings config; 874 PrecacheConfigurationSettings config;
826 config.set_top_sites_count(0); 875 config.set_top_sites_count(0);
827 876
828 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), 877 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL),
829 config.SerializeAsString(), net::HTTP_OK, 878 config.SerializeAsString(), net::HTTP_OK,
830 net::URLRequestStatus::SUCCESS); 879 net::URLRequestStatus::SUCCESS);
831 880
832 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 881 PrecacheFetcher precache_fetcher(
833 std::string(), std::move(unfinished_work), 882 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
834 kExperimentID, &precache_delegate_); 883 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
884 &precache_delegate_);
835 precache_fetcher.Start(); 885 precache_fetcher.Start();
836 886
837 loop_.RunUntilIdle(); 887 base::RunLoop().RunUntilIdle();
838 888
839 std::multiset<GURL> expected_requested_urls; 889 std::multiset<GURL> expected_requested_urls;
840 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); 890 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL));
841 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 891 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
842 892
843 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 893 EXPECT_TRUE(precache_delegate_.was_on_done_called());
844 } 894 }
845 895
846 #endif // PRECACHE_CONFIG_SETTINGS_URL 896 #endif // PRECACHE_CONFIG_SETTINGS_URL
847 897
(...skipping 12 matching lines...) Expand all
860 PrecacheConfigurationSettings config; 910 PrecacheConfigurationSettings config;
861 config.set_top_sites_count(1); 911 config.set_top_sites_count(1);
862 912
863 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); 913 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com");
864 914
865 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 915 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
866 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 916 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
867 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), 917 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(),
868 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 918 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
869 919
870 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 920 PrecacheFetcher precache_fetcher(
871 std::string(), std::move(unfinished_work), 921 request_context_.get(), GURL(), std::string(), std::move(unfinished_work),
872 kExperimentID, &precache_delegate_); 922 kExperimentID, precache_database_.GetWeakPtr(), task_runner(),
923 &precache_delegate_);
873 precache_fetcher.Start(); 924 precache_fetcher.Start();
874 925
875 loop_.RunUntilIdle(); 926 base::RunLoop().RunUntilIdle();
876 927
877 std::multiset<GURL> expected_requested_urls; 928 std::multiset<GURL> expected_requested_urls;
878 expected_requested_urls.insert(GURL(kConfigURL)); 929 expected_requested_urls.insert(GURL(kConfigURL));
879 expected_requested_urls.insert(manifest_url); 930 expected_requested_urls.insert(manifest_url);
880 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 931 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
881 932
882 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 933 EXPECT_TRUE(precache_delegate_.was_on_done_called());
883 } 934 }
884 935
885 #endif // PRECACHE_MANIFEST_URL_PREFIX 936 #endif // PRECACHE_MANIFEST_URL_PREFIX
(...skipping 20 matching lines...) Expand all
906 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 957 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
907 factory_.SetFakeResponse(GURL(kGoodManifestURL), 958 factory_.SetFakeResponse(GURL(kGoodManifestURL),
908 good_manifest.SerializeAsString(), net::HTTP_OK, 959 good_manifest.SerializeAsString(), net::HTTP_OK,
909 net::URLRequestStatus::SUCCESS); 960 net::URLRequestStatus::SUCCESS);
910 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", 961 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good",
911 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 962 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
912 963
913 base::HistogramTester histogram; 964 base::HistogramTester histogram;
914 965
915 { 966 {
916 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 967 PrecacheFetcher precache_fetcher(
917 std::string(), std::move(unfinished_work), 968 request_context_.get(), GURL(), std::string(),
918 kExperimentID, &precache_delegate_); 969 std::move(unfinished_work), kExperimentID,
970 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
919 precache_fetcher.Start(); 971 precache_fetcher.Start();
920 972
921 loop_.RunUntilIdle(); 973 base::RunLoop().RunUntilIdle();
922 974
923 // Destroy the PrecacheFetcher after it has finished, to record metrics. 975 // Destroy the PrecacheFetcher after it has finished, to record metrics.
924 } 976 }
925 977
926 std::multiset<GURL> expected_requested_urls; 978 std::multiset<GURL> expected_requested_urls;
927 expected_requested_urls.insert(GURL(kConfigURL)); 979 expected_requested_urls.insert(GURL(kConfigURL));
928 expected_requested_urls.insert(GURL(kGoodManifestURL)); 980 expected_requested_urls.insert(GURL(kGoodManifestURL));
929 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 981 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
930 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 982 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved"));
931 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); 983 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); 1035 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
984 } 1036 }
985 1037
986 factory_.SetFakeResponse(GURL(kGoodManifestURL), 1038 factory_.SetFakeResponse(GURL(kGoodManifestURL),
987 good_manifest.SerializeAsString(), net::HTTP_OK, 1039 good_manifest.SerializeAsString(), net::HTTP_OK,
988 net::URLRequestStatus::SUCCESS); 1040 net::URLRequestStatus::SUCCESS);
989 1041
990 base::HistogramTester histogram; 1042 base::HistogramTester histogram;
991 1043
992 { 1044 {
993 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1045 PrecacheFetcher precache_fetcher(
994 std::string(), std::move(unfinished_work), 1046 request_context_.get(), GURL(), std::string(),
995 kExperimentID, &precache_delegate_); 1047 std::move(unfinished_work), kExperimentID,
1048 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
996 precache_fetcher.Start(); 1049 precache_fetcher.Start();
997 1050
998 loop_.RunUntilIdle(); 1051 base::RunLoop().RunUntilIdle();
999 } 1052 }
1000 1053
1001 // We don't know which will make it and which won't due to the parallelism in 1054 // We don't know which will make it and which won't due to the parallelism in
1002 // the pool of Fetchers. 1055 // the pool of Fetchers.
1003 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); 1056 EXPECT_GT(kNumResources, url_callback_.requested_urls().size());
1004 1057
1005 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1058 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1006 1059
1007 // good-manifest.com will not have been completed. 1060 // good-manifest.com will not have been completed.
1008 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1061 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 } 1098 }
1046 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), 1099 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url),
1047 top_host_manifest[i].SerializeAsString(), 1100 top_host_manifest[i].SerializeAsString(),
1048 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1101 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1049 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url)); 1102 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url));
1050 } 1103 }
1051 1104
1052 base::HistogramTester histogram; 1105 base::HistogramTester histogram;
1053 1106
1054 { 1107 {
1055 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1108 PrecacheFetcher precache_fetcher(
1056 std::string(), std::move(unfinished_work), 1109 request_context_.get(), GURL(), std::string(),
1057 kExperimentID, &precache_delegate_); 1110 std::move(unfinished_work), kExperimentID,
1111 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1058 precache_fetcher.Start(); 1112 precache_fetcher.Start();
1059 1113
1060 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size()); 1114 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size());
1061 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher); 1115 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher);
1062 1116
1063 loop_.RunUntilIdle(); 1117 base::RunLoop().RunUntilIdle();
1064 1118
1065 // Destroy the PrecacheFetcher after it has finished, to record metrics. 1119 // Destroy the PrecacheFetcher after it has finished, to record metrics.
1066 } 1120 }
1067 1121
1068 EXPECT_TRUE(parallel_fetches_beyond_capacity_); 1122 EXPECT_TRUE(parallel_fetches_beyond_capacity_);
1069 1123
1070 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 1124 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
1071 1125
1072 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1126 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1073 1127
(...skipping 12 matching lines...) Expand all
1086 new PrecacheUnfinishedWork()); 1140 new PrecacheUnfinishedWork());
1087 unfinished_work->add_top_host()->set_hostname("manifest.com"); 1141 unfinished_work->add_top_host()->set_hostname("manifest.com");
1088 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); 1142 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1089 1143
1090 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, 1144 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK,
1091 net::URLRequestStatus::SUCCESS); 1145 net::URLRequestStatus::SUCCESS);
1092 1146
1093 base::HistogramTester histogram; 1147 base::HistogramTester histogram;
1094 1148
1095 { 1149 {
1096 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1150 PrecacheFetcher precache_fetcher(
1097 std::string(), std::move(unfinished_work), 1151 request_context_.get(), GURL(), std::string(),
1098 kExperimentID, &precache_delegate_); 1152 std::move(unfinished_work), kExperimentID,
1153 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1099 precache_fetcher.Start(); 1154 precache_fetcher.Start();
1100 1155
1101 loop_.RunUntilIdle(); 1156 base::RunLoop().RunUntilIdle();
1102 } 1157 }
1103 1158
1104 // The config is fetched, but not the invalid manifest URL. 1159 // The config is fetched, but not the invalid manifest URL.
1105 EXPECT_EQ(1UL, url_callback_.requested_urls().size()); 1160 EXPECT_EQ(1UL, url_callback_.requested_urls().size());
1106 1161
1107 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1162 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1108 1163
1109 // manifest.com will have been failed to complete, in this case. 1164 // manifest.com will have been failed to complete, in this case.
1110 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1165 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1111 ElementsAre(base::Bucket(0, 1))); 1166 ElementsAre(base::Bucket(0, 1)));
(...skipping 13 matching lines...) Expand all
1125 PrecacheManifest bad_manifest; 1180 PrecacheManifest bad_manifest;
1126 bad_manifest.add_resource()->set_url("http://"); 1181 bad_manifest.add_resource()->set_url("http://");
1127 1182
1128 factory_.SetFakeResponse(GURL(kBadManifestURL), 1183 factory_.SetFakeResponse(GURL(kBadManifestURL),
1129 bad_manifest.SerializeAsString(), net::HTTP_OK, 1184 bad_manifest.SerializeAsString(), net::HTTP_OK,
1130 net::URLRequestStatus::SUCCESS); 1185 net::URLRequestStatus::SUCCESS);
1131 1186
1132 base::HistogramTester histogram; 1187 base::HistogramTester histogram;
1133 1188
1134 { 1189 {
1135 PrecacheFetcher precache_fetcher(request_context_.get(), GURL(), 1190 PrecacheFetcher precache_fetcher(
1136 std::string(), std::move(unfinished_work), 1191 request_context_.get(), GURL(), std::string(),
1137 kExperimentID, &precache_delegate_); 1192 std::move(unfinished_work), kExperimentID,
1193 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1138 precache_fetcher.Start(); 1194 precache_fetcher.Start();
1139 1195
1140 loop_.RunUntilIdle(); 1196 base::RunLoop().RunUntilIdle();
1141 } 1197 }
1142 1198
1143 // The config and manifest are fetched, but not the invalid resource URL. 1199 // The config and manifest are fetched, but not the invalid resource URL.
1144 EXPECT_EQ(2UL, url_callback_.requested_urls().size()); 1200 EXPECT_EQ(2UL, url_callback_.requested_urls().size());
1145 1201
1146 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1202 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1147 1203
1148 // bad-manifest.com will have been completed. 1204 // bad-manifest.com will have been completed.
1149 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), 1205 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"),
1150 ElementsAre(base::Bucket(100, 1))); 1206 ElementsAre(base::Bucket(100, 1)));
1151 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 1207 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
1152 } 1208 }
1153 1209
1210 TEST(PrecacheFetcherStandaloneTest, GetResourceURLBase64Hash) {
1211 // Expected base64 hash for some selected URLs.
1212 EXPECT_EQ("dVSI/sC1cGk=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1213 {GURL("http://used-resource-1/a.js")}));
1214 EXPECT_EQ("B/Jc6JvusZQ=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1215 {GURL("http://used-resource-1/b.js")}));
1216 EXPECT_EQ("CmvACGJ4k08=", PrecacheFetcher::GetResourceURLBase64HashForTesting(
1217 {GURL("http://used-resource-1/c.js")}));
1218
1219 EXPECT_EQ("dVSI/sC1cGkH8lzom+6xlA==",
1220 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1221 {GURL("http://used-resource-1/a.js"),
1222 GURL("http://used-resource-1/b.js")}));
1223 }
1224
1225 TEST_F(PrecacheFetcherTest, SendUsedUnusedResourceHash) {
1226 SetDefaultFlags();
1227
1228 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
1229 new PrecacheUnfinishedWork());
1230 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1231 unfinished_work->add_top_host()->set_hostname("top-host-1.com");
1232 unfinished_work->add_top_host()->set_hostname("top-host-2.com");
1233 unfinished_work->add_top_host()->set_hostname("top-host-3.com");
1234
1235 UpdatePrecacheReferrerHost("top-host-1.com", 1);
1236 UpdatePrecacheReferrerHost("top-host-2.com", 2);
1237 UpdatePrecacheReferrerHost("top-host-3.com", 3);
1238
1239 // Mark some resources as precached.
1240 RecordURLPrefetch(GURL("http://used-resource-1/a.js"), "top-host-1.com");
1241 RecordURLPrefetch(GURL("http://used-resource-1/b.js"), "top-host-1.com");
1242 RecordURLPrefetch(GURL("http://unused-resource-1/c.js"), "top-host-1.com");
1243 RecordURLPrefetch(GURL("http://unused-resource-2/a.js"), "top-host-2.com");
1244 RecordURLPrefetch(GURL("http://unused-resource-2/b.js"), "top-host-2.com");
1245 base::RunLoop().RunUntilIdle();
1246
1247 // Mark some resources as used during user browsing.
1248 RecordURLNonPrefetch(GURL("http://used-resource-1/a.js"));
1249 RecordURLNonPrefetch(GURL("http://used-resource-1/b.js"));
1250 base::RunLoop().RunUntilIdle();
1251
1252 factory_.SetFakeResponse(GURL(kConfigURL), std::string(), net::HTTP_OK,
1253 net::URLRequestStatus::SUCCESS);
1254 factory_.SetFakeResponse(
1255 GURL(std::string(kManifestURLPrefix) +
1256 "top-host-1.com?manifest=1&used_resources=" +
1257 net::EscapeQueryParamValue(
1258 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1259 {GURL("http://used-resource-1/a.js"),
1260 GURL("http://used-resource-1/b.js")}),
1261 true) +
1262 "&unused_resources=" +
1263 net::EscapeQueryParamValue(
1264 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1265 {GURL("http://unused-resource-1/c.js")}),
1266 true)),
1267 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1268 factory_.SetFakeResponse(
1269 GURL(std::string(kManifestURLPrefix) +
1270 "top-host-2.com?manifest=2&used_resources=&unused_resources=" +
1271 net::EscapeQueryParamValue(
1272 PrecacheFetcher::GetResourceURLBase64HashForTesting(
1273 {GURL("http://unused-resource-2/a.js"),
1274 GURL("http://unused-resource-2/b.js")}),
1275 true)),
1276 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1277 factory_.SetFakeResponse(
1278 GURL(std::string(kManifestURLPrefix) +
1279 "top-host-3.com?manifest=3&used_resources=&unused_resources="),
1280 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1281
1282 {
1283 PrecacheFetcher precache_fetcher(
1284 request_context_.get(), GURL(), std::string(),
1285 std::move(unfinished_work), kExperimentID,
1286 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1287 precache_fetcher.Start();
1288
1289 base::RunLoop().RunUntilIdle();
1290 }
1291 }
1292
1154 } // namespace precache 1293 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698