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