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