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 18a6985b00cc37fef33b6c3a0d13897f19a9bcc5..1972eb7b621ac8ef27ddf3876511e05fd4409e8c 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 |
@@ -9,11 +9,13 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/scoped_vector.h" |
+#include "base/metrics/field_trial.h" |
#include "base/run_loop.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/thread_task_runner_handle.h" |
#include "components/data_usage/core/data_use.h" |
#include "components/data_usage/core/data_use_aggregator.h" |
+#include "components/variations/variations_associated_data.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "net/base/network_change_notifier.h" |
@@ -39,6 +41,12 @@ class ExternalDataUseObserverTest : public testing::Test { |
ui_task_runner_.get())); |
} |
+ scoped_ptr<ExternalDataUseObserver> Create() const { |
+ return scoped_ptr<ExternalDataUseObserver>(new ExternalDataUseObserver( |
+ data_use_aggregator_.get(), io_task_runner_.get(), |
+ ui_task_runner_.get())); |
+ } |
+ |
ExternalDataUseObserver* external_data_use_observer() const { |
return external_data_use_observer_.get(); |
} |
@@ -247,11 +255,13 @@ TEST_F(ExternalDataUseObserverTest, AtMostOneDataUseSubmitRequest) { |
std::vector<const data_usage::DataUse*> data_use_sequence; |
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); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", |
+ external_data_use_observer()->data_use_report_min_bytes_, 1); |
data_use_sequence.push_back(&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", 1, 2); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar", |
+ external_data_use_observer()->data_use_report_min_bytes_, 1); |
data_use_sequence.push_back(&data_use_bar); |
external_data_use_observer()->OnDataUse(data_use_sequence); |
@@ -272,6 +282,8 @@ TEST_F(ExternalDataUseObserverTest, BufferSize) { |
std::vector<std::string>(url_regexes.size(), label)); |
const size_t max_buffer_size = ExternalDataUseObserver::kMaxBufferSize; |
+ const int bytes_downloaded = 1000; |
+ const int bytes_uploaded = 100; |
ScopedVector<data_usage::DataUse> data_use_vector; |
// Push more entries than the buffer size. Buffer size should not be exceeded. |
@@ -279,7 +291,7 @@ TEST_F(ExternalDataUseObserverTest, BufferSize) { |
scoped_ptr<data_usage::DataUse> data_use(new data_usage::DataUse( |
GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
net::NetworkChangeNotifier::CONNECTION_UNKNOWN, |
- "mccmnc" + base::Int64ToString(i), 0, 0)); |
+ "mccmnc" + base::Int64ToString(i), bytes_downloaded, bytes_uploaded)); |
data_use_vector.push_back(data_use.Pass()); |
} |
@@ -287,7 +299,13 @@ TEST_F(ExternalDataUseObserverTest, BufferSize) { |
data_use_vector.begin(), data_use_vector.end()); |
external_data_use_observer()->OnDataUse(const_sequence); |
- // One report will be consumed. |
+ EXPECT_LE(0, external_data_use_observer()->total_bytes_buffered_); |
+ |
+ // One report will be consumed. Verify that total buffered bytes is computed |
+ // correctly. |
+ EXPECT_EQ(static_cast<int64_t>((max_buffer_size - 1) * |
+ (bytes_downloaded + bytes_uploaded)), |
+ external_data_use_observer()->total_bytes_buffered_); |
EXPECT_EQ(max_buffer_size - 1, |
external_data_use_observer()->buffered_data_reports_.size()); |
@@ -314,17 +332,20 @@ TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { |
for (size_t i = 0; i < num_iterations; ++i) { |
scoped_ptr<data_usage::DataUse> data_use_foo(new data_usage::DataUse( |
GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
- net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1, 2)); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", |
+ external_data_use_observer()->data_use_report_min_bytes_, 1)); |
data_use_vector.push_back(data_use_foo.Pass()); |
scoped_ptr<data_usage::DataUse> data_use_bar(new data_usage::DataUse( |
GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
- net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar", 1, 2)); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar", |
+ external_data_use_observer()->data_use_report_min_bytes_, 1)); |
data_use_vector.push_back(data_use_bar.Pass()); |
scoped_ptr<data_usage::DataUse> data_use_baz(new data_usage::DataUse( |
GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
- net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_baz", 1, 2)); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_baz", |
+ external_data_use_observer()->data_use_report_min_bytes_, 1)); |
data_use_vector.push_back(data_use_baz.Pass()); |
} |
@@ -334,11 +355,13 @@ TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { |
external_data_use_observer()->OnDataUse(const_sequence); |
EXPECT_EQ(2U, external_data_use_observer()->buffered_data_reports_.size()); |
- EXPECT_EQ(static_cast<int64_t>(num_iterations * 2), |
+ EXPECT_EQ(static_cast<int64_t>(num_iterations * 1), |
external_data_use_observer() |
->buffered_data_reports_.begin() |
->second.bytes_downloaded); |
- EXPECT_EQ(static_cast<int64_t>(num_iterations * 1), |
+ EXPECT_EQ(static_cast<int64_t>( |
+ num_iterations * |
+ external_data_use_observer()->data_use_report_min_bytes_), |
external_data_use_observer() |
->buffered_data_reports_.begin() |
->second.bytes_uploaded); |
@@ -347,11 +370,13 @@ TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { |
external_data_use_observer()->buffered_data_reports_.erase( |
external_data_use_observer()->buffered_data_reports_.begin()); |
EXPECT_EQ(1U, external_data_use_observer()->buffered_data_reports_.size()); |
- EXPECT_EQ(static_cast<int64_t>(num_iterations * 2), |
+ EXPECT_EQ(static_cast<int64_t>(num_iterations * 1), |
external_data_use_observer() |
->buffered_data_reports_.begin() |
->second.bytes_downloaded); |
- EXPECT_EQ(static_cast<int64_t>(num_iterations * 1), |
+ EXPECT_EQ(static_cast<int64_t>( |
+ num_iterations * |
+ external_data_use_observer()->data_use_report_min_bytes_), |
external_data_use_observer() |
->buffered_data_reports_.begin() |
->second.bytes_uploaded); |
@@ -426,10 +451,12 @@ TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { |
std::vector<const data_usage::DataUse*> data_use_sequence; |
data_usage::DataUse data_foo_1( |
GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
- net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", 0, 0); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", |
+ external_data_use_observer()->data_use_report_min_bytes_, 0); |
data_usage::DataUse data_foo_2( |
GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
- net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2", 0, 0); |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2", |
+ external_data_use_observer()->data_use_report_min_bytes_, 0); |
data_use_sequence.push_back(&data_foo_1); |
data_use_sequence.push_back(&data_foo_2); |
external_data_use_observer()->OnDataUse(data_use_sequence); |
@@ -484,6 +511,133 @@ TEST_F(ExternalDataUseObserverTest, HashFunction) { |
EXPECT_NE(hash(foo), hash(bar_mcc_mnc)); |
} |
+// Tests if matching rules are fetched periodically. |
+TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) { |
+ const std::string label("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()->FetchMatchingRulesCallbackOnIOThread( |
+ std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
+ std::vector<std::string>(url_regexes.size(), label)); |
+ |
+ EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); |
+ EXPECT_FALSE( |
+ external_data_use_observer()->last_matching_rules_fetch_time_.is_null()); |
+ |
+ std::vector<const data_usage::DataUse*> data_use_sequence; |
+ 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_use_sequence.push_back(&data_use_foo); |
+ |
+ // Change the time when the fetching rules were fetched. |
+ external_data_use_observer()->last_matching_rules_fetch_time_ = |
+ base::TimeTicks::Now() - |
+ external_data_use_observer()->fetch_matching_rules_duration_; |
+ // Matching rules should be expired. |
+ EXPECT_GE(base::TimeTicks::Now() - |
+ external_data_use_observer()->last_matching_rules_fetch_time_, |
+ external_data_use_observer()->fetch_matching_rules_duration_); |
+ // OnDataUse should trigger fetching of matching rules. |
+ external_data_use_observer()->OnDataUse(data_use_sequence); |
+ |
+ // Matching rules should not be expired. |
+ EXPECT_LT(base::TimeTicks::Now() - |
+ external_data_use_observer()->last_matching_rules_fetch_time_, |
+ external_data_use_observer()->fetch_matching_rules_duration_); |
+} |
+ |
+// 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 std::string label("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()->FetchMatchingRulesCallbackOnIOThread( |
+ std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, |
+ std::vector<std::string>(url_regexes.size(), label)); |
+ |
+ // 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. |
+ ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1024); |
+ |
+ const size_t num_iterations = |
+ external_data_use_observer()->data_use_report_min_bytes_ / 1024; |
+ |
+ for (size_t i = 0; i < num_iterations; ++i) { |
+ ScopedVector<data_usage::DataUse> data_use_vector; |
+ |
+ scoped_ptr<data_usage::DataUse> data_use_foo(new data_usage::DataUse( |
+ GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0)); |
+ data_use_vector.push_back(data_use_foo.Pass()); |
+ |
+ std::vector<const data_usage::DataUse*> const_sequence( |
+ data_use_vector.begin(), data_use_vector.end()); |
+ |
+ external_data_use_observer()->OnDataUse(const_sequence); |
+ 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_EQ(i + 1, |
+ external_data_use_observer()->total_bytes_buffered_ / 1024); |
+ |
+ } 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_EQ(0, external_data_use_observer()->total_bytes_buffered_); |
+ } |
+ } |
+ EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); |
+} |
+ |
+// 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 fetch_matching_rules_duration_seconds = 10000; |
+ const int data_use_report_min_bytes = 5000; |
+ variation_params["fetch_matching_rules_duration_seconds"] = |
+ base::Int64ToString(fetch_matching_rules_duration_seconds); |
+ variation_params["data_use_report_min_bytes"] = |
+ base::Int64ToString(data_use_report_min_bytes); |
+ |
+ ASSERT_TRUE(variations::AssociateVariationParams( |
+ external_data_use_observer()->GetExternalDataUseObserverFieldTrialName(), |
+ "Enabled", variation_params)); |
+ |
+ base::FieldTrialList field_trial_list(nullptr); |
+ base::FieldTrialList::CreateFieldTrial( |
+ external_data_use_observer()->GetExternalDataUseObserverFieldTrialName(), |
+ "Enabled"); |
+ |
+ // Create another ExternalDataUseObserver object. This would fetch variation |
+ // params. |
+ scoped_ptr<ExternalDataUseObserver> |
+ external_data_use_obsever_with_variations = Create(); |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(fetch_matching_rules_duration_seconds), |
+ external_data_use_obsever_with_variations |
+ ->fetch_matching_rules_duration_); |
+ EXPECT_EQ( |
+ data_use_report_min_bytes, |
+ external_data_use_obsever_with_variations->data_use_report_min_bytes_); |
+} |
+ |
} // namespace android |
} // namespace chrome |