1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/search_engines/default_search_pref_migration.h" 6 7 #include <string> 8 9 #include "base/compiler_specific.h" 10 #include "base/files/scoped_temp_dir.h" 11 #include "base/logging.h" 12 #include "base/macros.h" 13 #include "base/prefs/pref_service.h" 14 #include "base/strings/string16.h" 15 #include "base/strings/utf_string_conversions.h" 16 #include "chrome/browser/search_engines/template_url.h" 17 #include "chrome/browser/search_engines/template_url_service.h" 18 #include "chrome/test/base/testing_pref_service_syncable.h" 19 #include "chrome/test/base/testing_profile.h" 20 #include "testing/gtest/include/gtest/gtest.h" 21 22 class DefaultSearchPrefMigrationTest : public testing::Test { 23 public: 24 DefaultSearchPrefMigrationTest(); 25 26 // testing::Test: 27 virtual void SetUp() OVERRIDE; 28 29 scoped_ptr<TemplateURL> CreateKeyword(const std::string& short_name, 30 const std::string& keyword, 31 const std::string& url); 32 33 TestingProfile* profile() { return profile_.get(); } 34 35 DefaultSearchManager* default_search_manager() { 36 return default_search_manager_.get(); 37 } 38 39 private: 40 base::ScopedTempDir temp_dir_; 41 scoped_ptr<TestingProfile> profile_; 42 scoped_ptr<DefaultSearchManager> default_search_manager_; 43 44 DISALLOW_COPY_AND_ASSIGN(DefaultSearchPrefMigrationTest); 45 }; 46 47 DefaultSearchPrefMigrationTest::DefaultSearchPrefMigrationTest() { 48 } 49 50 void DefaultSearchPrefMigrationTest::SetUp() { 51 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 52 profile_.reset(new TestingProfile(temp_dir_.path())); 53 default_search_manager_.reset(new DefaultSearchManager( 54 profile_->GetPrefs(), DefaultSearchManager::ObserverCallback())); 55 } 56 57 scoped_ptr<TemplateURL> DefaultSearchPrefMigrationTest::CreateKeyword( 58 const std::string& short_name, 59 const std::string& keyword, 60 const std::string& url) { 61 TemplateURLData data; 62 data.short_name = base::ASCIIToUTF16(short_name); 63 data.SetKeyword(base::ASCIIToUTF16(keyword)); 64 data.SetURL(url); 65 scoped_ptr<TemplateURL> t_url(new TemplateURL(data)); 66 return t_url.Pass(); 67 } 68 69 TEST_F(DefaultSearchPrefMigrationTest, MigrateUserSelectedValue) { 70 scoped_ptr<TemplateURL> t_url( 71 CreateKeyword("name1", "key1", "http://foo1/{searchTerms}")); 72 // Store a value in the legacy location. 73 TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(), 74 profile()->GetPrefs()); 75 76 // Run the migration. 77 ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs()); 78 79 // Test that it was migrated. 80 DefaultSearchManager::Source source; 81 const TemplateURLData* modern_default = 82 default_search_manager()->GetDefaultSearchEngine(&source); 83 ASSERT_TRUE(modern_default); 84 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); 85 EXPECT_EQ(t_url->short_name(), modern_default->short_name); 86 EXPECT_EQ(t_url->keyword(), modern_default->keyword()); 87 EXPECT_EQ(t_url->url(), modern_default->url()); 88 } 89 90 TEST_F(DefaultSearchPrefMigrationTest, MigrateOnlyOnce) { 91 scoped_ptr<TemplateURL> t_url( 92 CreateKeyword("name1", "key1", "http://foo1/{searchTerms}")); 93 // Store a value in the legacy location. 94 TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(), 95 profile()->GetPrefs()); 96 97 // Run the migration. 98 ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs()); 99 100 // Test that it was migrated. 101 DefaultSearchManager::Source source; 102 const TemplateURLData* modern_default = 103 default_search_manager()->GetDefaultSearchEngine(&source); 104 ASSERT_TRUE(modern_default); 105 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); 106 EXPECT_EQ(t_url->short_name(), modern_default->short_name); 107 EXPECT_EQ(t_url->keyword(), modern_default->keyword()); 108 EXPECT_EQ(t_url->url(), modern_default->url()); 109 default_search_manager()->ClearUserSelectedDefaultSearchEngine(); 110 111 // Run the migration. 112 ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs()); 113 114 // Test that it was NOT migrated. 115 modern_default = default_search_manager()->GetDefaultSearchEngine(&source); 116 ASSERT_TRUE(modern_default); 117 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); 118 } 119 120 TEST_F(DefaultSearchPrefMigrationTest, ModernValuePresent) { 121 scoped_ptr<TemplateURL> t_url( 122 CreateKeyword("name1", "key1", "http://foo1/{searchTerms}")); 123 scoped_ptr<TemplateURL> t_url2( 124 CreateKeyword("name2", "key2", "http://foo2/{searchTerms}")); 125 // Store a value in the legacy location. 126 TemplateURLService::SaveDefaultSearchProviderToPrefs(t_url.get(), 127 profile()->GetPrefs()); 128 129 // Store another value in the modern location. 130 default_search_manager()->SetUserSelectedDefaultSearchEngine(t_url2->data()); 131 132 // Run the migration. 133 ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs()); 134 135 // Test that no migration occurred. The modern value is left intact. 136 DefaultSearchManager::Source source; 137 const TemplateURLData* modern_default = 138 default_search_manager()->GetDefaultSearchEngine(&source); 139 ASSERT_TRUE(modern_default); 140 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); 141 EXPECT_EQ(t_url2->short_name(), modern_default->short_name); 142 EXPECT_EQ(t_url2->keyword(), modern_default->keyword()); 143 EXPECT_EQ(t_url2->url(), modern_default->url()); 144 } 145 146 TEST_F(DefaultSearchPrefMigrationTest, 147 AutomaticallySelectedValueIsNotMigrated) { 148 DefaultSearchManager::Source source; 149 TemplateURLData prepopulated_default( 150 *default_search_manager()->GetDefaultSearchEngine(&source)); 151 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); 152 153 TemplateURL prepopulated_turl(prepopulated_default); 154 155 // Store a value in the legacy location. 156 TemplateURLService::SaveDefaultSearchProviderToPrefs(&prepopulated_turl, 157 profile()->GetPrefs()); 158 159 // Run the migration. 160 ConfigureDefaultSearchPrefMigrationToDictionaryValue(profile()->GetPrefs()); 161 162 // Test that the legacy value is not migrated, as it is not user-selected. 163 default_search_manager()->GetDefaultSearchEngine(&source); 164 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); 165 } 166