146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/browser/managed_bookmarks_tracker.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/bind.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/message_loop/message_loop.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/browser/bookmark_model_observer.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/browser/bookmark_node.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/common/bookmark_pref_names.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/test/mock_bookmark_model_observer.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/test/test_bookmark_client.h" 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "grit/components_strings.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "url/gurl.h" 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using testing::Mock; 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using testing::_; 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace policy { 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ManagedBookmarksTrackerTest : public testing::Test { 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ManagedBookmarksTrackerTest() : managed_node_(NULL) {} 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~ManagedBookmarksTrackerTest() {} 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetUp() OVERRIDE { 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.registry()->RegisterListPref(bookmarks::prefs::kManagedBookmarks); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.registry()->RegisterListPref( 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::prefs::kBookmarkEditorExpandedNodes); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void TearDown() OVERRIDE { 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (model_) 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->RemoveObserver(&observer_); 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void CreateModel() { 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Simulate the creation of the managed node by the BookmarkClient. 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BookmarkPermanentNode* managed_node = new BookmarkPermanentNode(100); 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) policy::ManagedBookmarksTracker::LoadInitial( 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci managed_node, prefs_.GetList(bookmarks::prefs::kManagedBookmarks), 101); 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) managed_node->set_visible(!managed_node->empty()); 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) managed_node->SetTitle(l10n_util::GetStringUTF16( 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME)); 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bookmarks::BookmarkPermanentNodeList extra_nodes; 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extra_nodes.push_back(managed_node); 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) client_.SetExtraNodesToLoad(extra_nodes.Pass()); 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci model_.reset(new BookmarkModel(&client_)); 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->AddObserver(&observer_); 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkModelLoaded(model_.get(), _)); 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->Load(&prefs_, 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string(), 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath(), 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoopProxy::current(), 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoopProxy::current()); 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) test::WaitForBookmarkModelToLoad(model_.get()); 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(1u, client_.extra_nodes().size()); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) managed_node_ = client_.extra_nodes()[0]; 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(managed_node, managed_node_); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) managed_bookmarks_tracker_.reset(new ManagedBookmarksTracker( 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_.get(), 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &prefs_, 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&ManagedBookmarksTrackerTest::GetManagementDomain))); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) managed_bookmarks_tracker_->Init(managed_node_); 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* managed_node() { 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return managed_node_; 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool IsManaged(const BookmarkNode* node) { 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return node && node->HasAncestor(managed_node_); 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static base::DictionaryValue* CreateBookmark(const std::string& title, 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& url) { 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(GURL(url).is_valid()); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dict->SetString("name", title); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dict->SetString("url", GURL(url).spec()); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return dict; 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static base::DictionaryValue* CreateFolder(const std::string& title, 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ListValue* children) { 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dict->SetString("name", title); 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dict->Set("children", children); 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return dict; 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static base::ListValue* CreateTestTree() { 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ListValue* folder = new base::ListValue(); 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ListValue* empty = new base::ListValue(); 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) folder->Append(CreateFolder("Empty", empty)); 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) folder->Append(CreateBookmark("Youtube", "http://youtube.com/")); 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ListValue* list = new base::ListValue(); 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) list->Append(CreateBookmark("Google", "http://google.com/")); 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) list->Append(CreateFolder("Folder", folder)); 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return list; 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static std::string GetManagementDomain() { 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return std::string(); 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static std::string GetManagedFolderTitle() { 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return l10n_util::GetStringUTF8( 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME); 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static base::DictionaryValue* CreateExpectedTree() { 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return CreateFolder(GetManagedFolderTitle(), CreateTestTree()); 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static bool NodeMatchesValue(const BookmarkNode* node, 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::DictionaryValue* dict) { 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16 title; 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!dict->GetString("name", &title) || node->GetTitle() != title) 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (node->is_folder()) { 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::ListValue* children = NULL; 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!dict->GetList("children", &children) || 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) node->child_count() != static_cast<int>(children->GetSize())) { 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (int i = 0; i < node->child_count(); ++i) { 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::DictionaryValue* child = NULL; 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!children->GetDictionary(i, &child) || 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) !NodeMatchesValue(node->GetChild(i), child)) { 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (node->is_url()) { 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string url; 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!dict->GetString("url", &url) || node->url() != GURL(url)) 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoop loop_; 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestingPrefServiceSimple prefs_; 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::TestBookmarkClient client_; 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<BookmarkModel> model_; 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::MockBookmarkModelObserver observer_; 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BookmarkPermanentNode* managed_node_; 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<ManagedBookmarksTracker> managed_bookmarks_tracker_; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, Empty) { 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(model_->bookmark_bar_node()->empty()); 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(model_->other_node()->empty()); 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(managed_node()->empty()); 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(managed_node()->IsVisible()); 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, LoadInitial) { 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Set a policy before loading the model. 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(model_->bookmark_bar_node()->empty()); 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(model_->other_node()->empty()); 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(managed_node()->empty()); 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(managed_node()->IsVisible()); 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::DictionaryValue> expected(CreateExpectedTree()); 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get())); 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, SwapNodes) { 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Swap the Google bookmark with the Folder. 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::ListValue> updated(CreateTestTree()); 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::Value> removed; 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(updated->Remove(0, &removed)); 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) updated->Append(removed.release()); 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // These two nodes should just be swapped. 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* parent = managed_node(); 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkNodeMoved(model_.get(), parent, 1, parent, 0)); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci updated->DeepCopy()); 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Verify the final tree. 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::DictionaryValue> expected( 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateFolder(GetManagedFolderTitle(), updated.release())); 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get())); 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, RemoveNode) { 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Remove the Folder. 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::ListValue> updated(CreateTestTree()); 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(updated->Remove(1, NULL)); 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* parent = managed_node(); 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 1, _, _)); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci updated->DeepCopy()); 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Verify the final tree. 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::DictionaryValue> expected( 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateFolder(GetManagedFolderTitle(), updated.release())); 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get())); 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, CreateNewNodes) { 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Put all the nodes inside another folder. 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::ListValue> updated(new base::ListValue); 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) updated->Append(CreateFolder("Container", CreateTestTree())); 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkNodeAdded(model_.get(), _, _)).Times(5); 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The remaining nodes have been pushed to positions 1 and 2; they'll both be 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // removed when at position 1. 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* parent = managed_node(); 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 1, _, _)) 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(2); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci updated->DeepCopy()); 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Verify the final tree. 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<base::DictionaryValue> expected( 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateFolder(GetManagedFolderTitle(), updated.release())); 25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(NodeMatchesValue(managed_node(), expected.get())); 25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, RemoveAll) { 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(managed_node()->IsVisible()); 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Remove the policy. 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* parent = managed_node(); 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 0, _, _)) 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) .Times(2); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.RemoveManagedPref(bookmarks::prefs::kManagedBookmarks); 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(managed_node()->empty()); 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(managed_node()->IsVisible()); 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, IsManaged) { 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(IsManaged(model_->root_node())); 28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(IsManaged(model_->bookmark_bar_node())); 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(IsManaged(model_->other_node())); 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(IsManaged(model_->mobile_node())); 28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(IsManaged(managed_node())); 28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BookmarkNode* parent = managed_node(); 28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(2, parent->child_count()); 28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(IsManaged(parent->GetChild(0))); 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(IsManaged(parent->GetChild(1))); 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parent = parent->GetChild(1); 29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_EQ(2, parent->child_count()); 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(IsManaged(parent->GetChild(0))); 29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(IsManaged(parent->GetChild(1))); 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ManagedBookmarksTrackerTest, RemoveAllUserBookmarksDoesntRemoveManaged) { 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.SetManagedPref(bookmarks::prefs::kManagedBookmarks, CreateTestTree()); 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateModel(); 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2, managed_node()->child_count()); 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BookmarkNodeAdded(model_.get(), model_->bookmark_bar_node(), 0)); 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(observer_, 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BookmarkNodeAdded(model_.get(), model_->bookmark_bar_node(), 1)); 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->AddURL(model_->bookmark_bar_node(), 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 0, 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ASCIIToUTF16("Test"), 30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GURL("http://google.com/")); 31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->AddFolder( 31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) model_->bookmark_bar_node(), 1, base::ASCIIToUTF16("Test Folder")); 31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2, model_->bookmark_bar_node()->child_count()); 31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(observer_, BookmarkAllUserNodesRemoved(model_.get(), _)); 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) model_->RemoveAllUserBookmarks(); 31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2, managed_node()->child_count()); 31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0, model_->bookmark_bar_node()->child_count()); 31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace policy 323