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.
5 #include "base/files/file_path.h"
6 #include "base/files/file_util.h"
7 #include "chrome/browser/ui/browser_window.h"
8 #include "chrome/test/remoting/key_code_test_map.h"
9 #include "chrome/test/remoting/remote_desktop_browsertest.h"
10 #include "chrome/test/remoting/remote_test_helper.h"
11 #include "chrome/test/remoting/waiter.h"
12 #include "extensions/browser/app_window/app_window.h"
16 class Me2MeBrowserTest
: public RemoteDesktopBrowserTest
{
18 void TestKeypressInput(ui::KeyboardCode
, const char*);
20 void ConnectPinlessAndCleanupPairings(bool cleanup_all
);
21 bool IsPairingSpinnerHidden();
22 void SetupForRemoteHostTest();
28 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
, MANUAL_Me2Me_Connect_Local_Host
) {
29 content::WebContents
* content
= SetUpTest();
30 LoadScript(content
, FILE_PATH_LITERAL("me2me_browser_test.js"));
31 RunJavaScriptTest(content
, "ConnectToLocalHost", "{"
32 "pin: '" + me2me_pin() + "'"
38 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
39 MANUAL_Me2Me_Connect_Remote_Host
) {
40 VerifyInternetAccess();
42 LaunchChromotingApp(false);
44 // Authorize, Authenticate, and Approve.
48 ConnectToRemoteHost(remote_host_name(), false);
50 // TODO(weitaosu): Find a way to verify keyboard input injection.
51 // We cannot use TestKeyboardInput because it assumes
52 // that the client and the host are on the same machine.
58 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
59 MANUAL_Me2Me_Remote_Host_Keypress
) {
60 SetupForRemoteHostTest();
62 // Test all key characters
63 int length
= sizeof(test_alpha_map
)/sizeof(KeyCodeTestMap
);
64 for (int i
= 0; i
< length
; i
++) {
65 KeyCodeTestMap key
= test_alpha_map
[i
];
66 TestKeypressInput(key
.vkey_code
, key
.code
);
72 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
73 MANUAL_Me2Me_Remote_Host_Digitpress
) {
74 SetupForRemoteHostTest();
76 // Test all digit characters
77 int length
= sizeof(test_digit_map
)/sizeof(KeyCodeTestMap
);
78 for (int i
= 0; i
< length
; i
++) {
79 KeyCodeTestMap key
= test_digit_map
[i
];
80 TestKeypressInput(key
.vkey_code
, key
.code
);
86 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
87 MANUAL_Me2Me_Remote_Host_Specialpress
) {
88 SetupForRemoteHostTest();
90 // Test all special characters
91 int length
= sizeof(test_special_map
)/sizeof(KeyCodeTestMap
);
92 for (int i
= 0; i
< length
; i
++) {
93 KeyCodeTestMap key
= test_special_map
[i
];
94 TestKeypressInput(key
.vkey_code
, key
.code
);
100 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
101 MANUAL_Me2Me_Remote_Host_Numpadpress
) {
102 SetupForRemoteHostTest();
104 // Test all numpad characters
105 int length
= sizeof(test_numpad_map
)/sizeof(KeyCodeTestMap
);
106 for (int i
= 0; i
< length
; i
++) {
107 KeyCodeTestMap key
= test_numpad_map
[i
];
108 TestKeypressInput(key
.vkey_code
, key
.code
);
114 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
115 MANUAL_Me2Me_Connect_Pinless
) {
118 ASSERT_FALSE(HtmlElementVisible("paired-client-manager-message"))
119 << "The host must have no pairings before running the pinless test.";
121 // Test that cleanup works with either the Delete or Delete all buttons.
122 ConnectPinlessAndCleanupPairings(false);
123 ConnectPinlessAndCleanupPairings(true);
128 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
, MANUAL_Me2Me_v2_Alive_OnLostFocus
) {
129 content::WebContents
* content
= SetUpTest();
130 LoadScript(content
, FILE_PATH_LITERAL("me2me_browser_test.js"));
131 RunJavaScriptTest(content
, "AliveOnLostFocus", "{"
132 "pin: '" + me2me_pin() + "'"
138 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
, MANUAL_Me2Me_RetryOnHostOffline
) {
139 content::WebContents
* content
= SetUpTest();
140 LoadScript(content
, FILE_PATH_LITERAL("me2me_browser_test.js"));
141 RunJavaScriptTest(content
, "RetryOnHostOffline", "{"
142 "pin: '" + me2me_pin() + "'"
148 IN_PROC_BROWSER_TEST_F(Me2MeBrowserTest
,
149 MANUAL_Me2Me_Disable_Remote_Connection
) {
152 DisableRemoteConnection();
153 EXPECT_FALSE(IsLocalHostReady());
158 void Me2MeBrowserTest::SetupForRemoteHostTest() {
159 VerifyInternetAccess();
160 OpenClientBrowserPage();
162 LaunchChromotingApp(false);
164 // Authorize, Authenticate, and Approve.
167 ConnectToRemoteHost(remote_host_name(), false);
169 // Wake up the machine if it's sleeping.
170 // This is only needed when testing manually as the host machine
172 SimulateKeyPressWithCode(ui::VKEY_RETURN
, "Enter");
175 void Me2MeBrowserTest::TestKeypressInput(
176 ui::KeyboardCode keyCode
,
178 remote_test_helper()->ClearLastEvent();
179 VLOG(1) << "Pressing " << code
;
180 SimulateKeyPressWithCode(keyCode
, code
);
182 remote_test_helper()->GetLastEvent(&event
);
183 ASSERT_EQ(Action::Keydown
, event
.action
);
184 ASSERT_EQ(keyCode
, event
.value
);
187 void Me2MeBrowserTest::ConnectPinlessAndCleanupPairings(bool cleanup_all
) {
188 // First connection: verify that a PIN is requested, and request pairing.
189 ConnectToLocalHost(true);
192 // TODO(jamiewalch): This reload is only needed because there's a bug in the
193 // web-app whereby it doesn't refresh its pairing state correctly.
194 // http://crbug.com/311290
195 LaunchChromotingApp(false);
196 ASSERT_TRUE(HtmlElementVisible("paired-client-manager-message"));
198 // Second connection: verify that no PIN is requested.
199 ClickOnControl("this-host-connect");
203 // Clean up pairings.
204 ClickOnControl("open-paired-client-manager-dialog");
205 ASSERT_TRUE(HtmlElementVisible("paired-client-manager-dialog"));
208 ClickOnControl("delete-all-paired-clients");
210 std::string host_id
= ExecuteScriptAndExtractString(
211 "remoting.pairedClientManager.getFirstClientIdForTesting_()");
212 std::string node_id
= "delete-client-" + host_id
;
213 ClickOnControl(node_id
);
216 // Wait for the "working" spinner to disappear. The spinner is shown by both
217 // methods of deleting a host and is removed when the operation completes.
218 ConditionalTimeoutWaiter
waiter(
219 base::TimeDelta::FromSeconds(5),
220 base::TimeDelta::FromMilliseconds(200),
221 base::Bind(&Me2MeBrowserTest::IsPairingSpinnerHidden
, this));
222 EXPECT_TRUE(waiter
.Wait());
223 EXPECT_TRUE(ExecuteScriptAndExtractBool(
224 "document.getElementById('delete-all-paired-clients').disabled"));
226 ClickOnControl("close-paired-client-manager-dialog");
227 ASSERT_FALSE(HtmlElementVisible("paired-client-manager-dialog"));
228 ASSERT_FALSE(HtmlElementVisible("paired-client-manager-message"));
231 bool Me2MeBrowserTest::IsPairingSpinnerHidden() {
232 return !HtmlElementVisible("paired-client-manager-dialog-working");
235 } // namespace remoting