Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / components / bookmarks / browser / bookmark_node_data_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/files/scoped_temp_dir.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/string16.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "components/bookmarks/browser/bookmark_model.h"
11 #include "components/bookmarks/browser/bookmark_node_data.h"
12 #include "components/bookmarks/test/bookmark_test_helpers.h"
13 #include "components/bookmarks/test/test_bookmark_client.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/base/dragdrop/os_exchange_data.h"
16 #include "ui/events/platform/platform_event_source.h"
17 #include "url/gurl.h"
18
19 using base::ASCIIToUTF16;
20
21 namespace bookmarks {
22
23 class BookmarkNodeDataTest : public testing::Test {
24  public:
25   BookmarkNodeDataTest() {}
26
27   virtual void SetUp() OVERRIDE {
28     event_source_ = ui::PlatformEventSource::CreateDefault();
29     model_ = client_.CreateModel();
30     test::WaitForBookmarkModelToLoad(model_.get());
31     bool success = profile_dir_.CreateUniqueTempDir();
32     ASSERT_TRUE(success);
33   }
34
35   virtual void TearDown() OVERRIDE {
36     model_.reset();
37     event_source_.reset();
38     bool success = profile_dir_.Delete();
39     ASSERT_TRUE(success);
40   }
41
42   const base::FilePath& GetProfilePath() const { return profile_dir_.path(); }
43
44   BookmarkModel* model() { return model_.get(); }
45
46  private:
47   base::ScopedTempDir profile_dir_;
48   TestBookmarkClient client_;
49   scoped_ptr<BookmarkModel> model_;
50   scoped_ptr<ui::PlatformEventSource> event_source_;
51
52   DISALLOW_COPY_AND_ASSIGN(BookmarkNodeDataTest);
53 };
54
55 namespace {
56
57 ui::OSExchangeData::Provider* CloneProvider(const ui::OSExchangeData& data) {
58   return data.provider().Clone();
59 }
60
61 }  // namespace
62
63 // Makes sure BookmarkNodeData is initially invalid.
64 TEST_F(BookmarkNodeDataTest, InitialState) {
65   BookmarkNodeData data;
66   EXPECT_FALSE(data.is_valid());
67 }
68
69 // Makes sure reading bogus data leaves the BookmarkNodeData invalid.
70 TEST_F(BookmarkNodeDataTest, BogusRead) {
71   ui::OSExchangeData data;
72   BookmarkNodeData drag_data;
73   EXPECT_FALSE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
74   EXPECT_FALSE(drag_data.is_valid());
75 }
76
77 // Writes a URL to the clipboard and make sure BookmarkNodeData can correctly
78 // read it.
79 TEST_F(BookmarkNodeDataTest, JustURL) {
80   const GURL url("http://google.com");
81   const base::string16 title(ASCIIToUTF16("google.com"));
82
83   ui::OSExchangeData data;
84   data.SetURL(url, title);
85
86   BookmarkNodeData drag_data;
87   EXPECT_TRUE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
88   EXPECT_TRUE(drag_data.is_valid());
89   ASSERT_EQ(1u, drag_data.elements.size());
90   EXPECT_TRUE(drag_data.elements[0].is_url);
91   EXPECT_EQ(url, drag_data.elements[0].url);
92   EXPECT_EQ(title, drag_data.elements[0].title);
93   EXPECT_TRUE(drag_data.elements[0].date_added.is_null());
94   EXPECT_TRUE(drag_data.elements[0].date_folder_modified.is_null());
95   EXPECT_EQ(0u, drag_data.elements[0].children.size());
96 }
97
98 TEST_F(BookmarkNodeDataTest, URL) {
99   // Write a single node representing a URL to the clipboard.
100   const BookmarkNode* root = model()->bookmark_bar_node();
101   GURL url(GURL("http://foo.com"));
102   const base::string16 title(ASCIIToUTF16("foo.com"));
103   const BookmarkNode* node = model()->AddURL(root, 0, title, url);
104   BookmarkNodeData drag_data(node);
105   EXPECT_TRUE(drag_data.is_valid());
106   ASSERT_EQ(1u, drag_data.elements.size());
107   EXPECT_TRUE(drag_data.elements[0].is_url);
108   EXPECT_EQ(url, drag_data.elements[0].url);
109   EXPECT_EQ(title, drag_data.elements[0].title);
110   EXPECT_EQ(node->date_added(), drag_data.elements[0].date_added);
111   EXPECT_EQ(node->date_folder_modified(),
112             drag_data.elements[0].date_folder_modified);
113   ui::OSExchangeData data;
114   drag_data.Write(GetProfilePath(), &data);
115
116   // Now read the data back in.
117   ui::OSExchangeData data2(CloneProvider(data));
118   BookmarkNodeData read_data;
119   EXPECT_TRUE(read_data.Read(data2));
120   EXPECT_TRUE(read_data.is_valid());
121   ASSERT_EQ(1u, read_data.elements.size());
122   EXPECT_TRUE(read_data.elements[0].is_url);
123   EXPECT_EQ(url, read_data.elements[0].url);
124   EXPECT_EQ(title, read_data.elements[0].title);
125   EXPECT_TRUE(read_data.elements[0].date_added.is_null());
126   EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
127   EXPECT_TRUE(read_data.GetFirstNode(model(), GetProfilePath()) == node);
128
129   // Make sure asking for the node with a different profile returns NULL.
130   base::ScopedTempDir other_profile_dir;
131   EXPECT_TRUE(other_profile_dir.CreateUniqueTempDir());
132   EXPECT_TRUE(read_data.GetFirstNode(model(), other_profile_dir.path()) ==
133               NULL);
134
135   // Writing should also put the URL and title on the clipboard.
136   GURL read_url;
137   base::string16 read_title;
138   EXPECT_TRUE(data2.GetURLAndTitle(
139       ui::OSExchangeData::CONVERT_FILENAMES, &read_url, &read_title));
140   EXPECT_EQ(url, read_url);
141   EXPECT_EQ(title, read_title);
142 }
143
144 // Tests writing a folder to the clipboard.
145 TEST_F(BookmarkNodeDataTest, Folder) {
146   const BookmarkNode* root = model()->bookmark_bar_node();
147   const BookmarkNode* g1 = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
148   model()->AddFolder(g1, 0, ASCIIToUTF16("g11"));
149   const BookmarkNode* g12 = model()->AddFolder(g1, 0, ASCIIToUTF16("g12"));
150
151   BookmarkNodeData drag_data(g12);
152   EXPECT_TRUE(drag_data.is_valid());
153   ASSERT_EQ(1u, drag_data.elements.size());
154   EXPECT_EQ(g12->GetTitle(), drag_data.elements[0].title);
155   EXPECT_FALSE(drag_data.elements[0].is_url);
156   EXPECT_EQ(g12->date_added(), drag_data.elements[0].date_added);
157   EXPECT_EQ(g12->date_folder_modified(),
158             drag_data.elements[0].date_folder_modified);
159
160   ui::OSExchangeData data;
161   drag_data.Write(GetProfilePath(), &data);
162
163   // Now read the data back in.
164   ui::OSExchangeData data2(CloneProvider(data));
165   BookmarkNodeData read_data;
166   EXPECT_TRUE(read_data.Read(data2));
167   EXPECT_TRUE(read_data.is_valid());
168   ASSERT_EQ(1u, read_data.elements.size());
169   EXPECT_EQ(g12->GetTitle(), read_data.elements[0].title);
170   EXPECT_FALSE(read_data.elements[0].is_url);
171   EXPECT_TRUE(read_data.elements[0].date_added.is_null());
172   EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
173
174   // We should get back the same node when asking for the same profile.
175   const BookmarkNode* r_g12 = read_data.GetFirstNode(model(), GetProfilePath());
176   EXPECT_TRUE(g12 == r_g12);
177
178   // A different profile should return NULL for the node.
179   base::ScopedTempDir other_profile_dir;
180   EXPECT_TRUE(other_profile_dir.CreateUniqueTempDir());
181   EXPECT_TRUE(read_data.GetFirstNode(model(), other_profile_dir.path()) ==
182               NULL);
183 }
184
185 // Tests reading/writing a folder with children.
186 TEST_F(BookmarkNodeDataTest, FolderWithChild) {
187   const BookmarkNode* root = model()->bookmark_bar_node();
188   const BookmarkNode* folder = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
189
190   GURL url(GURL("http://foo.com"));
191   const base::string16 title(ASCIIToUTF16("blah2"));
192
193   model()->AddURL(folder, 0, title, url);
194
195   BookmarkNodeData drag_data(folder);
196
197   ui::OSExchangeData data;
198   drag_data.Write(GetProfilePath(), &data);
199
200   // Now read the data back in.
201   ui::OSExchangeData data2(CloneProvider(data));
202   BookmarkNodeData read_data;
203   EXPECT_TRUE(read_data.Read(data2));
204   ASSERT_EQ(1u, read_data.elements.size());
205   ASSERT_EQ(1u, read_data.elements[0].children.size());
206   const BookmarkNodeData::Element& read_child =
207       read_data.elements[0].children[0];
208
209   EXPECT_TRUE(read_child.is_url);
210   EXPECT_EQ(title, read_child.title);
211   EXPECT_EQ(url, read_child.url);
212   EXPECT_TRUE(read_data.elements[0].date_added.is_null());
213   EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
214   EXPECT_TRUE(read_child.is_url);
215
216   // And make sure we get the node back.
217   const BookmarkNode* r_folder =
218       read_data.GetFirstNode(model(), GetProfilePath());
219   EXPECT_TRUE(folder == r_folder);
220 }
221
222 // Tests reading/writing of multiple nodes.
223 TEST_F(BookmarkNodeDataTest, MultipleNodes) {
224   const BookmarkNode* root = model()->bookmark_bar_node();
225   const BookmarkNode* folder = model()->AddFolder(root, 0, ASCIIToUTF16("g1"));
226
227   GURL url(GURL("http://foo.com"));
228   const base::string16 title(ASCIIToUTF16("blah2"));
229
230   const BookmarkNode* url_node = model()->AddURL(folder, 0, title, url);
231
232   // Write the nodes to the clipboard.
233   std::vector<const BookmarkNode*> nodes;
234   nodes.push_back(folder);
235   nodes.push_back(url_node);
236   BookmarkNodeData drag_data(nodes);
237   ui::OSExchangeData data;
238   drag_data.Write(GetProfilePath(), &data);
239
240   // Read the data back in.
241   ui::OSExchangeData data2(CloneProvider(data));
242   BookmarkNodeData read_data;
243   EXPECT_TRUE(read_data.Read(data2));
244   EXPECT_TRUE(read_data.is_valid());
245   ASSERT_EQ(2u, read_data.elements.size());
246   ASSERT_EQ(1u, read_data.elements[0].children.size());
247   EXPECT_TRUE(read_data.elements[0].date_added.is_null());
248   EXPECT_TRUE(read_data.elements[0].date_folder_modified.is_null());
249
250   const BookmarkNodeData::Element& read_folder = read_data.elements[0];
251   EXPECT_FALSE(read_folder.is_url);
252   EXPECT_EQ(ASCIIToUTF16("g1"), read_folder.title);
253   EXPECT_EQ(1u, read_folder.children.size());
254
255   const BookmarkNodeData::Element& read_url = read_data.elements[1];
256   EXPECT_TRUE(read_url.is_url);
257   EXPECT_EQ(title, read_url.title);
258   EXPECT_EQ(0u, read_url.children.size());
259
260   // And make sure we get the node back.
261   std::vector<const BookmarkNode*> read_nodes =
262       read_data.GetNodes(model(), GetProfilePath());
263   ASSERT_EQ(2u, read_nodes.size());
264   EXPECT_TRUE(read_nodes[0] == folder);
265   EXPECT_TRUE(read_nodes[1] == url_node);
266
267   // Asking for the first node should return NULL with more than one element
268   // present.
269   EXPECT_TRUE(read_data.GetFirstNode(model(), GetProfilePath()) == NULL);
270 }
271
272 // Tests reading/writing of meta info.
273 TEST_F(BookmarkNodeDataTest, MetaInfo) {
274   // Create a node containing meta info.
275   const BookmarkNode* node = model()->AddURL(model()->other_node(),
276                                              0,
277                                              ASCIIToUTF16("foo bar"),
278                                              GURL("http://www.google.com"));
279   model()->SetNodeMetaInfo(node, "somekey", "somevalue");
280   model()->SetNodeMetaInfo(node, "someotherkey", "someothervalue");
281
282   BookmarkNodeData node_data(node);
283   ui::OSExchangeData data;
284   node_data.Write(GetProfilePath(), &data);
285
286   // Read the data back in.
287   ui::OSExchangeData data2(CloneProvider(data));
288   BookmarkNodeData read_data;
289   EXPECT_TRUE(read_data.Read(data2));
290   EXPECT_TRUE(read_data.is_valid());
291   ASSERT_EQ(1u, read_data.elements.size());
292
293   // Verify that the read data contains the same meta info.
294   BookmarkNode::MetaInfoMap meta_info_map = read_data.elements[0].meta_info_map;
295   EXPECT_EQ(2u, meta_info_map.size());
296   EXPECT_EQ("somevalue", meta_info_map["somekey"]);
297   EXPECT_EQ("someothervalue", meta_info_map["someotherkey"]);
298 }
299
300 }  // namespace bookmarks