firefox_importer_browsertest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/file_util.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_unittest_utils.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_bookmark_entry.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/importer_data_types.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/autofill/core/common/password_form.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): some of these are disabled on mac. http://crbug.com/48007 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(jschuh): Disabled on Win64 build. http://crbug.com/179688 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) DISABLED_##x 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) x 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* origin; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* action; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* realm; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* username_element; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* username; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* password_element; 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* password; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blacklisted; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo { 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const wchar_t* keyword_in_sqlite; 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const wchar_t* keyword_in_json; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* url; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst BookmarkInfo kFirefoxBookmarks[] = { 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {true, 1, {"Bookmarks Toolbar"}, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Toolbar", 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://site/"}, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Title", 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst PasswordInfo kFirefoxPasswords[] = { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "loginuser", "abc", "loginpass", "123", false}, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/localhost", 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "", "http", "", "Http1+1abcdefg", false}, 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst KeywordInfo kFirefoxKeywords[] = { 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"amazon.com", L"amazon.com", 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{searchTerms}&mode=blended"}, 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"answers.com", L"answers.com", 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13"}, 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.creativecommons.org", L"search.creativecommons.org", 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}"}, 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.ebay.com", L"search.ebay.com", 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort"}, 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"google.com", L"google.com", 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t"}, 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"en.wikipedia.org", L"wiki", 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}"}, 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.yahoo.com", L"search.yahoo.com", 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8"}, 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"flickr.com", L"flickr.com", 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}"}, 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"imdb.com", L"imdb.com", "http://www.imdb.com/find?q={searchTerms}"}, 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"webster.com", L"webster.com", 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}"}, 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Search keywords. 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"\x4E2D\x6587", L"\x4E2D\x6587", "http://www.google.com/"}, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass FirefoxObserver : public ProfileWriter, 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public importer::ImporterProgressObserver { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) explicit FirefoxObserver(bool use_keyword_in_json) 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ProfileWriter(NULL), 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bookmark_count_(0), 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_count_(0), 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch password_count_(0), 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) keyword_count_(0), 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) use_keyword_in_json_(use_keyword_in_json) {} 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(arraysize(kFirefoxBookmarks), bookmark_count_); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(arraysize(kFirefoxPasswords), password_count_); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(arraysize(kFirefoxKeywords), keyword_count_); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AddPasswordForm(const autofill::PasswordForm& form) OVERRIDE { 130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PasswordInfo p = kFirefoxPasswords[password_count_]; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.username_element), form.username_element); 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.username), form.username_value); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.password_element), form.password_element); 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.password), form.password_value); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(3U, page.size()); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[0].url().spec()); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("Google"), page[0].title()); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[1].url().spec()); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("Google"), page[1].title()); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/" 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "form1-POST.html", page[2].url().spec()); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("example form (POST)"), page[2].title()); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void AddBookmarks( 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<ImportedBookmarkEntry>& bookmarks, 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& top_level_folder_name) OVERRIDE { 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_LE(bookmark_count_ + bookmarks.size(), arraysize(kFirefoxBookmarks)); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch kFirefoxBookmarks[bookmark_count_])) << i; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16& imported_keyword = template_urls[i]->keyword(); 177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t j = 0; j < arraysize(kFirefoxKeywords); ++j) { 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16 expected_keyword = base::WideToUTF16( 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) use_keyword_in_json_ ? 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kFirefoxKeywords[j].keyword_in_json : 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kFirefoxKeywords[j].keyword_in_sqlite); 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (imported_keyword == expected_keyword) { 183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(kFirefoxKeywords[j].url, template_urls[i]->url()); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicons) OVERRIDE { 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~FirefoxObserver() {} 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Newer versions of Firefox can store custom keyword names in json, which 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // override the sqlite values. To be able to test both older and newer 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // versions, tests set this variable to indicate whether to expect the 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |keyword_in_sqlite| or |keyword_in_json| values from the reference data. 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool use_keyword_in_json_; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These tests need to be browser tests in order to be able to run the OOP 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// import (via ExternalProcessImporterHost) which launches a utility process on 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// supported platforms. 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates a new profile in a new subdirectory in the temp directory. 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_path = temp_dir_.path().AppendASCII("ImporterTest"); 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(test_path, true); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(test_path); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_ = test_path.AppendASCII("profile"); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) app_path_ = test_path.AppendASCII("app"); 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(app_path_); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This will launch the browser test and thus needs to happen last. 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InProcessBrowserTest::SetUp(); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FirefoxImporterBrowserTest(std::string profile_dir, 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch importer::ImporterProgressObserver* observer, 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProfileWriter* writer) { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII(profile_dir); 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, true)); 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_nss"); 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, false)); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a directory to house default search engines. 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath default_search_engine_path = 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch app_path_.AppendASCII("searchplugins"); 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CreateDirectory(default_search_engine_path); 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a directory to house custom/installed search engines. 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath custom_search_engine_path = 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_path_.AppendASCII("searchplugins"); 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CreateDirectory(custom_search_engine_path); 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Copy over search engines. 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path = data_path.AppendASCII("firefox_searchplugins"); 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath default_search_engine_source_path = 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path.AppendASCII("default"); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath custom_search_engine_source_path = 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path.AppendASCII("custom"); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(base::CopyDirectory( 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default_search_engine_source_path, default_search_engine_path, false)); 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(base::CopyDirectory( 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch custom_search_engine_source_path, custom_search_engine_path, false)); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch source_profile.importer_type = importer::TYPE_FIREFOX; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_profile.locale = "en-US"; 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES | 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch importer::SEARCH_ENGINES; 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExternalProcessImporterHost* host = new ExternalProcessImporterHost; 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->set_observer(observer); 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host->StartImportSettings( 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_profile, browser()->profile(), items, writer); 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir temp_dir_; 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath profile_path_; 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath app_path_; 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox30Importer)) { 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(false)); 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest( 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "firefox3_profile", observer.get(), observer.get()); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox35Importer)) { 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(false)); 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest( 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "firefox35_profile", observer.get(), observer.get()); 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 303116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_IMPORTER(FirefoxImporter)) { 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(true)); 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest("firefox_profile", observer.get(), observer.get()); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 308