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