Chromium Code Reviews| 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 |