Home | History | Annotate | Download | only in notifier
      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