1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/default_search_pref_migration.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string>
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/compiler_specific.h"
100de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "base/logging.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/macros.h"
130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "base/prefs/pref_service.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string16.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DefaultSearchPrefMigrationTest : public testing::Test {
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DefaultSearchPrefMigrationTest();
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // testing::Test:
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<TemplateURL> CreateKeyword(const std::string& short_name,
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                        const std::string& keyword,
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                        const std::string& url);
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TestingProfile* profile() { return profile_.get(); }
340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DefaultSearchManager* default_search_manager() {
360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    return default_search_manager_.get();
370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
410de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
420de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  scoped_ptr<DefaultSearchManager> default_search_manager_;
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultSearchPrefMigrationTest);
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DefaultSearchPrefMigrationTest::DefaultSearchPrefMigrationTest() {
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DefaultSearchPrefMigrationTest::SetUp() {
510de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  profile_.reset(new TestingProfile(temp_dir_.path()));
530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  default_search_manager_.reset(new DefaultSearchManager(
540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      profile_->GetPrefs(), DefaultSearchManager::ObserverCallback()));
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_ptr<TemplateURL> DefaultSearchPrefMigrationTest::CreateKeyword(
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& short_name,
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& keyword,
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& url) {
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURLData data;
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.short_name = base::ASCIIToUTF16(short_name);
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.SetKeyword(base::ASCIIToUTF16(keyword));
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.SetURL(url);
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<TemplateURL> t_url(new TemplateURL(data));
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return t_url.Pass();
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DefaultSearchPrefMigrationTest, MigrateUserSelectedValue) {
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<TemplateURL> t_url(
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CreateKeyword("name1", "key1", "http://foo1/{searchTerms}"));
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Store a value in the legacy location.
730de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(),
740de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                                                       profile()->GetPrefs());
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Run the migration.
770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs());
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test that it was migrated.
800de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DefaultSearchManager::Source source;
810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  const TemplateURLData* modern_default =
820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      default_search_manager()->GetDefaultSearchEngine(&source);
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(modern_default);
840de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url->short_name(), modern_default->short_name);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url->keyword(), modern_default->keyword());
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url->url(), modern_default->url());
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)TEST_F(DefaultSearchPrefMigrationTest, MigrateOnlyOnce) {
910de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  scoped_ptr<TemplateURL> t_url(
920de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      CreateKeyword("name1", "key1", "http://foo1/{searchTerms}"));
930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Store a value in the legacy location.
940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(),
950de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                                                       profile()->GetPrefs());
960de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
970de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Run the migration.
980de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs());
990de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
1000de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Test that it was migrated.
1010de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DefaultSearchManager::Source source;
1020de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  const TemplateURLData* modern_default =
1030de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      default_search_manager()->GetDefaultSearchEngine(&source);
1040de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ASSERT_TRUE(modern_default);
1050de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
1060de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(t_url->short_name(), modern_default->short_name);
1070de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(t_url->keyword(), modern_default->keyword());
1080de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(t_url->url(), modern_default->url());
1090de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  default_search_manager()->ClearUserSelectedDefaultSearchEngine();
1100de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
1110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Run the migration.
1120de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs());
1130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
1140de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Test that it was NOT migrated.
1150de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  modern_default = default_search_manager()->GetDefaultSearchEngine(&source);
1160de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ASSERT_TRUE(modern_default);
1170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
1180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
1190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DefaultSearchPrefMigrationTest, ModernValuePresent) {
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<TemplateURL> t_url(
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CreateKeyword("name1", "key1", "http://foo1/{searchTerms}"));
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<TemplateURL> t_url2(
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CreateKeyword("name2", "key2", "http://foo2/{searchTerms}"));
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Store a value in the legacy location.
1260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(),
1270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                                                       profile()->GetPrefs());
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Store another value in the modern location.
1300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  default_search_manager()->SetUserSelectedDefaultSearchEngine(t_url2->data());
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Run the migration.
1330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs());
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test that no migration occurred. The modern value is left intact.
1360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DefaultSearchManager::Source source;
1370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  const TemplateURLData* modern_default =
1380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      default_search_manager()->GetDefaultSearchEngine(&source);
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(modern_default);
1400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url2->short_name(), modern_default->short_name);
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url2->keyword(), modern_default->keyword());
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(t_url2->url(), modern_default->url());
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DefaultSearchPrefMigrationTest,
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       AutomaticallySelectedValueIsNotMigrated) {
1480de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DefaultSearchManager::Source source;
1490de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TemplateURLData prepopulated_default(
1500de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      *default_search_manager()->GetDefaultSearchEngine(&source));
1510de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL prepopulated_turl(prepopulated_default);
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Store a value in the legacy location.
1560de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TemplateURLService::SaveDefaultSearchProviderToPrefs(&prepopulated_turl,
1570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                                                       profile()->GetPrefs());
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Run the migration.
1600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs());
1610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
1620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Test that the legacy value is not migrated, as it is not user-selected.
1630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  default_search_manager()->GetDefaultSearchEngine(&source);
1640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
166