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

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

Issue 2586813004: Report downloaded resources at most once (Closed)
Patch Set: Improved tests Created 4 years 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_database.h" 5 #include "components/precache/core/precache_database.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
11 11
12 #include "base/bind.h"
13 #include "base/bind_helpers.h"
12 #include "base/containers/hash_tables.h" 14 #include "base/containers/hash_tables.h"
13 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
14 #include "base/files/scoped_temp_dir.h" 16 #include "base/files/scoped_temp_dir.h"
15 #include "base/message_loop/message_loop.h" 17 #include "base/message_loop/message_loop.h"
16 #include "base/metrics/histogram_base.h" 18 #include "base/metrics/histogram_base.h"
17 #include "base/test/histogram_tester.h" 19 #include "base/test/histogram_tester.h"
18 #include "base/time/time.h" 20 #include "base/time/time.h"
19 #include "components/history/core/browser/history_constants.h" 21 #include "components/history/core/browser/history_constants.h"
20 #include "net/http/http_response_headers.h" 22 #include "net/http/http_response_headers.h"
21 #include "net/http/http_response_info.h" 23 #include "net/http/http_response_info.h"
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 258
257 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 259 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
258 260
259 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); 261 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize);
260 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); 262 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds());
261 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); 263 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
262 ExpectNoOtherSamples(); 264 ExpectNoOtherSamples();
263 } 265 }
264 266
265 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { 267 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
266 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); 268 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false);
267 RecordPrecacheFromCache(kURL, kFetchTime, kSize); 269 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
268 270
269 // The URL table entry should have been updated to have |kFetchTime| as the 271 // The URL table entry should have been updated to have |kFetchTime| as the
270 // timestamp. 272 // timestamp.
271 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 273 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
272 274
273 ExpectNewSample("Precache.Latency.Prefetch", 0); 275 ExpectNewSample("Precache.Latency.Prefetch", 0);
274 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); 276 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
275 ExpectNoOtherSamples(); 277 ExpectNoOtherSamples();
276 } 278 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); 321 ExpectNewSample("Precache.DownloadedNonPrecache", kSize);
320 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize); 322 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize);
321 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); 323 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork);
322 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); 324 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds());
323 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 325 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts",
324 kLatency.InMilliseconds()); 326 kLatency.InMilliseconds());
325 ExpectNoOtherSamples(); 327 ExpectNoOtherSamples();
326 } 328 }
327 329
328 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { 330 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) {
329 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); 331 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false);
330 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); 332 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize);
331 333
332 // The URL table entry should have been deleted. 334 // The URL table entry should have been deleted.
333 EXPECT_TRUE(GetActualURLTableMap().empty()); 335 EXPECT_TRUE(GetActualURLTableMap().empty());
334 336
335 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); 337 ExpectNewSample("Precache.DownloadedNonPrecache", kSize);
336 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); 338 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds());
337 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 339 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts",
338 kLatency.InMilliseconds()); 340 kLatency.InMilliseconds());
339 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); 341 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork);
340 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", 342 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache",
341 kFromNetwork); 343 kFromNetwork);
342 ExpectNoOtherSamples(); 344 ExpectNoOtherSamples();
343 } 345 }
344 346
345 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { 347 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
346 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); 348 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false);
347 RecordFetchFromCache(kURL, kFetchTime, kSize); 349 RecordFetchFromCache(kURL, kFetchTime, kSize);
348 350
349 // The URL table entry should have been deleted. 351 // The URL table entry should have been deleted.
350 EXPECT_TRUE(GetActualURLTableMap().empty()); 352 EXPECT_TRUE(GetActualURLTableMap().empty());
351 353
352 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 354 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
353 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 355 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
354 ExpectNewSample("Precache.CacheStatus.NonPrefetch", 356 ExpectNewSample("Precache.CacheStatus.NonPrefetch",
355 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); 357 HttpResponseInfo::CacheEntryStatus::ENTRY_USED);
356 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", 358 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache",
357 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); 359 HttpResponseInfo::CacheEntryStatus::ENTRY_USED);
358 ExpectNewSample("Precache.Saved", kSize); 360 ExpectNewSample("Precache.Saved", kSize);
359 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K); 361 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K);
360 ExpectNoOtherSamples(); 362 ExpectNoOtherSamples();
361 } 363 }
362 364
363 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { 365 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
364 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); 366 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false);
365 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); 367 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize);
366 368
367 // The URL table entry should have been deleted. 369 // The URL table entry should have been deleted.
368 EXPECT_TRUE(GetActualURLTableMap().empty()); 370 EXPECT_TRUE(GetActualURLTableMap().empty());
369 371
370 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 372 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
371 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 373 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
372 ExpectNewSample("Precache.CacheStatus.NonPrefetch", 374 ExpectNewSample("Precache.CacheStatus.NonPrefetch",
373 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); 375 HttpResponseInfo::CacheEntryStatus::ENTRY_USED);
374 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", 376 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache",
(...skipping 15 matching lines...) Expand all
390 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); 392 HttpResponseInfo::CacheEntryStatus::ENTRY_USED);
391 ExpectNoOtherSamples(); 393 ExpectNoOtherSamples();
392 } 394 }
393 395
394 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { 396 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) {
395 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000); 397 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000);
396 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); 398 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59);
397 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); 399 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61);
398 400
399 precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID, 401 precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID,
400 true, k61DaysAgo); 402 true, k61DaysAgo, false);
401 precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID, 403 precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID,
402 true, k59DaysAgo); 404 true, k59DaysAgo, false);
403 405
404 precache_database_->DeleteExpiredPrecacheHistory(kToday); 406 precache_database_->DeleteExpiredPrecacheHistory(kToday);
405 407
406 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo), 408 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo),
407 GetActualURLTableMap()); 409 GetActualURLTableMap());
408 } 410 }
409 411
410 TEST_F(PrecacheDatabaseTest, SampleInteraction) { 412 TEST_F(PrecacheDatabaseTest, SampleInteraction) {
411 const GURL kURL1("http://url1.com"); 413 const GURL kURL1("http://url1.com");
412 const int64_t kSize1 = 1; 414 const int64_t kSize1 = 1;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize); 595 RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize);
594 } else if (resource.is_network_fetched && !resource.is_cellular_fetched) { 596 } else if (resource.is_network_fetched && !resource.is_cellular_fetched) {
595 RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize); 597 RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize);
596 } else if (resource.is_network_fetched && resource.is_cellular_fetched) { 598 } else if (resource.is_network_fetched && resource.is_cellular_fetched) {
597 RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime, 599 RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime,
598 kSize); 600 kSize);
599 } 601 }
600 } 602 }
601 } 603 }
602 Flush(); 604 Flush();
603 // Verify the used and unused resources. 605 // Verify the used and downloaded resources.
604 for (const auto& test : tests) { 606 for (const auto& test : tests) {
605 std::vector<GURL> expected_used_urls, expected_unused_urls; 607 std::vector<GURL> expected_used_urls, expected_downloaded_urls;
606 for (const auto& resource : test.resource_info) { 608 for (const auto& resource : test.resource_info) {
607 if (resource.expected_in_used) { 609 if (resource.expected_in_used) {
608 expected_used_urls.push_back(GURL(resource.url)); 610 expected_used_urls.push_back(GURL(resource.url));
609 } else {
610 expected_unused_urls.push_back(GURL(resource.url));
611 } 611 }
612 expected_downloaded_urls.push_back(GURL(resource.url));
612 } 613 }
613 std::vector<GURL> actual_used_urls, actual_unused_urls; 614 std::vector<GURL> actual_used_urls, actual_downloaded_urls;
614 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; 615 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id;
615 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); 616 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id);
616 precache_database_->GetURLListForReferrerHost( 617 precache_database_->GetURLListForReferrerHost(
617 referrer_id, &actual_used_urls, &actual_unused_urls); 618 referrer_id, &actual_used_urls, &actual_downloaded_urls);
618 EXPECT_THAT(expected_used_urls, ::testing::ContainerEq(actual_used_urls)); 619 EXPECT_THAT(actual_used_urls, ::testing::ContainerEq(expected_used_urls));
619 EXPECT_THAT(expected_unused_urls, 620 EXPECT_THAT(actual_downloaded_urls,
620 ::testing::ContainerEq(actual_unused_urls)); 621 ::testing::ContainerEq(expected_downloaded_urls))
622 << "Host: " << test.hostname;
621 } 623 }
622 // Subsequent manifest updates should clear the used and unused resources. 624 // Subsequent manifest updates should clear the used and downloaded resources.
623 for (const auto& test : tests) { 625 for (const auto& test : tests) {
624 precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100, 626 precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100,
625 kNewFetchTime); 627 kNewFetchTime);
626 Flush(); 628 Flush();
627 std::vector<GURL> actual_used_urls, actual_unused_urls; 629 std::vector<GURL> actual_used_urls, actual_downloaded_urls;
628 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; 630 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id;
629 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); 631 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id);
630 precache_database_->GetURLListForReferrerHost( 632 precache_database_->GetURLListForReferrerHost(
631 referrer_id, &actual_used_urls, &actual_unused_urls); 633 referrer_id, &actual_used_urls, &actual_downloaded_urls);
632 EXPECT_TRUE(actual_used_urls.empty()); 634 EXPECT_THAT(actual_used_urls, ::testing::IsEmpty());
635 EXPECT_THAT(actual_downloaded_urls, ::testing::IsEmpty());
633 } 636 }
634 // Resources that were precached previously and not seen in user browsing 637 // Resources that were precached previously and not seen in user browsing
635 // should be still marked as precached. 638 // should be still marked as precached.
636 std::map<GURL, base::Time> expected_url_table_map; 639 std::map<GURL, base::Time> expected_url_table_map;
637 for (const auto& test : tests) { 640 for (const auto& test : tests) {
638 for (const auto& resource : test.resource_info) { 641 for (const auto& resource : test.resource_info) {
639 if (!resource.is_user_browsed) 642 if (!resource.is_user_browsed)
640 expected_url_table_map[GURL(resource.url)] = kPrecacheTime; 643 expected_url_table_map[GURL(resource.url)] = kPrecacheTime;
641 } 644 }
642 } 645 }
643 EXPECT_EQ(expected_url_table_map, GetActualURLTableMap()); 646 EXPECT_EQ(expected_url_table_map, GetActualURLTableMap());
644 } 647 }
645 648
649 TEST_F(PrecacheDatabaseTest, GetURLListForReferrerHostReportsDownloadedOnce) {
650 precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime);
651 // Add two resources that shouldn't appear in downloaded.
652 Flush(); // We need to write the referrer_host_id.
653 const std::string already_reported_and_not_refetch =
654 "http://foo.com/already-reported-and-not-refetch.js";
655 precache_database_->RecordURLPrefetch(GURL(already_reported_and_not_refetch),
656 "foo.com", kPrecacheTime, false, kSize);
657 const std::string already_reported_and_in_cache =
658 "http://foo.com/already-reported-and-in-cache.js";
659 precache_database_->RecordURLPrefetch(GURL(already_reported_and_in_cache),
660 "foo.com", kPrecacheTime, false, kSize);
661 const std::string already_reported_but_refetch =
662 "http://foo.com/already-reported-but-refetch.js";
663 precache_database_->RecordURLPrefetch(GURL(already_reported_but_refetch),
664 "foo.com", kPrecacheTime, false, kSize);
665 {
666 // Let's mark existing resources as is_download_reported = 1 by calling
667 // GetURLListForReferrerHost.
668 std::vector<GURL> unused_a, unused_b;
669 auto id = precache_database_->GetReferrerHost("foo.com").id;
670 ASSERT_NE(PrecacheReferrerHostEntry::kInvalidId, id);
671 precache_database_->GetURLListForReferrerHost(id, &unused_a, &unused_b);
672 }
673
674 precache_database_->RecordURLPrefetch(GURL(already_reported_and_in_cache),
675 "foo.com", kPrecacheTime,
676 true /* was_cached */, kSize);
677 precache_database_->RecordURLPrefetch(GURL(already_reported_but_refetch),
678 "foo.com", kPrecacheTime,
679 false /* was_cached */, kSize);
680 Flush();
681
682 // Only the refetch resource should be reported as downloaded this time
683 // around.
684 std::vector<GURL> _, actual_downloaded_urls;
685 auto referrer_id = precache_database_->GetReferrerHost("foo.com").id;
686 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id);
687 precache_database_->GetURLListForReferrerHost(referrer_id, &_,
688 &actual_downloaded_urls);
689 EXPECT_THAT(actual_downloaded_urls,
690 ElementsAre(GURL(already_reported_but_refetch)));
691 }
692
646 } // namespace 693 } // namespace
647 694
648 } // namespace precache 695 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/core/precache_database.cc ('k') | components/precache/core/precache_fetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698