OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 // TODO(akalin): This file is basically just a unit test for | 5 // TODO(akalin): This file is basically just a unit test for |
6 // BookmarkChangeProcessor. Write unit tests for | 6 // BookmarkChangeProcessor. Write unit tests for |
7 // BookmarkModelAssociator separately. | 7 // BookmarkModelAssociator separately. |
8 | 8 |
9 #include <queue> | |
9 #include <stack> | 10 #include <stack> |
10 #include <vector> | 11 #include <vector> |
11 | 12 |
12 #include "base/command_line.h" | 13 #include "base/command_line.h" |
13 #include "base/file_path.h" | 14 #include "base/file_path.h" |
14 #include "base/file_util.h" | 15 #include "base/file_util.h" |
15 #include "base/location.h" | 16 #include "base/location.h" |
16 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
17 #include "base/message_loop.h" | 18 #include "base/message_loop.h" |
18 #include "base/string16.h" | 19 #include "base/string16.h" |
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
552 } | 553 } |
553 | 554 |
554 private: | 555 private: |
555 // Used by both |ui_thread_| and |file_thread_|. | 556 // Used by both |ui_thread_| and |file_thread_|. |
556 MessageLoop message_loop_; | 557 MessageLoop message_loop_; |
557 content::TestBrowserThread ui_thread_; | 558 content::TestBrowserThread ui_thread_; |
558 // Needed by |model_|. | 559 // Needed by |model_|. |
559 content::TestBrowserThread file_thread_; | 560 content::TestBrowserThread file_thread_; |
560 | 561 |
561 TestingProfile profile_; | 562 TestingProfile profile_; |
562 scoped_ptr<TestBookmarkModelAssociator> model_associator_; | |
563 | 563 |
564 protected: | 564 protected: |
565 BookmarkModel* model_; | 565 BookmarkModel* model_; |
566 syncer::TestUserShare test_user_share_; | 566 syncer::TestUserShare test_user_share_; |
567 scoped_ptr<BookmarkChangeProcessor> change_processor_; | 567 scoped_ptr<BookmarkChangeProcessor> change_processor_; |
568 scoped_ptr<TestBookmarkModelAssociator> model_associator_; | |
568 StrictMock<DataTypeErrorHandlerMock> mock_error_handler_; | 569 StrictMock<DataTypeErrorHandlerMock> mock_error_handler_; |
569 }; | 570 }; |
570 | 571 |
571 TEST_F(ProfileSyncServiceBookmarkTest, InitialState) { | 572 TEST_F(ProfileSyncServiceBookmarkTest, InitialState) { |
572 LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE); | 573 LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE); |
573 StartSync(); | 574 StartSync(); |
574 | 575 |
575 EXPECT_TRUE(other_bookmarks_id()); | 576 EXPECT_TRUE(other_bookmarks_id()); |
576 EXPECT_TRUE(bookmark_bar_id()); | 577 EXPECT_TRUE(bookmark_bar_id()); |
577 EXPECT_TRUE(mobile_bookmarks_id()); | 578 EXPECT_TRUE(mobile_bookmarks_id()); |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
995 int size, | 996 int size, |
996 int* running_count); | 997 int* running_count); |
997 void CompareWithTestData(const BookmarkNode* node, | 998 void CompareWithTestData(const BookmarkNode* node, |
998 const TestData* data, | 999 const TestData* data, |
999 int size, | 1000 int size, |
1000 int* running_count); | 1001 int* running_count); |
1001 | 1002 |
1002 void ExpectBookmarkModelMatchesTestData(); | 1003 void ExpectBookmarkModelMatchesTestData(); |
1003 void WriteTestDataToBookmarkModel(); | 1004 void WriteTestDataToBookmarkModel(); |
1004 | 1005 |
1006 // Verify transaction versions of bookmark nodes and sync nodes are equal | |
1007 // recursively. | |
1008 void ExpectTransactionVersionMatch(const BookmarkNode* node); | |
1009 | |
1005 private: | 1010 private: |
1006 const base::Time start_time_; | 1011 const base::Time start_time_; |
1007 | 1012 |
1008 DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceBookmarkTestWithData); | 1013 DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceBookmarkTestWithData); |
1009 }; | 1014 }; |
1010 | 1015 |
1011 namespace { | 1016 namespace { |
1012 | 1017 |
1013 // Constants for bookmark model that looks like: | 1018 // Constants for bookmark model that looks like: |
1014 // |-- Bookmark bar | 1019 // |-- Bookmark bar |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1127 DCHECK(node); | 1132 DCHECK(node); |
1128 DCHECK(data); | 1133 DCHECK(data); |
1129 DCHECK(node->is_folder()); | 1134 DCHECK(node->is_folder()); |
1130 for (int i = 0; i < size; ++i) { | 1135 for (int i = 0; i < size; ++i) { |
1131 const TestData& item = data[i]; | 1136 const TestData& item = data[i]; |
1132 if (item.url) { | 1137 if (item.url) { |
1133 const base::Time add_time = | 1138 const base::Time add_time = |
1134 start_time_ + base::TimeDelta::FromMinutes(*running_count); | 1139 start_time_ + base::TimeDelta::FromMinutes(*running_count); |
1135 model_->AddURLWithCreationTime(node, i, WideToUTF16Hack(item.title), | 1140 model_->AddURLWithCreationTime(node, i, WideToUTF16Hack(item.title), |
1136 GURL(item.url), add_time); | 1141 GURL(item.url), add_time); |
1137 (*running_count)++; | |
1138 } else { | 1142 } else { |
1139 model_->AddFolder(node, i, WideToUTF16Hack(item.title)); | 1143 model_->AddFolder(node, i, WideToUTF16Hack(item.title)); |
1140 } | 1144 } |
1145 (*running_count)++; | |
1141 } | 1146 } |
1142 } | 1147 } |
1143 | 1148 |
1144 void ProfileSyncServiceBookmarkTestWithData::CompareWithTestData( | 1149 void ProfileSyncServiceBookmarkTestWithData::CompareWithTestData( |
1145 const BookmarkNode* node, | 1150 const BookmarkNode* node, |
1146 const TestData* data, | 1151 const TestData* data, |
1147 int size, | 1152 int size, |
1148 int* running_count) { | 1153 int* running_count) { |
1149 DCHECK(node); | 1154 DCHECK(node); |
1150 DCHECK(data); | 1155 DCHECK(data); |
1151 DCHECK(node->is_folder()); | 1156 DCHECK(node->is_folder()); |
1152 ASSERT_EQ(size, node->child_count()); | 1157 ASSERT_EQ(size, node->child_count()); |
1153 for (int i = 0; i < size; ++i) { | 1158 for (int i = 0; i < size; ++i) { |
1154 const BookmarkNode* child_node = node->GetChild(i); | 1159 const BookmarkNode* child_node = node->GetChild(i); |
1155 const TestData& item = data[i]; | 1160 const TestData& item = data[i]; |
1156 GURL url = GURL(item.url == NULL ? "" : item.url); | 1161 GURL url = GURL(item.url == NULL ? "" : item.url); |
1157 BookmarkNode test_node(url); | 1162 BookmarkNode test_node(url); |
1158 test_node.SetTitle(WideToUTF16Hack(item.title)); | 1163 test_node.SetTitle(WideToUTF16Hack(item.title)); |
1159 EXPECT_EQ(child_node->GetTitle(), test_node.GetTitle()); | 1164 EXPECT_EQ(child_node->GetTitle(), test_node.GetTitle()); |
1160 if (item.url) { | 1165 if (item.url) { |
1161 EXPECT_FALSE(child_node->is_folder()); | 1166 EXPECT_FALSE(child_node->is_folder()); |
1162 EXPECT_TRUE(child_node->is_url()); | 1167 EXPECT_TRUE(child_node->is_url()); |
1163 EXPECT_EQ(child_node->url(), test_node.url()); | 1168 EXPECT_EQ(child_node->url(), test_node.url()); |
1164 const base::Time expected_time = | 1169 const base::Time expected_time = |
1165 start_time_ + base::TimeDelta::FromMinutes(*running_count); | 1170 start_time_ + base::TimeDelta::FromMinutes(*running_count); |
1166 EXPECT_EQ(expected_time.ToInternalValue(), | 1171 EXPECT_EQ(expected_time.ToInternalValue(), |
1167 child_node->date_added().ToInternalValue()); | 1172 child_node->date_added().ToInternalValue()); |
1168 (*running_count)++; | |
1169 } else { | 1173 } else { |
1170 EXPECT_TRUE(child_node->is_folder()); | 1174 EXPECT_TRUE(child_node->is_folder()); |
1171 EXPECT_FALSE(child_node->is_url()); | 1175 EXPECT_FALSE(child_node->is_url()); |
1172 } | 1176 } |
1177 (*running_count)++; | |
1173 } | 1178 } |
1174 } | 1179 } |
1175 | 1180 |
1176 // TODO(munjal): We should implement some way of generating random data and can | 1181 // TODO(munjal): We should implement some way of generating random data and can |
1177 // use the same seed to generate the same sequence. | 1182 // use the same seed to generate the same sequence. |
1178 void ProfileSyncServiceBookmarkTestWithData::WriteTestDataToBookmarkModel() { | 1183 void ProfileSyncServiceBookmarkTestWithData::WriteTestDataToBookmarkModel() { |
1179 const BookmarkNode* bookmarks_bar_node = model_->bookmark_bar_node(); | 1184 const BookmarkNode* bookmarks_bar_node = model_->bookmark_bar_node(); |
1180 int count = 0; | 1185 int count = 0; |
1181 PopulateFromTestData(bookmarks_bar_node, | 1186 PopulateFromTestData(bookmarks_bar_node, |
1182 kBookmarkBarChildren, | 1187 kBookmarkBarChildren, |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1588 updates.ApplyPendingChanges(change_processor_.get()); | 1593 updates.ApplyPendingChanges(change_processor_.get()); |
1589 | 1594 |
1590 const BookmarkNode* node = model_->bookmark_bar_node()->GetChild(0); | 1595 const BookmarkNode* node = model_->bookmark_bar_node()->GetChild(0); |
1591 ASSERT_TRUE(node); | 1596 ASSERT_TRUE(node); |
1592 EXPECT_TRUE(node->is_url()); | 1597 EXPECT_TRUE(node->is_url()); |
1593 EXPECT_EQ(WideToUTF16Hack(kTitle), node->GetTitle()); | 1598 EXPECT_EQ(WideToUTF16Hack(kTitle), node->GetTitle()); |
1594 EXPECT_EQ(kUrl, node->url().possibly_invalid_spec()); | 1599 EXPECT_EQ(kUrl, node->url().possibly_invalid_spec()); |
1595 EXPECT_EQ(node->date_added(), base::Time::FromInternalValue(30)); | 1600 EXPECT_EQ(node->date_added(), base::Time::FromInternalValue(30)); |
1596 } | 1601 } |
1597 | 1602 |
1603 int64 GetTransactionVersion(const BookmarkNode* node) { | |
1604 std::string version_str; | |
1605 int64 version; | |
1606 EXPECT_TRUE(node->GetMetaInfo(kBookmarkTransactionVersionKey, &version_str)); | |
1607 EXPECT_TRUE(base::StringToInt64(version_str, &version)); | |
1608 return version; | |
1609 } | |
1610 | |
1611 void ProfileSyncServiceBookmarkTestWithData::ExpectTransactionVersionMatch( | |
1612 const BookmarkNode* node) { | |
1613 std::queue<const BookmarkNode*> nodes; | |
1614 nodes.push(node); | |
1615 while (!nodes.empty()) { | |
1616 const BookmarkNode* n = nodes.front(); | |
1617 nodes.pop(); | |
1618 | |
1619 syncer::ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | |
1620 syncer::ReadNode sync_node(&trans); | |
1621 ASSERT_TRUE(model_associator_->InitSyncNodeFromChromeId(n->id(), | |
1622 &sync_node)); | |
1623 EXPECT_EQ(sync_node.GetEntry()->Get(syncer::syncable::TRANSACTION_VERSION), | |
1624 GetTransactionVersion(n)); | |
1625 for (int i = 0; i < n->child_count(); ++i) | |
1626 nodes.push(n->GetChild(i)); | |
1627 } | |
1628 } | |
1629 | |
1630 // Test transaction versions of model and nodes are incremented after changes | |
1631 // are applied. | |
1632 TEST_F(ProfileSyncServiceBookmarkTestWithData, UpdateTransactionVersion) { | |
1633 LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE); | |
1634 StartSync(); | |
1635 WriteTestDataToBookmarkModel(); | |
1636 MessageLoop::current()->RunUntilIdle(); | |
1637 | |
1638 // Verify model versions are equal. | |
1639 { | |
1640 syncer::ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | |
1641 EXPECT_EQ(trans.GetModelVersion(syncer::BOOKMARKS), | |
1642 GetTransactionVersion(model_->root_node())); | |
1643 } | |
1644 | |
1645 // Verify node versions are equal. | |
1646 ExpectTransactionVersionMatch(model_->bookmark_bar_node()); | |
1647 ExpectTransactionVersionMatch(model_->other_node()); | |
1648 ExpectTransactionVersionMatch(model_->mobile_node()); | |
1649 | |
1650 // verify version is incremented when bookmark is removed. | |
1651 int64 old_model_version = GetTransactionVersion(model_->root_node()); | |
1652 model_->Remove(model_->bookmark_bar_node(), 0); | |
1653 MessageLoop::current()->RunUntilIdle(); | |
1654 EXPECT_EQ(old_model_version + 1, GetTransactionVersion(model_->root_node())); | |
1655 | |
1656 // Verify version is updated when bookmark is changed. | |
1657 old_model_version = GetTransactionVersion(model_->root_node()); | |
1658 model_->SetTitle(model_->bookmark_bar_node()->GetChild(0), | |
1659 WideToUTF16Hack(L"test")); | |
1660 MessageLoop::current()->RunUntilIdle(); | |
1661 EXPECT_EQ(old_model_version + 1, GetTransactionVersion(model_->root_node())); | |
1662 EXPECT_EQ(old_model_version + 1, | |
1663 GetTransactionVersion(model_->bookmark_bar_node()->GetChild(0))); | |
1664 ExpectTransactionVersionMatch(model_->bookmark_bar_node()->GetChild(0)); | |
1665 } | |
1666 | |
Nicolas Zea
2012/11/07 00:20:31
do children get updated when a parent is modified?
haitaol1
2012/11/07 22:20:25
Parent is not updated but siblings do because of N
| |
1598 } // namespace | 1667 } // namespace |
1599 | 1668 |
1600 } // namespace browser_sync | 1669 } // namespace browser_sync |
OLD | NEW |