1 // Copyright (c) 2012 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/template_url_service_test_util.h" 6 7 #include "base/message_loop/message_loop_proxy.h" 8 #include "base/run_loop.h" 9 #include "chrome/browser/search_engines/chrome_template_url_service_client.h" 10 #include "chrome/test/base/testing_pref_service_syncable.h" 11 #include "chrome/test/base/testing_profile.h" 12 #include "components/search_engines/default_search_pref_test_util.h" 13 #include "components/search_engines/keyword_table.h" 14 #include "components/search_engines/keyword_web_data_service.h" 15 #include "components/search_engines/template_url_service.h" 16 #include "components/search_engines/testing_search_terms_data.h" 17 #include "components/webdata/common/web_database_service.h" 18 #include "testing/gtest/include/gtest/gtest.h" 19 20 namespace { 21 22 class TestingTemplateURLServiceClient : public ChromeTemplateURLServiceClient { 23 public: 24 TestingTemplateURLServiceClient(Profile* profile, 25 base::string16* search_term) 26 : ChromeTemplateURLServiceClient(profile), 27 search_term_(search_term) {} 28 29 virtual void SetKeywordSearchTermsForURL( 30 const GURL& url, 31 TemplateURLID id, 32 const base::string16& term) OVERRIDE { 33 *search_term_ = term; 34 } 35 36 private: 37 base::string16* search_term_; 38 39 DISALLOW_COPY_AND_ASSIGN(TestingTemplateURLServiceClient); 40 }; 41 42 } // namespace 43 44 TemplateURLServiceTestUtil::TemplateURLServiceTestUtil() 45 : changed_count_(0), 46 search_terms_data_(NULL) { 47 // Make unique temp directory. 48 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); 49 profile_.reset(new TestingProfile(temp_dir_.path())); 50 51 scoped_refptr<WebDatabaseService> web_database_service = 52 new WebDatabaseService(temp_dir_.path().AppendASCII("webdata"), 53 base::MessageLoopProxy::current(), 54 base::MessageLoopProxy::current()); 55 web_database_service->AddTable( 56 scoped_ptr<WebDatabaseTable>(new KeywordTable())); 57 web_database_service->LoadDatabase(); 58 59 web_data_service_ = new KeywordWebDataService( 60 web_database_service.get(), base::MessageLoopProxy::current(), 61 KeywordWebDataService::ProfileErrorCallback()); 62 web_data_service_->Init(); 63 64 ResetModel(false); 65 } 66 67 TemplateURLServiceTestUtil::~TemplateURLServiceTestUtil() { 68 ClearModel(); 69 profile_.reset(); 70 71 // Flush the message loop to make application verifiers happy. 72 base::RunLoop().RunUntilIdle(); 73 } 74 75 void TemplateURLServiceTestUtil::OnTemplateURLServiceChanged() { 76 changed_count_++; 77 } 78 79 int TemplateURLServiceTestUtil::GetObserverCount() { 80 return changed_count_; 81 } 82 83 void TemplateURLServiceTestUtil::ResetObserverCount() { 84 changed_count_ = 0; 85 } 86 87 void TemplateURLServiceTestUtil::VerifyLoad() { 88 ASSERT_FALSE(model()->loaded()); 89 model()->Load(); 90 base::RunLoop().RunUntilIdle(); 91 EXPECT_EQ(1, GetObserverCount()); 92 ResetObserverCount(); 93 } 94 95 void TemplateURLServiceTestUtil::ChangeModelToLoadState() { 96 model()->ChangeToLoadedState(); 97 // Initialize the web data service so that the database gets updated with 98 // any changes made. 99 100 model()->web_data_service_ = web_data_service_; 101 base::RunLoop().RunUntilIdle(); 102 } 103 104 void TemplateURLServiceTestUtil::ClearModel() { 105 model_->Shutdown(); 106 model_.reset(); 107 search_terms_data_ = NULL; 108 } 109 110 void TemplateURLServiceTestUtil::ResetModel(bool verify_load) { 111 if (model_) 112 ClearModel(); 113 search_terms_data_ = new TestingSearchTermsData("http://www.google.com/"); 114 model_.reset(new TemplateURLService( 115 profile()->GetPrefs(), scoped_ptr<SearchTermsData>(search_terms_data_), 116 web_data_service_.get(), 117 scoped_ptr<TemplateURLServiceClient>( 118 new TestingTemplateURLServiceClient(profile(), &search_term_)), 119 NULL, NULL, base::Closure())); 120 model()->AddObserver(this); 121 changed_count_ = 0; 122 if (verify_load) 123 VerifyLoad(); 124 } 125 126 base::string16 TemplateURLServiceTestUtil::GetAndClearSearchTerm() { 127 base::string16 search_term; 128 search_term.swap(search_term_); 129 return search_term; 130 } 131 132 void TemplateURLServiceTestUtil::SetGoogleBaseURL(const GURL& base_url) { 133 DCHECK(base_url.is_valid()); 134 search_terms_data_->set_google_base_url(base_url.spec()); 135 model_->GoogleBaseURLChanged(); 136 } 137 138 void TemplateURLServiceTestUtil::SetManagedDefaultSearchPreferences( 139 bool enabled, 140 const std::string& name, 141 const std::string& keyword, 142 const std::string& search_url, 143 const std::string& suggest_url, 144 const std::string& icon_url, 145 const std::string& encodings, 146 const std::string& alternate_url, 147 const std::string& search_terms_replacement_key) { 148 DefaultSearchPrefTestUtil::SetManagedPref( 149 profile()->GetTestingPrefService(), 150 enabled, name, keyword, search_url, suggest_url, icon_url, encodings, 151 alternate_url, search_terms_replacement_key); 152 } 153 154 void TemplateURLServiceTestUtil::RemoveManagedDefaultSearchPreferences() { 155 DefaultSearchPrefTestUtil::RemoveManagedPref( 156 profile()->GetTestingPrefService()); 157 } 158