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/invalidation_notifier.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/message_loop/message_loop.h" 9 #include "components/invalidation/fake_invalidation_handler.h" 10 #include "components/invalidation/fake_invalidation_state_tracker.h" 11 #include "components/invalidation/invalidator_test_template.h" 12 #include "components/invalidation/push_client_channel.h" 13 #include "jingle/notifier/base/fake_base_task.h" 14 #include "jingle/notifier/base/notifier_options.h" 15 #include "jingle/notifier/listener/fake_push_client.h" 16 #include "net/url_request/url_request_test_util.h" 17 #include "sync/internal_api/public/base/model_type.h" 18 #include "sync/internal_api/public/util/weak_handle.h" 19 #include "sync/notifier/invalidation_state_tracker.h" 20 #include "testing/gtest/include/gtest/gtest.h" 21 22 namespace syncer { 23 24 namespace { 25 26 class InvalidationNotifierTestDelegate { 27 public: InvalidationNotifierTestDelegate()28 InvalidationNotifierTestDelegate() {} 29 ~InvalidationNotifierTestDelegate()30 ~InvalidationNotifierTestDelegate() { 31 DestroyInvalidator(); 32 } 33 CreateInvalidator(const std::string & invalidator_client_id,const std::string & initial_state,const base::WeakPtr<InvalidationStateTracker> & invalidation_state_tracker)34 void CreateInvalidator( 35 const std::string& invalidator_client_id, 36 const std::string& initial_state, 37 const base::WeakPtr<InvalidationStateTracker>& 38 invalidation_state_tracker) { 39 DCHECK(!invalidator_.get()); 40 scoped_ptr<notifier::PushClient> push_client( 41 new notifier::FakePushClient()); 42 scoped_ptr<SyncNetworkChannel> network_channel( 43 new PushClientChannel(push_client.Pass())); 44 invalidator_.reset( 45 new InvalidationNotifier( 46 network_channel.Pass(), 47 invalidator_client_id, 48 UnackedInvalidationsMap(), 49 initial_state, 50 MakeWeakHandle(invalidation_state_tracker), 51 "fake_client_info")); 52 } 53 GetInvalidator()54 Invalidator* GetInvalidator() { 55 return invalidator_.get(); 56 } 57 DestroyInvalidator()58 void DestroyInvalidator() { 59 // Stopping the invalidation notifier stops its scheduler, which deletes 60 // any pending tasks without running them. Some tasks "run and delete" 61 // another task, so they must be run in order to avoid leaking the inner 62 // task. Stopping does not schedule any tasks, so it's both necessary and 63 // sufficient to drain the task queue before stopping the notifier. 64 message_loop_.RunUntilIdle(); 65 invalidator_.reset(); 66 } 67 WaitForInvalidator()68 void WaitForInvalidator() { 69 message_loop_.RunUntilIdle(); 70 } 71 TriggerOnInvalidatorStateChange(InvalidatorState state)72 void TriggerOnInvalidatorStateChange(InvalidatorState state) { 73 invalidator_->OnInvalidatorStateChange(state); 74 } 75 TriggerOnIncomingInvalidation(const ObjectIdInvalidationMap & invalidation_map)76 void TriggerOnIncomingInvalidation( 77 const ObjectIdInvalidationMap& invalidation_map) { 78 invalidator_->OnInvalidate(invalidation_map); 79 } 80 81 private: 82 base::MessageLoop message_loop_; 83 scoped_ptr<InvalidationNotifier> invalidator_; 84 }; 85 86 INSTANTIATE_TYPED_TEST_CASE_P( 87 InvalidationNotifierTest, InvalidatorTest, 88 InvalidationNotifierTestDelegate); 89 90 } // namespace 91 92 } // namespace syncer 93