firefox_importer_unittest.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 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 Murdochusing base::Time;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following 2 tests require the use of the NSSDecryptor, on OSX this needs
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to run in a separate process, so we use a proxy object so we can share the
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// same test between platforms.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox2NSS3Decryptor) {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath nss_path;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &nss_path));
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef OS_MACOSX
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox2_nss_mac");
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox2_nss");
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !OS_MACOSX
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath db_path;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &db_path));
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  db_path = db_path.AppendASCII("firefox2_profile");
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FFUnitTestDecryptorProxy decryptor_proxy;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(decryptor_proxy.Setup(nss_path.ToWStringHack()));
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(decryptor_proxy.DecryptorInit(nss_path.ToWStringHack(),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            db_path.ToWStringHack()));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("hello"),
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECBJ"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "M63MpT9rtBAjMCm7qo/EhlA=="));
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test UTF-16 encoding.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(L"\x4E2D"),
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECN9"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "OQ5ZFmhb8BAiFo1Z+fUvaIQ=="));
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox3NSS3Decryptor) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath nss_path;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &nss_path));
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef OS_MACOSX
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox3_nss_mac");
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nss_path = nss_path.AppendASCII("firefox3_nss");
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !OS_MACOSX
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath db_path;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &db_path));
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  db_path = db_path.AppendASCII("firefox3_profile");
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FFUnitTestDecryptorProxy decryptor_proxy;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(decryptor_proxy.Setup(nss_path.ToWStringHack()));
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(decryptor_proxy.DecryptorInit(nss_path.ToWStringHack(),
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            db_path.ToWStringHack()));
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("hello"),
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKa"
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "jtRg4qFSHBAhv9luFkXgDJA=="));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test UTF-16 encoding.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(L"\x4E2D"),
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      decryptor_proxy.Decrypt("MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECLW"
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "qqiccfQHWBAie74hxnULxlw=="));
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(FirefoxImporterTest, Firefox2BookmarkParse) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool result;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tests charset.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string charset;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseCharsetFromLine(
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<META HTTP-EQUIV=\"Content-Type\" "
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "CONTENT=\"text/html; charset=UTF-8\">",
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &charset);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("UTF-8", charset);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Escaped characters in name.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring folder_name;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_toolbar_folder;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseFolderNameFromLine(
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><H3 ADD_DATE=\"1207558707\" >&lt; &gt;"
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      " &amp; &quot; &#39; \\ /</H3>",
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &folder_name, &is_toolbar_folder);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"< > & \" ' \\ /", folder_name);
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(is_toolbar_folder);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Empty name and toolbar folder attribute.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseFolderNameFromLine(
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><H3 PERSONAL_TOOLBAR_FOLDER=\"true\"></H3>",
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &folder_name, &is_toolbar_folder);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", folder_name);
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(is_toolbar_folder);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unicode characters in title and shortcut.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring title;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url, favicon;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring shortcut;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring post_data;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Time add_date;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://chinese.site.cn/path?query=1#ref\" "
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "SHORTCUTURL=\"\xE4\xB8\xAD\">\xE4\xB8\xAD\xE6\x96\x87</A>",
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"\x4E2D\x6587", title);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://chinese.site.cn/path?query=1#ref", url.spec());
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"\x4E2D", shortcut);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", post_data);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time() == add_date);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // No shortcut, and url contains %22 ('"' character).
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?q=%22<>%22\">name</A>",
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"name", title);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://domain.com/?q=%22%3C%3E%22", url.spec());
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", shortcut);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", post_data);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time() == add_date);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?g=";\"\">name</A>",
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"name", title);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://domain.com/?g=%22", url.spec());
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", shortcut);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", post_data);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time() == add_date);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creation date.
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://site/\" ADD_DATE=\"1121301154\">name</A>",
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"name", title);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(GURL("http://site/"), url);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", shortcut);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", post_data);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time::FromTimeT(1121301154) == add_date);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Post-data
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://localhost:8080/test/hello.html\" ADD_DATE=\""
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "1212447159\" LAST_VISIT=\"1212447251\" LAST_MODIFIED=\"1212447248\""
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "SHORTCUTURL=\"post\" ICON=\"data:\" POST_DATA=\"lname%3D%25s\""
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "LAST_CHARSET=\"UTF-8\" ID=\"rdf:#$weKaR3\">Test Post keyword</A>",
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"Test Post keyword", title);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("http://localhost:8080/test/hello.html", url.spec());
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"post", shortcut);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"lname%3D%25s", post_data);
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time::FromTimeT(1212447159) == add_date);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invalid case.
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = Firefox2Importer::ParseBookmarkFromLine(
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "<DT><A HREF=\"http://domain.com/?q=%22",
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      charset, &title, &url, &favicon, &shortcut, &add_date, &post_data);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(result);
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", title);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("", url.spec());
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", shortcut);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"", post_data);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(Time() == add_date);
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
180