| OLD | NEW | 
|---|
| (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 | 
| OLD | NEW | 
|---|