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