| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|