identity_apitest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <set> 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string> 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h" 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/identity_api.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/guest_view/guest_view_base.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h" 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/api/identity.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/id_util.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/oauth2_mint_token_flow.h" 42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "grit/browser_resources.h" 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace errors = identity_constants; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace utils = extension_function_test_utils; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAccessToken[] = "auth_token"; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const char kExtensionId[] = "ext_id"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This helps us be able to wait until an UIThreadExtensionFunction calls 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// SendResponse. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SendResponseDelegate 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public UIThreadExtensionFunction::DelegateForTests { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendResponseDelegate() : should_post_quit_(false) {} 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SendResponseDelegate() {} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_should_post_quit(bool should_quit) { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) should_post_quit_ = should_quit; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasResponse() { 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return response_.get() != NULL; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetResponse() { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(HasResponse()); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *response_.get(); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSendResponse(UIThreadExtensionFunction* function, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool bad_message) OVERRIDE { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(bad_message); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(HasResponse()); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_.reset(new bool); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *response_ = success; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (should_post_quit_) { 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<bool> response_; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_post_quit_; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AsyncExtensionBrowserTest : public ExtensionBrowserTest { 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Asynchronous function runner allows tests to manipulate the browser window 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after the call happens. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunFunctionAsync( 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UIThreadExtensionFunction* function, 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& args) { 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_.reset(new SendResponseDelegate); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_test_delegate(response_delegate_.get()); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::ListValue> parsed_args(utils::ParseList(args)); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(parsed_args.get()) << 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Could not parse extension function arguments: " << args; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->SetArgs(parsed_args.get()); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!function->GetExtension()) { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) function->set_browser_context(browser()->profile()); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_has_callback(true); 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) function->Run()->Execute(); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string WaitForError(UIThreadExtensionFunction* function) { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(function->GetResultList()) << "Did not expect a result"; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return function->GetError(); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Value* WaitForSingleResult(UIThreadExtensionFunction* function) { 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: " 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << function->GetError(); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value* single_result = NULL; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (function->GetResultList() != NULL && 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->GetResultList()->Get(0, &single_result)) { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return single_result->DeepCopy(); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunMessageLoopUntilResponse() { 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If the RunAsync of |function| didn't already call SendResponse, run the 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // message loop until they do. 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!response_delegate_->HasResponse()) { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_->set_should_post_quit(true); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(response_delegate_->HasResponse()); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SendResponseDelegate> response_delegate_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass TestHangOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestHangOAuth2MintTokenFlow() 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : OAuth2MintTokenFlow(NULL, NULL, OAuth2MintTokenFlow::Parameters()) {} 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void Start() OVERRIDE { 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Do nothing, simulating a hanging network call. 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResultType { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISSUE_ADVICE_SUCCESS, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MINT_TOKEN_SUCCESS, 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MINT_TOKEN_FAILURE, 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MINT_TOKEN_BAD_CREDENTIALS, 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MINT_TOKEN_SERVICE_ERROR 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow(ResultType result, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OAuth2MintTokenFlow(NULL, delegate, OAuth2MintTokenFlow::Parameters()), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(result), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result_) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ISSUE_ADVICE_SUCCESS: { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueAdviceInfo info; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnIssueAdviceSuccess(info); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_SUCCESS: { 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenSuccess(kAccessToken, 3600); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_FAILURE: { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenFailure(error); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case MINT_TOKEN_BAD_CREDENTIALS: { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case MINT_TOKEN_SERVICE_ERROR: { 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GoogleServiceAuthError error = 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GoogleServiceAuthError::FromServiceError("invalid_scope"); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultType result_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP event and 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// saves a pointer to the window embedding the WebContents, which can be later 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// closed. 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver { 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) explicit WaitForGURLAndCloseWindow(GURL url) 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : WindowedNotificationObserver( 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NotificationService::AllSources()), 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url_(url) {} 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NotificationObserver: 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Observe(int type, 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationSource& source, 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NavigationController* web_auth_flow_controller = 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<content::NavigationController>(source).ptr(); 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WebContents* web_contents = 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_auth_flow_controller->GetWebContents(); 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (web_contents->GetURL() == url_) { 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // It is safe to keep the pointer here, because we know in a test, that 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the WebContents won't go away before CloseEmbedderWebContents is 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // called. Don't copy this code to production. 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder_web_contents_ = guest->embedder_web_contents(); 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Condtionally invoke parent class so that Wait will not exit 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // until the target URL arrives. 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WindowedNotificationObserver::Observe(type, source, details); 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Closes the window embedding the WebContents. The action is separated from 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the Observe method to make sure the list of observers is not deleted, 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // while some event is already being processed. (That causes ASAN failures.) 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CloseEmbedderWebContents() { 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (embedder_web_contents_) 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) embedder_web_contents_->Close(); 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL url_; 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::WebContents* embedder_web_contents_; 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockGetAuthTokenFunction() : login_access_token_result_(true), 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_ui_result_(true), 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_(true), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_(false), 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_(false) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_login_access_token_result(bool result) { 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_access_token_result_ = result; 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_login_ui_result(bool result) { 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_ui_result_ = result; 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = failure; 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_oauth_error(const std::string& oauth_error) { 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_oauth_error_ = oauth_error; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown() const { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return login_ui_shown_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown() const { 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return scope_ui_shown_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void StartLoginAccessTokenRequest() OVERRIDE { 3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (login_access_token_result_) { 3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenSuccess(login_token_request_.get(), "access_token", 3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Time::Now() + base::TimeDelta::FromHours(1LL)); 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError error( 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenFailure(login_token_request_.get(), error); 3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(login_ui_shown_); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_ = true; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (login_ui_result_) 3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SigninSuccess(); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninFailed(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowOAuthApprovalDialog( 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_ = true; 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (scope_ui_result_) { 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowCompleted(kAccessToken, "3600"); 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, ""); 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_CONST_METHOD0(HasLoginToken, bool()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(CreateMintTokenFlow, 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OAuth2MintTokenFlow* (const std::string& login_access_token)); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockGetAuthTokenFunction() {} 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool login_access_token_result_; 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool login_ui_result_; 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_result_; 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GaiaWebAuthFlow::Failure scope_ui_failure_; 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string scope_ui_oauth_error_; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown_; 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown_; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(courage): Replace MockGetAuthTokenFunction with 35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// FakeGetAuthTokenFunction in all tests. 35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeGetAuthTokenFunction() 36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : login_access_token_result_(true), 36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_result_(true), 36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_(true), 36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_shown_(false), 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_shown_(false) {} 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_login_access_token_result(bool result) { 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_access_token_result_ = result; 36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_login_ui_result(bool result) { login_ui_result_ = result; } 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_mint_token_flow(scoped_ptr<OAuth2MintTokenFlow> flow) { 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) flow_ = flow.Pass(); 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_ = false; 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_failure_ = failure; 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_scope_ui_oauth_error(const std::string& oauth_error) { 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_ = false; 38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; 38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_oauth_error_ = oauth_error; 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_shown() const { return login_ui_shown_; } 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_shown() const { return scope_ui_shown_; } 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string login_access_token() const { return login_access_token_; } 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(login_ui_shown_); 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_shown_ = true; 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (login_ui_result_) 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninSuccess(); 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninFailed(); 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ShowOAuthApprovalDialog( 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_shown_ = true; 40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (scope_ui_result_) { 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowCompleted(kAccessToken, "3600"); 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, ""); 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual OAuth2MintTokenFlow* CreateMintTokenFlow( 41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& login_access_token) OVERRIDE { 41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(login_access_token_.empty()); 42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_access_token_ = login_access_token; 42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return flow_.release(); 42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~FakeGetAuthTokenFunction() {} 42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_access_token_result_; 42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_result_; 42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_result_; 42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GaiaWebAuthFlow::Failure scope_ui_failure_; 43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string scope_ui_oauth_error_; 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_shown_; 43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_shown_; 43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow> flow_; 43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string login_access_token_; 43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AccountIds CreateIds(std::string email, std::string obfid) { 44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountIds ids; 44646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.account_key = email; 44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.email = email; 44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.gaia = obfid; 44946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return ids; 45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch(switches::kExtensionsMultiAccount); 456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetAccountState(AccountIds ids, bool is_signed_in) { 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( 461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ids, is_signed_in); 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::AssertionResult ExpectGetAccounts( 465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<std::string>& accounts) { 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<IdentityGetAccountsFunction> func( 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new IdentityGetAccountsFunction); 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!utils::RunFunction( 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) func.get(), std::string("[]"), browser(), utils::NONE)) { 471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "getAccounts did not return a result."; 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* callback_arguments = func->GetResultList(); 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!callback_arguments) 476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) << "NULL result"; 477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (callback_arguments->GetSize() != 1) { 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) 480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "Expected 1 argument but got " << callback_arguments->GetSize(); 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* results; 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!callback_arguments->GetList(0, &results)) 485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GenerateFailureResult(accounts, NULL) << "Result was not an array"; 486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<std::string> result_ids; 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (base::ListValue::const_iterator it = results->begin(); 489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != results->end(); 490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<api::identity::AccountInfo> info = 492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) api::identity::AccountInfo::FromValue(**it); 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (info.get()) 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result_ids.insert(info->id); 495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, results); 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != accounts.end(); 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result_ids.find(*it) == result_ids.end()) 503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, results); 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionResult(true); 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::AssertionResult GenerateFailureResult( 510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ::std::vector<std::string>& accounts, 511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* results) { 512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::Message msg("Expected: "); 513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != accounts.end(); 515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << *it << " "; 517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << "Actual: "; 519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!results) { 520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << "NULL"; 521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (base::ListValue::const_iterator it = results->begin(); 523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != results->end(); 524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<api::identity::AccountInfo> info = 526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) api::identity::AccountInfo::FromValue(**it); 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (info.get()) 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << info->id << " "; 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << *it << "<-" << (*it)->GetType() << " "; 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure(msg); 535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, MultiAccountOn) { 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(switches::IsExtensionsMultiAccount()); 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, NoneSignedIn) { 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(std::vector<std::string>())); 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrimaryAccountSignedIn) { 548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> primary; 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) primary.push_back("1"); 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(primary)); 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, TwoAccountsSignedIn) { 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> two_accounts; 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) two_accounts.push_back("1"); 559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) two_accounts.push_back("2"); 560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(two_accounts)); 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IdentityOldProfilesGetAccountsFunctionTest 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public IdentityGetAccountsFunctionTest { 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Don't add the multi-account switch that parent class would have. 567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, 571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MultiAccountOff) { 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(switches::IsExtensionsMultiAccount()); 573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, 576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TwoAccountsSignedIn) { 577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> only_primary; 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) only_primary.push_back("1"); 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(only_primary)); 582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { 58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpCommandLine(command_line); 58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) command_line->AppendSwitch(switches::kExtensionsMultiAccount); 58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); 59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) will_create_browser_context_services_subscription_ = 59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserContextDependencyManager::GetInstance() 59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ->RegisterWillCreateBrowserContextServicesCallbackForTesting( 59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&GetAuthTokenFunctionTest:: 59846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnWillCreateBrowserContextServices, 59946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))) 60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Pass(); 60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnWillCreateBrowserContextServices(content::BrowserContext* context) { 60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Replace the signin manager and token service with fakes. Do this ahead of 60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // creating the browser so that a bunch of classes don't register as 60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // observers and end up needing to unregister when the fake is substituted. 60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninManagerFactory::GetInstance()->SetTestingFactory( 60846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context, &FakeSigninManagerBase::Build); 60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( 61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context, &BuildFakeProfileOAuth2TokenService); 61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpOnMainThread(); 61546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 61646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Grab references to the fake signin manager and token service. 61746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_ = static_cast<FakeSigninManagerForTesting*>( 61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninManagerFactory::GetInstance()->GetForProfile(profile())); 61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(signin_manager_); 62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_ = static_cast<FakeProfileOAuth2TokenService*>( 62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( 62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile())); 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(token_service_); 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SignIn(const std::string account_key) { 62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_CHROMEOS) 62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_->SetAuthenticatedUsername(account_key); 62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else 63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_->SignIn(account_key, "password"); 63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetAccountState(AccountIds ids, bool is_signed_in) { 63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( 63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids, is_signed_in); 63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OAuth2Fields { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE = 0, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLIENT_ID = 1, 643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPES = 2, 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AS_COMPONENT = 4 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeSigninManagerForTesting* signin_manager_; 64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeProfileOAuth2TokenService* token_service_; 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GetAuthTokenFunctionTest() {} 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to create an extension with specific OAuth2Info fields set. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fields_to_set| should be computed by using fields of Oauth2Fields enum. 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* CreateExtension(int fields_to_set) { 655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Extension* ext; 656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath manifest_path = 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("platform_apps/oauth2"); 658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath component_manifest_path = 659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("packaged_app/component_oauth2"); 660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((fields_to_set & AS_COMPONENT) == 0) 661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtension(manifest_path); 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtensionAsComponent(component_manifest_path); 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OAuth2Info& oauth2_info = 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_cast<OAuth2Info&>(OAuth2Info::GetOAuth2Info(ext)); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & CLIENT_ID) != 0) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.client_id = "client1"; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & SCOPES) != 0) { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope1"); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope2"); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extension_id_ = ext->id(); 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) oauth_scopes_ = std::set<std::string>(oauth2_info.scopes.begin(), 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) oauth2_info.scopes.end()); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ext; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IdentityAPI::GetFactoryInstance()->Get(browser()->profile()); 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string GetPrimaryAccountId() { 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerBase* signin_manager = 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerFactory::GetForProfile(browser()->profile()); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return signin_manager->GetAuthenticatedAccountId(); 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetCachedToken(const IdentityTokenCacheValue& token_data) { 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->SetCachedToken(key, token_data); 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 69446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IdentityTokenCacheValue& GetCachedToken(std::string account_id) { 69546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (account_id.empty()) 69646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) account_id = GetPrimaryAccountId(); 69746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionTokenKey key(extension_id_, account_id, oauth_scopes_); 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return id_api()->GetCachedToken(key); 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void QueueRequestStart(IdentityMintRequestQueue::MintType type, 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IdentityMintRequestQueue::Request* request) { 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->mint_queue()->RequestStart(type, key, request); 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void QueueRequestComplete(IdentityMintRequestQueue::MintType type, 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IdentityMintRequestQueue::Request* request) { 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->mint_queue()->RequestComplete(type, key, request); 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string extension_id_; 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string> oauth_scopes_; 71646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 71746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> 71846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) will_create_browser_context_services_subscription_; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoClientId) { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(SCOPES)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidClientId), error); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoScopes) { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID)); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidScopes), error); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveNotSignedIn) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveMintFailure) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NonInteractiveLoginAccessTokenFailure) { 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 7757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()) 7767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch .WillOnce(Return(true)); 7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 7787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 7797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{}]", browser()); 7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 7817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintAdviceSuccess) { 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 79946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintBadCredentials) { 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, 818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_api()->GetAuthStatusForTest().state()); 819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NonInteractiveMintServiceError) { 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SERVICE_ERROR, func.get()); 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string error = 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) utils::RunFunctionAndReturnError(func.get(), "[{}]", browser()); 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_api()->GetAuthStatusForTest()); 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveSuccess) { 841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser())); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 86090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 86246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginCanceled) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveMintBadCredentialsLoginCanceled) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessNoToken) { 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessMintFailure) { 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 92290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InteractiveLoginSuccessLoginAccessTokenFailure) { 9277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 9297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 9307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_ui_result(true); 9317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 9327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 9337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{\"interactive\": true}]", browser()); 9347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 9357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(func->login_ui_shown()); 9367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(func->scope_ui_shown()); 9377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9397dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessMintSuccess) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalAborted) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 96890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveLoginSuccessApprovalSuccess) { 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveApprovalAborted) { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 100690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InteractiveApprovalLoadFailed) { 1016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 1018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .WillOnce(Return(true)); 1020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::LOAD_FAILED); 1024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 1026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 1027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 1028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalInvalidRedirect) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 103790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); 104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 104390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidRedirect), error); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalConnectionFailure) { 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 105490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::SERVICE_AUTH_ERROR); 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalOAuthErrors) { 106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::map<std::string, std::string> error_map; 107090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("access_denied", errors::kUserRejected)); 107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("invalid_scope", errors::kInvalidScopes)); 107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair( 107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "unmapped_error", std::string(errors::kAuthFailure) + "unmapped_error")); 107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 107590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::map<std::string, std::string>::const_iterator 107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = error_map.begin(); 107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != error_map.end(); 107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ++it) { 107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func( 108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new MockGetAuthTokenFunction()); 1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure we don't get a cached issue_advice result, which would cause 1084f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // flow to be leaked. 1085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) id_api()->EraseAllCachedTokens(); 108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_oauth_error(it->first); 109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(it->second, error); 109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalSuccess) { 110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 110590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 110690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string access_token; 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 111846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{}]"); 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token at this point. 1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The flow will be created after the first queued request clears. 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 115390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueue) { 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 1175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token and run the first flow. 1177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The UI will be displayed and a token retrieved after the first 118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // queued request clears. 1182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 118990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueueShutdown) { 1193e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1194e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1195e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->set_extension(extension.get()); 1196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1197e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Create a fake request to block the queue. 1198e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MockQueuedMintRequest queued_request; 1199e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IdentityMintRequestQueue::MintType type = 1200e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1203e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QueueRequestStart(type, &queued_request); 1204e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The real request will start processing, but wait in the queue behind 1206e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // the blocker. 1207e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 1209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 1211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Verify that we have fetched the login token and run the first flow. 1213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch testing::Mock::VerifyAndClearExpectations(func.get()); 1214e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->scope_ui_shown()); 1215e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1216e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // After the request is canceled, the function will complete. 1217e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->OnShutdown(); 1218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(std::string(errors::kCanceled), WaitForError(func.get())); 1219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->login_ui_shown()); 1220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->scope_ui_shown()); 1221e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QueueRequestComplete(type, &queued_request); 1223e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1224e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveShutdown) { 1226e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1228e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->set_extension(extension.get()); 1229e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1230e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1231e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestHangOAuth2MintTokenFlow* flow = new TestHangOAuth2MintTokenFlow(); 1232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1233e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RunFunctionAsync(func.get(), "[{\"interactive\": false}]"); 1234e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // After the request is canceled, the function will complete. 1236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->OnShutdown(); 1237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(std::string(errors::kCanceled), WaitForError(func.get())); 1238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1239e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveQueuedNoninteractiveFails) { 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the interactive queue. 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Non-interactive requests fail without hitting GAIA, because a 1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // consent UI is known to be up. 1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 126190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveCacheHit) { 1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get a token. Should not require a GAIA request. 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser())); 1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveIssueAdviceCacheHit) { 1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with advice 1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(info); 1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should return an error without a GAIA request. 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 130790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveCacheHit) { 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Populate the cache with a token while the request is blocked. 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When we wake up the request, it returns the cached token without 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // displaying a UI, or hitting GAIA. 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginInvalidatesTokenCache) { 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because the user is not signed in, the token will be removed, 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and we'll hit GAIA for new tokens. 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 136990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 137946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { 1383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 1385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(SCOPES | AS_COMPONENT)); 1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 1388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(oauth2_info.client_id.empty()); 1389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(func->GetOAuth2ClientId().empty()); 1390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE("client1", func->GetOAuth2ClientId()); 1391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { 1394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 1396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(CLIENT_ID | SCOPES | AS_COMPONENT)); 1397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("client1", func->GetOAuth2ClientId()); 1399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 140146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiDefaultUser) { 140246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 140346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("primary@example.com", 140446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 140546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 140646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 140746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 140846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 140946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 141046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 141146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 141246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 141346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 141446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 141546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{}]"); 141646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 141746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 141846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "primary@example.com", 141946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-primary@example.com", 142046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 142146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 142246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 142346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 142446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 142546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 142646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 142846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); 142946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 143046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 143146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiPrimaryUser) { 143246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 143346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("primary@example.com", 143446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 143546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 143646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 143746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 143846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 143946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 144046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 144146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 144246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 144346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 144446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 144546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"1\" } }]"); 144646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 144746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 144846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "primary@example.com", 144946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-primary@example.com", 145046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 145146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 145246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 145346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 145446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 145546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 145646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 145746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 145846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); 145946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 146046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 146146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiSecondaryUser) { 146246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 146346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("secondary@example.com", 146446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 146546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 146746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 146846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 146946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 147046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 147246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 147346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"2\" } }]"); 147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 147846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "secondary@example.com", 147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-secondary@example.com", 148046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 148146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 148246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 148346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 148446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 148646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 148746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken("secondary@example.com").status()); 148846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-secondary@example.com", func->login_access_token()); 148946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 149046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 149146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(courage): negative cases for secondary accounts 149246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool InvalidateDefaultToken() { 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityRemoveCachedAuthTokenFunction); 14987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return utils::RunFunction( 1500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), 1501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string("[{\"token\": \"") + kAccessToken + "\"}]", 1502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser(), 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_test_utils::NONE); 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 1507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IdentityAPI::GetFactoryInstance()->Get(browser()->profile()); 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetCachedToken(IdentityTokenCacheValue& token_data) { 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extensions::id_util::GenerateId(kExtensionId), 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "test@example.com", 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string>()); 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->SetCachedToken(key, token_data); 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IdentityTokenCacheValue& GetCachedToken() { 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return id_api()->GetCachedToken( 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey(extensions::id_util::GenerateId(kExtensionId), 1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "test@example.com", 1521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string>())); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NotFound) { 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, Advice) { 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue advice(info); 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(advice); 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NonMatchingToken) { 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token("non_matching_token", 1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("non_matching_token", GetCachedToken().token()); 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, MatchingToken) { 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 1555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetCachedToken().status()); 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { 1562b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 1563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 156446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpCommandLine(command_line); 1565b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Reduce performance test variance by disabling background networking. 1566b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) command_line->AppendSwitch(switches::kDisableBackgroundNetworking); 1567b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { 1571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) utils::CreateEmptyExtension()); 1583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->set_extension(empty_extension.get()); 1584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WaitForGURLAndCloseWindow popup_observer(auth_url); 1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1587b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1588b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(function.get(), args); 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1591b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) popup_observer.Wait(); 15927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) popup_observer.CloseEmbedderWebContents(); 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function.get())); 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { 1598b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1599b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": false, \"url\": \"" + 1613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = 1615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInteractionRequired), error); 1618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, LoadFailed) { 1621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer https_server( 1622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL auth_url(https_server.GetURL("files/five_hundred.html")); 1628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<Extension> empty_extension( 1632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::CreateEmptyExtension()); 1633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function->set_extension(empty_extension.get()); 1634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) auth_url.spec() + "\"}]"; 16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string error = 16387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { 1644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 1648558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 1649558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1656b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": false," 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LaunchWebAuthFlowFunctionTest, InteractiveFirstNavigationSuccess) { 1671ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1672ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1674ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 1676ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1683b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": true," 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, 1697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISABLED_InteractiveSecondNavigationSuccess) { 1698b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1699b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1700b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1701b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1702b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1703b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1704b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/redirect_to_chromiumapp.html")); 1705b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1712b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1713b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1714b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value( 1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(function.get(), args, browser())); 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 1725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests the chrome.identity API implemented by custom JS bindings . 1727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeIdentityJsBindings) { 1728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("identity/js_bindings")) << message_; 1729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1730