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