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/ui/webui/ntp/android/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.h" 11 #include "chrome/browser/bookmarks/bookmark_model_factory.h" 12 #include "chrome/test/base/testing_profile.h" 13 #include "chrome/test/base/ui_test_utils.h" 14 #include "content/public/browser/browser_thread.h" 15 #include "content/public/test/test_browser_thread.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "url/gurl.h" 18 19 class PartnerBookmarksShimTest : public testing::Test { 20 public: 21 PartnerBookmarksShimTest() 22 : ui_thread_(content::BrowserThread::UI, &message_loop_), 23 file_thread_(content::BrowserThread::FILE, &message_loop_), 24 model_(NULL) { 25 } 26 27 TestingProfile* profile() const { return profile_.get(); } 28 29 const BookmarkNode* AddBookmark(const BookmarkNode* parent, 30 const GURL& url, 31 const string16& title) { 32 if (!parent) 33 parent = model_->bookmark_bar_node(); 34 return model_->AddURL(parent, parent->child_count(), title, url); 35 } 36 37 const BookmarkNode* AddFolder(const BookmarkNode* parent, 38 const string16& title) { 39 if (!parent) 40 parent = model_->bookmark_bar_node(); 41 return model_->AddFolder(parent, parent->child_count(), title); 42 } 43 44 protected: 45 // testing::Test 46 virtual void SetUp() OVERRIDE { 47 profile_.reset(new TestingProfile()); 48 profile_->CreateBookmarkModel(true); 49 50 model_ = BookmarkModelFactory::GetForProfile(profile_.get()); 51 ui_test_utils::WaitForBookmarkModelToLoad(model_); 52 } 53 54 virtual void TearDown() OVERRIDE { 55 profile_.reset(NULL); 56 PartnerBookmarksShim::GetInstance()->Reset(); 57 } 58 59 scoped_ptr<TestingProfile> profile_; 60 61 base::MessageLoopForUI message_loop_; 62 content::TestBrowserThread ui_thread_; 63 content::TestBrowserThread file_thread_; 64 65 BookmarkModel* model_; 66 67 DISALLOW_COPY_AND_ASSIGN(PartnerBookmarksShimTest); 68 }; 69 70 class TestObserver : public PartnerBookmarksShim::Observer { 71 public: 72 TestObserver() 73 : notified_of_load_(false) { 74 } 75 76 // Called when everything is loaded and attached 77 virtual void PartnerShimLoaded(PartnerBookmarksShim*) OVERRIDE { 78 notified_of_load_ = true; 79 } 80 81 bool IsNotifiedOfLoad() { return notified_of_load_; } 82 83 private: 84 bool notified_of_load_; 85 86 DISALLOW_COPY_AND_ASSIGN(TestObserver); 87 }; 88 89 TEST_F(PartnerBookmarksShimTest, GetNodeByID) { 90 // Add a bookmark. 91 GURL bookmark_url("http://www.google.com/"); 92 AddBookmark( 93 NULL, 94 bookmark_url, 95 ASCIIToUTF16("bar")); 96 const BookmarkNode* test_folder1 = AddFolder(NULL, 97 ASCIIToUTF16("test_folder1")); 98 const BookmarkNode* test_folder2 = AddFolder(test_folder1, 99 ASCIIToUTF16("test_folder2")); 100 const BookmarkNode* model_bookmark1 = AddBookmark(test_folder2, 101 GURL("http://www.test.com"), 102 ASCIIToUTF16("bar")); 103 const BookmarkNode* model_bookmark2 = AddBookmark(test_folder2, 104 GURL("http://www.foo.com"), 105 ASCIIToUTF16("baz")); 106 107 BookmarkNode* root_partner_node = new BookmarkPermanentNode(0); 108 BookmarkNode* partner_folder1 = new BookmarkNode(1, GURL()); 109 partner_folder1->set_type(BookmarkNode::FOLDER); 110 root_partner_node->Add(partner_folder1, root_partner_node->child_count()); 111 112 BookmarkNode* partner_folder2 = new BookmarkNode(2, GURL()); 113 partner_folder2->set_type(BookmarkNode::FOLDER); 114 partner_folder1->Add(partner_folder2, partner_folder1->child_count()); 115 116 BookmarkNode* partner_bookmark1 = new BookmarkNode(3, 117 GURL("http://www.a.com")); 118 partner_bookmark1->set_type(BookmarkNode::URL); 119 partner_folder1->Add(partner_bookmark1, partner_folder1->child_count()); 120 121 BookmarkNode* partner_bookmark2 = new BookmarkNode(4, 122 GURL("http://www.b.com")); 123 partner_bookmark2->set_type(BookmarkNode::URL); 124 partner_folder2->Add(partner_bookmark2, partner_folder2->child_count()); 125 126 PartnerBookmarksShim* shim = PartnerBookmarksShim::GetInstance(); 127 ASSERT_FALSE(shim->IsLoaded()); 128 shim->AttachTo(model_, model_->mobile_node()); 129 shim->SetPartnerBookmarksRoot(root_partner_node); 130 ASSERT_TRUE(shim->IsLoaded()); 131 132 ASSERT_EQ(shim->GetNodeByID(model_bookmark1->id(), false), model_bookmark1); 133 ASSERT_EQ(shim->GetNodeByID(model_bookmark2->id(), false), model_bookmark2); 134 ASSERT_EQ(shim->GetNodeByID(test_folder2->id(), false), test_folder2); 135 ASSERT_EQ(shim->GetNodeByID(0, true), root_partner_node); 136 ASSERT_EQ(shim->GetNodeByID(1, true), partner_folder1); 137 ASSERT_EQ(shim->GetNodeByID(4, true), partner_bookmark2); 138 } 139 140 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadNoPartnerBookmarks) { 141 TestObserver* observer = new TestObserver(); 142 PartnerBookmarksShim* shim = PartnerBookmarksShim::GetInstance(); 143 shim->AddObserver(observer); 144 ASSERT_FALSE(observer->IsNotifiedOfLoad()); 145 shim->SetPartnerBookmarksRoot(NULL); 146 ASSERT_TRUE(observer->IsNotifiedOfLoad()); 147 } 148 149 TEST_F(PartnerBookmarksShimTest, ObserverNotifiedOfLoadWithPartnerBookmarks) { 150 int64 id = 5; 151 BookmarkNode* root_partner_node = new BookmarkPermanentNode(id++); 152 BookmarkNode* partner_bookmark1 = new BookmarkNode(id++, 153 GURL("http://www.a.com")); 154 partner_bookmark1->set_type(BookmarkNode::URL); 155 root_partner_node->Add(partner_bookmark1, root_partner_node->child_count()); 156 157 TestObserver* observer = new TestObserver(); 158 PartnerBookmarksShim* shim = PartnerBookmarksShim::GetInstance(); 159 shim->AddObserver(observer); 160 shim->AttachTo(model_, model_->bookmark_bar_node()); 161 ASSERT_FALSE(observer->IsNotifiedOfLoad()); 162 shim->SetPartnerBookmarksRoot(root_partner_node); 163 ASSERT_TRUE(observer->IsNotifiedOfLoad()); 164 } 165