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..73c0bb52c2f1d06c82c5ef4e3da0847d5e785d35 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,59 @@ 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", |
+ ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_LOST, |
+ 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 +428,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 +480,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 +492,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 +520,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 +543,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 +559,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 +575,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 +586,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 +597,103 @@ 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", |
+ ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_SUCCESSFUL, 1); |
+ 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", |
+ ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_FAILED, 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", |
+ ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT, 1); |
+ histogram_tester.ExpectUniqueSample( |
+ "DataUsage.ReportSubmission.TimedOut.Bytes", |
+ default_upload_bytes() + default_download_bytes(), 1); |
} |
} // namespace android |