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/non_blocking_invalidator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/fake_invalidation_handler.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_state_tracker.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidator_test_template.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/types.pb.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/fake_base_task.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonBlockingInvalidatorTestDelegate {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NonBlockingInvalidatorTestDelegate() : io_thread_("IO thread") {}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NonBlockingInvalidatorTestDelegate() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DestroyInvalidator();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateInvalidator(
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& invalidator_client_id,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& initial_state,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::WeakPtr<InvalidationStateTracker>&
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          invalidation_state_tracker) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!invalidator_.get());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Thread::Options options;
38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    options.message_loop_type = base::MessageLoop::TYPE_IO;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.StartWithOptions(options);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_context_getter_ =
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new net::TestURLRequestContextGetter(io_thread_.message_loop_proxy());
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    notifier::NotifierOptions notifier_options;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    notifier_options.request_context_getter = request_context_getter_;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NetworkChannelCreator network_channel_creator =
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        NonBlockingInvalidator::MakePushClientChannelCreator(notifier_options);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidator_.reset(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new NonBlockingInvalidator(
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            network_channel_creator,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            invalidator_client_id,
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            UnackedInvalidationsMap(),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            initial_state,
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            invalidation_state_tracker.get(),
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "fake_client_info",
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            request_context_getter_));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Invalidator* GetInvalidator() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return invalidator_.get();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyInvalidator() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidator_.reset();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_context_getter_ = NULL;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_.Stop();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForInvalidator() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_.message_loop_proxy()->PostTaskAndReply(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            FROM_HERE,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::Bind(&base::DoNothing),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            run_loop.QuitClosure()));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.Run();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TriggerOnInvalidatorStateChange(InvalidatorState state) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalidator_->OnInvalidatorStateChange(state);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TriggerOnIncomingInvalidation(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ObjectIdInvalidationMap& invalidation_map) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    invalidator_->OnIncomingInvalidation(invalidation_map);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop message_loop_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread io_thread_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<NonBlockingInvalidator> invalidator_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NonBlockingInvalidatorTest, InvalidatorTest,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NonBlockingInvalidatorTestDelegate);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
99