bookmark_node_data_unittest.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/os_exchange_data.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/os_exchange_data_provider_win.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/bookmarks/bookmark_node_data.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_thread.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass BookmarkNodeDataTest : public testing::Test { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeDataTest() 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ui_thread_(BrowserThread::UI, &loop_), 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_thread_(BrowserThread::FILE, &loop_) { } 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop loop_; 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread ui_thread_; 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread file_thread_; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOSExchangeData::Provider* CloneProvider(const OSExchangeData& data) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new OSExchangeDataProviderWin( 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeDataProviderWin::GetIDataObject(data)); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Makes sure BookmarkNodeData is initially invalid. 40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, InitialState) { 41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData data; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(data.is_valid()); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Makes sure reading bogus data leaves the BookmarkNodeData invalid. 46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, BogusRead) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(drag_data.Read(OSExchangeData(CloneProvider(data)))); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(drag_data.is_valid()); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Writes a URL to the clipboard and make sure BookmarkNodeData can correctly 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// read it. 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, JustURL) { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL url("http://google.com"); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::wstring title(L"title"); 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.SetURL(url, title); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.Read(OSExchangeData(CloneProvider(data)))); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.is_valid()); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, drag_data.elements.size()); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.elements[0].is_url); 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(url, drag_data.elements[0].url); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(title, drag_data.elements[0].title); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, drag_data.elements[0].children.size()); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, URL) { 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Write a single node representing a URL to the clipboard. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestingProfile profile; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.CreateBookmarkModel(false); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.BlockUntilBookmarkModelLoaded(); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.SetID(L"id"); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkModel* model = profile.GetBookmarkModel(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* root = model->GetBookmarkBarNode(); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url(GURL("http://foo.com")); 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16 title(ASCIIToUTF16("blah")); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* node = model->AddURL(root, 0, title, url); 83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data(node); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.is_valid()); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, drag_data.elements.size()); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.elements[0].is_url); 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(url, drag_data.elements[0].url); 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(title, WideToUTF16Hack(drag_data.elements[0].title)); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch drag_data.Write(&profile, &data); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now read the data back in. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data2(CloneProvider(data)); 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData read_data; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.Read(data2)); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.is_valid()); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, read_data.elements.size()); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.elements[0].is_url); 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(url, read_data.elements[0].url); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(title, read_data.elements[0].title); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.GetFirstNode(&profile) == node); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure asking for the node with a different profile returns NULL. 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestingProfile profile2; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.GetFirstNode(&profile2) == NULL); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Writing should also put the URL and title on the clipboard. 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL read_url; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring read_title; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(data2.GetURLAndTitle(&read_url, &read_title)); 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(url, read_url); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(title, read_title); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests writing a group to the clipboard. 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, Group) { 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestingProfile profile; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.CreateBookmarkModel(false); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.BlockUntilBookmarkModelLoaded(); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.SetID(L"id"); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkModel* model = profile.GetBookmarkModel(); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* root = model->GetBookmarkBarNode(); 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BookmarkNode* g1 = model->AddGroup(root, 0, ASCIIToUTF16("g1")); 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BookmarkNode* g11 = model->AddGroup(g1, 0, ASCIIToUTF16("g11")); 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BookmarkNode* g12 = model->AddGroup(g1, 0, ASCIIToUTF16("g12")); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data(g12); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(drag_data.is_valid()); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, drag_data.elements.size()); 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(g12->GetTitle(), WideToUTF16Hack(drag_data.elements[0].title)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(drag_data.elements[0].is_url); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch drag_data.Write(&profile, &data); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now read the data back in. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data2(CloneProvider(data)); 138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData read_data; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.Read(data2)); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.is_valid()); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, read_data.elements.size()); 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(g12->GetTitle(), WideToUTF16Hack(read_data.elements[0].title)); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(read_data.elements[0].is_url); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should get back the same node when asking for the same profile. 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* r_g12 = read_data.GetFirstNode(&profile); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(g12 == r_g12); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A different profile should return NULL for the node. 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestingProfile profile2; 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.GetFirstNode(&profile2) == NULL); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests reading/writing a folder with children. 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, GroupWithChild) { 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestingProfile profile; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.SetID(L"id"); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.CreateBookmarkModel(false); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.BlockUntilBookmarkModelLoaded(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkModel* model = profile.GetBookmarkModel(); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* root = model->GetBookmarkBarNode(); 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BookmarkNode* group = model->AddGroup(root, 0, ASCIIToUTF16("g1")); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url(GURL("http://foo.com")); 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16 title(ASCIIToUTF16("blah2")); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch model->AddURL(group, 0, title, url); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data(group); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch drag_data.Write(&profile, &data); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now read the data back in. 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data2(CloneProvider(data)); 176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData read_data; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.Read(data2)); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, read_data.elements.size()); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, read_data.elements[0].children.size()); 180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const BookmarkNodeData::Element& read_child = 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch read_data.elements[0].children[0]; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_child.is_url); 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(title, WideToUTF16Hack(read_child.title)); 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(url, read_child.url); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_child.is_url); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And make sure we get the node back. 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* r_group = read_data.GetFirstNode(&profile); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(group == r_group); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests reading/writing of multiple nodes. 194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, MultipleNodes) { 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestingProfile profile; 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.SetID(L"id"); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.CreateBookmarkModel(false); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile.BlockUntilBookmarkModelLoaded(); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkModel* model = profile.GetBookmarkModel(); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* root = model->GetBookmarkBarNode(); 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BookmarkNode* group = model->AddGroup(root, 0, ASCIIToUTF16("g1")); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url(GURL("http://foo.com")); 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16 title(ASCIIToUTF16("blah2")); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* url_node = model->AddURL(group, 0, title, url); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Write the nodes to the clipboard. 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<const BookmarkNode*> nodes; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nodes.push_back(group); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nodes.push_back(url_node); 212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData drag_data(nodes); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data; 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch drag_data.Write(&profile, &data); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Read the data back in. 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OSExchangeData data2(CloneProvider(data)); 218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData read_data; 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.Read(data2)); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.is_valid()); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2, read_data.elements.size()); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1, read_data.elements[0].children.size()); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const BookmarkNodeData::Element& read_group = read_data.elements[0]; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(read_group.is_url); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(L"g1", read_group.title); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, read_group.children.size()); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const BookmarkNodeData::Element& read_url = read_data.elements[1]; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_url.is_url); 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(title, WideToUTF16Hack(read_url.title)); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, read_url.children.size()); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // And make sure we get the node back. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<const BookmarkNode*> read_nodes = read_data.GetNodes(&profile); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2, read_nodes.size()); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_nodes[0] == group); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_nodes[1] == url_node); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Asking for the first node should return NULL with more than one element 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // present. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(read_data.GetFirstNode(&profile) == NULL); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 244