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.
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"
22 const size_t kNumDaysInHistory = 60;
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));
30 EXPECT_TRUE(base::StringToInt64(string_value, &value));
36 namespace data_reduction_proxy {
38 // Test UpdateContentLengthPrefs.
39 class ChromeNetworkDataSavingMetricsTest : public testing::Test {
41 ChromeNetworkDataSavingMetricsTest() {}
43 virtual void SetUp() OVERRIDE {
44 statistics_prefs_.reset(new DataReductionProxyStatisticsPrefs(
46 scoped_refptr<base::TestSimpleTaskRunner>(
47 new base::TestSimpleTaskRunner()),
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);
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);
90 TestingPrefServiceSimple pref_service_;
91 scoped_ptr<DataReductionProxyStatisticsPrefs> statistics_prefs_;
94 TEST_F(ChromeNetworkDataSavingMetricsTest, TotalLengths) {
95 const int64 kOriginalLength = 200;
96 const int64 kReceivedLength = 100;
98 UpdateContentLengthPrefs(
99 kReceivedLength, kOriginalLength,
100 &pref_service_, UNKNOWN_TYPE, statistics_prefs_.get());
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));
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());
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));
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";
132 class ChromeNetworkDailyDataSavingMetricsTest
133 : public ChromeNetworkDataSavingMetricsTest {
135 ChromeNetworkDailyDataSavingMetricsTest() {
136 base::Time::FromString(kLastUpdateTime, &now_);
139 virtual void SetUp() OVERRIDE {
140 ChromeNetworkDataSavingMetricsTest::SetUp();
142 // Only create two lists in Setup to test that adding new lists is fine.
144 data_reduction_proxy::prefs::kDailyHttpOriginalContentLength);
146 data_reduction_proxy::prefs::kDailyHttpReceivedContentLength);
149 base::Time FakeNow() const {
150 return now_ + now_delta_;
153 void SetFakeTimeDeltaInHours(int hours) {
154 now_delta_ = base::TimeDelta::FromHours(hours);
157 void AddFakeTimeDeltaInHours(int hours) {
158 now_delta_ += base::TimeDelta::FromHours(hours);
161 // Create daily pref list of |kNumDaysInHistory| zero values.
162 void CreatePrefList(const char* pref) {
163 base::ListValue* update = statistics_prefs_->GetList(pref);
165 for (size_t i = 0; i < kNumDaysInHistory; ++i) {
166 update->Insert(0, new base::StringValue(base::Int64ToString(0)));
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
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;
178 for (size_t i = 0; i < count; ++i) {
181 GetListPrefInt64Value(*update, kNumDaysInHistory - count + i))
182 << "index=" << (kNumDaysInHistory - count + i);
184 for (size_t i = 0; i < kNumDaysInHistory - count; ++i) {
185 EXPECT_EQ(0, GetListPrefInt64Value(*update, i)) << "index=" << i;
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);
206 data_reduction_proxy::prefs::
207 kDailyOriginalContentLengthWithDataReductionProxyEnabled,
208 original_with_data_reduction_proxy_enabled_values,
209 original_with_data_reduction_proxy_enabled_count);
211 data_reduction_proxy::prefs::
212 kDailyContentLengthWithDataReductionProxyEnabled,
213 received_with_data_reduction_proxy_enabled_values,
214 received_with_data_reduction_proxy_count);
216 data_reduction_proxy::prefs::
217 kDailyOriginalContentLengthViaDataReductionProxy,
218 original_via_data_reduction_proxy_values,
219 original_via_data_reduction_proxy_count);
221 data_reduction_proxy::prefs::
222 kDailyContentLengthViaDataReductionProxy,
223 received_via_data_reduction_proxy_values,
224 received_via_data_reduction_proxy_count);
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);
248 data_reduction_proxy::prefs::
249 kDailyOriginalContentLengthWithDataReductionProxyEnabled,
250 original_with_data_reduction_proxy_enabled_values,
251 original_with_data_reduction_proxy_enabled_count);
253 data_reduction_proxy::prefs::
254 kDailyContentLengthWithDataReductionProxyEnabled,
255 received_with_data_reduction_proxy_enabled_values,
256 received_with_data_reduction_proxy_count);
258 data_reduction_proxy::prefs::
259 kDailyContentLengthHttpsWithDataReductionProxyEnabled,
260 https_with_data_reduction_proxy_enabled_values,
261 https_with_data_reduction_proxy_enabled_count);
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);
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);
273 data_reduction_proxy::prefs::
274 kDailyContentLengthUnknownWithDataReductionProxyEnabled,
275 unknown_with_data_reduction_proxy_enabled_values,
276 unknown_with_data_reduction_proxy_enabled_count);
281 base::TimeDelta now_delta_;
284 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, OneResponse) {
285 const int64 kOriginalLength = 200;
286 const int64 kReceivedLength = 100;
287 int64 original[] = {kOriginalLength};
288 int64 received[] = {kReceivedLength};
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);
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,
308 FakeNow(), statistics_prefs_.get());
309 VerifyDailyDataSavingContentLengthPrefLists(
310 original, 1, received, 1,
311 NULL, 0, NULL, 0, NULL, 0, NULL, 0);
313 UpdateContentLengthPrefsForDataReductionProxy(
314 kReceivedLength, kOriginalLength,
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,
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);
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);
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);
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};
371 UpdateContentLengthPrefsForDataReductionProxy(
372 kContentLength, kContentLength,
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,
382 received, 0, // short bypass
383 received, 0, // long bypass
384 received, 0); // unknown
386 // Data reduction proxy is not enabled.
387 UpdateContentLengthPrefsForDataReductionProxy(
388 kContentLength, kContentLength,
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,
396 received, 0, // short bypass
397 received, 0, // long bypass
398 received, 0); // unknown
400 UpdateContentLengthPrefsForDataReductionProxy(
401 kContentLength, kContentLength,
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,
411 received, 0, // short bypass
412 received, 0, // long bypass
413 received, 0); // unknown
415 UpdateContentLengthPrefsForDataReductionProxy(
416 kContentLength, kContentLength,
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,
426 received, 1, // short bypass
427 received, 0, // long bypass
428 received, 0); // unknown
430 UpdateContentLengthPrefsForDataReductionProxy(
431 kContentLength, kContentLength,
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,
440 received, 1, // short bypass
441 received, 1, // long bypass
442 received, 0); // unknown
444 UpdateContentLengthPrefsForDataReductionProxy(
445 kContentLength, kContentLength,
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,
454 received, 1, // short bypass
455 received, 1, // long bypass
456 received, 1); // unknown
459 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, ForwardOneDay) {
460 const int64 kOriginalLength = 200;
461 const int64 kReceivedLength = 100;
463 UpdateContentLengthPrefsForDataReductionProxy(
464 kReceivedLength, kOriginalLength,
465 true, VIA_DATA_REDUCTION_PROXY,
466 FakeNow(), statistics_prefs_.get());
469 SetFakeTimeDeltaInHours(24);
471 // Proxy not enabled. Not via proxy.
472 UpdateContentLengthPrefsForDataReductionProxy(
473 kReceivedLength, kOriginalLength,
474 false, UNKNOWN_TYPE, FakeNow(), statistics_prefs_.get());
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(
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);
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(
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);
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(
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);
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};
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);
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);
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);
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());
577 // Forward three days.
578 SetFakeTimeDeltaInHours(3 * 24);
580 UpdateContentLengthPrefsForDataReductionProxy(
581 kReceivedLength, kOriginalLength,
582 true, VIA_DATA_REDUCTION_PROXY,
583 FakeNow(), statistics_prefs_.get());
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);
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,
601 int64 received2[] = {
602 kReceivedLength, 0, 0, kReceivedLength, 0, 0, 0, kReceivedLength,
604 VerifyDailyDataSavingContentLengthPrefLists(
605 original2, 8, received2, 8,
606 original2, 8, received2, 8,
607 original2, 8, received2, 8);
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);
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);
634 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, BackwardAndForwardOneDay) {
635 const int64 kOriginalLength = 200;
636 const int64 kReceivedLength = 100;
637 int64 original[] = {kOriginalLength};
638 int64 received[] = {kReceivedLength};
640 UpdateContentLengthPrefsForDataReductionProxy(
641 kReceivedLength, kOriginalLength,
642 true, VIA_DATA_REDUCTION_PROXY,
643 FakeNow(), statistics_prefs_.get());
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);
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);
672 TEST_F(ChromeNetworkDailyDataSavingMetricsTest, BackwardTwoDays) {
673 const int64 kOriginalLength = 200;
674 const int64 kReceivedLength = 100;
675 int64 original[] = {kOriginalLength};
676 int64 received[] = {kReceivedLength};
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);
694 } // namespace data_reduction_proxy