1 // Copyright (c) 2011 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 "testing/gtest/include/gtest/gtest.h" 6 7 #include <string> 8 #include <vector> 9 10 #include "base/string16.h" 11 #include "base/string_util.h" 12 #include "base/utf_string_conversions.h" 13 #include "chrome/browser/first_run/first_run.h" 14 #include "chrome/browser/importer/toolbar_importer.h" 15 #include "chrome/common/libxml_utils.h" 16 #include "googleurl/src/gurl.h" 17 18 // See http://crbug.com/11838 19 TEST(Toolbar5ImporterTest, BookmarkParse) { 20 static const string16 kTitle = ASCIIToUTF16("MyTitle"); 21 static const char kUrl[] = "http://www.google.com/"; 22 static const string16 kFolder = ASCIIToUTF16("Google"); 23 static const string16 kFolder2 = ASCIIToUTF16("Homepage"); 24 static const string16 kFolderArray[3] = { 25 ASCIIToUTF16("Google"), 26 ASCIIToUTF16("Search"), 27 ASCIIToUTF16("Page") 28 }; 29 static const string16 kOtherTitle = ASCIIToUTF16("MyOtherTitle"); 30 static const char* kOtherUrl = "http://www.google.com/mail"; 31 static const string16 kOtherFolder = ASCIIToUTF16("Mail"); 32 33 static const string16 kBookmarkGroupTitle = ASCIIToUTF16("BookmarkGroupTitle"); 34 35 // Since the following is very dense to read I enumerate the test cases here. 36 // 1. Correct bookmark structure with one label. 37 // 2. Correct bookmark structure with no labels. 38 // 3. Correct bookmark structure with two labels. 39 // 4. Correct bookmark structure with a folder->label translation by toolbar. 40 // 5. Correct bookmark structure with no favicon. 41 // 6. Two correct bookmarks. 42 // The following are error cases by removing sections from the xml: 43 // 7. Empty string passed as xml. 44 // 8. No <bookmarks> section in the xml. 45 // 9. No <bookmark> section below the <bookmarks> section. 46 // 10. No <title> in a <bookmark> section. 47 // 11. No <url> in a <bookmark> section. 48 // 12. No <timestamp> in a <bookmark> section. 49 // 13. No <labels> in a <bookmark> section. 50 static const char* kGoodBookmark = 51 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 52 " <bookmark> " 53 "<title>MyTitle</title> " 54 "<url>http://www.google.com/</url> " 55 "<timestamp>1153328691085181</timestamp> " 56 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 57 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 58 "<labels> <label>Google</label> </labels> " 59 "<attributes> " 60 "<attribute> " 61 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 62 "</attribute> " 63 "<attribute> " 64 "<name>favicon_timestamp</name> <value>1153328653</value> " 65 "</attribute> " 66 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 67 "</attribute> " 68 "<attribute> <name>section_name</name> <value>My section 0 " 69 "</value> </attribute> </attributes> " 70 "</bookmark> </bookmarks>"; 71 static const char* kGoodBookmarkNoLabel = 72 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 73 " <bookmark> " 74 "<title>MyTitle</title> " 75 "<url>http://www.google.com/</url> " 76 "<timestamp>1153328691085181</timestamp> " 77 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 78 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 79 "<labels> </labels> " 80 "<attributes> " 81 "<attribute> " 82 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 83 "</attribute> " 84 "<attribute> " 85 "<name>favicon_timestamp</name> <value>1153328653</value> " 86 "</attribute> " 87 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 88 "</attribute> " 89 "<attribute> <name>section_name</name> <value>My section 0 " 90 "</value> </attribute> </attributes> " 91 "</bookmark> </bookmarks>"; 92 static const char* kGoodBookmarkTwoLabels = 93 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 94 " <bookmark> " 95 "<title>MyTitle</title> " 96 "<url>http://www.google.com/</url> " 97 "<timestamp>1153328691085181</timestamp> " 98 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 99 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 100 "<labels> <label>Google</label> <label>Homepage</label> </labels> " 101 "<attributes> " 102 "<attribute> " 103 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 104 "</attribute> " 105 "<attribute> " 106 "<name>favicon_timestamp</name> <value>1153328653</value> " 107 "</attribute> " 108 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 109 "</attribute> " 110 "<attribute> <name>section_name</name> <value>My section 0 " 111 "</value> </attribute> </attributes> " 112 "</bookmark> </bookmarks>"; 113 static const char* kGoodBookmarkFolderLabel = 114 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 115 " <bookmark> " 116 "<title>MyTitle</title> " 117 "<url>http://www.google.com/</url> " 118 "<timestamp>1153328691085181</timestamp> " 119 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 120 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 121 "<labels> <label>Google:Search:Page</label> </labels> " 122 "<attributes> " 123 "<attribute> " 124 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 125 "</attribute> " 126 "<attribute> " 127 "<name>favicon_timestamp</name> <value>1153328653</value> " 128 "</attribute> " 129 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 130 "</attribute> " 131 "<attribute> <name>section_name</name> <value>My section 0 " 132 "</value> </attribute> </attributes> " 133 "</bookmark> </bookmarks>"; 134 static const char* kGoodBookmarkNoFavicon = 135 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 136 " <bookmark> " 137 "<title>MyTitle</title> " 138 "<url>http://www.google.com/</url> " 139 "<timestamp>1153328691085181</timestamp> " 140 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 141 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 142 "<labels> <label>Google</label> </labels> " 143 "<attributes> " 144 "<attribute> " 145 "<name>favicon_timestamp</name> <value>1153328653</value> " 146 "</attribute> " 147 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 148 "</attribute> " 149 "<attribute> <name>section_name</name> <value>My section 0 " 150 "</value> </attribute> </attributes> " 151 "</bookmark> </bookmarks>"; 152 static const char* kGoodBookmark2Items = 153 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 154 " <bookmark> " 155 "<title>MyTitle</title> " 156 "<url>http://www.google.com/</url> " 157 "<timestamp>1153328691085181</timestamp> " 158 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 159 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 160 "<labels> <label>Google</label> </labels> " 161 "<attributes> " 162 "<attribute> " 163 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 164 "</attribute> " 165 "<attribute> " 166 "<name>favicon_timestamp</name> <value>1153328653</value> " 167 "</attribute> " 168 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 169 "</attribute> " 170 "<attribute> <name>section_name</name> <value>My section 0 " 171 "</value> </attribute> </attributes> " 172 "</bookmark>" 173 " <bookmark> " 174 "<title>MyOtherTitle</title> " 175 "<url>http://www.google.com/mail</url> " 176 "<timestamp>1153328691085181</timestamp> " 177 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 178 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 179 "<labels> <label>Mail</label> </labels> " 180 "<attributes> " 181 "<attribute> " 182 "<name>favicon_url</name>" 183 "<value>http://www.google.com/mail/favicon.ico</value> " 184 "</attribute> " 185 "<attribute> " 186 "<name>favicon_timestamp</name> <value>1253328653</value> " 187 "</attribute> " 188 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 189 "</attribute> " 190 "<attribute> <name>section_name</name> <value>My section 0 " 191 "</value> </attribute> </attributes> " 192 "</bookmark>" 193 "</bookmarks>"; 194 static const char* kEmptyString = ""; 195 static const char* kBadBookmarkNoBookmarks = 196 " <bookmark> " 197 "<title>MyTitle</title> " 198 "<url>http://www.google.com/</url> " 199 "<timestamp>1153328691085181</timestamp> " 200 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 201 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 202 "<labels> <label>Google</label> </labels> " 203 "<attributes> " 204 "<attribute> " 205 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 206 "</attribute> " 207 "<attribute> " 208 "<name>favicon_timestamp</name> <value>1153328653</value> " 209 "</attribute> " 210 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 211 "</attribute> " 212 "<attribute> <name>section_name</name> <value>My section 0 " 213 "</value> </attribute> </attributes> " 214 "</bookmark> </bookmarks>"; 215 static const char* kBadBookmarkNoBookmark = 216 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 217 "<title>MyTitle</title> " 218 "<url>http://www.google.com/</url> " 219 "<timestamp>1153328691085181</timestamp> " 220 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 221 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 222 "<labels> <label>Google</label> </labels> " 223 "<attributes> " 224 "<attribute> " 225 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 226 "</attribute> " 227 "<attribute> " 228 "<name>favicon_timestamp</name> <value>1153328653</value> " 229 "</attribute> " 230 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 231 "</attribute> " 232 "<attribute> <name>section_name</name> <value>My section 0 " 233 "</value> </attribute> </attributes> " 234 "</bookmark> </bookmarks>"; 235 static const char* kBadBookmarkNoTitle = 236 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 237 " <bookmark> " 238 "<url>http://www.google.com/</url> " 239 "<timestamp>1153328691085181</timestamp> " 240 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 241 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 242 "<labels> <label>Google</label> </labels> " 243 "<attributes> " 244 "<attribute> " 245 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 246 "</attribute> " 247 "<attribute> " 248 "<name>favicon_timestamp</name> <value>1153328653</value> " 249 "</attribute> " 250 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 251 "</attribute> " 252 "<attribute> <name>section_name</name> <value>My section 0 " 253 "</value> </attribute> </attributes> " 254 "</bookmark> </bookmarks>"; 255 static const char* kBadBookmarkNoUrl = 256 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 257 " <bookmark> " 258 "<title>MyTitle</title> " 259 "<timestamp>1153328691085181</timestamp> " 260 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 261 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 262 "<labels> <label>Google</label> </labels> " 263 "<attributes> " 264 "<attribute> " 265 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 266 "</attribute> " 267 "<attribute> " 268 "<name>favicon_timestamp</name> <value>1153328653</value> " 269 "</attribute> " 270 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 271 "</attribute> " 272 "<attribute> <name>section_name</name> <value>My section 0 " 273 "</value> </attribute> </attributes> " 274 "</bookmark> </bookmarks>"; 275 static const char* kBadBookmarkNoTimestamp = 276 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 277 " <bookmark> " 278 "<title>MyTitle</title> " 279 "<url>http://www.google.com/</url> " 280 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 281 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 282 "<labels> <label>Google</label> </labels> " 283 "<attributes> " 284 "<attribute> " 285 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 286 "</attribute> " 287 "<attribute> " 288 "<name>favicon_timestamp</name> <value>1153328653</value> " 289 "</attribute> " 290 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 291 "</attribute> " 292 "<attribute> <name>section_name</name> <value>My section 0 " 293 "</value> </attribute> </attributes> " 294 "</bookmark> </bookmarks>"; 295 static const char* kBadBookmarkNoLabels = 296 "<?xml version=\"1.0\" ?> <xml_api_reply version=\"1\"> <bookmarks>" 297 " <bookmark> " 298 "<title>MyTitle</title> " 299 "<url>http://www.google.com/</url> " 300 "<timestamp>1153328691085181</timestamp> " 301 "<id>N123nasdf239</id> <notebook_id>Bxxxxxxx</notebook_id> " 302 "<section_id>Sxxxxxx</section_id> <has_highlight>0</has_highlight>" 303 "<attributes> " 304 "<attribute> " 305 "<name>favicon_url</name> <value>http://www.google.com/favicon.ico</value> " 306 "</attribute> " 307 "<attribute> " 308 "<name>favicon_timestamp</name> <value>1153328653</value> " 309 "</attribute> " 310 "<attribute> <name>notebook_name</name> <value>My notebook 0</value> " 311 "</attribute> " 312 "<attribute> <name>section_name</name> <value>My section 0 " 313 "</value> </attribute> </attributes> " 314 "</bookmark> </bookmarks>"; 315 316 XmlReader reader; 317 std::string bookmark_xml; 318 std::vector<ProfileWriter::BookmarkEntry> bookmarks; 319 320 const GURL url(kUrl); 321 const GURL other_url(kOtherUrl); 322 323 // Test doesn't work if the importer thinks this is the first run of Chromium. 324 // Mark this as a subsequent run of the browser. 325 FirstRun::first_run_ = FirstRun::FIRST_RUN_FALSE; 326 327 // Test case 1 is parsing a basic bookmark with a single label. 328 bookmark_xml = kGoodBookmark; 329 bookmarks.clear(); 330 XmlReader reader1; 331 EXPECT_TRUE(reader1.Load(bookmark_xml)); 332 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader1, &bookmarks, 333 kBookmarkGroupTitle)); 334 335 ASSERT_EQ(1U, bookmarks.size()); 336 EXPECT_FALSE(bookmarks[0].in_toolbar); 337 EXPECT_EQ(kTitle, bookmarks[0].title); 338 EXPECT_EQ(url, bookmarks[0].url); 339 ASSERT_EQ(2U, bookmarks[0].path.size()); 340 EXPECT_EQ(kFolder, bookmarks[0].path[1]); 341 342 // Test case 2 is parsing a single bookmark with no label. 343 bookmark_xml = kGoodBookmarkNoLabel; 344 bookmarks.clear(); 345 XmlReader reader2; 346 EXPECT_TRUE(reader2.Load(bookmark_xml)); 347 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader2, &bookmarks, 348 kBookmarkGroupTitle)); 349 350 ASSERT_EQ(1U, bookmarks.size()); 351 EXPECT_FALSE(bookmarks[0].in_toolbar); 352 EXPECT_EQ(kTitle, bookmarks[0].title); 353 EXPECT_EQ(url, bookmarks[0].url); 354 EXPECT_EQ(1U, bookmarks[0].path.size()); 355 356 // Test case 3 is parsing a single bookmark with two labels. 357 bookmark_xml = kGoodBookmarkTwoLabels; 358 bookmarks.clear(); 359 XmlReader reader3; 360 EXPECT_TRUE(reader3.Load(bookmark_xml)); 361 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader3, &bookmarks, 362 kBookmarkGroupTitle)); 363 364 ASSERT_EQ(2U, bookmarks.size()); 365 EXPECT_FALSE(bookmarks[0].in_toolbar); 366 EXPECT_FALSE(bookmarks[1].in_toolbar); 367 EXPECT_EQ(kTitle, bookmarks[0].title); 368 EXPECT_EQ(kTitle, bookmarks[1].title); 369 EXPECT_EQ(url, bookmarks[0].url); 370 EXPECT_EQ(url, bookmarks[1].url); 371 ASSERT_EQ(2U, bookmarks[0].path.size()); 372 EXPECT_EQ(kFolder, bookmarks[0].path[1]); 373 ASSERT_EQ(2U, bookmarks[1].path.size()); 374 EXPECT_EQ(kFolder2, bookmarks[1].path[1]); 375 376 // Test case 4 is parsing a single bookmark which has a label with a colon, 377 // this test file name translation between Toolbar and Chrome. 378 bookmark_xml = kGoodBookmarkFolderLabel; 379 bookmarks.clear(); 380 XmlReader reader4; 381 EXPECT_TRUE(reader4.Load(bookmark_xml)); 382 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader4, &bookmarks, 383 kBookmarkGroupTitle)); 384 385 ASSERT_EQ(1U, bookmarks.size()); 386 EXPECT_FALSE(bookmarks[0].in_toolbar); 387 EXPECT_EQ(kTitle, bookmarks[0].title); 388 EXPECT_EQ(url, bookmarks[0].url); 389 ASSERT_EQ(4U, bookmarks[0].path.size()); 390 EXPECT_EQ(string16(kFolderArray[0]), 391 bookmarks[0].path[1]); 392 EXPECT_EQ(string16(kFolderArray[1]), 393 bookmarks[0].path[2]); 394 EXPECT_EQ(string16(kFolderArray[2]), 395 bookmarks[0].path[3]); 396 397 // Test case 5 is parsing a single bookmark without a favicon URL. 398 bookmark_xml = kGoodBookmarkNoFavicon; 399 bookmarks.clear(); 400 XmlReader reader5; 401 EXPECT_TRUE(reader5.Load(bookmark_xml)); 402 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader5, &bookmarks, 403 kBookmarkGroupTitle)); 404 405 ASSERT_EQ(1U, bookmarks.size()); 406 EXPECT_FALSE(bookmarks[0].in_toolbar); 407 EXPECT_EQ(kTitle, bookmarks[0].title); 408 EXPECT_EQ(url, bookmarks[0].url); 409 ASSERT_EQ(2U, bookmarks[0].path.size()); 410 EXPECT_EQ(kFolder, bookmarks[0].path[1]); 411 412 // Test case 6 is parsing two bookmarks. 413 bookmark_xml = kGoodBookmark2Items; 414 bookmarks.clear(); 415 XmlReader reader6; 416 EXPECT_TRUE(reader6.Load(bookmark_xml)); 417 EXPECT_TRUE(Toolbar5Importer::ParseBookmarksFromReader(&reader6, &bookmarks, 418 kBookmarkGroupTitle)); 419 420 ASSERT_EQ(2U, bookmarks.size()); 421 EXPECT_FALSE(bookmarks[0].in_toolbar); 422 EXPECT_FALSE(bookmarks[1].in_toolbar); 423 EXPECT_EQ(kTitle, bookmarks[0].title); 424 EXPECT_EQ(kOtherTitle, bookmarks[1].title); 425 EXPECT_EQ(url, bookmarks[0].url); 426 EXPECT_EQ(other_url, bookmarks[1].url); 427 ASSERT_EQ(2U, bookmarks[0].path.size()); 428 EXPECT_EQ(kFolder, bookmarks[0].path[1]); 429 ASSERT_EQ(2U, bookmarks[1].path.size()); 430 EXPECT_EQ(kOtherFolder, bookmarks[1].path[1]); 431 432 // Test case 7 is parsing an empty string for bookmarks. 433 bookmark_xml = kEmptyString; 434 bookmarks.clear(); 435 XmlReader reader7; 436 EXPECT_FALSE(reader7.Load(bookmark_xml)); 437 438 // Test case 8 is testing the error when no <bookmarks> section is present. 439 bookmark_xml = kBadBookmarkNoBookmarks; 440 bookmarks.clear(); 441 XmlReader reader8; 442 EXPECT_TRUE(reader8.Load(bookmark_xml)); 443 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader8, 444 &bookmarks, kBookmarkGroupTitle)); 445 446 // Test case 9 tests when no <bookmark> section is present. 447 bookmark_xml = kBadBookmarkNoBookmark; 448 bookmarks.clear(); 449 XmlReader reader9; 450 EXPECT_TRUE(reader9.Load(bookmark_xml)); 451 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader9, 452 &bookmarks, kBookmarkGroupTitle)); 453 454 455 // Test case 10 tests when a bookmark has no <title> section. 456 bookmark_xml = kBadBookmarkNoTitle; 457 bookmarks.clear(); 458 XmlReader reader10; 459 EXPECT_TRUE(reader10.Load(bookmark_xml)); 460 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader10, 461 &bookmarks, kBookmarkGroupTitle)); 462 463 // Test case 11 tests when a bookmark has no <url> section. 464 bookmark_xml = kBadBookmarkNoUrl; 465 bookmarks.clear(); 466 XmlReader reader11; 467 EXPECT_TRUE(reader11.Load(bookmark_xml)); 468 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader11, 469 &bookmarks, kBookmarkGroupTitle)); 470 471 // Test case 12 tests when a bookmark has no <timestamp> section. 472 bookmark_xml = kBadBookmarkNoTimestamp; 473 bookmarks.clear(); 474 XmlReader reader12; 475 EXPECT_TRUE(reader12.Load(bookmark_xml)); 476 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader12, 477 &bookmarks, kBookmarkGroupTitle)); 478 479 // Test case 13 tests when a bookmark has no <labels> section. 480 bookmark_xml = kBadBookmarkNoLabels; 481 bookmarks.clear(); 482 XmlReader reader13; 483 EXPECT_TRUE(reader13.Load(bookmark_xml)); 484 EXPECT_FALSE(Toolbar5Importer::ParseBookmarksFromReader(&reader13, 485 &bookmarks, kBookmarkGroupTitle)); 486 } 487