| 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 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_precaching */, | 
|  | 151       false /* is_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_precaching */, | 
|  | 159       false /* is_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_precaching */, | 
|  | 167       false /* is_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_precaching */, | 
|  | 174       true /* is_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_precaching */, | 
|  | 182       false /* is_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_precaching */, | 
|  | 189       true /* is_cellular */); | 
|  | 190 } | 
|  | 191 | 
|  | 192 namespace { | 
|  | 193 | 
|  | 194 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) { | 
|  | 195   precache_database_->RecordURLFetched( | 
|  | 196       kURL, kFetchTime, kSize, false /* was_cached */, true /* is_precaching */, | 
|  | 197       false /* is_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_precaching */, | 
|  | 209       false /* is_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_precaching */, | 
|  | 220       false /* is_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_precaching */, false /* is_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_precaching */, true /* is_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_precaching */, false /* is_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_precaching */, | 
|  | 265       false /* is_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_precaching */, | 
|  | 278       true /* is_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_precaching */, | 
|  | 290       false /* is_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 | 
| OLD | NEW | 
|---|