| 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..c122927e7d5546e1076d63821a5d76f02c56e0bd 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();
|
| }
|
| @@ -231,6 +239,7 @@ TEST_F(ExternalDataUseObserverTest, ChangeRegex) {
|
|
|
| // Tests that at most one data use request is submitted.
|
| TEST_F(ExternalDataUseObserverTest, AtMostOneDataUseSubmitRequest) {
|
| + external_data_use_observer()->data_use_report_min_bytes_ = 0;
|
| const std::string label("label");
|
|
|
| std::vector<std::string> url_regexes;
|
| @@ -261,6 +270,7 @@ TEST_F(ExternalDataUseObserverTest, AtMostOneDataUseSubmitRequest) {
|
|
|
| // Verifies that buffer size does not exceed the specified limit.
|
| TEST_F(ExternalDataUseObserverTest, BufferSize) {
|
| + external_data_use_observer()->data_use_report_min_bytes_ = 0;
|
| const std::string label("label");
|
|
|
| std::vector<std::string> url_regexes;
|
| @@ -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,12 @@ 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((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());
|
|
|
| @@ -298,6 +315,7 @@ TEST_F(ExternalDataUseObserverTest, BufferSize) {
|
|
|
| // Tests that buffered data use reports are merged correctly.
|
| TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) {
|
| + external_data_use_observer()->data_use_report_min_bytes_ = 0;
|
| const std::string label("label");
|
|
|
| std::vector<std::string> url_regexes;
|
| @@ -403,6 +421,7 @@ TEST_F(ExternalDataUseObserverTest, TimestampsMergedCorrectly) {
|
|
|
| // Tests the behavior when multiple matching rules are available.
|
| TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) {
|
| + external_data_use_observer()->data_use_report_min_bytes_ = 0;
|
| std::vector<std::string> url_regexes;
|
| url_regexes.push_back(
|
| "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*");
|
| @@ -484,6 +503,133 @@ TEST_F(ExternalDataUseObserverTest, HashFunction) {
|
| EXPECT_NE(hash(foo), hash(bar_mcc_mnc));
|
| }
|
|
|
| +// Tests if matching rules are fetched periodically.
|
| +TEST_F(ExternalDataUseObserverTest, PeriodicFetchMatchingRules) {
|
| + external_data_use_observer()->data_use_report_min_bytes_ = 0;
|
| + 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", 1, 2);
|
| + 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 1000 bytes in each loop iteration. For the test to work
|
| + // properly, |data_use_report_min_bytes_| should be a multiple of 1000.
|
| + ASSERT_EQ(0, external_data_use_observer()->data_use_report_min_bytes_ % 1000);
|
| +
|
| + const size_t num_iterations =
|
| + external_data_use_observer()->data_use_report_min_bytes_ / 1000;
|
| +
|
| + 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", 1000, 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_ / 1000);
|
| +
|
| + } 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 * 1000,
|
| + 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
|
|
|