identity_apitest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/string_util.h"
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/stringprintf.h"
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/values.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/extensions/api/identity/identity_api.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/extensions/api/identity/web_auth_flow.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/extensions/extension_apitest.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/extensions/extension_browsertest.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/extensions/extension_function_test_utils.h"
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/ui/browser.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/ui/browser_window.h"
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/browser/ui/webui/signin/login_ui_service.h"
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/common/chrome_switches.h"
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/common/chrome_notification_types.h"
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h"
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "chrome/test/base/in_process_browser_test.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "content/public/browser/notification_service.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "content/public/browser/notification_source.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "content/public/test/test_utils.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "google_apis/gaia/google_service_auth_error.h"
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "google_apis/gaia/oauth2_mint_token_flow.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "googleurl/src/gurl.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "testing/gmock/include/gmock/gmock.h"
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "testing/gtest/include/gtest/gtest.h"
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing testing::_;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing testing::Return;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing testing::ReturnRef;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace extensions {
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace errors = identity_constants;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace utils = extension_function_test_utils;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const char kAccessToken[] = "auth_token";
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass TestLoginUI : public LoginUIService::LoginUI {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public:
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void FocusUI() OVERRIDE {}
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void CloseUI() OVERRIDE {}
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass TestOAuth2MintTokenFlow : public OAuth2MintTokenFlow {
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public:
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  enum ResultType {
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ISSUE_ADVICE_SUCCESS,
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    MINT_TOKEN_SUCCESS,
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    MINT_TOKEN_FAILURE
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow(ResultType result,
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          OAuth2MintTokenFlow::Delegate* delegate)
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    : OAuth2MintTokenFlow(NULL, delegate, OAuth2MintTokenFlow::Parameters()),
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      result_(result),
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      delegate_(delegate) {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void Start() OVERRIDE {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (result_) {
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      case ISSUE_ADVICE_SUCCESS: {
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        IssueAdviceInfo info;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delegate_->OnIssueAdviceSuccess(info);
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        break;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      case MINT_TOKEN_SUCCESS: {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delegate_->OnMintTokenSuccess(kAccessToken);
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        break;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      case MINT_TOKEN_FAILURE: {
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GoogleServiceAuthError error(
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delegate_->OnMintTokenFailure(error);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        break;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov private:
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ResultType result_;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  OAuth2MintTokenFlow::Delegate* delegate_;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public:
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  MockGetAuthTokenFunction() : install_ui_result_(false),
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               login_ui_shown_(false),
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               install_ui_shown_(false) {
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void set_install_ui_result(bool result) {
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    install_ui_result_ = result;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool login_ui_shown() const {
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return login_ui_shown_;
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool install_ui_shown() const {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return install_ui_shown_;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void StartObservingLoginService() OVERRIDE {
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Do nothing in tests.
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void StopObservingLoginService() OVERRIDE {
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Do nothing in tests.
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void ShowLoginPopup() OVERRIDE {
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    login_ui_shown_ = true;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Explicitly call OnLoginUIClosed.
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TestLoginUI login_ui;;
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OnLoginUIClosed(&login_ui);
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void ShowOAuthApprovalDialog(
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const IssueAdviceInfo& issue_advice) OVERRIDE {
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    install_ui_shown_ = true;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    install_ui_->record_oauth2_grant_ = true;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Call InstallUIProceed or InstallUIAbort based on the flag.
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (install_ui_result_)
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      InstallUIProceed();
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      InstallUIAbort(true);
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  MOCK_CONST_METHOD0(HasLoginToken, bool ());
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  MOCK_METHOD1(CreateMintTokenFlow,
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               OAuth2MintTokenFlow* (OAuth2MintTokenFlow::Mode mode));
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov private:
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ~MockGetAuthTokenFunction() {}
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool install_ui_result_;
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool login_ui_shown_;
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool install_ui_shown_;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass GetAuthTokenFunctionTest : public ExtensionBrowserTest {
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov protected:
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  enum OAuth2Fields {
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    NONE = 0,
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CLIENT_ID = 1,
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SCOPES = 2
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual ~GetAuthTokenFunctionTest() {}
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // Helper to create an extension with specific OAuth2Info fields set.
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // |fields_to_set| should be computed by using fields of Oauth2Fields enum.
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const Extension* CreateExtension(int fields_to_set) {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const Extension* ext = LoadExtension(
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        test_data_dir_.AppendASCII("platform_apps/oauth2"));
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OAuth2Info& oauth2_info = const_cast<OAuth2Info&>(
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        OAuth2Info::GetOAuth2Info(ext));
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((fields_to_set & CLIENT_ID) != 0)
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      oauth2_info.client_id = "client1";
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((fields_to_set & SCOPES) != 0) {
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      oauth2_info.scopes.push_back("scope1");
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      oauth2_info.scopes.push_back("scope2");
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ext;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       NoClientId) {
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(SCOPES));
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{}]", browser());
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kInvalidClientId), error);
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       NoScopes) {
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID));
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{}]", browser());
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kInvalidScopes), error);
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       NonInteractiveNotSignedIn) {
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false));
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{}]", browser());
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       NonInteractiveMintFailure) {
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{}]", browser());
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       NonInteractiveSuccess) {
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{}]", browser()));
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string access_token;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(value->GetAsString(&access_token));
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(kAccessToken), access_token);
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginCanceled) {
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken()).WillRepeatedly(Return(false));
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser());
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kUserNotSignedIn), error);
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginSuccessMintFailure) {
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(false))
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser());
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginSuccessMintSuccess) {
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(false))
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser()));
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string access_token;
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(value->GetAsString(&access_token));
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(kAccessToken), access_token);
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->install_ui_shown());
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginSuccessApprovalAborted) {
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(false))
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_install_ui_result(false);
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser());
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kUserRejected), error);
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->install_ui_shown());
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginSuccessApprovalDoneMintFailure) {
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(false))
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get());
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow1))
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow2));
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_install_ui_result(true);
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser());
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false));
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->install_ui_shown());
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveLoginSuccessApprovalDoneMintSuccess) {
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(false))
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow1))
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow2));
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_install_ui_result(true);
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser()));
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string access_token;
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(value->GetAsString(&access_token));
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(kAccessToken), access_token);
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->login_ui_shown());
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->install_ui_shown());
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveApprovalAborted) {
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow(
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow));
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_install_ui_result(false);
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string error = utils::RunFunctionAndReturnError(
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser());
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(errors::kUserRejected), error);
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->install_ui_shown());
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest,
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       InteractiveApprovalDoneMintSuccess) {
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction());
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), HasLoginToken())
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true))
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(true));
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow(
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get());
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow(
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get());
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_CALL(*func.get(), CreateMintTokenFlow(_))
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow1))
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      .WillOnce(Return(flow2));
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  func->set_install_ui_result(true);
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      func.get(), "[{\"interactive\": true}]", browser()));
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  std::string access_token;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(value->GetAsString(&access_token));
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_EQ(std::string(kAccessToken), access_token);
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_FALSE(func->login_ui_shown());
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EXPECT_TRUE(func->install_ui_shown());
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass LaunchWebAuthFlowFunctionTest : public ExtensionBrowserTest {
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov protected:
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void RunAndCheckBounds(
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const std::string& extra_params,
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int expected_x,
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int expected_y,
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int expected_width,
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      int expected_height) {
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    content::WindowedNotificationObserver observer(
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        chrome::NOTIFICATION_BROWSER_WINDOW_READY,
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        content::NotificationService::AllSources());
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   scoped_refptr<IdentityLaunchWebAuthFlowFunction> function(
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      new IdentityLaunchWebAuthFlowFunction());
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    scoped_refptr<Extension> empty_extension(
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        utils::CreateEmptyExtension());
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    function->set_extension(empty_extension.get());
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    std::string args = base::StringPrintf(
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        "[{\"interactive\": true, \"url\": \"data:text/html,auth\"%s%s}]",
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        extra_params.length() ? "," : "",
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        extra_params.c_str());
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    scoped_ptr<base::ListValue> parsed_args(utils::ParseList(args));
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EXPECT_TRUE(parsed_args.get()) <<
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          "Could not parse extension function arguments: " << args;
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    function->SetArgs(parsed_args.get());
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    function->set_profile(browser()->profile());
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // We don't use util::RunFunction because that waits until the function
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // responds, but we want to check the size of the created browser as soon as
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // it's created, even though there's no actual redirect to an auth URL.
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    function->Run();
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    observer.Wait();
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Browser* web_auth_flow_browser =
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        content::Source<Browser>(observer.source()).ptr();
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EXPECT_EQ(expected_x, web_auth_flow_browser->override_bounds().x());
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EXPECT_EQ(expected_y, web_auth_flow_browser->override_bounds().y());
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EXPECT_EQ(expected_width, web_auth_flow_browser->override_bounds().width());
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EXPECT_EQ(
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        expected_height, web_auth_flow_browser->override_bounds().height());
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    web_auth_flow_browser->window()->Close();
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, Bounds) {
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  RunAndCheckBounds("", 0, 0, 0, 0);
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  RunAndCheckBounds("\"width\": 100, \"height\": 200", 0, 0, 100, 200);
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  RunAndCheckBounds("\"left\": 100, \"top\": 200", 100, 200, 0, 0);
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  RunAndCheckBounds(
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      "\"left\": 100, \"top\": 200, \"width\": 300, \"height\": 400",
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      100, 200, 300, 400);
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace extensions
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov