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 |