1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "components/invalidation/ticl_invalidation_service.h" 6 7#include "base/bind.h" 8#include "base/files/file_path.h" 9#include "base/memory/weak_ptr.h" 10#include "components/gcm_driver/fake_gcm_driver.h" 11#include "components/gcm_driver/gcm_driver.h" 12#include "components/invalidation/fake_invalidation_state_tracker.h" 13#include "components/invalidation/fake_invalidator.h" 14#include "components/invalidation/gcm_invalidation_bridge.h" 15#include "components/invalidation/invalidation_service_test_template.h" 16#include "components/invalidation/invalidation_state_tracker.h" 17#include "components/invalidation/invalidator.h" 18#include "google_apis/gaia/fake_identity_provider.h" 19#include "google_apis/gaia/fake_oauth2_token_service.h" 20#include "net/url_request/url_request_context_getter.h" 21#include "testing/gtest/include/gtest/gtest.h" 22 23namespace invalidation { 24 25namespace { 26 27class FakeTiclSettingsProvider : public TiclSettingsProvider { 28 public: 29 FakeTiclSettingsProvider(); 30 virtual ~FakeTiclSettingsProvider(); 31 32 // TiclSettingsProvider: 33 virtual bool UseGCMChannel() const OVERRIDE; 34 35 private: 36 DISALLOW_COPY_AND_ASSIGN(FakeTiclSettingsProvider); 37}; 38 39FakeTiclSettingsProvider::FakeTiclSettingsProvider() { 40} 41 42FakeTiclSettingsProvider::~FakeTiclSettingsProvider() { 43} 44 45bool FakeTiclSettingsProvider::UseGCMChannel() const { 46 return false; 47} 48 49} // namespace 50 51class TiclInvalidationServiceTestDelegate { 52 public: 53 TiclInvalidationServiceTestDelegate() {} 54 55 ~TiclInvalidationServiceTestDelegate() { 56 } 57 58 void CreateInvalidationService() { 59 CreateUninitializedInvalidationService(); 60 InitializeInvalidationService(); 61 } 62 63 void CreateUninitializedInvalidationService() { 64 gcm_driver_.reset(new gcm::FakeGCMDriver()); 65 invalidation_service_.reset(new TiclInvalidationService( 66 "TestUserAgent", 67 scoped_ptr<IdentityProvider>(new FakeIdentityProvider(&token_service_)), 68 scoped_ptr<TiclSettingsProvider>(new FakeTiclSettingsProvider), 69 gcm_driver_.get(), 70 NULL)); 71 } 72 73 void InitializeInvalidationService() { 74 fake_invalidator_ = new syncer::FakeInvalidator(); 75 invalidation_service_->InitForTest( 76 scoped_ptr<syncer::InvalidationStateTracker>( 77 new syncer::FakeInvalidationStateTracker), 78 fake_invalidator_); 79 } 80 81 InvalidationService* GetInvalidationService() { 82 return invalidation_service_.get(); 83 } 84 85 void DestroyInvalidationService() { 86 invalidation_service_.reset(); 87 } 88 89 void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) { 90 fake_invalidator_->EmitOnInvalidatorStateChange(state); 91 } 92 93 void TriggerOnIncomingInvalidation( 94 const syncer::ObjectIdInvalidationMap& invalidation_map) { 95 fake_invalidator_->EmitOnIncomingInvalidation(invalidation_map); 96 } 97 98 FakeOAuth2TokenService token_service_; 99 scoped_ptr<gcm::GCMDriver> gcm_driver_; 100 syncer::FakeInvalidator* fake_invalidator_; // Owned by the service. 101 102 scoped_ptr<TiclInvalidationService> invalidation_service_; 103}; 104 105INSTANTIATE_TYPED_TEST_CASE_P( 106 TiclInvalidationServiceTest, InvalidationServiceTest, 107 TiclInvalidationServiceTestDelegate); 108 109namespace internal { 110 111class FakeCallbackContainer { 112 public: 113 FakeCallbackContainer() : called_(false), 114 weak_ptr_factory_(this) {} 115 116 void FakeCallback(const base::DictionaryValue& value) { 117 called_ = true; 118 } 119 120 bool called_; 121 base::WeakPtrFactory<FakeCallbackContainer> weak_ptr_factory_; 122}; 123 124} // namespace internal 125 126// Test that requesting for detailed status doesn't crash even if the 127// underlying invalidator is not initialized. 128TEST(TiclInvalidationServiceLoggingTest, DetailedStatusCallbacksWork) { 129 scoped_ptr<TiclInvalidationServiceTestDelegate> delegate ( 130 new TiclInvalidationServiceTestDelegate()); 131 132 delegate->CreateUninitializedInvalidationService(); 133 invalidation::InvalidationService* const invalidator = 134 delegate->GetInvalidationService(); 135 136 internal::FakeCallbackContainer fake_container; 137 invalidator->RequestDetailedStatus( 138 base::Bind(&internal::FakeCallbackContainer::FakeCallback, 139 fake_container.weak_ptr_factory_.GetWeakPtr())); 140 EXPECT_FALSE(fake_container.called_); 141 142 delegate->InitializeInvalidationService(); 143 144 invalidator->RequestDetailedStatus( 145 base::Bind(&internal::FakeCallbackContainer::FakeCallback, 146 fake_container.weak_ptr_factory_.GetWeakPtr())); 147 EXPECT_TRUE(fake_container.called_); 148} 149 150} // namespace invalidation 151