15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/run_loop.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync/profile_sync_auth_provider.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/test/base/testing_profile.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/signin/core/browser/profile_oauth2_token_service.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/test_browser_thread_bundle.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/gaia_constants.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/google_service_auth_error.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kAccountId[] = "account.id"; 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ProfileSyncAuthProviderTest : public ::testing::Test { 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ProfileSyncAuthProviderTest() {} 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~ProfileSyncAuthProviderTest() {} 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetUp() OVERRIDE { 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TestingProfile::Builder builder; 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(), 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &BuildAutoIssuingFakeProfileOAuth2TokenService); 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profile_ = builder.Build(); 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FakeProfileOAuth2TokenService* token_service = 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (FakeProfileOAuth2TokenService*) 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get()); 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu token_service->IssueRefreshTokenForUser(kAccountId, "fake_refresh_token"); 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_frontend_.reset(new ProfileSyncAuthProvider( 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu token_service, kAccountId, GaiaConstants::kChromeSyncOAuth2Scope)); 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_backend_ = 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_frontend_->CreateProviderForSyncThread().Pass(); 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void RequestTokenFinished(const GoogleServiceAuthError& error, 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& token) { 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu issued_tokens_.push_back(token); 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu request_token_errors_.push_back(error); 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected: 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::TestBrowserThreadBundle thread_bundle_; 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<Profile> profile_; 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<ProfileSyncAuthProvider> auth_provider_frontend_; 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<syncer::SyncAuthProvider> auth_provider_backend_; 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::vector<std::string> issued_tokens_; 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::vector<GoogleServiceAuthError> request_token_errors_; 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ProfileSyncAuthProviderTest, RequestToken) { 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Request access token, make sure it gets valid response. 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_backend_->RequestAccessToken( 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&ProfileSyncAuthProviderTest::RequestTokenFinished, 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this))); 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::RunLoop run_loop; 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop.RunUntilIdle(); 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(1U, request_token_errors_.size()); 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), request_token_errors_[0]); 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_NE("", issued_tokens_[0]); 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(ProfileSyncAuthProviderTest, RequestTokenTwoConcurrentRequests) { 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Start two requests for access token. One should be reported as canceled, 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the other one should succeed. 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_backend_->RequestAccessToken( 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&ProfileSyncAuthProviderTest::RequestTokenFinished, 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this))); 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu auth_provider_backend_->RequestAccessToken( 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&ProfileSyncAuthProviderTest::RequestTokenFinished, 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this))); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::RunLoop run_loop; 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop.RunUntilIdle(); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(2U, request_token_errors_.size()); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ("", issued_tokens_[0]); 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GoogleServiceAuthError::REQUEST_CANCELED, 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu request_token_errors_[0].state()); 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_NE("", issued_tokens_[1]); 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), request_token_errors_[1]); 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 92