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. 4 5 #include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h" 6 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" 18 #include "url/gurl.h" 19 20 using testing::_; 21 22 class MockObserver : public PartnerBookmarksShim::Observer { 23 public: 24 MockObserver() {} 25 MOCK_METHOD1(PartnerShimChanged, void(PartnerBookmarksShim*)); 26 MOCK_METHOD1(PartnerShimLoaded, void(PartnerBookmarksShim*)); 27 28 private: 29 DISALLOW_COPY_AND_ASSIGN(MockObserver); 30 }; 31 32 class PartnerBookmarksShimTest : public testing::Test { 33 public: 34 PartnerBookmarksShimTest() 35 : ui_thread_(content::BrowserThread::UI, &message_loop_), 36 file_thread_(content::BrowserThread::FILE, &message_loop_), 37 model_(NULL) { 38 } 39 40 TestingProfile* profile() const { return profile_.get(); } 41 PartnerBookmarksShim* partner_bookmarks_shim() const { 42 return PartnerBookmarksShim::BuildForBrowserContext(profile_.get()); 43 } 44 45 const BookmarkNode* AddBookmark(const BookmarkNode* parent, 46 const GURL& url, 47 const base::string16& title) { 48 if (!parent) 49 parent = model_->bookmark_bar_node(); 50 return model_->AddURL(parent, parent->child_count(), title, url); 51 } 52 53 const BookmarkNode* AddFolder(const BookmarkNode* parent, 54 const base::string16& title) { 55 if (!parent) 56 parent = model_->bookmark_bar_node(); 57 return model_->AddFolder(parent, parent->child_count(), title); 58 } 59 60 protected: 61 // testing::Test 62 virtual void SetUp() OVERRIDE { 63 profile_.reset(new TestingProfile()); 64 profile_->CreateBookmarkModel(true); 65 66 model_ = BookmarkModelFactory::GetForProfile(profile_.get()); 67 test::WaitForBookmarkModelToLoad(model_); 68 } 69 70 virtual void TearDown() OVERRIDE { 71 PartnerBookmarksShim::ClearInBrowserContextForTesting(profile_.get()); 72 PartnerBookmarksShim::ClearPartnerModelForTesting(); 73 PartnerBookmarksShim::EnablePartnerBookmarksEditing(); 74 profile_.reset(NULL); 75 } 76 77 scoped_ptr<TestingProfile> profile_; 78 79 base::MessageLoopForUI message_loop_; 80 content::TestBrowserThread ui_thread_; 81 content::TestBrowserThread file_thread_; 82 83 BookmarkModel* model_; 84 MockObserver observer_; 85 86 DISALLOW_COPY_AND_ASSIGN(PartnerBookmarksShimTest); 87 }; 88 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()); 94 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()); 98 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()); 103 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()); 108 109 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 110 ASSERT_FALSE(shim->IsLoaded()); 111 shim->SetPartnerBookmarksRoot(root_partner_node); 112 ASSERT_TRUE(shim->IsLoaded()); 113 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); 118 } 119 120 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadNoPartnerBookmarks) { 121 EXPECT_CALL(observer_, PartnerShimLoaded(_)).Times(0); 122 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 123 shim->AddObserver(&observer_); 124 125 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 126 shim->SetPartnerBookmarksRoot(NULL); 127 } 128 129 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadWithPartnerBookmarks) { 130 EXPECT_CALL(observer_, PartnerShimLoaded(_)).Times(0); 131 int64 id = 5; 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()); 137 138 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 139 shim->AddObserver(&observer_); 140 141 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 142 shim->SetPartnerBookmarksRoot(root_partner_node); 143 } 144 145 TEST_F(PartnerBookmarksShimTest, RemoveBookmarks) { 146 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 147 shim->AddObserver(&observer_); 148 149 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0); 150 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0); 151 152 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0); 153 root_partner_node->SetTitle(base::ASCIIToUTF16("Partner bookmarks")); 154 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()); 158 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()); 162 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()); 167 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()); 172 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()); 176 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()); 181 182 ASSERT_FALSE(shim->IsLoaded()); 183 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 184 shim->SetPartnerBookmarksRoot(root_partner_node); 185 ASSERT_TRUE(shim->IsLoaded()); 186 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)); 194 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)); 202 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)); 212 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)); 222 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)); 232 } 233 234 TEST_F(PartnerBookmarksShimTest, RenameBookmarks) { 235 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 236 shim->AddObserver(&observer_); 237 238 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0); 239 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0); 240 241 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0); 242 root_partner_node->SetTitle(base::ASCIIToUTF16("Partner bookmarks")); 243 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()); 248 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()); 253 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()); 259 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()); 265 266 ASSERT_FALSE(shim->IsLoaded()); 267 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 268 shim->SetPartnerBookmarksRoot(root_partner_node); 269 ASSERT_TRUE(shim->IsLoaded()); 270 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)); 276 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)); 282 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)); 287 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)); 293 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)); 298 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)); 304 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)); 310 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)); 316 } 317 318 TEST_F(PartnerBookmarksShimTest, SaveLoadProfile) { 319 { 320 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 321 shim->AddObserver(&observer_); 322 323 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0); 324 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0); 325 326 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0); 327 root_partner_node->SetTitle(base::ASCIIToUTF16("Partner bookmarks")); 328 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()); 333 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()); 339 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()); 345 346 ASSERT_FALSE(shim->IsLoaded()); 347 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 348 shim->SetPartnerBookmarksRoot(root_partner_node); 349 ASSERT_TRUE(shim->IsLoaded()); 350 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)); 356 } 357 358 PartnerBookmarksShim::ClearInBrowserContextForTesting(profile_.get()); 359 360 { 361 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 362 shim->AddObserver(&observer_); 363 364 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0); 365 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0); 366 ASSERT_TRUE(shim->IsLoaded()); 367 368 const BookmarkNode* partner_bookmark1 = shim->GetNodeByID(3); 369 const BookmarkNode* partner_bookmark2 = shim->GetNodeByID(5); 370 371 EXPECT_EQ(base::ASCIIToUTF16("a2.com"), shim->GetTitle(partner_bookmark1)); 372 EXPECT_FALSE(shim->IsReachable(partner_bookmark2)); 373 } 374 } 375 376 TEST_F(PartnerBookmarksShimTest, DisableEditing) { 377 PartnerBookmarksShim* shim = partner_bookmarks_shim(); 378 shim->AddObserver(&observer_); 379 380 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(0); 381 EXPECT_CALL(observer_, PartnerShimChanged(shim)).Times(0); 382 383 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0); 384 root_partner_node->SetTitle(base::ASCIIToUTF16("Partner bookmarks")); 385 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()); 390 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()); 395 396 ASSERT_FALSE(shim->IsLoaded()); 397 EXPECT_CALL(observer_, PartnerShimLoaded(shim)).Times(1); 398 shim->SetPartnerBookmarksRoot(root_partner_node); 399 ASSERT_TRUE(shim->IsLoaded()); 400 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)); 407 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)); 412 } 413