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

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

Powered by Google App Engine
This is Rietveld 408576698