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

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: Addressed sclittle comments and some cleanup 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::REAL_IO_THREAD)); 52 content::TestBrowserThreadBundle::REAL_IO_THREAD));
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 test_data_use_tab_model_ = new TestDataUseTabModel( 62 test_data_use_tab_model_ = new TestDataUseTabModel(
48 external_data_use_observer_.get(), ui_task_runner_.get()); 63 external_data_use_observer_.get(), ui_task_runner_.get());
49 external_data_use_observer_->data_use_tab_model_.reset( 64 external_data_use_observer_->data_use_tab_model_.reset(
50 test_data_use_tab_model_); 65 test_data_use_tab_model_);
51 } 66 }
52 67
53 scoped_ptr<ExternalDataUseObserver> Create() const { 68 // Replaces |external_data_use_observer_| with a new ExternalDataUseObserver.
54 return scoped_ptr<ExternalDataUseObserver>(new ExternalDataUseObserver( 69 void ReplaceExternalDataUseObserver(
70 std::map<std::string, std::string> variation_params) {
71 variations::testing::ClearAllVariationParams();
72 ASSERT_TRUE(variations::AssociateVariationParams(
73 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled",
74 variation_params));
75
76 base::FieldTrialList field_trial_list(nullptr);
77
78 base::FieldTrialList::CreateFieldTrial(
79 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled");
80
81 external_data_use_observer_.reset(new ExternalDataUseObserver(
55 data_use_aggregator_.get(), io_task_runner_.get(), 82 data_use_aggregator_.get(), io_task_runner_.get(),
56 ui_task_runner_.get())); 83 ui_task_runner_.get()));
84 // |test_data_use_tab_model| is owned by |observer|.
85 TestDataUseTabModel* test_data_use_tab_model(new TestDataUseTabModel(
86 external_data_use_observer_.get(), ui_task_runner_.get()));
87 external_data_use_observer_->data_use_tab_model_.reset(
88 test_data_use_tab_model);
89 }
90
91 // Adds a default matching rule to |external_data_use_observer_|.
92 void AddDefaultMatchingRule() {
93 std::vector<std::string> url_regexes;
94 url_regexes.push_back(
95 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
96 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
97 std::vector<std::string>(url_regexes.size(), std::string()),
98 url_regexes,
99 std::vector<std::string>(url_regexes.size(), kDefaultLabel));
100 }
101
102 // Notifies DataUseTabModel that tab tracking has started on kDefaultTabId.
103 void TriggerTabTrackingOnDefaultTab() {
104 external_data_use_observer_->GetDataUseTabModel()->OnNavigationEvent(
105 kDefaultTabId, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
106 GURL(kDefaultURL), std::string());
107 }
108
109 // Returns a default data_usage::DataUse object.
110 data_usage::DataUse default_data_use() {
111 return data_usage::DataUse(
112 GURL(kDefaultURL), base::TimeTicks::Now(), GURL(), kDefaultTabId,
113 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "",
114 default_upload_bytes(), default_download_bytes());
57 } 115 }
58 116
59 ExternalDataUseObserver* external_data_use_observer() const { 117 ExternalDataUseObserver* external_data_use_observer() const {
60 return external_data_use_observer_.get(); 118 return external_data_use_observer_.get();
61 } 119 }
62 120
63 TestDataUseTabModel* test_data_use_tab_model() const { 121 TestDataUseTabModel* test_data_use_tab_model() const {
64 return test_data_use_tab_model_; 122 return test_data_use_tab_model_;
65 } 123 }
66 124
67 const ExternalDataUseObserver::DataUseReports& buffered_data_reports() const { 125 const ExternalDataUseObserver::DataUseReports& buffered_data_reports() const {
68 return external_data_use_observer_->buffered_data_reports_; 126 return external_data_use_observer_->buffered_data_reports_;
69 } 127 }
70 128
129 int64_t default_upload_bytes() const { return 1; }
130
131 int64_t default_download_bytes() const {
132 return external_data_use_observer_->data_use_report_min_bytes_;
133 }
134
71 private: 135 private:
72 // Required for creating multiple threads for unit testing. 136 // Required for creating multiple threads for unit testing.
73 scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; 137 scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_;
74 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; 138 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
75 scoped_ptr<ExternalDataUseObserver> external_data_use_observer_; 139 scoped_ptr<ExternalDataUseObserver> external_data_use_observer_;
76 TestDataUseTabModel* test_data_use_tab_model_; 140 TestDataUseTabModel* test_data_use_tab_model_;
77 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 141 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
78 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; 142 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
79 }; 143 };
80 144
(...skipping 24 matching lines...) Expand all
105 {"", "", false}, 169 {"", "", false},
106 {"https://www.google.com", "http://www.google.com", false}, 170 {"https://www.google.com", "http://www.google.com", false},
107 }; 171 };
108 172
109 std::string label("test"); 173 std::string label("test");
110 for (size_t i = 0; i < arraysize(tests); ++i) { 174 for (size_t i = 0; i < arraysize(tests); ++i) {
111 external_data_use_observer()->RegisterURLRegexes( 175 external_data_use_observer()->RegisterURLRegexes(
112 // App package name not specified in the matching rule. 176 // App package name not specified in the matching rule.
113 std::vector<std::string>(1, std::string()), 177 std::vector<std::string>(1, std::string()),
114 std::vector<std::string>(1, tests[i].regex), 178 std::vector<std::string>(1, tests[i].regex),
115 std::vector<std::string>(1, "label")); 179 std::vector<std::string>(1, kDefaultLabel));
116 EXPECT_EQ(tests[i].expect_match, 180 EXPECT_EQ(tests[i].expect_match,
117 external_data_use_observer()->Matches(GURL(tests[i].url), &label)) 181 external_data_use_observer()->Matches(GURL(tests[i].url), &label))
118 << i; 182 << i;
119 183
120 // Verify label matches the expected label. 184 // Verify label matches the expected label.
121 std::string expected_label = ""; 185 std::string expected_label = "";
122 if (tests[i].expect_match) 186 if (tests[i].expect_match)
123 expected_label = "label"; 187 expected_label = kDefaultLabel;
124 188
125 EXPECT_EQ(expected_label, label); 189 EXPECT_EQ(expected_label, label);
126 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 190 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
127 "com.example.helloworld", &label)) 191 "com.example.helloworld", &label))
128 << i; 192 << i;
129 // Empty package name should not match against empty package name in the 193 // Empty package name should not match against empty package name in the
130 // matching rule. 194 // matching rule.
131 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 195 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
132 std::string(), &label)) 196 std::string(), &label))
133 << i; 197 << i;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 {"www.google.com:80", "http://www.google.com", "", false}, 231 {"www.google.com:80", "http://www.google.com", "", false},
168 {"http://www.google.com:80", "http://www.google.com", "", false}, 232 {"http://www.google.com:80", "http://www.google.com", "", false},
169 {"", "http://www.google.com", "", false}, 233 {"", "http://www.google.com", "", false},
170 {"https://www.google.com", "http://www.google.com", "", false}, 234 {"https://www.google.com", "http://www.google.com", "", false},
171 }; 235 };
172 236
173 std::string got_label; 237 std::string got_label;
174 for (size_t i = 0; i < arraysize(tests); ++i) { 238 for (size_t i = 0; i < arraysize(tests); ++i) {
175 std::vector<std::string> url_regexes; 239 std::vector<std::string> url_regexes;
176 url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2); 240 url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2);
177 const std::string label("label"); 241 const std::string label(kDefaultLabel);
178 external_data_use_observer()->RegisterURLRegexes( 242 external_data_use_observer()->RegisterURLRegexes(
179 std::vector<std::string>(url_regexes.size(), "com.example.helloworld"), 243 std::vector<std::string>(url_regexes.size(), "com.example.helloworld"),
180 url_regexes, std::vector<std::string>(url_regexes.size(), label)); 244 url_regexes, std::vector<std::string>(url_regexes.size(), label));
181 EXPECT_EQ(tests[i].expect_match, external_data_use_observer()->Matches( 245 EXPECT_EQ(tests[i].expect_match, external_data_use_observer()->Matches(
182 GURL(tests[i].url), &got_label)) 246 GURL(tests[i].url), &got_label))
183 << i; 247 << i;
184 const std::string expected_label = 248 const std::string expected_label =
185 tests[i].expect_match ? label : std::string(); 249 tests[i].expect_match ? label : std::string();
186 EXPECT_EQ(expected_label, got_label); 250 EXPECT_EQ(expected_label, got_label);
187 251
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 // When no regex is specified, the URL match should fail. 307 // When no regex is specified, the URL match should fail.
244 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); 308 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label));
245 EXPECT_FALSE(external_data_use_observer()->Matches( 309 EXPECT_FALSE(external_data_use_observer()->Matches(
246 GURL("http://www.google.com"), &label)); 310 GURL("http://www.google.com"), &label));
247 311
248 std::vector<std::string> url_regexes; 312 std::vector<std::string> url_regexes;
249 url_regexes.push_back("http://www[.]google[.]com/#q=.*"); 313 url_regexes.push_back("http://www[.]google[.]com/#q=.*");
250 url_regexes.push_back("https://www[.]google[.]com/#q=.*"); 314 url_regexes.push_back("https://www[.]google[.]com/#q=.*");
251 external_data_use_observer()->RegisterURLRegexes( 315 external_data_use_observer()->RegisterURLRegexes(
252 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, 316 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
253 std::vector<std::string>(url_regexes.size(), "label")); 317 std::vector<std::string>(url_regexes.size(), kDefaultLabel));
254 318
255 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); 319 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label));
256 EXPECT_TRUE(external_data_use_observer()->Matches( 320 EXPECT_TRUE(external_data_use_observer()->Matches(
257 GURL("http://www.google.com#q=abc"), &label)); 321 GURL("http://www.google.com#q=abc"), &label));
258 EXPECT_FALSE(external_data_use_observer()->Matches( 322 EXPECT_FALSE(external_data_use_observer()->Matches(
259 GURL("http://www.google.co.in#q=abc"), &label)); 323 GURL("http://www.google.co.in#q=abc"), &label));
260 324
261 // Change the regular expressions to verify that the new regexes replace 325 // Change the regular expressions to verify that the new regexes replace
262 // the ones specified before. 326 // the ones specified before.
263 url_regexes.clear(); 327 url_regexes.clear();
264 url_regexes.push_back("http://www[.]google[.]co[.]in/#q=.*"); 328 url_regexes.push_back("http://www[.]google[.]co[.]in/#q=.*");
265 url_regexes.push_back("https://www[.]google[.]co[.]in/#q=.*"); 329 url_regexes.push_back("https://www[.]google[.]co[.]in/#q=.*");
266 external_data_use_observer()->RegisterURLRegexes( 330 external_data_use_observer()->RegisterURLRegexes(
267 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, 331 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
268 std::vector<std::string>(url_regexes.size(), "label")); 332 std::vector<std::string>(url_regexes.size(), kDefaultLabel));
269 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); 333 EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label));
270 EXPECT_FALSE(external_data_use_observer()->Matches( 334 EXPECT_FALSE(external_data_use_observer()->Matches(
271 GURL("http://www.google.com#q=abc"), &label)); 335 GURL("http://www.google.com#q=abc"), &label));
272 EXPECT_TRUE(external_data_use_observer()->Matches( 336 EXPECT_TRUE(external_data_use_observer()->Matches(
273 GURL("http://www.google.co.in#q=abc"), &label)); 337 GURL("http://www.google.co.in#q=abc"), &label));
274 } 338 }
275 339
276 // Tests that tab model is notified when tracking labels are removed. 340 // Tests that tab model is notified when tracking labels are removed.
277 TEST_F(ExternalDataUseObserverTest, LabelRemoved) { 341 TEST_F(ExternalDataUseObserverTest, LabelRemoved) {
278 std::vector<std::string> labels; 342 std::vector<std::string> labels;
(...skipping 14 matching lines...) Expand all
293 labels.push_back("label_1"); 357 labels.push_back("label_1");
294 labels.push_back("label_4"); 358 labels.push_back("label_4");
295 labels.push_back("label_5"); 359 labels.push_back("label_5");
296 external_data_use_observer()->RegisterURLRegexes( 360 external_data_use_observer()->RegisterURLRegexes(
297 std::vector<std::string>(labels.size(), std::string()), 361 std::vector<std::string>(labels.size(), std::string()),
298 std::vector<std::string>(labels.size(), "http://foobar.com"), labels); 362 std::vector<std::string>(labels.size(), "http://foobar.com"), labels);
299 } 363 }
300 364
301 // Verifies that buffer size does not exceed the specified limit. 365 // Verifies that buffer size does not exceed the specified limit.
302 TEST_F(ExternalDataUseObserverTest, BufferSize) { 366 TEST_F(ExternalDataUseObserverTest, BufferSize) {
303 const char kLabel[] = "label"; 367 base::HistogramTester histogram_tester;
304 368
305 std::vector<std::string> url_regexes; 369 AddDefaultMatchingRule();
306 url_regexes.push_back(
307 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
308
309 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
310 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
311 std::vector<std::string>(url_regexes.size(), kLabel));
312
313 const int64_t bytes_downloaded =
314 external_data_use_observer()->data_use_report_min_bytes_;
315 const int64_t bytes_uploaded = 1;
316 370
317 // Push more entries than the buffer size. Buffer size should not be exceeded. 371 // Push more entries than the buffer size. Buffer size should not be exceeded.
318 for (size_t i = 0; i < ExternalDataUseObserver::kMaxBufferSize * 2; ++i) { 372 for (size_t i = 0; i < ExternalDataUseObserver::kMaxBufferSize * 2; ++i) {
319 data_usage::DataUse data_use( 373 data_usage::DataUse data_use = default_data_use();
320 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 374 data_use.mcc_mnc = "mccmnc" + base::Int64ToString(i);
321 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
322 "mccmnc" + base::Int64ToString(i), bytes_uploaded, bytes_downloaded);
323 external_data_use_observer()->OnDataUse(data_use); 375 external_data_use_observer()->OnDataUse(data_use);
324 } 376 }
325 377
326 EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_); 378 EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_);
327 379
328 // Verify that total buffered bytes is computed correctly. 380 // Verify that total buffered bytes is computed correctly.
329 EXPECT_EQ(static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize * 381 EXPECT_EQ(
330 (bytes_downloaded + bytes_uploaded)), 382 static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize *
331 external_data_use_observer()->total_bytes_buffered_); 383 (default_upload_bytes() + default_download_bytes())),
384 external_data_use_observer()->total_bytes_buffered_);
332 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize, 385 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize,
333 buffered_data_reports().size()); 386 buffered_data_reports().size());
334 387
335 // Verify the label of the data use report. 388 // Verify the label of the data use report.
336 for (const auto& it : buffered_data_reports()) 389 for (const auto& it : buffered_data_reports())
337 EXPECT_EQ(kLabel, it.first.label); 390 EXPECT_EQ(kDefaultLabel, it.first.label);
391
392 // Verify that metrics were updated correctly for the lost reports.
393 histogram_tester.ExpectUniqueSample(
394 "DataUsage.ReportSubmissionResult", 3,
395 ExternalDataUseObserver::kMaxBufferSize - 1);
396 histogram_tester.ExpectUniqueSample(
397 "DataUsage.ReportSubmission.Lost.Bytes",
398 default_upload_bytes() + default_download_bytes(),
399 ExternalDataUseObserver::kMaxBufferSize - 1);
338 } 400 }
339 401
340 // Tests that buffered data use reports are merged correctly. 402 // Tests that buffered data use reports are merged correctly.
341 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { 403 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) {
342 const char kLabel[] = "label"; 404 AddDefaultMatchingRule();
343
344 std::vector<std::string> url_regexes;
345 url_regexes.push_back(
346 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
347
348 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
349 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
350 std::vector<std::string>(url_regexes.size(), kLabel));
351 405
352 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 406 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
353 407
354 for (size_t i = 0; i < num_iterations; ++i) { 408 for (size_t i = 0; i < num_iterations; ++i) {
355 data_usage::DataUse data_use_foo( 409 data_usage::DataUse data_use_foo = default_data_use();
356 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 410 data_use_foo.mcc_mnc = kFooMccMnc;
357 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo",
358 external_data_use_observer()->data_use_report_min_bytes_, 1);
359 external_data_use_observer()->OnDataUse(data_use_foo); 411 external_data_use_observer()->OnDataUse(data_use_foo);
360 412
361 data_usage::DataUse data_use_bar( 413 data_usage::DataUse data_use_bar = default_data_use();
362 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 414 data_use_bar.mcc_mnc = kBarMccMnc;
363 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar",
364 external_data_use_observer()->data_use_report_min_bytes_, 1);
365 external_data_use_observer()->OnDataUse(data_use_bar); 415 external_data_use_observer()->OnDataUse(data_use_bar);
366 416
367 data_usage::DataUse data_use_baz( 417 data_usage::DataUse data_use_baz = default_data_use();
368 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 418 data_use_baz.mcc_mnc = kBazMccMnc;
369 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_baz",
370 external_data_use_observer()->data_use_report_min_bytes_, 1);
371 external_data_use_observer()->OnDataUse(data_use_baz); 419 external_data_use_observer()->OnDataUse(data_use_baz);
372 } 420 }
373 421
374 EXPECT_EQ(3U, buffered_data_reports().size()); 422 EXPECT_EQ(3U, buffered_data_reports().size());
375 423
376 // One of the foo reports should have been submitted, and all the other foo 424 // One of the foo reports should have been submitted, and all the other foo
377 // reports should have been merged together. All of the bar and baz reports 425 // reports should have been merged together. All of the bar and baz reports
378 // should have been merged together respectively. 426 // should have been merged together respectively.
379 const struct { 427 const struct {
380 std::string mcc_mnc; 428 std::string mcc_mnc;
381 size_t number_of_merged_reports; 429 size_t number_of_merged_reports;
382 } expected_data_use_reports[] = {{"mccmnc_foo", num_iterations - 1}, 430 } expected_data_use_reports[] = {{kFooMccMnc, num_iterations - 1},
383 {"mccmnc_bar", num_iterations}, 431 {kBarMccMnc, num_iterations},
384 {"mccmnc_baz", num_iterations}}; 432 {kBazMccMnc, num_iterations}};
385 433
386 for (const auto& expected_report : expected_data_use_reports) { 434 for (const auto& expected_report : expected_data_use_reports) {
387 const ExternalDataUseObserver::DataUseReportKey key( 435 const ExternalDataUseObserver::DataUseReportKey key(
388 kLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 436 kDefaultLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
389 expected_report.mcc_mnc); 437 expected_report.mcc_mnc);
390 438
391 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key)); 439 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key));
392 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports), 440 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports) *
441 (default_download_bytes()),
393 buffered_data_reports().find(key)->second.bytes_downloaded); 442 buffered_data_reports().find(key)->second.bytes_downloaded);
394 EXPECT_EQ(static_cast<int64_t>( 443 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports *
395 expected_report.number_of_merged_reports * 444 (default_upload_bytes())),
396 external_data_use_observer()->data_use_report_min_bytes_),
397 buffered_data_reports().find(key)->second.bytes_uploaded); 445 buffered_data_reports().find(key)->second.bytes_uploaded);
398 } 446 }
399 } 447 }
400 448
401 // Tests that timestamps of merged reports is correct. 449 // Tests that timestamps of merged reports is correct.
402 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) { 450 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) {
403 const char kLabel[] = "label"; 451 AddDefaultMatchingRule();
404
405 std::vector<std::string> url_regexes;
406 url_regexes.push_back(
407 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
408
409 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
410 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
411 std::vector<std::string>(url_regexes.size(), kLabel));
412 452
413 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 453 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
414 454
415 base::Time start_timestamp = base::Time::UnixEpoch(); 455 base::Time start_timestamp = base::Time::UnixEpoch();
416 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1); 456 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1);
417 for (size_t i = 0; i < num_iterations; ++i) { 457 for (size_t i = 0; i < num_iterations; ++i) {
418 data_usage::DataUse data_use_foo(
419 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
420 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1, 2);
421 external_data_use_observer()->BufferDataUseReport( 458 external_data_use_observer()->BufferDataUseReport(
422 data_use_foo, kLabel, start_timestamp, end_timestamp); 459 default_data_use(), kDefaultLabel, start_timestamp, end_timestamp);
423 460
424 start_timestamp += base::TimeDelta::FromSeconds(1); 461 start_timestamp += base::TimeDelta::FromSeconds(1);
425 end_timestamp += base::TimeDelta::FromSeconds(1); 462 end_timestamp += base::TimeDelta::FromSeconds(1);
426 } 463 }
427 464
428 EXPECT_EQ(1U, buffered_data_reports().size()); 465 EXPECT_EQ(1U, buffered_data_reports().size());
429 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime()); 466 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime());
430 // Convert from seconds to milliseconds. 467 // Convert from seconds to milliseconds.
431 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000), 468 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000),
432 buffered_data_reports().begin()->second.end_time.ToJavaTime()); 469 buffered_data_reports().begin()->second.end_time.ToJavaTime());
433 } 470 }
434 471
435 // Tests the behavior when multiple matching rules are available for URL and 472 // Tests the behavior when multiple matching rules are available for URL and
436 // package name matching. 473 // package name matching.
437 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { 474 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) {
438 std::vector<std::string> url_regexes; 475 std::vector<std::string> url_regexes;
439 url_regexes.push_back( 476 url_regexes.push_back(
440 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); 477 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*");
441 url_regexes.push_back( 478 url_regexes.push_back(
442 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*"); 479 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*");
443 480
444 std::vector<std::string> labels; 481 std::vector<std::string> labels;
445 const char kLabelFoo[] = "label_foo"; 482 labels.push_back(kFooLabel);
446 const char kLabelBar[] = "label_bar"; 483 labels.push_back(kBarLabel);
447 labels.push_back(kLabelFoo);
448 labels.push_back(kLabelBar);
449 484
450 std::vector<std::string> app_package_names; 485 std::vector<std::string> app_package_names;
451 const char kAppFoo[] = "com.example.foo"; 486 const char kAppFoo[] = "com.example.foo";
452 const char kAppBar[] = "com.example.bar"; 487 const char kAppBar[] = "com.example.bar";
453 app_package_names.push_back(kAppFoo); 488 app_package_names.push_back(kAppFoo);
454 app_package_names.push_back(kAppBar); 489 app_package_names.push_back(kAppBar);
455 490
456 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( 491 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
457 app_package_names, url_regexes, labels); 492 app_package_names, url_regexes, labels);
458 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); 493 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size());
459 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 494 EXPECT_TRUE(external_data_use_observer()
495 ->last_data_report_submitted_ticks_.is_null());
460 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 496 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
461 497
462 // Check |kLabelFoo| matching rule. 498 // Check |kLabelFoo| matching rule.
463 data_usage::DataUse data_foo_1( 499 data_usage::DataUse data_foo = default_data_use();
464 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 500 data_foo.url = GURL("http://www.foo.com/#q=abc");
465 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", 501 data_foo.mcc_mnc = kFooMccMnc;
466 external_data_use_observer()->data_use_report_min_bytes_, 0); 502 external_data_use_observer()->OnDataUse(data_foo);
467 external_data_use_observer()->OnDataUse(data_foo_1);
468 data_usage::DataUse data_foo_2(
469 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
470 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2",
471 external_data_use_observer()->data_use_report_min_bytes_, 0);
472 external_data_use_observer()->OnDataUse(data_foo_2);
473
474 // The foo1 report should have been submitted.
475 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_);
476
477 // Only the foo2 report should be present.
478 EXPECT_EQ(1U, buffered_data_reports().size());
479 const ExternalDataUseObserver::DataUseReportKey key_foo_2(
480 kLabelFoo, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2");
481 EXPECT_NE(buffered_data_reports().end(),
482 buffered_data_reports().find(key_foo_2));
483 503
484 // Check |kLabelBar| matching rule. 504 // Check |kLabelBar| matching rule.
485 data_usage::DataUse data_bar( 505 data_usage::DataUse data_bar = default_data_use();
486 GURL("http://www.bar.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 506 data_bar.url = GURL("http://www.bar.com/#q=abc");
487 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc", 0, 0); 507 data_bar.mcc_mnc = kBarMccMnc;
488 external_data_use_observer()->OnDataUse(data_bar); 508 external_data_use_observer()->OnDataUse(data_bar);
489 509
490 // Both the foo2 and bar reports should be present. 510 // bar report should be present.
491 EXPECT_EQ(2U, buffered_data_reports().size()); 511 EXPECT_EQ(1U, buffered_data_reports().size());
492 EXPECT_NE(buffered_data_reports().end(),
493 buffered_data_reports().find(key_foo_2));
494 512
495 const ExternalDataUseObserver::DataUseReportKey key_bar( 513 const ExternalDataUseObserver::DataUseReportKey key_bar(
496 kLabelBar, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc"); 514 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
497 EXPECT_NE(buffered_data_reports().end(), 515 EXPECT_NE(buffered_data_reports().end(),
498 buffered_data_reports().find(key_bar)); 516 buffered_data_reports().find(key_bar));
499 517
500 // Test if labels are matched properly for app package names. 518 // Test if labels are matched properly for app package names.
501 std::string got_label; 519 std::string got_label;
502 EXPECT_TRUE( 520 EXPECT_TRUE(
503 external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label)); 521 external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label));
504 EXPECT_EQ(kLabelFoo, got_label); 522 EXPECT_EQ(kFooLabel, got_label);
505 523
506 got_label = ""; 524 got_label = "";
507 EXPECT_TRUE( 525 EXPECT_TRUE(
508 external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label)); 526 external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label));
509 EXPECT_EQ(kLabelBar, got_label); 527 EXPECT_EQ(kBarLabel, got_label);
510 528
511 got_label = ""; 529 got_label = "";
512 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 530 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
513 "com.example.unmatched", &got_label)); 531 "com.example.unmatched", &got_label));
514 EXPECT_EQ(std::string(), got_label); 532 EXPECT_EQ(std::string(), got_label);
515 533
516 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 534 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
517 std::string(), &got_label)); 535 std::string(), &got_label));
518 EXPECT_EQ(std::string(), got_label); 536 EXPECT_EQ(std::string(), got_label);
519 } 537 }
520 538
521 // Tests that hash function reports distinct values. This test may fail if there 539 // Tests that hash function reports distinct values. This test may fail if there
522 // is a hash collision, however the chances of that happening are very low. 540 // is a hash collision, however the chances of that happening are very low.
523 TEST_F(ExternalDataUseObserverTest, HashFunction) { 541 TEST_F(ExternalDataUseObserverTest, HashFunction) {
524 ExternalDataUseObserver::DataUseReportKeyHash hash; 542 ExternalDataUseObserver::DataUseReportKeyHash hash;
525 543
526 ExternalDataUseObserver::DataUseReportKey foo( 544 ExternalDataUseObserver::DataUseReportKey foo(
527 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 545 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
528 "foo_mcc_mnc");
529 ExternalDataUseObserver::DataUseReportKey bar_label( 546 ExternalDataUseObserver::DataUseReportKey bar_label(
530 "bar_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 547 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
531 "foo_mcc_mnc");
532 ExternalDataUseObserver::DataUseReportKey bar_network_type( 548 ExternalDataUseObserver::DataUseReportKey bar_network_type(
533 "foo_label", net::NetworkChangeNotifier::CONNECTION_WIFI, "foo_mcc_mnc"); 549 kFooLabel, net::NetworkChangeNotifier::CONNECTION_WIFI, kFooMccMnc);
534 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc( 550 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc(
535 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 551 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
536 "bar_mcc_mnc");
537 552
538 EXPECT_NE(hash(foo), hash(bar_label)); 553 EXPECT_NE(hash(foo), hash(bar_label));
539 EXPECT_NE(hash(foo), hash(bar_label)); 554 EXPECT_NE(hash(foo), hash(bar_label));
540 EXPECT_NE(hash(foo), hash(bar_network_type)); 555 EXPECT_NE(hash(foo), hash(bar_network_type));
541 EXPECT_NE(hash(foo), hash(bar_mcc_mnc)); 556 EXPECT_NE(hash(foo), hash(bar_mcc_mnc));
542 } 557 }
543 558
544 // Tests if matching rules are fetched periodically. 559 // Tests if matching rules are fetched periodically.
545 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { 560 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) {
546 const char kLabel[] = "label"; 561 AddDefaultMatchingRule();
547
548 std::vector<std::string> url_regexes;
549 url_regexes.push_back(
550 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
551
552 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
553 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
554 std::vector<std::string>(url_regexes.size(), kLabel));
555 562
556 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 563 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
557 EXPECT_FALSE( 564 EXPECT_FALSE(
558 external_data_use_observer()->last_matching_rules_fetch_time_.is_null()); 565 external_data_use_observer()->last_matching_rules_fetch_time_.is_null());
559 566
560 // Change the time when the fetching rules were fetched. 567 // Change the time when the fetching rules were fetched.
561 external_data_use_observer()->last_matching_rules_fetch_time_ = 568 external_data_use_observer()->last_matching_rules_fetch_time_ =
562 base::TimeTicks::Now() - 569 base::TimeTicks::Now() -
563 external_data_use_observer()->fetch_matching_rules_duration_; 570 external_data_use_observer()->fetch_matching_rules_duration_;
564 // Matching rules should be expired. 571 // Matching rules should be expired.
565 EXPECT_GE(base::TimeTicks::Now() - 572 EXPECT_GE(base::TimeTicks::Now() -
566 external_data_use_observer()->last_matching_rules_fetch_time_, 573 external_data_use_observer()->last_matching_rules_fetch_time_,
567 external_data_use_observer()->fetch_matching_rules_duration_); 574 external_data_use_observer()->fetch_matching_rules_duration_);
568 575
569 // OnDataUse should trigger fetching of matching rules. 576 // OnDataUse should trigger fetching of matching rules.
570 data_usage::DataUse data_use_foo( 577 external_data_use_observer()->OnDataUse(default_data_use());
571 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
572 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo",
573 external_data_use_observer()->data_use_report_min_bytes_, 1);
574 external_data_use_observer()->OnDataUse(data_use_foo);
575 578
576 // Matching rules should not be expired. 579 // Matching rules should not be expired.
577 EXPECT_LT(base::TimeTicks::Now() - 580 EXPECT_LT(base::TimeTicks::Now() -
578 external_data_use_observer()->last_matching_rules_fetch_time_, 581 external_data_use_observer()->last_matching_rules_fetch_time_,
579 external_data_use_observer()->fetch_matching_rules_duration_); 582 external_data_use_observer()->fetch_matching_rules_duration_);
580 } 583 }
581 584
582 // Tests if data use reports are sent only after the total bytes send/received 585 // Tests if data use reports are sent only after the total bytes send/received
583 // across all buffered reports have reached the specified threshold. 586 // across all buffered reports have reached the specified threshold.
584 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) { 587 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) {
585 const char kLabel[] = "label"; 588 AddDefaultMatchingRule();
586 589 TriggerTabTrackingOnDefaultTab();
587 std::vector<std::string> url_regexes;
588 url_regexes.push_back(
589 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
590
591 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
592 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
593 std::vector<std::string>(url_regexes.size(), kLabel));
594 590
595 // This tests reports 1024 bytes in each loop iteration. For the test to work 591 // This tests reports 1024 bytes in each loop iteration. For the test to work
596 // properly, |data_use_report_min_bytes_| should be a multiple of 1024. 592 // properly, |data_use_report_min_bytes_| should be a multiple of 1024.
597 ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024); 593 ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024);
598 594
599 const size_t num_iterations = 595 const size_t num_iterations =
600 external_data_use_observer()->data_use_report_min_bytes_ / 1024; 596 external_data_use_observer()->data_use_report_min_bytes_ / 1024;
601 597
602 for (size_t i = 0; i < num_iterations; ++i) { 598 for (size_t i = 0; i < num_iterations; ++i) {
603 data_usage::DataUse data_use_foo( 599 data_usage::DataUse data_use = default_data_use();
604 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 600 data_use.tx_bytes = 1024;
605 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0); 601 data_use.rx_bytes = 0;
606 external_data_use_observer()->OnDataUse(data_use_foo); 602 external_data_use_observer()->OnDataUse(data_use);
607 603
608 if (i != num_iterations - 1) { 604 if (i != num_iterations - 1) {
609 // Total buffered bytes is less than the minimum threshold. Data use 605 // Total buffered bytes is less than the minimum threshold. Data use
610 // report should not be send. 606 // report should not be send.
611 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 607 EXPECT_TRUE(external_data_use_observer()
608 ->last_data_report_submitted_ticks_.is_null());
612 EXPECT_EQ(static_cast<int64_t>(i + 1), 609 EXPECT_EQ(static_cast<int64_t>(i + 1),
613 external_data_use_observer()->total_bytes_buffered_ / 1024); 610 external_data_use_observer()->total_bytes_buffered_ / 1024);
611 EXPECT_EQ(0, external_data_use_observer()->pending_report_bytes_);
614 612
615 } else { 613 } else {
616 // Total bytes is at least the minimum threshold. This should trigger 614 // Total bytes is at least the minimum threshold. This should trigger
617 // submitting of the buffered data use report. 615 // submitting of the buffered data use report.
618 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); 616 EXPECT_FALSE(external_data_use_observer()
617 ->last_data_report_submitted_ticks_.is_null());
619 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 618 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
620 } 619 }
621 } 620 }
622 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 621 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
622 EXPECT_EQ(static_cast<int64_t>(num_iterations),
623 external_data_use_observer()->pending_report_bytes_ / 1024);
624
625 base::HistogramTester histogram_tester;
626 external_data_use_observer()->OnReportDataUseDoneOnIOThread(true);
627
628 // Verify that metrics were updated correctly for the report that was
629 // successfully submitted.
630 histogram_tester.ExpectUniqueSample("DataUsage.ReportSubmissionResult", 0, 1);
sclittle 2015/12/07 21:44:08 Could you make the SubmissionResult enum public in
tbansal1 2015/12/08 00:08:16 Done.
631 histogram_tester.ExpectUniqueSample(
632 "DataUsage.ReportSubmission.Successful.Bytes",
633 external_data_use_observer()->data_use_report_min_bytes_, 1);
634
635 // Verify that metrics were updated correctly for the report that was not
636 // successfully submitted.
637 external_data_use_observer()->OnDataUse(default_data_use());
638 external_data_use_observer()->OnReportDataUseDoneOnIOThread(false);
639 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 2);
640 histogram_tester.ExpectBucketCount("DataUsage.ReportSubmissionResult", 1, 1);
641 histogram_tester.ExpectUniqueSample(
642 "DataUsage.ReportSubmission.Failed.Bytes",
643 external_data_use_observer()->data_use_report_min_bytes_, 1);
623 } 644 }
624 645
625 // Tests if the parameters from the field trial are populated correctly. 646 // Tests if the parameters from the field trial are populated correctly.
626 TEST_F(ExternalDataUseObserverTest, Variations) { 647 TEST_F(ExternalDataUseObserverTest, Variations) {
627 EXPECT_EQ(base::TimeDelta::FromSeconds(60 * 15),
628 external_data_use_observer()->fetch_matching_rules_duration_);
629 EXPECT_EQ(100 * 1024,
630 external_data_use_observer()->data_use_report_min_bytes_);
631
632 variations::testing::ClearAllVariationParams();
633 std::map<std::string, std::string> variation_params; 648 std::map<std::string, std::string> variation_params;
634 649
635 const int kFetchMatchingRulesDurationSeconds = 10000; 650 const int kFetchMatchingRulesDurationSeconds = 10000;
651 const int kDefaultMaxDataReportSubmitWaitMsec = 20000;
636 const int64_t kDataUseReportMinBytes = 5000; 652 const int64_t kDataUseReportMinBytes = 5000;
637 variation_params["fetch_matching_rules_duration_seconds"] = 653 variation_params["fetch_matching_rules_duration_seconds"] =
638 base::Int64ToString(kFetchMatchingRulesDurationSeconds); 654 base::Int64ToString(kFetchMatchingRulesDurationSeconds);
655 variation_params["data_report_submit_timeout_msec"] =
656 base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec);
639 variation_params["data_use_report_min_bytes"] = 657 variation_params["data_use_report_min_bytes"] =
640 base::Int64ToString(kDataUseReportMinBytes); 658 base::Int64ToString(kDataUseReportMinBytes);
641 659
642 ASSERT_TRUE(variations::AssociateVariationParams( 660 // Create another ExternalDataUseObserver object.
643 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", 661 ReplaceExternalDataUseObserver(variation_params);
644 variation_params)); 662 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds),
663 external_data_use_observer()->fetch_matching_rules_duration_);
664 EXPECT_EQ(
665 base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec),
666 external_data_use_observer()->data_report_submit_timeout_);
667 EXPECT_EQ(kDataUseReportMinBytes,
668 external_data_use_observer()->data_use_report_min_bytes_);
669 }
645 670
646 base::FieldTrialList field_trial_list(nullptr); 671 // Tests if the metrics are recorded correctly.
672 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) {
673 std::map<std::string, std::string> variation_params;
674 variation_params["data_report_submit_timeout_msec"] = "0";
675 variation_params["data_use_report_min_bytes"] = "0";
647 676
648 base::FieldTrialList::CreateFieldTrial( 677 // Create another ExternalDataUseObserver object.
649 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); 678 ReplaceExternalDataUseObserver(variation_params);
679 AddDefaultMatchingRule();
650 680
651 // Create another ExternalDataUseObserver object. This would fetch variation 681 base::HistogramTester histogram_tester;
652 // params. 682 TriggerTabTrackingOnDefaultTab();
653 scoped_ptr<ExternalDataUseObserver> 683 external_data_use_observer()->OnDataUse(default_data_use());
654 external_data_use_obsever_with_variations = Create(); 684 external_data_use_observer()->OnDataUse(default_data_use());
655 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), 685 // First data use report should be marked as timed out.
656 external_data_use_obsever_with_variations 686 histogram_tester.ExpectUniqueSample("DataUsage.ReportSubmissionResult", 2, 1);
657 ->fetch_matching_rules_duration_); 687 histogram_tester.ExpectUniqueSample(
658 EXPECT_EQ( 688 "DataUsage.ReportSubmission.TimedOut.Bytes",
659 kDataUseReportMinBytes, 689 default_upload_bytes() + default_download_bytes(), 1);
660 external_data_use_obsever_with_variations->data_use_report_min_bytes_);
661 } 690 }
662 691
663 } // namespace android 692 } // namespace android
664 693
665 } // namespace chrome 694 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698