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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/precache/core/precache_database.h"
6
7 #include <map>
8 #include <string>
9
10 #include "base/basictypes.h"
11 #include "base/bind.h"
12 #include "base/bind_helpers.h"
13 #include "base/callback.h"
14 #include "base/logging.h"
15 #include "base/metrics/histogram.h"
16 #include "base/metrics/histogram_samples.h"
17 #include "base/metrics/statistics_recorder.h"
18 #include "base/time/time.h"
19 #include "components/precache/core/precache_statistics_table.h"
20 #include "components/precache/core/precache_url_table.h"
21 #include "sql/connection.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "url/gurl.h"
24
25 namespace precache {
26
27 class PrecacheDatabaseTest : public testing::Test {
28 public:
29 PrecacheDatabaseTest() {}
30 virtual ~PrecacheDatabaseTest() {}
31
32 protected:
33 virtual void SetUp() {
34 precache_database_ = new PrecacheDatabase();
35 sql::Connection* db = new sql::Connection();
36 ASSERT_TRUE(db->OpenInMemory());
37 precache_database_->Init(db);
38 }
39
40 std::map<GURL, base::Time> GetActualURLTableMap() {
41 std::map<GURL, base::Time> url_table_map;
42 precache_database_->precache_url_table_->GetAllData(&url_table_map);
43 return url_table_map;
44 }
45
46 std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics>
47 GetActualStatsMap() {
48 std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> stats_map;
49 precache_database_->precache_statistics_table_->GetAllStatsBetween(
50 base::Time::FromInternalValue(0), base::Time::Max(), &stats_map);
51 return stats_map;
52 }
53
54 PrecacheURLTable* precache_url_table() {
55 return precache_database_->precache_url_table_.get();
56 }
57
58 PrecacheStatisticsTable* precache_statistics_table() {
59 return precache_database_->precache_statistics_table_.get();
60 }
61
62 scoped_refptr<PrecacheDatabase> precache_database_;
63 };
64
65 namespace {
66
67 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url,
68 const base::Time& precache_time) {
69 std::map<GURL, base::Time> url_table_map;
70 url_table_map[url] = precache_time;
71 return url_table_map;
72 }
73
74 std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> BuildStatsMap(
75 const base::Time& day, PrecacheStatisticsTable::PrecacheStatistics stats) {
76 std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> stats_map;
77 stats_map[day] = stats;
78 return stats_map;
79 }
80
81 std::map<base::Time, PrecacheStatisticsTable::PrecacheStatistics> BuildStatsMap(
82 const base::Time& day, int64 precached_bytes, int64 downloaded_bytes,
83 int64 downloaded_bytes_cellular, int64 saved_bytes,
84 int64 saved_bytes_cellular) {
85 return BuildStatsMap(
86 day, PrecacheStatisticsTable::PrecacheStatistics(
87 precached_bytes, downloaded_bytes, downloaded_bytes_cellular,
88 saved_bytes, saved_bytes_cellular));
89 }
90
91 scoped_ptr<base::HistogramSamples> GetHistogramSamples(
92 const std::string& histogram_name) {
93 base::HistogramBase* histogram =
94 base::StatisticsRecorder::FindHistogram(histogram_name);
95
96 EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram);
97
98 return histogram->SnapshotSamples().Pass();
99 }
100
101 void ExpectHistogramSamples(const std::string& histogram_name, int64 sample1,
102 int64 sample2) {
103 scoped_ptr<base::HistogramSamples> samples(
104 GetHistogramSamples(histogram_name));
105
106 EXPECT_EQ(2, samples->TotalCount());
107
108 if (sample1 == sample2) {
109 EXPECT_EQ(2, samples->GetCount(sample1));
110 return;
111 }
112
113 EXPECT_EQ(1, samples->GetCount(sample1));
114 EXPECT_EQ(1, samples->GetCount(sample2));
115 }
116
117 const GURL kURL = GURL("http://url.com");
118 const base::Time kFetchTime =
119 base::Time::UnixEpoch() + base::TimeDelta::FromHours(100);
120 const base::Time kFetchDay = kFetchTime.LocalMidnight();
121 const int64 kSize = 5000;
122
123 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) {
124 precache_database_->RecordURLFetched(
125 kURL, kFetchTime, kSize, false /* was_cached */, true /* is_precaching */,
126 false /* is_cellular */);
127
128 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
129 EXPECT_EQ(BuildStatsMap(kFetchDay, kSize /* precached_bytes */, 0, 0, 0, 0),
130 GetActualStatsMap());
131 }
132
133 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
134 precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
135
136 precache_database_->RecordURLFetched(
137 kURL, kFetchTime, kSize, true /* was_cached */, true /* is_precaching */,
138 false /* is_cellular */);
139
140 // The URL table entry should have been updated to have |kFetchTime| as the
141 // timestamp.
142 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
143 EXPECT_TRUE(GetActualStatsMap().empty());
144 }
145
146 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) {
147 precache_database_->RecordURLFetched(
148 kURL, kFetchTime, kSize, true /* was_cached */, true /* is_precaching */,
149 false /* is_cellular */);
150
151 EXPECT_TRUE(GetActualURLTableMap().empty());
152 EXPECT_TRUE(GetActualStatsMap().empty());
153 }
154
155 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) {
156 precache_database_->RecordURLFetched(
157 kURL, kFetchTime, kSize, false /* was_cached */,
158 false /* is_precaching */, false /* is_cellular */);
159
160 EXPECT_TRUE(GetActualURLTableMap().empty());
161 EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */, 0, 0, 0),
162 GetActualStatsMap());
163 }
164
165 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_Cellular) {
166 precache_database_->RecordURLFetched(
167 kURL, kFetchTime, kSize, false /* was_cached */,
168 false /* is_precaching */, true /* is_cellular */);
169
170 EXPECT_TRUE(GetActualURLTableMap().empty());
171 EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */,
172 kSize /* downloaded_bytes_cellular */, 0, 0),
173 GetActualStatsMap());
174 }
175
176 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) {
177 precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
178
179 precache_database_->RecordURLFetched(
180 kURL, kFetchTime, kSize, false /* was_cached */,
181 false /* is_precaching */, false /* is_cellular */);
182
183 // The URL table entry should have been deleted.
184 EXPECT_TRUE(GetActualURLTableMap().empty());
185 EXPECT_EQ(BuildStatsMap(kFetchDay, 0, kSize /* downloaded_bytes */, 0, 0, 0),
186 GetActualStatsMap());
187 }
188
189 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
190 precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
191
192 precache_database_->RecordURLFetched(
193 kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
194 false /* is_cellular */);
195
196 // The URL table entry should have been deleted.
197 EXPECT_TRUE(GetActualURLTableMap().empty());
198 EXPECT_EQ(BuildStatsMap(kFetchDay, 0, 0, 0, kSize /* saved_bytes */, 0),
199 GetActualStatsMap());
200 }
201
202 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
203 precache_url_table()->AddURL(kURL, kFetchTime - base::TimeDelta::FromDays(1));
204
205 precache_database_->RecordURLFetched(
206 kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
207 true /* is_cellular */);
208
209 // The URL table entry should have been deleted.
210 EXPECT_TRUE(GetActualURLTableMap().empty());
211 EXPECT_EQ(BuildStatsMap(kFetchDay, 0, 0, 0, kSize /* saved_bytes */,
212 kSize /* saved_bytes_cellular */),
213 GetActualStatsMap());
214 }
215
216 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) {
217 precache_database_->RecordURLFetched(
218 kURL, kFetchTime, kSize, true /* was_cached */, false /* is_precaching */,
219 false /* is_cellular */);
220
221 EXPECT_TRUE(GetActualURLTableMap().empty());
222 EXPECT_TRUE(GetActualStatsMap().empty());
223 }
224
225 TEST_F(PrecacheDatabaseTest, FlushOldStats) {
226 base::StatisticsRecorder::Initialize();
227
228 const base::Time kFlushEndDate =
229 base::Time::UnixEpoch() + base::TimeDelta::FromDays(1000);
230
231 precache_url_table()->AddURL(GURL("http://expired-precache.com"),
232 kFlushEndDate - base::TimeDelta::FromDays(61));
233 precache_url_table()->AddURL(GURL("http://old-precache.com"),
234 kFlushEndDate - base::TimeDelta::FromDays(59));
235
236 const PrecacheStatisticsTable::PrecacheStatistics kWeekOldStats(
237 5000, 4000, 3000, 2000, 1000);
238 const PrecacheStatisticsTable::PrecacheStatistics kDayOldStats(
239 50000, 40000, 30000, 20000, 10000);
240 const PrecacheStatisticsTable::PrecacheStatistics kCurrentStats(
241 500000, 400000, 300000, 200000, 100000);
242
243 precache_statistics_table()->IncreaseStatsForFetch(
244 kFlushEndDate - base::TimeDelta::FromDays(6), kWeekOldStats);
245 precache_statistics_table()->IncreaseStatsForFetch(kFlushEndDate,
246 kDayOldStats);
247 precache_statistics_table()->IncreaseStatsForFetch(
248 kFlushEndDate + base::TimeDelta::FromDays(1), kCurrentStats);
249
250 precache_database_->FlushOldStats(kFlushEndDate);
251
252 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"),
253 kFlushEndDate - base::TimeDelta::FromDays(59)),
254 GetActualURLTableMap());
255
256 EXPECT_EQ(BuildStatsMap(
257 (kFlushEndDate + base::TimeDelta::FromDays(1)).LocalMidnight(),
258 kCurrentStats),
259 GetActualStatsMap());
260
261 ExpectHistogramSamples("Precache.DailyPrecachedKB",
262 kWeekOldStats.precached_bytes / 1000,
263 kDayOldStats.precached_bytes / 1000);
264 ExpectHistogramSamples("Precache.DailyDownloadedKB",
265 kWeekOldStats.downloaded_bytes / 1000,
266 kDayOldStats.downloaded_bytes / 1000);
267 ExpectHistogramSamples("Precache.DailyDownloadedKB.Cellular",
268 kWeekOldStats.downloaded_bytes_cellular / 1000,
269 kDayOldStats.downloaded_bytes_cellular / 1000);
270 ExpectHistogramSamples("Precache.DailySavedKB",
271 kWeekOldStats.saved_bytes / 1000,
272 kDayOldStats.saved_bytes / 1000);
273 ExpectHistogramSamples("Precache.DailySavedKB.Cellular",
274 kWeekOldStats.saved_bytes_cellular / 1000,
275 kDayOldStats.saved_bytes_cellular / 1000);
276 ExpectHistogramSamples("Precache.DailySavingsPercentage", 33, 33);
277 ExpectHistogramSamples("Precache.DailySavingsPercentage.Cellular", 25, 25);
278 }
279
280 } // 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.
281
282 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698