1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h" 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/sequenced_task_runner.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/thread_task_runner_handle.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/engine/model_type_sync_proxy_impl.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/internal_api/public/base/model_type.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/internal_api/public/sync_context.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/internal_api/sync_context_proxy_impl.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/sessions/model_type_registry.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/test/engine/mock_nudge_handler.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/test/engine/test_directory_setter_upper.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace syncer { 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SyncContextProxyImplTest : public ::testing::Test { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SyncContextProxyImplTest() 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : sync_task_runner_(base::ThreadTaskRunnerHandle::Get()), 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch type_task_runner_(base::ThreadTaskRunnerHandle::Get()) {} 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUp() { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dir_maker_.SetUp(); 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry_.reset(new ModelTypeRegistry( 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch workers_, dir_maker_.directory(), &nudge_handler_)); 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context_proxy_.reset( 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new SyncContextProxyImpl(sync_task_runner_, registry_->AsWeakPtr())); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void TearDown() { 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context_proxy_.reset(); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry_.reset(); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dir_maker_.TearDown(); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The sync thread could be shut down at any time without warning. This 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // function simulates such an event. 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void DisableSync() { registry_.reset(); } 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SyncContextProxy> GetProxy() { return context_proxy_->Clone(); } 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::MessageLoop loop_; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<base::SequencedTaskRunner> sync_task_runner_; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<base::SequencedTaskRunner> type_task_runner_; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<scoped_refptr<ModelSafeWorker> > workers_; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestDirectorySetterUpper dir_maker_; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MockNudgeHandler nudge_handler_; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ModelTypeRegistry> registry_; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SyncContextProxyImpl> context_proxy_; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Try to connect a type to a SyncContext that has already shut down. 60116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SyncContextProxyImplTest, FailToConnect1) { 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ModelTypeSyncProxyImpl themes_sync_proxy(syncer::THEMES); 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DisableSync(); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch themes_sync_proxy.Enable(GetProxy()); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop_; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop_.RunUntilIdle(); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(themes_sync_proxy.IsConnected()); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Try to connect a type to a SyncContext as it shuts down. 71116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SyncContextProxyImplTest, FailToConnect2) { 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ModelTypeSyncProxyImpl themes_sync_proxy(syncer::THEMES); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch themes_sync_proxy.Enable(GetProxy()); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DisableSync(); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop_; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop_.RunUntilIdle(); 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(themes_sync_proxy.IsConnected()); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests the case where the type's sync proxy shuts down first. 82116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SyncContextProxyImplTest, TypeDisconnectsFirst) { 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ModelTypeSyncProxyImpl> themes_sync_proxy( 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ModelTypeSyncProxyImpl(syncer::THEMES)); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch themes_sync_proxy->Enable(GetProxy()); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop_; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop_.RunUntilIdle(); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(themes_sync_proxy->IsConnected()); 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch themes_sync_proxy.reset(); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests the case where the sync thread shuts down first. 95116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SyncContextProxyImplTest, SyncDisconnectsFirst) { 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ModelTypeSyncProxyImpl> themes_sync_proxy( 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ModelTypeSyncProxyImpl(syncer::THEMES)); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch themes_sync_proxy->Enable(GetProxy()); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop_; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop_.RunUntilIdle(); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(themes_sync_proxy->IsConnected()); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DisableSync(); 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace syncer 108