OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 } | |
OLD | NEW |