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

Unified Diff: components/precache/core/precache_database_unittest.cc

Issue 27047003: Precache tracking database (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@precache
Patch Set: General fixes, added tests, and moved PrecacheManager into component Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: components/precache/core/precache_database_unittest.cc
diff --git a/components/precache/core/precache_database_unittest.cc b/components/precache/core/precache_database_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..743310273f94b8b86cdc9b6fae878fb733ca5a8a
--- /dev/null
+++ b/components/precache/core/precache_database_unittest.cc
@@ -0,0 +1,282 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/precache/core/precache_database.h"
+
+#include <map>
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/metrics/histogram.h"
+#include "base/metrics/histogram_samples.h"
+#include "base/metrics/statistics_recorder.h"
+#include "base/time/time.h"
+#include "components/precache/core/precache_statistics_table.h"
+#include "components/precache/core/precache_url_table.h"
+#include "sql/connection.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace precache {
+
+class PrecacheDatabaseTest : public testing::Test {
+ public:
+ PrecacheDatabaseTest() {}
+ virtual ~PrecacheDatabaseTest() {}
+
+ protected:
+ virtual void SetUp() {
+ precache_database_ = new PrecacheDatabase();
+ sql::Connection* db = new sql::Connection();
+ ASSERT_TRUE(db->OpenInMemory());
+ precache_database_->Init(db);
+ }
+
+ std::map<GURL, base::Time> GetActualURLTableMap() {
+ std::map<GURL, base::Time> url_table_map;
+ precache_database_->precache_url_table_->GetAllData(&url_table_map);
+ return url_table_map;
+ }
+
+ std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics>
+ GetActualStatsMap() {
+ std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> stats_map;
+ precache_database_->precache_statistics_table_->GetAllStatsBetween(
+ base::Time::FromInternalValue(0), base::Time::Max(), &stats_map);
+ return stats_map;
+ }
+
+ PrecacheURLTable* precache_url_table() {
+ return precache_database_->precache_url_table_.get();
+ }
+
+ PrecacheStatisticsTable* precache_statistics_table() {
+ return precache_database_->precache_statistics_table_.get();
+ }
+
+ scoped_refptr<PrecacheDatabase> precache_database_;
+};
+
+namespace {
+
+std::map<GURL, base::Time> BuildURLTableMap(const GURL& url,
+ const base::Time& precache_time) {
+ std::map<GURL, base::Time> url_table_map;
+ url_table_map[url] = precache_time;
+ return url_table_map;
+}
+
+std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> BuildStatsMap(
+ const base::Time& day, PrecacheStatisticsTable::PrecacheStatistics stats) {
+ std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> stats_map;
+ stats_map[day] = stats;
+ return stats_map;
+}
+
+std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> BuildStatsMap(
+ const base::Time& day, int64 precached_bytes, int64 downloaded_bytes,
+ int64 downloaded_bytes_cellular, int64 saved_bytes,
+ int64 saved_bytes_cellular) {
+ return BuildStatsMap(
+ day, PrecacheStatisticsTable::PrecacheStatistics(
+ precached_bytes, downloaded_bytes, downloaded_bytes_cellular,
+ saved_bytes, saved_bytes_cellular));
+}
+
+scoped_ptr<base::HistogramSamples> GetHistogramSamples(
+ const std::string& histogram_name) {
+ base::HistogramBase* histogram =
+ base::StatisticsRecorder::FindHistogram(histogram_name);
+
+ EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram);
+
+ return histogram->SnapshotSamples().Pass();
+}
+
+void ExpectHistogramSamples(const std::string& histogram_name, int64 sample1,
+ int64 sample2) {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamples(histogram_name));
+
+ EXPECT_EQ(2, samples->TotalCount());
+
+ if (sample1 == sample2) {
+ EXPECT_EQ(2, samples->GetCount(sample1));
+ return;
+ }
+
+ EXPECT_EQ(1, samples->GetCount(sample1));
+ EXPECT_EQ(1, samples->GetCount(sample2));
+}
+
+const GURL kURL = GURL("http://url.com");
+const base::Time kFetchTime =
+ base::Time::UnixEpoch() + base::TimeDelta::FromHours(100);
+const base::Time kFetchDay = kFetchTime.LocalMidnight();
+const int64 kSize = 5000;
+
+TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) {
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, false /* was_cached */, true /* is_precaching */,
+ false /* is_cellular */);
+
+ EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, kSize /* precached_bytes */, 0, 0, 0, 0),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
+ precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
+
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, true /* was_cached */, true /* is_precaching */,
+ false /* is_cellular */);
+
+ // The URL table entry should have been updated to have |kFetchTime| as the
+ // timestamp.
+ EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
+ EXPECT_TRUE(GetActualStatsMap().empty());
+}
+
+TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) {
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, true /* was_cached */, true /* is_precaching */,
+ false /* is_cellular */);
+
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_TRUE(GetActualStatsMap().empty());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) {
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, false /* was_cached */,
+ false /* is_precaching */, false /* is_cellular */);
+
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */, 0, 0, 0),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchOverNetwork_Cellular) {
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, false /* was_cached */,
+ false /* is_precaching */, true /* is_cellular */);
+
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */,
+ kSize /* downloaded_bytes_cellular */, 0, 0),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) {
+ precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
+
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, false /* was_cached */,
+ false /* is_precaching */, false /* is_cellular */);
+
+ // The URL table entry should have been deleted.
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */, 0, 0, 0),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
+ precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
+
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
+ false /* is_cellular */);
+
+ // The URL table entry should have been deleted.
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, 0, 0, 0, kSize /* saved_bytes */, 0),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
+ precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
+
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
+ true /* is_cellular */);
+
+ // The URL table entry should have been deleted.
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_EQ(BuildStatsMap(kFetchDay, 0, 0, 0, kSize /* saved_bytes */,
+ kSize /* saved_bytes_cellular */),
+ GetActualStatsMap());
+}
+
+TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) {
+ precache_database_->RecordURLFetched(
+ kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
+ false /* is_cellular */);
+
+ EXPECT_TRUE(GetActualURLTableMap().empty());
+ EXPECT_TRUE(GetActualStatsMap().empty());
+}
+
+TEST_F(PrecacheDatabaseTest, FlushOldStats) {
+ base::StatisticsRecorder::Initialize();
+
+ const base::Time kFlushEndDate =
+ base::Time::UnixEpoch() + base::TimeDelta::FromDays(1000);
+
+ precache_url_table()->AddURL(GURL("http://expired-precache.com"),
+ kFlushEndDate - base::TimeDelta::FromDays(61));
+ precache_url_table()->AddURL(GURL("http://old-precache.com"),
+ kFlushEndDate - base::TimeDelta::FromDays(59));
+
+ const PrecacheStatisticsTable::PrecacheStatistics kWeekOldStats(
+ 5000, 4000, 3000, 2000, 1000);
+ const PrecacheStatisticsTable::PrecacheStatistics kDayOldStats(
+ 50000, 40000, 30000, 20000, 10000);
+ const PrecacheStatisticsTable::PrecacheStatistics kCurrentStats(
+ 500000, 400000, 300000, 200000, 100000);
+
+ precache_statistics_table()->IncreaseStatsForFetch(
+ kFlushEndDate - base::TimeDelta::FromDays(6), kWeekOldStats);
+ precache_statistics_table()->IncreaseStatsForFetch(kFlushEndDate,
+ kDayOldStats);
+ precache_statistics_table()->IncreaseStatsForFetch(
+ kFlushEndDate + base::TimeDelta::FromDays(1), kCurrentStats);
+
+ precache_database_->FlushOldStats(kFlushEndDate);
+
+ EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"),
+ kFlushEndDate - base::TimeDelta::FromDays(59)),
+ GetActualURLTableMap());
+
+ EXPECT_EQ(BuildStatsMap(
+ (kFlushEndDate + base::TimeDelta::FromDays(1)).LocalMidnight(),
+ kCurrentStats),
+ GetActualStatsMap());
+
+ ExpectHistogramSamples("Precache.DailyPrecachedKB",
+ kWeekOldStats.precached_bytes / 1000,
+ kDayOldStats.precached_bytes / 1000);
+ ExpectHistogramSamples("Precache.DailyDownloadedKB",
+ kWeekOldStats.downloaded_bytes / 1000,
+ kDayOldStats.downloaded_bytes / 1000);
+ ExpectHistogramSamples("Precache.DailyDownloadedKB.Cellular",
+ kWeekOldStats.downloaded_bytes_cellular / 1000,
+ kDayOldStats.downloaded_bytes_cellular / 1000);
+ ExpectHistogramSamples("Precache.DailySavedKB",
+ kWeekOldStats.saved_bytes / 1000,
+ kDayOldStats.saved_bytes / 1000);
+ ExpectHistogramSamples("Precache.DailySavedKB.Cellular",
+ kWeekOldStats.saved_bytes_cellular / 1000,
+ kDayOldStats.saved_bytes_cellular / 1000);
+ ExpectHistogramSamples("Precache.DailySavingsPercentage", 33, 33);
+ ExpectHistogramSamples("Precache.DailySavingsPercentage.Cellular", 25, 25);
+}
+
+} // namespace
bengr 2013/10/23 19:03:36 In addition, I'd like a holistic test that verifie
sclittle 2013/10/24 22:11:38 Done.
+
+} // namespace precache

Powered by Google App Engine
This is Rietveld 408576698