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

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

Powered by Google App Engine
This is Rietveld 408576698