1 // Copyright 2013 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.
5 #include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/string16.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
11 #include "chrome/test/base/testing_profile.h"
12 #include "components/bookmarks/browser/bookmark_model.h"
13 #include "components/bookmarks/test/bookmark_test_helpers.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/test/test_browser_thread.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
22 class MockObserver
: public PartnerBookmarksShim::Observer
{
25 MOCK_METHOD1(PartnerShimChanged
, void(PartnerBookmarksShim
*));
26 MOCK_METHOD1(PartnerShimLoaded
, void(PartnerBookmarksShim
*));
29 DISALLOW_COPY_AND_ASSIGN(MockObserver
);
32 class PartnerBookmarksShimTest
: public testing::Test
{
34 PartnerBookmarksShimTest()
35 : ui_thread_(content::BrowserThread::UI
, &message_loop_
),
36 file_thread_(content::BrowserThread::FILE, &message_loop_
),
40 TestingProfile
* profile() const { return profile_
.get(); }
41 PartnerBookmarksShim
* partner_bookmarks_shim() const {
42 return PartnerBookmarksShim::BuildForBrowserContext(profile_
.get());
45 const BookmarkNode
* AddBookmark(const BookmarkNode
* parent
,
47 const base::string16
& title
) {
49 parent
= model_
->bookmark_bar_node();
50 return model_
->AddURL(parent
, parent
->child_count(), title
, url
);
53 const BookmarkNode
* AddFolder(const BookmarkNode
* parent
,
54 const base::string16
& title
) {
56 parent
= model_
->bookmark_bar_node();
57 return model_
->AddFolder(parent
, parent
->child_count(), title
);
62 virtual void SetUp() OVERRIDE
{
63 profile_
.reset(new TestingProfile());
64 profile_
->CreateBookmarkModel(true);
66 model_
= BookmarkModelFactory::GetForProfile(profile_
.get());
67 test::WaitForBookmarkModelToLoad(model_
);
70 virtual void TearDown() OVERRIDE
{
71 PartnerBookmarksShim::ClearInBrowserContextForTesting(profile_
.get());
72 PartnerBookmarksShim::ClearPartnerModelForTesting();
73 PartnerBookmarksShim::EnablePartnerBookmarksEditing();
77 scoped_ptr
<TestingProfile
> profile_
;
79 base::MessageLoopForUI message_loop_
;
80 content::TestBrowserThread ui_thread_
;
81 content::TestBrowserThread file_thread_
;
83 BookmarkModel
* model_
;
84 MockObserver observer_
;
86 DISALLOW_COPY_AND_ASSIGN(PartnerBookmarksShimTest
);
89 TEST_F(PartnerBookmarksShimTest
, GetNodeByID
) {
90 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(0);
91 BookmarkNode
* partner_folder1
= new BookmarkNode(1, GURL());
92 partner_folder1
->set_type(BookmarkNode::FOLDER
);
93 root_partner_node
->Add(partner_folder1
, root_partner_node
->child_count());
95 BookmarkNode
* partner_folder2
= new BookmarkNode(2, GURL());
96 partner_folder2
->set_type(BookmarkNode::FOLDER
);
97 partner_folder1
->Add(partner_folder2
, partner_folder1
->child_count());
99 BookmarkNode
* partner_bookmark1
= new BookmarkNode(3,
100 GURL("http://www.a.com"));
101 partner_bookmark1
->set_type(BookmarkNode::URL
);
102 partner_folder1
->Add(partner_bookmark1
, partner_folder1
->child_count());
104 BookmarkNode
* partner_bookmark2
= new BookmarkNode(4,
105 GURL("http://www.b.com"));
106 partner_bookmark2
->set_type(BookmarkNode::URL
);
107 partner_folder2
->Add(partner_bookmark2
, partner_folder2
->child_count());
109 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
110 ASSERT_FALSE(shim
->IsLoaded());
111 shim
->SetPartnerBookmarksRoot(root_partner_node
);
112 ASSERT_TRUE(shim
->IsLoaded());
114 ASSERT_TRUE(shim
->IsPartnerBookmark(root_partner_node
));
115 ASSERT_EQ(shim
->GetNodeByID(0), root_partner_node
);
116 ASSERT_EQ(shim
->GetNodeByID(1), partner_folder1
);
117 ASSERT_EQ(shim
->GetNodeByID(4), partner_bookmark2
);
120 TEST_F(PartnerBookmarksShimTest
, ObserverNotifiedOfLoadNoPartnerBookmarks
) {
121 EXPECT_CALL(observer_
, PartnerShimLoaded(_
)).Times(0);
122 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
123 shim
->AddObserver(&observer_
);
125 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
126 shim
->SetPartnerBookmarksRoot(NULL
);
129 TEST_F(PartnerBookmarksShimTest
, ObserverNotifiedOfLoadWithPartnerBookmarks
) {
130 EXPECT_CALL(observer_
, PartnerShimLoaded(_
)).Times(0);
132 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(id
++);
133 BookmarkNode
* partner_bookmark1
= new BookmarkNode(id
++,
134 GURL("http://www.a.com"));
135 partner_bookmark1
->set_type(BookmarkNode::URL
);
136 root_partner_node
->Add(partner_bookmark1
, root_partner_node
->child_count());
138 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
139 shim
->AddObserver(&observer_
);
141 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
142 shim
->SetPartnerBookmarksRoot(root_partner_node
);
145 TEST_F(PartnerBookmarksShimTest
, RemoveBookmarks
) {
146 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
147 shim
->AddObserver(&observer_
);
149 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(0);
150 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(0);
152 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(0);
153 root_partner_node
->SetTitle(base::ASCIIToUTF16("Partner bookmarks"));
155 BookmarkNode
* partner_folder1
= new BookmarkNode(1, GURL("http://www.a.net"));
156 partner_folder1
->set_type(BookmarkNode::FOLDER
);
157 root_partner_node
->Add(partner_folder1
, root_partner_node
->child_count());
159 BookmarkNode
* partner_folder2
= new BookmarkNode(2, GURL("http://www.b.net"));
160 partner_folder2
->set_type(BookmarkNode::FOLDER
);
161 root_partner_node
->Add(partner_folder2
, root_partner_node
->child_count());
163 BookmarkNode
* partner_bookmark1
= new BookmarkNode(3,
164 GURL("http://www.a.com"));
165 partner_bookmark1
->set_type(BookmarkNode::URL
);
166 partner_folder1
->Add(partner_bookmark1
, partner_folder1
->child_count());
168 BookmarkNode
* partner_bookmark2
= new BookmarkNode(4,
169 GURL("http://www.b.com"));
170 partner_bookmark2
->set_type(BookmarkNode::URL
);
171 partner_folder2
->Add(partner_bookmark2
, partner_folder2
->child_count());
173 BookmarkNode
* partner_folder3
= new BookmarkNode(5, GURL("http://www.c.net"));
174 partner_folder3
->set_type(BookmarkNode::FOLDER
);
175 partner_folder2
->Add(partner_folder3
, partner_folder2
->child_count());
177 BookmarkNode
* partner_bookmark3
= new BookmarkNode(6,
178 GURL("http://www.c.com"));
179 partner_bookmark3
->set_type(BookmarkNode::URL
);
180 partner_folder3
->Add(partner_bookmark3
, partner_folder3
->child_count());
182 ASSERT_FALSE(shim
->IsLoaded());
183 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
184 shim
->SetPartnerBookmarksRoot(root_partner_node
);
185 ASSERT_TRUE(shim
->IsLoaded());
187 EXPECT_EQ(root_partner_node
, shim
->GetNodeByID(0));
188 EXPECT_EQ(partner_folder1
, shim
->GetNodeByID(1));
189 EXPECT_EQ(partner_folder2
, shim
->GetNodeByID(2));
190 EXPECT_EQ(partner_bookmark1
, shim
->GetNodeByID(3));
191 EXPECT_EQ(partner_bookmark2
, shim
->GetNodeByID(4));
192 EXPECT_EQ(partner_folder3
, shim
->GetNodeByID(5));
193 EXPECT_EQ(partner_bookmark3
, shim
->GetNodeByID(6));
195 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
196 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
197 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
198 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
199 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));
200 EXPECT_TRUE(shim
->IsReachable(partner_folder3
));
201 EXPECT_TRUE(shim
->IsReachable(partner_bookmark3
));
203 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
204 shim
->RemoveBookmark(partner_bookmark2
);
205 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
206 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
207 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
208 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
209 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
210 EXPECT_TRUE(shim
->IsReachable(partner_folder3
));
211 EXPECT_TRUE(shim
->IsReachable(partner_bookmark3
));
213 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
214 shim
->RemoveBookmark(partner_folder1
);
215 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
216 EXPECT_FALSE(shim
->IsReachable(partner_folder1
));
217 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
218 EXPECT_FALSE(shim
->IsReachable(partner_bookmark1
));
219 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
220 EXPECT_TRUE(shim
->IsReachable(partner_folder3
));
221 EXPECT_TRUE(shim
->IsReachable(partner_bookmark3
));
223 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
224 shim
->RemoveBookmark(root_partner_node
);
225 EXPECT_FALSE(shim
->IsReachable(root_partner_node
));
226 EXPECT_FALSE(shim
->IsReachable(partner_folder1
));
227 EXPECT_FALSE(shim
->IsReachable(partner_folder2
));
228 EXPECT_FALSE(shim
->IsReachable(partner_bookmark1
));
229 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
230 EXPECT_FALSE(shim
->IsReachable(partner_folder3
));
231 EXPECT_FALSE(shim
->IsReachable(partner_bookmark3
));
234 TEST_F(PartnerBookmarksShimTest
, RenameBookmarks
) {
235 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
236 shim
->AddObserver(&observer_
);
238 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(0);
239 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(0);
241 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(0);
242 root_partner_node
->SetTitle(base::ASCIIToUTF16("Partner bookmarks"));
244 BookmarkNode
* partner_folder1
= new BookmarkNode(1, GURL("http://www.a.net"));
245 partner_folder1
->set_type(BookmarkNode::FOLDER
);
246 partner_folder1
->SetTitle(base::ASCIIToUTF16("a.net"));
247 root_partner_node
->Add(partner_folder1
, root_partner_node
->child_count());
249 BookmarkNode
* partner_folder2
= new BookmarkNode(2, GURL("http://www.b.net"));
250 partner_folder2
->set_type(BookmarkNode::FOLDER
);
251 partner_folder2
->SetTitle(base::ASCIIToUTF16("b.net"));
252 root_partner_node
->Add(partner_folder2
, root_partner_node
->child_count());
254 BookmarkNode
* partner_bookmark1
= new BookmarkNode(3,
255 GURL("http://www.a.com"));
256 partner_bookmark1
->set_type(BookmarkNode::URL
);
257 partner_bookmark1
->SetTitle(base::ASCIIToUTF16("a.com"));
258 partner_folder1
->Add(partner_bookmark1
, partner_folder1
->child_count());
260 BookmarkNode
* partner_bookmark2
= new BookmarkNode(4,
261 GURL("http://www.b.com"));
262 partner_bookmark2
->set_type(BookmarkNode::URL
);
263 partner_bookmark2
->SetTitle(base::ASCIIToUTF16("b.com"));
264 partner_folder2
->Add(partner_bookmark2
, partner_folder2
->child_count());
266 ASSERT_FALSE(shim
->IsLoaded());
267 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
268 shim
->SetPartnerBookmarksRoot(root_partner_node
);
269 ASSERT_TRUE(shim
->IsLoaded());
271 EXPECT_EQ(root_partner_node
, shim
->GetNodeByID(0));
272 EXPECT_EQ(partner_folder1
, shim
->GetNodeByID(1));
273 EXPECT_EQ(partner_folder2
, shim
->GetNodeByID(2));
274 EXPECT_EQ(partner_bookmark1
, shim
->GetNodeByID(3));
275 EXPECT_EQ(partner_bookmark2
, shim
->GetNodeByID(4));
277 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
278 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
279 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
280 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
281 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));
283 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
284 EXPECT_EQ(base::ASCIIToUTF16("b.com"), shim
->GetTitle(partner_bookmark2
));
285 shim
->RenameBookmark(partner_bookmark2
, base::ASCIIToUTF16("b2.com"));
286 EXPECT_EQ(base::ASCIIToUTF16("b2.com"), shim
->GetTitle(partner_bookmark2
));
288 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
289 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
290 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
291 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
292 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));
294 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
295 EXPECT_EQ(base::ASCIIToUTF16("a.net"), shim
->GetTitle(partner_folder1
));
296 shim
->RenameBookmark(partner_folder1
, base::ASCIIToUTF16("a2.net"));
297 EXPECT_EQ(base::ASCIIToUTF16("a2.net"), shim
->GetTitle(partner_folder1
));
299 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
300 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
301 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
302 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
303 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));
305 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(1);
306 EXPECT_EQ(base::ASCIIToUTF16("Partner bookmarks"),
307 shim
->GetTitle(root_partner_node
));
308 shim
->RenameBookmark(root_partner_node
, base::ASCIIToUTF16("Partner"));
309 EXPECT_EQ(base::ASCIIToUTF16("Partner"), shim
->GetTitle(root_partner_node
));
311 EXPECT_TRUE(shim
->IsReachable(root_partner_node
));
312 EXPECT_TRUE(shim
->IsReachable(partner_folder1
));
313 EXPECT_TRUE(shim
->IsReachable(partner_folder2
));
314 EXPECT_TRUE(shim
->IsReachable(partner_bookmark1
));
315 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));
318 TEST_F(PartnerBookmarksShimTest
, SaveLoadProfile
) {
320 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
321 shim
->AddObserver(&observer_
);
323 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(0);
324 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(0);
326 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(0);
327 root_partner_node
->SetTitle(base::ASCIIToUTF16("Partner bookmarks"));
329 BookmarkNode
* partner_folder1
= new BookmarkNode(1, GURL("http://a.net"));
330 partner_folder1
->set_type(BookmarkNode::FOLDER
);
331 partner_folder1
->SetTitle(base::ASCIIToUTF16("a.net"));
332 root_partner_node
->Add(partner_folder1
, root_partner_node
->child_count());
334 BookmarkNode
* partner_bookmark1
= new BookmarkNode(3,
335 GURL("http://a.com"));
336 partner_bookmark1
->set_type(BookmarkNode::URL
);
337 partner_bookmark1
->SetTitle(base::ASCIIToUTF16("a.com"));
338 partner_folder1
->Add(partner_bookmark1
, partner_folder1
->child_count());
340 BookmarkNode
* partner_bookmark2
= new BookmarkNode(5,
341 GURL("http://b.com"));
342 partner_bookmark2
->set_type(BookmarkNode::URL
);
343 partner_bookmark2
->SetTitle(base::ASCIIToUTF16("b.com"));
344 partner_folder1
->Add(partner_bookmark2
, partner_folder1
->child_count());
346 ASSERT_FALSE(shim
->IsLoaded());
347 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
348 shim
->SetPartnerBookmarksRoot(root_partner_node
);
349 ASSERT_TRUE(shim
->IsLoaded());
351 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(2);
352 shim
->RenameBookmark(partner_bookmark1
, base::ASCIIToUTF16("a2.com"));
353 shim
->RemoveBookmark(partner_bookmark2
);
354 EXPECT_EQ(base::ASCIIToUTF16("a2.com"), shim
->GetTitle(partner_bookmark1
));
355 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
358 PartnerBookmarksShim::ClearInBrowserContextForTesting(profile_
.get());
361 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
362 shim
->AddObserver(&observer_
);
364 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(0);
365 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(0);
366 ASSERT_TRUE(shim
->IsLoaded());
368 const BookmarkNode
* partner_bookmark1
= shim
->GetNodeByID(3);
369 const BookmarkNode
* partner_bookmark2
= shim
->GetNodeByID(5);
371 EXPECT_EQ(base::ASCIIToUTF16("a2.com"), shim
->GetTitle(partner_bookmark1
));
372 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
376 TEST_F(PartnerBookmarksShimTest
, DisableEditing
) {
377 PartnerBookmarksShim
* shim
= partner_bookmarks_shim();
378 shim
->AddObserver(&observer_
);
380 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(0);
381 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(0);
383 BookmarkNode
* root_partner_node
= new BookmarkPermanentNode(0);
384 root_partner_node
->SetTitle(base::ASCIIToUTF16("Partner bookmarks"));
386 BookmarkNode
* partner_bookmark1
= new BookmarkNode(3, GURL("http://a"));
387 partner_bookmark1
->set_type(BookmarkNode::URL
);
388 partner_bookmark1
->SetTitle(base::ASCIIToUTF16("a"));
389 root_partner_node
->Add(partner_bookmark1
, root_partner_node
->child_count());
391 BookmarkNode
* partner_bookmark2
= new BookmarkNode(3, GURL("http://b"));
392 partner_bookmark2
->set_type(BookmarkNode::URL
);
393 partner_bookmark2
->SetTitle(base::ASCIIToUTF16("b"));
394 root_partner_node
->Add(partner_bookmark2
, root_partner_node
->child_count());
396 ASSERT_FALSE(shim
->IsLoaded());
397 EXPECT_CALL(observer_
, PartnerShimLoaded(shim
)).Times(1);
398 shim
->SetPartnerBookmarksRoot(root_partner_node
);
399 ASSERT_TRUE(shim
->IsLoaded());
401 // Check that edits work by default.
402 EXPECT_CALL(observer_
, PartnerShimChanged(shim
)).Times(2);
403 shim
->RenameBookmark(partner_bookmark1
, base::ASCIIToUTF16("a2.com"));
404 shim
->RemoveBookmark(partner_bookmark2
);
405 EXPECT_EQ(base::ASCIIToUTF16("a2.com"), shim
->GetTitle(partner_bookmark1
));
406 EXPECT_FALSE(shim
->IsReachable(partner_bookmark2
));
408 // Disable edits and check that edits are not applied anymore.
409 PartnerBookmarksShim::DisablePartnerBookmarksEditing();
410 EXPECT_EQ(base::ASCIIToUTF16("a"), shim
->GetTitle(partner_bookmark1
));
411 EXPECT_TRUE(shim
->IsReachable(partner_bookmark2
));