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