1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_expanded_state_tracker.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/message_loop/message_loop.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service_factory.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/testing_pref_store.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/common/bookmark_pref_names.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/test_bookmark_client.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace bookmarks {
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<PrefService> PrefServiceForTesting() {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<user_prefs::PrefRegistrySyncable> registry(
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new user_prefs::PrefRegistrySyncable());
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registry->RegisterListPref(prefs::kBookmarkEditorExpandedNodes,
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             new base::ListValue,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry->RegisterListPref(prefs::kManagedBookmarks,
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::PrefServiceFactory factory;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  factory.set_user_prefs(make_scoped_refptr(new TestingPrefStore()));
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return factory.Create(registry.get());
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class BookmarkExpandedStateTrackerTest : public testing::Test {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkExpandedStateTrackerTest();
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~BookmarkExpandedStateTrackerTest();
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // testing::Test:
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop message_loop_;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestBookmarkClient client_;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<PrefService> prefs_;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<BookmarkModel> model_;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkExpandedStateTrackerTest);
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BookmarkExpandedStateTrackerTest::BookmarkExpandedStateTrackerTest() {}
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BookmarkExpandedStateTrackerTest::~BookmarkExpandedStateTrackerTest() {}
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BookmarkExpandedStateTrackerTest::SetUp() {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  prefs_ = PrefServiceForTesting();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_.reset(new BookmarkModel(&client_));
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  model_->Load(prefs_.get(),
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               std::string(),
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               base::FilePath(),
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               base::MessageLoopProxy::current(),
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               base::MessageLoopProxy::current());
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test::WaitForBookmarkModelToLoad(model_.get());
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BookmarkExpandedStateTrackerTest::TearDown() {
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  model_.reset();
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Various assertions for SetExpandedNodes.
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(BookmarkExpandedStateTrackerTest, SetExpandedNodes) {
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkExpandedStateTracker* tracker = model_->expanded_state_tracker();
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Should start out initially empty.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tracker->GetExpandedNodes().empty());
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkExpandedStateTracker::Nodes nodes;
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(model_->bookmark_bar_node());
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tracker->SetExpandedNodes(nodes);
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(nodes, tracker->GetExpandedNodes());
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Add a folder and mark it expanded.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const BookmarkNode* n1 = model_->AddFolder(
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      model_->bookmark_bar_node(), 0, base::ASCIIToUTF16("x"));
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(n1);
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tracker->SetExpandedNodes(nodes);
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(nodes, tracker->GetExpandedNodes());
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Remove the folder, which should remove it from the list of expanded nodes.
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  model_->Remove(model_->bookmark_bar_node(), 0);
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.erase(n1);
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  n1 = NULL;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(nodes, tracker->GetExpandedNodes());
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(BookmarkExpandedStateTrackerTest, RemoveAllUserBookmarks) {
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkExpandedStateTracker* tracker = model_->expanded_state_tracker();
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Add a folder and mark it expanded.
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const BookmarkNode* n1 = model_->AddFolder(
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      model_->bookmark_bar_node(), 0, base::ASCIIToUTF16("x"));
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkExpandedStateTracker::Nodes nodes;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(n1);
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tracker->SetExpandedNodes(nodes);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Verify that the node is present.
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(nodes, tracker->GetExpandedNodes());
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Call remove all.
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  model_->RemoveAllUserBookmarks();
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Verify node is not present.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tracker->GetExpandedNodes().empty());
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace bookmarks
117