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

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: Addressed comments Created 7 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
(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
9 #include "base/basictypes.h"
10 #include "base/metrics/histogram.h"
11 #include "base/metrics/histogram_samples.h"
12 #include "base/metrics/statistics_recorder.h"
13 #include "base/time/time.h"
14 #include "components/precache/core/precache_statistics_table.h"
15 #include "components/precache/core/precache_url_table.h"
16 #include "sql/connection.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "url/gurl.h"
19
20 namespace {
21
22 typedef precache::PrecacheStatisticsTable::PrecacheStatistics
23 PrecacheStatistics;
24 typedef precache::PrecacheStatisticsTable::PrecacheStatisticsMap
25 PrecacheStatisticsMap;
26
27 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url,
28 const base::Time& precache_time) {
29 std::map<GURL, base::Time> url_table_map;
30 url_table_map[url] = precache_time;
31 return url_table_map;
32 }
33
34 PrecacheStatisticsMap BuildStatsMap(const base::Time& day,
35 const PrecacheStatistics& stats) {
36 PrecacheStatisticsMap stats_map;
37 stats_map[day] = stats;
38 return stats_map;
39 }
40
41 scoped_ptr<base::HistogramSamples> GetHistogramSamples(
42 const char* histogram_name) {
43 base::HistogramBase* histogram =
44 base::StatisticsRecorder::FindHistogram(histogram_name);
45
46 EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram);
47
48 return histogram->SnapshotSamples().Pass();
49 }
50
51 void ExpectHistogramSamples(const char* histogram_name, int64 sample1,
52 int64 sample2) {
53 scoped_ptr<base::HistogramSamples> samples(
54 GetHistogramSamples(histogram_name));
55
56 EXPECT_EQ(2, samples->TotalCount());
57
58 if (sample1 == sample2) {
59 EXPECT_EQ(2, samples->GetCount(sample1));
60 return;
61 }
62
63 EXPECT_EQ(1, samples->GetCount(sample1));
64 EXPECT_EQ(1, samples->GetCount(sample2));
65 }
66
67 const GURL kURL("http://url.com");
68 const base::Time kFetchDay = base::Time() + base::TimeDelta::FromDays(1000);
69 const base::Time kFetchTime = kFetchDay + base::TimeDelta::FromHours(14);
70 const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1);
71 const int64 kSize = 5000;
72
73 } // namespace
74
75 namespace precache {
76
77 class PrecacheDatabaseTest : public testing::Test {
78 public:
79 PrecacheDatabaseTest() {}
80 virtual ~PrecacheDatabaseTest() {}
81
82 protected:
83 virtual void SetUp() OVERRIDE {
84 precache_database_ = new PrecacheDatabase();
85 scoped_ptr<sql::Connection> db(new sql::Connection());
86 ASSERT_TRUE(db->OpenInMemory());
87 precache_database_->Init(db.Pass());
88 }
89
90 std::map<GURL, base::Time> GetActualURLTableMap() {
91 std::map<GURL, base::Time> url_table_map;
92 precache_database_->precache_url_table_->GetAllDataForTesting(
93 &url_table_map);
94 return url_table_map;
95 }
96
97 PrecacheStatisticsMap GetActualStatsMap() {
98 PrecacheStatisticsMap stats_map;
99 precache_database_->precache_statistics_table_->GetOldStats(
100 base::Time::Max(), &stats_map);
101 return stats_map;
102 }
103
104 PrecacheURLTable* precache_url_table() {
105 return precache_database_->precache_url_table_.get();
106 }
107
108 PrecacheStatisticsTable* precache_statistics_table() {
109 return precache_database_->precache_statistics_table_.get();
110 }
111
112 // Convenience methods for recording different types of URL fetches. These
113 // exist to improve the readability of the tests.
114 void RecordPrecacheFromNetwork(const GURL& url, const base::Time& fetch_time,
115 int64 size);
116 void RecordPrecacheFromCache(const GURL& url, const base::Time& fetch_time,
117 int64 size);
118 void RecordFetchFromNetwork(const GURL& url, const base::Time& fetch_time,
119 int64 size);
120 void RecordFetchFromNetworkCellular(const GURL& url,
121 const base::Time& fetch_time, int64 size);
122 void RecordFetchFromCache(const GURL& url, const base::Time& fetch_time,
123 int64 size);
124 void RecordFetchFromCacheCellular(const GURL& url,
125 const base::Time& fetch_time, int64 size);
126
127 scoped_refptr<PrecacheDatabase> precache_database_;
128 };
129
130 void PrecacheDatabaseTest::RecordPrecacheFromNetwork(
131 const GURL& url, const base::Time& fetch_time, int64 size) {
132 precache_database_->RecordURLPrecached(url, fetch_time, size,
133 false /* was_cached */);
134 }
135
136 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url,
137 const base::Time& fetch_time,
138 int64 size) {
139 precache_database_->RecordURLPrecached(url, fetch_time, size,
140 true /* was_cached */);
141 }
142
143 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url,
144 const base::Time& fetch_time,
145 int64 size) {
146 precache_database_->RecordURLFetched(url, fetch_time, size,
147 false /* was_cached */,
148 false /* is_connection_cellular */);
149 }
150
151 void PrecacheDatabaseTest::RecordFetchFromNetworkCellular(
152 const GURL& url, const base::Time& fetch_time, int64 size) {
153 precache_database_->RecordURLFetched(url, fetch_time, size,
154 false /* was_cached */,
155 true /* is_connection_cellular */);
156 }
157
158 void PrecacheDatabaseTest::RecordFetchFromCache(const GURL& url,
159 const base::Time& fetch_time,
160 int64 size) {
161 precache_database_->RecordURLFetched(url, fetch_time, size,
162 true /* was_cached */,
163 false /* is_connection_cellular */);
164 }
165
166 void PrecacheDatabaseTest::RecordFetchFromCacheCellular(
167 const GURL& url, const base::Time& fetch_time, int64 size) {
168 precache_database_->RecordURLFetched(url, fetch_time, size,
169 true /* was_cached */,
170 true /* is_connection_cellular */);
171 }
172
173 namespace {
174
175 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) {
176 RecordPrecacheFromNetwork(kURL, kFetchTime, kSize);
177
178 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
179
180 PrecacheStatisticsMap expected_stats_map;
181 expected_stats_map[kFetchDay].downloaded_precache_motivated_bytes = kSize;
182 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
183 }
184
185 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
186 precache_url_table()->AddURL(kURL, kOldFetchTime);
187 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
188
189 // The URL table entry should have been updated to have |kFetchTime| as the
190 // timestamp.
191 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
192 EXPECT_TRUE(GetActualStatsMap().empty());
193 }
194
195 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) {
196 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
197
198 EXPECT_TRUE(GetActualURLTableMap().empty());
199 EXPECT_TRUE(GetActualStatsMap().empty());
200 }
201
202 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) {
203 RecordFetchFromNetwork(kURL, kFetchTime, kSize);
204
205 EXPECT_TRUE(GetActualURLTableMap().empty());
206
207 PrecacheStatisticsMap expected_stats_map;
208 expected_stats_map[kFetchDay].downloaded_non_precache_bytes = kSize;
209 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
210 }
211
212 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_Cellular) {
213 RecordFetchFromNetworkCellular(kURL, kFetchTime, kSize);
214
215 EXPECT_TRUE(GetActualURLTableMap().empty());
216
217 PrecacheStatisticsMap expected_stats_map;
218 expected_stats_map[kFetchDay].downloaded_non_precache_bytes = kSize;
219 expected_stats_map[kFetchDay].downloaded_non_precache_bytes_cellular = kSize;
220 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
221 }
222
223 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) {
224 precache_url_table()->AddURL(kURL, kOldFetchTime);
225 RecordFetchFromNetwork(kURL, kFetchTime, kSize);
226
227 // The URL table entry should have been deleted.
228 EXPECT_TRUE(GetActualURLTableMap().empty());
229
230 PrecacheStatisticsMap expected_stats_map;
231 expected_stats_map[kFetchDay].downloaded_non_precache_bytes = kSize;
232 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
233 }
234
235 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
236 precache_url_table()->AddURL(kURL, kOldFetchTime);
237 RecordFetchFromCache(kURL, kFetchTime, kSize);
238
239 // The URL table entry should have been deleted.
240 EXPECT_TRUE(GetActualURLTableMap().empty());
241
242 PrecacheStatisticsMap expected_stats_map;
243 expected_stats_map[kFetchDay].saved_bytes = kSize;
244 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
245 }
246
247 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
248 precache_url_table()->AddURL(kURL, kOldFetchTime);
249 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize);
250
251 // The URL table entry should have been deleted.
252 EXPECT_TRUE(GetActualURLTableMap().empty());
253
254 PrecacheStatisticsMap expected_stats_map;
255 expected_stats_map[kFetchDay].saved_bytes = kSize;
256 expected_stats_map[kFetchDay].saved_bytes_cellular = kSize;
257 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
258 }
259
260 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) {
261 RecordFetchFromCache(kURL, kFetchTime, kSize);
262
263 EXPECT_TRUE(GetActualURLTableMap().empty());
264 EXPECT_TRUE(GetActualStatsMap().empty());
265 }
266
267 TEST_F(PrecacheDatabaseTest, ReportAndDeleteOldStats) {
268 base::StatisticsRecorder::Initialize();
269
270 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000);
271 const base::Time kYesterday = kToday - base::TimeDelta::FromDays(1);
272 const base::Time kLastWeek = kToday - base::TimeDelta::FromDays(7);
273 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59);
274 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61);
275
276 precache_url_table()->AddURL(GURL("http://expired-precache.com"), k61DaysAgo);
277 precache_url_table()->AddURL(GURL("http://old-precache.com"), k59DaysAgo);
278
279 const PrecacheStatistics kWeekOldStats(5000, 4000, 3000, 2000, 1000);
280 const PrecacheStatistics kDayOldStats(10000, 8000, 6000, 4000, 2000);
281 const PrecacheStatistics kCurrentStats(50000, 40000, 30000, 20000, 10000);
282
283 precache_statistics_table()->IncreaseDailyStats(kLastWeek, kWeekOldStats);
284 precache_statistics_table()->IncreaseDailyStats(kYesterday, kDayOldStats);
285 precache_statistics_table()->IncreaseDailyStats(kToday, kCurrentStats);
286
287 precache_database_->ReportAndDeleteOldStats(kToday);
288
289 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo),
290 GetActualURLTableMap());
291 EXPECT_EQ(BuildStatsMap(kToday, kCurrentStats), GetActualStatsMap());
292
293 ExpectHistogramSamples(
294 "Precache.DailyDownloadedPrecacheMotivatedKB",
295 kWeekOldStats.downloaded_precache_motivated_bytes / 1024,
296 kDayOldStats.downloaded_precache_motivated_bytes / 1024);
297 ExpectHistogramSamples("Precache.DailyDownloadedNonPrecacheKB",
298 kWeekOldStats.downloaded_non_precache_bytes / 1024,
299 kDayOldStats.downloaded_non_precache_bytes / 1024);
300 ExpectHistogramSamples(
301 "Precache.DailyDownloadedNonPrecacheKB.Cellular",
302 kWeekOldStats.downloaded_non_precache_bytes_cellular / 1024,
303 kDayOldStats.downloaded_non_precache_bytes_cellular / 1024);
304 ExpectHistogramSamples("Precache.DailySavedKB",
305 kWeekOldStats.saved_bytes / 1024,
306 kDayOldStats.saved_bytes / 1024);
307 ExpectHistogramSamples("Precache.DailySavedKB.Cellular",
308 kWeekOldStats.saved_bytes_cellular / 1024,
309 kDayOldStats.saved_bytes_cellular / 1024);
310 ExpectHistogramSamples("Precache.DailySavingsPercentage", 33, 33);
311 ExpectHistogramSamples("Precache.DailySavingsPercentage.Cellular", 25, 25);
312 }
313
314 TEST_F(PrecacheDatabaseTest, SampleInteraction) {
315 const GURL kURL1("http://url1.com");
316 const int64 kSize1 = 1000;
317 const GURL kURL2("http://url2.com");
318 const int64 kSize2 = 2000;
319 const GURL kURL3("http://url3.com");
320 const int64 kSize3 = 3000;
321 const GURL kURL4("http://url4.com");
322 const int64 kSize4 = 4000;
323 const GURL kURL5("http://url5.com");
324 const int64 kSize5 = 5000;
325
326 const base::Time kDay1 = base::Time() + base::TimeDelta::FromDays(1000);
327 const base::Time kDay2 = kDay1 + base::TimeDelta::FromDays(1);
328 const base::TimeDelta kFetchPeriod = base::TimeDelta::FromMilliseconds(100);
329
330 PrecacheStatisticsMap expected_stats_map;
331
332 // Start of day 1.
333 base::Time fetch_time = kDay1;
334
335 // Precache URL 1 from network.
336 RecordPrecacheFromNetwork(kURL1, fetch_time, kSize1);
337 expected_stats_map[kDay1].downloaded_precache_motivated_bytes += kSize1;
338 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
339 fetch_time += kFetchPeriod;
340
341 // Precache URL 2 from network.
342 RecordPrecacheFromNetwork(kURL2, fetch_time, kSize2);
343 expected_stats_map[kDay1].downloaded_precache_motivated_bytes += kSize2;
344 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
345 fetch_time += kFetchPeriod;
346
347 // Precache URL 3 from network.
348 RecordPrecacheFromNetwork(kURL3, fetch_time, kSize3);
349 expected_stats_map[kDay1].downloaded_precache_motivated_bytes += kSize3;
350 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
351 fetch_time += kFetchPeriod;
352
353 // Precache URL 4 from network.
354 RecordPrecacheFromNetwork(kURL4, fetch_time, kSize4);
355 expected_stats_map[kDay1].downloaded_precache_motivated_bytes += kSize4;
356 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
357 fetch_time += kFetchPeriod;
358
359 // Fetch URL 1 from cache when on a cellular network.
360 RecordFetchFromCacheCellular(kURL1, fetch_time, kSize1);
361 expected_stats_map[kDay1].saved_bytes += kSize1;
362 expected_stats_map[kDay1].saved_bytes_cellular += kSize1;
363 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
364 fetch_time += kFetchPeriod;
365
366 // Fetch URL 1 from cache when on a cellular network.
367 RecordFetchFromCacheCellular(kURL1, fetch_time, kSize1);
368 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
369 fetch_time += kFetchPeriod;
370
371 // Fetch URL 2 from network when on a cellular network.
372 RecordFetchFromNetworkCellular(kURL2, fetch_time, kSize2);
373 expected_stats_map[kDay1].downloaded_non_precache_bytes += kSize2;
374 expected_stats_map[kDay1].downloaded_non_precache_bytes_cellular += kSize2;
375 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
376 fetch_time += kFetchPeriod;
377
378 // Fetch URL 5 from network when on a cellular network.
379 RecordFetchFromNetworkCellular(kURL5, fetch_time, kSize5);
380 expected_stats_map[kDay1].downloaded_non_precache_bytes += kSize5;
381 expected_stats_map[kDay1].downloaded_non_precache_bytes_cellular += kSize5;
382 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
383 fetch_time += kFetchPeriod;
384
385 // Fetch URL 5 from cache when on a cellular network.
386 RecordFetchFromCacheCellular(kURL5, fetch_time, kSize5);
387 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
388
389 // Day 1 ends, day 2 begins.
390 fetch_time = kDay2;
391
392 // Precache URL 1 from cache.
393 RecordPrecacheFromCache(kURL1, fetch_time, kSize1);
394 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
395 fetch_time += kFetchPeriod;
396
397 // Precache URL 2 from network.
398 RecordPrecacheFromNetwork(kURL2, fetch_time, kSize2);
399 expected_stats_map[kDay2].downloaded_precache_motivated_bytes += kSize2;
400 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
401 fetch_time += kFetchPeriod;
402
403 // Precache URL 3 from cache.
404 RecordPrecacheFromCache(kURL3, fetch_time, kSize3);
405 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
406 fetch_time += kFetchPeriod;
407
408 // Precache URL 4 from cache.
409 RecordPrecacheFromCache(kURL4, fetch_time, kSize4);
410 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
411 fetch_time += kFetchPeriod;
412
413 // Fetch URL 1 from cache.
414 RecordFetchFromCache(kURL1, fetch_time, kSize1);
415 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
416 fetch_time += kFetchPeriod;
417
418 // Fetch URL 2 from network.
419 RecordFetchFromNetwork(kURL2, fetch_time, kSize2);
420 expected_stats_map[kDay2].downloaded_non_precache_bytes += kSize2;
421 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
422 fetch_time += kFetchPeriod;
423
424 // Fetch URL 3 from cache.
425 RecordFetchFromCache(kURL3, fetch_time, kSize3);
426 expected_stats_map[kDay2].saved_bytes += kSize3;
427 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
428 fetch_time += kFetchPeriod;
429
430 // Fetch URL 5 from cache.
431 RecordFetchFromCache(kURL5, fetch_time, kSize5);
432 EXPECT_EQ(expected_stats_map, GetActualStatsMap());
433 }
434
435 } // namespace
436
437 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698