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