identity_apitest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/prefs/pref_service.h" 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/identity_api.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h" 20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/guest_view/guest_view_base.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h" 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/api/identity.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/signin/core/common/signin_pref_names.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/id_util.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/oauth2_mint_token_flow.h" 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "grit/browser_resources.h" 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ReturnRef; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace errors = identity_constants; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace utils = extension_function_test_utils; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAccessToken[] = "auth_token"; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const char kExtensionId[] = "ext_id"; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This helps us be able to wait until an UIThreadExtensionFunction calls 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// SendResponse. 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SendResponseDelegate 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public UIThreadExtensionFunction::DelegateForTests { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendResponseDelegate() : should_post_quit_(false) {} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SendResponseDelegate() {} 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_should_post_quit(bool should_quit) { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) should_post_quit_ = should_quit; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasResponse() { 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return response_.get() != NULL; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetResponse() { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(HasResponse()); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *response_.get(); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSendResponse(UIThreadExtensionFunction* function, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool bad_message) OVERRIDE { 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(bad_message); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(HasResponse()); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_.reset(new bool); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *response_ = success; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (should_post_quit_) { 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<bool> response_; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_post_quit_; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AsyncExtensionBrowserTest : public ExtensionBrowserTest { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Asynchronous function runner allows tests to manipulate the browser window 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // after the call happens. 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunFunctionAsync( 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UIThreadExtensionFunction* function, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& args) { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_.reset(new SendResponseDelegate); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_test_delegate(response_delegate_.get()); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::ListValue> parsed_args(utils::ParseList(args)); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(parsed_args.get()) << 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "Could not parse extension function arguments: " << args; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->SetArgs(parsed_args.get()); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!function->GetExtension()) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) function->set_browser_context(browser()->profile()); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_has_callback(true); 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) function->Run()->Execute(); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string WaitForError(UIThreadExtensionFunction* function) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(function->GetResultList()) << "Did not expect a result"; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return function->GetError(); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Value* WaitForSingleResult(UIThreadExtensionFunction* function) { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunMessageLoopUntilResponse(); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: " 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << function->GetError(); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value* single_result = NULL; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (function->GetResultList() != NULL && 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->GetResultList()->Get(0, &single_result)) { 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return single_result->DeepCopy(); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RunMessageLoopUntilResponse() { 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If the RunAsync of |function| didn't already call SendResponse, run the 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // message loop until they do. 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!response_delegate_->HasResponse()) { 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) response_delegate_->set_should_post_quit(true); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(response_delegate_->HasResponse()); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<SendResponseDelegate> response_delegate_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass TestHangOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestHangOAuth2MintTokenFlow() 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : OAuth2MintTokenFlow(NULL, NULL, OAuth2MintTokenFlow::Parameters()) {} 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void Start() OVERRIDE { 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Do nothing, simulating a hanging network call. 167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOAuth2MintTokenFlow : public OAuth2MintTokenFlow { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResultType { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISSUE_ADVICE_SUCCESS, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MINT_TOKEN_SUCCESS, 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MINT_TOKEN_FAILURE, 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MINT_TOKEN_BAD_CREDENTIALS, 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MINT_TOKEN_SERVICE_ERROR 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow(ResultType result, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OAuth2MintTokenFlow(NULL, delegate, OAuth2MintTokenFlow::Parameters()), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(result), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result_) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ISSUE_ADVICE_SUCCESS: { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueAdviceInfo info; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnIssueAdviceSuccess(info); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_SUCCESS: { 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenSuccess(kAccessToken, 3600); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MINT_TOKEN_FAILURE: { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_->OnMintTokenFailure(error); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case MINT_TOKEN_BAD_CREDENTIALS: { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case MINT_TOKEN_SERVICE_ERROR: { 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GoogleServiceAuthError error = 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GoogleServiceAuthError::FromServiceError("invalid_scope"); 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->OnMintTokenFailure(error); 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultType result_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2MintTokenFlow::Delegate* delegate_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP event and 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// saves a pointer to the window embedding the WebContents, which can be later 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// closed. 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver { 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) explicit WaitForGURLAndCloseWindow(GURL url) 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : WindowedNotificationObserver( 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NotificationService::AllSources()), 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url_(url) {} 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NotificationObserver: 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Observe(int type, 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationSource& source, 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::NavigationController* web_auth_flow_controller = 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<content::NavigationController>(source).ptr(); 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WebContents* web_contents = 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_auth_flow_controller->GetWebContents(); 242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (web_contents->GetURL() == url_) { 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // It is safe to keep the pointer here, because we know in a test, that 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the WebContents won't go away before CloseEmbedderWebContents is 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // called. Don't copy this code to production. 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents); 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) embedder_web_contents_ = guest->embedder_web_contents(); 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Condtionally invoke parent class so that Wait will not exit 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // until the target URL arrives. 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::WindowedNotificationObserver::Observe(type, source, details); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Closes the window embedding the WebContents. The action is separated from 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the Observe method to make sure the list of observers is not deleted, 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // while some event is already being processed. (That causes ASAN failures.) 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CloseEmbedderWebContents() { 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (embedder_web_contents_) 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) embedder_web_contents_->Close(); 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL url_; 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::WebContents* embedder_web_contents_; 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockGetAuthTokenFunction() : login_access_token_result_(true), 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_ui_result_(true), 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_(true), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_(false), 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_(false) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_login_access_token_result(bool result) { 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch login_access_token_result_ = result; 2817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_login_ui_result(bool result) { 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_ui_result_ = result; 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = failure; 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void set_scope_ui_oauth_error(const std::string& oauth_error) { 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_result_ = false; 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_oauth_error_ = oauth_error; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown() const { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return login_ui_shown_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown() const { 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return scope_ui_shown_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ExtensionTokenKey* extension_token_key() { return token_key_.get(); } 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void StartLoginAccessTokenRequest() OVERRIDE { 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (login_access_token_result_) { 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenSuccess(login_token_request_.get(), "access_token", 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Time::Now() + base::TimeDelta::FromHours(1LL)); 3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError error( 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnGetTokenFailure(login_token_request_.get(), error); 3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(login_ui_shown_); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_ui_shown_ = true; 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (login_ui_result_) 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SigninSuccess(); 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninFailed(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowOAuthApprovalDialog( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scope_ui_shown_ = true; 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (scope_ui_result_) { 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowCompleted(kAccessToken, "3600"); 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, ""); 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_CONST_METHOD0(HasLoginToken, bool()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(CreateMintTokenFlow, 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OAuth2MintTokenFlow* (const std::string& login_access_token)); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockGetAuthTokenFunction() {} 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool login_access_token_result_; 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool login_ui_result_; 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_result_; 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GaiaWebAuthFlow::Failure scope_ui_failure_; 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string scope_ui_oauth_error_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_ui_shown_; 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool scope_ui_shown_; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(courage): Replace MockGetAuthTokenFunction with 35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// FakeGetAuthTokenFunction in all tests. 36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction { 36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeGetAuthTokenFunction() 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : login_access_token_result_(true), 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_result_(true), 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_(true), 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_shown_(false), 36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_shown_(false) {} 36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_login_access_token_result(bool result) { 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_access_token_result_ = result; 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_login_ui_result(bool result) { login_ui_result_ = result; } 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_mint_token_flow(scoped_ptr<OAuth2MintTokenFlow> flow) { 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) flow_ = flow.Pass(); 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_scope_ui_failure(GaiaWebAuthFlow::Failure failure) { 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_ = false; 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_failure_ = failure; 38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_scope_ui_oauth_error(const std::string& oauth_error) { 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_result_ = false; 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_failure_ = GaiaWebAuthFlow::OAUTH_ERROR; 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_oauth_error_ = oauth_error; 38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_shown() const { return login_ui_shown_; } 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_shown() const { return scope_ui_shown_; } 39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string login_access_token() const { return login_access_token_; } 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ShowLoginPopup() OVERRIDE { 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(login_ui_shown_); 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_ui_shown_ = true; 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (login_ui_result_) 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninSuccess(); 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninFailed(); 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ShowOAuthApprovalDialog( 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IssueAdviceInfo& issue_advice) OVERRIDE { 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scope_ui_shown_ = true; 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (scope_ui_result_) { 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowCompleted(kAccessToken, "3600"); 41246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (scope_ui_failure_ == GaiaWebAuthFlow::SERVICE_AUTH_ERROR) { 41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, ""); 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnGaiaFlowFailure(scope_ui_failure_, error, scope_ui_oauth_error_); 41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual OAuth2MintTokenFlow* CreateMintTokenFlow( 42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& login_access_token) OVERRIDE { 42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(login_access_token_.empty()); 42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) login_access_token_ = login_access_token; 42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return flow_.release(); 42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~FakeGetAuthTokenFunction() {} 43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_access_token_result_; 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_result_; 43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_result_; 43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GaiaWebAuthFlow::Failure scope_ui_failure_; 43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string scope_ui_oauth_error_; 43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool login_ui_shown_; 43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool scope_ui_shown_; 43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow> flow_; 43946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string login_access_token_; 44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 44246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockQueuedMintRequest : public IdentityMintRequestQueue::Request { 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AccountIds CreateIds(std::string email, std::string obfid) { 44946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AccountIds ids; 45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.account_key = email; 45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.email = email; 45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids.gaia = obfid; 45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return ids; 45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IdentityGetAccountsFunctionTest : public ExtensionBrowserTest { 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch(switches::kExtensionsMultiAccount); 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetAccountState(AccountIds ids, bool is_signed_in) { 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( 465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ids, is_signed_in); 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::AssertionResult ExpectGetAccounts( 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<std::string>& accounts) { 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<IdentityGetAccountsFunction> func( 471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new IdentityGetAccountsFunction); 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!utils::RunFunction( 474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) func.get(), std::string("[]"), browser(), utils::NONE)) { 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) 476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "getAccounts did not return a result."; 477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* callback_arguments = func->GetResultList(); 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!callback_arguments) 480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) << "NULL result"; 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (callback_arguments->GetSize() != 1) { 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, NULL) 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << "Expected 1 argument but got " << callback_arguments->GetSize(); 485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* results; 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!callback_arguments->GetList(0, &results)) 489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GenerateFailureResult(accounts, NULL) << "Result was not an array"; 490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<std::string> result_ids; 492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (base::ListValue::const_iterator it = results->begin(); 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != results->end(); 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<api::identity::AccountInfo> info = 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) api::identity::AccountInfo::FromValue(**it); 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (info.get()) 498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result_ids.insert(info->id); 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, results); 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != accounts.end(); 505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result_ids.find(*it) == result_ids.end()) 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GenerateFailureResult(accounts, results); 508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionResult(true); 511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::AssertionResult GenerateFailureResult( 514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ::std::vector<std::string>& accounts, 515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::ListValue* results) { 516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::Message msg("Expected: "); 517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != accounts.end(); 519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << *it << " "; 521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << "Actual: "; 523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!results) { 524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << "NULL"; 525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (base::ListValue::const_iterator it = results->begin(); 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != results->end(); 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<api::identity::AccountInfo> info = 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) api::identity::AccountInfo::FromValue(**it); 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (info.get()) 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << info->id << " "; 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg << *it << "<-" << (*it)->GetType() << " "; 535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure(msg); 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, MultiAccountOn) { 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(switches::IsExtensionsMultiAccount()); 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, NoneSignedIn) { 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(std::vector<std::string>())); 548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrimaryAccountSignedIn) { 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> primary; 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) primary.push_back("1"); 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(primary)); 556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetAccountsFunctionTest, TwoAccountsSignedIn) { 559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> two_accounts; 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) two_accounts.push_back("1"); 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) two_accounts.push_back("2"); 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(two_accounts)); 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IdentityOldProfilesGetAccountsFunctionTest 568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public IdentityGetAccountsFunctionTest { 569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Don't add the multi-account switch that parent class would have. 571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, 575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MultiAccountOff) { 576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(switches::IsExtensionsMultiAccount()); 577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityOldProfilesGetAccountsFunctionTest, 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TwoAccountsSignedIn) { 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> only_primary; 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) only_primary.push_back("1"); 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(ExpectGetAccounts(only_primary)); 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class IdentityGetProfileUserInfoFunctionTest : public ExtensionBrowserTest { 589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<api::identity::ProfileUserInfo> RunGetProfileUserInfo() { 591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<IdentityGetProfileUserInfoFunction> func( 592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new IdentityGetProfileUserInfoFunction); 593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::Value> value( 595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(func.get(), "[]", browser())); 596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return api::identity::ProfileUserInfo::FromValue(*value.get()); 597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest, NotSignedIn) { 601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<api::identity::ProfileUserInfo> info = RunGetProfileUserInfo(); 602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(info->email.empty()); 603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(info->id.empty()); 604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IdentityGetProfileUserInfoFunctionTest, SignedIn) { 607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPrefs() 608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->SetString(prefs::kGoogleServicesUsername, "president@example.com"); 609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile()->GetPrefs() 610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->SetString(prefs::kGoogleServicesUserAccountId, "12345"); 611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<api::identity::ProfileUserInfo> info = RunGetProfileUserInfo(); 613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ("president@example.com", info->email); 614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ("12345", info->id); 615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GetAuthTokenFunctionTest : public AsyncExtensionBrowserTest { 61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpCommandLine(command_line); 62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) command_line->AppendSwitch(switches::kExtensionsMultiAccount); 62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) will_create_browser_context_services_subscription_ = 62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserContextDependencyManager::GetInstance() 62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ->RegisterWillCreateBrowserContextServicesCallbackForTesting( 63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&GetAuthTokenFunctionTest:: 63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnWillCreateBrowserContextServices, 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))) 63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Pass(); 63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnWillCreateBrowserContextServices(content::BrowserContext* context) { 63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Replace the signin manager and token service with fakes. Do this ahead of 63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // creating the browser so that a bunch of classes don't register as 63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // observers and end up needing to unregister when the fake is substituted. 64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninManagerFactory::GetInstance()->SetTestingFactory( 64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context, &FakeSigninManagerBase::Build); 64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( 64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) context, &BuildFakeProfileOAuth2TokenService); 64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpOnMainThread(); 64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Grab references to the fake signin manager and token service. 65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_ = static_cast<FakeSigninManagerForTesting*>( 65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninManagerFactory::GetInstance()->GetForProfile(profile())); 65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(signin_manager_); 65346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_ = static_cast<FakeProfileOAuth2TokenService*>( 65446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( 65546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile())); 65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(token_service_); 65746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 65846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SignIn(const std::string account_key) { 66046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_CHROMEOS) 66146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_->SetAuthenticatedUsername(account_key); 66246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else 66346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) signin_manager_->SignIn(account_key, "password"); 66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 66546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 66646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 66746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetAccountState(AccountIds ids, bool is_signed_in) { 66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IdentityAPI::GetFactoryInstance()->Get(profile())->SetAccountStateForTest( 66946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ids, is_signed_in); 67046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 67146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OAuth2Fields { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE = 0, 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CLIENT_ID = 1, 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPES = 2, 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AS_COMPONENT = 4 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeSigninManagerForTesting* signin_manager_; 68146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeProfileOAuth2TokenService* token_service_; 68246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GetAuthTokenFunctionTest() {} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to create an extension with specific OAuth2Info fields set. 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |fields_to_set| should be computed by using fields of Oauth2Fields enum. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* CreateExtension(int fields_to_set) { 688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Extension* ext; 689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath manifest_path = 690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("platform_apps/oauth2"); 691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath component_manifest_path = 692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_data_dir_.AppendASCII("packaged_app/component_oauth2"); 693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((fields_to_set & AS_COMPONENT) == 0) 694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtension(manifest_path); 695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ext = LoadExtensionAsComponent(component_manifest_path); 697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OAuth2Info& oauth2_info = 698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_cast<OAuth2Info&>(OAuth2Info::GetOAuth2Info(ext)); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & CLIENT_ID) != 0) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.client_id = "client1"; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fields_to_set & SCOPES) != 0) { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope1"); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2_info.scopes.push_back("scope2"); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extension_id_ = ext->id(); 707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) oauth_scopes_ = std::set<std::string>(oauth2_info.scopes.begin(), 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) oauth2_info.scopes.end()); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ext; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IdentityAPI::GetFactoryInstance()->Get(browser()->profile()); 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string GetPrimaryAccountId() { 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerBase* signin_manager = 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerFactory::GetForProfile(browser()->profile()); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return signin_manager->GetAuthenticatedAccountId(); 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetCachedToken(const IdentityTokenCacheValue& token_data) { 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->SetCachedToken(key, token_data); 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 72746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IdentityTokenCacheValue& GetCachedToken(std::string account_id) { 72846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (account_id.empty()) 72946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) account_id = GetPrimaryAccountId(); 73046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionTokenKey key(extension_id_, account_id, oauth_scopes_); 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return id_api()->GetCachedToken(key); 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void QueueRequestStart(IdentityMintRequestQueue::MintType type, 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IdentityMintRequestQueue::Request* request) { 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->mint_queue()->RequestStart(type, key, request); 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void QueueRequestComplete(IdentityMintRequestQueue::MintType type, 741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IdentityMintRequestQueue::Request* request) { 742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extension_id_, GetPrimaryAccountId(), oauth_scopes_); 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->mint_queue()->RequestComplete(type, key, request); 744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string extension_id_; 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string> oauth_scopes_; 74946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 75046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> 75146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) will_create_browser_context_services_subscription_; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoClientId) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(SCOPES)); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidClientId), error); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoScopes) { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID)); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidScopes), error); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveNotSignedIn) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonInteractiveMintFailure) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser()); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NonInteractiveLoginAccessTokenFailure) { 8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 8087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()) 8097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch .WillOnce(Return(true)); 8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{}]", browser()); 8137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 8147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintAdviceSuccess) { 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 83246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveMintBadCredentials) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 84890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, 851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_api()->GetAuthStatusForTest().state()); 852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NonInteractiveMintServiceError) { 856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SERVICE_ERROR, func.get()); 861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string error = 863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) utils::RunFunctionAndReturnError(func.get(), "[{}]", browser()); 864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), 869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) id_api()->GetAuthStatusForTest()); 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NoOptionsSuccess) { 874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_ASH) 875f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Disable this test in Metro+Ash for now (http://crbug.com/262796). 876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 877f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 878f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 880f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 881f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 882f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(extension.get()); 883f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 884f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 885f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 886f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 887f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 888f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func.get(), "[]", browser())); 889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string access_token; 890f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 891f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 893f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 894f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 895f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetCachedToken(std::string()).status()); 896f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 898f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveSuccess) { 900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 902a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{}]", browser())); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 92146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginCanceled) { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveMintBadCredentialsLoginCanceled) { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_BAD_CREDENTIALS, func.get()); 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessNoToken) { 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(false); 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kUserNotSignedIn), error); 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveLoginSuccessMintFailure) { 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE, func.get()); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InteractiveLoginSuccessLoginAccessTokenFailure) { 9867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 9877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 9887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 9897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_ui_result(true); 9907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func->set_login_access_token_result(false); 9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string error = utils::RunFunctionAndReturnError( 9927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch func.get(), "[{\"interactive\": true}]", browser()); 9937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 9947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(func->login_ui_shown()); 9957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(func->scope_ui_shown()); 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessMintSuccess) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveLoginSuccessApprovalAborted) { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 103690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveLoginSuccessApprovalSuccess) { 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 103890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(false)); 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string access_token; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InteractiveApprovalAborted) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), error); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 107090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InteractiveApprovalLoadFailed) { 1075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 1077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .WillOnce(Return(true)); 1079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::LOAD_FAILED); 1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalInvalidRedirect) { 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); 110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 110190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidRedirect), error); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalConnectionFailure) { 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_failure(GaiaWebAuthFlow::SERVICE_AUTH_ERROR); 1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(StartsWithASCII(error, errors::kAuthFailure, false)); 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalOAuthErrors) { 112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::map<std::string, std::string> error_map; 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("access_denied", errors::kUserRejected)); 113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair("invalid_scope", errors::kInvalidScopes)); 113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_map.insert(std::make_pair( 113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "unmapped_error", std::string(errors::kAuthFailure) + "unmapped_error")); 113390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 113490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::map<std::string, std::string>::const_iterator 113590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it = error_map.begin(); 113690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != error_map.end(); 113790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ++it) { 113890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func( 113990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new MockGetAuthTokenFunction()); 1140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 114190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure we don't get a cached issue_advice result, which would cause 1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // flow to be leaked. 1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) id_api()->EraseAllCachedTokens(); 114590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 114690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 114890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func->set_scope_ui_oauth_error(it->first); 114990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 115090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser()); 115190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(it->second, error); 115290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 115390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 115490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 115590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 115890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InteractiveApprovalSuccess) { 115990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 116090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 116390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 116490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 116590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string access_token; 117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 117290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 117390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 117490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 117746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveQueue) { 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{}]"); 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token at this point. 1198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The flow will be created after the first queued request clears. 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 121290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueue) { 1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Verify that we have fetched the login token and run the first flow. 1236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) testing::Mock::VerifyAndClearExpectations(func.get()); 123790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The UI will be displayed and a token retrieved after the first 124090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // queued request clears. 1241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1251e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, InteractiveQueueShutdown) { 1252e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1253e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1254e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->set_extension(extension.get()); 1255e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1256e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Create a fake request to block the queue. 1257e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MockQueuedMintRequest queued_request; 1258e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IdentityMintRequestQueue::MintType type = 1259e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1260e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1261e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1262e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QueueRequestStart(type, &queued_request); 1263e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1264e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The real request will start processing, but wait in the queue behind 1265e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // the blocker. 1266e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1267e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestOAuth2MintTokenFlow* flow1 = new TestOAuth2MintTokenFlow( 1268e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1269e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow1)); 1270e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1271e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Verify that we have fetched the login token and run the first flow. 1272e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch testing::Mock::VerifyAndClearExpectations(func.get()); 1273e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->scope_ui_shown()); 1274e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1275e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // After the request is canceled, the function will complete. 1276e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->OnShutdown(); 1277e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(std::string(errors::kCanceled), WaitForError(func.get())); 1278e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->login_ui_shown()); 1279e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_FALSE(func->scope_ui_shown()); 1280e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1281e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QueueRequestComplete(type, &queued_request); 1282e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1283e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1284e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, NoninteractiveShutdown) { 1285e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1286e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1287e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->set_extension(extension.get()); 1288e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1289e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1290e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TestHangOAuth2MintTokenFlow* flow = new TestHangOAuth2MintTokenFlow(); 1291e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1292e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RunFunctionAsync(func.get(), "[{\"interactive\": false}]"); 1293e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1294e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // After the request is canceled, the function will complete. 1295e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch func->OnShutdown(); 1296e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(std::string(errors::kCanceled), WaitForError(func.get())); 1297e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1298e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveQueuedNoninteractiveFails) { 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the interactive queue. 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Non-interactive requests fail without hitting GAIA, because a 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // consent UI is known to be up. 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 132090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveCacheHit) { 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get a token. Should not require a GAIA request. 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser())); 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 134590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonInteractiveIssueAdviceCacheHit) { 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with advice 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(info); 1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should return an error without a GAIA request. 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(true)); 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = utils::RunFunctionAndReturnError( 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{}]", browser()); 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(errors::kNoGrant), error); 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InteractiveCacheHit) { 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a fake request to block the queue. 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockQueuedMintRequest queued_request; 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MintType type = 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(queued_request, StartMintToken(type)).Times(1); 1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestStart(type, &queued_request); 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The real request will start processing, but wait in the queue behind 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the blocker. 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(func.get(), "[{\"interactive\": true}]"); 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Populate the cache with a token while the request is blocked. 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When we wake up the request, it returns the cached token without 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // displaying a UI, or hitting GAIA. 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) QueueRequestComplete(type, &queued_request); 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(func->login_ui_shown()); 140690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(func->scope_ui_shown()); 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginInvalidatesTokenCache) { 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func->set_extension(extension.get()); 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pre-populate the cache with a token 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetCachedToken(token); 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Because the user is not signed in, the token will be removed, 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and we'll hit GAIA for new tokens. 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()) 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(false)); 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func->set_login_ui_result(true); 142590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)) 142890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) .WillOnce(Return(flow)); 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) func.get(), "[{\"interactive\": true}]", browser())); 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string access_token; 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(func->login_ui_shown()); 143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(func->scope_ui_shown()); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 143846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithChromeClientId) { 1442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 1444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(SCOPES | AS_COMPONENT)); 1445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const OAuth2Info& oauth2_info = OAuth2Info::GetOAuth2Info(extension.get()); 1447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(oauth2_info.client_id.empty()); 1448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(func->GetOAuth2ClientId().empty()); 1449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_NE("client1", func->GetOAuth2ClientId()); 1450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ComponentWithNormalClientId) { 1453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<const Extension> extension( 1455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateExtension(CLIENT_ID | SCOPES | AS_COMPONENT)); 1456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch func->set_extension(extension.get()); 1457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("client1", func->GetOAuth2ClientId()); 1458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 146046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiDefaultUser) { 146146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 146246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("primary@example.com", 146346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 146446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 146546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 146746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 146846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 146946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 147046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 147246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 147346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{}]"); 147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "primary@example.com", 147846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-primary@example.com", 147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 148046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 148146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 148246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 148346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 148446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 148646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 148746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); 148846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 148946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 149046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiPrimaryUser) { 149146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 149246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("primary@example.com", 149346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 149446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 149546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 149646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 149746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 149846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 149946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 150046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 150146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 150246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 150346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 150446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"1\" } }]"); 150546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 150646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 150746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "primary@example.com", 150846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-primary@example.com", 150946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 151046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 151146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 151246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 151346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 151446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 151546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 151646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken(std::string()).status()); 151746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-primary@example.com", func->login_access_token()); 151846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 151946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 152046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, MultiSecondaryUser) { 152146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SignIn("primary@example.com"); 152246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueRefreshTokenForUser("secondary@example.com", 152346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "refresh_token"); 152446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("primary@example.com", "1"), true); 152546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetAccountState(CreateIds("secondary@example.com", "2"), true); 152646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 152746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction()); 152846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 152946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_extension(extension.get()); 153046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) func->set_mint_token_flow( 153146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OAuth2MintTokenFlow>(new TestOAuth2MintTokenFlow( 153246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()))); 153346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 153446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RunFunctionAsync(func.get(), "[{\"account\": { \"id\": \"2\" } }]"); 153546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 153646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) token_service_->IssueAllTokensForAccount( 153746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "secondary@example.com", 153846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "access_token-secondary@example.com", 153946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Time::Now() + base::TimeDelta::FromSeconds(3600)); 154046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 154146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> value(WaitForSingleResult(func.get())); 154246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string access_token; 154346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 154446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 154546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 154646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GetCachedToken("secondary@example.com").status()); 154746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("access_token-secondary@example.com", func->login_access_token()); 154846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 154946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 155046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(courage): negative cases for secondary accounts 155146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ScopesDefault) { 1553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(extension.get()); 1556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 1559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::Value> value( 1561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser())); 1562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string access_token; 1563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ExtensionTokenKey* token_key = func->extension_token_key(); 1567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(2ul, token_key->scopes.size()); 1568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "scope1")); 1569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "scope2")); 1570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ScopesEmpty) { 1573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(extension.get()); 1576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string error(utils::RunFunctionAndReturnError( 1578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func.get(), "[{\"scopes\": []}]", browser())); 1579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(errors::kInvalidScopes, error); 1581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ScopesEmail) { 1584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(extension.get()); 1587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 1590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func.get(), "[{\"scopes\": [\"email\"]}]", browser())); 1593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string access_token; 1594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ExtensionTokenKey* token_key = func->extension_token_key(); 1598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1ul, token_key->scopes.size()); 1599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "email")); 1600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, ScopesEmailFooBar) { 1603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); 1604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES)); 1605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func->set_extension(extension.get()); 1606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), HasLoginToken()).WillOnce(Return(true)); 1607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( 1608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS, func.get()); 1609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); 1610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) func.get(), "[{\"scopes\": [\"email\", \"foo\", \"bar\"]}]", browser())); 1612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string access_token; 1613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&access_token)); 1614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(std::string(kAccessToken), access_token); 1615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ExtensionTokenKey* token_key = func->extension_token_key(); 1617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(3ul, token_key->scopes.size()); 1618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "email")); 1619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "foo")); 1620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(ContainsKey(token_key->scopes, "bar")); 1621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool InvalidateDefaultToken() { 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityRemoveCachedAuthTokenFunction> func( 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityRemoveCachedAuthTokenFunction); 16287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) func->set_extension(utils::CreateEmptyExtension(kExtensionId).get()); 1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return utils::RunFunction( 1630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) func.get(), 1631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string("[{\"token\": \"") + kAccessToken + "\"}]", 1632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser(), 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_test_utils::NONE); 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityAPI* id_api() { 1637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IdentityAPI::GetFactoryInstance()->Get(browser()->profile()); 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetCachedToken(IdentityTokenCacheValue& token_data) { 1641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey key(extensions::id_util::GenerateId(kExtensionId), 1642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "test@example.com", 1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string>()); 1644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) id_api()->SetCachedToken(key, token_data); 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IdentityTokenCacheValue& GetCachedToken() { 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return id_api()->GetCachedToken( 1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExtensionTokenKey(extensions::id_util::GenerateId(kExtensionId), 1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "test@example.com", 1651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string>())); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NotFound) { 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, Advice) { 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IssueAdviceInfo info; 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue advice(info); 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(advice); 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_ADVICE, 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, NonMatchingToken) { 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token("non_matching_token", 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("non_matching_token", GetCachedToken().token()); 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoveCachedAuthTokenFunctionTest, MatchingToken) { 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IdentityTokenCacheValue token(kAccessToken, 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromSeconds(3600)); 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetCachedToken(token); 1684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN, 1685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetCachedToken().status()); 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(InvalidateDefaultToken()); 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetCachedToken().status()); 1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { 1692b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 1693b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 169446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) AsyncExtensionBrowserTest::SetUpCommandLine(command_line); 1695b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Reduce performance test variance by disabling background networking. 1696b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) command_line->AppendSwitch(switches::kDisableBackgroundNetworking); 1697b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { 1701b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1702b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1703b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1704b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1705b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1706b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1707b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1711b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1712b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) utils::CreateEmptyExtension()); 1713b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->set_extension(empty_extension.get()); 1714b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WaitForGURLAndCloseWindow popup_observer(auth_url); 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1717b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1718b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RunFunctionAsync(function.get(), args); 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1721b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) popup_observer.Wait(); 17227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) popup_observer.CloseEmbedderWebContents(); 1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function.get())); 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { 1728b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1729b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1730b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1731b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1732b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1733b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1734b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/interaction_required.html")); 1735b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1742b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": false, \"url\": \"" + 1743b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string error = 1745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInteractionRequired), error); 1748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, LoadFailed) { 1751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer https_server( 1752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL auth_url(https_server.GetURL("files/five_hundred.html")); 1758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<Extension> empty_extension( 1762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::CreateEmptyExtension()); 1763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function->set_extension(empty_extension.get()); 1764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) auth_url.spec() + "\"}]"; 17677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string error = 17687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) utils::RunFunctionAndReturnError(function.get(), args, browser()); 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(errors::kPageLoadFailure), error); 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { 1774558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1775558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 1778558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 1779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1786b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": false," 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LaunchWebAuthFlowFunctionTest, InteractiveFirstNavigationSuccess) { 1801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 1802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 1803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 1804ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 1806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1813b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( 1815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) function.get(), 1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "[{\"interactive\": true," 1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser())); 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, 1827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISABLED_InteractiveSecondNavigationSuccess) { 1828b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer https_server( 1829b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1830b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1831b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 1832b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) "chrome/test/data/extensions/api_test/identity"))); 1833b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 1834b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL auth_url(https_server.GetURL("files/redirect_to_chromiumapp.html")); 1835b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new IdentityLaunchWebAuthFlowFunction()); 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> empty_extension( 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) utils::CreateEmptyExtension()); 1840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) function->set_extension(empty_extension.get()); 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1842b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) function->InitFinalRedirectURLPrefixForTest("abcdefghij"); 1843b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string args = "[{\"interactive\": true, \"url\": \"" + 1844b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) auth_url.spec() + "\"}]"; 1845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<base::Value> value( 1846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) utils::RunFunctionAndReturnSingleResult(function.get(), args, browser())); 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url; 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&url)); 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 1855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests the chrome.identity API implemented by custom JS bindings . 1857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ChromeIdentityJsBindings) { 1858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("identity/js_bindings")) << message_; 1859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1860