OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 8 #include <algorithm> |
9 #include <limits> | 9 #include <limits> |
10 #include <list> | 10 #include <list> |
11 #include <map> | 11 #include <map> |
12 #include <set> | 12 #include <set> |
13 #include <string> | 13 #include <string> |
14 | 14 |
15 #include "base/callback.h" | 15 #include "base/callback.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/stringprintf.h" | 17 #include "base/stringprintf.h" |
18 #include "base/string_number_conversions.h" | 18 #include "base/string_number_conversions.h" |
| 19 #include "base/tracked.h" |
19 #include "build/build_config.h" | 20 #include "build/build_config.h" |
20 #include "chrome/browser/sync/engine/conflict_resolver.h" | 21 #include "chrome/browser/sync/engine/conflict_resolver.h" |
21 #include "chrome/browser/sync/engine/get_commit_ids_command.h" | 22 #include "chrome/browser/sync/engine/get_commit_ids_command.h" |
22 #include "chrome/browser/sync/engine/model_safe_worker.h" | 23 #include "chrome/browser/sync/engine/model_safe_worker.h" |
23 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 24 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
24 #include "chrome/browser/sync/engine/process_updates_command.h" | 25 #include "chrome/browser/sync/engine/process_updates_command.h" |
25 #include "chrome/browser/sync/engine/syncer.h" | 26 #include "chrome/browser/sync/engine/syncer.h" |
26 #include "chrome/browser/sync/engine/syncer_proto_util.h" | 27 #include "chrome/browser/sync/engine/syncer_proto_util.h" |
27 #include "chrome/browser/sync/engine/syncer_util.h" | 28 #include "chrome/browser/sync/engine/syncer_util.h" |
28 #include "chrome/browser/sync/engine/syncproto.h" | 29 #include "chrome/browser/sync/engine/syncproto.h" |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 listeners.push_back(this); | 190 listeners.push_back(this); |
190 context_.reset(new SyncSessionContext(mock_server_.get(), | 191 context_.reset(new SyncSessionContext(mock_server_.get(), |
191 syncdb_.manager(), this, listeners)); | 192 syncdb_.manager(), this, listeners)); |
192 context_->set_account_name(syncdb_.name()); | 193 context_->set_account_name(syncdb_.name()); |
193 ASSERT_FALSE(context_->resolver()); | 194 ASSERT_FALSE(context_->resolver()); |
194 syncer_ = new Syncer(); | 195 syncer_ = new Syncer(); |
195 session_.reset(MakeSession()); | 196 session_.reset(MakeSession()); |
196 | 197 |
197 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 198 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
198 CHECK(dir.good()); | 199 CHECK(dir.good()); |
199 ReadTransaction trans(dir, __FILE__, __LINE__); | 200 ReadTransaction trans(dir, FROM_HERE); |
200 syncable::Directory::ChildHandles children; | 201 syncable::Directory::ChildHandles children; |
201 dir->GetChildHandlesById(&trans, trans.root_id(), &children); | 202 dir->GetChildHandlesById(&trans, trans.root_id(), &children); |
202 ASSERT_TRUE(0 == children.size()); | 203 ASSERT_TRUE(0 == children.size()); |
203 saw_syncer_event_ = false; | 204 saw_syncer_event_ = false; |
204 root_id_ = TestIdFactory::root(); | 205 root_id_ = TestIdFactory::root(); |
205 parent_id_ = ids_.MakeServer("parent id"); | 206 parent_id_ = ids_.MakeServer("parent id"); |
206 child_id_ = ids_.MakeServer("child id"); | 207 child_id_ = ids_.MakeServer("child id"); |
207 } | 208 } |
208 | 209 |
209 virtual void TearDown() { | 210 virtual void TearDown() { |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 | 275 |
275 static const CommitOrderingTest LAST_COMMIT_ITEM; | 276 static const CommitOrderingTest LAST_COMMIT_ITEM; |
276 }; | 277 }; |
277 | 278 |
278 void RunCommitOrderingTest(CommitOrderingTest* test) { | 279 void RunCommitOrderingTest(CommitOrderingTest* test) { |
279 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 280 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
280 ASSERT_TRUE(dir.good()); | 281 ASSERT_TRUE(dir.good()); |
281 | 282 |
282 map<int, syncable::Id> expected_positions; | 283 map<int, syncable::Id> expected_positions; |
283 { // Transaction scope. | 284 { // Transaction scope. |
284 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 285 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
285 while (!test->id.IsRoot()) { | 286 while (!test->id.IsRoot()) { |
286 if (test->commit_index >= 0) { | 287 if (test->commit_index >= 0) { |
287 map<int, syncable::Id>::value_type entry(test->commit_index, | 288 map<int, syncable::Id>::value_type entry(test->commit_index, |
288 test->id); | 289 test->id); |
289 bool double_position = !expected_positions.insert(entry).second; | 290 bool double_position = !expected_positions.insert(entry).second; |
290 ASSERT_FALSE(double_position) << "Two id's expected at one position"; | 291 ASSERT_FALSE(double_position) << "Two id's expected at one position"; |
291 } | 292 } |
292 string utf8_name = test->id.GetServerId(); | 293 string utf8_name = test->id.GetServerId(); |
293 string name(utf8_name.begin(), utf8_name.end()); | 294 string name(utf8_name.begin(), utf8_name.end()); |
294 MutableEntry entry(&trans, CREATE, test->parent_id, name); | 295 MutableEntry entry(&trans, CREATE, test->parent_id, name); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 EXPECT_TRUE(expected_positions[i] == mock_server_->committed_ids()[i]); | 341 EXPECT_TRUE(expected_positions[i] == mock_server_->committed_ids()[i]); |
341 } | 342 } |
342 } | 343 } |
343 | 344 |
344 void DoTruncationTest(const ScopedDirLookup& dir, | 345 void DoTruncationTest(const ScopedDirLookup& dir, |
345 const vector<int64>& unsynced_handle_view, | 346 const vector<int64>& unsynced_handle_view, |
346 const vector<syncable::Id>& expected_id_order) { | 347 const vector<syncable::Id>& expected_id_order) { |
347 // The expected order is "x", "b", "c", "e", truncated appropriately. | 348 // The expected order is "x", "b", "c", "e", truncated appropriately. |
348 for (size_t limit = expected_id_order.size() + 2; limit > 0; --limit) { | 349 for (size_t limit = expected_id_order.size() + 2; limit > 0; --limit) { |
349 StatusController* status = session_->status_controller(); | 350 StatusController* status = session_->status_controller(); |
350 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 351 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
351 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); | 352 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); |
352 status->set_unsynced_handles(unsynced_handle_view); | 353 status->set_unsynced_handles(unsynced_handle_view); |
353 | 354 |
354 ModelSafeRoutingInfo routes; | 355 ModelSafeRoutingInfo routes; |
355 GetModelSafeRoutingInfo(&routes); | 356 GetModelSafeRoutingInfo(&routes); |
356 GetCommitIdsCommand command(limit); | 357 GetCommitIdsCommand command(limit); |
357 command.BuildCommitIds(session_->status_controller()->unsynced_handles(), | 358 command.BuildCommitIds(session_->status_controller()->unsynced_handles(), |
358 session_->write_transaction(), routes); | 359 session_->write_transaction(), routes); |
359 vector<syncable::Id> output = | 360 vector<syncable::Id> output = |
360 command.ordered_commit_set_->GetAllCommitIds(); | 361 command.ordered_commit_set_->GetAllCommitIds(); |
(...skipping 20 matching lines...) Expand all Loading... |
381 int64 CreateUnsyncedDirectory(const string& entry_name, | 382 int64 CreateUnsyncedDirectory(const string& entry_name, |
382 const string& idstring) { | 383 const string& idstring) { |
383 return CreateUnsyncedDirectory(entry_name, | 384 return CreateUnsyncedDirectory(entry_name, |
384 syncable::Id::CreateFromServerId(idstring)); | 385 syncable::Id::CreateFromServerId(idstring)); |
385 } | 386 } |
386 | 387 |
387 int64 CreateUnsyncedDirectory(const string& entry_name, | 388 int64 CreateUnsyncedDirectory(const string& entry_name, |
388 const syncable::Id& id) { | 389 const syncable::Id& id) { |
389 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 390 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
390 EXPECT_TRUE(dir.good()); | 391 EXPECT_TRUE(dir.good()); |
391 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 392 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
392 MutableEntry entry(&wtrans, syncable::CREATE, wtrans.root_id(), | 393 MutableEntry entry(&wtrans, syncable::CREATE, wtrans.root_id(), |
393 entry_name); | 394 entry_name); |
394 EXPECT_TRUE(entry.good()); | 395 EXPECT_TRUE(entry.good()); |
395 entry.Put(syncable::IS_UNSYNCED, true); | 396 entry.Put(syncable::IS_UNSYNCED, true); |
396 entry.Put(syncable::IS_DIR, true); | 397 entry.Put(syncable::IS_DIR, true); |
397 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 398 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
398 entry.Put(syncable::BASE_VERSION, id.ServerKnows() ? 1 : 0); | 399 entry.Put(syncable::BASE_VERSION, id.ServerKnows() ? 1 : 0); |
399 entry.Put(syncable::ID, id); | 400 entry.Put(syncable::ID, id); |
400 return entry.Get(META_HANDLE); | 401 return entry.Get(META_HANDLE); |
401 } | 402 } |
402 | 403 |
403 void EnableDatatype(syncable::ModelType model_type) { | 404 void EnableDatatype(syncable::ModelType model_type) { |
404 enabled_datatypes_[model_type] = true; | 405 enabled_datatypes_[model_type] = true; |
405 mock_server_->ExpectGetUpdatesRequestTypes(enabled_datatypes_); | 406 mock_server_->ExpectGetUpdatesRequestTypes(enabled_datatypes_); |
406 } | 407 } |
407 | 408 |
408 void DisableDatatype(syncable::ModelType model_type) { | 409 void DisableDatatype(syncable::ModelType model_type) { |
409 enabled_datatypes_[model_type] = false; | 410 enabled_datatypes_[model_type] = false; |
410 mock_server_->ExpectGetUpdatesRequestTypes(enabled_datatypes_); | 411 mock_server_->ExpectGetUpdatesRequestTypes(enabled_datatypes_); |
411 } | 412 } |
412 | 413 |
413 template<typename FieldType, typename ValueType> | 414 template<typename FieldType, typename ValueType> |
414 ValueType GetField(int64 metahandle, FieldType field, | 415 ValueType GetField(int64 metahandle, FieldType field, |
415 ValueType default_value) const { | 416 ValueType default_value) const { |
416 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 417 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
417 EXPECT_TRUE(dir.good()); | 418 EXPECT_TRUE(dir.good()); |
418 ReadTransaction trans(dir, __FILE__, __LINE__); | 419 ReadTransaction trans(dir, FROM_HERE); |
419 Entry entry(&trans, GET_BY_HANDLE, metahandle); | 420 Entry entry(&trans, GET_BY_HANDLE, metahandle); |
420 EXPECT_TRUE(entry.good()); | 421 EXPECT_TRUE(entry.good()); |
421 if (!entry.good()) { | 422 if (!entry.good()) { |
422 return default_value; | 423 return default_value; |
423 } | 424 } |
424 EXPECT_EQ(metahandle, entry.Get(META_HANDLE)); | 425 EXPECT_EQ(metahandle, entry.Get(META_HANDLE)); |
425 return entry.Get(field); | 426 return entry.Get(field); |
426 } | 427 } |
427 | 428 |
428 // Helper getters that work without a transaction, to reduce boilerplate. | 429 // Helper getters that work without a transaction, to reduce boilerplate. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 | 482 |
482 DISALLOW_COPY_AND_ASSIGN(SyncerTest); | 483 DISALLOW_COPY_AND_ASSIGN(SyncerTest); |
483 }; | 484 }; |
484 | 485 |
485 TEST_F(SyncerTest, TestCallGatherUnsyncedEntries) { | 486 TEST_F(SyncerTest, TestCallGatherUnsyncedEntries) { |
486 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 487 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
487 ASSERT_TRUE(dir.good()); | 488 ASSERT_TRUE(dir.good()); |
488 { | 489 { |
489 Syncer::UnsyncedMetaHandles handles; | 490 Syncer::UnsyncedMetaHandles handles; |
490 { | 491 { |
491 ReadTransaction trans(dir, __FILE__, __LINE__); | 492 ReadTransaction trans(dir, FROM_HERE); |
492 SyncerUtil::GetUnsyncedEntries(&trans, &handles); | 493 SyncerUtil::GetUnsyncedEntries(&trans, &handles); |
493 } | 494 } |
494 ASSERT_TRUE(0 == handles.size()); | 495 ASSERT_TRUE(0 == handles.size()); |
495 } | 496 } |
496 // TODO(sync): When we can dynamically connect and disconnect the mock | 497 // TODO(sync): When we can dynamically connect and disconnect the mock |
497 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a | 498 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a |
498 // regression for a very old bug. | 499 // regression for a very old bug. |
499 } | 500 } |
500 | 501 |
501 TEST_F(SyncerTest, GetCommitIdsCommandTruncates) { | 502 TEST_F(SyncerTest, GetCommitIdsCommandTruncates) { |
502 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 503 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
503 ASSERT_TRUE(dir.good()); | 504 ASSERT_TRUE(dir.good()); |
504 int64 handle_c = CreateUnsyncedDirectory("C", ids_.MakeLocal("c")); | 505 int64 handle_c = CreateUnsyncedDirectory("C", ids_.MakeLocal("c")); |
505 int64 handle_x = CreateUnsyncedDirectory("X", ids_.MakeLocal("x")); | 506 int64 handle_x = CreateUnsyncedDirectory("X", ids_.MakeLocal("x")); |
506 int64 handle_b = CreateUnsyncedDirectory("B", ids_.MakeLocal("b")); | 507 int64 handle_b = CreateUnsyncedDirectory("B", ids_.MakeLocal("b")); |
507 int64 handle_d = CreateUnsyncedDirectory("D", ids_.MakeLocal("d")); | 508 int64 handle_d = CreateUnsyncedDirectory("D", ids_.MakeLocal("d")); |
508 int64 handle_e = CreateUnsyncedDirectory("E", ids_.MakeLocal("e")); | 509 int64 handle_e = CreateUnsyncedDirectory("E", ids_.MakeLocal("e")); |
509 { | 510 { |
510 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 511 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
511 MutableEntry entry_x(&wtrans, GET_BY_HANDLE, handle_x); | 512 MutableEntry entry_x(&wtrans, GET_BY_HANDLE, handle_x); |
512 MutableEntry entry_b(&wtrans, GET_BY_HANDLE, handle_b); | 513 MutableEntry entry_b(&wtrans, GET_BY_HANDLE, handle_b); |
513 MutableEntry entry_c(&wtrans, GET_BY_HANDLE, handle_c); | 514 MutableEntry entry_c(&wtrans, GET_BY_HANDLE, handle_c); |
514 MutableEntry entry_d(&wtrans, GET_BY_HANDLE, handle_d); | 515 MutableEntry entry_d(&wtrans, GET_BY_HANDLE, handle_d); |
515 MutableEntry entry_e(&wtrans, GET_BY_HANDLE, handle_e); | 516 MutableEntry entry_e(&wtrans, GET_BY_HANDLE, handle_e); |
516 entry_x.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 517 entry_x.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
517 entry_b.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 518 entry_b.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
518 entry_c.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 519 entry_c.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
519 entry_d.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 520 entry_d.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
520 entry_e.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 521 entry_e.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
(...skipping 17 matching lines...) Expand all Loading... |
538 } | 539 } |
539 | 540 |
540 // TODO(chron): More corner case unit tests around validation. | 541 // TODO(chron): More corner case unit tests around validation. |
541 TEST_F(SyncerTest, TestCommitMetahandleIterator) { | 542 TEST_F(SyncerTest, TestCommitMetahandleIterator) { |
542 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 543 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
543 ASSERT_TRUE(dir.good()); | 544 ASSERT_TRUE(dir.good()); |
544 StatusController* status = session_->status_controller(); | 545 StatusController* status = session_->status_controller(); |
545 const vector<int64>& unsynced(status->unsynced_handles()); | 546 const vector<int64>& unsynced(status->unsynced_handles()); |
546 | 547 |
547 { | 548 { |
548 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 549 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
549 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); | 550 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); |
550 | 551 |
551 sessions::OrderedCommitSet commit_set(session_->routing_info()); | 552 sessions::OrderedCommitSet commit_set(session_->routing_info()); |
552 GetCommitIdsCommand::CommitMetahandleIterator iterator(unsynced, &wtrans, | 553 GetCommitIdsCommand::CommitMetahandleIterator iterator(unsynced, &wtrans, |
553 &commit_set); | 554 &commit_set); |
554 EXPECT_FALSE(iterator.Valid()); | 555 EXPECT_FALSE(iterator.Valid()); |
555 EXPECT_FALSE(iterator.Increment()); | 556 EXPECT_FALSE(iterator.Increment()); |
556 } | 557 } |
557 | 558 |
558 { | 559 { |
559 vector<int64> session_metahandles; | 560 vector<int64> session_metahandles; |
560 session_metahandles.push_back(CreateUnsyncedDirectory("test1", "testid1")); | 561 session_metahandles.push_back(CreateUnsyncedDirectory("test1", "testid1")); |
561 session_metahandles.push_back(CreateUnsyncedDirectory("test2", "testid2")); | 562 session_metahandles.push_back(CreateUnsyncedDirectory("test2", "testid2")); |
562 session_metahandles.push_back(CreateUnsyncedDirectory("test3", "testid3")); | 563 session_metahandles.push_back(CreateUnsyncedDirectory("test3", "testid3")); |
563 status->set_unsynced_handles(session_metahandles); | 564 status->set_unsynced_handles(session_metahandles); |
564 | 565 |
565 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 566 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
566 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); | 567 ScopedSetSessionWriteTransaction set_trans(session_.get(), &wtrans); |
567 sessions::OrderedCommitSet commit_set(session_->routing_info()); | 568 sessions::OrderedCommitSet commit_set(session_->routing_info()); |
568 GetCommitIdsCommand::CommitMetahandleIterator iterator(unsynced, &wtrans, | 569 GetCommitIdsCommand::CommitMetahandleIterator iterator(unsynced, &wtrans, |
569 &commit_set); | 570 &commit_set); |
570 | 571 |
571 EXPECT_TRUE(iterator.Valid()); | 572 EXPECT_TRUE(iterator.Valid()); |
572 EXPECT_TRUE(iterator.Current() == session_metahandles[0]); | 573 EXPECT_TRUE(iterator.Current() == session_metahandles[0]); |
573 EXPECT_TRUE(iterator.Increment()); | 574 EXPECT_TRUE(iterator.Increment()); |
574 | 575 |
575 EXPECT_TRUE(iterator.Valid()); | 576 EXPECT_TRUE(iterator.Valid()); |
576 EXPECT_TRUE(iterator.Current() == session_metahandles[1]); | 577 EXPECT_TRUE(iterator.Current() == session_metahandles[1]); |
577 EXPECT_TRUE(iterator.Increment()); | 578 EXPECT_TRUE(iterator.Increment()); |
578 | 579 |
579 EXPECT_TRUE(iterator.Valid()); | 580 EXPECT_TRUE(iterator.Valid()); |
580 EXPECT_TRUE(iterator.Current() == session_metahandles[2]); | 581 EXPECT_TRUE(iterator.Current() == session_metahandles[2]); |
581 EXPECT_FALSE(iterator.Increment()); | 582 EXPECT_FALSE(iterator.Increment()); |
582 | 583 |
583 EXPECT_FALSE(iterator.Valid()); | 584 EXPECT_FALSE(iterator.Valid()); |
584 } | 585 } |
585 } | 586 } |
586 | 587 |
587 TEST_F(SyncerTest, TestGetUnsyncedAndSimpleCommit) { | 588 TEST_F(SyncerTest, TestGetUnsyncedAndSimpleCommit) { |
588 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 589 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
589 ASSERT_TRUE(dir.good()); | 590 ASSERT_TRUE(dir.good()); |
590 { | 591 { |
591 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 592 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
592 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), | 593 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), |
593 "Pete"); | 594 "Pete"); |
594 ASSERT_TRUE(parent.good()); | 595 ASSERT_TRUE(parent.good()); |
595 parent.Put(syncable::IS_UNSYNCED, true); | 596 parent.Put(syncable::IS_UNSYNCED, true); |
596 parent.Put(syncable::IS_DIR, true); | 597 parent.Put(syncable::IS_DIR, true); |
597 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 598 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
598 parent.Put(syncable::BASE_VERSION, 1); | 599 parent.Put(syncable::BASE_VERSION, 1); |
599 parent.Put(syncable::ID, parent_id_); | 600 parent.Put(syncable::ID, parent_id_); |
600 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete"); | 601 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete"); |
601 ASSERT_TRUE(child.good()); | 602 ASSERT_TRUE(child.good()); |
602 child.Put(syncable::ID, child_id_); | 603 child.Put(syncable::ID, child_id_); |
603 child.Put(syncable::BASE_VERSION, 1); | 604 child.Put(syncable::BASE_VERSION, 1); |
604 WriteTestDataToEntry(&wtrans, &child); | 605 WriteTestDataToEntry(&wtrans, &child); |
605 } | 606 } |
606 | 607 |
607 StatusController* status = session_->status_controller(); | 608 StatusController* status = session_->status_controller(); |
608 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 609 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
609 EXPECT_TRUE(2 == status->unsynced_handles().size()); | 610 EXPECT_TRUE(2 == status->unsynced_handles().size()); |
610 ASSERT_TRUE(2 == mock_server_->committed_ids().size()); | 611 ASSERT_TRUE(2 == mock_server_->committed_ids().size()); |
611 // If this test starts failing, be aware other sort orders could be valid. | 612 // If this test starts failing, be aware other sort orders could be valid. |
612 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); | 613 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); |
613 EXPECT_TRUE(child_id_ == mock_server_->committed_ids()[1]); | 614 EXPECT_TRUE(child_id_ == mock_server_->committed_ids()[1]); |
614 { | 615 { |
615 ReadTransaction rt(dir, __FILE__, __LINE__); | 616 ReadTransaction rt(dir, FROM_HERE); |
616 Entry entry(&rt, syncable::GET_BY_ID, child_id_); | 617 Entry entry(&rt, syncable::GET_BY_ID, child_id_); |
617 ASSERT_TRUE(entry.good()); | 618 ASSERT_TRUE(entry.good()); |
618 VerifyTestDataInEntry(&rt, &entry); | 619 VerifyTestDataInEntry(&rt, &entry); |
619 } | 620 } |
620 } | 621 } |
621 | 622 |
622 TEST_F(SyncerTest, TestPurgeWhileUnsynced) { | 623 TEST_F(SyncerTest, TestPurgeWhileUnsynced) { |
623 // Similar to above, but throw a purge operation into the mix. Bug 49278. | 624 // Similar to above, but throw a purge operation into the mix. Bug 49278. |
624 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 625 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
625 ASSERT_TRUE(dir.good()); | 626 ASSERT_TRUE(dir.good()); |
626 syncable::Id pref_node_id = TestIdFactory::MakeServer("Tim"); | 627 syncable::Id pref_node_id = TestIdFactory::MakeServer("Tim"); |
627 { | 628 { |
628 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 629 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
629 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "Pete"); | 630 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "Pete"); |
630 ASSERT_TRUE(parent.good()); | 631 ASSERT_TRUE(parent.good()); |
631 parent.Put(syncable::IS_UNSYNCED, true); | 632 parent.Put(syncable::IS_UNSYNCED, true); |
632 parent.Put(syncable::IS_DIR, true); | 633 parent.Put(syncable::IS_DIR, true); |
633 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 634 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
634 parent.Put(syncable::BASE_VERSION, 1); | 635 parent.Put(syncable::BASE_VERSION, 1); |
635 parent.Put(syncable::ID, parent_id_); | 636 parent.Put(syncable::ID, parent_id_); |
636 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete"); | 637 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete"); |
637 ASSERT_TRUE(child.good()); | 638 ASSERT_TRUE(child.good()); |
638 child.Put(syncable::ID, child_id_); | 639 child.Put(syncable::ID, child_id_); |
(...skipping 14 matching lines...) Expand all Loading... |
653 dir->PurgeEntriesWithTypeIn(types_to_purge); | 654 dir->PurgeEntriesWithTypeIn(types_to_purge); |
654 | 655 |
655 StatusController* status = session_->status_controller(); | 656 StatusController* status = session_->status_controller(); |
656 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 657 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
657 EXPECT_EQ(2U, status->unsynced_handles().size()); | 658 EXPECT_EQ(2U, status->unsynced_handles().size()); |
658 ASSERT_EQ(2U, mock_server_->committed_ids().size()); | 659 ASSERT_EQ(2U, mock_server_->committed_ids().size()); |
659 // If this test starts failing, be aware other sort orders could be valid. | 660 // If this test starts failing, be aware other sort orders could be valid. |
660 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); | 661 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); |
661 EXPECT_TRUE(child_id_ == mock_server_->committed_ids()[1]); | 662 EXPECT_TRUE(child_id_ == mock_server_->committed_ids()[1]); |
662 { | 663 { |
663 ReadTransaction rt(dir, __FILE__, __LINE__); | 664 ReadTransaction rt(dir, FROM_HERE); |
664 Entry entry(&rt, syncable::GET_BY_ID, child_id_); | 665 Entry entry(&rt, syncable::GET_BY_ID, child_id_); |
665 ASSERT_TRUE(entry.good()); | 666 ASSERT_TRUE(entry.good()); |
666 VerifyTestDataInEntry(&rt, &entry); | 667 VerifyTestDataInEntry(&rt, &entry); |
667 } | 668 } |
668 dir->SaveChanges(); | 669 dir->SaveChanges(); |
669 { | 670 { |
670 ReadTransaction rt(dir, __FILE__, __LINE__); | 671 ReadTransaction rt(dir, FROM_HERE); |
671 Entry entry(&rt, syncable::GET_BY_ID, pref_node_id); | 672 Entry entry(&rt, syncable::GET_BY_ID, pref_node_id); |
672 ASSERT_FALSE(entry.good()); | 673 ASSERT_FALSE(entry.good()); |
673 } | 674 } |
674 } | 675 } |
675 | 676 |
676 TEST_F(SyncerTest, TestPurgeWhileUnapplied) { | 677 TEST_F(SyncerTest, TestPurgeWhileUnapplied) { |
677 // Similar to above, but for unapplied items. Bug 49278. | 678 // Similar to above, but for unapplied items. Bug 49278. |
678 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 679 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
679 ASSERT_TRUE(dir.good()); | 680 ASSERT_TRUE(dir.good()); |
680 { | 681 { |
681 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 682 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
682 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "Pete"); | 683 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "Pete"); |
683 ASSERT_TRUE(parent.good()); | 684 ASSERT_TRUE(parent.good()); |
684 parent.Put(syncable::IS_UNAPPLIED_UPDATE, true); | 685 parent.Put(syncable::IS_UNAPPLIED_UPDATE, true); |
685 parent.Put(syncable::IS_DIR, true); | 686 parent.Put(syncable::IS_DIR, true); |
686 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 687 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
687 parent.Put(syncable::BASE_VERSION, 1); | 688 parent.Put(syncable::BASE_VERSION, 1); |
688 parent.Put(syncable::ID, parent_id_); | 689 parent.Put(syncable::ID, parent_id_); |
689 } | 690 } |
690 | 691 |
691 std::set<syncable::ModelType> types_to_purge; | 692 std::set<syncable::ModelType> types_to_purge; |
692 types_to_purge.insert(syncable::BOOKMARKS); | 693 types_to_purge.insert(syncable::BOOKMARKS); |
693 dir->PurgeEntriesWithTypeIn(types_to_purge); | 694 dir->PurgeEntriesWithTypeIn(types_to_purge); |
694 | 695 |
695 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 696 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
696 dir->SaveChanges(); | 697 dir->SaveChanges(); |
697 { | 698 { |
698 ReadTransaction rt(dir, __FILE__, __LINE__); | 699 ReadTransaction rt(dir, FROM_HERE); |
699 Entry entry(&rt, syncable::GET_BY_ID, parent_id_); | 700 Entry entry(&rt, syncable::GET_BY_ID, parent_id_); |
700 ASSERT_FALSE(entry.good()); | 701 ASSERT_FALSE(entry.good()); |
701 } | 702 } |
702 } | 703 } |
703 | 704 |
704 TEST_F(SyncerTest, TestCommitListOrderingTwoItemsTall) { | 705 TEST_F(SyncerTest, TestCommitListOrderingTwoItemsTall) { |
705 CommitOrderingTest items[] = { | 706 CommitOrderingTest items[] = { |
706 {1, ids_.FromNumber(-1001), ids_.FromNumber(-1000)}, | 707 {1, ids_.FromNumber(-1001), ids_.FromNumber(-1000)}, |
707 {0, ids_.FromNumber(-1000), ids_.FromNumber(0)}, | 708 {0, ids_.FromNumber(-1000), ids_.FromNumber(0)}, |
708 CommitOrderingTest::LAST_COMMIT_ITEM, | 709 CommitOrderingTest::LAST_COMMIT_ITEM, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 RunCommitOrderingTest(items); | 830 RunCommitOrderingTest(items); |
830 } | 831 } |
831 | 832 |
832 TEST_F(SyncerTest, TestCommitListOrderingWithNesting) { | 833 TEST_F(SyncerTest, TestCommitListOrderingWithNesting) { |
833 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 834 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
834 ASSERT_TRUE(dir.good()); | 835 ASSERT_TRUE(dir.good()); |
835 int64 now_server_time = ClientTimeToServerTime(syncable::Now()); | 836 int64 now_server_time = ClientTimeToServerTime(syncable::Now()); |
836 int64 now_minus_2h = ServerTimeToClientTime(now_server_time - 7200000); | 837 int64 now_minus_2h = ServerTimeToClientTime(now_server_time - 7200000); |
837 | 838 |
838 { | 839 { |
839 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 840 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
840 { | 841 { |
841 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), | 842 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), |
842 "Bob"); | 843 "Bob"); |
843 ASSERT_TRUE(parent.good()); | 844 ASSERT_TRUE(parent.good()); |
844 parent.Put(syncable::IS_UNSYNCED, true); | 845 parent.Put(syncable::IS_UNSYNCED, true); |
845 parent.Put(syncable::IS_DIR, true); | 846 parent.Put(syncable::IS_DIR, true); |
846 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 847 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
847 parent.Put(syncable::ID, ids_.FromNumber(100)); | 848 parent.Put(syncable::ID, ids_.FromNumber(100)); |
848 parent.Put(syncable::BASE_VERSION, 1); | 849 parent.Put(syncable::BASE_VERSION, 1); |
849 MutableEntry child(&wtrans, syncable::CREATE, ids_.FromNumber(100), | 850 MutableEntry child(&wtrans, syncable::CREATE, ids_.FromNumber(100), |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 std::sort(commit_ids.begin() + 3, commit_ids.end()); | 913 std::sort(commit_ids.begin() + 3, commit_ids.end()); |
913 EXPECT_TRUE(ids_.FromNumber(103) == commit_ids[3]); | 914 EXPECT_TRUE(ids_.FromNumber(103) == commit_ids[3]); |
914 EXPECT_TRUE(ids_.FromNumber(104) == commit_ids[4]); | 915 EXPECT_TRUE(ids_.FromNumber(104) == commit_ids[4]); |
915 EXPECT_TRUE(ids_.FromNumber(105) == commit_ids[5]); | 916 EXPECT_TRUE(ids_.FromNumber(105) == commit_ids[5]); |
916 } | 917 } |
917 | 918 |
918 TEST_F(SyncerTest, TestCommitListOrderingWithNewItems) { | 919 TEST_F(SyncerTest, TestCommitListOrderingWithNewItems) { |
919 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 920 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
920 ASSERT_TRUE(dir.good()); | 921 ASSERT_TRUE(dir.good()); |
921 { | 922 { |
922 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 923 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
923 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "1"); | 924 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "1"); |
924 ASSERT_TRUE(parent.good()); | 925 ASSERT_TRUE(parent.good()); |
925 parent.Put(syncable::IS_UNSYNCED, true); | 926 parent.Put(syncable::IS_UNSYNCED, true); |
926 parent.Put(syncable::IS_DIR, true); | 927 parent.Put(syncable::IS_DIR, true); |
927 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 928 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
928 parent.Put(syncable::ID, parent_id_); | 929 parent.Put(syncable::ID, parent_id_); |
929 MutableEntry child(&wtrans, syncable::CREATE, wtrans.root_id(), "2"); | 930 MutableEntry child(&wtrans, syncable::CREATE, wtrans.root_id(), "2"); |
930 ASSERT_TRUE(child.good()); | 931 ASSERT_TRUE(child.good()); |
931 child.Put(syncable::IS_UNSYNCED, true); | 932 child.Put(syncable::IS_UNSYNCED, true); |
932 child.Put(syncable::IS_DIR, true); | 933 child.Put(syncable::IS_DIR, true); |
933 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 934 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
934 child.Put(syncable::ID, child_id_); | 935 child.Put(syncable::ID, child_id_); |
935 parent.Put(syncable::BASE_VERSION, 1); | 936 parent.Put(syncable::BASE_VERSION, 1); |
936 child.Put(syncable::BASE_VERSION, 1); | 937 child.Put(syncable::BASE_VERSION, 1); |
937 } | 938 } |
938 { | 939 { |
939 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 940 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
940 MutableEntry parent(&wtrans, syncable::CREATE, parent_id_, "A"); | 941 MutableEntry parent(&wtrans, syncable::CREATE, parent_id_, "A"); |
941 ASSERT_TRUE(parent.good()); | 942 ASSERT_TRUE(parent.good()); |
942 parent.Put(syncable::IS_UNSYNCED, true); | 943 parent.Put(syncable::IS_UNSYNCED, true); |
943 parent.Put(syncable::IS_DIR, true); | 944 parent.Put(syncable::IS_DIR, true); |
944 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 945 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
945 parent.Put(syncable::ID, ids_.FromNumber(102)); | 946 parent.Put(syncable::ID, ids_.FromNumber(102)); |
946 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "B"); | 947 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "B"); |
947 ASSERT_TRUE(child.good()); | 948 ASSERT_TRUE(child.good()); |
948 child.Put(syncable::IS_UNSYNCED, true); | 949 child.Put(syncable::IS_UNSYNCED, true); |
949 child.Put(syncable::IS_DIR, true); | 950 child.Put(syncable::IS_DIR, true); |
950 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 951 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
951 child.Put(syncable::ID, ids_.FromNumber(-103)); | 952 child.Put(syncable::ID, ids_.FromNumber(-103)); |
952 parent.Put(syncable::BASE_VERSION, 1); | 953 parent.Put(syncable::BASE_VERSION, 1); |
953 } | 954 } |
954 { | 955 { |
955 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 956 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
956 MutableEntry parent(&wtrans, syncable::CREATE, child_id_, "A"); | 957 MutableEntry parent(&wtrans, syncable::CREATE, child_id_, "A"); |
957 ASSERT_TRUE(parent.good()); | 958 ASSERT_TRUE(parent.good()); |
958 parent.Put(syncable::IS_UNSYNCED, true); | 959 parent.Put(syncable::IS_UNSYNCED, true); |
959 parent.Put(syncable::IS_DIR, true); | 960 parent.Put(syncable::IS_DIR, true); |
960 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 961 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
961 parent.Put(syncable::ID, ids_.FromNumber(-104)); | 962 parent.Put(syncable::ID, ids_.FromNumber(-104)); |
962 MutableEntry child(&wtrans, syncable::CREATE, child_id_, "B"); | 963 MutableEntry child(&wtrans, syncable::CREATE, child_id_, "B"); |
963 ASSERT_TRUE(child.good()); | 964 ASSERT_TRUE(child.good()); |
964 child.Put(syncable::IS_UNSYNCED, true); | 965 child.Put(syncable::IS_UNSYNCED, true); |
965 child.Put(syncable::IS_DIR, true); | 966 child.Put(syncable::IS_DIR, true); |
(...skipping 14 matching lines...) Expand all Loading... |
980 EXPECT_TRUE(ids_.FromNumber(105) == mock_server_->committed_ids()[5]); | 981 EXPECT_TRUE(ids_.FromNumber(105) == mock_server_->committed_ids()[5]); |
981 } | 982 } |
982 | 983 |
983 TEST_F(SyncerTest, TestCommitListOrderingCounterexample) { | 984 TEST_F(SyncerTest, TestCommitListOrderingCounterexample) { |
984 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 985 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
985 ASSERT_TRUE(dir.good()); | 986 ASSERT_TRUE(dir.good()); |
986 | 987 |
987 syncable::Id child2_id = ids_.NewServerId(); | 988 syncable::Id child2_id = ids_.NewServerId(); |
988 | 989 |
989 { | 990 { |
990 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 991 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
991 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "P"); | 992 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), "P"); |
992 ASSERT_TRUE(parent.good()); | 993 ASSERT_TRUE(parent.good()); |
993 parent.Put(syncable::IS_UNSYNCED, true); | 994 parent.Put(syncable::IS_UNSYNCED, true); |
994 parent.Put(syncable::IS_DIR, true); | 995 parent.Put(syncable::IS_DIR, true); |
995 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 996 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
996 parent.Put(syncable::ID, parent_id_); | 997 parent.Put(syncable::ID, parent_id_); |
997 MutableEntry child1(&wtrans, syncable::CREATE, parent_id_, "1"); | 998 MutableEntry child1(&wtrans, syncable::CREATE, parent_id_, "1"); |
998 ASSERT_TRUE(child1.good()); | 999 ASSERT_TRUE(child1.good()); |
999 child1.Put(syncable::IS_UNSYNCED, true); | 1000 child1.Put(syncable::IS_UNSYNCED, true); |
1000 child1.Put(syncable::ID, child_id_); | 1001 child1.Put(syncable::ID, child_id_); |
(...skipping 20 matching lines...) Expand all Loading... |
1021 | 1022 |
1022 TEST_F(SyncerTest, TestCommitListOrderingAndNewParent) { | 1023 TEST_F(SyncerTest, TestCommitListOrderingAndNewParent) { |
1023 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1024 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1024 ASSERT_TRUE(dir.good()); | 1025 ASSERT_TRUE(dir.good()); |
1025 | 1026 |
1026 string parent1_name = "1"; | 1027 string parent1_name = "1"; |
1027 string parent2_name = "A"; | 1028 string parent2_name = "A"; |
1028 string child_name = "B"; | 1029 string child_name = "B"; |
1029 | 1030 |
1030 { | 1031 { |
1031 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1032 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1032 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), | 1033 MutableEntry parent(&wtrans, syncable::CREATE, wtrans.root_id(), |
1033 parent1_name); | 1034 parent1_name); |
1034 ASSERT_TRUE(parent.good()); | 1035 ASSERT_TRUE(parent.good()); |
1035 parent.Put(syncable::IS_UNSYNCED, true); | 1036 parent.Put(syncable::IS_UNSYNCED, true); |
1036 parent.Put(syncable::IS_DIR, true); | 1037 parent.Put(syncable::IS_DIR, true); |
1037 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1038 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1038 parent.Put(syncable::ID, parent_id_); | 1039 parent.Put(syncable::ID, parent_id_); |
1039 parent.Put(syncable::BASE_VERSION, 1); | 1040 parent.Put(syncable::BASE_VERSION, 1); |
1040 } | 1041 } |
1041 | 1042 |
1042 syncable::Id parent2_id = ids_.NewLocalId(); | 1043 syncable::Id parent2_id = ids_.NewLocalId(); |
1043 syncable::Id child_id = ids_.NewServerId(); | 1044 syncable::Id child_id = ids_.NewServerId(); |
1044 { | 1045 { |
1045 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1046 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1046 MutableEntry parent2(&wtrans, syncable::CREATE, parent_id_, parent2_name); | 1047 MutableEntry parent2(&wtrans, syncable::CREATE, parent_id_, parent2_name); |
1047 ASSERT_TRUE(parent2.good()); | 1048 ASSERT_TRUE(parent2.good()); |
1048 parent2.Put(syncable::IS_UNSYNCED, true); | 1049 parent2.Put(syncable::IS_UNSYNCED, true); |
1049 parent2.Put(syncable::IS_DIR, true); | 1050 parent2.Put(syncable::IS_DIR, true); |
1050 parent2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1051 parent2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1051 parent2.Put(syncable::ID, parent2_id); | 1052 parent2.Put(syncable::ID, parent2_id); |
1052 | 1053 |
1053 MutableEntry child(&wtrans, syncable::CREATE, parent2_id, child_name); | 1054 MutableEntry child(&wtrans, syncable::CREATE, parent2_id, child_name); |
1054 ASSERT_TRUE(child.good()); | 1055 ASSERT_TRUE(child.good()); |
1055 child.Put(syncable::IS_UNSYNCED, true); | 1056 child.Put(syncable::IS_UNSYNCED, true); |
1056 child.Put(syncable::IS_DIR, true); | 1057 child.Put(syncable::IS_DIR, true); |
1057 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1058 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1058 child.Put(syncable::ID, child_id); | 1059 child.Put(syncable::ID, child_id); |
1059 child.Put(syncable::BASE_VERSION, 1); | 1060 child.Put(syncable::BASE_VERSION, 1); |
1060 } | 1061 } |
1061 | 1062 |
1062 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 1063 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
1063 EXPECT_TRUE(3 == session_->status_controller()->unsynced_handles().size()); | 1064 EXPECT_TRUE(3 == session_->status_controller()->unsynced_handles().size()); |
1064 ASSERT_TRUE(3 == mock_server_->committed_ids().size()); | 1065 ASSERT_TRUE(3 == mock_server_->committed_ids().size()); |
1065 // If this test starts failing, be aware other sort orders could be valid. | 1066 // If this test starts failing, be aware other sort orders could be valid. |
1066 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); | 1067 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); |
1067 EXPECT_TRUE(parent2_id == mock_server_->committed_ids()[1]); | 1068 EXPECT_TRUE(parent2_id == mock_server_->committed_ids()[1]); |
1068 EXPECT_TRUE(child_id == mock_server_->committed_ids()[2]); | 1069 EXPECT_TRUE(child_id == mock_server_->committed_ids()[2]); |
1069 { | 1070 { |
1070 ReadTransaction rtrans(dir, __FILE__, __LINE__); | 1071 ReadTransaction rtrans(dir, FROM_HERE); |
1071 // Check that things committed correctly. | 1072 // Check that things committed correctly. |
1072 Entry entry_1(&rtrans, syncable::GET_BY_ID, parent_id_); | 1073 Entry entry_1(&rtrans, syncable::GET_BY_ID, parent_id_); |
1073 EXPECT_EQ(entry_1.Get(NON_UNIQUE_NAME), parent1_name); | 1074 EXPECT_EQ(entry_1.Get(NON_UNIQUE_NAME), parent1_name); |
1074 // Check that parent2 is a subfolder of parent1. | 1075 // Check that parent2 is a subfolder of parent1. |
1075 EXPECT_EQ(1, CountEntriesWithName(&rtrans, | 1076 EXPECT_EQ(1, CountEntriesWithName(&rtrans, |
1076 parent_id_, | 1077 parent_id_, |
1077 parent2_name)); | 1078 parent2_name)); |
1078 | 1079 |
1079 // Parent2 was a local ID and thus should have changed on commit! | 1080 // Parent2 was a local ID and thus should have changed on commit! |
1080 Entry pre_commit_entry_parent2(&rtrans, syncable::GET_BY_ID, parent2_id); | 1081 Entry pre_commit_entry_parent2(&rtrans, syncable::GET_BY_ID, parent2_id); |
(...skipping 11 matching lines...) Expand all Loading... |
1092 | 1093 |
1093 TEST_F(SyncerTest, TestCommitListOrderingAndNewParentAndChild) { | 1094 TEST_F(SyncerTest, TestCommitListOrderingAndNewParentAndChild) { |
1094 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1095 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1095 ASSERT_TRUE(dir.good()); | 1096 ASSERT_TRUE(dir.good()); |
1096 | 1097 |
1097 string parent_name = "1"; | 1098 string parent_name = "1"; |
1098 string parent2_name = "A"; | 1099 string parent2_name = "A"; |
1099 string child_name = "B"; | 1100 string child_name = "B"; |
1100 | 1101 |
1101 { | 1102 { |
1102 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1103 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1103 MutableEntry parent(&wtrans, | 1104 MutableEntry parent(&wtrans, |
1104 syncable::CREATE, | 1105 syncable::CREATE, |
1105 wtrans.root_id(), | 1106 wtrans.root_id(), |
1106 parent_name); | 1107 parent_name); |
1107 ASSERT_TRUE(parent.good()); | 1108 ASSERT_TRUE(parent.good()); |
1108 parent.Put(syncable::IS_UNSYNCED, true); | 1109 parent.Put(syncable::IS_UNSYNCED, true); |
1109 parent.Put(syncable::IS_DIR, true); | 1110 parent.Put(syncable::IS_DIR, true); |
1110 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1111 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1111 parent.Put(syncable::ID, parent_id_); | 1112 parent.Put(syncable::ID, parent_id_); |
1112 parent.Put(syncable::BASE_VERSION, 1); | 1113 parent.Put(syncable::BASE_VERSION, 1); |
1113 } | 1114 } |
1114 | 1115 |
1115 int64 meta_handle_a, meta_handle_b; | 1116 int64 meta_handle_a, meta_handle_b; |
1116 const Id parent2_local_id = ids_.NewLocalId(); | 1117 const Id parent2_local_id = ids_.NewLocalId(); |
1117 const Id child_local_id = ids_.NewLocalId(); | 1118 const Id child_local_id = ids_.NewLocalId(); |
1118 { | 1119 { |
1119 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1120 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1120 MutableEntry parent2(&wtrans, syncable::CREATE, parent_id_, parent2_name); | 1121 MutableEntry parent2(&wtrans, syncable::CREATE, parent_id_, parent2_name); |
1121 ASSERT_TRUE(parent2.good()); | 1122 ASSERT_TRUE(parent2.good()); |
1122 parent2.Put(syncable::IS_UNSYNCED, true); | 1123 parent2.Put(syncable::IS_UNSYNCED, true); |
1123 parent2.Put(syncable::IS_DIR, true); | 1124 parent2.Put(syncable::IS_DIR, true); |
1124 parent2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1125 parent2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1125 | 1126 |
1126 parent2.Put(syncable::ID, parent2_local_id); | 1127 parent2.Put(syncable::ID, parent2_local_id); |
1127 meta_handle_a = parent2.Get(syncable::META_HANDLE); | 1128 meta_handle_a = parent2.Get(syncable::META_HANDLE); |
1128 MutableEntry child(&wtrans, syncable::CREATE, parent2_local_id, child_name); | 1129 MutableEntry child(&wtrans, syncable::CREATE, parent2_local_id, child_name); |
1129 ASSERT_TRUE(child.good()); | 1130 ASSERT_TRUE(child.good()); |
1130 child.Put(syncable::IS_UNSYNCED, true); | 1131 child.Put(syncable::IS_UNSYNCED, true); |
1131 child.Put(syncable::IS_DIR, true); | 1132 child.Put(syncable::IS_DIR, true); |
1132 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1133 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1133 child.Put(syncable::ID, child_local_id); | 1134 child.Put(syncable::ID, child_local_id); |
1134 meta_handle_b = child.Get(syncable::META_HANDLE); | 1135 meta_handle_b = child.Get(syncable::META_HANDLE); |
1135 } | 1136 } |
1136 | 1137 |
1137 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 1138 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
1138 EXPECT_TRUE(3 == session_->status_controller()->unsynced_handles().size()); | 1139 EXPECT_TRUE(3 == session_->status_controller()->unsynced_handles().size()); |
1139 ASSERT_TRUE(3 == mock_server_->committed_ids().size()); | 1140 ASSERT_TRUE(3 == mock_server_->committed_ids().size()); |
1140 // If this test starts failing, be aware other sort orders could be valid. | 1141 // If this test starts failing, be aware other sort orders could be valid. |
1141 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); | 1142 EXPECT_TRUE(parent_id_ == mock_server_->committed_ids()[0]); |
1142 EXPECT_TRUE(parent2_local_id == mock_server_->committed_ids()[1]); | 1143 EXPECT_TRUE(parent2_local_id == mock_server_->committed_ids()[1]); |
1143 EXPECT_TRUE(child_local_id == mock_server_->committed_ids()[2]); | 1144 EXPECT_TRUE(child_local_id == mock_server_->committed_ids()[2]); |
1144 { | 1145 { |
1145 ReadTransaction rtrans(dir, __FILE__, __LINE__); | 1146 ReadTransaction rtrans(dir, FROM_HERE); |
1146 | 1147 |
1147 Entry parent(&rtrans, syncable::GET_BY_ID, | 1148 Entry parent(&rtrans, syncable::GET_BY_ID, |
1148 GetOnlyEntryWithName(&rtrans, rtrans.root_id(), parent_name)); | 1149 GetOnlyEntryWithName(&rtrans, rtrans.root_id(), parent_name)); |
1149 ASSERT_TRUE(parent.good()); | 1150 ASSERT_TRUE(parent.good()); |
1150 EXPECT_TRUE(parent.Get(syncable::ID).ServerKnows()); | 1151 EXPECT_TRUE(parent.Get(syncable::ID).ServerKnows()); |
1151 | 1152 |
1152 Entry parent2(&rtrans, syncable::GET_BY_ID, | 1153 Entry parent2(&rtrans, syncable::GET_BY_ID, |
1153 GetOnlyEntryWithName(&rtrans, parent.Get(ID), parent2_name)); | 1154 GetOnlyEntryWithName(&rtrans, parent.Get(ID), parent2_name)); |
1154 ASSERT_TRUE(parent2.good()); | 1155 ASSERT_TRUE(parent2.good()); |
1155 EXPECT_TRUE(parent2.Get(syncable::ID).ServerKnows()); | 1156 EXPECT_TRUE(parent2.Get(syncable::ID).ServerKnows()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 ASSERT_TRUE(dir.good()); | 1199 ASSERT_TRUE(dir.good()); |
1199 string id = "some_id"; | 1200 string id = "some_id"; |
1200 string parent_id = "0"; | 1201 string parent_id = "0"; |
1201 string name = "in_root"; | 1202 string name = "in_root"; |
1202 int64 version = 10; | 1203 int64 version = 10; |
1203 int64 timestamp = 10; | 1204 int64 timestamp = 10; |
1204 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp); | 1205 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp); |
1205 | 1206 |
1206 SyncShareAsDelegate(); | 1207 SyncShareAsDelegate(); |
1207 { | 1208 { |
1208 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1209 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1209 Entry entry(&trans, GET_BY_ID, | 1210 Entry entry(&trans, GET_BY_ID, |
1210 syncable::Id::CreateFromServerId("some_id")); | 1211 syncable::Id::CreateFromServerId("some_id")); |
1211 ASSERT_TRUE(entry.good()); | 1212 ASSERT_TRUE(entry.good()); |
1212 EXPECT_TRUE(entry.Get(IS_DIR)); | 1213 EXPECT_TRUE(entry.Get(IS_DIR)); |
1213 EXPECT_TRUE(entry.Get(SERVER_VERSION) == version); | 1214 EXPECT_TRUE(entry.Get(SERVER_VERSION) == version); |
1214 EXPECT_TRUE(entry.Get(BASE_VERSION) == version); | 1215 EXPECT_TRUE(entry.Get(BASE_VERSION) == version); |
1215 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 1216 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
1216 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 1217 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
1217 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 1218 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
1218 EXPECT_FALSE(entry.Get(IS_DEL)); | 1219 EXPECT_FALSE(entry.Get(IS_DEL)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1257 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 1258 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
1258 // The three items with an unresolved parent should be unapplied (3, 9, 100). | 1259 // The three items with an unresolved parent should be unapplied (3, 9, 100). |
1259 // The name clash should also still be in conflict. | 1260 // The name clash should also still be in conflict. |
1260 EXPECT_EQ(3, status->TotalNumConflictingItems()); | 1261 EXPECT_EQ(3, status->TotalNumConflictingItems()); |
1261 { | 1262 { |
1262 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); | 1263 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); |
1263 EXPECT_EQ(3, status->conflict_progress().ConflictingItemsSize()); | 1264 EXPECT_EQ(3, status->conflict_progress().ConflictingItemsSize()); |
1264 } | 1265 } |
1265 | 1266 |
1266 { | 1267 { |
1267 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1268 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1268 // Even though it has the same name, it should work. | 1269 // Even though it has the same name, it should work. |
1269 Entry name_clash(&trans, GET_BY_ID, ids_.FromNumber(2)); | 1270 Entry name_clash(&trans, GET_BY_ID, ids_.FromNumber(2)); |
1270 ASSERT_TRUE(name_clash.good()); | 1271 ASSERT_TRUE(name_clash.good()); |
1271 EXPECT_FALSE(name_clash.Get(IS_UNAPPLIED_UPDATE)) | 1272 EXPECT_FALSE(name_clash.Get(IS_UNAPPLIED_UPDATE)) |
1272 << "Duplicate name SHOULD be OK."; | 1273 << "Duplicate name SHOULD be OK."; |
1273 | 1274 |
1274 Entry bad_parent(&trans, GET_BY_ID, ids_.FromNumber(3)); | 1275 Entry bad_parent(&trans, GET_BY_ID, ids_.FromNumber(3)); |
1275 ASSERT_TRUE(bad_parent.good()); | 1276 ASSERT_TRUE(bad_parent.good()); |
1276 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE)) | 1277 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE)) |
1277 << "child of unknown parent should be in conflict"; | 1278 << "child of unknown parent should be in conflict"; |
(...skipping 16 matching lines...) Expand all Loading... |
1294 mock_server_->AddUpdateDirectory(5, 6, "circular3", 20, 20); | 1295 mock_server_->AddUpdateDirectory(5, 6, "circular3", 20, 20); |
1295 | 1296 |
1296 // Flip the is_dir bit: should fail verify & be dropped. | 1297 // Flip the is_dir bit: should fail verify & be dropped. |
1297 mock_server_->AddUpdateBookmark(10, 0, "dir_to_bookmark", 20, 20); | 1298 mock_server_->AddUpdateBookmark(10, 0, "dir_to_bookmark", 20, 20); |
1298 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 1299 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
1299 | 1300 |
1300 // Version number older than last known: should fail verify & be dropped. | 1301 // Version number older than last known: should fail verify & be dropped. |
1301 mock_server_->AddUpdateDirectory(4, 0, "old_version", 10, 10); | 1302 mock_server_->AddUpdateDirectory(4, 0, "old_version", 10, 10); |
1302 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 1303 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
1303 { | 1304 { |
1304 ReadTransaction trans(dir, __FILE__, __LINE__); | 1305 ReadTransaction trans(dir, FROM_HERE); |
1305 | 1306 |
1306 Entry still_a_dir(&trans, GET_BY_ID, ids_.FromNumber(10)); | 1307 Entry still_a_dir(&trans, GET_BY_ID, ids_.FromNumber(10)); |
1307 ASSERT_TRUE(still_a_dir.good()); | 1308 ASSERT_TRUE(still_a_dir.good()); |
1308 EXPECT_FALSE(still_a_dir.Get(IS_UNAPPLIED_UPDATE)); | 1309 EXPECT_FALSE(still_a_dir.Get(IS_UNAPPLIED_UPDATE)); |
1309 EXPECT_TRUE(10 == still_a_dir.Get(BASE_VERSION)); | 1310 EXPECT_TRUE(10 == still_a_dir.Get(BASE_VERSION)); |
1310 EXPECT_TRUE(10 == still_a_dir.Get(SERVER_VERSION)); | 1311 EXPECT_TRUE(10 == still_a_dir.Get(SERVER_VERSION)); |
1311 EXPECT_TRUE(still_a_dir.Get(IS_DIR)); | 1312 EXPECT_TRUE(still_a_dir.Get(IS_DIR)); |
1312 | 1313 |
1313 Entry rename(&trans, GET_BY_ID, ids_.FromNumber(1)); | 1314 Entry rename(&trans, GET_BY_ID, ids_.FromNumber(1)); |
1314 ASSERT_TRUE(rename.good()); | 1315 ASSERT_TRUE(rename.good()); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1358 } | 1359 } |
1359 | 1360 |
1360 TEST_F(SyncerTest, CommitTimeRename) { | 1361 TEST_F(SyncerTest, CommitTimeRename) { |
1361 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1362 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1362 ASSERT_TRUE(dir.good()); | 1363 ASSERT_TRUE(dir.good()); |
1363 int64 metahandle_folder; | 1364 int64 metahandle_folder; |
1364 int64 metahandle_new_entry; | 1365 int64 metahandle_new_entry; |
1365 | 1366 |
1366 // Create a folder and an entry. | 1367 // Create a folder and an entry. |
1367 { | 1368 { |
1368 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1369 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1369 MutableEntry parent(&trans, CREATE, root_id_, "Folder"); | 1370 MutableEntry parent(&trans, CREATE, root_id_, "Folder"); |
1370 ASSERT_TRUE(parent.good()); | 1371 ASSERT_TRUE(parent.good()); |
1371 parent.Put(IS_DIR, true); | 1372 parent.Put(IS_DIR, true); |
1372 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1373 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1373 parent.Put(IS_UNSYNCED, true); | 1374 parent.Put(IS_UNSYNCED, true); |
1374 metahandle_folder = parent.Get(META_HANDLE); | 1375 metahandle_folder = parent.Get(META_HANDLE); |
1375 | 1376 |
1376 MutableEntry entry(&trans, CREATE, parent.Get(ID), "new_entry"); | 1377 MutableEntry entry(&trans, CREATE, parent.Get(ID), "new_entry"); |
1377 ASSERT_TRUE(entry.good()); | 1378 ASSERT_TRUE(entry.good()); |
1378 metahandle_new_entry = entry.Get(META_HANDLE); | 1379 metahandle_new_entry = entry.Get(META_HANDLE); |
1379 WriteTestDataToEntry(&trans, &entry); | 1380 WriteTestDataToEntry(&trans, &entry); |
1380 } | 1381 } |
1381 | 1382 |
1382 // Mix in a directory creation too for later. | 1383 // Mix in a directory creation too for later. |
1383 mock_server_->AddUpdateDirectory(2, 0, "dir_in_root", 10, 10); | 1384 mock_server_->AddUpdateDirectory(2, 0, "dir_in_root", 10, 10); |
1384 mock_server_->SetCommitTimeRename("renamed_"); | 1385 mock_server_->SetCommitTimeRename("renamed_"); |
1385 SyncShareAsDelegate(); | 1386 SyncShareAsDelegate(); |
1386 | 1387 |
1387 // Verify it was correctly renamed. | 1388 // Verify it was correctly renamed. |
1388 { | 1389 { |
1389 ReadTransaction trans(dir, __FILE__, __LINE__); | 1390 ReadTransaction trans(dir, FROM_HERE); |
1390 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle_folder); | 1391 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle_folder); |
1391 ASSERT_TRUE(entry_folder.good()); | 1392 ASSERT_TRUE(entry_folder.good()); |
1392 EXPECT_EQ("renamed_Folder", entry_folder.Get(NON_UNIQUE_NAME)); | 1393 EXPECT_EQ("renamed_Folder", entry_folder.Get(NON_UNIQUE_NAME)); |
1393 | 1394 |
1394 Entry entry_new(&trans, GET_BY_HANDLE, metahandle_new_entry); | 1395 Entry entry_new(&trans, GET_BY_HANDLE, metahandle_new_entry); |
1395 ASSERT_TRUE(entry_new.good()); | 1396 ASSERT_TRUE(entry_new.good()); |
1396 EXPECT_EQ(entry_folder.Get(ID), entry_new.Get(PARENT_ID)); | 1397 EXPECT_EQ(entry_folder.Get(ID), entry_new.Get(PARENT_ID)); |
1397 EXPECT_EQ("renamed_new_entry", entry_new.Get(NON_UNIQUE_NAME)); | 1398 EXPECT_EQ("renamed_new_entry", entry_new.Get(NON_UNIQUE_NAME)); |
1398 | 1399 |
1399 // And that the unrelated directory creation worked without a rename. | 1400 // And that the unrelated directory creation worked without a rename. |
1400 Entry new_dir(&trans, GET_BY_ID, ids_.FromNumber(2)); | 1401 Entry new_dir(&trans, GET_BY_ID, ids_.FromNumber(2)); |
1401 EXPECT_TRUE(new_dir.good()); | 1402 EXPECT_TRUE(new_dir.good()); |
1402 EXPECT_EQ("dir_in_root", new_dir.Get(NON_UNIQUE_NAME)); | 1403 EXPECT_EQ("dir_in_root", new_dir.Get(NON_UNIQUE_NAME)); |
1403 } | 1404 } |
1404 } | 1405 } |
1405 | 1406 |
1406 | 1407 |
1407 TEST_F(SyncerTest, CommitTimeRenameI18N) { | 1408 TEST_F(SyncerTest, CommitTimeRenameI18N) { |
1408 // This is utf-8 for the diacritized Internationalization. | 1409 // This is utf-8 for the diacritized Internationalization. |
1409 const char* i18nString = "\xc3\x8e\xc3\xb1\x74\xc3\xa9\x72\xc3\xb1" | 1410 const char* i18nString = "\xc3\x8e\xc3\xb1\x74\xc3\xa9\x72\xc3\xb1" |
1410 "\xc3\xa5\x74\xc3\xae\xc3\xb6\xc3\xb1\xc3\xa5\x6c\xc3\xae" | 1411 "\xc3\xa5\x74\xc3\xae\xc3\xb6\xc3\xb1\xc3\xa5\x6c\xc3\xae" |
1411 "\xc2\x9e\xc3\xa5\x74\xc3\xae\xc3\xb6\xc3\xb1"; | 1412 "\xc2\x9e\xc3\xa5\x74\xc3\xae\xc3\xb6\xc3\xb1"; |
1412 | 1413 |
1413 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1414 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1414 ASSERT_TRUE(dir.good()); | 1415 ASSERT_TRUE(dir.good()); |
1415 int64 metahandle; | 1416 int64 metahandle; |
1416 // Create a folder, expect a commit time rename. | 1417 // Create a folder, expect a commit time rename. |
1417 { | 1418 { |
1418 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1419 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1419 MutableEntry parent(&trans, CREATE, root_id_, "Folder"); | 1420 MutableEntry parent(&trans, CREATE, root_id_, "Folder"); |
1420 ASSERT_TRUE(parent.good()); | 1421 ASSERT_TRUE(parent.good()); |
1421 parent.Put(IS_DIR, true); | 1422 parent.Put(IS_DIR, true); |
1422 parent.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 1423 parent.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
1423 parent.Put(IS_UNSYNCED, true); | 1424 parent.Put(IS_UNSYNCED, true); |
1424 metahandle = parent.Get(META_HANDLE); | 1425 metahandle = parent.Get(META_HANDLE); |
1425 } | 1426 } |
1426 | 1427 |
1427 mock_server_->SetCommitTimeRename(i18nString); | 1428 mock_server_->SetCommitTimeRename(i18nString); |
1428 SyncShareAsDelegate(); | 1429 SyncShareAsDelegate(); |
1429 | 1430 |
1430 // Verify it was correctly renamed. | 1431 // Verify it was correctly renamed. |
1431 { | 1432 { |
1432 ReadTransaction trans(dir, __FILE__, __LINE__); | 1433 ReadTransaction trans(dir, FROM_HERE); |
1433 string expected_folder_name(i18nString); | 1434 string expected_folder_name(i18nString); |
1434 expected_folder_name.append("Folder"); | 1435 expected_folder_name.append("Folder"); |
1435 | 1436 |
1436 | 1437 |
1437 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle); | 1438 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle); |
1438 ASSERT_TRUE(entry_folder.good()); | 1439 ASSERT_TRUE(entry_folder.good()); |
1439 EXPECT_EQ(expected_folder_name, entry_folder.Get(NON_UNIQUE_NAME)); | 1440 EXPECT_EQ(expected_folder_name, entry_folder.Get(NON_UNIQUE_NAME)); |
1440 } | 1441 } |
1441 } | 1442 } |
1442 | 1443 |
1443 // A commit with a lost response produces an update that has to be reunited with | 1444 // A commit with a lost response produces an update that has to be reunited with |
1444 // its parent. | 1445 // its parent. |
1445 TEST_F(SyncerTest, CommitReuniteUpdateAdjustsChildren) { | 1446 TEST_F(SyncerTest, CommitReuniteUpdateAdjustsChildren) { |
1446 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1447 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1447 ASSERT_TRUE(dir.good()); | 1448 ASSERT_TRUE(dir.good()); |
1448 | 1449 |
1449 // Create a folder in the root. | 1450 // Create a folder in the root. |
1450 int64 metahandle_folder; | 1451 int64 metahandle_folder; |
1451 { | 1452 { |
1452 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1453 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1453 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_folder"); | 1454 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_folder"); |
1454 ASSERT_TRUE(entry.good()); | 1455 ASSERT_TRUE(entry.good()); |
1455 entry.Put(IS_DIR, true); | 1456 entry.Put(IS_DIR, true); |
1456 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 1457 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
1457 entry.Put(IS_UNSYNCED, true); | 1458 entry.Put(IS_UNSYNCED, true); |
1458 metahandle_folder = entry.Get(META_HANDLE); | 1459 metahandle_folder = entry.Get(META_HANDLE); |
1459 } | 1460 } |
1460 | 1461 |
1461 // Verify it and pull the ID out of the folder. | 1462 // Verify it and pull the ID out of the folder. |
1462 syncable::Id folder_id; | 1463 syncable::Id folder_id; |
1463 int64 metahandle_entry; | 1464 int64 metahandle_entry; |
1464 { | 1465 { |
1465 ReadTransaction trans(dir, __FILE__, __LINE__); | 1466 ReadTransaction trans(dir, FROM_HERE); |
1466 Entry entry(&trans, GET_BY_HANDLE, metahandle_folder); | 1467 Entry entry(&trans, GET_BY_HANDLE, metahandle_folder); |
1467 ASSERT_TRUE(entry.good()); | 1468 ASSERT_TRUE(entry.good()); |
1468 folder_id = entry.Get(ID); | 1469 folder_id = entry.Get(ID); |
1469 ASSERT_TRUE(!folder_id.ServerKnows()); | 1470 ASSERT_TRUE(!folder_id.ServerKnows()); |
1470 } | 1471 } |
1471 | 1472 |
1472 // Create an entry in the newly created folder. | 1473 // Create an entry in the newly created folder. |
1473 { | 1474 { |
1474 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1475 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1475 MutableEntry entry(&trans, CREATE, folder_id, "new_entry"); | 1476 MutableEntry entry(&trans, CREATE, folder_id, "new_entry"); |
1476 ASSERT_TRUE(entry.good()); | 1477 ASSERT_TRUE(entry.good()); |
1477 metahandle_entry = entry.Get(META_HANDLE); | 1478 metahandle_entry = entry.Get(META_HANDLE); |
1478 WriteTestDataToEntry(&trans, &entry); | 1479 WriteTestDataToEntry(&trans, &entry); |
1479 } | 1480 } |
1480 | 1481 |
1481 // Verify it and pull the ID out of the entry. | 1482 // Verify it and pull the ID out of the entry. |
1482 syncable::Id entry_id; | 1483 syncable::Id entry_id; |
1483 { | 1484 { |
1484 ReadTransaction trans(dir, __FILE__, __LINE__); | 1485 ReadTransaction trans(dir, FROM_HERE); |
1485 Entry entry(&trans, syncable::GET_BY_HANDLE, metahandle_entry); | 1486 Entry entry(&trans, syncable::GET_BY_HANDLE, metahandle_entry); |
1486 ASSERT_TRUE(entry.good()); | 1487 ASSERT_TRUE(entry.good()); |
1487 EXPECT_EQ(folder_id, entry.Get(PARENT_ID)); | 1488 EXPECT_EQ(folder_id, entry.Get(PARENT_ID)); |
1488 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME)); | 1489 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME)); |
1489 entry_id = entry.Get(ID); | 1490 entry_id = entry.Get(ID); |
1490 EXPECT_TRUE(!entry_id.ServerKnows()); | 1491 EXPECT_TRUE(!entry_id.ServerKnows()); |
1491 VerifyTestDataInEntry(&trans, &entry); | 1492 VerifyTestDataInEntry(&trans, &entry); |
1492 } | 1493 } |
1493 | 1494 |
1494 // Now, to emulate a commit response failure, we just don't commit it. | 1495 // Now, to emulate a commit response failure, we just don't commit it. |
1495 int64 new_version = 150; // any larger value. | 1496 int64 new_version = 150; // any larger value. |
1496 int64 timestamp = 20; // arbitrary value. | 1497 int64 timestamp = 20; // arbitrary value. |
1497 syncable::Id new_folder_id = | 1498 syncable::Id new_folder_id = |
1498 syncable::Id::CreateFromServerId("folder_server_id"); | 1499 syncable::Id::CreateFromServerId("folder_server_id"); |
1499 | 1500 |
1500 // The following update should cause the folder to both apply the update, as | 1501 // The following update should cause the folder to both apply the update, as |
1501 // well as reassociate the id. | 1502 // well as reassociate the id. |
1502 mock_server_->AddUpdateDirectory(new_folder_id, root_id_, | 1503 mock_server_->AddUpdateDirectory(new_folder_id, root_id_, |
1503 "new_folder", new_version, timestamp); | 1504 "new_folder", new_version, timestamp); |
1504 mock_server_->SetLastUpdateOriginatorFields( | 1505 mock_server_->SetLastUpdateOriginatorFields( |
1505 dir->cache_guid(), folder_id.GetServerId()); | 1506 dir->cache_guid(), folder_id.GetServerId()); |
1506 | 1507 |
1507 // We don't want it accidentally committed, just the update applied. | 1508 // We don't want it accidentally committed, just the update applied. |
1508 mock_server_->set_conflict_all_commits(true); | 1509 mock_server_->set_conflict_all_commits(true); |
1509 | 1510 |
1510 // Alright! Apply that update! | 1511 // Alright! Apply that update! |
1511 SyncShareAsDelegate(); | 1512 SyncShareAsDelegate(); |
1512 { | 1513 { |
1513 // The folder's ID should have been updated. | 1514 // The folder's ID should have been updated. |
1514 ReadTransaction trans(dir, __FILE__, __LINE__); | 1515 ReadTransaction trans(dir, FROM_HERE); |
1515 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder); | 1516 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder); |
1516 ASSERT_TRUE(folder.good()); | 1517 ASSERT_TRUE(folder.good()); |
1517 EXPECT_EQ("new_folder", folder.Get(NON_UNIQUE_NAME)); | 1518 EXPECT_EQ("new_folder", folder.Get(NON_UNIQUE_NAME)); |
1518 EXPECT_TRUE(new_version == folder.Get(BASE_VERSION)); | 1519 EXPECT_TRUE(new_version == folder.Get(BASE_VERSION)); |
1519 EXPECT_TRUE(new_folder_id == folder.Get(ID)); | 1520 EXPECT_TRUE(new_folder_id == folder.Get(ID)); |
1520 EXPECT_TRUE(folder.Get(ID).ServerKnows()); | 1521 EXPECT_TRUE(folder.Get(ID).ServerKnows()); |
1521 EXPECT_EQ(trans.root_id(), folder.Get(PARENT_ID)); | 1522 EXPECT_EQ(trans.root_id(), folder.Get(PARENT_ID)); |
1522 | 1523 |
1523 // Since it was updated, the old folder should not exist. | 1524 // Since it was updated, the old folder should not exist. |
1524 Entry old_dead_folder(&trans, GET_BY_ID, folder_id); | 1525 Entry old_dead_folder(&trans, GET_BY_ID, folder_id); |
(...skipping 11 matching lines...) Expand all Loading... |
1536 | 1537 |
1537 // A commit with a lost response produces an update that has to be reunited with | 1538 // A commit with a lost response produces an update that has to be reunited with |
1538 // its parent. | 1539 // its parent. |
1539 TEST_F(SyncerTest, CommitReuniteUpdate) { | 1540 TEST_F(SyncerTest, CommitReuniteUpdate) { |
1540 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1541 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1541 ASSERT_TRUE(dir.good()); | 1542 ASSERT_TRUE(dir.good()); |
1542 | 1543 |
1543 // Create an entry in the root. | 1544 // Create an entry in the root. |
1544 int64 entry_metahandle; | 1545 int64 entry_metahandle; |
1545 { | 1546 { |
1546 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1547 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1547 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_entry"); | 1548 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_entry"); |
1548 ASSERT_TRUE(entry.good()); | 1549 ASSERT_TRUE(entry.good()); |
1549 entry_metahandle = entry.Get(META_HANDLE); | 1550 entry_metahandle = entry.Get(META_HANDLE); |
1550 WriteTestDataToEntry(&trans, &entry); | 1551 WriteTestDataToEntry(&trans, &entry); |
1551 } | 1552 } |
1552 | 1553 |
1553 // Verify it and pull the ID out. | 1554 // Verify it and pull the ID out. |
1554 syncable::Id entry_id; | 1555 syncable::Id entry_id; |
1555 { | 1556 { |
1556 ReadTransaction trans(dir, __FILE__, __LINE__); | 1557 ReadTransaction trans(dir, FROM_HERE); |
1557 | 1558 |
1558 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); | 1559 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); |
1559 ASSERT_TRUE(entry.good()); | 1560 ASSERT_TRUE(entry.good()); |
1560 entry_id = entry.Get(ID); | 1561 entry_id = entry.Get(ID); |
1561 EXPECT_TRUE(!entry_id.ServerKnows()); | 1562 EXPECT_TRUE(!entry_id.ServerKnows()); |
1562 VerifyTestDataInEntry(&trans, &entry); | 1563 VerifyTestDataInEntry(&trans, &entry); |
1563 } | 1564 } |
1564 | 1565 |
1565 // Now, to emulate a commit response failure, we just don't commit it. | 1566 // Now, to emulate a commit response failure, we just don't commit it. |
1566 int64 new_version = 150; // any larger value. | 1567 int64 new_version = 150; // any larger value. |
1567 int64 timestamp = 20; // arbitrary value. | 1568 int64 timestamp = 20; // arbitrary value. |
1568 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); | 1569 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); |
1569 | 1570 |
1570 // Generate an update from the server with a relevant ID reassignment. | 1571 // Generate an update from the server with a relevant ID reassignment. |
1571 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, | 1572 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, |
1572 "new_entry", new_version, timestamp); | 1573 "new_entry", new_version, timestamp); |
1573 mock_server_->SetLastUpdateOriginatorFields( | 1574 mock_server_->SetLastUpdateOriginatorFields( |
1574 dir->cache_guid(), entry_id.GetServerId()); | 1575 dir->cache_guid(), entry_id.GetServerId()); |
1575 | 1576 |
1576 // We don't want it accidentally committed, just the update applied. | 1577 // We don't want it accidentally committed, just the update applied. |
1577 mock_server_->set_conflict_all_commits(true); | 1578 mock_server_->set_conflict_all_commits(true); |
1578 | 1579 |
1579 // Alright! Apply that update! | 1580 // Alright! Apply that update! |
1580 SyncShareAsDelegate(); | 1581 SyncShareAsDelegate(); |
1581 { | 1582 { |
1582 ReadTransaction trans(dir, __FILE__, __LINE__); | 1583 ReadTransaction trans(dir, FROM_HERE); |
1583 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); | 1584 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); |
1584 ASSERT_TRUE(entry.good()); | 1585 ASSERT_TRUE(entry.good()); |
1585 EXPECT_TRUE(new_version == entry.Get(BASE_VERSION)); | 1586 EXPECT_TRUE(new_version == entry.Get(BASE_VERSION)); |
1586 EXPECT_TRUE(new_entry_id == entry.Get(ID)); | 1587 EXPECT_TRUE(new_entry_id == entry.Get(ID)); |
1587 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME)); | 1588 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME)); |
1588 } | 1589 } |
1589 } | 1590 } |
1590 | 1591 |
1591 // A commit with a lost response must work even if the local entry was deleted | 1592 // A commit with a lost response must work even if the local entry was deleted |
1592 // before the update is applied. We should not duplicate the local entry in | 1593 // before the update is applied. We should not duplicate the local entry in |
1593 // this case, but just create another one alongside. We may wish to examine | 1594 // this case, but just create another one alongside. We may wish to examine |
1594 // this behavior in the future as it can create hanging uploads that never | 1595 // this behavior in the future as it can create hanging uploads that never |
1595 // finish, that must be cleaned up on the server side after some time. | 1596 // finish, that must be cleaned up on the server side after some time. |
1596 TEST_F(SyncerTest, CommitReuniteUpdateDoesNotChokeOnDeletedLocalEntry) { | 1597 TEST_F(SyncerTest, CommitReuniteUpdateDoesNotChokeOnDeletedLocalEntry) { |
1597 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1598 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1598 ASSERT_TRUE(dir.good()); | 1599 ASSERT_TRUE(dir.good()); |
1599 | 1600 |
1600 // Create a entry in the root. | 1601 // Create a entry in the root. |
1601 int64 entry_metahandle; | 1602 int64 entry_metahandle; |
1602 { | 1603 { |
1603 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1604 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1604 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_entry"); | 1605 MutableEntry entry(&trans, CREATE, trans.root_id(), "new_entry"); |
1605 ASSERT_TRUE(entry.good()); | 1606 ASSERT_TRUE(entry.good()); |
1606 entry_metahandle = entry.Get(META_HANDLE); | 1607 entry_metahandle = entry.Get(META_HANDLE); |
1607 WriteTestDataToEntry(&trans, &entry); | 1608 WriteTestDataToEntry(&trans, &entry); |
1608 } | 1609 } |
1609 // Verify it and pull the ID out. | 1610 // Verify it and pull the ID out. |
1610 syncable::Id entry_id; | 1611 syncable::Id entry_id; |
1611 { | 1612 { |
1612 ReadTransaction trans(dir, __FILE__, __LINE__); | 1613 ReadTransaction trans(dir, FROM_HERE); |
1613 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); | 1614 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); |
1614 ASSERT_TRUE(entry.good()); | 1615 ASSERT_TRUE(entry.good()); |
1615 entry_id = entry.Get(ID); | 1616 entry_id = entry.Get(ID); |
1616 EXPECT_TRUE(!entry_id.ServerKnows()); | 1617 EXPECT_TRUE(!entry_id.ServerKnows()); |
1617 VerifyTestDataInEntry(&trans, &entry); | 1618 VerifyTestDataInEntry(&trans, &entry); |
1618 } | 1619 } |
1619 | 1620 |
1620 // Now, to emulate a commit response failure, we just don't commit it. | 1621 // Now, to emulate a commit response failure, we just don't commit it. |
1621 int64 new_version = 150; // any larger value. | 1622 int64 new_version = 150; // any larger value. |
1622 int64 timestamp = 20; // arbitrary value. | 1623 int64 timestamp = 20; // arbitrary value. |
1623 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); | 1624 syncable::Id new_entry_id = syncable::Id::CreateFromServerId("server_id"); |
1624 | 1625 |
1625 // Generate an update from the server with a relevant ID reassignment. | 1626 // Generate an update from the server with a relevant ID reassignment. |
1626 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, | 1627 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, |
1627 "new_entry", new_version, timestamp); | 1628 "new_entry", new_version, timestamp); |
1628 mock_server_->SetLastUpdateOriginatorFields( | 1629 mock_server_->SetLastUpdateOriginatorFields( |
1629 dir->cache_guid(), | 1630 dir->cache_guid(), |
1630 entry_id.GetServerId()); | 1631 entry_id.GetServerId()); |
1631 | 1632 |
1632 // We don't want it accidentally committed, just the update applied. | 1633 // We don't want it accidentally committed, just the update applied. |
1633 mock_server_->set_conflict_all_commits(true); | 1634 mock_server_->set_conflict_all_commits(true); |
1634 | 1635 |
1635 // Purposefully delete the entry now before the update application finishes. | 1636 // Purposefully delete the entry now before the update application finishes. |
1636 { | 1637 { |
1637 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1638 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1638 Id new_entry_id = GetOnlyEntryWithName( | 1639 Id new_entry_id = GetOnlyEntryWithName( |
1639 &trans, trans.root_id(), "new_entry"); | 1640 &trans, trans.root_id(), "new_entry"); |
1640 MutableEntry entry(&trans, GET_BY_ID, new_entry_id); | 1641 MutableEntry entry(&trans, GET_BY_ID, new_entry_id); |
1641 ASSERT_TRUE(entry.good()); | 1642 ASSERT_TRUE(entry.good()); |
1642 entry.Put(syncable::IS_DEL, true); | 1643 entry.Put(syncable::IS_DEL, true); |
1643 } | 1644 } |
1644 | 1645 |
1645 // Just don't CHECK fail in sync, have the update split. | 1646 // Just don't CHECK fail in sync, have the update split. |
1646 SyncShareAsDelegate(); | 1647 SyncShareAsDelegate(); |
1647 { | 1648 { |
1648 ReadTransaction trans(dir, __FILE__, __LINE__); | 1649 ReadTransaction trans(dir, FROM_HERE); |
1649 Id new_entry_id = GetOnlyEntryWithName( | 1650 Id new_entry_id = GetOnlyEntryWithName( |
1650 &trans, trans.root_id(), "new_entry"); | 1651 &trans, trans.root_id(), "new_entry"); |
1651 Entry entry(&trans, GET_BY_ID, new_entry_id); | 1652 Entry entry(&trans, GET_BY_ID, new_entry_id); |
1652 ASSERT_TRUE(entry.good()); | 1653 ASSERT_TRUE(entry.good()); |
1653 EXPECT_FALSE(entry.Get(IS_DEL)); | 1654 EXPECT_FALSE(entry.Get(IS_DEL)); |
1654 | 1655 |
1655 Entry old_entry(&trans, GET_BY_ID, entry_id); | 1656 Entry old_entry(&trans, GET_BY_ID, entry_id); |
1656 ASSERT_TRUE(old_entry.good()); | 1657 ASSERT_TRUE(old_entry.good()); |
1657 EXPECT_TRUE(old_entry.Get(IS_DEL)); | 1658 EXPECT_TRUE(old_entry.Get(IS_DEL)); |
1658 } | 1659 } |
1659 } | 1660 } |
1660 | 1661 |
1661 // TODO(chron): Add more unsanitized name tests. | 1662 // TODO(chron): Add more unsanitized name tests. |
1662 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) { | 1663 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) { |
1663 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1664 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1664 CHECK(dir.good()); | 1665 CHECK(dir.good()); |
1665 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10); | 1666 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10); |
1666 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10); | 1667 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10); |
1667 mock_server_->set_conflict_all_commits(true); | 1668 mock_server_->set_conflict_all_commits(true); |
1668 SyncShareAsDelegate(); | 1669 SyncShareAsDelegate(); |
1669 { | 1670 { |
1670 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1671 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1671 | 1672 |
1672 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 1673 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
1673 ASSERT_TRUE(A.good()); | 1674 ASSERT_TRUE(A.good()); |
1674 A.Put(IS_UNSYNCED, true); | 1675 A.Put(IS_UNSYNCED, true); |
1675 A.Put(IS_UNAPPLIED_UPDATE, true); | 1676 A.Put(IS_UNAPPLIED_UPDATE, true); |
1676 A.Put(SERVER_VERSION, 20); | 1677 A.Put(SERVER_VERSION, 20); |
1677 | 1678 |
1678 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); | 1679 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); |
1679 ASSERT_TRUE(B.good()); | 1680 ASSERT_TRUE(B.good()); |
1680 B.Put(IS_UNAPPLIED_UPDATE, true); | 1681 B.Put(IS_UNAPPLIED_UPDATE, true); |
1681 B.Put(SERVER_VERSION, 20); | 1682 B.Put(SERVER_VERSION, 20); |
1682 } | 1683 } |
1683 LoopSyncShare(); | 1684 LoopSyncShare(); |
1684 saw_syncer_event_ = false; | 1685 saw_syncer_event_ = false; |
1685 mock_server_->set_conflict_all_commits(false); | 1686 mock_server_->set_conflict_all_commits(false); |
1686 | 1687 |
1687 { | 1688 { |
1688 ReadTransaction trans(dir, __FILE__, __LINE__); | 1689 ReadTransaction trans(dir, FROM_HERE); |
1689 | 1690 |
1690 Entry A(&trans, GET_BY_ID, ids_.FromNumber(1)); | 1691 Entry A(&trans, GET_BY_ID, ids_.FromNumber(1)); |
1691 ASSERT_TRUE(A.good()); | 1692 ASSERT_TRUE(A.good()); |
1692 EXPECT_TRUE(A.Get(IS_UNSYNCED) == false); | 1693 EXPECT_TRUE(A.Get(IS_UNSYNCED) == false); |
1693 EXPECT_TRUE(A.Get(IS_UNAPPLIED_UPDATE) == false); | 1694 EXPECT_TRUE(A.Get(IS_UNAPPLIED_UPDATE) == false); |
1694 EXPECT_TRUE(A.Get(SERVER_VERSION) == 20); | 1695 EXPECT_TRUE(A.Get(SERVER_VERSION) == 20); |
1695 | 1696 |
1696 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); | 1697 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); |
1697 ASSERT_TRUE(B.good()); | 1698 ASSERT_TRUE(B.good()); |
1698 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false); | 1699 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false); |
1699 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false); | 1700 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false); |
1700 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20); | 1701 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20); |
1701 } | 1702 } |
1702 } | 1703 } |
1703 | 1704 |
1704 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) { | 1705 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) { |
1705 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1706 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1706 CHECK(dir.good()); | 1707 CHECK(dir.good()); |
1707 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); | 1708 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); |
1708 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); | 1709 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); |
1709 mock_server_->set_conflict_all_commits(true); | 1710 mock_server_->set_conflict_all_commits(true); |
1710 SyncShareAsDelegate(); | 1711 SyncShareAsDelegate(); |
1711 { | 1712 { |
1712 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1713 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1713 | 1714 |
1714 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 1715 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
1715 ASSERT_TRUE(A.good()); | 1716 ASSERT_TRUE(A.good()); |
1716 A.Put(IS_UNSYNCED, true); | 1717 A.Put(IS_UNSYNCED, true); |
1717 A.Put(IS_UNAPPLIED_UPDATE, true); | 1718 A.Put(IS_UNAPPLIED_UPDATE, true); |
1718 A.Put(SERVER_VERSION, 20); | 1719 A.Put(SERVER_VERSION, 20); |
1719 | 1720 |
1720 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); | 1721 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); |
1721 ASSERT_TRUE(B.good()); | 1722 ASSERT_TRUE(B.good()); |
1722 B.Put(IS_UNAPPLIED_UPDATE, true); | 1723 B.Put(IS_UNAPPLIED_UPDATE, true); |
1723 B.Put(SERVER_VERSION, 20); | 1724 B.Put(SERVER_VERSION, 20); |
1724 } | 1725 } |
1725 LoopSyncShare(); | 1726 LoopSyncShare(); |
1726 saw_syncer_event_ = false; | 1727 saw_syncer_event_ = false; |
1727 mock_server_->set_conflict_all_commits(false); | 1728 mock_server_->set_conflict_all_commits(false); |
1728 | 1729 |
1729 { | 1730 { |
1730 ReadTransaction trans(dir, __FILE__, __LINE__); | 1731 ReadTransaction trans(dir, FROM_HERE); |
1731 | 1732 |
1732 Entry A(&trans, GET_BY_ID, ids_.FromNumber(1)); | 1733 Entry A(&trans, GET_BY_ID, ids_.FromNumber(1)); |
1733 ASSERT_TRUE(A.good()); | 1734 ASSERT_TRUE(A.good()); |
1734 EXPECT_TRUE(A.Get(IS_UNSYNCED) == false); | 1735 EXPECT_TRUE(A.Get(IS_UNSYNCED) == false); |
1735 EXPECT_TRUE(A.Get(IS_UNAPPLIED_UPDATE) == false); | 1736 EXPECT_TRUE(A.Get(IS_UNAPPLIED_UPDATE) == false); |
1736 EXPECT_TRUE(A.Get(SERVER_VERSION) == 20); | 1737 EXPECT_TRUE(A.Get(SERVER_VERSION) == 20); |
1737 | 1738 |
1738 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); | 1739 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); |
1739 ASSERT_TRUE(B.good()); | 1740 ASSERT_TRUE(B.good()); |
1740 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false); | 1741 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false); |
1741 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false); | 1742 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false); |
1742 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20); | 1743 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20); |
1743 } | 1744 } |
1744 } | 1745 } |
1745 | 1746 |
1746 TEST_F(SyncerTest, ReverseFolderOrderingTest) { | 1747 TEST_F(SyncerTest, ReverseFolderOrderingTest) { |
1747 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1748 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1748 ASSERT_TRUE(dir.good()); | 1749 ASSERT_TRUE(dir.good()); |
1749 mock_server_->AddUpdateDirectory(4, 3, "ggchild", 10, 10); | 1750 mock_server_->AddUpdateDirectory(4, 3, "ggchild", 10, 10); |
1750 mock_server_->AddUpdateDirectory(3, 2, "gchild", 10, 10); | 1751 mock_server_->AddUpdateDirectory(3, 2, "gchild", 10, 10); |
1751 mock_server_->AddUpdateDirectory(5, 4, "gggchild", 10, 10); | 1752 mock_server_->AddUpdateDirectory(5, 4, "gggchild", 10, 10); |
1752 mock_server_->AddUpdateDirectory(2, 1, "child", 10, 10); | 1753 mock_server_->AddUpdateDirectory(2, 1, "child", 10, 10); |
1753 mock_server_->AddUpdateDirectory(1, 0, "parent", 10, 10); | 1754 mock_server_->AddUpdateDirectory(1, 0, "parent", 10, 10); |
1754 LoopSyncShare(); | 1755 LoopSyncShare(); |
1755 ReadTransaction trans(dir, __FILE__, __LINE__); | 1756 ReadTransaction trans(dir, FROM_HERE); |
1756 | 1757 |
1757 Id child_id = GetOnlyEntryWithName( | 1758 Id child_id = GetOnlyEntryWithName( |
1758 &trans, ids_.FromNumber(4), "gggchild"); | 1759 &trans, ids_.FromNumber(4), "gggchild"); |
1759 Entry child(&trans, GET_BY_ID, child_id); | 1760 Entry child(&trans, GET_BY_ID, child_id); |
1760 ASSERT_TRUE(child.good()); | 1761 ASSERT_TRUE(child.good()); |
1761 } | 1762 } |
1762 | 1763 |
1763 class EntryCreatedInNewFolderTest : public SyncerTest { | 1764 class EntryCreatedInNewFolderTest : public SyncerTest { |
1764 public: | 1765 public: |
1765 void CreateFolderInBob() { | 1766 void CreateFolderInBob() { |
1766 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1767 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1767 CHECK(dir.good()); | 1768 CHECK(dir.good()); |
1768 | 1769 |
1769 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1770 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1770 MutableEntry bob(&trans, | 1771 MutableEntry bob(&trans, |
1771 syncable::GET_BY_ID, | 1772 syncable::GET_BY_ID, |
1772 GetOnlyEntryWithName(&trans, | 1773 GetOnlyEntryWithName(&trans, |
1773 TestIdFactory::root(), | 1774 TestIdFactory::root(), |
1774 "bob")); | 1775 "bob")); |
1775 CHECK(bob.good()); | 1776 CHECK(bob.good()); |
1776 | 1777 |
1777 MutableEntry entry2(&trans, syncable::CREATE, bob.Get(syncable::ID), | 1778 MutableEntry entry2(&trans, syncable::CREATE, bob.Get(syncable::ID), |
1778 "bob"); | 1779 "bob"); |
1779 CHECK(entry2.good()); | 1780 CHECK(entry2.good()); |
1780 entry2.Put(syncable::IS_DIR, true); | 1781 entry2.Put(syncable::IS_DIR, true); |
1781 entry2.Put(syncable::IS_UNSYNCED, true); | 1782 entry2.Put(syncable::IS_UNSYNCED, true); |
1782 entry2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1783 entry2.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1783 } | 1784 } |
1784 }; | 1785 }; |
1785 | 1786 |
1786 TEST_F(EntryCreatedInNewFolderTest, EntryCreatedInNewFolderMidSync) { | 1787 TEST_F(EntryCreatedInNewFolderTest, EntryCreatedInNewFolderMidSync) { |
1787 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1788 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1788 ASSERT_TRUE(dir.good()); | 1789 ASSERT_TRUE(dir.good()); |
1789 dir->set_store_birthday(mock_server_->store_birthday()); | 1790 dir->set_store_birthday(mock_server_->store_birthday()); |
1790 { | 1791 { |
1791 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1792 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1792 MutableEntry entry(&trans, syncable::CREATE, trans.root_id(), | 1793 MutableEntry entry(&trans, syncable::CREATE, trans.root_id(), |
1793 "bob"); | 1794 "bob"); |
1794 ASSERT_TRUE(entry.good()); | 1795 ASSERT_TRUE(entry.good()); |
1795 entry.Put(syncable::IS_DIR, true); | 1796 entry.Put(syncable::IS_DIR, true); |
1796 entry.Put(syncable::IS_UNSYNCED, true); | 1797 entry.Put(syncable::IS_UNSYNCED, true); |
1797 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1798 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1798 } | 1799 } |
1799 | 1800 |
1800 mock_server_->SetMidCommitCallback( | 1801 mock_server_->SetMidCommitCallback( |
1801 NewCallback<EntryCreatedInNewFolderTest>(this, | 1802 NewCallback<EntryCreatedInNewFolderTest>(this, |
1802 &EntryCreatedInNewFolderTest::CreateFolderInBob)); | 1803 &EntryCreatedInNewFolderTest::CreateFolderInBob)); |
1803 syncer_->SyncShare(session_.get(), BUILD_COMMIT_REQUEST, SYNCER_END); | 1804 syncer_->SyncShare(session_.get(), BUILD_COMMIT_REQUEST, SYNCER_END); |
1804 EXPECT_TRUE(1 == mock_server_->committed_ids().size()); | 1805 EXPECT_TRUE(1 == mock_server_->committed_ids().size()); |
1805 { | 1806 { |
1806 ReadTransaction trans(dir, __FILE__, __LINE__); | 1807 ReadTransaction trans(dir, FROM_HERE); |
1807 Entry parent_entry(&trans, syncable::GET_BY_ID, | 1808 Entry parent_entry(&trans, syncable::GET_BY_ID, |
1808 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "bob")); | 1809 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "bob")); |
1809 ASSERT_TRUE(parent_entry.good()); | 1810 ASSERT_TRUE(parent_entry.good()); |
1810 | 1811 |
1811 Id child_id = | 1812 Id child_id = |
1812 GetOnlyEntryWithName(&trans, parent_entry.Get(ID), "bob"); | 1813 GetOnlyEntryWithName(&trans, parent_entry.Get(ID), "bob"); |
1813 Entry child(&trans, syncable::GET_BY_ID, child_id); | 1814 Entry child(&trans, syncable::GET_BY_ID, child_id); |
1814 ASSERT_TRUE(child.good()); | 1815 ASSERT_TRUE(child.good()); |
1815 EXPECT_EQ(parent_entry.Get(ID), child.Get(PARENT_ID)); | 1816 EXPECT_EQ(parent_entry.Get(ID), child.Get(PARENT_ID)); |
1816 } | 1817 } |
1817 } | 1818 } |
1818 | 1819 |
1819 TEST_F(SyncerTest, NegativeIDInUpdate) { | 1820 TEST_F(SyncerTest, NegativeIDInUpdate) { |
1820 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1821 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1821 CHECK(dir.good()); | 1822 CHECK(dir.good()); |
1822 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40); | 1823 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40); |
1823 SyncShareAsDelegate(); | 1824 SyncShareAsDelegate(); |
1824 // The negative id would make us CHECK! | 1825 // The negative id would make us CHECK! |
1825 } | 1826 } |
1826 | 1827 |
1827 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) { | 1828 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) { |
1828 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1829 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1829 CHECK(dir.good()); | 1830 CHECK(dir.good()); |
1830 | 1831 |
1831 int64 metahandle_fred; | 1832 int64 metahandle_fred; |
1832 { | 1833 { |
1833 // Create an item. | 1834 // Create an item. |
1834 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1835 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1835 MutableEntry fred_match(&trans, CREATE, trans.root_id(), | 1836 MutableEntry fred_match(&trans, CREATE, trans.root_id(), |
1836 "fred_match"); | 1837 "fred_match"); |
1837 ASSERT_TRUE(fred_match.good()); | 1838 ASSERT_TRUE(fred_match.good()); |
1838 metahandle_fred = fred_match.Get(META_HANDLE); | 1839 metahandle_fred = fred_match.Get(META_HANDLE); |
1839 WriteTestDataToEntry(&trans, &fred_match); | 1840 WriteTestDataToEntry(&trans, &fred_match); |
1840 } | 1841 } |
1841 // Commit it. | 1842 // Commit it. |
1842 SyncShareAsDelegate(); | 1843 SyncShareAsDelegate(); |
1843 EXPECT_TRUE(1 == mock_server_->committed_ids().size()); | 1844 EXPECT_TRUE(1 == mock_server_->committed_ids().size()); |
1844 mock_server_->set_conflict_all_commits(true); | 1845 mock_server_->set_conflict_all_commits(true); |
1845 syncable::Id fred_match_id; | 1846 syncable::Id fred_match_id; |
1846 { | 1847 { |
1847 // Now receive a change from outside. | 1848 // Now receive a change from outside. |
1848 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1849 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
1849 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred); | 1850 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred); |
1850 ASSERT_TRUE(fred_match.good()); | 1851 ASSERT_TRUE(fred_match.good()); |
1851 EXPECT_TRUE(fred_match.Get(ID).ServerKnows()); | 1852 EXPECT_TRUE(fred_match.Get(ID).ServerKnows()); |
1852 fred_match_id = fred_match.Get(ID); | 1853 fred_match_id = fred_match.Get(ID); |
1853 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(), | 1854 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(), |
1854 "fred_match", 40, 40); | 1855 "fred_match", 40, 40); |
1855 } | 1856 } |
1856 // Run the syncer. | 1857 // Run the syncer. |
1857 for (int i = 0 ; i < 30 ; ++i) { | 1858 for (int i = 0 ; i < 30 ; ++i) { |
1858 SyncShareAsDelegate(); | 1859 SyncShareAsDelegate(); |
1859 } | 1860 } |
1860 } | 1861 } |
1861 | 1862 |
1862 /** | 1863 /** |
1863 * In the event that we have a double changed entry, that is changed on both | 1864 * In the event that we have a double changed entry, that is changed on both |
1864 * the client and the server, the conflict resolver should just drop one of | 1865 * the client and the server, the conflict resolver should just drop one of |
1865 * them and accept the other. | 1866 * them and accept the other. |
1866 */ | 1867 */ |
1867 | 1868 |
1868 TEST_F(SyncerTest, DoublyChangedWithResolver) { | 1869 TEST_F(SyncerTest, DoublyChangedWithResolver) { |
1869 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1870 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1870 CHECK(dir.good()); | 1871 CHECK(dir.good()); |
1871 { | 1872 { |
1872 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1873 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1873 MutableEntry parent(&wtrans, syncable::CREATE, root_id_, "Folder"); | 1874 MutableEntry parent(&wtrans, syncable::CREATE, root_id_, "Folder"); |
1874 ASSERT_TRUE(parent.good()); | 1875 ASSERT_TRUE(parent.good()); |
1875 parent.Put(syncable::IS_DIR, true); | 1876 parent.Put(syncable::IS_DIR, true); |
1876 parent.Put(syncable::ID, parent_id_); | 1877 parent.Put(syncable::ID, parent_id_); |
1877 parent.Put(syncable::BASE_VERSION, 5); | 1878 parent.Put(syncable::BASE_VERSION, 5); |
1878 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1879 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1879 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete.htm"); | 1880 MutableEntry child(&wtrans, syncable::CREATE, parent_id_, "Pete.htm"); |
1880 ASSERT_TRUE(child.good()); | 1881 ASSERT_TRUE(child.good()); |
1881 child.Put(syncable::ID, child_id_); | 1882 child.Put(syncable::ID, child_id_); |
1882 child.Put(syncable::BASE_VERSION, 10); | 1883 child.Put(syncable::BASE_VERSION, 10); |
1883 WriteTestDataToEntry(&wtrans, &child); | 1884 WriteTestDataToEntry(&wtrans, &child); |
1884 } | 1885 } |
1885 mock_server_->AddUpdateBookmark(child_id_, parent_id_, "Pete2.htm", 11, 10); | 1886 mock_server_->AddUpdateBookmark(child_id_, parent_id_, "Pete2.htm", 11, 10); |
1886 mock_server_->set_conflict_all_commits(true); | 1887 mock_server_->set_conflict_all_commits(true); |
1887 LoopSyncShare(); | 1888 LoopSyncShare(); |
1888 syncable::Directory::ChildHandles children; | 1889 syncable::Directory::ChildHandles children; |
1889 { | 1890 { |
1890 ReadTransaction trans(dir, __FILE__, __LINE__); | 1891 ReadTransaction trans(dir, FROM_HERE); |
1891 dir->GetChildHandlesById(&trans, parent_id_, &children); | 1892 dir->GetChildHandlesById(&trans, parent_id_, &children); |
1892 // We expect the conflict resolver to preserve the local entry. | 1893 // We expect the conflict resolver to preserve the local entry. |
1893 Entry child(&trans, syncable::GET_BY_ID, child_id_); | 1894 Entry child(&trans, syncable::GET_BY_ID, child_id_); |
1894 ASSERT_TRUE(child.good()); | 1895 ASSERT_TRUE(child.good()); |
1895 EXPECT_TRUE(child.Get(syncable::IS_UNSYNCED)); | 1896 EXPECT_TRUE(child.Get(syncable::IS_UNSYNCED)); |
1896 EXPECT_FALSE(child.Get(syncable::IS_UNAPPLIED_UPDATE)); | 1897 EXPECT_FALSE(child.Get(syncable::IS_UNAPPLIED_UPDATE)); |
1897 EXPECT_TRUE(child.Get(SPECIFICS).HasExtension(sync_pb::bookmark)); | 1898 EXPECT_TRUE(child.Get(SPECIFICS).HasExtension(sync_pb::bookmark)); |
1898 EXPECT_EQ("Pete.htm", child.Get(NON_UNIQUE_NAME)); | 1899 EXPECT_EQ("Pete.htm", child.Get(NON_UNIQUE_NAME)); |
1899 VerifyTestBookmarkDataInEntry(&child); | 1900 VerifyTestBookmarkDataInEntry(&child); |
1900 } | 1901 } |
1901 | 1902 |
1902 // Only one entry, since we just overwrite one. | 1903 // Only one entry, since we just overwrite one. |
1903 EXPECT_TRUE(1 == children.size()); | 1904 EXPECT_TRUE(1 == children.size()); |
1904 saw_syncer_event_ = false; | 1905 saw_syncer_event_ = false; |
1905 } | 1906 } |
1906 | 1907 |
1907 // We got this repro case when someone was editing bookmarks while sync was | 1908 // We got this repro case when someone was editing bookmarks while sync was |
1908 // occuring. The entry had changed out underneath the user. | 1909 // occuring. The entry had changed out underneath the user. |
1909 TEST_F(SyncerTest, CommitsUpdateDoesntAlterEntry) { | 1910 TEST_F(SyncerTest, CommitsUpdateDoesntAlterEntry) { |
1910 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1911 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1911 CHECK(dir.good()); | 1912 CHECK(dir.good()); |
1912 int64 test_time = 123456; | 1913 int64 test_time = 123456; |
1913 int64 entry_metahandle; | 1914 int64 entry_metahandle; |
1914 { | 1915 { |
1915 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1916 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1916 MutableEntry entry(&wtrans, syncable::CREATE, root_id_, "Pete"); | 1917 MutableEntry entry(&wtrans, syncable::CREATE, root_id_, "Pete"); |
1917 ASSERT_TRUE(entry.good()); | 1918 ASSERT_TRUE(entry.good()); |
1918 EXPECT_FALSE(entry.Get(ID).ServerKnows()); | 1919 EXPECT_FALSE(entry.Get(ID).ServerKnows()); |
1919 entry.Put(syncable::IS_DIR, true); | 1920 entry.Put(syncable::IS_DIR, true); |
1920 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 1921 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
1921 entry.Put(syncable::IS_UNSYNCED, true); | 1922 entry.Put(syncable::IS_UNSYNCED, true); |
1922 entry.Put(syncable::MTIME, test_time); | 1923 entry.Put(syncable::MTIME, test_time); |
1923 entry_metahandle = entry.Get(META_HANDLE); | 1924 entry_metahandle = entry.Get(META_HANDLE); |
1924 } | 1925 } |
1925 SyncShareAsDelegate(); | 1926 SyncShareAsDelegate(); |
1926 syncable::Id id; | 1927 syncable::Id id; |
1927 int64 version; | 1928 int64 version; |
1928 int64 server_position_in_parent; | 1929 int64 server_position_in_parent; |
1929 { | 1930 { |
1930 ReadTransaction trans(dir, __FILE__, __LINE__); | 1931 ReadTransaction trans(dir, FROM_HERE); |
1931 Entry entry(&trans, syncable::GET_BY_HANDLE, entry_metahandle); | 1932 Entry entry(&trans, syncable::GET_BY_HANDLE, entry_metahandle); |
1932 ASSERT_TRUE(entry.good()); | 1933 ASSERT_TRUE(entry.good()); |
1933 id = entry.Get(ID); | 1934 id = entry.Get(ID); |
1934 EXPECT_TRUE(id.ServerKnows()); | 1935 EXPECT_TRUE(id.ServerKnows()); |
1935 version = entry.Get(BASE_VERSION); | 1936 version = entry.Get(BASE_VERSION); |
1936 server_position_in_parent = entry.Get(SERVER_POSITION_IN_PARENT); | 1937 server_position_in_parent = entry.Get(SERVER_POSITION_IN_PARENT); |
1937 } | 1938 } |
1938 sync_pb::SyncEntity* update = mock_server_->AddUpdateFromLastCommit(); | 1939 sync_pb::SyncEntity* update = mock_server_->AddUpdateFromLastCommit(); |
1939 EXPECT_EQ("Pete", update->name()); | 1940 EXPECT_EQ("Pete", update->name()); |
1940 EXPECT_EQ(id.GetServerId(), update->id_string()); | 1941 EXPECT_EQ(id.GetServerId(), update->id_string()); |
1941 EXPECT_EQ(root_id_.GetServerId(), update->parent_id_string()); | 1942 EXPECT_EQ(root_id_.GetServerId(), update->parent_id_string()); |
1942 EXPECT_EQ(version, update->version()); | 1943 EXPECT_EQ(version, update->version()); |
1943 EXPECT_EQ(server_position_in_parent, update->position_in_parent()); | 1944 EXPECT_EQ(server_position_in_parent, update->position_in_parent()); |
1944 SyncShareAsDelegate(); | 1945 SyncShareAsDelegate(); |
1945 { | 1946 { |
1946 ReadTransaction trans(dir, __FILE__, __LINE__); | 1947 ReadTransaction trans(dir, FROM_HERE); |
1947 Entry entry(&trans, syncable::GET_BY_ID, id); | 1948 Entry entry(&trans, syncable::GET_BY_ID, id); |
1948 ASSERT_TRUE(entry.good()); | 1949 ASSERT_TRUE(entry.good()); |
1949 EXPECT_TRUE(entry.Get(MTIME) == test_time); | 1950 EXPECT_TRUE(entry.Get(MTIME) == test_time); |
1950 } | 1951 } |
1951 } | 1952 } |
1952 | 1953 |
1953 TEST_F(SyncerTest, ParentAndChildBothMatch) { | 1954 TEST_F(SyncerTest, ParentAndChildBothMatch) { |
1954 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 1955 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
1955 CHECK(dir.good()); | 1956 CHECK(dir.good()); |
1956 syncable::Id parent_id = ids_.NewServerId(); | 1957 syncable::Id parent_id = ids_.NewServerId(); |
1957 syncable::Id child_id = ids_.NewServerId(); | 1958 syncable::Id child_id = ids_.NewServerId(); |
1958 | 1959 |
1959 { | 1960 { |
1960 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 1961 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
1961 MutableEntry parent(&wtrans, CREATE, root_id_, "Folder"); | 1962 MutableEntry parent(&wtrans, CREATE, root_id_, "Folder"); |
1962 ASSERT_TRUE(parent.good()); | 1963 ASSERT_TRUE(parent.good()); |
1963 parent.Put(IS_DIR, true); | 1964 parent.Put(IS_DIR, true); |
1964 parent.Put(IS_UNSYNCED, true); | 1965 parent.Put(IS_UNSYNCED, true); |
1965 parent.Put(ID, parent_id); | 1966 parent.Put(ID, parent_id); |
1966 parent.Put(BASE_VERSION, 1); | 1967 parent.Put(BASE_VERSION, 1); |
1967 parent.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 1968 parent.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
1968 | 1969 |
1969 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "test.htm"); | 1970 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "test.htm"); |
1970 ASSERT_TRUE(child.good()); | 1971 ASSERT_TRUE(child.good()); |
1971 child.Put(ID, child_id); | 1972 child.Put(ID, child_id); |
1972 child.Put(BASE_VERSION, 1); | 1973 child.Put(BASE_VERSION, 1); |
1973 child.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 1974 child.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
1974 WriteTestDataToEntry(&wtrans, &child); | 1975 WriteTestDataToEntry(&wtrans, &child); |
1975 } | 1976 } |
1976 mock_server_->AddUpdateDirectory(parent_id, root_id_, "Folder", 10, 10); | 1977 mock_server_->AddUpdateDirectory(parent_id, root_id_, "Folder", 10, 10); |
1977 mock_server_->AddUpdateBookmark(child_id, parent_id, "test.htm", 10, 10); | 1978 mock_server_->AddUpdateBookmark(child_id, parent_id, "test.htm", 10, 10); |
1978 mock_server_->set_conflict_all_commits(true); | 1979 mock_server_->set_conflict_all_commits(true); |
1979 SyncShareAsDelegate(); | 1980 SyncShareAsDelegate(); |
1980 SyncShareAsDelegate(); | 1981 SyncShareAsDelegate(); |
1981 SyncShareAsDelegate(); | 1982 SyncShareAsDelegate(); |
1982 { | 1983 { |
1983 ReadTransaction trans(dir, __FILE__, __LINE__); | 1984 ReadTransaction trans(dir, FROM_HERE); |
1984 Directory::ChildHandles children; | 1985 Directory::ChildHandles children; |
1985 dir->GetChildHandlesById(&trans, root_id_, &children); | 1986 dir->GetChildHandlesById(&trans, root_id_, &children); |
1986 EXPECT_TRUE(1 == children.size()); | 1987 EXPECT_TRUE(1 == children.size()); |
1987 dir->GetChildHandlesById(&trans, parent_id, &children); | 1988 dir->GetChildHandlesById(&trans, parent_id, &children); |
1988 EXPECT_TRUE(1 == children.size()); | 1989 EXPECT_TRUE(1 == children.size()); |
1989 Directory::UnappliedUpdateMetaHandles unapplied; | 1990 Directory::UnappliedUpdateMetaHandles unapplied; |
1990 dir->GetUnappliedUpdateMetaHandles(&trans, &unapplied); | 1991 dir->GetUnappliedUpdateMetaHandles(&trans, &unapplied); |
1991 EXPECT_TRUE(0 == unapplied.size()); | 1992 EXPECT_TRUE(0 == unapplied.size()); |
1992 syncable::Directory::UnsyncedMetaHandles unsynced; | 1993 syncable::Directory::UnsyncedMetaHandles unsynced; |
1993 dir->GetUnsyncedMetaHandles(&trans, &unsynced); | 1994 dir->GetUnsyncedMetaHandles(&trans, &unsynced); |
1994 EXPECT_TRUE(0 == unsynced.size()); | 1995 EXPECT_TRUE(0 == unsynced.size()); |
1995 saw_syncer_event_ = false; | 1996 saw_syncer_event_ = false; |
1996 } | 1997 } |
1997 } | 1998 } |
1998 | 1999 |
1999 TEST_F(SyncerTest, CommittingNewDeleted) { | 2000 TEST_F(SyncerTest, CommittingNewDeleted) { |
2000 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2001 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2001 CHECK(dir.good()); | 2002 CHECK(dir.good()); |
2002 { | 2003 { |
2003 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2004 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2004 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob"); | 2005 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob"); |
2005 entry.Put(IS_UNSYNCED, true); | 2006 entry.Put(IS_UNSYNCED, true); |
2006 entry.Put(IS_DEL, true); | 2007 entry.Put(IS_DEL, true); |
2007 } | 2008 } |
2008 SyncShareAsDelegate(); | 2009 SyncShareAsDelegate(); |
2009 EXPECT_TRUE(0 == mock_server_->committed_ids().size()); | 2010 EXPECT_TRUE(0 == mock_server_->committed_ids().size()); |
2010 } | 2011 } |
2011 | 2012 |
2012 // Original problem synopsis: | 2013 // Original problem synopsis: |
2013 // Check failed: entry->Get(BASE_VERSION) <= entry->Get(SERVER_VERSION) | 2014 // Check failed: entry->Get(BASE_VERSION) <= entry->Get(SERVER_VERSION) |
2014 // Client creates entry, client finishes committing entry. Between | 2015 // Client creates entry, client finishes committing entry. Between |
2015 // commit and getting update back, we delete the entry. | 2016 // commit and getting update back, we delete the entry. |
2016 // We get the update for the entry, but the local one was modified | 2017 // We get the update for the entry, but the local one was modified |
2017 // so we store the entry but don't apply it. IS_UNAPPLIED_UPDATE is set. | 2018 // so we store the entry but don't apply it. IS_UNAPPLIED_UPDATE is set. |
2018 // We commit deletion and get a new version number. | 2019 // We commit deletion and get a new version number. |
2019 // We apply unapplied updates again before we get the update about the deletion. | 2020 // We apply unapplied updates again before we get the update about the deletion. |
2020 // This means we have an unapplied update where server_version < base_version. | 2021 // This means we have an unapplied update where server_version < base_version. |
2021 TEST_F(SyncerTest, UnappliedUpdateDuringCommit) { | 2022 TEST_F(SyncerTest, UnappliedUpdateDuringCommit) { |
2022 // This test is a little fake. | 2023 // This test is a little fake. |
2023 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2024 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2024 CHECK(dir.good()); | 2025 CHECK(dir.good()); |
2025 { | 2026 { |
2026 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2027 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2027 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob"); | 2028 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob"); |
2028 entry.Put(ID, ids_.FromNumber(20)); | 2029 entry.Put(ID, ids_.FromNumber(20)); |
2029 entry.Put(BASE_VERSION, 1); | 2030 entry.Put(BASE_VERSION, 1); |
2030 entry.Put(SERVER_VERSION, 1); | 2031 entry.Put(SERVER_VERSION, 1); |
2031 entry.Put(SERVER_PARENT_ID, ids_.FromNumber(9999)); // Bad parent. | 2032 entry.Put(SERVER_PARENT_ID, ids_.FromNumber(9999)); // Bad parent. |
2032 entry.Put(IS_UNSYNCED, true); | 2033 entry.Put(IS_UNSYNCED, true); |
2033 entry.Put(IS_UNAPPLIED_UPDATE, true); | 2034 entry.Put(IS_UNAPPLIED_UPDATE, true); |
2034 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2035 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2035 entry.Put(SERVER_SPECIFICS, DefaultBookmarkSpecifics()); | 2036 entry.Put(SERVER_SPECIFICS, DefaultBookmarkSpecifics()); |
2036 entry.Put(IS_DEL, false); | 2037 entry.Put(IS_DEL, false); |
(...skipping 14 matching lines...) Expand all Loading... |
2051 // remove bob | 2052 // remove bob |
2052 // remove fred | 2053 // remove fred |
2053 // if no syncing occured midway, bob will have an illegal parent | 2054 // if no syncing occured midway, bob will have an illegal parent |
2054 TEST_F(SyncerTest, DeletingEntryInFolder) { | 2055 TEST_F(SyncerTest, DeletingEntryInFolder) { |
2055 // This test is a little fake. | 2056 // This test is a little fake. |
2056 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2057 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2057 CHECK(dir.good()); | 2058 CHECK(dir.good()); |
2058 | 2059 |
2059 int64 existing_metahandle; | 2060 int64 existing_metahandle; |
2060 { | 2061 { |
2061 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2062 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2062 MutableEntry entry(&trans, CREATE, trans.root_id(), "existing"); | 2063 MutableEntry entry(&trans, CREATE, trans.root_id(), "existing"); |
2063 ASSERT_TRUE(entry.good()); | 2064 ASSERT_TRUE(entry.good()); |
2064 entry.Put(IS_DIR, true); | 2065 entry.Put(IS_DIR, true); |
2065 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2066 entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2066 entry.Put(IS_UNSYNCED, true); | 2067 entry.Put(IS_UNSYNCED, true); |
2067 existing_metahandle = entry.Get(META_HANDLE); | 2068 existing_metahandle = entry.Get(META_HANDLE); |
2068 } | 2069 } |
2069 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 2070 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
2070 { | 2071 { |
2071 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2072 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2072 MutableEntry newfolder(&trans, CREATE, trans.root_id(), "new"); | 2073 MutableEntry newfolder(&trans, CREATE, trans.root_id(), "new"); |
2073 ASSERT_TRUE(newfolder.good()); | 2074 ASSERT_TRUE(newfolder.good()); |
2074 newfolder.Put(IS_DIR, true); | 2075 newfolder.Put(IS_DIR, true); |
2075 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2076 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2076 newfolder.Put(IS_UNSYNCED, true); | 2077 newfolder.Put(IS_UNSYNCED, true); |
2077 | 2078 |
2078 MutableEntry existing(&trans, GET_BY_HANDLE, existing_metahandle); | 2079 MutableEntry existing(&trans, GET_BY_HANDLE, existing_metahandle); |
2079 ASSERT_TRUE(existing.good()); | 2080 ASSERT_TRUE(existing.good()); |
2080 existing.Put(PARENT_ID, newfolder.Get(ID)); | 2081 existing.Put(PARENT_ID, newfolder.Get(ID)); |
2081 existing.Put(IS_UNSYNCED, true); | 2082 existing.Put(IS_UNSYNCED, true); |
2082 EXPECT_TRUE(existing.Get(ID).ServerKnows()); | 2083 EXPECT_TRUE(existing.Get(ID).ServerKnows()); |
2083 | 2084 |
2084 newfolder.Put(IS_DEL, true); | 2085 newfolder.Put(IS_DEL, true); |
2085 existing.Put(IS_DEL, true); | 2086 existing.Put(IS_DEL, true); |
2086 } | 2087 } |
2087 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 2088 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
2088 StatusController* status(session_->status_controller()); | 2089 StatusController* status(session_->status_controller()); |
2089 EXPECT_TRUE(0 == status->error_counters().num_conflicting_commits); | 2090 EXPECT_TRUE(0 == status->error_counters().num_conflicting_commits); |
2090 } | 2091 } |
2091 | 2092 |
2092 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) { | 2093 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) { |
2093 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2094 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2094 CHECK(dir.good()); | 2095 CHECK(dir.good()); |
2095 int64 newfolder_metahandle; | 2096 int64 newfolder_metahandle; |
2096 | 2097 |
2097 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2098 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2098 SyncShareAsDelegate(); | 2099 SyncShareAsDelegate(); |
2099 { | 2100 { |
2100 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2101 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2101 MutableEntry newfolder(&trans, CREATE, ids_.FromNumber(1), "local"); | 2102 MutableEntry newfolder(&trans, CREATE, ids_.FromNumber(1), "local"); |
2102 ASSERT_TRUE(newfolder.good()); | 2103 ASSERT_TRUE(newfolder.good()); |
2103 newfolder.Put(IS_UNSYNCED, true); | 2104 newfolder.Put(IS_UNSYNCED, true); |
2104 newfolder.Put(IS_DIR, true); | 2105 newfolder.Put(IS_DIR, true); |
2105 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2106 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2106 newfolder_metahandle = newfolder.Get(META_HANDLE); | 2107 newfolder_metahandle = newfolder.Get(META_HANDLE); |
2107 } | 2108 } |
2108 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20); | 2109 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20); |
2109 mock_server_->SetLastUpdateDeleted(); | 2110 mock_server_->SetLastUpdateDeleted(); |
2110 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, APPLY_UPDATES); | 2111 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, APPLY_UPDATES); |
2111 { | 2112 { |
2112 ReadTransaction trans(dir, __FILE__, __LINE__); | 2113 ReadTransaction trans(dir, FROM_HERE); |
2113 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle); | 2114 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle); |
2114 ASSERT_TRUE(entry.good()); | 2115 ASSERT_TRUE(entry.good()); |
2115 } | 2116 } |
2116 } | 2117 } |
2117 | 2118 |
2118 TEST_F(SyncerTest, FolderSwapUpdate) { | 2119 TEST_F(SyncerTest, FolderSwapUpdate) { |
2119 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2120 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2120 CHECK(dir.good()); | 2121 CHECK(dir.good()); |
2121 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); | 2122 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); |
2122 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); | 2123 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); |
2123 SyncShareAsDelegate(); | 2124 SyncShareAsDelegate(); |
2124 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); | 2125 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); |
2125 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); | 2126 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); |
2126 SyncShareAsDelegate(); | 2127 SyncShareAsDelegate(); |
2127 { | 2128 { |
2128 ReadTransaction trans(dir, __FILE__, __LINE__); | 2129 ReadTransaction trans(dir, FROM_HERE); |
2129 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); | 2130 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); |
2130 ASSERT_TRUE(id1.good()); | 2131 ASSERT_TRUE(id1.good()); |
2131 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); | 2132 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); |
2132 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); | 2133 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); |
2133 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); | 2134 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); |
2134 ASSERT_TRUE(id2.good()); | 2135 ASSERT_TRUE(id2.good()); |
2135 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); | 2136 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); |
2136 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); | 2137 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); |
2137 } | 2138 } |
2138 saw_syncer_event_ = false; | 2139 saw_syncer_event_ = false; |
2139 } | 2140 } |
2140 | 2141 |
2141 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) { | 2142 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) { |
2142 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2143 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2143 CHECK(dir.good()); | 2144 CHECK(dir.good()); |
2144 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); | 2145 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); |
2145 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); | 2146 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); |
2146 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10); | 2147 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10); |
2147 SyncShareAsDelegate(); | 2148 SyncShareAsDelegate(); |
2148 { | 2149 { |
2149 ReadTransaction trans(dir, __FILE__, __LINE__); | 2150 ReadTransaction trans(dir, FROM_HERE); |
2150 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); | 2151 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); |
2151 ASSERT_TRUE(id1.good()); | 2152 ASSERT_TRUE(id1.good()); |
2152 EXPECT_TRUE("bob" == id1.Get(NON_UNIQUE_NAME)); | 2153 EXPECT_TRUE("bob" == id1.Get(NON_UNIQUE_NAME)); |
2153 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); | 2154 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); |
2154 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); | 2155 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); |
2155 ASSERT_TRUE(id2.good()); | 2156 ASSERT_TRUE(id2.good()); |
2156 EXPECT_TRUE("fred" == id2.Get(NON_UNIQUE_NAME)); | 2157 EXPECT_TRUE("fred" == id2.Get(NON_UNIQUE_NAME)); |
2157 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); | 2158 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); |
2158 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); | 2159 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); |
2159 ASSERT_TRUE(id3.good()); | 2160 ASSERT_TRUE(id3.good()); |
2160 EXPECT_TRUE("alice" == id3.Get(NON_UNIQUE_NAME)); | 2161 EXPECT_TRUE("alice" == id3.Get(NON_UNIQUE_NAME)); |
2161 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID)); | 2162 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID)); |
2162 } | 2163 } |
2163 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); | 2164 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); |
2164 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); | 2165 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); |
2165 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20); | 2166 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20); |
2166 SyncShareAsDelegate(); | 2167 SyncShareAsDelegate(); |
2167 { | 2168 { |
2168 ReadTransaction trans(dir, __FILE__, __LINE__); | 2169 ReadTransaction trans(dir, FROM_HERE); |
2169 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); | 2170 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); |
2170 ASSERT_TRUE(id1.good()); | 2171 ASSERT_TRUE(id1.good()); |
2171 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); | 2172 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); |
2172 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); | 2173 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); |
2173 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); | 2174 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); |
2174 ASSERT_TRUE(id2.good()); | 2175 ASSERT_TRUE(id2.good()); |
2175 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); | 2176 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); |
2176 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); | 2177 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); |
2177 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); | 2178 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); |
2178 ASSERT_TRUE(id3.good()); | 2179 ASSERT_TRUE(id3.good()); |
2179 EXPECT_TRUE("bob" == id3.Get(NON_UNIQUE_NAME)); | 2180 EXPECT_TRUE("bob" == id3.Get(NON_UNIQUE_NAME)); |
2180 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID)); | 2181 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID)); |
2181 } | 2182 } |
2182 saw_syncer_event_ = false; | 2183 saw_syncer_event_ = false; |
2183 } | 2184 } |
2184 | 2185 |
2185 TEST_F(SyncerTest, CommitManyItemsInOneGo) { | 2186 TEST_F(SyncerTest, CommitManyItemsInOneGo) { |
2186 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2187 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2187 uint32 max_batches = 3; | 2188 uint32 max_batches = 3; |
2188 uint32 items_to_commit = kDefaultMaxCommitBatchSize * max_batches; | 2189 uint32 items_to_commit = kDefaultMaxCommitBatchSize * max_batches; |
2189 CHECK(dir.good()); | 2190 CHECK(dir.good()); |
2190 { | 2191 { |
2191 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2192 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2192 for (uint32 i = 0; i < items_to_commit; i++) { | 2193 for (uint32 i = 0; i < items_to_commit; i++) { |
2193 string nameutf8 = base::StringPrintf("%d", i); | 2194 string nameutf8 = base::StringPrintf("%d", i); |
2194 string name(nameutf8.begin(), nameutf8.end()); | 2195 string name(nameutf8.begin(), nameutf8.end()); |
2195 MutableEntry e(&trans, CREATE, trans.root_id(), name); | 2196 MutableEntry e(&trans, CREATE, trans.root_id(), name); |
2196 e.Put(IS_UNSYNCED, true); | 2197 e.Put(IS_UNSYNCED, true); |
2197 e.Put(IS_DIR, true); | 2198 e.Put(IS_DIR, true); |
2198 e.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2199 e.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2199 } | 2200 } |
2200 } | 2201 } |
2201 uint32 num_loops = 0; | 2202 uint32 num_loops = 0; |
2202 while (SyncShareAsDelegate()) { | 2203 while (SyncShareAsDelegate()) { |
2203 num_loops++; | 2204 num_loops++; |
2204 ASSERT_LT(num_loops, max_batches * 2); | 2205 ASSERT_LT(num_loops, max_batches * 2); |
2205 } | 2206 } |
2206 EXPECT_GE(mock_server_->commit_messages().size(), max_batches); | 2207 EXPECT_GE(mock_server_->commit_messages().size(), max_batches); |
2207 } | 2208 } |
2208 | 2209 |
2209 TEST_F(SyncerTest, HugeConflict) { | 2210 TEST_F(SyncerTest, HugeConflict) { |
2210 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2211 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2211 int item_count = 300; // We should be able to do 300 or 3000 w/o issue. | 2212 int item_count = 300; // We should be able to do 300 or 3000 w/o issue. |
2212 CHECK(dir.good()); | 2213 CHECK(dir.good()); |
2213 | 2214 |
2214 syncable::Id parent_id = ids_.NewServerId(); | 2215 syncable::Id parent_id = ids_.NewServerId(); |
2215 syncable::Id last_id = parent_id; | 2216 syncable::Id last_id = parent_id; |
2216 vector<syncable::Id> tree_ids; | 2217 vector<syncable::Id> tree_ids; |
2217 | 2218 |
2218 // Create a lot of updates for which the parent does not exist yet. | 2219 // Create a lot of updates for which the parent does not exist yet. |
2219 // Generate a huge deep tree which should all fail to apply at first. | 2220 // Generate a huge deep tree which should all fail to apply at first. |
2220 { | 2221 { |
2221 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2222 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2222 for (int i = 0; i < item_count ; i++) { | 2223 for (int i = 0; i < item_count ; i++) { |
2223 syncable::Id next_id = ids_.NewServerId(); | 2224 syncable::Id next_id = ids_.NewServerId(); |
2224 tree_ids.push_back(next_id); | 2225 tree_ids.push_back(next_id); |
2225 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20); | 2226 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20); |
2226 last_id = next_id; | 2227 last_id = next_id; |
2227 } | 2228 } |
2228 } | 2229 } |
2229 SyncShareAsDelegate(); | 2230 SyncShareAsDelegate(); |
2230 | 2231 |
2231 // Check they're in the expected conflict state. | 2232 // Check they're in the expected conflict state. |
2232 { | 2233 { |
2233 ReadTransaction trans(dir, __FILE__, __LINE__); | 2234 ReadTransaction trans(dir, FROM_HERE); |
2234 for (int i = 0; i < item_count; i++) { | 2235 for (int i = 0; i < item_count; i++) { |
2235 Entry e(&trans, GET_BY_ID, tree_ids[i]); | 2236 Entry e(&trans, GET_BY_ID, tree_ids[i]); |
2236 // They should all exist but none should be applied. | 2237 // They should all exist but none should be applied. |
2237 ASSERT_TRUE(e.good()); | 2238 ASSERT_TRUE(e.good()); |
2238 EXPECT_TRUE(e.Get(IS_DEL)); | 2239 EXPECT_TRUE(e.Get(IS_DEL)); |
2239 EXPECT_TRUE(e.Get(IS_UNAPPLIED_UPDATE)); | 2240 EXPECT_TRUE(e.Get(IS_UNAPPLIED_UPDATE)); |
2240 } | 2241 } |
2241 } | 2242 } |
2242 | 2243 |
2243 // Add the missing parent directory. | 2244 // Add the missing parent directory. |
2244 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(), | 2245 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(), |
2245 "BOB", 2, 20); | 2246 "BOB", 2, 20); |
2246 SyncShareAsDelegate(); | 2247 SyncShareAsDelegate(); |
2247 | 2248 |
2248 // Now they should all be OK. | 2249 // Now they should all be OK. |
2249 { | 2250 { |
2250 ReadTransaction trans(dir, __FILE__, __LINE__); | 2251 ReadTransaction trans(dir, FROM_HERE); |
2251 for (int i = 0; i < item_count; i++) { | 2252 for (int i = 0; i < item_count; i++) { |
2252 Entry e(&trans, GET_BY_ID, tree_ids[i]); | 2253 Entry e(&trans, GET_BY_ID, tree_ids[i]); |
2253 ASSERT_TRUE(e.good()); | 2254 ASSERT_TRUE(e.good()); |
2254 EXPECT_FALSE(e.Get(IS_DEL)); | 2255 EXPECT_FALSE(e.Get(IS_DEL)); |
2255 EXPECT_FALSE(e.Get(IS_UNAPPLIED_UPDATE)); | 2256 EXPECT_FALSE(e.Get(IS_UNAPPLIED_UPDATE)); |
2256 } | 2257 } |
2257 } | 2258 } |
2258 } | 2259 } |
2259 | 2260 |
2260 TEST_F(SyncerTest, DontCrashOnCaseChange) { | 2261 TEST_F(SyncerTest, DontCrashOnCaseChange) { |
2261 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2262 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2262 CHECK(dir.good()); | 2263 CHECK(dir.good()); |
2263 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2264 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2264 SyncShareAsDelegate(); | 2265 SyncShareAsDelegate(); |
2265 { | 2266 { |
2266 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2267 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2267 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2268 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2268 ASSERT_TRUE(e.good()); | 2269 ASSERT_TRUE(e.good()); |
2269 e.Put(IS_UNSYNCED, true); | 2270 e.Put(IS_UNSYNCED, true); |
2270 } | 2271 } |
2271 mock_server_->set_conflict_all_commits(true); | 2272 mock_server_->set_conflict_all_commits(true); |
2272 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20); | 2273 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20); |
2273 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT | 2274 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT |
2274 saw_syncer_event_ = false; | 2275 saw_syncer_event_ = false; |
2275 } | 2276 } |
2276 | 2277 |
2277 TEST_F(SyncerTest, UnsyncedItemAndUpdate) { | 2278 TEST_F(SyncerTest, UnsyncedItemAndUpdate) { |
2278 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2279 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2279 CHECK(dir.good()); | 2280 CHECK(dir.good()); |
2280 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2281 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2281 SyncShareAsDelegate(); | 2282 SyncShareAsDelegate(); |
2282 mock_server_->set_conflict_all_commits(true); | 2283 mock_server_->set_conflict_all_commits(true); |
2283 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20); | 2284 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20); |
2284 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT | 2285 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT |
2285 saw_syncer_event_ = false; | 2286 saw_syncer_event_ = false; |
2286 } | 2287 } |
2287 | 2288 |
2288 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) { | 2289 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) { |
2289 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2290 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2290 CHECK(dir.good()); | 2291 CHECK(dir.good()); |
2291 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); | 2292 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); |
2292 SyncShareAsDelegate(); | 2293 SyncShareAsDelegate(); |
2293 int64 local_folder_handle; | 2294 int64 local_folder_handle; |
2294 syncable::Id local_folder_id; | 2295 syncable::Id local_folder_id; |
2295 { | 2296 { |
2296 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2297 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2297 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); | 2298 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); |
2298 ASSERT_TRUE(new_entry.good()); | 2299 ASSERT_TRUE(new_entry.good()); |
2299 local_folder_id = new_entry.Get(ID); | 2300 local_folder_id = new_entry.Get(ID); |
2300 local_folder_handle = new_entry.Get(META_HANDLE); | 2301 local_folder_handle = new_entry.Get(META_HANDLE); |
2301 new_entry.Put(IS_UNSYNCED, true); | 2302 new_entry.Put(IS_UNSYNCED, true); |
2302 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2303 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2303 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2304 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2304 ASSERT_TRUE(old.good()); | 2305 ASSERT_TRUE(old.good()); |
2305 WriteTestDataToEntry(&wtrans, &old); | 2306 WriteTestDataToEntry(&wtrans, &old); |
2306 } | 2307 } |
2307 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); | 2308 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); |
2308 mock_server_->set_conflict_all_commits(true); | 2309 mock_server_->set_conflict_all_commits(true); |
2309 SyncShareAsDelegate(); | 2310 SyncShareAsDelegate(); |
2310 saw_syncer_event_ = false; | 2311 saw_syncer_event_ = false; |
2311 { | 2312 { |
2312 // Update #20 should have been dropped in favor of the local version. | 2313 // Update #20 should have been dropped in favor of the local version. |
2313 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2314 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2314 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2315 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2315 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); | 2316 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); |
2316 ASSERT_TRUE(server.good()); | 2317 ASSERT_TRUE(server.good()); |
2317 ASSERT_TRUE(local.good()); | 2318 ASSERT_TRUE(local.good()); |
2318 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); | 2319 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); |
2319 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); | 2320 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); |
2320 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); | 2321 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); |
2321 EXPECT_TRUE(server.Get(IS_UNSYNCED)); | 2322 EXPECT_TRUE(server.Get(IS_UNSYNCED)); |
2322 EXPECT_TRUE(local.Get(IS_UNSYNCED)); | 2323 EXPECT_TRUE(local.Get(IS_UNSYNCED)); |
2323 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); | 2324 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); |
2324 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); | 2325 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); |
2325 } | 2326 } |
2326 // Allow local changes to commit. | 2327 // Allow local changes to commit. |
2327 mock_server_->set_conflict_all_commits(false); | 2328 mock_server_->set_conflict_all_commits(false); |
2328 SyncShareAsDelegate(); | 2329 SyncShareAsDelegate(); |
2329 saw_syncer_event_ = false; | 2330 saw_syncer_event_ = false; |
2330 | 2331 |
2331 // Now add a server change to make the two names equal. There should | 2332 // Now add a server change to make the two names equal. There should |
2332 // be no conflict with that, since names are not unique. | 2333 // be no conflict with that, since names are not unique. |
2333 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); | 2334 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); |
2334 SyncShareAsDelegate(); | 2335 SyncShareAsDelegate(); |
2335 saw_syncer_event_ = false; | 2336 saw_syncer_event_ = false; |
2336 { | 2337 { |
2337 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2338 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2338 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2339 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2339 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); | 2340 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); |
2340 ASSERT_TRUE(server.good()); | 2341 ASSERT_TRUE(server.good()); |
2341 ASSERT_TRUE(local.good()); | 2342 ASSERT_TRUE(local.good()); |
2342 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); | 2343 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); |
2343 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); | 2344 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); |
2344 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); | 2345 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); |
2345 EXPECT_FALSE(server.Get(IS_UNSYNCED)); | 2346 EXPECT_FALSE(server.Get(IS_UNSYNCED)); |
2346 EXPECT_FALSE(local.Get(IS_UNSYNCED)); | 2347 EXPECT_FALSE(local.Get(IS_UNSYNCED)); |
2347 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); | 2348 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); |
2348 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); | 2349 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); |
2349 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. | 2350 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. |
2350 server.Get(SPECIFICS).GetExtension(sync_pb::bookmark).url()); | 2351 server.Get(SPECIFICS).GetExtension(sync_pb::bookmark).url()); |
2351 } | 2352 } |
2352 } | 2353 } |
2353 | 2354 |
2354 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol. | 2355 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol. |
2355 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) { | 2356 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) { |
2356 mock_server_->set_use_legacy_bookmarks_protocol(true); | 2357 mock_server_->set_use_legacy_bookmarks_protocol(true); |
2357 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2358 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2358 CHECK(dir.good()); | 2359 CHECK(dir.good()); |
2359 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); | 2360 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); |
2360 SyncShareAsDelegate(); | 2361 SyncShareAsDelegate(); |
2361 int64 local_folder_handle; | 2362 int64 local_folder_handle; |
2362 syncable::Id local_folder_id; | 2363 syncable::Id local_folder_id; |
2363 { | 2364 { |
2364 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2365 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2365 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); | 2366 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); |
2366 ASSERT_TRUE(new_entry.good()); | 2367 ASSERT_TRUE(new_entry.good()); |
2367 local_folder_id = new_entry.Get(ID); | 2368 local_folder_id = new_entry.Get(ID); |
2368 local_folder_handle = new_entry.Get(META_HANDLE); | 2369 local_folder_handle = new_entry.Get(META_HANDLE); |
2369 new_entry.Put(IS_UNSYNCED, true); | 2370 new_entry.Put(IS_UNSYNCED, true); |
2370 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 2371 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
2371 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2372 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2372 ASSERT_TRUE(old.good()); | 2373 ASSERT_TRUE(old.good()); |
2373 WriteTestDataToEntry(&wtrans, &old); | 2374 WriteTestDataToEntry(&wtrans, &old); |
2374 } | 2375 } |
2375 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); | 2376 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); |
2376 mock_server_->set_conflict_all_commits(true); | 2377 mock_server_->set_conflict_all_commits(true); |
2377 SyncShareAsDelegate(); | 2378 SyncShareAsDelegate(); |
2378 saw_syncer_event_ = false; | 2379 saw_syncer_event_ = false; |
2379 { | 2380 { |
2380 // Update #20 should have been dropped in favor of the local version. | 2381 // Update #20 should have been dropped in favor of the local version. |
2381 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2382 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2382 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2383 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2383 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); | 2384 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); |
2384 ASSERT_TRUE(server.good()); | 2385 ASSERT_TRUE(server.good()); |
2385 ASSERT_TRUE(local.good()); | 2386 ASSERT_TRUE(local.good()); |
2386 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); | 2387 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); |
2387 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); | 2388 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); |
2388 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); | 2389 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); |
2389 EXPECT_TRUE(server.Get(IS_UNSYNCED)); | 2390 EXPECT_TRUE(server.Get(IS_UNSYNCED)); |
2390 EXPECT_TRUE(local.Get(IS_UNSYNCED)); | 2391 EXPECT_TRUE(local.Get(IS_UNSYNCED)); |
2391 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); | 2392 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); |
2392 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); | 2393 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); |
2393 } | 2394 } |
2394 // Allow local changes to commit. | 2395 // Allow local changes to commit. |
2395 mock_server_->set_conflict_all_commits(false); | 2396 mock_server_->set_conflict_all_commits(false); |
2396 SyncShareAsDelegate(); | 2397 SyncShareAsDelegate(); |
2397 saw_syncer_event_ = false; | 2398 saw_syncer_event_ = false; |
2398 | 2399 |
2399 // Now add a server change to make the two names equal. There should | 2400 // Now add a server change to make the two names equal. There should |
2400 // be no conflict with that, since names are not unique. | 2401 // be no conflict with that, since names are not unique. |
2401 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); | 2402 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); |
2402 SyncShareAsDelegate(); | 2403 SyncShareAsDelegate(); |
2403 saw_syncer_event_ = false; | 2404 saw_syncer_event_ = false; |
2404 { | 2405 { |
2405 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2406 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2406 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2407 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2407 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); | 2408 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); |
2408 ASSERT_TRUE(server.good()); | 2409 ASSERT_TRUE(server.good()); |
2409 ASSERT_TRUE(local.good()); | 2410 ASSERT_TRUE(local.good()); |
2410 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); | 2411 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); |
2411 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); | 2412 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); |
2412 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); | 2413 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); |
2413 EXPECT_FALSE(server.Get(IS_UNSYNCED)); | 2414 EXPECT_FALSE(server.Get(IS_UNSYNCED)); |
2414 EXPECT_FALSE(local.Get(IS_UNSYNCED)); | 2415 EXPECT_FALSE(local.Get(IS_UNSYNCED)); |
2415 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); | 2416 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); |
2416 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); | 2417 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); |
2417 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. | 2418 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. |
2418 server.Get(SPECIFICS).GetExtension(sync_pb::bookmark).url()); | 2419 server.Get(SPECIFICS).GetExtension(sync_pb::bookmark).url()); |
2419 } | 2420 } |
2420 } | 2421 } |
2421 | 2422 |
2422 | 2423 |
2423 // Circular links should be resolved by the server. | 2424 // Circular links should be resolved by the server. |
2424 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) { | 2425 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) { |
2425 // we don't currently resolve this. This test ensures we don't. | 2426 // we don't currently resolve this. This test ensures we don't. |
2426 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2427 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2427 CHECK(dir.good()); | 2428 CHECK(dir.good()); |
2428 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); | 2429 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); |
2429 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); | 2430 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); |
2430 SyncShareAsDelegate(); | 2431 SyncShareAsDelegate(); |
2431 { | 2432 { |
2432 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2433 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2433 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2434 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2434 ASSERT_TRUE(A.good()); | 2435 ASSERT_TRUE(A.good()); |
2435 A.Put(IS_UNSYNCED, true); | 2436 A.Put(IS_UNSYNCED, true); |
2436 ASSERT_TRUE(A.Put(PARENT_ID, ids_.FromNumber(2))); | 2437 ASSERT_TRUE(A.Put(PARENT_ID, ids_.FromNumber(2))); |
2437 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); | 2438 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); |
2438 } | 2439 } |
2439 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20); | 2440 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20); |
2440 mock_server_->set_conflict_all_commits(true); | 2441 mock_server_->set_conflict_all_commits(true); |
2441 SyncShareAsDelegate(); | 2442 SyncShareAsDelegate(); |
2442 saw_syncer_event_ = false; | 2443 saw_syncer_event_ = false; |
2443 { | 2444 { |
2444 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2445 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2445 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2446 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2446 ASSERT_TRUE(A.good()); | 2447 ASSERT_TRUE(A.good()); |
2447 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); | 2448 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); |
2448 ASSERT_TRUE(B.good()); | 2449 ASSERT_TRUE(B.good()); |
2449 EXPECT_TRUE(A.Get(NON_UNIQUE_NAME) == "B"); | 2450 EXPECT_TRUE(A.Get(NON_UNIQUE_NAME) == "B"); |
2450 EXPECT_TRUE(B.Get(NON_UNIQUE_NAME) == "B"); | 2451 EXPECT_TRUE(B.Get(NON_UNIQUE_NAME) == "B"); |
2451 } | 2452 } |
2452 } | 2453 } |
2453 | 2454 |
2454 TEST_F(SyncerTest, ConflictSetClassificationError) { | 2455 TEST_F(SyncerTest, ConflictSetClassificationError) { |
2455 // This code used to cause a CHECK failure because we incorrectly thought | 2456 // This code used to cause a CHECK failure because we incorrectly thought |
2456 // a set was only unapplied updates. | 2457 // a set was only unapplied updates. |
2457 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2458 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2458 CHECK(dir.good()); | 2459 CHECK(dir.good()); |
2459 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); | 2460 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); |
2460 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); | 2461 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); |
2461 mock_server_->set_conflict_all_commits(true); | 2462 mock_server_->set_conflict_all_commits(true); |
2462 SyncShareAsDelegate(); | 2463 SyncShareAsDelegate(); |
2463 { | 2464 { |
2464 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2465 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2465 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2466 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2466 ASSERT_TRUE(A.good()); | 2467 ASSERT_TRUE(A.good()); |
2467 A.Put(IS_UNSYNCED, true); | 2468 A.Put(IS_UNSYNCED, true); |
2468 A.Put(IS_UNAPPLIED_UPDATE, true); | 2469 A.Put(IS_UNAPPLIED_UPDATE, true); |
2469 A.Put(SERVER_NON_UNIQUE_NAME, "B"); | 2470 A.Put(SERVER_NON_UNIQUE_NAME, "B"); |
2470 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); | 2471 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); |
2471 ASSERT_TRUE(B.good()); | 2472 ASSERT_TRUE(B.good()); |
2472 B.Put(IS_UNAPPLIED_UPDATE, true); | 2473 B.Put(IS_UNAPPLIED_UPDATE, true); |
2473 B.Put(SERVER_NON_UNIQUE_NAME, "A"); | 2474 B.Put(SERVER_NON_UNIQUE_NAME, "A"); |
2474 } | 2475 } |
2475 SyncShareAsDelegate(); | 2476 SyncShareAsDelegate(); |
2476 saw_syncer_event_ = false; | 2477 saw_syncer_event_ = false; |
2477 } | 2478 } |
2478 | 2479 |
2479 TEST_F(SyncerTest, SwapEntryNames) { | 2480 TEST_F(SyncerTest, SwapEntryNames) { |
2480 // Simple transaction test. | 2481 // Simple transaction test. |
2481 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2482 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2482 CHECK(dir.good()); | 2483 CHECK(dir.good()); |
2483 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); | 2484 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); |
2484 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); | 2485 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); |
2485 mock_server_->set_conflict_all_commits(true); | 2486 mock_server_->set_conflict_all_commits(true); |
2486 SyncShareAsDelegate(); | 2487 SyncShareAsDelegate(); |
2487 { | 2488 { |
2488 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 2489 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
2489 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 2490 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
2490 ASSERT_TRUE(A.good()); | 2491 ASSERT_TRUE(A.good()); |
2491 A.Put(IS_UNSYNCED, true); | 2492 A.Put(IS_UNSYNCED, true); |
2492 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); | 2493 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); |
2493 ASSERT_TRUE(B.good()); | 2494 ASSERT_TRUE(B.good()); |
2494 B.Put(IS_UNSYNCED, true); | 2495 B.Put(IS_UNSYNCED, true); |
2495 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "C")); | 2496 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "C")); |
2496 ASSERT_TRUE(B.Put(NON_UNIQUE_NAME, "A")); | 2497 ASSERT_TRUE(B.Put(NON_UNIQUE_NAME, "A")); |
2497 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); | 2498 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); |
2498 } | 2499 } |
2499 SyncShareAsDelegate(); | 2500 SyncShareAsDelegate(); |
2500 saw_syncer_event_ = false; | 2501 saw_syncer_event_ = false; |
2501 } | 2502 } |
2502 | 2503 |
2503 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) { | 2504 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) { |
2504 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2505 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2505 CHECK(dir.good()); | 2506 CHECK(dir.good()); |
2506 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); | 2507 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); |
2507 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10); | 2508 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10); |
2508 mock_server_->set_conflict_all_commits(true); | 2509 mock_server_->set_conflict_all_commits(true); |
2509 SyncShareAsDelegate(); | 2510 SyncShareAsDelegate(); |
2510 { | 2511 { |
2511 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2512 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2512 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2)); | 2513 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2)); |
2513 ASSERT_TRUE(B.good()); | 2514 ASSERT_TRUE(B.good()); |
2514 WriteTestDataToEntry(&trans, &B); | 2515 WriteTestDataToEntry(&trans, &B); |
2515 B.Put(IS_DEL, true); | 2516 B.Put(IS_DEL, true); |
2516 } | 2517 } |
2517 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11); | 2518 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11); |
2518 mock_server_->SetLastUpdateDeleted(); | 2519 mock_server_->SetLastUpdateDeleted(); |
2519 SyncShareAsDelegate(); | 2520 SyncShareAsDelegate(); |
2520 { | 2521 { |
2521 ReadTransaction trans(dir, __FILE__, __LINE__); | 2522 ReadTransaction trans(dir, FROM_HERE); |
2522 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); | 2523 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); |
2523 ASSERT_TRUE(B.good()); | 2524 ASSERT_TRUE(B.good()); |
2524 EXPECT_FALSE(B.Get(IS_UNSYNCED)); | 2525 EXPECT_FALSE(B.Get(IS_UNSYNCED)); |
2525 EXPECT_FALSE(B.Get(IS_UNAPPLIED_UPDATE)); | 2526 EXPECT_FALSE(B.Get(IS_UNAPPLIED_UPDATE)); |
2526 } | 2527 } |
2527 saw_syncer_event_ = false; | 2528 saw_syncer_event_ = false; |
2528 } | 2529 } |
2529 | 2530 |
2530 TEST_F(SyncerTest, FixDirectoryLoopConflict) { | 2531 TEST_F(SyncerTest, FixDirectoryLoopConflict) { |
2531 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2532 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2532 CHECK(dir.good()); | 2533 CHECK(dir.good()); |
2533 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2534 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2534 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); | 2535 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); |
2535 SyncShareAsDelegate(); | 2536 SyncShareAsDelegate(); |
2536 { | 2537 { |
2537 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2538 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2538 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2539 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2539 ASSERT_TRUE(bob.good()); | 2540 ASSERT_TRUE(bob.good()); |
2540 bob.Put(IS_UNSYNCED, true); | 2541 bob.Put(IS_UNSYNCED, true); |
2541 bob.Put(PARENT_ID, ids_.FromNumber(2)); | 2542 bob.Put(PARENT_ID, ids_.FromNumber(2)); |
2542 } | 2543 } |
2543 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); | 2544 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); |
2544 mock_server_->set_conflict_all_commits(true); | 2545 mock_server_->set_conflict_all_commits(true); |
2545 SyncShareAsDelegate(); | 2546 SyncShareAsDelegate(); |
2546 SyncShareAsDelegate(); | 2547 SyncShareAsDelegate(); |
2547 { | 2548 { |
2548 ReadTransaction trans(dir, __FILE__, __LINE__); | 2549 ReadTransaction trans(dir, FROM_HERE); |
2549 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2550 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2550 ASSERT_TRUE(bob.good()); | 2551 ASSERT_TRUE(bob.good()); |
2551 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); | 2552 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); |
2552 ASSERT_TRUE(fred.good()); | 2553 ASSERT_TRUE(fred.good()); |
2553 EXPECT_TRUE(fred.Get(IS_UNSYNCED)); | 2554 EXPECT_TRUE(fred.Get(IS_UNSYNCED)); |
2554 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2555 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2555 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); | 2556 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); |
2556 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2557 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2557 } | 2558 } |
2558 saw_syncer_event_ = false; | 2559 saw_syncer_event_ = false; |
2559 } | 2560 } |
2560 | 2561 |
2561 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) { | 2562 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) { |
2562 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2563 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2563 CHECK(dir.good()); | 2564 CHECK(dir.good()); |
2564 | 2565 |
2565 int64 bob_metahandle; | 2566 int64 bob_metahandle; |
2566 | 2567 |
2567 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10); | 2568 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10); |
2568 SyncShareAsDelegate(); | 2569 SyncShareAsDelegate(); |
2569 { | 2570 { |
2570 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2571 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2571 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2572 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2572 ASSERT_TRUE(bob.good()); | 2573 ASSERT_TRUE(bob.good()); |
2573 bob_metahandle = bob.Get(META_HANDLE); | 2574 bob_metahandle = bob.Get(META_HANDLE); |
2574 WriteTestDataToEntry(&trans, &bob); | 2575 WriteTestDataToEntry(&trans, &bob); |
2575 } | 2576 } |
2576 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10); | 2577 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10); |
2577 mock_server_->SetLastUpdateDeleted(); | 2578 mock_server_->SetLastUpdateDeleted(); |
2578 mock_server_->set_conflict_all_commits(true); | 2579 mock_server_->set_conflict_all_commits(true); |
2579 SyncShareAsDelegate(); | 2580 SyncShareAsDelegate(); |
2580 SyncShareAsDelegate(); | 2581 SyncShareAsDelegate(); |
2581 { | 2582 { |
2582 ReadTransaction trans(dir, __FILE__, __LINE__); | 2583 ReadTransaction trans(dir, FROM_HERE); |
2583 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle); | 2584 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle); |
2584 ASSERT_TRUE(bob.good()); | 2585 ASSERT_TRUE(bob.good()); |
2585 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2586 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2586 EXPECT_FALSE(bob.Get(ID).ServerKnows()); | 2587 EXPECT_FALSE(bob.Get(ID).ServerKnows()); |
2587 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2588 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2588 EXPECT_FALSE(bob.Get(IS_DEL)); | 2589 EXPECT_FALSE(bob.Get(IS_DEL)); |
2589 } | 2590 } |
2590 saw_syncer_event_ = false; | 2591 saw_syncer_event_ = false; |
2591 } | 2592 } |
2592 | 2593 |
2593 TEST_F(SyncerTest, ServerDeletingFolderWeHaveMovedSomethingInto) { | 2594 TEST_F(SyncerTest, ServerDeletingFolderWeHaveMovedSomethingInto) { |
2594 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2595 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2595 CHECK(dir.good()); | 2596 CHECK(dir.good()); |
2596 | 2597 |
2597 syncable::Id bob_id = ids_.NewServerId(); | 2598 syncable::Id bob_id = ids_.NewServerId(); |
2598 syncable::Id fred_id = ids_.NewServerId(); | 2599 syncable::Id fred_id = ids_.NewServerId(); |
2599 | 2600 |
2600 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 2601 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
2601 "bob", 1, 10); | 2602 "bob", 1, 10); |
2602 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2603 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2603 "fred", 1, 10); | 2604 "fred", 1, 10); |
2604 SyncShareAsDelegate(); | 2605 SyncShareAsDelegate(); |
2605 { | 2606 { |
2606 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2607 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2607 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 2608 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
2608 ASSERT_TRUE(bob.good()); | 2609 ASSERT_TRUE(bob.good()); |
2609 bob.Put(IS_UNSYNCED, true); | 2610 bob.Put(IS_UNSYNCED, true); |
2610 bob.Put(PARENT_ID, fred_id); | 2611 bob.Put(PARENT_ID, fred_id); |
2611 } | 2612 } |
2612 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2613 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2613 "fred", 2, 20); | 2614 "fred", 2, 20); |
2614 mock_server_->SetLastUpdateDeleted(); | 2615 mock_server_->SetLastUpdateDeleted(); |
2615 mock_server_->set_conflict_all_commits(true); | 2616 mock_server_->set_conflict_all_commits(true); |
2616 SyncShareAsDelegate(); | 2617 SyncShareAsDelegate(); |
2617 SyncShareAsDelegate(); | 2618 SyncShareAsDelegate(); |
2618 { | 2619 { |
2619 ReadTransaction trans(dir, __FILE__, __LINE__); | 2620 ReadTransaction trans(dir, FROM_HERE); |
2620 | 2621 |
2621 Entry bob(&trans, GET_BY_ID, bob_id); | 2622 Entry bob(&trans, GET_BY_ID, bob_id); |
2622 ASSERT_TRUE(bob.good()); | 2623 ASSERT_TRUE(bob.good()); |
2623 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2624 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2624 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2625 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2625 EXPECT_TRUE(bob.Get(NON_UNIQUE_NAME) == "bob"); | 2626 EXPECT_TRUE(bob.Get(NON_UNIQUE_NAME) == "bob"); |
2626 EXPECT_NE(bob.Get(PARENT_ID), fred_id); | 2627 EXPECT_NE(bob.Get(PARENT_ID), fred_id); |
2627 | 2628 |
2628 // Entry was deleted and reborn. | 2629 // Entry was deleted and reborn. |
2629 Entry dead_fred(&trans, GET_BY_ID, fred_id); | 2630 Entry dead_fred(&trans, GET_BY_ID, fred_id); |
(...skipping 15 matching lines...) Expand all Loading... |
2645 // TODO(chron): The fourth time that SyncShare is called it crashes. | 2646 // TODO(chron): The fourth time that SyncShare is called it crashes. |
2646 // This seems to be due to a bug in the conflict set building logic. | 2647 // This seems to be due to a bug in the conflict set building logic. |
2647 // http://crbug.com/46621 | 2648 // http://crbug.com/46621 |
2648 TEST_F(SyncerTest, DISABLED_ServerDeletingFolderWeHaveAnOpenEntryIn) { | 2649 TEST_F(SyncerTest, DISABLED_ServerDeletingFolderWeHaveAnOpenEntryIn) { |
2649 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2650 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2650 CHECK(dir.good()); | 2651 CHECK(dir.good()); |
2651 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10); | 2652 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10); |
2652 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); | 2653 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); |
2653 SyncShareAsDelegate(); | 2654 SyncShareAsDelegate(); |
2654 { | 2655 { |
2655 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2656 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2656 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2657 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2657 ASSERT_TRUE(bob.good()); | 2658 ASSERT_TRUE(bob.good()); |
2658 bob.Put(IS_UNSYNCED, true); | 2659 bob.Put(IS_UNSYNCED, true); |
2659 WriteTestDataToEntry(&trans, &bob); | 2660 WriteTestDataToEntry(&trans, &bob); |
2660 } | 2661 } |
2661 SyncShareAsDelegate(); | 2662 SyncShareAsDelegate(); |
2662 { | 2663 { |
2663 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2664 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2664 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2665 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2665 ASSERT_TRUE(bob.good()); | 2666 ASSERT_TRUE(bob.good()); |
2666 EXPECT_FALSE(bob.Get(IS_UNSYNCED)); | 2667 EXPECT_FALSE(bob.Get(IS_UNSYNCED)); |
2667 bob.Put(IS_UNSYNCED, true); | 2668 bob.Put(IS_UNSYNCED, true); |
2668 bob.Put(PARENT_ID, ids_.FromNumber(2)); | 2669 bob.Put(PARENT_ID, ids_.FromNumber(2)); |
2669 } | 2670 } |
2670 mock_server_->AddUpdateDirectory(2, 0, "fred", 2, 20); | 2671 mock_server_->AddUpdateDirectory(2, 0, "fred", 2, 20); |
2671 mock_server_->SetLastUpdateDeleted(); | 2672 mock_server_->SetLastUpdateDeleted(); |
2672 mock_server_->set_conflict_all_commits(true); | 2673 mock_server_->set_conflict_all_commits(true); |
2673 saw_syncer_event_ = false; | 2674 saw_syncer_event_ = false; |
2674 // These SyncShares would cause a CHECK because we'd think we were stuck. | 2675 // These SyncShares would cause a CHECK because we'd think we were stuck. |
2675 SyncShareAsDelegate(); | 2676 SyncShareAsDelegate(); |
2676 SyncShareAsDelegate(); | 2677 SyncShareAsDelegate(); |
2677 SyncShareAsDelegate(); | 2678 SyncShareAsDelegate(); |
2678 SyncShareAsDelegate(); | 2679 SyncShareAsDelegate(); |
2679 SyncShareAsDelegate(); | 2680 SyncShareAsDelegate(); |
2680 SyncShareAsDelegate(); | 2681 SyncShareAsDelegate(); |
2681 SyncShareAsDelegate(); | 2682 SyncShareAsDelegate(); |
2682 SyncShareAsDelegate(); | 2683 SyncShareAsDelegate(); |
2683 EXPECT_FALSE(saw_syncer_event_); | 2684 EXPECT_FALSE(saw_syncer_event_); |
2684 { | 2685 { |
2685 ReadTransaction trans(dir, __FILE__, __LINE__); | 2686 ReadTransaction trans(dir, FROM_HERE); |
2686 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2687 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2687 ASSERT_TRUE(bob.good()); | 2688 ASSERT_TRUE(bob.good()); |
2688 Id fred_id = | 2689 Id fred_id = |
2689 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "fred"); | 2690 GetOnlyEntryWithName(&trans, TestIdFactory::root(), "fred"); |
2690 Entry fred(&trans, GET_BY_ID, fred_id); | 2691 Entry fred(&trans, GET_BY_ID, fred_id); |
2691 ASSERT_TRUE(fred.good()); | 2692 ASSERT_TRUE(fred.good()); |
2692 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 2693 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
2693 EXPECT_TRUE(fred.Get(IS_UNAPPLIED_UPDATE)); | 2694 EXPECT_TRUE(fred.Get(IS_UNAPPLIED_UPDATE)); |
2694 EXPECT_TRUE(bob.Get(PARENT_ID) == fred.Get(ID)); | 2695 EXPECT_TRUE(bob.Get(PARENT_ID) == fred.Get(ID)); |
2695 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2696 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2696 } | 2697 } |
2697 saw_syncer_event_ = false; | 2698 saw_syncer_event_ = false; |
2698 } | 2699 } |
2699 | 2700 |
2700 TEST_F(SyncerTest, WeMovedSomethingIntoAFolderServerHasDeleted) { | 2701 TEST_F(SyncerTest, WeMovedSomethingIntoAFolderServerHasDeleted) { |
2701 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2702 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2702 CHECK(dir.good()); | 2703 CHECK(dir.good()); |
2703 | 2704 |
2704 syncable::Id bob_id = ids_.NewServerId(); | 2705 syncable::Id bob_id = ids_.NewServerId(); |
2705 syncable::Id fred_id = ids_.NewServerId(); | 2706 syncable::Id fred_id = ids_.NewServerId(); |
2706 | 2707 |
2707 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 2708 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
2708 "bob", 1, 10); | 2709 "bob", 1, 10); |
2709 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2710 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2710 "fred", 1, 10); | 2711 "fred", 1, 10); |
2711 SyncShareAsDelegate(); | 2712 SyncShareAsDelegate(); |
2712 { | 2713 { |
2713 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2714 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2714 Entry fred(&trans, GET_BY_ID, fred_id); | 2715 Entry fred(&trans, GET_BY_ID, fred_id); |
2715 ASSERT_TRUE(fred.good()); | 2716 ASSERT_TRUE(fred.good()); |
2716 | 2717 |
2717 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 2718 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
2718 ASSERT_TRUE(bob.good()); | 2719 ASSERT_TRUE(bob.good()); |
2719 bob.Put(IS_UNSYNCED, true); | 2720 bob.Put(IS_UNSYNCED, true); |
2720 bob.Put(PARENT_ID, fred_id); | 2721 bob.Put(PARENT_ID, fred_id); |
2721 } | 2722 } |
2722 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2723 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2723 "fred", 2, 20); | 2724 "fred", 2, 20); |
2724 mock_server_->SetLastUpdateDeleted(); | 2725 mock_server_->SetLastUpdateDeleted(); |
2725 mock_server_->set_conflict_all_commits(true); | 2726 mock_server_->set_conflict_all_commits(true); |
2726 SyncShareAsDelegate(); | 2727 SyncShareAsDelegate(); |
2727 SyncShareAsDelegate(); | 2728 SyncShareAsDelegate(); |
2728 { | 2729 { |
2729 ReadTransaction trans(dir, __FILE__, __LINE__); | 2730 ReadTransaction trans(dir, FROM_HERE); |
2730 Entry bob(&trans, GET_BY_ID, bob_id); | 2731 Entry bob(&trans, GET_BY_ID, bob_id); |
2731 ASSERT_TRUE(bob.good()); | 2732 ASSERT_TRUE(bob.good()); |
2732 | 2733 |
2733 // Entry was deleted by server. We'll make a new one though with a new ID. | 2734 // Entry was deleted by server. We'll make a new one though with a new ID. |
2734 Entry dead_fred(&trans, GET_BY_ID, fred_id); | 2735 Entry dead_fred(&trans, GET_BY_ID, fred_id); |
2735 EXPECT_FALSE(dead_fred.good()); | 2736 EXPECT_FALSE(dead_fred.good()); |
2736 | 2737 |
2737 // Fred is reborn with a local ID. | 2738 // Fred is reborn with a local ID. |
2738 Entry fred(&trans, GET_BY_ID, bob.Get(PARENT_ID)); | 2739 Entry fred(&trans, GET_BY_ID, bob.Get(PARENT_ID)); |
2739 EXPECT_EQ("fred", fred.Get(NON_UNIQUE_NAME)); | 2740 EXPECT_EQ("fred", fred.Get(NON_UNIQUE_NAME)); |
(...skipping 23 matching lines...) Expand all Loading... |
2763 MoveBobIntoID2(); | 2764 MoveBobIntoID2(); |
2764 done_ = true; | 2765 done_ = true; |
2765 } | 2766 } |
2766 } | 2767 } |
2767 | 2768 |
2768 protected: | 2769 protected: |
2769 void MoveBobIntoID2() { | 2770 void MoveBobIntoID2() { |
2770 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2771 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2771 CHECK(dir.good()); | 2772 CHECK(dir.good()); |
2772 | 2773 |
2773 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2774 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2774 Entry alice(&trans, GET_BY_ID, | 2775 Entry alice(&trans, GET_BY_ID, |
2775 TestIdFactory::FromNumber(fred_id_number)); | 2776 TestIdFactory::FromNumber(fred_id_number)); |
2776 CHECK(alice.good()); | 2777 CHECK(alice.good()); |
2777 EXPECT_TRUE(!alice.Get(IS_DEL)); | 2778 EXPECT_TRUE(!alice.Get(IS_DEL)); |
2778 EXPECT_TRUE(alice.Get(SYNCING)) << "Expected to be called mid-commit."; | 2779 EXPECT_TRUE(alice.Get(SYNCING)) << "Expected to be called mid-commit."; |
2779 MutableEntry bob(&trans, GET_BY_ID, | 2780 MutableEntry bob(&trans, GET_BY_ID, |
2780 TestIdFactory::FromNumber(bob_id_number)); | 2781 TestIdFactory::FromNumber(bob_id_number)); |
2781 CHECK(bob.good()); | 2782 CHECK(bob.good()); |
2782 bob.Put(IS_UNSYNCED, true); | 2783 bob.Put(IS_UNSYNCED, true); |
2783 | 2784 |
(...skipping 13 matching lines...) Expand all Loading... |
2797 FolderMoveDeleteRenameTest::bob_id_number); | 2798 FolderMoveDeleteRenameTest::bob_id_number); |
2798 const syncable::Id fred_id = TestIdFactory::FromNumber( | 2799 const syncable::Id fred_id = TestIdFactory::FromNumber( |
2799 FolderMoveDeleteRenameTest::fred_id_number); | 2800 FolderMoveDeleteRenameTest::fred_id_number); |
2800 | 2801 |
2801 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 2802 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
2802 "bob", 1, 10); | 2803 "bob", 1, 10); |
2803 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2804 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2804 "fred", 1, 10); | 2805 "fred", 1, 10); |
2805 SyncShareAsDelegate(); | 2806 SyncShareAsDelegate(); |
2806 { | 2807 { |
2807 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2808 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2808 MutableEntry fred(&trans, GET_BY_ID, fred_id); | 2809 MutableEntry fred(&trans, GET_BY_ID, fred_id); |
2809 ASSERT_TRUE(fred.good()); | 2810 ASSERT_TRUE(fred.good()); |
2810 fred.Put(IS_UNSYNCED, true); | 2811 fred.Put(IS_UNSYNCED, true); |
2811 fred.Put(SYNCING, false); | 2812 fred.Put(SYNCING, false); |
2812 fred.Put(NON_UNIQUE_NAME, "Alice"); | 2813 fred.Put(NON_UNIQUE_NAME, "Alice"); |
2813 } | 2814 } |
2814 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2815 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2815 "fred", 2, 20); | 2816 "fred", 2, 20); |
2816 mock_server_->SetLastUpdateDeleted(); | 2817 mock_server_->SetLastUpdateDeleted(); |
2817 mock_server_->set_conflict_all_commits(true); | 2818 mock_server_->set_conflict_all_commits(true); |
2818 // This test is a little brittle. We want to move the item into the folder | 2819 // This test is a little brittle. We want to move the item into the folder |
2819 // such that we think we're dealing with a simple conflict, but in reality | 2820 // such that we think we're dealing with a simple conflict, but in reality |
2820 // it's actually a conflict set. | 2821 // it's actually a conflict set. |
2821 mock_server_->SetMidCommitCallback( | 2822 mock_server_->SetMidCommitCallback( |
2822 NewCallback<FolderMoveDeleteRenameTest>(this, | 2823 NewCallback<FolderMoveDeleteRenameTest>(this, |
2823 &FolderMoveDeleteRenameTest::MoveBobIntoID2Runner)); | 2824 &FolderMoveDeleteRenameTest::MoveBobIntoID2Runner)); |
2824 SyncShareAsDelegate(); | 2825 SyncShareAsDelegate(); |
2825 SyncShareAsDelegate(); | 2826 SyncShareAsDelegate(); |
2826 SyncShareAsDelegate(); | 2827 SyncShareAsDelegate(); |
2827 { | 2828 { |
2828 ReadTransaction trans(dir, __FILE__, __LINE__); | 2829 ReadTransaction trans(dir, FROM_HERE); |
2829 Entry bob(&trans, GET_BY_ID, bob_id); | 2830 Entry bob(&trans, GET_BY_ID, bob_id); |
2830 ASSERT_TRUE(bob.good()); | 2831 ASSERT_TRUE(bob.good()); |
2831 | 2832 |
2832 // Old entry is dead | 2833 // Old entry is dead |
2833 Entry dead_fred(&trans, GET_BY_ID, fred_id); | 2834 Entry dead_fred(&trans, GET_BY_ID, fred_id); |
2834 EXPECT_FALSE(dead_fred.good()); | 2835 EXPECT_FALSE(dead_fred.good()); |
2835 | 2836 |
2836 // New ID is created to fill parent folder, named correctly | 2837 // New ID is created to fill parent folder, named correctly |
2837 Entry alice(&trans, GET_BY_ID, bob.Get(PARENT_ID)); | 2838 Entry alice(&trans, GET_BY_ID, bob.Get(PARENT_ID)); |
2838 ASSERT_TRUE(alice.good()); | 2839 ASSERT_TRUE(alice.good()); |
(...skipping 18 matching lines...) Expand all Loading... |
2857 syncable::Id bob_id = ids_.NewServerId(); | 2858 syncable::Id bob_id = ids_.NewServerId(); |
2858 syncable::Id fred_id = ids_.NewServerId(); | 2859 syncable::Id fred_id = ids_.NewServerId(); |
2859 | 2860 |
2860 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 2861 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
2861 "bob", 1, 10); | 2862 "bob", 1, 10); |
2862 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2863 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2863 "fred", 1, 10); | 2864 "fred", 1, 10); |
2864 SyncShareAsDelegate(); | 2865 SyncShareAsDelegate(); |
2865 syncable::Id new_item_id; | 2866 syncable::Id new_item_id; |
2866 { | 2867 { |
2867 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2868 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2868 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 2869 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
2869 ASSERT_TRUE(bob.good()); | 2870 ASSERT_TRUE(bob.good()); |
2870 bob.Put(IS_UNSYNCED, true); | 2871 bob.Put(IS_UNSYNCED, true); |
2871 bob.Put(PARENT_ID, fred_id); | 2872 bob.Put(PARENT_ID, fred_id); |
2872 MutableEntry new_item(&trans, CREATE, fred_id, "new_item"); | 2873 MutableEntry new_item(&trans, CREATE, fred_id, "new_item"); |
2873 WriteTestDataToEntry(&trans, &new_item); | 2874 WriteTestDataToEntry(&trans, &new_item); |
2874 new_item_id = new_item.Get(ID); | 2875 new_item_id = new_item.Get(ID); |
2875 } | 2876 } |
2876 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 2877 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
2877 "fred", 2, 20); | 2878 "fred", 2, 20); |
2878 mock_server_->SetLastUpdateDeleted(); | 2879 mock_server_->SetLastUpdateDeleted(); |
2879 mock_server_->set_conflict_all_commits(true); | 2880 mock_server_->set_conflict_all_commits(true); |
2880 SyncShareAsDelegate(); | 2881 SyncShareAsDelegate(); |
2881 SyncShareAsDelegate(); | 2882 SyncShareAsDelegate(); |
2882 { | 2883 { |
2883 ReadTransaction trans(dir, __FILE__, __LINE__); | 2884 ReadTransaction trans(dir, FROM_HERE); |
2884 | 2885 |
2885 Entry bob(&trans, GET_BY_ID, bob_id); | 2886 Entry bob(&trans, GET_BY_ID, bob_id); |
2886 ASSERT_TRUE(bob.good()); | 2887 ASSERT_TRUE(bob.good()); |
2887 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2888 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2888 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2889 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2889 EXPECT_NE(bob.Get(PARENT_ID), fred_id); | 2890 EXPECT_NE(bob.Get(PARENT_ID), fred_id); |
2890 | 2891 |
2891 // Was recreated. Old one shouldn't exist. | 2892 // Was recreated. Old one shouldn't exist. |
2892 Entry dead_fred(&trans, GET_BY_ID, fred_id); | 2893 Entry dead_fred(&trans, GET_BY_ID, fred_id); |
2893 EXPECT_FALSE(dead_fred.good()); | 2894 EXPECT_FALSE(dead_fred.good()); |
(...skipping 13 matching lines...) Expand all Loading... |
2907 saw_syncer_event_ = false; | 2908 saw_syncer_event_ = false; |
2908 } | 2909 } |
2909 | 2910 |
2910 TEST_F(SyncerTest, ServerMovedSomethingIntoAFolderWeHaveDeleted) { | 2911 TEST_F(SyncerTest, ServerMovedSomethingIntoAFolderWeHaveDeleted) { |
2911 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2912 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2912 CHECK(dir.good()); | 2913 CHECK(dir.good()); |
2913 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2914 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2914 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); | 2915 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); |
2915 LoopSyncShare(); | 2916 LoopSyncShare(); |
2916 { | 2917 { |
2917 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2918 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2918 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2919 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2919 ASSERT_TRUE(bob.good()); | 2920 ASSERT_TRUE(bob.good()); |
2920 bob.Put(IS_UNSYNCED, true); | 2921 bob.Put(IS_UNSYNCED, true); |
2921 bob.Put(IS_DEL, true); | 2922 bob.Put(IS_DEL, true); |
2922 } | 2923 } |
2923 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); | 2924 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); |
2924 mock_server_->set_conflict_all_commits(true); | 2925 mock_server_->set_conflict_all_commits(true); |
2925 LoopSyncShare(); | 2926 LoopSyncShare(); |
2926 LoopSyncShare(); | 2927 LoopSyncShare(); |
2927 { | 2928 { |
2928 ReadTransaction trans(dir, __FILE__, __LINE__); | 2929 ReadTransaction trans(dir, FROM_HERE); |
2929 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2930 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2930 ASSERT_TRUE(bob.good()); | 2931 ASSERT_TRUE(bob.good()); |
2931 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); | 2932 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); |
2932 ASSERT_TRUE(fred.good()); | 2933 ASSERT_TRUE(fred.good()); |
2933 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 2934 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
2934 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2935 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2935 EXPECT_TRUE(fred.Get(PARENT_ID) == bob.Get(ID)); | 2936 EXPECT_TRUE(fred.Get(PARENT_ID) == bob.Get(ID)); |
2936 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); | 2937 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); |
2937 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); | 2938 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); |
2938 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2939 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2939 } | 2940 } |
2940 saw_syncer_event_ = false; | 2941 saw_syncer_event_ = false; |
2941 } | 2942 } |
2942 | 2943 |
2943 TEST_F(SyncerTest, ServerMovedAFolderIntoAFolderWeHaveDeletedAndMovedIntoIt) { | 2944 TEST_F(SyncerTest, ServerMovedAFolderIntoAFolderWeHaveDeletedAndMovedIntoIt) { |
2944 // This test combines circular folders and deleted parents. | 2945 // This test combines circular folders and deleted parents. |
2945 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2946 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2946 CHECK(dir.good()); | 2947 CHECK(dir.good()); |
2947 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2948 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2948 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); | 2949 mock_server_->AddUpdateDirectory(2, 0, "fred", 1, 10); |
2949 SyncShareAsDelegate(); | 2950 SyncShareAsDelegate(); |
2950 { | 2951 { |
2951 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2952 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2952 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2953 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2953 ASSERT_TRUE(bob.good()); | 2954 ASSERT_TRUE(bob.good()); |
2954 bob.Put(IS_UNSYNCED, true); | 2955 bob.Put(IS_UNSYNCED, true); |
2955 bob.Put(IS_DEL, true); | 2956 bob.Put(IS_DEL, true); |
2956 bob.Put(PARENT_ID, ids_.FromNumber(2)); | 2957 bob.Put(PARENT_ID, ids_.FromNumber(2)); |
2957 } | 2958 } |
2958 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); | 2959 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); |
2959 mock_server_->set_conflict_all_commits(true); | 2960 mock_server_->set_conflict_all_commits(true); |
2960 SyncShareAsDelegate(); | 2961 SyncShareAsDelegate(); |
2961 SyncShareAsDelegate(); | 2962 SyncShareAsDelegate(); |
2962 { | 2963 { |
2963 ReadTransaction trans(dir, __FILE__, __LINE__); | 2964 ReadTransaction trans(dir, FROM_HERE); |
2964 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2965 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2965 ASSERT_TRUE(bob.good()); | 2966 ASSERT_TRUE(bob.good()); |
2966 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); | 2967 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); |
2967 ASSERT_TRUE(fred.good()); | 2968 ASSERT_TRUE(fred.good()); |
2968 EXPECT_TRUE(fred.Get(IS_UNSYNCED)); | 2969 EXPECT_TRUE(fred.Get(IS_UNSYNCED)); |
2969 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 2970 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
2970 EXPECT_TRUE(bob.Get(IS_DEL)); | 2971 EXPECT_TRUE(bob.Get(IS_DEL)); |
2971 EXPECT_TRUE(fred.Get(PARENT_ID) == root_id_); | 2972 EXPECT_TRUE(fred.Get(PARENT_ID) == root_id_); |
2972 EXPECT_TRUE(bob.Get(PARENT_ID) == fred.Get(ID)); | 2973 EXPECT_TRUE(bob.Get(PARENT_ID) == fred.Get(ID)); |
2973 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); | 2974 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); |
2974 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 2975 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
2975 } | 2976 } |
2976 saw_syncer_event_ = false; | 2977 saw_syncer_event_ = false; |
2977 } | 2978 } |
2978 | 2979 |
2979 TEST_F(SyncerTest, NewServerItemInAFolderWeHaveDeleted) { | 2980 TEST_F(SyncerTest, NewServerItemInAFolderWeHaveDeleted) { |
2980 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 2981 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
2981 CHECK(dir.good()); | 2982 CHECK(dir.good()); |
2982 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 2983 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
2983 LoopSyncShare(); | 2984 LoopSyncShare(); |
2984 { | 2985 { |
2985 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 2986 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
2986 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2987 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2987 ASSERT_TRUE(bob.good()); | 2988 ASSERT_TRUE(bob.good()); |
2988 bob.Put(IS_UNSYNCED, true); | 2989 bob.Put(IS_UNSYNCED, true); |
2989 bob.Put(IS_DEL, true); | 2990 bob.Put(IS_DEL, true); |
2990 } | 2991 } |
2991 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); | 2992 mock_server_->AddUpdateDirectory(2, 1, "fred", 2, 20); |
2992 mock_server_->set_conflict_all_commits(true); | 2993 mock_server_->set_conflict_all_commits(true); |
2993 LoopSyncShare(); | 2994 LoopSyncShare(); |
2994 LoopSyncShare(); | 2995 LoopSyncShare(); |
2995 { | 2996 { |
2996 ReadTransaction trans(dir, __FILE__, __LINE__); | 2997 ReadTransaction trans(dir, FROM_HERE); |
2997 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 2998 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
2998 ASSERT_TRUE(bob.good()); | 2999 ASSERT_TRUE(bob.good()); |
2999 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3000 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3000 ASSERT_TRUE(fred.good()); | 3001 ASSERT_TRUE(fred.good()); |
3001 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 3002 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
3002 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 3003 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
3003 EXPECT_TRUE(fred.Get(PARENT_ID) == bob.Get(ID)); | 3004 EXPECT_TRUE(fred.Get(PARENT_ID) == bob.Get(ID)); |
3004 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); | 3005 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); |
3005 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); | 3006 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); |
3006 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 3007 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
3007 } | 3008 } |
3008 saw_syncer_event_ = false; | 3009 saw_syncer_event_ = false; |
3009 } | 3010 } |
3010 | 3011 |
3011 TEST_F(SyncerTest, NewServerItemInAFolderHierarchyWeHaveDeleted) { | 3012 TEST_F(SyncerTest, NewServerItemInAFolderHierarchyWeHaveDeleted) { |
3012 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3013 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3013 CHECK(dir.good()); | 3014 CHECK(dir.good()); |
3014 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 3015 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
3015 mock_server_->AddUpdateDirectory(2, 1, "joe", 1, 10); | 3016 mock_server_->AddUpdateDirectory(2, 1, "joe", 1, 10); |
3016 LoopSyncShare(); | 3017 LoopSyncShare(); |
3017 { | 3018 { |
3018 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3019 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3019 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3020 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3020 ASSERT_TRUE(bob.good()); | 3021 ASSERT_TRUE(bob.good()); |
3021 bob.Put(IS_UNSYNCED, true); | 3022 bob.Put(IS_UNSYNCED, true); |
3022 bob.Put(IS_DEL, true); | 3023 bob.Put(IS_DEL, true); |
3023 MutableEntry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3024 MutableEntry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3024 ASSERT_TRUE(joe.good()); | 3025 ASSERT_TRUE(joe.good()); |
3025 joe.Put(IS_UNSYNCED, true); | 3026 joe.Put(IS_UNSYNCED, true); |
3026 joe.Put(IS_DEL, true); | 3027 joe.Put(IS_DEL, true); |
3027 } | 3028 } |
3028 mock_server_->AddUpdateDirectory(3, 2, "fred", 2, 20); | 3029 mock_server_->AddUpdateDirectory(3, 2, "fred", 2, 20); |
3029 mock_server_->set_conflict_all_commits(true); | 3030 mock_server_->set_conflict_all_commits(true); |
3030 LoopSyncShare(); | 3031 LoopSyncShare(); |
3031 LoopSyncShare(); | 3032 LoopSyncShare(); |
3032 { | 3033 { |
3033 ReadTransaction trans(dir, __FILE__, __LINE__); | 3034 ReadTransaction trans(dir, FROM_HERE); |
3034 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3035 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3035 ASSERT_TRUE(bob.good()); | 3036 ASSERT_TRUE(bob.good()); |
3036 Entry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3037 Entry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3037 ASSERT_TRUE(joe.good()); | 3038 ASSERT_TRUE(joe.good()); |
3038 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(3)); | 3039 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(3)); |
3039 ASSERT_TRUE(fred.good()); | 3040 ASSERT_TRUE(fred.good()); |
3040 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 3041 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
3041 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 3042 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
3042 EXPECT_TRUE(joe.Get(IS_UNSYNCED)); | 3043 EXPECT_TRUE(joe.Get(IS_UNSYNCED)); |
3043 EXPECT_TRUE(fred.Get(PARENT_ID) == joe.Get(ID)); | 3044 EXPECT_TRUE(fred.Get(PARENT_ID) == joe.Get(ID)); |
3044 EXPECT_TRUE(joe.Get(PARENT_ID) == bob.Get(ID)); | 3045 EXPECT_TRUE(joe.Get(PARENT_ID) == bob.Get(ID)); |
3045 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); | 3046 EXPECT_TRUE(bob.Get(PARENT_ID) == root_id_); |
3046 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); | 3047 EXPECT_FALSE(fred.Get(IS_UNAPPLIED_UPDATE)); |
3047 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 3048 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
3048 EXPECT_FALSE(joe.Get(IS_UNAPPLIED_UPDATE)); | 3049 EXPECT_FALSE(joe.Get(IS_UNAPPLIED_UPDATE)); |
3049 } | 3050 } |
3050 saw_syncer_event_ = false; | 3051 saw_syncer_event_ = false; |
3051 } | 3052 } |
3052 | 3053 |
3053 TEST_F(SyncerTest, NewServerItemInAFolderHierarchyWeHaveDeleted2) { | 3054 TEST_F(SyncerTest, NewServerItemInAFolderHierarchyWeHaveDeleted2) { |
3054 // The difference here is that the hierarchy's not in the root. We have | 3055 // The difference here is that the hierarchy's not in the root. We have |
3055 // another entry that shouldn't be touched. | 3056 // another entry that shouldn't be touched. |
3056 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3057 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3057 CHECK(dir.good()); | 3058 CHECK(dir.good()); |
3058 mock_server_->AddUpdateDirectory(4, 0, "susan", 1, 10); | 3059 mock_server_->AddUpdateDirectory(4, 0, "susan", 1, 10); |
3059 mock_server_->AddUpdateDirectory(1, 4, "bob", 1, 10); | 3060 mock_server_->AddUpdateDirectory(1, 4, "bob", 1, 10); |
3060 mock_server_->AddUpdateDirectory(2, 1, "joe", 1, 10); | 3061 mock_server_->AddUpdateDirectory(2, 1, "joe", 1, 10); |
3061 LoopSyncShare(); | 3062 LoopSyncShare(); |
3062 { | 3063 { |
3063 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3064 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3064 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3065 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3065 ASSERT_TRUE(bob.good()); | 3066 ASSERT_TRUE(bob.good()); |
3066 bob.Put(IS_UNSYNCED, true); | 3067 bob.Put(IS_UNSYNCED, true); |
3067 bob.Put(IS_DEL, true); | 3068 bob.Put(IS_DEL, true); |
3068 MutableEntry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3069 MutableEntry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3069 ASSERT_TRUE(joe.good()); | 3070 ASSERT_TRUE(joe.good()); |
3070 joe.Put(IS_UNSYNCED, true); | 3071 joe.Put(IS_UNSYNCED, true); |
3071 joe.Put(IS_DEL, true); | 3072 joe.Put(IS_DEL, true); |
3072 } | 3073 } |
3073 mock_server_->AddUpdateDirectory(3, 2, "fred", 2, 20); | 3074 mock_server_->AddUpdateDirectory(3, 2, "fred", 2, 20); |
3074 mock_server_->set_conflict_all_commits(true); | 3075 mock_server_->set_conflict_all_commits(true); |
3075 LoopSyncShare(); | 3076 LoopSyncShare(); |
3076 LoopSyncShare(); | 3077 LoopSyncShare(); |
3077 { | 3078 { |
3078 ReadTransaction trans(dir, __FILE__, __LINE__); | 3079 ReadTransaction trans(dir, FROM_HERE); |
3079 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3080 Entry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3080 ASSERT_TRUE(bob.good()); | 3081 ASSERT_TRUE(bob.good()); |
3081 Entry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3082 Entry joe(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3082 ASSERT_TRUE(joe.good()); | 3083 ASSERT_TRUE(joe.good()); |
3083 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(3)); | 3084 Entry fred(&trans, GET_BY_ID, ids_.FromNumber(3)); |
3084 ASSERT_TRUE(fred.good()); | 3085 ASSERT_TRUE(fred.good()); |
3085 Entry susan(&trans, GET_BY_ID, ids_.FromNumber(4)); | 3086 Entry susan(&trans, GET_BY_ID, ids_.FromNumber(4)); |
3086 ASSERT_TRUE(susan.good()); | 3087 ASSERT_TRUE(susan.good()); |
3087 EXPECT_FALSE(susan.Get(IS_UNSYNCED)); | 3088 EXPECT_FALSE(susan.Get(IS_UNSYNCED)); |
3088 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 3089 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
(...skipping 19 matching lines...) Expand all Loading... |
3108 static const int64 susan_int_id_ = 4; | 3109 static const int64 susan_int_id_ = 4; |
3109 | 3110 |
3110 void DeleteSusanInRoot() { | 3111 void DeleteSusanInRoot() { |
3111 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3112 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3112 ASSERT_TRUE(dir.good()); | 3113 ASSERT_TRUE(dir.good()); |
3113 | 3114 |
3114 const syncable::Id susan_id = TestIdFactory::FromNumber(susan_int_id_); | 3115 const syncable::Id susan_id = TestIdFactory::FromNumber(susan_int_id_); |
3115 ASSERT_GT(countdown_till_delete_, 0); | 3116 ASSERT_GT(countdown_till_delete_, 0); |
3116 if (0 != --countdown_till_delete_) | 3117 if (0 != --countdown_till_delete_) |
3117 return; | 3118 return; |
3118 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3119 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3119 MutableEntry susan(&trans, GET_BY_ID, susan_id); | 3120 MutableEntry susan(&trans, GET_BY_ID, susan_id); |
3120 Directory::ChildHandles children; | 3121 Directory::ChildHandles children; |
3121 dir->GetChildHandlesById(&trans, susan.Get(ID), &children); | 3122 dir->GetChildHandlesById(&trans, susan.Get(ID), &children); |
3122 ASSERT_TRUE(0 == children.size()); | 3123 ASSERT_TRUE(0 == children.size()); |
3123 susan.Put(IS_DEL, true); | 3124 susan.Put(IS_DEL, true); |
3124 susan.Put(IS_UNSYNCED, true); | 3125 susan.Put(IS_UNSYNCED, true); |
3125 } | 3126 } |
3126 | 3127 |
3127 protected: | 3128 protected: |
3128 int countdown_till_delete_; | 3129 int countdown_till_delete_; |
(...skipping 10 matching lines...) Expand all Loading... |
3139 const syncable::Id joe_id = TestIdFactory::FromNumber(2); | 3140 const syncable::Id joe_id = TestIdFactory::FromNumber(2); |
3140 const syncable::Id fred_id = TestIdFactory::FromNumber(3); | 3141 const syncable::Id fred_id = TestIdFactory::FromNumber(3); |
3141 const syncable::Id susan_id = TestIdFactory::FromNumber(susan_int_id_); | 3142 const syncable::Id susan_id = TestIdFactory::FromNumber(susan_int_id_); |
3142 | 3143 |
3143 mock_server_->AddUpdateDirectory(susan_id, TestIdFactory::root(), | 3144 mock_server_->AddUpdateDirectory(susan_id, TestIdFactory::root(), |
3144 "susan", 1, 10); | 3145 "susan", 1, 10); |
3145 mock_server_->AddUpdateDirectory(bob_id, susan_id, "bob", 1, 10); | 3146 mock_server_->AddUpdateDirectory(bob_id, susan_id, "bob", 1, 10); |
3146 mock_server_->AddUpdateDirectory(joe_id, bob_id, "joe", 1, 10); | 3147 mock_server_->AddUpdateDirectory(joe_id, bob_id, "joe", 1, 10); |
3147 LoopSyncShare(); | 3148 LoopSyncShare(); |
3148 { | 3149 { |
3149 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3150 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3150 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 3151 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
3151 ASSERT_TRUE(bob.good()); | 3152 ASSERT_TRUE(bob.good()); |
3152 bob.Put(IS_UNSYNCED, true); | 3153 bob.Put(IS_UNSYNCED, true); |
3153 bob.Put(IS_DEL, true); | 3154 bob.Put(IS_DEL, true); |
3154 | 3155 |
3155 MutableEntry joe(&trans, GET_BY_ID, joe_id); | 3156 MutableEntry joe(&trans, GET_BY_ID, joe_id); |
3156 ASSERT_TRUE(joe.good()); | 3157 ASSERT_TRUE(joe.good()); |
3157 joe.Put(IS_UNSYNCED, true); | 3158 joe.Put(IS_UNSYNCED, true); |
3158 joe.Put(IS_DEL, true); | 3159 joe.Put(IS_DEL, true); |
3159 } | 3160 } |
3160 mock_server_->AddUpdateDirectory(fred_id, joe_id, "fred", 2, 20); | 3161 mock_server_->AddUpdateDirectory(fred_id, joe_id, "fred", 2, 20); |
3161 mock_server_->set_conflict_all_commits(true); | 3162 mock_server_->set_conflict_all_commits(true); |
3162 countdown_till_delete_ = 2; | 3163 countdown_till_delete_ = 2; |
3163 syncer_->pre_conflict_resolution_closure_ = | 3164 syncer_->pre_conflict_resolution_closure_ = |
3164 NewCallback<SusanDeletingTest>(this, | 3165 NewCallback<SusanDeletingTest>(this, |
3165 &SusanDeletingTest::DeleteSusanInRoot); | 3166 &SusanDeletingTest::DeleteSusanInRoot); |
3166 SyncShareAsDelegate(); | 3167 SyncShareAsDelegate(); |
3167 SyncShareAsDelegate(); | 3168 SyncShareAsDelegate(); |
3168 { | 3169 { |
3169 ReadTransaction trans(dir, __FILE__, __LINE__); | 3170 ReadTransaction trans(dir, FROM_HERE); |
3170 Entry bob(&trans, GET_BY_ID, bob_id); | 3171 Entry bob(&trans, GET_BY_ID, bob_id); |
3171 ASSERT_TRUE(bob.good()); | 3172 ASSERT_TRUE(bob.good()); |
3172 Entry joe(&trans, GET_BY_ID, joe_id); | 3173 Entry joe(&trans, GET_BY_ID, joe_id); |
3173 ASSERT_TRUE(joe.good()); | 3174 ASSERT_TRUE(joe.good()); |
3174 Entry fred(&trans, GET_BY_ID, fred_id); | 3175 Entry fred(&trans, GET_BY_ID, fred_id); |
3175 ASSERT_TRUE(fred.good()); | 3176 ASSERT_TRUE(fred.good()); |
3176 Entry susan(&trans, GET_BY_ID, susan_id); | 3177 Entry susan(&trans, GET_BY_ID, susan_id); |
3177 ASSERT_TRUE(susan.good()); | 3178 ASSERT_TRUE(susan.good()); |
3178 EXPECT_FALSE(susan.Get(IS_UNAPPLIED_UPDATE)); | 3179 EXPECT_FALSE(susan.Get(IS_UNAPPLIED_UPDATE)); |
3179 EXPECT_TRUE(fred.Get(IS_UNAPPLIED_UPDATE)); | 3180 EXPECT_TRUE(fred.Get(IS_UNAPPLIED_UPDATE)); |
3180 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 3181 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
3181 EXPECT_FALSE(joe.Get(IS_UNAPPLIED_UPDATE)); | 3182 EXPECT_FALSE(joe.Get(IS_UNAPPLIED_UPDATE)); |
3182 EXPECT_TRUE(susan.Get(IS_UNSYNCED)); | 3183 EXPECT_TRUE(susan.Get(IS_UNSYNCED)); |
3183 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 3184 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
3184 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 3185 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
3185 EXPECT_TRUE(joe.Get(IS_UNSYNCED)); | 3186 EXPECT_TRUE(joe.Get(IS_UNSYNCED)); |
3186 } | 3187 } |
3187 EXPECT_TRUE(0 == countdown_till_delete_); | 3188 EXPECT_TRUE(0 == countdown_till_delete_); |
3188 delete syncer_->pre_conflict_resolution_closure_; | 3189 delete syncer_->pre_conflict_resolution_closure_; |
3189 syncer_->pre_conflict_resolution_closure_ = NULL; | 3190 syncer_->pre_conflict_resolution_closure_ = NULL; |
3190 LoopSyncShare(); | 3191 LoopSyncShare(); |
3191 LoopSyncShare(); | 3192 LoopSyncShare(); |
3192 { | 3193 { |
3193 ReadTransaction trans(dir, __FILE__, __LINE__); | 3194 ReadTransaction trans(dir, FROM_HERE); |
3194 Entry bob(&trans, GET_BY_ID, bob_id); | 3195 Entry bob(&trans, GET_BY_ID, bob_id); |
3195 ASSERT_TRUE(bob.good()); | 3196 ASSERT_TRUE(bob.good()); |
3196 Entry joe(&trans, GET_BY_ID, joe_id); | 3197 Entry joe(&trans, GET_BY_ID, joe_id); |
3197 ASSERT_TRUE(joe.good()); | 3198 ASSERT_TRUE(joe.good()); |
3198 Entry fred(&trans, GET_BY_ID, fred_id); | 3199 Entry fred(&trans, GET_BY_ID, fred_id); |
3199 ASSERT_TRUE(fred.good()); | 3200 ASSERT_TRUE(fred.good()); |
3200 Entry susan(&trans, GET_BY_ID, susan_id); | 3201 Entry susan(&trans, GET_BY_ID, susan_id); |
3201 ASSERT_TRUE(susan.good()); | 3202 ASSERT_TRUE(susan.good()); |
3202 EXPECT_TRUE(susan.Get(IS_UNSYNCED)); | 3203 EXPECT_TRUE(susan.Get(IS_UNSYNCED)); |
3203 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); | 3204 EXPECT_FALSE(fred.Get(IS_UNSYNCED)); |
(...skipping 19 matching lines...) Expand all Loading... |
3223 const syncable::Id fred_id = ids_.NewServerId(); | 3224 const syncable::Id fred_id = ids_.NewServerId(); |
3224 const syncable::Id alice_id = ids_.NewServerId(); | 3225 const syncable::Id alice_id = ids_.NewServerId(); |
3225 | 3226 |
3226 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 3227 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
3227 "bob", 1, 10); | 3228 "bob", 1, 10); |
3228 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 3229 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
3229 "fred", 1, 10); | 3230 "fred", 1, 10); |
3230 mock_server_->AddUpdateDirectory(alice_id, fred_id, "alice", 1, 10); | 3231 mock_server_->AddUpdateDirectory(alice_id, fred_id, "alice", 1, 10); |
3231 SyncShareAsDelegate(); | 3232 SyncShareAsDelegate(); |
3232 { | 3233 { |
3233 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3234 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3234 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 3235 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
3235 ASSERT_TRUE(bob.good()); | 3236 ASSERT_TRUE(bob.good()); |
3236 bob.Put(IS_UNSYNCED, true); | 3237 bob.Put(IS_UNSYNCED, true); |
3237 bob.Put(PARENT_ID, alice_id); // Move into alice. | 3238 bob.Put(PARENT_ID, alice_id); // Move into alice. |
3238 } | 3239 } |
3239 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 3240 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
3240 "fred", 2, 20); | 3241 "fred", 2, 20); |
3241 mock_server_->SetLastUpdateDeleted(); | 3242 mock_server_->SetLastUpdateDeleted(); |
3242 mock_server_->AddUpdateDirectory(alice_id, TestIdFactory::root(), | 3243 mock_server_->AddUpdateDirectory(alice_id, TestIdFactory::root(), |
3243 "alice", 2, 20); | 3244 "alice", 2, 20); |
3244 mock_server_->SetLastUpdateDeleted(); | 3245 mock_server_->SetLastUpdateDeleted(); |
3245 mock_server_->set_conflict_all_commits(true); | 3246 mock_server_->set_conflict_all_commits(true); |
3246 SyncShareAsDelegate(); | 3247 SyncShareAsDelegate(); |
3247 SyncShareAsDelegate(); | 3248 SyncShareAsDelegate(); |
3248 { | 3249 { |
3249 // Bob is the entry at the bottom of the tree. | 3250 // Bob is the entry at the bottom of the tree. |
3250 // The tree should be regenerated and old IDs removed. | 3251 // The tree should be regenerated and old IDs removed. |
3251 ReadTransaction trans(dir, __FILE__, __LINE__); | 3252 ReadTransaction trans(dir, FROM_HERE); |
3252 Entry bob(&trans, GET_BY_ID, bob_id); | 3253 Entry bob(&trans, GET_BY_ID, bob_id); |
3253 ASSERT_TRUE(bob.good()); | 3254 ASSERT_TRUE(bob.good()); |
3254 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 3255 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
3255 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); | 3256 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); |
3256 | 3257 |
3257 // Old one should be deleted, but new one should have been made. | 3258 // Old one should be deleted, but new one should have been made. |
3258 Entry dead_alice(&trans, GET_BY_ID, alice_id); | 3259 Entry dead_alice(&trans, GET_BY_ID, alice_id); |
3259 EXPECT_FALSE(dead_alice.good()); | 3260 EXPECT_FALSE(dead_alice.good()); |
3260 EXPECT_NE(bob.Get(PARENT_ID), alice_id); | 3261 EXPECT_NE(bob.Get(PARENT_ID), alice_id); |
3261 | 3262 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3295 const syncable::Id susan_id = ids_.NewServerId(); | 3296 const syncable::Id susan_id = ids_.NewServerId(); |
3296 | 3297 |
3297 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), | 3298 mock_server_->AddUpdateDirectory(bob_id, TestIdFactory::root(), |
3298 "bob", 1, 10); | 3299 "bob", 1, 10); |
3299 mock_server_->AddUpdateDirectory(susan_id, TestIdFactory::root(), | 3300 mock_server_->AddUpdateDirectory(susan_id, TestIdFactory::root(), |
3300 "susan", 1, 10); | 3301 "susan", 1, 10); |
3301 mock_server_->AddUpdateDirectory(fred_id, susan_id, "fred", 1, 10); | 3302 mock_server_->AddUpdateDirectory(fred_id, susan_id, "fred", 1, 10); |
3302 mock_server_->AddUpdateDirectory(alice_id, fred_id, "alice", 1, 10); | 3303 mock_server_->AddUpdateDirectory(alice_id, fred_id, "alice", 1, 10); |
3303 SyncShareAsDelegate(); | 3304 SyncShareAsDelegate(); |
3304 { | 3305 { |
3305 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3306 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3306 MutableEntry bob(&trans, GET_BY_ID, bob_id); | 3307 MutableEntry bob(&trans, GET_BY_ID, bob_id); |
3307 ASSERT_TRUE(bob.good()); | 3308 ASSERT_TRUE(bob.good()); |
3308 bob.Put(IS_UNSYNCED, true); | 3309 bob.Put(IS_UNSYNCED, true); |
3309 bob.Put(PARENT_ID, alice_id); // Move into alice. | 3310 bob.Put(PARENT_ID, alice_id); // Move into alice. |
3310 } | 3311 } |
3311 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), | 3312 mock_server_->AddUpdateDirectory(fred_id, TestIdFactory::root(), |
3312 "fred", 2, 20); | 3313 "fred", 2, 20); |
3313 mock_server_->SetLastUpdateDeleted(); | 3314 mock_server_->SetLastUpdateDeleted(); |
3314 mock_server_->AddUpdateDirectory(alice_id, TestIdFactory::root(), | 3315 mock_server_->AddUpdateDirectory(alice_id, TestIdFactory::root(), |
3315 "alice", 2, 20); | 3316 "alice", 2, 20); |
3316 mock_server_->SetLastUpdateDeleted(); | 3317 mock_server_->SetLastUpdateDeleted(); |
3317 mock_server_->set_conflict_all_commits(true); | 3318 mock_server_->set_conflict_all_commits(true); |
3318 SyncShareAsDelegate(); | 3319 SyncShareAsDelegate(); |
3319 SyncShareAsDelegate(); | 3320 SyncShareAsDelegate(); |
3320 { | 3321 { |
3321 // Root | 3322 // Root |
3322 // |- Susan | 3323 // |- Susan |
3323 // |- Fred | 3324 // |- Fred |
3324 // |- Alice | 3325 // |- Alice |
3325 // |- Bob | 3326 // |- Bob |
3326 | 3327 |
3327 ReadTransaction trans(dir, __FILE__, __LINE__); | 3328 ReadTransaction trans(dir, FROM_HERE); |
3328 Entry bob(&trans, GET_BY_ID, bob_id); | 3329 Entry bob(&trans, GET_BY_ID, bob_id); |
3329 ASSERT_TRUE(bob.good()); | 3330 ASSERT_TRUE(bob.good()); |
3330 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); | 3331 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); |
3331 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); // Parent changed | 3332 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); // Parent changed |
3332 EXPECT_NE(bob.Get(PARENT_ID), alice_id); | 3333 EXPECT_NE(bob.Get(PARENT_ID), alice_id); |
3333 | 3334 |
3334 // New one was born, this is the old one | 3335 // New one was born, this is the old one |
3335 Entry dead_alice(&trans, GET_BY_ID, alice_id); | 3336 Entry dead_alice(&trans, GET_BY_ID, alice_id); |
3336 EXPECT_FALSE(dead_alice.good()); | 3337 EXPECT_FALSE(dead_alice.good()); |
3337 | 3338 |
(...skipping 24 matching lines...) Expand all Loading... |
3362 } | 3363 } |
3363 saw_syncer_event_ = false; | 3364 saw_syncer_event_ = false; |
3364 } | 3365 } |
3365 | 3366 |
3366 // This test is to reproduce a check failure. Sometimes we would get a bad ID | 3367 // This test is to reproduce a check failure. Sometimes we would get a bad ID |
3367 // back when creating an entry. | 3368 // back when creating an entry. |
3368 TEST_F(SyncerTest, DuplicateIDReturn) { | 3369 TEST_F(SyncerTest, DuplicateIDReturn) { |
3369 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3370 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3370 ASSERT_TRUE(dir.good()); | 3371 ASSERT_TRUE(dir.good()); |
3371 { | 3372 { |
3372 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3373 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3373 MutableEntry folder(&trans, CREATE, trans.root_id(), "bob"); | 3374 MutableEntry folder(&trans, CREATE, trans.root_id(), "bob"); |
3374 ASSERT_TRUE(folder.good()); | 3375 ASSERT_TRUE(folder.good()); |
3375 folder.Put(IS_UNSYNCED, true); | 3376 folder.Put(IS_UNSYNCED, true); |
3376 folder.Put(IS_DIR, true); | 3377 folder.Put(IS_DIR, true); |
3377 folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 3378 folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
3378 MutableEntry folder2(&trans, CREATE, trans.root_id(), "fred"); | 3379 MutableEntry folder2(&trans, CREATE, trans.root_id(), "fred"); |
3379 ASSERT_TRUE(folder2.good()); | 3380 ASSERT_TRUE(folder2.good()); |
3380 folder2.Put(IS_UNSYNCED, false); | 3381 folder2.Put(IS_UNSYNCED, false); |
3381 folder2.Put(IS_DIR, true); | 3382 folder2.Put(IS_DIR, true); |
3382 folder2.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 3383 folder2.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
3383 folder2.Put(BASE_VERSION, 3); | 3384 folder2.Put(BASE_VERSION, 3); |
3384 folder2.Put(ID, syncable::Id::CreateFromServerId("mock_server:10000")); | 3385 folder2.Put(ID, syncable::Id::CreateFromServerId("mock_server:10000")); |
3385 } | 3386 } |
3386 mock_server_->set_next_new_id(10000); | 3387 mock_server_->set_next_new_id(10000); |
3387 EXPECT_TRUE(1 == dir->unsynced_entity_count()); | 3388 EXPECT_TRUE(1 == dir->unsynced_entity_count()); |
3388 // we get back a bad id in here (should never happen). | 3389 // we get back a bad id in here (should never happen). |
3389 SyncShareAsDelegate(); | 3390 SyncShareAsDelegate(); |
3390 EXPECT_TRUE(1 == dir->unsynced_entity_count()); | 3391 EXPECT_TRUE(1 == dir->unsynced_entity_count()); |
3391 SyncShareAsDelegate(); // another bad id in here. | 3392 SyncShareAsDelegate(); // another bad id in here. |
3392 EXPECT_TRUE(0 == dir->unsynced_entity_count()); | 3393 EXPECT_TRUE(0 == dir->unsynced_entity_count()); |
3393 saw_syncer_event_ = false; | 3394 saw_syncer_event_ = false; |
3394 } | 3395 } |
3395 | 3396 |
3396 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) { | 3397 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) { |
3397 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3398 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3398 ASSERT_TRUE(dir.good()); | 3399 ASSERT_TRUE(dir.good()); |
3399 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); | 3400 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); |
3400 SyncShareAsDelegate(); | 3401 SyncShareAsDelegate(); |
3401 { | 3402 { |
3402 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3403 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3403 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3404 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3404 ASSERT_TRUE(bob.good()); | 3405 ASSERT_TRUE(bob.good()); |
3405 // This is valid, because the parent could have gone away a long time ago. | 3406 // This is valid, because the parent could have gone away a long time ago. |
3406 bob.Put(PARENT_ID, ids_.FromNumber(54)); | 3407 bob.Put(PARENT_ID, ids_.FromNumber(54)); |
3407 bob.Put(IS_DEL, true); | 3408 bob.Put(IS_DEL, true); |
3408 bob.Put(IS_UNSYNCED, true); | 3409 bob.Put(IS_UNSYNCED, true); |
3409 } | 3410 } |
3410 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10); | 3411 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10); |
3411 SyncShareAsDelegate(); | 3412 SyncShareAsDelegate(); |
3412 SyncShareAsDelegate(); | 3413 SyncShareAsDelegate(); |
3413 } | 3414 } |
3414 | 3415 |
3415 TEST_F(SyncerTest, ConflictResolverMergeOverwritesLocalEntry) { | 3416 TEST_F(SyncerTest, ConflictResolverMergeOverwritesLocalEntry) { |
3416 // This test would die because it would rename a entry to a name that was | 3417 // This test would die because it would rename a entry to a name that was |
3417 // taken in the namespace | 3418 // taken in the namespace |
3418 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3419 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3419 CHECK(dir.good()); | 3420 CHECK(dir.good()); |
3420 | 3421 |
3421 ConflictSet conflict_set; | 3422 ConflictSet conflict_set; |
3422 { | 3423 { |
3423 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3424 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3424 | 3425 |
3425 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); | 3426 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); |
3426 local_deleted.Put(ID, ids_.FromNumber(1)); | 3427 local_deleted.Put(ID, ids_.FromNumber(1)); |
3427 local_deleted.Put(BASE_VERSION, 1); | 3428 local_deleted.Put(BASE_VERSION, 1); |
3428 local_deleted.Put(IS_DEL, true); | 3429 local_deleted.Put(IS_DEL, true); |
3429 local_deleted.Put(IS_UNSYNCED, true); | 3430 local_deleted.Put(IS_UNSYNCED, true); |
3430 | 3431 |
3431 MutableEntry in_the_way(&trans, CREATE, trans.root_id(), "name"); | 3432 MutableEntry in_the_way(&trans, CREATE, trans.root_id(), "name"); |
3432 in_the_way.Put(ID, ids_.FromNumber(2)); | 3433 in_the_way.Put(ID, ids_.FromNumber(2)); |
3433 in_the_way.Put(BASE_VERSION, 1); | 3434 in_the_way.Put(BASE_VERSION, 1); |
3434 | 3435 |
3435 MutableEntry update(&trans, CREATE_NEW_UPDATE_ITEM, ids_.FromNumber(3)); | 3436 MutableEntry update(&trans, CREATE_NEW_UPDATE_ITEM, ids_.FromNumber(3)); |
3436 update.Put(BASE_VERSION, 1); | 3437 update.Put(BASE_VERSION, 1); |
3437 update.Put(SERVER_NON_UNIQUE_NAME, "name"); | 3438 update.Put(SERVER_NON_UNIQUE_NAME, "name"); |
3438 update.Put(PARENT_ID, ids_.FromNumber(0)); | 3439 update.Put(PARENT_ID, ids_.FromNumber(0)); |
3439 update.Put(IS_UNAPPLIED_UPDATE, true); | 3440 update.Put(IS_UNAPPLIED_UPDATE, true); |
3440 | 3441 |
3441 conflict_set.push_back(ids_.FromNumber(1)); | 3442 conflict_set.push_back(ids_.FromNumber(1)); |
3442 conflict_set.push_back(ids_.FromNumber(3)); | 3443 conflict_set.push_back(ids_.FromNumber(3)); |
3443 } | 3444 } |
3444 { | 3445 { |
3445 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3446 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3446 context_->resolver()->ProcessConflictSet(&trans, &conflict_set, 50); | 3447 context_->resolver()->ProcessConflictSet(&trans, &conflict_set, 50); |
3447 } | 3448 } |
3448 } | 3449 } |
3449 | 3450 |
3450 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) { | 3451 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) { |
3451 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3452 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3452 CHECK(dir.good()); | 3453 CHECK(dir.good()); |
3453 | 3454 |
3454 { | 3455 { |
3455 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3456 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3456 | 3457 |
3457 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); | 3458 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); |
3458 local_deleted.Put(ID, ids_.FromNumber(1)); | 3459 local_deleted.Put(ID, ids_.FromNumber(1)); |
3459 local_deleted.Put(BASE_VERSION, 1); | 3460 local_deleted.Put(BASE_VERSION, 1); |
3460 local_deleted.Put(IS_DEL, true); | 3461 local_deleted.Put(IS_DEL, true); |
3461 local_deleted.Put(IS_DIR, false); | 3462 local_deleted.Put(IS_DIR, false); |
3462 local_deleted.Put(IS_UNSYNCED, true); | 3463 local_deleted.Put(IS_UNSYNCED, true); |
3463 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 3464 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
3464 } | 3465 } |
3465 | 3466 |
3466 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); | 3467 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); |
3467 | 3468 |
3468 // We don't care about actually committing, just the resolution. | 3469 // We don't care about actually committing, just the resolution. |
3469 mock_server_->set_conflict_all_commits(true); | 3470 mock_server_->set_conflict_all_commits(true); |
3470 SyncShareAsDelegate(); | 3471 SyncShareAsDelegate(); |
3471 | 3472 |
3472 { | 3473 { |
3473 ReadTransaction trans(dir, __FILE__, __LINE__); | 3474 ReadTransaction trans(dir, FROM_HERE); |
3474 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3475 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3475 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 10); | 3476 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 10); |
3476 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); | 3477 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); |
3477 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); | 3478 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); |
3478 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); | 3479 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); |
3479 EXPECT_TRUE(local_deleted.Get(IS_DIR) == false); | 3480 EXPECT_TRUE(local_deleted.Get(IS_DIR) == false); |
3480 } | 3481 } |
3481 } | 3482 } |
3482 | 3483 |
3483 // See what happens if the IS_DIR bit gets flipped. This can cause us | 3484 // See what happens if the IS_DIR bit gets flipped. This can cause us |
3484 // all kinds of disasters. | 3485 // all kinds of disasters. |
3485 TEST_F(SyncerTest, UpdateFlipsTheFolderBit) { | 3486 TEST_F(SyncerTest, UpdateFlipsTheFolderBit) { |
3486 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3487 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3487 CHECK(dir.good()); | 3488 CHECK(dir.good()); |
3488 | 3489 |
3489 // Local object: a deleted directory (container), revision 1, unsynced. | 3490 // Local object: a deleted directory (container), revision 1, unsynced. |
3490 { | 3491 { |
3491 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3492 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3492 | 3493 |
3493 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); | 3494 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); |
3494 local_deleted.Put(ID, ids_.FromNumber(1)); | 3495 local_deleted.Put(ID, ids_.FromNumber(1)); |
3495 local_deleted.Put(BASE_VERSION, 1); | 3496 local_deleted.Put(BASE_VERSION, 1); |
3496 local_deleted.Put(IS_DEL, true); | 3497 local_deleted.Put(IS_DEL, true); |
3497 local_deleted.Put(IS_DIR, true); | 3498 local_deleted.Put(IS_DIR, true); |
3498 local_deleted.Put(IS_UNSYNCED, true); | 3499 local_deleted.Put(IS_UNSYNCED, true); |
3499 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 3500 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
3500 } | 3501 } |
3501 | 3502 |
3502 // Server update: entry-type object (not a container), revision 10. | 3503 // Server update: entry-type object (not a container), revision 10. |
3503 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); | 3504 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); |
3504 | 3505 |
3505 // Don't attempt to commit. | 3506 // Don't attempt to commit. |
3506 mock_server_->set_conflict_all_commits(true); | 3507 mock_server_->set_conflict_all_commits(true); |
3507 | 3508 |
3508 // The syncer should not attempt to apply the invalid update. | 3509 // The syncer should not attempt to apply the invalid update. |
3509 SyncShareAsDelegate(); | 3510 SyncShareAsDelegate(); |
3510 | 3511 |
3511 { | 3512 { |
3512 ReadTransaction trans(dir, __FILE__, __LINE__); | 3513 ReadTransaction trans(dir, FROM_HERE); |
3513 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3514 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3514 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 1); | 3515 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 1); |
3515 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); | 3516 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); |
3516 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); | 3517 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); |
3517 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); | 3518 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); |
3518 EXPECT_TRUE(local_deleted.Get(IS_DIR) == true); | 3519 EXPECT_TRUE(local_deleted.Get(IS_DIR) == true); |
3519 } | 3520 } |
3520 } | 3521 } |
3521 | 3522 |
3522 TEST(SyncerSyncProcessState, MergeSetsTest) { | 3523 TEST(SyncerSyncProcessState, MergeSetsTest) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3555 // Bug Synopsis: | 3556 // Bug Synopsis: |
3556 // Merge conflict resolution will merge a new local entry with another entry | 3557 // Merge conflict resolution will merge a new local entry with another entry |
3557 // that needs updates, resulting in CHECK. | 3558 // that needs updates, resulting in CHECK. |
3558 TEST_F(SyncerTest, MergingExistingItems) { | 3559 TEST_F(SyncerTest, MergingExistingItems) { |
3559 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3560 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3560 CHECK(dir.good()); | 3561 CHECK(dir.good()); |
3561 mock_server_->set_conflict_all_commits(true); | 3562 mock_server_->set_conflict_all_commits(true); |
3562 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); | 3563 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); |
3563 SyncShareAsDelegate(); | 3564 SyncShareAsDelegate(); |
3564 { | 3565 { |
3565 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3566 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3566 MutableEntry entry(&trans, CREATE, trans.root_id(), "Copy of base"); | 3567 MutableEntry entry(&trans, CREATE, trans.root_id(), "Copy of base"); |
3567 WriteTestDataToEntry(&trans, &entry); | 3568 WriteTestDataToEntry(&trans, &entry); |
3568 } | 3569 } |
3569 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); | 3570 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); |
3570 SyncRepeatedlyToTriggerConflictResolution(session_.get()); | 3571 SyncRepeatedlyToTriggerConflictResolution(session_.get()); |
3571 } | 3572 } |
3572 | 3573 |
3573 TEST_F(SyncerTest, OneBajillionUpdates) { | 3574 TEST_F(SyncerTest, OneBajillionUpdates) { |
3574 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3575 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3575 CHECK(dir.good()); | 3576 CHECK(dir.good()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3611 mock_server_->NextUpdateBatch(); | 3612 mock_server_->NextUpdateBatch(); |
3612 mock_server_->SetNewTimestamp(i + 1); | 3613 mock_server_->SetNewTimestamp(i + 1); |
3613 mock_server_->SetChangesRemaining(depth - i); | 3614 mock_server_->SetChangesRemaining(depth - i); |
3614 } | 3615 } |
3615 | 3616 |
3616 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 3617 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); |
3617 EXPECT_FALSE(session_->status_controller()->syncer_status().syncer_stuck); | 3618 EXPECT_FALSE(session_->status_controller()->syncer_status().syncer_stuck); |
3618 | 3619 |
3619 // Ensure our folder hasn't somehow applied. | 3620 // Ensure our folder hasn't somehow applied. |
3620 { | 3621 { |
3621 ReadTransaction trans(dir, __FILE__, __LINE__); | 3622 ReadTransaction trans(dir, FROM_HERE); |
3622 Entry child(&trans, GET_BY_ID, stuck_entry_id); | 3623 Entry child(&trans, GET_BY_ID, stuck_entry_id); |
3623 EXPECT_TRUE(child.good()); | 3624 EXPECT_TRUE(child.good()); |
3624 EXPECT_TRUE(child.Get(IS_UNAPPLIED_UPDATE)); | 3625 EXPECT_TRUE(child.Get(IS_UNAPPLIED_UPDATE)); |
3625 EXPECT_TRUE(child.Get(IS_DEL)); | 3626 EXPECT_TRUE(child.Get(IS_DEL)); |
3626 EXPECT_FALSE(child.Get(IS_UNSYNCED)); | 3627 EXPECT_FALSE(child.Get(IS_UNSYNCED)); |
3627 } | 3628 } |
3628 | 3629 |
3629 // And finally the folder. | 3630 // And finally the folder. |
3630 mock_server_->AddUpdateDirectory(folder_id, | 3631 mock_server_->AddUpdateDirectory(folder_id, |
3631 TestIdFactory::root(), "folder", 1, 1); | 3632 TestIdFactory::root(), "folder", 1, 1); |
3632 mock_server_->SetChangesRemaining(0); | 3633 mock_server_->SetChangesRemaining(0); |
3633 LoopSyncShare(); | 3634 LoopSyncShare(); |
3634 LoopSyncShare(); | 3635 LoopSyncShare(); |
3635 // Check that everything is as expected after the commit. | 3636 // Check that everything is as expected after the commit. |
3636 { | 3637 { |
3637 ReadTransaction trans(dir, __FILE__, __LINE__); | 3638 ReadTransaction trans(dir, FROM_HERE); |
3638 Entry entry(&trans, GET_BY_ID, folder_id); | 3639 Entry entry(&trans, GET_BY_ID, folder_id); |
3639 ASSERT_TRUE(entry.good()); | 3640 ASSERT_TRUE(entry.good()); |
3640 Entry child(&trans, GET_BY_ID, stuck_entry_id); | 3641 Entry child(&trans, GET_BY_ID, stuck_entry_id); |
3641 EXPECT_EQ(entry.Get(ID), child.Get(PARENT_ID)); | 3642 EXPECT_EQ(entry.Get(ID), child.Get(PARENT_ID)); |
3642 EXPECT_EQ("stuck", child.Get(NON_UNIQUE_NAME)); | 3643 EXPECT_EQ("stuck", child.Get(NON_UNIQUE_NAME)); |
3643 EXPECT_TRUE(child.good()); | 3644 EXPECT_TRUE(child.good()); |
3644 } | 3645 } |
3645 } | 3646 } |
3646 | 3647 |
3647 TEST_F(SyncerTest, DontMergeTwoExistingItems) { | 3648 TEST_F(SyncerTest, DontMergeTwoExistingItems) { |
3648 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3649 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3649 EXPECT_TRUE(dir.good()); | 3650 EXPECT_TRUE(dir.good()); |
3650 mock_server_->set_conflict_all_commits(true); | 3651 mock_server_->set_conflict_all_commits(true); |
3651 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); | 3652 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); |
3652 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10); | 3653 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10); |
3653 SyncShareAsDelegate(); | 3654 SyncShareAsDelegate(); |
3654 { | 3655 { |
3655 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3656 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3656 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3657 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3657 ASSERT_TRUE(entry.good()); | 3658 ASSERT_TRUE(entry.good()); |
3658 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base")); | 3659 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base")); |
3659 entry.Put(IS_UNSYNCED, true); | 3660 entry.Put(IS_UNSYNCED, true); |
3660 } | 3661 } |
3661 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); | 3662 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); |
3662 SyncRepeatedlyToTriggerConflictResolution(session_.get()); | 3663 SyncRepeatedlyToTriggerConflictResolution(session_.get()); |
3663 { | 3664 { |
3664 ReadTransaction trans(dir, __FILE__, __LINE__); | 3665 ReadTransaction trans(dir, FROM_HERE); |
3665 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3666 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3666 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE)); | 3667 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE)); |
3667 EXPECT_FALSE(entry1.Get(IS_UNSYNCED)); | 3668 EXPECT_FALSE(entry1.Get(IS_UNSYNCED)); |
3668 EXPECT_FALSE(entry1.Get(IS_DEL)); | 3669 EXPECT_FALSE(entry1.Get(IS_DEL)); |
3669 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3670 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3670 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE)); | 3671 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE)); |
3671 EXPECT_TRUE(entry2.Get(IS_UNSYNCED)); | 3672 EXPECT_TRUE(entry2.Get(IS_UNSYNCED)); |
3672 EXPECT_FALSE(entry2.Get(IS_DEL)); | 3673 EXPECT_FALSE(entry2.Get(IS_DEL)); |
3673 EXPECT_EQ(entry1.Get(NON_UNIQUE_NAME), entry2.Get(NON_UNIQUE_NAME)); | 3674 EXPECT_EQ(entry1.Get(NON_UNIQUE_NAME), entry2.Get(NON_UNIQUE_NAME)); |
3674 } | 3675 } |
3675 } | 3676 } |
3676 | 3677 |
3677 TEST_F(SyncerTest, TestUndeleteUpdate) { | 3678 TEST_F(SyncerTest, TestUndeleteUpdate) { |
3678 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3679 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3679 EXPECT_TRUE(dir.good()); | 3680 EXPECT_TRUE(dir.good()); |
3680 mock_server_->set_conflict_all_commits(true); | 3681 mock_server_->set_conflict_all_commits(true); |
3681 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); | 3682 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); |
3682 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2); | 3683 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2); |
3683 SyncShareAsDelegate(); | 3684 SyncShareAsDelegate(); |
3684 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3); | 3685 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3); |
3685 mock_server_->SetLastUpdateDeleted(); | 3686 mock_server_->SetLastUpdateDeleted(); |
3686 SyncShareAsDelegate(); | 3687 SyncShareAsDelegate(); |
3687 | 3688 |
3688 int64 metahandle; | 3689 int64 metahandle; |
3689 { | 3690 { |
3690 ReadTransaction trans(dir, __FILE__, __LINE__); | 3691 ReadTransaction trans(dir, FROM_HERE); |
3691 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3692 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3692 ASSERT_TRUE(entry.good()); | 3693 ASSERT_TRUE(entry.good()); |
3693 EXPECT_TRUE(entry.Get(IS_DEL)); | 3694 EXPECT_TRUE(entry.Get(IS_DEL)); |
3694 metahandle = entry.Get(META_HANDLE); | 3695 metahandle = entry.Get(META_HANDLE); |
3695 } | 3696 } |
3696 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4); | 3697 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4); |
3697 mock_server_->SetLastUpdateDeleted(); | 3698 mock_server_->SetLastUpdateDeleted(); |
3698 SyncShareAsDelegate(); | 3699 SyncShareAsDelegate(); |
3699 // This used to be rejected as it's an undeletion. Now, it results in moving | 3700 // This used to be rejected as it's an undeletion. Now, it results in moving |
3700 // the delete path aside. | 3701 // the delete path aside. |
3701 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5); | 3702 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5); |
3702 SyncShareAsDelegate(); | 3703 SyncShareAsDelegate(); |
3703 { | 3704 { |
3704 ReadTransaction trans(dir, __FILE__, __LINE__); | 3705 ReadTransaction trans(dir, FROM_HERE); |
3705 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3706 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3706 ASSERT_TRUE(entry.good()); | 3707 ASSERT_TRUE(entry.good()); |
3707 EXPECT_TRUE(entry.Get(IS_DEL)); | 3708 EXPECT_TRUE(entry.Get(IS_DEL)); |
3708 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 3709 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
3709 EXPECT_TRUE(entry.Get(IS_UNAPPLIED_UPDATE)); | 3710 EXPECT_TRUE(entry.Get(IS_UNAPPLIED_UPDATE)); |
3710 EXPECT_NE(entry.Get(META_HANDLE), metahandle); | 3711 EXPECT_NE(entry.Get(META_HANDLE), metahandle); |
3711 } | 3712 } |
3712 } | 3713 } |
3713 | 3714 |
3714 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) { | 3715 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) { |
3715 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3716 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3716 EXPECT_TRUE(dir.good()); | 3717 EXPECT_TRUE(dir.good()); |
3717 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); | 3718 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); |
3718 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2); | 3719 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2); |
3719 SyncShareAsDelegate(); | 3720 SyncShareAsDelegate(); |
3720 { | 3721 { |
3721 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3722 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3722 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3723 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3723 ASSERT_TRUE(entry.good()); | 3724 ASSERT_TRUE(entry.good()); |
3724 EXPECT_TRUE(entry.Put(PARENT_ID, ids_.FromNumber(1))); | 3725 EXPECT_TRUE(entry.Put(PARENT_ID, ids_.FromNumber(1))); |
3725 EXPECT_TRUE(entry.Put(IS_UNSYNCED, true)); | 3726 EXPECT_TRUE(entry.Put(IS_UNSYNCED, true)); |
3726 } | 3727 } |
3727 SyncShareAsDelegate(); | 3728 SyncShareAsDelegate(); |
3728 // We use the same sync ts as before so our times match up. | 3729 // We use the same sync ts as before so our times match up. |
3729 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2); | 3730 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2); |
3730 SyncShareAsDelegate(); | 3731 SyncShareAsDelegate(); |
3731 } | 3732 } |
3732 | 3733 |
3733 // Don't crash when this occurs. | 3734 // Don't crash when this occurs. |
3734 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) { | 3735 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) { |
3735 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3736 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3736 CHECK(dir.good()); | 3737 CHECK(dir.good()); |
3737 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10); | 3738 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10); |
3738 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10); | 3739 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10); |
3739 // Used to cause a CHECK | 3740 // Used to cause a CHECK |
3740 SyncShareAsDelegate(); | 3741 SyncShareAsDelegate(); |
3741 { | 3742 { |
3742 ReadTransaction rtrans(dir, __FILE__, __LINE__); | 3743 ReadTransaction rtrans(dir, FROM_HERE); |
3743 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); | 3744 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); |
3744 ASSERT_TRUE(good_entry.good()); | 3745 ASSERT_TRUE(good_entry.good()); |
3745 EXPECT_FALSE(good_entry.Get(IS_UNAPPLIED_UPDATE)); | 3746 EXPECT_FALSE(good_entry.Get(IS_UNAPPLIED_UPDATE)); |
3746 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); | 3747 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); |
3747 ASSERT_TRUE(bad_parent.good()); | 3748 ASSERT_TRUE(bad_parent.good()); |
3748 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE)); | 3749 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE)); |
3749 } | 3750 } |
3750 } | 3751 } |
3751 | 3752 |
3752 const char kRootId[] = "0"; | 3753 const char kRootId[] = "0"; |
3753 | 3754 |
3754 TEST_F(SyncerTest, DirectoryUpdateTest) { | 3755 TEST_F(SyncerTest, DirectoryUpdateTest) { |
3755 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3756 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3756 CHECK(dir.good()); | 3757 CHECK(dir.good()); |
3757 | 3758 |
3758 Id in_root_id = ids_.NewServerId(); | 3759 Id in_root_id = ids_.NewServerId(); |
3759 Id in_in_root_id = ids_.NewServerId(); | 3760 Id in_in_root_id = ids_.NewServerId(); |
3760 | 3761 |
3761 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(), | 3762 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(), |
3762 "in_root_name", 2, 2); | 3763 "in_root_name", 2, 2); |
3763 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id, | 3764 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id, |
3764 "in_in_root_name", 3, 3); | 3765 "in_in_root_name", 3, 3); |
3765 SyncShareAsDelegate(); | 3766 SyncShareAsDelegate(); |
3766 { | 3767 { |
3767 ReadTransaction trans(dir, __FILE__, __LINE__); | 3768 ReadTransaction trans(dir, FROM_HERE); |
3768 Entry in_root(&trans, GET_BY_ID, in_root_id); | 3769 Entry in_root(&trans, GET_BY_ID, in_root_id); |
3769 ASSERT_TRUE(in_root.good()); | 3770 ASSERT_TRUE(in_root.good()); |
3770 EXPECT_EQ("in_root_name", in_root.Get(NON_UNIQUE_NAME)); | 3771 EXPECT_EQ("in_root_name", in_root.Get(NON_UNIQUE_NAME)); |
3771 EXPECT_EQ(TestIdFactory::root(), in_root.Get(PARENT_ID)); | 3772 EXPECT_EQ(TestIdFactory::root(), in_root.Get(PARENT_ID)); |
3772 | 3773 |
3773 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id); | 3774 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id); |
3774 ASSERT_TRUE(in_in_root.good()); | 3775 ASSERT_TRUE(in_in_root.good()); |
3775 EXPECT_EQ("in_in_root_name", in_in_root.Get(NON_UNIQUE_NAME)); | 3776 EXPECT_EQ("in_in_root_name", in_in_root.Get(NON_UNIQUE_NAME)); |
3776 EXPECT_EQ(in_root_id, in_in_root.Get(PARENT_ID)); | 3777 EXPECT_EQ(in_root_id, in_in_root.Get(PARENT_ID)); |
3777 } | 3778 } |
3778 } | 3779 } |
3779 | 3780 |
3780 TEST_F(SyncerTest, DirectoryCommitTest) { | 3781 TEST_F(SyncerTest, DirectoryCommitTest) { |
3781 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3782 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3782 CHECK(dir.good()); | 3783 CHECK(dir.good()); |
3783 | 3784 |
3784 syncable::Id in_root_id, in_dir_id; | 3785 syncable::Id in_root_id, in_dir_id; |
3785 int64 foo_metahandle; | 3786 int64 foo_metahandle; |
3786 int64 bar_metahandle; | 3787 int64 bar_metahandle; |
3787 | 3788 |
3788 { | 3789 { |
3789 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 3790 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
3790 MutableEntry parent(&wtrans, syncable::CREATE, root_id_, "foo"); | 3791 MutableEntry parent(&wtrans, syncable::CREATE, root_id_, "foo"); |
3791 ASSERT_TRUE(parent.good()); | 3792 ASSERT_TRUE(parent.good()); |
3792 parent.Put(syncable::IS_UNSYNCED, true); | 3793 parent.Put(syncable::IS_UNSYNCED, true); |
3793 parent.Put(syncable::IS_DIR, true); | 3794 parent.Put(syncable::IS_DIR, true); |
3794 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 3795 parent.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
3795 in_root_id = parent.Get(syncable::ID); | 3796 in_root_id = parent.Get(syncable::ID); |
3796 foo_metahandle = parent.Get(META_HANDLE); | 3797 foo_metahandle = parent.Get(META_HANDLE); |
3797 | 3798 |
3798 MutableEntry child(&wtrans, syncable::CREATE, parent.Get(ID), "bar"); | 3799 MutableEntry child(&wtrans, syncable::CREATE, parent.Get(ID), "bar"); |
3799 ASSERT_TRUE(child.good()); | 3800 ASSERT_TRUE(child.good()); |
3800 child.Put(syncable::IS_UNSYNCED, true); | 3801 child.Put(syncable::IS_UNSYNCED, true); |
3801 child.Put(syncable::IS_DIR, true); | 3802 child.Put(syncable::IS_DIR, true); |
3802 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); | 3803 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); |
3803 bar_metahandle = child.Get(META_HANDLE); | 3804 bar_metahandle = child.Get(META_HANDLE); |
3804 in_dir_id = parent.Get(syncable::ID); | 3805 in_dir_id = parent.Get(syncable::ID); |
3805 } | 3806 } |
3806 SyncShareAsDelegate(); | 3807 SyncShareAsDelegate(); |
3807 { | 3808 { |
3808 ReadTransaction trans(dir, __FILE__, __LINE__); | 3809 ReadTransaction trans(dir, FROM_HERE); |
3809 Entry fail_by_old_id_entry(&trans, GET_BY_ID, in_root_id); | 3810 Entry fail_by_old_id_entry(&trans, GET_BY_ID, in_root_id); |
3810 ASSERT_FALSE(fail_by_old_id_entry.good()); | 3811 ASSERT_FALSE(fail_by_old_id_entry.good()); |
3811 | 3812 |
3812 Entry foo_entry(&trans, GET_BY_HANDLE, foo_metahandle); | 3813 Entry foo_entry(&trans, GET_BY_HANDLE, foo_metahandle); |
3813 ASSERT_TRUE(foo_entry.good()); | 3814 ASSERT_TRUE(foo_entry.good()); |
3814 EXPECT_EQ("foo", foo_entry.Get(NON_UNIQUE_NAME)); | 3815 EXPECT_EQ("foo", foo_entry.Get(NON_UNIQUE_NAME)); |
3815 EXPECT_NE(foo_entry.Get(syncable::ID), in_root_id); | 3816 EXPECT_NE(foo_entry.Get(syncable::ID), in_root_id); |
3816 | 3817 |
3817 Entry bar_entry(&trans, GET_BY_HANDLE, bar_metahandle); | 3818 Entry bar_entry(&trans, GET_BY_HANDLE, bar_metahandle); |
3818 ASSERT_TRUE(bar_entry.good()); | 3819 ASSERT_TRUE(bar_entry.good()); |
3819 EXPECT_EQ("bar", bar_entry.Get(NON_UNIQUE_NAME)); | 3820 EXPECT_EQ("bar", bar_entry.Get(NON_UNIQUE_NAME)); |
3820 EXPECT_NE(bar_entry.Get(syncable::ID), in_dir_id); | 3821 EXPECT_NE(bar_entry.Get(syncable::ID), in_dir_id); |
3821 EXPECT_EQ(foo_entry.Get(syncable::ID), bar_entry.Get(PARENT_ID)); | 3822 EXPECT_EQ(foo_entry.Get(syncable::ID), bar_entry.Get(PARENT_ID)); |
3822 } | 3823 } |
3823 } | 3824 } |
3824 | 3825 |
3825 TEST_F(SyncerTest, ConflictSetSizeReducedToOne) { | 3826 TEST_F(SyncerTest, ConflictSetSizeReducedToOne) { |
3826 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3827 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3827 CHECK(dir.good()); | 3828 CHECK(dir.good()); |
3828 | 3829 |
3829 syncable::Id in_root_id = ids_.NewServerId(); | 3830 syncable::Id in_root_id = ids_.NewServerId(); |
3830 | 3831 |
3831 mock_server_->AddUpdateBookmark(in_root_id, TestIdFactory::root(), | 3832 mock_server_->AddUpdateBookmark(in_root_id, TestIdFactory::root(), |
3832 "in_root", 1, 1); | 3833 "in_root", 1, 1); |
3833 SyncShareAsDelegate(); | 3834 SyncShareAsDelegate(); |
3834 { | 3835 { |
3835 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3836 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3836 MutableEntry oentry(&trans, GET_BY_ID, in_root_id); | 3837 MutableEntry oentry(&trans, GET_BY_ID, in_root_id); |
3837 ASSERT_TRUE(oentry.good()); | 3838 ASSERT_TRUE(oentry.good()); |
3838 oentry.Put(NON_UNIQUE_NAME, "old_in_root"); | 3839 oentry.Put(NON_UNIQUE_NAME, "old_in_root"); |
3839 WriteTestDataToEntry(&trans, &oentry); | 3840 WriteTestDataToEntry(&trans, &oentry); |
3840 MutableEntry entry(&trans, CREATE, trans.root_id(), "in_root"); | 3841 MutableEntry entry(&trans, CREATE, trans.root_id(), "in_root"); |
3841 ASSERT_TRUE(entry.good()); | 3842 ASSERT_TRUE(entry.good()); |
3842 WriteTestDataToEntry(&trans, &entry); | 3843 WriteTestDataToEntry(&trans, &entry); |
3843 } | 3844 } |
3844 mock_server_->set_conflict_all_commits(true); | 3845 mock_server_->set_conflict_all_commits(true); |
3845 // This SyncShare call used to result in a CHECK failure. | 3846 // This SyncShare call used to result in a CHECK failure. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3882 syncable::Id folder_one_id = ids_.FromNumber(1); | 3883 syncable::Id folder_one_id = ids_.FromNumber(1); |
3883 syncable::Id folder_two_id = ids_.FromNumber(2); | 3884 syncable::Id folder_two_id = ids_.FromNumber(2); |
3884 | 3885 |
3885 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(), | 3886 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(), |
3886 "folder_one", 1, 1); | 3887 "folder_one", 1, 1); |
3887 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(), | 3888 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(), |
3888 "folder_two", 1, 1); | 3889 "folder_two", 1, 1); |
3889 SyncShareAsDelegate(); | 3890 SyncShareAsDelegate(); |
3890 { | 3891 { |
3891 // A moved entry should send an "old parent." | 3892 // A moved entry should send an "old parent." |
3892 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 3893 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
3893 MutableEntry entry(&trans, GET_BY_ID, folder_one_id); | 3894 MutableEntry entry(&trans, GET_BY_ID, folder_one_id); |
3894 ASSERT_TRUE(entry.good()); | 3895 ASSERT_TRUE(entry.good()); |
3895 entry.Put(PARENT_ID, folder_two_id); | 3896 entry.Put(PARENT_ID, folder_two_id); |
3896 entry.Put(IS_UNSYNCED, true); | 3897 entry.Put(IS_UNSYNCED, true); |
3897 // A new entry should send no "old parent." | 3898 // A new entry should send no "old parent." |
3898 MutableEntry create(&trans, CREATE, trans.root_id(), "new_folder"); | 3899 MutableEntry create(&trans, CREATE, trans.root_id(), "new_folder"); |
3899 create.Put(IS_UNSYNCED, true); | 3900 create.Put(IS_UNSYNCED, true); |
3900 create.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 3901 create.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
3901 } | 3902 } |
3902 SyncShareAsDelegate(); | 3903 SyncShareAsDelegate(); |
3903 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit(); | 3904 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit(); |
3904 ASSERT_TRUE(2 == commit.entries_size()); | 3905 ASSERT_TRUE(2 == commit.entries_size()); |
3905 EXPECT_TRUE(commit.entries(0).parent_id_string() == "2"); | 3906 EXPECT_TRUE(commit.entries(0).parent_id_string() == "2"); |
3906 EXPECT_TRUE(commit.entries(0).old_parent_id() == "0"); | 3907 EXPECT_TRUE(commit.entries(0).old_parent_id() == "0"); |
3907 EXPECT_FALSE(commit.entries(1).has_old_parent_id()); | 3908 EXPECT_FALSE(commit.entries(1).has_old_parent_id()); |
3908 } | 3909 } |
3909 | 3910 |
3910 TEST_F(SyncerTest, Test64BitVersionSupport) { | 3911 TEST_F(SyncerTest, Test64BitVersionSupport) { |
3911 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3912 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3912 CHECK(dir.good()); | 3913 CHECK(dir.good()); |
3913 int64 really_big_int = std::numeric_limits<int64>::max() - 12; | 3914 int64 really_big_int = std::numeric_limits<int64>::max() - 12; |
3914 const string name("ringo's dang orang ran rings around my o-ring"); | 3915 const string name("ringo's dang orang ran rings around my o-ring"); |
3915 int64 item_metahandle; | 3916 int64 item_metahandle; |
3916 | 3917 |
3917 // Try writing max int64 to the version fields of a meta entry. | 3918 // Try writing max int64 to the version fields of a meta entry. |
3918 { | 3919 { |
3919 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 3920 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
3920 MutableEntry entry(&wtrans, syncable::CREATE, wtrans.root_id(), name); | 3921 MutableEntry entry(&wtrans, syncable::CREATE, wtrans.root_id(), name); |
3921 ASSERT_TRUE(entry.good()); | 3922 ASSERT_TRUE(entry.good()); |
3922 entry.Put(syncable::BASE_VERSION, really_big_int); | 3923 entry.Put(syncable::BASE_VERSION, really_big_int); |
3923 entry.Put(syncable::SERVER_VERSION, really_big_int); | 3924 entry.Put(syncable::SERVER_VERSION, really_big_int); |
3924 entry.Put(syncable::ID, ids_.NewServerId()); | 3925 entry.Put(syncable::ID, ids_.NewServerId()); |
3925 item_metahandle = entry.Get(META_HANDLE); | 3926 item_metahandle = entry.Get(META_HANDLE); |
3926 } | 3927 } |
3927 // Now read it back out and make sure the value is max int64. | 3928 // Now read it back out and make sure the value is max int64. |
3928 ReadTransaction rtrans(dir, __FILE__, __LINE__); | 3929 ReadTransaction rtrans(dir, FROM_HERE); |
3929 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle); | 3930 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle); |
3930 ASSERT_TRUE(entry.good()); | 3931 ASSERT_TRUE(entry.good()); |
3931 EXPECT_TRUE(really_big_int == entry.Get(syncable::BASE_VERSION)); | 3932 EXPECT_TRUE(really_big_int == entry.Get(syncable::BASE_VERSION)); |
3932 } | 3933 } |
3933 | 3934 |
3934 TEST_F(SyncerTest, TestSimpleUndelete) { | 3935 TEST_F(SyncerTest, TestSimpleUndelete) { |
3935 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); | 3936 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); |
3936 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3937 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3937 EXPECT_TRUE(dir.good()); | 3938 EXPECT_TRUE(dir.good()); |
3938 mock_server_->set_conflict_all_commits(true); | 3939 mock_server_->set_conflict_all_commits(true); |
3939 // Let there be an entry from the server. | 3940 // Let there be an entry from the server. |
3940 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); | 3941 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); |
3941 SyncShareAsDelegate(); | 3942 SyncShareAsDelegate(); |
3942 // Check it out and delete it. | 3943 // Check it out and delete it. |
3943 { | 3944 { |
3944 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 3945 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
3945 MutableEntry entry(&wtrans, GET_BY_ID, id); | 3946 MutableEntry entry(&wtrans, GET_BY_ID, id); |
3946 ASSERT_TRUE(entry.good()); | 3947 ASSERT_TRUE(entry.good()); |
3947 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 3948 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
3948 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 3949 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
3949 EXPECT_FALSE(entry.Get(IS_DEL)); | 3950 EXPECT_FALSE(entry.Get(IS_DEL)); |
3950 // Delete it locally. | 3951 // Delete it locally. |
3951 entry.Put(IS_DEL, true); | 3952 entry.Put(IS_DEL, true); |
3952 } | 3953 } |
3953 SyncShareAsDelegate(); | 3954 SyncShareAsDelegate(); |
3954 // Confirm we see IS_DEL and not SERVER_IS_DEL. | 3955 // Confirm we see IS_DEL and not SERVER_IS_DEL. |
3955 { | 3956 { |
3956 ReadTransaction trans(dir, __FILE__, __LINE__); | 3957 ReadTransaction trans(dir, FROM_HERE); |
3957 Entry entry(&trans, GET_BY_ID, id); | 3958 Entry entry(&trans, GET_BY_ID, id); |
3958 ASSERT_TRUE(entry.good()); | 3959 ASSERT_TRUE(entry.good()); |
3959 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 3960 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
3960 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 3961 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
3961 EXPECT_TRUE(entry.Get(IS_DEL)); | 3962 EXPECT_TRUE(entry.Get(IS_DEL)); |
3962 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 3963 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
3963 } | 3964 } |
3964 SyncShareAsDelegate(); | 3965 SyncShareAsDelegate(); |
3965 // Update from server confirming deletion. | 3966 // Update from server confirming deletion. |
3966 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11); | 3967 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11); |
3967 mock_server_->SetLastUpdateDeleted(); | 3968 mock_server_->SetLastUpdateDeleted(); |
3968 SyncShareAsDelegate(); | 3969 SyncShareAsDelegate(); |
3969 // IS_DEL AND SERVER_IS_DEL now both true. | 3970 // IS_DEL AND SERVER_IS_DEL now both true. |
3970 { | 3971 { |
3971 ReadTransaction trans(dir, __FILE__, __LINE__); | 3972 ReadTransaction trans(dir, FROM_HERE); |
3972 Entry entry(&trans, GET_BY_ID, id); | 3973 Entry entry(&trans, GET_BY_ID, id); |
3973 ASSERT_TRUE(entry.good()); | 3974 ASSERT_TRUE(entry.good()); |
3974 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 3975 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
3975 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 3976 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
3976 EXPECT_TRUE(entry.Get(IS_DEL)); | 3977 EXPECT_TRUE(entry.Get(IS_DEL)); |
3977 EXPECT_TRUE(entry.Get(SERVER_IS_DEL)); | 3978 EXPECT_TRUE(entry.Get(SERVER_IS_DEL)); |
3978 } | 3979 } |
3979 // Undelete from server. | 3980 // Undelete from server. |
3980 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); | 3981 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); |
3981 SyncShareAsDelegate(); | 3982 SyncShareAsDelegate(); |
3982 // IS_DEL and SERVER_IS_DEL now both false. | 3983 // IS_DEL and SERVER_IS_DEL now both false. |
3983 { | 3984 { |
3984 ReadTransaction trans(dir, __FILE__, __LINE__); | 3985 ReadTransaction trans(dir, FROM_HERE); |
3985 Entry entry(&trans, GET_BY_ID, id); | 3986 Entry entry(&trans, GET_BY_ID, id); |
3986 ASSERT_TRUE(entry.good()); | 3987 ASSERT_TRUE(entry.good()); |
3987 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 3988 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
3988 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 3989 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
3989 EXPECT_FALSE(entry.Get(IS_DEL)); | 3990 EXPECT_FALSE(entry.Get(IS_DEL)); |
3990 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 3991 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
3991 } | 3992 } |
3992 } | 3993 } |
3993 | 3994 |
3994 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) { | 3995 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) { |
3995 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); | 3996 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); |
3996 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 3997 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
3997 EXPECT_TRUE(dir.good()); | 3998 EXPECT_TRUE(dir.good()); |
3998 // Let there be a entry, from the server. | 3999 // Let there be a entry, from the server. |
3999 mock_server_->set_conflict_all_commits(true); | 4000 mock_server_->set_conflict_all_commits(true); |
4000 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); | 4001 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); |
4001 SyncShareAsDelegate(); | 4002 SyncShareAsDelegate(); |
4002 // Check it out and delete it. | 4003 // Check it out and delete it. |
4003 { | 4004 { |
4004 WriteTransaction wtrans(dir, UNITTEST, __FILE__, __LINE__); | 4005 WriteTransaction wtrans(dir, UNITTEST, FROM_HERE); |
4005 MutableEntry entry(&wtrans, GET_BY_ID, id); | 4006 MutableEntry entry(&wtrans, GET_BY_ID, id); |
4006 ASSERT_TRUE(entry.good()); | 4007 ASSERT_TRUE(entry.good()); |
4007 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 4008 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
4008 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 4009 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
4009 EXPECT_FALSE(entry.Get(IS_DEL)); | 4010 EXPECT_FALSE(entry.Get(IS_DEL)); |
4010 // Delete it locally. | 4011 // Delete it locally. |
4011 entry.Put(IS_DEL, true); | 4012 entry.Put(IS_DEL, true); |
4012 } | 4013 } |
4013 SyncShareAsDelegate(); | 4014 SyncShareAsDelegate(); |
4014 // Confirm we see IS_DEL and not SERVER_IS_DEL. | 4015 // Confirm we see IS_DEL and not SERVER_IS_DEL. |
4015 { | 4016 { |
4016 ReadTransaction trans(dir, __FILE__, __LINE__); | 4017 ReadTransaction trans(dir, FROM_HERE); |
4017 Entry entry(&trans, GET_BY_ID, id); | 4018 Entry entry(&trans, GET_BY_ID, id); |
4018 ASSERT_TRUE(entry.good()); | 4019 ASSERT_TRUE(entry.good()); |
4019 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 4020 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
4020 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 4021 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
4021 EXPECT_TRUE(entry.Get(IS_DEL)); | 4022 EXPECT_TRUE(entry.Get(IS_DEL)); |
4022 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 4023 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
4023 } | 4024 } |
4024 SyncShareAsDelegate(); | 4025 SyncShareAsDelegate(); |
4025 // Say we do not get an update from server confirming deletion. Undelete | 4026 // Say we do not get an update from server confirming deletion. Undelete |
4026 // from server | 4027 // from server |
4027 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); | 4028 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); |
4028 SyncShareAsDelegate(); | 4029 SyncShareAsDelegate(); |
4029 // IS_DEL and SERVER_IS_DEL now both false. | 4030 // IS_DEL and SERVER_IS_DEL now both false. |
4030 { | 4031 { |
4031 ReadTransaction trans(dir, __FILE__, __LINE__); | 4032 ReadTransaction trans(dir, FROM_HERE); |
4032 Entry entry(&trans, GET_BY_ID, id); | 4033 Entry entry(&trans, GET_BY_ID, id); |
4033 ASSERT_TRUE(entry.good()); | 4034 ASSERT_TRUE(entry.good()); |
4034 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); | 4035 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); |
4035 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); | 4036 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); |
4036 EXPECT_FALSE(entry.Get(IS_DEL)); | 4037 EXPECT_FALSE(entry.Get(IS_DEL)); |
4037 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); | 4038 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); |
4038 } | 4039 } |
4039 } | 4040 } |
4040 | 4041 |
4041 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) { | 4042 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) { |
(...skipping 13 matching lines...) Expand all Loading... |
4055 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) { | 4056 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) { |
4056 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4057 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4057 EXPECT_TRUE(dir.good()); | 4058 EXPECT_TRUE(dir.good()); |
4058 | 4059 |
4059 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); | 4060 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); |
4060 mock_server_->SetLastUpdateClientTag("permfolder"); | 4061 mock_server_->SetLastUpdateClientTag("permfolder"); |
4061 | 4062 |
4062 SyncShareAsDelegate(); | 4063 SyncShareAsDelegate(); |
4063 | 4064 |
4064 { | 4065 { |
4065 ReadTransaction trans(dir, __FILE__, __LINE__); | 4066 ReadTransaction trans(dir, FROM_HERE); |
4066 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); | 4067 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); |
4067 ASSERT_TRUE(perm_folder.good()); | 4068 ASSERT_TRUE(perm_folder.good()); |
4068 EXPECT_FALSE(perm_folder.Get(IS_DEL)); | 4069 EXPECT_FALSE(perm_folder.Get(IS_DEL)); |
4069 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4070 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4070 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); | 4071 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); |
4071 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); | 4072 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); |
4072 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1"); | 4073 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1"); |
4073 } | 4074 } |
4074 | 4075 |
4075 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); | 4076 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); |
4076 mock_server_->SetLastUpdateClientTag("permfolder"); | 4077 mock_server_->SetLastUpdateClientTag("permfolder"); |
4077 SyncShareAsDelegate(); | 4078 SyncShareAsDelegate(); |
4078 | 4079 |
4079 { | 4080 { |
4080 ReadTransaction trans(dir, __FILE__, __LINE__); | 4081 ReadTransaction trans(dir, FROM_HERE); |
4081 | 4082 |
4082 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); | 4083 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); |
4083 ASSERT_TRUE(perm_folder.good()); | 4084 ASSERT_TRUE(perm_folder.good()); |
4084 EXPECT_FALSE(perm_folder.Get(IS_DEL)); | 4085 EXPECT_FALSE(perm_folder.Get(IS_DEL)); |
4085 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4086 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4086 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); | 4087 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); |
4087 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); | 4088 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); |
4088 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem_renamed"); | 4089 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem_renamed"); |
4089 } | 4090 } |
4090 } | 4091 } |
4091 | 4092 |
4092 TEST_F(SyncerTest, ClientTagIllegalUpdateIgnored) { | 4093 TEST_F(SyncerTest, ClientTagIllegalUpdateIgnored) { |
4093 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4094 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4094 EXPECT_TRUE(dir.good()); | 4095 EXPECT_TRUE(dir.good()); |
4095 | 4096 |
4096 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); | 4097 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); |
4097 mock_server_->SetLastUpdateClientTag("permfolder"); | 4098 mock_server_->SetLastUpdateClientTag("permfolder"); |
4098 | 4099 |
4099 SyncShareAsDelegate(); | 4100 SyncShareAsDelegate(); |
4100 | 4101 |
4101 { | 4102 { |
4102 ReadTransaction trans(dir, __FILE__, __LINE__); | 4103 ReadTransaction trans(dir, FROM_HERE); |
4103 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); | 4104 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); |
4104 ASSERT_TRUE(perm_folder.good()); | 4105 ASSERT_TRUE(perm_folder.good()); |
4105 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4106 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4106 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); | 4107 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); |
4107 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); | 4108 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); |
4108 EXPECT_TRUE(perm_folder.Get(NON_UNIQUE_NAME) == "permitem1"); | 4109 EXPECT_TRUE(perm_folder.Get(NON_UNIQUE_NAME) == "permitem1"); |
4109 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); | 4110 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); |
4110 } | 4111 } |
4111 | 4112 |
4112 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); | 4113 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); |
4113 mock_server_->SetLastUpdateClientTag("wrongtag"); | 4114 mock_server_->SetLastUpdateClientTag("wrongtag"); |
4114 SyncShareAsDelegate(); | 4115 SyncShareAsDelegate(); |
4115 | 4116 |
4116 { | 4117 { |
4117 ReadTransaction trans(dir, __FILE__, __LINE__); | 4118 ReadTransaction trans(dir, FROM_HERE); |
4118 | 4119 |
4119 // This update is rejected because it has the same ID, but a | 4120 // This update is rejected because it has the same ID, but a |
4120 // different tag than one that is already on the client. | 4121 // different tag than one that is already on the client. |
4121 // The client has a ServerKnows ID, which cannot be overwritten. | 4122 // The client has a ServerKnows ID, which cannot be overwritten. |
4122 Entry rejected_update(&trans, GET_BY_CLIENT_TAG, "wrongtag"); | 4123 Entry rejected_update(&trans, GET_BY_CLIENT_TAG, "wrongtag"); |
4123 EXPECT_FALSE(rejected_update.good()); | 4124 EXPECT_FALSE(rejected_update.good()); |
4124 | 4125 |
4125 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); | 4126 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); |
4126 ASSERT_TRUE(perm_folder.good()); | 4127 ASSERT_TRUE(perm_folder.good()); |
4127 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4128 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4128 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); | 4129 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); |
4129 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1"); | 4130 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1"); |
4130 } | 4131 } |
4131 } | 4132 } |
4132 | 4133 |
4133 TEST_F(SyncerTest, ClientTagUncommittedTagMatchesUpdate) { | 4134 TEST_F(SyncerTest, ClientTagUncommittedTagMatchesUpdate) { |
4134 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4135 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4135 EXPECT_TRUE(dir.good()); | 4136 EXPECT_TRUE(dir.good()); |
4136 int64 original_metahandle = 0; | 4137 int64 original_metahandle = 0; |
4137 | 4138 |
4138 sync_pb::EntitySpecifics local_bookmark(DefaultBookmarkSpecifics()); | 4139 sync_pb::EntitySpecifics local_bookmark(DefaultBookmarkSpecifics()); |
4139 local_bookmark.MutableExtension(sync_pb::bookmark)-> | 4140 local_bookmark.MutableExtension(sync_pb::bookmark)-> |
4140 set_url("http://foo/localsite"); | 4141 set_url("http://foo/localsite"); |
4141 sync_pb::EntitySpecifics server_bookmark(DefaultBookmarkSpecifics()); | 4142 sync_pb::EntitySpecifics server_bookmark(DefaultBookmarkSpecifics()); |
4142 server_bookmark.MutableExtension(sync_pb::bookmark)-> | 4143 server_bookmark.MutableExtension(sync_pb::bookmark)-> |
4143 set_url("http://bar/serversite"); | 4144 set_url("http://bar/serversite"); |
4144 | 4145 |
4145 { | 4146 { |
4146 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 4147 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
4147 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); | 4148 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); |
4148 ASSERT_TRUE(perm_folder.good()); | 4149 ASSERT_TRUE(perm_folder.good()); |
4149 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm"); | 4150 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm"); |
4150 perm_folder.Put(SPECIFICS, local_bookmark); | 4151 perm_folder.Put(SPECIFICS, local_bookmark); |
4151 perm_folder.Put(IS_UNSYNCED, true); | 4152 perm_folder.Put(IS_UNSYNCED, true); |
4152 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4153 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4153 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows()); | 4154 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows()); |
4154 original_metahandle = perm_folder.Get(META_HANDLE); | 4155 original_metahandle = perm_folder.Get(META_HANDLE); |
4155 } | 4156 } |
4156 | 4157 |
4157 mock_server_->AddUpdateBookmark(1, 0, "permitem_renamed", 10, 100); | 4158 mock_server_->AddUpdateBookmark(1, 0, "permitem_renamed", 10, 100); |
4158 mock_server_->SetLastUpdateClientTag("clientperm"); | 4159 mock_server_->SetLastUpdateClientTag("clientperm"); |
4159 mock_server_->GetMutableLastUpdate()->mutable_specifics()-> | 4160 mock_server_->GetMutableLastUpdate()->mutable_specifics()-> |
4160 CopyFrom(server_bookmark); | 4161 CopyFrom(server_bookmark); |
4161 mock_server_->set_conflict_all_commits(true); | 4162 mock_server_->set_conflict_all_commits(true); |
4162 | 4163 |
4163 SyncShareAsDelegate(); | 4164 SyncShareAsDelegate(); |
4164 // This should cause client tag reunion, preserving the metahandle. | 4165 // This should cause client tag reunion, preserving the metahandle. |
4165 { | 4166 { |
4166 ReadTransaction trans(dir, __FILE__, __LINE__); | 4167 ReadTransaction trans(dir, FROM_HERE); |
4167 | 4168 |
4168 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); | 4169 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); |
4169 ASSERT_TRUE(perm_folder.good()); | 4170 ASSERT_TRUE(perm_folder.good()); |
4170 EXPECT_FALSE(perm_folder.Get(IS_DEL)); | 4171 EXPECT_FALSE(perm_folder.Get(IS_DEL)); |
4171 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4172 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4172 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); | 4173 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); |
4173 EXPECT_EQ(10, perm_folder.Get(BASE_VERSION)); | 4174 EXPECT_EQ(10, perm_folder.Get(BASE_VERSION)); |
4174 // Entry should have been given the new ID while preserving the | 4175 // Entry should have been given the new ID while preserving the |
4175 // metahandle; client should have won the conflict resolution. | 4176 // metahandle; client should have won the conflict resolution. |
4176 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE)); | 4177 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE)); |
4177 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG)); | 4178 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG)); |
4178 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME)); | 4179 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME)); |
4179 EXPECT_EQ(local_bookmark.SerializeAsString(), | 4180 EXPECT_EQ(local_bookmark.SerializeAsString(), |
4180 perm_folder.Get(SPECIFICS).SerializeAsString()); | 4181 perm_folder.Get(SPECIFICS).SerializeAsString()); |
4181 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); | 4182 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); |
4182 } | 4183 } |
4183 | 4184 |
4184 mock_server_->set_conflict_all_commits(false); | 4185 mock_server_->set_conflict_all_commits(false); |
4185 SyncShareAsDelegate(); | 4186 SyncShareAsDelegate(); |
4186 | 4187 |
4187 // The resolved entry ought to commit cleanly. | 4188 // The resolved entry ought to commit cleanly. |
4188 { | 4189 { |
4189 ReadTransaction trans(dir, __FILE__, __LINE__); | 4190 ReadTransaction trans(dir, FROM_HERE); |
4190 | 4191 |
4191 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); | 4192 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); |
4192 ASSERT_TRUE(perm_folder.good()); | 4193 ASSERT_TRUE(perm_folder.good()); |
4193 EXPECT_FALSE(perm_folder.Get(IS_DEL)); | 4194 EXPECT_FALSE(perm_folder.Get(IS_DEL)); |
4194 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4195 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4195 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); | 4196 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); |
4196 EXPECT_TRUE(10 < perm_folder.Get(BASE_VERSION)); | 4197 EXPECT_TRUE(10 < perm_folder.Get(BASE_VERSION)); |
4197 // Entry should have been given the new ID while preserving the | 4198 // Entry should have been given the new ID while preserving the |
4198 // metahandle; client should have won the conflict resolution. | 4199 // metahandle; client should have won the conflict resolution. |
4199 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE)); | 4200 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE)); |
4200 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG)); | 4201 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG)); |
4201 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME)); | 4202 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME)); |
4202 EXPECT_EQ(local_bookmark.SerializeAsString(), | 4203 EXPECT_EQ(local_bookmark.SerializeAsString(), |
4203 perm_folder.Get(SPECIFICS).SerializeAsString()); | 4204 perm_folder.Get(SPECIFICS).SerializeAsString()); |
4204 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); | 4205 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); |
4205 } | 4206 } |
4206 } | 4207 } |
4207 | 4208 |
4208 TEST_F(SyncerTest, ClientTagConflictWithDeletedLocalEntry) { | 4209 TEST_F(SyncerTest, ClientTagConflictWithDeletedLocalEntry) { |
4209 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4210 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4210 EXPECT_TRUE(dir.good()); | 4211 EXPECT_TRUE(dir.good()); |
4211 | 4212 |
4212 { | 4213 { |
4213 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 4214 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
4214 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); | 4215 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); |
4215 ASSERT_TRUE(perm_folder.good()); | 4216 ASSERT_TRUE(perm_folder.good()); |
4216 ASSERT_FALSE(perm_folder.Get(ID).ServerKnows()); | 4217 ASSERT_FALSE(perm_folder.Get(ID).ServerKnows()); |
4217 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm"); | 4218 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm"); |
4218 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 4219 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
4219 perm_folder.Put(IS_UNSYNCED, true); | 4220 perm_folder.Put(IS_UNSYNCED, true); |
4220 perm_folder.Put(IS_DEL, true); | 4221 perm_folder.Put(IS_DEL, true); |
4221 } | 4222 } |
4222 | 4223 |
4223 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); | 4224 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); |
4224 mock_server_->SetLastUpdateClientTag("clientperm"); | 4225 mock_server_->SetLastUpdateClientTag("clientperm"); |
4225 mock_server_->set_conflict_all_commits(true); | 4226 mock_server_->set_conflict_all_commits(true); |
4226 | 4227 |
4227 SyncShareAsDelegate(); | 4228 SyncShareAsDelegate(); |
4228 // This should cause client tag overwrite. | 4229 // This should cause client tag overwrite. |
4229 { | 4230 { |
4230 ReadTransaction trans(dir, __FILE__, __LINE__); | 4231 ReadTransaction trans(dir, FROM_HERE); |
4231 | 4232 |
4232 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); | 4233 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); |
4233 ASSERT_TRUE(perm_folder.good()); | 4234 ASSERT_TRUE(perm_folder.good()); |
4234 ASSERT_TRUE(perm_folder.Get(ID).ServerKnows()); | 4235 ASSERT_TRUE(perm_folder.Get(ID).ServerKnows()); |
4235 EXPECT_TRUE(perm_folder.Get(IS_DEL)); | 4236 EXPECT_TRUE(perm_folder.Get(IS_DEL)); |
4236 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4237 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4237 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); | 4238 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); |
4238 EXPECT_EQ(perm_folder.Get(BASE_VERSION), 10); | 4239 EXPECT_EQ(perm_folder.Get(BASE_VERSION), 10); |
4239 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "clientperm"); | 4240 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "clientperm"); |
4240 } | 4241 } |
(...skipping 13 matching lines...) Expand all Loading... |
4254 mock_server_->AddUpdateBookmark(4, 0, "Four", 11, 110); | 4255 mock_server_->AddUpdateBookmark(4, 0, "Four", 11, 110); |
4255 mock_server_->SetLastUpdateClientTag("tag2"); | 4256 mock_server_->SetLastUpdateClientTag("tag2"); |
4256 | 4257 |
4257 mock_server_->set_conflict_all_commits(true); | 4258 mock_server_->set_conflict_all_commits(true); |
4258 | 4259 |
4259 SyncShareAsDelegate(); | 4260 SyncShareAsDelegate(); |
4260 int64 tag1_metahandle = syncable::kInvalidMetaHandle; | 4261 int64 tag1_metahandle = syncable::kInvalidMetaHandle; |
4261 int64 tag2_metahandle = syncable::kInvalidMetaHandle; | 4262 int64 tag2_metahandle = syncable::kInvalidMetaHandle; |
4262 // This should cause client tag overwrite. | 4263 // This should cause client tag overwrite. |
4263 { | 4264 { |
4264 ReadTransaction trans(dir, __FILE__, __LINE__); | 4265 ReadTransaction trans(dir, FROM_HERE); |
4265 | 4266 |
4266 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); | 4267 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); |
4267 ASSERT_TRUE(tag1.good()); | 4268 ASSERT_TRUE(tag1.good()); |
4268 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); | 4269 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); |
4269 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)); | 4270 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)); |
4270 EXPECT_FALSE(tag1.Get(IS_DEL)); | 4271 EXPECT_FALSE(tag1.Get(IS_DEL)); |
4271 EXPECT_FALSE(tag1.Get(IS_UNAPPLIED_UPDATE)); | 4272 EXPECT_FALSE(tag1.Get(IS_UNAPPLIED_UPDATE)); |
4272 EXPECT_FALSE(tag1.Get(IS_UNSYNCED)); | 4273 EXPECT_FALSE(tag1.Get(IS_UNSYNCED)); |
4273 EXPECT_EQ("One", tag1.Get(NON_UNIQUE_NAME)); | 4274 EXPECT_EQ("One", tag1.Get(NON_UNIQUE_NAME)); |
4274 EXPECT_EQ(10, tag1.Get(BASE_VERSION)); | 4275 EXPECT_EQ(10, tag1.Get(BASE_VERSION)); |
(...skipping 17 matching lines...) Expand all Loading... |
4292 ASSERT_EQ(2U, children.size()); | 4293 ASSERT_EQ(2U, children.size()); |
4293 } | 4294 } |
4294 | 4295 |
4295 mock_server_->AddUpdateBookmark(2, 0, "Two", 12, 120); | 4296 mock_server_->AddUpdateBookmark(2, 0, "Two", 12, 120); |
4296 mock_server_->SetLastUpdateClientTag("tag1"); | 4297 mock_server_->SetLastUpdateClientTag("tag1"); |
4297 mock_server_->AddUpdateBookmark(3, 0, "Three", 13, 130); | 4298 mock_server_->AddUpdateBookmark(3, 0, "Three", 13, 130); |
4298 mock_server_->SetLastUpdateClientTag("tag2"); | 4299 mock_server_->SetLastUpdateClientTag("tag2"); |
4299 SyncShareAsDelegate(); | 4300 SyncShareAsDelegate(); |
4300 | 4301 |
4301 { | 4302 { |
4302 ReadTransaction trans(dir, __FILE__, __LINE__); | 4303 ReadTransaction trans(dir, FROM_HERE); |
4303 | 4304 |
4304 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); | 4305 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); |
4305 ASSERT_TRUE(tag1.good()); | 4306 ASSERT_TRUE(tag1.good()); |
4306 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); | 4307 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); |
4307 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)) | 4308 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)) |
4308 << "ID 1 should be kept, since it was less than ID 2."; | 4309 << "ID 1 should be kept, since it was less than ID 2."; |
4309 EXPECT_FALSE(tag1.Get(IS_DEL)); | 4310 EXPECT_FALSE(tag1.Get(IS_DEL)); |
4310 EXPECT_FALSE(tag1.Get(IS_UNAPPLIED_UPDATE)); | 4311 EXPECT_FALSE(tag1.Get(IS_UNAPPLIED_UPDATE)); |
4311 EXPECT_FALSE(tag1.Get(IS_UNSYNCED)); | 4312 EXPECT_FALSE(tag1.Get(IS_UNSYNCED)); |
4312 EXPECT_EQ(10, tag1.Get(BASE_VERSION)); | 4313 EXPECT_EQ(10, tag1.Get(BASE_VERSION)); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4367 mock_server_->AddUpdateBookmark(204, 0, "Three C", 20, 200); | 4368 mock_server_->AddUpdateBookmark(204, 0, "Three C", 20, 200); |
4368 mock_server_->SetLastUpdateClientTag("tag c"); | 4369 mock_server_->SetLastUpdateClientTag("tag c"); |
4369 mock_server_->AddUpdateBookmark(201, 0, "Four C", 21, 210); | 4370 mock_server_->AddUpdateBookmark(201, 0, "Four C", 21, 210); |
4370 mock_server_->SetLastUpdateClientTag("tag c"); // Least ID: winner. | 4371 mock_server_->SetLastUpdateClientTag("tag c"); // Least ID: winner. |
4371 | 4372 |
4372 mock_server_->set_conflict_all_commits(true); | 4373 mock_server_->set_conflict_all_commits(true); |
4373 | 4374 |
4374 SyncShareAsDelegate(); | 4375 SyncShareAsDelegate(); |
4375 // This should cause client tag overwrite. | 4376 // This should cause client tag overwrite. |
4376 { | 4377 { |
4377 ReadTransaction trans(dir, __FILE__, __LINE__); | 4378 ReadTransaction trans(dir, FROM_HERE); |
4378 | 4379 |
4379 Entry tag_a(&trans, GET_BY_CLIENT_TAG, "tag a"); | 4380 Entry tag_a(&trans, GET_BY_CLIENT_TAG, "tag a"); |
4380 ASSERT_TRUE(tag_a.good()); | 4381 ASSERT_TRUE(tag_a.good()); |
4381 EXPECT_TRUE(tag_a.Get(ID).ServerKnows()); | 4382 EXPECT_TRUE(tag_a.Get(ID).ServerKnows()); |
4382 EXPECT_EQ(ids_.FromNumber(1), tag_a.Get(ID)); | 4383 EXPECT_EQ(ids_.FromNumber(1), tag_a.Get(ID)); |
4383 EXPECT_FALSE(tag_a.Get(IS_DEL)); | 4384 EXPECT_FALSE(tag_a.Get(IS_DEL)); |
4384 EXPECT_FALSE(tag_a.Get(IS_UNAPPLIED_UPDATE)); | 4385 EXPECT_FALSE(tag_a.Get(IS_UNAPPLIED_UPDATE)); |
4385 EXPECT_FALSE(tag_a.Get(IS_UNSYNCED)); | 4386 EXPECT_FALSE(tag_a.Get(IS_UNSYNCED)); |
4386 EXPECT_EQ("One A", tag_a.Get(NON_UNIQUE_NAME)); | 4387 EXPECT_EQ("One A", tag_a.Get(NON_UNIQUE_NAME)); |
4387 EXPECT_EQ(1, tag_a.Get(BASE_VERSION)); | 4388 EXPECT_EQ(1, tag_a.Get(BASE_VERSION)); |
(...skipping 27 matching lines...) Expand all Loading... |
4415 } | 4416 } |
4416 } | 4417 } |
4417 | 4418 |
4418 TEST_F(SyncerTest, UniqueServerTagUpdates) { | 4419 TEST_F(SyncerTest, UniqueServerTagUpdates) { |
4419 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4420 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4420 EXPECT_TRUE(dir.good()); | 4421 EXPECT_TRUE(dir.good()); |
4421 // As a hurdle, introduce an item whose name is the same as the tag value | 4422 // As a hurdle, introduce an item whose name is the same as the tag value |
4422 // we'll use later. | 4423 // we'll use later. |
4423 int64 hurdle_handle = CreateUnsyncedDirectory("bob", "id_bob"); | 4424 int64 hurdle_handle = CreateUnsyncedDirectory("bob", "id_bob"); |
4424 { | 4425 { |
4425 ReadTransaction trans(dir, __FILE__, __LINE__); | 4426 ReadTransaction trans(dir, FROM_HERE); |
4426 Entry hurdle(&trans, GET_BY_HANDLE, hurdle_handle); | 4427 Entry hurdle(&trans, GET_BY_HANDLE, hurdle_handle); |
4427 ASSERT_TRUE(hurdle.good()); | 4428 ASSERT_TRUE(hurdle.good()); |
4428 ASSERT_TRUE(!hurdle.Get(IS_DEL)); | 4429 ASSERT_TRUE(!hurdle.Get(IS_DEL)); |
4429 ASSERT_TRUE(hurdle.Get(UNIQUE_SERVER_TAG).empty()); | 4430 ASSERT_TRUE(hurdle.Get(UNIQUE_SERVER_TAG).empty()); |
4430 ASSERT_TRUE(hurdle.Get(NON_UNIQUE_NAME) == "bob"); | 4431 ASSERT_TRUE(hurdle.Get(NON_UNIQUE_NAME) == "bob"); |
4431 | 4432 |
4432 // Try to lookup by the tagname. These should fail. | 4433 // Try to lookup by the tagname. These should fail. |
4433 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); | 4434 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); |
4434 EXPECT_FALSE(tag_alpha.good()); | 4435 EXPECT_FALSE(tag_alpha.good()); |
4435 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); | 4436 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); |
4436 EXPECT_FALSE(tag_bob.good()); | 4437 EXPECT_FALSE(tag_bob.good()); |
4437 } | 4438 } |
4438 | 4439 |
4439 // Now download some tagged items as updates. | 4440 // Now download some tagged items as updates. |
4440 mock_server_->AddUpdateDirectory(1, 0, "update1", 1, 10); | 4441 mock_server_->AddUpdateDirectory(1, 0, "update1", 1, 10); |
4441 mock_server_->SetLastUpdateServerTag("alpha"); | 4442 mock_server_->SetLastUpdateServerTag("alpha"); |
4442 mock_server_->AddUpdateDirectory(2, 0, "update2", 2, 20); | 4443 mock_server_->AddUpdateDirectory(2, 0, "update2", 2, 20); |
4443 mock_server_->SetLastUpdateServerTag("bob"); | 4444 mock_server_->SetLastUpdateServerTag("bob"); |
4444 SyncShareAsDelegate(); | 4445 SyncShareAsDelegate(); |
4445 | 4446 |
4446 { | 4447 { |
4447 ReadTransaction trans(dir, __FILE__, __LINE__); | 4448 ReadTransaction trans(dir, FROM_HERE); |
4448 | 4449 |
4449 // The new items should be applied as new entries, and we should be able | 4450 // The new items should be applied as new entries, and we should be able |
4450 // to look them up by their tag values. | 4451 // to look them up by their tag values. |
4451 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); | 4452 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); |
4452 ASSERT_TRUE(tag_alpha.good()); | 4453 ASSERT_TRUE(tag_alpha.good()); |
4453 ASSERT_TRUE(!tag_alpha.Get(IS_DEL)); | 4454 ASSERT_TRUE(!tag_alpha.Get(IS_DEL)); |
4454 ASSERT_TRUE(tag_alpha.Get(UNIQUE_SERVER_TAG) == "alpha"); | 4455 ASSERT_TRUE(tag_alpha.Get(UNIQUE_SERVER_TAG) == "alpha"); |
4455 ASSERT_TRUE(tag_alpha.Get(NON_UNIQUE_NAME) == "update1"); | 4456 ASSERT_TRUE(tag_alpha.Get(NON_UNIQUE_NAME) == "update1"); |
4456 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); | 4457 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); |
4457 ASSERT_TRUE(tag_bob.good()); | 4458 ASSERT_TRUE(tag_bob.good()); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4519 class SyncerUndeletionTest : public SyncerTest { | 4520 class SyncerUndeletionTest : public SyncerTest { |
4520 public: | 4521 public: |
4521 SyncerUndeletionTest() | 4522 SyncerUndeletionTest() |
4522 : client_tag_("foobar"), | 4523 : client_tag_("foobar"), |
4523 metahandle_(syncable::kInvalidMetaHandle) { | 4524 metahandle_(syncable::kInvalidMetaHandle) { |
4524 } | 4525 } |
4525 | 4526 |
4526 void Create() { | 4527 void Create() { |
4527 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4528 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4528 EXPECT_TRUE(dir.good()); | 4529 EXPECT_TRUE(dir.good()); |
4529 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 4530 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
4530 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); | 4531 MutableEntry perm_folder(&trans, CREATE, ids_.root(), "clientname"); |
4531 ASSERT_TRUE(perm_folder.good()); | 4532 ASSERT_TRUE(perm_folder.good()); |
4532 perm_folder.Put(UNIQUE_CLIENT_TAG, client_tag_); | 4533 perm_folder.Put(UNIQUE_CLIENT_TAG, client_tag_); |
4533 perm_folder.Put(IS_UNSYNCED, true); | 4534 perm_folder.Put(IS_UNSYNCED, true); |
4534 perm_folder.Put(SYNCING, false); | 4535 perm_folder.Put(SYNCING, false); |
4535 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); | 4536 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); |
4536 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); | 4537 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); |
4537 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows()); | 4538 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows()); |
4538 metahandle_ = perm_folder.Get(META_HANDLE); | 4539 metahandle_ = perm_folder.Get(META_HANDLE); |
4539 } | 4540 } |
4540 | 4541 |
4541 void Delete() { | 4542 void Delete() { |
4542 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4543 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4543 EXPECT_TRUE(dir.good()); | 4544 EXPECT_TRUE(dir.good()); |
4544 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 4545 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
4545 MutableEntry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); | 4546 MutableEntry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); |
4546 ASSERT_TRUE(entry.good()); | 4547 ASSERT_TRUE(entry.good()); |
4547 EXPECT_EQ(metahandle_, entry.Get(META_HANDLE)); | 4548 EXPECT_EQ(metahandle_, entry.Get(META_HANDLE)); |
4548 entry.Put(IS_DEL, true); | 4549 entry.Put(IS_DEL, true); |
4549 entry.Put(IS_UNSYNCED, true); | 4550 entry.Put(IS_UNSYNCED, true); |
4550 entry.Put(SYNCING, false); | 4551 entry.Put(SYNCING, false); |
4551 } | 4552 } |
4552 | 4553 |
4553 void Undelete() { | 4554 void Undelete() { |
4554 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4555 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4555 EXPECT_TRUE(dir.good()); | 4556 EXPECT_TRUE(dir.good()); |
4556 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 4557 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
4557 MutableEntry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); | 4558 MutableEntry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); |
4558 ASSERT_TRUE(entry.good()); | 4559 ASSERT_TRUE(entry.good()); |
4559 EXPECT_EQ(metahandle_, entry.Get(META_HANDLE)); | 4560 EXPECT_EQ(metahandle_, entry.Get(META_HANDLE)); |
4560 EXPECT_TRUE(entry.Get(IS_DEL)); | 4561 EXPECT_TRUE(entry.Get(IS_DEL)); |
4561 entry.Put(IS_DEL, false); | 4562 entry.Put(IS_DEL, false); |
4562 entry.Put(IS_UNSYNCED, true); | 4563 entry.Put(IS_UNSYNCED, true); |
4563 entry.Put(SYNCING, false); | 4564 entry.Put(SYNCING, false); |
4564 } | 4565 } |
4565 | 4566 |
4566 int64 GetMetahandleOfTag() { | 4567 int64 GetMetahandleOfTag() { |
4567 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4568 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4568 EXPECT_TRUE(dir.good()); | 4569 EXPECT_TRUE(dir.good()); |
4569 ReadTransaction trans(dir, __FILE__, __LINE__); | 4570 ReadTransaction trans(dir, FROM_HERE); |
4570 Entry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); | 4571 Entry entry(&trans, GET_BY_CLIENT_TAG, client_tag_); |
4571 EXPECT_TRUE(entry.good()); | 4572 EXPECT_TRUE(entry.good()); |
4572 if (!entry.good()) { | 4573 if (!entry.good()) { |
4573 return syncable::kInvalidMetaHandle; | 4574 return syncable::kInvalidMetaHandle; |
4574 } | 4575 } |
4575 return entry.Get(META_HANDLE); | 4576 return entry.Get(META_HANDLE); |
4576 } | 4577 } |
4577 | 4578 |
4578 void ExpectUnsyncedCreation() { | 4579 void ExpectUnsyncedCreation() { |
4579 EXPECT_EQ(metahandle_, GetMetahandleOfTag()); | 4580 EXPECT_EQ(metahandle_, GetMetahandleOfTag()); |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4968 public: | 4969 public: |
4969 SyncerPositionUpdateTest() : next_update_id_(1), next_revision_(1) {} | 4970 SyncerPositionUpdateTest() : next_update_id_(1), next_revision_(1) {} |
4970 | 4971 |
4971 protected: | 4972 protected: |
4972 void ExpectLocalItemsInServerOrder() { | 4973 void ExpectLocalItemsInServerOrder() { |
4973 if (position_map_.empty()) | 4974 if (position_map_.empty()) |
4974 return; | 4975 return; |
4975 | 4976 |
4976 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 4977 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
4977 EXPECT_TRUE(dir.good()); | 4978 EXPECT_TRUE(dir.good()); |
4978 ReadTransaction trans(dir, __FILE__, __LINE__); | 4979 ReadTransaction trans(dir, FROM_HERE); |
4979 | 4980 |
4980 Id prev_id; | 4981 Id prev_id; |
4981 DCHECK(prev_id.IsRoot()); | 4982 DCHECK(prev_id.IsRoot()); |
4982 PosMap::iterator next = position_map_.begin(); | 4983 PosMap::iterator next = position_map_.begin(); |
4983 for (PosMap::iterator i = next++; i != position_map_.end(); ++i) { | 4984 for (PosMap::iterator i = next++; i != position_map_.end(); ++i) { |
4984 Id id = i->second; | 4985 Id id = i->second; |
4985 Entry entry_with_id(&trans, GET_BY_ID, id); | 4986 Entry entry_with_id(&trans, GET_BY_ID, id); |
4986 EXPECT_TRUE(entry_with_id.good()); | 4987 EXPECT_TRUE(entry_with_id.good()); |
4987 EXPECT_EQ(prev_id, entry_with_id.Get(PREV_ID)); | 4988 EXPECT_EQ(prev_id, entry_with_id.Get(PREV_ID)); |
4988 EXPECT_EQ(i->first, entry_with_id.Get(SERVER_POSITION_IN_PARENT)); | 4989 EXPECT_EQ(i->first, entry_with_id.Get(SERVER_POSITION_IN_PARENT)); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5096 int revision = next_revision_++; | 5097 int revision = next_revision_++; |
5097 mock_server_->AddUpdateDirectory(id.GetServerId(), kRootId, | 5098 mock_server_->AddUpdateDirectory(id.GetServerId(), kRootId, |
5098 id.GetServerId(), revision, revision); | 5099 id.GetServerId(), revision, revision); |
5099 // The update position doesn't vary. | 5100 // The update position doesn't vary. |
5100 mock_server_->SetLastUpdatePosition(90210); | 5101 mock_server_->SetLastUpdatePosition(90210); |
5101 } | 5102 } |
5102 | 5103 |
5103 void ExpectLocalOrderIsByServerId() { | 5104 void ExpectLocalOrderIsByServerId() { |
5104 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); | 5105 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); |
5105 EXPECT_TRUE(dir.good()); | 5106 EXPECT_TRUE(dir.good()); |
5106 ReadTransaction trans(dir, __FILE__, __LINE__); | 5107 ReadTransaction trans(dir, FROM_HERE); |
5107 Id null_id; | 5108 Id null_id; |
5108 Entry low(&trans, GET_BY_ID, low_id_); | 5109 Entry low(&trans, GET_BY_ID, low_id_); |
5109 Entry mid(&trans, GET_BY_ID, mid_id_); | 5110 Entry mid(&trans, GET_BY_ID, mid_id_); |
5110 Entry high(&trans, GET_BY_ID, high_id_); | 5111 Entry high(&trans, GET_BY_ID, high_id_); |
5111 EXPECT_TRUE(low.good()); | 5112 EXPECT_TRUE(low.good()); |
5112 EXPECT_TRUE(mid.good()); | 5113 EXPECT_TRUE(mid.good()); |
5113 EXPECT_TRUE(high.good()); | 5114 EXPECT_TRUE(high.good()); |
5114 EXPECT_TRUE(low.Get(PREV_ID) == null_id); | 5115 EXPECT_TRUE(low.Get(PREV_ID) == null_id); |
5115 EXPECT_TRUE(mid.Get(PREV_ID) == low_id_); | 5116 EXPECT_TRUE(mid.Get(PREV_ID) == low_id_); |
5116 EXPECT_TRUE(high.Get(PREV_ID) == mid_id_); | 5117 EXPECT_TRUE(high.Get(PREV_ID) == mid_id_); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5177 Add(low_id_); | 5178 Add(low_id_); |
5178 Add(high_id_); | 5179 Add(high_id_); |
5179 SyncShareAsDelegate(); | 5180 SyncShareAsDelegate(); |
5180 ExpectLocalOrderIsByServerId(); | 5181 ExpectLocalOrderIsByServerId(); |
5181 } | 5182 } |
5182 | 5183 |
5183 const SyncerTest::CommitOrderingTest | 5184 const SyncerTest::CommitOrderingTest |
5184 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()}; | 5185 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()}; |
5185 | 5186 |
5186 } // namespace browser_sync | 5187 } // namespace browser_sync |
OLD | NEW |