diff options
Diffstat (limited to 'chromium/components/previews/core/previews_io_data_unittest.cc')
-rw-r--r-- | chromium/components/previews/core/previews_io_data_unittest.cc | 320 |
1 files changed, 252 insertions, 68 deletions
diff --git a/chromium/components/previews/core/previews_io_data_unittest.cc b/chromium/components/previews/core/previews_io_data_unittest.cc index 39a8925e618..604cb1aa060 100644 --- a/chromium/components/previews/core/previews_io_data_unittest.cc +++ b/chromium/components/previews/core/previews_io_data_unittest.cc @@ -4,6 +4,7 @@ #include "components/previews/core/previews_io_data.h" +#include <initializer_list> #include <map> #include <memory> #include <string> @@ -15,6 +16,7 @@ #include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "base/metrics/field_trial.h" +#include "base/metrics/field_trial_params.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/test/histogram_tester.h" @@ -28,6 +30,7 @@ #include "net/base/load_flags.h" #include "net/nqe/effective_connection_type.h" #include "net/nqe/network_quality_estimator_test_util.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -37,6 +40,24 @@ namespace previews { namespace { +// TODO(sclittle): Tests should be testing the actual prod code that checks if +// the appropriate field trial is enabled for the preview, instead of testing +// this function here. Consider moving that code out of +// chrome/browser/previews/previews_service.cc and into the previews/ component. +bool IsPreviewFieldTrialEnabled(PreviewsType type) { + switch (type) { + case PreviewsType::OFFLINE: + return params::IsOfflinePreviewsEnabled(); + case PreviewsType::CLIENT_LOFI: + return params::IsClientLoFiEnabled(); + case PreviewsType::NONE: + case PreviewsType::LAST: + break; + } + NOTREACHED(); + return false; +} + class TestPreviewsIOData : public PreviewsIOData { public: TestPreviewsIOData( @@ -96,77 +117,102 @@ class TestPreviewsOptOutStore : public PreviewsOptOutStore { class PreviewsIODataTest : public testing::Test { public: - PreviewsIODataTest() {} + PreviewsIODataTest() + : field_trial_list_(nullptr), + io_data_(loop_.task_runner(), loop_.task_runner()), + context_(true) { + context_.set_network_quality_estimator(&network_quality_estimator_); + context_.Init(); + + network_quality_estimator_.set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); + } - ~PreviewsIODataTest() override {} + ~PreviewsIODataTest() override { + variations::testing::ClearAllVariationParams(); + } + + void InitializeUIServiceWithoutWaitingForBlackList() { + ui_service_.reset(new PreviewsUIService( + &io_data_, loop_.task_runner(), + std::unique_ptr<TestPreviewsOptOutStore>(new TestPreviewsOptOutStore()), + base::Bind(&IsPreviewFieldTrialEnabled))); + } - void set_io_data(std::unique_ptr<TestPreviewsIOData> io_data) { - io_data_ = std::move(io_data); + void InitializeUIService() { + InitializeUIServiceWithoutWaitingForBlackList(); + base::RunLoop().RunUntilIdle(); } - TestPreviewsIOData* io_data() { return io_data_.get(); } + std::unique_ptr<net::URLRequest> CreateRequest() const { + return context_.CreateRequest(GURL("http://example.com"), + net::DEFAULT_PRIORITY, nullptr, + TRAFFIC_ANNOTATION_FOR_TESTS); + } - void set_ui_service(std::unique_ptr<PreviewsUIService> ui_service) { - ui_service_ = std::move(ui_service); + TestPreviewsIOData* io_data() { return &io_data_; } + PreviewsUIService* ui_service() { return ui_service_.get(); } + net::TestURLRequestContext* context() { return &context_; } + net::TestNetworkQualityEstimator* network_quality_estimator() { + return &network_quality_estimator_; } protected: - // Run this test on a single thread. base::MessageLoopForIO loop_; private: - std::unique_ptr<TestPreviewsIOData> io_data_; + base::FieldTrialList field_trial_list_; + TestPreviewsIOData io_data_; std::unique_ptr<PreviewsUIService> ui_service_; + net::TestNetworkQualityEstimator network_quality_estimator_; + net::TestURLRequestContext context_; }; -} // namespace +void CreateFieldTrialWithParams( + const std::string& trial_name, + const std::string& group_name, + std::initializer_list< + typename std::map<std::string, std::string>::value_type> params) { + EXPECT_TRUE(base::AssociateFieldTrialParams(trial_name, group_name, params)); + EXPECT_TRUE(base::FieldTrialList::CreateFieldTrial(trial_name, group_name)); +} TEST_F(PreviewsIODataTest, TestInitialization) { - set_io_data(base::MakeUnique<TestPreviewsIOData>(loop_.task_runner(), - loop_.task_runner())); - set_ui_service(base::MakeUnique<PreviewsUIService>( - io_data(), loop_.task_runner(), nullptr)); - base::RunLoop().RunUntilIdle(); + InitializeUIService(); // After the outstanding posted tasks have run, |io_data_| should be fully // initialized. EXPECT_TRUE(io_data()->initialized()); } -TEST_F(PreviewsIODataTest, TestShouldAllowPreview) { - // Test most reasons to disallow the blacklist. - // Excluded values are USER_RECENTLY_OPTED_OUT, USER_BLACKLISTED, - // HOST_BLACKLISTED. These are internal to the blacklist. - net::TestURLRequestContext context; - GURL test_host("http://www.test_host.com"); - std::unique_ptr<net::URLRequest> request = - context.CreateRequest(test_host, net::DEFAULT_PRIORITY, nullptr); - set_io_data(base::MakeUnique<TestPreviewsIOData>(loop_.task_runner(), - loop_.task_runner())); +// Tests most of the reasons that a preview could be disallowed because of the +// state of the blacklist. Excluded values are USER_RECENTLY_OPTED_OUT, +// USER_BLACKLISTED, HOST_BLACKLISTED. These are internal to the blacklist. +TEST_F(PreviewsIODataTest, TestDisallowPreviewBecauseOfBlackListState) { + std::unique_ptr<net::URLRequest> request = CreateRequest(); base::HistogramTester histogram_tester; - // If not in the field trial, don't log anything, and return false. - EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0); - - // Enable Offline previews field trial. - base::FieldTrialList field_trial_list(nullptr); - std::map<std::string, std::string> params; - params["show_offline_pages"] = "true"; - variations::AssociateVariationParams("ClientSidePreviews", "Enabled", params); - base::FieldTrialList::CreateFieldTrial("ClientSidePreviews", "Enabled"); - // The blacklist is not created yet. EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE), 1); - set_ui_service(base::WrapUnique( - new PreviewsUIService(io_data(), loop_.task_runner(), - base::MakeUnique<TestPreviewsOptOutStore>()))); + InitializeUIServiceWithoutWaitingForBlackList(); + + // The blacklist is not created yet. + EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); + histogram_tester.ExpectBucketCount( + "Previews.EligibilityReason.Offline", + static_cast<int>(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE), 2); base::RunLoop().RunUntilIdle(); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 2); + + // Enable Offline previews field trial. + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "true"}}); + // Return one of the failing statuses from the blacklist; cause the blacklist // to not be loaded by clearing the blacklist. base::Time now = base::Time::Now(); @@ -177,59 +223,197 @@ TEST_F(PreviewsIODataTest, TestShouldAllowPreview) { "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED), 1); +} - // Reload the blacklist. The blacklist should allow all navigations now. - base::RunLoop().RunUntilIdle(); +TEST_F(PreviewsIODataTest, TestDisallowOfflineByDefault) { + InitializeUIService(); - // NQE should be null on the context. - EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectBucketCount( - "Previews.EligibilityReason.Offline", - static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE), - 1); + base::HistogramTester histogram_tester; + EXPECT_FALSE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0); +} + +TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenInDisabledGroup) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Disabled", + {{"show_offline_pages", "true"}}); + + base::HistogramTester histogram_tester; + EXPECT_FALSE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0); +} + +TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenDisabled) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "false"}}); + + base::HistogramTester histogram_tester; + EXPECT_FALSE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 0); +} - net::TestNetworkQualityEstimator network_quality_estimator(params); - context.set_network_quality_estimator(&network_quality_estimator); +TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenNetworkQualityUnavailable) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "true"}}); - // Set NQE type to unknown. - network_quality_estimator.set_effective_connection_type( + network_quality_estimator()->set_effective_connection_type( net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); - EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectBucketCount( + base::HistogramTester histogram_tester; + EXPECT_FALSE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE), - 2); + 1); +} - // Set NQE type to fast enough. - network_quality_estimator.set_effective_connection_type( - net::EFFECTIVE_CONNECTION_TYPE_2G); - EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectBucketCount( +TEST_F(PreviewsIODataTest, TestDisallowOfflineWhenNetworkQualityFast) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "true"}, + {"max_allowed_effective_connection_type", "2G"}}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_3G); + + base::HistogramTester histogram_tester; + EXPECT_FALSE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1); +} + +TEST_F(PreviewsIODataTest, TestDisallowOfflineOnReload) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "true"}, + {"max_allowed_effective_connection_type", "2G"}}); - // Set NQE type to slow. - network_quality_estimator.set_effective_connection_type( - net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_2G); + std::unique_ptr<net::URLRequest> request = CreateRequest(); request->SetLoadFlags(net::LOAD_BYPASS_CACHE); + + base::HistogramTester histogram_tester; EXPECT_FALSE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectBucketCount( + histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason.Offline", static_cast<int>( PreviewsEligibilityReason::RELOAD_DISALLOWED_FOR_OFFLINE), 1); +} - request->SetLoadFlags(0); - EXPECT_TRUE(io_data()->ShouldAllowPreview(*request, PreviewsType::OFFLINE)); - histogram_tester.ExpectBucketCount( +TEST_F(PreviewsIODataTest, TestAllowOffline) { + InitializeUIService(); + CreateFieldTrialWithParams("ClientSidePreviews", "Enabled", + {{"show_offline_pages", "true"}, + {"max_allowed_effective_connection_type", "2G"}}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_2G); + + base::HistogramTester histogram_tester; + EXPECT_TRUE( + io_data()->ShouldAllowPreview(*CreateRequest(), PreviewsType::OFFLINE)); + histogram_tester.ExpectUniqueSample( "Previews.EligibilityReason.Offline", static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1); +} + +TEST_F(PreviewsIODataTest, ClientLoFiDisallowedByDefault) { + InitializeUIService(); + + base::HistogramTester histogram_tester; + EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(), + PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.ClientLoFi", 0); +} + +TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenFieldTrialDisabled) { + InitializeUIService(); + CreateFieldTrialWithParams("PreviewsClientLoFi", "Disabled", {}); + + base::HistogramTester histogram_tester; + EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(), + PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectTotalCount("Previews.EligibilityReason.ClientLoFi", 0); +} + +TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenNetworkQualityUnavailable) { + InitializeUIService(); + CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled", {}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); + + base::HistogramTester histogram_tester; + EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(), + PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectUniqueSample( + "Previews.EligibilityReason.ClientLoFi", + static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE), + 1); +} + +TEST_F(PreviewsIODataTest, ClientLoFiDisallowedWhenNetworkFast) { + InitializeUIService(); + CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled", + {{"max_allowed_effective_connection_type", "2G"}}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_3G); + + base::HistogramTester histogram_tester; + EXPECT_FALSE(io_data()->ShouldAllowPreview(*CreateRequest(), + PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectUniqueSample( + "Previews.EligibilityReason.ClientLoFi", + static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1); +} + +TEST_F(PreviewsIODataTest, ClientLoFiAllowed) { + InitializeUIService(); + CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled", + {{"max_allowed_effective_connection_type", "2G"}}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_2G); + + base::HistogramTester histogram_tester; + EXPECT_TRUE(io_data()->ShouldAllowPreview(*CreateRequest(), + PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectUniqueSample( + "Previews.EligibilityReason.ClientLoFi", + static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1); +} + +TEST_F(PreviewsIODataTest, ClientLoFiAllowedOnReload) { + InitializeUIService(); + CreateFieldTrialWithParams("PreviewsClientLoFi", "Enabled", + {{"max_allowed_effective_connection_type", "2G"}}); + + network_quality_estimator()->set_effective_connection_type( + net::EFFECTIVE_CONNECTION_TYPE_2G); - histogram_tester.ExpectTotalCount("Previews.EligibilityReason.Offline", 7); + std::unique_ptr<net::URLRequest> request = CreateRequest(); + request->SetLoadFlags(net::LOAD_BYPASS_CACHE); - variations::testing::ClearAllVariationParams(); + base::HistogramTester histogram_tester; + EXPECT_TRUE( + io_data()->ShouldAllowPreview(*request, PreviewsType::CLIENT_LOFI)); + histogram_tester.ExpectUniqueSample( + "Previews.EligibilityReason.ClientLoFi", + static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1); } +} // namespace + } // namespace previews |