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