blob: 90855bb177840a1f1655e7c9883891db8502de1a [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/enhanced_bookmarks/enhanced_bookmark_model.h"
#include "base/base64.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "components/bookmarks/test/test_bookmark_client.h"
#include "components/enhanced_bookmarks/enhanced_bookmark_model_observer.h"
#include "components/enhanced_bookmarks/proto/metadata.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using enhanced_bookmarks::EnhancedBookmarkModel;
namespace {
const std::string BOOKMARK_URL("http://example.com/index.html");
} // namespace
class EnhancedBookmarkModelTest
: public testing::Test,
public enhanced_bookmarks::EnhancedBookmarkModelObserver {
public:
EnhancedBookmarkModelTest()
: loaded_calls_(0),
shutting_down_calls_(0),
added_calls_(0),
removed_calls_(0),
changed_calls_(0),
all_user_nodes_removed_calls_(0),
remote_id_changed_calls_(0),
last_added_(NULL),
last_removed_(NULL),
last_changed_(NULL),
last_remote_id_node_(NULL) {}
~EnhancedBookmarkModelTest() override {}
void SetUp() override {
message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_DEFAULT));
bookmark_client_.reset(new bookmarks::TestBookmarkClient());
bookmark_model_.reset(bookmark_client_->CreateModel().release());
model_.reset(new EnhancedBookmarkModel(bookmark_model_.get(), "v1.0"));
model_->AddObserver(this);
}
void TearDown() override {
if (model_)
model_->Shutdown();
model_.reset();
bookmark_model_.reset();
bookmark_client_.reset();
message_loop_.reset();
}
protected:
const BookmarkNode* AddBookmark() {
return AddBookmark("Some title", bookmark_model_->other_node());
}
const BookmarkNode* AddFolder() {
return AddFolder("Some title", bookmark_model_->other_node());
}
const BookmarkNode* AddBookmark(const std::string& name,
const BookmarkNode* parent) {
return model_->AddURL(parent,
0, // index.
base::ASCIIToUTF16(name),
GURL(BOOKMARK_URL),
base::Time::Now());
}
const BookmarkNode* AddFolder(const std::string& name,
const BookmarkNode* parent) {
return model_->AddFolder(parent, 0, base::ASCIIToUTF16(name));
}
std::string GetVersion(const BookmarkNode* node) {
return GetMetaInfoField(node, "stars.version");
}
std::string GetId(const BookmarkNode* node) {
return GetMetaInfoField(node, "stars.id");
}
std::string GetOldId(const BookmarkNode* node) {
return GetMetaInfoField(node, "stars.oldId");
}
std::string GetMetaInfoField(const BookmarkNode* node,
const std::string& name) {
std::string value;
if (!node->GetMetaInfo(name, &value))
return std::string();
return value;
}
scoped_ptr<base::MessageLoop> message_loop_;
scoped_ptr<bookmarks::TestBookmarkClient> bookmark_client_;
scoped_ptr<BookmarkModel> bookmark_model_;
scoped_ptr<EnhancedBookmarkModel> model_;
// EnhancedBookmarkModelObserver implementation:
void EnhancedBookmarkModelLoaded() override { loaded_calls_++; }
void EnhancedBookmarkModelShuttingDown() override { shutting_down_calls_++; }
void EnhancedBookmarkAdded(const BookmarkNode* node) override {
added_calls_++;
last_added_ = node;
}
void EnhancedBookmarkRemoved(const BookmarkNode* node) override {
removed_calls_++;
last_removed_ = node;
}
void EnhancedBookmarkNodeChanged(const BookmarkNode* node) override {
changed_calls_++;
last_changed_ = node;
}
void EnhancedBookmarkAllUserNodesRemoved() override {
all_user_nodes_removed_calls_++;
}
void EnhancedBookmarkRemoteIdChanged(const BookmarkNode* node,
const std::string& old_remote_id,
const std::string& remote_id) override {
remote_id_changed_calls_++;
last_remote_id_node_ = node;
last_old_remote_id_ = old_remote_id;
last_remote_id_ = remote_id;
}
// Observer call counters:
int loaded_calls_;
int shutting_down_calls_;
int added_calls_;
int removed_calls_;
int changed_calls_;
int all_user_nodes_removed_calls_;
int remote_id_changed_calls_;
// Observer parameter cache:
const BookmarkNode* last_added_;
const BookmarkNode* last_removed_;
const BookmarkNode* last_changed_;
const BookmarkNode* last_remote_id_node_;
std::string last_old_remote_id_;
std::string last_remote_id_;
private:
DISALLOW_COPY_AND_ASSIGN(EnhancedBookmarkModelTest);
};
TEST_F(EnhancedBookmarkModelTest, TestEmptySnippet) {
const BookmarkNode* node = AddBookmark();
std::string snippet(model_->GetSnippet(node));
EXPECT_EQ(snippet, "");
};
TEST_F(EnhancedBookmarkModelTest, TestSnippet) {
const BookmarkNode* node = AddBookmark();
// Binary serialize the protobuf.
image::collections::PageData data;
data.set_snippet("I'm happy!");
ASSERT_TRUE(data.IsInitialized());
std::string output;
bool result = data.SerializeToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", encoded);
std::string snippet(model_->GetSnippet(node));
EXPECT_EQ(snippet, "I'm happy!");
}
TEST_F(EnhancedBookmarkModelTest, TestBadEncodingSnippet) {
const BookmarkNode* node = AddBookmark();
// Binary serialize the protobuf.
image::collections::PageData data;
data.set_snippet("You are happy!");
ASSERT_TRUE(data.IsInitialized());
std::string output;
bool result = data.SerializeToString(&output);
ASSERT_TRUE(result);
// don't base 64 encode the output.
bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", output);
std::string snippet(model_->GetSnippet(node));
EXPECT_EQ(snippet, "");
}
TEST_F(EnhancedBookmarkModelTest, TestOriginalImage) {
const BookmarkNode* node = AddBookmark();
image::collections::ImageData data;
// Intentionally make raw pointer.
image::collections::ImageData_ImageInfo* info =
new image::collections::ImageData_ImageInfo;
info->set_url("http://example.com/foobar");
info->set_width(15);
info->set_height(55);
// This method consumes the pointer.
data.set_allocated_original_info(info);
std::string output;
bool result = data.SerializePartialToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
GURL url;
int width;
int height;
result = model_->GetOriginalImage(node, &url, &width, &height);
ASSERT_TRUE(result);
EXPECT_EQ(url, GURL("http://example.com/foobar"));
EXPECT_EQ(width, 15);
EXPECT_EQ(height, 55);
}
TEST_F(EnhancedBookmarkModelTest, TestThumbnailImage) {
const BookmarkNode* node = AddBookmark();
image::collections::ImageData data;
// Intentionally make raw pointer.
image::collections::ImageData_ImageInfo* info =
new image::collections::ImageData_ImageInfo;
info->set_url("http://example.com/foobar");
info->set_width(15);
info->set_height(55);
// This method consumes the pointer.
data.set_allocated_thumbnail_info(info);
std::string output;
bool result = data.SerializePartialToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
GURL url;
int width;
int height;
result = model_->GetThumbnailImage(node, &url, &width, &height);
ASSERT_TRUE(result);
EXPECT_EQ(url, GURL("http://example.com/foobar"));
EXPECT_EQ(width, 15);
EXPECT_EQ(height, 55);
}
TEST_F(EnhancedBookmarkModelTest, TestOriginalImageMissingDimensions) {
const BookmarkNode* node = AddBookmark();
image::collections::ImageData data;
// Intentionally make raw pointer.
image::collections::ImageData_ImageInfo* info =
new image::collections::ImageData_ImageInfo;
info->set_url("http://example.com/foobar");
// This method consumes the pointer.
data.set_allocated_original_info(info);
std::string output;
bool result = data.SerializePartialToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
GURL url;
int width;
int height;
result = model_->GetOriginalImage(node, &url, &width, &height);
ASSERT_FALSE(result);
}
TEST_F(EnhancedBookmarkModelTest, TestOriginalImageBadUrl) {
const BookmarkNode* node = AddBookmark();
image::collections::ImageData data;
// Intentionally make raw pointer.
image::collections::ImageData_ImageInfo* info =
new image::collections::ImageData_ImageInfo;
info->set_url("asdf. 13r");
info->set_width(15);
info->set_height(55);
// This method consumes the pointer.
data.set_allocated_original_info(info);
std::string output;
bool result = data.SerializePartialToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
GURL url;
int width;
int height;
result = model_->GetOriginalImage(node, &url, &width, &height);
ASSERT_FALSE(result);
}
TEST_F(EnhancedBookmarkModelTest, TestEncodeDecode) {
const BookmarkNode* node = AddBookmark();
bool result =
model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 22, 33);
ASSERT_TRUE(result);
GURL url;
int width;
int height;
result = model_->GetOriginalImage(node, &url, &width, &height);
ASSERT_TRUE(result);
EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
EXPECT_EQ(width, 22);
EXPECT_EQ(height, 33);
EXPECT_EQ("v1.0", GetVersion(node));
}
TEST_F(EnhancedBookmarkModelTest, TestDoubleEncodeDecode) {
const BookmarkNode* node = AddBookmark();
// Encode some information.
bool result =
model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 22, 33);
ASSERT_TRUE(result);
// Encode some different information.
result =
model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 33, 44);
ASSERT_TRUE(result);
GURL url;
int width;
int height;
result = model_->GetOriginalImage(node, &url, &width, &height);
ASSERT_TRUE(result);
EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
EXPECT_EQ(width, 33);
EXPECT_EQ(height, 44);
EXPECT_EQ("v1.0", GetVersion(node));
}
TEST_F(EnhancedBookmarkModelTest, TestRemoteId) {
const BookmarkNode* node = AddBookmark();
// Verify that the remote id starts with the correct prefix.
EXPECT_TRUE(StartsWithASCII(model_->GetRemoteId(node), "ebc_", true));
// Getting the remote id for nodes that don't have them should return the
// empty string.
const BookmarkNode* existing_node =
bookmark_model_->AddURL(bookmark_model_->other_node(),
0,
base::ASCIIToUTF16("Title"),
GURL(GURL(BOOKMARK_URL)));
EXPECT_TRUE(model_->GetRemoteId(existing_node).empty());
// Folder nodes should not have a remote id set on creation.
const BookmarkNode* folder_node = AddFolder();
EXPECT_TRUE(model_->GetRemoteId(folder_node).empty());
}
TEST_F(EnhancedBookmarkModelTest, TestEmptyDescription) {
const BookmarkNode* node = AddBookmark();
std::string description(model_->GetDescription(node));
EXPECT_EQ(description, "");
}
TEST_F(EnhancedBookmarkModelTest, TestDescription) {
const BookmarkNode* node = AddBookmark();
const std::string description("This is the most useful description of all.");
// Set the description.
model_->SetDescription(node, description);
// Check the description is the one that was set.
EXPECT_EQ(model_->GetDescription(node), description);
EXPECT_EQ("v1.0", GetVersion(node));
}
// If there is no notes field, the description should fall back on the snippet.
TEST_F(EnhancedBookmarkModelTest, TestDescriptionFallback) {
const BookmarkNode* node = AddBookmark();
// Binary serialize the protobuf.
image::collections::PageData data;
data.set_snippet("Joe Bar Team");
ASSERT_TRUE(data.IsInitialized());
std::string output;
bool result = data.SerializeToString(&output);
ASSERT_TRUE(result);
// base64 encode the output.
std::string encoded;
base::Base64Encode(output, &encoded);
bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", encoded);
// The snippet is used as the description.
std::string snippet(model_->GetSnippet(node));
EXPECT_EQ("Joe Bar Team", model_->GetDescription(node));
// Set the description.
const std::string description("This is the most useful description of all.");
model_->SetDescription(node, description);
// Check the description is the one that was set.
EXPECT_EQ(model_->GetDescription(node), description);
}
// Makes sure that the stars.version field is set every time
// EnhancedBookmarkModel makes a change to a node.
TEST_F(EnhancedBookmarkModelTest, TestVersionField) {
const BookmarkNode* node = AddBookmark();
EXPECT_EQ("", GetVersion(node));
model_->SetDescription(node, "foo");
EXPECT_EQ("v1.0", GetVersion(node));
// Add a suffix to the version to set.
model_->SetVersionSuffix("alpha");
model_->SetDescription(node, "foo");
// Since the description didn't actually change, the version field should
// not either.
EXPECT_EQ("v1.0", GetVersion(node));
model_->SetDescription(node, "bar");
EXPECT_EQ("v1.0/alpha", GetVersion(node));
}
// Verifies that duplicate nodes are reset when the model is created.
TEST_F(EnhancedBookmarkModelTest, ResetDuplicateNodesOnInitialization) {
model_->Shutdown();
const BookmarkNode* parent = bookmark_model_->other_node();
const BookmarkNode* node1 = bookmark_model_->AddURL(
parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
const BookmarkNode* node2 = bookmark_model_->AddURL(
parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
const BookmarkNode* node3 = bookmark_model_->AddURL(
parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
const BookmarkNode* node4 = bookmark_model_->AddURL(
parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_2");
bookmark_model_->SetNodeMetaInfo(node3, "stars.id", "c_1");
bookmark_model_->SetNodeMetaInfo(node4, "stars.id", "c_1");
EXPECT_EQ("c_1", GetId(node1));
EXPECT_EQ("c_2", GetId(node2));
EXPECT_EQ("c_1", GetId(node3));
EXPECT_EQ("c_1", GetId(node4));
model_.reset(new EnhancedBookmarkModel(bookmark_model_.get(), "v2.0"));
base::RunLoop().RunUntilIdle();
EXPECT_EQ("c_2", GetId(node2));
EXPECT_EQ("", GetId(node1));
EXPECT_EQ("", GetId(node3));
EXPECT_EQ("", GetId(node4));
EXPECT_EQ("c_1", GetOldId(node1));
EXPECT_EQ("c_1", GetOldId(node3));
EXPECT_EQ("c_1", GetOldId(node4));
EXPECT_EQ("v2.0", GetVersion(node1));
EXPECT_EQ("v2.0", GetVersion(node3));
EXPECT_EQ("v2.0", GetVersion(node4));
}
// Verifies that duplicate nodes are reset if one is created.
TEST_F(EnhancedBookmarkModelTest, ResetDuplicateAddedNodes) {
BookmarkNode::MetaInfoMap meta_info;
meta_info["stars.id"] = "c_1";
const BookmarkNode* parent = bookmark_model_->other_node();
const BookmarkNode* node1 =
bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
parent,
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL),
base::Time::Now(),
&meta_info);
EXPECT_EQ("c_1", GetId(node1));
const BookmarkNode* node2 =
bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
parent,
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL),
base::Time::Now(),
&meta_info);
base::RunLoop().RunUntilIdle();
EXPECT_EQ("", GetId(node1));
EXPECT_EQ("", GetId(node2));
EXPECT_EQ("c_1", GetOldId(node1));
EXPECT_EQ("c_1", GetOldId(node2));
EXPECT_EQ("v1.0", GetVersion(node1));
EXPECT_EQ("v1.0", GetVersion(node2));
}
// Verifies that duplicate nodes are reset if an id is changed to a duplicate
// value.
TEST_F(EnhancedBookmarkModelTest, ResetDuplicateChangedNodes) {
const BookmarkNode* node1 = AddBookmark();
const BookmarkNode* node2 = AddBookmark();
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
EXPECT_EQ("c_1", GetId(node1));
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_1");
base::RunLoop().RunUntilIdle();
EXPECT_EQ("", GetId(node1));
EXPECT_EQ("", GetId(node2));
EXPECT_EQ("c_1", GetOldId(node1));
EXPECT_EQ("c_1", GetOldId(node2));
EXPECT_EQ("v1.0", GetVersion(node1));
EXPECT_EQ("v1.0", GetVersion(node2));
}
TEST_F(EnhancedBookmarkModelTest, SetMultipleMetaInfo) {
const BookmarkNode* node = AddBookmark();
BookmarkNode::MetaInfoMap meta_info;
meta_info["a"] = "aa";
meta_info["b"] = "bb";
model_->SetVersionSuffix("1");
model_->SetMultipleMetaInfo(node, meta_info);
EXPECT_EQ("aa", GetMetaInfoField(node, "a"));
EXPECT_EQ("bb", GetMetaInfoField(node, "b"));
EXPECT_EQ("v1.0/1", GetVersion(node));
// Not present fields does not erase the fields already set on the node.
meta_info["a"] = "aaa";
model_->SetVersionSuffix("2");
model_->SetMultipleMetaInfo(node, meta_info);
EXPECT_EQ("aaa", GetMetaInfoField(node, "a"));
EXPECT_EQ("bb", GetMetaInfoField(node, "b"));
EXPECT_EQ("v1.0/2", GetVersion(node));
// Not actually changing any values should not set the version field.
model_->SetVersionSuffix("3");
model_->SetMultipleMetaInfo(node, meta_info);
EXPECT_EQ("v1.0/2", GetVersion(node));
}
TEST_F(EnhancedBookmarkModelTest, ObserverShuttingDownEvent) {
EXPECT_EQ(0, shutting_down_calls_);
model_->Shutdown();
EXPECT_EQ(1, shutting_down_calls_);
model_.reset();
}
TEST_F(EnhancedBookmarkModelTest, ObserverNodeAddedEvent) {
EXPECT_EQ(0, added_calls_);
const BookmarkNode* node = AddBookmark();
EXPECT_EQ(1, added_calls_);
EXPECT_EQ(node, last_added_);
const BookmarkNode* folder = AddFolder();
EXPECT_EQ(2, added_calls_);
EXPECT_EQ(folder, last_added_);
}
TEST_F(EnhancedBookmarkModelTest, ObserverNodeRemovedEvent) {
const BookmarkNode* node = AddBookmark();
const BookmarkNode* folder = AddFolder();
EXPECT_EQ(0, removed_calls_);
bookmark_model_->Remove(node->parent(), node->parent()->GetIndexOf(node));
EXPECT_EQ(1, removed_calls_);
EXPECT_EQ(node, last_removed_);
bookmark_model_->Remove(folder->parent(),
folder->parent()->GetIndexOf(folder));
EXPECT_EQ(2, removed_calls_);
EXPECT_EQ(folder, last_removed_);
}
TEST_F(EnhancedBookmarkModelTest, ObserverNodeChangedEvent) {
const BookmarkNode* node = AddBookmark();
EXPECT_EQ(0, changed_calls_);
bookmark_model_->SetTitle(node, base::ASCIIToUTF16("New Title"));
EXPECT_EQ(1, changed_calls_);
EXPECT_EQ(node, last_changed_);
}
TEST_F(EnhancedBookmarkModelTest, ObserverAllUserNodesRemovedEvent) {
AddBookmark();
AddFolder();
EXPECT_EQ(0, all_user_nodes_removed_calls_);
bookmark_model_->RemoveAllUserBookmarks();
EXPECT_EQ(0, removed_calls_);
EXPECT_EQ(1, all_user_nodes_removed_calls_);
}
TEST_F(EnhancedBookmarkModelTest, ObserverRemoteIdChangedEvent) {
const BookmarkNode* node1 = AddFolder();
const BookmarkNode* node2 = AddFolder();
EXPECT_EQ(0, remote_id_changed_calls_);
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, remote_id_changed_calls_);
EXPECT_EQ(node1, last_remote_id_node_);
EXPECT_EQ("", last_old_remote_id_);
EXPECT_EQ("c_1", last_remote_id_);
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_2");
base::RunLoop().RunUntilIdle();
EXPECT_EQ(2, remote_id_changed_calls_);
EXPECT_EQ(node2, last_remote_id_node_);
EXPECT_EQ("", last_old_remote_id_);
EXPECT_EQ("c_2", last_remote_id_);
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_3");
base::RunLoop().RunUntilIdle();
EXPECT_EQ(3, remote_id_changed_calls_);
EXPECT_EQ(node1, last_remote_id_node_);
EXPECT_EQ("c_1", last_old_remote_id_);
EXPECT_EQ("c_3", last_remote_id_);
// Set to duplicate ids.
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_3");
EXPECT_EQ(4, remote_id_changed_calls_);
EXPECT_EQ(node2, last_remote_id_node_);
EXPECT_EQ("c_2", last_old_remote_id_);
EXPECT_EQ("c_3", last_remote_id_);
base::RunLoop().RunUntilIdle();
EXPECT_EQ(6, remote_id_changed_calls_);
EXPECT_EQ("", last_remote_id_);
}
TEST_F(EnhancedBookmarkModelTest, ShutDownWhileResetDuplicationScheduled) {
const BookmarkNode* node1 = AddBookmark();
const BookmarkNode* node2 = AddBookmark();
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_1");
model_->Shutdown();
model_.reset();
base::RunLoop().RunUntilIdle();
}
TEST_F(EnhancedBookmarkModelTest, NodeRemovedWhileResetDuplicationScheduled) {
const BookmarkNode* node1 = AddBookmark();
const BookmarkNode* node2 = AddBookmark();
bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_1");
bookmark_model_->Remove(node1->parent(), node1->parent()->GetIndexOf(node1));
base::RunLoop().RunUntilIdle();
}
// Verifies that the NEEDS_OFFLINE_PROCESSING flag is set for nodes added
// with no remote id.
TEST_F(EnhancedBookmarkModelTest, BookmarkAddedSetsOfflineProcessingFlag) {
const BookmarkNode* node =
bookmark_model_->AddURL(bookmark_model_->other_node(),
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL));
std::string flags_str;
EXPECT_FALSE(node->GetMetaInfo("stars.flags", &flags_str));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(node->GetMetaInfo("stars.flags", &flags_str));
int flags;
ASSERT_TRUE(base::StringToInt(flags_str, &flags));
EXPECT_EQ(1, (flags & 1));
}
// Verifies that the NEEDS_OFFLINE_PROCESSING_FLAG is not set for added folders.
TEST_F(EnhancedBookmarkModelTest, FolderAddedDoesNotSetOfflineProcessingFlag) {
const BookmarkNode* node = AddFolder();
base::RunLoop().RunUntilIdle();
std::string flags_str;
if (node->GetMetaInfo("stars.flags", &flags_str)) {
int flags;
ASSERT_TRUE(base::StringToInt(flags_str, &flags));
EXPECT_EQ(0, (flags & 1));
}
}
// Verifies that when a bookmark is added that has a remote id, the status of
// the NEEDS_OFFLINE_PROCESSING flag doesn't change.
TEST_F(EnhancedBookmarkModelTest,
BookmarkAddedWithIdKeepsOfflineProcessingFlag) {
BookmarkNode::MetaInfoMap meta_info;
meta_info["stars.id"] = "some_id";
meta_info["stars.flags"] = "1";
const BookmarkNode* node1 =
bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
bookmark_model_->other_node(),
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL),
base::Time::Now(),
&meta_info);
base::RunLoop().RunUntilIdle();
std::string flags_str;
ASSERT_TRUE(node1->GetMetaInfo("stars.flags", &flags_str));
int flags;
ASSERT_TRUE(base::StringToInt(flags_str, &flags));
EXPECT_EQ(1, (flags & 1));
meta_info["stars.flags"] = "0";
const BookmarkNode* node2 =
bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
bookmark_model_->other_node(),
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL),
base::Time::Now(),
&meta_info);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(node2->GetMetaInfo("stars.flags", &flags_str));
ASSERT_TRUE(base::StringToInt(flags_str, &flags));
EXPECT_EQ(0, (flags & 1));
}
TEST_F(EnhancedBookmarkModelTest,
NodeRemovedWhileSetNeedsOfflineProcessingIsScheduled) {
const BookmarkNode* node =
bookmark_model_->AddURL(bookmark_model_->other_node(),
0,
base::ASCIIToUTF16("Some title"),
GURL(BOOKMARK_URL));
bookmark_model_->Remove(node->parent(), node->parent()->GetIndexOf(node));
base::RunLoop().RunUntilIdle();
}
TEST_F(EnhancedBookmarkModelTest,
RemoveParentShouldRemoveChildrenFromMaps) {
const BookmarkNode* parent = AddFolder();
const BookmarkNode* node = AddBookmark("Title", parent);
std::string remote_id = GetId(node);
EXPECT_EQ(node, model_->BookmarkForRemoteId(remote_id));
const BookmarkNode* gp = parent->parent();
bookmark_model_->Remove(gp, gp->GetIndexOf(parent));
EXPECT_FALSE(model_->BookmarkForRemoteId(remote_id));
}