1 // Copyright (c) 2012 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 "chrome/utility/importer/safari_importer.h" 6 7 #include "base/basictypes.h" 8 #include "base/file_util.h" 9 #include "base/files/file_path.h" 10 #include "base/files/scoped_temp_dir.h" 11 #include "base/path_service.h" 12 #include "base/strings/string16.h" 13 #include "base/strings/string_util.h" 14 #include "base/strings/sys_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h" 16 #include "chrome/common/chrome_paths.h" 17 #include "chrome/common/importer/imported_bookmark_entry.h" 18 #include "chrome/common/importer/imported_favicon_usage.h" 19 #include "chrome/common/importer/importer_bridge.h" 20 #include "chrome/common/importer/safari_importer_utils.h" 21 #include "chrome/utility/importer/safari_importer.h" 22 #include "sql/connection.h" 23 #include "testing/platform_test.h" 24 25 // In order to test the Safari import functionality effectively, we store a 26 // simulated Library directory containing dummy data files in the same 27 // structure as ~/Library in the Chrome test data directory. 28 // This function returns the path to that directory. 29 base::FilePath GetTestSafariLibraryPath() { 30 base::FilePath test_dir; 31 PathService::Get(chrome::DIR_TEST_DATA, &test_dir); 32 33 // Our simulated ~/Library directory 34 test_dir = test_dir.AppendASCII("safari_import"); 35 return test_dir; 36 } 37 38 class SafariImporterTest : public PlatformTest { 39 public: 40 SafariImporter* GetSafariImporter() { 41 base::FilePath test_library_dir = GetTestSafariLibraryPath(); 42 CHECK(base::PathExists(test_library_dir)) << 43 "Missing test data directory"; 44 45 return new SafariImporter(test_library_dir); 46 } 47 }; 48 49 TEST_F(SafariImporterTest, HistoryImport) { 50 scoped_refptr<SafariImporter> importer(GetSafariImporter()); 51 52 std::vector<ImporterURLRow> history_items; 53 importer->ParseHistoryItems(&history_items); 54 55 // Should be 2 history items. 56 ASSERT_EQ(history_items.size(), 2U); 57 58 ImporterURLRow& it1 = history_items[0]; 59 EXPECT_EQ(it1.url, GURL("http://www.firsthistoryitem.com/")); 60 EXPECT_EQ(it1.title, UTF8ToUTF16("First History Item Title")); 61 EXPECT_EQ(it1.visit_count, 1); 62 EXPECT_EQ(it1.hidden, 0); 63 EXPECT_EQ(it1.typed_count, 0); 64 EXPECT_EQ(it1.last_visit.ToDoubleT(), 65 importer->HistoryTimeToEpochTime(@"270598264.4")); 66 67 ImporterURLRow& it2 = history_items[1]; 68 std::string second_item_title("http://www.secondhistoryitem.com/"); 69 EXPECT_EQ(it2.url, GURL(second_item_title)); 70 // The second item lacks a title so we expect the URL to be substituted. 71 EXPECT_EQ(UTF16ToUTF8(it2.title), second_item_title.c_str()); 72 EXPECT_EQ(it2.visit_count, 55); 73 EXPECT_EQ(it2.hidden, 0); 74 EXPECT_EQ(it2.typed_count, 0); 75 EXPECT_EQ(it2.last_visit.ToDoubleT(), 76 importer->HistoryTimeToEpochTime(@"270598231.4")); 77 } 78 79 TEST_F(SafariImporterTest, BookmarkImport) { 80 // Expected results 81 const struct { 82 bool in_toolbar; 83 GURL url; 84 // We store the path with levels of nesting delimited by forward slashes. 85 string16 path; 86 string16 title; 87 } kImportedBookmarksData[] = { 88 { 89 true, 90 GURL("http://www.apple.com/"), 91 ASCIIToUTF16("Toolbar/"), 92 ASCIIToUTF16("Apple") 93 }, 94 { 95 true, 96 GURL("http://www.yahoo.com/"), 97 ASCIIToUTF16("Toolbar/"), 98 ASCIIToUTF16("Yahoo!") 99 }, 100 { 101 true, 102 GURL("http://www.cnn.com/"), 103 ASCIIToUTF16("Toolbar/News"), 104 ASCIIToUTF16("CNN") 105 }, 106 { 107 true, 108 GURL("http://www.nytimes.com/"), 109 ASCIIToUTF16("Toolbar/News"), 110 ASCIIToUTF16("The New York Times") 111 }, 112 { 113 false, 114 GURL("http://www.reddit.com/"), 115 string16(), 116 ASCIIToUTF16("reddit.com: what's new online!") 117 }, 118 { 119 false, 120 GURL(), 121 string16(), 122 ASCIIToUTF16("Empty Folder") 123 }, 124 { 125 false, 126 GURL("http://www.webkit.org/blog/"), 127 string16(), 128 ASCIIToUTF16("Surfin' Safari - The WebKit Blog") 129 }, 130 }; 131 132 scoped_refptr<SafariImporter> importer(GetSafariImporter()); 133 std::vector<ImportedBookmarkEntry> bookmarks; 134 importer->ParseBookmarks(ASCIIToUTF16("Toolbar"), &bookmarks); 135 size_t num_bookmarks = bookmarks.size(); 136 ASSERT_EQ(ARRAYSIZE_UNSAFE(kImportedBookmarksData), num_bookmarks); 137 138 for (size_t i = 0; i < num_bookmarks; ++i) { 139 ImportedBookmarkEntry& entry = bookmarks[i]; 140 EXPECT_EQ(kImportedBookmarksData[i].in_toolbar, entry.in_toolbar); 141 EXPECT_EQ(kImportedBookmarksData[i].url, entry.url); 142 143 std::vector<string16> path; 144 Tokenize(kImportedBookmarksData[i].path, ASCIIToUTF16("/"), &path); 145 ASSERT_EQ(path.size(), entry.path.size()); 146 for (size_t j = 0; j < path.size(); ++j) { 147 EXPECT_EQ(path[j], entry.path[j]); 148 } 149 150 EXPECT_EQ(kImportedBookmarksData[i].title, entry.title); 151 } 152 } 153 154 TEST_F(SafariImporterTest, FaviconImport) { 155 scoped_refptr<SafariImporter> importer(GetSafariImporter()); 156 sql::Connection db; 157 ASSERT_TRUE(importer->OpenDatabase(&db)); 158 159 SafariImporter::FaviconMap favicon_map; 160 importer->ImportFaviconURLs(&db, &favicon_map); 161 162 std::vector<ImportedFaviconUsage> favicons; 163 importer->LoadFaviconData(&db, favicon_map, &favicons); 164 165 size_t num_favicons = favicons.size(); 166 ASSERT_EQ(num_favicons, 2U); 167 168 ImportedFaviconUsage &fav0 = favicons[0]; 169 EXPECT_EQ("http://s.ytimg.com/yt/favicon-vfl86270.ico", 170 fav0.favicon_url.spec()); 171 EXPECT_GT(fav0.png_data.size(), 0U); 172 EXPECT_EQ(fav0.urls.size(), 1U); 173 EXPECT_TRUE(fav0.urls.find(GURL("http://www.youtube.com/")) 174 != fav0.urls.end()); 175 176 ImportedFaviconUsage &fav1 = favicons[1]; 177 EXPECT_EQ("http://www.opensearch.org/favicon.ico", 178 fav1.favicon_url.spec()); 179 EXPECT_GT(fav1.png_data.size(), 0U); 180 EXPECT_EQ(fav1.urls.size(), 2U); 181 EXPECT_TRUE(fav1.urls.find(GURL("http://www.opensearch.org/Home")) 182 != fav1.urls.end()); 183 184 EXPECT_TRUE(fav1.urls.find( 185 GURL("http://www.opensearch.org/Special:Search?search=lalala&go=Search")) 186 != fav1.urls.end()); 187 } 188 189 TEST_F(SafariImporterTest, CanImport) { 190 uint16 items = importer::NONE; 191 EXPECT_TRUE(SafariImporterCanImport(GetTestSafariLibraryPath(), &items)); 192 EXPECT_EQ(items, importer::HISTORY | importer::FAVORITES); 193 EXPECT_EQ(items & importer::COOKIES, importer::NONE); 194 EXPECT_EQ(items & importer::PASSWORDS, importer::NONE); 195 EXPECT_EQ(items & importer::SEARCH_ENGINES, importer::NONE); 196 EXPECT_EQ(items & importer::HOME_PAGE, importer::NONE); 197 198 // Check that we don't import anything from a bogus library directory. 199 base::ScopedTempDir fake_library_dir; 200 ASSERT_TRUE(fake_library_dir.CreateUniqueTempDir()); 201 EXPECT_FALSE(SafariImporterCanImport(fake_library_dir.path(), &items)); 202 } 203