15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A complete set of unit tests for GaiaOAuthClient. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/json/json_reader.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_oauth_client.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_status_code.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/url_request_test_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing ::testing::Eq; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing ::testing::HasSubstr; 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing ::testing::Pointee; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing ::testing::SaveArg; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Responds as though OAuth returned from the server. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockOAuthFetcher : public net::TestURLFetcher { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcher(int response_code, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_failure_count, 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool complete_immediately, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& results, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::RequestType request_type, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcherDelegate* d) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net::TestURLFetcher(0, url, d), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_failure_count_(max_failure_count), 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_failure_count_(0), 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch complete_immediately_(complete_immediately) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_url(url); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_response_code(response_code); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetResponseString(results); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockOAuthFetcher() { } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start() OVERRIDE { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((GetResponseCode() != net::HTTP_OK) && (max_failure_count_ != -1) && 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (current_failure_count_ == max_failure_count_)) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_response_code(net::HTTP_OK); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestStatus::Status code = net::URLRequestStatus::SUCCESS; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetResponseCode() != net::HTTP_OK) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) code = net::URLRequestStatus::FAILED; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_failure_count_++; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_status(net::URLRequestStatus(code, 0)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (complete_immediately_) 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate()->OnURLFetchComplete(this); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Finish() { 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_FALSE(complete_immediately_); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate()->OnURLFetchComplete(this); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_failure_count_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_failure_count_; 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool complete_immediately_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcher); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockOAuthFetcherFactory : public net::URLFetcherFactory, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::ScopedURLFetcherFactory { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory() 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : net::ScopedURLFetcherFactory(this), 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch response_code_(net::HTTP_OK), 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch complete_immediately_(true) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockOAuthFetcherFactory() {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLFetcher* CreateURLFetcher( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLFetcher::RequestType request_type, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLFetcherDelegate* d) OVERRIDE { 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch url_fetcher_ = new MockOAuthFetcher( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_code_, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_failure_count_, 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch complete_immediately_, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_type, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return url_fetcher_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_response_code(int response_code) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_code_ = response_code; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_max_failure_count(int count) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_failure_count_ = count; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_results(const std::string& results) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_ = results; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockOAuthFetcher* get_url_fetcher() { 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return url_fetcher_; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void set_complete_immediately(bool complete_immediately) { 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch complete_immediately_ = complete_immediately; 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockOAuthFetcher* url_fetcher_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int response_code_; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool complete_immediately_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_failure_count_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string results_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockOAuthFetcherFactory); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string kTestAccessToken = "1/fFAGRNJru1FTz70BzhT3Zg"; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string kTestRefreshToken = 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ"; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string kTestUserEmail = "a_user@gmail.com"; 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const std::string kTestUserId = "8675309"; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTestExpiresIn = 3920; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string kDummyGetTokensResult = 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "{\"access_token\":\"" + kTestAccessToken + "\"," 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "," 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"refresh_token\":\"" + kTestRefreshToken + "\"}"; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string kDummyRefreshTokenResult = 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "{\"access_token\":\"" + kTestAccessToken + "\"," 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}"; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst std::string kDummyUserInfoResult = 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "{\"email\":\"" + kTestUserEmail + "\"}"; 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const std::string kDummyUserIdResult = 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "{\"id\":\"" + kTestUserId + "\"}"; 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::string kDummyFullUserInfoResult = 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "{" 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"family_name\": \"Bar\", " 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"name\": \"Foo Bar\", " 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"picture\": \"https://lh4.googleusercontent.com/hash/photo.jpg\", " 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"locale\": \"en\", " 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"gender\": \"male\", " 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"link\": \"https://plus.google.com/+FooBar\", " 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"given_name\": \"Foo\", " 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "\"id\": \"12345678901234567890\"" 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "}"; 1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst std::string kDummyTokenInfoResult = 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "{\"issued_to\": \"1234567890.apps.googleusercontent.com\"," 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "\"audience\": \"1234567890.apps.googleusercontent.com\"," 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "\"scope\": \"https://googleapis.com/oauth2/v2/tokeninfo\"," 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "\"expires_in\":" + base::IntToString(kTestExpiresIn) + "}"; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gaia { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GaiaOAuthClientTest : public testing::Test { 174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch protected: 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetUp() OVERRIDE { 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_info_.client_id = "test_client_id"; 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_info_.client_secret = "test_client_secret"; 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_info_.redirect_uri = "test_redirect_uri"; 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net::TestURLRequestContextGetter* GetRequestContext() { 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!request_context_getter_.get()) { 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch request_context_getter_ = new net::TestURLRequestContextGetter( 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch message_loop_.message_loop_proxy()); 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return request_context_getter_.get(); 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OAuthClientInfo client_info_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGaiaOAuthClientDelegate : public gaia::GaiaOAuthClient::Delegate { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate() {} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockGaiaOAuthClientDelegate() {} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(OnGetTokensResponse, void(const std::string& refresh_token, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expires_in_seconds)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(OnRefreshTokenResponse, void(const std::string& access_token, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expires_in_seconds)); 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MOCK_METHOD1(OnGetUserEmailResponse, void(const std::string& user_email)); 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MOCK_METHOD1(OnGetUserIdResponse, void(const std::string& user_id)); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnOAuthError, void()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnNetworkError, void(int response_code)); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // gMock doesn't like methods that take or return scoped_ptr. A 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // work-around is to create a mock method that takes a raw ptr, and 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // override the problematic method to call through to it. 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/01sDxsJ1OYw/I_S0xCBRF2oJ 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOCK_METHOD1(OnGetUserInfoResponsePtr, 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void(const base::DictionaryValue* user_info)); 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnGetUserInfoResponse( 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::DictionaryValue> user_info) OVERRIDE { 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_info_.reset(user_info.release()); 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OnGetUserInfoResponsePtr(user_info_.get()); 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MOCK_METHOD1(OnGetTokenInfoResponsePtr, 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void(const base::DictionaryValue* token_info)); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnGetTokenInfoResponse( 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> token_info) OVERRIDE { 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch token_info_.reset(token_info.release()); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnGetTokenInfoResponsePtr(token_info_.get()); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::DictionaryValue> user_info_; 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> token_info_; 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(MockGaiaOAuthClientDelegate); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, NetworkFailure) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int response_code = net::HTTP_INTERNAL_SERVER_ERROR; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate, OnNetworkError(response_code)) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_response_code(response_code); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_max_failure_count(4); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetTokensFromAuthCode(client_info_, "auth_code", 2, &delegate); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, NetworkFailureRecover) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int response_code = net::HTTP_INTERNAL_SERVER_ERROR; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestExpiresIn)).Times(1); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_response_code(response_code); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_max_failure_count(4); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_results(kDummyGetTokensResult); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, OAuthFailure) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int response_code = net::HTTP_BAD_REQUEST; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate, OnOAuthError()).Times(1); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_response_code(response_code); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_max_failure_count(-1); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_results(kDummyGetTokensResult); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, GetTokensSuccess) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate, OnGetTokensResponse(kTestRefreshToken, kTestAccessToken, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestExpiresIn)).Times(1); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_results(kDummyGetTokensResult); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetTokensFromAuthCode(client_info_, "auth_code", -1, &delegate); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, RefreshTokenSuccess) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestExpiresIn)).Times(1); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_results(kDummyRefreshTokenResult); 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.set_complete_immediately(false); 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.RefreshToken(client_info_, "refresh_token", std::vector<std::string>(), 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch -1, &delegate); 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_THAT(factory.get_url_fetcher()->upload_data(), 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Not(HasSubstr("scope"))); 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.get_url_fetcher()->Finish(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GaiaOAuthClientTest, RefreshTokenDownscopingSuccess) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(delegate, OnRefreshTokenResponse(kTestAccessToken, 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kTestExpiresIn)).Times(1); 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockOAuthFetcherFactory factory; 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.set_results(kDummyRefreshTokenResult); 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.set_complete_immediately(false); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.RefreshToken(client_info_, "refresh_token", 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string>(1, "scope4test"), -1, &delegate); 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_THAT(factory.get_url_fetcher()->upload_data(), 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HasSubstr("&scope=scope4test")); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.get_url_fetcher()->Finish(); 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 329116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GaiaOAuthClientTest, GetUserEmail) { 3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockGaiaOAuthClientDelegate delegate; 3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(delegate, OnGetUserEmailResponse(kTestUserEmail)).Times(1); 3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockOAuthFetcherFactory factory; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory.set_results(kDummyUserInfoResult); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetUserEmail("access_token", 1, &delegate); 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(GaiaOAuthClientTest, GetUserId) { 3418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 3428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_CALL(delegate, OnGetUserIdResponse(kTestUserId)).Times(1); 3438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockOAuthFetcherFactory factory; 3458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) factory.set_results(kDummyUserIdResult); 3468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GaiaOAuthClient auth(GetRequestContext()); 3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) auth.GetUserId("access_token", 1, &delegate); 3498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(GaiaOAuthClientTest, GetUserInfo) { 3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const base::DictionaryValue* captured_result; 3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MockGaiaOAuthClientDelegate delegate; 3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_CALL(delegate, OnGetUserInfoResponsePtr(_)) 3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .WillOnce(SaveArg<0>(&captured_result)); 3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MockOAuthFetcherFactory factory; 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) factory.set_results(kDummyFullUserInfoResult); 3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GaiaOAuthClient auth(GetRequestContext()); 3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) auth.GetUserInfo("access_token", 1, &delegate); 3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::Value> value( 3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::JSONReader::Read(kDummyFullUserInfoResult)); 3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(value); 3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(value->IsType(base::Value::TYPE_DICTIONARY)); 3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::DictionaryValue* expected_result; 3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) value->GetAsDictionary(&expected_result); 3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(expected_result->Equals(captured_result)); 3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GaiaOAuthClientTest, GetTokenInfo) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* captured_result; 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockGaiaOAuthClientDelegate delegate; 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(delegate, OnGetTokenInfoResponsePtr(_)) 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch .WillOnce(SaveArg<0>(&captured_result)); 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockOAuthFetcherFactory factory; 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch factory.set_results(kDummyTokenInfoResult); 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GaiaOAuthClient auth(GetRequestContext()); 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch auth.GetTokenInfo("access_token", 1, &delegate); 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string issued_to; 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(captured_result->GetString("issued_to", &issued_to)); 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ("1234567890.apps.googleusercontent.com", issued_to); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gaia 393