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