Index: ios/chrome/browser/ui/preload_controller_unittest.mm |
diff --git a/ios/chrome/browser/ui/preload_controller_unittest.mm b/ios/chrome/browser/ui/preload_controller_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..baaa904457ff499351833fa1ca4cc6148697a0b3 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/preload_controller_unittest.mm |
@@ -0,0 +1,262 @@ |
+// Copyright 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <memory> |
+ |
+#include "base/ios/device_util.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/run_loop.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "components/prefs/pref_service.h" |
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
+#include "ios/chrome/browser/pref_names.h" |
+#import "ios/chrome/browser/ui/preload_controller.h" |
+#include "ios/web/public/test/test_web_thread_bundle.h" |
+#include "net/url_request/test_url_fetcher_factory.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/platform_test.h" |
+ |
+@interface PreloadController (ExposedForTesting) |
+- (BOOL)shouldPreloadURL:(const GURL&)url; |
+- (BOOL)isPrerenderingEnabled; |
+- (BOOL)isPrefetchingEnabled; |
+- (const GURL)urlToPrefetchURL:(const GURL&)url; |
+- (BOOL)hasPrefetchedURL:(const GURL&)url; |
+@end |
+ |
+namespace { |
+ |
+// Override NetworkChangeNotifier to simulate connection type changes for tests. |
+class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { |
+ public: |
+ TestNetworkChangeNotifier() |
+ : net::NetworkChangeNotifier(), |
+ connection_type_to_return_( |
+ net::NetworkChangeNotifier::CONNECTION_UNKNOWN) {} |
+ |
+ // Simulates a change of the connection type to |type|. This will notify any |
+ // objects that are NetworkChangeNotifiers. |
+ void SimulateNetworkConnectionChange( |
+ net::NetworkChangeNotifier::ConnectionType type) { |
+ connection_type_to_return_ = type; |
+ net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChange(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ private: |
+ ConnectionType GetCurrentConnectionType() const override { |
+ return connection_type_to_return_; |
+ } |
+ |
+ // The currently simulated network connection type. If this is set to |
+ // CONNECTION_NONE, then NetworkChangeNotifier::IsOffline will return true. |
+ net::NetworkChangeNotifier::ConnectionType connection_type_to_return_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); |
+}; |
+ |
+class PreloadControllerTest : public PlatformTest { |
+ protected: |
+ void SetUp() override { |
+ TestChromeBrowserState::Builder test_cbs_builder; |
+ chrome_browser_state_ = test_cbs_builder.Build(); |
+ // Set up a NetworkChangeNotifier so that the test can simulate Wi-Fi vs. |
+ // cellular connection. |
+ network_change_notifier_.reset(new TestNetworkChangeNotifier); |
+ |
+ test_url_fetcher_factory_.reset(new net::TestURLFetcherFactory()); |
+ |
+ controller_.reset([[PreloadController alloc] |
+ initWithBrowserState:chrome_browser_state_.get()]); |
+ }; |
+ |
+ // Set the "Preload webpages" setting to "Always". |
+ void PreloadWebpagesAlways() { |
+ chrome_browser_state_->GetPrefs()->SetBoolean( |
+ prefs::kNetworkPredictionEnabled, YES); |
+ chrome_browser_state_->GetPrefs()->SetBoolean( |
+ prefs::kNetworkPredictionWifiOnly, NO); |
+ } |
+ |
+ // Set the "Preload webpages" setting to "Only on Wi-Fi". |
+ void PreloadWebpagesWiFiOnly() { |
+ chrome_browser_state_->GetPrefs()->SetBoolean( |
+ prefs::kNetworkPredictionEnabled, YES); |
+ chrome_browser_state_->GetPrefs()->SetBoolean( |
+ prefs::kNetworkPredictionWifiOnly, YES); |
+ } |
+ |
+ // Set the "Preload webpages" setting to "Never". |
+ void PreloadWebpagesNever() { |
+ chrome_browser_state_->GetPrefs()->SetBoolean( |
+ prefs::kNetworkPredictionEnabled, NO); |
+ } |
+ |
+ void SimulateWiFiConnection() { |
+ network_change_notifier_->SimulateNetworkConnectionChange( |
+ net::NetworkChangeNotifier::CONNECTION_WIFI); |
+ } |
+ |
+ void SimulateCellularConnection() { |
+ network_change_notifier_->SimulateNetworkConnectionChange( |
+ net::NetworkChangeNotifier::CONNECTION_3G); |
+ } |
+ |
+ web::TestWebThreadBundle thread_bundle_; |
+ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
+ std::unique_ptr<TestNetworkChangeNotifier> network_change_notifier_; |
+ std::unique_ptr<net::TestURLFetcherFactory> test_url_fetcher_factory_; |
+ base::scoped_nsobject<PreloadController> controller_; |
+}; |
+ |
+// Tests that the preload controller does not try to preload non-web urls. |
+TEST_F(PreloadControllerTest, ShouldPreloadURL) { |
+ EXPECT_TRUE([controller_ shouldPreloadURL:GURL("http://www.google.com/")]); |
+ EXPECT_TRUE([controller_ shouldPreloadURL:GURL("https://www.google.com/")]); |
+ |
+ EXPECT_FALSE([controller_ shouldPreloadURL:GURL()]); |
+ EXPECT_FALSE([controller_ shouldPreloadURL:GURL("chrome://newtab")]); |
+ EXPECT_FALSE([controller_ shouldPreloadURL:GURL("about:flags")]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrerenderingEnabled_preloadAlways) { |
+ // With the "Preload Webpages" setting set to "Always", prerendering is |
+ // enabled regardless of network type. |
+ PreloadWebpagesAlways(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_TRUE([controller_ isPrerenderingEnabled] || |
+ ios::device_util::IsSingleCoreDevice() || |
+ !ios::device_util::RamIsAtLeast512Mb()); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_TRUE([controller_ isPrerenderingEnabled] || |
+ ios::device_util::IsSingleCoreDevice() || |
+ !ios::device_util::RamIsAtLeast512Mb()); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrerenderingEnabled_preloadWiFiOnly) { |
+ // With the Chrome "Preload Webpages" setting set to "Only on Wi-Fi", |
+ // prerendering is enabled only on WiFi. |
+ PreloadWebpagesWiFiOnly(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_TRUE([controller_ isPrerenderingEnabled] || |
+ ios::device_util::IsSingleCoreDevice() || |
+ !ios::device_util::RamIsAtLeast512Mb()); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_FALSE([controller_ isPrerenderingEnabled]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrerenderingEnabled_preloadNever) { |
+ // With the Chrome "Preload Webpages" setting set to "Never", prerendering |
+ // is never enabled, regardless of the network type. |
+ PreloadWebpagesNever(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_FALSE([controller_ isPrerenderingEnabled]); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_FALSE([controller_ isPrerenderingEnabled]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrefetchingEnabled_preloadAlways) { |
+ // With the "Preload Webpages" setting set to "Always", prefetching is |
+ // always enabled. |
+ PreloadWebpagesAlways(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_TRUE([controller_ isPrefetchingEnabled]); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_TRUE([controller_ isPrefetchingEnabled]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrefetchingEnabled_preloadWiFiOnly) { |
+ // With the Chrome "Preload Webpages" setting set to "Only on Wi-Fi", |
+ // prefetching is enabled only on WiFi. |
+ PreloadWebpagesWiFiOnly(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_TRUE([controller_ isPrefetchingEnabled]); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_FALSE([controller_ isPrefetchingEnabled]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestIsPrefetchingEnabled_preloadNever) { |
+ // With the Chrome "Preload Webpages" setting set to "Never", prefetching |
+ // is never enabled, regardless of WiFi state. |
+ PreloadWebpagesNever(); |
+ |
+ SimulateWiFiConnection(); |
+ EXPECT_FALSE([controller_ isPrefetchingEnabled]); |
+ |
+ SimulateCellularConnection(); |
+ EXPECT_FALSE([controller_ isPrefetchingEnabled]); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestPrefetchURL_transformURL) { |
+ PreloadWebpagesAlways(); |
+ |
+ GURL original("http://www.google.com/search?q=foo"); |
+ GURL expected("http://www.google.com/search?q=foo&pf=i"); |
+ [controller_ prefetchURL:original |
+ transition:ui::PAGE_TRANSITION_FROM_ADDRESS_BAR]; |
+ |
+ net::TestURLFetcher* url_fetcher = nil; |
+ url_fetcher = |
+ test_url_fetcher_factory_->GetFetcherByID(kPreloadControllerURLFetcherID); |
+ |
+ EXPECT_TRUE(url_fetcher); |
+ GURL actual = url_fetcher->GetOriginalURL(); |
+ EXPECT_EQ(expected, actual); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestUrlToPrefetchURL_noParams) { |
+ GURL original("http://www.google.com/search"); |
+ GURL expected("http://www.google.com/search?pf=i"); |
+ GURL actual = [controller_ urlToPrefetchURL:original]; |
+ EXPECT_EQ(expected, actual); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestUrlToPrefetchURL_params) { |
+ std::string urlString = |
+ std::string("http://www.google.com/search") |
+ .append("?q=legoland&oq=legol&aqs=chrome.0.0j69i57j0j5") |
+ .append("&sourceid=chrome-mobile&ie=UTF-8&hl=en-US"); |
+ GURL original(urlString); |
+ GURL expected(urlString + "&pf=i"); |
+ GURL actual = [controller_ urlToPrefetchURL:original]; |
+ EXPECT_EQ(expected, actual); |
+} |
+ |
+TEST_F(PreloadControllerTest, TestHasPrefetchedURL) { |
+ PreloadWebpagesAlways(); |
+ |
+ GURL first("http://www.google.com/search?q=first"); |
+ GURL second("http://www.google.com/search?q=second"); |
+ GURL bogus("http://www.google.com/search?q=bogus"); |
+ |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:first]); |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:second]); |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:bogus]); |
+ |
+ // Prefetch |first| and verify it's the only one that returns true. |
+ [controller_ prefetchURL:first |
+ transition:ui::PAGE_TRANSITION_FROM_ADDRESS_BAR]; |
+ EXPECT_TRUE([controller_ hasPrefetchedURL:first]); |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:second]); |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:bogus]); |
+ |
+ // Prefetch |second| and verify it's the only one that returns true. |
+ [controller_ prefetchURL:second |
+ transition:ui::PAGE_TRANSITION_FROM_ADDRESS_BAR]; |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:first]); |
+ EXPECT_TRUE([controller_ hasPrefetchedURL:second]); |
+ EXPECT_FALSE([controller_ hasPrefetchedURL:bogus]); |
+} |
+ |
+} // anonymous namespace |