Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 new data_usage::DataUseAggregator(nullptr, nullptr)); | 66 new data_usage::DataUseAggregator(nullptr, nullptr)); |
| 67 external_data_use_observer_.reset(new ExternalDataUseObserver( | 67 external_data_use_observer_.reset(new ExternalDataUseObserver( |
| 68 data_use_aggregator_.get(), io_task_runner_.get(), | 68 data_use_aggregator_.get(), io_task_runner_.get(), |
| 69 ui_task_runner_.get())); | 69 ui_task_runner_.get())); |
| 70 // Wait for |external_data_use_observer_| to create the Java object. | 70 // Wait for |external_data_use_observer_| to create the Java object. |
| 71 base::RunLoop().RunUntilIdle(); | 71 base::RunLoop().RunUntilIdle(); |
| 72 external_data_use_observer() | 72 external_data_use_observer() |
| 73 ->data_use_tab_model_->is_control_app_installed_ = true; | 73 ->data_use_tab_model_->is_control_app_installed_ = true; |
| 74 } | 74 } |
| 75 | 75 |
| 76 void ReplaceExternalDataUseObserver() { | |
| 77 external_data_use_observer_.reset(new ExternalDataUseObserver( | |
| 78 data_use_aggregator_.get(), io_task_runner_.get(), | |
| 79 ui_task_runner_.get())); | |
| 80 // Wait for |external_data_use_observer_| to create the Java object. | |
| 81 base::RunLoop().RunUntilIdle(); | |
| 82 } | |
| 83 | |
| 76 // Replaces |external_data_use_observer_| with a new ExternalDataUseObserver. | 84 // Replaces |external_data_use_observer_| with a new ExternalDataUseObserver. |
| 77 void ReplaceExternalDataUseObserver( | 85 void ReplaceExternalDataUseObserverWithVariation( |
| 78 std::map<std::string, std::string> variation_params) { | 86 std::map<std::string, std::string> variation_params) { |
| 79 variations::testing::ClearAllVariationParams(); | 87 variations::testing::ClearAllVariationParams(); |
| 80 ASSERT_TRUE(variations::AssociateVariationParams( | 88 ASSERT_TRUE(variations::AssociateVariationParams( |
| 81 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", | 89 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", |
| 82 variation_params)); | 90 variation_params)); |
| 83 | 91 |
| 84 base::FieldTrialList field_trial_list(nullptr); | 92 base::FieldTrialList field_trial_list(nullptr); |
| 85 | 93 |
| 86 base::FieldTrialList::CreateFieldTrial( | 94 base::FieldTrialList::CreateFieldTrial( |
| 87 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); | 95 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); |
| 88 | 96 ReplaceExternalDataUseObserver(); |
| 89 external_data_use_observer_.reset(new ExternalDataUseObserver( | |
| 90 data_use_aggregator_.get(), io_task_runner_.get(), | |
| 91 ui_task_runner_.get())); | |
| 92 // Wait for |external_data_use_observer_| to create the Java object. | |
| 93 base::RunLoop().RunUntilIdle(); | |
| 94 } | 97 } |
| 95 | 98 |
| 96 void FetchMatchingRulesDone(const std::vector<std::string>& app_package_name, | 99 void FetchMatchingRulesDone(const std::vector<std::string>& app_package_name, |
| 97 const std::vector<std::string>& domain_path_regex, | 100 const std::vector<std::string>& domain_path_regex, |
| 98 const std::vector<std::string>& label) { | 101 const std::vector<std::string>& label) { |
| 99 external_data_use_observer_->GetDataUseTabModel()->RegisterURLRegexes( | 102 external_data_use_observer_->GetDataUseTabModel()->RegisterURLRegexes( |
| 100 app_package_name, domain_path_regex, label); | 103 app_package_name, domain_path_regex, label); |
| 101 base::RunLoop().RunUntilIdle(); | 104 base::RunLoop().RunUntilIdle(); |
| 102 } | 105 } |
| 103 | 106 |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 383 } | 386 } |
| 384 | 387 |
| 385 // Tests the matching rule fetch behavior when the external control app is | 388 // Tests the matching rule fetch behavior when the external control app is |
| 386 // installed and not installed. Matching rules should be fetched when control | 389 // installed and not installed. Matching rules should be fetched when control |
| 387 // app gets installed. If control app is installed and no valid rules are found, | 390 // app gets installed. If control app is installed and no valid rules are found, |
| 388 // matching rules are fetched on every navigation. Rules are not fetched if | 391 // matching rules are fetched on every navigation. Rules are not fetched if |
| 389 // control app is not installed or if more than zero valid rules have been | 392 // control app is not installed or if more than zero valid rules have been |
| 390 // fetched. | 393 // fetched. |
| 391 TEST_F(ExternalDataUseObserverTest, MatchingRuleFetchOnControlAppInstall) { | 394 TEST_F(ExternalDataUseObserverTest, MatchingRuleFetchOnControlAppInstall) { |
| 392 { | 395 { |
| 393 // Matching rules not fetched on navigation if control app is not installed. | 396 // Matching rules not fetched on navigation if control app is not installed, |
| 397 // and navigation events will be buffered. | |
| 394 external_data_use_observer()->last_matching_rules_fetch_time_ = | 398 external_data_use_observer()->last_matching_rules_fetch_time_ = |
| 395 base::TimeTicks(); | 399 base::TimeTicks(); |
| 396 external_data_use_observer() | 400 external_data_use_observer() |
| 397 ->data_use_tab_model_->is_control_app_installed_ = false; | 401 ->data_use_tab_model_->is_control_app_installed_ = false; |
| 398 base::HistogramTester histogram_tester; | 402 base::HistogramTester histogram_tester; |
| 399 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | 403 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( |
| 400 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | 404 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), |
| 401 std::string()); | 405 std::string()); |
| 402 base::RunLoop().RunUntilIdle(); | 406 base::RunLoop().RunUntilIdle(); |
| 403 histogram_tester.ExpectTotalCount("DataUsage.MatchingRulesCount.Valid", 0); | 407 histogram_tester.ExpectTotalCount("DataUsage.MatchingRulesCount.Valid", 0); |
| 408 EXPECT_EQ(1, external_data_use_observer() | |
| 409 ->data_use_tab_model_->data_use_ui_navigations_->size()); | |
| 410 external_data_use_observer() | |
| 411 ->data_use_tab_model_->data_use_ui_navigations_->clear(); | |
| 404 } | 412 } |
| 405 | 413 |
| 406 { | 414 { |
| 407 // Matching rules are fetched when control app is installed. | 415 // Matching rules are fetched when control app is installed. |
|
tbansal1
2016/03/29 16:20:41
extra space?
Raj
2016/03/29 18:03:21
Done.
| |
| 408 base::HistogramTester histogram_tester; | 416 base::HistogramTester histogram_tester; |
| 409 external_data_use_observer() | 417 external_data_use_observer() |
| 410 ->data_use_tab_model_->OnControlAppInstallStateChange(true); | 418 ->data_use_tab_model_->OnControlAppInstallStateChange(true); |
| 411 base::RunLoop().RunUntilIdle(); | 419 base::RunLoop().RunUntilIdle(); |
| 412 histogram_tester.ExpectTotalCount("DataUsage.MatchingRulesCount.Valid", 1); | 420 histogram_tester.ExpectTotalCount("DataUsage.MatchingRulesCount.Valid", 1); |
| 421 EXPECT_FALSE(external_data_use_observer() | |
| 422 ->data_use_tab_model_->data_use_ui_navigations_.get()); | |
| 413 } | 423 } |
| 414 | 424 |
| 415 { | 425 { |
| 416 // Matching rules fetched on every navigation if control app is installed | 426 // Matching rules fetched on every navigation if control app is installed |
| 417 // and zero rules are available. | 427 // and zero rules are available. |
| 418 external_data_use_observer()->last_matching_rules_fetch_time_ = | 428 external_data_use_observer()->last_matching_rules_fetch_time_ = |
| 419 base::TimeTicks(); | 429 base::TimeTicks(); |
| 420 base::HistogramTester histogram_tester; | 430 base::HistogramTester histogram_tester; |
| 421 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | 431 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( |
| 422 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | 432 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 578 const int kDefaultMaxDataReportSubmitWaitMsec = 20000; | 588 const int kDefaultMaxDataReportSubmitWaitMsec = 20000; |
| 579 const int64_t kDataUseReportMinBytes = 5000; | 589 const int64_t kDataUseReportMinBytes = 5000; |
| 580 variation_params["fetch_matching_rules_duration_seconds"] = | 590 variation_params["fetch_matching_rules_duration_seconds"] = |
| 581 base::Int64ToString(kFetchMatchingRulesDurationSeconds); | 591 base::Int64ToString(kFetchMatchingRulesDurationSeconds); |
| 582 variation_params["data_report_submit_timeout_msec"] = | 592 variation_params["data_report_submit_timeout_msec"] = |
| 583 base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec); | 593 base::Int64ToString(kDefaultMaxDataReportSubmitWaitMsec); |
| 584 variation_params["data_use_report_min_bytes"] = | 594 variation_params["data_use_report_min_bytes"] = |
| 585 base::Int64ToString(kDataUseReportMinBytes); | 595 base::Int64ToString(kDataUseReportMinBytes); |
| 586 | 596 |
| 587 // Create another ExternalDataUseObserver object. | 597 // Create another ExternalDataUseObserver object. |
| 588 ReplaceExternalDataUseObserver(variation_params); | 598 ReplaceExternalDataUseObserverWithVariation(variation_params); |
| 589 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), | 599 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), |
| 590 external_data_use_observer()->fetch_matching_rules_duration_); | 600 external_data_use_observer()->fetch_matching_rules_duration_); |
| 591 EXPECT_EQ( | 601 EXPECT_EQ( |
| 592 base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec), | 602 base::TimeDelta::FromMilliseconds(kDefaultMaxDataReportSubmitWaitMsec), |
| 593 external_data_use_observer()->data_report_submit_timeout_); | 603 external_data_use_observer()->data_report_submit_timeout_); |
| 594 EXPECT_EQ(kDataUseReportMinBytes, | 604 EXPECT_EQ(kDataUseReportMinBytes, |
| 595 external_data_use_observer()->data_use_report_min_bytes_); | 605 external_data_use_observer()->data_use_report_min_bytes_); |
| 596 } | 606 } |
| 597 | 607 |
| 598 // Tests if the metrics are recorded correctly. | 608 // Tests if the metrics are recorded correctly. |
| 599 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) { | 609 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) { |
| 600 base::HistogramTester histogram_tester; | 610 base::HistogramTester histogram_tester; |
| 601 std::map<std::string, std::string> variation_params; | 611 std::map<std::string, std::string> variation_params; |
| 602 variation_params["data_report_submit_timeout_msec"] = "0"; | 612 variation_params["data_report_submit_timeout_msec"] = "0"; |
| 603 variation_params["data_use_report_min_bytes"] = "0"; | 613 variation_params["data_use_report_min_bytes"] = "0"; |
| 604 | 614 |
| 605 // Create another ExternalDataUseObserver object. | 615 // Create another ExternalDataUseObserver object. |
| 606 ReplaceExternalDataUseObserver(variation_params); | 616 ReplaceExternalDataUseObserverWithVariation(variation_params); |
| 607 histogram_tester.ExpectTotalCount(kUMAMatchingRuleFirstFetchDurationHistogram, | 617 histogram_tester.ExpectTotalCount(kUMAMatchingRuleFirstFetchDurationHistogram, |
| 608 0); | 618 0); |
| 609 | 619 |
| 610 // Trigger the control app install, and matching rules will be fetched. | 620 // Trigger the control app install, and matching rules will be fetched. |
| 611 external_data_use_observer() | 621 external_data_use_observer() |
| 612 ->GetDataUseTabModel() | 622 ->GetDataUseTabModel() |
| 613 ->OnControlAppInstallStateChange(true); | 623 ->OnControlAppInstallStateChange(true); |
| 614 base::RunLoop().RunUntilIdle(); | 624 base::RunLoop().RunUntilIdle(); |
| 615 histogram_tester.ExpectTotalCount(kUMAMatchingRuleFirstFetchDurationHistogram, | 625 histogram_tester.ExpectTotalCount(kUMAMatchingRuleFirstFetchDurationHistogram, |
| 616 1); | 626 1); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 631 // First data use report should be marked as timed out. | 641 // First data use report should be marked as timed out. |
| 632 histogram_tester.ExpectUniqueSample( | 642 histogram_tester.ExpectUniqueSample( |
| 633 "DataUsage.ReportSubmissionResult", | 643 "DataUsage.ReportSubmissionResult", |
| 634 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT, 1); | 644 ExternalDataUseObserver::DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT, 1); |
| 635 histogram_tester.ExpectUniqueSample( | 645 histogram_tester.ExpectUniqueSample( |
| 636 "DataUsage.ReportSubmission.Bytes.TimedOut", | 646 "DataUsage.ReportSubmission.Bytes.TimedOut", |
| 637 default_upload_bytes() + default_download_bytes(), 1); | 647 default_upload_bytes() + default_download_bytes(), 1); |
| 638 histogram_tester.ExpectTotalCount(kUMAReportSubmissionDurationHistogram, 0); | 648 histogram_tester.ExpectTotalCount(kUMAReportSubmissionDurationHistogram, 0); |
| 639 } | 649 } |
| 640 | 650 |
| 651 // Tests the buffering of UI navigation events until matching rule fetch is | |
| 652 // complete, or until the external control app not installed callback is | |
| 653 // received, or until a maximum number of events are buffered, whichever comes | |
| 654 // first. | |
| 655 TEST_F(ExternalDataUseObserverTest, ProcessBufferedNavigationEvents) { | |
|
tbansal1
2016/03/29 16:20:41
Seems like this is essentially 3 different tests.
tbansal1
2016/03/29 16:20:41
This test does not really check if ProcessBuffered
Raj
2016/03/29 18:03:21
I have added a unittest in data_use_tab_model_unit
Raj
2016/03/29 18:03:21
Done.
| |
| 656 const uint32_t kDefaultMaxNavigationEventsBuffered = 100; | |
| 657 { | |
| 658 // Navigation events will be buffered until control app not installed | |
| 659 // callback is received. | |
| 660 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 661 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 662 std::string()); | |
| 663 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 664 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 665 std::string()); | |
| 666 EXPECT_EQ(2, external_data_use_observer() | |
| 667 ->data_use_tab_model_->data_use_ui_navigations_->size()); | |
| 668 external_data_use_observer() | |
| 669 ->data_use_tab_model_->OnControlAppInstallStateChange(false); | |
| 670 base::RunLoop().RunUntilIdle(); | |
| 671 EXPECT_FALSE(external_data_use_observer() | |
| 672 ->data_use_tab_model_->data_use_ui_navigations_.get()); | |
| 673 } | |
| 674 | |
| 675 { | |
| 676 // Navigation events will be buffered until control app is installed and | |
| 677 // matching rules are fetched. | |
| 678 ReplaceExternalDataUseObserver(); | |
| 679 base::HistogramTester histogram_tester; | |
| 680 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 681 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 682 std::string()); | |
| 683 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 684 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 685 std::string()); | |
| 686 EXPECT_EQ(2, external_data_use_observer() | |
| 687 ->data_use_tab_model_->data_use_ui_navigations_->size()); | |
| 688 external_data_use_observer() | |
| 689 ->data_use_tab_model_->OnControlAppInstallStateChange(true); | |
| 690 base::RunLoop().RunUntilIdle(); | |
| 691 histogram_tester.ExpectTotalCount("DataUsage.MatchingRulesCount.Valid", 3); | |
| 692 EXPECT_FALSE(external_data_use_observer() | |
| 693 ->data_use_tab_model_->data_use_ui_navigations_.get()); | |
| 694 } | |
| 695 { | |
| 696 // Navigation events will be buffered until the buffer reaches a maximum | |
| 697 // limit. | |
| 698 ReplaceExternalDataUseObserver(); | |
| 699 for (size_t count = 1; count < kDefaultMaxNavigationEventsBuffered; | |
|
tbansal1
2016/03/29 16:20:41
this is flaky. If somebody changes value at one pl
Raj
2016/03/29 18:03:21
I do not want to add this limit as another paramet
| |
| 700 count++) { | |
|
tbansal1
2016/03/29 16:20:41
++count
Raj
2016/03/29 18:03:21
Done.
| |
| 701 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 702 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 703 std::string()); | |
| 704 EXPECT_EQ(i, external_data_use_observer() | |
| 705 ->data_use_tab_model_->data_use_ui_navigations_->size()); | |
| 706 } | |
| 707 // Next navigation event will trigger clearing of the buffer. | |
| 708 external_data_use_observer()->data_use_tab_model_->OnNavigationEvent( | |
| 709 kDefaultTabId, DataUseTabModel::TRANSITION_LINK, GURL(kDefaultURL), | |
| 710 std::string()); | |
| 711 EXPECT_FALSE(external_data_use_observer() | |
| 712 ->data_use_tab_model_->data_use_ui_navigations_.get()); | |
| 713 } | |
| 714 } | |
| 715 | |
| 641 } // namespace android | 716 } // namespace android |
| 642 | 717 |
| 643 } // namespace chrome | 718 } // namespace chrome |
| OLD | NEW |