| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |