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

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 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",
395 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_LOST,
396 ExternalDataUseObserver::kMaxBufferSize - 1);
397 histogram_tester.ExpectUniqueSample(
398 "DataUsage.ReportSubmission.Lost.Bytes",
399 default_upload_bytes() + default_download_bytes(),
400 ExternalDataUseObserver::kMaxBufferSize - 1);
338 } 401 }
339 402
340 // Tests that buffered data use reports are merged correctly. 403 // Tests that buffered data use reports are merged correctly.
341 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { 404 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) {
342 const char kLabel[] = "label"; 405 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 406
352 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 407 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
353 408
354 for (size_t i = 0; i < num_iterations; ++i) { 409 for (size_t i = 0; i < num_iterations; ++i) {
355 data_usage::DataUse data_use_foo( 410 data_usage::DataUse data_use_foo = default_data_use();
356 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 411 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); 412 external_data_use_observer()->OnDataUse(data_use_foo);
360 413
361 data_usage::DataUse data_use_bar( 414 data_usage::DataUse data_use_bar = default_data_use();
362 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 415 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); 416 external_data_use_observer()->OnDataUse(data_use_bar);
366 417
367 data_usage::DataUse data_use_baz( 418 data_usage::DataUse data_use_baz = default_data_use();
368 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 419 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); 420 external_data_use_observer()->OnDataUse(data_use_baz);
372 } 421 }
373 422
374 EXPECT_EQ(3U, buffered_data_reports().size()); 423 EXPECT_EQ(3U, buffered_data_reports().size());
375 424
376 // One of the foo reports should have been submitted, and all the other foo 425 // 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 426 // reports should have been merged together. All of the bar and baz reports
378 // should have been merged together respectively. 427 // should have been merged together respectively.
379 const struct { 428 const struct {
380 std::string mcc_mnc; 429 std::string mcc_mnc;
381 size_t number_of_merged_reports; 430 size_t number_of_merged_reports;
382 } expected_data_use_reports[] = {{"mccmnc_foo", num_iterations - 1}, 431 } expected_data_use_reports[] = {{kFooMccMnc, num_iterations - 1},
383 {"mccmnc_bar", num_iterations}, 432 {kBarMccMnc, num_iterations},
384 {"mccmnc_baz", num_iterations}}; 433 {kBazMccMnc, num_iterations}};
385 434
386 for (const auto& expected_report : expected_data_use_reports) { 435 for (const auto& expected_report : expected_data_use_reports) {
387 const ExternalDataUseObserver::DataUseReportKey key( 436 const ExternalDataUseObserver::DataUseReportKey key(
388 kLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 437 kDefaultLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
389 expected_report.mcc_mnc); 438 expected_report.mcc_mnc);
390 439
391 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key)); 440 EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key));
392 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports), 441 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports) *
442 (default_download_bytes()),
393 buffered_data_reports().find(key)->second.bytes_downloaded); 443 buffered_data_reports().find(key)->second.bytes_downloaded);
394 EXPECT_EQ(static_cast<int64_t>( 444 EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports *
395 expected_report.number_of_merged_reports * 445 (default_upload_bytes())),
396 external_data_use_observer()->data_use_report_min_bytes_),
397 buffered_data_reports().find(key)->second.bytes_uploaded); 446 buffered_data_reports().find(key)->second.bytes_uploaded);
398 } 447 }
399 } 448 }
400 449
401 // Tests that timestamps of merged reports is correct. 450 // Tests that timestamps of merged reports is correct.
402 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) { 451 TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) {
403 const char kLabel[] = "label"; 452 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 453
413 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; 454 const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2;
414 455
415 base::Time start_timestamp = base::Time::UnixEpoch(); 456 base::Time start_timestamp = base::Time::UnixEpoch();
416 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1); 457 base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1);
417 for (size_t i = 0; i < num_iterations; ++i) { 458 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( 459 external_data_use_observer()->BufferDataUseReport(
422 data_use_foo, kLabel, start_timestamp, end_timestamp); 460 default_data_use(), kDefaultLabel, start_timestamp, end_timestamp);
423 461
424 start_timestamp += base::TimeDelta::FromSeconds(1); 462 start_timestamp += base::TimeDelta::FromSeconds(1);
425 end_timestamp += base::TimeDelta::FromSeconds(1); 463 end_timestamp += base::TimeDelta::FromSeconds(1);
426 } 464 }
427 465
428 EXPECT_EQ(1U, buffered_data_reports().size()); 466 EXPECT_EQ(1U, buffered_data_reports().size());
429 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime()); 467 EXPECT_EQ(0, buffered_data_reports().begin()->second.start_time.ToJavaTime());
430 // Convert from seconds to milliseconds. 468 // Convert from seconds to milliseconds.
431 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000), 469 EXPECT_EQ(static_cast<int64_t>(num_iterations * 1000),
432 buffered_data_reports().begin()->second.end_time.ToJavaTime()); 470 buffered_data_reports().begin()->second.end_time.ToJavaTime());
433 } 471 }
434 472
435 // Tests the behavior when multiple matching rules are available for URL and 473 // Tests the behavior when multiple matching rules are available for URL and
436 // package name matching. 474 // package name matching.
437 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { 475 TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) {
438 std::vector<std::string> url_regexes; 476 std::vector<std::string> url_regexes;
439 url_regexes.push_back( 477 url_regexes.push_back(
440 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); 478 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*");
441 url_regexes.push_back( 479 url_regexes.push_back(
442 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*"); 480 "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*");
443 481
444 std::vector<std::string> labels; 482 std::vector<std::string> labels;
445 const char kLabelFoo[] = "label_foo"; 483 labels.push_back(kFooLabel);
446 const char kLabelBar[] = "label_bar"; 484 labels.push_back(kBarLabel);
447 labels.push_back(kLabelFoo);
448 labels.push_back(kLabelBar);
449 485
450 std::vector<std::string> app_package_names; 486 std::vector<std::string> app_package_names;
451 const char kAppFoo[] = "com.example.foo"; 487 const char kAppFoo[] = "com.example.foo";
452 const char kAppBar[] = "com.example.bar"; 488 const char kAppBar[] = "com.example.bar";
453 app_package_names.push_back(kAppFoo); 489 app_package_names.push_back(kAppFoo);
454 app_package_names.push_back(kAppBar); 490 app_package_names.push_back(kAppBar);
455 491
456 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( 492 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
457 app_package_names, url_regexes, labels); 493 app_package_names, url_regexes, labels);
458 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); 494 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size());
459 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 495 EXPECT_TRUE(external_data_use_observer()
496 ->last_data_report_submitted_ticks_.is_null());
460 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 497 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
461 498
462 // Check |kLabelFoo| matching rule. 499 // Check |kLabelFoo| matching rule.
463 data_usage::DataUse data_foo_1( 500 data_usage::DataUse data_foo = default_data_use();
464 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 501 data_foo.url = GURL("http://www.foo.com/#q=abc");
465 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", 502 data_foo.mcc_mnc = kFooMccMnc;
466 external_data_use_observer()->data_use_report_min_bytes_, 0); 503 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 504
484 // Check |kLabelBar| matching rule. 505 // Check |kLabelBar| matching rule.
485 data_usage::DataUse data_bar( 506 data_usage::DataUse data_bar = default_data_use();
486 GURL("http://www.bar.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 507 data_bar.url = GURL("http://www.bar.com/#q=abc");
487 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc", 0, 0); 508 data_bar.mcc_mnc = kBarMccMnc;
488 external_data_use_observer()->OnDataUse(data_bar); 509 external_data_use_observer()->OnDataUse(data_bar);
489 510
490 // Both the foo2 and bar reports should be present. 511 // bar report should be present.
491 EXPECT_EQ(2U, buffered_data_reports().size()); 512 EXPECT_EQ(1U, buffered_data_reports().size());
492 EXPECT_NE(buffered_data_reports().end(),
493 buffered_data_reports().find(key_foo_2));
494 513
495 const ExternalDataUseObserver::DataUseReportKey key_bar( 514 const ExternalDataUseObserver::DataUseReportKey key_bar(
496 kLabelBar, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc"); 515 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
497 EXPECT_NE(buffered_data_reports().end(), 516 EXPECT_NE(buffered_data_reports().end(),
498 buffered_data_reports().find(key_bar)); 517 buffered_data_reports().find(key_bar));
499 518
500 // Test if labels are matched properly for app package names. 519 // Test if labels are matched properly for app package names.
501 std::string got_label; 520 std::string got_label;
502 EXPECT_TRUE( 521 EXPECT_TRUE(
503 external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label)); 522 external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label));
504 EXPECT_EQ(kLabelFoo, got_label); 523 EXPECT_EQ(kFooLabel, got_label);
505 524
506 got_label = ""; 525 got_label = "";
507 EXPECT_TRUE( 526 EXPECT_TRUE(
508 external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label)); 527 external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label));
509 EXPECT_EQ(kLabelBar, got_label); 528 EXPECT_EQ(kBarLabel, got_label);
510 529
511 got_label = ""; 530 got_label = "";
512 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 531 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
513 "com.example.unmatched", &got_label)); 532 "com.example.unmatched", &got_label));
514 EXPECT_EQ(std::string(), got_label); 533 EXPECT_EQ(std::string(), got_label);
515 534
516 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( 535 EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName(
517 std::string(), &got_label)); 536 std::string(), &got_label));
518 EXPECT_EQ(std::string(), got_label); 537 EXPECT_EQ(std::string(), got_label);
519 } 538 }
520 539
521 // Tests that hash function reports distinct values. This test may fail if there 540 // 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. 541 // is a hash collision, however the chances of that happening are very low.
523 TEST_F(ExternalDataUseObserverTest, HashFunction) { 542 TEST_F(ExternalDataUseObserverTest, HashFunction) {
524 ExternalDataUseObserver::DataUseReportKeyHash hash; 543 ExternalDataUseObserver::DataUseReportKeyHash hash;
525 544
526 ExternalDataUseObserver::DataUseReportKey foo( 545 ExternalDataUseObserver::DataUseReportKey foo(
527 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 546 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
528 "foo_mcc_mnc");
529 ExternalDataUseObserver::DataUseReportKey bar_label( 547 ExternalDataUseObserver::DataUseReportKey bar_label(
530 "bar_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 548 kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc);
531 "foo_mcc_mnc");
532 ExternalDataUseObserver::DataUseReportKey bar_network_type( 549 ExternalDataUseObserver::DataUseReportKey bar_network_type(
533 "foo_label", net::NetworkChangeNotifier::CONNECTION_WIFI, "foo_mcc_mnc"); 550 kFooLabel, net::NetworkChangeNotifier::CONNECTION_WIFI, kFooMccMnc);
534 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc( 551 ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc(
535 "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 552 kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc);
536 "bar_mcc_mnc");
537 553
538 EXPECT_NE(hash(foo), hash(bar_label)); 554 EXPECT_NE(hash(foo), hash(bar_label));
539 EXPECT_NE(hash(foo), hash(bar_label)); 555 EXPECT_NE(hash(foo), hash(bar_label));
540 EXPECT_NE(hash(foo), hash(bar_network_type)); 556 EXPECT_NE(hash(foo), hash(bar_network_type));
541 EXPECT_NE(hash(foo), hash(bar_mcc_mnc)); 557 EXPECT_NE(hash(foo), hash(bar_mcc_mnc));
542 } 558 }
543 559
544 // Tests if matching rules are fetched periodically. 560 // Tests if matching rules are fetched periodically.
545 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { 561 TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) {
546 const char kLabel[] = "label"; 562 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 563
556 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 564 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
557 EXPECT_FALSE( 565 EXPECT_FALSE(
558 external_data_use_observer()->last_matching_rules_fetch_time_.is_null()); 566 external_data_use_observer()->last_matching_rules_fetch_time_.is_null());
559 567
560 // Change the time when the fetching rules were fetched. 568 // Change the time when the fetching rules were fetched.
561 external_data_use_observer()->last_matching_rules_fetch_time_ = 569 external_data_use_observer()->last_matching_rules_fetch_time_ =
562 base::TimeTicks::Now() - 570 base::TimeTicks::Now() -
563 external_data_use_observer()->fetch_matching_rules_duration_; 571 external_data_use_observer()->fetch_matching_rules_duration_;
564 // Matching rules should be expired. 572 // Matching rules should be expired.
565 EXPECT_GE(base::TimeTicks::Now() - 573 EXPECT_GE(base::TimeTicks::Now() -
566 external_data_use_observer()->last_matching_rules_fetch_time_, 574 external_data_use_observer()->last_matching_rules_fetch_time_,
567 external_data_use_observer()->fetch_matching_rules_duration_); 575 external_data_use_observer()->fetch_matching_rules_duration_);
568 576
569 // OnDataUse should trigger fetching of matching rules. 577 // OnDataUse should trigger fetching of matching rules.
570 data_usage::DataUse data_use_foo( 578 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 579
576 // Matching rules should not be expired. 580 // Matching rules should not be expired.
577 EXPECT_LT(base::TimeTicks::Now() - 581 EXPECT_LT(base::TimeTicks::Now() -
578 external_data_use_observer()->last_matching_rules_fetch_time_, 582 external_data_use_observer()->last_matching_rules_fetch_time_,
579 external_data_use_observer()->fetch_matching_rules_duration_); 583 external_data_use_observer()->fetch_matching_rules_duration_);
580 } 584 }
581 585
582 // Tests if data use reports are sent only after the total bytes send/received 586 // Tests if data use reports are sent only after the total bytes send/received
583 // across all buffered reports have reached the specified threshold. 587 // across all buffered reports have reached the specified threshold.
584 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) { 588 TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) {
585 const char kLabel[] = "label"; 589 AddDefaultMatchingRule();
586 590 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 591
595 // This tests reports 1024 bytes in each loop iteration. For the test to work 592 // 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. 593 // 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); 594 ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024);
598 595
599 const size_t num_iterations = 596 const size_t num_iterations =
600 external_data_use_observer()->data_use_report_min_bytes_ / 1024; 597 external_data_use_observer()->data_use_report_min_bytes_ / 1024;
601 598
602 for (size_t i = 0; i < num_iterations; ++i) { 599 for (size_t i = 0; i < num_iterations; ++i) {
603 data_usage::DataUse data_use_foo( 600 data_usage::DataUse data_use = default_data_use();
604 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 601 data_use.tx_bytes = 1024;
605 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0); 602 data_use.rx_bytes = 0;
606 external_data_use_observer()->OnDataUse(data_use_foo); 603 external_data_use_observer()->OnDataUse(data_use);
607 604
608 if (i != num_iterations - 1) { 605 if (i != num_iterations - 1) {
609 // Total buffered bytes is less than the minimum threshold. Data use 606 // Total buffered bytes is less than the minimum threshold. Data use
610 // report should not be send. 607 // report should not be send.
611 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 608 EXPECT_TRUE(external_data_use_observer()
609 ->last_data_report_submitted_ticks_.is_null());
612 EXPECT_EQ(static_cast<int64_t>(i + 1), 610 EXPECT_EQ(static_cast<int64_t>(i + 1),
613 external_data_use_observer()->total_bytes_buffered_ / 1024); 611 external_data_use_observer()->total_bytes_buffered_ / 1024);
612 EXPECT_EQ(0, external_data_use_observer()->pending_report_bytes_);
614 613
615 } else { 614 } else {
616 // Total bytes is at least the minimum threshold. This should trigger 615 // Total bytes is at least the minimum threshold. This should trigger
617 // submitting of the buffered data use report. 616 // submitting of the buffered data use report.
618 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); 617 EXPECT_FALSE(external_data_use_observer()
618 ->last_data_report_submitted_ticks_.is_null());
619 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 619 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
620 } 620 }
621 } 621 }
622 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 622 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
623 EXPECT_EQ(static_cast<int64_t>(num_iterations),
624 external_data_use_observer()->pending_report_bytes_ / 1024);
625
626 base::HistogramTester histogram_tester;
627 external_data_use_observer()->OnReportDataUseDoneOnIOThread(true);
628
629 // Verify that metrics were updated correctly for the report that was
630 // successfully submitted.
631 histogram_tester.ExpectUniqueSample(
632 "DataUsage.ReportSubmissionResult",
633 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_SUCCESSFUL, 1);
634 histogram_tester.ExpectUniqueSample(
635 "DataUsage.ReportSubmission.Successful.Bytes",
636 external_data_use_observer()->data_use_report_min_bytes_, 1);
637
638 // Verify that metrics were updated correctly for the report that was not
639 // successfully submitted.
640 external_data_use_observer()->OnDataUse(default_data_use());
641 external_data_use_observer()->OnReportDataUseDoneOnIOThread(false);
642 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 2);
643 histogram_tester.ExpectBucketCount(
644 "DataUsage.ReportSubmissionResult",
645 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_FAILED, 1);
646 histogram_tester.ExpectUniqueSample(
647 "DataUsage.ReportSubmission.Failed.Bytes",
648 external_data_use_observer()->data_use_report_min_bytes_, 1);
623 } 649 }
624 650
625 // Tests if the parameters from the field trial are populated correctly. 651 // Tests if the parameters from the field trial are populated correctly.
626 TEST_F(ExternalDataUseObserverTest, Variations) { 652 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; 653 std::map<std::string, std::string> variation_params;
634 654
635 const int kFetchMatchingRulesDurationSeconds = 10000; 655 const int kFetchMatchingRulesDurationSeconds = 10000;
656 const int kDefaultMaxDataReportSubmitWaitMsec = 20000;
636 const int64_t kDataUseReportMinBytes = 5000; 657 const int64_t kDataUseReportMinBytes = 5000;
637 variation_params["fetch_matching_rules_duration_seconds"] = 658 variation_params["fetch_matching_rules_duration_seconds"] =
638 base::Int64ToString(kFetchMatchingRulesDurationSeconds); 659 base::Int64ToString(kFetchMatchingRulesDurationSeconds);
660 variation_params["data_report_submit_timeout_msec"] =
661 base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec);
639 variation_params["data_use_report_min_bytes"] = 662 variation_params["data_use_report_min_bytes"] =
640 base::Int64ToString(kDataUseReportMinBytes); 663 base::Int64ToString(kDataUseReportMinBytes);
641 664
642 ASSERT_TRUE(variations::AssociateVariationParams( 665 // Create another ExternalDataUseObserver object.
643 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", 666 ReplaceExternalDataUseObserver(variation_params);
644 variation_params)); 667 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds),
668 external_data_use_observer()->fetch_matching_rules_duration_);
669 EXPECT_EQ(
670 base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec),
671 external_data_use_observer()->data_report_submit_timeout_);
672 EXPECT_EQ(kDataUseReportMinBytes,
673 external_data_use_observer()->data_use_report_min_bytes_);
674 }
645 675
646 base::FieldTrialList field_trial_list(nullptr); 676 // Tests if the metrics are recorded correctly.
677 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) {
678 std::map<std::string, std::string> variation_params;
679 variation_params["data_report_submit_timeout_msec"] = "0";
680 variation_params["data_use_report_min_bytes"] = "0";
647 681
648 base::FieldTrialList::CreateFieldTrial( 682 // Create another ExternalDataUseObserver object.
649 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); 683 ReplaceExternalDataUseObserver(variation_params);
684 AddDefaultMatchingRule();
650 685
651 // Create another ExternalDataUseObserver object. This would fetch variation 686 base::HistogramTester histogram_tester;
652 // params. 687 TriggerTabTrackingOnDefaultTab();
653 scoped_ptr<ExternalDataUseObserver> 688 external_data_use_observer()->OnDataUse(default_data_use());
654 external_data_use_obsever_with_variations = Create(); 689 external_data_use_observer()->OnDataUse(default_data_use());
655 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), 690 // First data use report should be marked as timed out.
656 external_data_use_obsever_with_variations 691 histogram_tester.ExpectUniqueSample(
657 ->fetch_matching_rules_duration_); 692 "DataUsage.ReportSubmissionResult",
658 EXPECT_EQ( 693 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT, 1);
659 kDataUseReportMinBytes, 694 histogram_tester.ExpectUniqueSample(
660 external_data_use_obsever_with_variations->data_use_report_min_bytes_); 695 "DataUsage.ReportSubmission.TimedOut.Bytes",
696 default_upload_bytes() + default_download_bytes(), 1);
661 } 697 }
662 698
663 } // namespace android 699 } // namespace android
664 700
665 } // namespace chrome 701 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698