• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.h"
6 
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
11 #include "chrome/browser/bookmarks/chrome_bookmark_client.h"
12 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
13 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h"
14 #include "chrome/common/extensions/api/bookmarks.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "components/bookmarks/browser/bookmark_model.h"
17 #include "components/bookmarks/test/bookmark_test_helpers.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 
21 namespace extensions {
22 
23 namespace keys = bookmark_api_constants;
24 using api::bookmarks::BookmarkTreeNode;
25 
26 namespace bookmark_api_helpers {
27 
28 class ExtensionBookmarksTest : public testing::Test {
29  public:
ExtensionBookmarksTest()30   ExtensionBookmarksTest()
31       : client_(NULL), model_(NULL), node_(NULL), folder_(NULL) {}
32 
SetUp()33   virtual void SetUp() OVERRIDE {
34     profile_.CreateBookmarkModel(false);
35     model_ = BookmarkModelFactory::GetForProfile(&profile_);
36     client_ = ChromeBookmarkClientFactory::GetForProfile(&profile_);
37     test::WaitForBookmarkModelToLoad(model_);
38 
39     node_ = model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("Digg"),
40                            GURL("http://www.reddit.com"));
41     model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("News"),
42                    GURL("http://www.foxnews.com"));
43     folder_ = model_->AddFolder(
44         model_->other_node(), 0, base::ASCIIToUTF16("outer folder"));
45     model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 1"));
46     model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 2"));
47     model_->AddURL(
48         folder_, 0, base::ASCIIToUTF16("Digg"), GURL("http://reddit.com"));
49     model_->AddURL(
50         folder_, 0, base::ASCIIToUTF16("CNet"), GURL("http://cnet.com"));
51   }
52 
53   content::TestBrowserThreadBundle thread_bundle_;
54   TestingProfile profile_;
55   ChromeBookmarkClient* client_;
56   BookmarkModel* model_;
57   const BookmarkNode* node_;
58   const BookmarkNode* folder_;
59 };
60 
TEST_F(ExtensionBookmarksTest,GetFullTreeFromRoot)61 TEST_F(ExtensionBookmarksTest, GetFullTreeFromRoot) {
62   scoped_ptr<BookmarkTreeNode> tree(
63       GetBookmarkTreeNode(client_,
64                           model_->other_node(),
65                           true,    // Recurse.
66                           false));  // Not only folders.
67   ASSERT_EQ(3U, tree->children->size());
68 }
69 
TEST_F(ExtensionBookmarksTest,GetFoldersOnlyFromRoot)70 TEST_F(ExtensionBookmarksTest, GetFoldersOnlyFromRoot) {
71   scoped_ptr<BookmarkTreeNode> tree(
72       GetBookmarkTreeNode(client_,
73                           model_->other_node(),
74                           true,   // Recurse.
75                           true));  // Only folders.
76   ASSERT_EQ(1U, tree->children->size());
77 }
78 
TEST_F(ExtensionBookmarksTest,GetSubtree)79 TEST_F(ExtensionBookmarksTest, GetSubtree) {
80   scoped_ptr<BookmarkTreeNode> tree(
81       GetBookmarkTreeNode(client_,
82                           folder_,
83                           true,    // Recurse.
84                           false));  // Not only folders.
85   ASSERT_EQ(4U, tree->children->size());
86   linked_ptr<BookmarkTreeNode> digg = tree->children->at(1);
87   ASSERT_TRUE(digg.get());
88   ASSERT_EQ("Digg", digg->title);
89 }
90 
TEST_F(ExtensionBookmarksTest,GetSubtreeFoldersOnly)91 TEST_F(ExtensionBookmarksTest, GetSubtreeFoldersOnly) {
92   scoped_ptr<BookmarkTreeNode> tree(
93       GetBookmarkTreeNode(client_,
94                           folder_,
95                           true,   // Recurse.
96                           true));  // Only folders.
97   ASSERT_EQ(2U, tree->children->size());
98   linked_ptr<BookmarkTreeNode> inner_folder = tree->children->at(1);
99   ASSERT_TRUE(inner_folder.get());
100   ASSERT_EQ("inner folder 1", inner_folder->title);
101 }
102 
TEST_F(ExtensionBookmarksTest,GetModifiableNode)103 TEST_F(ExtensionBookmarksTest, GetModifiableNode) {
104   scoped_ptr<BookmarkTreeNode> tree(
105       GetBookmarkTreeNode(client_,
106                           node_,
107                           false,    // Recurse.
108                           false));  // Only folders.
109   EXPECT_EQ("Digg", tree->title);
110   ASSERT_TRUE(tree->url);
111   EXPECT_EQ("http://www.reddit.com/", *tree->url);
112   EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_NONE, tree->unmodifiable);
113 }
114 
TEST_F(ExtensionBookmarksTest,GetManagedNode)115 TEST_F(ExtensionBookmarksTest, GetManagedNode) {
116   const BookmarkNode* managed_bookmark =
117       model_->AddURL(client_->managed_node(),
118                      0,
119                      base::ASCIIToUTF16("Chromium"),
120                      GURL("http://www.chromium.org/"));
121   scoped_ptr<BookmarkTreeNode> tree(
122       GetBookmarkTreeNode(client_,
123                           managed_bookmark,
124                           false,    // Recurse.
125                           false));  // Only folders.
126   EXPECT_EQ("Chromium", tree->title);
127   EXPECT_EQ("http://www.chromium.org/", *tree->url);
128   EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_MANAGED, tree->unmodifiable);
129 }
130 
TEST_F(ExtensionBookmarksTest,RemoveNodeInvalidId)131 TEST_F(ExtensionBookmarksTest, RemoveNodeInvalidId) {
132   int64 invalid_id = model_->next_node_id();
133   std::string error;
134   EXPECT_FALSE(RemoveNode(model_, client_, invalid_id, true, &error));
135   EXPECT_EQ(keys::kNoNodeError, error);
136 }
137 
TEST_F(ExtensionBookmarksTest,RemoveNodePermanent)138 TEST_F(ExtensionBookmarksTest, RemoveNodePermanent) {
139   std::string error;
140   EXPECT_FALSE(
141       RemoveNode(model_, client_, model_->other_node()->id(), true, &error));
142   EXPECT_EQ(keys::kModifySpecialError, error);
143 }
144 
TEST_F(ExtensionBookmarksTest,RemoveNodeManaged)145 TEST_F(ExtensionBookmarksTest, RemoveNodeManaged) {
146   const BookmarkNode* managed_bookmark =
147       model_->AddURL(client_->managed_node(),
148                      0,
149                      base::ASCIIToUTF16("Chromium"),
150                      GURL("http://www.chromium.org"));
151   std::string error;
152   EXPECT_FALSE(
153       RemoveNode(model_, client_, managed_bookmark->id(), true, &error));
154   EXPECT_EQ(keys::kModifyManagedError, error);
155 }
156 
TEST_F(ExtensionBookmarksTest,RemoveNodeNotRecursive)157 TEST_F(ExtensionBookmarksTest, RemoveNodeNotRecursive) {
158   std::string error;
159   EXPECT_FALSE(RemoveNode(model_, client_, folder_->id(), false, &error));
160   EXPECT_EQ(keys::kFolderNotEmptyError, error);
161 }
162 
TEST_F(ExtensionBookmarksTest,RemoveNodeRecursive)163 TEST_F(ExtensionBookmarksTest, RemoveNodeRecursive) {
164   EXPECT_EQ(3, model_->other_node()->child_count());
165   std::string error;
166   EXPECT_TRUE(RemoveNode(model_, client_, folder_->id(), true, &error));
167   EXPECT_EQ(2, model_->other_node()->child_count());
168 }
169 
170 }  // namespace bookmark_api_helpers
171 }  // namespace extensions
172