| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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 #include "base/scoped_ptr.h" | 5 #include "base/scoped_ptr.h" |
| 6 #include "base/string_util.h" | 6 #include "base/string_util.h" |
| 7 #include "base/values.h" | 7 #include "base/values.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_codec.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_model.h" | 9 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 9 #include "chrome/browser/bookmarks/bookmark_codec.h" | 10 #include "chrome/browser/bookmarks/bookmark_model_test_utils.h" |
| 10 #include "chrome/browser/bookmarks/bookmark_utils.h" | 11 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 13 |
| 14 namespace { |
| 15 |
| 16 const wchar_t kUrl1Title[] = L"url1"; |
| 17 const wchar_t kUrl1Url[] = L"http://www.url1.com"; |
| 18 const wchar_t kUrl2Title[] = L"url2"; |
| 19 const wchar_t kUrl2Url[] = L"http://www.url2.com"; |
| 20 const wchar_t kUrl3Title[] = L"url3"; |
| 21 const wchar_t kUrl3Url[] = L"http://www.url3.com"; |
| 22 const wchar_t kUrl4Title[] = L"url4"; |
| 23 const wchar_t kUrl4Url[] = L"http://www.url4.com"; |
| 24 const wchar_t kGroup1Title[] = L"group1"; |
| 25 const wchar_t kGroup2Title[] = L"group2"; |
| 26 |
| 27 } |
| 28 |
| 13 class BookmarkCodecTest : public testing::Test { | 29 class BookmarkCodecTest : public testing::Test { |
| 14 protected: | 30 protected: |
| 15 // Helpers to create bookmark models with different data. | 31 // Helpers to create bookmark models with different data. |
| 16 // Callers own the returned instances. | 32 BookmarkModel* CreateTestModel1() { |
| 17 BookmarkModel* CreateModelWithOneUrl() { | |
| 18 scoped_ptr<BookmarkModel> model(new BookmarkModel(NULL)); | 33 scoped_ptr<BookmarkModel> model(new BookmarkModel(NULL)); |
| 19 BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); | 34 BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); |
| 20 model->AddURL(bookmark_bar, 0, L"foo", GURL(L"http://www.foo.com")); | 35 model->AddURL(bookmark_bar, 0, kUrl1Title, GURL(kUrl1Url)); |
| 21 return model.release(); | 36 return model.release(); |
| 22 } | 37 } |
| 23 BookmarkModel* CreateModelWithTwoUrls() { | 38 BookmarkModel* CreateTestModel2() { |
| 24 scoped_ptr<BookmarkModel> model(new BookmarkModel(NULL)); | 39 scoped_ptr<BookmarkModel> model(new BookmarkModel(NULL)); |
| 25 BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); | 40 BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); |
| 26 model->AddURL(bookmark_bar, 0, L"foo", GURL(L"http://www.foo.com")); | 41 model->AddURL(bookmark_bar, 0, kUrl1Title, GURL(kUrl1Url)); |
| 27 model->AddURL(bookmark_bar, 1, L"bar", GURL(L"http://www.bar.com")); | 42 model->AddURL(bookmark_bar, 1, kUrl2Title, GURL(kUrl2Url)); |
| 43 return model.release(); |
| 44 } |
| 45 BookmarkModel* CreateTestModel3() { |
| 46 scoped_ptr<BookmarkModel> model(new BookmarkModel(NULL)); |
| 47 BookmarkNode* bookmark_bar = model->GetBookmarkBarNode(); |
| 48 model->AddURL(bookmark_bar, 0, kUrl1Title, GURL(kUrl1Url)); |
| 49 BookmarkNode* group1 = model->AddGroup(bookmark_bar, 1, kGroup1Title); |
| 50 model->AddURL(group1, 0, kUrl2Title, GURL(kUrl2Url)); |
| 28 return model.release(); | 51 return model.release(); |
| 29 } | 52 } |
| 30 | 53 |
| 31 void GetBookmarksBarChildValue(Value* value, | 54 void GetBookmarksBarChildValue(Value* value, |
| 32 size_t index, | 55 size_t index, |
| 33 DictionaryValue** result_value) { | 56 DictionaryValue** result_value) { |
| 34 ASSERT_EQ(Value::TYPE_DICTIONARY, value->GetType()); | 57 ASSERT_EQ(Value::TYPE_DICTIONARY, value->GetType()); |
| 35 | 58 |
| 36 DictionaryValue* d_value = static_cast<DictionaryValue*>(value); | 59 DictionaryValue* d_value = static_cast<DictionaryValue*>(value); |
| 37 Value* roots; | 60 Value* roots; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 if (expected_changes) | 127 if (expected_changes) |
| 105 EXPECT_NE(*computed_checksum, stored_checksum); | 128 EXPECT_NE(*computed_checksum, stored_checksum); |
| 106 else | 129 else |
| 107 EXPECT_EQ(*computed_checksum, stored_checksum); | 130 EXPECT_EQ(*computed_checksum, stored_checksum); |
| 108 | 131 |
| 109 return model.release(); | 132 return model.release(); |
| 110 } | 133 } |
| 111 }; | 134 }; |
| 112 | 135 |
| 113 TEST_F(BookmarkCodecTest, ChecksumEncodeDecodeTest) { | 136 TEST_F(BookmarkCodecTest, ChecksumEncodeDecodeTest) { |
| 114 scoped_ptr<BookmarkModel> model_to_encode(CreateModelWithOneUrl()); | 137 scoped_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); |
| 115 std::string enc_checksum; | 138 std::string enc_checksum; |
| 116 scoped_ptr<Value> value(EncodeHelper(model_to_encode.get(), &enc_checksum)); | 139 scoped_ptr<Value> value(EncodeHelper(model_to_encode.get(), &enc_checksum)); |
| 117 | 140 |
| 118 EXPECT_TRUE(value.get() != NULL); | 141 EXPECT_TRUE(value.get() != NULL); |
| 119 | 142 |
| 120 std::string dec_checksum; | 143 std::string dec_checksum; |
| 121 scoped_ptr<BookmarkModel> decoded_model(DecodeHelper( | 144 scoped_ptr<BookmarkModel> decoded_model(DecodeHelper( |
| 122 *value.get(), enc_checksum, &dec_checksum, false)); | 145 *value.get(), enc_checksum, &dec_checksum, false)); |
| 123 } | 146 } |
| 124 | 147 |
| 125 TEST_F(BookmarkCodecTest, ChecksumEncodeIdenticalModelsTest) { | 148 TEST_F(BookmarkCodecTest, ChecksumEncodeIdenticalModelsTest) { |
| 126 // Encode two identical models and make sure the check-sums are same as long | 149 // Encode two identical models and make sure the check-sums are same as long |
| 127 // as the data is the same. | 150 // as the data is the same. |
| 128 scoped_ptr<BookmarkModel> model1(CreateModelWithOneUrl()); | 151 scoped_ptr<BookmarkModel> model1(CreateTestModel1()); |
| 129 std::string enc_checksum1; | 152 std::string enc_checksum1; |
| 130 scoped_ptr<Value> value1(EncodeHelper(model1.get(), &enc_checksum1)); | 153 scoped_ptr<Value> value1(EncodeHelper(model1.get(), &enc_checksum1)); |
| 131 EXPECT_TRUE(value1.get() != NULL); | 154 EXPECT_TRUE(value1.get() != NULL); |
| 132 | 155 |
| 133 scoped_ptr<BookmarkModel> model2(CreateModelWithOneUrl()); | 156 scoped_ptr<BookmarkModel> model2(CreateTestModel1()); |
| 134 std::string enc_checksum2; | 157 std::string enc_checksum2; |
| 135 scoped_ptr<Value> value2(EncodeHelper(model2.get(), &enc_checksum2)); | 158 scoped_ptr<Value> value2(EncodeHelper(model2.get(), &enc_checksum2)); |
| 136 EXPECT_TRUE(value2.get() != NULL); | 159 EXPECT_TRUE(value2.get() != NULL); |
| 137 | 160 |
| 138 ASSERT_EQ(enc_checksum1, enc_checksum2); | 161 ASSERT_EQ(enc_checksum1, enc_checksum2); |
| 139 } | 162 } |
| 140 | 163 |
| 141 TEST_F(BookmarkCodecTest, ChecksumManualEditTest) { | 164 TEST_F(BookmarkCodecTest, ChecksumManualEditTest) { |
| 142 scoped_ptr<BookmarkModel> model_to_encode(CreateModelWithOneUrl()); | 165 scoped_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); |
| 143 std::string enc_checksum; | 166 std::string enc_checksum; |
| 144 scoped_ptr<Value> value(EncodeHelper(model_to_encode.get(), &enc_checksum)); | 167 scoped_ptr<Value> value(EncodeHelper(model_to_encode.get(), &enc_checksum)); |
| 145 | 168 |
| 146 EXPECT_TRUE(value.get() != NULL); | 169 EXPECT_TRUE(value.get() != NULL); |
| 147 | 170 |
| 148 // Change something in the encoded value before decoding it. | 171 // Change something in the encoded value before decoding it. |
| 149 DictionaryValue* child1_value; | 172 DictionaryValue* child1_value; |
| 150 GetBookmarksBarChildValue(value.get(), 0, &child1_value); | 173 GetBookmarksBarChildValue(value.get(), 0, &child1_value); |
| 151 std::wstring title; | 174 std::wstring title; |
| 152 ASSERT_TRUE(child1_value->GetString(BookmarkCodec::kNameKey, &title)); | 175 ASSERT_TRUE(child1_value->GetString(BookmarkCodec::kNameKey, &title)); |
| 153 ASSERT_TRUE(child1_value->SetString(BookmarkCodec::kNameKey, title + L"1")); | 176 ASSERT_TRUE(child1_value->SetString(BookmarkCodec::kNameKey, title + L"1")); |
| 154 | 177 |
| 155 std::string dec_checksum; | 178 std::string dec_checksum; |
| 156 scoped_ptr<BookmarkModel> decoded_model1(DecodeHelper( | 179 scoped_ptr<BookmarkModel> decoded_model1(DecodeHelper( |
| 157 *value.get(), enc_checksum, &dec_checksum, true)); | 180 *value.get(), enc_checksum, &dec_checksum, true)); |
| 158 | 181 |
| 159 // Undo the change and make sure the checksum is same as original. | 182 // Undo the change and make sure the checksum is same as original. |
| 160 ASSERT_TRUE(child1_value->SetString(BookmarkCodec::kNameKey, title)); | 183 ASSERT_TRUE(child1_value->SetString(BookmarkCodec::kNameKey, title)); |
| 161 scoped_ptr<BookmarkModel> decoded_model2(DecodeHelper( | 184 scoped_ptr<BookmarkModel> decoded_model2(DecodeHelper( |
| 162 *value.get(), enc_checksum, &dec_checksum, false)); | 185 *value.get(), enc_checksum, &dec_checksum, false)); |
| 163 } | 186 } |
| 187 |
| 188 TEST_F(BookmarkCodecTest, PersistIDsTest) { |
| 189 scoped_ptr<BookmarkModel> model_to_encode(CreateTestModel3()); |
| 190 BookmarkCodec encoder(true); |
| 191 scoped_ptr<Value> model_value(encoder.Encode(model_to_encode.get())); |
| 192 |
| 193 // Set the next id to 1 to simulate fresh Chrome start. |
| 194 BookmarkNode::SetNextId(1); |
| 195 |
| 196 BookmarkModel decoded_model(NULL); |
| 197 BookmarkCodec decoder(true); |
| 198 ASSERT_TRUE(decoder.Decode(&decoded_model, *model_value.get())); |
| 199 BookmarkModelTestUtils::AssertModelsEqual(model_to_encode.get(), |
| 200 &decoded_model, |
| 201 true); |
| 202 |
| 203 // Add a couple of more items to the decoded bookmark model and make sure |
| 204 // ID persistence is working properly. |
| 205 BookmarkNode* bookmark_bar = decoded_model.GetBookmarkBarNode(); |
| 206 decoded_model.AddURL( |
| 207 bookmark_bar, bookmark_bar->GetChildCount(), kUrl3Title, GURL(kUrl3Url)); |
| 208 BookmarkNode* group2_node = decoded_model.AddGroup( |
| 209 bookmark_bar, bookmark_bar->GetChildCount(), kGroup2Title); |
| 210 decoded_model.AddURL(group2_node, 0, kUrl4Title, GURL(kUrl4Url)); |
| 211 |
| 212 BookmarkCodec encoder2(true); |
| 213 scoped_ptr<Value> model_value2(encoder2.Encode(&decoded_model)); |
| 214 |
| 215 // Set the next id to 1 to simulate fresh Chrome start. |
| 216 BookmarkNode::SetNextId(1); |
| 217 |
| 218 BookmarkModel decoded_model2(NULL); |
| 219 BookmarkCodec decoder2(true); |
| 220 ASSERT_TRUE(decoder2.Decode(&decoded_model2, *model_value2.get())); |
| 221 BookmarkModelTestUtils::AssertModelsEqual(&decoded_model, |
| 222 &decoded_model2, |
| 223 true); |
| 224 } |
| 225 |
| 226 class UniqueIDGeneratorTest : public testing::Test { |
| 227 protected: |
| 228 void TestMixed(UniqueIDGenerator* gen) { |
| 229 // Few unique numbers. |
| 230 for (int i = 1; i <= 5; ++i) { |
| 231 EXPECT_EQ(i, gen->GetUniqueID(i)); |
| 232 } |
| 233 |
| 234 // All numbers from 1 to 5 should produce numbers 6 to 10. |
| 235 for (int i = 1; i <= 5; ++i) { |
| 236 EXPECT_EQ(5 + i, gen->GetUniqueID(i)); |
| 237 } |
| 238 |
| 239 // 10 should produce 11, then 11 should produce 12, and so on. |
| 240 for (int i = 1; i <= 5; ++i) { |
| 241 EXPECT_EQ(10 + i, gen->GetUniqueID(9 + i)); |
| 242 } |
| 243 |
| 244 // Any numbers between 1 and 15 should produce a new numbers in sequence. |
| 245 EXPECT_EQ(16, gen->GetUniqueID(10)); |
| 246 EXPECT_EQ(17, gen->GetUniqueID(2)); |
| 247 EXPECT_EQ(18, gen->GetUniqueID(14)); |
| 248 EXPECT_EQ(19, gen->GetUniqueID(7)); |
| 249 EXPECT_EQ(20, gen->GetUniqueID(4)); |
| 250 |
| 251 // Numbers not yet generated should work. |
| 252 EXPECT_EQ(100, gen->GetUniqueID(100)); |
| 253 EXPECT_EQ(21, gen->GetUniqueID(21)); |
| 254 EXPECT_EQ(200, gen->GetUniqueID(200)); |
| 255 |
| 256 // Now any existing number should produce numbers starting from 201. |
| 257 EXPECT_EQ(201, gen->GetUniqueID(1)); |
| 258 EXPECT_EQ(202, gen->GetUniqueID(20)); |
| 259 EXPECT_EQ(203, gen->GetUniqueID(21)); |
| 260 EXPECT_EQ(204, gen->GetUniqueID(100)); |
| 261 EXPECT_EQ(205, gen->GetUniqueID(200)); |
| 262 } |
| 263 }; |
| 264 |
| 265 TEST_F(UniqueIDGeneratorTest, SerialNumbersTest) { |
| 266 UniqueIDGenerator gen; |
| 267 for (int i = 1; i <= 10; ++i) { |
| 268 EXPECT_EQ(i, gen.GetUniqueID(i)); |
| 269 } |
| 270 } |
| 271 |
| 272 TEST_F(UniqueIDGeneratorTest, UniquSortedNumbersTest) { |
| 273 UniqueIDGenerator gen; |
| 274 for (int i = 1; i <= 10; i += 2) { |
| 275 EXPECT_EQ(i, gen.GetUniqueID(i)); |
| 276 } |
| 277 } |
| 278 |
| 279 TEST_F(UniqueIDGeneratorTest, UniquUnsortedConsecutiveNumbersTest) { |
| 280 UniqueIDGenerator gen; |
| 281 int numbers[] = {2, 10, 6, 3, 8, 5, 1, 7, 4, 9}; |
| 282 for (int i = 0; i < ARRAYSIZE(numbers); ++i) { |
| 283 EXPECT_EQ(numbers[i], gen.GetUniqueID(numbers[i])); |
| 284 } |
| 285 } |
| 286 |
| 287 TEST_F(UniqueIDGeneratorTest, UniquUnsortedNumbersTest) { |
| 288 UniqueIDGenerator gen; |
| 289 int numbers[] = {20, 100, 60, 30, 80, 50, 10, 70, 40, 90}; |
| 290 for (int i = 0; i < ARRAYSIZE(numbers); ++i) { |
| 291 EXPECT_EQ(numbers[i], gen.GetUniqueID(numbers[i])); |
| 292 } |
| 293 } |
| 294 |
| 295 TEST_F(UniqueIDGeneratorTest, AllDuplicatesTest) { |
| 296 UniqueIDGenerator gen; |
| 297 for (int i = 1; i <= 10; ++i) { |
| 298 EXPECT_EQ(i, gen.GetUniqueID(1)); |
| 299 } |
| 300 } |
| 301 |
| 302 TEST_F(UniqueIDGeneratorTest, MixedTest) { |
| 303 UniqueIDGenerator gen; |
| 304 TestMixed(&gen); |
| 305 } |
| 306 |
| 307 TEST_F(UniqueIDGeneratorTest, ResetTest) { |
| 308 UniqueIDGenerator gen; |
| 309 for (int i = 0; i < 5; ++i) { |
| 310 TestMixed(&gen); |
| 311 gen.Reset(); |
| 312 } |
| 313 } |
| OLD | NEW |