account_service_flag_fetcher_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string>
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector>
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/message_loop/message_loop.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/string_util.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/signin/core/browser/account_service_flag_fetcher.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request_test_util.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kAccountId[] = "user@gmail.com";
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kDifferentAccountId[] = "some_other_user@gmail.com";
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const int kGaiaAuthFetcherURLFetcherID = 0;
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(treib): This class should really live in components/signin/ next to the
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// AccountServiceFlagFetcher, but it uses the FakePO2TS which lives in
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// chrome/browser/ (because it uses the AndroidPO2TS which depends on stuff from
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// chrome/browser/). So when the AndroidPO2TS is componentized, then this should
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// move as well.
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class AccountServiceFlagFetcherTest : public testing::Test {
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcherTest()
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : request_context_(new net::TestURLRequestContextGetter(
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            base::MessageLoopProxy::current())) {
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    service_flags_.push_back("some_flag");
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    service_flags_.push_back("another_flag");
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    service_flags_.push_back("andonemore");
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MOCK_METHOD2(OnFlagsFetched,
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               void(AccountServiceFlagFetcher::ResultCode result,
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    const std::vector<std::string>& flags));
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected:
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  net::TestURLFetcher* GetLoginURLFetcher() {
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher =
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        url_fetcher_factory_.GetFetcherByID(kGaiaAuthFetcherURLFetcherID);
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_TRUE(fetcher);
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(GaiaUrls::GetInstance()->oauth1_login_url(),
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              fetcher->GetOriginalURL());
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return fetcher;
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  net::TestURLFetcher* GetGetUserInfoURLFetcher() {
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher =
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        url_fetcher_factory_.GetFetcherByID(kGaiaAuthFetcherURLFetcherID);
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_TRUE(fetcher);
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(GaiaUrls::GetInstance()->get_user_info_url(),
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              fetcher->GetOriginalURL());
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return fetcher;
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SendValidLoginResponse() {
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher = GetLoginURLFetcher();
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_status(
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_response_code(net::HTTP_OK);
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->SetResponseString(std::string("SID=sid\nLSID=lsid\nAuth=auth\n"));
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SendFailedLoginResponse() {
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher = GetLoginURLFetcher();
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_status(
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        net::URLRequestStatus(net::URLRequestStatus::CANCELED, 0));
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_response_code(net::HTTP_OK);
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->SetResponseString(std::string());
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SendValidGetUserInfoResponse() {
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher();
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_status(
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_response_code(net::HTTP_OK);
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->SetResponseString(BuildGetUserInfoResponse());
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SendInvalidGetUserInfoResponse() {
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher();
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_status(
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_response_code(net::HTTP_OK);
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->SetResponseString(std::string("allServicesIsMissing=true"));
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void SendFailedGetUserInfoResponse() {
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    net::TestURLFetcher* fetcher = GetGetUserInfoURLFetcher();
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_status(
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        net::URLRequestStatus(net::URLRequestStatus::CANCELED, 0));
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->set_response_code(net::HTTP_OK);
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->SetResponseString(std::string());
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string BuildGetUserInfoResponse() const {
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return "allServices=" + JoinString(service_flags_, ',');
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::MessageLoop message_loop_;
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  FakeProfileOAuth2TokenService token_service_;
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  net::TestURLFetcherFactory url_fetcher_factory_;
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  net::ResponseCookies cookies_;
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<std::string> service_flags_;
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, Success) {
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Since a refresh token is already available, we should immediately get a
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // request for an access token.
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, token_service_.GetPendingRequests().size());
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidLoginResponse();
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SUCCESS,
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    service_flags_));
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidGetUserInfoResponse();
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, SuccessAfterWaitingForRefreshToken) {
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Since there is no refresh token yet, we should not get a request for an
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // access token at this point.
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, token_service_.GetPendingRequests().size());
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Now there is a refresh token and we should have got a request for an
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // access token.
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, token_service_.GetPendingRequests().size());
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidLoginResponse();
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SUCCESS,
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    service_flags_));
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidGetUserInfoResponse();
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, NoRefreshToken) {
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kDifferentAccountId, "refresh_token");
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Credentials for a different user should be ignored, i.e. not result in a
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // request for an access token.
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, token_service_.GetPendingRequests().size());
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // After all refresh tokens have been loaded, there is still no token for our
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // user, so we expect a token error.
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::TOKEN_ERROR,
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    std::vector<std::string>()));
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllRefreshTokensLoaded();
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetTokenFailure) {
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // On failure to get an access token we expect a token error.
21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::TOKEN_ERROR,
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    std::vector<std::string>()));
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueErrorForAllPendingRequestsForAccount(
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, ClientLoginFailure) {
22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Login failure should result in a service error.
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR,
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    std::vector<std::string>()));
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendFailedLoginResponse();
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetUserInfoInvalidResponse) {
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidLoginResponse();
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Invalid response data from GetUserInfo should result in a service error.
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR,
25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    std::vector<std::string>()));
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendInvalidGetUserInfoResponse();
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, GetUserInfoFailure) {
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidLoginResponse();
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Failed GetUserInfo call should result in a service error.
28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(AccountServiceFlagFetcher::SERVICE_ERROR,
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                    std::vector<std::string>()));
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendFailedGetUserInfoResponse();
28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(AccountServiceFlagFetcherTest, DestroyFetcher) {
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.UpdateCredentials(kAccountId, "refresh_token");
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // When the fetcher is destroyed before the request completes, OnFlagsFetched
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // should not be called.
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*this, OnFlagsFetched(testing::_, testing::_)).Times(0);
29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AccountServiceFlagFetcher fetcher(
29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      &token_service_,
29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request_context_.get(),
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(&AccountServiceFlagFetcherTest::OnFlagsFetched,
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 base::Unretained(this)));
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  token_service_.IssueAllTokensForAccount(
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kAccountId,
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "access_token",
30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Time::Now() + base::TimeDelta::FromHours(1));
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendValidLoginResponse();
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Do not send a GetUserInfo response, but make sure the request is there.
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GetGetUserInfoURLFetcher();
30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
309