12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_info_fetcher.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_status_code.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_; 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kUserInfoResponse[] = 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"email\": \"test_user@test.com\"," 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"verified_email\": true," 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " \"hd\": \"test.com\"" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockUserInfoFetcherDelegate : public UserInfoFetcher::Delegate { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockUserInfoFetcherDelegate() {} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~MockUserInfoFetcherDelegate() {} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnGetUserInfoFailure, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(const GoogleServiceAuthError& error)); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD1(OnGetUserInfoSuccess, void(const base::DictionaryValue* result)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MATCHER_P(MatchDict, expected, "matches DictionaryValue") { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return arg->Equals(expected); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UserInfoFetcherTest : public testing::Test { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserInfoFetcherTest() {} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLFetcherFactory url_factory_; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(UserInfoFetcherTest, FailedFetch) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockUserInfoFetcherDelegate delegate; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserInfoFetcher fetcher(&delegate, NULL); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher.Start("access_token"); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake a failed fetch - should result in the failure callback being invoked. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(delegate, OnGetUserInfoFailure(_)); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::TestURLFetcher* url_fetcher = url_factory_.GetFetcherByID(0); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_fetcher->set_status(net::URLRequestStatus( 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestStatus::FAILED, -1)); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(UserInfoFetcherTest, SuccessfulFetch) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockUserInfoFetcherDelegate delegate; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserInfoFetcher fetcher(&delegate, NULL); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher.Start("access_token"); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate what we expect our result will look like (should match 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // parsed kUserInfoResponse). 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("email", "test_user@test.com"); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetBoolean("verified_email", true); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict->SetString("hd", "test.com"); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fake a successful fetch - should result in the data being parsed and 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the values passed off to the success callback. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(delegate, OnGetUserInfoSuccess(MatchDict(dict.get()))); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::TestURLFetcher* url_fetcher = url_factory_.GetFetcherByID(0); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_fetcher->set_response_code(net::HTTP_OK); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_fetcher->SetResponseString(kUserInfoResponse); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace policy 81