firefox_importer_browsertest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/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" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/bookmarks/imported_bookmark_entry.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/favicon/imported_favicon_usage.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/firefox_importer_unittest_utils.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_data_types.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_host.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_unittest_utils.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/password_form.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): some of these are disabled on mac. http://crbug.com/48007 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(jschuh): Disabled on Win64 build. http://crbug.com/179688 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) DISABLED_##x 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) x 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* origin; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* action; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* realm; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username_element; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* username; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password_element; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* password; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blacklisted; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wchar_t* keyword; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* url; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const BookmarkInfo kFirefox3Bookmarks[] = { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {true, 1, {L"Bookmarks Toolbar"}, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Toolbar", 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://site/"}, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Title", 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PasswordInfo kFirefox3Passwords[] = { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"loginuser", L"abc", L"loginpass", L"123", false}, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/localhost", 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"", L"http", L"", L"Http1+1abcdefg", false}, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const KeywordInfo kFirefox3Keywords[] = { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"amazon.com", 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{searchTerms}&mode=blended" }, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"answers.com", 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13" }, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.creativecommons.org", 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}" }, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.ebay.com", 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort" }, 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"google.com", 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t" }, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"en.wikipedia.org", 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}" }, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"search.yahoo.com", 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8" }, 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"flickr.com", 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}" }, 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"imdb.com", 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.imdb.com/find?q={searchTerms}" }, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"webster.com", 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}" }, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Search keywords. 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { L"\x4E2D\x6587", "http://www.google.com/" }, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDefaultFirefox3KeywordIndex = 8; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Firefox3Observer : public ProfileWriter, 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public importer::ImporterProgressObserver { 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3Observer() 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), import_search_engines_(true) { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit Firefox3Observer(bool import_search_engines) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ProfileWriter(NULL), bookmark_count_(0), history_count_(0), 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) password_count_(0), keyword_count_(0), 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) import_search_engines_(import_search_engines) { 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Bookmarks), bookmark_count_); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Passwords), password_count_); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_engines_) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(arraysize(kFirefox3Keywords), keyword_count_); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddPasswordForm(const content::PasswordForm& form) OVERRIDE { 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PasswordInfo p = kFirefox3Passwords[password_count_]; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username_element), form.username_element); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.username), form.username_value); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password_element), form.password_element); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(WideToUTF16(p.password), form.password_value); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(3U, page.size()); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[0].url().spec()); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[0].title()); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[1].url().spec()); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Google"), page[1].title()); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/" 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "form1-POST.html", page[2].url().spec()); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("example form (POST)"), page[2].title()); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void AddBookmarks(const std::vector<ImportedBookmarkEntry>& bookmarks, 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& top_level_folder_name) OVERRIDE { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LE(bookmark_count_ + bookmarks.size(), 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) arraysize(kFirefox3Bookmarks)); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kFirefox3Bookmarks[bookmark_count_])) << i; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 keyword = template_urls[i]->keyword(); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t j = 0; j < arraysize(kFirefox3Keywords); ++j) { 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (template_urls[i]->keyword() == 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WideToUTF16Hack(kFirefox3Keywords[j].keyword)) { 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kFirefox3Keywords[j].url, template_urls[i]->url()); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicons) OVERRIDE { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~Firefox3Observer() {} 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines_; 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"); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::Delete(test_path, true); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(test_path); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_ = test_path.AppendASCII("profile"); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) app_path_ = test_path.AppendASCII("app"); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::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) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Firefox3xImporterBrowserTest( 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string profile_dir, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::ImporterProgressObserver* observer, 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProfileWriter* writer, 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_plugins) { 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII(profile_dir); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, true)); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_nss"); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, profile_path_, false)); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath search_engine_path = app_path_; 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path = search_engine_path.AppendASCII("searchplugins"); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_util::CreateDirectory(search_engine_path); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) { 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_searchplugins"); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!file_util::PathExists(data_path)) { 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(maruel): Create search test data that we can open source! 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << L"Missing internal test data"; 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(file_util::CopyDirectory(data_path, 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_engine_path, false)); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.importer_type = importer::TYPE_FIREFOX3; 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (import_search_plugins) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items = items | importer::SEARCH_ENGINES; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(gab): Use ExternalProcessImporterHost on Linux as well. 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImporterHost* host; 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ExternalProcessImporterHost; 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host = new ImporterHost; 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->SetObserver(observer); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->StartImportSettings(source_profile, browser()->profile(), 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items, make_scoped_refptr(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)) { 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer(new Firefox3Observer()); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox3_profile", observer.get(), 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), true); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox35Importer)) { 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool import_search_engines = false; 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Firefox3Observer> observer( 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new Firefox3Observer(import_search_engines)); 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Firefox3xImporterBrowserTest("firefox35_profile", observer.get(), 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer.get(), import_search_engines); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 304