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

Side by Side Diff: chrome/browser/extensions/extension_settings_sync_unittest.cc

Issue 8375047: Separate the syncing of extension settings and app settings into separate data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 1 month 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
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "testing/gtest/include/gtest/gtest.h" 5 #include "testing/gtest/include/gtest/gtest.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/json/json_reader.h" 8 #include "base/json/json_reader.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/scoped_temp_dir.h" 12 #include "base/scoped_temp_dir.h"
13 #include "base/task.h" 13 #include "base/task.h"
14 #include "chrome/browser/extensions/extension_settings_backend.h"
15 #include "chrome/browser/extensions/extension_settings_frontend.h" 14 #include "chrome/browser/extensions/extension_settings_frontend.h"
16 #include "chrome/browser/extensions/extension_settings_storage_cache.h" 15 #include "chrome/browser/extensions/extension_settings_storage_cache.h"
17 #include "chrome/browser/extensions/extension_settings_sync_util.h" 16 #include "chrome/browser/extensions/extension_settings_sync_util.h"
18 #include "chrome/browser/extensions/syncable_extension_settings_storage.h" 17 #include "chrome/browser/extensions/syncable_extension_settings_storage.h"
18 #include "chrome/browser/extensions/extension_settings_test_util.h"
19 #include "chrome/browser/sync/api/sync_change_processor.h" 19 #include "chrome/browser/sync/api/sync_change_processor.h"
20 #include "chrome/test/base/testing_profile.h"
21 #include "content/browser/browser_thread.h" 20 #include "content/browser/browser_thread.h"
22 21
23 // TODO(kalman): Integration tests for sync. 22 // TODO(kalman): Integration tests for sync.
24 23
24 using namespace extension_settings_test_util;
25
25 namespace { 26 namespace {
26 27
27 // Gets the pretty-printed JSON for a value. 28 // Gets the pretty-printed JSON for a value.
28 static std::string GetJson(const Value& value) { 29 static std::string GetJson(const Value& value) {
29 std::string json; 30 std::string json;
30 base::JSONWriter::Write(&value, true, &json); 31 base::JSONWriter::Write(&value, true, &json);
31 return json; 32 return json;
32 } 33 }
33 34
34 // Returns whether two Values are equal. 35 // Returns whether two Values are equal.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 ADD_FAILURE() << matching_changes.size() << " matching changes for " << 113 ADD_FAILURE() << matching_changes.size() << " matching changes for " <<
113 extension_id << "/" << key << " (out of " << changes_.size() << ")"; 114 extension_id << "/" << key << " (out of " << changes_.size() << ")";
114 } 115 }
115 return matching_changes[0]; 116 return matching_changes[0];
116 } 117 }
117 118
118 private: 119 private:
119 ExtensionSettingSyncDataList changes_; 120 ExtensionSettingSyncDataList changes_;
120 }; 121 };
121 122
122 // To be called as a callback from ExtensionSettingsFrontend::RunWithSettings. 123 void AssignSettingsService(SyncableService** dst, SyncableService* src) {
123 void AssignSettings(
124 ExtensionSettingsBackend** dst, ExtensionSettingsBackend* src) {
125 *dst = src; 124 *dst = src;
126 } 125 }
127 126
128 } // namespace 127 } // namespace
129 128
130 class ExtensionSettingsSyncTest : public testing::Test { 129 class ExtensionSettingsSyncTest : public testing::Test {
131 public: 130 public:
132 ExtensionSettingsSyncTest() 131 ExtensionSettingsSyncTest()
133 : ui_thread_(BrowserThread::UI, MessageLoop::current()), 132 : ui_thread_(BrowserThread::UI, MessageLoop::current()),
134 file_thread_(BrowserThread::FILE, MessageLoop::current()), 133 file_thread_(BrowserThread::FILE, MessageLoop::current()) {}
135 frontend_(&profile_), 134
136 backend_(NULL) { 135 virtual void SetUp() OVERRIDE {
136 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
137 profile_.reset(new MockProfile(temp_dir_.path()));
138 frontend_.reset(new ExtensionSettingsFrontend(profile_.get()));
137 } 139 }
138 140
139 virtual void SetUp() OVERRIDE { 141 virtual void TearDown() OVERRIDE {
140 frontend_.RunWithBackend(base::Bind(&AssignSettings, &backend_)); 142 frontend_.reset();
141 MessageLoop::current()->RunAllPending(); 143 profile_.reset();
142 ASSERT_TRUE(backend_ != NULL);
143 } 144 }
144 145
145 protected: 146 protected:
146 // Creates a new extension storage object and adds a record of the extension 147 // Adds a record of an extension or app to the extension service, then returns
147 // to the extension service. 148 // its storage area.
148 SyncableExtensionSettingsStorage* GetStorage( 149 ExtensionSettingsStorage* AddExtensionAndGetStorage(
149 const std::string& extension_id) { 150 const std::string& id, bool is_app) {
150 return static_cast<SyncableExtensionSettingsStorage*>( 151 profile_->GetMockExtensionService()->AddExtension(id, is_app);
151 backend_->GetStorage(extension_id)); 152 return GetStorage(id, frontend_.get());
152 } 153 }
153 154
154 // Gets all the sync data from |backend_| as a map from extension id to its 155 // Gets the SyncableService for the given sync type.
155 // sync data. 156 SyncableService* GetSyncableService(syncable::ModelType model_type) {
156 std::map<std::string, ExtensionSettingSyncDataList> GetAllSyncData() { 157 SyncableService* settings_service = NULL;
157 SyncDataList as_list = 158 frontend_->RunWithSyncableService(
158 backend_->GetAllSyncData(syncable::EXTENSION_SETTINGS); 159 model_type, base::Bind(&AssignSettingsService, &settings_service));
160 MessageLoop::current()->RunAllPending();
161 return settings_service;
162 }
163
164 // Gets all the sync data from the SyncableService for a sync type as a map
165 // from extension id to its sync data.
166 std::map<std::string, ExtensionSettingSyncDataList> GetAllSyncData(
167 syncable::ModelType type) {
168 SyncDataList as_list = GetSyncableService(type)->GetAllSyncData(type);
159 std::map<std::string, ExtensionSettingSyncDataList> as_map; 169 std::map<std::string, ExtensionSettingSyncDataList> as_map;
160 for (SyncDataList::iterator it = as_list.begin(); 170 for (SyncDataList::iterator it = as_list.begin();
161 it != as_list.end(); ++it) { 171 it != as_list.end(); ++it) {
162 ExtensionSettingSyncData sync_data(*it); 172 ExtensionSettingSyncData sync_data(*it);
163 as_map[sync_data.extension_id()].push_back(sync_data); 173 as_map[sync_data.extension_id()].push_back(sync_data);
164 } 174 }
165 return as_map; 175 return as_map;
166 } 176 }
167 177
168 // Need these so that the DCHECKs for running on FILE or UI threads pass. 178 // Need these so that the DCHECKs for running on FILE or UI threads pass.
169 MessageLoop message_loop_; 179 MessageLoop message_loop_;
170 BrowserThread ui_thread_; 180 BrowserThread ui_thread_;
171 BrowserThread file_thread_; 181 BrowserThread file_thread_;
172 182
183 ScopedTempDir temp_dir_;
173 MockSyncChangeProcessor sync_; 184 MockSyncChangeProcessor sync_;
174 TestingProfile profile_; 185 scoped_ptr<MockProfile> profile_;
175 ExtensionSettingsFrontend frontend_; 186 scoped_ptr<ExtensionSettingsFrontend> frontend_;
176
177 // Get from frontend_->RunWithBackend, so weak reference.
178 ExtensionSettingsBackend* backend_;
179 }; 187 };
180 188
189 // Get a semblance of coverage for both EXTENSION_SETTINGS and APP_SETTINGS
190 // sync by roughly alternative which one to test.
akalin 2011/10/28 06:04:54 Consider parametrized tests here
not at google - send to devlin 2011/10/31 00:02:23 Ditto.
191
181 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) { 192 TEST_F(ExtensionSettingsSyncTest, NoDataDoesNotInvokeSync) {
182 ASSERT_EQ(0u, GetAllSyncData().size()); 193 syncable::ModelType type = syncable::EXTENSION_SETTINGS;
194 bool is_app = false;
195
196 ASSERT_EQ(0u, GetAllSyncData(type).size());
183 197
184 // Have one extension created before sync is set up, the other created after. 198 // Have one extension created before sync is set up, the other created after.
185 GetStorage("s1"); 199 AddExtensionAndGetStorage("s1", is_app);
186 ASSERT_EQ(0u, GetAllSyncData().size()); 200 ASSERT_EQ(0u, GetAllSyncData(type).size());
187 201
188 backend_->MergeDataAndStartSyncing( 202 GetSyncableService(type)->MergeDataAndStartSyncing(
189 syncable::EXTENSION_SETTINGS, 203 type, SyncDataList(), &sync_);
190 SyncDataList(),
191 &sync_);
192 204
193 GetStorage("s2"); 205 AddExtensionAndGetStorage("s2", is_app);
194 ASSERT_EQ(0u, GetAllSyncData().size()); 206 ASSERT_EQ(0u, GetAllSyncData(type).size());
195 207
196 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); 208 GetSyncableService(type)->StopSyncing(type);
197 209
198 ASSERT_EQ(0u, sync_.changes().size()); 210 ASSERT_EQ(0u, sync_.changes().size());
199 ASSERT_EQ(0u, GetAllSyncData().size()); 211 ASSERT_EQ(0u, GetAllSyncData(type).size());
200 } 212 }
201 213
202 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) { 214 TEST_F(ExtensionSettingsSyncTest, InSyncDataDoesNotInvokeSync) {
215 syncable::ModelType type = syncable::APP_SETTINGS;
216 bool is_app = true;
217
203 StringValue value1("fooValue"); 218 StringValue value1("fooValue");
204 ListValue value2; 219 ListValue value2;
205 value2.Append(StringValue::CreateStringValue("barValue")); 220 value2.Append(StringValue::CreateStringValue("barValue"));
206 221
207 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); 222 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app);
208 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); 223 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app);
209 224
210 storage1->Set("foo", value1); 225 storage1->Set("foo", value1);
211 storage2->Set("bar", value2); 226 storage2->Set("bar", value2);
212 227
213 std::map<std::string, ExtensionSettingSyncDataList> all_sync_data = 228 std::map<std::string, ExtensionSettingSyncDataList> all_sync_data =
214 GetAllSyncData(); 229 GetAllSyncData(type);
215 ASSERT_EQ(2u, all_sync_data.size()); 230 ASSERT_EQ(2u, all_sync_data.size());
216 ASSERT_EQ(1u, all_sync_data["s1"].size()); 231 ASSERT_EQ(1u, all_sync_data["s1"].size());
217 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value()); 232 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &all_sync_data["s1"][0].value());
218 ASSERT_EQ(1u, all_sync_data["s2"].size()); 233 ASSERT_EQ(1u, all_sync_data["s2"].size());
219 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value()); 234 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &all_sync_data["s2"][0].value());
220 235
221 SyncDataList sync_data; 236 SyncDataList sync_data;
222 sync_data.push_back(extension_settings_sync_util::CreateData( 237 sync_data.push_back(extension_settings_sync_util::CreateData(
223 "s1", "foo", value1)); 238 "s1", "foo", value1));
224 sync_data.push_back(extension_settings_sync_util::CreateData( 239 sync_data.push_back(extension_settings_sync_util::CreateData(
225 "s2", "bar", value2)); 240 "s2", "bar", value2));
226 241
227 backend_->MergeDataAndStartSyncing( 242 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_);
228 syncable::EXTENSION_SETTINGS, sync_data, &sync_); 243 GetSyncableService(type)->StopSyncing(type);
229 backend_->StopSyncing(syncable::EXTENSION_SETTINGS);
230 244
231 // Already in sync, so no changes. 245 // Already in sync, so no changes.
232 ASSERT_EQ(0u, sync_.changes().size()); 246 ASSERT_EQ(0u, sync_.changes().size());
233 } 247 }
234 248
235 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) { 249 TEST_F(ExtensionSettingsSyncTest, LocalDataWithNoSyncDataIsPushedToSync) {
250 syncable::ModelType type = syncable::EXTENSION_SETTINGS;
251 bool is_app = false;
252
236 StringValue value1("fooValue"); 253 StringValue value1("fooValue");
237 ListValue value2; 254 ListValue value2;
238 value2.Append(StringValue::CreateStringValue("barValue")); 255 value2.Append(StringValue::CreateStringValue("barValue"));
239 256
240 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); 257 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app);
241 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); 258 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app);
242 259
243 storage1->Set("foo", value1); 260 storage1->Set("foo", value1);
244 storage2->Set("bar", value2); 261 storage2->Set("bar", value2);
245 262
246 backend_->MergeDataAndStartSyncing( 263 GetSyncableService(type)->MergeDataAndStartSyncing(
247 syncable::EXTENSION_SETTINGS, SyncDataList(), &sync_); 264 type, SyncDataList(), &sync_);
248 265
249 // All settings should have been pushed to sync. 266 // All settings should have been pushed to sync.
250 ASSERT_EQ(2u, sync_.changes().size()); 267 ASSERT_EQ(2u, sync_.changes().size());
251 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "foo"); 268 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "foo");
252 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); 269 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type());
253 ASSERT_TRUE(value1.Equals(&change.value())); 270 ASSERT_TRUE(value1.Equals(&change.value()));
254 change = sync_.GetOnlyChange("s2", "bar"); 271 change = sync_.GetOnlyChange("s2", "bar");
255 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); 272 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type());
256 ASSERT_TRUE(value2.Equals(&change.value())); 273 ASSERT_TRUE(value2.Equals(&change.value()));
257 274
258 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); 275 GetSyncableService(type)->StopSyncing(type);
259 } 276 }
260 277
261 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) { 278 TEST_F(ExtensionSettingsSyncTest, AnySyncDataOverwritesLocalData) {
279 syncable::ModelType type = syncable::APP_SETTINGS;
280 bool is_app = true;
281
262 StringValue value1("fooValue"); 282 StringValue value1("fooValue");
263 ListValue value2; 283 ListValue value2;
264 value2.Append(StringValue::CreateStringValue("barValue")); 284 value2.Append(StringValue::CreateStringValue("barValue"));
265 285
266 // Maintain dictionaries mirrored to the expected values of the settings in 286 // Maintain dictionaries mirrored to the expected values of the settings in
267 // each storage area. 287 // each storage area.
268 DictionaryValue expected1, expected2; 288 DictionaryValue expected1, expected2;
269 289
270 // Pre-populate one of the storage areas. 290 // Pre-populate one of the storage areas.
271 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); 291 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app);
272 storage1->Set("overwriteMe", value1); 292 storage1->Set("overwriteMe", value1);
273 293
274 SyncDataList sync_data; 294 SyncDataList sync_data;
275 sync_data.push_back(extension_settings_sync_util::CreateData( 295 sync_data.push_back(extension_settings_sync_util::CreateData(
276 "s1", "foo", value1)); 296 "s1", "foo", value1));
277 sync_data.push_back(extension_settings_sync_util::CreateData( 297 sync_data.push_back(extension_settings_sync_util::CreateData(
278 "s2", "bar", value2)); 298 "s2", "bar", value2));
279 backend_->MergeDataAndStartSyncing( 299 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_);
280 syncable::EXTENSION_SETTINGS, sync_data, &sync_);
281 expected1.Set("foo", value1.DeepCopy()); 300 expected1.Set("foo", value1.DeepCopy());
282 expected2.Set("bar", value2.DeepCopy()); 301 expected2.Set("bar", value2.DeepCopy());
283 302
284 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); 303 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app);
285 304
286 // All changes should be local, so no sync changes. 305 // All changes should be local, so no sync changes.
287 ASSERT_EQ(0u, sync_.changes().size()); 306 ASSERT_EQ(0u, sync_.changes().size());
288 307
289 // Sync settings should have been pushed to local settings. 308 // Sync settings should have been pushed to local settings.
290 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); 309 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get());
291 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); 310 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get());
292 311
293 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); 312 GetSyncableService(type)->StopSyncing(type);
294 } 313 }
295 314
296 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) { 315 TEST_F(ExtensionSettingsSyncTest, ProcessSyncChanges) {
316 syncable::ModelType type = syncable::EXTENSION_SETTINGS;
317 bool is_app = false;
318
297 StringValue value1("fooValue"); 319 StringValue value1("fooValue");
298 ListValue value2; 320 ListValue value2;
299 value2.Append(StringValue::CreateStringValue("barValue")); 321 value2.Append(StringValue::CreateStringValue("barValue"));
300 322
301 // Maintain dictionaries mirrored to the expected values of the settings in 323 // Maintain dictionaries mirrored to the expected values of the settings in
302 // each storage area. 324 // each storage area.
303 DictionaryValue expected1, expected2; 325 DictionaryValue expected1, expected2;
304 326
305 // Make storage1 initialised from local data, storage2 initialised from sync. 327 // Make storage1 initialised from local data, storage2 initialised from sync.
306 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); 328 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app);
307 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); 329 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app);
308 330
309 storage1->Set("foo", value1); 331 storage1->Set("foo", value1);
310 expected1.Set("foo", value1.DeepCopy()); 332 expected1.Set("foo", value1.DeepCopy());
311 333
312 SyncDataList sync_data; 334 SyncDataList sync_data;
313 sync_data.push_back(extension_settings_sync_util::CreateData( 335 sync_data.push_back(extension_settings_sync_util::CreateData(
314 "s2", "bar", value2)); 336 "s2", "bar", value2));
315 337
316 backend_->MergeDataAndStartSyncing( 338 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_);
317 syncable::EXTENSION_SETTINGS, sync_data, &sync_);
318 expected2.Set("bar", value2.DeepCopy()); 339 expected2.Set("bar", value2.DeepCopy());
319 340
320 // Make sync add some settings. 341 // Make sync add some settings.
321 SyncChangeList change_list; 342 SyncChangeList change_list;
322 change_list.push_back(extension_settings_sync_util::CreateAdd( 343 change_list.push_back(extension_settings_sync_util::CreateAdd(
323 "s1", "bar", value2)); 344 "s1", "bar", value2));
324 change_list.push_back(extension_settings_sync_util::CreateAdd( 345 change_list.push_back(extension_settings_sync_util::CreateAdd(
325 "s2", "foo", value1)); 346 "s2", "foo", value1));
326 backend_->ProcessSyncChanges(FROM_HERE, change_list); 347 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list);
327 expected1.Set("bar", value2.DeepCopy()); 348 expected1.Set("bar", value2.DeepCopy());
328 expected2.Set("foo", value1.DeepCopy()); 349 expected2.Set("foo", value1.DeepCopy());
329 350
330 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); 351 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get());
331 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); 352 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get());
332 353
333 // Make sync update some settings, storage1 the new setting, storage2 the 354 // Make sync update some settings, storage1 the new setting, storage2 the
334 // initial setting. 355 // initial setting.
335 change_list.clear(); 356 change_list.clear();
336 change_list.push_back(extension_settings_sync_util::CreateUpdate( 357 change_list.push_back(extension_settings_sync_util::CreateUpdate(
337 "s1", "bar", value2)); 358 "s1", "bar", value2));
338 change_list.push_back(extension_settings_sync_util::CreateUpdate( 359 change_list.push_back(extension_settings_sync_util::CreateUpdate(
339 "s2", "bar", value1)); 360 "s2", "bar", value1));
340 backend_->ProcessSyncChanges(FROM_HERE, change_list); 361 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list);
341 expected1.Set("bar", value2.DeepCopy()); 362 expected1.Set("bar", value2.DeepCopy());
342 expected2.Set("bar", value1.DeepCopy()); 363 expected2.Set("bar", value1.DeepCopy());
343 364
344 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); 365 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get());
345 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); 366 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get());
346 367
347 // Make sync remove some settings, storage1 the initial setting, storage2 the 368 // Make sync remove some settings, storage1 the initial setting, storage2 the
348 // new setting. 369 // new setting.
349 change_list.clear(); 370 change_list.clear();
350 change_list.push_back(extension_settings_sync_util::CreateDelete( 371 change_list.push_back(extension_settings_sync_util::CreateDelete(
351 "s1", "foo")); 372 "s1", "foo"));
352 change_list.push_back(extension_settings_sync_util::CreateDelete( 373 change_list.push_back(extension_settings_sync_util::CreateDelete(
353 "s2", "foo")); 374 "s2", "foo"));
354 backend_->ProcessSyncChanges(FROM_HERE, change_list); 375 GetSyncableService(type)->ProcessSyncChanges(FROM_HERE, change_list);
355 expected1.Remove("foo", NULL); 376 expected1.Remove("foo", NULL);
356 expected2.Remove("foo", NULL); 377 expected2.Remove("foo", NULL);
357 378
358 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get()); 379 ASSERT_PRED_FORMAT2(SettingsEq, &expected1, storage1->Get());
359 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get()); 380 ASSERT_PRED_FORMAT2(SettingsEq, &expected2, storage2->Get());
360 381
361 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); 382 GetSyncableService(type)->StopSyncing(type);
362 } 383 }
363 384
364 TEST_F(ExtensionSettingsSyncTest, PushToSync) { 385 TEST_F(ExtensionSettingsSyncTest, PushToSync) {
386 syncable::ModelType type = syncable::APP_SETTINGS;
387 bool is_app = true;
388
365 StringValue value1("fooValue"); 389 StringValue value1("fooValue");
366 ListValue value2; 390 ListValue value2;
367 value2.Append(StringValue::CreateStringValue("barValue")); 391 value2.Append(StringValue::CreateStringValue("barValue"));
368 392
369 // Make storage1/2 initialised from local data, storage3/4 initialised from 393 // Make storage1/2 initialised from local data, storage3/4 initialised from
370 // sync. 394 // sync.
371 SyncableExtensionSettingsStorage* storage1 = GetStorage("s1"); 395 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", is_app);
372 SyncableExtensionSettingsStorage* storage2 = GetStorage("s2"); 396 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", is_app);
373 SyncableExtensionSettingsStorage* storage3 = GetStorage("s3"); 397 ExtensionSettingsStorage* storage3 = AddExtensionAndGetStorage("s3", is_app);
374 SyncableExtensionSettingsStorage* storage4 = GetStorage("s4"); 398 ExtensionSettingsStorage* storage4 = AddExtensionAndGetStorage("s4", is_app);
375 399
376 storage1->Set("foo", value1); 400 storage1->Set("foo", value1);
377 storage2->Set("foo", value1); 401 storage2->Set("foo", value1);
378 402
379 SyncDataList sync_data; 403 SyncDataList sync_data;
380 sync_data.push_back(extension_settings_sync_util::CreateData( 404 sync_data.push_back(extension_settings_sync_util::CreateData(
381 "s3", "bar", value2)); 405 "s3", "bar", value2));
382 sync_data.push_back(extension_settings_sync_util::CreateData( 406 sync_data.push_back(extension_settings_sync_util::CreateData(
383 "s4", "bar", value2)); 407 "s4", "bar", value2));
384 408
385 backend_->MergeDataAndStartSyncing( 409 GetSyncableService(type)->MergeDataAndStartSyncing(type, sync_data, &sync_);
386 syncable::EXTENSION_SETTINGS, sync_data, &sync_);
387 410
388 // Add something locally. 411 // Add something locally.
389 storage1->Set("bar", value2); 412 storage1->Set("bar", value2);
390 storage2->Set("bar", value2); 413 storage2->Set("bar", value2);
391 storage3->Set("foo", value1); 414 storage3->Set("foo", value1);
392 storage4->Set("foo", value1); 415 storage4->Set("foo", value1);
393 416
394 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "bar"); 417 ExtensionSettingSyncData change = sync_.GetOnlyChange("s1", "bar");
395 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type()); 418 ASSERT_EQ(SyncChange::ACTION_ADD, change.change_type());
396 ASSERT_TRUE(value2.Equals(&change.value())); 419 ASSERT_TRUE(value2.Equals(&change.value()));
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 ASSERT_EQ( 511 ASSERT_EQ(
489 SyncChange::ACTION_DELETE, 512 SyncChange::ACTION_DELETE,
490 sync_.GetOnlyChange("s3", "bar").change_type()); 513 sync_.GetOnlyChange("s3", "bar").change_type());
491 ASSERT_EQ( 514 ASSERT_EQ(
492 SyncChange::ACTION_DELETE, 515 SyncChange::ACTION_DELETE,
493 sync_.GetOnlyChange("s4", "foo").change_type()); 516 sync_.GetOnlyChange("s4", "foo").change_type());
494 ASSERT_EQ( 517 ASSERT_EQ(
495 SyncChange::ACTION_DELETE, 518 SyncChange::ACTION_DELETE,
496 sync_.GetOnlyChange("s4", "bar").change_type()); 519 sync_.GetOnlyChange("s4", "bar").change_type());
497 520
498 backend_->StopSyncing(syncable::EXTENSION_SETTINGS); 521 GetSyncableService(type)->StopSyncing(type);
499 } 522 }
523
524 TEST_F(ExtensionSettingsSyncTest, ExtensionAndAppSettingsSyncSeparately) {
525 StringValue value1("fooValue");
526 ListValue value2;
527 value2.Append(StringValue::CreateStringValue("barValue"));
528
529 // storage1 is an extension, storage2 is an app.
530 ExtensionSettingsStorage* storage1 = AddExtensionAndGetStorage("s1", false);
531 ExtensionSettingsStorage* storage2 = AddExtensionAndGetStorage("s2", true);
532
533 storage1->Set("foo", value1);
534 storage2->Set("bar", value2);
535
536 std::map<std::string, ExtensionSettingSyncDataList> extension_sync_data =
537 GetAllSyncData(syncable::EXTENSION_SETTINGS);
538 ASSERT_EQ(1u, extension_sync_data.size());
539 ASSERT_EQ(1u, extension_sync_data["s1"].size());
540 ASSERT_PRED_FORMAT2(ValuesEq, &value1, &extension_sync_data["s1"][0].value());
541
542 std::map<std::string, ExtensionSettingSyncDataList> app_sync_data =
543 GetAllSyncData(syncable::APP_SETTINGS);
544 ASSERT_EQ(1u, app_sync_data.size());
545 ASSERT_EQ(1u, app_sync_data["s2"].size());
546 ASSERT_PRED_FORMAT2(ValuesEq, &value2, &app_sync_data["s2"][0].value());
547
548 // Stop each separately, there should be no changes either time.
549 SyncDataList sync_data;
550 sync_data.push_back(extension_settings_sync_util::CreateData(
551 "s1", "foo", value1));
552
553 GetSyncableService(syncable::EXTENSION_SETTINGS)->
554 MergeDataAndStartSyncing(syncable::EXTENSION_SETTINGS, sync_data, &sync_);
555 GetSyncableService(syncable::EXTENSION_SETTINGS)->
556 StopSyncing(syncable::EXTENSION_SETTINGS);
557 ASSERT_EQ(0u, sync_.changes().size());
558
559 sync_data.clear();
560 sync_data.push_back(extension_settings_sync_util::CreateData(
561 "s2", "bar", value2));
562
563 GetSyncableService(syncable::APP_SETTINGS)->
564 MergeDataAndStartSyncing(syncable::APP_SETTINGS, sync_data, &sync_);
565 GetSyncableService(syncable::APP_SETTINGS)->
566 StopSyncing(syncable::APP_SETTINGS);
567 ASSERT_EQ(0u, sync_.changes().size());
568 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698