| Index: components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc
|
| diff --git a/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc b/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc
|
| index 5263297bb6f32af4d292dabfd45308e759a91e5e..e5b72109433307e31519dcf0854e70b40f8053d3 100644
|
| --- a/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc
|
| +++ b/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc
|
| @@ -7,34 +7,55 @@
|
| #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_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"
|
|
|
| -namespace {
|
| +using enhanced_bookmarks::EnhancedBookmarkModel;
|
|
|
| +namespace {
|
| const std::string BOOKMARK_URL("http://example.com/index.html");
|
| +} // namespace
|
|
|
| -class EnhancedBookmarkModelTest : public testing::Test {
|
| +class EnhancedBookmarkModelTest
|
| + : public testing::Test,
|
| + public enhanced_bookmarks::EnhancedBookmarkModelObserver {
|
| public:
|
| - EnhancedBookmarkModelTest() {}
|
| + EnhancedBookmarkModelTest()
|
| + : loaded_calls_(0),
|
| + shutting_down_calls_(0),
|
| + added_calls_(0),
|
| + removed_calls_(0),
|
| + all_user_nodes_removed_calls_(0),
|
| + remote_id_changed_calls_(0),
|
| + last_added_(NULL),
|
| + last_removed_(NULL),
|
| + last_remote_id_node_(NULL) {}
|
| virtual ~EnhancedBookmarkModelTest() {}
|
|
|
| virtual void SetUp() OVERRIDE {
|
| - bookmarks::TestBookmarkClient bookmark_client;
|
| - bookmark_model_.reset(bookmark_client.CreateModel().release());
|
| - model_.reset(new enhanced_bookmarks::EnhancedBookmarkModel(
|
| - bookmark_model_.get(), "v1.0"));
|
| + 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);
|
| }
|
|
|
| virtual void TearDown() OVERRIDE {
|
| + if (model_)
|
| + model_->ShutDown();
|
| model_.reset();
|
| bookmark_model_.reset();
|
| + bookmark_client_.reset();
|
| + message_loop_.reset();
|
| }
|
|
|
| protected:
|
| @@ -48,26 +69,83 @@ class EnhancedBookmarkModelTest : public testing::Test {
|
|
|
| const BookmarkNode* AddBookmark(const std::string& name,
|
| const BookmarkNode* parent) {
|
| - return bookmark_model_->AddURL(parent,
|
| - 0, // index.
|
| - base::ASCIIToUTF16(name),
|
| - GURL(BOOKMARK_URL));
|
| + 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 bookmark_model_->AddFolder(parent, 0, base::ASCIIToUTF16(name));
|
| + return model_->AddFolder(parent, 0, base::ASCIIToUTF16(name));
|
| }
|
|
|
| - std::string GetVersionForNode(const BookmarkNode* node) {
|
| - std::string version;
|
| - if (!node->GetMetaInfo("stars.version", &version))
|
| + 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 version;
|
| + return value;
|
| }
|
|
|
| + scoped_ptr<base::MessageLoop> message_loop_;
|
| + scoped_ptr<bookmarks::TestBookmarkClient> bookmark_client_;
|
| scoped_ptr<BookmarkModel> bookmark_model_;
|
| - scoped_ptr<enhanced_bookmarks::EnhancedBookmarkModel> model_;
|
| + scoped_ptr<EnhancedBookmarkModel> model_;
|
| +
|
| + // EnhancedBookmarkModelObserver implementation:
|
| + virtual void EnhancedBookmarkModelLoaded() OVERRIDE { loaded_calls_++; }
|
| + virtual void EnhancedBookmarkModelShuttingDown() OVERRIDE {
|
| + shutting_down_calls_++;
|
| + }
|
| + virtual void EnhancedBookmarkAdded(const BookmarkNode* node) OVERRIDE {
|
| + added_calls_++;
|
| + last_added_ = node;
|
| + }
|
| + virtual void EnhancedBookmarkRemoved(const BookmarkNode* node) OVERRIDE {
|
| + removed_calls_++;
|
| + last_removed_ = node;
|
| + }
|
| + virtual void EnhancedBookmarkAllUserNodesRemoved() OVERRIDE {
|
| + all_user_nodes_removed_calls_++;
|
| + }
|
| + virtual 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 all_user_nodes_removed_calls_;
|
| + int remote_id_changed_calls_;
|
| +
|
| + // Observer parameter cache:
|
| + const BookmarkNode* last_added_;
|
| + const BookmarkNode* last_removed_;
|
| + const BookmarkNode* last_remote_id_node_;
|
| + std::string last_old_remote_id_;
|
| + std::string last_remote_id_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(EnhancedBookmarkModelTest);
|
| @@ -253,7 +331,7 @@ TEST_F(EnhancedBookmarkModelTest, TestEncodeDecode) {
|
| EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
|
| EXPECT_EQ(width, 22);
|
| EXPECT_EQ(height, 33);
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| + EXPECT_EQ("v1.0", GetVersion(node));
|
| }
|
|
|
| TEST_F(EnhancedBookmarkModelTest, TestDoubleEncodeDecode) {
|
| @@ -276,25 +354,26 @@ TEST_F(EnhancedBookmarkModelTest, TestDoubleEncodeDecode) {
|
| EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
|
| EXPECT_EQ(width, 33);
|
| EXPECT_EQ(height, 44);
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| + EXPECT_EQ("v1.0", GetVersion(node));
|
| }
|
|
|
| TEST_F(EnhancedBookmarkModelTest, TestRemoteId) {
|
| const BookmarkNode* node = AddBookmark();
|
| - const BookmarkNode* folder_node = AddFolder();
|
| -
|
| - std::string remote_id = model_->GetRemoteId(node);
|
| - // First call creates the UUID, second call should return the same.
|
| - EXPECT_EQ(remote_id, model_->GetRemoteId(node));
|
| -
|
| // Verify that the remote id starts with the correct prefix.
|
| - EXPECT_TRUE(StartsWithASCII(remote_id, "ebc_", true));
|
| - std::string folder_remote_id = model_->GetRemoteId(folder_node);
|
| - EXPECT_TRUE(StartsWithASCII(folder_remote_id, "ebf_", true));
|
| -
|
| - // Verifiy version field was set.
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| - EXPECT_EQ("v1.0", GetVersionForNode(folder_node));
|
| + 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) {
|
| @@ -313,7 +392,7 @@ TEST_F(EnhancedBookmarkModelTest, TestDescription) {
|
|
|
| // Check the description is the one that was set.
|
| EXPECT_EQ(model_->GetDescription(node), description);
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| + EXPECT_EQ("v1.0", GetVersion(node));
|
| }
|
|
|
| // If there is no notes field, the description should fall back on the snippet.
|
| @@ -349,10 +428,10 @@ TEST_F(EnhancedBookmarkModelTest, TestDescriptionFallback) {
|
| // EnhancedBookmarkModel makes a change to a node.
|
| TEST_F(EnhancedBookmarkModelTest, TestVersionField) {
|
| const BookmarkNode* node = AddBookmark();
|
| - EXPECT_EQ("", GetVersionForNode(node));
|
| + EXPECT_EQ("", GetVersion(node));
|
|
|
| model_->SetDescription(node, "foo");
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| + EXPECT_EQ("v1.0", GetVersion(node));
|
|
|
| // Add a suffix to the version to set.
|
| model_->SetVersionSuffix("alpha");
|
| @@ -360,21 +439,213 @@ TEST_F(EnhancedBookmarkModelTest, TestVersionField) {
|
| model_->SetDescription(node, "foo");
|
| // Since the description didn't actually change, the version field should
|
| // not either.
|
| - EXPECT_EQ("v1.0", GetVersionForNode(node));
|
| + EXPECT_EQ("v1.0", GetVersion(node));
|
|
|
| model_->SetDescription(node, "bar");
|
| - EXPECT_EQ("v1.0/alpha", GetVersionForNode(node));
|
| + 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 the stars.userEdit field is set appropriately when editing a
|
| -// node.
|
| -TEST_F(EnhancedBookmarkModelTest, TestUserEdit) {
|
| +// 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));
|
| +}
|
|
|
| - model_->SetDescription(node, "foo");
|
| - std::string user_edit;
|
| - ASSERT_TRUE(node->GetMetaInfo("stars.userEdit", &user_edit));
|
| - EXPECT_EQ("true", user_edit);
|
| +TEST_F(EnhancedBookmarkModelTest, ObserverShuttingDownEvent) {
|
| + EXPECT_EQ(0, shutting_down_calls_);
|
| + model_->ShutDown();
|
| + EXPECT_EQ(1, shutting_down_calls_);
|
| + model_.reset();
|
| }
|
|
|
| -} // namespace
|
| +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, 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();
|
| +}
|
|
|