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