1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/bind.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_refresh_token_fetcher.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "google_apis/gaia/gaia_oauth_client.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/base/net_errors.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/base/url_util.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/http/http_request_headers.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/http/http_status_code.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAccountId[] = "account_id";
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kDeviceName[] = "Compy";
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSupervisedUserId[] = "abcdef";
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kAccessToken[] = "accesstoken";
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kAuthorizationCode[] = "authorizationcode";
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kSupervisedUserToken[] = "supervisedusertoken";
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kOAuth2RefreshToken[] = "refreshtoken";
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kIssueTokenResponseFormat[] =
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "{"
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "  \"code\": \"%s\""
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "}";
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kGetRefreshTokenResponseFormat[] =
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "{"
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "  \"access_token\": \"<ignored>\","
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "  \"expires_in\": 12345,"
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "  \"refresh_token\": \"%s\""
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    "}";
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Utility methods --------------------------------------------------
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Slightly hacky way to extract a value from a URL-encoded POST request body.
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetValueForKey(const std::string& encoded_string,
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    const std::string& key,
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    std::string* value) {
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url("http://example.com/?" + encoded_string);
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return net::GetValueForKeyInQuery(url, key, value);
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SendResponse(net::TestURLFetcher* url_fetcher,
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  const std::string& response) {
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->set_status(
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->set_response_code(net::HTTP_OK);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->SetResponseString(response);
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SetNetworkError(net::TestURLFetcher* url_fetcher, int error) {
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->set_status(
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      net::URLRequestStatus(net::URLRequestStatus::FAILED, error));
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SetHttpError(net::TestURLFetcher* url_fetcher, int error) {
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->set_status(net::URLRequestStatus());
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->set_response_code(error);
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void VerifyTokenRequest(
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::vector<FakeProfileOAuth2TokenService::PendingRequest> requests) {
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(1u, requests.size());
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1u, requests[0].scopes.size());
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, requests[0].scopes.count(GaiaConstants::kOAuth1LoginScope));
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserRefreshTokenFetcherTest : public testing::Test {
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SupervisedUserRefreshTokenFetcherTest();
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~SupervisedUserRefreshTokenFetcherTest() {}
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void StartFetching();
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::TestURLFetcher* GetIssueTokenRequest();
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::TestURLFetcher* GetRefreshTokenRequest();
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void MakeOAuth2TokenServiceRequestSucceed();
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void MakeOAuth2TokenServiceRequestFail(GoogleServiceAuthError::State error);
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void MakeIssueTokenRequestSucceed();
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void MakeRefreshTokenFetchSucceed();
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Reset();
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GoogleServiceAuthError& error() const { return error_; }
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string& token() const { return token_; }
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OnTokenFetched(const GoogleServiceAuthError& error,
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      const std::string& token);
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestingProfile profile_;
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeProfileOAuth2TokenService oauth2_token_service_;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::TestURLFetcherFactory url_fetcher_factory_;
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<SupervisedUserRefreshTokenFetcher> token_fetcher_;
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GoogleServiceAuthError error_;
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string token_;
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::WeakPtrFactory<SupervisedUserRefreshTokenFetcherTest> weak_ptr_factory_;
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserRefreshTokenFetcherTest::SupervisedUserRefreshTokenFetcherTest()
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : token_fetcher_(SupervisedUserRefreshTokenFetcher::Create(
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         &oauth2_token_service_,
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         kAccountId,
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         profile_.GetRequestContext())),
129a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      error_(GoogleServiceAuthError::NONE),
130a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      weak_ptr_factory_(this) {}
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserRefreshTokenFetcherTest::StartFetching() {
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  oauth2_token_service_.IssueRefreshToken(kOAuth2RefreshToken);
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  token_fetcher_->Start(
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kSupervisedUserId,
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kDeviceName,
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          &SupervisedUserRefreshTokenFetcherTest::OnTokenFetched,
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          weak_ptr_factory_.GetWeakPtr()));
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)net::TestURLFetcher*
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserRefreshTokenFetcherTest::GetIssueTokenRequest() {
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(1);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!url_fetcher)
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GaiaUrls::GetInstance()->oauth2_issue_token_url(),
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            url_fetcher->GetOriginalURL());
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string access_token;
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::HttpRequestHeaders headers;
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  url_fetcher->GetExtraRequestHeaders(&headers);
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(headers.GetHeader("Authorization", &access_token));
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string("Bearer ") + kAccessToken, access_token);
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string upload_data = url_fetcher->upload_data();
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string supervised_user_id;
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(GetValueForKey(upload_data, "profile_id", &supervised_user_id));
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kSupervisedUserId, supervised_user_id);
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string device_name;
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetValueForKey(upload_data, "device_name", &device_name));
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kDeviceName, device_name);
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return url_fetcher;
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)net::TestURLFetcher*
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserRefreshTokenFetcherTest::GetRefreshTokenRequest() {
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      gaia::GaiaOAuthClient::kUrlFetcherId);
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!url_fetcher)
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GaiaUrls::GetInstance()->oauth2_token_url(),
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            url_fetcher->GetOriginalURL());
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string auth_code;
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetValueForKey(url_fetcher->upload_data(), "code", &auth_code));
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kAuthorizationCode, auth_code);
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return url_fetcher;
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserRefreshTokenFetcherTest::MakeOAuth2TokenServiceRequestSucceed() {
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<FakeProfileOAuth2TokenService::PendingRequest> requests =
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      oauth2_token_service_.GetPendingRequests();
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VerifyTokenRequest(requests);
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::Time expiration_date = base::Time::Now() +
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               base::TimeDelta::FromHours(1);
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  oauth2_token_service_.IssueTokenForScope(requests[0].scopes,
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           kAccessToken,
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           expiration_date);
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserRefreshTokenFetcherTest::MakeOAuth2TokenServiceRequestFail(
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GoogleServiceAuthError::State error) {
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<FakeProfileOAuth2TokenService::PendingRequest> requests =
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      oauth2_token_service_.GetPendingRequests();
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VerifyTokenRequest(requests);
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  oauth2_token_service_.IssueErrorForScope(requests[0].scopes,
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           GoogleServiceAuthError(error));
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserRefreshTokenFetcherTest::MakeIssueTokenRequestSucceed() {
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(GetIssueTokenRequest(),
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               base::StringPrintf(kIssueTokenResponseFormat,
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  kAuthorizationCode));
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserRefreshTokenFetcherTest::MakeRefreshTokenFetchSucceed() {
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(GetRefreshTokenRequest(),
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               base::StringPrintf(kGetRefreshTokenResponseFormat,
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  kSupervisedUserToken));
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserRefreshTokenFetcherTest::Reset() {
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  token_fetcher_.reset();
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserRefreshTokenFetcherTest::OnTokenFetched(
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const GoogleServiceAuthError& error,
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& token) {
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  error_ = error;
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  token_ = token;
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Tests --------------------------------------------------------
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, Success) {
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeRefreshTokenFetchSucceed();
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kSupervisedUserToken, token());
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, ExpiredAccessToken) {
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetHttpError(GetIssueTokenRequest(), net::HTTP_UNAUTHORIZED);
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeRefreshTokenFetchSucceed();
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kSupervisedUserToken, token());
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, ExpiredAccessTokenRetry) {
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If we get a 401 error for the second time, we should give up instead of
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // retrying again.
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetHttpError(GetIssueTokenRequest(), net::HTTP_UNAUTHORIZED);
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetHttpError(GetIssueTokenRequest(), net::HTTP_UNAUTHORIZED);
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error().state());
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_FAILED, error().network_error());
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, MalformedIssueTokenResponse) {
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(GetIssueTokenRequest(), "choke");
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error().state());
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_INVALID_RESPONSE, error().network_error());
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, FetchAccessTokenFailure) {
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestFail(
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, error().state());
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, IssueTokenNetworkError) {
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetNetworkError(GetIssueTokenRequest(), net::ERR_SSL_PROTOCOL_ERROR);
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error().state());
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_SSL_PROTOCOL_ERROR, error().network_error());
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, FetchRefreshTokenNetworkError) {
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetNetworkError(GetRefreshTokenRequest(), net::ERR_CONNECTION_REFUSED);
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetNetworkError(GetRefreshTokenRequest(), net::ERR_CONNECTION_REFUSED);
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error().state());
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_FAILED, error().network_error());
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest,
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)       FetchRefreshTokenTransientNetworkError) {
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetNetworkError(GetRefreshTokenRequest(), net::ERR_CONNECTION_REFUSED);
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeRefreshTokenFetchSucceed();
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kSupervisedUserToken, token());
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, FetchRefreshTokenBadRequest) {
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetHttpError(GetRefreshTokenRequest(), net::HTTP_BAD_REQUEST);
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::CONNECTION_FAILED, error().state());
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_FAILED, error().network_error());
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, CancelWhileFetchingAccessToken) {
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Reset();
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, CancelWhileCallingIssueToken) {
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Reset();
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserRefreshTokenFetcherTest, CancelWhileFetchingRefreshToken) {
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  StartFetching();
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MakeOAuth2TokenServiceRequestSucceed();
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MakeIssueTokenRequestSucceed();
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Reset();
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::NONE, error().state());
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(std::string(), token());
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
356