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