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/files/file_path.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.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" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/autofill/core/browser/webdata/autofill_entry.h" 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/autofill/core/common/password_form.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): some of these are disabled on mac. http://crbug.com/48007 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(jschuh): Disabled on Win64 build. http://crbug.com/179688 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) DISABLED_##x 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) x 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* origin; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* action; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* realm; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* username_element; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* username; 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* password_element; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* password; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool blacklisted; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo { 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const wchar_t* keyword_in_sqlite; 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const wchar_t* keyword_in_json; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* url; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct AutofillFormDataInfo { 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* name; 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* value; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst BookmarkInfo kFirefoxBookmarks[] = { 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {true, 1, {"Bookmarks Toolbar"}, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Toolbar", 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://site/"}, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {false, 0, {}, 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"Title", 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "http://www.google.com/"}, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst PasswordInfo kFirefoxPasswords[] = { 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/", 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "loginuser", "abc", "loginpass", "123", false}, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) {"http://localhost:8080/", "", "http://localhost:8080/localhost", 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "", "http", "", "Http1+1abcdefg", false}, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst KeywordInfo kFirefoxKeywords[] = { 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"amazon.com", L"amazon.com", 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.amazon.com/exec/obidos/external-search/?field-keywords=" 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{searchTerms}&mode=blended"}, 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"answers.com", L"answers.com", 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13"}, 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.creativecommons.org", L"search.creativecommons.org", 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.creativecommons.org/?q={searchTerms}"}, 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.ebay.com", L"search.ebay.com", 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.ebay.com/search/search.dll?query={searchTerms}&" 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&" 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort"}, 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"google.com", L"google.com", 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t"}, 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"en.wikipedia.org", L"wiki", 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}"}, 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"search.yahoo.com", L"search.yahoo.com", 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8"}, 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"flickr.com", L"flickr.com", 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.flickr.com/photos/tags/?q={searchTerms}"}, 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"imdb.com", L"imdb.com", "http://www.imdb.com/find?q={searchTerms}"}, 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"webster.com", L"webster.com", 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}"}, 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Search keywords. 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) {L"\x4E2D\x6587", L"\x4E2D\x6587", "http://www.google.com/"}, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst AutofillFormDataInfo kFirefoxAutofillEntries[] = { 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"name", "John"}, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"address", "#123 Cherry Ave"}, 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"city", "Mountain View"}, 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"zip", "94043"}, 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"n300", "+1 (408) 871-4567"}, 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"name", "john"}, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"name", "aguantó"}, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"address", "télévision@example.com"}, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"city", "&$%$$$ TESTO *&*&^&^& MOKO"}, 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"zip", "WOHOOOO$$$$$$$$****"}, 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"n300", "\xe0\xa4\x9f\xe2\x97\x8c\xe0\xa4\xbe\xe0\xa4\xaf\xe0\xa4\xb0"}, 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {"n300", "\xe4\xbb\xa5\xe7\x8e\xa9\xe4\xb8\xba\xe4\xb8\xbb"} 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass FirefoxObserver : public ProfileWriter, 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public importer::ImporterProgressObserver { 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) explicit FirefoxObserver(bool use_keyword_in_json) 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ProfileWriter(NULL), 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bookmark_count_(0), 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_count_(0), 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch password_count_(0), 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) keyword_count_(0), 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) use_keyword_in_json_(use_keyword_in_json) {} 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // importer::ImporterProgressObserver: 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportStarted() OVERRIDE {} 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {} 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {} 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ImportEnded() OVERRIDE { 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(arraysize(kFirefoxBookmarks), bookmark_count_); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1U, history_count_); 137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(arraysize(kFirefoxPasswords), password_count_); 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(arraysize(kFirefoxKeywords), keyword_count_); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool BookmarkModelIsLoaded() const OVERRIDE { 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Profile is ready for writing. 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool TemplateURLServiceIsLoaded() const OVERRIDE { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AddPasswordForm(const autofill::PasswordForm& form) OVERRIDE { 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PasswordInfo p = kFirefoxPasswords[password_count_]; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.origin, form.origin.spec()); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.realm, form.signon_realm); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.action, form.action.spec()); 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.username_element), form.username_element); 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.username), form.username_value); 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.password_element), form.password_element); 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16(p.password), form.password_value); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p.blacklisted, form.blacklisted_by_user); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++password_count_; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddHistoryPage(const history::URLRows& page, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::VisitSource visit_source) OVERRIDE { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(3U, page.size()); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[0].url().spec()); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("Google"), page[0].title()); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.google.com/", page[1].url().spec()); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("Google"), page[1].title()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/" 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "form1-POST.html", page[2].url().spec()); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("example form (POST)"), page[2].title()); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++history_count_; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void AddBookmarks( 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<ImportedBookmarkEntry>& bookmarks, 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& top_level_folder_name) OVERRIDE { 180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_LE(bookmark_count_ + bookmarks.size(), arraysize(kFirefoxBookmarks)); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Importer should import the FF favorites the same as the list, in the same 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // order. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < bookmarks.size(); ++i) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NO_FATAL_FAILURE( 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEqualBookmarkEntry(bookmarks[i], 186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch kFirefoxBookmarks[bookmark_count_])) << i; 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++bookmark_count_; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddAutofillFormDataEntries( 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<autofill::AutofillEntry>& autofill_entries) OVERRIDE { 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(arraysize(kFirefoxAutofillEntries), autofill_entries.size()); 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < arraysize(kFirefoxAutofillEntries); ++i) { 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFirefoxAutofillEntries[i].name, 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::UTF16ToUTF8(autofill_entries[i].key().name())); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFirefoxAutofillEntries[i].value, 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::UTF16ToUTF8(autofill_entries[i].key().value())); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddKeywords(ScopedVector<TemplateURL> template_urls, 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool unique_on_host_and_path) OVERRIDE { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The order might not be deterministic, look in the expected list for 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that template URL. 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found = false; 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16& imported_keyword = template_urls[i]->keyword(); 209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t j = 0; j < arraysize(kFirefoxKeywords); ++j) { 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16 expected_keyword = base::WideToUTF16( 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) use_keyword_in_json_ ? 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kFirefoxKeywords[j].keyword_in_json : 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kFirefoxKeywords[j].keyword_in_sqlite); 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (imported_keyword == expected_keyword) { 215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ(kFirefoxKeywords[j].url, template_urls[i]->url()); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) found = true; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(found); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++keyword_count_; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AddFavicons( 226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicons) OVERRIDE { 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~FirefoxObserver() {} 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t bookmark_count_; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t history_count_; 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t password_count_; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t keyword_count_; 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Newer versions of Firefox can store custom keyword names in json, which 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // override the sqlite values. To be able to test both older and newer 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // versions, tests set this variable to indicate whether to expect the 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |keyword_in_sqlite| or |keyword_in_json| values from the reference data. 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool use_keyword_in_json_; 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These tests need to be browser tests in order to be able to run the OOP 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// import (via ExternalProcessImporterHost) which launches a utility process on 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// supported platforms. 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest { 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates a new profile in a new subdirectory in the temp directory. 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_path = temp_dir_.path().AppendASCII("ImporterTest"); 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(test_path, true); 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(test_path); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_ = test_path.AppendASCII("profile"); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) app_path_ = test_path.AppendASCII("app"); 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(app_path_); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This will launch the browser test and thus needs to happen last. 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InProcessBrowserTest::SetUp(); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FirefoxImporterBrowserTest(std::string profile_dir, 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch importer::ImporterProgressObserver* observer, 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProfileWriter* writer) { 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath data_path; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII(profile_dir); 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, true)); 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_path = data_path.AppendASCII("firefox3_nss"); 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, false)); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a directory to house default search engines. 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath default_search_engine_path = 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch app_path_.AppendASCII("searchplugins"); 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CreateDirectory(default_search_engine_path); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a directory to house custom/installed search engines. 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath custom_search_engine_path = 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_path_.AppendASCII("searchplugins"); 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CreateDirectory(custom_search_engine_path); 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Copy over search engines. 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path = data_path.AppendASCII("firefox_searchplugins"); 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath default_search_engine_source_path = 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path.AppendASCII("default"); 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath custom_search_engine_source_path = 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_path.AppendASCII("custom"); 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(base::CopyDirectory( 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default_search_engine_source_path, default_search_engine_path, false)); 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(base::CopyDirectory( 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch custom_search_engine_source_path, custom_search_engine_path, false)); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) importer::SourceProfile source_profile; 300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch source_profile.importer_type = importer::TYPE_FIREFOX; 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.app_path = app_path_; 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_profile.source_path = profile_path_; 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_profile.locale = "en-US"; 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES | 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci importer::SEARCH_ENGINES | importer::AUTOFILL_FORM_DATA; 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes itself. 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExternalProcessImporterHost* host = new ExternalProcessImporterHost; 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->set_observer(observer); 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host->StartImportSettings( 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_profile, browser()->profile(), items, writer); 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ScopedTempDir temp_dir_; 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath profile_path_; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath app_path_; 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox30Importer)) { 32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(false)); 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest( 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "firefox3_profile", observer.get(), observer.get()); 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MAYBE_IMPORTER(Firefox35Importer)) { 33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(false)); 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest( 332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "firefox35_profile", observer.get(), observer.get()); 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 335116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest, 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_IMPORTER(FirefoxImporter)) { 33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<FirefoxObserver> observer(new FirefoxObserver(true)); 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FirefoxImporterBrowserTest("firefox_profile", observer.get(), observer.get()); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 340