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

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

Issue 2369063003: [Sync] Add an error integration test for USS. (Closed)
Patch Set: Improve 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/sync/driver/data_type_manager_impl.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/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
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
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 // Set an error in model 2 to trigger in the next GetUpdates.
332 model2->SetServiceError(syncer::SyncError::DATATYPE_ERROR);
333 // Write an item on model 1 to trigger a GetUpdates in model 2.
334 model1->WriteItem(kKey1, kValue2);
335
336 // The type should stop syncing but keep tracking metadata.
337 ASSERT_TRUE(PrefsNotRunningChecker(GetSyncService(1)).Wait());
338 ASSERT_EQ(1U, model2->db().metadata_count());
339 model2->WriteItem(kKey2, kValue2);
340 ASSERT_EQ(2U, model2->db().metadata_count());
341 }
OLDNEW
« no previous file with comments | « no previous file | components/sync/driver/data_type_manager_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698