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/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