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

Side by Side Diff: components/policy/core/browser/managed_bookmarks_tracker_unittest.cc

Issue 305973004: BookmarkClient can add extra nodes to BookmarkModel. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added support for extra nodes from the client Created 6 years, 6 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/policy/core/browser/managed_bookmarks_tracker.h"
6
7 #include "base/bind.h"
8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/prefs/pref_registry_simple.h"
12 #include "base/prefs/testing_pref_service.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "components/bookmarks/browser/bookmark_model.h"
15 #include "components/bookmarks/browser/bookmark_model_observer.h"
16 #include "components/bookmarks/browser/bookmark_node.h"
17 #include "components/bookmarks/common/bookmark_pref_names.h"
18 #include "components/bookmarks/test/bookmark_test_helpers.h"
19 #include "components/bookmarks/test/test_bookmark_client.h"
20 #include "grit/components_strings.h"
21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "ui/base/l10n/l10n_util.h"
24 #include "url/gurl.h"
25
26 using testing::Mock;
27 using testing::_;
28
29 namespace policy {
30
31 namespace {
32
33 class MockBookmarkModelObserver : public BookmarkModelObserver {
34 public:
35 MockBookmarkModelObserver() {}
36 virtual ~MockBookmarkModelObserver() {}
37
38 MOCK_METHOD2(BookmarkModelLoaded, void(BookmarkModel*, bool));
39
40 MOCK_METHOD5(BookmarkNodeMoved, void(BookmarkModel*,
41 const BookmarkNode*,
42 int,
43 const BookmarkNode*,
44 int));
45
46 MOCK_METHOD3(BookmarkNodeAdded, void(BookmarkModel*,
47 const BookmarkNode*,
48 int));
49
50 MOCK_METHOD5(BookmarkNodeRemoved, void(BookmarkModel*,
51 const BookmarkNode*,
52 int,
53 const BookmarkNode*,
54 const std::set<GURL>&));
55
56 MOCK_METHOD2(BookmarkNodeChanged, void(BookmarkModel*, const BookmarkNode*));
57
58 MOCK_METHOD2(BookmarkNodeFaviconChanged, void(BookmarkModel*,
59 const BookmarkNode*));
60
61 MOCK_METHOD2(BookmarkNodeChildrenReordered, void(BookmarkModel*,
62 const BookmarkNode*));
63
64 MOCK_METHOD2(BookmarkAllNodesRemoved, void(BookmarkModel*,
65 const std::set<GURL>&));
66 };
67
68 } // namespace
69
70 class ManagedBookmarksTrackerTest : public testing::Test {
71 public:
72 ManagedBookmarksTrackerTest() : managed_node_(NULL) {}
73 virtual ~ManagedBookmarksTrackerTest() {}
74
75 virtual void SetUp() OVERRIDE {
76 prefs_.registry()->RegisterListPref(prefs::kManagedBookmarks);
77 prefs_.registry()->RegisterListPref(prefs::kBookmarkEditorExpandedNodes);
78 }
79
80 virtual void TearDown() {
81 if (model_)
82 model_->RemoveObserver(&observer_);
83 }
84
85 void CreateModel() {
86 // Simulate the creation of the managed node by the BookmarkClient.
87 BookmarkPermanentNode* managed_node = new BookmarkPermanentNode(100);
88 policy::ManagedBookmarksTracker::LoadInitial(
89 managed_node, prefs_.GetList(prefs::kManagedBookmarks), 101);
90 managed_node->set_visible(!managed_node->empty());
91 managed_node->SetTitle(l10n_util::GetStringUTF16(
92 IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME));
93
94 bookmarks::BookmarkPermanentNodeList extra_nodes;
95 extra_nodes.push_back(managed_node);
96 client_.SetExtraNodesToLoad(extra_nodes.Pass());
97
98 model_.reset(new BookmarkModel(&client_, false));
99 model_->AddObserver(&observer_);
100 EXPECT_CALL(observer_, BookmarkModelLoaded(model_.get(), _));
101 model_->Load(&prefs_,
102 std::string(),
103 base::FilePath(),
104 base::MessageLoopProxy::current(),
105 base::MessageLoopProxy::current());
106 test::WaitForBookmarkModelToLoad(model_.get());
107 Mock::VerifyAndClearExpectations(&observer_);
108
109 ASSERT_EQ(1u, client_.extra_nodes().size());
110 managed_node_ = client_.extra_nodes()[0];
111 ASSERT_EQ(managed_node, managed_node_);
112
113 managed_bookmarks_tracker_.reset(new ManagedBookmarksTracker(
114 model_.get(),
115 &prefs_,
116 base::Bind(&ManagedBookmarksTrackerTest::GetManagementDomain)));
117 managed_bookmarks_tracker_->Init(managed_node_);
118 }
119
120 const BookmarkNode* managed_node() {
121 return managed_node_;
122 }
123
124 bool IsManaged(const BookmarkNode* node) {
125 while (node && node != managed_node_)
126 node = node->parent();
127 return node == managed_node_;
128 }
129
130 static base::DictionaryValue* CreateBookmark(const std::string& title,
131 const std::string& url) {
132 EXPECT_TRUE(GURL(url).is_valid());
133 base::DictionaryValue* dict = new base::DictionaryValue();
134 dict->SetString("name", title);
135 dict->SetString("url", GURL(url).spec());
136 return dict;
137 }
138
139 static base::DictionaryValue* CreateFolder(const std::string& title,
140 base::ListValue* children) {
141 base::DictionaryValue* dict = new base::DictionaryValue();
142 dict->SetString("name", title);
143 dict->Set("children", children);
144 return dict;
145 }
146
147 static base::ListValue* CreateTestTree() {
148 base::ListValue* folder = new base::ListValue();
149 base::ListValue* empty = new base::ListValue();
150 folder->Append(CreateFolder("Empty", empty));
151 folder->Append(CreateBookmark("Youtube", "http://youtube.com/"));
152
153 base::ListValue* list = new base::ListValue();
154 list->Append(CreateBookmark("Google", "http://google.com/"));
155 list->Append(CreateFolder("Folder", folder));
156
157 return list;
158 }
159
160 static std::string GetManagementDomain() {
161 return std::string();
162 }
163
164 static std::string GetManagedFolderTitle() {
165 return l10n_util::GetStringUTF8(
166 IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME);
167 }
168
169 static base::DictionaryValue* CreateExpectedTree() {
170 return CreateFolder(GetManagedFolderTitle(), CreateTestTree());
171 }
172
173 static bool NodeMatchesValue(const BookmarkNode* node,
174 const base::DictionaryValue* dict) {
175 base::string16 title;
176 if (!dict->GetString("name", &title) || node->GetTitle() != title)
177 return false;
178
179 if (node->is_folder()) {
180 const base::ListValue* children = NULL;
181 if (!dict->GetList("children", &children) ||
182 node->child_count() != static_cast<int>(children->GetSize())) {
183 return false;
184 }
185 for (int i = 0; i < node->child_count(); ++i) {
186 const base::DictionaryValue* child = NULL;
187 if (!children->GetDictionary(i, &child) ||
188 !NodeMatchesValue(node->GetChild(i), child)) {
189 return false;
190 }
191 }
192 } else if (node->is_url()) {
193 std::string url;
194 if (!dict->GetString("url", &url) || node->url() != GURL(url))
195 return false;
196 } else {
197 return false;
198 }
199 return true;
200 }
201
202 base::MessageLoop loop_;
203 TestingPrefServiceSimple prefs_;
204 test::TestBookmarkClient client_;
205 scoped_ptr<BookmarkModel> model_;
206 MockBookmarkModelObserver observer_;
207 BookmarkPermanentNode* managed_node_;
208 scoped_ptr<ManagedBookmarksTracker> managed_bookmarks_tracker_;
209 };
210
211 TEST_F(ManagedBookmarksTrackerTest, Empty) {
212 CreateModel();
213 EXPECT_TRUE(model_->bookmark_bar_node()->empty());
214 EXPECT_TRUE(model_->other_node()->empty());
215 EXPECT_TRUE(managed_node()->empty());
216 EXPECT_FALSE(managed_node()->IsVisible());
217 }
218
219 TEST_F(ManagedBookmarksTrackerTest, LoadInitial) {
220 // Set a policy before loading the model.
221 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
222 CreateModel();
223 EXPECT_TRUE(model_->bookmark_bar_node()->empty());
224 EXPECT_TRUE(model_->other_node()->empty());
225 EXPECT_FALSE(managed_node()->empty());
226 EXPECT_TRUE(managed_node()->IsVisible());
227
228 scoped_ptr<base::DictionaryValue> expected(CreateExpectedTree());
229 EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get()));
230 }
231
232 TEST_F(ManagedBookmarksTrackerTest, SwapNodes) {
233 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
234 CreateModel();
235
236 // Swap the Google bookmark with the Folder.
237 scoped_ptr<base::ListValue> updated(CreateTestTree());
238 scoped_ptr<base::Value> removed;
239 ASSERT_TRUE(updated->Remove(0, &removed));
240 updated->Append(removed.release());
241
242 // These two nodes should just be swapped.
243 const BookmarkNode* parent = managed_node();
244 EXPECT_CALL(observer_, BookmarkNodeMoved(model_.get(), parent, 1, parent, 0));
245 prefs_.SetManagedPref(prefs::kManagedBookmarks, updated->DeepCopy());
246 Mock::VerifyAndClearExpectations(&observer_);
247
248 // Verify the final tree.
249 scoped_ptr<base::DictionaryValue> expected(
250 CreateFolder(GetManagedFolderTitle(), updated.release()));
251 EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get()));
252 }
253
254 TEST_F(ManagedBookmarksTrackerTest, RemoveNode) {
255 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
256 CreateModel();
257
258 // Remove the Folder.
259 scoped_ptr<base::ListValue> updated(CreateTestTree());
260 ASSERT_TRUE(updated->Remove(1, NULL));
261
262 const BookmarkNode* parent = managed_node();
263 EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 1, _, _));
264 prefs_.SetManagedPref(prefs::kManagedBookmarks, updated->DeepCopy());
265 Mock::VerifyAndClearExpectations(&observer_);
266
267 // Verify the final tree.
268 scoped_ptr<base::DictionaryValue> expected(
269 CreateFolder(GetManagedFolderTitle(), updated.release()));
270 EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get()));
271 }
272
273 TEST_F(ManagedBookmarksTrackerTest, CreateNewNodes) {
274 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
275 CreateModel();
276
277 // Put all the nodes inside another folder.
278 scoped_ptr<base::ListValue> updated(new base::ListValue);
279 updated->Append(CreateFolder("Container", CreateTestTree()));
280
281 EXPECT_CALL(observer_, BookmarkNodeAdded(model_.get(), _, _)).Times(5);
282 // The remaining nodes have been pushed to positions 1 and 2; they'll both be
283 // removed when at position 1.
284 const BookmarkNode* parent = managed_node();
285 EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 1, _, _))
286 .Times(2);
287 prefs_.SetManagedPref(prefs::kManagedBookmarks, updated->DeepCopy());
288 Mock::VerifyAndClearExpectations(&observer_);
289
290 // Verify the final tree.
291 scoped_ptr<base::DictionaryValue> expected(
292 CreateFolder(GetManagedFolderTitle(), updated.release()));
293 EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get()));
294 }
295
296 TEST_F(ManagedBookmarksTrackerTest, RemoveAll) {
297 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
298 CreateModel();
299 EXPECT_TRUE(managed_node()->IsVisible());
300
301 // Remove the policy.
302 const BookmarkNode* parent = managed_node();
303 EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 0, _, _))
304 .Times(2);
305 prefs_.RemoveManagedPref(prefs::kManagedBookmarks);
306 Mock::VerifyAndClearExpectations(&observer_);
307
308 EXPECT_TRUE(managed_node()->empty());
309 EXPECT_FALSE(managed_node()->IsVisible());
310 }
311
312 TEST_F(ManagedBookmarksTrackerTest, IsManaged) {
313 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
314 CreateModel();
315
316 EXPECT_FALSE(IsManaged(model_->root_node()));
317 EXPECT_FALSE(IsManaged(model_->bookmark_bar_node()));
318 EXPECT_FALSE(IsManaged(model_->other_node()));
319 EXPECT_FALSE(IsManaged(model_->mobile_node()));
320 EXPECT_TRUE(IsManaged(managed_node()));
321
322 const BookmarkNode* parent = managed_node();
323 ASSERT_EQ(2, parent->child_count());
324 EXPECT_TRUE(IsManaged(parent->GetChild(0)));
325 EXPECT_TRUE(IsManaged(parent->GetChild(1)));
326
327 parent = parent->GetChild(1);
328 ASSERT_EQ(2, parent->child_count());
329 EXPECT_TRUE(IsManaged(parent->GetChild(0)));
330 EXPECT_TRUE(IsManaged(parent->GetChild(1)));
331 }
332
333 TEST_F(ManagedBookmarksTrackerTest, RemoveAllDoesntRemoveManaged) {
334 prefs_.SetManagedPref(prefs::kManagedBookmarks, CreateTestTree());
335 CreateModel();
336 EXPECT_EQ(2, managed_node()->child_count());
337
338 EXPECT_CALL(observer_,
339 BookmarkNodeAdded(model_.get(), model_->bookmark_bar_node(), 0));
340 EXPECT_CALL(observer_,
341 BookmarkNodeAdded(model_.get(), model_->bookmark_bar_node(), 1));
342 model_->AddURL(model_->bookmark_bar_node(),
343 0,
344 base::ASCIIToUTF16("Test"),
345 GURL("http://google.com/"));
346 model_->AddFolder(
347 model_->bookmark_bar_node(), 1, base::ASCIIToUTF16("Test Folder"));
348 EXPECT_EQ(2, model_->bookmark_bar_node()->child_count());
349 Mock::VerifyAndClearExpectations(&observer_);
350
351 EXPECT_CALL(observer_, BookmarkAllNodesRemoved(model_.get(), _));
352 model_->RemoveAll();
353 EXPECT_EQ(2, managed_node()->child_count());
354 EXPECT_EQ(0, model_->bookmark_bar_node()->child_count());
355 Mock::VerifyAndClearExpectations(&observer_);
356 }
357
358 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698