11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/enhanced_bookmark_model.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/base64.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/utf_string_conversions.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/browser/bookmark_model.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/browser/bookmark_node.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/test/test_bookmark_client.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/enhanced_bookmark_model_observer.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/proto/metadata.pb.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing enhanced_bookmarks::EnhancedBookmarkModel;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst std::string BOOKMARK_URL("http://example.com/index.html");
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EnhancedBookmarkModelTest
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public testing::Test,
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      public enhanced_bookmarks::EnhancedBookmarkModelObserver {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EnhancedBookmarkModelTest()
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : loaded_calls_(0),
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        shutting_down_calls_(0),
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        added_calls_(0),
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        removed_calls_(0),
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        all_user_nodes_removed_calls_(0),
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        remote_id_changed_calls_(0),
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        last_added_(NULL),
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        last_removed_(NULL),
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        last_remote_id_node_(NULL) {}
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~EnhancedBookmarkModelTest() {}
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_DEFAULT));
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bookmark_client_.reset(new bookmarks::TestBookmarkClient());
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bookmark_model_.reset(bookmark_client_->CreateModel().release());
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    model_.reset(new EnhancedBookmarkModel(bookmark_model_.get(), "v1.0"));
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    model_->AddObserver(this);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void TearDown() OVERRIDE {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (model_)
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      model_->Shutdown();
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    model_.reset();
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bookmark_model_.reset();
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bookmark_client_.reset();
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    message_loop_.reset();
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* AddBookmark() {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return AddBookmark("Some title", bookmark_model_->other_node());
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* AddFolder() {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return AddFolder("Some title", bookmark_model_->other_node());
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* AddBookmark(const std::string& name,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  const BookmarkNode* parent) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return model_->AddURL(parent,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          0,  // index.
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::ASCIIToUTF16(name),
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          GURL(BOOKMARK_URL),
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::Time::Now());
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* AddFolder(const std::string& name,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                const BookmarkNode* parent) {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return model_->AddFolder(parent, 0, base::ASCIIToUTF16(name));
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetVersion(const BookmarkNode* node) {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GetMetaInfoField(node, "stars.version");
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetId(const BookmarkNode* node) {
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GetMetaInfoField(node, "stars.id");
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetOldId(const BookmarkNode* node) {
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GetMetaInfoField(node, "stars.oldId");
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetMetaInfoField(const BookmarkNode* node,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               const std::string& name) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string value;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!node->GetMetaInfo(name, &value))
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return std::string();
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return value;
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::MessageLoop> message_loop_;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<bookmarks::TestBookmarkClient> bookmark_client_;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<BookmarkModel> bookmark_model_;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<EnhancedBookmarkModel> model_;
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // EnhancedBookmarkModelObserver implementation:
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkModelLoaded() OVERRIDE { loaded_calls_++; }
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkModelShuttingDown() OVERRIDE {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    shutting_down_calls_++;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkAdded(const BookmarkNode* node) OVERRIDE {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    added_calls_++;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_added_ = node;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkRemoved(const BookmarkNode* node) OVERRIDE {
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    removed_calls_++;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_removed_ = node;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkAllUserNodesRemoved() OVERRIDE {
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    all_user_nodes_removed_calls_++;
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnhancedBookmarkRemoteIdChanged(
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const BookmarkNode* node,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& old_remote_id,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& remote_id) OVERRIDE {
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    remote_id_changed_calls_++;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_remote_id_node_ = node;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_old_remote_id_ = old_remote_id;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_remote_id_ = remote_id;
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Observer call counters:
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int loaded_calls_;
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int shutting_down_calls_;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int added_calls_;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int removed_calls_;
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int all_user_nodes_removed_calls_;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int remote_id_changed_calls_;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Observer parameter cache:
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* last_added_;
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* last_removed_;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* last_remote_id_node_;
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string last_old_remote_id_;
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string last_remote_id_;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(EnhancedBookmarkModelTest);
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestEmptySnippet) {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string snippet(model_->GetSnippet(node));
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(snippet, "");
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestSnippet) {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Binary serialize the protobuf.
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::PageData data;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_snippet("I'm happy!");
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(data.IsInitialized());
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializeToString(&output);
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", encoded);
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string snippet(model_->GetSnippet(node));
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(snippet, "I'm happy!");
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestBadEncodingSnippet) {
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Binary serialize the protobuf.
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::PageData data;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_snippet("You are happy!");
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(data.IsInitialized());
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializeToString(&output);
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // don't base 64 encode the output.
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", output);
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string snippet(model_->GetSnippet(node));
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(snippet, "");
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestOriginalImage) {
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData data;
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Intentionally make raw pointer.
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData_ImageInfo* info =
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new image::collections::ImageData_ImageInfo;
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_url("http://example.com/foobar");
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_width(15);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_height(55);
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This method consumes the pointer.
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_allocated_original_info(info);
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializePartialToString(&output);
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetOriginalImage(node, &url, &width, &height);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(url, GURL("http://example.com/foobar"));
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(width, 15);
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(height, 55);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestThumbnailImage) {
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData data;
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Intentionally make raw pointer.
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData_ImageInfo* info =
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new image::collections::ImageData_ImageInfo;
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_url("http://example.com/foobar");
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_width(15);
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_height(55);
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This method consumes the pointer.
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_allocated_thumbnail_info(info);
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializePartialToString(&output);
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetThumbnailImage(node, &url, &width, &height);
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(url, GURL("http://example.com/foobar"));
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(width, 15);
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(height, 55);
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestOriginalImageMissingDimensions) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData data;
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Intentionally make raw pointer.
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData_ImageInfo* info =
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new image::collections::ImageData_ImageInfo;
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_url("http://example.com/foobar");
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This method consumes the pointer.
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_allocated_original_info(info);
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializePartialToString(&output);
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetOriginalImage(node, &url, &width, &height);
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(result);
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestOriginalImageBadUrl) {
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData data;
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Intentionally make raw pointer.
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::ImageData_ImageInfo* info =
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new image::collections::ImageData_ImageInfo;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_url("asdf. 13r");
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_width(15);
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  info->set_height(55);
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This method consumes the pointer.
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_allocated_original_info(info);
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializePartialToString(&output);
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.imageData", encoded);
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetOriginalImage(node, &url, &width, &height);
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(result);
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestEncodeDecode) {
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result =
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 22, 33);
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetOriginalImage(node, &url, &width, &height);
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(width, 22);
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(height, 33);
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node));
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestDoubleEncodeDecode) {
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Encode some information.
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result =
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 22, 33);
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Encode some different information.
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result =
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      model_->SetOriginalImage(node, GURL("http://example.com/i.jpg"), 33, 44);
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL url;
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int width;
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int height;
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = model_->GetOriginalImage(node, &url, &width, &height);
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(url, GURL("http://example.com/i.jpg"));
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(width, 33);
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(height, 44);
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node));
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestRemoteId) {
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Verify that the remote id starts with the correct prefix.
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(StartsWithASCII(model_->GetRemoteId(node), "ebc_", true));
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Getting the remote id for nodes that don't have them should return the
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // empty string.
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* existing_node =
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmark_model_->AddURL(bookmark_model_->other_node(),
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              0,
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              base::ASCIIToUTF16("Title"),
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              GURL(GURL(BOOKMARK_URL)));
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(model_->GetRemoteId(existing_node).empty());
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Folder nodes should not have a remote id set on creation.
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* folder_node = AddFolder();
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(model_->GetRemoteId(folder_node).empty());
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestEmptyDescription) {
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string description(model_->GetDescription(node));
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(description, "");
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestDescription) {
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string description("This is the most useful description of all.");
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set the description.
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetDescription(node, description);
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check the description is the one that was set.
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(model_->GetDescription(node), description);
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node));
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// If there is no notes field, the description should fall back on the snippet.
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestDescriptionFallback) {
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Binary serialize the protobuf.
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  image::collections::PageData data;
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  data.set_snippet("Joe Bar Team");
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(data.IsInitialized());
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string output;
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool result = data.SerializeToString(&output);
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(result);
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // base64 encode the output.
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string encoded;
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Base64Encode(output, &encoded);
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node, "stars.pageData", encoded);
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The snippet is used as the description.
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string snippet(model_->GetSnippet(node));
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("Joe Bar Team", model_->GetDescription(node));
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set the description.
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string description("This is the most useful description of all.");
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetDescription(node, description);
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check the description is the one that was set.
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(model_->GetDescription(node), description);
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Makes sure that the stars.version field is set every time
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// EnhancedBookmarkModel makes a change to a node.
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, TestVersionField) {
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetVersion(node));
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetDescription(node, "foo");
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node));
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Add a suffix to the version to set.
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetVersionSuffix("alpha");
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetDescription(node, "foo");
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Since the description didn't actually change, the version field should
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // not either.
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node));
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetDescription(node, "bar");
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0/alpha", GetVersion(node));
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that duplicate nodes are reset when the model is created.
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ResetDuplicateNodesOnInitialization) {
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->Shutdown();
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* parent = bookmark_model_->other_node();
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node1 = bookmark_model_->AddURL(
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node2 = bookmark_model_->AddURL(
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node3 = bookmark_model_->AddURL(
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node4 = bookmark_model_->AddURL(
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent, 0, base::ASCIIToUTF16("Some title"), GURL(BOOKMARK_URL));
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_2");
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node3, "stars.id", "c_1");
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node4, "stars.id", "c_1");
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetId(node1));
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_2", GetId(node2));
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetId(node3));
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetId(node4));
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_.reset(new EnhancedBookmarkModel(bookmark_model_.get(), "v2.0"));
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_2", GetId(node2));
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node1));
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node3));
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node4));
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node1));
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node3));
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node4));
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v2.0", GetVersion(node1));
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v2.0", GetVersion(node3));
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v2.0", GetVersion(node4));
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that duplicate nodes are reset if one is created.
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ResetDuplicateAddedNodes) {
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BookmarkNode::MetaInfoMap meta_info;
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  meta_info["stars.id"] = "c_1";
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* parent = bookmark_model_->other_node();
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node1 =
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          parent,
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          0,
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::ASCIIToUTF16("Some title"),
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL(BOOKMARK_URL),
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Time::Now(),
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &meta_info);
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetId(node1));
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node2 =
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmark_model_->AddURLWithCreationTimeAndMetaInfo(
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          parent,
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          0,
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::ASCIIToUTF16("Some title"),
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL(BOOKMARK_URL),
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Time::Now(),
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &meta_info);
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node1));
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node2));
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node1));
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node2));
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node1));
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node2));
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that duplicate nodes are reset if an id is changed to a duplicate
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// value.
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ResetDuplicateChangedNodes) {
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node1 = AddBookmark();
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node2 = AddBookmark();
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetId(node1));
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_1");
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node1));
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", GetId(node2));
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node1));
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", GetOldId(node2));
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node1));
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0", GetVersion(node2));
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, SetMultipleMetaInfo) {
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BookmarkNode::MetaInfoMap meta_info;
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  meta_info["a"] = "aa";
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  meta_info["b"] = "bb";
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetVersionSuffix("1");
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetMultipleMetaInfo(node, meta_info);
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("aa", GetMetaInfoField(node, "a"));
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("bb", GetMetaInfoField(node, "b"));
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0/1", GetVersion(node));
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Not present fields does not erase the fields already set on the node.
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  meta_info["a"] = "aaa";
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetVersionSuffix("2");
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetMultipleMetaInfo(node, meta_info);
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("aaa", GetMetaInfoField(node, "a"));
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("bb", GetMetaInfoField(node, "b"));
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0/2", GetVersion(node));
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Not actually changing any values should not set the version field.
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetVersionSuffix("3");
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->SetMultipleMetaInfo(node, meta_info);
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("v1.0/2", GetVersion(node));
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ObserverShuttingDownEvent) {
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, shutting_down_calls_);
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->Shutdown();
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, shutting_down_calls_);
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_.reset();
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ObserverNodeAddedEvent) {
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, added_calls_);
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, added_calls_);
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node, last_added_);
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* folder = AddFolder();
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, added_calls_);
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(folder, last_added_);
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ObserverNodeRemovedEvent) {
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node = AddBookmark();
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* folder = AddFolder();
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, removed_calls_);
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->Remove(node->parent(), node->parent()->GetIndexOf(node));
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, removed_calls_);
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node, last_removed_);
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->Remove(folder->parent(),
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          folder->parent()->GetIndexOf(folder));
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, removed_calls_);
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(folder, last_removed_);
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ObserverAllUserNodesRemovedEvent) {
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddBookmark();
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddFolder();
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, all_user_nodes_removed_calls_);
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->RemoveAllUserBookmarks();
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, removed_calls_);
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, all_user_nodes_removed_calls_);
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ObserverRemoteIdChangedEvent) {
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node1 = AddFolder();
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node2 = AddFolder();
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, remote_id_changed_calls_);
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, remote_id_changed_calls_);
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node1, last_remote_id_node_);
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", last_old_remote_id_);
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", last_remote_id_);
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_2");
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(2, remote_id_changed_calls_);
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node2, last_remote_id_node_);
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", last_old_remote_id_);
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_2", last_remote_id_);
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_3");
6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(3, remote_id_changed_calls_);
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node1, last_remote_id_node_);
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_1", last_old_remote_id_);
6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_3", last_remote_id_);
6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set to duplicate ids.
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_3");
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(4, remote_id_changed_calls_);
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(node2, last_remote_id_node_);
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_2", last_old_remote_id_);
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("c_3", last_remote_id_);
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(6, remote_id_changed_calls_);
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("", last_remote_id_);
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EnhancedBookmarkModelTest, ShutDownWhileResetDuplicationScheduled) {
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node1 = AddBookmark();
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* node2 = AddBookmark();
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node1, "stars.id", "c_1");
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmark_model_->SetNodeMetaInfo(node2, "stars.id", "c_1");
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->Shutdown();
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_.reset();
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
652