Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: chrome/browser/bookmarks/bookmark_codec_unittest.cc

Issue 99217: Implement ID persistence for bookmarks:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/bookmarks/bookmark_codec.cc ('k') | chrome/browser/bookmarks/bookmark_model.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/bookmarks/bookmark_codec.cc ('k') | chrome/browser/bookmarks/bookmark_model.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698