Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
| 7 #include "chrome/browser/chrome_notification_types.h" | 7 #include "chrome/browser/chrome_notification_types.h" |
| 8 #include "chrome/browser/extensions/extension_browsertest.h" | 8 #include "chrome/browser/extensions/extension_browsertest.h" |
| 9 #include "chrome/browser/extensions/extension_service.h" | 9 #include "chrome/browser/extensions/extension_service.h" |
| 10 #include "chrome/browser/extensions/unpacked_installer.h" | 10 #include "chrome/browser/extensions/unpacked_installer.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 #include "net/dns/mock_host_resolver.h" | 28 #include "net/dns/mock_host_resolver.h" |
| 29 | 29 |
| 30 using extensions::Extension; | 30 using extensions::Extension; |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 // Command line arguments specific to the chromoting browser tests. | 33 // Command line arguments specific to the chromoting browser tests. |
| 34 const char kOverrideUserDataDir[] = "override-user-data-dir"; | 34 const char kOverrideUserDataDir[] = "override-user-data-dir"; |
| 35 const char kNoCleanup[] = "no-cleanup"; | 35 const char kNoCleanup[] = "no-cleanup"; |
| 36 const char kNoInstall[] = "no-install"; | 36 const char kNoInstall[] = "no-install"; |
| 37 const char kWebAppCrx[] = "webapp-crx"; | 37 const char kWebAppCrx[] = "webapp-crx"; |
| 38 const char kUsername[] = "username"; | |
| 39 const char kPassword[] = "password"; | |
| 40 | |
| 41 // ASSERT_TRUE can only be used in void returning functions. | |
| 42 void _ASSERT_TRUE(bool condition) { | |
| 43 ASSERT_TRUE(condition); | |
| 44 return; | |
| 45 } | |
| 46 | |
| 38 } | 47 } |
| 39 | 48 |
| 40 namespace remoting { | 49 namespace remoting { |
| 41 | 50 |
| 42 class RemoteDesktopBrowserTest : public ExtensionBrowserTest { | 51 class RemoteDesktopBrowserTest : public ExtensionBrowserTest { |
| 43 public: | 52 public: |
| 44 virtual void SetUp() OVERRIDE { | 53 virtual void SetUp() OVERRIDE { |
| 45 ParseCommandLine(); | 54 ParseCommandLine(); |
| 46 ExtensionBrowserTest::SetUp(); | 55 ExtensionBrowserTest::SetUp(); |
| 47 } | 56 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 70 void VerifyChromotingLoaded(bool expected); | 79 void VerifyChromotingLoaded(bool expected); |
| 71 | 80 |
| 72 // Launch the chromoting app. | 81 // Launch the chromoting app. |
| 73 void LaunchChromotingApp(); | 82 void LaunchChromotingApp(); |
| 74 | 83 |
| 75 // Verify the test has access to the internet (specifically google.com) | 84 // Verify the test has access to the internet (specifically google.com) |
| 76 void VerifyInternetAccess(); | 85 void VerifyInternetAccess(); |
| 77 | 86 |
| 78 void Authorize(); | 87 void Authorize(); |
| 79 | 88 |
| 89 void Authenticate(); | |
| 90 | |
| 80 // Whether to perform the cleanup tasks (uninstalling chromoting, etc). | 91 // Whether to perform the cleanup tasks (uninstalling chromoting, etc). |
| 81 // This is useful for diagnostic purposes. | 92 // This is useful for diagnostic purposes. |
| 82 bool NoCleanup() { return no_cleanup_; } | 93 bool NoCleanup() { return no_cleanup_; } |
| 83 | 94 |
| 84 // Whether to install the chromoting extension before running the test cases. | 95 // Whether to install the chromoting extension before running the test cases. |
| 85 // This is useful for diagnostic purposes. | 96 // This is useful for diagnostic purposes. |
| 86 bool NoInstall() { return no_install_; } | 97 bool NoInstall() { return no_install_; } |
| 87 | 98 |
| 88 private: | 99 private: |
| 89 void ParseCommandLine(); | 100 void ParseCommandLine(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 100 base::FilePath WebAppCrxPath() { return webapp_crx_; } | 111 base::FilePath WebAppCrxPath() { return webapp_crx_; } |
| 101 | 112 |
| 102 // Helper to get the extension ID of the installed chromoting webapp. | 113 // Helper to get the extension ID of the installed chromoting webapp. |
| 103 std::string ChromotingID() { return chromoting_id_; } | 114 std::string ChromotingID() { return chromoting_id_; } |
| 104 | 115 |
| 105 // Helper to retrieve the current URL of the active tab in the browser. | 116 // Helper to retrieve the current URL of the active tab in the browser. |
| 106 GURL GetCurrentURL() { | 117 GURL GetCurrentURL() { |
| 107 return browser()->tab_strip_model()->GetActiveWebContents()->GetURL(); | 118 return browser()->tab_strip_model()->GetActiveWebContents()->GetURL(); |
| 108 } | 119 } |
| 109 | 120 |
| 121 // Helper to execute a javascript code snippet on the current page. | |
| 122 void ExecuteScript(const std::string& script) { | |
| 123 ASSERT_TRUE(content::ExecuteScript( | |
| 124 browser()->tab_strip_model()->GetActiveWebContents(), script)); | |
| 125 } | |
| 126 | |
| 127 // Helper to execute a javascript code snippet on the current page and | |
| 128 // wait for page load to complete. | |
| 129 void ExecuteScriptAndWait(const std::string& script) { | |
| 130 content::WindowedNotificationObserver observer( | |
| 131 content::NOTIFICATION_LOAD_STOP, | |
| 132 content::Source<content::NavigationController>( | |
| 133 &browser()->tab_strip_model()->GetActiveWebContents()-> | |
| 134 GetController())); | |
| 135 | |
| 136 ExecuteScript(script); | |
| 137 | |
| 138 observer.Wait(); | |
| 139 } | |
| 140 | |
| 141 // Helper to execute a javascript code snippet on the current page and | |
| 142 // extract the boolean result. | |
| 143 bool ExecuteScriptAndExtractBool(const std::string& script) { | |
| 144 bool result; | |
| 145 // Using a private assert function because ASSERT_TRUE can only be used in | |
| 146 // void returning functions. | |
| 147 _ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | |
| 148 browser()->tab_strip_model()->GetActiveWebContents(), | |
| 149 "window.domAutomationController.send(" + script + ");", | |
| 150 &result)); | |
| 151 | |
| 152 return result; | |
| 153 } | |
| 154 | |
| 155 // Helper to check whether a html element with the given name exists on | |
| 156 // the current page. | |
| 157 bool HtmlElementExists(const std::string& name) { | |
| 158 return ExecuteScriptAndExtractBool( | |
| 159 "document.getElementById(\"" + name + "\") != null"); | |
| 160 } | |
| 161 | |
| 162 // Helper to navigate to a given url. | |
| 163 void NavigateToURLAndWait(const GURL& url) { | |
| 164 content::WindowedNotificationObserver observer( | |
| 165 content::NOTIFICATION_LOAD_STOP, | |
| 166 content::Source<content::NavigationController>( | |
| 167 &browser()->tab_strip_model()->GetActiveWebContents()-> | |
| 168 GetController())); | |
| 169 | |
| 170 ui_test_utils::NavigateToURL(browser(), url); | |
| 171 observer.Wait(); | |
| 172 } | |
| 173 | |
| 110 // This test needs to make live DNS requests for access to | 174 // This test needs to make live DNS requests for access to |
| 111 // GAIA and sync server URLs under google.com. We use a scoped version | 175 // GAIA and sync server URLs under google.com. We use a scoped version |
| 112 // to override the default resolver while the test is active. | 176 // to override the default resolver while the test is active. |
| 113 scoped_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_override_; | 177 scoped_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_override_; |
| 114 | 178 |
| 115 bool no_cleanup_; | 179 bool no_cleanup_; |
| 116 bool no_install_; | 180 bool no_install_; |
| 117 std::string chromoting_id_; | 181 std::string chromoting_id_; |
| 118 base::FilePath webapp_crx_; | 182 base::FilePath webapp_crx_; |
| 183 std::string username_; | |
| 184 std::string password_; | |
| 119 }; | 185 }; |
| 120 | 186 |
| 121 void RemoteDesktopBrowserTest::ParseCommandLine() { | 187 void RemoteDesktopBrowserTest::ParseCommandLine() { |
| 122 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 188 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 123 | 189 |
| 124 // The test framework overrides any command line user-data-dir | 190 // The test framework overrides any command line user-data-dir |
| 125 // argument with a /tmp/.org.chromium.Chromium.XXXXXX directory. | 191 // argument with a /tmp/.org.chromium.Chromium.XXXXXX directory. |
| 126 // That happens in the ChromeTestLauncherDelegate, and affects | 192 // That happens in the ChromeTestLauncherDelegate, and affects |
| 127 // all unit tests (no opt out available). It intentionally erases | 193 // all unit tests (no opt out available). It intentionally erases |
| 128 // any --user-data-dir switch if present and appends a new one. | 194 // any --user-data-dir switch if present and appends a new one. |
| 129 // Re-override the default data dir if override-user-data-dir | 195 // Re-override the default data dir if override-user-data-dir |
| 130 // is specified. | 196 // is specified. |
| 131 if (command_line->HasSwitch(kOverrideUserDataDir)) { | 197 if (command_line->HasSwitch(kOverrideUserDataDir)) { |
| 132 const base::FilePath& override_user_data_dir = | 198 const base::FilePath& override_user_data_dir = |
| 133 command_line->GetSwitchValuePath(kOverrideUserDataDir); | 199 command_line->GetSwitchValuePath(kOverrideUserDataDir); |
| 134 | 200 |
| 135 ASSERT_FALSE(override_user_data_dir.empty()); | 201 ASSERT_FALSE(override_user_data_dir.empty()); |
| 136 | 202 |
| 137 command_line->AppendSwitchPath(switches::kUserDataDir, | 203 command_line->AppendSwitchPath(switches::kUserDataDir, |
| 138 override_user_data_dir); | 204 override_user_data_dir); |
| 139 } | 205 } |
| 140 | 206 |
| 207 username_ = command_line->GetSwitchValueNative(kUsername); | |
| 208 password_ = command_line->GetSwitchValueNative(kPassword); | |
| 209 | |
| 141 no_cleanup_ = command_line->HasSwitch(kNoCleanup); | 210 no_cleanup_ = command_line->HasSwitch(kNoCleanup); |
| 142 no_install_ = command_line->HasSwitch(kNoInstall); | 211 no_install_ = command_line->HasSwitch(kNoInstall); |
| 143 | 212 |
| 144 if (!no_install_) { | 213 if (!no_install_) { |
| 145 webapp_crx_ = command_line->GetSwitchValuePath(kWebAppCrx); | 214 webapp_crx_ = command_line->GetSwitchValuePath(kWebAppCrx); |
| 146 ASSERT_FALSE(webapp_crx_.empty()); | 215 ASSERT_FALSE(webapp_crx_.empty()); |
| 147 } | 216 } |
| 148 } | 217 } |
| 149 | 218 |
| 150 void RemoteDesktopBrowserTest::EnableDNSLookupForThisTest( | 219 void RemoteDesktopBrowserTest::EnableDNSLookupForThisTest( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 162 resolver->AllowDirectLookup("*.googleapis.com"); | 231 resolver->AllowDirectLookup("*.googleapis.com"); |
| 163 mock_host_resolver_override_.reset( | 232 mock_host_resolver_override_.reset( |
| 164 new net::ScopedDefaultHostResolverProc(resolver.get())); | 233 new net::ScopedDefaultHostResolverProc(resolver.get())); |
| 165 } | 234 } |
| 166 | 235 |
| 167 void RemoteDesktopBrowserTest::DisableDNSLookupForThisTest() { | 236 void RemoteDesktopBrowserTest::DisableDNSLookupForThisTest() { |
| 168 mock_host_resolver_override_.reset(); | 237 mock_host_resolver_override_.reset(); |
| 169 } | 238 } |
| 170 | 239 |
| 171 void RemoteDesktopBrowserTest::VerifyInternetAccess() { | 240 void RemoteDesktopBrowserTest::VerifyInternetAccess() { |
| 172 content::WindowedNotificationObserver observer( | |
| 173 content::NOTIFICATION_LOAD_STOP, | |
| 174 content::Source<content::NavigationController>( | |
| 175 &browser()->tab_strip_model()->GetActiveWebContents()-> | |
| 176 GetController())); | |
| 177 | |
| 178 GURL google_url("http://www.google.com"); | 241 GURL google_url("http://www.google.com"); |
| 179 ui_test_utils::NavigateToURL(browser(), google_url); | 242 NavigateToURLAndWait(google_url); |
| 180 observer.Wait(); | |
| 181 | 243 |
| 182 EXPECT_EQ(GetCurrentURL().host(), "www.google.com"); | 244 EXPECT_EQ(GetCurrentURL().host(), "www.google.com"); |
| 183 } | 245 } |
| 184 | 246 |
| 185 void RemoteDesktopBrowserTest::InstallChromotingApp() { | 247 void RemoteDesktopBrowserTest::InstallChromotingApp() { |
| 186 base::FilePath install_dir(WebAppCrxPath()); | 248 base::FilePath install_dir(WebAppCrxPath()); |
| 187 scoped_refptr<const Extension> extension(InstallExtensionWithUIAutoConfirm( | 249 scoped_refptr<const Extension> extension(InstallExtensionWithUIAutoConfirm( |
| 188 install_dir, 1, browser())); | 250 install_dir, 1, browser())); |
| 189 | 251 |
| 190 EXPECT_FALSE(extension.get() == NULL); | 252 EXPECT_FALSE(extension.get() == NULL); |
| 191 } | 253 } |
| 192 | 254 |
| 193 void RemoteDesktopBrowserTest::UninstallChromotingApp() { | 255 void RemoteDesktopBrowserTest::UninstallChromotingApp() { |
| 194 UninstallExtension(ChromotingID()); | 256 UninstallExtension(ChromotingID()); |
| 195 chromoting_id_.clear(); | 257 chromoting_id_.clear(); |
| 196 } | 258 } |
| 197 | 259 |
| 198 void RemoteDesktopBrowserTest::LaunchChromotingApp() { | 260 void RemoteDesktopBrowserTest::LaunchChromotingApp() { |
| 199 ASSERT_FALSE(ChromotingID().empty()); | 261 ASSERT_FALSE(ChromotingID().empty()); |
| 262 | |
| 200 std::string url = "chrome-extension://" + ChromotingID() + "/main.html"; | 263 std::string url = "chrome-extension://" + ChromotingID() + "/main.html"; |
| 201 const GURL chromoting_main(url); | 264 const GURL chromoting_main(url); |
| 202 | 265 NavigateToURLAndWait(chromoting_main); |
| 203 content::WindowedNotificationObserver observer( | |
| 204 content::NOTIFICATION_LOAD_STOP, | |
| 205 content::Source<content::NavigationController>( | |
| 206 &browser()->tab_strip_model()->GetActiveWebContents()-> | |
| 207 GetController())); | |
| 208 | |
| 209 ui_test_utils::NavigateToURL(browser(), chromoting_main); | |
| 210 observer.Wait(); | |
| 211 | 266 |
| 212 EXPECT_EQ(GetCurrentURL(), chromoting_main); | 267 EXPECT_EQ(GetCurrentURL(), chromoting_main); |
| 213 } | 268 } |
| 214 | 269 |
| 215 void RemoteDesktopBrowserTest::VerifyChromotingLoaded(bool expected) { | 270 void RemoteDesktopBrowserTest::VerifyChromotingLoaded(bool expected) { |
| 216 const ExtensionSet* extensions = extension_service()->extensions(); | 271 const ExtensionSet* extensions = extension_service()->extensions(); |
| 217 scoped_refptr<const extensions::Extension> extension; | 272 scoped_refptr<const extensions::Extension> extension; |
| 218 ExtensionSet::const_iterator iter; | 273 ExtensionSet::const_iterator iter; |
| 219 bool installed = false; | 274 bool installed = false; |
| 220 | 275 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 242 } | 297 } |
| 243 | 298 |
| 244 void RemoteDesktopBrowserTest::Authorize() { | 299 void RemoteDesktopBrowserTest::Authorize() { |
| 245 // The chromoting extension should be installed. | 300 // The chromoting extension should be installed. |
| 246 ASSERT_FALSE(ChromotingID().empty()); | 301 ASSERT_FALSE(ChromotingID().empty()); |
| 247 | 302 |
| 248 // The chromoting main page should be loaded in the current tab | 303 // The chromoting main page should be loaded in the current tab |
| 249 // and isAuthenticated() should be false (auth dialog visible). | 304 // and isAuthenticated() should be false (auth dialog visible). |
| 250 std::string url = "chrome-extension://" + ChromotingID() + "/main.html"; | 305 std::string url = "chrome-extension://" + ChromotingID() + "/main.html"; |
| 251 ASSERT_EQ(GetCurrentURL().spec(), url); | 306 ASSERT_EQ(GetCurrentURL().spec(), url); |
| 307 ASSERT_FALSE(ExecuteScriptAndExtractBool( | |
| 308 "remoting.OAuth2.prototype.isAuthenticated()")); | |
| 252 | 309 |
| 253 bool result; | 310 ExecuteScriptAndWait("remoting.OAuth2.prototype.doAuthRedirect();"); |
| 254 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | |
| 255 browser()->tab_strip_model()->GetActiveWebContents(), | |
| 256 "window.domAutomationController.send(" | |
| 257 "remoting.OAuth2.prototype.isAuthenticated());", | |
| 258 &result)); | |
| 259 EXPECT_FALSE(result); | |
| 260 | |
| 261 content::WindowedNotificationObserver observer( | |
| 262 content::NOTIFICATION_LOAD_STOP, | |
| 263 content::Source<content::NavigationController>( | |
| 264 &browser()->tab_strip_model()->GetActiveWebContents()-> | |
| 265 GetController())); | |
| 266 | |
| 267 ASSERT_TRUE(content::ExecuteScript( | |
| 268 browser()->tab_strip_model()->GetActiveWebContents(), | |
| 269 "remoting.OAuth2.prototype.doAuthRedirect()")); | |
| 270 observer.Wait(); | |
| 271 | 311 |
| 272 // Verify the active tab is at the "Google Accounts" login page. | 312 // Verify the active tab is at the "Google Accounts" login page. |
| 273 EXPECT_EQ(GetCurrentURL().host(), "accounts.google.com"); | 313 EXPECT_EQ(GetCurrentURL().host(), "accounts.google.com"); |
| 314 EXPECT_TRUE(HtmlElementExists("Email")); | |
| 315 EXPECT_TRUE(HtmlElementExists("Passwd")); | |
| 316 } | |
| 274 | 317 |
| 275 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 318 void RemoteDesktopBrowserTest::Authenticate() { |
| 276 browser()->tab_strip_model()->GetActiveWebContents(), | 319 // The chromoting extension should be installed. |
| 277 "window.domAutomationController.send(" | 320 ASSERT_FALSE(ChromotingID().empty()); |
| 278 "document.getElementById(\"Email\") != null);", | |
| 279 &result)); | |
| 280 EXPECT_TRUE(result); | |
| 281 | 321 |
| 282 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 322 // The active tab should have the "Google Accounts" login page loaded. |
| 283 browser()->tab_strip_model()->GetActiveWebContents(), | 323 ASSERT_EQ(GetCurrentURL().host(), "accounts.google.com"); |
| 284 "window.domAutomationController.send(" | 324 ASSERT_TRUE(HtmlElementExists("Email")); |
| 285 "document.getElementById(\"Passwd\") != null);", | 325 ASSERT_TRUE(HtmlElementExists("Passwd")); |
| 286 &result)); | 326 |
| 287 EXPECT_TRUE(result); | 327 // Now log in using the username and password passed in from the command line. |
| 328 ExecuteScriptAndWait( | |
| 329 "document.getElementById(\"Email\").value = \"" + username_ + "\";" + | |
| 330 "document.getElementById(\"Passwd\").value = \"" + password_ +"\";" + | |
| 331 "document.forms[\"gaia_loginform\"].submit();"); | |
| 332 | |
| 333 EXPECT_EQ(GetCurrentURL().host(), "accounts.google.com"); | |
| 334 | |
| 335 // Is there a better way to verify we are on the "Request for Permission" | |
|
garykac
2013/08/09 17:29:05
This sounds like it should have a TODO at the star
| |
| 336 // page? | |
| 337 EXPECT_TRUE(HtmlElementExists("submit_approve_access")); | |
| 288 } | 338 } |
| 289 | 339 |
| 290 IN_PROC_BROWSER_TEST_F(RemoteDesktopBrowserTest, MANUAL_Launch) { | 340 IN_PROC_BROWSER_TEST_F(RemoteDesktopBrowserTest, MANUAL_Launch) { |
| 291 VerifyInternetAccess(); | 341 VerifyInternetAccess(); |
| 292 | 342 |
| 293 if (!NoInstall()) { | 343 if (!NoInstall()) { |
| 294 VerifyChromotingLoaded(false); | 344 VerifyChromotingLoaded(false); |
| 295 InstallChromotingApp(); | 345 InstallChromotingApp(); |
| 296 } | 346 } |
| 297 | 347 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 318 VerifyChromotingLoaded(false); | 368 VerifyChromotingLoaded(false); |
| 319 InstallChromotingApp(); | 369 InstallChromotingApp(); |
| 320 } | 370 } |
| 321 | 371 |
| 322 VerifyChromotingLoaded(true); | 372 VerifyChromotingLoaded(true); |
| 323 | 373 |
| 324 LaunchChromotingApp(); | 374 LaunchChromotingApp(); |
| 325 | 375 |
| 326 Authorize(); | 376 Authorize(); |
| 327 | 377 |
| 378 Authenticate(); | |
| 379 | |
| 328 if (!NoCleanup()) { | 380 if (!NoCleanup()) { |
| 329 UninstallChromotingApp(); | 381 UninstallChromotingApp(); |
| 330 VerifyChromotingLoaded(false); | 382 VerifyChromotingLoaded(false); |
| 331 } | 383 } |
| 332 } | 384 } |
| 333 | 385 |
| 334 } // namespace remoting | 386 } // namespace remoting |
| OLD | NEW |