15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string_number_conversions.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/bookmarks/chrome_bookmark_client.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/bookmarks.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace keys = bookmark_api_constants;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using api::bookmarks::BookmarkTreeNode;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace bookmark_api_helpers {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionBookmarksTest : public testing::Test {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ExtensionBookmarksTest()
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : client_(NULL), model_(NULL), node_(NULL), node2_(NULL), folder_(NULL) {}
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    profile_.CreateBookmarkModel(false);
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    model_ = BookmarkModelFactory::GetForProfile(&profile_);
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    client_ = ChromeBookmarkClientFactory::GetForProfile(&profile_);
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test::WaitForBookmarkModelToLoad(model_);
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    node_ = model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("Digg"),
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           GURL("http://www.reddit.com"));
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    model_->SetNodeMetaInfo(node_, "some_key1", "some_value1");
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    model_->SetNodeMetaInfo(node_, "some_key2", "some_value2");
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    model_->AddURL(model_->other_node(), 0, base::ASCIIToUTF16("News"),
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   GURL("http://www.foxnews.com"));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    folder_ = model_->AddFolder(
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        model_->other_node(), 0, base::ASCIIToUTF16("outer folder"));
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    model_->SetNodeMetaInfo(folder_, "some_key1", "some_value1");
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 1"));
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    model_->AddFolder(folder_, 0, base::ASCIIToUTF16("inner folder 2"));
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    node2_ = model_->AddURL(
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        folder_, 0, base::ASCIIToUTF16("Digg"), GURL("http://reddit.com"));
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    model_->SetNodeMetaInfo(node2_, "some_key2", "some_value2");
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    model_->AddURL(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        folder_, 0, base::ASCIIToUTF16("CNet"), GURL("http://cnet.com"));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  TestingProfile profile_;
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ChromeBookmarkClient* client_;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  BookmarkModel* model_;
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const BookmarkNode* node_;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* node2_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* folder_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetFullTreeFromRoot) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          model_->other_node(),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true,    // Recurse.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          false));  // Not only folders.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, tree->children->size());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetFoldersOnlyFromRoot) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          model_->other_node(),
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true,   // Recurse.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true));  // Only folders.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, tree->children->size());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetSubtree) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          folder_,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true,    // Recurse.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          false));  // Not only folders.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, tree->children->size());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<BookmarkTreeNode> digg = tree->children->at(1);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(digg.get());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("Digg", digg->title);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetSubtreeFoldersOnly) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          folder_,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true,   // Recurse.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          true));  // Only folders.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, tree->children->size());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<BookmarkTreeNode> inner_folder = tree->children->at(1);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(inner_folder.get());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("inner folder 1", inner_folder->title);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetModifiableNode) {
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          node_,
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          false,    // Recurse.
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          false));  // Only folders.
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("Digg", tree->title);
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(tree->url);
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("http://www.reddit.com/", *tree->url);
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_NONE, tree->unmodifiable);
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, GetManagedNode) {
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const BookmarkNode* managed_bookmark =
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      model_->AddURL(client_->managed_node(),
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     0,
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     base::ASCIIToUTF16("Chromium"),
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     GURL("http://www.chromium.org/"));
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<BookmarkTreeNode> tree(
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetBookmarkTreeNode(client_,
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          managed_bookmark,
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          false,    // Recurse.
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          false));  // Only folders.
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("Chromium", tree->title);
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("http://www.chromium.org/", *tree->url);
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(BookmarkTreeNode::UNMODIFIABLE_MANAGED, tree->unmodifiable);
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, RemoveNodeInvalidId) {
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int64 invalid_id = model_->next_node_id();
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string error;
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(RemoveNode(model_, client_, invalid_id, true, &error));
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(keys::kNoNodeError, error);
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, RemoveNodePermanent) {
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string error;
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      RemoveNode(model_, client_, model_->other_node()->id(), true, &error));
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(keys::kModifySpecialError, error);
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, RemoveNodeManaged) {
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const BookmarkNode* managed_bookmark =
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      model_->AddURL(client_->managed_node(),
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     0,
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     base::ASCIIToUTF16("Chromium"),
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     GURL("http://www.chromium.org"));
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string error;
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      RemoveNode(model_, client_, managed_bookmark->id(), true, &error));
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(keys::kModifyManagedError, error);
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, RemoveNodeNotRecursive) {
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string error;
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(RemoveNode(model_, client_, folder_->id(), false, &error));
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(keys::kFolderNotEmptyError, error);
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(ExtensionBookmarksTest, RemoveNodeRecursive) {
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(3, model_->other_node()->child_count());
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string error;
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(RemoveNode(model_, client_, folder_->id(), true, &error));
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2, model_->other_node()->child_count());
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
176116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ExtensionBookmarksTest, GetMetaInfo) {
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::DictionaryValue id_to_meta_info_map;
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetMetaInfo(*model_->other_node(), &id_to_meta_info_map);
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(8u, id_to_meta_info_map.size());
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify top level node.
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::Value* value = NULL;
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(id_to_meta_info_map.Get(
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Int64ToString(model_->other_node()->id()), &value));
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != value);
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* dictionary_value = NULL;
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(value->GetAsDictionary(&dictionary_value));
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != dictionary_value);
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(0u, dictionary_value->size());
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify bookmark with two meta info key/value pairs.
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  value = NULL;
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(id_to_meta_info_map.Get(
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Int64ToString(node_->id()), &value));
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != value);
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary_value = NULL;
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(value->GetAsDictionary(&dictionary_value));
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != dictionary_value);
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2u, dictionary_value->size());
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string string_value;
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(dictionary_value->GetString("some_key1", &string_value));
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("some_value1", string_value);
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(dictionary_value->GetString("some_key2", &string_value));
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("some_value2", string_value);
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify folder with one meta info key/value pair.
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  value = NULL;
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(id_to_meta_info_map.Get(
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Int64ToString(folder_->id()), &value));
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != value);
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary_value = NULL;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(value->GetAsDictionary(&dictionary_value));
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != dictionary_value);
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, dictionary_value->size());
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(dictionary_value->GetString("some_key1", &string_value));
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("some_value1", string_value);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify bookmark in a subfolder with one meta info key/value pairs.
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  value = NULL;
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(id_to_meta_info_map.Get(
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Int64ToString(node2_->id()), &value));
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != value);
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dictionary_value = NULL;
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(value->GetAsDictionary(&dictionary_value));
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(NULL != dictionary_value);
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, dictionary_value->size());
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  string_value.clear();
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(dictionary_value->GetString("some_key1", &string_value));
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("", string_value);
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(dictionary_value->GetString("some_key2", &string_value));
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ("some_value2", string_value);
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace bookmark_api_helpers
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
237