gcm_invalidation_bridge_unittest.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/invalidation/gcm_invalidation_bridge.h" 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/invalidation/invalidation_auth_provider.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/services/gcm/gcm_profile_service_factory.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service_wrapper.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/signin/core/profile_oauth2_token_service.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace invalidation { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Implementation of GCMProfileService::Register that always succeeds with the 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// same registrationId. 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class FakeGCMProfileService : public gcm::GCMProfileService { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static KeyedService* Build(content::BrowserContext* context) { 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return new FakeGCMProfileService(profile); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit FakeGCMProfileService(Profile* profile) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : gcm::GCMProfileService(profile) {} 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Register(const std::string& app_id, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<std::string>& sender_ids, 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RegisterCallback callback) OVERRIDE { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostTask( 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind( 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback, std::string("registration.id"), gcm::GCMClient::SUCCESS)); 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeGCMProfileService); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Fake invalidation auth provider implementation. 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class FakeInvalidationAuthProvider : public InvalidationAuthProvider { 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public: 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) explicit FakeInvalidationAuthProvider( 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ProfileOAuth2TokenService* token_service) 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) : token_service_(token_service) {} 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual ~FakeInvalidationAuthProvider() {} 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // InvalidationAuthProvider: 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual OAuth2TokenService* GetTokenService() OVERRIDE { 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return token_service_; 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual std::string GetAccountId() OVERRIDE { return std::string(); } 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual bool ShowLoginUI() OVERRIDE { return false; } 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private: 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) OAuth2TokenService* token_service_; 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeInvalidationAuthProvider); 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GCMInvalidationBridgeTest : public ::testing::Test { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GCMInvalidationBridgeTest() {} 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~GCMInvalidationBridgeTest() {} 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestingProfile::Builder builder; 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) builder.AddTestingFactory( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetInstance(), 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &FakeProfileOAuth2TokenServiceWrapper::BuildAutoIssuingTokenService); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) builder.AddTestingFactory(gcm::GCMProfileServiceFactory::GetInstance(), 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &FakeGCMProfileService::Build); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_ = builder.Build(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeProfileOAuth2TokenService* token_service = 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (FakeProfileOAuth2TokenService*) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get()); 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) token_service->IssueRefreshTokenForUser("", "fake_refresh_token"); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gcm_profile_service_ = 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (FakeGCMProfileService*)gcm::GCMProfileServiceFactory::GetForProfile( 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_.get()); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) auth_provider_.reset(new FakeInvalidationAuthProvider(token_service)); 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bridge_.reset( 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) new GCMInvalidationBridge(gcm_profile_service_, auth_provider_.get())); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_ = bridge_->CreateDelegate(); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->Initialize(); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop run_loop; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) run_loop.RunUntilIdle(); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RegisterFinished(const std::string& registration_id, 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gcm::GCMClient::Result result) { 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) registration_id_ = registration_id; 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestTokenFinished(const GoogleServiceAuthError& error, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& token) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) issued_tokens_.push_back(token); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_token_errors_.push_back(error); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<Profile> profile_; 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FakeGCMProfileService* gcm_profile_service_; 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<FakeInvalidationAuthProvider> auth_provider_; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> issued_tokens_; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<GoogleServiceAuthError> request_token_errors_; 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string registration_id_; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<GCMInvalidationBridge> bridge_; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::GCMNetworkChannelDelegate> delegate_; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GCMInvalidationBridgeTest, RequestToken) { 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure that call to RequestToken reaches OAuth2TokenService and gets 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // back to callback. 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->RequestToken( 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&GCMInvalidationBridgeTest::RequestTokenFinished, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop run_loop; 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop.RunUntilIdle(); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, issued_tokens_.size()); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE("", issued_tokens_[0]); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), request_token_errors_[0]); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GCMInvalidationBridgeTest, RequestTokenTwoConcurrentRequests) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First call should finish with REQUEST_CANCELLED error. 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->RequestToken( 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&GCMInvalidationBridgeTest::RequestTokenFinished, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Second request should succeed. 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->RequestToken( 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&GCMInvalidationBridgeTest::RequestTokenFinished, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop run_loop; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop.RunUntilIdle(); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, issued_tokens_.size()); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("", issued_tokens_[0]); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::REQUEST_CANCELED, 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_token_errors_[0].state()); 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE("", issued_tokens_[1]); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(), request_token_errors_[1]); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GCMInvalidationBridgeTest, Register) { 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(registration_id_.empty()); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->Register(base::Bind(&GCMInvalidationBridgeTest::RegisterFinished, 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this))); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop run_loop; 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) run_loop.RunUntilIdle(); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(registration_id_.empty()); 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace invalidation 173