1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/basictypes.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_node_data.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/test_bookmark_client.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_source.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace bookmarks {
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkNodeDataTest : public testing::Test {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkNodeDataTest() {}
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    event_source_ = ui::PlatformEventSource::CreateDefault();
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    model_ = client_.CreateModel();
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test::WaitForBookmarkModelToLoad(model_.get());
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool success = profile_dir_.CreateUniqueTempDir();
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(success);
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    model_.reset();
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    event_source_.reset();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool success = profile_dir_.Delete();
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(success);
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath& GetProfilePath() const { return profile_dir_.path(); }
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BookmarkModel* model() { return model_.get(); }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir profile_dir_;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestBookmarkClient client_;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<BookmarkModel> model_;
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ui::PlatformEventSource> event_source_;
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkNodeDataTest);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::OSExchangeData::Provider* CloneProvider(const ui::OSExchangeData& data) {
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return data.provider().Clone();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure BookmarkNodeData is initially invalid.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, InitialState) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData data;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(data.is_valid());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure reading bogus data leaves the BookmarkNodeData invalid.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, BogusRead) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(drag_data.is_valid());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Writes a URL to the clipboard and make sure BookmarkNodeData can correctly
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// read it.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, JustURL) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("http://google.com");
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 title(ASCIIToUTF16("google.com"));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL(url, title);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.is_valid());
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, drag_data.elements.size());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.elements[0].is_url);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, drag_data.elements[0].url);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, drag_data.elements[0].title);
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(drag_data.elements[0].date_added.is_null());
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(drag_data.elements[0].date_folder_modified.is_null());
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(0u, drag_data.elements[0].children.size());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, URL) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write a single node representing a URL to the clipboard.
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* root = model()->bookmark_bar_node();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(GURL("http://foo.com"));
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 title(ASCIIToUTF16("foo.com"));
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* node = model()->AddURL(root, 0, title, url);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data(node);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.is_valid());
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, drag_data.elements.size());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.elements[0].is_url);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, drag_data.elements[0].url);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, drag_data.elements[0].title);
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(node->date_added(), drag_data.elements[0].date_added);
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(node->date_folder_modified(),
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            drag_data.elements[0].date_folder_modified);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_data.Write(GetProfilePath(), &data);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now read the data back in.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data2(CloneProvider(data));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData read_data;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.Read(data2));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.is_valid());
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements.size());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].is_url);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, read_data.elements[0].url);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, read_data.elements[0].title);
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_added.is_null());
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(read_data.GetFirstNode(model(), GetProfilePath()) == node);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure asking for the node with a different profile returns NULL.
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir other_profile_dir;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(other_profile_dir.CreateUniqueTempDir());
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(read_data.GetFirstNode(model(), other_profile_dir.path()) ==
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              NULL);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writing should also put the URL and title on the clipboard.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL read_url;
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 read_title;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(data2.GetURLAndTitle(
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::OSExchangeData::CONVERT_FILENAMES, &read_url, &read_title));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, read_url);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, read_title);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests writing a folder to the clipboard.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, Folder) {
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* root = model()->bookmark_bar_node();
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* g1 = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model()->AddFolder(g1, 0, ASCIIToUTF16("g11"));
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* g12 = model()->AddFolder(g1, 0, ASCIIToUTF16("g12"));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data(g12);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(drag_data.is_valid());
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, drag_data.elements.size());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(g12->GetTitle(), drag_data.elements[0].title);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(drag_data.elements[0].is_url);
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(g12->date_added(), drag_data.elements[0].date_added);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(g12->date_folder_modified(),
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            drag_data.elements[0].date_folder_modified);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_data.Write(GetProfilePath(), &data);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now read the data back in.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data2(CloneProvider(data));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData read_data;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.Read(data2));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.is_valid());
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements.size());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(g12->GetTitle(), read_data.elements[0].title);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(read_data.elements[0].is_url);
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_added.is_null());
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should get back the same node when asking for the same profile.
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const BookmarkNode* r_g12 = read_data.GetFirstNode(model(), GetProfilePath());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(g12 == r_g12);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A different profile should return NULL for the node.
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir other_profile_dir;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(other_profile_dir.CreateUniqueTempDir());
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(read_data.GetFirstNode(model(), other_profile_dir.path()) ==
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              NULL);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests reading/writing a folder with children.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, FolderWithChild) {
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* root = model()->bookmark_bar_node();
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* folder = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(GURL("http://foo.com"));
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 title(ASCIIToUTF16("blah2"));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model()->AddURL(folder, 0, title, url);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data(folder);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_data.Write(GetProfilePath(), &data);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now read the data back in.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data2(CloneProvider(data));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData read_data;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.Read(data2));
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements.size());
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements[0].children.size());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNodeData::Element& read_child =
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_data.elements[0].children[0];
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_child.is_url);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, read_child.title);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, read_child.url);
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_added.is_null());
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_child.is_url);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And make sure we get the node back.
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const BookmarkNode* r_folder =
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      read_data.GetFirstNode(model(), GetProfilePath());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(folder == r_folder);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests reading/writing of multiple nodes.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, MultipleNodes) {
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* root = model()->bookmark_bar_node();
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* folder = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(GURL("http://foo.com"));
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 title(ASCIIToUTF16("blah2"));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* url_node = model()->AddURL(folder, 0, title, url);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write the nodes to the clipboard.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const BookmarkNode*> nodes;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nodes.push_back(folder);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nodes.push_back(url_node);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData drag_data(nodes);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data;
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  drag_data.Write(GetProfilePath(), &data);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read the data back in.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::OSExchangeData data2(CloneProvider(data));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkNodeData read_data;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.Read(data2));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_data.is_valid());
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(2u, read_data.elements.size());
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements[0].children.size());
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_added.is_null());
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNodeData::Element& read_folder = read_data.elements[0];
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(read_folder.is_url);
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("g1"), read_folder.title);
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(1u, read_folder.children.size());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNodeData::Element& read_url = read_data.elements[1];
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_url.is_url);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, read_url.title);
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(0u, read_url.children.size());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And make sure we get the node back.
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<const BookmarkNode*> read_nodes =
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      read_data.GetNodes(model(), GetProfilePath());
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(2u, read_nodes.size());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_nodes[0] == folder);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(read_nodes[1] == url_node);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Asking for the first node should return NULL with more than one element
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // present.
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(read_data.GetFirstNode(model(), GetProfilePath()) == NULL);
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests reading/writing of meta info.
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(BookmarkNodeDataTest, MetaInfo) {
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a node containing meta info.
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const BookmarkNode* node = model()->AddURL(model()->other_node(),
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             0,
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             ASCIIToUTF16("foo bar"),
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             GURL("http://www.google.com"));
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model()->SetNodeMetaInfo(node, "somekey", "somevalue");
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model()->SetNodeMetaInfo(node, "someotherkey", "someothervalue");
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  BookmarkNodeData node_data(node);
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::OSExchangeData data;
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node_data.Write(GetProfilePath(), &data);
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Read the data back in.
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::OSExchangeData data2(CloneProvider(data));
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  BookmarkNodeData read_data;
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(read_data.Read(data2));
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(read_data.is_valid());
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1u, read_data.elements.size());
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify that the read data contains the same meta info.
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  BookmarkNode::MetaInfoMap meta_info_map = read_data.elements[0].meta_info_map;
295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(2u, meta_info_map.size());
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("somevalue", meta_info_map["somekey"]);
297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("someothervalue", meta_info_map["someotherkey"]);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace bookmarks
301