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 |