gaia_oauth_client_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Use of this source code is governed by a BSD-style license that can be
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// found in the LICENSE file.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// A complete set of unit tests for GaiaOAuthClient.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string>
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <vector>
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "base/strings/string_number_conversions.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "base/values.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "google_apis/gaia/gaia_oauth_client.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "net/base/net_errors.h"
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "net/http/http_status_code.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "net/url_request/test_url_fetcher_factory.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "net/url_request/url_fetcher_delegate.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "net/url_request/url_request_status.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "net/url_request/url_request_test_util.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testing/gmock/include/gmock/gmock.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testing/gtest/include/gtest/gtest.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "url/gurl.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing ::testing::_;
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing ::testing::Eq;
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing ::testing::HasSubstr;
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing ::testing::Pointee;
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing ::testing::SaveArg;
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace {
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Responds as though OAuth returned from the server.
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MockOAuthFetcher : public net::TestURLFetcher {
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public:
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcher(int response_code,
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   int max_failure_count,
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   bool complete_immediately,
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const GURL& url,
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const std::string& results,
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   net::URLFetcher::RequestType request_type,
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   net::URLFetcherDelegate* d)
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      : net::TestURLFetcher(0, url, d),
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        max_failure_count_(max_failure_count),
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        current_failure_count_(0),
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        complete_immediately_(complete_immediately) {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    set_url(url);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    set_response_code(response_code);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SetResponseString(results);
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual ~MockOAuthFetcher() { }
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void Start() OVERRIDE {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((GetResponseCode() != net::HTTP_OK) && (max_failure_count_ != -1) &&
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (current_failure_count_ == max_failure_count_)) {
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      set_response_code(net::HTTP_OK);
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    net::URLRequestStatus::Status code = net::URLRequestStatus::SUCCESS;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (GetResponseCode() != net::HTTP_OK) {
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      code = net::URLRequestStatus::FAILED;
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      current_failure_count_++;
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    set_status(net::URLRequestStatus(code, 0));
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (complete_immediately_)
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delegate()->OnURLFetchComplete(this);
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void Finish() {
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ASSERT_FALSE(complete_immediately_);
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delegate()->OnURLFetchComplete(this);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru private:
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int max_failure_count_;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int current_failure_count_;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  bool complete_immediately_;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher);
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MockOAuthFetcherFactory : public net::URLFetcherFactory,
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                public net::ScopedURLFetcherFactory {
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public:
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory()
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      : net::ScopedURLFetcherFactory(this),
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        response_code_(net::HTTP_OK),
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        complete_immediately_(true) {
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual ~MockOAuthFetcherFactory() {}
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual net::URLFetcher* CreateURLFetcher(
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      int id,
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      const GURL& url,
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      net::URLFetcher::RequestType request_type,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      net::URLFetcherDelegate* d) OVERRIDE {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    url_fetcher_ = new MockOAuthFetcher(
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        response_code_,
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        max_failure_count_,
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        complete_immediately_,
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        url,
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        results_,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        request_type,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return url_fetcher_;
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void set_response_code(int response_code) {
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    response_code_ = response_code;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void set_max_failure_count(int count) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    max_failure_count_ = count;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void set_results(const std::string& results) {
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    results_ = results;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcher* get_url_fetcher() {
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return url_fetcher_;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  void set_complete_immediately(bool complete_immediately) {
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    complete_immediately_ = complete_immediately;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru private:
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcher* url_fetcher_;
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int response_code_;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  bool complete_immediately_;
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int max_failure_count_;
12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  std::string results_;
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kTestAccessToken = "1/fFAGRNJru1FTz70BzhT3Zg";
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kTestRefreshToken =
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ";
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kTestUserEmail = "a_user@gmail.com";
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kTestUserId = "8675309";
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int kTestExpiresIn = 3920;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kDummyGetTokensResult =
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "{\"access_token\":\"" + kTestAccessToken + "\","
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\"expires_in\":" + base::IntToString(kTestExpiresIn) + ","
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\"refresh_token\":\"" + kTestRefreshToken + "\"}";
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kDummyRefreshTokenResult =
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "{\"access_token\":\"" + kTestAccessToken + "\","
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}";
144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst std::string kDummyUserInfoResult =
146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  "{\"email\":\"" + kTestUserEmail + "\"}";
147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst std::string kDummyUserIdResult =
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "{\"id\":\"" + kTestUserId + "\"}";
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst std::string kDummyTokenInfoResult =
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "{\"issued_to\": \"1234567890.apps.googleusercontent.com\","
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\"audience\": \"1234567890.apps.googleusercontent.com\","
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\"scope\": \"https://googleapis.com/oauth2/v2/tokeninfo\","
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}";
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace gaia {
159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass GaiaOAuthClientTest : public testing::Test {
161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru protected:
162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void SetUp() OVERRIDE {
163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    client_info_.client_id = "test_client_id";
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    client_info_.client_secret = "test_client_secret";
165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    client_info_.redirect_uri = "test_redirect_uri";
166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  };
16727f654740f2a26ad62a5c155af9199af9e69b889claireho
168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru protected:
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  net::TestURLRequestContextGetter* GetRequestContext() {
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (!request_context_getter_) {
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      request_context_getter_ = new net::TestURLRequestContextGetter(
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          message_loop_.message_loop_proxy());
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return request_context_getter_;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  base::MessageLoop message_loop_;
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  OAuthClientInfo client_info_;
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate {
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public:
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate() {}
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ~MockGaiaOAuthClientDelegate() {}
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD3(OnGetTokensResponse, void(const std::string& refresh_token,
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                         const std::string& access_token,
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                         int expires_in_seconds));
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD2(OnRefreshTokenResponse, void(const std::string& access_token,
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            int expires_in_seconds));
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD1(OnGetUserEmailResponse, void(const std::string& user_email));
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD1(OnGetUserIdResponse, void(const std::string& user_id));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD0(OnOAuthError, void());
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD1(OnNetworkError, void(int response_code));
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // gMock doesn't like methods that take or return scoped_ptr.  A
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // work-around is to create a mock method that takes a raw ptr, and
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // override the problematic method to call through to it.
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/01sDxsJ1OYw/I_S0xCBRF2oJ
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MOCK_METHOD1(OnGetTokenInfoResponsePtr,
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               void(const base::DictionaryValue* token_info));
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  virtual void OnGetTokenInfoResponse(
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      scoped_ptr<base::DictionaryValue> token_info) OVERRIDE {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    token_info_.reset(token_info.release());
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    OnGetTokenInfoResponsePtr(token_info_.get());
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru private:
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  scoped_ptr<base::DictionaryValue> token_info_;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DISALLOW_COPY_AND_ASSIGN(MockGaiaOAuthClientDelegate);
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, NetworkFailure) {
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int response_code = net::HTTP_INTERNAL_SERVER_ERROR;
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnNetworkError(response_code))
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      .Times(1);
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_response_code(response_code);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_max_failure_count(4);
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetTokensFromAuthCode(client_info_, "auth_code", 2, &delegate);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, NetworkFailureRecover) {
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int response_code = net::HTTP_INTERNAL_SERVER_ERROR;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken,
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      kTestExpiresIn)).Times(1);
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_response_code(response_code);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_max_failure_count(4);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyGetTokensResult);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, OAuthFailure) {
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int response_code = net::HTTP_BAD_REQUEST;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnOAuthError()).Times(1);
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_response_code(response_code);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_max_failure_count(-1);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyGetTokensResult);
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, GetTokensSuccess) {
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken,
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      kTestExpiresIn)).Times(1);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyGetTokensResult);
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate);
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) {
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken,
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      kTestExpiresIn)).Times(1);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyRefreshTokenResult);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_complete_immediately(false);
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.RefreshToken(client_info_, "refresh_token", std::vector<std::string>(),
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    -1, &delegate);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_THAT(factory.get_url_fetcher()->upload_data(),
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              Not(HasSubstr("scope")));
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.get_url_fetcher()->Finish();
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, RefreshTokenDownscopingSuccess) {
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken,
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      kTestExpiresIn)).Times(1);
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyRefreshTokenResult);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_complete_immediately(false);
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.RefreshToken(client_info_, "refresh_token",
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    std::vector<std::string>(1, "scope4test"), -1, &delegate);
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_THAT(factory.get_url_fetcher()->upload_data(),
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              HasSubstr("&scope=scope4test"));
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.get_url_fetcher()->Finish();
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, GetUserEmail) {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnGetUserEmailResponse(kTestUserEmail)).Times(1);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyUserInfoResult);
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetUserEmail("access_token", 1, &delegate);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, GetUserId) {
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnGetUserIdResponse(kTestUserId)).Times(1);
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyUserIdResult);
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetUserId("access_token", 1, &delegate);
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTEST_F(GaiaOAuthClientTest, GetTokenInfo) {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const base::DictionaryValue* captured_result;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockGaiaOAuthClientDelegate delegate;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  EXPECT_CALL(delegate, OnGetTokenInfoResponsePtr(_))
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      .WillOnce(SaveArg<0>(&captured_result));
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  MockOAuthFetcherFactory factory;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  factory.set_results(kDummyTokenInfoResult);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GaiaOAuthClient auth(GetRequestContext());
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  auth.GetTokenInfo("access_token", 1, &delegate);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  std::string issued_to;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_TRUE(captured_result->GetString("issued_to",  &issued_to));
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_EQ("1234567890.apps.googleusercontent.com", issued_to);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}  // namespace gaia
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru