Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: chrome/browser/android/data_usage/external_data_use_observer_unittest.cc

Issue 1837223002: Buffer UI navigation events in DataUseTabModel until rule fetch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698