1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/command_line.h" 6 #include "base/run_loop.h" 7 #include "content/public/common/content_switches.h" 8 #include "content/public/test/browser_test_utils.h" 9 #include "content/public/test/content_browser_test.h" 10 #include "content/public/test/content_browser_test_utils.h" 11 #include "content/shell/browser/shell.h" 12 #include "net/base/network_change_notifier.h" 13 #include "net/base/network_change_notifier_factory.h" 14 15 class NetInfoBrowserTest : public content::ContentBrowserTest { 16 protected: 17 virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE { 18 // TODO(jkarlin): Once NetInfo is enabled on all platforms remove this 19 // switch. 20 command_line->AppendSwitch(switches::kEnableNetworkInformation); 21 } 22 23 #if defined(OS_CHROMEOS) 24 virtual void SetUp() OVERRIDE { 25 // ChromeOS's NetworkChangeNotifier isn't known to content and therefore 26 // doesn't get created in content_browsertests. Insert a mock 27 // NetworkChangeNotifier. 28 net::NetworkChangeNotifier::CreateMock(); 29 content::ContentBrowserTest::SetUp(); 30 } 31 #endif 32 33 virtual void SetUpOnMainThread() OVERRIDE { 34 net::NetworkChangeNotifier::SetTestNotificationsOnly(true); 35 base::RunLoop().RunUntilIdle(); 36 } 37 38 static void SetConnectionType( 39 net::NetworkChangeNotifier::ConnectionType type) { 40 net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( 41 type); 42 base::RunLoop().RunUntilIdle(); 43 } 44 45 std::string RunScriptExtractString(const std::string& script) { 46 std::string data; 47 EXPECT_TRUE( 48 ExecuteScriptAndExtractString(shell()->web_contents(), script, &data)); 49 return data; 50 } 51 52 bool RunScriptExtractBool(const std::string& script) { 53 bool data; 54 EXPECT_TRUE( 55 ExecuteScriptAndExtractBool(shell()->web_contents(), script, &data)); 56 return data; 57 } 58 }; 59 60 // Make sure that type changes in the browser make their way to 61 // navigator.connection.type. 62 IN_PROC_BROWSER_TEST_F(NetInfoBrowserTest, NetworkChangePlumbsToNavigator) { 63 NavigateToURL(shell(), content::GetTestUrl("", "net_info.html")); 64 SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI); 65 EXPECT_EQ("wifi", RunScriptExtractString("getType()")); 66 SetConnectionType(net::NetworkChangeNotifier::CONNECTION_ETHERNET); 67 EXPECT_EQ("ethernet", RunScriptExtractString("getType()")); 68 } 69 70 // Make sure that type changes in the browser make their way to 71 // navigator.isOnline. 72 IN_PROC_BROWSER_TEST_F(NetInfoBrowserTest, IsOnline) { 73 NavigateToURL(shell(), content::GetTestUrl("", "net_info.html")); 74 SetConnectionType(net::NetworkChangeNotifier::CONNECTION_ETHERNET); 75 EXPECT_TRUE(RunScriptExtractBool("getOnLine()")); 76 SetConnectionType(net::NetworkChangeNotifier::CONNECTION_NONE); 77 EXPECT_FALSE(RunScriptExtractBool("getOnLine()")); 78 SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI); 79 EXPECT_TRUE(RunScriptExtractBool("getOnLine()")); 80 } 81