1 // Copyright 2016 The Chromium Authors
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/metrics/data_use_tracker.h"
6
7 #include "base/time/time.h"
8 #include "base/values.h"
9 #include "components/metrics/metrics_pref_names.h"
10 #include "components/prefs/pref_registry_simple.h"
11 #include "components/prefs/testing_pref_service.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace metrics {
15
16 namespace {
17
18 const char kTodayStr[] = "2016-03-16";
19 const char kYesterdayStr[] = "2016-03-15";
20 const char kExpiredDateStr1[] = "2016-03-09";
21 const char kExpiredDateStr2[] = "2016-03-01";
22
23 class TestDataUsePrefService : public TestingPrefServiceSimple {
24 public:
TestDataUsePrefService()25 TestDataUsePrefService() { DataUseTracker::RegisterPrefs(registry()); }
26
27 TestDataUsePrefService(const TestDataUsePrefService&) = delete;
28 TestDataUsePrefService& operator=(const TestDataUsePrefService&) = delete;
29
ClearDataUsePrefs()30 void ClearDataUsePrefs() {
31 ClearPref(metrics::prefs::kUserCellDataUse);
32 ClearPref(metrics::prefs::kUmaCellDataUse);
33 }
34 };
35
36 class FakeDataUseTracker : public DataUseTracker {
37 public:
FakeDataUseTracker(PrefService * local_state)38 FakeDataUseTracker(PrefService* local_state) : DataUseTracker(local_state) {}
39
40 FakeDataUseTracker(const FakeDataUseTracker&) = delete;
41 FakeDataUseTracker& operator=(const FakeDataUseTracker&) = delete;
42
GetCurrentMeasurementDate() const43 base::Time GetCurrentMeasurementDate() const override {
44 base::Time today_for_test;
45 EXPECT_TRUE(base::Time::FromUTCString(kTodayStr, &today_for_test));
46 return today_for_test;
47 }
48
GetCurrentMeasurementDateAsString() const49 std::string GetCurrentMeasurementDateAsString() const override {
50 return kTodayStr;
51 }
52 };
53
54 // Sets up data usage prefs with mock values so that UMA traffic is above the
55 // allowed ratio.
SetPrefTestValuesOverRatio(PrefService * local_state)56 void SetPrefTestValuesOverRatio(PrefService* local_state) {
57 base::Value::Dict user_pref_dict;
58 user_pref_dict.Set(kTodayStr, 2 * 100 * 1024);
59 user_pref_dict.Set(kYesterdayStr, 2 * 100 * 1024);
60 user_pref_dict.Set(kExpiredDateStr1, 2 * 100 * 1024);
61 user_pref_dict.Set(kExpiredDateStr2, 2 * 100 * 1024);
62 local_state->SetDict(prefs::kUserCellDataUse, std::move(user_pref_dict));
63
64 base::Value::Dict uma_pref_dict;
65 uma_pref_dict.Set(kTodayStr, 50 * 1024);
66 uma_pref_dict.Set(kYesterdayStr, 50 * 1024);
67 uma_pref_dict.Set(kExpiredDateStr1, 50 * 1024);
68 uma_pref_dict.Set(kExpiredDateStr2, 50 * 1024);
69 local_state->SetDict(prefs::kUmaCellDataUse, std::move(uma_pref_dict));
70 }
71
72 // Sets up data usage prefs with mock values which can be valid.
SetPrefTestValuesValidRatio(PrefService * local_state)73 void SetPrefTestValuesValidRatio(PrefService* local_state) {
74 base::Value::Dict user_pref_dict;
75 user_pref_dict.Set(kTodayStr, 100 * 100 * 1024);
76 user_pref_dict.Set(kYesterdayStr, 100 * 100 * 1024);
77 user_pref_dict.Set(kExpiredDateStr1, 100 * 100 * 1024);
78 user_pref_dict.Set(kExpiredDateStr2, 100 * 100 * 1024);
79 local_state->SetDict(prefs::kUserCellDataUse, std::move(user_pref_dict));
80
81 // Should be 4% of user traffic
82 base::Value::Dict uma_pref_dict;
83 uma_pref_dict.Set(kTodayStr, 4 * 100 * 1024);
84 uma_pref_dict.Set(kYesterdayStr, 4 * 100 * 1024);
85 uma_pref_dict.Set(kExpiredDateStr1, 4 * 100 * 1024);
86 uma_pref_dict.Set(kExpiredDateStr2, 4 * 100 * 1024);
87 local_state->SetDict(prefs::kUmaCellDataUse, std::move(uma_pref_dict));
88 }
89
90 } // namespace
91
TEST(DataUseTrackerTest,CheckUpdateUsagePref)92 TEST(DataUseTrackerTest, CheckUpdateUsagePref) {
93 TestDataUsePrefService local_state;
94 FakeDataUseTracker data_use_tracker(&local_state);
95 local_state.ClearDataUsePrefs();
96
97 data_use_tracker.UpdateMetricsUsagePrefsInternal(2 * 100 * 1024, true, false);
98 EXPECT_EQ(2 * 100 * 1024,
99 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kTodayStr));
100 EXPECT_FALSE(local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kTodayStr));
101
102 data_use_tracker.UpdateMetricsUsagePrefsInternal(100 * 1024, true, true);
103 EXPECT_EQ(3 * 100 * 1024,
104 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kTodayStr));
105 EXPECT_EQ(100 * 1024,
106 local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kTodayStr));
107 }
108
TEST(DataUseTrackerTest,CheckRemoveExpiredEntries)109 TEST(DataUseTrackerTest, CheckRemoveExpiredEntries) {
110 TestDataUsePrefService local_state;
111 FakeDataUseTracker data_use_tracker(&local_state);
112 local_state.ClearDataUsePrefs();
113 SetPrefTestValuesOverRatio(&local_state);
114 data_use_tracker.RemoveExpiredEntries();
115
116 EXPECT_FALSE(
117 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kExpiredDateStr1));
118 EXPECT_FALSE(
119 local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kExpiredDateStr1));
120
121 EXPECT_FALSE(
122 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kExpiredDateStr2));
123 EXPECT_FALSE(
124 local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kExpiredDateStr2));
125
126 EXPECT_EQ(2 * 100 * 1024,
127 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kTodayStr));
128 EXPECT_EQ(50 * 1024,
129 local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kTodayStr));
130
131 EXPECT_EQ(
132 2 * 100 * 1024,
133 local_state.GetDict(prefs::kUserCellDataUse).FindInt(kYesterdayStr));
134 EXPECT_EQ(50 * 1024,
135 local_state.GetDict(prefs::kUmaCellDataUse).FindInt(kYesterdayStr));
136 }
137
TEST(DataUseTrackerTest,CheckComputeTotalDataUse)138 TEST(DataUseTrackerTest, CheckComputeTotalDataUse) {
139 TestDataUsePrefService local_state;
140 FakeDataUseTracker data_use_tracker(&local_state);
141 local_state.ClearDataUsePrefs();
142 SetPrefTestValuesOverRatio(&local_state);
143
144 int user_data_use =
145 data_use_tracker.ComputeTotalDataUse(prefs::kUserCellDataUse);
146 EXPECT_EQ(8 * 100 * 1024, user_data_use);
147 int uma_data_use =
148 data_use_tracker.ComputeTotalDataUse(prefs::kUmaCellDataUse);
149 EXPECT_EQ(4 * 50 * 1024, uma_data_use);
150 }
151
TEST(DataUseTrackerTest,CheckShouldUploadLogOnCellular)152 TEST(DataUseTrackerTest, CheckShouldUploadLogOnCellular) {
153 TestDataUsePrefService local_state;
154 FakeDataUseTracker data_use_tracker(&local_state);
155 local_state.ClearDataUsePrefs();
156 SetPrefTestValuesOverRatio(&local_state);
157
158 bool can_upload = data_use_tracker.ShouldUploadLogOnCellular(50 * 1024);
159 EXPECT_TRUE(can_upload);
160 can_upload = data_use_tracker.ShouldUploadLogOnCellular(100 * 1024);
161 EXPECT_TRUE(can_upload);
162 can_upload = data_use_tracker.ShouldUploadLogOnCellular(150 * 1024);
163 EXPECT_FALSE(can_upload);
164
165 local_state.ClearDataUsePrefs();
166 SetPrefTestValuesValidRatio(&local_state);
167 can_upload = data_use_tracker.ShouldUploadLogOnCellular(100 * 1024);
168 EXPECT_TRUE(can_upload);
169 // this is about 0.49%
170 can_upload = data_use_tracker.ShouldUploadLogOnCellular(200 * 1024);
171 EXPECT_TRUE(can_upload);
172 can_upload = data_use_tracker.ShouldUploadLogOnCellular(300 * 1024);
173 EXPECT_FALSE(can_upload);
174 }
175
176 } // namespace metrics
177