extension_webstore_private_browsertest.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 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"
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_switches.h"
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/net/gaia/gaia_constants.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/url_constants.h"
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/ui_test_utils.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "googleurl/src/gurl.h"
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/base/mock_host_resolver.h"
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing chrome::kHttpScheme;
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing chrome::kStandardSchemeSeparator;
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char kTestUrlHostname[] = "www.example.com";
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// A fake version of ProfileSyncService used for testing.
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass FakeProfileSyncService : public ProfileSyncService {
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  FakeProfileSyncService()
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : setup_(false) {
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual ~FakeProfileSyncService() {}
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Overrides of virtual methods in ProfileSyncService.
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool HasSyncSetupCompleted() const {
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return setup_;
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ChangePreferredDataTypes(const syncable::ModelTypeSet& types) {
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    types_ = types;
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void GetPreferredDataTypes(syncable::ModelTypeSet* types) const {
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *types = types_;
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void SetSyncSetupCompleted() {
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    setup_ = true;
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool setup_;
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  syncable::ModelTypeSet types_;
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass FakeBrowserSignin : public BrowserSignin {
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The |username_after_login| parameter determines what this fake
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // BrowserSignin will set the username to when ShowLoginDialog is called.
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  FakeBrowserSignin(bool should_succeed,
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    const std::string& initial_username,
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    const std::string& username_after_login)
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : BrowserSignin(NULL),
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        should_succeed_(should_succeed),
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        username_(initial_username),
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        username_after_login_(username_after_login) {
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual ~FakeBrowserSignin() {}
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual std::string GetSignedInUsername() const {
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return username_;
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RequestSignin(TabContents* tab_contents,
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             const string16& preferred_email,
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             const string16& message,
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             SigninDelegate* delegate) {
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (should_succeed_) {
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Simulate valid login.
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      username_ = username_after_login_;
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      delegate->OnLoginSuccess();
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Fake a token available notification.
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      Profile* profile = tab_contents->profile();
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (profile->IsOffTheRecord()) {
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        profile = g_browser_process->profile_manager()->GetDefaultProfile();
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      TokenService* token_service = profile->GetTokenService();
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      token_service->IssueAuthTokenForTest(GaiaConstants::kGaiaService,
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                           "new_token");
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      delegate->OnLoginFailure(GoogleServiceAuthError(
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        GoogleServiceAuthError::REQUEST_CANCELED));
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool should_succeed_;
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string username_;
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string username_after_login_;
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExtensionWebstorePrivateBrowserTest : public ExtensionBrowserTest {
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ExtensionWebstorePrivateBrowserTest() {
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    test_url_base_ = std::string() + kHttpScheme + kStandardSchemeSeparator +
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                     kTestUrlHostname;
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetUpCommandLine(CommandLine* command_line) {
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ExtensionBrowserTest::SetUpCommandLine(command_line);
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    command_line->AppendSwitchASCII(switches::kAppsGalleryURL, test_url_base_);
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This generates a regular test server url pointing to a test file at
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |relative_path|, but replaces the hostname with kTestUrlHostname so that
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // we get the webstore private APIs injected (this happens because of the
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // command line switch we added in SetupCommandLine).
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GURL GetUrl(const std::string& relative_path) {
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GURL base_url = test_server()->GetURL(
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        "files/extensions/webstore_private/" + relative_path);
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GURL::Replacements replacements;
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::string replacement_host = std::string(kTestUrlHostname);
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    replacements.SetHostStr(replacement_host);
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base_url.ReplaceComponents(replacements);
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RunLoginTestImpl(bool incognito,
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const std::string& relative_path,
133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const std::string& initial_login,
134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        bool login_succeeds,
135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const std::string& login_result) {
136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Clear the token service so previous tests don't affect things.
137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TokenService* token_service = browser()->profile()->GetTokenService();
138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    token_service->ResetCredentialsInMemory();
139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!initial_login.empty()) {
140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Initialize the token service with an existing token.
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      token_service->IssueAuthTokenForTest(GaiaConstants::kGaiaService,
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                           "existing_token");
143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FakeProfileSyncService sync_service;
146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FakeBrowserSignin signin(login_succeeds, initial_login, login_result);
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebstorePrivateApi::SetTestingProfileSyncService(&sync_service);
148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    WebstorePrivateApi::SetTestingBrowserSignin(&signin);
149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ExtensionTestMessageListener listener("success", false);
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GURL url = GetUrl(relative_path);
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (incognito) {
153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ui_test_utils::OpenURLOffTheRecord(browser()->profile(), url);
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      ui_test_utils::NavigateToURL(browser(), url);
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_TRUE(listener.WaitUntilSatisfied());
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    WebstorePrivateApi::SetTestingBrowserSignin(NULL);
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebstorePrivateApi::SetTestingProfileSyncService(NULL);
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RunLoginTest(const std::string& relative_path,
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    const std::string& initial_login,
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    bool login_succeeds,
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    const std::string& login_result) {
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RunLoginTestImpl(true,
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     relative_path,
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     initial_login,
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     login_succeeds,
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     login_result);
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RunLoginTestImpl(false,
173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     relative_path,
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     initial_login,
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     login_succeeds,
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                     login_result);
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string test_url_base_;
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
183731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateBrowserTest, BrowserLogin) {
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_resolver()->AddRule(kTestUrlHostname, "127.0.0.1");
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_TRUE(test_server()->Start());
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RunLoginTest("browser_login/expect_nonempty.html",
188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch               "foo@bar.com", false, "");
189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RunLoginTest("browser_login/prompt_no_preferred.html", "", true, "");
191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RunLoginTest("browser_login/prompt_preferred.html", "", true, "foo@bar.com");
193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RunLoginTest("browser_login/prompt_login_fails.html",
195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch               "", false, "foo@bar.com");
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
197