Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/status_change_checker.h" | 12 #include "chrome/browser/sync/test/integration/status_change_checker.h" |
| 12 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" | 13 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h" |
| 13 #include "chrome/browser/sync/test/integration/sync_test.h" | 14 #include "chrome/browser/sync/test/integration/sync_test.h" |
| 14 #include "components/browser_sync/profile_sync_components_factory_impl.h" | 15 #include "components/browser_sync/profile_sync_components_factory_impl.h" |
| 15 #include "components/browser_sync/profile_sync_service.h" | 16 #include "components/browser_sync/profile_sync_service.h" |
| 16 #include "components/sync/api/fake_model_type_service.h" | 17 #include "components/sync/api/fake_model_type_service.h" |
| 17 | 18 |
| 18 using browser_sync::ChromeSyncClient; | 19 using browser_sync::ChromeSyncClient; |
| 19 using browser_sync::ProfileSyncComponentsFactoryImpl; | 20 using browser_sync::ProfileSyncComponentsFactoryImpl; |
| 20 using syncer_v2::ConflictResolution; | 21 using syncer_v2::ConflictResolution; |
| 21 using syncer_v2::FakeModelTypeService; | 22 using syncer_v2::FakeModelTypeService; |
| 22 using syncer_v2::ModelTypeService; | 23 using syncer_v2::ModelTypeService; |
| 23 using syncer_v2::SharedModelTypeProcessor; | 24 using syncer_v2::SharedModelTypeProcessor; |
| 24 | 25 |
| 25 const char kKey1[] = "key1"; | 26 const char kKey1[] = "key1"; |
| 27 const char kKey2[] = "key2"; | |
| 26 const char kValue1[] = "value1"; | 28 const char kValue1[] = "value1"; |
| 27 const char kValue2[] = "value2"; | 29 const char kValue2[] = "value2"; |
| 28 const char kValue3[] = "value3"; | 30 const char kValue3[] = "value3"; |
| 29 | 31 |
| 30 // A ChromeSyncClient that provides a ModelTypeService for PREFERENCES. | 32 // A ChromeSyncClient that provides a ModelTypeService for PREFERENCES. |
| 31 class TestSyncClient : public ChromeSyncClient { | 33 class TestSyncClient : public ChromeSyncClient { |
| 32 public: | 34 public: |
| 33 TestSyncClient(Profile* profile, ModelTypeService* service) | 35 TestSyncClient(Profile* profile, ModelTypeService* service) |
| 34 : ChromeSyncClient(profile), service_(service) {} | 36 : ChromeSyncClient(profile), service_(service) {} |
| 35 | 37 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 std::set<Observer*> observers_; | 85 std::set<Observer*> observers_; |
| 84 }; | 86 }; |
| 85 | 87 |
| 86 // A StatusChangeChecker for checking the status of keys in a | 88 // A StatusChangeChecker for checking the status of keys in a |
| 87 // TestModelTypeService::Store. | 89 // TestModelTypeService::Store. |
| 88 class KeyChecker : public StatusChangeChecker, | 90 class KeyChecker : public StatusChangeChecker, |
| 89 public TestModelTypeService::Observer { | 91 public TestModelTypeService::Observer { |
| 90 public: | 92 public: |
| 91 KeyChecker(TestModelTypeService* service, const std::string& key) | 93 KeyChecker(TestModelTypeService* service, const std::string& key) |
| 92 : service_(service), key_(key) {} | 94 : service_(service), key_(key) {} |
| 93 ~KeyChecker() override {} | |
| 94 | 95 |
| 95 void OnApplySyncChanges() override { CheckExitCondition(); } | 96 void OnApplySyncChanges() override { CheckExitCondition(); } |
| 96 | 97 |
| 97 bool Wait() { | 98 bool Wait() { |
| 98 if (IsExitConditionSatisfied()) { | 99 if (IsExitConditionSatisfied()) { |
| 99 DVLOG(1) << "Wait() -> Exit before waiting: " << GetDebugMessage(); | 100 DVLOG(1) << "Wait() -> Exit before waiting: " << GetDebugMessage(); |
| 100 return true; | 101 return true; |
| 101 } | 102 } |
| 102 | 103 |
| 103 service_->AddObserver(this); | 104 service_->AddObserver(this); |
| 104 StartBlockingWait(); | 105 StartBlockingWait(); |
| 105 service_->RemoveObserver(this); | 106 service_->RemoveObserver(this); |
| 106 return !TimedOut(); | 107 return !TimedOut(); |
| 107 } | 108 } |
| 108 | 109 |
| 109 protected: | 110 protected: |
| 110 TestModelTypeService* const service_; | 111 TestModelTypeService* const service_; |
| 111 const std::string key_; | 112 const std::string key_; |
| 112 }; | 113 }; |
| 113 | 114 |
| 114 // Wait for data for a key to have a certain value. | 115 // Wait for data for a key to have a certain value. |
| 115 class DataChecker : public KeyChecker { | 116 class DataChecker : public KeyChecker { |
| 116 public: | 117 public: |
| 117 DataChecker(TestModelTypeService* service, | 118 DataChecker(TestModelTypeService* service, |
| 118 const std::string& key, | 119 const std::string& key, |
| 119 const std::string& value) | 120 const std::string& value) |
| 120 : KeyChecker(service, key), value_(value) {} | 121 : KeyChecker(service, key), value_(value) {} |
| 121 ~DataChecker() override {} | |
| 122 | 122 |
| 123 bool IsExitConditionSatisfied() override { | 123 bool IsExitConditionSatisfied() override { |
| 124 const auto& db = service_->db(); | 124 const auto& db = service_->db(); |
| 125 return db.HasData(key_) && db.GetValue(key_) == value_; | 125 return db.HasData(key_) && db.GetValue(key_) == value_; |
| 126 } | 126 } |
| 127 | 127 |
| 128 std::string GetDebugMessage() const override { | 128 std::string GetDebugMessage() const override { |
| 129 return "Waiting for data for key '" + key_ + "' to be '" + value_ + "'."; | 129 return "Waiting for data for key '" + key_ + "' to be '" + value_ + "'."; |
| 130 } | 130 } |
| 131 | 131 |
| 132 private: | 132 private: |
| 133 const std::string value_; | 133 const std::string value_; |
| 134 }; | 134 }; |
| 135 | 135 |
| 136 // Wait for data for a key to be absent. | 136 // Wait for data for a key to be absent. |
| 137 class DataAbsentChecker : public KeyChecker { | 137 class DataAbsentChecker : public KeyChecker { |
| 138 public: | 138 public: |
| 139 DataAbsentChecker(TestModelTypeService* service, const std::string& key) | 139 DataAbsentChecker(TestModelTypeService* service, const std::string& key) |
| 140 : KeyChecker(service, key) {} | 140 : KeyChecker(service, key) {} |
| 141 ~DataAbsentChecker() override {} | |
| 142 | 141 |
| 143 bool IsExitConditionSatisfied() override { | 142 bool IsExitConditionSatisfied() override { |
| 144 return !service_->db().HasData(key_); | 143 return !service_->db().HasData(key_); |
| 145 } | 144 } |
| 146 | 145 |
| 147 std::string GetDebugMessage() const override { | 146 std::string GetDebugMessage() const override { |
| 148 return "Waiting for data for key '" + key_ + "' to be absent."; | 147 return "Waiting for data for key '" + key_ + "' to be absent."; |
| 149 } | 148 } |
| 150 }; | 149 }; |
| 151 | 150 |
| 152 // Wait for metadata for a key to be present. | 151 // Wait for metadata for a key to be present. |
| 153 class MetadataPresentChecker : public KeyChecker { | 152 class MetadataPresentChecker : public KeyChecker { |
| 154 public: | 153 public: |
| 155 MetadataPresentChecker(TestModelTypeService* service, const std::string& key) | 154 MetadataPresentChecker(TestModelTypeService* service, const std::string& key) |
| 156 : KeyChecker(service, key) {} | 155 : KeyChecker(service, key) {} |
| 157 ~MetadataPresentChecker() override {} | |
| 158 | 156 |
| 159 bool IsExitConditionSatisfied() override { | 157 bool IsExitConditionSatisfied() override { |
| 160 return service_->db().HasMetadata(key_); | 158 return service_->db().HasMetadata(key_); |
| 161 } | 159 } |
| 162 | 160 |
| 163 std::string GetDebugMessage() const override { | 161 std::string GetDebugMessage() const override { |
| 164 return "Waiting for metadata for key '" + key_ + "' to be present."; | 162 return "Waiting for metadata for key '" + key_ + "' to be present."; |
| 165 } | 163 } |
| 166 }; | 164 }; |
| 167 | 165 |
| 168 // Wait for metadata for a key to be absent. | 166 // Wait for metadata for a key to be absent. |
| 169 class MetadataAbsentChecker : public KeyChecker { | 167 class MetadataAbsentChecker : public KeyChecker { |
| 170 public: | 168 public: |
| 171 MetadataAbsentChecker(TestModelTypeService* service, const std::string& key) | 169 MetadataAbsentChecker(TestModelTypeService* service, const std::string& key) |
| 172 : KeyChecker(service, key) {} | 170 : KeyChecker(service, key) {} |
| 173 ~MetadataAbsentChecker() override {} | |
| 174 | 171 |
| 175 bool IsExitConditionSatisfied() override { | 172 bool IsExitConditionSatisfied() override { |
| 176 return !service_->db().HasMetadata(key_); | 173 return !service_->db().HasMetadata(key_); |
| 177 } | 174 } |
| 178 | 175 |
| 179 std::string GetDebugMessage() const override { | 176 std::string GetDebugMessage() const override { |
| 180 return "Waiting for metadata for key '" + key_ + "' to be absent."; | 177 return "Waiting for metadata for key '" + key_ + "' to be absent."; |
| 181 } | 178 } |
| 182 }; | 179 }; |
| 183 | 180 |
| 181 // Wait for PREFERENCES to no longer be running. | |
| 182 class PrefsNotRunningChecker : public SingleClientStatusChangeChecker { | |
| 183 public: | |
| 184 explicit PrefsNotRunningChecker(browser_sync::ProfileSyncService* service) | |
| 185 : SingleClientStatusChangeChecker(service) {} | |
| 186 | |
| 187 bool Wait() { | |
| 188 SingleClientStatusChangeChecker::Wait(); | |
| 189 return !TimedOut(); | |
| 190 } | |
| 191 | |
| 192 bool IsExitConditionSatisfied() override { | |
| 193 return !service()->IsDataTypeControllerRunning(syncer::PREFERENCES); | |
| 194 } | |
| 195 | |
| 196 std::string GetDebugMessage() const override { | |
| 197 return "Waiting for prefs to be not running."; | |
| 198 } | |
| 199 }; | |
| 200 | |
| 184 class TwoClientUssSyncTest : public SyncTest { | 201 class TwoClientUssSyncTest : public SyncTest { |
| 185 public: | 202 public: |
| 186 TwoClientUssSyncTest() : SyncTest(TWO_CLIENT) { | 203 TwoClientUssSyncTest() : SyncTest(TWO_CLIENT) { |
| 187 DisableVerifier(); | 204 DisableVerifier(); |
| 188 sync_client_factory_ = base::Bind(&TwoClientUssSyncTest::CreateSyncClient, | 205 sync_client_factory_ = base::Bind(&TwoClientUssSyncTest::CreateSyncClient, |
| 189 base::Unretained(this)); | 206 base::Unretained(this)); |
| 190 ProfileSyncServiceFactory::SetSyncClientFactoryForTest( | 207 ProfileSyncServiceFactory::SetSyncClientFactoryForTest( |
| 191 &sync_client_factory_); | 208 &sync_client_factory_); |
| 192 ProfileSyncComponentsFactoryImpl::OverridePrefsForUssTest(true); | 209 ProfileSyncComponentsFactoryImpl::OverridePrefsForUssTest(true); |
| 193 } | 210 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 | 311 |
| 295 // Write conflicting entities. | 312 // Write conflicting entities. |
| 296 model1->WriteItem(kKey1, kValue1); | 313 model1->WriteItem(kKey1, kValue1); |
| 297 model2->WriteItem(kKey1, kValue2); | 314 model2->WriteItem(kKey1, kValue2); |
| 298 | 315 |
| 299 // Wait for them to be resolved to kResolutionValue by the custom conflict | 316 // Wait for them to be resolved to kResolutionValue by the custom conflict |
| 300 // resolution logic in TestModelTypeService. | 317 // resolution logic in TestModelTypeService. |
| 301 ASSERT_TRUE(DataChecker(model1, kKey1, kValue3).Wait()); | 318 ASSERT_TRUE(DataChecker(model1, kKey1, kValue3).Wait()); |
| 302 ASSERT_TRUE(DataChecker(model2, kKey1, kValue3).Wait()); | 319 ASSERT_TRUE(DataChecker(model2, kKey1, kValue3).Wait()); |
| 303 } | 320 } |
| 321 | |
| 322 IN_PROC_BROWSER_TEST_F(TwoClientUssSyncTest, Error) { | |
| 323 ASSERT_TRUE(SetupSync()); | |
| 324 TestModelTypeService* model1 = GetModelTypeService(0); | |
| 325 TestModelTypeService* model2 = GetModelTypeService(1); | |
| 326 | |
| 327 // Add an entity. | |
| 328 model1->WriteItem(kKey1, kValue1); | |
| 329 ASSERT_TRUE(DataChecker(model2, kKey1, kValue1).Wait()); | |
| 330 | |
| 331 // Queue an error in model 2 and trigger a GetUpdates. | |
|
skym
2016/09/28 21:53:34
As we talked about offline, expand this comment to
maxbogue
2016/09/28 22:36:30
Done.
| |
| 332 model2->SetServiceError(syncer::SyncError::DATATYPE_ERROR); | |
| 333 model1->WriteItem(kKey1, kValue2); | |
| 334 | |
| 335 // The type should stop syncing but keep tracking metadata. | |
| 336 ASSERT_TRUE(PrefsNotRunningChecker(GetSyncService(1)).Wait()); | |
| 337 ASSERT_EQ(1U, model2->db().metadata_count()); | |
| 338 model2->WriteItem(kKey2, kValue2); | |
| 339 ASSERT_EQ(2U, model2->db().metadata_count()); | |
| 340 } | |
| OLD | NEW |