Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: sync/internal_api/sync_rollback_manager_unittest.cc

Issue 235053006: Add sync manager classes for backup/rollback: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 "sync/internal_api/sync_rollback_manager.h"
6
7 #include "sql/connection.h"
8 #include "sync/internal_api/public/read_node.h"
9 #include "sync/internal_api/public/read_transaction.h"
10 #include "sync/internal_api/public/test/test_internal_components_factory.h"
11 #include "sync/internal_api/public/write_node.h"
12 #include "sync/internal_api/public/write_transaction.h"
13 #include "sync/internal_api/sync_backup_manager.h"
14 #include "sync/syncable/entry.h"
15 #include "sync/test/engine/fake_model_worker.h"
16 #include "sync/test/test_directory_backing_store.h"
17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 using ::testing::_;
21 using ::testing::DoDefault;
22 using ::testing::Invoke;
23 using ::testing::WithArgs;
24
25 namespace syncer {
26
27 namespace {
28
29 class TestChangeDelegate : public SyncManager::ChangeDelegate {
30 public:
31 TestChangeDelegate() {
32 ON_CALL(*this, OnChangesApplied(_, _, _, _))
33 .WillByDefault(
34 WithArgs<3>(Invoke(this,
35 &TestChangeDelegate::VerifyDeletes)));
36 }
37
38 void add_expected_delete(int64 v) {
39 expected_deletes_.insert(v);
40 }
41
42 MOCK_METHOD4(OnChangesApplied,
43 void(ModelType model_type,
44 int64 model_version,
45 const BaseTransaction* trans,
46 const ImmutableChangeRecordList& changes));
47 MOCK_METHOD1(OnChangesComplete, void(ModelType model_type));
48
49 private:
50 void VerifyDeletes(const ImmutableChangeRecordList& changes) {
51 std::set<int64> deleted;
52 for (size_t i = 0; i < changes.Get().size(); ++i) {
53 const ChangeRecord& change = (changes.Get())[i];
54 EXPECT_EQ(ChangeRecord::ACTION_DELETE, change.action);
55 EXPECT_TRUE(deleted.find(change.id) == deleted.end());
56 deleted.insert(change.id);
57 }
58 EXPECT_TRUE(expected_deletes_ == deleted);
59 }
60
61 std::set<int64> expected_deletes_;
62 };
63
64 class SyncRollbackManagerTest : public testing::Test {
65 protected:
66 virtual void SetUp() OVERRIDE {
67 db_.reset(new sql::Connection);
68 CHECK(db_->OpenInMemory());
69
70 worker_ = new FakeModelWorker(GROUP_UI);
71 }
72
73 void OnConfigDone(bool success) {
74 EXPECT_TRUE(success);
75 }
76
77 int64 CreateEntry(UserShare* user_share, ModelType type,
78 const std::string& client_tag) {
79 WriteTransaction trans(FROM_HERE, user_share);
80 ReadNode type_root(&trans);
81 EXPECT_EQ(BaseNode::INIT_OK,
82 type_root.InitByTagLookup(ModelTypeToRootTag(type)));
83
84 WriteNode node(&trans);
85 EXPECT_EQ(WriteNode::INIT_SUCCESS,
86 node.InitUniqueByCreation(type, type_root, client_tag));
87 return node.GetEntry()->GetMetahandle();
88 }
89
90 void InitManager(SyncManager* manager, ModelTypeSet types,
91 TestChangeDelegate* delegate) {
92 TestInternalComponentsFactory factory(
93 scoped_ptr<syncable::DirectoryBackingStore>(
94 new syncable::TestDirectoryBackingStore("test", db_.get())));
95
96 manager->Init(base::FilePath("test"),
97 MakeWeakHandle(base::WeakPtr<JsEventHandler>()),
98 "", 0, true, scoped_ptr<HttpPostProviderFactory>().Pass(),
99 std::vector<scoped_refptr<ModelSafeWorker> >(1,
100 worker_.get()),
101 NULL, delegate, SyncCredentials(), "", "", "", &factory,
102 NULL, scoped_ptr<UnrecoverableErrorHandler>().Pass(),
103 NULL, NULL);
104 manager->ConfigureSyncer(
105 CONFIGURE_REASON_NEW_CLIENT,
106 types,
107 ModelTypeSet(), ModelTypeSet(), ModelTypeSet(), ModelSafeRoutingInfo(),
108 base::Bind(&SyncRollbackManagerTest::OnConfigDone,
109 base::Unretained(this), true),
110 base::Bind(&SyncRollbackManagerTest::OnConfigDone,
111 base::Unretained(this), false));
112 }
113
114 // Create and persist an entry by unique tag in DB.
115 void PrepopulateDb(ModelType type, const std::string& client_tag) {
116 SyncBackupManager backup_manager;
117 TestChangeDelegate delegate;
118 InitManager(&backup_manager, ModelTypeSet(type), &delegate);
119 CreateEntry(backup_manager.GetUserShare(), type, client_tag);
120 backup_manager.ShutdownOnSyncThread();
121 }
122
123 // Verify entry with |client_tag| exists in sync directory.
124 bool VerifyEntry(UserShare* user_share, ModelType type,
125 const std::string& client_tag) {
126 ReadTransaction trans(FROM_HERE, user_share);
127 ReadNode node(&trans);
128 return BaseNode::INIT_OK == node.InitByClientTagLookup(type, client_tag);
129 }
130
131 scoped_ptr<sql::Connection> db_;
132 scoped_refptr<ModelSafeWorker> worker_;
133 base::MessageLoop loop_; // Needed for WeakHandle
134 };
135
136 TEST_F(SyncRollbackManagerTest, RollbackBasic) {
137 PrepopulateDb(PREFERENCES, "pref1");
138
139 TestChangeDelegate delegate;
140 SyncRollbackManager rollback_manager;
141 InitManager(&rollback_manager, ModelTypeSet(PREFERENCES), &delegate);
142
143 // Simulate a new entry added during type initialization.
144 int64 new_pref_id =
145 CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
146
147 delegate.add_expected_delete(new_pref_id);
148 EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
149 .Times(1)
150 .WillOnce(DoDefault());
151 EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
152
153 ModelSafeRoutingInfo routing_info;
154 routing_info[PREFERENCES] = GROUP_UI;
155 rollback_manager.StartSyncingNormally(routing_info);
156 }
157
158 TEST_F(SyncRollbackManagerTest, NoRollbackOfTypesNotBackedUp) {
159 PrepopulateDb(PREFERENCES, "pref1");
160
161 TestChangeDelegate delegate;
162 SyncRollbackManager rollback_manager;
163 InitManager(&rollback_manager, ModelTypeSet(PREFERENCES, APPS), &delegate);
164
165 // Simulate new entry added during type initialization.
166 int64 new_pref_id =
167 CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
168 CreateEntry(rollback_manager.GetUserShare(), APPS, "app1");
169
170 delegate.add_expected_delete(new_pref_id);
171 EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
172 .Times(1)
173 .WillOnce(DoDefault());
174 EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
175
176 ModelSafeRoutingInfo routing_info;
177 routing_info[PREFERENCES] = GROUP_UI;
178 rollback_manager.StartSyncingNormally(routing_info);
179
180 // APP entry is still valid.
181 EXPECT_TRUE(VerifyEntry(rollback_manager.GetUserShare(), APPS, "app1"));
182 }
183
184 TEST_F(SyncRollbackManagerTest, BackupDbNotChangedOnAbort) {
185 PrepopulateDb(PREFERENCES, "pref1");
186
187 TestChangeDelegate delegate;
188 scoped_ptr<SyncRollbackManager> rollback_manager(
189 new SyncRollbackManager);
190 InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
191
192 // Simulate a new entry added during type initialization.
193 CreateEntry(rollback_manager->GetUserShare(), PREFERENCES, "pref2");
194
195 // Manager was shut down before sync starts.
196 rollback_manager->ShutdownOnSyncThread();
197
198 // Verify new entry was not persisted.
199 rollback_manager.reset(new SyncRollbackManager);
200 InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
201 EXPECT_FALSE(VerifyEntry(rollback_manager->GetUserShare(), PREFERENCES,
202 "pref2"));
203 }
204
205 } // anonymous namespace
206
207 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698