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 <stack> | 9 #include <stack> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/file_path.h" | 13 #include "base/file_path.h" |
14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
15 #include "base/location.h" | 15 #include "base/location.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/message_loop.h" | 17 #include "base/message_loop.h" |
18 #include "base/string16.h" | 18 #include "base/string16.h" |
19 #include "base/string_number_conversions.h" | 19 #include "base/string_number_conversions.h" |
20 #include "base/string_util.h" | 20 #include "base/string_util.h" |
| 21 #include "base/time.h" |
21 #include "base/utf_string_conversions.h" | 22 #include "base/utf_string_conversions.h" |
22 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h" | 23 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h" |
23 #include "chrome/browser/bookmarks/bookmark_model.h" | 24 #include "chrome/browser/bookmarks/bookmark_model.h" |
24 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 25 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
25 #include "chrome/browser/sync/glue/bookmark_change_processor.h" | 26 #include "chrome/browser/sync/glue/bookmark_change_processor.h" |
26 #include "chrome/browser/sync/glue/bookmark_model_associator.h" | 27 #include "chrome/browser/sync/glue/bookmark_model_associator.h" |
27 #include "chrome/browser/sync/glue/data_type_error_handler.h" | 28 #include "chrome/browser/sync/glue/data_type_error_handler.h" |
28 #include "chrome/browser/sync/glue/data_type_error_handler_mock.h" | 29 #include "chrome/browser/sync/glue/data_type_error_handler_mock.h" |
29 #include "chrome/common/chrome_switches.h" | 30 #include "chrome/common/chrome_switches.h" |
30 #include "chrome/test/base/testing_profile.h" | 31 #include "chrome/test/base/testing_profile.h" |
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 const wchar_t* title; | 966 const wchar_t* title; |
966 const char* url; | 967 const char* url; |
967 }; | 968 }; |
968 | 969 |
969 // TODO(ncarter): Integrate the existing TestNode/PopulateNodeFromString code | 970 // TODO(ncarter): Integrate the existing TestNode/PopulateNodeFromString code |
970 // in the bookmark model unittest, to make it simpler to set up test data | 971 // in the bookmark model unittest, to make it simpler to set up test data |
971 // here (and reduce the amount of duplication among tests), and to reduce the | 972 // here (and reduce the amount of duplication among tests), and to reduce the |
972 // duplication. | 973 // duplication. |
973 class ProfileSyncServiceBookmarkTestWithData | 974 class ProfileSyncServiceBookmarkTestWithData |
974 : public ProfileSyncServiceBookmarkTest { | 975 : public ProfileSyncServiceBookmarkTest { |
| 976 public: |
| 977 ProfileSyncServiceBookmarkTestWithData(); |
| 978 |
975 protected: | 979 protected: |
976 // Populates or compares children of the given bookmark node from/with the | 980 // Populates or compares children of the given bookmark node from/with the |
977 // given test data array with the given size. | 981 // given test data array with the given size. |running_count| is updated as |
| 982 // urls are added. It is used to set the creation date (or test the creation |
| 983 // date for CompareWithTestData()). |
978 void PopulateFromTestData(const BookmarkNode* node, | 984 void PopulateFromTestData(const BookmarkNode* node, |
979 const TestData* data, | 985 const TestData* data, |
980 int size); | 986 int size, |
| 987 int* running_count); |
981 void CompareWithTestData(const BookmarkNode* node, | 988 void CompareWithTestData(const BookmarkNode* node, |
982 const TestData* data, | 989 const TestData* data, |
983 int size); | 990 int size, |
| 991 int* running_count); |
984 | 992 |
985 void ExpectBookmarkModelMatchesTestData(); | 993 void ExpectBookmarkModelMatchesTestData(); |
986 void WriteTestDataToBookmarkModel(); | 994 void WriteTestDataToBookmarkModel(); |
| 995 |
| 996 private: |
| 997 const base::Time start_time_; |
| 998 |
| 999 DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceBookmarkTestWithData); |
987 }; | 1000 }; |
988 | 1001 |
989 namespace { | 1002 namespace { |
990 | 1003 |
991 // Constants for bookmark model that looks like: | 1004 // Constants for bookmark model that looks like: |
992 // |-- Bookmark bar | 1005 // |-- Bookmark bar |
993 // | |-- u2, http://www.u2.com/ | 1006 // | |-- u2, http://www.u2.com/ |
994 // | |-- f1 | 1007 // | |-- f1 |
995 // | | |-- f1u4, http://www.f1u4.com/ | 1008 // | | |-- f1u4, http://www.f1u4.com/ |
996 // | | |-- f1u2, http://www.f1u2.com/ | 1009 // | | |-- f1u2, http://www.f1u2.com/ |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 { L"f5u1", "http://www.f5u1.com/" }, | 1098 { L"f5u1", "http://www.f5u1.com/" }, |
1086 { L"f5u2", "http://www.f5u2.com/" }, | 1099 { L"f5u2", "http://www.f5u2.com/" }, |
1087 }; | 1100 }; |
1088 static TestData kF6Children[] = { | 1101 static TestData kF6Children[] = { |
1089 { L"f6u1", "http://www.f6u1.com/" }, | 1102 { L"f6u1", "http://www.f6u1.com/" }, |
1090 { L"f6u2", "http://www.f6u2.com/" }, | 1103 { L"f6u2", "http://www.f6u2.com/" }, |
1091 }; | 1104 }; |
1092 | 1105 |
1093 } // anonymous namespace. | 1106 } // anonymous namespace. |
1094 | 1107 |
| 1108 ProfileSyncServiceBookmarkTestWithData:: |
| 1109 ProfileSyncServiceBookmarkTestWithData() |
| 1110 : start_time_(base::Time::Now()) { |
| 1111 } |
| 1112 |
1095 void ProfileSyncServiceBookmarkTestWithData::PopulateFromTestData( | 1113 void ProfileSyncServiceBookmarkTestWithData::PopulateFromTestData( |
1096 const BookmarkNode* node, const TestData* data, int size) { | 1114 const BookmarkNode* node, |
| 1115 const TestData* data, |
| 1116 int size, |
| 1117 int* running_count) { |
1097 DCHECK(node); | 1118 DCHECK(node); |
1098 DCHECK(data); | 1119 DCHECK(data); |
1099 DCHECK(node->is_folder()); | 1120 DCHECK(node->is_folder()); |
1100 for (int i = 0; i < size; ++i) { | 1121 for (int i = 0; i < size; ++i) { |
1101 const TestData& item = data[i]; | 1122 const TestData& item = data[i]; |
1102 if (item.url) { | 1123 if (item.url) { |
1103 model_->AddURL(node, i, WideToUTF16Hack(item.title), GURL(item.url)); | 1124 const base::Time add_time = |
| 1125 start_time_ + base::TimeDelta::FromMinutes(*running_count); |
| 1126 model_->AddURLWithCreationTime(node, i, WideToUTF16Hack(item.title), |
| 1127 GURL(item.url), add_time); |
| 1128 (*running_count)++; |
1104 } else { | 1129 } else { |
1105 model_->AddFolder(node, i, WideToUTF16Hack(item.title)); | 1130 model_->AddFolder(node, i, WideToUTF16Hack(item.title)); |
1106 } | 1131 } |
1107 } | 1132 } |
1108 } | 1133 } |
1109 | 1134 |
1110 void ProfileSyncServiceBookmarkTestWithData::CompareWithTestData( | 1135 void ProfileSyncServiceBookmarkTestWithData::CompareWithTestData( |
1111 const BookmarkNode* node, const TestData* data, int size) { | 1136 const BookmarkNode* node, |
| 1137 const TestData* data, |
| 1138 int size, |
| 1139 int* running_count) { |
1112 DCHECK(node); | 1140 DCHECK(node); |
1113 DCHECK(data); | 1141 DCHECK(data); |
1114 DCHECK(node->is_folder()); | 1142 DCHECK(node->is_folder()); |
1115 ASSERT_EQ(size, node->child_count()); | 1143 ASSERT_EQ(size, node->child_count()); |
1116 for (int i = 0; i < size; ++i) { | 1144 for (int i = 0; i < size; ++i) { |
1117 const BookmarkNode* child_node = node->GetChild(i); | 1145 const BookmarkNode* child_node = node->GetChild(i); |
1118 const TestData& item = data[i]; | 1146 const TestData& item = data[i]; |
1119 GURL url = GURL(item.url == NULL ? "" : item.url); | 1147 GURL url = GURL(item.url == NULL ? "" : item.url); |
1120 BookmarkNode test_node(url); | 1148 BookmarkNode test_node(url); |
1121 test_node.SetTitle(WideToUTF16Hack(item.title)); | 1149 test_node.SetTitle(WideToUTF16Hack(item.title)); |
1122 EXPECT_EQ(child_node->GetTitle(), test_node.GetTitle()); | 1150 EXPECT_EQ(child_node->GetTitle(), test_node.GetTitle()); |
1123 if (item.url) { | 1151 if (item.url) { |
1124 EXPECT_FALSE(child_node->is_folder()); | 1152 EXPECT_FALSE(child_node->is_folder()); |
1125 EXPECT_TRUE(child_node->is_url()); | 1153 EXPECT_TRUE(child_node->is_url()); |
1126 EXPECT_EQ(child_node->url(), test_node.url()); | 1154 EXPECT_EQ(child_node->url(), test_node.url()); |
| 1155 const base::Time expected_time = |
| 1156 start_time_ + base::TimeDelta::FromMinutes(*running_count); |
| 1157 EXPECT_EQ(expected_time.ToInternalValue(), |
| 1158 child_node->date_added().ToInternalValue()); |
| 1159 (*running_count)++; |
1127 } else { | 1160 } else { |
1128 EXPECT_TRUE(child_node->is_folder()); | 1161 EXPECT_TRUE(child_node->is_folder()); |
1129 EXPECT_FALSE(child_node->is_url()); | 1162 EXPECT_FALSE(child_node->is_url()); |
1130 } | 1163 } |
1131 } | 1164 } |
1132 } | 1165 } |
1133 | 1166 |
1134 // TODO(munjal): We should implement some way of generating random data and can | 1167 // TODO(munjal): We should implement some way of generating random data and can |
1135 // use the same seed to generate the same sequence. | 1168 // use the same seed to generate the same sequence. |
1136 void ProfileSyncServiceBookmarkTestWithData::WriteTestDataToBookmarkModel() { | 1169 void ProfileSyncServiceBookmarkTestWithData::WriteTestDataToBookmarkModel() { |
1137 const BookmarkNode* bookmarks_bar_node = model_->bookmark_bar_node(); | 1170 const BookmarkNode* bookmarks_bar_node = model_->bookmark_bar_node(); |
| 1171 int count = 0; |
1138 PopulateFromTestData(bookmarks_bar_node, | 1172 PopulateFromTestData(bookmarks_bar_node, |
1139 kBookmarkBarChildren, | 1173 kBookmarkBarChildren, |
1140 arraysize(kBookmarkBarChildren)); | 1174 arraysize(kBookmarkBarChildren), |
| 1175 &count); |
1141 | 1176 |
1142 ASSERT_GE(bookmarks_bar_node->child_count(), 4); | 1177 ASSERT_GE(bookmarks_bar_node->child_count(), 4); |
1143 const BookmarkNode* f1_node = bookmarks_bar_node->GetChild(1); | 1178 const BookmarkNode* f1_node = bookmarks_bar_node->GetChild(1); |
1144 PopulateFromTestData(f1_node, kF1Children, arraysize(kF1Children)); | 1179 PopulateFromTestData(f1_node, kF1Children, arraysize(kF1Children), &count); |
1145 const BookmarkNode* f2_node = bookmarks_bar_node->GetChild(3); | 1180 const BookmarkNode* f2_node = bookmarks_bar_node->GetChild(3); |
1146 PopulateFromTestData(f2_node, kF2Children, arraysize(kF2Children)); | 1181 PopulateFromTestData(f2_node, kF2Children, arraysize(kF2Children), &count); |
1147 | 1182 |
1148 const BookmarkNode* other_bookmarks_node = model_->other_node(); | 1183 const BookmarkNode* other_bookmarks_node = model_->other_node(); |
1149 PopulateFromTestData(other_bookmarks_node, | 1184 PopulateFromTestData(other_bookmarks_node, |
1150 kOtherBookmarkChildren, | 1185 kOtherBookmarkChildren, |
1151 arraysize(kOtherBookmarkChildren)); | 1186 arraysize(kOtherBookmarkChildren), |
| 1187 &count); |
1152 | 1188 |
1153 ASSERT_GE(other_bookmarks_node->child_count(), 6); | 1189 ASSERT_GE(other_bookmarks_node->child_count(), 6); |
1154 const BookmarkNode* f3_node = other_bookmarks_node->GetChild(0); | 1190 const BookmarkNode* f3_node = other_bookmarks_node->GetChild(0); |
1155 PopulateFromTestData(f3_node, kF3Children, arraysize(kF3Children)); | 1191 PopulateFromTestData(f3_node, kF3Children, arraysize(kF3Children), &count); |
1156 const BookmarkNode* f4_node = other_bookmarks_node->GetChild(3); | 1192 const BookmarkNode* f4_node = other_bookmarks_node->GetChild(3); |
1157 PopulateFromTestData(f4_node, kF4Children, arraysize(kF4Children)); | 1193 PopulateFromTestData(f4_node, kF4Children, arraysize(kF4Children), &count); |
1158 const BookmarkNode* dup_node = other_bookmarks_node->GetChild(4); | 1194 const BookmarkNode* dup_node = other_bookmarks_node->GetChild(4); |
1159 PopulateFromTestData(dup_node, kDup1Children, arraysize(kDup1Children)); | 1195 PopulateFromTestData(dup_node, kDup1Children, arraysize(kDup1Children), |
| 1196 &count); |
1160 dup_node = other_bookmarks_node->GetChild(5); | 1197 dup_node = other_bookmarks_node->GetChild(5); |
1161 PopulateFromTestData(dup_node, kDup2Children, arraysize(kDup2Children)); | 1198 PopulateFromTestData(dup_node, kDup2Children, arraysize(kDup2Children), |
| 1199 &count); |
1162 | 1200 |
1163 const BookmarkNode* mobile_bookmarks_node = model_->mobile_node(); | 1201 const BookmarkNode* mobile_bookmarks_node = model_->mobile_node(); |
1164 PopulateFromTestData(mobile_bookmarks_node, | 1202 PopulateFromTestData(mobile_bookmarks_node, |
1165 kMobileBookmarkChildren, | 1203 kMobileBookmarkChildren, |
1166 arraysize(kMobileBookmarkChildren)); | 1204 arraysize(kMobileBookmarkChildren), |
| 1205 &count); |
1167 | 1206 |
1168 ASSERT_GE(mobile_bookmarks_node->child_count(), 3); | 1207 ASSERT_GE(mobile_bookmarks_node->child_count(), 3); |
1169 const BookmarkNode* f5_node = mobile_bookmarks_node->GetChild(0); | 1208 const BookmarkNode* f5_node = mobile_bookmarks_node->GetChild(0); |
1170 PopulateFromTestData(f5_node, kF5Children, arraysize(kF5Children)); | 1209 PopulateFromTestData(f5_node, kF5Children, arraysize(kF5Children), &count); |
1171 const BookmarkNode* f6_node = mobile_bookmarks_node->GetChild(1); | 1210 const BookmarkNode* f6_node = mobile_bookmarks_node->GetChild(1); |
1172 PopulateFromTestData(f6_node, kF6Children, arraysize(kF6Children)); | 1211 PopulateFromTestData(f6_node, kF6Children, arraysize(kF6Children), &count); |
1173 | 1212 |
1174 ExpectBookmarkModelMatchesTestData(); | 1213 ExpectBookmarkModelMatchesTestData(); |
1175 } | 1214 } |
1176 | 1215 |
1177 void ProfileSyncServiceBookmarkTestWithData:: | 1216 void ProfileSyncServiceBookmarkTestWithData:: |
1178 ExpectBookmarkModelMatchesTestData() { | 1217 ExpectBookmarkModelMatchesTestData() { |
1179 const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node(); | 1218 const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node(); |
| 1219 int count = 0; |
1180 CompareWithTestData(bookmark_bar_node, | 1220 CompareWithTestData(bookmark_bar_node, |
1181 kBookmarkBarChildren, | 1221 kBookmarkBarChildren, |
1182 arraysize(kBookmarkBarChildren)); | 1222 arraysize(kBookmarkBarChildren), |
| 1223 &count); |
1183 | 1224 |
1184 ASSERT_GE(bookmark_bar_node->child_count(), 4); | 1225 ASSERT_GE(bookmark_bar_node->child_count(), 4); |
1185 const BookmarkNode* f1_node = bookmark_bar_node->GetChild(1); | 1226 const BookmarkNode* f1_node = bookmark_bar_node->GetChild(1); |
1186 CompareWithTestData(f1_node, kF1Children, arraysize(kF1Children)); | 1227 CompareWithTestData(f1_node, kF1Children, arraysize(kF1Children), &count); |
1187 const BookmarkNode* f2_node = bookmark_bar_node->GetChild(3); | 1228 const BookmarkNode* f2_node = bookmark_bar_node->GetChild(3); |
1188 CompareWithTestData(f2_node, kF2Children, arraysize(kF2Children)); | 1229 CompareWithTestData(f2_node, kF2Children, arraysize(kF2Children), &count); |
1189 | 1230 |
1190 const BookmarkNode* other_bookmarks_node = model_->other_node(); | 1231 const BookmarkNode* other_bookmarks_node = model_->other_node(); |
1191 CompareWithTestData(other_bookmarks_node, | 1232 CompareWithTestData(other_bookmarks_node, |
1192 kOtherBookmarkChildren, | 1233 kOtherBookmarkChildren, |
1193 arraysize(kOtherBookmarkChildren)); | 1234 arraysize(kOtherBookmarkChildren), |
| 1235 &count); |
1194 | 1236 |
1195 ASSERT_GE(other_bookmarks_node->child_count(), 6); | 1237 ASSERT_GE(other_bookmarks_node->child_count(), 6); |
1196 const BookmarkNode* f3_node = other_bookmarks_node->GetChild(0); | 1238 const BookmarkNode* f3_node = other_bookmarks_node->GetChild(0); |
1197 CompareWithTestData(f3_node, kF3Children, arraysize(kF3Children)); | 1239 CompareWithTestData(f3_node, kF3Children, arraysize(kF3Children), &count); |
1198 const BookmarkNode* f4_node = other_bookmarks_node->GetChild(3); | 1240 const BookmarkNode* f4_node = other_bookmarks_node->GetChild(3); |
1199 CompareWithTestData(f4_node, kF4Children, arraysize(kF4Children)); | 1241 CompareWithTestData(f4_node, kF4Children, arraysize(kF4Children), &count); |
1200 const BookmarkNode* dup_node = other_bookmarks_node->GetChild(4); | 1242 const BookmarkNode* dup_node = other_bookmarks_node->GetChild(4); |
1201 CompareWithTestData(dup_node, kDup1Children, arraysize(kDup1Children)); | 1243 CompareWithTestData(dup_node, kDup1Children, arraysize(kDup1Children), |
| 1244 &count); |
1202 dup_node = other_bookmarks_node->GetChild(5); | 1245 dup_node = other_bookmarks_node->GetChild(5); |
1203 CompareWithTestData(dup_node, kDup2Children, arraysize(kDup2Children)); | 1246 CompareWithTestData(dup_node, kDup2Children, arraysize(kDup2Children), |
| 1247 &count); |
1204 | 1248 |
1205 const BookmarkNode* mobile_bookmarks_node = model_->mobile_node(); | 1249 const BookmarkNode* mobile_bookmarks_node = model_->mobile_node(); |
1206 CompareWithTestData(mobile_bookmarks_node, | 1250 CompareWithTestData(mobile_bookmarks_node, |
1207 kMobileBookmarkChildren, | 1251 kMobileBookmarkChildren, |
1208 arraysize(kMobileBookmarkChildren)); | 1252 arraysize(kMobileBookmarkChildren), |
| 1253 &count); |
1209 | 1254 |
1210 ASSERT_GE(mobile_bookmarks_node->child_count(), 3); | 1255 ASSERT_GE(mobile_bookmarks_node->child_count(), 3); |
1211 const BookmarkNode* f5_node = mobile_bookmarks_node->GetChild(0); | 1256 const BookmarkNode* f5_node = mobile_bookmarks_node->GetChild(0); |
1212 CompareWithTestData(f5_node, kF5Children, arraysize(kF5Children)); | 1257 CompareWithTestData(f5_node, kF5Children, arraysize(kF5Children), &count); |
1213 const BookmarkNode* f6_node = mobile_bookmarks_node->GetChild(1); | 1258 const BookmarkNode* f6_node = mobile_bookmarks_node->GetChild(1); |
1214 CompareWithTestData(f6_node, kF6Children, arraysize(kF6Children)); | 1259 CompareWithTestData(f6_node, kF6Children, arraysize(kF6Children), &count); |
1215 | 1260 |
1216 } | 1261 } |
1217 | 1262 |
1218 // Tests persistence of the profile sync service by unloading the | 1263 // Tests persistence of the profile sync service by unloading the |
1219 // database and then reloading it from disk. | 1264 // database and then reloading it from disk. |
1220 TEST_F(ProfileSyncServiceBookmarkTestWithData, Persistence) { | 1265 TEST_F(ProfileSyncServiceBookmarkTestWithData, Persistence) { |
1221 LoadBookmarkModel(DELETE_EXISTING_STORAGE, SAVE_TO_STORAGE); | 1266 LoadBookmarkModel(DELETE_EXISTING_STORAGE, SAVE_TO_STORAGE); |
1222 StartSync(); | 1267 StartSync(); |
1223 | 1268 |
1224 WriteTestDataToBookmarkModel(); | 1269 WriteTestDataToBookmarkModel(); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1489 EXPECT_EQ(1, observer.get_started()); | 1534 EXPECT_EQ(1, observer.get_started()); |
1490 EXPECT_EQ(0, observer.get_completed_count_at_started()); | 1535 EXPECT_EQ(0, observer.get_completed_count_at_started()); |
1491 EXPECT_EQ(1, observer.get_completed()); | 1536 EXPECT_EQ(1, observer.get_completed()); |
1492 | 1537 |
1493 model_->RemoveObserver(&observer); | 1538 model_->RemoveObserver(&observer); |
1494 } | 1539 } |
1495 | 1540 |
1496 } // namespace | 1541 } // namespace |
1497 | 1542 |
1498 } // namespace browser_sync | 1543 } // namespace browser_sync |
OLD | NEW |