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