identity_apitest.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h" 65e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/identity_api.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/id_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/oauth2_mint_token_flow.h" 28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "grit/browser_resources.h" 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace errors = identity_constants; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace utils = extension_function_test_utils; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAccessToken[] = "auth_token"; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const char kExtensionId[] = "ext_id"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This helps us be able to wait until an AsyncExtensionFunction calls 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// SendResponse. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SendResponseDelegate 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public UIThreadExtensionFunction::DelegateForTests { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendResponseDelegate() : should_post_quit_(false) {} 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SendResponseDelegate() {} 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_should_post_quit(bool should_quit) { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) should_post_quit_ = should_quit; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasResponse() { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return response_.get() != NULL; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetResponse() { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(HasResponse()); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *response_.get(); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSendResponse(UIThreadExtensionFunction* function, 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool bad_message) OVERRIDE { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(bad_message); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(HasResponse()); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_.reset(new bool); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *response_ = success; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (should_post_quit_) { 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<bool> response_; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_post_quit_; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AsyncExtensionBrowserTest : public ExtensionBrowserTest { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Asynchronous function runner allows tests to manipulate the browser window 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after the call happens. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunFunctionAsync( 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UIThreadExtensionFunction* function, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& args) { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_.reset(new SendResponseDelegate); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_test_delegate(response_delegate_.get()); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::ListValue> parsed_args(utils::ParseList(args)); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(parsed_args.get()) << 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Could not parse extension function arguments: " << args; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->SetArgs(parsed_args.get()); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!function->GetExtension()) { 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_profile(browser()->profile()); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_has_callback(true); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->Run(); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string WaitForError(UIThreadExtensionFunction* function) { 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(function->GetResultList()) << "Did not expect a result"; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return function->GetError(); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Value* WaitForSingleResult(UIThreadExtensionFunction* function) { 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: " 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << function->GetError(); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value* single_result = NULL; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (function->GetResultList() != NULL && 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->GetResultList()->Get(0, &single_result)) { 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return single_result->DeepCopy(); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunMessageLoopUntilResponse() { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the RunImpl of |function| didn't already call SendResponse, run the 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // message loop until they do. 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!response_delegate_->HasResponse()) { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_->set_should_post_quit(true); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(response_delegate_->HasResponse()); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SendResponseDelegate> response_delegate_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResultType { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISSUE_ADVICE_SUCCESS, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MINT_TOKEN_SUCCESS, 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MINT_TOKEN_FAILURE, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MINT_TOKEN_BAD_CREDENTIALS 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow(ResultType result, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OAuth2MintTokenFlow(NULL, delegate, OAuth2MintTokenFlow::Parameters()), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(result), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result_) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ISSUE_ADVICE_SUCCESS: { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueAdviceInfo info; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnIssueAdviceSuccess(info); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_SUCCESS: { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenSuccess(kAccessToken, 3600); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_FAILURE: { 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenFailure(error); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case MINT_TOKEN_BAD_CREDENTIALS: { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultType result_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* IdentityAPITestFactory( 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserContext* profile) { 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new IdentityAPI(static_cast<Profile*>(profile)); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP event and 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// saves a pointer to the window embedding the WebContents, which can be later 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// closed. 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver { 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) explicit WaitForGURLAndCloseWindow(GURL url) 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : WindowedNotificationObserver( 202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NotificationService::AllSources()), 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url_(url) {} 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NotificationObserver: 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Observe(int type, 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationSource& source, 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NavigationController* web_auth_flow_controller = 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<content::NavigationController>(source).ptr(); 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WebContents* web_contents = 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_auth_flow_controller->GetWebContents(); 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (web_contents->GetURL() == url_) { 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // It is safe to keep the pointer here, because we know in a test, that 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the WebContents won't go away before CloseEmbedderWebContents is 2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // called. Don't copy this code to production. 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) embedder_web_contents_ = web_contents->GetEmbedderWebContents(); 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Condtionally invoke parent class so that Wait will not exit 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // until the target URL arrives. 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WindowedNotificationObserver::Observe(type, source, details); 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Closes the window embedding the WebContents. The action is separated from 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the Observe method to make sure the list of observers is not deleted, 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // while some event is already being processed. (That causes ASAN failures.) 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CloseEmbedderWebContents() { 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (embedder_web_contents_) 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) embedder_web_contents_->Close(); 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL url_; 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::WebContents* embedder_web_contents_; 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockGetAuthTokenFunction() : login_access_token_result_(true), 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_ui_result_(true), 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_(true), 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_(false), 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_(false) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_login_access_token_result(bool result) { 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_access_token_result_ = result; 2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_login_ui_result(bool result) { 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_ui_result_ = result; 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = failure; 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_oauth_error(const std::string& oauth_error) { 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_oauth_error_ = oauth_error; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown() const { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return login_ui_shown_; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown() const { 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return scope_ui_shown_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void StartLoginAccessTokenRequest() OVERRIDE { 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (login_access_token_result_) { 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenSuccess(login_token_request_.get(), "access_token", 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Time::Now() + base::TimeDelta::FromHours(1LL)); 2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError error( 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenFailure(login_token_request_.get(), error); 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(login_ui_shown_); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_ = true; 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (login_ui_result_) 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SigninSuccess(); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninFailed(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowOAuthApprovalDialog( 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_ = true; 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (scope_ui_result_) { 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowCompleted(kAccessToken, "3600"); 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, ""); 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_CONST_METHOD0(HasLoginToken, bool()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(CreateMintTokenFlow, 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OAuth2MintTokenFlow* (const std::string& login_access_token)); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockGetAuthTokenFunction() {} 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool login_access_token_result_; 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool login_ui_result_; 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_result_; 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GaiaWebAuthFlow::Failure scope_ui_failure_; 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string scope_ui_oauth_error_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown_; 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OAuth2Fields { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE = 0, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLIENT_ID = 1, 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPES = 2, 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AS_COMPONENT = 4 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GetAuthTokenFunctionTest() {} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to create an extension with specific OAuth2Info fields set. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fields_to_set| should be computed by using fields of Oauth2Fields enum. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* CreateExtension(int fields_to_set) { 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Extension* ext; 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath manifest_path = 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("platform_apps/oauth2"); 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath component_manifest_path = 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("packaged_app/component_oauth2"); 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((fields_to_set & AS_COMPONENT) == 0) 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtension(manifest_path); 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtensionAsComponent(component_manifest_path); 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OAuth2Info& oauth2_info = 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_cast<OAuth2Info&>(OAuth2Info::GetOAuth2Info(ext)); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & CLIENT_ID) != 0) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.client_id = "client1"; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & SCOPES) != 0) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope1"); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope2"); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ext; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return IdentityAPI::GetFactoryInstance()->GetForProfile( 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile()); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoClientId) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(SCOPES)); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidClientId), error); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoScopes) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID)); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidScopes), error); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveNotSignedIn) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveMintFailure) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NonInteractiveLoginAccessTokenFailure) { 4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()) 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch .WillOnce(Return(true)); 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{}]", browser()); 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintAdviceSuccess) { 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ( 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) id_api()->GetCachedToken(extension->id(), oauth2_info.scopes).status()); 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintBadCredentials) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveSuccess) { 473ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 476ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 477ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 478ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser())); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->GetCachedToken(extension->id(), 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes).status()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginCanceled) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveMintBadCredentialsLoginCanceled) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessNoToken) { 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessMintFailure) { 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InteractiveLoginSuccessLoginAccessTokenFailure) { 5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 5627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 5637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_ui_result(true); 5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{\"interactive\": true}]", browser()); 5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(func->login_ui_shown()); 5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(func->scope_ui_shown()); 5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessMintSuccess) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalAborted) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveLoginSuccessApprovalSuccess) { 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 62890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveApprovalAborted) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InteractiveApprovalLoadFailed) { 650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .WillOnce(Return(true)); 654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::LOAD_FAILED); 658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalInvalidRedirect) { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 67190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidRedirect), error); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalConnectionFailure) { 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::SERVICE_AUTH_ERROR); 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalOAuthErrors) { 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::map<std::string, std::string> error_map; 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("access_denied", errors::kUserRejected)); 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("invalid_scope", errors::kInvalidScopes)); 70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair( 70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "unmapped_error", std::string(errors::kAuthFailure) + "unmapped_error")); 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::map<std::string, std::string>::const_iterator 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = error_map.begin(); 71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != error_map.end(); 71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ++it) { 71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func( 71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new MockGetAuthTokenFunction()); 715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 71690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ON_CALL(*func.get(), CreateMintTokenFlow(_)).WillByDefault(Return(flow)); 72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_oauth_error(it->first); 72190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(it->second, error); 72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalSuccess) { 73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string access_token; 74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) id_api()->GetCachedToken(extension->id(), 75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) oauth2_info.scopes).status()); 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> scopes(oauth2_info.scopes.begin(), 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes.end()); 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api = 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::IdentityAPI::GetFactoryInstance()->GetForProfile( 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile()); 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue* queue = id_api->mint_queue(); 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestStart(type, extension->id(), scopes, &queued_request); 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{}]"); 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token at this point. 779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The flow will be created after the first queued request clears. 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestComplete(type, extension->id(), scopes, &queued_request); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 79390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueue) { 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> scopes(oauth2_info.scopes.begin(), 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes.end()); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api = 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::IdentityAPI::GetFactoryInstance()->GetForProfile( 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile()); 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue* queue = id_api->mint_queue(); 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestStart(type, extension->id(), scopes, &queued_request); 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token and run the first flow. 824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The UI will be displayed and a token retrieved after the first 82890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // queued request clears. 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestComplete(type, extension->id(), scopes, &queued_request); 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveQueuedNoninteractiveFails) { 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the interactive queue. 846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> scopes(oauth2_info.scopes.begin(), 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes.end()); 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api = 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::IdentityAPI::GetFactoryInstance()->GetForProfile( 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile()); 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue* queue = id_api->mint_queue(); 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestStart(type, extension->id(), scopes, &queued_request); 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Non-interactive requests fail without hitting GAIA, because a 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // consent UI is known to be up. 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestComplete(type, extension->id(), scopes, &queued_request); 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveCacheHit) { 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get a token. Should not require a GAIA request. 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser())); 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveIssueAdviceCacheHit) { 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with advice 903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(info); 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should return an error without a GAIA request. 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveCacheHit) { 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<std::string> scopes(oauth2_info.scopes.begin(), 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes.end()); 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue* queue = id_api()->mint_queue(); 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestStart(type, extension->id(), scopes, &queued_request); 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Populate the cache with a token while the request is blocked. 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When we wake up the request, it returns the cached token without 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // displaying a UI, or hitting GAIA. 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) queue->RequestComplete(type, extension->id(), scopes, &queued_request); 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 95990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginInvalidatesTokenCache) { 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->SetCachedToken(extension->id(), oauth2_info.scopes, token); 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because the user is not signed in, the token will be removed, 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and we'll hit GAIA for new tokens. 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->GetCachedToken(extension->id(), 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth2_info.scopes).status()); 994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { 997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(SCOPES | AS_COMPONENT)); 1000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 1002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(oauth2_info.client_id.empty()); 1003eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(func->GetOAuth2ClientId().empty()); 1004eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE("client1", func->GetOAuth2ClientId()); 1005eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1006eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1007eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { 1008eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 1010eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(CLIENT_ID | SCOPES | AS_COMPONENT)); 1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1012eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("client1", func->GetOAuth2ClientId()); 1013eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1014eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool InvalidateDefaultToken() { 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityRemoveCachedAuthTokenFunction); 10207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return utils::RunFunction( 1022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), 1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string("[{\"token\": \"") + kAccessToken + "\"}]", 1024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser(), 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_test_utils::NONE); 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return IdentityAPI::GetFactoryInstance()->GetForProfile( 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile()); 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetCachedToken(IdentityTokenCacheValue& token_data) { 1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_api()->SetCachedToken(extensions::id_util::GenerateId(kExtensionId), 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>(), token_data); 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IdentityTokenCacheValue& GetCachedToken() { 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return id_api()->GetCachedToken( 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::id_util::GenerateId(kExtensionId), 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>()); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NotFound) { 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, Advice) { 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue advice(info); 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(advice); 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NonMatchingToken) { 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token("non_matching_token", 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("non_matching_token", GetCachedToken().token()); 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, MatchingToken) { 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { 1080b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 1081b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 1082b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Reduce performance test variance by disabling background networking. 1083b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) command_line->AppendSwitch(switches::kDisableBackgroundNetworking); 1084b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { 1088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1089b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1090b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1092b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1093b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1094b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1098b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1099b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) utils::CreateEmptyExtension()); 1100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->set_extension(empty_extension.get()); 1101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WaitForGURLAndCloseWindow popup_observer(auth_url); 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(function.get(), args); 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) popup_observer.Wait(); 11097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) popup_observer.CloseEmbedderWebContents(); 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function.get())); 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { 1115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": false, \"url\": \"" + 1130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = 1132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInteractionRequired), error); 1135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, LoadFailed) { 1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer https_server( 1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL auth_url(https_server.GetURL("files/five_hundred.html")); 1145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<Extension> empty_extension( 1149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::CreateEmptyExtension()); 1150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function->set_extension(empty_extension.get()); 1151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) auth_url.spec() + "\"}]"; 11547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string error = 11557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { 1161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 1165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 1166558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": false," 1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LaunchWebAuthFlowFunctionTest, InteractiveFirstNavigationSuccess) { 1188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 1193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": true," 1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LaunchWebAuthFlowFunctionTest, InteractiveSecondNavigationSuccess) { 1215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/redirect_to_chromiumapp.html")); 1222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value( 1233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(function.get(), args, browser())); 1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 1242