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

Side by Side Diff: components/bookmarks/browser/bookmark_model_unittest.cc

Issue 1379983002: Supporting undoing bookmark deletion without creating new ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address some more feedback Created 5 years, 2 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/bookmarks/browser/bookmark_model.h" 5 #include "components/bookmarks/browser/bookmark_model.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 9
10 #include "base/base_paths.h" 10 #include "base/base_paths.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/containers/hash_tables.h" 13 #include "base/containers/hash_tables.h"
14 #include "base/strings/string16.h" 14 #include "base/strings/string16.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/string_split.h" 16 #include "base/strings/string_split.h"
17 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
18 #include "base/strings/utf_string_conversions.h" 18 #include "base/strings/utf_string_conversions.h"
19 #include "base/time/time.h" 19 #include "base/time/time.h"
20 #include "components/bookmarks/browser/bookmark_model_observer.h" 20 #include "components/bookmarks/browser/bookmark_model_observer.h"
21 #include "components/bookmarks/browser/bookmark_undo_delegate.h"
21 #include "components/bookmarks/browser/bookmark_utils.h" 22 #include "components/bookmarks/browser/bookmark_utils.h"
22 #include "components/bookmarks/test/bookmark_test_helpers.h" 23 #include "components/bookmarks/test/bookmark_test_helpers.h"
23 #include "components/bookmarks/test/test_bookmark_client.h" 24 #include "components/bookmarks/test/test_bookmark_client.h"
24 #include "components/favicon_base/favicon_callback.h" 25 #include "components/favicon_base/favicon_callback.h"
25 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
26 #include "third_party/skia/include/core/SkBitmap.h" 27 #include "third_party/skia/include/core/SkBitmap.h"
27 #include "ui/base/models/tree_node_iterator.h" 28 #include "ui/base/models/tree_node_iterator.h"
28 #include "ui/base/models/tree_node_model.h" 29 #include "ui/base/models/tree_node_model.h"
29 #include "ui/gfx/image/image.h" 30 #include "ui/gfx/image/image.h"
30 #include "url/gurl.h" 31 #include "url/gurl.h"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 } 205 }
205 206
206 void VerifyNoDuplicateIDs(BookmarkModel* model) { 207 void VerifyNoDuplicateIDs(BookmarkModel* model) {
207 ui::TreeNodeIterator<const BookmarkNode> it(model->root_node()); 208 ui::TreeNodeIterator<const BookmarkNode> it(model->root_node());
208 base::hash_set<int64_t> ids; 209 base::hash_set<int64_t> ids;
209 while (it.has_next()) 210 while (it.has_next())
210 ASSERT_TRUE(ids.insert(it.Next()->id()).second); 211 ASSERT_TRUE(ids.insert(it.Next()->id()).second);
211 } 212 }
212 213
213 class BookmarkModelTest : public testing::Test, 214 class BookmarkModelTest : public testing::Test,
214 public BookmarkModelObserver { 215 public BookmarkModelObserver,
216 public BookmarkUndoDelegate {
215 public: 217 public:
216 struct ObserverDetails { 218 struct ObserverDetails {
217 ObserverDetails() { 219 ObserverDetails() {
218 Set(NULL, NULL, -1, -1); 220 Set(NULL, NULL, -1, -1);
219 } 221 }
220 222
221 void Set(const BookmarkNode* node1, 223 void Set(const BookmarkNode* node1,
222 const BookmarkNode* node2, 224 const BookmarkNode* node2,
223 int index1, 225 int index1,
224 int index2) { 226 int index2) {
(...skipping 13 matching lines...) Expand all
238 EXPECT_EQ(index2_, index2); 240 EXPECT_EQ(index2_, index2);
239 } 241 }
240 242
241 private: 243 private:
242 const BookmarkNode* node1_; 244 const BookmarkNode* node1_;
243 const BookmarkNode* node2_; 245 const BookmarkNode* node2_;
244 int index1_; 246 int index1_;
245 int index2_; 247 int index2_;
246 }; 248 };
247 249
250 struct NodeRemovalDetail {
251 NodeRemovalDetail(const BookmarkNode* parent,
252 int index,
253 const BookmarkNode* node)
254 : parent_node_id(parent->id()), index(index), node_id(node->id()) {}
255
256 bool operator==(const NodeRemovalDetail& other) const {
257 return parent_node_id == other.parent_node_id &&
258 index == other.index &&
259 node_id == other.node_id;
260 }
261
262 int64_t parent_node_id;
263 int index;
264 int64_t node_id;
265 };
266
248 BookmarkModelTest() : model_(client_.CreateModel()) { 267 BookmarkModelTest() : model_(client_.CreateModel()) {
249 model_->AddObserver(this); 268 model_->AddObserver(this);
250 ClearCounts(); 269 ClearCounts();
251 } 270 }
252 271
253 void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override { 272 void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override {
254 // We never load from the db, so that this should never get invoked. 273 // We never load from the db, so that this should never get invoked.
255 NOTREACHED(); 274 NOTREACHED();
256 } 275 }
257 276
(...skipping 13 matching lines...) Expand all
271 observer_details_.Set(parent, NULL, index, -1); 290 observer_details_.Set(parent, NULL, index, -1);
272 } 291 }
273 292
274 void OnWillRemoveBookmarks(BookmarkModel* model, 293 void OnWillRemoveBookmarks(BookmarkModel* model,
275 const BookmarkNode* parent, 294 const BookmarkNode* parent,
276 int old_index, 295 int old_index,
277 const BookmarkNode* node) override { 296 const BookmarkNode* node) override {
278 ++before_remove_count_; 297 ++before_remove_count_;
279 } 298 }
280 299
300 void SetUndoProvider(BookmarkUndoProvider* provider) override {}
301
281 void BookmarkNodeRemoved(BookmarkModel* model, 302 void BookmarkNodeRemoved(BookmarkModel* model,
282 const BookmarkNode* parent, 303 const BookmarkNode* parent,
283 int old_index, 304 int old_index,
284 const BookmarkNode* node, 305 const BookmarkNode* node,
285 const std::set<GURL>& removed_urls) override { 306 const std::set<GURL>& removed_urls) override {
286 ++removed_count_; 307 ++removed_count_;
287 observer_details_.Set(parent, NULL, old_index, -1); 308 observer_details_.Set(parent, NULL, old_index, -1);
288 } 309 }
289 310
290 void BookmarkNodeChanged(BookmarkModel* model, 311 void BookmarkNodeChanged(BookmarkModel* model,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 void BookmarkAllUserNodesRemoved( 346 void BookmarkAllUserNodesRemoved(
326 BookmarkModel* model, 347 BookmarkModel* model,
327 const std::set<GURL>& removed_urls) override { 348 const std::set<GURL>& removed_urls) override {
328 ++all_bookmarks_removed_; 349 ++all_bookmarks_removed_;
329 } 350 }
330 351
331 void OnWillRemoveAllUserBookmarks(BookmarkModel* model) override { 352 void OnWillRemoveAllUserBookmarks(BookmarkModel* model) override {
332 ++before_remove_all_count_; 353 ++before_remove_all_count_;
333 } 354 }
334 355
356 void GroupedBookmarkChangesBeginning(BookmarkModel* model) override {
357 ++grouped_changes_beginning_count_;
358 }
359
360 void GroupedBookmarkChangesEnded(BookmarkModel* model) override {
361 ++grouped_changes_ended_count_;
362 }
363
364 void OnBookmarkNodeRemoved(BookmarkModel* model,
365 const BookmarkNode* parent,
366 int index,
367 scoped_ptr<BookmarkNode> node) override {
368 node_removal_details_.push_back(
369 NodeRemovalDetail(parent, index, node.get()));
370 }
371
335 void ClearCounts() { 372 void ClearCounts() {
336 added_count_ = moved_count_ = removed_count_ = changed_count_ = 373 added_count_ = moved_count_ = removed_count_ = changed_count_ =
337 reordered_count_ = extensive_changes_beginning_count_ = 374 reordered_count_ = extensive_changes_beginning_count_ =
338 extensive_changes_ended_count_ = all_bookmarks_removed_ = 375 extensive_changes_ended_count_ = all_bookmarks_removed_ =
339 before_remove_count_ = before_change_count_ = before_reorder_count_ = 376 before_remove_count_ = before_change_count_ = before_reorder_count_ =
340 before_remove_all_count_ = 0; 377 before_remove_all_count_ = grouped_changes_beginning_count_ =
378 grouped_changes_ended_count_ = 0;
341 } 379 }
342 380
343 void AssertObserverCount(int added_count, 381 void AssertObserverCount(int added_count,
344 int moved_count, 382 int moved_count,
345 int removed_count, 383 int removed_count,
346 int changed_count, 384 int changed_count,
347 int reordered_count, 385 int reordered_count,
348 int before_remove_count, 386 int before_remove_count,
349 int before_change_count, 387 int before_change_count,
350 int before_reorder_count, 388 int before_reorder_count,
(...skipping 10 matching lines...) Expand all
361 } 399 }
362 400
363 void AssertExtensiveChangesObserverCount( 401 void AssertExtensiveChangesObserverCount(
364 int extensive_changes_beginning_count, 402 int extensive_changes_beginning_count,
365 int extensive_changes_ended_count) { 403 int extensive_changes_ended_count) {
366 EXPECT_EQ(extensive_changes_beginning_count, 404 EXPECT_EQ(extensive_changes_beginning_count,
367 extensive_changes_beginning_count_); 405 extensive_changes_beginning_count_);
368 EXPECT_EQ(extensive_changes_ended_count, extensive_changes_ended_count_); 406 EXPECT_EQ(extensive_changes_ended_count, extensive_changes_ended_count_);
369 } 407 }
370 408
409 void AssertGroupedChangesObserverCount(
410 int grouped_changes_beginning_count,
411 int grouped_changes_ended_count) {
412 EXPECT_EQ(grouped_changes_beginning_count,
413 grouped_changes_beginning_count_);
414 EXPECT_EQ(grouped_changes_ended_count, grouped_changes_ended_count_);
415 }
416
371 int AllNodesRemovedObserverCount() const { return all_bookmarks_removed_; } 417 int AllNodesRemovedObserverCount() const { return all_bookmarks_removed_; }
372 418
373 BookmarkPermanentNode* ReloadModelWithExtraNode() { 419 BookmarkPermanentNode* ReloadModelWithExtraNode() {
374 BookmarkPermanentNode* extra_node = new BookmarkPermanentNode(100); 420 BookmarkPermanentNode* extra_node = new BookmarkPermanentNode(100);
375 BookmarkPermanentNodeList extra_nodes; 421 BookmarkPermanentNodeList extra_nodes;
376 extra_nodes.push_back(extra_node); 422 extra_nodes.push_back(extra_node);
377 client_.SetExtraNodesToLoad(extra_nodes.Pass()); 423 client_.SetExtraNodesToLoad(extra_nodes.Pass());
378 424
379 model_->RemoveObserver(this); 425 model_->RemoveObserver(this);
380 model_ = client_.CreateModel(); 426 model_ = client_.CreateModel();
381 model_->AddObserver(this); 427 model_->AddObserver(this);
382 ClearCounts(); 428 ClearCounts();
383 429
384 if (model_->root_node()->GetIndexOf(extra_node) == -1) 430 if (model_->root_node()->GetIndexOf(extra_node) == -1)
385 ADD_FAILURE(); 431 ADD_FAILURE();
386 432
387 return extra_node; 433 return extra_node;
388 } 434 }
389 435
390 protected: 436 protected:
391 TestBookmarkClient client_; 437 TestBookmarkClient client_;
392 scoped_ptr<BookmarkModel> model_; 438 scoped_ptr<BookmarkModel> model_;
393 ObserverDetails observer_details_; 439 ObserverDetails observer_details_;
440 std::vector<NodeRemovalDetail> node_removal_details_;
394 441
395 private: 442 private:
396 int added_count_; 443 int added_count_;
397 int moved_count_; 444 int moved_count_;
398 int removed_count_; 445 int removed_count_;
399 int changed_count_; 446 int changed_count_;
400 int reordered_count_; 447 int reordered_count_;
401 int extensive_changes_beginning_count_; 448 int extensive_changes_beginning_count_;
402 int extensive_changes_ended_count_; 449 int extensive_changes_ended_count_;
403 int all_bookmarks_removed_; 450 int all_bookmarks_removed_;
404 int before_remove_count_; 451 int before_remove_count_;
405 int before_change_count_; 452 int before_change_count_;
406 int before_reorder_count_; 453 int before_reorder_count_;
407 int before_remove_all_count_; 454 int before_remove_all_count_;
455 int grouped_changes_beginning_count_;
456 int grouped_changes_ended_count_;
408 457
409 DISALLOW_COPY_AND_ASSIGN(BookmarkModelTest); 458 DISALLOW_COPY_AND_ASSIGN(BookmarkModelTest);
410 }; 459 };
411 460
412 TEST_F(BookmarkModelTest, InitialState) { 461 TEST_F(BookmarkModelTest, InitialState) {
413 const BookmarkNode* bb_node = model_->bookmark_bar_node(); 462 const BookmarkNode* bb_node = model_->bookmark_bar_node();
414 ASSERT_TRUE(bb_node != NULL); 463 ASSERT_TRUE(bb_node != NULL);
415 EXPECT_EQ(0, bb_node->child_count()); 464 EXPECT_EQ(0, bb_node->child_count());
416 EXPECT_EQ(BookmarkNode::BOOKMARK_BAR, bb_node->type()); 465 EXPECT_EQ(BookmarkNode::BOOKMARK_BAR, bb_node->type());
417 466
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 } 663 }
615 664
616 TEST_F(BookmarkModelTest, RemoveAllUserBookmarks) { 665 TEST_F(BookmarkModelTest, RemoveAllUserBookmarks) {
617 const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node(); 666 const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node();
618 667
619 ClearCounts(); 668 ClearCounts();
620 669
621 // Add a url to bookmark bar. 670 // Add a url to bookmark bar.
622 base::string16 title(ASCIIToUTF16("foo")); 671 base::string16 title(ASCIIToUTF16("foo"));
623 GURL url("http://foo.com"); 672 GURL url("http://foo.com");
624 model_->AddURL(bookmark_bar_node, 0, title, url); 673 const BookmarkNode* url_node =
674 model_->AddURL(bookmark_bar_node, 0, title, url);
625 675
626 // Add a folder with child URL. 676 // Add a folder with child URL.
627 const BookmarkNode* folder = model_->AddFolder(bookmark_bar_node, 0, title); 677 const BookmarkNode* folder = model_->AddFolder(bookmark_bar_node, 0, title);
628 model_->AddURL(folder, 0, title, url); 678 model_->AddURL(folder, 0, title, url);
629 679
630 AssertObserverCount(3, 0, 0, 0, 0, 0, 0, 0, 0); 680 AssertObserverCount(3, 0, 0, 0, 0, 0, 0, 0, 0);
631 ClearCounts(); 681 ClearCounts();
632 682
683 int permanent_node_count = model_->root_node()->child_count();
684
685 NodeRemovalDetail expected_node_removal_details[] = {
686 NodeRemovalDetail(bookmark_bar_node, 1, url_node),
687 NodeRemovalDetail(bookmark_bar_node, 0, folder),
688 };
689
690 model_->SetUndoDelegate(this);
633 model_->RemoveAllUserBookmarks(); 691 model_->RemoveAllUserBookmarks();
634 692
635 EXPECT_EQ(0, bookmark_bar_node->child_count()); 693 EXPECT_EQ(0, bookmark_bar_node->child_count());
694 // No permanent node should be removed.
695 EXPECT_EQ(permanent_node_count, model_->root_node()->child_count());
636 // No individual BookmarkNodeRemoved events are fired, so removed count 696 // No individual BookmarkNodeRemoved events are fired, so removed count
637 // should be 0. 697 // should be 0.
638 AssertObserverCount(0, 0, 0, 0, 0, 0, 0, 0, 1); 698 AssertObserverCount(0, 0, 0, 0, 0, 0, 0, 0, 1);
639 AssertExtensiveChangesObserverCount(1, 1); 699 AssertExtensiveChangesObserverCount(1, 1);
700 AssertGroupedChangesObserverCount(1, 1);
640 EXPECT_EQ(1, AllNodesRemovedObserverCount()); 701 EXPECT_EQ(1, AllNodesRemovedObserverCount());
702 EXPECT_EQ(1, AllNodesRemovedObserverCount());
703 ASSERT_EQ(2u, node_removal_details_.size());
704 EXPECT_EQ(expected_node_removal_details[0], node_removal_details_[0]);
705 EXPECT_EQ(expected_node_removal_details[1], node_removal_details_[1]);
641 } 706 }
642 707
643 TEST_F(BookmarkModelTest, SetTitle) { 708 TEST_F(BookmarkModelTest, SetTitle) {
644 const BookmarkNode* root = model_->bookmark_bar_node(); 709 const BookmarkNode* root = model_->bookmark_bar_node();
645 base::string16 title(ASCIIToUTF16("foo")); 710 base::string16 title(ASCIIToUTF16("foo"));
646 const GURL url("http://foo.com"); 711 const GURL url("http://foo.com");
647 const BookmarkNode* node = model_->AddURL(root, 0, title, url); 712 const BookmarkNode* node = model_->AddURL(root, 0, title, url);
648 713
649 ClearCounts(); 714 ClearCounts();
650 715
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 std::set<GURL> changed_page_urls; 1388 std::set<GURL> changed_page_urls;
1324 changed_page_urls.insert(kPageURL1); 1389 changed_page_urls.insert(kPageURL1);
1325 model_->OnFaviconsChanged(changed_page_urls, kFaviconURL12); 1390 model_->OnFaviconsChanged(changed_page_urls, kFaviconURL12);
1326 ASSERT_EQ(2u, updated_nodes_.size()); 1391 ASSERT_EQ(2u, updated_nodes_.size());
1327 EXPECT_TRUE(WasNodeUpdated(node1)); 1392 EXPECT_TRUE(WasNodeUpdated(node1));
1328 EXPECT_TRUE(WasNodeUpdated(node2)); 1393 EXPECT_TRUE(WasNodeUpdated(node2));
1329 } 1394 }
1330 } 1395 }
1331 1396
1332 } // namespace bookmarks 1397 } // namespace bookmarks
OLDNEW
« no previous file with comments | « components/bookmarks/browser/bookmark_model.cc ('k') | components/bookmarks/browser/bookmark_undo_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698