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