firefox_importer_browsertest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/file_util.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/path_service.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/external_process_importer_host.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_progress_observer.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/importer/importer_unittest_utils.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_bookmark_entry.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/importer_data_types.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/password_form.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(estade): some of these are disabled on mac. http://crbug.com/48007
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(jschuh): Disabled on Win64 build. http://crbug.com/179688
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_WIN) && defined(ARCH_CPU_X86_64))
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) DISABLED_##x
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_IMPORTER(x) x
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordInfo {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* origin;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* action;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* realm;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const wchar_t* username_element;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const wchar_t* username;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const wchar_t* password_element;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const wchar_t* password;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool blacklisted;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct KeywordInfo {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const wchar_t* keyword;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* url;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst BookmarkInfo kFirefoxBookmarks[] = {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {true, 1, {L"Bookmarks Toolbar"},
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    L"Toolbar",
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://site/"},
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {false, 0, {},
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    L"Title",
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.google.com/"},
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst PasswordInfo kFirefoxPasswords[] = {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {"http://localhost:8080/", "http://localhost:8080/", "http://localhost:8080/",
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    L"loginuser", L"abc", L"loginpass", L"123", false},
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {"http://localhost:8080/", "", "http://localhost:8080/localhost",
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    L"", L"http", L"", L"Http1+1abcdefg", false},
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst KeywordInfo kFirefoxKeywords[] = {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"amazon.com",
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.amazon.com/exec/obidos/external-search/?field-keywords="
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "{searchTerms}&mode=blended" },
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"answers.com",
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.answers.com/main/ntquery?s={searchTerms}&gwp=13" },
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"search.creativecommons.org",
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://search.creativecommons.org/?q={searchTerms}" },
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"search.ebay.com",
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://search.ebay.com/search/search.dll?query={searchTerms}&"
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "MfcISAPICommand=GetResult&ht=1&ebaytag1=ebayreg&srchdesc=n&"
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "maxRecordsReturned=300&maxRecordsPerPage=50&SortProperty=MetaEndSort" },
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"google.com",
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.google.com/search?q={searchTerms}&ie=utf-8&oe=utf-8&aq=t" },
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"en.wikipedia.org",
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://en.wikipedia.org/wiki/Special:Search?search={searchTerms}" },
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"search.yahoo.com",
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8" },
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"flickr.com",
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.flickr.com/photos/tags/?q={searchTerms}" },
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"imdb.com",
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.imdb.com/find?q={searchTerms}" },
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"webster.com",
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "http://www.webster.com/cgi-bin/dictionary?va={searchTerms}" },
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Search keywords.
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { L"\x4E2D\x6587", "http://www.google.com/" },
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst int kDefaultFirefoxKeywordIndex = 8;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass FirefoxObserver : public ProfileWriter,
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                        public importer::ImporterProgressObserver {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FirefoxObserver()
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ProfileWriter(NULL), bookmark_count_(0), history_count_(0),
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        password_count_(0), keyword_count_(0), import_search_engines_(true) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  explicit FirefoxObserver(bool import_search_engines)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : ProfileWriter(NULL), bookmark_count_(0), history_count_(0),
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        password_count_(0), keyword_count_(0),
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        import_search_engines_(import_search_engines) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // importer::ImporterProgressObserver:
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ImportStarted() OVERRIDE {}
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE {}
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE {}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ImportEnded() OVERRIDE {
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(arraysize(kFirefoxBookmarks), bookmark_count_);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1U, history_count_);
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(arraysize(kFirefoxPasswords), password_count_);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (import_search_engines_)
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      EXPECT_EQ(arraysize(kFirefoxKeywords), keyword_count_);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool BookmarkModelIsLoaded() const OVERRIDE {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Profile is ready for writing.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool TemplateURLServiceIsLoaded() const OVERRIDE {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AddPasswordForm(const content::PasswordForm& form) OVERRIDE {
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PasswordInfo p = kFirefoxPasswords[password_count_];
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(p.origin, form.origin.spec());
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(p.realm, form.signon_realm);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(p.action, form.action.spec());
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(WideToUTF16(p.username_element), form.username_element);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(WideToUTF16(p.username), form.username_value);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(WideToUTF16(p.password_element), form.password_element);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(WideToUTF16(p.password), form.password_value);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(p.blacklisted, form.blacklisted_by_user);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++password_count_;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AddHistoryPage(const history::URLRows& page,
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              history::VisitSource visit_source) OVERRIDE {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(3U, page.size());
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ("http://www.google.com/", page[0].url().spec());
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google"), page[0].title());
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ("http://www.google.com/", page[1].url().spec());
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Google"), page[1].title());
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ("http://www.cs.unc.edu/~jbs/resources/perl/perl-cgi/programs/"
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "form1-POST.html", page[2].url().spec());
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("example form (POST)"), page[2].title());
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(history::SOURCE_FIREFOX_IMPORTED, visit_source);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++history_count_;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void AddBookmarks(const std::vector<ImportedBookmarkEntry>& bookmarks,
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const string16& top_level_folder_name) OVERRIDE {
164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ASSERT_LE(bookmark_count_ + bookmarks.size(), arraysize(kFirefoxBookmarks));
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Importer should import the FF favorites the same as the list, in the same
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // order.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = 0; i < bookmarks.size(); ++i) {
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_NO_FATAL_FAILURE(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          TestEqualBookmarkEntry(bookmarks[i],
170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                 kFirefoxBookmarks[bookmark_count_])) << i;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++bookmark_count_;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AddKeywords(ScopedVector<TemplateURL> template_urls,
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           bool unique_on_host_and_path) OVERRIDE {
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = 0; i < template_urls.size(); ++i) {
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // The order might not be deterministic, look in the expected list for
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // that template URL.
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool found = false;
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      string16 keyword = template_urls[i]->keyword();
182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      for (size_t j = 0; j < arraysize(kFirefoxKeywords); ++j) {
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (template_urls[i]->keyword() ==
184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                WideToUTF16Hack(kFirefoxKeywords[j].keyword)) {
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXPECT_EQ(kFirefoxKeywords[j].url, template_urls[i]->url());
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          found = true;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          break;
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(found);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ++keyword_count_;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AddFavicons(
196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const std::vector<ImportedFaviconUsage>& favicons) OVERRIDE {
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual ~FirefoxObserver() {}
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t bookmark_count_;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t history_count_;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t password_count_;
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t keyword_count_;
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool import_search_engines_;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These tests need to be browser tests in order to be able to run the OOP
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// import (via ExternalProcessImporterHost) which launches a utility process on
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// supported platforms.
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FirefoxProfileImporterBrowserTest : public InProcessBrowserTest {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Creates a new profile in a new subdirectory in the temp directory.
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath test_path = temp_dir_.path().AppendASCII("ImporterTest");
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(test_path, true);
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    file_util::CreateDirectory(test_path);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    profile_path_ = test_path.AppendASCII("profile");
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    app_path_ = test_path.AppendASCII("app");
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    file_util::CreateDirectory(app_path_);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This will launch the browser test and thus needs to happen last.
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    InProcessBrowserTest::SetUp();
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Firefox3xImporterBrowserTest(
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string profile_dir,
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      importer::ImporterProgressObserver* observer,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ProfileWriter* writer,
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool import_search_plugins) {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath data_path;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path));
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data_path = data_path.AppendASCII(profile_dir);
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, true));
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path));
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data_path = data_path.AppendASCII("firefox3_nss");
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::CopyDirectory(data_path, profile_path_, false));
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath search_engine_path = app_path_;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    search_engine_path = search_engine_path.AppendASCII("searchplugins");
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    file_util::CreateDirectory(search_engine_path);
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (import_search_plugins) {
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path));
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      data_path = data_path.AppendASCII("firefox3_searchplugins");
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (!base::PathExists(data_path)) {
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // TODO(maruel):  Create search test data that we can open source!
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        LOG(ERROR) << L"Missing internal test data";
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_TRUE(base::CopyDirectory(data_path, search_engine_path, false));
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    importer::SourceProfile source_profile;
258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    source_profile.importer_type = importer::TYPE_FIREFOX;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    source_profile.app_path = app_path_;
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    source_profile.source_path = profile_path_;
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    source_profile.locale = "en-US";
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int items = importer::HISTORY | importer::PASSWORDS | importer::FAVORITES;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (import_search_plugins)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      items = items | importer::SEARCH_ENGINES;
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Deletes itself.
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExternalProcessImporterHost* host = new ExternalProcessImporterHost;
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    host->set_observer(observer);
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    host->StartImportSettings(source_profile,
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              browser()->profile(),
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              items,
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              make_scoped_refptr(writer).get());
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath profile_path_;
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath app_path_;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MAYBE_IMPORTER(Firefox30Importer)) {
284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<FirefoxObserver> observer(new FirefoxObserver());
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Firefox3xImporterBrowserTest("firefox3_profile", observer.get(),
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               observer.get(), true);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(FirefoxProfileImporterBrowserTest,
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MAYBE_IMPORTER(Firefox35Importer)) {
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool import_search_engines = false;
292ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<FirefoxObserver> observer(
293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new FirefoxObserver(import_search_engines));
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Firefox3xImporterBrowserTest("firefox35_profile", observer.get(),
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               observer.get(), import_search_engines);
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
297