1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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 "testing/gtest/include/gtest/gtest.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox2_importer.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_unittest_utils.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_utils.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/nss_decryptor.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following 2 tests require the use of the NSSDecryptor, on OSX this needs
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to run in a separate process, so we use a proxy object so we can share the
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// same test between platforms.
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox2NSS3Decryptor) {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath nss_path;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &nss_path));
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef OS_MACOSX
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox2_nss_mac");
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox2_nss");
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !OS_MACOSX
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath db_path;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &db_path));
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  db_path = db_path.AppendASCII("firefox2_profile");
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FFUnitTestDecryptorProxy decryptor_proxy;
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(decryptor_proxy.Setup(nss_path));
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(decryptor_proxy.DecryptorInit(nss_path, db_path));
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("hello"),
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECBJ"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "M63MpT9rtBAjMCm7qo/EhlA=="));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test UTF-16 encoding.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(L"\x4E2D"),
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECN9"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "OQ5ZFmhb8BAiFo1Z+fUvaIQ=="));
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox3NSS3Decryptor) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath nss_path;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &nss_path));
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef OS_MACOSX
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox3_nss_mac");
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox3_nss");
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !OS_MACOSX
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath db_path;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &db_path));
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  db_path = db_path.AppendASCII("firefox3_profile");
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FFUnitTestDecryptorProxy decryptor_proxy;
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(decryptor_proxy.Setup(nss_path));
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(decryptor_proxy.DecryptorInit(nss_path, db_path));
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("hello"),
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKa"
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "jtRg4qFSHBAhv9luFkXgDJA=="));
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test UTF-16 encoding.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(L"\x4E2D"),
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECLW"
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "qqiccfQHWBAie74hxnULxlw=="));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox2BookmarkParse) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool result;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tests charset.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string charset;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseCharsetFromLine(
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<META HTTP-EQUIV=\"Content-Type\" "
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "CONTENT=\"text/html; charset=UTF-8\">",
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &charset);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("UTF-8", charset);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Escaped characters in name.
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 folder_name;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_toolbar_folder;
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time folder_add_date;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseFolderNameFromLine(
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><H3 ADD_DATE=\"1207558707\" >&lt; &gt;"
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      " &amp; &quot; &#39; \\ /</H3>",
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      charset, &folder_name, &is_toolbar_folder, &folder_add_date);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("< > & \" ' \\ /"), folder_name);
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(is_toolbar_folder);
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time::FromTimeT(1207558707) == folder_add_date);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Empty name and toolbar folder attribute.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseFolderNameFromLine(
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><H3 PERSONAL_TOOLBAR_FOLDER=\"true\"></H3>",
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      charset, &folder_name, &is_toolbar_folder, &folder_add_date);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), folder_name);
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(is_toolbar_folder);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unicode characters in title and shortcut.
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 title;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url, favicon;
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 shortcut;
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 post_data;
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time add_date;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://chinese.site.cn/path?query=1#ref\" "
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "SHORTCUTURL=\"\xE4\xB8\xAD\">\xE4\xB8\xAD\xE6\x96\x87</A>",
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(L"\x4E2D\x6587", UTF16ToWide(title));
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://chinese.site.cn/path?query=1#ref", url.spec());
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(L"\x4E2D", UTF16ToWide(shortcut));
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), post_data);
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time() == add_date);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // No shortcut, and url contains %22 ('"' character).
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?q=%22<>%22\">name</A>",
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("name"), title);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://domain.com/?q=%22%3C%3E%22", url.spec());
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), shortcut);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), post_data);
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time() == add_date);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?g=";\"\">name</A>",
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("name"), title);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://domain.com/?g=%22", url.spec());
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), shortcut);
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), post_data);
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time() == add_date);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creation date.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://site/\" ADD_DATE=\"1121301154\">name</A>",
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("name"), title);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(GURL("http://site/"), url);
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), shortcut);
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), post_data);
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time::FromTimeT(1121301154) == add_date);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Post-data
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://localhost:8080/test/hello.html\" ADD_DATE=\""
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "1212447159\" LAST_VISIT=\"1212447251\" LAST_MODIFIED=\"1212447248\""
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "SHORTCUTURL=\"post\" ICON=\"data:\" POST_DATA=\"lname%3D%25s\""
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "LAST_CHARSET=\"UTF-8\" ID=\"rdf:#$weKaR3\">Test Post keyword</A>",
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("Test Post keyword"), title);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://localhost:8080/test/hello.html", url.spec());
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("post"), shortcut);
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("lname%3D%25s"), post_data);
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time::FromTimeT(1212447159) == add_date);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invalid case.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?q=%22",
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(result);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), title);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("", url.spec());
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), shortcut);
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), post_data);
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(base::Time() == add_date);
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Epiphany format.
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  result = Firefox2Importer::ParseMinimumBookmarkFromLine(
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "<dt><a href=\"http://www.google.com/\">Google</a></dt>",
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      charset, &title, &url);
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("Google"), title);
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ("http://www.google.com/", url.spec());
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(FirefoxImporterTest, Firefox2BookmarkFileImport) {
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FilePath path;
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  path = path.AppendASCII("firefox2_importer");
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Import all bookmarks from a file which include an empty folder entry.
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FilePath empty_folder_path = path.AppendASCII("empty_folder.html");
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::set<GURL> default_urls;
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 first_folder_name;
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Firefox2Importer* importer = new Firefox2Importer();
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer->AddRef();
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<ProfileWriter::BookmarkEntry> bookmarks;
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer->ImportBookmarksFile(empty_folder_path, default_urls, false,
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                first_folder_name, importer, &bookmarks,
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                NULL, NULL);
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(3, static_cast<int>(bookmarks.size()));
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<ProfileWriter::BookmarkEntry>::iterator it;
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ProfileWriter::BookmarkEntry entry;
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<string16>::iterator path_it;
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (bookmarks.size() == 3) {
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    it = bookmarks.begin();
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("Empty"), entry.title);
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(entry.is_folder);
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(base::Time::FromTimeT(1295938143), entry.creation_time);
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(2, static_cast<int>(entry.path.size()));
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (entry.path.size() == 2) {
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      path_it = entry.path.begin();
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16(""), *path_it++);
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16("Empty's Parent"), *path_it);
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("[Tamura Yukari.com]"), entry.title);
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_FALSE(entry.is_folder);
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(base::Time::FromTimeT(1234567890), entry.creation_time);
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(2, static_cast<int>(entry.path.size()));
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (entry.path.size() == 2) {
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      path_it = entry.path.begin();
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16(""), *path_it++);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16("Not Empty"), *path_it);
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ("http://www.tamurayukari.com/", entry.url.spec());
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("Google"), entry.title);
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_FALSE(entry.is_folder);
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(base::Time::FromTimeT(0000000000), entry.creation_time);
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(2, static_cast<int>(entry.path.size()));
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (entry.path.size() == 2) {
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      path_it = entry.path.begin();
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16(""), *path_it++);
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16("Not Empty But Default"), *path_it);
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ("http://www.google.com/", entry.url.spec());
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Import non-default bookmarks from a file.
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bookmarks.clear();
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  default_urls.insert(GURL("http://www.google.com/"));
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer->ImportBookmarksFile(empty_folder_path, default_urls, false,
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                first_folder_name, importer, &bookmarks,
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                NULL, NULL);
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(2, static_cast<int>(bookmarks.size()));
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (bookmarks.size() == 2) {
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    it = bookmarks.begin();
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("Empty"), entry.title);
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(entry.is_folder);
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(base::Time::FromTimeT(1295938143), entry.creation_time);
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(2, static_cast<int>(entry.path.size()));
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (entry.path.size() == 2) {
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      path_it = entry.path.begin();
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16(""), *path_it++);
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16("Empty's Parent"), *path_it);
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("[Tamura Yukari.com]"), entry.title);
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_FALSE(entry.is_folder);
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(base::Time::FromTimeT(1234567890), entry.creation_time);
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(2, static_cast<int>(entry.path.size()));
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (entry.path.size() == 2) {
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      path_it = entry.path.begin();
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16(""), *path_it++);
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ASCIIToUTF16("Not Empty"), *path_it);
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ("http://www.tamurayukari.com/", entry.url.spec());
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Import Epiphany bookmarks from a file
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FilePath epiphany_path = path.AppendASCII("epiphany.html");
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bookmarks.clear();
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  default_urls.clear();
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer->ImportBookmarksFile(epiphany_path, default_urls, false,
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                first_folder_name, importer, &bookmarks,
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                NULL, NULL);
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(2, static_cast<int>(bookmarks.size()));
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (bookmarks.size() == 2) {
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    it = bookmarks.begin();
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("[Tamura Yukari.com]"), entry.title);
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ("http://www.tamurayukari.com/", entry.url.spec());
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(0, static_cast<int>(entry.path.size()));
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    entry = *it++;
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("Google"), entry.title);
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ("http://www.google.com/", entry.url.spec());
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(0, static_cast<int>(entry.path.size()));
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  importer->Release();
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
299