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.
5 #include "chrome/browser/ui/webui/ntp/android/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.h"
11 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
12 #include "chrome/browser/bookmarks/bookmark_test_helpers.h"
13 #include "chrome/test/base/testing_profile.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 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 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();
76 scoped_ptr<TestingProfile> profile_;
78 base::MessageLoopForUI message_loop_;
79 content::TestBrowserThread ui_thread_;
80 content::TestBrowserThread file_thread_;
82 BookmarkModel* model_;
83 MockObserver observer_;
85 DISALLOW_COPY_AND_ASSIGN(PartnerBookmarksShimTest);
88 TEST_F(PartnerBookmarksShimTest, GetNodeByID) {
89 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0);
90 BookmarkNode* partner_folder1 = new BookmarkNode(1, GURL());
91 partner_folder1->set_type(BookmarkNode::FOLDER);
92 root_partner_node->Add(partner_folder1, root_partner_node->child_count());
94 BookmarkNode* partner_folder2 = new BookmarkNode(2, GURL());
95 partner_folder2->set_type(BookmarkNode::FOLDER);
96 partner_folder1->Add(partner_folder2, partner_folder1->child_count());
98 BookmarkNode* partner_bookmark1 = new BookmarkNode(3,
99 GURL("http://www.a.com"));
100 partner_bookmark1->set_type(BookmarkNode::URL);
101 partner_folder1->Add(partner_bookmark1, partner_folder1->child_count());
103 BookmarkNode* partner_bookmark2 = new BookmarkNode(4,
104 GURL("http://www.b.com"));
105 partner_bookmark2->set_type(BookmarkNode::URL);
106 partner_folder2->Add(partner_bookmark2, partner_folder2->child_count());
108 PartnerBookmarksShim* shim = partner_bookmarks_shim();
109 ASSERT_FALSE(shim->IsLoaded());
110 shim->SetPartnerBookmarksRoot(root_partner_node);
111 ASSERT_TRUE(shim->IsLoaded());
113 ASSERT_TRUE(shim->IsPartnerBookmark(root_partner_node));
114 ASSERT_EQ(shim->GetNodeByID(0), root_partner_node);
115 ASSERT_EQ(shim->GetNodeByID(1), partner_folder1);
116 ASSERT_EQ(shim->GetNodeByID(4), partner_bookmark2);
119 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadNoPartnerBookmarks) {
120 EXPECT_CALL(observer_, PartnerShimLoaded(_)).Times(0);
121 PartnerBookmarksShim* shim = partner_bookmarks_shim();
122 shim->AddObserver(&observer_);
124 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1);
125 shim->SetPartnerBookmarksRoot(NULL);
128 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadWithPartnerBookmarks) {
129 EXPECT_CALL(observer_, PartnerShimLoaded(_)).Times(0);
131 BookmarkNode* root_partner_node = new BookmarkPermanentNode(id++);
132 BookmarkNode* partner_bookmark1 = new BookmarkNode(id++,
133 GURL("http://www.a.com"));
134 partner_bookmark1->set_type(BookmarkNode::URL);
135 root_partner_node->Add(partner_bookmark1, root_partner_node->child_count());
137 PartnerBookmarksShim* shim = partner_bookmarks_shim();
138 shim->AddObserver(&observer_);
140 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1);
141 shim->SetPartnerBookmarksRoot(root_partner_node);
144 TEST_F(PartnerBookmarksShimTest, RemoveBookmarks) {
145 PartnerBookmarksShim* shim = partner_bookmarks_shim();
146 shim->AddObserver(&observer_);
148 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0);
149 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0);
151 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0);
152 root_partner_node->SetTitle(ASCIIToUTF16("Partner bookmarks"));
154 BookmarkNode* partner_folder1 = new BookmarkNode(1, GURL("http://www.a.net"));
155 partner_folder1->set_type(BookmarkNode::FOLDER);
156 root_partner_node->Add(partner_folder1, root_partner_node->child_count());
158 BookmarkNode* partner_folder2 = new BookmarkNode(2, GURL("http://www.b.net"));
159 partner_folder2->set_type(BookmarkNode::FOLDER);
160 root_partner_node->Add(partner_folder2, root_partner_node->child_count());
162 BookmarkNode* partner_bookmark1 = new BookmarkNode(3,
163 GURL("http://www.a.com"));
164 partner_bookmark1->set_type(BookmarkNode::URL);
165 partner_folder1->Add(partner_bookmark1, partner_folder1->child_count());
167 BookmarkNode* partner_bookmark2 = new BookmarkNode(4,
168 GURL("http://www.b.com"));
169 partner_bookmark2->set_type(BookmarkNode::URL);
170 partner_folder2->Add(partner_bookmark2, partner_folder2->child_count());
172 BookmarkNode* partner_folder3 = new BookmarkNode(5, GURL("http://www.c.net"));
173 partner_folder3->set_type(BookmarkNode::FOLDER);
174 partner_folder2->Add(partner_folder3, partner_folder2->child_count());
176 BookmarkNode* partner_bookmark3 = new BookmarkNode(6,
177 GURL("http://www.c.com"));
178 partner_bookmark3->set_type(BookmarkNode::URL);
179 partner_folder3->Add(partner_bookmark3, partner_folder3->child_count());
181 ASSERT_FALSE(shim->IsLoaded());
182 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1);
183 shim->SetPartnerBookmarksRoot(root_partner_node);
184 ASSERT_TRUE(shim->IsLoaded());
186 EXPECT_EQ(root_partner_node, shim->GetNodeByID(0));
187 EXPECT_EQ(partner_folder1, shim->GetNodeByID(1));
188 EXPECT_EQ(partner_folder2, shim->GetNodeByID(2));
189 EXPECT_EQ(partner_bookmark1, shim->GetNodeByID(3));
190 EXPECT_EQ(partner_bookmark2, shim->GetNodeByID(4));
191 EXPECT_EQ(partner_folder3, shim->GetNodeByID(5));
192 EXPECT_EQ(partner_bookmark3, shim->GetNodeByID(6));
194 EXPECT_TRUE(shim->IsReachable(root_partner_node));
195 EXPECT_TRUE(shim->IsReachable(partner_folder1));
196 EXPECT_TRUE(shim->IsReachable(partner_folder2));
197 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
198 EXPECT_TRUE(shim->IsReachable(partner_bookmark2));
199 EXPECT_TRUE(shim->IsReachable(partner_folder3));
200 EXPECT_TRUE(shim->IsReachable(partner_bookmark3));
202 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
203 shim->RemoveBookmark(partner_bookmark2);
204 EXPECT_TRUE(shim->IsReachable(root_partner_node));
205 EXPECT_TRUE(shim->IsReachable(partner_folder1));
206 EXPECT_TRUE(shim->IsReachable(partner_folder2));
207 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
208 EXPECT_FALSE(shim->IsReachable(partner_bookmark2));
209 EXPECT_TRUE(shim->IsReachable(partner_folder3));
210 EXPECT_TRUE(shim->IsReachable(partner_bookmark3));
212 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
213 shim->RemoveBookmark(partner_folder1);
214 EXPECT_TRUE(shim->IsReachable(root_partner_node));
215 EXPECT_FALSE(shim->IsReachable(partner_folder1));
216 EXPECT_TRUE(shim->IsReachable(partner_folder2));
217 EXPECT_FALSE(shim->IsReachable(partner_bookmark1));
218 EXPECT_FALSE(shim->IsReachable(partner_bookmark2));
219 EXPECT_TRUE(shim->IsReachable(partner_folder3));
220 EXPECT_TRUE(shim->IsReachable(partner_bookmark3));
222 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
223 shim->RemoveBookmark(root_partner_node);
224 EXPECT_FALSE(shim->IsReachable(root_partner_node));
225 EXPECT_FALSE(shim->IsReachable(partner_folder1));
226 EXPECT_FALSE(shim->IsReachable(partner_folder2));
227 EXPECT_FALSE(shim->IsReachable(partner_bookmark1));
228 EXPECT_FALSE(shim->IsReachable(partner_bookmark2));
229 EXPECT_FALSE(shim->IsReachable(partner_folder3));
230 EXPECT_FALSE(shim->IsReachable(partner_bookmark3));
233 TEST_F(PartnerBookmarksShimTest, RenameBookmarks) {
234 PartnerBookmarksShim* shim = partner_bookmarks_shim();
235 shim->AddObserver(&observer_);
237 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0);
238 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0);
240 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0);
241 root_partner_node->SetTitle(ASCIIToUTF16("Partner bookmarks"));
243 BookmarkNode* partner_folder1 = new BookmarkNode(1, GURL("http://www.a.net"));
244 partner_folder1->set_type(BookmarkNode::FOLDER);
245 partner_folder1->SetTitle(ASCIIToUTF16("a.net"));
246 root_partner_node->Add(partner_folder1, root_partner_node->child_count());
248 BookmarkNode* partner_folder2 = new BookmarkNode(2, GURL("http://www.b.net"));
249 partner_folder2->set_type(BookmarkNode::FOLDER);
250 partner_folder2->SetTitle(ASCIIToUTF16("b.net"));
251 root_partner_node->Add(partner_folder2, root_partner_node->child_count());
253 BookmarkNode* partner_bookmark1 = new BookmarkNode(3,
254 GURL("http://www.a.com"));
255 partner_bookmark1->set_type(BookmarkNode::URL);
256 partner_bookmark1->SetTitle(ASCIIToUTF16("a.com"));
257 partner_folder1->Add(partner_bookmark1, partner_folder1->child_count());
259 BookmarkNode* partner_bookmark2 = new BookmarkNode(4,
260 GURL("http://www.b.com"));
261 partner_bookmark2->set_type(BookmarkNode::URL);
262 partner_bookmark2->SetTitle(ASCIIToUTF16("b.com"));
263 partner_folder2->Add(partner_bookmark2, partner_folder2->child_count());
265 ASSERT_FALSE(shim->IsLoaded());
266 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1);
267 shim->SetPartnerBookmarksRoot(root_partner_node);
268 ASSERT_TRUE(shim->IsLoaded());
270 EXPECT_EQ(root_partner_node, shim->GetNodeByID(0));
271 EXPECT_EQ(partner_folder1, shim->GetNodeByID(1));
272 EXPECT_EQ(partner_folder2, shim->GetNodeByID(2));
273 EXPECT_EQ(partner_bookmark1, shim->GetNodeByID(3));
274 EXPECT_EQ(partner_bookmark2, shim->GetNodeByID(4));
276 EXPECT_TRUE(shim->IsReachable(root_partner_node));
277 EXPECT_TRUE(shim->IsReachable(partner_folder1));
278 EXPECT_TRUE(shim->IsReachable(partner_folder2));
279 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
280 EXPECT_TRUE(shim->IsReachable(partner_bookmark2));
282 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
283 EXPECT_EQ(ASCIIToUTF16("b.com"), shim->GetTitle(partner_bookmark2));
284 shim->RenameBookmark(partner_bookmark2, ASCIIToUTF16("b2.com"));
285 EXPECT_EQ(ASCIIToUTF16("b2.com"), shim->GetTitle(partner_bookmark2));
287 EXPECT_TRUE(shim->IsReachable(root_partner_node));
288 EXPECT_TRUE(shim->IsReachable(partner_folder1));
289 EXPECT_TRUE(shim->IsReachable(partner_folder2));
290 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
291 EXPECT_TRUE(shim->IsReachable(partner_bookmark2));
293 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
294 EXPECT_EQ(ASCIIToUTF16("a.net"), shim->GetTitle(partner_folder1));
295 shim->RenameBookmark(partner_folder1, ASCIIToUTF16("a2.net"));
296 EXPECT_EQ(ASCIIToUTF16("a2.net"), shim->GetTitle(partner_folder1));
298 EXPECT_TRUE(shim->IsReachable(root_partner_node));
299 EXPECT_TRUE(shim->IsReachable(partner_folder1));
300 EXPECT_TRUE(shim->IsReachable(partner_folder2));
301 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
302 EXPECT_TRUE(shim->IsReachable(partner_bookmark2));
304 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(1);
305 EXPECT_EQ(ASCIIToUTF16("Partner bookmarks"),
306 shim->GetTitle(root_partner_node));
307 shim->RenameBookmark(root_partner_node, ASCIIToUTF16("Partner"));
308 EXPECT_EQ(ASCIIToUTF16("Partner"), shim->GetTitle(root_partner_node));
310 EXPECT_TRUE(shim->IsReachable(root_partner_node));
311 EXPECT_TRUE(shim->IsReachable(partner_folder1));
312 EXPECT_TRUE(shim->IsReachable(partner_folder2));
313 EXPECT_TRUE(shim->IsReachable(partner_bookmark1));
314 EXPECT_TRUE(shim->IsReachable(partner_bookmark2));
317 TEST_F(PartnerBookmarksShimTest, SaveLoadProfile) {
319 PartnerBookmarksShim* shim = partner_bookmarks_shim();
320 shim->AddObserver(&observer_);
322 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0);
323 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0);
325 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0);
326 root_partner_node->SetTitle(ASCIIToUTF16("Partner bookmarks"));
328 BookmarkNode* partner_folder1 = new BookmarkNode(1, GURL("http://a.net"));
329 partner_folder1->set_type(BookmarkNode::FOLDER);
330 partner_folder1->SetTitle(ASCIIToUTF16("a.net"));
331 root_partner_node->Add(partner_folder1, root_partner_node->child_count());
333 BookmarkNode* partner_bookmark1 = new BookmarkNode(3,
334 GURL("http://a.com"));
335 partner_bookmark1->set_type(BookmarkNode::URL);
336 partner_bookmark1->SetTitle(ASCIIToUTF16("a.com"));
337 partner_folder1->Add(partner_bookmark1, partner_folder1->child_count());
339 BookmarkNode* partner_bookmark2 = new BookmarkNode(5,
340 GURL("http://b.com"));
341 partner_bookmark2->set_type(BookmarkNode::URL);
342 partner_bookmark2->SetTitle(ASCIIToUTF16("b.com"));
343 partner_folder1->Add(partner_bookmark2, partner_folder1->child_count());
345 ASSERT_FALSE(shim->IsLoaded());
346 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1);
347 shim->SetPartnerBookmarksRoot(root_partner_node);
348 ASSERT_TRUE(shim->IsLoaded());
350 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(2);
351 shim->RenameBookmark(partner_bookmark1, ASCIIToUTF16("a2.com"));
352 shim->RemoveBookmark(partner_bookmark2);
353 EXPECT_EQ(ASCIIToUTF16("a2.com"), shim->GetTitle(partner_bookmark1));
354 EXPECT_FALSE(shim->IsReachable(partner_bookmark2));
357 PartnerBookmarksShim::ClearInBrowserContextForTesting(profile_.get());
360 PartnerBookmarksShim* shim = partner_bookmarks_shim();
361 shim->AddObserver(&observer_);
363 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0);
364 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0);
365 ASSERT_TRUE(shim->IsLoaded());
367 const BookmarkNode* partner_bookmark1 = shim->GetNodeByID(3);
368 const BookmarkNode* partner_bookmark2 = shim->GetNodeByID(5);
370 EXPECT_EQ(ASCIIToUTF16("a2.com"), shim->GetTitle(partner_bookmark1));
371 EXPECT_FALSE(shim->IsReachable(partner_bookmark2));