OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Unit tests for the SyncApi. Note that a lot of the underlying | 5 // Unit tests for the SyncApi. Note that a lot of the underlying |
6 // functionality is provided by the Syncable layer, which has its own | 6 // functionality is provided by the Syncable layer, which has its own |
7 // unit tests. We'll test SyncApi specific things in this harness. | 7 // unit tests. We'll test SyncApi specific things in this harness. |
8 | 8 |
9 #include <cstddef> | 9 #include <cstddef> |
10 #include <map> | 10 #include <map> |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 ReadNode root_node(&trans); | 123 ReadNode root_node(&trans); |
124 root_node.InitByRootLookup(); | 124 root_node.InitByRootLookup(); |
125 WriteNode node(&trans); | 125 WriteNode node(&trans); |
126 WriteNode::InitUniqueByCreationResult result = | 126 WriteNode::InitUniqueByCreationResult result = |
127 node.InitUniqueByCreation(model_type, root_node, client_tag); | 127 node.InitUniqueByCreation(model_type, root_node, client_tag); |
128 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); | 128 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
129 node.SetIsFolder(false); | 129 node.SetIsFolder(false); |
130 return node.GetId(); | 130 return node.GetId(); |
131 } | 131 } |
132 | 132 |
| 133 // Makes a non-folder child of a non-root node. Returns the id of the |
| 134 // newly-created node. |
| 135 int64 MakeNodeWithParent(UserShare* share, |
| 136 ModelType model_type, |
| 137 const std::string& client_tag, |
| 138 int64 parent_id) { |
| 139 WriteTransaction trans(FROM_HERE, share); |
| 140 ReadNode parent_node(&trans); |
| 141 EXPECT_EQ(BaseNode::INIT_OK, parent_node.InitByIdLookup(parent_id)); |
| 142 WriteNode node(&trans); |
| 143 WriteNode::InitUniqueByCreationResult result = |
| 144 node.InitUniqueByCreation(model_type, parent_node, client_tag); |
| 145 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
| 146 node.SetIsFolder(false); |
| 147 return node.GetId(); |
| 148 } |
| 149 |
133 // Makes a folder child of a non-root node. Returns the id of the | 150 // Makes a folder child of a non-root node. Returns the id of the |
134 // newly-created node. | 151 // newly-created node. |
135 int64 MakeFolderWithParent(UserShare* share, | 152 int64 MakeFolderWithParent(UserShare* share, |
136 ModelType model_type, | 153 ModelType model_type, |
137 int64 parent_id, | 154 int64 parent_id, |
138 BaseNode* predecessor) { | 155 BaseNode* predecessor) { |
139 WriteTransaction trans(FROM_HERE, share); | 156 WriteTransaction trans(FROM_HERE, share); |
140 ReadNode parent_node(&trans); | 157 ReadNode parent_node(&trans); |
141 DCHECK_EQ(BaseNode::INIT_OK, parent_node.InitByIdLookup(parent_id)); | 158 EXPECT_EQ(BaseNode::INIT_OK, parent_node.InitByIdLookup(parent_id)); |
142 WriteNode node(&trans); | 159 WriteNode node(&trans); |
143 DCHECK(node.InitBookmarkByCreation(parent_node, predecessor)); | 160 EXPECT_TRUE(node.InitByCreation(model_type, parent_node, predecessor)); |
144 node.SetIsFolder(true); | 161 node.SetIsFolder(true); |
145 return node.GetId(); | 162 return node.GetId(); |
146 } | 163 } |
147 | 164 |
148 int64 MakeBookmarkWithParent(UserShare* share, | |
149 int64 parent_id, | |
150 BaseNode* predecessor) { | |
151 WriteTransaction trans(FROM_HERE, share); | |
152 ReadNode parent_node(&trans); | |
153 DCHECK_EQ(BaseNode::INIT_OK, parent_node.InitByIdLookup(parent_id)); | |
154 WriteNode node(&trans); | |
155 DCHECK(node.InitBookmarkByCreation(parent_node, predecessor)); | |
156 return node.GetId(); | |
157 } | |
158 | |
159 // Creates the "synced" root node for a particular datatype. We use the syncable | 165 // Creates the "synced" root node for a particular datatype. We use the syncable |
160 // methods here so that the syncer treats these nodes as if they were already | 166 // methods here so that the syncer treats these nodes as if they were already |
161 // received from the server. | 167 // received from the server. |
162 int64 MakeServerNodeForType(UserShare* share, | 168 int64 MakeServerNodeForType(UserShare* share, |
163 ModelType model_type) { | 169 ModelType model_type) { |
164 sync_pb::EntitySpecifics specifics; | 170 sync_pb::EntitySpecifics specifics; |
165 AddDefaultFieldValue(model_type, &specifics); | 171 AddDefaultFieldValue(model_type, &specifics); |
166 syncable::WriteTransaction trans( | 172 syncable::WriteTransaction trans( |
167 FROM_HERE, syncable::UNITTEST, share->directory.get()); | 173 FROM_HERE, syncable::UNITTEST, share->directory.get()); |
168 // Attempt to lookup by nigori tag. | 174 // Attempt to lookup by nigori tag. |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 int64 folder_id; | 343 int64 folder_id; |
338 std::string test_title("test1"); | 344 std::string test_title("test1"); |
339 | 345 |
340 { | 346 { |
341 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 347 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
342 ReadNode root_node(&trans); | 348 ReadNode root_node(&trans); |
343 root_node.InitByRootLookup(); | 349 root_node.InitByRootLookup(); |
344 | 350 |
345 // we'll use this spare folder later | 351 // we'll use this spare folder later |
346 WriteNode folder_node(&trans); | 352 WriteNode folder_node(&trans); |
347 EXPECT_TRUE(folder_node.InitBookmarkByCreation(root_node, NULL)); | 353 EXPECT_TRUE(folder_node.InitByCreation(BOOKMARKS, |
| 354 root_node, NULL)); |
348 folder_id = folder_node.GetId(); | 355 folder_id = folder_node.GetId(); |
349 | 356 |
350 WriteNode wnode(&trans); | 357 WriteNode wnode(&trans); |
351 WriteNode::InitUniqueByCreationResult result = | 358 WriteNode::InitUniqueByCreationResult result = |
352 wnode.InitUniqueByCreation(BOOKMARKS, root_node, "testtag"); | 359 wnode.InitUniqueByCreation(BOOKMARKS, root_node, "testtag"); |
353 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); | 360 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
354 wnode.SetIsFolder(false); | 361 wnode.SetIsFolder(false); |
355 wnode.SetTitle(UTF8ToWide(test_title)); | 362 wnode.SetTitle(UTF8ToWide(test_title)); |
356 | 363 |
357 node_id = wnode.GetId(); | 364 node_id = wnode.GetId(); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 } | 453 } |
447 } | 454 } |
448 | 455 |
449 TEST_F(SyncApiTest, WriteEncryptedTitle) { | 456 TEST_F(SyncApiTest, WriteEncryptedTitle) { |
450 KeyParams params = {"localhost", "username", "passphrase"}; | 457 KeyParams params = {"localhost", "username", "passphrase"}; |
451 { | 458 { |
452 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 459 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
453 trans.GetCryptographer()->AddKey(params); | 460 trans.GetCryptographer()->AddKey(params); |
454 } | 461 } |
455 test_user_share_.encryption_handler()->EnableEncryptEverything(); | 462 test_user_share_.encryption_handler()->EnableEncryptEverything(); |
456 int bookmark_id; | |
457 { | 463 { |
458 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 464 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
459 ReadNode root_node(&trans); | 465 ReadNode root_node(&trans); |
460 root_node.InitByRootLookup(); | 466 root_node.InitByRootLookup(); |
461 | 467 |
462 WriteNode bookmark_node(&trans); | 468 WriteNode bookmark_node(&trans); |
463 ASSERT_TRUE(bookmark_node.InitBookmarkByCreation(root_node, NULL)); | 469 WriteNode::InitUniqueByCreationResult result = |
464 bookmark_id = bookmark_node.GetId(); | 470 bookmark_node.InitUniqueByCreation(BOOKMARKS, |
| 471 root_node, "foo"); |
| 472 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
465 bookmark_node.SetTitle(UTF8ToWide("foo")); | 473 bookmark_node.SetTitle(UTF8ToWide("foo")); |
466 | 474 |
467 WriteNode pref_node(&trans); | 475 WriteNode pref_node(&trans); |
468 WriteNode::InitUniqueByCreationResult result = | 476 result = |
469 pref_node.InitUniqueByCreation(PREFERENCES, root_node, "bar"); | 477 pref_node.InitUniqueByCreation(PREFERENCES, root_node, "bar"); |
470 ASSERT_EQ(WriteNode::INIT_SUCCESS, result); | 478 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
471 pref_node.SetTitle(UTF8ToWide("bar")); | 479 pref_node.SetTitle(UTF8ToWide("bar")); |
472 } | 480 } |
473 { | 481 { |
474 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 482 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
475 ReadNode root_node(&trans); | 483 ReadNode root_node(&trans); |
476 root_node.InitByRootLookup(); | 484 root_node.InitByRootLookup(); |
477 | 485 |
478 ReadNode bookmark_node(&trans); | 486 ReadNode bookmark_node(&trans); |
479 ASSERT_EQ(BaseNode::INIT_OK, bookmark_node.InitByIdLookup(bookmark_id)); | 487 EXPECT_EQ(BaseNode::INIT_OK, |
| 488 bookmark_node.InitByClientTagLookup(BOOKMARKS, |
| 489 "foo")); |
480 EXPECT_EQ("foo", bookmark_node.GetTitle()); | 490 EXPECT_EQ("foo", bookmark_node.GetTitle()); |
481 EXPECT_EQ(kEncryptedString, | 491 EXPECT_EQ(kEncryptedString, |
482 bookmark_node.GetEntry()->Get(syncable::NON_UNIQUE_NAME)); | 492 bookmark_node.GetEntry()->Get(syncable::NON_UNIQUE_NAME)); |
483 | 493 |
484 ReadNode pref_node(&trans); | 494 ReadNode pref_node(&trans); |
485 ASSERT_EQ(BaseNode::INIT_OK, | 495 EXPECT_EQ(BaseNode::INIT_OK, |
486 pref_node.InitByClientTagLookup(PREFERENCES, | 496 pref_node.InitByClientTagLookup(PREFERENCES, |
487 "bar")); | 497 "bar")); |
488 EXPECT_EQ(kEncryptedString, pref_node.GetTitle()); | 498 EXPECT_EQ(kEncryptedString, pref_node.GetTitle()); |
489 } | 499 } |
490 } | 500 } |
491 | 501 |
492 TEST_F(SyncApiTest, BaseNodeSetSpecifics) { | 502 TEST_F(SyncApiTest, BaseNodeSetSpecifics) { |
493 int64 child_id = MakeNode(test_user_share_.user_share(), | 503 int64 child_id = MakeNode(test_user_share_.user_share(), |
494 BOOKMARKS, "testtag"); | 504 BOOKMARKS, "testtag"); |
495 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 505 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 NULL); | 665 NULL); |
656 ignore_result(MakeFolderWithParent(test_user_share_.user_share(), | 666 ignore_result(MakeFolderWithParent(test_user_share_.user_share(), |
657 BOOKMARKS, | 667 BOOKMARKS, |
658 type_root, | 668 type_root, |
659 NULL)); | 669 NULL)); |
660 int64 child1 = MakeFolderWithParent( | 670 int64 child1 = MakeFolderWithParent( |
661 test_user_share_.user_share(), | 671 test_user_share_.user_share(), |
662 BOOKMARKS, | 672 BOOKMARKS, |
663 parent, | 673 parent, |
664 NULL); | 674 NULL); |
665 ignore_result(MakeBookmarkWithParent( | 675 ignore_result(MakeNodeWithParent( |
666 test_user_share_.user_share(), | 676 test_user_share_.user_share(), |
667 parent, | 677 BOOKMARKS, |
668 NULL)); | 678 "c2", |
669 ignore_result(MakeBookmarkWithParent( | 679 parent)); |
| 680 ignore_result(MakeNodeWithParent( |
670 test_user_share_.user_share(), | 681 test_user_share_.user_share(), |
671 child1, | 682 BOOKMARKS, |
672 NULL)); | 683 "c1c1", |
| 684 child1)); |
673 | 685 |
674 { | 686 { |
675 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 687 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
676 ReadNode type_root_node(&trans); | 688 ReadNode type_root_node(&trans); |
677 EXPECT_EQ(BaseNode::INIT_OK, | 689 EXPECT_EQ(BaseNode::INIT_OK, |
678 type_root_node.InitByIdLookup(type_root)); | 690 type_root_node.InitByIdLookup(type_root)); |
679 EXPECT_EQ(6, type_root_node.GetTotalNodeCount()); | 691 EXPECT_EQ(6, type_root_node.GetTotalNodeCount()); |
680 ReadNode node(&trans); | 692 ReadNode node(&trans); |
681 EXPECT_EQ(BaseNode::INIT_OK, | 693 EXPECT_EQ(BaseNode::INIT_OK, |
682 node.InitByIdLookup(parent)); | 694 node.InitByIdLookup(parent)); |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); | 1533 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); |
1522 | 1534 |
1523 // Create some unencrypted unsynced data. | 1535 // Create some unencrypted unsynced data. |
1524 int64 folder = MakeFolderWithParent(sync_manager_.GetUserShare(), | 1536 int64 folder = MakeFolderWithParent(sync_manager_.GetUserShare(), |
1525 BOOKMARKS, | 1537 BOOKMARKS, |
1526 GetIdForDataType(BOOKMARKS), | 1538 GetIdForDataType(BOOKMARKS), |
1527 NULL); | 1539 NULL); |
1528 // First batch_size nodes are children of folder. | 1540 // First batch_size nodes are children of folder. |
1529 size_t i; | 1541 size_t i; |
1530 for (i = 0; i < batch_size; ++i) { | 1542 for (i = 0; i < batch_size; ++i) { |
1531 MakeBookmarkWithParent(sync_manager_.GetUserShare(), folder, NULL); | 1543 MakeNodeWithParent(sync_manager_.GetUserShare(), BOOKMARKS, |
| 1544 base::StringPrintf("%"PRIuS"", i), folder); |
1532 } | 1545 } |
1533 // Next batch_size nodes are a different type and on their own. | 1546 // Next batch_size nodes are a different type and on their own. |
1534 for (; i < 2*batch_size; ++i) { | 1547 for (; i < 2*batch_size; ++i) { |
1535 MakeNode(sync_manager_.GetUserShare(), SESSIONS, | 1548 MakeNodeWithParent(sync_manager_.GetUserShare(), SESSIONS, |
1536 base::StringPrintf("%"PRIuS"", i)); | 1549 base::StringPrintf("%"PRIuS"", i), |
| 1550 GetIdForDataType(SESSIONS)); |
1537 } | 1551 } |
1538 // Last batch_size nodes are a third type that will not need encryption. | 1552 // Last batch_size nodes are a third type that will not need encryption. |
1539 for (; i < 3*batch_size; ++i) { | 1553 for (; i < 3*batch_size; ++i) { |
1540 MakeNode(sync_manager_.GetUserShare(), THEMES, | 1554 MakeNodeWithParent(sync_manager_.GetUserShare(), THEMES, |
1541 base::StringPrintf("%"PRIuS"", i)); | 1555 base::StringPrintf("%"PRIuS"", i), |
| 1556 GetIdForDataType(THEMES)); |
1542 } | 1557 } |
1543 | 1558 |
1544 { | 1559 { |
1545 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1560 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
1546 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( | 1561 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( |
1547 SyncEncryptionHandler::SensitiveTypes())); | 1562 SyncEncryptionHandler::SensitiveTypes())); |
1548 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1563 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
1549 trans.GetWrappedTrans(), | 1564 trans.GetWrappedTrans(), |
1550 BOOKMARKS, | 1565 BOOKMARKS, |
1551 false /* not encrypted */)); | 1566 false /* not encrypted */)); |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 } | 2143 } |
2129 | 2144 |
2130 // Create a bookmark and set the title/url, then verify the data was properly | 2145 // Create a bookmark and set the title/url, then verify the data was properly |
2131 // set. This replicates the unique way bookmarks have of creating sync nodes. | 2146 // set. This replicates the unique way bookmarks have of creating sync nodes. |
2132 // See BookmarkChangeProcessor::PlaceSyncNode(..). | 2147 // See BookmarkChangeProcessor::PlaceSyncNode(..). |
2133 TEST_F(SyncManagerTest, CreateLocalBookmark) { | 2148 TEST_F(SyncManagerTest, CreateLocalBookmark) { |
2134 std::string title = "title"; | 2149 std::string title = "title"; |
2135 std::string url = "url"; | 2150 std::string url = "url"; |
2136 { | 2151 { |
2137 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2152 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
2138 ReadNode bookmark_root(&trans); | 2153 ReadNode root_node(&trans); |
2139 ASSERT_EQ(BaseNode::INIT_OK, | 2154 root_node.InitByRootLookup(); |
2140 bookmark_root.InitByTagLookup(ModelTypeToRootTag(BOOKMARKS))); | |
2141 WriteNode node(&trans); | 2155 WriteNode node(&trans); |
2142 ASSERT_TRUE(node.InitBookmarkByCreation(bookmark_root, NULL)); | 2156 ASSERT_TRUE(node.InitByCreation(BOOKMARKS, root_node, NULL)); |
2143 node.SetIsFolder(false); | 2157 node.SetIsFolder(false); |
2144 node.SetTitle(UTF8ToWide(title)); | 2158 node.SetTitle(UTF8ToWide(title)); |
2145 | 2159 |
2146 sync_pb::BookmarkSpecifics bookmark_specifics(node.GetBookmarkSpecifics()); | 2160 sync_pb::BookmarkSpecifics bookmark_specifics(node.GetBookmarkSpecifics()); |
2147 bookmark_specifics.set_url(url); | 2161 bookmark_specifics.set_url(url); |
2148 node.SetBookmarkSpecifics(bookmark_specifics); | 2162 node.SetBookmarkSpecifics(bookmark_specifics); |
2149 } | 2163 } |
2150 { | 2164 { |
2151 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2165 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
2152 ReadNode bookmark_root(&trans); | 2166 ReadNode root_node(&trans); |
2153 ASSERT_EQ(BaseNode::INIT_OK, | 2167 root_node.InitByRootLookup(); |
2154 bookmark_root.InitByTagLookup(ModelTypeToRootTag(BOOKMARKS))); | 2168 int64 child_id = root_node.GetFirstChildId(); |
2155 int64 child_id = bookmark_root.GetFirstChildId(); | |
2156 | 2169 |
2157 ReadNode node(&trans); | 2170 ReadNode node(&trans); |
2158 ASSERT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(child_id)); | 2171 ASSERT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(child_id)); |
2159 EXPECT_FALSE(node.GetIsFolder()); | 2172 EXPECT_FALSE(node.GetIsFolder()); |
2160 EXPECT_EQ(title, node.GetTitle()); | 2173 EXPECT_EQ(title, node.GetTitle()); |
2161 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); | 2174 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); |
2162 } | 2175 } |
2163 } | 2176 } |
2164 | 2177 |
2165 // Verifies WriteNode::UpdateEntryWithEncryption does not make unnecessary | 2178 // Verifies WriteNode::UpdateEntryWithEncryption does not make unnecessary |
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3045 Difference(ModelTypeSet::All(), disabled_types); | 3058 Difference(ModelTypeSet::All(), disabled_types); |
3046 | 3059 |
3047 // Verify only the non-disabled types remain after cleanup. | 3060 // Verify only the non-disabled types remain after cleanup. |
3048 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); | 3061 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); |
3049 EXPECT_TRUE(new_enabled_types.Equals(sync_manager_.InitialSyncEndedTypes())); | 3062 EXPECT_TRUE(new_enabled_types.Equals(sync_manager_.InitialSyncEndedTypes())); |
3050 EXPECT_TRUE(disabled_types.Equals( | 3063 EXPECT_TRUE(disabled_types.Equals( |
3051 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); | 3064 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); |
3052 } | 3065 } |
3053 | 3066 |
3054 } // namespace | 3067 } // namespace |
OLD | NEW |