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
15class 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.
62IN_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.
72IN_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