Chromium Code Reviews| Index: chrome/browser/android/data_usage/external_data_use_observer_unittest.cc |
| diff --git a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc |
| index 6ffc2dfbfcdbdbf005cb590ed674b12ec511fedd..b15c31d1adb7050870257079573637a993bc8ab7 100644 |
| --- a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc |
| +++ b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc |
| @@ -13,12 +13,14 @@ |
| #include "base/run_loop.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/string_number_conversions.h" |
| +#include "base/test/histogram_tester.h" |
| #include "base/thread_task_runner_handle.h" |
| #include "chrome/browser/android/data_usage/data_use_tab_model_test_utils.h" |
| #include "components/data_usage/core/data_use.h" |
| #include "components/data_usage/core/data_use_aggregator.h" |
| #include "components/data_usage/core/data_use_amortizer.h" |
| #include "components/data_usage/core/data_use_annotator.h" |
| +#include "components/sessions/core/session_id.h" |
| #include "components/variations/variations_associated_data.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| @@ -26,6 +28,19 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| +namespace { |
| + |
| +const char kDefaultLabel[] = "label"; |
| +const SessionID::id_type kDefaultTabId = 0; |
| +const char kDefaultURL[] = "http://www.google.com/#q=abc"; |
| +const char kFooMccMnc[] = "foo_mccmnc"; |
| +const char kBarMccMnc[] = "bar_mccmnc"; |
| +const char kBazMccMnc[] = "baz_mccmnc"; |
| +const char kFooLabel[] = "foo_label"; |
| +const char kBarLabel[] = "bar_label"; |
| + |
| +} // namespace |
| + |
| namespace chrome { |
| namespace android { |
| @@ -50,10 +65,53 @@ class ExternalDataUseObserverTest : public testing::Test { |
| test_data_use_tab_model_); |
| } |
| - scoped_ptr<ExternalDataUseObserver> Create() const { |
| - return scoped_ptr<ExternalDataUseObserver>(new ExternalDataUseObserver( |
| + // Replaces |external_data_use_observer_| with a new ExternalDataUseObserver. |
| + void ReplaceExternalDataUseObserver( |
| + std::map<std::string, std::string> variation_params) { |
| + variations::testing::ClearAllVariationParams(); |
| + ASSERT_TRUE(variations::AssociateVariationParams( |
| + ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", |
| + variation_params)); |
| + |
| + base::FieldTrialList field_trial_list(nullptr); |
| + |
| + base::FieldTrialList::CreateFieldTrial( |
| + ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); |
| + |
| + external_data_use_observer_.reset(new ExternalDataUseObserver( |
| data_use_aggregator_.get(), io_task_runner_.get(), |
| ui_task_runner_.get())); |
| + // |test_data_use_tab_model| is owned by |observer|. |
| + TestDataUseTabModel* test_data_use_tab_model(new TestDataUseTabModel( |
| + external_data_use_observer_.get(), ui_task_runner_.get())); |
| + external_data_use_observer_->data_use_tab_model_.reset( |
| + test_data_use_tab_model); |
| + } |
| + |
| + // Adds a default matching rule to |external_data_use_observer_|. |
| + void AddDefaultMatchingRule() { |
| + std::vector<std::string> url_regexes; |
| + url_regexes.push_back( |
| + "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| + external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| + std::vector<std::string>(url_regexes.size(), std::string()), |
| + url_regexes, |
| + std::vector<std::string>(url_regexes.size(), kDefaultLabel)); |
| + } |
| + |
| + // Notifies DataUseTabModel that tab tracking has started on kDefaultTabId. |
| + void TriggerTabTrackingOnDefaultTab() { |
| + external_data_use_observer_->GetDataUseTabModel()->OnNavigationEvent( |
| + kDefaultTabId, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, |
| + GURL(kDefaultURL), std::string()); |
| + } |
| + |
| + // Returns a default data_usage::DataUse object. |
| + data_usage::DataUse default_data_use() { |
| + return data_usage::DataUse( |
| + GURL(kDefaultURL), base::TimeTicks::Now(), GURL(), kDefaultTabId, |
| + net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "", |
| + default_upload_bytes(), default_download_bytes()); |
| } |
| ExternalDataUseObserver* external_data_use_observer() const { |
| @@ -68,6 +126,12 @@ class ExternalDataUseObserverTest : public testing::Test { |
| return external_data_use_observer_->buffered_data_reports_; |
| } |
| + int64_t default_upload_bytes() const { return 1; } |
| + |
| + int64_t default_download_bytes() const { |
| + return external_data_use_observer_->data_use_report_min_bytes_; |
| + } |
| + |
| private: |
| // Required for creating multiple threads for unit testing. |
| scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; |
| @@ -112,7 +176,7 @@ TEST_F(ExternalDataUseObserverTest, SingleRegex) { |
| // App package name not specified in the matching rule. |
| std::vector<std::string>(1, std::string()), |
| std::vector<std::string>(1, tests[i].regex), |
| - std::vector<std::string>(1, "label")); |
| + std::vector<std::string>(1, kDefaultLabel)); |
| EXPECT_EQ(tests[i].expect_match, |
| external_data_use_observer()->Matches(GURL(tests[i].url), &label)) |
| << i; |
| @@ -120,7 +184,7 @@ TEST_F(ExternalDataUseObserverTest, SingleRegex) { |
| // Verify label matches the expected label. |
| std::string expected_label = ""; |
| if (tests[i].expect_match) |
| - expected_label = "label"; |
| + expected_label = kDefaultLabel; |
| EXPECT_EQ(expected_label, label); |
| EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( |
| @@ -174,7 +238,7 @@ TEST_F(ExternalDataUseObserverTest, TwoRegex) { |
| for (size_t i = 0; i < arraysize(tests); ++i) { |
| std::vector<std::string> url_regexes; |
| url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2); |
| - const std::string label("label"); |
| + const std::string label(kDefaultLabel); |
| external_data_use_observer()->RegisterURLRegexes( |
| std::vector<std::string>(url_regexes.size(), "com.example.helloworld"), |
| url_regexes, std::vector<std::string>(url_regexes.size(), label)); |
| @@ -250,7 +314,7 @@ TEST_F(ExternalDataUseObserverTest, ChangeRegex) { |
| url_regexes.push_back("https://www[.]google[.]com/#q=.*"); |
| external_data_use_observer()->RegisterURLRegexes( |
| std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), "label")); |
| + std::vector<std::string>(url_regexes.size(), kDefaultLabel)); |
| EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); |
| EXPECT_TRUE(external_data_use_observer()->Matches( |
| @@ -265,7 +329,7 @@ TEST_F(ExternalDataUseObserverTest, ChangeRegex) { |
| url_regexes.push_back("https://www[.]google[.]co[.]in/#q=.*"); |
| external_data_use_observer()->RegisterURLRegexes( |
| std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), "label")); |
| + std::vector<std::string>(url_regexes.size(), kDefaultLabel)); |
| EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); |
| EXPECT_FALSE(external_data_use_observer()->Matches( |
| GURL("http://www.google.com#q=abc"), &label)); |
| @@ -300,74 +364,58 @@ TEST_F(ExternalDataUseObserverTest, LabelRemoved) { |
| // Verifies that buffer size does not exceed the specified limit. |
| TEST_F(ExternalDataUseObserverTest, BufferSize) { |
| - const char kLabel[] = "label"; |
| + base::HistogramTester histogram_tester; |
| - std::vector<std::string> url_regexes; |
| - url_regexes.push_back( |
| - "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| - |
| - external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), kLabel)); |
| - |
| - const int64_t bytes_downloaded = |
| - external_data_use_observer()->data_use_report_min_bytes_; |
| - const int64_t bytes_uploaded = 1; |
| + AddDefaultMatchingRule(); |
| // Push more entries than the buffer size. Buffer size should not be exceeded. |
| for (size_t i = 0; i < ExternalDataUseObserver::kMaxBufferSize * 2; ++i) { |
| - data_usage::DataUse data_use( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| - "mccmnc" + base::Int64ToString(i), bytes_uploaded, bytes_downloaded); |
| + data_usage::DataUse data_use = default_data_use(); |
| + data_use.mcc_mnc = "mccmnc" + base::Int64ToString(i); |
| external_data_use_observer()->OnDataUse(data_use); |
| } |
| EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_); |
| // Verify that total buffered bytes is computed correctly. |
| - EXPECT_EQ(static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize * |
| - (bytes_downloaded + bytes_uploaded)), |
| - external_data_use_observer()->total_bytes_buffered_); |
| + EXPECT_EQ( |
| + static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize * |
| + (default_upload_bytes() + default_download_bytes())), |
| + external_data_use_observer()->total_bytes_buffered_); |
| EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize, |
| buffered_data_reports().size()); |
| // Verify the label of the data use report. |
| for (const auto& it : buffered_data_reports()) |
| - EXPECT_EQ(kLabel, it.first.label); |
| + EXPECT_EQ(kDefaultLabel, it.first.label); |
| + |
| + // Verify that metrics were updated correctly for the lost reports. |
| + histogram_tester.ExpectUniqueSample( |
| + "DataUsage.ReportSubmissionResult", 3, |
| + ExternalDataUseObserver::kMaxBufferSize - 1); |
| + histogram_tester.ExpectUniqueSample( |
| + "DataUsage.ReportSubmission.Lost.Bytes", |
| + default_upload_bytes() + default_download_bytes(), |
| + ExternalDataUseObserver::kMaxBufferSize - 1); |
| } |
| // Tests that buffered data use reports are merged correctly. |
| TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { |
| - const char kLabel[] = "label"; |
| - |
| - std::vector<std::string> url_regexes; |
| - url_regexes.push_back( |
| - "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| - |
| - external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), kLabel)); |
| + AddDefaultMatchingRule(); |
| const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; |
| for (size_t i = 0; i < num_iterations; ++i) { |
| - data_usage::DataUse data_use_foo( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", |
| - external_data_use_observer()->data_use_report_min_bytes_, 1); |
| + data_usage::DataUse data_use_foo = default_data_use(); |
| + data_use_foo.mcc_mnc = kFooMccMnc; |
| external_data_use_observer()->OnDataUse(data_use_foo); |
| - data_usage::DataUse data_use_bar( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar", |
| - external_data_use_observer()->data_use_report_min_bytes_, 1); |
| + data_usage::DataUse data_use_bar = default_data_use(); |
| + data_use_bar.mcc_mnc = kBarMccMnc; |
| external_data_use_observer()->OnDataUse(data_use_bar); |
| - data_usage::DataUse data_use_baz( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_baz", |
| - external_data_use_observer()->data_use_report_min_bytes_, 1); |
| + data_usage::DataUse data_use_baz = default_data_use(); |
| + data_use_baz.mcc_mnc = kBazMccMnc; |
| external_data_use_observer()->OnDataUse(data_use_baz); |
| } |
| @@ -379,47 +427,36 @@ TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { |
| const struct { |
| std::string mcc_mnc; |
| size_t number_of_merged_reports; |
| - } expected_data_use_reports[] = {{"mccmnc_foo", num_iterations - 1}, |
| - {"mccmnc_bar", num_iterations}, |
| - {"mccmnc_baz", num_iterations}}; |
| + } expected_data_use_reports[] = {{kFooMccMnc, num_iterations - 1}, |
| + {kBarMccMnc, num_iterations}, |
| + {kBazMccMnc, num_iterations}}; |
| for (const auto& expected_report : expected_data_use_reports) { |
| const ExternalDataUseObserver::DataUseReportKey key( |
| - kLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| + kDefaultLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| expected_report.mcc_mnc); |
| EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key)); |
| - EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports), |
| + EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports) * |
| + (default_download_bytes()), |
| buffered_data_reports().find(key)->second.bytes_downloaded); |
| - EXPECT_EQ(static_cast<int64_t>( |
| - expected_report.number_of_merged_reports * |
| - external_data_use_observer()->data_use_report_min_bytes_), |
| + EXPECT_EQ(static_cast<int64_t>(expected_report.number_of_merged_reports * |
| + (default_upload_bytes())), |
| buffered_data_reports().find(key)->second.bytes_uploaded); |
| } |
| } |
| // Tests that timestamps of merged reports is correct. |
| TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) { |
| - const char kLabel[] = "label"; |
| - |
| - std::vector<std::string> url_regexes; |
| - url_regexes.push_back( |
| - "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| - |
| - external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), kLabel)); |
| + AddDefaultMatchingRule(); |
| const size_t num_iterations = ExternalDataUseObserver::kMaxBufferSize * 2; |
| base::Time start_timestamp = base::Time::UnixEpoch(); |
| base::Time end_timestamp = start_timestamp + base::TimeDelta::FromSeconds(1); |
| for (size_t i = 0; i < num_iterations; ++i) { |
| - data_usage::DataUse data_use_foo( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1, 2); |
| external_data_use_observer()->BufferDataUseReport( |
| - data_use_foo, kLabel, start_timestamp, end_timestamp); |
| + default_data_use(), kDefaultLabel, start_timestamp, end_timestamp); |
| start_timestamp += base::TimeDelta::FromSeconds(1); |
| end_timestamp += base::TimeDelta::FromSeconds(1); |
| @@ -442,10 +479,8 @@ TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { |
| "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*"); |
| std::vector<std::string> labels; |
| - const char kLabelFoo[] = "label_foo"; |
| - const char kLabelBar[] = "label_bar"; |
| - labels.push_back(kLabelFoo); |
| - labels.push_back(kLabelBar); |
| + labels.push_back(kFooLabel); |
| + labels.push_back(kBarLabel); |
| std::vector<std::string> app_package_names; |
| const char kAppFoo[] = "com.example.foo"; |
| @@ -456,44 +491,27 @@ TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { |
| external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| app_package_names, url_regexes, labels); |
| EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); |
| - EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); |
| + EXPECT_TRUE(external_data_use_observer() |
| + ->last_data_report_submitted_ticks_.is_null()); |
| EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); |
| // Check |kLabelFoo| matching rule. |
| - data_usage::DataUse data_foo_1( |
| - GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", |
| - external_data_use_observer()->data_use_report_min_bytes_, 0); |
| - external_data_use_observer()->OnDataUse(data_foo_1); |
| - data_usage::DataUse data_foo_2( |
| - GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2", |
| - external_data_use_observer()->data_use_report_min_bytes_, 0); |
| - external_data_use_observer()->OnDataUse(data_foo_2); |
| - |
| - // The foo1 report should have been submitted. |
| - EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); |
| - |
| - // Only the foo2 report should be present. |
| - EXPECT_EQ(1U, buffered_data_reports().size()); |
| - const ExternalDataUseObserver::DataUseReportKey key_foo_2( |
| - kLabelFoo, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2"); |
| - EXPECT_NE(buffered_data_reports().end(), |
| - buffered_data_reports().find(key_foo_2)); |
| + data_usage::DataUse data_foo = default_data_use(); |
| + data_foo.url = GURL("http://www.foo.com/#q=abc"); |
| + data_foo.mcc_mnc = kFooMccMnc; |
| + external_data_use_observer()->OnDataUse(data_foo); |
| // Check |kLabelBar| matching rule. |
| - data_usage::DataUse data_bar( |
| - GURL("http://www.bar.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc", 0, 0); |
| + data_usage::DataUse data_bar = default_data_use(); |
| + data_bar.url = GURL("http://www.bar.com/#q=abc"); |
| + data_bar.mcc_mnc = kBarMccMnc; |
| external_data_use_observer()->OnDataUse(data_bar); |
| - // Both the foo2 and bar reports should be present. |
| - EXPECT_EQ(2U, buffered_data_reports().size()); |
| - EXPECT_NE(buffered_data_reports().end(), |
| - buffered_data_reports().find(key_foo_2)); |
| + // bar report should be present. |
| + EXPECT_EQ(1U, buffered_data_reports().size()); |
| const ExternalDataUseObserver::DataUseReportKey key_bar( |
| - kLabelBar, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc"); |
| + kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc); |
| EXPECT_NE(buffered_data_reports().end(), |
| buffered_data_reports().find(key_bar)); |
| @@ -501,12 +519,12 @@ TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { |
| std::string got_label; |
| EXPECT_TRUE( |
| external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label)); |
| - EXPECT_EQ(kLabelFoo, got_label); |
| + EXPECT_EQ(kFooLabel, got_label); |
| got_label = ""; |
| EXPECT_TRUE( |
| external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label)); |
| - EXPECT_EQ(kLabelBar, got_label); |
| + EXPECT_EQ(kBarLabel, got_label); |
| got_label = ""; |
| EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( |
| @@ -524,16 +542,13 @@ TEST_F(ExternalDataUseObserverTest, HashFunction) { |
| ExternalDataUseObserver::DataUseReportKeyHash hash; |
| ExternalDataUseObserver::DataUseReportKey foo( |
| - "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| - "foo_mcc_mnc"); |
| + kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc); |
| ExternalDataUseObserver::DataUseReportKey bar_label( |
| - "bar_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| - "foo_mcc_mnc"); |
| + kBarLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kFooMccMnc); |
| ExternalDataUseObserver::DataUseReportKey bar_network_type( |
| - "foo_label", net::NetworkChangeNotifier::CONNECTION_WIFI, "foo_mcc_mnc"); |
| + kFooLabel, net::NetworkChangeNotifier::CONNECTION_WIFI, kFooMccMnc); |
| ExternalDataUseObserver::DataUseReportKey bar_mcc_mnc( |
| - "foo_label", net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| - "bar_mcc_mnc"); |
| + kFooLabel, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, kBarMccMnc); |
| EXPECT_NE(hash(foo), hash(bar_label)); |
| EXPECT_NE(hash(foo), hash(bar_label)); |
| @@ -543,15 +558,7 @@ TEST_F(ExternalDataUseObserverTest, HashFunction) { |
| // Tests if matching rules are fetched periodically. |
| TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { |
| - const char kLabel[] = "label"; |
| - |
| - std::vector<std::string> url_regexes; |
| - url_regexes.push_back( |
| - "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| - |
| - external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), kLabel)); |
| + AddDefaultMatchingRule(); |
| EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); |
| EXPECT_FALSE( |
| @@ -567,11 +574,7 @@ TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { |
| external_data_use_observer()->fetch_matching_rules_duration_); |
| // OnDataUse should trigger fetching of matching rules. |
| - data_usage::DataUse data_use_foo( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", |
| - external_data_use_observer()->data_use_report_min_bytes_, 1); |
| - external_data_use_observer()->OnDataUse(data_use_foo); |
| + external_data_use_observer()->OnDataUse(default_data_use()); |
| // Matching rules should not be expired. |
| EXPECT_LT(base::TimeTicks::Now() - |
| @@ -582,15 +585,8 @@ TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { |
| // Tests if data use reports are sent only after the total bytes send/received |
| // across all buffered reports have reached the specified threshold. |
| TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) { |
| - const char kLabel[] = "label"; |
| - |
| - std::vector<std::string> url_regexes; |
| - url_regexes.push_back( |
| - "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); |
| - |
| - external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( |
| - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
| - std::vector<std::string>(url_regexes.size(), kLabel)); |
| + AddDefaultMatchingRule(); |
| + TriggerTabTrackingOnDefaultTab(); |
| // This tests reports 1024 bytes in each loop iteration. For the test to work |
| // properly, |data_use_report_min_bytes_| should be a multiple of 1024. |
| @@ -600,64 +596,97 @@ TEST_F(ExternalDataUseObserverTest, BufferDataUseReports) { |
| external_data_use_observer()->data_use_report_min_bytes_ / 1024; |
| for (size_t i = 0; i < num_iterations; ++i) { |
| - data_usage::DataUse data_use_foo( |
| - GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
| - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0); |
| - external_data_use_observer()->OnDataUse(data_use_foo); |
| + data_usage::DataUse data_use = default_data_use(); |
| + data_use.tx_bytes = 1024; |
| + data_use.rx_bytes = 0; |
| + external_data_use_observer()->OnDataUse(data_use); |
| if (i != num_iterations - 1) { |
| // Total buffered bytes is less than the minimum threshold. Data use |
| // report should not be send. |
| - EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); |
| + EXPECT_TRUE(external_data_use_observer() |
| + ->last_data_report_submitted_ticks_.is_null()); |
| EXPECT_EQ(static_cast<int64_t>(i + 1), |
| external_data_use_observer()->total_bytes_buffered_ / 1024); |
| + EXPECT_EQ(0, external_data_use_observer()->pending_report_bytes_); |
| } else { |
| // Total bytes is at least the minimum threshold. This should trigger |
| // submitting of the buffered data use report. |
| - EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); |
| + EXPECT_FALSE(external_data_use_observer() |
| + ->last_data_report_submitted_ticks_.is_null()); |
| EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); |
| } |
| } |
| EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); |
| + EXPECT_EQ(static_cast<int64_t>(num_iterations), |
| + external_data_use_observer()->pending_report_bytes_ / 1024); |
| + |
| + base::HistogramTester histogram_tester; |
| + external_data_use_observer()->OnReportDataUseDoneOnIOThread(true); |
| + |
| + // Verify that metrics were updated correctly for the report that was |
| + // successfully submitted. |
| + histogram_tester.ExpectUniqueSample("DataUsage.ReportSubmissionResult", 0, 1); |
|
sclittle
2015/12/07 21:44:08
Could you make the SubmissionResult enum public in
tbansal1
2015/12/08 00:08:16
Done.
|
| + histogram_tester.ExpectUniqueSample( |
| + "DataUsage.ReportSubmission.Successful.Bytes", |
| + external_data_use_observer()->data_use_report_min_bytes_, 1); |
| + |
| + // Verify that metrics were updated correctly for the report that was not |
| + // successfully submitted. |
| + external_data_use_observer()->OnDataUse(default_data_use()); |
| + external_data_use_observer()->OnReportDataUseDoneOnIOThread(false); |
| + histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 2); |
| + histogram_tester.ExpectBucketCount("DataUsage.ReportSubmissionResult", 1, 1); |
| + histogram_tester.ExpectUniqueSample( |
| + "DataUsage.ReportSubmission.Failed.Bytes", |
| + external_data_use_observer()->data_use_report_min_bytes_, 1); |
| } |
| // Tests if the parameters from the field trial are populated correctly. |
| TEST_F(ExternalDataUseObserverTest, Variations) { |
| - EXPECT_EQ(base::TimeDelta::FromSeconds(60 * 15), |
| - external_data_use_observer()->fetch_matching_rules_duration_); |
| - EXPECT_EQ(100 * 1024, |
| - external_data_use_observer()->data_use_report_min_bytes_); |
| - |
| - variations::testing::ClearAllVariationParams(); |
| std::map<std::string, std::string> variation_params; |
| const int kFetchMatchingRulesDurationSeconds = 10000; |
| + const int kDefaultMaxDataReportSubmitWaitMsec = 20000; |
| const int64_t kDataUseReportMinBytes = 5000; |
| variation_params["fetch_matching_rules_duration_seconds"] = |
| base::Int64ToString(kFetchMatchingRulesDurationSeconds); |
| + variation_params["data_report_submit_timeout_msec"] = |
| + base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec); |
| variation_params["data_use_report_min_bytes"] = |
| base::Int64ToString(kDataUseReportMinBytes); |
| - ASSERT_TRUE(variations::AssociateVariationParams( |
| - ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", |
| - variation_params)); |
| - |
| - base::FieldTrialList field_trial_list(nullptr); |
| - |
| - base::FieldTrialList::CreateFieldTrial( |
| - ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); |
| - |
| - // Create another ExternalDataUseObserver object. This would fetch variation |
| - // params. |
| - scoped_ptr<ExternalDataUseObserver> |
| - external_data_use_obsever_with_variations = Create(); |
| + // Create another ExternalDataUseObserver object. |
| + ReplaceExternalDataUseObserver(variation_params); |
| EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), |
| - external_data_use_obsever_with_variations |
| - ->fetch_matching_rules_duration_); |
| + external_data_use_observer()->fetch_matching_rules_duration_); |
| EXPECT_EQ( |
| - kDataUseReportMinBytes, |
| - external_data_use_obsever_with_variations->data_use_report_min_bytes_); |
| + base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec), |
| + external_data_use_observer()->data_report_submit_timeout_); |
| + EXPECT_EQ(kDataUseReportMinBytes, |
| + external_data_use_observer()->data_use_report_min_bytes_); |
| +} |
| + |
| +// Tests if the metrics are recorded correctly. |
| +TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) { |
| + std::map<std::string, std::string> variation_params; |
| + variation_params["data_report_submit_timeout_msec"] = "0"; |
| + variation_params["data_use_report_min_bytes"] = "0"; |
| + |
| + // Create another ExternalDataUseObserver object. |
| + ReplaceExternalDataUseObserver(variation_params); |
| + AddDefaultMatchingRule(); |
| + |
| + base::HistogramTester histogram_tester; |
| + TriggerTabTrackingOnDefaultTab(); |
| + external_data_use_observer()->OnDataUse(default_data_use()); |
| + external_data_use_observer()->OnDataUse(default_data_use()); |
| + // First data use report should be marked as timed out. |
| + histogram_tester.ExpectUniqueSample("DataUsage.ReportSubmissionResult", 2, 1); |
| + histogram_tester.ExpectUniqueSample( |
| + "DataUsage.ReportSubmission.TimedOut.Bytes", |
| + default_upload_bytes() + default_download_bytes(), 1); |
| } |
| } // namespace android |