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