1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/content_switches.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/browser_test_utils.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/content_browser_test.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/content_browser_test_utils.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/shell/browser/shell.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/network_change_notifier.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/network_change_notifier_factory.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass NetInfoBrowserTest : public content::ContentBrowserTest {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // TODO(jkarlin): Once NetInfo is enabled on all platforms remove this
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // switch.
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    command_line->AppendSwitch(switches::kEnableNetworkInformation);
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // ChromeOS's NetworkChangeNotifier isn't known to content and therefore
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // doesn't get created in content_browsertests. Insert a mock
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // NetworkChangeNotifier.
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::NetworkChangeNotifier::CreateMock();
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::ContentBrowserTest::SetUp();
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUpOnMainThread() OVERRIDE {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::NetworkChangeNotifier::SetTestNotificationsOnly(true);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop().RunUntilIdle();
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void SetConnectionType(
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      net::NetworkChangeNotifier::ConnectionType type) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests(
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        type);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop().RunUntilIdle();
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string RunScriptExtractString(const std::string& script) {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string data;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ExecuteScriptAndExtractString(shell()->web_contents(), script, &data));
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return data;
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool RunScriptExtractBool(const std::string& script) {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool data;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ExecuteScriptAndExtractBool(shell()->web_contents(), script, &data));
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return data;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Make sure that type changes in the browser make their way to
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// navigator.connection.type.
62116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(NetInfoBrowserTest, NetworkChangePlumbsToNavigator) {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NavigateToURL(shell(), content::GetTestUrl("", "net_info.html"));
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("wifi", RunScriptExtractString("getType()"));
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("ethernet", RunScriptExtractString("getType()"));
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Make sure that type changes in the browser make their way to
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// navigator.isOnline.
72116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(NetInfoBrowserTest, IsOnline) {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NavigateToURL(shell(), content::GetTestUrl("", "net_info.html"));
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(RunScriptExtractBool("getOnLine()"));
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_NONE);
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(RunScriptExtractBool("getOnLine()"));
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(RunScriptExtractBool("getOnLine()"));
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
81