firefox_importer_browsertest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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