identity_apitest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/identity_api.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/web_auth_flow.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/oauth2_mint_token_flow.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace errors = identity_constants; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace utils = extension_function_test_utils; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAccessToken[] = "auth_token"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLoginUI : public LoginUIService::LoginUI { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FocusUI() OVERRIDE {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseUI() OVERRIDE {} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResultType { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISSUE_ADVICE_SUCCESS, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MINT_TOKEN_SUCCESS, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MINT_TOKEN_FAILURE 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow(ResultType result, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OAuth2MintTokenFlow(NULL, delegate, OAuth2MintTokenFlow::Parameters()), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(result), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result_) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ISSUE_ADVICE_SUCCESS: { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueAdviceInfo info; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnIssueAdviceSuccess(info); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_SUCCESS: { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMintTokenSuccess(kAccessToken); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_FAILURE: { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultType result_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGetAuthTokenFunction() : install_ui_result_(false), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_(false), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_ui_shown_(false) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_install_ui_result(bool result) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_ui_result_ = result; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown() const { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return login_ui_shown_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool install_ui_shown() const { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return install_ui_shown_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StartObservingLoginService() OVERRIDE { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing in tests. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StopObservingLoginService() OVERRIDE { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing in tests. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_ = true; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Explicitly call OnLoginUIClosed. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLoginUI login_ui;; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLoginUIClosed(&login_ui); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowOAuthApprovalDialog( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_ui_shown_ = true; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_ui_->record_oauth2_grant_ = true; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call InstallUIProceed or InstallUIAbort based on the flag. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (install_ui_result_) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIProceed(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIAbort(true); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(HasLoginToken, bool ()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(CreateMintTokenFlow, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow* (OAuth2MintTokenFlow::Mode mode)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockGetAuthTokenFunction() {} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool install_ui_result_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool install_ui_shown_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetAuthTokenFunctionTest : public ExtensionBrowserTest { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OAuth2Fields { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE = 0, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLIENT_ID = 1, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPES = 2 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GetAuthTokenFunctionTest() {} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to create an extension with specific OAuth2Info fields set. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fields_to_set| should be computed by using fields of Oauth2Fields enum. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* CreateExtension(int fields_to_set) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* ext = LoadExtension( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("platform_apps/oauth2")); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuth2Info& oauth2_info = const_cast<OAuth2Info&>( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuth2Info::GetOAuth2Info(ext)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & CLIENT_ID) != 0) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.client_id = "client1"; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & SCOPES) != 0) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope1"); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope2"); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ext; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoClientId) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(SCOPES)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidClientId), error); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoScopes) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidScopes), error); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveNotSignedIn) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveMintFailure) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveSuccess) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser())); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginCanceled) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillRepeatedly(Return(false)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessMintFailure) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(false)) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessMintSuccess) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(false)) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->install_ui_shown()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalAborted) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(false)) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_install_ui_result(false); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->install_ui_shown()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalDoneMintFailure) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(false)) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow1)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow2)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_install_ui_result(true); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->install_ui_shown()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalDoneMintSuccess) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(false)) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow1)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow2)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_install_ui_result(true); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->install_ui_shown()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveApprovalAborted) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_install_ui_result(false); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->install_ui_shown()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveApprovalDoneMintSuccess) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow2 = new TestOAuth2MintTokenFlow( 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow1)) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(flow2)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_install_ui_result(true); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->install_ui_shown()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LaunchWebAuthFlowFunctionTest : public ExtensionBrowserTest { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunAndCheckBounds( 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extra_params, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_x, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_y, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_width, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_height) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_WINDOW_READY, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utils::CreateEmptyExtension()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_extension(empty_extension.get()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string args = base::StringPrintf( 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[{\"interactive\": true, \"url\": \"data:text/html,auth\"%s%s}]", 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params.length() ? "," : "", 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params.c_str()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> parsed_args(utils::ParseList(args)); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parsed_args.get()) << 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Could not parse extension function arguments: " << args; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->SetArgs(parsed_args.get()); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->set_profile(browser()->profile()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't use util::RunFunction because that waits until the function 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // responds, but we want to check the size of the created browser as soon as 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's created, even though there's no actual redirect to an auth URL. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function->Run(); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* web_auth_flow_browser = 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(observer.source()).ptr(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_x, web_auth_flow_browser->override_bounds().x()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_y, web_auth_flow_browser->override_bounds().y()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_width, web_auth_flow_browser->override_bounds().width()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_height, web_auth_flow_browser->override_bounds().height()); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_auth_flow_browser->window()->Close(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, Bounds) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAndCheckBounds("", 0, 0, 0, 0); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAndCheckBounds("\"width\": 100, \"height\": 200", 0, 0, 100, 200); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAndCheckBounds("\"left\": 100, \"top\": 200", 100, 200, 0, 0); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAndCheckBounds( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"left\": 100, \"top\": 200, \"width\": 300, \"height\": 400", 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100, 200, 300, 400); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 457