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

Side by Side Diff: components/sync/core/processor_entity_tracker_unittest.cc

Issue 2222373003: [Sync] Adding storage key concept for ModelTypeServices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing redundant hash value. Created 4 years, 4 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/sync/core/processor_entity_tracker.h" 5 #include "components/sync/core/processor_entity_tracker.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "components/sync/base/model_type.h" 14 #include "components/sync/base/model_type.h"
15 #include "components/sync/base/time.h" 15 #include "components/sync/base/time.h"
16 #include "components/sync/core/non_blocking_sync_common.h" 16 #include "components/sync/core/non_blocking_sync_common.h"
17 #include "components/sync/protocol/sync.pb.h" 17 #include "components/sync/protocol/sync.pb.h"
18 #include "components/sync/syncable/syncable_util.h" 18 #include "components/sync/syncable/syncable_util.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 20
21 namespace syncer_v2 { 21 namespace syncer_v2 {
22 22
23 namespace { 23 namespace {
24 24
25 const std::string kTag = "tag"; 25 const char kKey[] = "key";
26 const std::string kId = "id"; 26 const char kHash[] = "hash";
27 const std::string kValue1 = "value1"; 27 const char kId[] = "id";
28 const std::string kValue2 = "value2"; 28 const char kName[] = "name";
29 const std::string kValue3 = "value3"; 29 const char kValue1[] = "value1";
30 const char kValue2[] = "value2";
31 const char kValue3[] = "value3";
30 32
31 std::string GenerateTagHash(const std::string& tag) { 33 sync_pb::EntitySpecifics GenerateSpecifics(const std::string& name,
32 return syncer::syncable::GenerateSyncableHash(syncer::PREFERENCES, tag);
33 }
34
35 sync_pb::EntitySpecifics GenerateSpecifics(const std::string& tag,
36 const std::string& value) { 34 const std::string& value) {
37 sync_pb::EntitySpecifics specifics; 35 sync_pb::EntitySpecifics specifics;
38 specifics.mutable_preference()->set_name(tag); 36 specifics.mutable_preference()->set_name(name);
39 specifics.mutable_preference()->set_value(value); 37 specifics.mutable_preference()->set_value(value);
40 return specifics; 38 return specifics;
41 } 39 }
42 40
43 std::unique_ptr<EntityData> GenerateEntityData(const std::string& tag, 41 std::unique_ptr<EntityData> GenerateEntityData(const std::string& hash,
42 const std::string& name,
44 const std::string& value) { 43 const std::string& value) {
45 std::unique_ptr<EntityData> entity_data(new EntityData()); 44 std::unique_ptr<EntityData> entity_data(new EntityData());
46 entity_data->client_tag_hash = GenerateTagHash(tag); 45 entity_data->client_tag_hash = hash;
47 entity_data->specifics = GenerateSpecifics(tag, value); 46 entity_data->specifics = GenerateSpecifics(name, value);
48 entity_data->non_unique_name = tag; 47 entity_data->non_unique_name = name;
49 return entity_data; 48 return entity_data;
50 } 49 }
51 50
52 UpdateResponseData GenerateUpdate(const ProcessorEntityTracker& entity, 51 UpdateResponseData GenerateUpdate(const ProcessorEntityTracker& entity,
52 const std::string& hash,
53 const std::string& id, 53 const std::string& id,
54 const std::string& name,
54 const std::string& value, 55 const std::string& value,
55 const base::Time& mtime, 56 const base::Time& mtime,
56 int64_t version) { 57 int64_t version) {
57 std::unique_ptr<EntityData> data = 58 std::unique_ptr<EntityData> data = GenerateEntityData(hash, name, value);
58 GenerateEntityData(entity.client_tag(), value);
59 data->id = id; 59 data->id = id;
60 data->modification_time = mtime; 60 data->modification_time = mtime;
61 UpdateResponseData update; 61 UpdateResponseData update;
62 update.entity = data->PassToPtr(); 62 update.entity = data->PassToPtr();
63 update.response_version = version; 63 update.response_version = version;
64 return update; 64 return update;
65 } 65 }
66 66
67 UpdateResponseData GenerateTombstone(const ProcessorEntityTracker& entity, 67 UpdateResponseData GenerateTombstone(const ProcessorEntityTracker& entity,
68 const std::string& hash,
68 const std::string& id, 69 const std::string& id,
70 const std::string& name,
69 const base::Time& mtime, 71 const base::Time& mtime,
70 int64_t version) { 72 int64_t version) {
71 std::unique_ptr<EntityData> data = base::WrapUnique(new EntityData()); 73 std::unique_ptr<EntityData> data = base::WrapUnique(new EntityData());
72 data->client_tag_hash = GenerateTagHash(entity.client_tag()); 74 data->client_tag_hash = hash;
73 data->non_unique_name = entity.client_tag(); 75 data->non_unique_name = name;
74 data->id = id; 76 data->id = id;
75 data->modification_time = mtime; 77 data->modification_time = mtime;
76 UpdateResponseData update; 78 UpdateResponseData update;
77 update.entity = data->PassToPtr(); 79 update.entity = data->PassToPtr();
78 update.response_version = version; 80 update.response_version = version;
79 return update; 81 return update;
80 } 82 }
81 83
82 CommitResponseData GenerateAckData(const CommitRequestData& request, 84 CommitResponseData GenerateAckData(const CommitRequestData& request,
85 const std::string id,
83 int64_t version) { 86 int64_t version) {
84 CommitResponseData response; 87 CommitResponseData response;
85 response.id = kId; 88 response.id = id;
86 response.client_tag_hash = request.entity->client_tag_hash; 89 response.client_tag_hash = request.entity->client_tag_hash;
87 response.sequence_number = request.sequence_number; 90 response.sequence_number = request.sequence_number;
88 response.response_version = version; 91 response.response_version = version;
89 response.specifics_hash = request.specifics_hash; 92 response.specifics_hash = request.specifics_hash;
90 return response; 93 return response;
91 } 94 }
92 95
93 } // namespace 96 } // namespace
94 97
95 // Some simple sanity tests for the ProcessorEntityTracker. 98 // Some simple sanity tests for the ProcessorEntityTracker.
96 // 99 //
97 // A lot of the more complicated sync logic is implemented in the 100 // A lot of the more complicated sync logic is implemented in the
98 // SharedModelTypeProcessor that owns the ProcessorEntityTracker. We can't unit 101 // SharedModelTypeProcessor that owns the ProcessorEntityTracker. We can't unit
99 // test it here. 102 // test it here.
100 // 103 //
101 // Instead, we focus on simple tests to make sure that variables are getting 104 // Instead, we focus on simple tests to make sure that variables are getting
102 // properly intialized and flags properly set. Anything more complicated would 105 // properly intialized and flags properly set. Anything more complicated would
103 // be a redundant and incomplete version of the SharedModelTypeProcessor tests. 106 // be a redundant and incomplete version of the SharedModelTypeProcessor tests.
104 class ProcessorEntityTrackerTest : public ::testing::Test { 107 class ProcessorEntityTrackerTest : public ::testing::Test {
105 public: 108 public:
106 ProcessorEntityTrackerTest() 109 ProcessorEntityTrackerTest()
107 : tag_hash_(GenerateTagHash(kTag)), 110 : ctime_(base::Time::Now() - base::TimeDelta::FromSeconds(1)) {}
108 ctime_(base::Time::Now() - base::TimeDelta::FromSeconds(1)){};
109 111
110 std::unique_ptr<ProcessorEntityTracker> CreateNew() { 112 std::unique_ptr<ProcessorEntityTracker> CreateNew() {
111 return ProcessorEntityTracker::CreateNew(kTag, tag_hash_, "", ctime_); 113 return ProcessorEntityTracker::CreateNew(kKey, kHash, "", ctime_);
112 } 114 }
113 115
114 std::unique_ptr<ProcessorEntityTracker> CreateSynced() { 116 std::unique_ptr<ProcessorEntityTracker> CreateSynced() {
115 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew(); 117 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
116 entity->RecordAcceptedUpdate( 118 entity->RecordAcceptedUpdate(
117 GenerateUpdate(*entity, kId, kValue1, ctime_, 1)); 119 GenerateUpdate(*entity, kHash, kId, kName, kValue1, ctime_, 1));
118 DCHECK(!entity->IsUnsynced()); 120 DCHECK(!entity->IsUnsynced());
119 return entity; 121 return entity;
120 } 122 }
121 123
122 const std::string tag_hash_;
123 const base::Time ctime_; 124 const base::Time ctime_;
124 }; 125 };
125 126
126 // Test the state of the default new tracker. 127 // Test the state of the default new tracker.
127 TEST_F(ProcessorEntityTrackerTest, DefaultTracker) { 128 TEST_F(ProcessorEntityTrackerTest, DefaultTracker) {
128 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew(); 129 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
129 130
130 EXPECT_EQ(kTag, entity->client_tag()); 131 EXPECT_EQ(kKey, entity->storage_key());
131 EXPECT_EQ(tag_hash_, entity->metadata().client_tag_hash()); 132 EXPECT_EQ(kHash, entity->metadata().client_tag_hash());
132 EXPECT_EQ("", entity->metadata().server_id()); 133 EXPECT_EQ("", entity->metadata().server_id());
133 EXPECT_FALSE(entity->metadata().is_deleted()); 134 EXPECT_FALSE(entity->metadata().is_deleted());
134 EXPECT_EQ(0, entity->metadata().sequence_number()); 135 EXPECT_EQ(0, entity->metadata().sequence_number());
135 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 136 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
136 EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version()); 137 EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
137 EXPECT_EQ(syncer::TimeToProtoTime(ctime_), 138 EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
138 entity->metadata().creation_time()); 139 entity->metadata().creation_time());
139 EXPECT_EQ(0, entity->metadata().modification_time()); 140 EXPECT_EQ(0, entity->metadata().modification_time());
140 EXPECT_TRUE(entity->metadata().specifics_hash().empty()); 141 EXPECT_TRUE(entity->metadata().specifics_hash().empty());
141 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 142 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
142 143
143 EXPECT_FALSE(entity->IsUnsynced()); 144 EXPECT_FALSE(entity->IsUnsynced());
144 EXPECT_FALSE(entity->RequiresCommitRequest()); 145 EXPECT_FALSE(entity->RequiresCommitRequest());
145 EXPECT_FALSE(entity->RequiresCommitData()); 146 EXPECT_FALSE(entity->RequiresCommitData());
146 EXPECT_FALSE(entity->CanClearMetadata()); 147 EXPECT_FALSE(entity->CanClearMetadata());
147 EXPECT_FALSE(entity->UpdateIsReflection(1)); 148 EXPECT_FALSE(entity->UpdateIsReflection(1));
148 EXPECT_FALSE(entity->HasCommitData()); 149 EXPECT_FALSE(entity->HasCommitData());
149 } 150 }
150 151
151 // Test creating and commiting a new local item. 152 // Test creating and commiting a new local item.
152 TEST_F(ProcessorEntityTrackerTest, NewLocalItem) { 153 TEST_F(ProcessorEntityTrackerTest, NewLocalItem) {
153 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew(); 154 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
154 entity->MakeLocalChange(GenerateEntityData(kTag, kValue1)); 155 entity->MakeLocalChange(GenerateEntityData(kHash, kName, kValue1));
155 156
156 EXPECT_EQ("", entity->metadata().server_id()); 157 EXPECT_EQ("", entity->metadata().server_id());
157 EXPECT_FALSE(entity->metadata().is_deleted()); 158 EXPECT_FALSE(entity->metadata().is_deleted());
158 EXPECT_EQ(1, entity->metadata().sequence_number()); 159 EXPECT_EQ(1, entity->metadata().sequence_number());
159 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 160 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
160 EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version()); 161 EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
161 EXPECT_NE(0, entity->metadata().modification_time()); 162 EXPECT_NE(0, entity->metadata().modification_time());
162 EXPECT_FALSE(entity->metadata().specifics_hash().empty()); 163 EXPECT_FALSE(entity->metadata().specifics_hash().empty());
163 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 164 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
164 165
(...skipping 15 matching lines...) Expand all
180 181
181 EXPECT_TRUE(entity->IsUnsynced()); 182 EXPECT_TRUE(entity->IsUnsynced());
182 EXPECT_FALSE(entity->RequiresCommitRequest()); 183 EXPECT_FALSE(entity->RequiresCommitRequest());
183 EXPECT_FALSE(entity->RequiresCommitData()); 184 EXPECT_FALSE(entity->RequiresCommitData());
184 EXPECT_FALSE(entity->CanClearMetadata()); 185 EXPECT_FALSE(entity->CanClearMetadata());
185 EXPECT_FALSE(entity->UpdateIsReflection(1)); 186 EXPECT_FALSE(entity->UpdateIsReflection(1));
186 EXPECT_TRUE(entity->HasCommitData()); 187 EXPECT_TRUE(entity->HasCommitData());
187 188
188 const EntityData& data = request.entity.value(); 189 const EntityData& data = request.entity.value();
189 EXPECT_EQ("", data.id); 190 EXPECT_EQ("", data.id);
190 EXPECT_EQ(tag_hash_, data.client_tag_hash); 191 EXPECT_EQ(kHash, data.client_tag_hash);
191 EXPECT_EQ(kTag, data.non_unique_name); 192 EXPECT_EQ(kName, data.non_unique_name);
192 EXPECT_EQ(kValue1, data.specifics.preference().value()); 193 EXPECT_EQ(kValue1, data.specifics.preference().value());
193 EXPECT_EQ(syncer::TimeToProtoTime(ctime_), 194 EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
194 syncer::TimeToProtoTime(data.creation_time)); 195 syncer::TimeToProtoTime(data.creation_time));
195 EXPECT_EQ(entity->metadata().modification_time(), 196 EXPECT_EQ(entity->metadata().modification_time(),
196 syncer::TimeToProtoTime(data.modification_time)); 197 syncer::TimeToProtoTime(data.modification_time));
197 EXPECT_FALSE(data.is_deleted()); 198 EXPECT_FALSE(data.is_deleted());
198 EXPECT_EQ(1, request.sequence_number); 199 EXPECT_EQ(1, request.sequence_number);
199 EXPECT_EQ(kUncommittedVersion, request.base_version); 200 EXPECT_EQ(kUncommittedVersion, request.base_version);
200 EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash); 201 EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
201 202
202 // Ack the commit. 203 // Ack the commit.
203 entity->ReceiveCommitResponse(GenerateAckData(request, 1)); 204 entity->ReceiveCommitResponse(GenerateAckData(request, kId, 1));
204 205
205 EXPECT_EQ(kId, entity->metadata().server_id()); 206 EXPECT_EQ(kId, entity->metadata().server_id());
206 EXPECT_FALSE(entity->metadata().is_deleted()); 207 EXPECT_FALSE(entity->metadata().is_deleted());
207 EXPECT_EQ(1, entity->metadata().sequence_number()); 208 EXPECT_EQ(1, entity->metadata().sequence_number());
208 EXPECT_EQ(1, entity->metadata().acked_sequence_number()); 209 EXPECT_EQ(1, entity->metadata().acked_sequence_number());
209 EXPECT_EQ(1, entity->metadata().server_version()); 210 EXPECT_EQ(1, entity->metadata().server_version());
210 EXPECT_EQ(metadata_v1.creation_time(), entity->metadata().creation_time()); 211 EXPECT_EQ(metadata_v1.creation_time(), entity->metadata().creation_time());
211 EXPECT_EQ(metadata_v1.modification_time(), 212 EXPECT_EQ(metadata_v1.modification_time(),
212 entity->metadata().modification_time()); 213 entity->metadata().modification_time());
213 EXPECT_FALSE(entity->metadata().specifics_hash().empty()); 214 EXPECT_FALSE(entity->metadata().specifics_hash().empty());
214 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 215 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
215 216
216 EXPECT_FALSE(entity->IsUnsynced()); 217 EXPECT_FALSE(entity->IsUnsynced());
217 EXPECT_FALSE(entity->RequiresCommitRequest()); 218 EXPECT_FALSE(entity->RequiresCommitRequest());
218 EXPECT_FALSE(entity->RequiresCommitData()); 219 EXPECT_FALSE(entity->RequiresCommitData());
219 EXPECT_FALSE(entity->CanClearMetadata()); 220 EXPECT_FALSE(entity->CanClearMetadata());
220 EXPECT_TRUE(entity->UpdateIsReflection(1)); 221 EXPECT_TRUE(entity->UpdateIsReflection(1));
221 EXPECT_FALSE(entity->HasCommitData()); 222 EXPECT_FALSE(entity->HasCommitData());
222 } 223 }
223 224
224 // Test state for a newly synced server item. 225 // Test state for a newly synced server item.
225 TEST_F(ProcessorEntityTrackerTest, NewServerItem) { 226 TEST_F(ProcessorEntityTrackerTest, NewServerItem) {
226 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew(); 227 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
227 228
228 const base::Time mtime = base::Time::Now(); 229 const base::Time mtime = base::Time::Now();
229 entity->RecordAcceptedUpdate( 230 entity->RecordAcceptedUpdate(
230 GenerateUpdate(*entity, kId, kValue1, mtime, 10)); 231 GenerateUpdate(*entity, kHash, kId, kName, kValue1, mtime, 10));
231 232
232 EXPECT_EQ(kId, entity->metadata().server_id()); 233 EXPECT_EQ(kId, entity->metadata().server_id());
233 EXPECT_FALSE(entity->metadata().is_deleted()); 234 EXPECT_FALSE(entity->metadata().is_deleted());
234 EXPECT_EQ(0, entity->metadata().sequence_number()); 235 EXPECT_EQ(0, entity->metadata().sequence_number());
235 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 236 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
236 EXPECT_EQ(10, entity->metadata().server_version()); 237 EXPECT_EQ(10, entity->metadata().server_version());
237 EXPECT_EQ(syncer::TimeToProtoTime(mtime), 238 EXPECT_EQ(syncer::TimeToProtoTime(mtime),
238 entity->metadata().modification_time()); 239 entity->metadata().modification_time());
239 EXPECT_FALSE(entity->metadata().specifics_hash().empty()); 240 EXPECT_FALSE(entity->metadata().specifics_hash().empty());
240 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 241 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
241 242
242 EXPECT_FALSE(entity->IsUnsynced()); 243 EXPECT_FALSE(entity->IsUnsynced());
243 EXPECT_FALSE(entity->RequiresCommitRequest()); 244 EXPECT_FALSE(entity->RequiresCommitRequest());
244 EXPECT_FALSE(entity->RequiresCommitData()); 245 EXPECT_FALSE(entity->RequiresCommitData());
245 EXPECT_FALSE(entity->CanClearMetadata()); 246 EXPECT_FALSE(entity->CanClearMetadata());
246 EXPECT_TRUE(entity->UpdateIsReflection(9)); 247 EXPECT_TRUE(entity->UpdateIsReflection(9));
247 EXPECT_TRUE(entity->UpdateIsReflection(10)); 248 EXPECT_TRUE(entity->UpdateIsReflection(10));
248 EXPECT_FALSE(entity->UpdateIsReflection(11)); 249 EXPECT_FALSE(entity->UpdateIsReflection(11));
249 EXPECT_FALSE(entity->HasCommitData()); 250 EXPECT_FALSE(entity->HasCommitData());
250 } 251 }
251 252
252 // Test state for a tombstone received for a previously unknown item. 253 // Test state for a tombstone received for a previously unknown item.
253 TEST_F(ProcessorEntityTrackerTest, NewServerTombstone) { 254 TEST_F(ProcessorEntityTrackerTest, NewServerTombstone) {
254 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew(); 255 std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
255 256
256 const base::Time mtime = base::Time::Now(); 257 const base::Time mtime = base::Time::Now();
257 entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 1)); 258 entity->RecordAcceptedUpdate(
259 GenerateTombstone(*entity, kHash, kId, kName, mtime, 1));
258 260
259 EXPECT_EQ(kId, entity->metadata().server_id()); 261 EXPECT_EQ(kId, entity->metadata().server_id());
260 EXPECT_TRUE(entity->metadata().is_deleted()); 262 EXPECT_TRUE(entity->metadata().is_deleted());
261 EXPECT_EQ(0, entity->metadata().sequence_number()); 263 EXPECT_EQ(0, entity->metadata().sequence_number());
262 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 264 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
263 EXPECT_EQ(1, entity->metadata().server_version()); 265 EXPECT_EQ(1, entity->metadata().server_version());
264 EXPECT_EQ(syncer::TimeToProtoTime(mtime), 266 EXPECT_EQ(syncer::TimeToProtoTime(mtime),
265 entity->metadata().modification_time()); 267 entity->metadata().modification_time());
266 EXPECT_TRUE(entity->metadata().specifics_hash().empty()); 268 EXPECT_TRUE(entity->metadata().specifics_hash().empty());
267 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 269 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
268 270
269 EXPECT_FALSE(entity->IsUnsynced()); 271 EXPECT_FALSE(entity->IsUnsynced());
270 EXPECT_FALSE(entity->RequiresCommitRequest()); 272 EXPECT_FALSE(entity->RequiresCommitRequest());
271 EXPECT_FALSE(entity->RequiresCommitData()); 273 EXPECT_FALSE(entity->RequiresCommitData());
272 EXPECT_TRUE(entity->CanClearMetadata()); 274 EXPECT_TRUE(entity->CanClearMetadata());
273 EXPECT_TRUE(entity->UpdateIsReflection(1)); 275 EXPECT_TRUE(entity->UpdateIsReflection(1));
274 EXPECT_FALSE(entity->UpdateIsReflection(2)); 276 EXPECT_FALSE(entity->UpdateIsReflection(2));
275 EXPECT_FALSE(entity->HasCommitData()); 277 EXPECT_FALSE(entity->HasCommitData());
276 } 278 }
277 279
278 // Apply a deletion update to a synced item. 280 // Apply a deletion update to a synced item.
279 TEST_F(ProcessorEntityTrackerTest, ServerTombstone) { 281 TEST_F(ProcessorEntityTrackerTest, ServerTombstone) {
280 // Start with a non-deleted state with version 1. 282 // Start with a non-deleted state with version 1.
281 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced(); 283 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
282 // A deletion update one version later. 284 // A deletion update one version later.
283 const base::Time mtime = base::Time::Now(); 285 const base::Time mtime = base::Time::Now();
284 entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 2)); 286 entity->RecordAcceptedUpdate(
287 GenerateTombstone(*entity, kHash, kId, kName, mtime, 2));
285 288
286 EXPECT_TRUE(entity->metadata().is_deleted()); 289 EXPECT_TRUE(entity->metadata().is_deleted());
287 EXPECT_EQ(0, entity->metadata().sequence_number()); 290 EXPECT_EQ(0, entity->metadata().sequence_number());
288 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 291 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
289 EXPECT_EQ(2, entity->metadata().server_version()); 292 EXPECT_EQ(2, entity->metadata().server_version());
290 EXPECT_EQ(syncer::TimeToProtoTime(mtime), 293 EXPECT_EQ(syncer::TimeToProtoTime(mtime),
291 entity->metadata().modification_time()); 294 entity->metadata().modification_time());
292 EXPECT_TRUE(entity->metadata().specifics_hash().empty()); 295 EXPECT_TRUE(entity->metadata().specifics_hash().empty());
293 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 296 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
294 297
295 EXPECT_FALSE(entity->IsUnsynced()); 298 EXPECT_FALSE(entity->IsUnsynced());
296 EXPECT_FALSE(entity->RequiresCommitRequest()); 299 EXPECT_FALSE(entity->RequiresCommitRequest());
297 EXPECT_FALSE(entity->RequiresCommitData()); 300 EXPECT_FALSE(entity->RequiresCommitData());
298 EXPECT_TRUE(entity->CanClearMetadata()); 301 EXPECT_TRUE(entity->CanClearMetadata());
299 EXPECT_TRUE(entity->UpdateIsReflection(2)); 302 EXPECT_TRUE(entity->UpdateIsReflection(2));
300 EXPECT_FALSE(entity->UpdateIsReflection(3)); 303 EXPECT_FALSE(entity->UpdateIsReflection(3));
301 EXPECT_FALSE(entity->HasCommitData()); 304 EXPECT_FALSE(entity->HasCommitData());
302 } 305 }
303 306
304 // Test a local change of a synced item. 307 // Test a local change of a synced item.
305 TEST_F(ProcessorEntityTrackerTest, LocalChange) { 308 TEST_F(ProcessorEntityTrackerTest, LocalChange) {
306 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced(); 309 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
307 const int64_t mtime_v0 = entity->metadata().modification_time(); 310 const int64_t mtime_v0 = entity->metadata().modification_time();
308 const std::string specifics_hash_v0 = entity->metadata().specifics_hash(); 311 const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
309 312
310 // Make a local change with different specifics. 313 // Make a local change with different specifics.
311 entity->MakeLocalChange(GenerateEntityData(kTag, kValue2)); 314 entity->MakeLocalChange(GenerateEntityData(kHash, kName, kValue2));
312 315
313 const int64_t mtime_v1 = entity->metadata().modification_time(); 316 const int64_t mtime_v1 = entity->metadata().modification_time();
314 const std::string specifics_hash_v1 = entity->metadata().specifics_hash(); 317 const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
315 318
316 EXPECT_FALSE(entity->metadata().is_deleted()); 319 EXPECT_FALSE(entity->metadata().is_deleted());
317 EXPECT_EQ(1, entity->metadata().sequence_number()); 320 EXPECT_EQ(1, entity->metadata().sequence_number());
318 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 321 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
319 EXPECT_EQ(1, entity->metadata().server_version()); 322 EXPECT_EQ(1, entity->metadata().server_version());
320 EXPECT_LT(mtime_v0, mtime_v1); 323 EXPECT_LT(mtime_v0, mtime_v1);
321 EXPECT_NE(specifics_hash_v0, specifics_hash_v1); 324 EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
322 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash()); 325 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
323 326
324 EXPECT_TRUE(entity->IsUnsynced()); 327 EXPECT_TRUE(entity->IsUnsynced());
325 EXPECT_TRUE(entity->RequiresCommitRequest()); 328 EXPECT_TRUE(entity->RequiresCommitRequest());
326 EXPECT_FALSE(entity->RequiresCommitData()); 329 EXPECT_FALSE(entity->RequiresCommitData());
327 EXPECT_FALSE(entity->CanClearMetadata()); 330 EXPECT_FALSE(entity->CanClearMetadata());
328 EXPECT_TRUE(entity->HasCommitData()); 331 EXPECT_TRUE(entity->HasCommitData());
329 332
330 // Make a commit. 333 // Make a commit.
331 CommitRequestData request; 334 CommitRequestData request;
332 entity->InitializeCommitRequestData(&request); 335 entity->InitializeCommitRequestData(&request);
333 336
334 EXPECT_EQ(kId, request.entity->id); 337 EXPECT_EQ(kId, request.entity->id);
335 EXPECT_FALSE(entity->RequiresCommitRequest()); 338 EXPECT_FALSE(entity->RequiresCommitRequest());
336 339
337 // Ack the commit. 340 // Ack the commit.
338 entity->ReceiveCommitResponse(GenerateAckData(request, 2)); 341 entity->ReceiveCommitResponse(GenerateAckData(request, kId, 2));
339 342
340 EXPECT_EQ(1, entity->metadata().sequence_number()); 343 EXPECT_EQ(1, entity->metadata().sequence_number());
341 EXPECT_EQ(1, entity->metadata().acked_sequence_number()); 344 EXPECT_EQ(1, entity->metadata().acked_sequence_number());
342 EXPECT_EQ(2, entity->metadata().server_version()); 345 EXPECT_EQ(2, entity->metadata().server_version());
343 EXPECT_EQ(mtime_v1, entity->metadata().modification_time()); 346 EXPECT_EQ(mtime_v1, entity->metadata().modification_time());
344 EXPECT_EQ(specifics_hash_v1, entity->metadata().specifics_hash()); 347 EXPECT_EQ(specifics_hash_v1, entity->metadata().specifics_hash());
345 EXPECT_EQ("", entity->metadata().base_specifics_hash()); 348 EXPECT_EQ("", entity->metadata().base_specifics_hash());
346 349
347 EXPECT_FALSE(entity->IsUnsynced()); 350 EXPECT_FALSE(entity->IsUnsynced());
348 EXPECT_FALSE(entity->RequiresCommitRequest()); 351 EXPECT_FALSE(entity->RequiresCommitRequest());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 entity->metadata().SerializeAsString()); 385 entity->metadata().SerializeAsString());
383 386
384 EXPECT_TRUE(entity->IsUnsynced()); 387 EXPECT_TRUE(entity->IsUnsynced());
385 EXPECT_FALSE(entity->RequiresCommitRequest()); 388 EXPECT_FALSE(entity->RequiresCommitRequest());
386 EXPECT_FALSE(entity->RequiresCommitData()); 389 EXPECT_FALSE(entity->RequiresCommitData());
387 EXPECT_FALSE(entity->CanClearMetadata()); 390 EXPECT_FALSE(entity->CanClearMetadata());
388 EXPECT_FALSE(entity->HasCommitData()); 391 EXPECT_FALSE(entity->HasCommitData());
389 392
390 const EntityData& data = request.entity.value(); 393 const EntityData& data = request.entity.value();
391 EXPECT_EQ(kId, data.id); 394 EXPECT_EQ(kId, data.id);
392 EXPECT_EQ(tag_hash_, data.client_tag_hash); 395 EXPECT_EQ(kHash, data.client_tag_hash);
393 EXPECT_EQ("", data.non_unique_name); 396 EXPECT_EQ("", data.non_unique_name);
394 EXPECT_EQ(syncer::TimeToProtoTime(ctime_), 397 EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
395 syncer::TimeToProtoTime(data.creation_time)); 398 syncer::TimeToProtoTime(data.creation_time));
396 EXPECT_EQ(entity->metadata().modification_time(), 399 EXPECT_EQ(entity->metadata().modification_time(),
397 syncer::TimeToProtoTime(data.modification_time)); 400 syncer::TimeToProtoTime(data.modification_time));
398 EXPECT_TRUE(data.is_deleted()); 401 EXPECT_TRUE(data.is_deleted());
399 EXPECT_EQ(1, request.sequence_number); 402 EXPECT_EQ(1, request.sequence_number);
400 EXPECT_EQ(1, request.base_version); 403 EXPECT_EQ(1, request.base_version);
401 EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash); 404 EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
402 405
403 // Ack the deletion. 406 // Ack the deletion.
404 entity->ReceiveCommitResponse(GenerateAckData(request, 2)); 407 entity->ReceiveCommitResponse(GenerateAckData(request, kId, 2));
405 408
406 EXPECT_TRUE(entity->metadata().is_deleted()); 409 EXPECT_TRUE(entity->metadata().is_deleted());
407 EXPECT_EQ(1, entity->metadata().sequence_number()); 410 EXPECT_EQ(1, entity->metadata().sequence_number());
408 EXPECT_EQ(1, entity->metadata().acked_sequence_number()); 411 EXPECT_EQ(1, entity->metadata().acked_sequence_number());
409 EXPECT_EQ(2, entity->metadata().server_version()); 412 EXPECT_EQ(2, entity->metadata().server_version());
410 EXPECT_EQ(metadata_v1.modification_time(), 413 EXPECT_EQ(metadata_v1.modification_time(),
411 entity->metadata().modification_time()); 414 entity->metadata().modification_time());
412 EXPECT_TRUE(entity->metadata().specifics_hash().empty()); 415 EXPECT_TRUE(entity->metadata().specifics_hash().empty());
413 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty()); 416 EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
414 417
415 EXPECT_FALSE(entity->IsUnsynced()); 418 EXPECT_FALSE(entity->IsUnsynced());
416 EXPECT_FALSE(entity->RequiresCommitRequest()); 419 EXPECT_FALSE(entity->RequiresCommitRequest());
417 EXPECT_FALSE(entity->RequiresCommitData()); 420 EXPECT_FALSE(entity->RequiresCommitData());
418 EXPECT_TRUE(entity->CanClearMetadata()); 421 EXPECT_TRUE(entity->CanClearMetadata());
419 EXPECT_FALSE(entity->HasCommitData()); 422 EXPECT_FALSE(entity->HasCommitData());
420 } 423 }
421 424
422 // Test that hashes and sequence numbers are handled correctly for the "commit 425 // Test that hashes and sequence numbers are handled correctly for the "commit
423 // commit, ack ack" case. 426 // commit, ack ack" case.
424 TEST_F(ProcessorEntityTrackerTest, LocalChangesInterleaved) { 427 TEST_F(ProcessorEntityTrackerTest, LocalChangesInterleaved) {
425 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced(); 428 std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
426 const std::string specifics_hash_v0 = entity->metadata().specifics_hash(); 429 const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
427 430
428 // Make the first change. 431 // Make the first change.
429 entity->MakeLocalChange(GenerateEntityData(kTag, kValue2)); 432 entity->MakeLocalChange(GenerateEntityData(kHash, kName, kValue2));
430 const std::string specifics_hash_v1 = entity->metadata().specifics_hash(); 433 const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
431 434
432 EXPECT_EQ(1, entity->metadata().sequence_number()); 435 EXPECT_EQ(1, entity->metadata().sequence_number());
433 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 436 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
434 EXPECT_NE(specifics_hash_v0, specifics_hash_v1); 437 EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
435 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash()); 438 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
436 439
437 // Request the first commit. 440 // Request the first commit.
438 CommitRequestData request_v1; 441 CommitRequestData request_v1;
439 entity->InitializeCommitRequestData(&request_v1); 442 entity->InitializeCommitRequestData(&request_v1);
440 443
441 // Make the second change. 444 // Make the second change.
442 entity->MakeLocalChange(GenerateEntityData(kTag, kValue3)); 445 entity->MakeLocalChange(GenerateEntityData(kHash, kName, kValue3));
443 const std::string specifics_hash_v2 = entity->metadata().specifics_hash(); 446 const std::string specifics_hash_v2 = entity->metadata().specifics_hash();
444 447
445 EXPECT_EQ(2, entity->metadata().sequence_number()); 448 EXPECT_EQ(2, entity->metadata().sequence_number());
446 EXPECT_EQ(0, entity->metadata().acked_sequence_number()); 449 EXPECT_EQ(0, entity->metadata().acked_sequence_number());
447 EXPECT_NE(specifics_hash_v1, specifics_hash_v2); 450 EXPECT_NE(specifics_hash_v1, specifics_hash_v2);
448 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash()); 451 EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
449 452
450 // Request the second commit. 453 // Request the second commit.
451 CommitRequestData request_v2; 454 CommitRequestData request_v2;
452 entity->InitializeCommitRequestData(&request_v2); 455 entity->InitializeCommitRequestData(&request_v2);
453 456
454 EXPECT_TRUE(entity->IsUnsynced()); 457 EXPECT_TRUE(entity->IsUnsynced());
455 EXPECT_FALSE(entity->RequiresCommitRequest()); 458 EXPECT_FALSE(entity->RequiresCommitRequest());
456 EXPECT_FALSE(entity->RequiresCommitData()); 459 EXPECT_FALSE(entity->RequiresCommitData());
457 EXPECT_FALSE(entity->CanClearMetadata()); 460 EXPECT_FALSE(entity->CanClearMetadata());
458 EXPECT_TRUE(entity->HasCommitData()); 461 EXPECT_TRUE(entity->HasCommitData());
459 462
460 // Ack the first commit. 463 // Ack the first commit.
461 entity->ReceiveCommitResponse(GenerateAckData(request_v1, 2)); 464 entity->ReceiveCommitResponse(GenerateAckData(request_v1, kId, 2));
462 465
463 EXPECT_EQ(2, entity->metadata().sequence_number()); 466 EXPECT_EQ(2, entity->metadata().sequence_number());
464 EXPECT_EQ(1, entity->metadata().acked_sequence_number()); 467 EXPECT_EQ(1, entity->metadata().acked_sequence_number());
465 EXPECT_EQ(2, entity->metadata().server_version()); 468 EXPECT_EQ(2, entity->metadata().server_version());
466 EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash()); 469 EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
467 EXPECT_EQ(specifics_hash_v1, entity->metadata().base_specifics_hash()); 470 EXPECT_EQ(specifics_hash_v1, entity->metadata().base_specifics_hash());
468 471
469 // Ack the second commit. 472 // Ack the second commit.
470 entity->ReceiveCommitResponse(GenerateAckData(request_v2, 3)); 473 entity->ReceiveCommitResponse(GenerateAckData(request_v2, kId, 3));
471 474
472 EXPECT_EQ(2, entity->metadata().sequence_number()); 475 EXPECT_EQ(2, entity->metadata().sequence_number());
473 EXPECT_EQ(2, entity->metadata().acked_sequence_number()); 476 EXPECT_EQ(2, entity->metadata().acked_sequence_number());
474 EXPECT_EQ(3, entity->metadata().server_version()); 477 EXPECT_EQ(3, entity->metadata().server_version());
475 EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash()); 478 EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
476 EXPECT_EQ("", entity->metadata().base_specifics_hash()); 479 EXPECT_EQ("", entity->metadata().base_specifics_hash());
477 480
478 EXPECT_FALSE(entity->IsUnsynced()); 481 EXPECT_FALSE(entity->IsUnsynced());
479 EXPECT_FALSE(entity->RequiresCommitRequest()); 482 EXPECT_FALSE(entity->RequiresCommitRequest());
480 EXPECT_FALSE(entity->RequiresCommitData()); 483 EXPECT_FALSE(entity->RequiresCommitData());
481 EXPECT_FALSE(entity->CanClearMetadata()); 484 EXPECT_FALSE(entity->CanClearMetadata());
482 EXPECT_FALSE(entity->HasCommitData()); 485 EXPECT_FALSE(entity->HasCommitData());
483 } 486 }
484 487
485 } // namespace syncer_v2 488 } // namespace syncer_v2
OLDNEW
« no previous file with comments | « components/sync/core/processor_entity_tracker.cc ('k') | components/sync/core/shared_model_type_processor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698