146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidation_notifier.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/fake_invalidation_handler.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/fake_invalidation_state_tracker.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_state_tracker.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidator_test_template.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/push_client_channel.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/fake_base_task.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/notifier_options.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/fake_push_client.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InvalidationNotifierTestDelegate { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationNotifierTestDelegate() {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~InvalidationNotifierTestDelegate() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestroyInvalidator(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateInvalidator( 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& invalidator_client_id, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& initial_state, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<InvalidationStateTracker>& 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_state_tracker) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!invalidator_.get()); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<notifier::PushClient> push_client( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new notifier::FakePushClient()); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SyncNetworkChannel> network_channel( 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PushClientChannel(push_client.Pass())); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidator_.reset( 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new InvalidationNotifier(network_channel.Pass(), 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) invalidator_client_id, 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UnackedInvalidationsMap(), 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) initial_state, 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) invalidation_state_tracker, 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::MessageLoopProxy::current(), 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "fake_client_info")); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Invalidator* GetInvalidator() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return invalidator_.get(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyInvalidator() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stopping the invalidation notifier stops its scheduler, which deletes 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any pending tasks without running them. Some tasks "run and delete" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another task, so they must be run in order to avoid leaking the inner 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // task. Stopping does not schedule any tasks, so it's both necessary and 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sufficient to drain the task queue before stopping the notifier. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidator_.reset(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForInvalidator() { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TriggerOnInvalidatorStateChange(InvalidatorState state) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidator_->OnInvalidatorStateChange(state); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TriggerOnIncomingInvalidation( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ObjectIdInvalidationMap& invalidation_map) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidator_->OnInvalidate(invalidation_map); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop message_loop_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InvalidationNotifier> invalidator_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationNotifierTest, InvalidatorTest, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationNotifierTestDelegate); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 91