Home | History | Annotate | Download | only in invalidation
      1 // Copyright 2014 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 "components/invalidation/non_blocking_invalidator.h"
      6 
      7 #include "base/bind_helpers.h"
      8 #include "base/memory/ref_counted.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/message_loop/message_loop.h"
     11 #include "base/run_loop.h"
     12 #include "base/threading/thread.h"
     13 #include "components/invalidation/fake_invalidation_handler.h"
     14 #include "components/invalidation/invalidator_test_template.h"
     15 #include "google/cacheinvalidation/types.pb.h"
     16 #include "jingle/notifier/base/fake_base_task.h"
     17 #include "net/url_request/url_request_test_util.h"
     18 #include "sync/notifier/invalidation_state_tracker.h"
     19 #include "testing/gtest/include/gtest/gtest.h"
     20 
     21 namespace syncer {
     22 
     23 class NonBlockingInvalidatorTestDelegate {
     24  public:
     25   NonBlockingInvalidatorTestDelegate() : io_thread_("IO thread") {}
     26 
     27   ~NonBlockingInvalidatorTestDelegate() {
     28     DestroyInvalidator();
     29   }
     30 
     31   void CreateInvalidator(
     32       const std::string& invalidator_client_id,
     33       const std::string& initial_state,
     34       const base::WeakPtr<InvalidationStateTracker>&
     35           invalidation_state_tracker) {
     36     DCHECK(!invalidator_.get());
     37     base::Thread::Options options;
     38     options.message_loop_type = base::MessageLoop::TYPE_IO;
     39     io_thread_.StartWithOptions(options);
     40     request_context_getter_ =
     41         new net::TestURLRequestContextGetter(io_thread_.message_loop_proxy());
     42     notifier::NotifierOptions notifier_options;
     43     notifier_options.request_context_getter = request_context_getter_;
     44     NetworkChannelCreator network_channel_creator =
     45         NonBlockingInvalidator::MakePushClientChannelCreator(notifier_options);
     46     invalidator_.reset(
     47         new NonBlockingInvalidator(
     48             network_channel_creator,
     49             invalidator_client_id,
     50             UnackedInvalidationsMap(),
     51             initial_state,
     52             invalidation_state_tracker.get(),
     53             "fake_client_info",
     54             request_context_getter_));
     55   }
     56 
     57   Invalidator* GetInvalidator() {
     58     return invalidator_.get();
     59   }
     60 
     61   void DestroyInvalidator() {
     62     invalidator_.reset();
     63     request_context_getter_ = NULL;
     64     io_thread_.Stop();
     65     message_loop_.RunUntilIdle();
     66   }
     67 
     68   void WaitForInvalidator() {
     69     base::RunLoop run_loop;
     70     ASSERT_TRUE(
     71         io_thread_.message_loop_proxy()->PostTaskAndReply(
     72             FROM_HERE,
     73             base::Bind(&base::DoNothing),
     74             run_loop.QuitClosure()));
     75     run_loop.Run();
     76   }
     77 
     78   void TriggerOnInvalidatorStateChange(InvalidatorState state) {
     79     invalidator_->OnInvalidatorStateChange(state);
     80   }
     81 
     82   void TriggerOnIncomingInvalidation(
     83       const ObjectIdInvalidationMap& invalidation_map) {
     84     invalidator_->OnIncomingInvalidation(invalidation_map);
     85   }
     86 
     87  private:
     88   base::MessageLoop message_loop_;
     89   base::Thread io_thread_;
     90   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
     91   scoped_ptr<NonBlockingInvalidator> invalidator_;
     92 };
     93 
     94 INSTANTIATE_TYPED_TEST_CASE_P(
     95     NonBlockingInvalidatorTest, InvalidatorTest,
     96     NonBlockingInvalidatorTestDelegate);
     97 
     98 }  // namespace syncer
     99