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

Side by Side Diff: components/sync/engine_impl/syncer_unittest.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. 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
« no previous file with comments | « components/sync/engine_impl/syncer_types.h ('k') | components/sync/engine_impl/syncer_util.h » ('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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 // Syncer unit tests. Unfortunately a lot of these tests 5 // Syncer unit tests. Unfortunately a lot of these tests
6 // are outdated and need to be reworked and updated. 6 // are outdated and need to be reworked and updated.
7 7
8 #include "sync/engine/syncer.h" 8 #include "components/sync/engine_impl/syncer.h"
9 9
10 #include <stddef.h> 10 #include <stddef.h>
11 #include <stdint.h> 11 #include <stdint.h>
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <limits> 14 #include <limits>
15 #include <list> 15 #include <list>
16 #include <map> 16 #include <map>
17 #include <memory> 17 #include <memory>
18 #include <set> 18 #include <set>
19 #include <string> 19 #include <string>
20 20
21 #include "base/bind.h" 21 #include "base/bind.h"
22 #include "base/bind_helpers.h" 22 #include "base/bind_helpers.h"
23 #include "base/callback.h" 23 #include "base/callback.h"
24 #include "base/compiler_specific.h" 24 #include "base/compiler_specific.h"
25 #include "base/location.h" 25 #include "base/location.h"
26 #include "base/macros.h" 26 #include "base/macros.h"
27 #include "base/message_loop/message_loop.h" 27 #include "base/message_loop/message_loop.h"
28 #include "base/strings/string_number_conversions.h" 28 #include "base/strings/string_number_conversions.h"
29 #include "base/test/histogram_tester.h" 29 #include "base/test/histogram_tester.h"
30 #include "base/time/time.h" 30 #include "base/time/time.h"
31 #include "build/build_config.h" 31 #include "build/build_config.h"
32 #include "sync/engine/backoff_delay_provider.h" 32 #include "components/sync/base/cancelation_signal.h"
33 #include "sync/engine/get_commit_ids.h" 33 #include "components/sync/base/cryptographer.h"
34 #include "sync/engine/net/server_connection_manager.h" 34 #include "components/sync/base/extensions_activity.h"
35 #include "sync/engine/sync_scheduler_impl.h" 35 #include "components/sync/base/model_type.h"
36 #include "sync/engine/syncer_proto_util.h" 36 #include "components/sync/base/time.h"
37 #include "sync/internal_api/public/base/cancelation_signal.h" 37 #include "components/sync/engine/model_safe_worker.h"
38 #include "sync/internal_api/public/base/model_type.h" 38 #include "components/sync/engine_impl/backoff_delay_provider.h"
39 #include "sync/internal_api/public/engine/model_safe_worker.h" 39 #include "components/sync/engine_impl/get_commit_ids.h"
40 #include "sync/internal_api/public/sessions/commit_counters.h" 40 #include "components/sync/engine_impl/net/server_connection_manager.h"
41 #include "sync/internal_api/public/sessions/status_counters.h" 41 #include "components/sync/engine_impl/sync_scheduler_impl.h"
42 #include "sync/internal_api/public/sessions/update_counters.h" 42 #include "components/sync/engine_impl/syncer_proto_util.h"
43 #include "sync/protocol/bookmark_specifics.pb.h" 43 #include "components/sync/protocol/bookmark_specifics.pb.h"
44 #include "sync/protocol/nigori_specifics.pb.h" 44 #include "components/sync/protocol/nigori_specifics.pb.h"
45 #include "sync/protocol/preference_specifics.pb.h" 45 #include "components/sync/protocol/preference_specifics.pb.h"
46 #include "sync/protocol/sync.pb.h" 46 #include "components/sync/protocol/sync.pb.h"
47 #include "sync/sessions/sync_session_context.h" 47 #include "components/sync/sessions/commit_counters.h"
48 #include "sync/syncable/mutable_entry.h" 48 #include "components/sync/sessions/status_counters.h"
49 #include "sync/syncable/nigori_util.h" 49 #include "components/sync/sessions/update_counters.h"
50 #include "sync/syncable/syncable_delete_journal.h" 50 #include "components/sync/sessions_impl/sync_session_context.h"
51 #include "sync/syncable/syncable_read_transaction.h" 51 #include "components/sync/syncable/mutable_entry.h"
52 #include "sync/syncable/syncable_util.h" 52 #include "components/sync/syncable/nigori_util.h"
53 #include "sync/syncable/syncable_write_transaction.h" 53 #include "components/sync/syncable/syncable_delete_journal.h"
54 #include "sync/test/engine/fake_model_worker.h" 54 #include "components/sync/syncable/syncable_read_transaction.h"
55 #include "sync/test/engine/mock_connection_manager.h" 55 #include "components/sync/syncable/syncable_util.h"
56 #include "sync/test/engine/mock_nudge_handler.h" 56 #include "components/sync/syncable/syncable_write_transaction.h"
57 #include "sync/test/engine/test_directory_setter_upper.h" 57 #include "components/sync/test/engine/fake_model_worker.h"
58 #include "sync/test/engine/test_id_factory.h" 58 #include "components/sync/test/engine/mock_connection_manager.h"
59 #include "sync/test/engine/test_syncable_utils.h" 59 #include "components/sync/test/engine/mock_nudge_handler.h"
60 #include "sync/test/fake_encryptor.h" 60 #include "components/sync/test/engine/test_directory_setter_upper.h"
61 #include "sync/test/fake_sync_encryption_handler.h" 61 #include "components/sync/test/engine/test_id_factory.h"
62 #include "sync/test/sessions/mock_debug_info_getter.h" 62 #include "components/sync/test/engine/test_syncable_utils.h"
63 #include "sync/util/cryptographer.h" 63 #include "components/sync/test/fake_encryptor.h"
64 #include "sync/util/extensions_activity.h" 64 #include "components/sync/test/fake_sync_encryption_handler.h"
65 #include "sync/util/time.h" 65 #include "components/sync/test/sessions/mock_debug_info_getter.h"
66 #include "testing/gmock/include/gmock/gmock.h" 66 #include "testing/gmock/include/gmock/gmock.h"
67 #include "testing/gtest/include/gtest/gtest.h" 67 #include "testing/gtest/include/gtest/gtest.h"
68 68
69 using base::TimeDelta; 69 using base::TimeDelta;
70 70
71 using std::count; 71 using std::count;
72 using std::map; 72 using std::map;
73 using std::multimap; 73 using std::multimap;
74 using std::set; 74 using std::set;
75 using std::string; 75 using std::string;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 184
185 } // namespace 185 } // namespace
186 186
187 class SyncerTest : public testing::Test, 187 class SyncerTest : public testing::Test,
188 public SyncSession::Delegate, 188 public SyncSession::Delegate,
189 public SyncEngineEventListener { 189 public SyncEngineEventListener {
190 protected: 190 protected:
191 SyncerTest() 191 SyncerTest()
192 : extensions_activity_(new ExtensionsActivity), 192 : extensions_activity_(new ExtensionsActivity),
193 syncer_(NULL), 193 syncer_(NULL),
194 last_client_invalidation_hint_buffer_size_(10) { 194 last_client_invalidation_hint_buffer_size_(10) {}
195 }
196 195
197 // SyncSession::Delegate implementation. 196 // SyncSession::Delegate implementation.
198 void OnThrottled(const base::TimeDelta& throttle_duration) override { 197 void OnThrottled(const base::TimeDelta& throttle_duration) override {
199 FAIL() << "Should not get silenced."; 198 FAIL() << "Should not get silenced.";
200 } 199 }
201 void OnTypesThrottled(ModelTypeSet types, 200 void OnTypesThrottled(ModelTypeSet types,
202 const base::TimeDelta& throttle_duration) override { 201 const base::TimeDelta& throttle_duration) override {
203 scheduler_->OnTypesThrottled(types, throttle_duration); 202 scheduler_->OnTypesThrottled(types, throttle_duration);
204 } 203 }
205 bool IsCurrentlyThrottled() override { return false; } 204 bool IsCurrentlyThrottled() override { return false; }
(...skipping 19 matching lines...) Expand all
225 last_client_invalidation_hint_buffer_size_ = size; 224 last_client_invalidation_hint_buffer_size_ = size;
226 } 225 }
227 void OnReceivedGuRetryDelay(const base::TimeDelta& delay) override {} 226 void OnReceivedGuRetryDelay(const base::TimeDelta& delay) override {}
228 void OnReceivedMigrationRequest(ModelTypeSet types) override {} 227 void OnReceivedMigrationRequest(ModelTypeSet types) override {}
229 void OnProtocolEvent(const ProtocolEvent& event) override {} 228 void OnProtocolEvent(const ProtocolEvent& event) override {}
230 void OnSyncProtocolError(const SyncProtocolError& error) override {} 229 void OnSyncProtocolError(const SyncProtocolError& error) override {}
231 230
232 void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { 231 void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) {
233 // We're just testing the sync engine here, so we shunt everything to 232 // We're just testing the sync engine here, so we shunt everything to
234 // the SyncerThread. Datatypes which aren't enabled aren't in the map. 233 // the SyncerThread. Datatypes which aren't enabled aren't in the map.
235 for (ModelTypeSet::Iterator it = enabled_datatypes_.First(); 234 for (ModelTypeSet::Iterator it = enabled_datatypes_.First(); it.Good();
236 it.Good(); it.Inc()) { 235 it.Inc()) {
237 (*out)[it.Get()] = GROUP_PASSIVE; 236 (*out)[it.Get()] = GROUP_PASSIVE;
238 } 237 }
239 } 238 }
240 239
241 void OnSyncCycleEvent(const SyncCycleEvent& event) override { 240 void OnSyncCycleEvent(const SyncCycleEvent& event) override {
242 DVLOG(1) << "HandleSyncEngineEvent in unittest " << event.what_happened; 241 DVLOG(1) << "HandleSyncEngineEvent in unittest " << event.what_happened;
243 // we only test for entry-specific events, not status changed ones. 242 // we only test for entry-specific events, not status changed ones.
244 switch (event.what_happened) { 243 switch (event.what_happened) {
245 case SyncCycleEvent::SYNC_CYCLE_BEGIN: // Fall through. 244 case SyncCycleEvent::SYNC_CYCLE_BEGIN: // Fall through.
246 case SyncCycleEvent::STATUS_CHANGED: 245 case SyncCycleEvent::STATUS_CHANGED:
(...skipping 13 matching lines...) Expand all
260 session_.reset(SyncSession::Build(context_.get(), this)); 259 session_.reset(SyncSession::Build(context_.get(), this));
261 } 260 }
262 261
263 bool SyncShareNudge() { 262 bool SyncShareNudge() {
264 ResetSession(); 263 ResetSession();
265 264
266 // Pretend we've seen a local change, to make the nudge_tracker look normal. 265 // Pretend we've seen a local change, to make the nudge_tracker look normal.
267 nudge_tracker_.RecordLocalChange(ModelTypeSet(BOOKMARKS)); 266 nudge_tracker_.RecordLocalChange(ModelTypeSet(BOOKMARKS));
268 267
269 return syncer_->NormalSyncShare(context_->GetEnabledTypes(), 268 return syncer_->NormalSyncShare(context_->GetEnabledTypes(),
270 &nudge_tracker_, session_.get()); 269 &nudge_tracker_, session_.get());
271 } 270 }
272 271
273 bool SyncShareConfigure() { 272 bool SyncShareConfigure() {
274 ResetSession(); 273 ResetSession();
275 return syncer_->ConfigureSyncShare( 274 return syncer_->ConfigureSyncShare(
276 context_->GetEnabledTypes(), 275 context_->GetEnabledTypes(),
277 sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, 276 sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, session_.get());
278 session_.get());
279 } 277 }
280 278
281 void SetUp() override { 279 void SetUp() override {
282 dir_maker_.SetUp(); 280 dir_maker_.SetUp();
283 mock_server_.reset(new MockConnectionManager(directory(), 281 mock_server_.reset(
284 &cancelation_signal_)); 282 new MockConnectionManager(directory(), &cancelation_signal_));
285 debug_info_getter_.reset(new MockDebugInfoGetter); 283 debug_info_getter_.reset(new MockDebugInfoGetter);
286 EnableDatatype(BOOKMARKS); 284 EnableDatatype(BOOKMARKS);
287 EnableDatatype(EXTENSIONS); 285 EnableDatatype(EXTENSIONS);
288 EnableDatatype(NIGORI); 286 EnableDatatype(NIGORI);
289 EnableDatatype(PREFERENCES); 287 EnableDatatype(PREFERENCES);
290 EnableDatatype(NIGORI); 288 EnableDatatype(NIGORI);
291 workers_.push_back(scoped_refptr<ModelSafeWorker>( 289 workers_.push_back(
292 new FakeModelWorker(GROUP_PASSIVE))); 290 scoped_refptr<ModelSafeWorker>(new FakeModelWorker(GROUP_PASSIVE)));
293 std::vector<SyncEngineEventListener*> listeners; 291 std::vector<SyncEngineEventListener*> listeners;
294 listeners.push_back(this); 292 listeners.push_back(this);
295 293
296 ModelSafeRoutingInfo routing_info; 294 ModelSafeRoutingInfo routing_info;
297 GetModelSafeRoutingInfo(&routing_info); 295 GetModelSafeRoutingInfo(&routing_info);
298 296
299 model_type_registry_.reset( 297 model_type_registry_.reset(
300 new ModelTypeRegistry(workers_, directory(), &mock_nudge_handler_)); 298 new ModelTypeRegistry(workers_, directory(), &mock_nudge_handler_));
301 model_type_registry_->RegisterDirectoryTypeDebugInfoObserver( 299 model_type_registry_->RegisterDirectoryTypeDebugInfoObserver(
302 &debug_info_cache_); 300 &debug_info_cache_);
303 301
304 context_.reset(new SyncSessionContext( 302 context_.reset(new SyncSessionContext(
305 mock_server_.get(), 303 mock_server_.get(), directory(), extensions_activity_.get(), listeners,
306 directory(), 304 debug_info_getter_.get(), model_type_registry_.get(),
307 extensions_activity_.get(),
308 listeners,
309 debug_info_getter_.get(),
310 model_type_registry_.get(),
311 true, // enable keystore encryption 305 true, // enable keystore encryption
312 false, // force enable pre-commit GU avoidance experiment 306 false, // force enable pre-commit GU avoidance experiment
313 "fake_invalidator_client_id")); 307 "fake_invalidator_client_id"));
314 context_->SetRoutingInfo(routing_info); 308 context_->SetRoutingInfo(routing_info);
315 syncer_ = new Syncer(&cancelation_signal_); 309 syncer_ = new Syncer(&cancelation_signal_);
316 scheduler_.reset(new SyncSchedulerImpl( 310 scheduler_.reset(new SyncSchedulerImpl(
317 "TestSyncScheduler", 311 "TestSyncScheduler", BackoffDelayProvider::FromDefaults(),
318 BackoffDelayProvider::FromDefaults(),
319 context_.get(), 312 context_.get(),
320 // scheduler_ owned syncer_ now and will manage the memory of syncer_ 313 // scheduler_ owned syncer_ now and will manage the memory of syncer_
321 syncer_)); 314 syncer_));
322 315
323 syncable::ReadTransaction trans(FROM_HERE, directory()); 316 syncable::ReadTransaction trans(FROM_HERE, directory());
324 syncable::Directory::Metahandles children; 317 syncable::Directory::Metahandles children;
325 directory()->GetChildHandlesById(&trans, trans.root_id(), &children); 318 directory()->GetChildHandlesById(&trans, trans.root_id(), &children);
326 ASSERT_EQ(0u, children.size()); 319 ASSERT_EQ(0u, children.size());
327 root_id_ = TestIdFactory::root(); 320 root_id_ = TestIdFactory::root();
328 parent_id_ = ids_.MakeServer("parent id"); 321 parent_id_ = ids_.MakeServer("parent id");
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 } 383 }
391 384
392 sync_pb::EntitySpecifics DefaultPreferencesSpecifics() { 385 sync_pb::EntitySpecifics DefaultPreferencesSpecifics() {
393 sync_pb::EntitySpecifics result; 386 sync_pb::EntitySpecifics result;
394 AddDefaultFieldValue(PREFERENCES, &result); 387 AddDefaultFieldValue(PREFERENCES, &result);
395 return result; 388 return result;
396 } 389 }
397 // Enumeration of alterations to entries for commit ordering tests. 390 // Enumeration of alterations to entries for commit ordering tests.
398 enum EntryFeature { 391 enum EntryFeature {
399 LIST_END = 0, // Denotes the end of the list of features from below. 392 LIST_END = 0, // Denotes the end of the list of features from below.
400 SYNCED, // Items are unsynced by default 393 SYNCED, // Items are unsynced by default
401 DELETED, 394 DELETED,
402 OLD_MTIME, 395 OLD_MTIME,
403 MOVED_FROM_ROOT, 396 MOVED_FROM_ROOT,
404 }; 397 };
405 398
406 struct CommitOrderingTest { 399 struct CommitOrderingTest {
407 // expected commit index. 400 // expected commit index.
408 int commit_index; 401 int commit_index;
409 // Details about the item 402 // Details about the item
410 syncable::Id id; 403 syncable::Id id;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 entry.PutIsDir(true); 436 entry.PutIsDir(true);
444 entry.PutIsUnsynced(true); 437 entry.PutIsUnsynced(true);
445 entry.PutSpecifics(DefaultBookmarkSpecifics()); 438 entry.PutSpecifics(DefaultBookmarkSpecifics());
446 // Set the time to 30 seconds in the future to reduce the chance of 439 // Set the time to 30 seconds in the future to reduce the chance of
447 // flaky tests. 440 // flaky tests.
448 const base::Time& now_plus_30s = 441 const base::Time& now_plus_30s =
449 base::Time::Now() + base::TimeDelta::FromSeconds(30); 442 base::Time::Now() + base::TimeDelta::FromSeconds(30);
450 const base::Time& now_minus_2h = 443 const base::Time& now_minus_2h =
451 base::Time::Now() - base::TimeDelta::FromHours(2); 444 base::Time::Now() - base::TimeDelta::FromHours(2);
452 entry.PutMtime(now_plus_30s); 445 entry.PutMtime(now_plus_30s);
453 for (size_t i = 0 ; i < arraysize(test->features) ; ++i) { 446 for (size_t i = 0; i < arraysize(test->features); ++i) {
454 switch (test->features[i]) { 447 switch (test->features[i]) {
455 case LIST_END: 448 case LIST_END:
456 break; 449 break;
457 case SYNCED: 450 case SYNCED:
458 entry.PutIsUnsynced(false); 451 entry.PutIsUnsynced(false);
459 break; 452 break;
460 case DELETED: 453 case DELETED:
461 entry.PutIsDel(true); 454 entry.PutIsDel(true);
462 break; 455 break;
463 case OLD_MTIME: 456 case OLD_MTIME:
(...skipping 25 matching lines...) Expand all
489 } 482 }
490 483
491 UpdateCounters GetUpdateCounters(ModelType type) { 484 UpdateCounters GetUpdateCounters(ModelType type) {
492 return debug_info_cache_.GetLatestUpdateCounters(type); 485 return debug_info_cache_.GetLatestUpdateCounters(type);
493 } 486 }
494 487
495 StatusCounters GetStatusCounters(ModelType type) { 488 StatusCounters GetStatusCounters(ModelType type) {
496 return debug_info_cache_.GetLatestStatusCounters(type); 489 return debug_info_cache_.GetLatestStatusCounters(type);
497 } 490 }
498 491
499 Directory* directory() { 492 Directory* directory() { return dir_maker_.directory(); }
500 return dir_maker_.directory();
501 }
502 493
503 const std::string local_cache_guid() { 494 const std::string local_cache_guid() { return directory()->cache_guid(); }
504 return directory()->cache_guid();
505 }
506 495
507 const std::string foreign_cache_guid() { 496 const std::string foreign_cache_guid() { return "kqyg7097kro6GSUod+GSg=="; }
508 return "kqyg7097kro6GSUod+GSg==";
509 }
510 497
511 int64_t CreateUnsyncedDirectory(const string& entry_name, 498 int64_t CreateUnsyncedDirectory(const string& entry_name,
512 const string& idstring) { 499 const string& idstring) {
513 return CreateUnsyncedDirectory(entry_name, 500 return CreateUnsyncedDirectory(entry_name,
514 syncable::Id::CreateFromServerId(idstring)); 501 syncable::Id::CreateFromServerId(idstring));
515 } 502 }
516 503
517 int64_t CreateUnsyncedDirectory(const string& entry_name, 504 int64_t CreateUnsyncedDirectory(const string& entry_name,
518 const syncable::Id& id) { 505 const syncable::Id& id) {
519 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 506 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
520 MutableEntry entry( 507 MutableEntry entry(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(),
521 &wtrans, CREATE, BOOKMARKS, wtrans.root_id(), entry_name); 508 entry_name);
522 EXPECT_TRUE(entry.good()); 509 EXPECT_TRUE(entry.good());
523 entry.PutIsUnsynced(true); 510 entry.PutIsUnsynced(true);
524 entry.PutIsDir(true); 511 entry.PutIsDir(true);
525 entry.PutSpecifics(DefaultBookmarkSpecifics()); 512 entry.PutSpecifics(DefaultBookmarkSpecifics());
526 entry.PutBaseVersion(id.ServerKnows() ? 1 : 0); 513 entry.PutBaseVersion(id.ServerKnows() ? 1 : 0);
527 entry.PutId(id); 514 entry.PutId(id);
528 return entry.GetMetahandle(); 515 return entry.GetMetahandle();
529 } 516 }
530 517
531 void EnableDatatype(ModelType model_type) { 518 void EnableDatatype(ModelType model_type) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 TypeDebugInfoCache debug_info_cache_; 581 TypeDebugInfoCache debug_info_cache_;
595 MockNudgeHandler mock_nudge_handler_; 582 MockNudgeHandler mock_nudge_handler_;
596 std::unique_ptr<ModelTypeRegistry> model_type_registry_; 583 std::unique_ptr<ModelTypeRegistry> model_type_registry_;
597 std::unique_ptr<SyncSchedulerImpl> scheduler_; 584 std::unique_ptr<SyncSchedulerImpl> scheduler_;
598 std::unique_ptr<SyncSessionContext> context_; 585 std::unique_ptr<SyncSessionContext> context_;
599 base::TimeDelta last_short_poll_interval_received_; 586 base::TimeDelta last_short_poll_interval_received_;
600 base::TimeDelta last_long_poll_interval_received_; 587 base::TimeDelta last_long_poll_interval_received_;
601 base::TimeDelta last_sessions_commit_delay_; 588 base::TimeDelta last_sessions_commit_delay_;
602 base::TimeDelta last_bookmarks_commit_delay_; 589 base::TimeDelta last_bookmarks_commit_delay_;
603 int last_client_invalidation_hint_buffer_size_; 590 int last_client_invalidation_hint_buffer_size_;
604 std::vector<scoped_refptr<ModelSafeWorker> > workers_; 591 std::vector<scoped_refptr<ModelSafeWorker>> workers_;
605 592
606 ModelTypeSet enabled_datatypes_; 593 ModelTypeSet enabled_datatypes_;
607 sessions::NudgeTracker nudge_tracker_; 594 sessions::NudgeTracker nudge_tracker_;
608 std::unique_ptr<MockDebugInfoGetter> debug_info_getter_; 595 std::unique_ptr<MockDebugInfoGetter> debug_info_getter_;
609 596
610 private: 597 private:
611 DISALLOW_COPY_AND_ASSIGN(SyncerTest); 598 DISALLOW_COPY_AND_ASSIGN(SyncerTest);
612 }; 599 };
613 600
614 TEST_F(SyncerTest, TestCallGatherUnsyncedEntries) { 601 TEST_F(SyncerTest, TestCallGatherUnsyncedEntries) {
615 { 602 {
616 Syncer::UnsyncedMetaHandles handles; 603 Syncer::UnsyncedMetaHandles handles;
617 { 604 {
618 syncable::ReadTransaction trans(FROM_HERE, directory()); 605 syncable::ReadTransaction trans(FROM_HERE, directory());
619 GetUnsyncedEntries(&trans, &handles); 606 GetUnsyncedEntries(&trans, &handles);
620 } 607 }
621 ASSERT_EQ(0u, handles.size()); 608 ASSERT_EQ(0u, handles.size());
622 } 609 }
623 // TODO(sync): When we can dynamically connect and disconnect the mock 610 // TODO(sync): When we can dynamically connect and disconnect the mock
624 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a 611 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a
625 // regression for a very old bug. 612 // regression for a very old bug.
626 } 613 }
627 614
628 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) { 615 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) {
629 const ModelTypeSet throttled_types(BOOKMARKS); 616 const ModelTypeSet throttled_types(BOOKMARKS);
630 sync_pb::EntitySpecifics bookmark_data; 617 sync_pb::EntitySpecifics bookmark_data;
631 AddDefaultFieldValue(BOOKMARKS, &bookmark_data); 618 AddDefaultFieldValue(BOOKMARKS, &bookmark_data);
632 619
633 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 620 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
634 foreign_cache_guid(), "-1"); 621 "-1");
635 EXPECT_TRUE(SyncShareNudge()); 622 EXPECT_TRUE(SyncShareNudge());
636 623
637 { 624 {
638 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 625 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
639 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 626 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
640 ASSERT_TRUE(A.good()); 627 ASSERT_TRUE(A.good());
641 A.PutIsUnsynced(true); 628 A.PutIsUnsynced(true);
642 A.PutSpecifics(bookmark_data); 629 A.PutSpecifics(bookmark_data);
643 A.PutNonUniqueName("bookmark"); 630 A.PutNonUniqueName("bookmark");
644 } 631 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 EXPECT_EQ(server_version, entryA.GetServerVersion()); \ 785 EXPECT_EQ(server_version, entryA.GetServerVersion()); \
799 } while (0) 786 } while (0)
800 787
801 TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) { 788 TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) {
802 KeyParams key_params = {"localhost", "dummy", "foobar"}; 789 KeyParams key_params = {"localhost", "dummy", "foobar"};
803 KeyParams other_params = {"localhost", "dummy", "foobar2"}; 790 KeyParams other_params = {"localhost", "dummy", "foobar2"};
804 sync_pb::EntitySpecifics bookmark, encrypted_bookmark; 791 sync_pb::EntitySpecifics bookmark, encrypted_bookmark;
805 bookmark.mutable_bookmark()->set_url("url"); 792 bookmark.mutable_bookmark()->set_url("url");
806 bookmark.mutable_bookmark()->set_title("title"); 793 bookmark.mutable_bookmark()->set_title("title");
807 AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark); 794 AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark);
808 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 795 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
809 foreign_cache_guid(), "-1"); 796 "-1");
810 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, 797 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, foreign_cache_guid(),
811 foreign_cache_guid(), "-2"); 798 "-2");
812 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10, 799 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10, foreign_cache_guid(),
813 foreign_cache_guid(), "-3"); 800 "-3");
814 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10, 801 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10, foreign_cache_guid(),
815 foreign_cache_guid(), "-4"); 802 "-4");
816 EXPECT_TRUE(SyncShareNudge()); 803 EXPECT_TRUE(SyncShareNudge());
817 // Server side change will put A in conflict. 804 // Server side change will put A in conflict.
818 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20, 805 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20, foreign_cache_guid(),
819 foreign_cache_guid(), "-1"); 806 "-1");
820 { 807 {
821 // Mark bookmarks as encrypted and set the cryptographer to have pending 808 // Mark bookmarks as encrypted and set the cryptographer to have pending
822 // keys. 809 // keys.
823 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 810 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
824 Cryptographer other_cryptographer(&encryptor_); 811 Cryptographer other_cryptographer(&encryptor_);
825 other_cryptographer.AddKey(other_params); 812 other_cryptographer.AddKey(other_params);
826 sync_pb::EntitySpecifics specifics; 813 sync_pb::EntitySpecifics specifics;
827 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 814 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
828 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); 815 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag());
829 dir_maker_.encryption_handler()->EnableEncryptEverything(); 816 dir_maker_.encryption_handler()->EnableEncryptEverything();
830 // Set up with an old passphrase, but have pending keys 817 // Set up with an old passphrase, but have pending keys
831 GetCryptographer(&wtrans)->AddKey(key_params); 818 GetCryptographer(&wtrans)->AddKey(key_params);
832 GetCryptographer(&wtrans)->Encrypt(bookmark, 819 GetCryptographer(&wtrans)->Encrypt(bookmark,
833 encrypted_bookmark.mutable_encrypted()); 820 encrypted_bookmark.mutable_encrypted());
834 GetCryptographer(&wtrans)->SetPendingKeys(nigori->encryption_keybag()); 821 GetCryptographer(&wtrans)->SetPendingKeys(nigori->encryption_keybag());
835 822
836 // In conflict but properly encrypted. 823 // In conflict but properly encrypted.
837 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 824 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
838 ASSERT_TRUE(A.good()); 825 ASSERT_TRUE(A.good());
839 A.PutIsUnsynced(true); 826 A.PutIsUnsynced(true);
840 A.PutSpecifics(encrypted_bookmark); 827 A.PutSpecifics(encrypted_bookmark);
841 A.PutNonUniqueName(kEncryptedString); 828 A.PutNonUniqueName(kEncryptedString);
842 // Not in conflict and properly encrypted. 829 // Not in conflict and properly encrypted.
843 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 830 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 1045 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
1059 1046
1060 // Create a bookmark tree with one root, two second level, and three third 1047 // Create a bookmark tree with one root, two second level, and three third
1061 // level bookmarks, all folders. 1048 // level bookmarks, all folders.
1062 for (int i = 1; i <= 6; ++i) { 1049 for (int i = 1; i <= 6; ++i) {
1063 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(), ""); 1050 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(), "");
1064 entry.PutId(ids_.FromNumber(i)); 1051 entry.PutId(ids_.FromNumber(i));
1065 entry.PutIsDir(true); 1052 entry.PutIsDir(true);
1066 entry.PutBaseVersion(5); 1053 entry.PutBaseVersion(5);
1067 entry.PutServerVersion(5); 1054 entry.PutServerVersion(5);
1068 entry.PutParentId(ids_.FromNumber(i/2)); 1055 entry.PutParentId(ids_.FromNumber(i / 2));
1069 entry.PutServerParentId(ids_.FromNumber(i/2)); 1056 entry.PutServerParentId(ids_.FromNumber(i / 2));
1070 entry.PutServerIsDir(true); 1057 entry.PutServerIsDir(true);
1071 entry.PutIsUnsynced(true); 1058 entry.PutIsUnsynced(true);
1072 entry.PutSpecifics(DefaultBookmarkSpecifics()); 1059 entry.PutSpecifics(DefaultBookmarkSpecifics());
1073 entry.PutIsDel(true); 1060 entry.PutIsDel(true);
1074 } 1061 }
1075 } 1062 }
1076 1063
1077 { 1064 {
1078 // Run GetCommitIds with a limit of 2 entries to commit. 1065 // Run GetCommitIds with a limit of 2 entries to commit.
1079 syncable::Directory::Metahandles result_handles; 1066 syncable::Directory::Metahandles result_handles;
(...skipping 11 matching lines...) Expand all
1091 EXPECT_EQ(ids_.FromNumber(5), entry1.GetId()); 1078 EXPECT_EQ(ids_.FromNumber(5), entry1.GetId());
1092 } 1079 }
1093 } 1080 }
1094 1081
1095 TEST_F(SyncerTest, EncryptionAwareConflicts) { 1082 TEST_F(SyncerTest, EncryptionAwareConflicts) {
1096 KeyParams key_params = {"localhost", "dummy", "foobar"}; 1083 KeyParams key_params = {"localhost", "dummy", "foobar"};
1097 Cryptographer other_cryptographer(&encryptor_); 1084 Cryptographer other_cryptographer(&encryptor_);
1098 other_cryptographer.AddKey(key_params); 1085 other_cryptographer.AddKey(key_params);
1099 sync_pb::EntitySpecifics bookmark, encrypted_bookmark, modified_bookmark; 1086 sync_pb::EntitySpecifics bookmark, encrypted_bookmark, modified_bookmark;
1100 bookmark.mutable_bookmark()->set_title("title"); 1087 bookmark.mutable_bookmark()->set_title("title");
1101 other_cryptographer.Encrypt(bookmark, 1088 other_cryptographer.Encrypt(bookmark, encrypted_bookmark.mutable_encrypted());
1102 encrypted_bookmark.mutable_encrypted());
1103 AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark); 1089 AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark);
1104 modified_bookmark.mutable_bookmark()->set_title("title2"); 1090 modified_bookmark.mutable_bookmark()->set_title("title2");
1105 other_cryptographer.Encrypt(modified_bookmark, 1091 other_cryptographer.Encrypt(modified_bookmark,
1106 modified_bookmark.mutable_encrypted()); 1092 modified_bookmark.mutable_encrypted());
1107 sync_pb::EntitySpecifics pref, encrypted_pref, modified_pref; 1093 sync_pb::EntitySpecifics pref, encrypted_pref, modified_pref;
1108 pref.mutable_preference()->set_name("name"); 1094 pref.mutable_preference()->set_name("name");
1109 AddDefaultFieldValue(PREFERENCES, &encrypted_pref); 1095 AddDefaultFieldValue(PREFERENCES, &encrypted_pref);
1110 other_cryptographer.Encrypt(pref, 1096 other_cryptographer.Encrypt(pref, encrypted_pref.mutable_encrypted());
1111 encrypted_pref.mutable_encrypted());
1112 modified_pref.mutable_preference()->set_name("name2"); 1097 modified_pref.mutable_preference()->set_name("name2");
1113 other_cryptographer.Encrypt(modified_pref, 1098 other_cryptographer.Encrypt(modified_pref, modified_pref.mutable_encrypted());
1114 modified_pref.mutable_encrypted());
1115 { 1099 {
1116 // Mark bookmarks and preferences as encrypted and set the cryptographer to 1100 // Mark bookmarks and preferences as encrypted and set the cryptographer to
1117 // have pending keys. 1101 // have pending keys.
1118 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1102 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1119 sync_pb::EntitySpecifics specifics; 1103 sync_pb::EntitySpecifics specifics;
1120 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 1104 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
1121 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); 1105 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag());
1122 dir_maker_.encryption_handler()->EnableEncryptEverything(); 1106 dir_maker_.encryption_handler()->EnableEncryptEverything();
1123 GetCryptographer(&wtrans)->SetPendingKeys(nigori->encryption_keybag()); 1107 GetCryptographer(&wtrans)->SetPendingKeys(nigori->encryption_keybag());
1124 EXPECT_TRUE(GetCryptographer(&wtrans)->has_pending_keys()); 1108 EXPECT_TRUE(GetCryptographer(&wtrans)->has_pending_keys());
(...skipping 15 matching lines...) Expand all
1140 EXPECT_TRUE(SyncShareNudge()); 1124 EXPECT_TRUE(SyncShareNudge());
1141 { 1125 {
1142 // Initial state. Everything is normal. 1126 // Initial state. Everything is normal.
1143 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1127 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1144 VERIFY_ENTRY(1, false, false, false, 0, 10, 10, ids_, &rtrans); 1128 VERIFY_ENTRY(1, false, false, false, 0, 10, 10, ids_, &rtrans);
1145 VERIFY_ENTRY(2, false, false, false, 1, 10, 10, ids_, &rtrans); 1129 VERIFY_ENTRY(2, false, false, false, 1, 10, 10, ids_, &rtrans);
1146 VERIFY_ENTRY(3, false, false, false, 1, 10, 10, ids_, &rtrans); 1130 VERIFY_ENTRY(3, false, false, false, 1, 10, 10, ids_, &rtrans);
1147 VERIFY_ENTRY(4, false, false, false, 0, 10, 10, ids_, &rtrans); 1131 VERIFY_ENTRY(4, false, false, false, 0, 10, 10, ids_, &rtrans);
1148 1132
1149 Entry entry1(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 1133 Entry entry1(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
1150 ASSERT_TRUE(entry1.GetUniquePosition().Equals( 1134 ASSERT_TRUE(
1151 entry1.GetServerUniquePosition())); 1135 entry1.GetUniquePosition().Equals(entry1.GetServerUniquePosition()));
1152 pos1 = entry1.GetUniquePosition(); 1136 pos1 = entry1.GetUniquePosition();
1153 Entry entry2(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); 1137 Entry entry2(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2));
1154 pos2 = entry2.GetUniquePosition(); 1138 pos2 = entry2.GetUniquePosition();
1155 Entry entry3(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(3)); 1139 Entry entry3(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(3));
1156 pos3 = entry3.GetUniquePosition(); 1140 pos3 = entry3.GetUniquePosition();
1157 } 1141 }
1158 1142
1159 // Server side encryption will not be applied due to undecryptable data. 1143 // Server side encryption will not be applied due to undecryptable data.
1160 // At this point, BASE_SERVER_SPECIFICS should be filled for all four items. 1144 // At this point, BASE_SERVER_SPECIFICS should be filled for all four items.
1161 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 20, 20, true, 0, 1145 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 20, 20, true, 0,
1162 encrypted_bookmark, 1146 encrypted_bookmark, foreign_cache_guid(),
1163 foreign_cache_guid(), "-1"); 1147 "-1");
1164 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 20, 20, false, 2, 1148 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 20, 20, false, 2,
1165 encrypted_bookmark, 1149 encrypted_bookmark, foreign_cache_guid(),
1166 foreign_cache_guid(), "-2"); 1150 "-2");
1167 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 20, 20, false, 1, 1151 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 20, 20, false, 1,
1168 encrypted_bookmark, 1152 encrypted_bookmark, foreign_cache_guid(),
1169 foreign_cache_guid(), "-3"); 1153 "-3");
1170 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 20, 20, false, 0, 1154 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 20, 20, false, 0,
1171 encrypted_pref, 1155 encrypted_pref, foreign_cache_guid(), "-4");
1172 foreign_cache_guid(), "-4");
1173 EXPECT_TRUE(SyncShareNudge()); 1156 EXPECT_TRUE(SyncShareNudge());
1174 { 1157 {
1175 // All should be unapplied due to being undecryptable and have a valid 1158 // All should be unapplied due to being undecryptable and have a valid
1176 // BASE_SERVER_SPECIFICS. 1159 // BASE_SERVER_SPECIFICS.
1177 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1160 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1178 VERIFY_ENTRY(1, true, false, true, 0, 10, 20, ids_, &rtrans); 1161 VERIFY_ENTRY(1, true, false, true, 0, 10, 20, ids_, &rtrans);
1179 VERIFY_ENTRY(2, true, false, true, 1, 10, 20, ids_, &rtrans); 1162 VERIFY_ENTRY(2, true, false, true, 1, 10, 20, ids_, &rtrans);
1180 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans); 1163 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
1181 VERIFY_ENTRY(4, true, false, true, 0, 10, 20, ids_, &rtrans); 1164 VERIFY_ENTRY(4, true, false, true, 0, 10, 20, ids_, &rtrans);
1182 } 1165 }
1183 1166
1184 // Server side change that don't modify anything should not affect 1167 // Server side change that don't modify anything should not affect
1185 // BASE_SERVER_SPECIFICS (such as name changes and mtime changes). 1168 // BASE_SERVER_SPECIFICS (such as name changes and mtime changes).
1186 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 30, 30, true, 0, 1169 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 30, 30, true, 0,
1187 encrypted_bookmark, 1170 encrypted_bookmark, foreign_cache_guid(),
1188 foreign_cache_guid(), "-1"); 1171 "-1");
1189 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 30, 30, false, 2, 1172 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 30, 30, false, 2,
1190 encrypted_bookmark, 1173 encrypted_bookmark, foreign_cache_guid(),
1191 foreign_cache_guid(), "-2"); 1174 "-2");
1192 // Item 3 doesn't change. 1175 // Item 3 doesn't change.
1193 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 30, 30, false, 0, 1176 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 30, 30, false, 0,
1194 encrypted_pref, 1177 encrypted_pref, foreign_cache_guid(), "-4");
1195 foreign_cache_guid(), "-4");
1196 EXPECT_TRUE(SyncShareNudge()); 1178 EXPECT_TRUE(SyncShareNudge());
1197 { 1179 {
1198 // Items 1, 2, and 4 should have newer server versions, 3 remains the same. 1180 // Items 1, 2, and 4 should have newer server versions, 3 remains the same.
1199 // All should remain unapplied due to be undecryptable. 1181 // All should remain unapplied due to be undecryptable.
1200 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1182 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1201 VERIFY_ENTRY(1, true, false, true, 0, 10, 30, ids_, &rtrans); 1183 VERIFY_ENTRY(1, true, false, true, 0, 10, 30, ids_, &rtrans);
1202 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans); 1184 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
1203 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans); 1185 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
1204 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans); 1186 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
1205 } 1187 }
1206 1188
1207 // Positional changes, parent changes, and specifics changes should reset 1189 // Positional changes, parent changes, and specifics changes should reset
1208 // BASE_SERVER_SPECIFICS. 1190 // BASE_SERVER_SPECIFICS.
1209 // Became unencrypted. 1191 // Became unencrypted.
1210 mock_server_->AddUpdateSpecifics(1, 0, "A", 40, 40, true, 0, bookmark, 1192 mock_server_->AddUpdateSpecifics(1, 0, "A", 40, 40, true, 0, bookmark,
1211 foreign_cache_guid(), "-1"); 1193 foreign_cache_guid(), "-1");
1212 // Reordered to after item 2. 1194 // Reordered to after item 2.
1213 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 30, 30, false, 3, 1195 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 30, 30, false, 3,
1214 encrypted_bookmark, 1196 encrypted_bookmark, foreign_cache_guid(),
1215 foreign_cache_guid(), "-3"); 1197 "-3");
1216 EXPECT_TRUE(SyncShareNudge()); 1198 EXPECT_TRUE(SyncShareNudge());
1217 { 1199 {
1218 // Items 2 and 4 should be the only ones with BASE_SERVER_SPECIFICS set. 1200 // Items 2 and 4 should be the only ones with BASE_SERVER_SPECIFICS set.
1219 // Items 1 is now unencrypted, so should have applied normally. 1201 // Items 1 is now unencrypted, so should have applied normally.
1220 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1202 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1221 VERIFY_ENTRY(1, false, false, false, 0, 40, 40, ids_, &rtrans); 1203 VERIFY_ENTRY(1, false, false, false, 0, 40, 40, ids_, &rtrans);
1222 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans); 1204 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
1223 VERIFY_ENTRY(3, true, false, false, 1, 10, 30, ids_, &rtrans); 1205 VERIFY_ENTRY(3, true, false, false, 1, 10, 30, ids_, &rtrans);
1224 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans); 1206 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
1225 } 1207 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 1334
1353 MutableEntry parent2(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Tim"); 1335 MutableEntry parent2(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Tim");
1354 ASSERT_TRUE(parent2.good()); 1336 ASSERT_TRUE(parent2.good());
1355 parent2.PutIsUnsynced(true); 1337 parent2.PutIsUnsynced(true);
1356 parent2.PutIsDir(true); 1338 parent2.PutIsDir(true);
1357 parent2.PutSpecifics(DefaultPreferencesSpecifics()); 1339 parent2.PutSpecifics(DefaultPreferencesSpecifics());
1358 parent2.PutBaseVersion(1); 1340 parent2.PutBaseVersion(1);
1359 parent2.PutId(pref_node_id); 1341 parent2.PutId(pref_node_id);
1360 } 1342 }
1361 1343
1362 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(PREFERENCES), 1344 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(PREFERENCES), ModelTypeSet(),
1363 ModelTypeSet(),
1364 ModelTypeSet()); 1345 ModelTypeSet());
1365 1346
1366 EXPECT_TRUE(SyncShareNudge()); 1347 EXPECT_TRUE(SyncShareNudge());
1367 ASSERT_EQ(2U, mock_server_->committed_ids().size()); 1348 ASSERT_EQ(2U, mock_server_->committed_ids().size());
1368 // If this test starts failing, be aware other sort orders could be valid. 1349 // If this test starts failing, be aware other sort orders could be valid.
1369 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]); 1350 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]);
1370 EXPECT_EQ(child_id_, mock_server_->committed_ids()[1]); 1351 EXPECT_EQ(child_id_, mock_server_->committed_ids()[1]);
1371 { 1352 {
1372 syncable::ReadTransaction rt(FROM_HERE, directory()); 1353 syncable::ReadTransaction rt(FROM_HERE, directory());
1373 Entry entry(&rt, syncable::GET_BY_ID, child_id_); 1354 Entry entry(&rt, syncable::GET_BY_ID, child_id_);
(...skipping 16 matching lines...) Expand all
1390 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1371 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1391 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Pete"); 1372 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Pete");
1392 ASSERT_TRUE(parent.good()); 1373 ASSERT_TRUE(parent.good());
1393 parent.PutIsUnappliedUpdate(true); 1374 parent.PutIsUnappliedUpdate(true);
1394 parent.PutIsDir(true); 1375 parent.PutIsDir(true);
1395 parent.PutSpecifics(DefaultBookmarkSpecifics()); 1376 parent.PutSpecifics(DefaultBookmarkSpecifics());
1396 parent.PutBaseVersion(1); 1377 parent.PutBaseVersion(1);
1397 parent.PutId(parent_id_); 1378 parent.PutId(parent_id_);
1398 } 1379 }
1399 1380
1400 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(BOOKMARKS), 1381 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(BOOKMARKS), ModelTypeSet(),
1401 ModelTypeSet(),
1402 ModelTypeSet()); 1382 ModelTypeSet());
1403 1383
1404 EXPECT_TRUE(SyncShareNudge()); 1384 EXPECT_TRUE(SyncShareNudge());
1405 directory()->SaveChanges(); 1385 directory()->SaveChanges();
1406 { 1386 {
1407 syncable::ReadTransaction rt(FROM_HERE, directory()); 1387 syncable::ReadTransaction rt(FROM_HERE, directory());
1408 Entry entry(&rt, syncable::GET_BY_ID, parent_id_); 1388 Entry entry(&rt, syncable::GET_BY_ID, parent_id_);
1409 ASSERT_FALSE(entry.good()); 1389 ASSERT_FALSE(entry.good());
1410 } 1390 }
1411 } 1391 }
(...skipping 20 matching lines...) Expand all
1432 MutableEntry parent2(&wtrans, syncable::CREATE, PREFERENCES, 1412 MutableEntry parent2(&wtrans, syncable::CREATE, PREFERENCES,
1433 wtrans.root_id(), "Tim"); 1413 wtrans.root_id(), "Tim");
1434 ASSERT_TRUE(parent2.good()); 1414 ASSERT_TRUE(parent2.good());
1435 parent2.PutIsDir(true); 1415 parent2.PutIsDir(true);
1436 parent2.PutSpecifics(DefaultPreferencesSpecifics()); 1416 parent2.PutSpecifics(DefaultPreferencesSpecifics());
1437 parent2.PutBaseVersion(1); 1417 parent2.PutBaseVersion(1);
1438 parent2.PutId(TestIdFactory::MakeServer("Tim")); 1418 parent2.PutId(TestIdFactory::MakeServer("Tim"));
1439 } 1419 }
1440 1420
1441 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(PREFERENCES, BOOKMARKS), 1421 directory()->PurgeEntriesWithTypeIn(ModelTypeSet(PREFERENCES, BOOKMARKS),
1442 ModelTypeSet(BOOKMARKS), 1422 ModelTypeSet(BOOKMARKS), ModelTypeSet());
1443 ModelTypeSet());
1444 { 1423 {
1445 // Verify bookmark nodes are saved in delete journal but not preference 1424 // Verify bookmark nodes are saved in delete journal but not preference
1446 // node. 1425 // node.
1447 syncable::ReadTransaction rt(FROM_HERE, directory()); 1426 syncable::ReadTransaction rt(FROM_HERE, directory());
1448 syncable::DeleteJournal* delete_journal = directory()->delete_journal(); 1427 syncable::DeleteJournal* delete_journal = directory()->delete_journal();
1449 EXPECT_EQ(2u, delete_journal->GetDeleteJournalSize(&rt)); 1428 EXPECT_EQ(2u, delete_journal->GetDeleteJournalSize(&rt));
1450 syncable::EntryKernelSet journal_entries; 1429 syncable::EntryKernelSet journal_entries;
1451 directory()->delete_journal()->GetDeleteJournals(&rt, BOOKMARKS, 1430 directory()->delete_journal()->GetDeleteJournals(&rt, BOOKMARKS,
1452 &journal_entries); 1431 &journal_entries);
1453 EXPECT_EQ(parent_id_, (*journal_entries.begin())->ref(syncable::ID)); 1432 EXPECT_EQ(parent_id_, (*journal_entries.begin())->ref(syncable::ID));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1507 Entry entry4(&trans, GET_BY_CLIENT_TAG, "tag4"); 1486 Entry entry4(&trans, GET_BY_CLIENT_TAG, "tag4");
1508 EXPECT_EQ(-1, entry4.GetBaseVersion()); 1487 EXPECT_EQ(-1, entry4.GetBaseVersion());
1509 EXPECT_EQ(0, entry4.GetServerVersion()); 1488 EXPECT_EQ(0, entry4.GetServerVersion());
1510 EXPECT_TRUE(entry4.GetIsUnsynced()); 1489 EXPECT_TRUE(entry4.GetIsUnsynced());
1511 EXPECT_FALSE(entry4.GetIsUnappliedUpdate()); 1490 EXPECT_FALSE(entry4.GetIsUnappliedUpdate());
1512 } 1491 }
1513 } 1492 }
1514 1493
1515 TEST_F(SyncerTest, TestCommitListOrderingTwoItemsTall) { 1494 TEST_F(SyncerTest, TestCommitListOrderingTwoItemsTall) {
1516 CommitOrderingTest items[] = { 1495 CommitOrderingTest items[] = {
1517 {1, ids_.FromNumber(-1001), ids_.FromNumber(-1000)}, 1496 {1, ids_.FromNumber(-1001), ids_.FromNumber(-1000)},
1518 {0, ids_.FromNumber(-1000), ids_.FromNumber(0)}, 1497 {0, ids_.FromNumber(-1000), ids_.FromNumber(0)},
1519 CommitOrderingTest::MakeLastCommitItem(), 1498 CommitOrderingTest::MakeLastCommitItem(),
1520 }; 1499 };
1521 RunCommitOrderingTest(items); 1500 RunCommitOrderingTest(items);
1522 } 1501 }
1523 1502
1524 TEST_F(SyncerTest, TestCommitListOrderingThreeItemsTall) { 1503 TEST_F(SyncerTest, TestCommitListOrderingThreeItemsTall) {
1525 CommitOrderingTest items[] = { 1504 CommitOrderingTest items[] = {
1526 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)}, 1505 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)},
1527 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)}, 1506 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)},
1528 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)}, 1507 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)},
1529 CommitOrderingTest::MakeLastCommitItem(), 1508 CommitOrderingTest::MakeLastCommitItem(),
1530 }; 1509 };
1531 RunCommitOrderingTest(items); 1510 RunCommitOrderingTest(items);
1532 } 1511 }
1533 1512
1534 TEST_F(SyncerTest, TestCommitListOrderingFourItemsTall) { 1513 TEST_F(SyncerTest, TestCommitListOrderingFourItemsTall) {
1535 CommitOrderingTest items[] = { 1514 CommitOrderingTest items[] = {
1536 {3, ids_.FromNumber(-2003), ids_.FromNumber(-2002)}, 1515 {3, ids_.FromNumber(-2003), ids_.FromNumber(-2002)},
1537 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)}, 1516 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)},
1538 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)}, 1517 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)},
1539 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)}, 1518 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)},
1540 CommitOrderingTest::MakeLastCommitItem(), 1519 CommitOrderingTest::MakeLastCommitItem(),
1541 }; 1520 };
1542 RunCommitOrderingTest(items); 1521 RunCommitOrderingTest(items);
1543 } 1522 }
1544 1523
1545 TEST_F(SyncerTest, TestCommitListOrderingThreeItemsTallLimitedSize) { 1524 TEST_F(SyncerTest, TestCommitListOrderingThreeItemsTallLimitedSize) {
1546 context_->set_max_commit_batch_size(2); 1525 context_->set_max_commit_batch_size(2);
1547 CommitOrderingTest items[] = { 1526 CommitOrderingTest items[] = {
1548 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)}, 1527 {1, ids_.FromNumber(-2001), ids_.FromNumber(-2000)},
1549 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)}, 1528 {0, ids_.FromNumber(-2000), ids_.FromNumber(0)},
1550 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)}, 1529 {2, ids_.FromNumber(-2002), ids_.FromNumber(-2001)},
1551 CommitOrderingTest::MakeLastCommitItem(), 1530 CommitOrderingTest::MakeLastCommitItem(),
1552 }; 1531 };
1553 RunCommitOrderingTest(items); 1532 RunCommitOrderingTest(items);
1554 } 1533 }
1555 1534
1556 TEST_F(SyncerTest, TestCommitListOrderingSingleDeletedItem) { 1535 TEST_F(SyncerTest, TestCommitListOrderingSingleDeletedItem) {
1557 CommitOrderingTest items[] = { 1536 CommitOrderingTest items[] = {
1558 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}}, 1537 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}},
1559 CommitOrderingTest::MakeLastCommitItem(), 1538 CommitOrderingTest::MakeLastCommitItem(),
1560 }; 1539 };
1561 RunCommitOrderingTest(items); 1540 RunCommitOrderingTest(items);
1562 } 1541 }
1563 1542
1564 TEST_F(SyncerTest, TestCommitListOrderingSingleUncommittedDeletedItem) { 1543 TEST_F(SyncerTest, TestCommitListOrderingSingleUncommittedDeletedItem) {
1565 CommitOrderingTest items[] = { 1544 CommitOrderingTest items[] = {
1566 {-1, ids_.FromNumber(-1000), ids_.FromNumber(0), {DELETED}}, 1545 {-1, ids_.FromNumber(-1000), ids_.FromNumber(0), {DELETED}},
1567 CommitOrderingTest::MakeLastCommitItem(), 1546 CommitOrderingTest::MakeLastCommitItem(),
1568 }; 1547 };
1569 RunCommitOrderingTest(items); 1548 RunCommitOrderingTest(items);
1570 } 1549 }
1571 1550
1572 TEST_F(SyncerTest, TestCommitListOrderingSingleDeletedItemWithUnroll) { 1551 TEST_F(SyncerTest, TestCommitListOrderingSingleDeletedItemWithUnroll) {
1573 CommitOrderingTest items[] = { 1552 CommitOrderingTest items[] = {
1574 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}}, 1553 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}},
1575 CommitOrderingTest::MakeLastCommitItem(), 1554 CommitOrderingTest::MakeLastCommitItem(),
1576 }; 1555 };
1577 RunCommitOrderingTest(items); 1556 RunCommitOrderingTest(items);
1578 } 1557 }
1579 1558
1580 TEST_F(SyncerTest, 1559 TEST_F(SyncerTest, TestCommitListOrderingSingleLongDeletedItemWithUnroll) {
1581 TestCommitListOrderingSingleLongDeletedItemWithUnroll) {
1582 CommitOrderingTest items[] = { 1560 CommitOrderingTest items[] = {
1583 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1561 {0, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1584 CommitOrderingTest::MakeLastCommitItem(), 1562 CommitOrderingTest::MakeLastCommitItem(),
1585 }; 1563 };
1586 RunCommitOrderingTest(items); 1564 RunCommitOrderingTest(items);
1587 } 1565 }
1588 1566
1589 TEST_F(SyncerTest, TestCommitListOrderingTwoLongDeletedItemWithUnroll) { 1567 TEST_F(SyncerTest, TestCommitListOrderingTwoLongDeletedItemWithUnroll) {
1590 CommitOrderingTest items[] = { 1568 CommitOrderingTest items[] = {
1591 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1569 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1592 {0, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED, OLD_MTIME}}, 1570 {0, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED, OLD_MTIME}},
1593 CommitOrderingTest::MakeLastCommitItem(), 1571 CommitOrderingTest::MakeLastCommitItem(),
1594 }; 1572 };
1595 RunCommitOrderingTest(items); 1573 RunCommitOrderingTest(items);
1596 } 1574 }
1597 1575
1598 TEST_F(SyncerTest, TestCommitListOrdering3LongDeletedItemsWithSizeLimit) { 1576 TEST_F(SyncerTest, TestCommitListOrdering3LongDeletedItemsWithSizeLimit) {
1599 context_->set_max_commit_batch_size(2); 1577 context_->set_max_commit_batch_size(2);
1600 CommitOrderingTest items[] = { 1578 CommitOrderingTest items[] = {
1601 {2, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1579 {2, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1602 {1, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED, OLD_MTIME}}, 1580 {1, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED, OLD_MTIME}},
1603 {0, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}}, 1581 {0, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}},
1604 CommitOrderingTest::MakeLastCommitItem(), 1582 CommitOrderingTest::MakeLastCommitItem(),
1605 }; 1583 };
1606 RunCommitOrderingTest(items); 1584 RunCommitOrderingTest(items);
1607 } 1585 }
1608 1586
1609 TEST_F(SyncerTest, TestCommitListOrderingTwoDeletedItemsWithUnroll) { 1587 TEST_F(SyncerTest, TestCommitListOrderingTwoDeletedItemsWithUnroll) {
1610 CommitOrderingTest items[] = { 1588 CommitOrderingTest items[] = {
1611 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}}, 1589 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED}},
1612 {0, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED}}, 1590 {0, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED}},
1613 CommitOrderingTest::MakeLastCommitItem(), 1591 CommitOrderingTest::MakeLastCommitItem(),
1614 }; 1592 };
1615 RunCommitOrderingTest(items); 1593 RunCommitOrderingTest(items);
1616 } 1594 }
1617 1595
1618 TEST_F(SyncerTest, TestCommitListOrderingComplexDeletionScenario) { 1596 TEST_F(SyncerTest, TestCommitListOrderingComplexDeletionScenario) {
1619 CommitOrderingTest items[] = { 1597 CommitOrderingTest items[] = {
1620 {2, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1598 {2, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1621 {-1, ids_.FromNumber(1001), ids_.FromNumber(0), {SYNCED}}, 1599 {-1, ids_.FromNumber(1001), ids_.FromNumber(0), {SYNCED}},
1622 {1, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}}, 1600 {1, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}},
1623 {-1, ids_.FromNumber(1003), ids_.FromNumber(1001), {SYNCED}}, 1601 {-1, ids_.FromNumber(1003), ids_.FromNumber(1001), {SYNCED}},
1624 {0, ids_.FromNumber(1004), ids_.FromNumber(1003), {DELETED}}, 1602 {0, ids_.FromNumber(1004), ids_.FromNumber(1003), {DELETED}},
1625 CommitOrderingTest::MakeLastCommitItem(), 1603 CommitOrderingTest::MakeLastCommitItem(),
1626 }; 1604 };
1627 RunCommitOrderingTest(items); 1605 RunCommitOrderingTest(items);
1628 } 1606 }
1629 1607
1630 TEST_F(SyncerTest, 1608 TEST_F(SyncerTest,
1631 TestCommitListOrderingComplexDeletionScenarioWith2RecentDeletes) { 1609 TestCommitListOrderingComplexDeletionScenarioWith2RecentDeletes) {
1632 CommitOrderingTest items[] = { 1610 CommitOrderingTest items[] = {
1633 {3, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1611 {3, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1634 {-1, ids_.FromNumber(1001), ids_.FromNumber(0), {SYNCED}}, 1612 {-1, ids_.FromNumber(1001), ids_.FromNumber(0), {SYNCED}},
1635 {2, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}}, 1613 {2, ids_.FromNumber(1002), ids_.FromNumber(1001), {DELETED, OLD_MTIME}},
1636 {-1, ids_.FromNumber(1003), ids_.FromNumber(1001), {SYNCED}}, 1614 {-1, ids_.FromNumber(1003), ids_.FromNumber(1001), {SYNCED}},
1637 {1, ids_.FromNumber(1004), ids_.FromNumber(1003), {DELETED}}, 1615 {1, ids_.FromNumber(1004), ids_.FromNumber(1003), {DELETED}},
1638 {0, ids_.FromNumber(1005), ids_.FromNumber(1003), {DELETED}}, 1616 {0, ids_.FromNumber(1005), ids_.FromNumber(1003), {DELETED}},
1639 CommitOrderingTest::MakeLastCommitItem(), 1617 CommitOrderingTest::MakeLastCommitItem(),
1640 }; 1618 };
1641 RunCommitOrderingTest(items); 1619 RunCommitOrderingTest(items);
1642 } 1620 }
1643 1621
1644 TEST_F(SyncerTest, TestCommitListOrderingDeleteMovedItems) { 1622 TEST_F(SyncerTest, TestCommitListOrderingDeleteMovedItems) {
1645 CommitOrderingTest items[] = { 1623 CommitOrderingTest items[] = {
1646 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}}, 1624 {1, ids_.FromNumber(1000), ids_.FromNumber(0), {DELETED, OLD_MTIME}},
1647 {0, ids_.FromNumber(1001), ids_.FromNumber(1000), {DELETED, OLD_MTIME, 1625 {0,
1648 MOVED_FROM_ROOT}}, 1626 ids_.FromNumber(1001),
1649 CommitOrderingTest::MakeLastCommitItem(), 1627 ids_.FromNumber(1000),
1628 {DELETED, OLD_MTIME, MOVED_FROM_ROOT}},
1629 CommitOrderingTest::MakeLastCommitItem(),
1650 }; 1630 };
1651 RunCommitOrderingTest(items); 1631 RunCommitOrderingTest(items);
1652 } 1632 }
1653 1633
1654 TEST_F(SyncerTest, TestCommitListOrderingWithNesting) { 1634 TEST_F(SyncerTest, TestCommitListOrderingWithNesting) {
1655 const base::Time& now_minus_2h = 1635 const base::Time& now_minus_2h =
1656 base::Time::Now() - base::TimeDelta::FromHours(2); 1636 base::Time::Now() - base::TimeDelta::FromHours(2);
1657 { 1637 {
1658 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1638 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1659 { 1639 {
1660 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Bob"); 1640 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Bob");
1661 ASSERT_TRUE(parent.good()); 1641 ASSERT_TRUE(parent.good());
1662 parent.PutIsUnsynced(true); 1642 parent.PutIsUnsynced(true);
1663 parent.PutIsDir(true); 1643 parent.PutIsDir(true);
1664 parent.PutSpecifics(DefaultBookmarkSpecifics()); 1644 parent.PutSpecifics(DefaultBookmarkSpecifics());
1665 parent.PutId(ids_.FromNumber(100)); 1645 parent.PutId(ids_.FromNumber(100));
1666 parent.PutBaseVersion(1); 1646 parent.PutBaseVersion(1);
1667 MutableEntry child( 1647 MutableEntry child(&wtrans, CREATE, BOOKMARKS, ids_.FromNumber(100),
1668 &wtrans, CREATE, BOOKMARKS, ids_.FromNumber(100), "Bob"); 1648 "Bob");
1669 ASSERT_TRUE(child.good()); 1649 ASSERT_TRUE(child.good());
1670 child.PutIsUnsynced(true); 1650 child.PutIsUnsynced(true);
1671 child.PutIsDir(true); 1651 child.PutIsDir(true);
1672 child.PutSpecifics(DefaultBookmarkSpecifics()); 1652 child.PutSpecifics(DefaultBookmarkSpecifics());
1673 child.PutId(ids_.FromNumber(101)); 1653 child.PutId(ids_.FromNumber(101));
1674 child.PutBaseVersion(1); 1654 child.PutBaseVersion(1);
1675 MutableEntry grandchild( 1655 MutableEntry grandchild(&wtrans, CREATE, BOOKMARKS, ids_.FromNumber(101),
1676 &wtrans, CREATE, BOOKMARKS, ids_.FromNumber(101), "Bob"); 1656 "Bob");
1677 ASSERT_TRUE(grandchild.good()); 1657 ASSERT_TRUE(grandchild.good());
1678 grandchild.PutId(ids_.FromNumber(102)); 1658 grandchild.PutId(ids_.FromNumber(102));
1679 grandchild.PutIsUnsynced(true); 1659 grandchild.PutIsUnsynced(true);
1680 grandchild.PutSpecifics(DefaultBookmarkSpecifics()); 1660 grandchild.PutSpecifics(DefaultBookmarkSpecifics());
1681 grandchild.PutBaseVersion(1); 1661 grandchild.PutBaseVersion(1);
1682 } 1662 }
1683 { 1663 {
1684 // Create three deleted items which deletions we expect to be sent to the 1664 // Create three deleted items which deletions we expect to be sent to the
1685 // server. 1665 // server.
1686 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Pete"); 1666 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Pete");
1687 ASSERT_TRUE(parent.good()); 1667 ASSERT_TRUE(parent.good());
1688 parent.PutId(ids_.FromNumber(103)); 1668 parent.PutId(ids_.FromNumber(103));
1689 parent.PutIsUnsynced(true); 1669 parent.PutIsUnsynced(true);
1690 parent.PutIsDir(true); 1670 parent.PutIsDir(true);
1691 parent.PutSpecifics(DefaultBookmarkSpecifics()); 1671 parent.PutSpecifics(DefaultBookmarkSpecifics());
1692 parent.PutIsDel(true); 1672 parent.PutIsDel(true);
1693 parent.PutBaseVersion(1); 1673 parent.PutBaseVersion(1);
1694 parent.PutMtime(now_minus_2h); 1674 parent.PutMtime(now_minus_2h);
1695 MutableEntry child( 1675 MutableEntry child(&wtrans, CREATE, BOOKMARKS, ids_.FromNumber(103),
1696 &wtrans, CREATE, BOOKMARKS, ids_.FromNumber(103), "Pete"); 1676 "Pete");
1697 ASSERT_TRUE(child.good()); 1677 ASSERT_TRUE(child.good());
1698 child.PutId(ids_.FromNumber(104)); 1678 child.PutId(ids_.FromNumber(104));
1699 child.PutIsUnsynced(true); 1679 child.PutIsUnsynced(true);
1700 child.PutIsDir(true); 1680 child.PutIsDir(true);
1701 child.PutSpecifics(DefaultBookmarkSpecifics()); 1681 child.PutSpecifics(DefaultBookmarkSpecifics());
1702 child.PutIsDel(true); 1682 child.PutIsDel(true);
1703 child.PutBaseVersion(1); 1683 child.PutBaseVersion(1);
1704 child.PutMtime(now_minus_2h); 1684 child.PutMtime(now_minus_2h);
1705 MutableEntry grandchild( 1685 MutableEntry grandchild(&wtrans, CREATE, BOOKMARKS, ids_.FromNumber(104),
1706 &wtrans, CREATE, BOOKMARKS, ids_.FromNumber(104), "Pete"); 1686 "Pete");
1707 ASSERT_TRUE(grandchild.good()); 1687 ASSERT_TRUE(grandchild.good());
1708 grandchild.PutId(ids_.FromNumber(105)); 1688 grandchild.PutId(ids_.FromNumber(105));
1709 grandchild.PutIsUnsynced(true); 1689 grandchild.PutIsUnsynced(true);
1710 grandchild.PutIsDel(true); 1690 grandchild.PutIsDel(true);
1711 grandchild.PutIsDir(false); 1691 grandchild.PutIsDir(false);
1712 grandchild.PutSpecifics(DefaultBookmarkSpecifics()); 1692 grandchild.PutSpecifics(DefaultBookmarkSpecifics());
1713 grandchild.PutBaseVersion(1); 1693 grandchild.PutBaseVersion(1);
1714 grandchild.PutMtime(now_minus_2h); 1694 grandchild.PutMtime(now_minus_2h);
1715 } 1695 }
1716 } 1696 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1866 parent.PutIsDir(true); 1846 parent.PutIsDir(true);
1867 parent.PutSpecifics(DefaultBookmarkSpecifics()); 1847 parent.PutSpecifics(DefaultBookmarkSpecifics());
1868 parent.PutId(parent_id_); 1848 parent.PutId(parent_id_);
1869 parent.PutBaseVersion(1); 1849 parent.PutBaseVersion(1);
1870 } 1850 }
1871 1851
1872 syncable::Id parent2_id = ids_.NewLocalId(); 1852 syncable::Id parent2_id = ids_.NewLocalId();
1873 syncable::Id child_id = ids_.NewServerId(); 1853 syncable::Id child_id = ids_.NewServerId();
1874 { 1854 {
1875 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1855 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1876 MutableEntry parent2( 1856 MutableEntry parent2(&wtrans, CREATE, BOOKMARKS, parent_id_, parent2_name);
1877 &wtrans, CREATE, BOOKMARKS, parent_id_, parent2_name);
1878 ASSERT_TRUE(parent2.good()); 1857 ASSERT_TRUE(parent2.good());
1879 parent2.PutIsUnsynced(true); 1858 parent2.PutIsUnsynced(true);
1880 parent2.PutIsDir(true); 1859 parent2.PutIsDir(true);
1881 parent2.PutSpecifics(DefaultBookmarkSpecifics()); 1860 parent2.PutSpecifics(DefaultBookmarkSpecifics());
1882 parent2.PutId(parent2_id); 1861 parent2.PutId(parent2_id);
1883 1862
1884 MutableEntry child( 1863 MutableEntry child(&wtrans, CREATE, BOOKMARKS, parent2_id, child_name);
1885 &wtrans, CREATE, BOOKMARKS, parent2_id, child_name);
1886 ASSERT_TRUE(child.good()); 1864 ASSERT_TRUE(child.good());
1887 child.PutIsUnsynced(true); 1865 child.PutIsUnsynced(true);
1888 child.PutIsDir(true); 1866 child.PutIsDir(true);
1889 child.PutSpecifics(DefaultBookmarkSpecifics()); 1867 child.PutSpecifics(DefaultBookmarkSpecifics());
1890 child.PutId(child_id); 1868 child.PutId(child_id);
1891 child.PutBaseVersion(1); 1869 child.PutBaseVersion(1);
1892 } 1870 }
1893 1871
1894 EXPECT_TRUE(SyncShareNudge()); 1872 EXPECT_TRUE(SyncShareNudge());
1895 ASSERT_EQ(3u, mock_server_->committed_ids().size()); 1873 ASSERT_EQ(3u, mock_server_->committed_ids().size());
1896 // If this test starts failing, be aware other sort orders could be valid. 1874 // If this test starts failing, be aware other sort orders could be valid.
1897 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]); 1875 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]);
1898 EXPECT_EQ(parent2_id, mock_server_->committed_ids()[1]); 1876 EXPECT_EQ(parent2_id, mock_server_->committed_ids()[1]);
1899 EXPECT_EQ(child_id, mock_server_->committed_ids()[2]); 1877 EXPECT_EQ(child_id, mock_server_->committed_ids()[2]);
1900 { 1878 {
1901 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1879 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1902 // Check that things committed correctly. 1880 // Check that things committed correctly.
1903 Entry entry_1(&rtrans, syncable::GET_BY_ID, parent_id_); 1881 Entry entry_1(&rtrans, syncable::GET_BY_ID, parent_id_);
1904 EXPECT_EQ(parent1_name, entry_1.GetNonUniqueName()); 1882 EXPECT_EQ(parent1_name, entry_1.GetNonUniqueName());
1905 // Check that parent2 is a subfolder of parent1. 1883 // Check that parent2 is a subfolder of parent1.
1906 EXPECT_EQ(1, CountEntriesWithName(&rtrans, 1884 EXPECT_EQ(1, CountEntriesWithName(&rtrans, parent_id_, parent2_name));
1907 parent_id_,
1908 parent2_name));
1909 1885
1910 // Parent2 was a local ID and thus should have changed on commit! 1886 // Parent2 was a local ID and thus should have changed on commit!
1911 Entry pre_commit_entry_parent2(&rtrans, syncable::GET_BY_ID, parent2_id); 1887 Entry pre_commit_entry_parent2(&rtrans, syncable::GET_BY_ID, parent2_id);
1912 ASSERT_FALSE(pre_commit_entry_parent2.good()); 1888 ASSERT_FALSE(pre_commit_entry_parent2.good());
1913 1889
1914 // Look up the new ID. 1890 // Look up the new ID.
1915 Id parent2_committed_id = 1891 Id parent2_committed_id =
1916 GetOnlyEntryWithName(&rtrans, parent_id_, parent2_name); 1892 GetOnlyEntryWithName(&rtrans, parent_id_, parent2_name);
1917 EXPECT_TRUE(parent2_committed_id.ServerKnows()); 1893 EXPECT_TRUE(parent2_committed_id.ServerKnows());
1918 1894
1919 Entry child(&rtrans, syncable::GET_BY_ID, child_id); 1895 Entry child(&rtrans, syncable::GET_BY_ID, child_id);
1920 EXPECT_EQ(parent2_committed_id, child.GetParentId()); 1896 EXPECT_EQ(parent2_committed_id, child.GetParentId());
1921 } 1897 }
1922 } 1898 }
1923 1899
1924 TEST_F(SyncerTest, TestCommitListOrderingAndNewParentAndChild) { 1900 TEST_F(SyncerTest, TestCommitListOrderingAndNewParentAndChild) {
1925 string parent_name = "1"; 1901 string parent_name = "1";
1926 string parent2_name = "A"; 1902 string parent2_name = "A";
1927 string child_name = "B"; 1903 string child_name = "B";
1928 1904
1929 { 1905 {
1930 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1906 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1931 MutableEntry parent(&wtrans, 1907 MutableEntry parent(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(),
1932 CREATE, BOOKMARKS,
1933 wtrans.root_id(),
1934 parent_name); 1908 parent_name);
1935 ASSERT_TRUE(parent.good()); 1909 ASSERT_TRUE(parent.good());
1936 parent.PutIsUnsynced(true); 1910 parent.PutIsUnsynced(true);
1937 parent.PutIsDir(true); 1911 parent.PutIsDir(true);
1938 parent.PutSpecifics(DefaultBookmarkSpecifics()); 1912 parent.PutSpecifics(DefaultBookmarkSpecifics());
1939 parent.PutId(parent_id_); 1913 parent.PutId(parent_id_);
1940 parent.PutBaseVersion(1); 1914 parent.PutBaseVersion(1);
1941 } 1915 }
1942 1916
1943 int64_t meta_handle_b; 1917 int64_t meta_handle_b;
1944 const Id parent2_local_id = ids_.NewLocalId(); 1918 const Id parent2_local_id = ids_.NewLocalId();
1945 const Id child_local_id = ids_.NewLocalId(); 1919 const Id child_local_id = ids_.NewLocalId();
1946 { 1920 {
1947 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1921 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1948 MutableEntry parent2(&wtrans, CREATE, BOOKMARKS, parent_id_, parent2_name); 1922 MutableEntry parent2(&wtrans, CREATE, BOOKMARKS, parent_id_, parent2_name);
1949 ASSERT_TRUE(parent2.good()); 1923 ASSERT_TRUE(parent2.good());
1950 parent2.PutIsUnsynced(true); 1924 parent2.PutIsUnsynced(true);
1951 parent2.PutIsDir(true); 1925 parent2.PutIsDir(true);
1952 parent2.PutSpecifics(DefaultBookmarkSpecifics()); 1926 parent2.PutSpecifics(DefaultBookmarkSpecifics());
1953 1927
1954 parent2.PutId(parent2_local_id); 1928 parent2.PutId(parent2_local_id);
1955 MutableEntry child( 1929 MutableEntry child(&wtrans, CREATE, BOOKMARKS, parent2_local_id,
1956 &wtrans, CREATE, BOOKMARKS, parent2_local_id, child_name); 1930 child_name);
1957 ASSERT_TRUE(child.good()); 1931 ASSERT_TRUE(child.good());
1958 child.PutIsUnsynced(true); 1932 child.PutIsUnsynced(true);
1959 child.PutIsDir(true); 1933 child.PutIsDir(true);
1960 child.PutSpecifics(DefaultBookmarkSpecifics()); 1934 child.PutSpecifics(DefaultBookmarkSpecifics());
1961 child.PutId(child_local_id); 1935 child.PutId(child_local_id);
1962 meta_handle_b = child.GetMetahandle(); 1936 meta_handle_b = child.GetMetahandle();
1963 } 1937 }
1964 1938
1965 EXPECT_TRUE(SyncShareNudge()); 1939 EXPECT_TRUE(SyncShareNudge());
1966 ASSERT_EQ(3u, mock_server_->committed_ids().size()); 1940 ASSERT_EQ(3u, mock_server_->committed_ids().size());
1967 // If this test starts failing, be aware other sort orders could be valid. 1941 // If this test starts failing, be aware other sort orders could be valid.
1968 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]); 1942 EXPECT_EQ(parent_id_, mock_server_->committed_ids()[0]);
1969 EXPECT_EQ(parent2_local_id, mock_server_->committed_ids()[1]); 1943 EXPECT_EQ(parent2_local_id, mock_server_->committed_ids()[1]);
1970 EXPECT_EQ(child_local_id, mock_server_->committed_ids()[2]); 1944 EXPECT_EQ(child_local_id, mock_server_->committed_ids()[2]);
1971 { 1945 {
1972 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 1946 syncable::ReadTransaction rtrans(FROM_HERE, directory());
1973 1947
1974 Entry parent(&rtrans, syncable::GET_BY_ID, 1948 Entry parent(&rtrans, syncable::GET_BY_ID,
1975 GetOnlyEntryWithName(&rtrans, rtrans.root_id(), parent_name)); 1949 GetOnlyEntryWithName(&rtrans, rtrans.root_id(), parent_name));
1976 ASSERT_TRUE(parent.good()); 1950 ASSERT_TRUE(parent.good());
1977 EXPECT_TRUE(parent.GetId().ServerKnows()); 1951 EXPECT_TRUE(parent.GetId().ServerKnows());
1978 1952
1979 Entry parent2(&rtrans, syncable::GET_BY_ID, 1953 Entry parent2(&rtrans, syncable::GET_BY_ID,
1980 GetOnlyEntryWithName(&rtrans, parent.GetId(), parent2_name)); 1954 GetOnlyEntryWithName(&rtrans, parent.GetId(), parent2_name));
1981 ASSERT_TRUE(parent2.good()); 1955 ASSERT_TRUE(parent2.good());
1982 EXPECT_TRUE(parent2.GetId().ServerKnows()); 1956 EXPECT_TRUE(parent2.GetId().ServerKnows());
1983 1957
1984 // Id changed on commit, so this should fail. 1958 // Id changed on commit, so this should fail.
1985 Entry local_parent2_id_entry(&rtrans, 1959 Entry local_parent2_id_entry(&rtrans, syncable::GET_BY_ID,
1986 syncable::GET_BY_ID,
1987 parent2_local_id); 1960 parent2_local_id);
1988 ASSERT_FALSE(local_parent2_id_entry.good()); 1961 ASSERT_FALSE(local_parent2_id_entry.good());
1989 1962
1990 Entry entry_b(&rtrans, syncable::GET_BY_HANDLE, meta_handle_b); 1963 Entry entry_b(&rtrans, syncable::GET_BY_HANDLE, meta_handle_b);
1991 EXPECT_TRUE(entry_b.GetId().ServerKnows()); 1964 EXPECT_TRUE(entry_b.GetId().ServerKnows());
1992 EXPECT_TRUE(parent2.GetId() == entry_b.GetParentId()); 1965 EXPECT_TRUE(parent2.GetId() == entry_b.GetParentId());
1993 } 1966 }
1994 } 1967 }
1995 1968
1996 TEST_F(SyncerTest, UpdateWithZeroLengthName) { 1969 TEST_F(SyncerTest, UpdateWithZeroLengthName) {
1997 // One illegal update 1970 // One illegal update
1998 mock_server_->AddUpdateDirectory( 1971 mock_server_->AddUpdateDirectory(1, 0, std::string(), 1, 10,
1999 1, 0, std::string(), 1, 10, foreign_cache_guid(), "-1"); 1972 foreign_cache_guid(), "-1");
2000 // And one legal one that we're going to delete. 1973 // And one legal one that we're going to delete.
2001 mock_server_->AddUpdateDirectory(2, 0, "FOO", 1, 10, 1974 mock_server_->AddUpdateDirectory(2, 0, "FOO", 1, 10, foreign_cache_guid(),
2002 foreign_cache_guid(), "-2"); 1975 "-2");
2003 EXPECT_TRUE(SyncShareNudge()); 1976 EXPECT_TRUE(SyncShareNudge());
2004 // Delete the legal one. The new update has a null name. 1977 // Delete the legal one. The new update has a null name.
2005 mock_server_->AddUpdateDirectory( 1978 mock_server_->AddUpdateDirectory(2, 0, std::string(), 2, 20,
2006 2, 0, std::string(), 2, 20, foreign_cache_guid(), "-2"); 1979 foreign_cache_guid(), "-2");
2007 mock_server_->SetLastUpdateDeleted(); 1980 mock_server_->SetLastUpdateDeleted();
2008 EXPECT_TRUE(SyncShareNudge()); 1981 EXPECT_TRUE(SyncShareNudge());
2009 } 1982 }
2010 1983
2011 TEST_F(SyncerTest, TestBasicUpdate) { 1984 TEST_F(SyncerTest, TestBasicUpdate) {
2012 string id = "some_id"; 1985 string id = "some_id";
2013 string parent_id = "0"; 1986 string parent_id = "0";
2014 string name = "in_root"; 1987 string name = "in_root";
2015 int64_t version = 10; 1988 int64_t version = 10;
2016 int64_t timestamp = 10; 1989 int64_t timestamp = 10;
2017 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp, 1990 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp,
2018 foreign_cache_guid(), "-1"); 1991 foreign_cache_guid(), "-1");
2019 1992
2020 EXPECT_TRUE(SyncShareNudge()); 1993 EXPECT_TRUE(SyncShareNudge());
2021 { 1994 {
2022 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 1995 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2023 Entry entry(&trans, GET_BY_ID, 1996 Entry entry(&trans, GET_BY_ID, syncable::Id::CreateFromServerId("some_id"));
2024 syncable::Id::CreateFromServerId("some_id"));
2025 ASSERT_TRUE(entry.good()); 1997 ASSERT_TRUE(entry.good());
2026 EXPECT_TRUE(entry.GetIsDir()); 1998 EXPECT_TRUE(entry.GetIsDir());
2027 EXPECT_EQ(version, entry.GetServerVersion()); 1999 EXPECT_EQ(version, entry.GetServerVersion());
2028 EXPECT_EQ(version, entry.GetBaseVersion()); 2000 EXPECT_EQ(version, entry.GetBaseVersion());
2029 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 2001 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
2030 EXPECT_FALSE(entry.GetIsUnsynced()); 2002 EXPECT_FALSE(entry.GetIsUnsynced());
2031 EXPECT_FALSE(entry.GetServerIsDel()); 2003 EXPECT_FALSE(entry.GetServerIsDel());
2032 EXPECT_FALSE(entry.GetIsDel()); 2004 EXPECT_FALSE(entry.GetIsDel());
2033 } 2005 }
2034 } 2006 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2181 GetUpdateCounters(BOOKMARKS).num_hierarchy_conflict_application_failures); 2153 GetUpdateCounters(BOOKMARKS).num_hierarchy_conflict_application_failures);
2182 } 2154 }
2183 2155
2184 // A commit with a lost response produces an update that has to be reunited with 2156 // A commit with a lost response produces an update that has to be reunited with
2185 // its parent. 2157 // its parent.
2186 TEST_F(SyncerTest, CommitReuniteUpdateAdjustsChildren) { 2158 TEST_F(SyncerTest, CommitReuniteUpdateAdjustsChildren) {
2187 // Create a folder in the root. 2159 // Create a folder in the root.
2188 int64_t metahandle_folder; 2160 int64_t metahandle_folder;
2189 { 2161 {
2190 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2162 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2191 MutableEntry entry( 2163 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(),
2192 &trans, CREATE, BOOKMARKS, trans.root_id(), "new_folder"); 2164 "new_folder");
2193 ASSERT_TRUE(entry.good()); 2165 ASSERT_TRUE(entry.good());
2194 entry.PutIsDir(true); 2166 entry.PutIsDir(true);
2195 entry.PutSpecifics(DefaultBookmarkSpecifics()); 2167 entry.PutSpecifics(DefaultBookmarkSpecifics());
2196 entry.PutIsUnsynced(true); 2168 entry.PutIsUnsynced(true);
2197 metahandle_folder = entry.GetMetahandle(); 2169 metahandle_folder = entry.GetMetahandle();
2198 } 2170 }
2199 2171
2200 // Verify it and pull the ID out of the folder. 2172 // Verify it and pull the ID out of the folder.
2201 syncable::Id folder_id; 2173 syncable::Id folder_id;
2202 int64_t metahandle_entry; 2174 int64_t metahandle_entry;
(...skipping 28 matching lines...) Expand all
2231 } 2203 }
2232 2204
2233 // Now, to emulate a commit response failure, we just don't commit it. 2205 // Now, to emulate a commit response failure, we just don't commit it.
2234 int64_t new_version = 150; // any larger value. 2206 int64_t new_version = 150; // any larger value.
2235 int64_t timestamp = 20; // arbitrary value. 2207 int64_t timestamp = 20; // arbitrary value.
2236 syncable::Id new_folder_id = 2208 syncable::Id new_folder_id =
2237 syncable::Id::CreateFromServerId("folder_server_id"); 2209 syncable::Id::CreateFromServerId("folder_server_id");
2238 2210
2239 // The following update should cause the folder to both apply the update, as 2211 // The following update should cause the folder to both apply the update, as
2240 // well as reassociate the id. 2212 // well as reassociate the id.
2241 mock_server_->AddUpdateDirectory(new_folder_id, root_id_, 2213 mock_server_->AddUpdateDirectory(new_folder_id, root_id_, "new_folder",
2242 "new_folder", new_version, timestamp, 2214 new_version, timestamp, local_cache_guid(),
2243 local_cache_guid(), folder_id.GetServerId()); 2215 folder_id.GetServerId());
2244 2216
2245 // We don't want it accidentally committed, just the update applied. 2217 // We don't want it accidentally committed, just the update applied.
2246 mock_server_->set_conflict_all_commits(true); 2218 mock_server_->set_conflict_all_commits(true);
2247 2219
2248 // Alright! Apply that update! 2220 // Alright! Apply that update!
2249 EXPECT_FALSE(SyncShareNudge()); 2221 EXPECT_FALSE(SyncShareNudge());
2250 { 2222 {
2251 // The folder's ID should have been updated. 2223 // The folder's ID should have been updated.
2252 syncable::ReadTransaction trans(FROM_HERE, directory()); 2224 syncable::ReadTransaction trans(FROM_HERE, directory());
2253 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder); 2225 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2296 EXPECT_TRUE(!entry_id.ServerKnows()); 2268 EXPECT_TRUE(!entry_id.ServerKnows());
2297 VerifyTestDataInEntry(&trans, &entry); 2269 VerifyTestDataInEntry(&trans, &entry);
2298 } 2270 }
2299 2271
2300 // Now, to emulate a commit response failure, we just don't commit it. 2272 // Now, to emulate a commit response failure, we just don't commit it.
2301 int64_t new_version = 150; // any larger value. 2273 int64_t new_version = 150; // any larger value.
2302 int64_t timestamp = 20; // arbitrary value. 2274 int64_t timestamp = 20; // arbitrary value.
2303 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); 2275 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id");
2304 2276
2305 // Generate an update from the server with a relevant ID reassignment. 2277 // Generate an update from the server with a relevant ID reassignment.
2306 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, 2278 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, "new_entry",
2307 "new_entry", new_version, timestamp, 2279 new_version, timestamp, local_cache_guid(),
2308 local_cache_guid(), entry_id.GetServerId()); 2280 entry_id.GetServerId());
2309 2281
2310 // We don't want it accidentally committed, just the update applied. 2282 // We don't want it accidentally committed, just the update applied.
2311 mock_server_->set_conflict_all_commits(true); 2283 mock_server_->set_conflict_all_commits(true);
2312 2284
2313 // Alright! Apply that update! 2285 // Alright! Apply that update!
2314 EXPECT_TRUE(SyncShareNudge()); 2286 EXPECT_TRUE(SyncShareNudge());
2315 { 2287 {
2316 syncable::ReadTransaction trans(FROM_HERE, directory()); 2288 syncable::ReadTransaction trans(FROM_HERE, directory());
2317 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); 2289 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle);
2318 ASSERT_TRUE(entry.good()); 2290 ASSERT_TRUE(entry.good());
(...skipping 28 matching lines...) Expand all
2347 EXPECT_TRUE(!entry_id.ServerKnows()); 2319 EXPECT_TRUE(!entry_id.ServerKnows());
2348 VerifyTestDataInEntry(&trans, &entry); 2320 VerifyTestDataInEntry(&trans, &entry);
2349 } 2321 }
2350 2322
2351 // Now, to emulate a commit response failure, we just don't commit it. 2323 // Now, to emulate a commit response failure, we just don't commit it.
2352 int64_t new_version = 150; // any larger value. 2324 int64_t new_version = 150; // any larger value.
2353 int64_t timestamp = 20; // arbitrary value. 2325 int64_t timestamp = 20; // arbitrary value.
2354 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); 2326 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id");
2355 2327
2356 // Generate an update from the server with a relevant ID reassignment. 2328 // Generate an update from the server with a relevant ID reassignment.
2357 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, 2329 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, "new_entry",
2358 "new_entry", new_version, timestamp, 2330 new_version, timestamp, local_cache_guid(),
2359 local_cache_guid(), entry_id.GetServerId()); 2331 entry_id.GetServerId());
2360 2332
2361 // We don't want it accidentally committed, just the update applied. 2333 // We don't want it accidentally committed, just the update applied.
2362 mock_server_->set_conflict_all_commits(true); 2334 mock_server_->set_conflict_all_commits(true);
2363 2335
2364 // Purposefully delete the entry now before the update application finishes. 2336 // Purposefully delete the entry now before the update application finishes.
2365 { 2337 {
2366 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2338 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2367 Id new_entry_id = GetOnlyEntryWithName( 2339 Id new_entry_id =
2368 &trans, trans.root_id(), "new_entry"); 2340 GetOnlyEntryWithName(&trans, trans.root_id(), "new_entry");
2369 MutableEntry entry(&trans, GET_BY_ID, new_entry_id); 2341 MutableEntry entry(&trans, GET_BY_ID, new_entry_id);
2370 ASSERT_TRUE(entry.good()); 2342 ASSERT_TRUE(entry.good());
2371 entry.PutIsDel(true); 2343 entry.PutIsDel(true);
2372 } 2344 }
2373 2345
2374 // Just don't CHECK fail in sync, have the update split. 2346 // Just don't CHECK fail in sync, have the update split.
2375 EXPECT_TRUE(SyncShareNudge()); 2347 EXPECT_TRUE(SyncShareNudge());
2376 { 2348 {
2377 syncable::ReadTransaction trans(FROM_HERE, directory()); 2349 syncable::ReadTransaction trans(FROM_HERE, directory());
2378 Id new_entry_id = GetOnlyEntryWithName( 2350 Id new_entry_id =
2379 &trans, trans.root_id(), "new_entry"); 2351 GetOnlyEntryWithName(&trans, trans.root_id(), "new_entry");
2380 Entry entry(&trans, GET_BY_ID, new_entry_id); 2352 Entry entry(&trans, GET_BY_ID, new_entry_id);
2381 ASSERT_TRUE(entry.good()); 2353 ASSERT_TRUE(entry.good());
2382 EXPECT_FALSE(entry.GetIsDel()); 2354 EXPECT_FALSE(entry.GetIsDel());
2383 2355
2384 Entry old_entry(&trans, GET_BY_ID, entry_id); 2356 Entry old_entry(&trans, GET_BY_ID, entry_id);
2385 ASSERT_TRUE(old_entry.good()); 2357 ASSERT_TRUE(old_entry.good());
2386 EXPECT_TRUE(old_entry.GetIsDel()); 2358 EXPECT_TRUE(old_entry.GetIsDel());
2387 } 2359 }
2388 } 2360 }
2389 2361
2390 // TODO(chron): Add more unsanitized name tests. 2362 // TODO(chron): Add more unsanitized name tests.
2391 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) { 2363 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) {
2392 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10, 2364 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10, foreign_cache_guid(),
2393 foreign_cache_guid(), "-1"); 2365 "-1");
2394 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10, 2366 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10, foreign_cache_guid(),
2395 foreign_cache_guid(), "-2"); 2367 "-2");
2396 mock_server_->set_conflict_all_commits(true); 2368 mock_server_->set_conflict_all_commits(true);
2397 EXPECT_TRUE(SyncShareNudge()); 2369 EXPECT_TRUE(SyncShareNudge());
2398 { 2370 {
2399 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2371 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2400 2372
2401 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2373 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2402 ASSERT_TRUE(A.good()); 2374 ASSERT_TRUE(A.good());
2403 A.PutIsUnsynced(true); 2375 A.PutIsUnsynced(true);
2404 A.PutIsUnappliedUpdate(true); 2376 A.PutIsUnappliedUpdate(true);
2405 A.PutServerVersion(20); 2377 A.PutServerVersion(20);
(...skipping 17 matching lines...) Expand all
2423 2395
2424 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); 2396 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2));
2425 ASSERT_TRUE(B.good()); 2397 ASSERT_TRUE(B.good());
2426 EXPECT_FALSE(B.GetIsUnsynced()); 2398 EXPECT_FALSE(B.GetIsUnsynced());
2427 EXPECT_FALSE(B.GetIsUnappliedUpdate()); 2399 EXPECT_FALSE(B.GetIsUnappliedUpdate());
2428 EXPECT_EQ(20, B.GetServerVersion()); 2400 EXPECT_EQ(20, B.GetServerVersion());
2429 } 2401 }
2430 } 2402 }
2431 2403
2432 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) { 2404 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) {
2433 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 2405 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
2434 foreign_cache_guid(), "-1"); 2406 "-1");
2435 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, 2407 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, foreign_cache_guid(),
2436 foreign_cache_guid(), "-2"); 2408 "-2");
2437 mock_server_->set_conflict_all_commits(true); 2409 mock_server_->set_conflict_all_commits(true);
2438 EXPECT_TRUE(SyncShareNudge()); 2410 EXPECT_TRUE(SyncShareNudge());
2439 { 2411 {
2440 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2412 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2441 2413
2442 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2414 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2443 ASSERT_TRUE(A.good()); 2415 ASSERT_TRUE(A.good());
2444 A.PutIsUnsynced(true); 2416 A.PutIsUnsynced(true);
2445 A.PutIsUnappliedUpdate(true); 2417 A.PutIsUnappliedUpdate(true);
2446 A.PutServerVersion(20); 2418 A.PutServerVersion(20);
(...skipping 19 matching lines...) Expand all
2466 ASSERT_TRUE(B.good()); 2438 ASSERT_TRUE(B.good());
2467 EXPECT_FALSE(B.GetIsUnsynced()); 2439 EXPECT_FALSE(B.GetIsUnsynced());
2468 EXPECT_FALSE(B.GetIsUnappliedUpdate()); 2440 EXPECT_FALSE(B.GetIsUnappliedUpdate());
2469 EXPECT_EQ(20, B.GetServerVersion()); 2441 EXPECT_EQ(20, B.GetServerVersion());
2470 } 2442 }
2471 } 2443 }
2472 2444
2473 TEST_F(SyncerTest, ReverseFolderOrderingTest) { 2445 TEST_F(SyncerTest, ReverseFolderOrderingTest) {
2474 mock_server_->AddUpdateDirectory(4, 3, "ggchild", 10, 10, 2446 mock_server_->AddUpdateDirectory(4, 3, "ggchild", 10, 10,
2475 foreign_cache_guid(), "-4"); 2447 foreign_cache_guid(), "-4");
2476 mock_server_->AddUpdateDirectory(3, 2, "gchild", 10, 10, 2448 mock_server_->AddUpdateDirectory(3, 2, "gchild", 10, 10, foreign_cache_guid(),
2477 foreign_cache_guid(), "-3"); 2449 "-3");
2478 mock_server_->AddUpdateDirectory(5, 4, "gggchild", 10, 10, 2450 mock_server_->AddUpdateDirectory(5, 4, "gggchild", 10, 10,
2479 foreign_cache_guid(), "-5"); 2451 foreign_cache_guid(), "-5");
2480 mock_server_->AddUpdateDirectory(2, 1, "child", 10, 10, 2452 mock_server_->AddUpdateDirectory(2, 1, "child", 10, 10, foreign_cache_guid(),
2481 foreign_cache_guid(), "-2"); 2453 "-2");
2482 mock_server_->AddUpdateDirectory(1, 0, "parent", 10, 10, 2454 mock_server_->AddUpdateDirectory(1, 0, "parent", 10, 10, foreign_cache_guid(),
2483 foreign_cache_guid(), "-1"); 2455 "-1");
2484 EXPECT_TRUE(SyncShareNudge()); 2456 EXPECT_TRUE(SyncShareNudge());
2485 syncable::ReadTransaction trans(FROM_HERE, directory()); 2457 syncable::ReadTransaction trans(FROM_HERE, directory());
2486 2458
2487 Id child_id = GetOnlyEntryWithName( 2459 Id child_id = GetOnlyEntryWithName(&trans, ids_.FromNumber(4), "gggchild");
2488 &trans, ids_.FromNumber(4), "gggchild");
2489 Entry child(&trans, GET_BY_ID, child_id); 2460 Entry child(&trans, GET_BY_ID, child_id);
2490 ASSERT_TRUE(child.good()); 2461 ASSERT_TRUE(child.good());
2491 } 2462 }
2492 2463
2493 class EntryCreatedInNewFolderTest : public SyncerTest { 2464 class EntryCreatedInNewFolderTest : public SyncerTest {
2494 public: 2465 public:
2495 void CreateFolderInBob() { 2466 void CreateFolderInBob() {
2496 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2467 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2497 MutableEntry bob(&trans, 2468 MutableEntry bob(
2498 syncable::GET_BY_ID, 2469 &trans, syncable::GET_BY_ID,
2499 GetOnlyEntryWithName(&trans, 2470 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "bob"));
2500 TestIdFactory::root(),
2501 "bob"));
2502 ASSERT_TRUE(bob.good()); 2471 ASSERT_TRUE(bob.good());
2503 2472
2504 MutableEntry entry2( 2473 MutableEntry entry2(&trans, CREATE, BOOKMARKS, bob.GetId(), "bob");
2505 &trans, CREATE, BOOKMARKS, bob.GetId(), "bob");
2506 ASSERT_TRUE(entry2.good()); 2474 ASSERT_TRUE(entry2.good());
2507 entry2.PutIsDir(true); 2475 entry2.PutIsDir(true);
2508 entry2.PutIsUnsynced(true); 2476 entry2.PutIsUnsynced(true);
2509 entry2.PutSpecifics(DefaultBookmarkSpecifics()); 2477 entry2.PutSpecifics(DefaultBookmarkSpecifics());
2510 } 2478 }
2511 }; 2479 };
2512 2480
2513 TEST_F(EntryCreatedInNewFolderTest, EntryCreatedInNewFolderMidSync) { 2481 TEST_F(EntryCreatedInNewFolderTest, EntryCreatedInNewFolderMidSync) {
2514 { 2482 {
2515 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2483 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2516 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(), "bob"); 2484 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(), "bob");
2517 ASSERT_TRUE(entry.good()); 2485 ASSERT_TRUE(entry.good());
2518 entry.PutIsDir(true); 2486 entry.PutIsDir(true);
2519 entry.PutIsUnsynced(true); 2487 entry.PutIsUnsynced(true);
2520 entry.PutSpecifics(DefaultBookmarkSpecifics()); 2488 entry.PutSpecifics(DefaultBookmarkSpecifics());
2521 } 2489 }
2522 2490
2523 mock_server_->SetMidCommitCallback( 2491 mock_server_->SetMidCommitCallback(base::Bind(
2524 base::Bind(&EntryCreatedInNewFolderTest::CreateFolderInBob, 2492 &EntryCreatedInNewFolderTest::CreateFolderInBob, base::Unretained(this)));
2525 base::Unretained(this)));
2526 EXPECT_TRUE(SyncShareNudge()); 2493 EXPECT_TRUE(SyncShareNudge());
2527 // We loop until no unsynced handles remain, so we will commit both ids. 2494 // We loop until no unsynced handles remain, so we will commit both ids.
2528 EXPECT_EQ(2u, mock_server_->committed_ids().size()); 2495 EXPECT_EQ(2u, mock_server_->committed_ids().size());
2529 { 2496 {
2530 syncable::ReadTransaction trans(FROM_HERE, directory()); 2497 syncable::ReadTransaction trans(FROM_HERE, directory());
2531 Entry parent_entry(&trans, syncable::GET_BY_ID, 2498 Entry parent_entry(
2499 &trans, syncable::GET_BY_ID,
2532 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "bob")); 2500 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "bob"));
2533 ASSERT_TRUE(parent_entry.good()); 2501 ASSERT_TRUE(parent_entry.good());
2534 2502
2535 Id child_id = 2503 Id child_id = GetOnlyEntryWithName(&trans, parent_entry.GetId(), "bob");
2536 GetOnlyEntryWithName(&trans, parent_entry.GetId(), "bob");
2537 Entry child(&trans, syncable::GET_BY_ID, child_id); 2504 Entry child(&trans, syncable::GET_BY_ID, child_id);
2538 ASSERT_TRUE(child.good()); 2505 ASSERT_TRUE(child.good());
2539 EXPECT_EQ(parent_entry.GetId(), child.GetParentId()); 2506 EXPECT_EQ(parent_entry.GetId(), child.GetParentId());
2540 } 2507 }
2541 } 2508 }
2542 2509
2543 TEST_F(SyncerTest, NegativeIDInUpdate) { 2510 TEST_F(SyncerTest, NegativeIDInUpdate) {
2544 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40, 2511 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40, foreign_cache_guid(),
2545 foreign_cache_guid(), "-100"); 2512 "-100");
2546 EXPECT_TRUE(SyncShareNudge()); 2513 EXPECT_TRUE(SyncShareNudge());
2547 // The negative id would make us CHECK! 2514 // The negative id would make us CHECK!
2548 } 2515 }
2549 2516
2550 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) { 2517 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) {
2551 int64_t metahandle_fred; 2518 int64_t metahandle_fred;
2552 syncable::Id orig_id; 2519 syncable::Id orig_id;
2553 { 2520 {
2554 // Create an item. 2521 // Create an item.
2555 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2522 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
(...skipping 10 matching lines...) Expand all
2566 mock_server_->set_conflict_all_commits(true); 2533 mock_server_->set_conflict_all_commits(true);
2567 syncable::Id fred_match_id; 2534 syncable::Id fred_match_id;
2568 { 2535 {
2569 // Now receive a change from outside. 2536 // Now receive a change from outside.
2570 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2537 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2571 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred); 2538 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred);
2572 ASSERT_TRUE(fred_match.good()); 2539 ASSERT_TRUE(fred_match.good());
2573 EXPECT_TRUE(fred_match.GetId().ServerKnows()); 2540 EXPECT_TRUE(fred_match.GetId().ServerKnows());
2574 fred_match_id = fred_match.GetId(); 2541 fred_match_id = fred_match.GetId();
2575 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(), 2542 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(),
2576 "fred_match", 40, 40, local_cache_guid(), orig_id.GetServerId()); 2543 "fred_match", 40, 40, local_cache_guid(),
2544 orig_id.GetServerId());
2577 } 2545 }
2578 // Run the syncer. 2546 // Run the syncer.
2579 for (int i = 0 ; i < 30 ; ++i) { 2547 for (int i = 0; i < 30; ++i) {
2580 EXPECT_TRUE(SyncShareNudge()); 2548 EXPECT_TRUE(SyncShareNudge());
2581 } 2549 }
2582 } 2550 }
2583 2551
2584 /** 2552 /**
2585 * In the event that we have a double changed entry, that is changed on both 2553 * In the event that we have a double changed entry, that is changed on both
2586 * the client and the server, the conflict resolver should just drop one of 2554 * the client and the server, the conflict resolver should just drop one of
2587 * them and accept the other. 2555 * them and accept the other.
2588 */ 2556 */
2589 2557
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
3022 EXPECT_TRUE(SyncShareNudge()); 2990 EXPECT_TRUE(SyncShareNudge());
3023 // Since the hierarchy isn't really changed (the type has flat hierarchy) 2991 // Since the hierarchy isn't really changed (the type has flat hierarchy)
3024 // this conflict must be discarded. 2992 // this conflict must be discarded.
3025 EXPECT_EQ(0, session_->status_controller().num_local_overwrites()); 2993 EXPECT_EQ(0, session_->status_controller().num_local_overwrites());
3026 EXPECT_EQ(0, session_->status_controller().num_server_overwrites()); 2994 EXPECT_EQ(0, session_->status_controller().num_server_overwrites());
3027 } 2995 }
3028 2996
3029 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) { 2997 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) {
3030 int64_t newfolder_metahandle; 2998 int64_t newfolder_metahandle;
3031 2999
3032 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, 3000 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, foreign_cache_guid(),
3033 foreign_cache_guid(), "-1"); 3001 "-1");
3034 EXPECT_TRUE(SyncShareNudge()); 3002 EXPECT_TRUE(SyncShareNudge());
3035 { 3003 {
3036 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3004 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3037 MutableEntry newfolder( 3005 MutableEntry newfolder(&trans, CREATE, BOOKMARKS, ids_.FromNumber(1),
3038 &trans, CREATE, BOOKMARKS, ids_.FromNumber(1), "local"); 3006 "local");
3039 ASSERT_TRUE(newfolder.good()); 3007 ASSERT_TRUE(newfolder.good());
3040 newfolder.PutIsUnsynced(true); 3008 newfolder.PutIsUnsynced(true);
3041 newfolder.PutIsDir(true); 3009 newfolder.PutIsDir(true);
3042 newfolder.PutSpecifics(DefaultBookmarkSpecifics()); 3010 newfolder.PutSpecifics(DefaultBookmarkSpecifics());
3043 newfolder_metahandle = newfolder.GetMetahandle(); 3011 newfolder_metahandle = newfolder.GetMetahandle();
3044 } 3012 }
3045 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20, 3013 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20, foreign_cache_guid(),
3046 foreign_cache_guid(), "-1"); 3014 "-1");
3047 mock_server_->SetLastUpdateDeleted(); 3015 mock_server_->SetLastUpdateDeleted();
3048 SyncShareConfigure(); 3016 SyncShareConfigure();
3049 { 3017 {
3050 syncable::ReadTransaction trans(FROM_HERE, directory()); 3018 syncable::ReadTransaction trans(FROM_HERE, directory());
3051 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle); 3019 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle);
3052 ASSERT_TRUE(entry.good()); 3020 ASSERT_TRUE(entry.good());
3053 } 3021 }
3054 } 3022 }
3055 3023
3056 TEST_F(SyncerTest, FolderSwapUpdate) { 3024 TEST_F(SyncerTest, FolderSwapUpdate) {
3057 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10, 3025 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10, foreign_cache_guid(),
3058 foreign_cache_guid(), "-7801"); 3026 "-7801");
3059 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10, 3027 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10, foreign_cache_guid(),
3060 foreign_cache_guid(), "-1024"); 3028 "-1024");
3061 EXPECT_TRUE(SyncShareNudge()); 3029 EXPECT_TRUE(SyncShareNudge());
3062 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20, 3030 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20, foreign_cache_guid(),
3063 foreign_cache_guid(), "-1024"); 3031 "-1024");
3064 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20, 3032 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20, foreign_cache_guid(),
3065 foreign_cache_guid(), "-7801"); 3033 "-7801");
3066 EXPECT_TRUE(SyncShareNudge()); 3034 EXPECT_TRUE(SyncShareNudge());
3067 { 3035 {
3068 syncable::ReadTransaction trans(FROM_HERE, directory()); 3036 syncable::ReadTransaction trans(FROM_HERE, directory());
3069 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 3037 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
3070 ASSERT_TRUE(id1.good()); 3038 ASSERT_TRUE(id1.good());
3071 EXPECT_EQ("fred", id1.GetNonUniqueName()); 3039 EXPECT_EQ("fred", id1.GetNonUniqueName());
3072 EXPECT_EQ(root_id_, id1.GetParentId()); 3040 EXPECT_EQ(root_id_, id1.GetParentId());
3073 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 3041 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
3074 ASSERT_TRUE(id2.good()); 3042 ASSERT_TRUE(id2.good());
3075 EXPECT_EQ("bob", id2.GetNonUniqueName()); 3043 EXPECT_EQ("bob", id2.GetNonUniqueName());
3076 EXPECT_EQ(root_id_, id2.GetParentId()); 3044 EXPECT_EQ(root_id_, id2.GetParentId());
3077 } 3045 }
3078 } 3046 }
3079 3047
3080 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) { 3048 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) {
3081 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10, 3049 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10, foreign_cache_guid(),
3082 foreign_cache_guid(), "-7801"); 3050 "-7801");
3083 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10, 3051 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10, foreign_cache_guid(),
3084 foreign_cache_guid(), "-1024"); 3052 "-1024");
3085 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10, 3053 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10,
3086 foreign_cache_guid(), "-4096"); 3054 foreign_cache_guid(), "-4096");
3087 EXPECT_TRUE(SyncShareNudge()); 3055 EXPECT_TRUE(SyncShareNudge());
3088 { 3056 {
3089 syncable::ReadTransaction trans(FROM_HERE, directory()); 3057 syncable::ReadTransaction trans(FROM_HERE, directory());
3090 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 3058 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
3091 ASSERT_TRUE(id1.good()); 3059 ASSERT_TRUE(id1.good());
3092 EXPECT_EQ("bob", id1.GetNonUniqueName()); 3060 EXPECT_EQ("bob", id1.GetNonUniqueName());
3093 EXPECT_EQ(root_id_, id1.GetParentId()); 3061 EXPECT_EQ(root_id_, id1.GetParentId());
3094 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 3062 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
3095 ASSERT_TRUE(id2.good()); 3063 ASSERT_TRUE(id2.good());
3096 EXPECT_EQ("fred", id2.GetNonUniqueName()); 3064 EXPECT_EQ("fred", id2.GetNonUniqueName());
3097 EXPECT_EQ(root_id_, id2.GetParentId()); 3065 EXPECT_EQ(root_id_, id2.GetParentId());
3098 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); 3066 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096));
3099 ASSERT_TRUE(id3.good()); 3067 ASSERT_TRUE(id3.good());
3100 EXPECT_EQ("alice", id3.GetNonUniqueName()); 3068 EXPECT_EQ("alice", id3.GetNonUniqueName());
3101 EXPECT_EQ(root_id_, id3.GetParentId()); 3069 EXPECT_EQ(root_id_, id3.GetParentId());
3102 } 3070 }
3103 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20, 3071 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20, foreign_cache_guid(),
3104 foreign_cache_guid(), "-1024"); 3072 "-1024");
3105 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20, 3073 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20, foreign_cache_guid(),
3106 foreign_cache_guid(), "-7801"); 3074 "-7801");
3107 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20, 3075 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20, foreign_cache_guid(),
3108 foreign_cache_guid(), "-4096"); 3076 "-4096");
3109 EXPECT_TRUE(SyncShareNudge()); 3077 EXPECT_TRUE(SyncShareNudge());
3110 { 3078 {
3111 syncable::ReadTransaction trans(FROM_HERE, directory()); 3079 syncable::ReadTransaction trans(FROM_HERE, directory());
3112 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 3080 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
3113 ASSERT_TRUE(id1.good()); 3081 ASSERT_TRUE(id1.good());
3114 EXPECT_EQ("fred", id1.GetNonUniqueName()); 3082 EXPECT_EQ("fred", id1.GetNonUniqueName());
3115 EXPECT_EQ(root_id_, id1.GetParentId()); 3083 EXPECT_EQ(root_id_, id1.GetParentId());
3116 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 3084 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
3117 ASSERT_TRUE(id2.good()); 3085 ASSERT_TRUE(id2.good());
3118 EXPECT_EQ("bob", id2.GetNonUniqueName()); 3086 EXPECT_EQ("bob", id2.GetNonUniqueName());
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
3354 int item_count = 300; // We should be able to do 300 or 3000 w/o issue. 3322 int item_count = 300; // We should be able to do 300 or 3000 w/o issue.
3355 3323
3356 syncable::Id parent_id = ids_.NewServerId(); 3324 syncable::Id parent_id = ids_.NewServerId();
3357 syncable::Id last_id = parent_id; 3325 syncable::Id last_id = parent_id;
3358 vector<syncable::Id> tree_ids; 3326 vector<syncable::Id> tree_ids;
3359 3327
3360 // Create a lot of updates for which the parent does not exist yet. 3328 // Create a lot of updates for which the parent does not exist yet.
3361 // Generate a huge deep tree which should all fail to apply at first. 3329 // Generate a huge deep tree which should all fail to apply at first.
3362 { 3330 {
3363 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3331 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3364 for (int i = 0; i < item_count ; i++) { 3332 for (int i = 0; i < item_count; i++) {
3365 syncable::Id next_id = ids_.NewServerId(); 3333 syncable::Id next_id = ids_.NewServerId();
3366 syncable::Id local_id = ids_.NewLocalId(); 3334 syncable::Id local_id = ids_.NewLocalId();
3367 tree_ids.push_back(next_id); 3335 tree_ids.push_back(next_id);
3368 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20, 3336 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20,
3369 foreign_cache_guid(), 3337 foreign_cache_guid(),
3370 local_id.GetServerId()); 3338 local_id.GetServerId());
3371 last_id = next_id; 3339 last_id = next_id;
3372 } 3340 }
3373 } 3341 }
3374 EXPECT_TRUE(SyncShareNudge()); 3342 EXPECT_TRUE(SyncShareNudge());
3375 3343
3376 // Check they're in the expected conflict state. 3344 // Check they're in the expected conflict state.
3377 { 3345 {
3378 syncable::ReadTransaction trans(FROM_HERE, directory()); 3346 syncable::ReadTransaction trans(FROM_HERE, directory());
3379 for (int i = 0; i < item_count; i++) { 3347 for (int i = 0; i < item_count; i++) {
3380 Entry e(&trans, GET_BY_ID, tree_ids[i]); 3348 Entry e(&trans, GET_BY_ID, tree_ids[i]);
3381 // They should all exist but none should be applied. 3349 // They should all exist but none should be applied.
3382 ASSERT_TRUE(e.good()); 3350 ASSERT_TRUE(e.good());
3383 EXPECT_TRUE(e.GetIsDel()); 3351 EXPECT_TRUE(e.GetIsDel());
3384 EXPECT_TRUE(e.GetIsUnappliedUpdate()); 3352 EXPECT_TRUE(e.GetIsUnappliedUpdate());
3385 } 3353 }
3386 } 3354 }
3387 3355
3388 // Add the missing parent directory. 3356 // Add the missing parent directory.
3389 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(), 3357 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(), "BOB", 2,
3390 "BOB", 2, 20, foreign_cache_guid(), "-3500"); 3358 20, foreign_cache_guid(), "-3500");
3391 EXPECT_TRUE(SyncShareNudge()); 3359 EXPECT_TRUE(SyncShareNudge());
3392 3360
3393 // Now they should all be OK. 3361 // Now they should all be OK.
3394 { 3362 {
3395 syncable::ReadTransaction trans(FROM_HERE, directory()); 3363 syncable::ReadTransaction trans(FROM_HERE, directory());
3396 for (int i = 0; i < item_count; i++) { 3364 for (int i = 0; i < item_count; i++) {
3397 Entry e(&trans, GET_BY_ID, tree_ids[i]); 3365 Entry e(&trans, GET_BY_ID, tree_ids[i]);
3398 ASSERT_TRUE(e.good()); 3366 ASSERT_TRUE(e.good());
3399 EXPECT_FALSE(e.GetIsDel()); 3367 EXPECT_FALSE(e.GetIsDel());
3400 EXPECT_FALSE(e.GetIsUnappliedUpdate()); 3368 EXPECT_FALSE(e.GetIsUnappliedUpdate());
3401 } 3369 }
3402 } 3370 }
3403 } 3371 }
3404 3372
3405 TEST_F(SyncerTest, DontCrashOnCaseChange) { 3373 TEST_F(SyncerTest, DontCrashOnCaseChange) {
3406 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, 3374 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, foreign_cache_guid(),
3407 foreign_cache_guid(), "-1"); 3375 "-1");
3408 EXPECT_TRUE(SyncShareNudge()); 3376 EXPECT_TRUE(SyncShareNudge());
3409 { 3377 {
3410 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3378 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3411 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1)); 3379 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1));
3412 ASSERT_TRUE(e.good()); 3380 ASSERT_TRUE(e.good());
3413 e.PutIsUnsynced(true); 3381 e.PutIsUnsynced(true);
3414 } 3382 }
3415 mock_server_->set_conflict_all_commits(true); 3383 mock_server_->set_conflict_all_commits(true);
3416 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20, 3384 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20, foreign_cache_guid(),
3417 foreign_cache_guid(), "-1"); 3385 "-1");
3418 EXPECT_FALSE(SyncShareNudge()); // USED TO CAUSE AN ASSERT 3386 EXPECT_FALSE(SyncShareNudge()); // USED TO CAUSE AN ASSERT
3419 } 3387 }
3420 3388
3421 TEST_F(SyncerTest, UnsyncedItemAndUpdate) { 3389 TEST_F(SyncerTest, UnsyncedItemAndUpdate) {
3422 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, 3390 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, foreign_cache_guid(),
3423 foreign_cache_guid(), "-1"); 3391 "-1");
3424 EXPECT_TRUE(SyncShareNudge()); 3392 EXPECT_TRUE(SyncShareNudge());
3425 mock_server_->set_conflict_all_commits(true); 3393 mock_server_->set_conflict_all_commits(true);
3426 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20, 3394 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20, foreign_cache_guid(),
3427 foreign_cache_guid(), "-2"); 3395 "-2");
3428 EXPECT_TRUE(SyncShareNudge()); // USED TO CAUSE AN ASSERT 3396 EXPECT_TRUE(SyncShareNudge()); // USED TO CAUSE AN ASSERT
3429 } 3397 }
3430 3398
3431 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) { 3399 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) {
3432 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10, 3400 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10, foreign_cache_guid(),
3433 foreign_cache_guid(), "-1"); 3401 "-1");
3434 EXPECT_TRUE(SyncShareNudge()); 3402 EXPECT_TRUE(SyncShareNudge());
3435 int64_t local_folder_handle; 3403 int64_t local_folder_handle;
3436 syncable::Id local_folder_id; 3404 syncable::Id local_folder_id;
3437 { 3405 {
3438 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3406 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3439 MutableEntry new_entry( 3407 MutableEntry new_entry(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(),
3440 &wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Bar.htm"); 3408 "Bar.htm");
3441 ASSERT_TRUE(new_entry.good()); 3409 ASSERT_TRUE(new_entry.good());
3442 local_folder_id = new_entry.GetId(); 3410 local_folder_id = new_entry.GetId();
3443 local_folder_handle = new_entry.GetMetahandle(); 3411 local_folder_handle = new_entry.GetMetahandle();
3444 new_entry.PutIsUnsynced(true); 3412 new_entry.PutIsUnsynced(true);
3445 new_entry.PutSpecifics(DefaultBookmarkSpecifics()); 3413 new_entry.PutSpecifics(DefaultBookmarkSpecifics());
3446 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3414 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3447 ASSERT_TRUE(old.good()); 3415 ASSERT_TRUE(old.good());
3448 WriteTestDataToEntry(&wtrans, &old); 3416 WriteTestDataToEntry(&wtrans, &old);
3449 } 3417 }
3450 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20, 3418 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20, foreign_cache_guid(),
3451 foreign_cache_guid(), "-1"); 3419 "-1");
3452 mock_server_->set_conflict_all_commits(true); 3420 mock_server_->set_conflict_all_commits(true);
3453 EXPECT_FALSE(SyncShareNudge()); 3421 EXPECT_FALSE(SyncShareNudge());
3454 { 3422 {
3455 // Update #20 should have been dropped in favor of the local version. 3423 // Update #20 should have been dropped in favor of the local version.
3456 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3424 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3457 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3425 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3458 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 3426 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
3459 ASSERT_TRUE(server.good()); 3427 ASSERT_TRUE(server.good());
3460 ASSERT_TRUE(local.good()); 3428 ASSERT_TRUE(local.good());
3461 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle()); 3429 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle());
3462 EXPECT_FALSE(server.GetIsUnappliedUpdate()); 3430 EXPECT_FALSE(server.GetIsUnappliedUpdate());
3463 EXPECT_FALSE(local.GetIsUnappliedUpdate()); 3431 EXPECT_FALSE(local.GetIsUnappliedUpdate());
3464 EXPECT_TRUE(server.GetIsUnsynced()); 3432 EXPECT_TRUE(server.GetIsUnsynced());
3465 EXPECT_TRUE(local.GetIsUnsynced()); 3433 EXPECT_TRUE(local.GetIsUnsynced());
3466 EXPECT_EQ("Foo.htm", server.GetNonUniqueName()); 3434 EXPECT_EQ("Foo.htm", server.GetNonUniqueName());
3467 EXPECT_EQ("Bar.htm", local.GetNonUniqueName()); 3435 EXPECT_EQ("Bar.htm", local.GetNonUniqueName());
3468 } 3436 }
3469 // Allow local changes to commit. 3437 // Allow local changes to commit.
3470 mock_server_->set_conflict_all_commits(false); 3438 mock_server_->set_conflict_all_commits(false);
3471 EXPECT_TRUE(SyncShareNudge()); 3439 EXPECT_TRUE(SyncShareNudge());
3472 3440
3473 // Now add a server change to make the two names equal. There should 3441 // Now add a server change to make the two names equal. There should
3474 // be no conflict with that, since names are not unique. 3442 // be no conflict with that, since names are not unique.
3475 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30, 3443 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30, foreign_cache_guid(),
3476 foreign_cache_guid(), "-1"); 3444 "-1");
3477 EXPECT_TRUE(SyncShareNudge()); 3445 EXPECT_TRUE(SyncShareNudge());
3478 { 3446 {
3479 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3447 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3480 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3448 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3481 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 3449 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
3482 ASSERT_TRUE(server.good()); 3450 ASSERT_TRUE(server.good());
3483 ASSERT_TRUE(local.good()); 3451 ASSERT_TRUE(local.good());
3484 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle()); 3452 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle());
3485 EXPECT_FALSE(server.GetIsUnappliedUpdate()); 3453 EXPECT_FALSE(server.GetIsUnappliedUpdate());
3486 EXPECT_FALSE(local.GetIsUnappliedUpdate()); 3454 EXPECT_FALSE(local.GetIsUnappliedUpdate());
3487 EXPECT_FALSE(server.GetIsUnsynced()); 3455 EXPECT_FALSE(server.GetIsUnsynced());
3488 EXPECT_FALSE(local.GetIsUnsynced()); 3456 EXPECT_FALSE(local.GetIsUnsynced());
3489 EXPECT_EQ("Bar.htm", server.GetNonUniqueName()); 3457 EXPECT_EQ("Bar.htm", server.GetNonUniqueName());
3490 EXPECT_EQ("Bar.htm", local.GetNonUniqueName()); 3458 EXPECT_EQ("Bar.htm", local.GetNonUniqueName());
3491 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. 3459 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark.
3492 server.GetSpecifics().bookmark().url()); 3460 server.GetSpecifics().bookmark().url());
3493 } 3461 }
3494 } 3462 }
3495 3463
3496 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol. 3464 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol.
3497 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) { 3465 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) {
3498 mock_server_->set_use_legacy_bookmarks_protocol(true); 3466 mock_server_->set_use_legacy_bookmarks_protocol(true);
3499 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10, 3467 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10, foreign_cache_guid(),
3500 foreign_cache_guid(), "-1"); 3468 "-1");
3501 EXPECT_TRUE(SyncShareNudge()); 3469 EXPECT_TRUE(SyncShareNudge());
3502 int64_t local_folder_handle; 3470 int64_t local_folder_handle;
3503 syncable::Id local_folder_id; 3471 syncable::Id local_folder_id;
3504 { 3472 {
3505 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3473 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3506 MutableEntry new_entry( 3474 MutableEntry new_entry(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(),
3507 &wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "Bar.htm"); 3475 "Bar.htm");
3508 ASSERT_TRUE(new_entry.good()); 3476 ASSERT_TRUE(new_entry.good());
3509 local_folder_id = new_entry.GetId(); 3477 local_folder_id = new_entry.GetId();
3510 local_folder_handle = new_entry.GetMetahandle(); 3478 local_folder_handle = new_entry.GetMetahandle();
3511 new_entry.PutIsUnsynced(true); 3479 new_entry.PutIsUnsynced(true);
3512 new_entry.PutSpecifics(DefaultBookmarkSpecifics()); 3480 new_entry.PutSpecifics(DefaultBookmarkSpecifics());
3513 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3481 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3514 ASSERT_TRUE(old.good()); 3482 ASSERT_TRUE(old.good());
3515 WriteTestDataToEntry(&wtrans, &old); 3483 WriteTestDataToEntry(&wtrans, &old);
3516 } 3484 }
3517 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20, 3485 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20, foreign_cache_guid(),
3518 foreign_cache_guid(), "-1"); 3486 "-1");
3519 mock_server_->set_conflict_all_commits(true); 3487 mock_server_->set_conflict_all_commits(true);
3520 EXPECT_FALSE(SyncShareNudge()); 3488 EXPECT_FALSE(SyncShareNudge());
3521 { 3489 {
3522 // Update #20 should have been dropped in favor of the local version. 3490 // Update #20 should have been dropped in favor of the local version.
3523 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3491 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3524 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3492 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3525 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 3493 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
3526 ASSERT_TRUE(server.good()); 3494 ASSERT_TRUE(server.good());
3527 ASSERT_TRUE(local.good()); 3495 ASSERT_TRUE(local.good());
3528 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle()); 3496 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle());
3529 EXPECT_FALSE(server.GetIsUnappliedUpdate()); 3497 EXPECT_FALSE(server.GetIsUnappliedUpdate());
3530 EXPECT_FALSE(local.GetIsUnappliedUpdate()); 3498 EXPECT_FALSE(local.GetIsUnappliedUpdate());
3531 EXPECT_TRUE(server.GetIsUnsynced()); 3499 EXPECT_TRUE(server.GetIsUnsynced());
3532 EXPECT_TRUE(local.GetIsUnsynced()); 3500 EXPECT_TRUE(local.GetIsUnsynced());
3533 EXPECT_EQ("Foo.htm", server.GetNonUniqueName()); 3501 EXPECT_EQ("Foo.htm", server.GetNonUniqueName());
3534 EXPECT_EQ("Bar.htm", local.GetNonUniqueName()); 3502 EXPECT_EQ("Bar.htm", local.GetNonUniqueName());
3535 } 3503 }
3536 // Allow local changes to commit. 3504 // Allow local changes to commit.
3537 mock_server_->set_conflict_all_commits(false); 3505 mock_server_->set_conflict_all_commits(false);
3538 EXPECT_TRUE(SyncShareNudge()); 3506 EXPECT_TRUE(SyncShareNudge());
3539 3507
3540 // Now add a server change to make the two names equal. There should 3508 // Now add a server change to make the two names equal. There should
3541 // be no conflict with that, since names are not unique. 3509 // be no conflict with that, since names are not unique.
3542 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30, 3510 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30, foreign_cache_guid(),
3543 foreign_cache_guid(), "-1"); 3511 "-1");
3544 EXPECT_TRUE(SyncShareNudge()); 3512 EXPECT_TRUE(SyncShareNudge());
3545 { 3513 {
3546 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3514 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3547 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3515 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3548 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 3516 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
3549 ASSERT_TRUE(server.good()); 3517 ASSERT_TRUE(server.good());
3550 ASSERT_TRUE(local.good()); 3518 ASSERT_TRUE(local.good());
3551 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle()); 3519 EXPECT_NE(local.GetMetahandle(), server.GetMetahandle());
3552 EXPECT_FALSE(server.GetIsUnappliedUpdate()); 3520 EXPECT_FALSE(server.GetIsUnappliedUpdate());
3553 EXPECT_FALSE(local.GetIsUnappliedUpdate()); 3521 EXPECT_FALSE(local.GetIsUnappliedUpdate());
3554 EXPECT_FALSE(server.GetIsUnsynced()); 3522 EXPECT_FALSE(server.GetIsUnsynced());
3555 EXPECT_FALSE(local.GetIsUnsynced()); 3523 EXPECT_FALSE(local.GetIsUnsynced());
3556 EXPECT_EQ("Bar.htm", server.GetNonUniqueName()); 3524 EXPECT_EQ("Bar.htm", server.GetNonUniqueName());
3557 EXPECT_EQ("Bar.htm", local.GetNonUniqueName()); 3525 EXPECT_EQ("Bar.htm", local.GetNonUniqueName());
3558 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. 3526 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark.
3559 server.GetSpecifics().bookmark().url()); 3527 server.GetSpecifics().bookmark().url());
3560 } 3528 }
3561 } 3529 }
3562 3530
3563 // Circular links should be resolved by the server. 3531 // Circular links should be resolved by the server.
3564 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) { 3532 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) {
3565 // we don't currently resolve this. This test ensures we don't. 3533 // we don't currently resolve this. This test ensures we don't.
3566 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 3534 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
3567 foreign_cache_guid(), "-1"); 3535 "-1");
3568 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, 3536 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, foreign_cache_guid(),
3569 foreign_cache_guid(), "-2"); 3537 "-2");
3570 EXPECT_TRUE(SyncShareNudge()); 3538 EXPECT_TRUE(SyncShareNudge());
3571 { 3539 {
3572 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3540 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3573 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3541 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3574 ASSERT_TRUE(A.good()); 3542 ASSERT_TRUE(A.good());
3575 A.PutIsUnsynced(true); 3543 A.PutIsUnsynced(true);
3576 A.PutParentId(ids_.FromNumber(2)); 3544 A.PutParentId(ids_.FromNumber(2));
3577 A.PutNonUniqueName("B"); 3545 A.PutNonUniqueName("B");
3578 } 3546 }
3579 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20, 3547 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20, foreign_cache_guid(),
3580 foreign_cache_guid(), "-2"); 3548 "-2");
3581 mock_server_->set_conflict_all_commits(true); 3549 mock_server_->set_conflict_all_commits(true);
3582 EXPECT_FALSE(SyncShareNudge()); 3550 EXPECT_FALSE(SyncShareNudge());
3583 { 3551 {
3584 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3552 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3585 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3553 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3586 ASSERT_TRUE(A.good()); 3554 ASSERT_TRUE(A.good());
3587 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 3555 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
3588 ASSERT_TRUE(B.good()); 3556 ASSERT_TRUE(B.good());
3589 EXPECT_EQ("B", A.GetNonUniqueName()); 3557 EXPECT_EQ("B", A.GetNonUniqueName());
3590 EXPECT_EQ("B", B.GetNonUniqueName()); 3558 EXPECT_EQ("B", B.GetNonUniqueName());
3591 } 3559 }
3592 } 3560 }
3593 3561
3594 TEST_F(SyncerTest, SwapEntryNames) { 3562 TEST_F(SyncerTest, SwapEntryNames) {
3595 // Simple transaction test. 3563 // Simple transaction test.
3596 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 3564 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
3597 foreign_cache_guid(), "-1"); 3565 "-1");
3598 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, 3566 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10, foreign_cache_guid(),
3599 foreign_cache_guid(), "-2"); 3567 "-2");
3600 mock_server_->set_conflict_all_commits(true); 3568 mock_server_->set_conflict_all_commits(true);
3601 EXPECT_TRUE(SyncShareNudge()); 3569 EXPECT_TRUE(SyncShareNudge());
3602 { 3570 {
3603 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3571 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3604 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 3572 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
3605 ASSERT_TRUE(A.good()); 3573 ASSERT_TRUE(A.good());
3606 A.PutIsUnsynced(true); 3574 A.PutIsUnsynced(true);
3607 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 3575 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
3608 ASSERT_TRUE(B.good()); 3576 ASSERT_TRUE(B.good());
3609 B.PutIsUnsynced(true); 3577 B.PutIsUnsynced(true);
3610 A.PutNonUniqueName("C"); 3578 A.PutNonUniqueName("C");
3611 B.PutNonUniqueName("A"); 3579 B.PutNonUniqueName("A");
3612 A.PutNonUniqueName("B"); 3580 A.PutNonUniqueName("B");
3613 } 3581 }
3614 EXPECT_FALSE(SyncShareNudge()); 3582 EXPECT_FALSE(SyncShareNudge());
3615 } 3583 }
3616 3584
3617 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) { 3585 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) {
3618 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, 3586 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, foreign_cache_guid(),
3619 foreign_cache_guid(), "-1"); 3587 "-1");
3620 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10, 3588 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10, foreign_cache_guid(),
3621 foreign_cache_guid(), "-2"); 3589 "-2");
3622 mock_server_->set_conflict_all_commits(true); 3590 mock_server_->set_conflict_all_commits(true);
3623 EXPECT_TRUE(SyncShareNudge()); 3591 EXPECT_TRUE(SyncShareNudge());
3624 { 3592 {
3625 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3593 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3626 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2)); 3594 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2));
3627 ASSERT_TRUE(B.good()); 3595 ASSERT_TRUE(B.good());
3628 WriteTestDataToEntry(&trans, &B); 3596 WriteTestDataToEntry(&trans, &B);
3629 B.PutIsDel(true); 3597 B.PutIsDel(true);
3630 } 3598 }
3631 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11, 3599 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11, foreign_cache_guid(),
3632 foreign_cache_guid(), "-2"); 3600 "-2");
3633 mock_server_->SetLastUpdateDeleted(); 3601 mock_server_->SetLastUpdateDeleted();
3634 EXPECT_TRUE(SyncShareNudge()); 3602 EXPECT_TRUE(SyncShareNudge());
3635 { 3603 {
3636 syncable::ReadTransaction trans(FROM_HERE, directory()); 3604 syncable::ReadTransaction trans(FROM_HERE, directory());
3637 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); 3605 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2));
3638 ASSERT_TRUE(B.good()); 3606 ASSERT_TRUE(B.good());
3639 EXPECT_FALSE(B.GetIsUnsynced()); 3607 EXPECT_FALSE(B.GetIsUnsynced());
3640 EXPECT_FALSE(B.GetIsUnappliedUpdate()); 3608 EXPECT_FALSE(B.GetIsUnappliedUpdate());
3641 } 3609 }
3642 } 3610 }
3643 3611
3644 // When we undelete an entity as a result of conflict resolution, we reuse the 3612 // When we undelete an entity as a result of conflict resolution, we reuse the
3645 // existing server id and preserve the old version, simply updating the server 3613 // existing server id and preserve the old version, simply updating the server
3646 // version with the new non-deleted entity. 3614 // version with the new non-deleted entity.
3647 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) { 3615 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) {
3648 int64_t bob_metahandle; 3616 int64_t bob_metahandle;
3649 3617
3650 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10, 3618 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10, foreign_cache_guid(),
3651 foreign_cache_guid(), "-1"); 3619 "-1");
3652 EXPECT_TRUE(SyncShareNudge()); 3620 EXPECT_TRUE(SyncShareNudge());
3653 { 3621 {
3654 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3622 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3655 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); 3623 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1));
3656 ASSERT_TRUE(bob.good()); 3624 ASSERT_TRUE(bob.good());
3657 bob_metahandle = bob.GetMetahandle(); 3625 bob_metahandle = bob.GetMetahandle();
3658 WriteTestDataToEntry(&trans, &bob); 3626 WriteTestDataToEntry(&trans, &bob);
3659 } 3627 }
3660 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10, 3628 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10, foreign_cache_guid(),
3661 foreign_cache_guid(), "-1"); 3629 "-1");
3662 mock_server_->SetLastUpdateDeleted(); 3630 mock_server_->SetLastUpdateDeleted();
3663 mock_server_->set_conflict_all_commits(true); 3631 mock_server_->set_conflict_all_commits(true);
3664 EXPECT_FALSE(SyncShareNudge()); 3632 EXPECT_FALSE(SyncShareNudge());
3665 EXPECT_FALSE(SyncShareNudge()); 3633 EXPECT_FALSE(SyncShareNudge());
3666 { 3634 {
3667 syncable::ReadTransaction trans(FROM_HERE, directory()); 3635 syncable::ReadTransaction trans(FROM_HERE, directory());
3668 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle); 3636 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle);
3669 ASSERT_TRUE(bob.good()); 3637 ASSERT_TRUE(bob.good());
3670 EXPECT_TRUE(bob.GetIsUnsynced()); 3638 EXPECT_TRUE(bob.GetIsUnsynced());
3671 EXPECT_TRUE(bob.GetId().ServerKnows()); 3639 EXPECT_TRUE(bob.GetId().ServerKnows());
(...skipping 25 matching lines...) Expand all
3697 mock_server_->set_next_new_id(10000); 3665 mock_server_->set_next_new_id(10000);
3698 EXPECT_EQ(1u, directory()->unsynced_entity_count()); 3666 EXPECT_EQ(1u, directory()->unsynced_entity_count());
3699 // we get back a bad id in here (should never happen). 3667 // we get back a bad id in here (should never happen).
3700 EXPECT_FALSE(SyncShareNudge()); 3668 EXPECT_FALSE(SyncShareNudge());
3701 EXPECT_EQ(1u, directory()->unsynced_entity_count()); 3669 EXPECT_EQ(1u, directory()->unsynced_entity_count());
3702 EXPECT_TRUE(SyncShareNudge()); // another bad id in here. 3670 EXPECT_TRUE(SyncShareNudge()); // another bad id in here.
3703 EXPECT_EQ(0u, directory()->unsynced_entity_count()); 3671 EXPECT_EQ(0u, directory()->unsynced_entity_count());
3704 } 3672 }
3705 3673
3706 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) { 3674 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) {
3707 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, 3675 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10, foreign_cache_guid(),
3708 foreign_cache_guid(), "-1"); 3676 "-1");
3709 EXPECT_TRUE(SyncShareNudge()); 3677 EXPECT_TRUE(SyncShareNudge());
3710 { 3678 {
3711 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3679 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3712 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); 3680 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1));
3713 ASSERT_TRUE(bob.good()); 3681 ASSERT_TRUE(bob.good());
3714 // This is valid, because the parent could have gone away a long time ago. 3682 // This is valid, because the parent could have gone away a long time ago.
3715 bob.PutParentId(ids_.FromNumber(54)); 3683 bob.PutParentId(ids_.FromNumber(54));
3716 bob.PutIsDel(true); 3684 bob.PutIsDel(true);
3717 bob.PutIsUnsynced(true); 3685 bob.PutIsUnsynced(true);
3718 } 3686 }
3719 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10, 3687 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10, foreign_cache_guid(),
3720 foreign_cache_guid(), "-2"); 3688 "-2");
3721 EXPECT_TRUE(SyncShareNudge()); 3689 EXPECT_TRUE(SyncShareNudge());
3722 EXPECT_TRUE(SyncShareNudge()); 3690 EXPECT_TRUE(SyncShareNudge());
3723 } 3691 }
3724 3692
3725 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) { 3693 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) {
3726 syncable::Id local_id; 3694 syncable::Id local_id;
3727 { 3695 {
3728 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3696 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3729 3697
3730 MutableEntry local_deleted( 3698 MutableEntry local_deleted(&trans, CREATE, BOOKMARKS, trans.root_id(),
3731 &trans, CREATE, BOOKMARKS, trans.root_id(), "name"); 3699 "name");
3732 local_id = local_deleted.GetId(); 3700 local_id = local_deleted.GetId();
3733 local_deleted.PutId(ids_.FromNumber(1)); 3701 local_deleted.PutId(ids_.FromNumber(1));
3734 local_deleted.PutBaseVersion(1); 3702 local_deleted.PutBaseVersion(1);
3735 local_deleted.PutIsDel(true); 3703 local_deleted.PutIsDel(true);
3736 local_deleted.PutIsDir(false); 3704 local_deleted.PutIsDir(false);
3737 local_deleted.PutIsUnsynced(true); 3705 local_deleted.PutIsUnsynced(true);
3738 local_deleted.PutSpecifics(DefaultBookmarkSpecifics()); 3706 local_deleted.PutSpecifics(DefaultBookmarkSpecifics());
3739 } 3707 }
3740 3708
3741 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10, 3709 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10,
3742 local_cache_guid(), 3710 local_cache_guid(), local_id.GetServerId());
3743 local_id.GetServerId());
3744 3711
3745 // We don't care about actually committing, just the resolution. 3712 // We don't care about actually committing, just the resolution.
3746 mock_server_->set_conflict_all_commits(true); 3713 mock_server_->set_conflict_all_commits(true);
3747 EXPECT_FALSE(SyncShareNudge()); 3714 EXPECT_FALSE(SyncShareNudge());
3748 3715
3749 { 3716 {
3750 syncable::ReadTransaction trans(FROM_HERE, directory()); 3717 syncable::ReadTransaction trans(FROM_HERE, directory());
3751 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); 3718 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1));
3752 EXPECT_EQ(10, local_deleted.GetBaseVersion()); 3719 EXPECT_EQ(10, local_deleted.GetBaseVersion());
3753 EXPECT_FALSE(local_deleted.GetIsUnappliedUpdate()); 3720 EXPECT_FALSE(local_deleted.GetIsUnappliedUpdate());
3754 EXPECT_TRUE(local_deleted.GetIsUnsynced()); 3721 EXPECT_TRUE(local_deleted.GetIsUnsynced());
3755 EXPECT_TRUE(local_deleted.GetIsDel()); 3722 EXPECT_TRUE(local_deleted.GetIsDel());
3756 EXPECT_FALSE(local_deleted.GetIsDir()); 3723 EXPECT_FALSE(local_deleted.GetIsDir());
3757 } 3724 }
3758 } 3725 }
3759 3726
3760 // This ensures that for extensions, we resolve the conflict of local updates 3727 // This ensures that for extensions, we resolve the conflict of local updates
3761 // and server deletes in favor of the server, to prevent extensions from 3728 // and server deletes in favor of the server, to prevent extensions from
3762 // being reinstalled after uninstall. 3729 // being reinstalled after uninstall.
3763 TEST_F(SyncerTest, ConflictResolverAcceptsServerDeleteForExtensions) { 3730 TEST_F(SyncerTest, ConflictResolverAcceptsServerDeleteForExtensions) {
3764 ASSERT_TRUE(context_->GetEnabledTypes().Has(EXTENSIONS)); 3731 ASSERT_TRUE(context_->GetEnabledTypes().Has(EXTENSIONS));
3765 3732
3766 // Create an extension entry. 3733 // Create an extension entry.
3767 int64_t metahandle; 3734 int64_t metahandle;
3768 { 3735 {
3769 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3736 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3770 MutableEntry extension( 3737 MutableEntry extension(&trans, CREATE, EXTENSIONS, trans.root_id(),
3771 &trans, CREATE, EXTENSIONS, trans.root_id(), "extension_name"); 3738 "extension_name");
3772 ASSERT_TRUE(extension.good()); 3739 ASSERT_TRUE(extension.good());
3773 sync_pb::EntitySpecifics specifics; 3740 sync_pb::EntitySpecifics specifics;
3774 AddDefaultFieldValue(EXTENSIONS, &specifics); 3741 AddDefaultFieldValue(EXTENSIONS, &specifics);
3775 extension.PutSpecifics(specifics); 3742 extension.PutSpecifics(specifics);
3776 EXPECT_FALSE(extension.GetIsUnappliedUpdate()); 3743 EXPECT_FALSE(extension.GetIsUnappliedUpdate());
3777 EXPECT_FALSE(extension.GetId().ServerKnows()); 3744 EXPECT_FALSE(extension.GetId().ServerKnows());
3778 metahandle = extension.GetMetahandle(); 3745 metahandle = extension.GetMetahandle();
3779 extension.PutIsUnsynced(true); 3746 extension.PutIsUnsynced(true);
3780 } 3747 }
3781 3748
3782 // Make sure the server has received the new item. 3749 // Make sure the server has received the new item.
3783 SyncShareNudge(); 3750 SyncShareNudge();
3784 syncable::Id id; 3751 syncable::Id id;
3785 { 3752 {
3786 syncable::ReadTransaction trans(FROM_HERE, directory()); 3753 syncable::ReadTransaction trans(FROM_HERE, directory());
3787 Entry entry(&trans, GET_BY_HANDLE, metahandle); 3754 Entry entry(&trans, GET_BY_HANDLE, metahandle);
3788 3755
3789 EXPECT_EQ(metahandle, entry.GetMetahandle()); 3756 EXPECT_EQ(metahandle, entry.GetMetahandle());
3790 EXPECT_FALSE(entry.GetIsDel()); 3757 EXPECT_FALSE(entry.GetIsDel());
3791 EXPECT_FALSE(entry.GetServerIsDel()); 3758 EXPECT_FALSE(entry.GetServerIsDel());
3792 EXPECT_GE(entry.GetBaseVersion(), 0); 3759 EXPECT_GE(entry.GetBaseVersion(), 0);
3793 EXPECT_EQ(entry.GetBaseVersion(), entry.GetServerVersion()); 3760 EXPECT_EQ(entry.GetBaseVersion(), entry.GetServerVersion());
3794 EXPECT_FALSE(entry.GetIsUnsynced()); 3761 EXPECT_FALSE(entry.GetIsUnsynced());
3795 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 3762 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
3796 id = entry.GetId(); 3763 id = entry.GetId();
3797 } 3764 }
3798 3765
3799
3800 // Simulate another client deleting the item. 3766 // Simulate another client deleting the item.
3801 { 3767 {
3802 syncable::ReadTransaction trans(FROM_HERE, directory()); 3768 syncable::ReadTransaction trans(FROM_HERE, directory());
3803 Entry entry(&trans, GET_BY_HANDLE, metahandle); 3769 Entry entry(&trans, GET_BY_HANDLE, metahandle);
3804 mock_server_->AddUpdateTombstone(id, EXTENSIONS); 3770 mock_server_->AddUpdateTombstone(id, EXTENSIONS);
3805 } 3771 }
3806 3772
3807 // Create a local update, which should cause a conflict with the delete that 3773 // Create a local update, which should cause a conflict with the delete that
3808 // we just pushed to the server. 3774 // we just pushed to the server.
3809 { 3775 {
(...skipping 23 matching lines...) Expand all
3833 } 3799 }
3834 } 3800 }
3835 3801
3836 // See what happens if the IS_DIR bit gets flipped. This can cause us 3802 // See what happens if the IS_DIR bit gets flipped. This can cause us
3837 // all kinds of disasters. 3803 // all kinds of disasters.
3838 TEST_F(SyncerTest, UpdateFlipsTheFolderBit) { 3804 TEST_F(SyncerTest, UpdateFlipsTheFolderBit) {
3839 // Local object: a deleted directory (container), revision 1, unsynced. 3805 // Local object: a deleted directory (container), revision 1, unsynced.
3840 { 3806 {
3841 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3807 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3842 3808
3843 MutableEntry local_deleted( 3809 MutableEntry local_deleted(&trans, CREATE, BOOKMARKS, trans.root_id(),
3844 &trans, CREATE, BOOKMARKS, trans.root_id(), "name"); 3810 "name");
3845 local_deleted.PutId(ids_.FromNumber(1)); 3811 local_deleted.PutId(ids_.FromNumber(1));
3846 local_deleted.PutBaseVersion(1); 3812 local_deleted.PutBaseVersion(1);
3847 local_deleted.PutIsDel(true); 3813 local_deleted.PutIsDel(true);
3848 local_deleted.PutIsDir(true); 3814 local_deleted.PutIsDir(true);
3849 local_deleted.PutIsUnsynced(true); 3815 local_deleted.PutIsUnsynced(true);
3850 local_deleted.PutSpecifics(DefaultBookmarkSpecifics()); 3816 local_deleted.PutSpecifics(DefaultBookmarkSpecifics());
3851 } 3817 }
3852 3818
3853 // Server update: entry-type object (not a container), revision 10. 3819 // Server update: entry-type object (not a container), revision 10.
3854 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10, 3820 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10,
(...skipping 15 matching lines...) Expand all
3870 EXPECT_TRUE(local_deleted.GetIsDel()); 3836 EXPECT_TRUE(local_deleted.GetIsDel());
3871 EXPECT_TRUE(local_deleted.GetIsDir()); 3837 EXPECT_TRUE(local_deleted.GetIsDir());
3872 } 3838 }
3873 } 3839 }
3874 3840
3875 // Bug Synopsis: 3841 // Bug Synopsis:
3876 // Merge conflict resolution will merge a new local entry with another entry 3842 // Merge conflict resolution will merge a new local entry with another entry
3877 // that needs updates, resulting in CHECK. 3843 // that needs updates, resulting in CHECK.
3878 TEST_F(SyncerTest, MergingExistingItems) { 3844 TEST_F(SyncerTest, MergingExistingItems) {
3879 mock_server_->set_conflict_all_commits(true); 3845 mock_server_->set_conflict_all_commits(true);
3880 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10, 3846 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10, local_cache_guid(),
3881 local_cache_guid(), "-1"); 3847 "-1");
3882 EXPECT_TRUE(SyncShareNudge()); 3848 EXPECT_TRUE(SyncShareNudge());
3883 { 3849 {
3884 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3850 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3885 MutableEntry entry( 3851 MutableEntry entry(&trans, CREATE, BOOKMARKS, trans.root_id(),
3886 &trans, CREATE, BOOKMARKS, trans.root_id(), "Copy of base"); 3852 "Copy of base");
3887 WriteTestDataToEntry(&trans, &entry); 3853 WriteTestDataToEntry(&trans, &entry);
3888 } 3854 }
3889 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, 3855 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50,
3890 local_cache_guid(), "-1"); 3856 local_cache_guid(), "-1");
3891 EXPECT_FALSE(SyncShareNudge()); 3857 EXPECT_FALSE(SyncShareNudge());
3892 } 3858 }
3893 3859
3894 // In this test a long changelog contains a child at the start of the changelog 3860 // In this test a long changelog contains a child at the start of the changelog
3895 // and a parent at the end. While these updates are in progress the client would 3861 // and a parent at the end. While these updates are in progress the client would
3896 // appear stuck. 3862 // appear stuck.
3897 TEST_F(SyncerTest, LongChangelistWithApplicationConflict) { 3863 TEST_F(SyncerTest, LongChangelistWithApplicationConflict) {
3898 const int depth = 400; 3864 const int depth = 400;
3899 syncable::Id folder_id = ids_.FromNumber(1); 3865 syncable::Id folder_id = ids_.FromNumber(1);
3900 3866
3901 // First we an item in a folder in the root. However the folder won't come 3867 // First we an item in a folder in the root. However the folder won't come
3902 // till much later. 3868 // till much later.
3903 syncable::Id stuck_entry_id = TestIdFactory::FromNumber(99999); 3869 syncable::Id stuck_entry_id = TestIdFactory::FromNumber(99999);
3904 mock_server_->AddUpdateDirectory(stuck_entry_id, 3870 mock_server_->AddUpdateDirectory(stuck_entry_id, folder_id, "stuck", 1, 1,
3905 folder_id, "stuck", 1, 1, 3871 foreign_cache_guid(), "-99999");
3906 foreign_cache_guid(), "-99999");
3907 mock_server_->SetChangesRemaining(depth - 1); 3872 mock_server_->SetChangesRemaining(depth - 1);
3908 EXPECT_TRUE(SyncShareNudge()); 3873 EXPECT_TRUE(SyncShareNudge());
3909 3874
3910 // Buffer up a very long series of downloads. 3875 // Buffer up a very long series of downloads.
3911 // We should never be stuck (conflict resolution shouldn't 3876 // We should never be stuck (conflict resolution shouldn't
3912 // kick in so long as we're making forward progress). 3877 // kick in so long as we're making forward progress).
3913 for (int i = 0; i < depth; i++) { 3878 for (int i = 0; i < depth; i++) {
3914 mock_server_->NextUpdateBatch(); 3879 mock_server_->NextUpdateBatch();
3915 mock_server_->SetNewTimestamp(i + 1); 3880 mock_server_->SetNewTimestamp(i + 1);
3916 mock_server_->SetChangesRemaining(depth - i); 3881 mock_server_->SetChangesRemaining(depth - i);
3917 } 3882 }
3918 3883
3919 EXPECT_TRUE(SyncShareNudge()); 3884 EXPECT_TRUE(SyncShareNudge());
3920 3885
3921 // Ensure our folder hasn't somehow applied. 3886 // Ensure our folder hasn't somehow applied.
3922 { 3887 {
3923 syncable::ReadTransaction trans(FROM_HERE, directory()); 3888 syncable::ReadTransaction trans(FROM_HERE, directory());
3924 Entry child(&trans, GET_BY_ID, stuck_entry_id); 3889 Entry child(&trans, GET_BY_ID, stuck_entry_id);
3925 EXPECT_TRUE(child.good()); 3890 EXPECT_TRUE(child.good());
3926 EXPECT_TRUE(child.GetIsUnappliedUpdate()); 3891 EXPECT_TRUE(child.GetIsUnappliedUpdate());
3927 EXPECT_TRUE(child.GetIsDel()); 3892 EXPECT_TRUE(child.GetIsDel());
3928 EXPECT_FALSE(child.GetIsUnsynced()); 3893 EXPECT_FALSE(child.GetIsUnsynced());
3929 } 3894 }
3930 3895
3931 // And finally the folder. 3896 // And finally the folder.
3932 mock_server_->AddUpdateDirectory(folder_id, 3897 mock_server_->AddUpdateDirectory(folder_id, TestIdFactory::root(), "folder",
3933 TestIdFactory::root(), "folder", 1, 1, 3898 1, 1, foreign_cache_guid(), "-1");
3934 foreign_cache_guid(), "-1");
3935 mock_server_->SetChangesRemaining(0); 3899 mock_server_->SetChangesRemaining(0);
3936 EXPECT_TRUE(SyncShareNudge()); 3900 EXPECT_TRUE(SyncShareNudge());
3937 EXPECT_TRUE(SyncShareNudge()); 3901 EXPECT_TRUE(SyncShareNudge());
3938 // Check that everything is as expected after the commit. 3902 // Check that everything is as expected after the commit.
3939 { 3903 {
3940 syncable::ReadTransaction trans(FROM_HERE, directory()); 3904 syncable::ReadTransaction trans(FROM_HERE, directory());
3941 Entry entry(&trans, GET_BY_ID, folder_id); 3905 Entry entry(&trans, GET_BY_ID, folder_id);
3942 ASSERT_TRUE(entry.good()); 3906 ASSERT_TRUE(entry.good());
3943 Entry child(&trans, GET_BY_ID, stuck_entry_id); 3907 Entry child(&trans, GET_BY_ID, stuck_entry_id);
3944 EXPECT_EQ(entry.GetId(), child.GetParentId()); 3908 EXPECT_EQ(entry.GetId(), child.GetParentId());
3945 EXPECT_EQ("stuck", child.GetNonUniqueName()); 3909 EXPECT_EQ("stuck", child.GetNonUniqueName());
3946 EXPECT_TRUE(child.good()); 3910 EXPECT_TRUE(child.good());
3947 } 3911 }
3948 } 3912 }
3949 3913
3950 TEST_F(SyncerTest, DontMergeTwoExistingItems) { 3914 TEST_F(SyncerTest, DontMergeTwoExistingItems) {
3951 mock_server_->set_conflict_all_commits(true); 3915 mock_server_->set_conflict_all_commits(true);
3952 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10, 3916 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10, foreign_cache_guid(),
3953 foreign_cache_guid(), "-1"); 3917 "-1");
3954 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10, 3918 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10, foreign_cache_guid(),
3955 foreign_cache_guid(), "-2"); 3919 "-2");
3956 EXPECT_TRUE(SyncShareNudge()); 3920 EXPECT_TRUE(SyncShareNudge());
3957 { 3921 {
3958 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3922 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3959 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3923 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3960 ASSERT_TRUE(entry.good()); 3924 ASSERT_TRUE(entry.good());
3961 entry.PutNonUniqueName("Copy of base"); 3925 entry.PutNonUniqueName("Copy of base");
3962 entry.PutIsUnsynced(true); 3926 entry.PutIsUnsynced(true);
3963 } 3927 }
3964 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, 3928 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50,
3965 foreign_cache_guid(), "-1"); 3929 foreign_cache_guid(), "-1");
3966 EXPECT_FALSE(SyncShareNudge()); 3930 EXPECT_FALSE(SyncShareNudge());
3967 { 3931 {
3968 syncable::ReadTransaction trans(FROM_HERE, directory()); 3932 syncable::ReadTransaction trans(FROM_HERE, directory());
3969 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); 3933 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1));
3970 EXPECT_FALSE(entry1.GetIsUnappliedUpdate()); 3934 EXPECT_FALSE(entry1.GetIsUnappliedUpdate());
3971 EXPECT_FALSE(entry1.GetIsUnsynced()); 3935 EXPECT_FALSE(entry1.GetIsUnsynced());
3972 EXPECT_FALSE(entry1.GetIsDel()); 3936 EXPECT_FALSE(entry1.GetIsDel());
3973 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); 3937 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2));
3974 EXPECT_FALSE(entry2.GetIsUnappliedUpdate()); 3938 EXPECT_FALSE(entry2.GetIsUnappliedUpdate());
3975 EXPECT_TRUE(entry2.GetIsUnsynced()); 3939 EXPECT_TRUE(entry2.GetIsUnsynced());
3976 EXPECT_FALSE(entry2.GetIsDel()); 3940 EXPECT_FALSE(entry2.GetIsDel());
3977 EXPECT_EQ(entry1.GetNonUniqueName(), entry2.GetNonUniqueName()); 3941 EXPECT_EQ(entry1.GetNonUniqueName(), entry2.GetNonUniqueName());
3978 } 3942 }
3979 } 3943 }
3980 3944
3981 TEST_F(SyncerTest, TestUndeleteUpdate) { 3945 TEST_F(SyncerTest, TestUndeleteUpdate) {
3982 mock_server_->set_conflict_all_commits(true); 3946 mock_server_->set_conflict_all_commits(true);
3983 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1, 3947 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1, foreign_cache_guid(),
3984 foreign_cache_guid(), "-1"); 3948 "-1");
3985 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2, 3949 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2, foreign_cache_guid(),
3986 foreign_cache_guid(), "-2"); 3950 "-2");
3987 EXPECT_TRUE(SyncShareNudge()); 3951 EXPECT_TRUE(SyncShareNudge());
3988 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3, 3952 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3, foreign_cache_guid(),
3989 foreign_cache_guid(), "-2"); 3953 "-2");
3990 mock_server_->SetLastUpdateDeleted(); 3954 mock_server_->SetLastUpdateDeleted();
3991 EXPECT_TRUE(SyncShareNudge()); 3955 EXPECT_TRUE(SyncShareNudge());
3992 3956
3993 int64_t metahandle; 3957 int64_t metahandle;
3994 { 3958 {
3995 syncable::ReadTransaction trans(FROM_HERE, directory()); 3959 syncable::ReadTransaction trans(FROM_HERE, directory());
3996 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3960 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3997 ASSERT_TRUE(entry.good()); 3961 ASSERT_TRUE(entry.good());
3998 EXPECT_TRUE(entry.GetIsDel()); 3962 EXPECT_TRUE(entry.GetIsDel());
3999 metahandle = entry.GetMetahandle(); 3963 metahandle = entry.GetMetahandle();
4000 } 3964 }
4001 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4, 3965 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4, foreign_cache_guid(),
4002 foreign_cache_guid(), "-1"); 3966 "-1");
4003 mock_server_->SetLastUpdateDeleted(); 3967 mock_server_->SetLastUpdateDeleted();
4004 EXPECT_TRUE(SyncShareNudge()); 3968 EXPECT_TRUE(SyncShareNudge());
4005 // This used to be rejected as it's an undeletion. Now, it results in moving 3969 // This used to be rejected as it's an undeletion. Now, it results in moving
4006 // the delete path aside. 3970 // the delete path aside.
4007 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5, 3971 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5, foreign_cache_guid(),
4008 foreign_cache_guid(), "-2"); 3972 "-2");
4009 EXPECT_TRUE(SyncShareNudge()); 3973 EXPECT_TRUE(SyncShareNudge());
4010 { 3974 {
4011 syncable::ReadTransaction trans(FROM_HERE, directory()); 3975 syncable::ReadTransaction trans(FROM_HERE, directory());
4012 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3976 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
4013 ASSERT_TRUE(entry.good()); 3977 ASSERT_TRUE(entry.good());
4014 EXPECT_TRUE(entry.GetIsDel()); 3978 EXPECT_TRUE(entry.GetIsDel());
4015 EXPECT_FALSE(entry.GetServerIsDel()); 3979 EXPECT_FALSE(entry.GetServerIsDel());
4016 EXPECT_TRUE(entry.GetIsUnappliedUpdate()); 3980 EXPECT_TRUE(entry.GetIsUnappliedUpdate());
4017 EXPECT_NE(metahandle, entry.GetMetahandle()); 3981 EXPECT_NE(metahandle, entry.GetMetahandle());
4018 } 3982 }
4019 } 3983 }
4020 3984
4021 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) { 3985 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) {
4022 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1, 3986 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1, foreign_cache_guid(),
4023 foreign_cache_guid(), "-1"); 3987 "-1");
4024 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2, 3988 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2, foreign_cache_guid(),
4025 foreign_cache_guid(), "-2"); 3989 "-2");
4026 EXPECT_TRUE(SyncShareNudge()); 3990 EXPECT_TRUE(SyncShareNudge());
4027 { 3991 {
4028 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3992 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
4029 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3993 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
4030 ASSERT_TRUE(entry.good()); 3994 ASSERT_TRUE(entry.good());
4031 entry.PutParentId(ids_.FromNumber(1)); 3995 entry.PutParentId(ids_.FromNumber(1));
4032 EXPECT_TRUE(entry.PutIsUnsynced(true)); 3996 EXPECT_TRUE(entry.PutIsUnsynced(true));
4033 } 3997 }
4034 EXPECT_TRUE(SyncShareNudge()); 3998 EXPECT_TRUE(SyncShareNudge());
4035 // We use the same sync ts as before so our times match up. 3999 // We use the same sync ts as before so our times match up.
4036 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2, 4000 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2, foreign_cache_guid(),
4037 foreign_cache_guid(), "-2"); 4001 "-2");
4038 EXPECT_TRUE(SyncShareNudge()); 4002 EXPECT_TRUE(SyncShareNudge());
4039 } 4003 }
4040 4004
4041 // Don't crash when this occurs. 4005 // Don't crash when this occurs.
4042 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) { 4006 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) {
4043 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10, 4007 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10, foreign_cache_guid(),
4044 foreign_cache_guid(), "-1"); 4008 "-1");
4045 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10, 4009 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10,
4046 foreign_cache_guid(), "-2"); 4010 foreign_cache_guid(), "-2");
4047 // Used to cause a CHECK 4011 // Used to cause a CHECK
4048 EXPECT_TRUE(SyncShareNudge()); 4012 EXPECT_TRUE(SyncShareNudge());
4049 { 4013 {
4050 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 4014 syncable::ReadTransaction rtrans(FROM_HERE, directory());
4051 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 4015 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
4052 ASSERT_TRUE(good_entry.good()); 4016 ASSERT_TRUE(good_entry.good());
4053 EXPECT_FALSE(good_entry.GetIsUnappliedUpdate()); 4017 EXPECT_FALSE(good_entry.GetIsUnappliedUpdate());
4054 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); 4018 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2));
4055 ASSERT_TRUE(bad_parent.good()); 4019 ASSERT_TRUE(bad_parent.good());
4056 EXPECT_TRUE(bad_parent.GetIsUnappliedUpdate()); 4020 EXPECT_TRUE(bad_parent.GetIsUnappliedUpdate());
4057 } 4021 }
4058 } 4022 }
4059 4023
4060 TEST_F(SyncerTest, DirectoryUpdateTest) { 4024 TEST_F(SyncerTest, DirectoryUpdateTest) {
4061 Id in_root_id = ids_.NewServerId(); 4025 Id in_root_id = ids_.NewServerId();
4062 Id in_in_root_id = ids_.NewServerId(); 4026 Id in_in_root_id = ids_.NewServerId();
4063 4027
4064 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(), 4028 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(),
4065 "in_root_name", 2, 2, 4029 "in_root_name", 2, 2, foreign_cache_guid(),
4066 foreign_cache_guid(), "-1"); 4030 "-1");
4067 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id, 4031 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id, "in_in_root_name",
4068 "in_in_root_name", 3, 3, 4032 3, 3, foreign_cache_guid(), "-2");
4069 foreign_cache_guid(), "-2");
4070 EXPECT_TRUE(SyncShareNudge()); 4033 EXPECT_TRUE(SyncShareNudge());
4071 { 4034 {
4072 syncable::ReadTransaction trans(FROM_HERE, directory()); 4035 syncable::ReadTransaction trans(FROM_HERE, directory());
4073 Entry in_root(&trans, GET_BY_ID, in_root_id); 4036 Entry in_root(&trans, GET_BY_ID, in_root_id);
4074 ASSERT_TRUE(in_root.good()); 4037 ASSERT_TRUE(in_root.good());
4075 EXPECT_EQ("in_root_name", in_root.GetNonUniqueName()); 4038 EXPECT_EQ("in_root_name", in_root.GetNonUniqueName());
4076 EXPECT_EQ(TestIdFactory::root(), in_root.GetParentId()); 4039 EXPECT_EQ(TestIdFactory::root(), in_root.GetParentId());
4077 4040
4078 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id); 4041 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id);
4079 ASSERT_TRUE(in_in_root.good()); 4042 ASSERT_TRUE(in_in_root.good());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4130 ClientCommand* command = new ClientCommand(); 4093 ClientCommand* command = new ClientCommand();
4131 command->set_set_sync_poll_interval(8); 4094 command->set_set_sync_poll_interval(8);
4132 command->set_set_sync_long_poll_interval(800); 4095 command->set_set_sync_long_poll_interval(800);
4133 command->set_sessions_commit_delay_seconds(3141); 4096 command->set_sessions_commit_delay_seconds(3141);
4134 sync_pb::CustomNudgeDelay* bookmark_delay = 4097 sync_pb::CustomNudgeDelay* bookmark_delay =
4135 command->add_custom_nudge_delays(); 4098 command->add_custom_nudge_delays();
4136 bookmark_delay->set_datatype_id( 4099 bookmark_delay->set_datatype_id(
4137 GetSpecificsFieldNumberFromModelType(BOOKMARKS)); 4100 GetSpecificsFieldNumberFromModelType(BOOKMARKS));
4138 bookmark_delay->set_delay_ms(950); 4101 bookmark_delay->set_delay_ms(950);
4139 command->set_client_invalidation_hint_buffer_size(11); 4102 command->set_client_invalidation_hint_buffer_size(11);
4140 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1, 4103 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1, foreign_cache_guid(),
4141 foreign_cache_guid(), "-1"); 4104 "-1");
4142 mock_server_->SetGUClientCommand(command); 4105 mock_server_->SetGUClientCommand(command);
4143 EXPECT_TRUE(SyncShareNudge()); 4106 EXPECT_TRUE(SyncShareNudge());
4144 4107
4145 EXPECT_EQ(TimeDelta::FromSeconds(8), last_short_poll_interval_received_); 4108 EXPECT_EQ(TimeDelta::FromSeconds(8), last_short_poll_interval_received_);
4146 EXPECT_EQ(TimeDelta::FromSeconds(800), last_long_poll_interval_received_); 4109 EXPECT_EQ(TimeDelta::FromSeconds(800), last_long_poll_interval_received_);
4147 EXPECT_EQ(TimeDelta::FromSeconds(3141), last_sessions_commit_delay_); 4110 EXPECT_EQ(TimeDelta::FromSeconds(3141), last_sessions_commit_delay_);
4148 EXPECT_EQ(TimeDelta::FromMilliseconds(950), last_bookmarks_commit_delay_); 4111 EXPECT_EQ(TimeDelta::FromMilliseconds(950), last_bookmarks_commit_delay_);
4149 EXPECT_EQ(11, last_client_invalidation_hint_buffer_size_); 4112 EXPECT_EQ(11, last_client_invalidation_hint_buffer_size_);
4150 4113
4151 command = new ClientCommand(); 4114 command = new ClientCommand();
4152 command->set_set_sync_poll_interval(180); 4115 command->set_set_sync_poll_interval(180);
4153 command->set_set_sync_long_poll_interval(190); 4116 command->set_set_sync_long_poll_interval(190);
4154 command->set_sessions_commit_delay_seconds(2718); 4117 command->set_sessions_commit_delay_seconds(2718);
4155 bookmark_delay = command->add_custom_nudge_delays(); 4118 bookmark_delay = command->add_custom_nudge_delays();
4156 bookmark_delay->set_datatype_id( 4119 bookmark_delay->set_datatype_id(
4157 GetSpecificsFieldNumberFromModelType(BOOKMARKS)); 4120 GetSpecificsFieldNumberFromModelType(BOOKMARKS));
4158 bookmark_delay->set_delay_ms(1050); 4121 bookmark_delay->set_delay_ms(1050);
4159 command->set_client_invalidation_hint_buffer_size(9); 4122 command->set_client_invalidation_hint_buffer_size(9);
4160 mock_server_->AddUpdateDirectory( 4123 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1, foreign_cache_guid(),
4161 1, 0, "in_root", 1, 1, foreign_cache_guid(), "-1"); 4124 "-1");
4162 mock_server_->SetGUClientCommand(command); 4125 mock_server_->SetGUClientCommand(command);
4163 EXPECT_TRUE(SyncShareNudge()); 4126 EXPECT_TRUE(SyncShareNudge());
4164 4127
4165 EXPECT_EQ(TimeDelta::FromSeconds(180), last_short_poll_interval_received_); 4128 EXPECT_EQ(TimeDelta::FromSeconds(180), last_short_poll_interval_received_);
4166 EXPECT_EQ(TimeDelta::FromSeconds(190), last_long_poll_interval_received_); 4129 EXPECT_EQ(TimeDelta::FromSeconds(190), last_long_poll_interval_received_);
4167 EXPECT_EQ(TimeDelta::FromSeconds(2718), last_sessions_commit_delay_); 4130 EXPECT_EQ(TimeDelta::FromSeconds(2718), last_sessions_commit_delay_);
4168 EXPECT_EQ(TimeDelta::FromMilliseconds(1050), last_bookmarks_commit_delay_); 4131 EXPECT_EQ(TimeDelta::FromMilliseconds(1050), last_bookmarks_commit_delay_);
4169 EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_); 4132 EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_);
4170 } 4133 }
4171 4134
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4210 EXPECT_EQ(TimeDelta::FromSeconds(2718), last_sessions_commit_delay_); 4173 EXPECT_EQ(TimeDelta::FromSeconds(2718), last_sessions_commit_delay_);
4211 EXPECT_EQ(TimeDelta::FromMilliseconds(1050), last_bookmarks_commit_delay_); 4174 EXPECT_EQ(TimeDelta::FromMilliseconds(1050), last_bookmarks_commit_delay_);
4212 EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_); 4175 EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_);
4213 } 4176 }
4214 4177
4215 TEST_F(SyncerTest, EnsureWeSendUpOldParent) { 4178 TEST_F(SyncerTest, EnsureWeSendUpOldParent) {
4216 syncable::Id folder_one_id = ids_.FromNumber(1); 4179 syncable::Id folder_one_id = ids_.FromNumber(1);
4217 syncable::Id folder_two_id = ids_.FromNumber(2); 4180 syncable::Id folder_two_id = ids_.FromNumber(2);
4218 4181
4219 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(), 4182 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(),
4220 "folder_one", 1, 1, foreign_cache_guid(), "-1"); 4183 "folder_one", 1, 1, foreign_cache_guid(),
4184 "-1");
4221 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(), 4185 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(),
4222 "folder_two", 1, 1, foreign_cache_guid(), "-2"); 4186 "folder_two", 1, 1, foreign_cache_guid(),
4187 "-2");
4223 EXPECT_TRUE(SyncShareNudge()); 4188 EXPECT_TRUE(SyncShareNudge());
4224 { 4189 {
4225 // A moved entry should send an "old parent." 4190 // A moved entry should send an "old parent."
4226 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 4191 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
4227 MutableEntry entry(&trans, GET_BY_ID, folder_one_id); 4192 MutableEntry entry(&trans, GET_BY_ID, folder_one_id);
4228 ASSERT_TRUE(entry.good()); 4193 ASSERT_TRUE(entry.good());
4229 entry.PutParentId(folder_two_id); 4194 entry.PutParentId(folder_two_id);
4230 entry.PutIsUnsynced(true); 4195 entry.PutIsUnsynced(true);
4231 // A new entry should send no "old parent." 4196 // A new entry should send no "old parent."
4232 MutableEntry create( 4197 MutableEntry create(&trans, CREATE, BOOKMARKS, trans.root_id(),
4233 &trans, CREATE, BOOKMARKS, trans.root_id(), "new_folder"); 4198 "new_folder");
4234 create.PutIsUnsynced(true); 4199 create.PutIsUnsynced(true);
4235 create.PutSpecifics(DefaultBookmarkSpecifics()); 4200 create.PutSpecifics(DefaultBookmarkSpecifics());
4236 } 4201 }
4237 EXPECT_TRUE(SyncShareNudge()); 4202 EXPECT_TRUE(SyncShareNudge());
4238 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit(); 4203 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit();
4239 ASSERT_EQ(2, commit.entries_size()); 4204 ASSERT_EQ(2, commit.entries_size());
4240 EXPECT_EQ("2", commit.entries(0).parent_id_string()); 4205 EXPECT_EQ("2", commit.entries(0).parent_id_string());
4241 EXPECT_EQ("0", commit.entries(0).old_parent_id()); 4206 EXPECT_EQ("0", commit.entries(0).old_parent_id());
4242 EXPECT_FALSE(commit.entries(1).has_old_parent_id()); 4207 EXPECT_FALSE(commit.entries(1).has_old_parent_id());
4243 } 4208 }
(...skipping 17 matching lines...) Expand all
4261 syncable::ReadTransaction rtrans(FROM_HERE, directory()); 4226 syncable::ReadTransaction rtrans(FROM_HERE, directory());
4262 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle); 4227 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle);
4263 ASSERT_TRUE(entry.good()); 4228 ASSERT_TRUE(entry.good());
4264 EXPECT_EQ(really_big_int, entry.GetBaseVersion()); 4229 EXPECT_EQ(really_big_int, entry.GetBaseVersion());
4265 } 4230 }
4266 4231
4267 TEST_F(SyncerTest, TestSimpleUndelete) { 4232 TEST_F(SyncerTest, TestSimpleUndelete) {
4268 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); 4233 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root();
4269 mock_server_->set_conflict_all_commits(true); 4234 mock_server_->set_conflict_all_commits(true);
4270 // Let there be an entry from the server. 4235 // Let there be an entry from the server.
4271 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10, 4236 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10, foreign_cache_guid(),
4272 foreign_cache_guid(), "-1"); 4237 "-1");
4273 EXPECT_TRUE(SyncShareNudge()); 4238 EXPECT_TRUE(SyncShareNudge());
4274 // Check it out and delete it. 4239 // Check it out and delete it.
4275 { 4240 {
4276 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 4241 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
4277 MutableEntry entry(&wtrans, GET_BY_ID, id); 4242 MutableEntry entry(&wtrans, GET_BY_ID, id);
4278 ASSERT_TRUE(entry.good()); 4243 ASSERT_TRUE(entry.good());
4279 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4244 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4280 EXPECT_FALSE(entry.GetIsUnsynced()); 4245 EXPECT_FALSE(entry.GetIsUnsynced());
4281 EXPECT_FALSE(entry.GetIsDel()); 4246 EXPECT_FALSE(entry.GetIsDel());
4282 // Delete it locally. 4247 // Delete it locally.
4283 entry.PutIsDel(true); 4248 entry.PutIsDel(true);
4284 } 4249 }
4285 EXPECT_TRUE(SyncShareNudge()); 4250 EXPECT_TRUE(SyncShareNudge());
4286 // Confirm we see IS_DEL and not SERVER_IS_DEL. 4251 // Confirm we see IS_DEL and not SERVER_IS_DEL.
4287 { 4252 {
4288 syncable::ReadTransaction trans(FROM_HERE, directory()); 4253 syncable::ReadTransaction trans(FROM_HERE, directory());
4289 Entry entry(&trans, GET_BY_ID, id); 4254 Entry entry(&trans, GET_BY_ID, id);
4290 ASSERT_TRUE(entry.good()); 4255 ASSERT_TRUE(entry.good());
4291 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4256 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4292 EXPECT_FALSE(entry.GetIsUnsynced()); 4257 EXPECT_FALSE(entry.GetIsUnsynced());
4293 EXPECT_TRUE(entry.GetIsDel()); 4258 EXPECT_TRUE(entry.GetIsDel());
4294 EXPECT_FALSE(entry.GetServerIsDel()); 4259 EXPECT_FALSE(entry.GetServerIsDel());
4295 } 4260 }
4296 EXPECT_TRUE(SyncShareNudge()); 4261 EXPECT_TRUE(SyncShareNudge());
4297 // Update from server confirming deletion. 4262 // Update from server confirming deletion.
4298 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11, 4263 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11, foreign_cache_guid(),
4299 foreign_cache_guid(), "-1"); 4264 "-1");
4300 mock_server_->SetLastUpdateDeleted(); 4265 mock_server_->SetLastUpdateDeleted();
4301 EXPECT_TRUE(SyncShareNudge()); 4266 EXPECT_TRUE(SyncShareNudge());
4302 // IS_DEL AND SERVER_IS_DEL now both true. 4267 // IS_DEL AND SERVER_IS_DEL now both true.
4303 { 4268 {
4304 syncable::ReadTransaction trans(FROM_HERE, directory()); 4269 syncable::ReadTransaction trans(FROM_HERE, directory());
4305 Entry entry(&trans, GET_BY_ID, id); 4270 Entry entry(&trans, GET_BY_ID, id);
4306 ASSERT_TRUE(entry.good()); 4271 ASSERT_TRUE(entry.good());
4307 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4272 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4308 EXPECT_FALSE(entry.GetIsUnsynced()); 4273 EXPECT_FALSE(entry.GetIsUnsynced());
4309 EXPECT_TRUE(entry.GetIsDel()); 4274 EXPECT_TRUE(entry.GetIsDel());
4310 EXPECT_TRUE(entry.GetServerIsDel()); 4275 EXPECT_TRUE(entry.GetServerIsDel());
4311 } 4276 }
4312 // Undelete from server. 4277 // Undelete from server.
4313 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12, 4278 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12, foreign_cache_guid(),
4314 foreign_cache_guid(), "-1"); 4279 "-1");
4315 EXPECT_TRUE(SyncShareNudge()); 4280 EXPECT_TRUE(SyncShareNudge());
4316 // IS_DEL and SERVER_IS_DEL now both false. 4281 // IS_DEL and SERVER_IS_DEL now both false.
4317 { 4282 {
4318 syncable::ReadTransaction trans(FROM_HERE, directory()); 4283 syncable::ReadTransaction trans(FROM_HERE, directory());
4319 Entry entry(&trans, GET_BY_ID, id); 4284 Entry entry(&trans, GET_BY_ID, id);
4320 ASSERT_TRUE(entry.good()); 4285 ASSERT_TRUE(entry.good());
4321 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4286 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4322 EXPECT_FALSE(entry.GetIsUnsynced()); 4287 EXPECT_FALSE(entry.GetIsUnsynced());
4323 EXPECT_FALSE(entry.GetIsDel()); 4288 EXPECT_FALSE(entry.GetIsDel());
4324 EXPECT_FALSE(entry.GetServerIsDel()); 4289 EXPECT_FALSE(entry.GetServerIsDel());
4325 } 4290 }
4326 } 4291 }
4327 4292
4328 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) { 4293 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) {
4329 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); 4294 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root();
4330 // Let there be a entry, from the server. 4295 // Let there be a entry, from the server.
4331 mock_server_->set_conflict_all_commits(true); 4296 mock_server_->set_conflict_all_commits(true);
4332 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10, 4297 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10, foreign_cache_guid(),
4333 foreign_cache_guid(), "-1"); 4298 "-1");
4334 EXPECT_TRUE(SyncShareNudge()); 4299 EXPECT_TRUE(SyncShareNudge());
4335 // Check it out and delete it. 4300 // Check it out and delete it.
4336 { 4301 {
4337 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 4302 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
4338 MutableEntry entry(&wtrans, GET_BY_ID, id); 4303 MutableEntry entry(&wtrans, GET_BY_ID, id);
4339 ASSERT_TRUE(entry.good()); 4304 ASSERT_TRUE(entry.good());
4340 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4305 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4341 EXPECT_FALSE(entry.GetIsUnsynced()); 4306 EXPECT_FALSE(entry.GetIsUnsynced());
4342 EXPECT_FALSE(entry.GetIsDel()); 4307 EXPECT_FALSE(entry.GetIsDel());
4343 // Delete it locally. 4308 // Delete it locally.
4344 entry.PutIsDel(true); 4309 entry.PutIsDel(true);
4345 } 4310 }
4346 EXPECT_TRUE(SyncShareNudge()); 4311 EXPECT_TRUE(SyncShareNudge());
4347 // Confirm we see IS_DEL and not SERVER_IS_DEL. 4312 // Confirm we see IS_DEL and not SERVER_IS_DEL.
4348 { 4313 {
4349 syncable::ReadTransaction trans(FROM_HERE, directory()); 4314 syncable::ReadTransaction trans(FROM_HERE, directory());
4350 Entry entry(&trans, GET_BY_ID, id); 4315 Entry entry(&trans, GET_BY_ID, id);
4351 ASSERT_TRUE(entry.good()); 4316 ASSERT_TRUE(entry.good());
4352 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4317 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4353 EXPECT_FALSE(entry.GetIsUnsynced()); 4318 EXPECT_FALSE(entry.GetIsUnsynced());
4354 EXPECT_TRUE(entry.GetIsDel()); 4319 EXPECT_TRUE(entry.GetIsDel());
4355 EXPECT_FALSE(entry.GetServerIsDel()); 4320 EXPECT_FALSE(entry.GetServerIsDel());
4356 } 4321 }
4357 EXPECT_TRUE(SyncShareNudge()); 4322 EXPECT_TRUE(SyncShareNudge());
4358 // Say we do not get an update from server confirming deletion. Undelete 4323 // Say we do not get an update from server confirming deletion. Undelete
4359 // from server 4324 // from server
4360 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12, 4325 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12, foreign_cache_guid(),
4361 foreign_cache_guid(), "-1"); 4326 "-1");
4362 EXPECT_TRUE(SyncShareNudge()); 4327 EXPECT_TRUE(SyncShareNudge());
4363 // IS_DEL and SERVER_IS_DEL now both false. 4328 // IS_DEL and SERVER_IS_DEL now both false.
4364 { 4329 {
4365 syncable::ReadTransaction trans(FROM_HERE, directory()); 4330 syncable::ReadTransaction trans(FROM_HERE, directory());
4366 Entry entry(&trans, GET_BY_ID, id); 4331 Entry entry(&trans, GET_BY_ID, id);
4367 ASSERT_TRUE(entry.good()); 4332 ASSERT_TRUE(entry.good());
4368 EXPECT_FALSE(entry.GetIsUnappliedUpdate()); 4333 EXPECT_FALSE(entry.GetIsUnappliedUpdate());
4369 EXPECT_FALSE(entry.GetIsUnsynced()); 4334 EXPECT_FALSE(entry.GetIsUnsynced());
4370 EXPECT_FALSE(entry.GetIsDel()); 4335 EXPECT_FALSE(entry.GetIsDel());
4371 EXPECT_FALSE(entry.GetServerIsDel()); 4336 EXPECT_FALSE(entry.GetServerIsDel());
4372 } 4337 }
4373 } 4338 }
4374 4339
4375 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) { 4340 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) {
4376 Id id1 = ids_.MakeServer("first"), id2 = ids_.MakeServer("second"); 4341 Id id1 = ids_.MakeServer("first"), id2 = ids_.MakeServer("second");
4377 Id root = TestIdFactory::root(); 4342 Id root = TestIdFactory::root();
4378 // Duplicate! expect path clashing! 4343 // Duplicate! expect path clashing!
4379 mock_server_->set_conflict_all_commits(true); 4344 mock_server_->set_conflict_all_commits(true);
4380 mock_server_->AddUpdateBookmark(id1, root, "foo", 1, 10, 4345 mock_server_->AddUpdateBookmark(id1, root, "foo", 1, 10, foreign_cache_guid(),
4381 foreign_cache_guid(), "-1"); 4346 "-1");
4382 mock_server_->AddUpdateBookmark(id2, root, "foo", 1, 10, 4347 mock_server_->AddUpdateBookmark(id2, root, "foo", 1, 10, foreign_cache_guid(),
4383 foreign_cache_guid(), "-2"); 4348 "-2");
4384 EXPECT_TRUE(SyncShareNudge()); 4349 EXPECT_TRUE(SyncShareNudge());
4385 mock_server_->AddUpdateBookmark(id2, root, "foo2", 2, 20, 4350 mock_server_->AddUpdateBookmark(id2, root, "foo2", 2, 20,
4386 foreign_cache_guid(), "-2"); 4351 foreign_cache_guid(), "-2");
4387 EXPECT_TRUE(SyncShareNudge()); // Now just don't explode. 4352 EXPECT_TRUE(SyncShareNudge()); // Now just don't explode.
4388 } 4353 }
4389 4354
4390 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) { 4355 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) {
4391 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10, 4356 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10,
4392 foreign_cache_guid(), "-1"); 4357 foreign_cache_guid(), "-1");
4393 mock_server_->SetLastUpdateClientTag("permfolder"); 4358 mock_server_->SetLastUpdateClientTag("permfolder");
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4461 EXPECT_FALSE(perm_folder.GetIsUnsynced()); 4426 EXPECT_FALSE(perm_folder.GetIsUnsynced());
4462 EXPECT_EQ("permitem1", perm_folder.GetNonUniqueName()); 4427 EXPECT_EQ("permitem1", perm_folder.GetNonUniqueName());
4463 } 4428 }
4464 } 4429 }
4465 4430
4466 TEST_F(SyncerTest, ClientTagUncommittedTagMatchesUpdate) { 4431 TEST_F(SyncerTest, ClientTagUncommittedTagMatchesUpdate) {
4467 int64_t original_metahandle = 0; 4432 int64_t original_metahandle = 0;
4468 4433
4469 { 4434 {
4470 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 4435 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
4471 MutableEntry pref( 4436 MutableEntry pref(&trans, CREATE, PREFERENCES, ids_.root(), "name");
4472 &trans, CREATE, PREFERENCES, ids_.root(), "name");
4473 ASSERT_TRUE(pref.good()); 4437 ASSERT_TRUE(pref.good());
4474 pref.PutUniqueClientTag("tag"); 4438 pref.PutUniqueClientTag("tag");
4475 pref.PutIsUnsynced(true); 4439 pref.PutIsUnsynced(true);
4476 EXPECT_FALSE(pref.GetIsUnappliedUpdate()); 4440 EXPECT_FALSE(pref.GetIsUnappliedUpdate());
4477 EXPECT_FALSE(pref.GetId().ServerKnows()); 4441 EXPECT_FALSE(pref.GetId().ServerKnows());
4478 original_metahandle = pref.GetMetahandle(); 4442 original_metahandle = pref.GetMetahandle();
4479 } 4443 }
4480 4444
4481 syncable::Id server_id = TestIdFactory::MakeServer("id"); 4445 syncable::Id server_id = TestIdFactory::MakeServer("id");
4482 mock_server_->AddUpdatePref(server_id.GetServerId(), 4446 mock_server_->AddUpdatePref(server_id.GetServerId(),
4483 ids_.root().GetServerId(), 4447 ids_.root().GetServerId(), "tag", 10, 100);
4484 "tag", 10, 100);
4485 mock_server_->set_conflict_all_commits(true); 4448 mock_server_->set_conflict_all_commits(true);
4486 4449
4487 EXPECT_FALSE(SyncShareNudge()); 4450 EXPECT_FALSE(SyncShareNudge());
4488 // This should cause client tag reunion, preserving the metahandle. 4451 // This should cause client tag reunion, preserving the metahandle.
4489 { 4452 {
4490 syncable::ReadTransaction trans(FROM_HERE, directory()); 4453 syncable::ReadTransaction trans(FROM_HERE, directory());
4491 4454
4492 Entry pref(&trans, GET_BY_CLIENT_TAG, "tag"); 4455 Entry pref(&trans, GET_BY_CLIENT_TAG, "tag");
4493 ASSERT_TRUE(pref.good()); 4456 ASSERT_TRUE(pref.good());
4494 EXPECT_FALSE(pref.GetIsDel()); 4457 EXPECT_FALSE(pref.GetIsDel());
(...skipping 25 matching lines...) Expand all
4520 EXPECT_EQ(original_metahandle, pref.GetMetahandle()); 4483 EXPECT_EQ(original_metahandle, pref.GetMetahandle());
4521 EXPECT_EQ("tag", pref.GetUniqueClientTag()); 4484 EXPECT_EQ("tag", pref.GetUniqueClientTag());
4522 EXPECT_TRUE(pref.GetId().ServerKnows()); 4485 EXPECT_TRUE(pref.GetId().ServerKnows());
4523 } 4486 }
4524 } 4487 }
4525 4488
4526 TEST_F(SyncerTest, ClientTagConflictWithDeletedLocalEntry) { 4489 TEST_F(SyncerTest, ClientTagConflictWithDeletedLocalEntry) {
4527 { 4490 {
4528 // Create a deleted local entry with a unique client tag. 4491 // Create a deleted local entry with a unique client tag.
4529 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 4492 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
4530 MutableEntry pref( 4493 MutableEntry pref(&trans, CREATE, PREFERENCES, ids_.root(), "name");
4531 &trans, CREATE, PREFERENCES, ids_.root(), "name");
4532 ASSERT_TRUE(pref.good()); 4494 ASSERT_TRUE(pref.good());
4533 ASSERT_FALSE(pref.GetId().ServerKnows()); 4495 ASSERT_FALSE(pref.GetId().ServerKnows());
4534 pref.PutUniqueClientTag("tag"); 4496 pref.PutUniqueClientTag("tag");
4535 pref.PutIsUnsynced(true); 4497 pref.PutIsUnsynced(true);
4536 4498
4537 // Note: IS_DEL && !ServerKnows() will clear the UNSYNCED bit. 4499 // Note: IS_DEL && !ServerKnows() will clear the UNSYNCED bit.
4538 // (We never attempt to commit server-unknown deleted items, so this 4500 // (We never attempt to commit server-unknown deleted items, so this
4539 // helps us clean up those entries). 4501 // helps us clean up those entries).
4540 pref.PutIsDel(true); 4502 pref.PutIsDel(true);
4541 } 4503 }
4542 4504
4543 // Prepare an update with the same unique client tag. 4505 // Prepare an update with the same unique client tag.
4544 syncable::Id server_id = TestIdFactory::MakeServer("id"); 4506 syncable::Id server_id = TestIdFactory::MakeServer("id");
4545 mock_server_->AddUpdatePref(server_id.GetServerId(), 4507 mock_server_->AddUpdatePref(server_id.GetServerId(),
4546 ids_.root().GetServerId(), 4508 ids_.root().GetServerId(), "tag", 10, 100);
4547 "tag", 10, 100);
4548 4509
4549 EXPECT_TRUE(SyncShareNudge()); 4510 EXPECT_TRUE(SyncShareNudge());
4550 // The local entry will be overwritten. 4511 // The local entry will be overwritten.
4551 { 4512 {
4552 syncable::ReadTransaction trans(FROM_HERE, directory()); 4513 syncable::ReadTransaction trans(FROM_HERE, directory());
4553 4514
4554 Entry pref(&trans, GET_BY_CLIENT_TAG, "tag"); 4515 Entry pref(&trans, GET_BY_CLIENT_TAG, "tag");
4555 ASSERT_TRUE(pref.good()); 4516 ASSERT_TRUE(pref.good());
4556 ASSERT_TRUE(pref.GetId().ServerKnows()); 4517 ASSERT_TRUE(pref.GetId().ServerKnows());
4557 EXPECT_FALSE(pref.GetIsDel()); 4518 EXPECT_FALSE(pref.GetIsDel());
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
4819 ASSERT_EQ("bob", hurdle.GetNonUniqueName()); 4780 ASSERT_EQ("bob", hurdle.GetNonUniqueName());
4820 4781
4821 // Try to lookup by the tagname. These should fail. 4782 // Try to lookup by the tagname. These should fail.
4822 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); 4783 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha");
4823 EXPECT_FALSE(tag_alpha.good()); 4784 EXPECT_FALSE(tag_alpha.good());
4824 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); 4785 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob");
4825 EXPECT_FALSE(tag_bob.good()); 4786 EXPECT_FALSE(tag_bob.good());
4826 } 4787 }
4827 4788
4828 // Now download some tagged items as updates. 4789 // Now download some tagged items as updates.
4829 mock_server_->AddUpdateDirectory( 4790 mock_server_->AddUpdateDirectory(1, 0, "update1", 1, 10, std::string(),
4830 1, 0, "update1", 1, 10, std::string(), std::string()); 4791 std::string());
4831 mock_server_->SetLastUpdateServerTag("alpha"); 4792 mock_server_->SetLastUpdateServerTag("alpha");
4832 mock_server_->AddUpdateDirectory( 4793 mock_server_->AddUpdateDirectory(2, 0, "update2", 2, 20, std::string(),
4833 2, 0, "update2", 2, 20, std::string(), std::string()); 4794 std::string());
4834 mock_server_->SetLastUpdateServerTag("bob"); 4795 mock_server_->SetLastUpdateServerTag("bob");
4835 EXPECT_TRUE(SyncShareNudge()); 4796 EXPECT_TRUE(SyncShareNudge());
4836 4797
4837 { 4798 {
4838 syncable::ReadTransaction trans(FROM_HERE, directory()); 4799 syncable::ReadTransaction trans(FROM_HERE, directory());
4839 4800
4840 // The new items should be applied as new entries, and we should be able 4801 // The new items should be applied as new entries, and we should be able
4841 // to look them up by their tag values. 4802 // to look them up by their tag values.
4842 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); 4803 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha");
4843 ASSERT_TRUE(tag_alpha.good()); 4804 ASSERT_TRUE(tag_alpha.good());
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
5067 } 5028 }
5068 5029
5069 EXPECT_TRUE(directory()->InitialSyncEndedForType(PREFERENCES)); 5030 EXPECT_TRUE(directory()->InitialSyncEndedForType(PREFERENCES));
5070 } 5031 }
5071 5032
5072 // Tests specifically related to bookmark (and therefore no client tags) sync 5033 // Tests specifically related to bookmark (and therefore no client tags) sync
5073 // logic. Entities without client tags have custom logic in parts of the code, 5034 // logic. Entities without client tags have custom logic in parts of the code,
5074 // and hence are not covered by e.g. the Undeletion tests below. 5035 // and hence are not covered by e.g. the Undeletion tests below.
5075 class SyncerBookmarksTest : public SyncerTest { 5036 class SyncerBookmarksTest : public SyncerTest {
5076 public: 5037 public:
5077 SyncerBookmarksTest() : metahandle_(syncable::kInvalidMetaHandle) { 5038 SyncerBookmarksTest() : metahandle_(syncable::kInvalidMetaHandle) {}
5078 }
5079 5039
5080 void Create() { 5040 void Create() {
5081 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 5041 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
5082 MutableEntry bookmark( 5042 MutableEntry bookmark(&trans, CREATE, BOOKMARKS, ids_.root(), "clientname");
5083 &trans, CREATE, BOOKMARKS, ids_.root(), "clientname");
5084 ASSERT_TRUE(bookmark.good()); 5043 ASSERT_TRUE(bookmark.good());
5085 bookmark.PutSpecifics(DefaultBookmarkSpecifics()); 5044 bookmark.PutSpecifics(DefaultBookmarkSpecifics());
5086 EXPECT_FALSE(bookmark.GetIsUnappliedUpdate()); 5045 EXPECT_FALSE(bookmark.GetIsUnappliedUpdate());
5087 EXPECT_FALSE(bookmark.GetId().ServerKnows()); 5046 EXPECT_FALSE(bookmark.GetId().ServerKnows());
5088 metahandle_ = bookmark.GetMetahandle(); 5047 metahandle_ = bookmark.GetMetahandle();
5089 local_id_ = bookmark.GetId(); 5048 local_id_ = bookmark.GetId();
5090 bookmark.PutIsUnsynced(true); 5049 bookmark.PutIsUnsynced(true);
5091 } 5050 }
5092 5051
5093 void Update() { 5052 void Update() {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
5326 // C. Delete - undelete - commit - commitresponse. 5285 // C. Delete - undelete - commit - commitresponse.
5327 // D. Delete - undelete - commit - commitresponse - getupdates. 5286 // D. Delete - undelete - commit - commitresponse - getupdates.
5328 // Exercised by UndeleteAfterCommit: 5287 // Exercised by UndeleteAfterCommit:
5329 // E. Delete - commit - commitresponse - undelete - commit 5288 // E. Delete - commit - commitresponse - undelete - commit
5330 // - commitresponse. 5289 // - commitresponse.
5331 // F. Delete - commit - commitresponse - undelete - commit - 5290 // F. Delete - commit - commitresponse - undelete - commit -
5332 // - commitresponse - getupdates. 5291 // - commitresponse - getupdates.
5333 class SyncerUndeletionTest : public SyncerTest { 5292 class SyncerUndeletionTest : public SyncerTest {
5334 public: 5293 public:
5335 SyncerUndeletionTest() 5294 SyncerUndeletionTest()
5336 : client_tag_("foobar"), 5295 : client_tag_("foobar"), metahandle_(syncable::kInvalidMetaHandle) {}
5337 metahandle_(syncable::kInvalidMetaHandle) {
5338 }
5339 5296
5340 void Create() { 5297 void Create() {
5341 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 5298 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
5342 MutableEntry perm_folder( 5299 MutableEntry perm_folder(&trans, CREATE, PREFERENCES, ids_.root(),
5343 &trans, CREATE, PREFERENCES, ids_.root(), "clientname"); 5300 "clientname");
5344 ASSERT_TRUE(perm_folder.good()); 5301 ASSERT_TRUE(perm_folder.good());
5345 perm_folder.PutUniqueClientTag(client_tag_); 5302 perm_folder.PutUniqueClientTag(client_tag_);
5346 perm_folder.PutIsUnsynced(true); 5303 perm_folder.PutIsUnsynced(true);
5347 if (perm_folder.GetSyncing()) 5304 if (perm_folder.GetSyncing())
5348 perm_folder.PutDirtySync(true); 5305 perm_folder.PutDirtySync(true);
5349 perm_folder.PutSpecifics(DefaultPreferencesSpecifics()); 5306 perm_folder.PutSpecifics(DefaultPreferencesSpecifics());
5350 EXPECT_FALSE(perm_folder.GetIsUnappliedUpdate()); 5307 EXPECT_FALSE(perm_folder.GetIsUnappliedUpdate());
5351 EXPECT_FALSE(perm_folder.GetId().ServerKnows()); 5308 EXPECT_FALSE(perm_folder.GetId().ServerKnows());
5352 metahandle_ = perm_folder.GetMetahandle(); 5309 metahandle_ = perm_folder.GetMetahandle();
5353 local_id_ = perm_folder.GetId(); 5310 local_id_ = perm_folder.GetId();
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
5764 mock_server_->AddUpdateFromLastCommit(); 5721 mock_server_->AddUpdateFromLastCommit();
5765 EXPECT_TRUE(SyncShareNudge()); 5722 EXPECT_TRUE(SyncShareNudge());
5766 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 5723 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5767 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5724 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5768 ExpectSyncedAndDeleted(); 5725 ExpectSyncedAndDeleted();
5769 5726
5770 // Some other client undeletes the item. 5727 // Some other client undeletes the item.
5771 { 5728 {
5772 syncable::ReadTransaction trans(FROM_HERE, directory()); 5729 syncable::ReadTransaction trans(FROM_HERE, directory());
5773 Entry entry(&trans, GET_BY_HANDLE, metahandle_); 5730 Entry entry(&trans, GET_BY_HANDLE, metahandle_);
5774 mock_server_->AddUpdatePref( 5731 mock_server_->AddUpdatePref(entry.GetId().GetServerId(),
5775 entry.GetId().GetServerId(), 5732 entry.GetParentId().GetServerId(), client_tag_,
5776 entry.GetParentId().GetServerId(), 5733 100, 1000);
5777 client_tag_, 100, 1000);
5778 } 5734 }
5779 mock_server_->SetLastUpdateClientTag(client_tag_); 5735 mock_server_->SetLastUpdateClientTag(client_tag_);
5780 EXPECT_TRUE(SyncShareNudge()); 5736 EXPECT_TRUE(SyncShareNudge());
5781 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 5737 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5782 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5738 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5783 ExpectSyncedAndCreated(); 5739 ExpectSyncedAndCreated();
5784 } 5740 }
5785 5741
5786 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) { 5742 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) {
5787 Create(); 5743 Create();
(...skipping 25 matching lines...) Expand all
5813 // The update ought to have applied successfully. 5769 // The update ought to have applied successfully.
5814 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 5770 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5815 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5771 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5816 ExpectSyncedAndDeleted(); 5772 ExpectSyncedAndDeleted();
5817 5773
5818 // Some other client undeletes before we see the update from our 5774 // Some other client undeletes before we see the update from our
5819 // commit. 5775 // commit.
5820 { 5776 {
5821 syncable::ReadTransaction trans(FROM_HERE, directory()); 5777 syncable::ReadTransaction trans(FROM_HERE, directory());
5822 Entry entry(&trans, GET_BY_HANDLE, metahandle_); 5778 Entry entry(&trans, GET_BY_HANDLE, metahandle_);
5823 mock_server_->AddUpdatePref( 5779 mock_server_->AddUpdatePref(entry.GetId().GetServerId(),
5824 entry.GetId().GetServerId(), 5780 entry.GetParentId().GetServerId(), client_tag_,
5825 entry.GetParentId().GetServerId(), 5781 100, 1000);
5826 client_tag_, 100, 1000);
5827 } 5782 }
5828 mock_server_->SetLastUpdateClientTag(client_tag_); 5783 mock_server_->SetLastUpdateClientTag(client_tag_);
5829 EXPECT_TRUE(SyncShareNudge()); 5784 EXPECT_TRUE(SyncShareNudge());
5830 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 5785 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5831 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5786 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5832 ExpectSyncedAndCreated(); 5787 ExpectSyncedAndCreated();
5833 } 5788 }
5834 5789
5835 enum { 5790 enum {
5836 TEST_PARAM_BOOKMARK_ENABLE_BIT, 5791 TEST_PARAM_BOOKMARK_ENABLE_BIT,
5837 TEST_PARAM_AUTOFILL_ENABLE_BIT, 5792 TEST_PARAM_AUTOFILL_ENABLE_BIT,
5838 TEST_PARAM_BIT_COUNT 5793 TEST_PARAM_BIT_COUNT
5839 }; 5794 };
5840 5795
5841 class MixedResult : 5796 class MixedResult : public SyncerTest,
5842 public SyncerTest, 5797 public ::testing::WithParamInterface<int> {
5843 public ::testing::WithParamInterface<int> {
5844 protected: 5798 protected:
5845 bool ShouldFailBookmarkCommit() { 5799 bool ShouldFailBookmarkCommit() {
5846 return (GetParam() & (1 << TEST_PARAM_BOOKMARK_ENABLE_BIT)) == 0; 5800 return (GetParam() & (1 << TEST_PARAM_BOOKMARK_ENABLE_BIT)) == 0;
5847 } 5801 }
5848 bool ShouldFailAutofillCommit() { 5802 bool ShouldFailAutofillCommit() {
5849 return (GetParam() & (1 << TEST_PARAM_AUTOFILL_ENABLE_BIT)) == 0; 5803 return (GetParam() & (1 << TEST_PARAM_AUTOFILL_ENABLE_BIT)) == 0;
5850 } 5804 }
5851 }; 5805 };
5852 5806
5853 INSTANTIATE_TEST_CASE_P(ExtensionsActivity, 5807 INSTANTIATE_TEST_CASE_P(ExtensionsActivity,
5854 MixedResult, 5808 MixedResult,
5855 testing::Range(0, 1 << TEST_PARAM_BIT_COUNT)); 5809 testing::Range(0, 1 << TEST_PARAM_BIT_COUNT));
5856 5810
5857 TEST_P(MixedResult, ExtensionsActivity) { 5811 TEST_P(MixedResult, ExtensionsActivity) {
5858 { 5812 {
5859 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 5813 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
5860 5814
5861 MutableEntry pref(&wtrans, CREATE, PREFERENCES, wtrans.root_id(), "pref"); 5815 MutableEntry pref(&wtrans, CREATE, PREFERENCES, wtrans.root_id(), "pref");
5862 ASSERT_TRUE(pref.good()); 5816 ASSERT_TRUE(pref.good());
5863 pref.PutIsUnsynced(true); 5817 pref.PutIsUnsynced(true);
5864 5818
5865 MutableEntry bookmark( 5819 MutableEntry bookmark(&wtrans, CREATE, BOOKMARKS, wtrans.root_id(),
5866 &wtrans, CREATE, BOOKMARKS, wtrans.root_id(), "bookmark"); 5820 "bookmark");
5867 ASSERT_TRUE(bookmark.good()); 5821 ASSERT_TRUE(bookmark.good());
5868 bookmark.PutIsUnsynced(true); 5822 bookmark.PutIsUnsynced(true);
5869 5823
5870 if (ShouldFailBookmarkCommit()) { 5824 if (ShouldFailBookmarkCommit()) {
5871 mock_server_->SetTransientErrorId(bookmark.GetId()); 5825 mock_server_->SetTransientErrorId(bookmark.GetId());
5872 } 5826 }
5873 5827
5874 if (ShouldFailAutofillCommit()) { 5828 if (ShouldFailAutofillCommit()) {
5875 mock_server_->SetTransientErrorId(pref.GetId()); 5829 mock_server_->SetTransientErrorId(pref.GetId());
5876 } 5830 }
(...skipping 13 matching lines...) Expand all
5890 SyncShareNudge()); 5844 SyncShareNudge());
5891 5845
5892 ExtensionsActivity::Records final_monitor_records; 5846 ExtensionsActivity::Records final_monitor_records;
5893 context_->extensions_activity()->GetAndClearRecords(&final_monitor_records); 5847 context_->extensions_activity()->GetAndClearRecords(&final_monitor_records);
5894 if (ShouldFailBookmarkCommit()) { 5848 if (ShouldFailBookmarkCommit()) {
5895 ASSERT_EQ(2U, final_monitor_records.size()) 5849 ASSERT_EQ(2U, final_monitor_records.size())
5896 << "Should restore records after unsuccessful bookmark commit."; 5850 << "Should restore records after unsuccessful bookmark commit.";
5897 EXPECT_EQ("ABC", final_monitor_records["ABC"].extension_id); 5851 EXPECT_EQ("ABC", final_monitor_records["ABC"].extension_id);
5898 EXPECT_EQ("xyz", final_monitor_records["xyz"].extension_id); 5852 EXPECT_EQ("xyz", final_monitor_records["xyz"].extension_id);
5899 EXPECT_EQ(2049U, final_monitor_records["ABC"].bookmark_write_count); 5853 EXPECT_EQ(2049U, final_monitor_records["ABC"].bookmark_write_count);
5900 EXPECT_EQ(4U, final_monitor_records["xyz"].bookmark_write_count); 5854 EXPECT_EQ(4U, final_monitor_records["xyz"].bookmark_write_count);
5901 } else { 5855 } else {
5902 EXPECT_TRUE(final_monitor_records.empty()) 5856 EXPECT_TRUE(final_monitor_records.empty())
5903 << "Should not restore records after successful bookmark commit."; 5857 << "Should not restore records after successful bookmark commit.";
5904 } 5858 }
5905 } 5859 }
5906 5860
5907 } // namespace syncer 5861 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/engine_impl/syncer_types.h ('k') | components/sync/engine_impl/syncer_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698