1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file.
4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/ticl_invalidation_service.h"
6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/files/file_path.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/weak_ptr.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/fake_gcm_driver.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_driver.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/fake_invalidation_state_tracker.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/fake_invalidator.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/gcm_invalidation_bridge.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/invalidation/invalidation_service_test_template.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_state_tracker.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidator.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/fake_identity_provider.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/fake_oauth2_token_service.h"
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/url_request/url_request_context_getter.h"
21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
22a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace invalidation {
24a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass FakeTiclSettingsProvider : public TiclSettingsProvider {
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FakeTiclSettingsProvider();
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~FakeTiclSettingsProvider();
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TiclSettingsProvider:
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual bool UseGCMChannel() const OVERRIDE;
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(FakeTiclSettingsProvider);
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuFakeTiclSettingsProvider::FakeTiclSettingsProvider() {
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuFakeTiclSettingsProvider::~FakeTiclSettingsProvider() {
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FakeTiclSettingsProvider::UseGCMChannel() const {
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return false;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class TiclInvalidationServiceTestDelegate {
52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public:
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TiclInvalidationServiceTestDelegate() {}
54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
55a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ~TiclInvalidationServiceTestDelegate() {
56a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
57a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CreateInvalidationService() {
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    CreateUninitializedInvalidationService();
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    InitializeInvalidationService();
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CreateUninitializedInvalidationService() {
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gcm_driver_.reset(new gcm::FakeGCMDriver());
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    invalidation_service_.reset(new TiclInvalidationService(
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "TestUserAgent",
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        scoped_ptr<IdentityProvider>(new FakeIdentityProvider(&token_service_)),
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        scoped_ptr<TiclSettingsProvider>(new FakeTiclSettingsProvider),
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        gcm_driver_.get(),
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NULL));
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void InitializeInvalidationService() {
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    fake_invalidator_ = new syncer::FakeInvalidator();
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    invalidation_service_->InitForTest(
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        scoped_ptr<syncer::InvalidationStateTracker>(
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            new syncer::FakeInvalidationStateTracker),
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        fake_invalidator_);
79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InvalidationService* GetInvalidationService() {
82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return invalidation_service_.get();
83a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
84a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void DestroyInvalidationService() {
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    invalidation_service_.reset();
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) {
90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    fake_invalidator_->EmitOnInvalidatorStateChange(state);
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void TriggerOnIncomingInvalidation(
94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const syncer::ObjectIdInvalidationMap& invalidation_map) {
95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    fake_invalidator_->EmitOnIncomingInvalidation(invalidation_map);
96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FakeOAuth2TokenService token_service_;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<gcm::GCMDriver> gcm_driver_;
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  syncer::FakeInvalidator* fake_invalidator_;  // Owned by the service.
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<TiclInvalidationService> invalidation_service_;
103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P(
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TiclInvalidationServiceTest, InvalidationServiceTest,
107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    TiclInvalidationServiceTestDelegate);
108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace internal {
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass FakeCallbackContainer {
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  public:
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FakeCallbackContainer() : called_(false),
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                              weak_ptr_factory_(this) {}
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    void FakeCallback(const base::DictionaryValue& value) {
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      called_ = true;
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool called_;
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::WeakPtrFactory<FakeCallbackContainer> weak_ptr_factory_;
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace internal
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that requesting for detailed status doesn't crash even if the
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// underlying invalidator is not initialized.
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(TiclInvalidationServiceLoggingTest, DetailedStatusCallbacksWork) {
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<TiclInvalidationServiceTestDelegate> delegate (
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new TiclInvalidationServiceTestDelegate());
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delegate->CreateUninitializedInvalidationService();
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  invalidation::InvalidationService* const invalidator =
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      delegate->GetInvalidationService();
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  internal::FakeCallbackContainer fake_container;
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  invalidator->RequestDetailedStatus(
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&internal::FakeCallbackContainer::FakeCallback,
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 fake_container.weak_ptr_factory_.GetWeakPtr()));
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(fake_container.called_);
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  delegate->InitializeInvalidationService();
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  invalidator->RequestDetailedStatus(
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::Bind(&internal::FakeCallbackContainer::FakeCallback,
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 fake_container.weak_ptr_factory_.GetWeakPtr()));
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(fake_container.called_);
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}  // namespace invalidation
151