Home | History | Annotate | Download | only in browser
      1 // Copyright 2014 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 "base/basictypes.h"
      6 #include "base/compiler_specific.h"
      7 #include "base/prefs/pref_registry_simple.h"
      8 #include "base/prefs/pref_service.h"
      9 #include "base/prefs/scoped_user_pref_update.h"
     10 #include "base/prefs/testing_pref_service.h"
     11 #include "base/strings/string_number_conversions.h"
     12 #include "components/data_reduction_proxy/browser/data_reduction_proxy_metrics.h"
     13 #include "components/data_reduction_proxy/common/data_reduction_proxy_pref_names.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 namespace {
     17 
     18 const size_t kNumDaysInHistory = 60;
     19 
     20 int64 GetListPrefInt64Value(
     21     const base::ListValue& list_update, size_t index) {
     22   std::string string_value;
     23   EXPECT_TRUE(list_update.GetString(index, &string_value));
     24 
     25   int64 value = 0;
     26   EXPECT_TRUE(base::StringToInt64(string_value, &value));
     27   return value;
     28 }
     29 
     30 }  // namespace
     31 
     32 namespace data_reduction_proxy {
     33 
     34 // Test UpdateContentLengthPrefs.
     35 class ChromeNetworkDataSavingMetricsTest : public testing::Test {
     36  protected:
     37   ChromeNetworkDataSavingMetricsTest() {}
     38 
     39   virtual void SetUp() OVERRIDE {
     40     PrefRegistrySimple* registry = pref_service_.registry();
     41     registry->RegisterInt64Pref(
     42         data_reduction_proxy::prefs::kHttpReceivedContentLength, 0);
     43     registry->RegisterInt64Pref(
     44         data_reduction_proxy::prefs::kHttpOriginalContentLength, 0);
     45 
     46     registry->RegisterListPref(data_reduction_proxy::prefs::
     47                                    kDailyHttpOriginalContentLength);
     48     registry->RegisterListPref(data_reduction_proxy::prefs::
     49                                    kDailyHttpReceivedContentLength);
     50     registry->RegisterListPref(
     51         data_reduction_proxy::prefs::
     52             kDailyOriginalContentLengthWithDataReductionProxyEnabled);
     53     registry->RegisterListPref(
     54         data_reduction_proxy::prefs::
     55             kDailyContentLengthWithDataReductionProxyEnabled);
     56     registry->RegisterListPref(
     57         data_reduction_proxy::prefs::
     58             kDailyContentLengthHttpsWithDataReductionProxyEnabled);
     59     registry->RegisterListPref(
     60         data_reduction_proxy::prefs::
     61             kDailyContentLengthShortBypassWithDataReductionProxyEnabled);
     62     registry->RegisterListPref(
     63         data_reduction_proxy::prefs::
     64             kDailyContentLengthLongBypassWithDataReductionProxyEnabled);
     65     registry->RegisterListPref(
     66         data_reduction_proxy::prefs::
     67             kDailyContentLengthUnknownWithDataReductionProxyEnabled);
     68     registry->RegisterListPref(
     69         data_reduction_proxy::prefs::
     70             kDailyOriginalContentLengthViaDataReductionProxy);
     71     registry->RegisterListPref(
     72         data_reduction_proxy::prefs::
     73             kDailyContentLengthViaDataReductionProxy);
     74     registry->RegisterInt64Pref(
     75         data_reduction_proxy::prefs::
     76             kDailyHttpContentLengthLastUpdateDate, 0L);
     77   }
     78 
     79   TestingPrefServiceSimple pref_service_;
     80 };
     81 
     82 TEST_F(ChromeNetworkDataSavingMetricsTest, TotalLengths) {
     83   const int64 kOriginalLength = 200;
     84   const int64 kReceivedLength = 100;
     85 
     86   UpdateContentLengthPrefs(
     87       kReceivedLength, kOriginalLength,
     88       false, UNKNOWN_TYPE, &pref_service_);
     89   EXPECT_EQ(kReceivedLength,
     90             pref_service_.GetInt64(
     91                 data_reduction_proxy::prefs::kHttpReceivedContentLength));
     92   EXPECT_EQ(kOriginalLength,
     93             pref_service_.GetInt64(
     94                 data_reduction_proxy::prefs::kHttpOriginalContentLength));
     95 
     96   // Record the same numbers again, and total lengths should be dobuled.
     97   UpdateContentLengthPrefs(
     98       kReceivedLength, kOriginalLength,
     99       false, UNKNOWN_TYPE, &pref_service_);
    100   EXPECT_EQ(kReceivedLength * 2,
    101             pref_service_.GetInt64(
    102                 data_reduction_proxy::prefs::kHttpReceivedContentLength));
    103   EXPECT_EQ(kOriginalLength * 2,
    104             pref_service_.GetInt64(
    105                 data_reduction_proxy::prefs::kHttpOriginalContentLength));
    106 }
    107 
    108 // The initial last update time used in test. There is no leap second a few
    109 // days around this time used in the test.
    110 // Note: No time zone is specified. Local time will be assumed by
    111 // base::Time::FromString below.
    112 const char kLastUpdateTime[] = "Wed, 18 Sep 2013 03:45:26";
    113 
    114 class ChromeNetworkDailyDataSavingMetricsTest
    115     : public ChromeNetworkDataSavingMetricsTest {
    116  protected:
    117   ChromeNetworkDailyDataSavingMetricsTest() {
    118     base::Time::FromString(kLastUpdateTime, &now_);
    119   }
    120 
    121   virtual void SetUp() OVERRIDE {
    122     ChromeNetworkDataSavingMetricsTest::SetUp();
    123 
    124     // Only create two lists in Setup to test that adding new lists is fine.
    125     CreatePrefList(
    126         data_reduction_proxy::prefs::kDailyHttpOriginalContentLength);
    127     CreatePrefList(
    128         data_reduction_proxy::prefs::kDailyHttpReceivedContentLength);
    129   }
    130 
    131   base::Time FakeNow() const {
    132     return now_ + now_delta_;
    133   }
    134 
    135   void SetFakeTimeDeltaInHours(int hours) {
    136     now_delta_ = base::TimeDelta::FromHours(hours);
    137   }
    138 
    139   void AddFakeTimeDeltaInHours(int hours) {
    140     now_delta_ += base::TimeDelta::FromHours(hours);
    141   }
    142 
    143   // Create daily pref list of |kNumDaysInHistory| zero values.
    144   void CreatePrefList(const char* pref) {
    145     ListPrefUpdate update(&pref_service_, pref);
    146     update->Clear();
    147     for (size_t i = 0; i < kNumDaysInHistory; ++i) {
    148       update->Insert(0, new base::StringValue(base::Int64ToString(0)));
    149     }
    150   }
    151 
    152   // Verify the pref list values are equal to the given values.
    153   // If the count of values is less than kNumDaysInHistory, zeros are assumed
    154   // at the beginning.
    155   void VerifyPrefList(const char* pref, const int64* values, size_t count) {
    156     ASSERT_GE(kNumDaysInHistory, count);
    157     ListPrefUpdate update(&pref_service_, pref);
    158     ASSERT_EQ(kNumDaysInHistory, update->GetSize()) << "Pref: " << pref;
    159 
    160     for (size_t i = 0; i < count; ++i) {
    161       EXPECT_EQ(
    162           values[i],
    163           GetListPrefInt64Value(*update, kNumDaysInHistory - count + i))
    164           << "index=" << (kNumDaysInHistory - count + i);
    165     }
    166     for (size_t i = 0; i < kNumDaysInHistory - count; ++i) {
    167       EXPECT_EQ(0, GetListPrefInt64Value(*update, i)) << "index=" << i;
    168     }
    169   }
    170 
    171   // Verify all daily data saving pref list values.
    172   void VerifyDailyDataSavingContentLengthPrefLists(
    173       const int64* original_values, size_t original_count,
    174       const int64* received_values, size_t received_count,
    175       const int64* original_with_data_reduction_proxy_enabled_values,
    176       size_t original_with_data_reduction_proxy_enabled_count,
    177       const int64* received_with_data_reduction_proxy_enabled_values,
    178       size_t received_with_data_reduction_proxy_count,
    179       const int64* original_via_data_reduction_proxy_values,
    180       size_t original_via_data_reduction_proxy_count,
    181       const int64* received_via_data_reduction_proxy_values,
    182       size_t received_via_data_reduction_proxy_count) {
    183     VerifyPrefList(data_reduction_proxy::prefs::kDailyHttpOriginalContentLength,
    184                    original_values, original_count);
    185     VerifyPrefList(data_reduction_proxy::prefs::kDailyHttpReceivedContentLength,
    186                    received_values, received_count);
    187     VerifyPrefList(
    188         data_reduction_proxy::prefs::
    189             kDailyOriginalContentLengthWithDataReductionProxyEnabled,
    190         original_with_data_reduction_proxy_enabled_values,
    191         original_with_data_reduction_proxy_enabled_count);
    192     VerifyPrefList(
    193         data_reduction_proxy::prefs::
    194             kDailyContentLengthWithDataReductionProxyEnabled,
    195         received_with_data_reduction_proxy_enabled_values,
    196         received_with_data_reduction_proxy_count);
    197     VerifyPrefList(
    198         data_reduction_proxy::prefs::
    199             kDailyOriginalContentLengthViaDataReductionProxy,
    200         original_via_data_reduction_proxy_values,
    201         original_via_data_reduction_proxy_count);
    202     VerifyPrefList(
    203         data_reduction_proxy::prefs::
    204             kDailyContentLengthViaDataReductionProxy,
    205         received_via_data_reduction_proxy_values,
    206         received_via_data_reduction_proxy_count);
    207   }
    208 
    209   // Verify daily data saving pref for request types.
    210   void VerifyDailyRequestTypeContentLengthPrefLists(
    211       const int64* original_values, size_t original_count,
    212       const int64* received_values, size_t received_count,
    213       const int64* original_with_data_reduction_proxy_enabled_values,
    214       size_t original_with_data_reduction_proxy_enabled_count,
    215       const int64* received_with_data_reduction_proxy_enabled_values,
    216       size_t received_with_data_reduction_proxy_count,
    217       const int64* https_with_data_reduction_proxy_enabled_values,
    218       size_t https_with_data_reduction_proxy_enabled_count,
    219       const int64* short_bypass_with_data_reduction_proxy_enabled_values,
    220       size_t short_bypass_with_data_reduction_proxy_enabled_count,
    221       const int64* long_bypass_with_data_reduction_proxy_enabled_values,
    222       size_t long_bypass_with_data_reduction_proxy_enabled_count,
    223       const int64* unknown_with_data_reduction_proxy_enabled_values,
    224       size_t unknown_with_data_reduction_proxy_enabled_count) {
    225     VerifyPrefList(data_reduction_proxy::prefs::kDailyHttpOriginalContentLength,
    226                    original_values, original_count);
    227     VerifyPrefList(data_reduction_proxy::prefs::kDailyHttpReceivedContentLength,
    228                    received_values, received_count);
    229     VerifyPrefList(
    230         data_reduction_proxy::prefs::
    231             kDailyOriginalContentLengthWithDataReductionProxyEnabled,
    232         original_with_data_reduction_proxy_enabled_values,
    233         original_with_data_reduction_proxy_enabled_count);
    234     VerifyPrefList(
    235         data_reduction_proxy::prefs::
    236             kDailyContentLengthWithDataReductionProxyEnabled,
    237         received_with_data_reduction_proxy_enabled_values,
    238         received_with_data_reduction_proxy_count);
    239     VerifyPrefList(
    240         data_reduction_proxy::prefs::
    241             kDailyContentLengthHttpsWithDataReductionProxyEnabled,
    242         https_with_data_reduction_proxy_enabled_values,
    243         https_with_data_reduction_proxy_enabled_count);
    244     VerifyPrefList(
    245         data_reduction_proxy::prefs::
    246             kDailyContentLengthShortBypassWithDataReductionProxyEnabled,
    247         short_bypass_with_data_reduction_proxy_enabled_values,
    248         short_bypass_with_data_reduction_proxy_enabled_count);
    249     VerifyPrefList(
    250         data_reduction_proxy::prefs::
    251             kDailyContentLengthLongBypassWithDataReductionProxyEnabled,
    252         long_bypass_with_data_reduction_proxy_enabled_values,
    253         long_bypass_with_data_reduction_proxy_enabled_count);
    254     VerifyPrefList(
    255         data_reduction_proxy::prefs::
    256             kDailyContentLengthUnknownWithDataReductionProxyEnabled,
    257         unknown_with_data_reduction_proxy_enabled_values,
    258         unknown_with_data_reduction_proxy_enabled_count);
    259   }
    260 
    261  private:
    262   base::Time now_;
    263   base::TimeDelta now_delta_;
    264 };
    265 
    266 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, OneResponse) {
    267   const int64 kOriginalLength = 200;
    268   const int64 kReceivedLength = 100;
    269   int64 original[] = {kOriginalLength};
    270   int64 received[] = {kReceivedLength};
    271 
    272   UpdateContentLengthPrefsForDataReductionProxy(
    273       kReceivedLength, kOriginalLength,
    274       true, VIA_DATA_REDUCTION_PROXY,
    275       FakeNow(), &pref_service_);
    276   VerifyDailyDataSavingContentLengthPrefLists(
    277       original, 1, received, 1,
    278       original, 1, received, 1,
    279       original, 1, received, 1);
    280 }
    281 
    282 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, MultipleResponses) {
    283   const int64 kOriginalLength = 150;
    284   const int64 kReceivedLength = 100;
    285   int64 original[] = {kOriginalLength};
    286   int64 received[] = {kReceivedLength};
    287   UpdateContentLengthPrefsForDataReductionProxy(
    288       kReceivedLength, kOriginalLength,
    289       false, UNKNOWN_TYPE,
    290       FakeNow(), &pref_service_);
    291   VerifyDailyDataSavingContentLengthPrefLists(
    292       original, 1, received, 1,
    293       NULL, 0, NULL, 0, NULL, 0, NULL, 0);
    294 
    295   UpdateContentLengthPrefsForDataReductionProxy(
    296       kReceivedLength, kOriginalLength,
    297       true, UNKNOWN_TYPE,
    298       FakeNow(), &pref_service_);
    299   original[0] += kOriginalLength;
    300   received[0] += kReceivedLength;
    301   int64 original_proxy_enabled[] = {kOriginalLength};
    302   int64 received_proxy_enabled[] = {kReceivedLength};
    303   VerifyDailyDataSavingContentLengthPrefLists(
    304       original, 1, received, 1,
    305       original_proxy_enabled, 1, received_proxy_enabled, 1,
    306       NULL, 0, NULL, 0);
    307 
    308   UpdateContentLengthPrefsForDataReductionProxy(
    309       kReceivedLength, kOriginalLength,
    310       true, VIA_DATA_REDUCTION_PROXY,
    311       FakeNow(), &pref_service_);
    312   original[0] += kOriginalLength;
    313   received[0] += kReceivedLength;
    314   original_proxy_enabled[0] += kOriginalLength;
    315   received_proxy_enabled[0] += kReceivedLength;
    316   int64 original_via_proxy[] = {kOriginalLength};
    317   int64 received_via_proxy[] = {kReceivedLength};
    318   VerifyDailyDataSavingContentLengthPrefLists(
    319       original, 1, received, 1,
    320       original_proxy_enabled, 1, received_proxy_enabled, 1,
    321       original_via_proxy, 1, received_via_proxy, 1);
    322 
    323   UpdateContentLengthPrefsForDataReductionProxy(
    324       kReceivedLength, kOriginalLength,
    325       true, UNKNOWN_TYPE, FakeNow(), &pref_service_);
    326   original[0] += kOriginalLength;
    327   received[0] += kReceivedLength;
    328   original_proxy_enabled[0] += kOriginalLength;
    329   received_proxy_enabled[0] += kReceivedLength;
    330   VerifyDailyDataSavingContentLengthPrefLists(
    331       original, 1, received, 1,
    332       original_proxy_enabled, 1, received_proxy_enabled, 1,
    333       original_via_proxy, 1, received_via_proxy, 1);
    334 
    335   UpdateContentLengthPrefsForDataReductionProxy(
    336       kReceivedLength, kOriginalLength,
    337       false, UNKNOWN_TYPE, FakeNow(), &pref_service_);
    338   original[0] += kOriginalLength;
    339   received[0] += kReceivedLength;
    340   VerifyDailyDataSavingContentLengthPrefLists(
    341       original, 1, received, 1,
    342       original_proxy_enabled, 1, received_proxy_enabled, 1,
    343       original_via_proxy, 1, received_via_proxy, 1);
    344 }
    345 
    346 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, RequestType) {
    347   const int64 kContentLength = 200;
    348   int64 received[] = {0};
    349   int64 https_received[] = {0};
    350   int64 total_received[] = {0};
    351   int64 proxy_enabled_received[] = {0};
    352 
    353   UpdateContentLengthPrefsForDataReductionProxy(
    354       kContentLength, kContentLength,
    355       true, HTTPS,
    356       FakeNow(), &pref_service_);
    357   total_received[0] += kContentLength;
    358   proxy_enabled_received[0] += kContentLength;
    359   https_received[0] += kContentLength;
    360   VerifyDailyRequestTypeContentLengthPrefLists(
    361       total_received, 1, total_received, 1,
    362       proxy_enabled_received, 1, proxy_enabled_received, 1,
    363       https_received, 1,
    364       received, 0,  // short bypass
    365       received, 0,  // long bypass
    366       received, 0);  // unknown
    367 
    368   // Data reduction proxy is not enabled.
    369   UpdateContentLengthPrefsForDataReductionProxy(
    370       kContentLength, kContentLength,
    371       false, HTTPS,
    372       FakeNow(), &pref_service_);
    373   total_received[0] += kContentLength;
    374   VerifyDailyRequestTypeContentLengthPrefLists(
    375       total_received, 1, total_received, 1,
    376       proxy_enabled_received, 1, proxy_enabled_received, 1,
    377       https_received, 1,
    378       received, 0,  // short bypass
    379       received, 0,  // long bypass
    380       received, 0);  // unknown
    381 
    382   UpdateContentLengthPrefsForDataReductionProxy(
    383       kContentLength, kContentLength,
    384       true, HTTPS,
    385       FakeNow(), &pref_service_);
    386   total_received[0] += kContentLength;
    387   proxy_enabled_received[0] += kContentLength;
    388   https_received[0] += kContentLength;
    389   VerifyDailyRequestTypeContentLengthPrefLists(
    390       total_received, 1, total_received, 1,
    391       proxy_enabled_received, 1, proxy_enabled_received, 1,
    392       https_received, 1,
    393       received, 0,  // short bypass
    394       received, 0,  // long bypass
    395       received, 0);  // unknown
    396 
    397   UpdateContentLengthPrefsForDataReductionProxy(
    398       kContentLength, kContentLength,
    399       true, SHORT_BYPASS,
    400       FakeNow(), &pref_service_);
    401   total_received[0] += kContentLength;
    402   proxy_enabled_received[0] += kContentLength;
    403   received[0] += kContentLength;
    404   VerifyDailyRequestTypeContentLengthPrefLists(
    405       total_received, 1, total_received, 1,
    406       proxy_enabled_received, 1, proxy_enabled_received, 1,
    407       https_received, 1,
    408       received, 1,  // short bypass
    409       received, 0,  // long bypass
    410       received, 0);  // unknown
    411 
    412   UpdateContentLengthPrefsForDataReductionProxy(
    413       kContentLength, kContentLength,
    414       true, LONG_BYPASS,
    415       FakeNow(), &pref_service_);
    416   total_received[0] += kContentLength;
    417   proxy_enabled_received[0] += kContentLength;
    418   VerifyDailyRequestTypeContentLengthPrefLists(
    419       total_received, 1, total_received, 1,  // total
    420       proxy_enabled_received, 1, proxy_enabled_received, 1,
    421       https_received, 1,
    422       received, 1,  // short bypass
    423       received, 1,  // long bypass
    424       received, 0);  // unknown
    425 
    426   UpdateContentLengthPrefsForDataReductionProxy(
    427       kContentLength, kContentLength,
    428       true, UNKNOWN_TYPE,
    429       FakeNow(), &pref_service_);
    430   total_received[0] += kContentLength;
    431   proxy_enabled_received[0] += kContentLength;
    432   VerifyDailyRequestTypeContentLengthPrefLists(
    433       total_received, 1, total_received, 1,
    434       proxy_enabled_received, 1, proxy_enabled_received, 1,
    435       https_received, 1,
    436       received, 1,  // short bypass
    437       received, 1,  // long bypass
    438       received, 1);  // unknown
    439 }
    440 
    441 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, ForwardOneDay) {
    442   const int64 kOriginalLength = 200;
    443   const int64 kReceivedLength = 100;
    444 
    445   UpdateContentLengthPrefsForDataReductionProxy(
    446       kReceivedLength, kOriginalLength,
    447       true, VIA_DATA_REDUCTION_PROXY,
    448       FakeNow(), &pref_service_);
    449 
    450   // Forward one day.
    451   SetFakeTimeDeltaInHours(24);
    452 
    453   // Proxy not enabled. Not via proxy.
    454   UpdateContentLengthPrefsForDataReductionProxy(
    455       kReceivedLength, kOriginalLength,
    456       false, UNKNOWN_TYPE, FakeNow(), &pref_service_);
    457 
    458   int64 original[] = {kOriginalLength, kOriginalLength};
    459   int64 received[] = {kReceivedLength, kReceivedLength};
    460   int64 original_with_data_reduction_proxy_enabled[] = {kOriginalLength, 0};
    461   int64 received_with_data_reduction_proxy_enabled[] = {kReceivedLength, 0};
    462   int64 original_via_data_reduction_proxy[] = {kOriginalLength, 0};
    463   int64 received_via_data_reduction_proxy[] = {kReceivedLength, 0};
    464   VerifyDailyDataSavingContentLengthPrefLists(
    465       original, 2,
    466       received, 2,
    467       original_with_data_reduction_proxy_enabled, 2,
    468       received_with_data_reduction_proxy_enabled, 2,
    469       original_via_data_reduction_proxy, 2,
    470       received_via_data_reduction_proxy, 2);
    471 
    472   // Proxy enabled. Not via proxy.
    473   UpdateContentLengthPrefsForDataReductionProxy(
    474       kReceivedLength, kOriginalLength,
    475       true, UNKNOWN_TYPE, FakeNow(), &pref_service_);
    476   original[1] += kOriginalLength;
    477   received[1] += kReceivedLength;
    478   original_with_data_reduction_proxy_enabled[1] += kOriginalLength;
    479   received_with_data_reduction_proxy_enabled[1] += kReceivedLength;
    480   VerifyDailyDataSavingContentLengthPrefLists(
    481       original, 2,
    482       received, 2,
    483       original_with_data_reduction_proxy_enabled, 2,
    484       received_with_data_reduction_proxy_enabled, 2,
    485       original_via_data_reduction_proxy, 2,
    486       received_via_data_reduction_proxy, 2);
    487 
    488   // Proxy enabled and via proxy.
    489   UpdateContentLengthPrefsForDataReductionProxy(
    490       kReceivedLength, kOriginalLength,
    491       true, VIA_DATA_REDUCTION_PROXY,
    492       FakeNow(), &pref_service_);
    493   original[1] += kOriginalLength;
    494   received[1] += kReceivedLength;
    495   original_with_data_reduction_proxy_enabled[1] += kOriginalLength;
    496   received_with_data_reduction_proxy_enabled[1] += kReceivedLength;
    497   original_via_data_reduction_proxy[1] += kOriginalLength;
    498   received_via_data_reduction_proxy[1] += kReceivedLength;
    499   VerifyDailyDataSavingContentLengthPrefLists(
    500       original, 2,
    501       received, 2,
    502       original_with_data_reduction_proxy_enabled, 2,
    503       received_with_data_reduction_proxy_enabled, 2,
    504       original_via_data_reduction_proxy, 2,
    505       received_via_data_reduction_proxy, 2);
    506 }
    507 
    508 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, PartialDayTimeChange) {
    509   const int64 kOriginalLength = 200;
    510   const int64 kReceivedLength = 100;
    511   int64 original[] = {0, kOriginalLength};
    512   int64 received[] = {0, kReceivedLength};
    513 
    514   UpdateContentLengthPrefsForDataReductionProxy(
    515       kReceivedLength, kOriginalLength,
    516       true, VIA_DATA_REDUCTION_PROXY,
    517       FakeNow(), &pref_service_);
    518   VerifyDailyDataSavingContentLengthPrefLists(
    519       original, 2, received, 2,
    520       original, 2, received, 2,
    521       original, 2, received, 2);
    522 
    523   // Forward 10 hours, stay in the same day.
    524   // See kLastUpdateTime: "Now" in test is 03:45am.
    525   SetFakeTimeDeltaInHours(10);
    526   UpdateContentLengthPrefsForDataReductionProxy(
    527       kReceivedLength, kOriginalLength,
    528       true, VIA_DATA_REDUCTION_PROXY,
    529       FakeNow(), &pref_service_);
    530   original[1] += kOriginalLength;
    531   received[1] += kReceivedLength;
    532   VerifyDailyDataSavingContentLengthPrefLists(
    533       original, 2, received, 2,
    534       original, 2, received, 2,
    535       original, 2, received, 2);
    536 
    537   // Forward 11 more hours, comes to tomorrow.
    538   AddFakeTimeDeltaInHours(11);
    539   UpdateContentLengthPrefsForDataReductionProxy(
    540       kReceivedLength, kOriginalLength,
    541       true, VIA_DATA_REDUCTION_PROXY,
    542       FakeNow(), &pref_service_);
    543   int64 original2[] = {kOriginalLength * 2, kOriginalLength};
    544   int64 received2[] = {kReceivedLength * 2, kReceivedLength};
    545   VerifyDailyDataSavingContentLengthPrefLists(
    546       original2, 2, received2, 2,
    547       original2, 2, received2, 2,
    548       original2, 2, received2, 2);
    549 }
    550 
    551 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, ForwardMultipleDays) {
    552   const int64 kOriginalLength = 200;
    553   const int64 kReceivedLength = 100;
    554   UpdateContentLengthPrefsForDataReductionProxy(
    555       kReceivedLength, kOriginalLength,
    556       true, VIA_DATA_REDUCTION_PROXY,
    557       FakeNow(), &pref_service_);
    558 
    559   // Forward three days.
    560   SetFakeTimeDeltaInHours(3 * 24);
    561 
    562   UpdateContentLengthPrefsForDataReductionProxy(
    563       kReceivedLength, kOriginalLength,
    564       true, VIA_DATA_REDUCTION_PROXY,
    565       FakeNow(), &pref_service_);
    566 
    567   int64 original[] = {kOriginalLength, 0, 0, kOriginalLength};
    568   int64 received[] = {kReceivedLength, 0, 0, kReceivedLength};
    569   VerifyDailyDataSavingContentLengthPrefLists(
    570       original, 4, received, 4,
    571       original, 4, received, 4,
    572       original, 4, received, 4);
    573 
    574   // Forward four more days.
    575   AddFakeTimeDeltaInHours(4 * 24);
    576   UpdateContentLengthPrefsForDataReductionProxy(
    577       kReceivedLength, kOriginalLength,
    578       true, VIA_DATA_REDUCTION_PROXY,
    579       FakeNow(), &pref_service_);
    580   int64 original2[] = {
    581     kOriginalLength, 0, 0, kOriginalLength, 0, 0, 0, kOriginalLength,
    582   };
    583   int64 received2[] = {
    584     kReceivedLength, 0, 0, kReceivedLength, 0, 0, 0, kReceivedLength,
    585   };
    586   VerifyDailyDataSavingContentLengthPrefLists(
    587       original2, 8, received2, 8,
    588       original2, 8, received2, 8,
    589       original2, 8, received2, 8);
    590 
    591   // Forward |kNumDaysInHistory| more days.
    592   AddFakeTimeDeltaInHours(kNumDaysInHistory * 24);
    593   UpdateContentLengthPrefsForDataReductionProxy(
    594       kReceivedLength, kOriginalLength,
    595       true, VIA_DATA_REDUCTION_PROXY,
    596       FakeNow(), &pref_service_);
    597   int64 original3[] = {kOriginalLength};
    598   int64 received3[] = {kReceivedLength};
    599   VerifyDailyDataSavingContentLengthPrefLists(
    600       original3, 1, received3, 1,
    601       original3, 1, received3, 1,
    602       original3, 1, received3, 1);
    603 
    604   // Forward |kNumDaysInHistory| + 1 more days.
    605   AddFakeTimeDeltaInHours((kNumDaysInHistory + 1)* 24);
    606   UpdateContentLengthPrefsForDataReductionProxy(
    607       kReceivedLength, kOriginalLength,
    608       true, VIA_DATA_REDUCTION_PROXY,
    609       FakeNow(), &pref_service_);
    610   VerifyDailyDataSavingContentLengthPrefLists(
    611       original3, 1, received3, 1,
    612       original3, 1, received3, 1,
    613       original3, 1, received3, 1);
    614 }
    615 
    616 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, BackwardAndForwardOneDay) {
    617   const int64 kOriginalLength = 200;
    618   const int64 kReceivedLength = 100;
    619   int64 original[] = {kOriginalLength};
    620   int64 received[] = {kReceivedLength};
    621 
    622   UpdateContentLengthPrefsForDataReductionProxy(
    623       kReceivedLength, kOriginalLength,
    624       true, VIA_DATA_REDUCTION_PROXY,
    625       FakeNow(), &pref_service_);
    626 
    627   // Backward one day.
    628   SetFakeTimeDeltaInHours(-24);
    629   UpdateContentLengthPrefsForDataReductionProxy(
    630       kReceivedLength, kOriginalLength,
    631       true, VIA_DATA_REDUCTION_PROXY,
    632       FakeNow(), &pref_service_);
    633   original[0] += kOriginalLength;
    634   received[0] += kReceivedLength;
    635   VerifyDailyDataSavingContentLengthPrefLists(
    636       original, 1, received, 1,
    637       original, 1, received, 1,
    638       original, 1, received, 1);
    639 
    640   // Then, Forward one day
    641   AddFakeTimeDeltaInHours(24);
    642   UpdateContentLengthPrefsForDataReductionProxy(
    643       kReceivedLength, kOriginalLength,
    644       true, VIA_DATA_REDUCTION_PROXY,
    645       FakeNow(), &pref_service_);
    646   int64 original2[] = {kOriginalLength * 2, kOriginalLength};
    647   int64 received2[] = {kReceivedLength * 2, kReceivedLength};
    648   VerifyDailyDataSavingContentLengthPrefLists(
    649       original2, 2, received2, 2,
    650       original2, 2, received2, 2,
    651       original2, 2, received2, 2);
    652 }
    653 
    654 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, BackwardTwoDays) {
    655   const int64 kOriginalLength = 200;
    656   const int64 kReceivedLength = 100;
    657   int64 original[] = {kOriginalLength};
    658   int64 received[] = {kReceivedLength};
    659 
    660   UpdateContentLengthPrefsForDataReductionProxy(
    661       kReceivedLength, kOriginalLength,
    662       true, VIA_DATA_REDUCTION_PROXY,
    663       FakeNow(), &pref_service_);
    664   // Backward two days.
    665   SetFakeTimeDeltaInHours(-2 * 24);
    666   UpdateContentLengthPrefsForDataReductionProxy(
    667       kReceivedLength, kOriginalLength,
    668       true, VIA_DATA_REDUCTION_PROXY,
    669       FakeNow(), &pref_service_);
    670   VerifyDailyDataSavingContentLengthPrefLists(
    671       original, 1, received, 1,
    672       original, 1, received, 1,
    673       original, 1, received, 1);
    674 }
    675 
    676 }  // namespace data_reduction_proxy
    677