1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/utf_string_conversions.h" 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/browser_process.h" 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/browser_signin.h" 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_browsertest.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_test_message_listener.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_webstore_private_api.h" 12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/net/gaia/token_service.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/sync/profile_sync_service.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser.h" 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_switches.h" 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/net/gaia/gaia_constants.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/url_constants.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/ui_test_utils.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "googleurl/src/gurl.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/base/mock_host_resolver.h" 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing chrome::kHttpScheme; 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing chrome::kStandardSchemeSeparator; 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kTestUrlHostname[] = "www.example.com"; 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A fake version of ProfileSyncService used for testing. 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass FakeProfileSyncService : public ProfileSyncService { 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FakeProfileSyncService() 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : ProfileSyncService(NULL, NULL, ""), 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setup_(false) { 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~FakeProfileSyncService() {} 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Overrides of virtual methods in ProfileSyncService. 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool HasSyncSetupCompleted() const { 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return setup_; 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void ChangePreferredDataTypes(const syncable::ModelTypeSet& types) { 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch types_ = types; 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void GetPreferredDataTypes(syncable::ModelTypeSet* types) const { 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *types = types_; 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void SetSyncSetupCompleted() { 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch setup_ = true; 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool setup_; 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch syncable::ModelTypeSet types_; 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass FakeBrowserSignin : public BrowserSignin { 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The |username_after_login| parameter determines what this fake 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // BrowserSignin will set the username to when ShowLoginDialog is called. 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FakeBrowserSignin(bool should_succeed, 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& initial_username, 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& username_after_login) 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : BrowserSignin(NULL), 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch should_succeed_(should_succeed), 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch username_(initial_username), 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch username_after_login_(username_after_login) { 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~FakeBrowserSignin() {} 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual std::string GetSignedInUsername() const { 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return username_; 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void RequestSignin(TabContents* tab_contents, 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const string16& preferred_email, 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const string16& message, 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SigninDelegate* delegate) { 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (should_succeed_) { 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Simulate valid login. 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch username_ = username_after_login_; 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate->OnLoginSuccess(); 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Fake a token available notification. 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile = tab_contents->profile(); 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (profile->IsOffTheRecord()) { 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch profile = g_browser_process->profile_manager()->GetDefaultProfile(); 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TokenService* token_service = profile->GetTokenService(); 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch token_service->IssueAuthTokenForTest(GaiaConstants::kGaiaService, 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "new_token"); 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } else { 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delegate->OnLoginFailure(GoogleServiceAuthError( 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GoogleServiceAuthError::REQUEST_CANCELED)); 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool should_succeed_; 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string username_; 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string username_after_login_; 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExtensionWebstorePrivateBrowserTest : public ExtensionBrowserTest { 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionWebstorePrivateBrowserTest() { 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick test_url_base_ = std::string() + kHttpScheme + kStandardSchemeSeparator + 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kTestUrlHostname; 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SetUpCommandLine(CommandLine* command_line) { 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionBrowserTest::SetUpCommandLine(command_line); 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick command_line->AppendSwitchASCII(switches::kAppsGalleryURL, test_url_base_); 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This generates a regular test server url pointing to a test file at 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // |relative_path|, but replaces the hostname with kTestUrlHostname so that 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // we get the webstore private APIs injected (this happens because of the 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // command line switch we added in SetupCommandLine). 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL GetUrl(const std::string& relative_path) { 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL base_url = test_server()->GetURL( 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "files/extensions/webstore_private/" + relative_path); 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL::Replacements replacements; 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string replacement_host = std::string(kTestUrlHostname); 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick replacements.SetHostStr(replacement_host); 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return base_url.ReplaceComponents(replacements); 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void RunLoginTestImpl(bool incognito, 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& relative_path, 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& initial_login, 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool login_succeeds, 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& login_result) { 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Clear the token service so previous tests don't affect things. 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TokenService* token_service = browser()->profile()->GetTokenService(); 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch token_service->ResetCredentialsInMemory(); 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!initial_login.empty()) { 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Initialize the token service with an existing token. 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch token_service->IssueAuthTokenForTest(GaiaConstants::kGaiaService, 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "existing_token"); 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FakeProfileSyncService sync_service; 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FakeBrowserSignin signin(login_succeeds, initial_login, login_result); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebstorePrivateApi::SetTestingProfileSyncService(&sync_service); 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WebstorePrivateApi::SetTestingBrowserSignin(&signin); 151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener("success", false); 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GURL url = GetUrl(relative_path); 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (incognito) { 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ui_test_utils::OpenURLOffTheRecord(browser()->profile(), url); 156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } else { 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ui_test_utils::NavigateToURL(browser(), url); 158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(listener.WaitUntilSatisfied()); 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WebstorePrivateApi::SetTestingBrowserSignin(NULL); 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebstorePrivateApi::SetTestingProfileSyncService(NULL); 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void RunLoginTest(const std::string& relative_path, 166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& initial_login, 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool login_succeeds, 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& login_result) { 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTestImpl(true, 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch relative_path, 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch initial_login, 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_succeeds, 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_result); 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTestImpl(false, 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch relative_path, 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch initial_login, 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_succeeds, 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch login_result); 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string test_url_base_; 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 185731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateBrowserTest, BrowserLogin) { 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_resolver()->AddRule(kTestUrlHostname, "127.0.0.1"); 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(test_server()->Start()); 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTest("browser_login/expect_nonempty.html", 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "foo@bar.com", false, ""); 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTest("browser_login/prompt_no_preferred.html", "", true, ""); 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTest("browser_login/prompt_preferred.html", "", true, "foo@bar.com"); 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RunLoginTest("browser_login/prompt_login_fails.html", 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch "", false, "foo@bar.com"); 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 199