Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: chrome/browser/android/data_usage/external_data_use_observer_unittest.cc

Issue 1491793002: Add histograms for ExternalDataUseObserver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/data_usage/external_data_use_observer.h" 5 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/metrics/field_trial.h" 12 #include "base/metrics/field_trial.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/test/histogram_tester.h"
16 #include "base/thread_task_runner_handle.h" 17 #include "base/thread_task_runner_handle.h"
17 #include "chrome/browser/android/data_usage/data_use_tab_model_test_utils.h" 18 #include "chrome/browser/android/data_usage/data_use_tab_model_test_utils.h"
18 #include "components/data_usage/core/data_use.h" 19 #include "components/data_usage/core/data_use.h"
19 #include "components/data_usage/core/data_use_aggregator.h" 20 #include "components/data_usage/core/data_use_aggregator.h"
20 #include "components/data_usage/core/data_use_amortizer.h" 21 #include "components/data_usage/core/data_use_amortizer.h"
21 #include "components/data_usage/core/data_use_annotator.h" 22 #include "components/data_usage/core/data_use_annotator.h"
23 #include "components/sessions/core/session_id.h"
22 #include "components/variations/variations_associated_data.h" 24 #include "components/variations/variations_associated_data.h"
23 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
24 #include "content/public/test/test_browser_thread_bundle.h" 26 #include "content/public/test/test_browser_thread_bundle.h"
25 #include "net/base/network_change_notifier.h" 27 #include "net/base/network_change_notifier.h"
26 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
27 #include "url/gurl.h" 29 #include "url/gurl.h"
28 30
31 namespace {
32
33 const char kDefaultLabel[] = "label";
34 const SessionID::id_type kDefaultTabId = 0;
35 const char kDefaultURL[] = "http://www.google.com/#q=abc";
36 const char kFooMccMnc[] = "foo_mccmnc";
37 const char kBarMccMnc[] = "bar_mccmnc";
38 const char kBazMccMnc[] = "baz_mccmnc";
39 const char kFooLabel[] = "foo_label";
40 const char kBarLabel[] = "bar_label";
41
42 } // namespace
43
29 namespace chrome { 44 namespace chrome {
30 45
31 namespace android { 46 namespace android {
32 47
33 class ExternalDataUseObserverTest : public testing::Test { 48 class ExternalDataUseObserverTest : public testing::Test {
34 public: 49 public:
35 void SetUp() override { 50 void SetUp() override {
36 thread_bundle_.reset(new content::TestBrowserThreadBundle( 51 thread_bundle_.reset(new content::TestBrowserThreadBundle(
37 content::TestBrowserThreadBundle::IO_MAINLOOP)); 52 content::TestBrowserThreadBundle::IO_MAINLOOP));
38 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( 53 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
39 content::BrowserThread::IO); 54 content::BrowserThread::IO);
40 ui_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread( 55 ui_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
41 content::BrowserThread::UI); 56 content::BrowserThread::UI);
42 data_use_aggregator_.reset( 57 data_use_aggregator_.reset(
43 new data_usage::DataUseAggregator(nullptr, nullptr)); 58 new data_usage::DataUseAggregator(nullptr, nullptr));
44 external_data_use_observer_.reset(new ExternalDataUseObserver( 59 external_data_use_observer_.reset(new ExternalDataUseObserver(
45 data_use_aggregator_.get(), io_task_runner_.get(), 60 data_use_aggregator_.get(), io_task_runner_.get(),
46 ui_task_runner_.get())); 61 ui_task_runner_.get()));
47 // Wait for |external_data_use_observer_| to create the Java object. 62 // Wait for |external_data_use_observer_| to create the Java object.
48 base::RunLoop().RunUntilIdle(); 63 base::RunLoop().RunUntilIdle();
49 64
50 test_data_use_tab_model_ = new TestDataUseTabModel(ui_task_runner_.get()); 65 test_data_use_tab_model_ = new TestDataUseTabModel(ui_task_runner_.get());
51 external_data_use_observer_->data_use_tab_model_.reset( 66 external_data_use_observer_->data_use_tab_model_.reset(
52 test_data_use_tab_model_); 67 test_data_use_tab_model_);
53 } 68 }
54 69
55 scoped_ptr<ExternalDataUseObserver> Create() const { 70 // Replaces |external_data_use_observer_| with a new ExternalDataUseObserver.
56 scoped_ptr<ExternalDataUseObserver> external_data_use_observer( 71 void ReplaceExternalDataUseObserver(
57 new ExternalDataUseObserver(data_use_aggregator_.get(), 72 std::map<std::string, std::string> variation_params) {
58 io_task_runner_.get(), 73 variations::testing::ClearAllVariationParams();
59 ui_task_runner_.get())); 74 ASSERT_TRUE(variations::AssociateVariationParams(
60 // Wait for |external_data_use_observer| to create the Java object. 75 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled",
61 base::RunLoop().RunUntilIdle(); 76 variation_params));
62 return external_data_use_observer; 77
78 base::FieldTrialList field_trial_list(nullptr);
79
80 base::FieldTrialList::CreateFieldTrial(
81 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled");
82
83 external_data_use_observer_.reset(new ExternalDataUseObserver(
84 data_use_aggregator_.get(), io_task_runner_.get(),
85 ui_task_runner_.get()));
86 // |test_data_use_tab_model| is owned by |observer|.
87 TestDataUseTabModel* test_data_use_tab_model(
88 new TestDataUseTabModel(ui_task_runner_.get()));
89 external_data_use_observer_->data_use_tab_model_.reset(
90 test_data_use_tab_model);
63 } 91 }
64 92
65 void FetchMatchingRulesDone(const std::vector<std::string>& app_package_name, 93 void FetchMatchingRulesDone(const std::vector<std::string>& app_package_name,
66 const std::vector<std::string>& domain_path_regex, 94 const std::vector<std::string>& domain_path_regex,
67 const std::vector<std::string>& label) { 95 const std::vector<std::string>& label) {
68 external_data_use_observer_->FetchMatchingRulesDone( 96 external_data_use_observer_->FetchMatchingRulesDone(
69 &app_package_name, &domain_path_regex, &label); 97 &app_package_name, &domain_path_regex, &label);
70 } 98 }
71 99
100 // Adds a default matching rule to |external_data_use_observer_|.
101 void AddDefaultMatchingRule() {
102 std::vector<std::string> url_regexes;
103 url_regexes.push_back(
104 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
105 FetchMatchingRulesDone(
106 std::vector<std::string>(url_regexes.size(), std::string()),
107 url_regexes,
108 std::vector<std::string>(url_regexes.size(), kDefaultLabel));
109 }
110
111 // Notifies DataUseTabModel that tab tracking has started on kDefaultTabId.
112 void TriggerTabTrackingOnDefaultTab() {
113 external_data_use_observer_->GetDataUseTabModel()->OnNavigationEvent(
114 kDefaultTabId, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
115 GURL(kDefaultURL), std::string());
116 }
117
118 // Returns a default data_usage::DataUse object.
119 data_usage::DataUse default_data_use() {
120 return data_usage::DataUse(
121 GURL(kDefaultURL), base::TimeTicks::Now(), GURL(), kDefaultTabId,
122 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "",
123 default_upload_bytes(), default_download_bytes());
124 }
125
72 ExternalDataUseObserver* external_data_use_observer() const { 126 ExternalDataUseObserver* external_data_use_observer() const {
73 return external_data_use_observer_.get(); 127 return external_data_use_observer_.get();
74 } 128 }
75 129
76 TestDataUseTabModel* test_data_use_tab_model() const { 130 TestDataUseTabModel* test_data_use_tab_model() const {
77 return test_data_use_tab_model_; 131 return test_data_use_tab_model_;
78 } 132 }
79 133
80 const ExternalDataUseObserver::DataUseReports& buffered_data_reports() const { 134 const ExternalDataUseObserver::DataUseReports& buffered_data_reports() const {
81 return external_data_use_observer_->buffered_data_reports_; 135 return external_data_use_observer_->buffered_data_reports_;
82 } 136 }
83 137
138 int64_t default_upload_bytes() const { return 1; }
139
140 int64_t default_download_bytes() const {
141 return external_data_use_observer_->data_use_report_min_bytes_;
142 }
143
84 private: 144 private:
85 scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; 145 scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_;
86 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; 146 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
87 scoped_ptr<ExternalDataUseObserver> external_data_use_observer_; 147 scoped_ptr<ExternalDataUseObserver> external_data_use_observer_;
88 148
89 // Owned by |external_data_use_observer_|. 149 // Owned by |external_data_use_observer_|.
90 TestDataUseTabModel* test_data_use_tab_model_; 150 TestDataUseTabModel* test_data_use_tab_model_;
91 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 151 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
92 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; 152 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
93 }; 153 };
(...skipping 18 matching lines...) Expand all
112 labels.push_back("label_1"); 172 labels.push_back("label_1");
113 labels.push_back("label_4"); 173 labels.push_back("label_4");
114 labels.push_back("label_5"); 174 labels.push_back("label_5");
115 FetchMatchingRulesDone( 175 FetchMatchingRulesDone(
116 std::vector<std::string>(labels.size(), std::string()), 176 std::vector<std::string>(labels.size(), std::string()),
117 std::vector<std::string>(labels.size(), "http://foobar.com"), labels); 177 std::vector<std::string>(labels.size(), "http://foobar.com"), labels);
118 } 178 }
119 179
120 // Verifies that buffer size does not exceed the specified limit. 180 // Verifies that buffer size does not exceed the specified limit.
121 TEST_F(ExternalDataUseObserverTest, BufferSize) { 181 TEST_F(ExternalDataUseObserverTest, BufferSize) {
122 const char kLabel[] = "label"; 182 base::HistogramTester histogram_tester;
123 183
124 std::vector<std::string> url_regexes; 184 AddDefaultMatchingRule();
125 url_regexes.push_back(
126 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
127
128 FetchMatchingRulesDone(
129 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
130 std::vector<std::string>(url_regexes.size(), kLabel));
131
132 const int64_t bytes_downloaded =
133 external_data_use_observer()->data_use_report_min_bytes_;
134 const int64_t bytes_uploaded = 1;
135 185
136 // Push more entries than the buffer size. Buffer size should not be exceeded. 186 // Push more entries than the buffer size. Buffer size should not be exceeded.
137 for (size_t i = 0; i < ExternalDataUseObserver::kMaxBufferSize * 2; ++i) { 187 for (size_t i = 0; i < ExternalDataUseObserver::kMaxBufferSize * 2; ++i) {
138 data_usage::DataUse data_use( 188 data_usage::DataUse data_use = default_data_use();
139 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 189 data_use.mcc_mnc = "mccmnc" + base::Int64ToString(i);
140 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
141 "mccmnc" + base::Int64ToString(i), bytes_uploaded, bytes_downloaded);
142 external_data_use_observer()->OnDataUse(data_use); 190 external_data_use_observer()->OnDataUse(data_use);
143 } 191 }
144 192
145 EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_); 193 EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_);
146 194
147 // Verify that total buffered bytes is computed correctly. 195 // Verify that total buffered bytes is computed correctly.
148 EXPECT_EQ(static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize * 196 EXPECT_EQ(
149 (bytes_downloaded + bytes_uploaded)), 197 static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize *
150 external_data_use_observer()->total_bytes_buffered_); 198 (default_upload_bytes() + default_download_bytes())),
199 external_data_use_observer()->total_bytes_buffered_);
151 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize, 200 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize,
152 buffered_data_reports().size()); 201 buffered_data_reports().size());
153 202
154 // Verify the label of the data use report. 203 // Verify the label of the data use report.
155 for (const auto& it : buffered_data_reports()) 204 for (const auto& it : buffered_data_reports())
156 EXPECT_EQ(kLabel, it.first.label); 205 EXPECT_EQ(kDefaultLabel, it.first.label);
206
207 // Verify that metrics were updated correctly for the lost reports.
208 histogram_tester.ExpectUniqueSample(
209 "DataUsage.ReportSubmissionResult",
210 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_LOST,
211 ExternalDataUseObserver::kMaxBufferSize - 1);
212 histogram_tester.ExpectUniqueSample(
213 "DataUsage.ReportSubmission.Bytes.Lost",
214 default_upload_bytes() + default_download_bytes(),
215 ExternalDataUseObserver::kMaxBufferSize - 1);
157 } 216 }
158 217
159 // Tests that buffered data use reports are merged correctly. 218 // Tests that buffered data use reports are merged correctly.
160 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { 219 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) {
161 const char kLabel[] = "label"; 220 AddDefaultMatchingRule();
162
163 std::vector<std::string> url_regexes;
164 url_regexes.push_back(
165 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
166
167 FetchMatchingRulesDone(
168 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
169 std::vector<std::string>(url_regexes.size(), kLabel));
170 221
171 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 222 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
172 223
173 for (size_t i = 0; i < num_iterations; ++i) { 224 for (size_t i = 0; i < num_iterations; ++i) {
174 data_usage::DataUse data_use_foo( 225 data_usage::DataUse data_use_foo = default_data_use();
175 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 226 data_use_foo.mcc_mnc = kFooMccMnc;
176 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo",
177 external_data_use_observer()->data_use_report_min_bytes_, 1);
178 external_data_use_observer()->OnDataUse(data_use_foo); 227 external_data_use_observer()->OnDataUse(data_use_foo);
179 228
180 data_usage::DataUse data_use_bar( 229 data_usage::DataUse data_use_bar = default_data_use();
181 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 230 data_use_bar.mcc_mnc = kBarMccMnc;
182 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar",
183 external_data_use_observer()->data_use_report_min_bytes_, 1);
184 external_data_use_observer()->OnDataUse(data_use_bar); 231 external_data_use_observer()->OnDataUse(data_use_bar);
185 232
186 data_usage::DataUse data_use_baz( 233 data_usage::DataUse data_use_baz = default_data_use();
187 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 234 data_use_baz.mcc_mnc = kBazMccMnc;
188 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_baz",
189 external_data_use_observer()->data_use_report_min_bytes_, 1);
190 external_data_use_observer()->OnDataUse(data_use_baz); 235 external_data_use_observer()->OnDataUse(data_use_baz);
191 } 236 }
192 237
193 EXPECT_EQ(3U, buffered_data_reports().size()); 238 EXPECT_EQ(3U, buffered_data_reports().size());
194 239
195 // One of the foo reports should have been submitted, and all the other foo 240 // One of the foo reports should have been submitted, and all the other foo
196 // reports should have been merged together. All of the bar and baz reports 241 // reports should have been merged together. All of the bar and baz reports
197 // should have been merged together respectively. 242 // should have been merged together respectively.
198 const struct { 243 const struct {
199 std::string mcc_mnc; 244 std::string mcc_mnc;
200 size_t number_of_merged_reports; 245 size_t number_of_merged_reports;
201 } expected_data_use_reports[] = {{"mccmnc_foo", num_iterations - 1}, 246 } expected_data_use_reports[] = {{kFooMccMnc, num_iterations - 1},
202 {"mccmnc_bar", num_iterations}, 247 {kBarMccMnc, num_iterations},
203 {"mccmnc_baz", num_iterations}}; 248 {kBazMccMnc, num_iterations}};
204 249
205 for (const auto& expected_report : expected_data_use_reports) { 250 for (const auto& expected_report : expected_data_use_reports) {
206 const ExternalDataUseObserver::DataUseReportKey key( 251 const ExternalDataUseObserver::DataUseReportKey key(
207 kLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 252 kDefaultLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
208 expected_report.mcc_mnc); 253 expected_report.mcc_mnc);
209 254
210 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key)); 255 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key));
211 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports), 256 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports) *
257 (default_download_bytes()),
212 buffered_data_reports().find(key)->second.bytes_downloaded); 258 buffered_data_reports().find(key)->second.bytes_downloaded);
213 EXPECT_EQ(static_cast<int64_t>( 259 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports *
214 expected_report.number_of_merged_reports * 260 (default_upload_bytes())),
215 external_data_use_observer()->data_use_report_min_bytes_),
216 buffered_data_reports().find(key)->second.bytes_uploaded); 261 buffered_data_reports().find(key)->second.bytes_uploaded);
217 } 262 }
218 } 263 }
219 264
220 // Tests that timestamps of merged reports is correct. 265 // Tests that timestamps of merged reports is correct.
221 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) { 266 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) {
222 const char kLabel[] = "label"; 267 AddDefaultMatchingRule();
223
224 std::vector<std::string> url_regexes;
225 url_regexes.push_back(
226 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
227
228 FetchMatchingRulesDone(
229 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
230 std::vector<std::string>(url_regexes.size(), kLabel));
231 268
232 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 269 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
233 270
234 base::Time start_timestamp = base::Time::UnixEpoch(); 271 base::Time start_timestamp = base::Time::UnixEpoch();
235 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1); 272 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1);
236 for (size_t i = 0; i < num_iterations; ++i) { 273 for (size_t i = 0; i < num_iterations; ++i) {
237 data_usage::DataUse data_use_foo(
238 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
239 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1, 2);
240 external_data_use_observer()->BufferDataUseReport( 274 external_data_use_observer()->BufferDataUseReport(
241 data_use_foo, kLabel, start_timestamp, end_timestamp); 275 default_data_use(), kDefaultLabel, start_timestamp, end_timestamp);
242 276
243 start_timestamp += base::TimeDelta::FromSeconds(1); 277 start_timestamp += base::TimeDelta::FromSeconds(1);
244 end_timestamp += base::TimeDelta::FromSeconds(1); 278 end_timestamp += base::TimeDelta::FromSeconds(1);
245 } 279 }
246 280
247 EXPECT_EQ(1U, buffered_data_reports().size()); 281 EXPECT_EQ(1U, buffered_data_reports().size());
248 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime()); 282 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime());
249 // Convert from seconds to milliseconds. 283 // Convert from seconds to milliseconds.
250 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000), 284 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000),
251 buffered_data_reports().begin()->second.end_time.ToJavaTime()); 285 buffered_data_reports().begin()->second.end_time.ToJavaTime());
252 } 286 }
253 287
254 // Tests the behavior when multiple matching rules are available for URL and 288 // Tests the behavior when multiple matching rules are available for URL and
255 // package name matching. 289 // package name matching.
256 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { 290 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) {
257 std::vector<std::string> url_regexes; 291 std::vector<std::string> url_regexes;
258 url_regexes.push_back( 292 url_regexes.push_back(
259 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); 293 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*");
260 url_regexes.push_back( 294 url_regexes.push_back(
261 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*"); 295 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*");
262 296
263 std::vector<std::string> labels; 297 std::vector<std::string> labels;
264 const char kLabelFoo[] = "label_foo"; 298 labels.push_back(kFooLabel);
265 const char kLabelBar[] = "label_bar"; 299 labels.push_back(kBarLabel);
266 labels.push_back(kLabelFoo);
267 labels.push_back(kLabelBar);
268 300
269 std::vector<std::string> app_package_names; 301 std::vector<std::string> app_package_names;
270 const char kAppFoo[] = "com.example.foo"; 302 const char kAppFoo[] = "com.example.foo";
271 const char kAppBar[] = "com.example.bar"; 303 const char kAppBar[] = "com.example.bar";
272 app_package_names.push_back(kAppFoo); 304 app_package_names.push_back(kAppFoo);
273 app_package_names.push_back(kAppBar); 305 app_package_names.push_back(kAppBar);
274 306
275 FetchMatchingRulesDone(app_package_names, url_regexes, labels); 307 FetchMatchingRulesDone(app_package_names, url_regexes, labels);
276 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); 308 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size());
277 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 309 EXPECT_TRUE(external_data_use_observer()
310 ->last_data_report_submitted_ticks_.is_null());
278 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 311 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
279 312
280 // Check |kLabelFoo| matching rule. 313 // Check |kLabelFoo| matching rule.
281 data_usage::DataUse data_foo_1( 314 data_usage::DataUse data_foo = default_data_use();
282 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 315 data_foo.url = GURL("http://www.foo.com/#q=abc");
283 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", 316 data_foo.mcc_mnc = kFooMccMnc;
284 external_data_use_observer()->data_use_report_min_bytes_, 0); 317 external_data_use_observer()->OnDataUse(data_foo);
285 external_data_use_observer()->OnDataUse(data_foo_1);
286 data_usage::DataUse data_foo_2(
287 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
288 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2",
289 external_data_use_observer()->data_use_report_min_bytes_, 0);
290 external_data_use_observer()->OnDataUse(data_foo_2);
291
292 // The foo1 report should have been submitted.
293 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_);
294
295 // Only the foo2 report should be present.
296 EXPECT_EQ(1U, buffered_data_reports().size());
297 const ExternalDataUseObserver::DataUseReportKey key_foo_2(
298 kLabelFoo, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2");
299 EXPECT_NE(buffered_data_reports().end(),
300 buffered_data_reports().find(key_foo_2));
301 318
302 // Check |kLabelBar| matching rule. 319 // Check |kLabelBar| matching rule.
303 data_usage::DataUse data_bar( 320 data_usage::DataUse data_bar = default_data_use();
304 GURL("http://www.bar.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 321 data_bar.url = GURL("http://www.bar.com/#q=abc");
305 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc", 0, 0); 322 data_bar.mcc_mnc = kBarMccMnc;
306 external_data_use_observer()->OnDataUse(data_bar); 323 external_data_use_observer()->OnDataUse(data_bar);
307 324
308 // Both the foo2 and bar reports should be present. 325 // bar report should be present.
309 EXPECT_EQ(2U, buffered_data_reports().size()); 326 EXPECT_EQ(1U, buffered_data_reports().size());
310 EXPECT_NE(buffered_data_reports().end(),
311 buffered_data_reports().find(key_foo_2));
312 327
313 const ExternalDataUseObserver::DataUseReportKey key_bar( 328 const ExternalDataUseObserver::DataUseReportKey key_bar(
314 kLabelBar, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc"); 329 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
315 EXPECT_NE(buffered_data_reports().end(), 330 EXPECT_NE(buffered_data_reports().end(),
316 buffered_data_reports().find(key_bar)); 331 buffered_data_reports().find(key_bar));
317 } 332 }
318 333
319 // Tests that hash function reports distinct values. This test may fail if there 334 // Tests that hash function reports distinct values. This test may fail if there
320 // is a hash collision, however the chances of that happening are very low. 335 // is a hash collision, however the chances of that happening are very low.
321 TEST_F(ExternalDataUseObserverTest, HashFunction) { 336 TEST_F(ExternalDataUseObserverTest, HashFunction) {
322 ExternalDataUseObserver::DataUseReportKeyHash hash; 337 ExternalDataUseObserver::DataUseReportKeyHash hash;
323 338
324 ExternalDataUseObserver::DataUseReportKey foo( 339 ExternalDataUseObserver::DataUseReportKey foo(
325 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 340 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
326 "foo_mcc_mnc");
327 ExternalDataUseObserver::DataUseReportKey bar_label( 341 ExternalDataUseObserver::DataUseReportKey bar_label(
328 "bar_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 342 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
329 "foo_mcc_mnc");
330 ExternalDataUseObserver::DataUseReportKey bar_network_type( 343 ExternalDataUseObserver::DataUseReportKey bar_network_type(
331 "foo_label", net::NetworkChangeNotifier::CONNECTION_WIFI, "foo_mcc_mnc"); 344 kFooLabel, net::NetworkChangeNotifier::CONNECTION_WIFI, kFooMccMnc);
332 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc( 345 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc(
333 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 346 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
334 "bar_mcc_mnc");
335 347
336 EXPECT_NE(hash(foo), hash(bar_label)); 348 EXPECT_NE(hash(foo), hash(bar_label));
337 EXPECT_NE(hash(foo), hash(bar_label)); 349 EXPECT_NE(hash(foo), hash(bar_label));
338 EXPECT_NE(hash(foo), hash(bar_network_type)); 350 EXPECT_NE(hash(foo), hash(bar_network_type));
339 EXPECT_NE(hash(foo), hash(bar_mcc_mnc)); 351 EXPECT_NE(hash(foo), hash(bar_mcc_mnc));
340 } 352 }
341 353
342 // Tests if matching rules are fetched periodically. 354 // Tests if matching rules are fetched periodically.
343 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { 355 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) {
344 const char kLabel[] = "label"; 356 AddDefaultMatchingRule();
345
346 std::vector<std::string> url_regexes;
347 url_regexes.push_back(
348 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
349
350 FetchMatchingRulesDone(
351 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
352 std::vector<std::string>(url_regexes.size(), kLabel));
353 357
354 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 358 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
355 EXPECT_FALSE( 359 EXPECT_FALSE(
356 external_data_use_observer()->last_matching_rules_fetch_time_.is_null()); 360 external_data_use_observer()->last_matching_rules_fetch_time_.is_null());
357 361
358 // Change the time when the fetching rules were fetched. 362 // Change the time when the fetching rules were fetched.
359 external_data_use_observer()->last_matching_rules_fetch_time_ = 363 external_data_use_observer()->last_matching_rules_fetch_time_ =
360 base::TimeTicks::Now() - 364 base::TimeTicks::Now() -
361 external_data_use_observer()->fetch_matching_rules_duration_; 365 external_data_use_observer()->fetch_matching_rules_duration_;
362 // Matching rules should be expired. 366 // Matching rules should be expired.
363 EXPECT_GE(base::TimeTicks::Now() - 367 EXPECT_GE(base::TimeTicks::Now() -
364 external_data_use_observer()->last_matching_rules_fetch_time_, 368 external_data_use_observer()->last_matching_rules_fetch_time_,
365 external_data_use_observer()->fetch_matching_rules_duration_); 369 external_data_use_observer()->fetch_matching_rules_duration_);
366 370
367 // OnDataUse should trigger fetching of matching rules. 371 // OnDataUse should trigger fetching of matching rules.
368 data_usage::DataUse data_use_foo( 372 external_data_use_observer()->OnDataUse(default_data_use());
369 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
370 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo",
371 external_data_use_observer()->data_use_report_min_bytes_, 1);
372 external_data_use_observer()->OnDataUse(data_use_foo);
373 373
374 // Matching rules should not be expired. 374 // Matching rules should not be expired.
375 EXPECT_LT(base::TimeTicks::Now() - 375 EXPECT_LT(base::TimeTicks::Now() -
376 external_data_use_observer()->last_matching_rules_fetch_time_, 376 external_data_use_observer()->last_matching_rules_fetch_time_,
377 external_data_use_observer()->fetch_matching_rules_duration_); 377 external_data_use_observer()->fetch_matching_rules_duration_);
378 } 378 }
379 379
380 // Tests if data use reports are sent only after the total bytes send/received 380 // Tests if data use reports are sent only after the total bytes send/received
381 // across all buffered reports have reached the specified threshold. 381 // across all buffered reports have reached the specified threshold.
382 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) { 382 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) {
383 const char kLabel[] = "label"; 383 AddDefaultMatchingRule();
384 384 TriggerTabTrackingOnDefaultTab();
385 std::vector<std::string> url_regexes;
386 url_regexes.push_back(
387 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
388
389 FetchMatchingRulesDone(
390 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
391 std::vector<std::string>(url_regexes.size(), kLabel));
392 385
393 // This tests reports 1024 bytes in each loop iteration. For the test to work 386 // This tests reports 1024 bytes in each loop iteration. For the test to work
394 // properly, |data_use_report_min_bytes_| should be a multiple of 1024. 387 // properly, |data_use_report_min_bytes_| should be a multiple of 1024.
395 ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024); 388 ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024);
396 389
397 const size_t num_iterations = 390 const size_t num_iterations =
398 external_data_use_observer()->data_use_report_min_bytes_ / 1024; 391 external_data_use_observer()->data_use_report_min_bytes_ / 1024;
399 392
400 for (size_t i = 0; i < num_iterations; ++i) { 393 for (size_t i = 0; i < num_iterations; ++i) {
401 data_usage::DataUse data_use_foo( 394 data_usage::DataUse data_use = default_data_use();
402 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 395 data_use.tx_bytes = 1024;
403 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0); 396 data_use.rx_bytes = 0;
404 external_data_use_observer()->OnDataUse(data_use_foo); 397 external_data_use_observer()->OnDataUse(data_use);
405 398
406 if (i != num_iterations - 1) { 399 if (i != num_iterations - 1) {
407 // Total buffered bytes is less than the minimum threshold. Data use 400 // Total buffered bytes is less than the minimum threshold. Data use
408 // report should not be send. 401 // report should not be send.
409 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 402 EXPECT_TRUE(external_data_use_observer()
403 ->last_data_report_submitted_ticks_.is_null());
410 EXPECT_EQ(static_cast<int64_t>(i + 1), 404 EXPECT_EQ(static_cast<int64_t>(i + 1),
411 external_data_use_observer()->total_bytes_buffered_ / 1024); 405 external_data_use_observer()->total_bytes_buffered_ / 1024);
406 EXPECT_EQ(0, external_data_use_observer()->pending_report_bytes_);
412 407
413 } else { 408 } else {
414 // Total bytes is at least the minimum threshold. This should trigger 409 // Total bytes is at least the minimum threshold. This should trigger
415 // submitting of the buffered data use report. 410 // submitting of the buffered data use report.
416 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); 411 EXPECT_FALSE(external_data_use_observer()
412 ->last_data_report_submitted_ticks_.is_null());
417 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 413 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
418 } 414 }
419 } 415 }
420 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 416 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
417 EXPECT_EQ(static_cast<int64_t>(num_iterations),
418 external_data_use_observer()->pending_report_bytes_ / 1024);
419
420 base::HistogramTester histogram_tester;
421 external_data_use_observer()->OnReportDataUseDone(true);
422
423 // Verify that metrics were updated correctly for the report that was
424 // successfully submitted.
425 histogram_tester.ExpectUniqueSample(
426 "DataUsage.ReportSubmissionResult",
427 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_SUCCESSFUL, 1);
428 histogram_tester.ExpectUniqueSample(
429 "DataUsage.ReportSubmission.Bytes.Successful",
430 external_data_use_observer()->data_use_report_min_bytes_, 1);
431
432 // Verify that metrics were updated correctly for the report that was not
433 // successfully submitted.
434 external_data_use_observer()->OnDataUse(default_data_use());
435 external_data_use_observer()->OnReportDataUseDone(false);
436 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 2);
437 histogram_tester.ExpectBucketCount(
438 "DataUsage.ReportSubmissionResult",
439 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_FAILED, 1);
440 histogram_tester.ExpectUniqueSample(
441 "DataUsage.ReportSubmission.Bytes.Failed",
442 external_data_use_observer()->data_use_report_min_bytes_, 1);
421 } 443 }
422 444
423 // Tests if the parameters from the field trial are populated correctly. 445 // Tests if the parameters from the field trial are populated correctly.
424 TEST_F(ExternalDataUseObserverTest, Variations) { 446 TEST_F(ExternalDataUseObserverTest, Variations) {
425 EXPECT_EQ(base::TimeDelta::FromSeconds(60 * 15),
426 external_data_use_observer()->fetch_matching_rules_duration_);
427 EXPECT_EQ(100 * 1024,
428 external_data_use_observer()->data_use_report_min_bytes_);
429
430 variations::testing::ClearAllVariationParams();
431 std::map<std::string, std::string> variation_params; 447 std::map<std::string, std::string> variation_params;
432 448
433 const int kFetchMatchingRulesDurationSeconds = 10000; 449 const int kFetchMatchingRulesDurationSeconds = 10000;
450 const int kDefaultMaxDataReportSubmitWaitMsec = 20000;
434 const int64_t kDataUseReportMinBytes = 5000; 451 const int64_t kDataUseReportMinBytes = 5000;
435 variation_params["fetch_matching_rules_duration_seconds"] = 452 variation_params["fetch_matching_rules_duration_seconds"] =
436 base::Int64ToString(kFetchMatchingRulesDurationSeconds); 453 base::Int64ToString(kFetchMatchingRulesDurationSeconds);
454 variation_params["data_report_submit_timeout_msec"] =
455 base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec);
437 variation_params["data_use_report_min_bytes"] = 456 variation_params["data_use_report_min_bytes"] =
438 base::Int64ToString(kDataUseReportMinBytes); 457 base::Int64ToString(kDataUseReportMinBytes);
439 458
440 ASSERT_TRUE(variations::AssociateVariationParams( 459 // Create another ExternalDataUseObserver object.
441 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", 460 ReplaceExternalDataUseObserver(variation_params);
442 variation_params)); 461 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds),
462 external_data_use_observer()->fetch_matching_rules_duration_);
463 EXPECT_EQ(
464 base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec),
465 external_data_use_observer()->data_report_submit_timeout_);
466 EXPECT_EQ(kDataUseReportMinBytes,
467 external_data_use_observer()->data_use_report_min_bytes_);
468 }
443 469
444 base::FieldTrialList field_trial_list(nullptr); 470 // Tests if the metrics are recorded correctly.
471 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) {
472 std::map<std::string, std::string> variation_params;
473 variation_params["data_report_submit_timeout_msec"] = "0";
474 variation_params["data_use_report_min_bytes"] = "0";
445 475
446 base::FieldTrialList::CreateFieldTrial( 476 // Create another ExternalDataUseObserver object.
447 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); 477 ReplaceExternalDataUseObserver(variation_params);
478 AddDefaultMatchingRule();
448 479
449 // Create another ExternalDataUseObserver object. This would fetch variation 480 base::HistogramTester histogram_tester;
450 // params. 481 TriggerTabTrackingOnDefaultTab();
451 scoped_ptr<ExternalDataUseObserver> 482 external_data_use_observer()->OnDataUse(default_data_use());
452 external_data_use_obsever_with_variations = Create(); 483 external_data_use_observer()->OnDataUse(default_data_use());
453 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), 484 // First data use report should be marked as timed out.
454 external_data_use_obsever_with_variations 485 histogram_tester.ExpectUniqueSample(
455 ->fetch_matching_rules_duration_); 486 "DataUsage.ReportSubmissionResult",
456 EXPECT_EQ( 487 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT, 1);
457 kDataUseReportMinBytes, 488 histogram_tester.ExpectUniqueSample(
458 external_data_use_obsever_with_variations->data_use_report_min_bytes_); 489 "DataUsage.ReportSubmission.Bytes.TimedOut",
490 default_upload_bytes() + default_download_bytes(), 1);
459 } 491 }
460 492
461 } // namespace android 493 } // namespace android
462 494
463 } // namespace chrome 495 } // namespace chrome
OLDNEW
« no previous file with comments | « chrome/browser/android/data_usage/external_data_use_observer.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698