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