1// Copyright 2013 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/files/file_path.h"
6#include "base/files/file_util.h"
7#include "chrome/test/remoting/remote_desktop_browsertest.h"
8#include "chrome/test/remoting/waiter.h"
9
10namespace remoting {
11
12class Me2MeBrowserTest : public RemoteDesktopBrowserTest {
13 protected:
14  void TestKeyboardInput();
15  void TestMouseInput();
16
17  void ConnectPinlessAndCleanupPairings(bool cleanup_all);
18  bool IsPairingSpinnerHidden();
19};
20
21IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest,
22                       MANUAL_Me2Me_Connect_Local_Host) {
23  SetUpTestForMe2Me();
24
25  ConnectToLocalHost(false);
26
27  // TODO(chaitali): Change the mouse input test to also work in the
28  // HTTP server framework
29  // TestMouseInput();
30
31  DisconnectMe2Me();
32  Cleanup();
33}
34
35IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest,
36                       MANUAL_Me2Me_Connect_Remote_Host) {
37  VerifyInternetAccess();
38  Install();
39  LaunchChromotingApp();
40
41  // Authorize, Authenticate, and Approve.
42  Auth();
43  ExpandMe2Me();
44
45  ConnectToRemoteHost(remote_host_name(), false);
46
47  // TODO(weitaosu): Find a way to verify keyboard input injection.
48  // We cannot use TestKeyboardInput because it assumes
49  // that the client and the host are on the same machine.
50
51  DisconnectMe2Me();
52  Cleanup();
53}
54
55IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest,
56                       MANUAL_Me2Me_Connect_Pinless) {
57  SetUpTestForMe2Me();
58
59  ASSERT_FALSE(HtmlElementVisible("paired-client-manager-message"))
60      << "The host must have no pairings before running the pinless test.";
61
62  // Test that cleanup works with either the Delete or Delete all buttons.
63  ConnectPinlessAndCleanupPairings(false);
64  ConnectPinlessAndCleanupPairings(true);
65
66  Cleanup();
67}
68
69void Me2MeBrowserTest::TestKeyboardInput() {
70  // We will assume here that the browser window is already open on the host
71  // and in focus.
72  // Press tab to put focus on the textbox.
73  SimulateKeyPressWithCode(ui::VKEY_TAB, "Tab", false, false, false, false);
74
75  // Write some text in the box and press enter
76  std::string text = "Abigail";
77  SimulateStringInput(text);
78  SimulateKeyPressWithCode(
79      ui::VKEY_RETURN, "Enter", false, false, false, false);
80
81  // Wait until the client tab sets the right variables
82  ConditionalTimeoutWaiter waiter(
83          base::TimeDelta::FromSeconds(10),
84          base::TimeDelta::FromMilliseconds(500),
85          base::Bind(&RemoteDesktopBrowserTest::IsHostActionComplete,
86                     client_web_content(),
87                     "testResult.keypressSucceeded"));
88  EXPECT_TRUE(waiter.Wait());
89
90  // Check that the text we got is correct
91  EXPECT_TRUE(ExecuteScriptAndExtractBool(
92      client_web_content(),
93      "testResult.keypressText == '" + text + "'"));
94}
95
96void Me2MeBrowserTest::TestMouseInput() {
97  SimulateMouseLeftClickAt(10, 50);
98  // TODO: Verify programatically the mouse events are received by the host.
99  // This will be tricky as it depends on the host OS, window manager, desktop
100  // layout, and screen resolution. Until then we need to visually verify that
101  // "Dash Home" is clicked on a Unity window manager.
102  ASSERT_TRUE(TimeoutWaiter(base::TimeDelta::FromSeconds(5)).Wait());
103}
104
105void Me2MeBrowserTest::ConnectPinlessAndCleanupPairings(bool cleanup_all) {
106  // First connection: verify that a PIN is requested, and request pairing.
107  ConnectToLocalHost(true);
108  DisconnectMe2Me();
109
110  // TODO(jamiewalch): This reload is only needed because there's a bug in the
111  // web-app whereby it doesn't refresh its pairing state correctly.
112  // http://crbug.com/311290
113  LaunchChromotingApp();
114  ASSERT_TRUE(HtmlElementVisible("paired-client-manager-message"));
115
116  // Second connection: verify that no PIN is requested.
117  ClickOnControl("this-host-connect");
118  WaitForConnection();
119  DisconnectMe2Me();
120
121  // Clean up pairings.
122  ClickOnControl("open-paired-client-manager-dialog");
123  ASSERT_TRUE(HtmlElementVisible("paired-client-manager-dialog"));
124
125  if (cleanup_all) {
126    ClickOnControl("delete-all-paired-clients");
127  } else {
128    std::string host_id = ExecuteScriptAndExtractString(
129        "remoting.pairedClientManager.getFirstClientIdForTesting_()");
130    std::string node_id = "delete-client-" + host_id;
131    ClickOnControl(node_id);
132  }
133
134  // Wait for the "working" spinner to disappear. The spinner is shown by both
135  // methods of deleting a host and is removed when the operation completes.
136  ConditionalTimeoutWaiter waiter(
137      base::TimeDelta::FromSeconds(5),
138      base::TimeDelta::FromMilliseconds(200),
139      base::Bind(&Me2MeBrowserTest::IsPairingSpinnerHidden, this));
140  EXPECT_TRUE(waiter.Wait());
141  EXPECT_TRUE(ExecuteScriptAndExtractBool(
142      "document.getElementById('delete-all-paired-clients').disabled"));
143
144  ClickOnControl("close-paired-client-manager-dialog");
145  ASSERT_FALSE(HtmlElementVisible("paired-client-manager-dialog"));
146  ASSERT_FALSE(HtmlElementVisible("paired-client-manager-message"));
147}
148
149bool Me2MeBrowserTest::IsPairingSpinnerHidden() {
150  return !HtmlElementVisible("paired-client-manager-dialog-working");
151}
152
153}  // namespace remoting
154