blob: b571dc4f2e329c7d33a72c309a1df332ada6e254 [file] [log] [blame]
gayane0b46091c2016-04-07 21:01:051// Copyright 2016 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/metrics/data_use_tracker.h"
6
7#include "base/strings/stringprintf.h"
8#include "components/metrics/metrics_pref_names.h"
9#include "components/prefs/pref_registry_simple.h"
10#include "components/prefs/testing_pref_service.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace metrics {
14
15namespace {
16
17const char kTodayStr[] = "2016-03-16";
18const char kYesterdayStr[] = "2016-03-15";
19const char kExpiredDateStr1[] = "2016-03-09";
20const char kExpiredDateStr2[] = "2016-03-01";
21
22class TestDataUsePrefService : public TestingPrefServiceSimple {
23 public:
holte77d815b2017-03-27 21:27:3724 TestDataUsePrefService() { DataUseTracker::RegisterPrefs(registry()); }
gayane0b46091c2016-04-07 21:01:0525
26 void ClearDataUsePrefs() {
27 ClearPref(metrics::prefs::kUserCellDataUse);
28 ClearPref(metrics::prefs::kUmaCellDataUse);
29 }
30
31 private:
32 DISALLOW_COPY_AND_ASSIGN(TestDataUsePrefService);
33};
34
35class FakeDataUseTracker : public DataUseTracker {
36 public:
37 FakeDataUseTracker(PrefService* local_state) : DataUseTracker(local_state) {}
38
39 bool GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const override {
40 *uma_weekly_quota_bytes = 200;
41 return true;
42 }
43
44 bool GetUmaRatio(double* ratio) const override {
45 *ratio = 0.05;
46 return true;
47 }
48
49 base::Time GetCurrentMeasurementDate() const override {
50 base::Time today_for_test;
digit2c8eed342017-01-12 20:49:4151 EXPECT_TRUE(base::Time::FromUTCString(kTodayStr, &today_for_test));
gayane0b46091c2016-04-07 21:01:0552 return today_for_test;
53 }
54
55 std::string GetCurrentMeasurementDateAsString() const override {
56 return kTodayStr;
57 }
58
59 private:
60 DISALLOW_COPY_AND_ASSIGN(FakeDataUseTracker);
61};
62
63// Sets up data usage prefs with mock values so that UMA traffic is above the
64// allowed ratio.
65void SetPrefTestValuesOverRatio(PrefService* local_state) {
66 base::DictionaryValue user_pref_dict;
67 user_pref_dict.SetInteger(kTodayStr, 2 * 100);
68 user_pref_dict.SetInteger(kYesterdayStr, 2 * 100);
69 user_pref_dict.SetInteger(kExpiredDateStr1, 2 * 100);
70 user_pref_dict.SetInteger(kExpiredDateStr2, 2 * 100);
71 local_state->Set(prefs::kUserCellDataUse, user_pref_dict);
72
73 base::DictionaryValue uma_pref_dict;
74 uma_pref_dict.SetInteger(kTodayStr, 50);
75 uma_pref_dict.SetInteger(kYesterdayStr, 50);
76 uma_pref_dict.SetInteger(kExpiredDateStr1, 50);
77 uma_pref_dict.SetInteger(kExpiredDateStr2, 50);
78 local_state->Set(prefs::kUmaCellDataUse, uma_pref_dict);
79}
80
81// Sets up data usage prefs with mock values which can be valid.
82void SetPrefTestValuesValidRatio(PrefService* local_state) {
83 base::DictionaryValue user_pref_dict;
84 user_pref_dict.SetInteger(kTodayStr, 100 * 100);
85 user_pref_dict.SetInteger(kYesterdayStr, 100 * 100);
86 user_pref_dict.SetInteger(kExpiredDateStr1, 100 * 100);
87 user_pref_dict.SetInteger(kExpiredDateStr2, 100 * 100);
88 local_state->Set(prefs::kUserCellDataUse, user_pref_dict);
89
90 // Should be 4% of user traffic
91 base::DictionaryValue uma_pref_dict;
92 uma_pref_dict.SetInteger(kTodayStr, 4 * 100);
93 uma_pref_dict.SetInteger(kYesterdayStr, 4 * 100);
94 uma_pref_dict.SetInteger(kExpiredDateStr1, 4 * 100);
95 uma_pref_dict.SetInteger(kExpiredDateStr2, 4 * 100);
96 local_state->Set(prefs::kUmaCellDataUse, uma_pref_dict);
97}
98
99} // namespace
100
101TEST(DataUseTrackerTest, CheckUpdateUsagePref) {
102 TestDataUsePrefService local_state;
103 FakeDataUseTracker data_use_tracker(&local_state);
104 local_state.ClearDataUsePrefs();
105
106 int user_pref_value = 0;
107 int uma_pref_value = 0;
108
rajendrantdce70a02018-10-12 06:24:24109 data_use_tracker.UpdateMetricsUsagePrefs(2 * 100, true, false);
gayane0b46091c2016-04-07 21:01:05110 local_state.GetDictionary(prefs::kUserCellDataUse)
111 ->GetInteger(kTodayStr, &user_pref_value);
112 EXPECT_EQ(2 * 100, user_pref_value);
113 local_state.GetDictionary(prefs::kUmaCellDataUse)
114 ->GetInteger(kTodayStr, &uma_pref_value);
115 EXPECT_EQ(0, uma_pref_value);
116
rajendrantdce70a02018-10-12 06:24:24117 data_use_tracker.UpdateMetricsUsagePrefs(100, true, true);
gayane0b46091c2016-04-07 21:01:05118 local_state.GetDictionary(prefs::kUserCellDataUse)
119 ->GetInteger(kTodayStr, &user_pref_value);
120 EXPECT_EQ(3 * 100, user_pref_value);
121 local_state.GetDictionary(prefs::kUmaCellDataUse)
122 ->GetInteger(kTodayStr, &uma_pref_value);
123 EXPECT_EQ(100, uma_pref_value);
124}
125
126TEST(DataUseTrackerTest, CheckRemoveExpiredEntries) {
127 TestDataUsePrefService local_state;
128 FakeDataUseTracker data_use_tracker(&local_state);
129 local_state.ClearDataUsePrefs();
130 SetPrefTestValuesOverRatio(&local_state);
131 data_use_tracker.RemoveExpiredEntries();
132
133 int user_pref_value = 0;
134 int uma_pref_value = 0;
135
136 local_state.GetDictionary(prefs::kUserCellDataUse)
137 ->GetInteger(kExpiredDateStr1, &user_pref_value);
138 EXPECT_EQ(0, user_pref_value);
139 local_state.GetDictionary(prefs::kUmaCellDataUse)
140 ->GetInteger(kExpiredDateStr1, &uma_pref_value);
141 EXPECT_EQ(0, uma_pref_value);
142
143 local_state.GetDictionary(prefs::kUserCellDataUse)
144 ->GetInteger(kExpiredDateStr2, &user_pref_value);
145 EXPECT_EQ(0, user_pref_value);
146 local_state.GetDictionary(prefs::kUmaCellDataUse)
147 ->GetInteger(kExpiredDateStr2, &uma_pref_value);
148 EXPECT_EQ(0, uma_pref_value);
149
150 local_state.GetDictionary(prefs::kUserCellDataUse)
151 ->GetInteger(kTodayStr, &user_pref_value);
152 EXPECT_EQ(2 * 100, user_pref_value);
153 local_state.GetDictionary(prefs::kUmaCellDataUse)
154 ->GetInteger(kTodayStr, &uma_pref_value);
155 EXPECT_EQ(50, uma_pref_value);
156
157 local_state.GetDictionary(prefs::kUserCellDataUse)
158 ->GetInteger(kYesterdayStr, &user_pref_value);
159 EXPECT_EQ(2 * 100, user_pref_value);
160 local_state.GetDictionary(prefs::kUmaCellDataUse)
161 ->GetInteger(kYesterdayStr, &uma_pref_value);
162 EXPECT_EQ(50, uma_pref_value);
163}
164
165TEST(DataUseTrackerTest, CheckComputeTotalDataUse) {
166 TestDataUsePrefService local_state;
167 FakeDataUseTracker data_use_tracker(&local_state);
168 local_state.ClearDataUsePrefs();
169 SetPrefTestValuesOverRatio(&local_state);
170
171 int user_data_use =
172 data_use_tracker.ComputeTotalDataUse(prefs::kUserCellDataUse);
173 EXPECT_EQ(8 * 100, user_data_use);
174 int uma_data_use =
175 data_use_tracker.ComputeTotalDataUse(prefs::kUmaCellDataUse);
176 EXPECT_EQ(4 * 50, uma_data_use);
177}
178
179TEST(DataUseTrackerTest, CheckShouldUploadLogOnCellular) {
180 TestDataUsePrefService local_state;
181 FakeDataUseTracker data_use_tracker(&local_state);
182 local_state.ClearDataUsePrefs();
183 SetPrefTestValuesOverRatio(&local_state);
184
185 bool can_upload = data_use_tracker.ShouldUploadLogOnCellular(50);
186 EXPECT_TRUE(can_upload);
187 can_upload = data_use_tracker.ShouldUploadLogOnCellular(100);
188 EXPECT_TRUE(can_upload);
189 can_upload = data_use_tracker.ShouldUploadLogOnCellular(150);
190 EXPECT_FALSE(can_upload);
191
192 local_state.ClearDataUsePrefs();
193 SetPrefTestValuesValidRatio(&local_state);
194 can_upload = data_use_tracker.ShouldUploadLogOnCellular(100);
195 EXPECT_TRUE(can_upload);
196 // this is about 0.49%
197 can_upload = data_use_tracker.ShouldUploadLogOnCellular(200);
198 EXPECT_TRUE(can_upload);
199 can_upload = data_use_tracker.ShouldUploadLogOnCellular(300);
200 EXPECT_FALSE(can_upload);
201}
202
203} // namespace metrics