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

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

Powered by Google App Engine
This is Rietveld 408576698