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

Side by Side Diff: chrome/browser/sync/test/integration/two_client_uss_sync_test.cc

Issue 2401083003: [Sync] Adding integration tests for USS encryption and fixing a worker bug. (Closed)
Patch Set: Updated for rkaplow@'s comments. Created 4 years, 2 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
« no previous file with comments | « no previous file | components/browser_sync/profile_sync_service.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/macros.h" 5 #include "base/macros.h"
6 #include "base/memory/ptr_util.h" 6 #include "base/memory/ptr_util.h"
7 #include "base/threading/thread_task_runner_handle.h" 7 #include "base/threading/thread_task_runner_handle.h"
8 #include "chrome/browser/sync/chrome_sync_client.h" 8 #include "chrome/browser/sync/chrome_sync_client.h"
9 #include "chrome/browser/sync/profile_sync_service_factory.h" 9 #include "chrome/browser/sync/profile_sync_service_factory.h"
10 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" 10 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
11 #include "chrome/browser/sync/test/integration/single_client_status_change_check er.h" 11 #include "chrome/browser/sync/test/integration/single_client_status_change_check er.h"
12 #include "chrome/browser/sync/test/integration/status_change_checker.h" 12 #include "chrome/browser/sync/test/integration/status_change_checker.h"
13 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" 13 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
14 #include "chrome/browser/sync/test/integration/sync_test.h" 14 #include "chrome/browser/sync/test/integration/sync_test.h"
15 #include "components/browser_sync/profile_sync_components_factory_impl.h" 15 #include "components/browser_sync/profile_sync_components_factory_impl.h"
16 #include "components/browser_sync/profile_sync_service.h" 16 #include "components/browser_sync/profile_sync_service.h"
17 #include "components/sync/model/fake_model_type_service.h" 17 #include "components/sync/model/fake_model_type_service.h"
18 #include "components/sync/model/metadata_change_list.h" 18 #include "components/sync/model/metadata_change_list.h"
19 #include "components/sync/model/model_type_change_processor.h" 19 #include "components/sync/model/model_type_change_processor.h"
20 20
21 using browser_sync::ChromeSyncClient; 21 using browser_sync::ChromeSyncClient;
22 using browser_sync::ProfileSyncComponentsFactoryImpl; 22 using browser_sync::ProfileSyncComponentsFactoryImpl;
23 using syncer::ConflictResolution; 23 using syncer::ConflictResolution;
24 using syncer::FakeModelTypeService; 24 using syncer::FakeModelTypeService;
25 using syncer::ModelTypeChangeProcessor; 25 using syncer::ModelTypeChangeProcessor;
26 using syncer::ModelTypeService; 26 using syncer::ModelTypeService;
27 27
28 namespace {
29
28 const char kKey1[] = "key1"; 30 const char kKey1[] = "key1";
29 const char kKey2[] = "key2"; 31 const char kKey2[] = "key2";
32 const char kKey3[] = "key3";
33 const char kKey4[] = "key4";
30 const char kValue1[] = "value1"; 34 const char kValue1[] = "value1";
31 const char kValue2[] = "value2"; 35 const char kValue2[] = "value2";
32 const char kValue3[] = "value3"; 36 const char kValue3[] = "value3";
37 const char* kPassphrase = "12345";
33 38
34 // A ChromeSyncClient that provides a ModelTypeService for PREFERENCES. 39 // A ChromeSyncClient that provides a ModelTypeService for PREFERENCES.
35 class TestSyncClient : public ChromeSyncClient { 40 class TestSyncClient : public ChromeSyncClient {
36 public: 41 public:
37 TestSyncClient(Profile* profile, ModelTypeService* service) 42 TestSyncClient(Profile* profile, ModelTypeService* service)
38 : ChromeSyncClient(profile), service_(service) {} 43 : ChromeSyncClient(profile), service_(service) {}
39 44
40 base::WeakPtr<ModelTypeService> GetModelTypeServiceForType( 45 base::WeakPtr<ModelTypeService> GetModelTypeServiceForType(
41 syncer::ModelType type) override { 46 syncer::ModelType type) override {
42 return type == syncer::PREFERENCES 47 return type == syncer::PREFERENCES
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 bool first_client_ignored_ = false; 231 bool first_client_ignored_ = false;
227 232
228 private: 233 private:
229 DISALLOW_COPY_AND_ASSIGN(TwoClientUssSyncTest); 234 DISALLOW_COPY_AND_ASSIGN(TwoClientUssSyncTest);
230 }; 235 };
231 236
232 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Sanity) { 237 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Sanity) {
233 ASSERT_TRUE(SetupSync()); 238 ASSERT_TRUE(SetupSync());
234 ASSERT_EQ(2U, clients_.size()); 239 ASSERT_EQ(2U, clients_.size());
235 ASSERT_EQ(2U, services_.size()); 240 ASSERT_EQ(2U, services_.size());
236 TestModelTypeService* model1 = GetModelTypeService(0); 241 TestModelTypeService* model0 = GetModelTypeService(0);
237 TestModelTypeService* model2 = GetModelTypeService(1); 242 TestModelTypeService* model1 = GetModelTypeService(1);
238 243
239 // Add an entity. 244 // Add an entity.
240 model1->WriteItem(kKey1, kValue1); 245 model0->WriteItem(kKey1, kValue1);
241 ASSERT_TRUE(DataChecker(model2, kKey1, kValue1).Wait()); 246 ASSERT_TRUE(DataChecker(model1, kKey1, kValue1).Wait());
242 247
243 // Update an entity. 248 // Update an entity.
244 model1->WriteItem(kKey1, kValue2); 249 model0->WriteItem(kKey1, kValue2);
245 ASSERT_TRUE(DataChecker(model2, kKey1, kValue2).Wait()); 250 ASSERT_TRUE(DataChecker(model1, kKey1, kValue2).Wait());
246 251
247 // Delete an entity. 252 // Delete an entity.
248 model1->DeleteItem(kKey1); 253 model0->DeleteItem(kKey1);
249 ASSERT_TRUE(DataAbsentChecker(model2, kKey1).Wait()); 254 ASSERT_TRUE(DataAbsentChecker(model1, kKey1).Wait());
250 } 255 }
251 256
252 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, DisableEnable) { 257 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, DisableEnable) {
253 ASSERT_TRUE(SetupSync()); 258 ASSERT_TRUE(SetupSync());
254 TestModelTypeService* model1 = GetModelTypeService(0); 259 TestModelTypeService* model0 = GetModelTypeService(0);
255 TestModelTypeService* model2 = GetModelTypeService(1); 260 TestModelTypeService* model1 = GetModelTypeService(1);
256 261
257 // Add an entity to test with. 262 // Add an entity to test with.
258 model1->WriteItem(kKey1, kValue1); 263 model0->WriteItem(kKey1, kValue1);
259 ASSERT_TRUE(DataChecker(model2, kKey1, kValue1).Wait()); 264 ASSERT_TRUE(DataChecker(model1, kKey1, kValue1).Wait());
265 ASSERT_EQ(1U, model0->db().data_count());
266 ASSERT_EQ(1U, model0->db().metadata_count());
260 ASSERT_EQ(1U, model1->db().data_count()); 267 ASSERT_EQ(1U, model1->db().data_count());
261 ASSERT_EQ(1U, model1->db().metadata_count()); 268 ASSERT_EQ(1U, model1->db().metadata_count());
262 ASSERT_EQ(1U, model2->db().data_count());
263 ASSERT_EQ(1U, model2->db().metadata_count());
264 269
265 // Disable PREFERENCES. 270 // Disable PREFERENCES.
266 syncer::ModelTypeSet types = syncer::UserSelectableTypes(); 271 syncer::ModelTypeSet types = syncer::UserSelectableTypes();
267 types.Remove(syncer::PREFERENCES); 272 types.Remove(syncer::PREFERENCES);
268 GetSyncService(0)->OnUserChoseDatatypes(false, types); 273 GetSyncService(0)->OnUserChoseDatatypes(false, types);
269 274
270 // Wait for it to take effect and remove the metadata. 275 // Wait for it to take effect and remove the metadata.
271 ASSERT_TRUE(MetadataAbsentChecker(model1, kKey1).Wait()); 276 ASSERT_TRUE(MetadataAbsentChecker(model0, kKey1).Wait());
277 ASSERT_EQ(1U, model0->db().data_count());
278 ASSERT_EQ(0U, model0->db().metadata_count());
279 // Model 1 should not be affected.
272 ASSERT_EQ(1U, model1->db().data_count()); 280 ASSERT_EQ(1U, model1->db().data_count());
273 ASSERT_EQ(0U, model1->db().metadata_count()); 281 ASSERT_EQ(1U, model1->db().metadata_count());
274 // Model 2 should not be affected.
275 ASSERT_EQ(1U, model2->db().data_count());
276 ASSERT_EQ(1U, model2->db().metadata_count());
277 282
278 // Re-enable PREFERENCES. 283 // Re-enable PREFERENCES.
279 GetSyncService(0)->OnUserChoseDatatypes(true, syncer::UserSelectableTypes()); 284 GetSyncService(0)->OnUserChoseDatatypes(true, syncer::UserSelectableTypes());
280 285
281 // Wait for metadata to be re-added. 286 // Wait for metadata to be re-added.
282 ASSERT_TRUE(MetadataPresentChecker(model1, kKey1).Wait()); 287 ASSERT_TRUE(MetadataPresentChecker(model0, kKey1).Wait());
288 ASSERT_EQ(1U, model0->db().data_count());
289 ASSERT_EQ(1U, model0->db().metadata_count());
283 ASSERT_EQ(1U, model1->db().data_count()); 290 ASSERT_EQ(1U, model1->db().data_count());
284 ASSERT_EQ(1U, model1->db().metadata_count()); 291 ASSERT_EQ(1U, model1->db().metadata_count());
285 ASSERT_EQ(1U, model2->db().data_count());
286 ASSERT_EQ(1U, model2->db().metadata_count());
287 } 292 }
288 293
289 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, ConflictResolution) { 294 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, ConflictResolution) {
290 ASSERT_TRUE(SetupSync()); 295 ASSERT_TRUE(SetupSync());
291 TestModelTypeService* model1 = GetModelTypeService(0); 296 TestModelTypeService* model0 = GetModelTypeService(0);
292 TestModelTypeService* model2 = GetModelTypeService(1); 297 TestModelTypeService* model1 = GetModelTypeService(1);
298 model0->SetConflictResolution(ConflictResolution::UseNew(
299 FakeModelTypeService::GenerateEntityData(kKey1, kValue3)));
293 model1->SetConflictResolution(ConflictResolution::UseNew( 300 model1->SetConflictResolution(ConflictResolution::UseNew(
294 FakeModelTypeService::GenerateEntityData(kKey1, kValue3))); 301 FakeModelTypeService::GenerateEntityData(kKey1, kValue3)));
295 model2->SetConflictResolution(ConflictResolution::UseNew(
296 FakeModelTypeService::GenerateEntityData(kKey1, kValue3)));
297 302
298 // Write conflicting entities. 303 // Write conflicting entities.
299 model1->WriteItem(kKey1, kValue1); 304 model0->WriteItem(kKey1, kValue1);
300 model2->WriteItem(kKey1, kValue2); 305 model1->WriteItem(kKey1, kValue2);
301 306
302 // Wait for them to be resolved to kResolutionValue by the custom conflict 307 // Wait for them to be resolved to kResolutionValue by the custom conflict
303 // resolution logic in TestModelTypeService. 308 // resolution logic in TestModelTypeService.
309 ASSERT_TRUE(DataChecker(model0, kKey1, kValue3).Wait());
304 ASSERT_TRUE(DataChecker(model1, kKey1, kValue3).Wait()); 310 ASSERT_TRUE(DataChecker(model1, kKey1, kValue3).Wait());
305 ASSERT_TRUE(DataChecker(model2, kKey1, kValue3).Wait());
306 } 311 }
307 312
308 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Error) { 313 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Error) {
309 ASSERT_TRUE(SetupSync()); 314 ASSERT_TRUE(SetupSync());
310 TestModelTypeService* model1 = GetModelTypeService(0); 315 TestModelTypeService* model0 = GetModelTypeService(0);
311 TestModelTypeService* model2 = GetModelTypeService(1); 316 TestModelTypeService* model1 = GetModelTypeService(1);
312 317
313 // Add an entity. 318 // Add an entity.
314 model1->WriteItem(kKey1, kValue1); 319 model0->WriteItem(kKey1, kValue1);
315 ASSERT_TRUE(DataChecker(model2, kKey1, kValue1).Wait()); 320 ASSERT_TRUE(DataChecker(model1, kKey1, kValue1).Wait());
316 321
317 // Set an error in model 2 to trigger in the next GetUpdates. 322 // Set an error in model 1 to trigger in the next GetUpdates.
318 model2->SetServiceError(syncer::SyncError::DATATYPE_ERROR); 323 model1->SetServiceError(syncer::SyncError::DATATYPE_ERROR);
319 // Write an item on model 1 to trigger a GetUpdates in model 2. 324 // Write an item on model 0 to trigger a GetUpdates in model 1.
320 model1->WriteItem(kKey1, kValue2); 325 model0->WriteItem(kKey1, kValue2);
321 326
322 // The type should stop syncing but keep tracking metadata. 327 // The type should stop syncing but keep tracking metadata.
323 ASSERT_TRUE(PrefsNotRunningChecker(GetSyncService(1)).Wait()); 328 ASSERT_TRUE(PrefsNotRunningChecker(GetSyncService(1)).Wait());
324 ASSERT_EQ(1U, model2->db().metadata_count()); 329 ASSERT_EQ(1U, model1->db().metadata_count());
325 model2->WriteItem(kKey2, kValue2); 330 model1->WriteItem(kKey2, kValue2);
326 ASSERT_EQ(2U, model2->db().metadata_count()); 331 ASSERT_EQ(2U, model1->db().metadata_count());
327 } 332 }
333
334 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Encryption) {
335 ASSERT_TRUE(SetupSync());
336 TestModelTypeService* model0 = GetModelTypeService(0);
337 TestModelTypeService* model1 = GetModelTypeService(1);
338
339 model0->WriteItem(kKey1, kValue1);
340 ASSERT_TRUE(DataChecker(model1, kKey1, kValue1).Wait());
341
342 GetSyncService(0)->SetEncryptionPassphrase(kPassphrase,
343 syncer::SyncService::EXPLICIT);
344 ASSERT_TRUE(PassphraseAcceptedChecker(GetSyncService(0)).Wait());
345 // Wait for client 1 to know that a passphrase is happening to avoid potential
346 // race conditions and make the functionality this case tests more consistent.
347 ASSERT_TRUE(PassphraseRequiredChecker(GetSyncService(1)).Wait());
348
349 model0->WriteItem(kKey1, kValue2);
350 model0->WriteItem(kKey2, kValue1);
351 model1->WriteItem(kKey3, kValue1);
352
353 ASSERT_TRUE(GetSyncService(1)->SetDecryptionPassphrase(kPassphrase));
354 ASSERT_TRUE(PassphraseAcceptedChecker(GetSyncService(1)).Wait());
355
356 model0->WriteItem(kKey4, kValue1);
357
358 ASSERT_TRUE(DataChecker(model1, kKey1, kValue2).Wait());
359 ASSERT_TRUE(DataChecker(model1, kKey2, kValue1).Wait());
360 ASSERT_TRUE(DataChecker(model1, kKey4, kValue1).Wait());
361
362 ASSERT_TRUE(DataChecker(model0, kKey1, kValue2).Wait());
363 ASSERT_TRUE(DataChecker(model0, kKey3, kValue1).Wait());
364 }
365
366 } // namespace
OLDNEW
« no previous file with comments | « no previous file | components/browser_sync/profile_sync_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698