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

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 "base/files/scoped_temp_dir.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 CHECK(temp_dir_.CreateUniqueTempDir());
68
69 worker_ = new FakeModelWorker(GROUP_UI);
70 }
71
72 void OnConfigDone(bool success) {
73 EXPECT_TRUE(success);
74 }
75
76 int64 CreateEntry(UserShare* user_share, ModelType type,
77 const std::string& client_tag) {
78 WriteTransaction trans(FROM_HERE, user_share);
79 ReadNode type_root(&trans);
80 EXPECT_EQ(BaseNode::INIT_OK,
81 type_root.InitByTagLookup(ModelTypeToRootTag(type)));
82
83 WriteNode node(&trans);
84 EXPECT_EQ(WriteNode::INIT_SUCCESS,
85 node.InitUniqueByCreation(type, type_root, client_tag));
86 return node.GetEntry()->GetMetahandle();
87 }
88
89 void InitManager(SyncManager* manager, ModelTypeSet types,
90 TestChangeDelegate* delegate) {
91 TestInternalComponentsFactory factory(InternalComponentsFactory::Switches(),
92 STORAGE_ON_DISK);
93
94 manager->Init(temp_dir_.path(),
95 MakeWeakHandle(base::WeakPtr<JsEventHandler>()),
96 "", 0, true, scoped_ptr<HttpPostProviderFactory>().Pass(),
97 std::vector<scoped_refptr<ModelSafeWorker> >(1,
98 worker_.get()),
99 NULL, delegate, SyncCredentials(), "", "", "", &factory,
100 NULL, scoped_ptr<UnrecoverableErrorHandler>().Pass(),
101 NULL, NULL);
102 manager->ConfigureSyncer(
103 CONFIGURE_REASON_NEW_CLIENT,
104 types,
105 ModelTypeSet(), ModelTypeSet(), ModelTypeSet(), ModelSafeRoutingInfo(),
106 base::Bind(&SyncRollbackManagerTest::OnConfigDone,
107 base::Unretained(this), true),
108 base::Bind(&SyncRollbackManagerTest::OnConfigDone,
109 base::Unretained(this), false));
110 }
111
112 // Create and persist an entry by unique tag in DB.
113 void PrepopulateDb(ModelType type, const std::string& client_tag) {
114 SyncBackupManager backup_manager;
115 TestChangeDelegate delegate;
116 InitManager(&backup_manager, ModelTypeSet(type), &delegate);
117 CreateEntry(backup_manager.GetUserShare(), type, client_tag);
118 backup_manager.ShutdownOnSyncThread();
119 }
120
121 // Verify entry with |client_tag| exists in sync directory.
122 bool VerifyEntry(UserShare* user_share, ModelType type,
123 const std::string& client_tag) {
124 ReadTransaction trans(FROM_HERE, user_share);
125 ReadNode node(&trans);
126 return BaseNode::INIT_OK == node.InitByClientTagLookup(type, client_tag);
127 }
128
129 base::ScopedTempDir temp_dir_;
130 scoped_refptr<ModelSafeWorker> worker_;
131 base::MessageLoop loop_; // Needed for WeakHandle
132 };
133
134 TEST_F(SyncRollbackManagerTest, RollbackBasic) {
135 PrepopulateDb(PREFERENCES, "pref1");
136
137 TestChangeDelegate delegate;
138 SyncRollbackManager rollback_manager;
139 InitManager(&rollback_manager, ModelTypeSet(PREFERENCES), &delegate);
140
141 // Simulate a new entry added during type initialization.
142 int64 new_pref_id =
143 CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
144
145 delegate.add_expected_delete(new_pref_id);
146 EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
147 .Times(1)
148 .WillOnce(DoDefault());
149 EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
150
151 ModelSafeRoutingInfo routing_info;
152 routing_info[PREFERENCES] = GROUP_UI;
153 rollback_manager.StartSyncingNormally(routing_info);
154 }
155
156 TEST_F(SyncRollbackManagerTest, NoRollbackOfTypesNotBackedUp) {
157 PrepopulateDb(PREFERENCES, "pref1");
158
159 TestChangeDelegate delegate;
160 SyncRollbackManager rollback_manager;
161 InitManager(&rollback_manager, ModelTypeSet(PREFERENCES, APPS), &delegate);
162
163 // Simulate new entry added during type initialization.
164 int64 new_pref_id =
165 CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
166 CreateEntry(rollback_manager.GetUserShare(), APPS, "app1");
167
168 delegate.add_expected_delete(new_pref_id);
169 EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
170 .Times(1)
171 .WillOnce(DoDefault());
172 EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
173
174 ModelSafeRoutingInfo routing_info;
175 routing_info[PREFERENCES] = GROUP_UI;
176 rollback_manager.StartSyncingNormally(routing_info);
177
178 // APP entry is still valid.
179 EXPECT_TRUE(VerifyEntry(rollback_manager.GetUserShare(), APPS, "app1"));
180 }
181
182 TEST_F(SyncRollbackManagerTest, BackupDbNotChangedOnAbort) {
183 PrepopulateDb(PREFERENCES, "pref1");
184
185 TestChangeDelegate delegate;
186 scoped_ptr<SyncRollbackManager> rollback_manager(
187 new SyncRollbackManager);
188 InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
189
190 // Simulate a new entry added during type initialization.
191 CreateEntry(rollback_manager->GetUserShare(), PREFERENCES, "pref2");
192
193 // Manager was shut down before sync starts.
194 rollback_manager->ShutdownOnSyncThread();
195
196 // Verify new entry was not persisted.
197 rollback_manager.reset(new SyncRollbackManager);
198 InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate);
199 EXPECT_FALSE(VerifyEntry(rollback_manager->GetUserShare(), PREFERENCES,
200 "pref2"));
201 }
202
203 } // anonymous namespace
204
205 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698