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 "components/enhanced_bookmarks/metadata_accessor.h" 6 7 #include "base/base64.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "components/bookmarks/browser/bookmark_model.h" 10 #include "components/bookmarks/test/test_bookmark_client.h" 11 #include "components/enhanced_bookmarks/proto/metadata.pb.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace { 15 16 using namespace image::collections; 17 18 const std::string BOOKMARK_URL("http://example.com/index.html"); 19 20 class MetadataAccessorTest : public testing::Test { 21 public: 22 MetadataAccessorTest() {} 23 virtual ~MetadataAccessorTest() {} 24 25 protected: 26 DISALLOW_COPY_AND_ASSIGN(MetadataAccessorTest); 27 28 // Adds a bookmark as the subnode at index 0 to other_node. 29 // |name| should be ASCII encoded. 30 // Returns the newly added bookmark. 31 const BookmarkNode* AddBookmark(BookmarkModel* model, std::string name) { 32 return model->AddURL(model->other_node(), 33 0, // index. 34 base::ASCIIToUTF16(name), 35 GURL(BOOKMARK_URL)); 36 } 37 }; 38 39 TEST_F(MetadataAccessorTest, TestEmptySnippet) { 40 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 41 42 std::string snippet(enhanced_bookmarks::SnippetFromBookmark(node.get())); 43 CHECK_EQ(snippet, ""); 44 }; 45 46 TEST_F(MetadataAccessorTest, TestSnippet) { 47 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 48 49 // Binary serialize the protobuf. 50 PageData data; 51 data.set_snippet("I'm happy!"); 52 ASSERT_TRUE(data.IsInitialized()); 53 std::string output; 54 bool result = data.SerializeToString(&output); 55 ASSERT_TRUE(result); 56 57 // base64 encode the output. 58 std::string encoded; 59 base::Base64Encode(output, &encoded); 60 node->SetMetaInfo(enhanced_bookmarks::kPageDataKey, encoded); 61 62 std::string snippet(enhanced_bookmarks::SnippetFromBookmark(node.get())); 63 CHECK_EQ(snippet, "I'm happy!"); 64 }; 65 66 TEST_F(MetadataAccessorTest, TestBadEncodingSnippet) { 67 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 68 69 // Binary serialize the protobuf. 70 PageData data; 71 data.set_snippet("You are happy!"); 72 ASSERT_TRUE(data.IsInitialized()); 73 std::string output; 74 bool result = data.SerializeToString(&output); 75 ASSERT_TRUE(result); 76 77 // don't base 64 encode the output. 78 node->SetMetaInfo(enhanced_bookmarks::kPageDataKey, output); 79 80 std::string snippet(enhanced_bookmarks::SnippetFromBookmark(node.get())); 81 CHECK_EQ(snippet, ""); 82 }; 83 84 TEST_F(MetadataAccessorTest, TestOriginalImage) { 85 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 86 87 ImageData data; 88 // Intentionally make raw pointer. 89 ImageData_ImageInfo* info = new ImageData_ImageInfo; 90 info->set_url("http://example.com/foobar"); 91 info->set_width(15); 92 info->set_height(55); 93 // This method consumes the pointer. 94 data.set_allocated_original_info(info); 95 96 std::string output; 97 bool result = data.SerializePartialToString(&output); 98 ASSERT_TRUE(result); 99 100 // base64 encode the output. 101 std::string encoded; 102 base::Base64Encode(output, &encoded); 103 node->SetMetaInfo(enhanced_bookmarks::kImageDataKey, encoded); 104 105 GURL url; 106 int width; 107 int height; 108 result = enhanced_bookmarks::OriginalImageFromBookmark( 109 node.get(), &url, &width, &height); 110 ASSERT_TRUE(result); 111 CHECK_EQ(url, GURL("http://example.com/foobar")); 112 CHECK_EQ(width, 15); 113 CHECK_EQ(height, 55); 114 }; 115 116 TEST_F(MetadataAccessorTest, TestThumbnailImage) { 117 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 118 119 ImageData data; 120 // Intentionally make raw pointer. 121 ImageData_ImageInfo* info = new ImageData_ImageInfo; 122 info->set_url("http://example.com/foobar"); 123 info->set_width(15); 124 info->set_height(55); 125 // This method consumes the pointer. 126 data.set_allocated_thumbnail_info(info); 127 128 std::string output; 129 bool result = data.SerializePartialToString(&output); 130 ASSERT_TRUE(result); 131 132 // base64 encode the output. 133 std::string encoded; 134 base::Base64Encode(output, &encoded); 135 node->SetMetaInfo(enhanced_bookmarks::kImageDataKey, encoded); 136 137 GURL url; 138 int width; 139 int height; 140 result = enhanced_bookmarks::ThumbnailImageFromBookmark( 141 node.get(), &url, &width, &height); 142 ASSERT_TRUE(result); 143 CHECK_EQ(url, GURL("http://example.com/foobar")); 144 CHECK_EQ(width, 15); 145 CHECK_EQ(height, 55); 146 }; 147 148 TEST_F(MetadataAccessorTest, TestOriginalImageMissingDimensions) { 149 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 150 151 ImageData data; 152 // Intentionally make raw pointer. 153 ImageData_ImageInfo* info = new ImageData_ImageInfo; 154 info->set_url("http://example.com/foobar"); 155 // This method consumes the pointer. 156 data.set_allocated_original_info(info); 157 158 std::string output; 159 bool result = data.SerializePartialToString(&output); 160 ASSERT_TRUE(result); 161 162 // base64 encode the output. 163 std::string encoded; 164 base::Base64Encode(output, &encoded); 165 node->SetMetaInfo(enhanced_bookmarks::kImageDataKey, encoded); 166 167 GURL url; 168 int width; 169 int height; 170 result = enhanced_bookmarks::OriginalImageFromBookmark( 171 node.get(), &url, &width, &height); 172 ASSERT_FALSE(result); 173 }; 174 175 TEST_F(MetadataAccessorTest, TestOriginalImageBadUrl) { 176 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 177 178 ImageData data; 179 // Intentionally make raw pointer. 180 ImageData_ImageInfo* info = new ImageData_ImageInfo; 181 info->set_url("asdf. 13r"); 182 info->set_width(15); 183 info->set_height(55); 184 // This method consumes the pointer. 185 data.set_allocated_original_info(info); 186 187 std::string output; 188 bool result = data.SerializePartialToString(&output); 189 ASSERT_TRUE(result); 190 191 // base64 encode the output. 192 std::string encoded; 193 base::Base64Encode(output, &encoded); 194 node->SetMetaInfo(enhanced_bookmarks::kImageDataKey, encoded); 195 196 GURL url; 197 int width; 198 int height; 199 result = enhanced_bookmarks::OriginalImageFromBookmark( 200 node.get(), &url, &width, &height); 201 ASSERT_FALSE(result); 202 }; 203 204 TEST_F(MetadataAccessorTest, TestEncodeDecode) { 205 test::TestBookmarkClient bookmark_client; 206 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 207 const BookmarkNode* node = 208 bookmark_model->AddURL(bookmark_model->other_node(), 209 0, // index. 210 base::ASCIIToUTF16("whatever"), 211 GURL(BOOKMARK_URL)); 212 213 bool result = enhanced_bookmarks::SetOriginalImageForBookmark( 214 bookmark_model.get(), node, GURL("http://example.com/i.jpg"), 22, 33); 215 ASSERT_TRUE(result); 216 217 GURL url; 218 int width; 219 int height; 220 result = enhanced_bookmarks::OriginalImageFromBookmark( 221 node, &url, &width, &height); 222 ASSERT_TRUE(result); 223 CHECK_EQ(url, GURL("http://example.com/i.jpg")); 224 CHECK_EQ(width, 22); 225 CHECK_EQ(height, 33); 226 }; 227 228 TEST_F(MetadataAccessorTest, TestDoubleEncodeDecode) { 229 test::TestBookmarkClient bookmark_client; 230 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 231 const BookmarkNode* node = 232 bookmark_model->AddURL(bookmark_model->other_node(), 233 0, // index. 234 base::ASCIIToUTF16("whatever"), 235 GURL(BOOKMARK_URL)); 236 237 // Encode some information. 238 bool result = enhanced_bookmarks::SetOriginalImageForBookmark( 239 bookmark_model.get(), node, GURL("http://example.com/i.jpg"), 22, 33); 240 ASSERT_TRUE(result); 241 // Encode some different information. 242 result = enhanced_bookmarks::SetOriginalImageForBookmark( 243 bookmark_model.get(), node, GURL("http://example.com/i.jpg"), 33, 44); 244 ASSERT_TRUE(result); 245 246 GURL url; 247 int width; 248 int height; 249 result = enhanced_bookmarks::OriginalImageFromBookmark( 250 node, &url, &width, &height); 251 ASSERT_TRUE(result); 252 CHECK_EQ(url, GURL("http://example.com/i.jpg")); 253 CHECK_EQ(width, 33); 254 CHECK_EQ(height, 44); 255 }; 256 257 TEST_F(MetadataAccessorTest, TestThumbnail) { 258 test::TestBookmarkClient bookmark_client; 259 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 260 const BookmarkNode* node = 261 bookmark_model->AddURL(bookmark_model->other_node(), 262 0, // index. 263 base::ASCIIToUTF16("whatever"), 264 GURL(BOOKMARK_URL)); 265 266 // Encode some information. 267 ASSERT_TRUE(enhanced_bookmarks::SetAllImagesForBookmark( 268 bookmark_model.get(), 269 node, 270 GURL(), 271 0, 272 0, 273 GURL("http://google.com/img/thumb.jpg"), 274 33, 275 44)); 276 GURL url; 277 int width; 278 int height; 279 bool result = enhanced_bookmarks::ThumbnailImageFromBookmark( 280 node, &url, &width, &height); 281 ASSERT_TRUE(result); 282 CHECK_EQ(url, GURL("http://google.com/img/thumb.jpg")); 283 CHECK_EQ(width, 33); 284 CHECK_EQ(height, 44); 285 }; 286 287 TEST_F(MetadataAccessorTest, TestRemoteId) { 288 test::TestBookmarkClient bookmark_client; 289 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 290 const BookmarkNode* node = AddBookmark(bookmark_model.get(), "Aga Khan"); 291 292 // First call creates the UUID, second call should return the same. 293 ASSERT_EQ( 294 enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model.get(), node), 295 enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model.get(), node)); 296 } 297 298 TEST_F(MetadataAccessorTest, TestEmptyDescription) { 299 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 300 301 std::string description( 302 enhanced_bookmarks::DescriptionFromBookmark(node.get())); 303 CHECK_EQ(description, ""); 304 } 305 306 TEST_F(MetadataAccessorTest, TestDescription) { 307 test::TestBookmarkClient bookmark_client; 308 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 309 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 310 const std::string description("This is the most useful description of all."); 311 312 // Set the description. 313 enhanced_bookmarks::SetDescriptionForBookmark( 314 bookmark_model.get(), node.get(), description); 315 316 // Check the description is the one that was set. 317 CHECK_EQ(enhanced_bookmarks::DescriptionFromBookmark(node.get()), 318 description); 319 } 320 321 // If there is no notes field, the description should fall back on the snippet. 322 TEST_F(MetadataAccessorTest, TestDescriptionFallback) { 323 test::TestBookmarkClient bookmark_client; 324 scoped_ptr<BookmarkModel> bookmark_model(bookmark_client.CreateModel(false)); 325 scoped_ptr<BookmarkNode> node(new BookmarkNode(GURL(BOOKMARK_URL))); 326 327 // Binary serialize the protobuf. 328 PageData data; 329 data.set_snippet("Joe Bar Team"); 330 ASSERT_TRUE(data.IsInitialized()); 331 std::string output; 332 bool result = data.SerializeToString(&output); 333 ASSERT_TRUE(result); 334 335 // base64 encode the output. 336 std::string encoded; 337 base::Base64Encode(output, &encoded); 338 node->SetMetaInfo(enhanced_bookmarks::kPageDataKey, encoded); 339 340 // The snippet is used as the description. 341 std::string snippet(enhanced_bookmarks::SnippetFromBookmark(node.get())); 342 CHECK_EQ("Joe Bar Team", 343 enhanced_bookmarks::DescriptionFromBookmark(node.get())); 344 345 // Set the description. 346 const std::string description("This is the most useful description of all."); 347 enhanced_bookmarks::SetDescriptionForBookmark( 348 bookmark_model.get(), node.get(), description); 349 350 // Check the description is the one that was set. 351 CHECK_EQ(enhanced_bookmarks::DescriptionFromBookmark(node.get()), 352 description); 353 } 354 } // namespace 355